diff --git a/src/components/PrismicEmbed.vue b/src/PrismicEmbed.vue
similarity index 94%
rename from src/components/PrismicEmbed.vue
rename to src/PrismicEmbed.vue
index 0811145..9c1c7ff 100644
--- a/src/components/PrismicEmbed.vue
+++ b/src/PrismicEmbed.vue
@@ -2,7 +2,7 @@
import type { EmbedField } from "@prismicio/client"
import { isFilled } from "@prismicio/client"
-import type { ComponentOrTagName } from "../types"
+import type { ComponentOrTagName } from "./types"
/**
* The default component rendered to wrap the embed.
diff --git a/src/components/PrismicImage.vue b/src/PrismicImage.vue
similarity index 98%
rename from src/components/PrismicImage.vue
rename to src/PrismicImage.vue
index 258af1c..5d59aa7 100644
--- a/src/components/PrismicImage.vue
+++ b/src/PrismicImage.vue
@@ -7,9 +7,9 @@ import {
} from "@prismicio/client"
import { computed, watchEffect } from "vue"
-import { devMsg } from "../lib/devMsg"
+import { devMsg } from "./lib/devMsg"
-import { usePrismic } from "../usePrismic"
+import { usePrismic } from "./usePrismic"
/**
* Props for ``.
diff --git a/src/components/PrismicRichText.ts b/src/PrismicRichText.ts
similarity index 96%
rename from src/components/PrismicRichText.ts
rename to src/PrismicRichText.ts
index ecf3a7e..cefc634 100644
--- a/src/components/PrismicRichText.ts
+++ b/src/PrismicRichText.ts
@@ -29,12 +29,12 @@ import {
} from "vue"
import { routerKey } from "vue-router"
-import { isInternalURL } from "../lib/isInternalURL"
-import { simplyResolveComponent } from "../lib/simplyResolveComponent"
+import { isInternalURL } from "./lib/isInternalURL"
+import { simplyResolveComponent } from "./lib/simplyResolveComponent"
-import type { VueUseOptions } from "../types"
+import type { VueUseOptions } from "./types"
-import { usePrismic } from "../usePrismic"
+import { usePrismic } from "./usePrismic"
/**
* The default component rendered to wrap the HTML output.
diff --git a/src/components/PrismicText.vue b/src/PrismicText.vue
similarity index 94%
rename from src/components/PrismicText.vue
rename to src/PrismicText.vue
index 3b607e8..5bf6bb9 100644
--- a/src/components/PrismicText.vue
+++ b/src/PrismicText.vue
@@ -3,9 +3,9 @@ import type { RichTextField } from "@prismicio/client"
import { asText, isFilled } from "@prismicio/client"
import { watchEffect } from "vue"
-import { devMsg } from "../lib/devMsg"
+import { devMsg } from "./lib/devMsg"
-import type { ComponentOrTagName } from "../types"
+import type { ComponentOrTagName } from "./types"
/**
* Props for ``.
diff --git a/src/components/SliceZone.ts b/src/SliceZone.ts
similarity index 93%
rename from src/components/SliceZone.ts
rename to src/SliceZone.ts
index 4bff2ee..9c2f2c5 100644
--- a/src/components/SliceZone.ts
+++ b/src/SliceZone.ts
@@ -12,10 +12,9 @@ import type {
} from "vue"
import { computed, defineComponent, h, markRaw, watchEffect } from "vue"
-import { __PRODUCTION__ } from "../lib/__PRODUCTION__"
-import { simplyResolveComponent } from "../lib/simplyResolveComponent"
+import { simplyResolveComponent } from "./lib/simplyResolveComponent"
-import { usePrismic } from "../usePrismic"
+import { usePrismic } from "./usePrismic"
/**
* Returns the type of a `SliceLike` type.
@@ -249,44 +248,45 @@ export type SliceComponentType<
* This is also the default Vue component rendered when a component mapping
* cannot be found in ``.
*/
-export const TODOSliceComponent = __PRODUCTION__
- ? ((() => null) as FunctionalComponent<{
- slice: SliceLike
- }>)
- : /*#__PURE__*/ (defineComponent({
- name: "TODOSliceComponent",
- props: {
- slice: {
- type: Object as PropType,
- required: true,
+export const TODOSliceComponent =
+ typeof process !== "undefined" && process.env.NODE_ENV === "development"
+ ? /*#__PURE__*/ (defineComponent({
+ name: "TODOSliceComponent",
+ props: {
+ slice: {
+ type: Object as PropType,
+ required: true,
+ },
},
- },
- setup(props) {
- const type = computed(() => {
- return "slice_type" in props.slice
- ? props.slice.slice_type
- : props.slice.type
- })
-
- watchEffect(() => {
- console.warn(
- `[SliceZone] Could not find a component for Slice type "${type.value}"`,
- props.slice,
- )
- })
+ setup(props) {
+ const type = computed(() => {
+ return "slice_type" in props.slice
+ ? props.slice.slice_type
+ : props.slice.type
+ })
- return () => {
- return h(
- "section",
- {
- "data-slice-zone-todo-component": "",
- "data-slice-type": type.value,
- },
- [`Could not find a component for Slice type "${type.value}"`],
- )
- }
- },
- }) as SliceComponentType)
+ watchEffect(() => {
+ console.warn(
+ `[SliceZone] Could not find a component for Slice type "${type.value}"`,
+ props.slice,
+ )
+ })
+
+ return () => {
+ return h(
+ "section",
+ {
+ "data-slice-zone-todo-component": "",
+ "data-slice-type": type.value,
+ },
+ [`Could not find a component for Slice type "${type.value}"`],
+ )
+ }
+ },
+ }) as SliceComponentType)
+ : ((() => null) as FunctionalComponent<{
+ slice: SliceLike
+ }>)
/**
* A record of Slice types mapped to Vue components. Each components will be
@@ -518,7 +518,10 @@ export const SliceZoneImpl = /*#__PURE__*/ defineComponent({
}
// TODO: Remove in v3 when the `resolver` prop is removed.
- if (!__PRODUCTION__) {
+ if (
+ typeof process !== "undefined" &&
+ process.env.NODE_ENV === "development"
+ ) {
if (props.resolver) {
console.warn(
"The `resolver` prop is deprecated. Please replace it with a components map using the `components` prop.",
diff --git a/src/components/PrismicLink.ts b/src/components/PrismicLink.ts
deleted file mode 100644
index 07c6ac3..0000000
--- a/src/components/PrismicLink.ts
+++ /dev/null
@@ -1,324 +0,0 @@
-import type {
- LinkField,
- LinkResolverFunction,
- PrismicDocument,
-} from "@prismicio/client"
-import { asLink } from "@prismicio/client"
-import type {
- AllowedComponentProps,
- ComponentCustomProps,
- ComputedRef,
- ConcreteComponent,
- DefineComponent,
- PropType,
- Raw,
- VNodeProps,
-} from "vue"
-import { computed, defineComponent, h, reactive, unref } from "vue"
-
-import { getSlots } from "../lib/getSlots"
-import { isInternalURL } from "../lib/isInternalURL"
-import { simplyResolveComponent } from "../lib/simplyResolveComponent"
-
-import type { VueUseOptions } from "../types"
-
-import { usePrismic } from "../usePrismic"
-
-/**
- * The default component rendered for internal URLs.
- */
-const defaultInternalComponent = "router-link"
-
-/**
- * The default component rendered for external URLs.
- */
-const defaultExternalComponent = "a"
-
-/**
- * The default rel attribute rendered for blank target URLs.
- */
-const defaultBlankTargetRelAttribute = "noopener noreferrer"
-
-/**
- * Props for ``.
- */
-export type PrismicLinkProps = {
- /**
- * The Prismic link field or document to render.
- */
- field: LinkField | PrismicDocument
-
- /**
- * A link resolver function used to resolve links when not using the route
- * resolver parameter with `@prismicio/client`.
- *
- * @defaultValue The link resolver provided to `@prismicio/vue` plugin if configured.
- *
- * @see Link resolver documentation {@link https://prismic.io/docs/core-concepts/link-resolver-route-resolver#link-resolver}
- */
- linkResolver?: LinkResolverFunction
-
- /**
- * An explicit `target` attribute to apply to the rendered link.
- */
- target?: string | null
-
- /**
- * An explicit `rel` attribute to apply to the rendered link.
- */
- rel?: string | null
-
- /**
- * Value of the `rel` attribute to use on links rendered with
- * `target="_blank"`.
- *
- * @defaultValue The one provided to `@prismicio/vue` plugin if configured, `"noopener noreferrer"` otherwise.
- */
- blankTargetRelAttribute?: string | null
-
- /**
- * An HTML tag name, a component, or a functional component used to render
- * internal links.
- *
- * @remarks
- * HTML tag names will be rendered using the anchor tag interface (`href`,
- * `target`, and `rel` attributes).
- * @remarks
- * Components will be rendered using Vue Router {@link RouterLink} interface
- * (`to` props).
- *
- * @defaultValue The one provided to `@prismicio/vue` plugin if configured, {@link RouterLink} otherwise.
- */
- internalComponent?: string | ConcreteComponent | Raw
-
- /**
- * An HTML tag name, a component, or a functional component used to render
- * external links.
- *
- * @remarks
- * HTML tag names will be rendered using the anchor tag interface (`href`,
- * `target`, and `rel` attributes).
- * @remarks
- * Components will be rendered using Vue Router {@link RouterLink} interface
- * (`to` props).
- *
- * @defaultValue The one provided to `@prismicio/vue` plugin if configured, `"a"` otherwise.
- */
- externalComponent?: string | ConcreteComponent | Raw
-}
-
-/**
- * Options for {@link usePrismicLink}.
- */
-export type UsePrismicLinkOptions = VueUseOptions
-
-/**
- * Return type of {@link usePrismicLink}.
- */
-export type UsePrismicLinkReturnType = {
- /**
- * Suggested component to render for provided link field.
- */
- type: ComputedRef>
-
- /**
- * Resolved anchor `href` value.
- */
- href: ComputedRef
-
- /**
- * Resolved anchor `target` value.
- */
- target: ComputedRef
-
- /**
- * Resolved anchor `rel` value.
- */
- rel: ComputedRef
-
- /**
- * Resolved link text.
- */
- text: ComputedRef
-}
-
-/**
- * A low level composable that returns resolved information about a Prismic link
- * field.
- *
- * @param props - {@link UsePrismicLinkOptions}
- *
- * @returns - Resolved link information {@link UsePrismicLinkReturnType}
- */
-export const usePrismicLink = (
- props: UsePrismicLinkOptions,
-): UsePrismicLinkReturnType => {
- const { options } = usePrismic()
-
- const type = computed(() => {
- const internalComponent =
- unref(props.internalComponent) ||
- options.components?.linkInternalComponent ||
- defaultInternalComponent
-
- const externalComponent =
- unref(props.externalComponent) ||
- options.components?.linkExternalComponent ||
- defaultExternalComponent
-
- return href.value && isInternalURL(href.value) && !target.value
- ? internalComponent
- : externalComponent
- })
- const href = computed(() => {
- const field = unref(props.field)
- const linkResolver = unref(props.linkResolver) ?? options.linkResolver
-
- return asLink(field, linkResolver) ?? ""
- })
- const target = computed(() => {
- const field = unref(props.field)
- const target = unref(props.target)
-
- if (typeof target !== "undefined") {
- return target
- } else {
- return field && "target" in field && field.target ? field.target : null
- }
- })
- const rel = computed(() => {
- const rel = unref(props.rel)
-
- if (typeof rel !== "undefined") {
- return rel
- } else if (target.value === "_blank") {
- const blankTargetRelAttribute = unref(props.blankTargetRelAttribute)
-
- if (typeof blankTargetRelAttribute !== "undefined") {
- return blankTargetRelAttribute
- } else {
- return typeof options.components?.linkBlankTargetRelAttribute !==
- "undefined"
- ? options.components.linkBlankTargetRelAttribute
- : defaultBlankTargetRelAttribute
- }
- } else {
- return null
- }
- })
-
- const text = computed(() => {
- const field = unref(props.field)
-
- return field && "text" in field ? field.text : undefined
- })
-
- return {
- type,
- href,
- target,
- rel,
- text,
- }
-}
-
-/**
- * `` implementation.
- *
- * @internal
- */
-export const PrismicLinkImpl = /*#__PURE__*/ defineComponent({
- name: "PrismicLink",
- props: {
- field: {
- type: Object as PropType,
- required: true,
- },
- linkResolver: {
- type: Function as PropType,
- default: undefined,
- required: false,
- },
- target: {
- type: String as PropType,
- default: undefined,
- required: false,
- },
- rel: {
- type: String as PropType,
- default: undefined,
- required: false,
- },
- blankTargetRelAttribute: {
- type: String as PropType,
- default: undefined,
- required: false,
- },
- internalComponent: {
- type: [String, Object, Function] as PropType<
- string | ConcreteComponent | Raw
- >,
- default: undefined,
- required: false,
- },
- externalComponent: {
- type: [String, Object, Function] as PropType<
- string | ConcreteComponent | Raw
- >,
- default: undefined,
- required: false,
- },
- },
- setup(props, { slots }) {
- // Prevent fatal if user didn't check for field, throws `Invalid prop` warn
- if (!props.field) {
- return () => null
- }
-
- const { type, href, target, rel, text } = usePrismicLink(props)
-
- return () => {
- const parent =
- type.value === "a" ? "a" : simplyResolveComponent(type.value)
- const computedSlots = getSlots(
- parent,
- slots,
- reactive({ href: href.value, text: text.value }),
- text.value,
- )
-
- if (typeof parent === "string") {
- // Fitting anchor tag interface
- return h(
- parent,
- { href: href.value, target: target.value, rel: rel.value },
- computedSlots,
- )
- } else {
- // Fitting Vue Router Link interface
- return h(
- parent,
- { to: href.value, target: target.value, rel: rel.value },
- computedSlots,
- )
- }
- }
- },
-})
-
-// export the public type for h/tsx inference
-// also to avoid inline import() in generated d.ts files
-/**
- * Component to render a Prismic link field.
- *
- * @see Component props {@link PrismicLinkProps}
- * @see Templating link fields {@link https://prismic.io/docs/technologies/vue-template-content#links-and-content-relationships}
- */
-export const PrismicLink = PrismicLinkImpl as unknown as {
- new (): {
- $props: AllowedComponentProps &
- ComponentCustomProps &
- VNodeProps &
- PrismicLinkProps
- }
-}
diff --git a/src/components/index.ts b/src/components/index.ts
deleted file mode 100644
index 8f2ff08..0000000
--- a/src/components/index.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import PrismicEmbed from "./PrismicEmbed.vue"
-import PrismicImage from "./PrismicImage.vue"
-import PrismicText from "./PrismicText.vue"
-
-export type { PrismicEmbedProps } from "./PrismicEmbed.vue"
-export type { PrismicImageProps } from "./PrismicImage.vue"
-export type { PrismicTextProps } from "./PrismicText.vue"
-
-export { PrismicEmbed, PrismicImage, PrismicText }
-
-export { usePrismicLink, PrismicLinkImpl, PrismicLink } from "./PrismicLink"
-export type { UsePrismicLinkOptions, PrismicLinkProps } from "./PrismicLink"
-
-export {
- usePrismicRichText,
- PrismicRichTextImpl,
- PrismicRichText,
-} from "./PrismicRichText"
-export type {
- UsePrismicRichTextOptions,
- PrismicRichTextProps,
-} from "./PrismicRichText"
-
-export {
- getSliceComponentProps,
- TODOSliceComponent,
- defineSliceZoneComponents,
- SliceZoneImpl,
- SliceZone,
-} from "./SliceZone"
-export type {
- DefineComponentSliceComponentProps,
- SliceComponentProps,
- SliceComponentType,
- SliceLikeRestV2,
- SliceLikeGraphQL,
- SliceLike,
- SliceZoneComponents,
- SliceZoneResolverArgs,
- SliceZoneResolver,
- SliceZoneLike,
- SliceZoneProps,
-} from "./SliceZone"
diff --git a/src/createPrismic.ts b/src/createPrismic.ts
index 65cd00a..ad26f67 100644
--- a/src/createPrismic.ts
+++ b/src/createPrismic.ts
@@ -28,14 +28,12 @@ import type {
PrismicPluginOptions,
} from "./types"
-import {
- PrismicEmbed,
- PrismicImage,
- PrismicLink,
- PrismicRichText,
- PrismicText,
- SliceZone,
-} from "./components"
+import PrismicEmbed from "./PrismicEmbed.vue"
+import PrismicImage from "./PrismicImage.vue"
+import PrismicLink from "./PrismicLink.vue"
+import { PrismicRichText } from "./PrismicRichText"
+import PrismicText from "./PrismicText.vue"
+import { SliceZone } from "./SliceZone"
import { prismicKey } from "./injectionSymbols"
/**
@@ -130,7 +128,7 @@ export const createPrismic = (options: PrismicPluginOptions): PrismicPlugin => {
app.config.globalProperties.$prismic = this
if (options.injectComponents !== false) {
- app.component(PrismicLink.name, PrismicLink)
+ app.component(PrismicLink.name!, PrismicLink)
app.component(PrismicEmbed.name!, PrismicEmbed)
app.component(PrismicImage.name!, PrismicImage)
app.component(PrismicText.name!, PrismicText)
diff --git a/src/index.ts b/src/index.ts
index 0550096..e3d9478 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,33 +1,33 @@
-export { createPrismic } from "./createPrismic"
-export { usePrismic } from "./usePrismic"
+import PrismicEmbed from "./PrismicEmbed.vue"
+import PrismicImage from "./PrismicImage.vue"
+import PrismicLink from "./PrismicLink.vue"
+import PrismicText from "./PrismicText.vue"
+
+export type { PrismicEmbedProps } from "./PrismicEmbed.vue"
+export type { PrismicImageProps } from "./PrismicImage.vue"
+export type { PrismicLinkProps } from "./PrismicLink.vue"
+export type { PrismicTextProps } from "./PrismicText.vue"
+
+export { PrismicEmbed, PrismicImage, PrismicLink, PrismicText }
export {
- // Composables
- usePrismicLink,
usePrismicRichText,
- // Components
- PrismicEmbed,
- PrismicImage,
- PrismicLink,
- PrismicText,
+ PrismicRichTextImpl,
PrismicRichText,
- // Slice Zone
+} from "./PrismicRichText"
+export type {
+ UsePrismicRichTextOptions,
+ PrismicRichTextProps,
+} from "./PrismicRichText"
+
+export {
getSliceComponentProps,
TODOSliceComponent,
defineSliceZoneComponents,
+ SliceZoneImpl,
SliceZone,
-} from "./components"
+} from "./SliceZone"
export type {
- // Composables
- UsePrismicLinkOptions,
- UsePrismicRichTextOptions,
- // Components
- PrismicEmbedProps,
- PrismicImageProps,
- PrismicLinkProps,
- PrismicTextProps,
- PrismicRichTextProps,
- // Slice Zone
DefineComponentSliceComponentProps,
SliceComponentProps,
SliceComponentType,
@@ -35,37 +35,16 @@ export type {
SliceLikeGraphQL,
SliceLike,
SliceZoneComponents,
+ SliceZoneResolverArgs,
SliceZoneResolver,
SliceZoneLike,
SliceZoneProps,
-} from "./components"
-
-export {
- useAllPrismicDocumentsByIDs,
- useAllPrismicDocumentsByUIDs,
- useAllPrismicDocumentsByTag,
- useAllPrismicDocumentsByEveryTag,
- useAllPrismicDocumentsBySomeTags,
- useAllPrismicDocumentsByType,
- useFirstPrismicDocument,
- usePrismicDocumentByID,
- usePrismicDocumentByUID,
- usePrismicDocuments,
- usePrismicDocumentsByIDs,
- usePrismicDocumentsByUIDs,
- usePrismicDocumentsByTag,
- usePrismicDocumentsByEveryTag,
- usePrismicDocumentsBySomeTags,
- usePrismicDocumentsByType,
- useSinglePrismicDocument,
- dangerouslyUseAllPrismicDocuments,
-} from "./composables"
-
-export type { ClientComposableReturnType } from "./useStatefulPrismicClientMethod"
+} from "./SliceZone"
-export { PrismicClientComposableState } from "./types"
export type { PrismicPluginOptions, PrismicPlugin } from "./types"
+export { createPrismic } from "./createPrismic"
+export { usePrismic } from "./usePrismic"
export { prismicKey } from "./injectionSymbols"
export * from "./globalExtensions"
diff --git a/src/lib/__PRODUCTION__.ts b/src/lib/__PRODUCTION__.ts
deleted file mode 100644
index 783df1f..0000000
--- a/src/lib/__PRODUCTION__.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-// We need to polyfill process if it doesn't exist, such as in the browser.
-if (typeof process === "undefined") {
- globalThis.process = { env: {} } as typeof process
-}
-
-/**
- * `true` if in the production environment, `false` otherwise.
- *
- * This boolean can be used to perform actions only in development environments,
- * such as logging.
- */
-export const __PRODUCTION__ = process.env.NODE_ENV === "production"
diff --git a/src/lib/getSlots.ts b/src/lib/getSlots.ts
deleted file mode 100644
index 84a32ef..0000000
--- a/src/lib/getSlots.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import type { ConcreteComponent, Slots, VNode } from "vue"
-
-/**
- * Get the appropriate `slots` object/array according to the provided parent,
- * fixing `Non-function value encountered for default slot.` warnings.
- *
- * @param parent - The parent inheriting slots
- * @param slots - The `slots` to transform for parent
- * @param defaultParams - The parameters to provide to the default slot
- *
- * @returns The appropriate slots object/array
- *
- * @internal
- */
-export const getSlots = (
- parent: string | ConcreteComponent,
- slots: Slots,
- defaultPayload?: unknown,
- fallback?: string,
-): VNode[] | undefined | Slots | string => {
- if (typeof parent === "string") {
- return slots.default ? slots.default(defaultPayload) : fallback
- } else {
- if (slots.default) {
- const content = slots.default(defaultPayload)
-
- return content.length
- ? {
- ...slots,
- default: () => content,
- }
- : fallback
- } else {
- return fallback
- }
- }
-}
diff --git a/src/types.ts b/src/types.ts
index 28fdc7c..9a8c454 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,4 +1,5 @@
import type {
+ AsLinkAttrsConfig,
ClientConfig,
CreateClient,
HTMLRichTextFunctionSerializer,
@@ -27,9 +28,7 @@ import type {
SliceComponentProps,
SliceComponentType,
TODOSliceComponent,
-} from "./components/SliceZone"
-
-import type { usePrismicDocuments } from "./composables"
+} from "./SliceZone"
/* eslint-enable @typescript-eslint/no-unused-vars */
@@ -38,12 +37,13 @@ import type { usePrismicDocuments } from "./composables"
*/
type PrismicPluginComponentsOptions = {
/**
- * Value of the `rel` attribute to use on links rendered with
- * `target="_blank"`
+ * The `rel` attribute for the link. By default, `"noreferrer"` is provided if
+ * the link's URL is external. This prop can be provided a function to use the
+ * link's metadata to determine the `rel` value.
*
- * @defaultValue `"noopener noreferrer"`
+ * @defaultValue `"noreferrer"`
*/
- linkBlankTargetRelAttribute?: string
+ linkRel?: AsLinkAttrsConfig["rel"]
/**
* An HTML tag name, a component, or a functional component used to render
@@ -411,31 +411,6 @@ export type PrismicPlugin = {
} & PrismicPluginClient &
PrismicPluginHelpers
-/**
- * States of a `@prismicio/client` composable.
- */
-export const enum PrismicClientComposableState {
- /**
- * The composable has not started fetching.
- */
- Idle = "idle",
-
- /**
- * The composable is fetching data.
- */
- Pending = "pending",
-
- /**
- * The composable sucessfully fetched data.
- */
- Success = "success",
-
- /**
- * The composable failed to fetch data.
- */
- Error = "error",
-}
-
// Helpers
/**
diff --git a/src/useStatefulPrismicClientMethod.ts b/src/useStatefulPrismicClientMethod.ts
deleted file mode 100644
index 3e86a62..0000000
--- a/src/useStatefulPrismicClientMethod.ts
+++ /dev/null
@@ -1,158 +0,0 @@
-import type {
- Client,
- ForbiddenError,
- ParsingError,
- PrismicError,
-} from "@prismicio/client"
-import type { Ref } from "vue"
-import { isRef, ref, shallowRef, unref, watch } from "vue"
-
-import type { VueUseParameters } from "./types"
-import { PrismicClientComposableState } from "./types"
-
-import { usePrismic } from "./usePrismic"
-
-// Helpers
-type UnwrapPromise = T extends Promise ? U : T
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-type ClientMethodLike = (...args: any[]) => Promise | any
-type ClientMethods = typeof Client.prototype
-type ClientError = PrismicError | ParsingError | ForbiddenError
-
-// Interfaces
-
-/**
- * @internal
- */
-export type ClientMethodParameters =
- ClientMethods[TMethodName] extends ClientMethodLike
- ? VueUseParameters>
- : never
-
-/**
- * @internal
- */
-export type ClientMethodReturnType =
- ClientMethods[TMethodName] extends ClientMethodLike
- ? ReturnType
- : never
-
-/**
- * @internal
- */
-export type ComposableOnlyParameters = {
- client?: Ref | Client
-}
-
-/**
- * The return type of a `@prismicio/client` Vue composable.
- *
- * @typeParam TData - The expected format of the `data` property of the returned
- * object
- */
-export type ClientComposableReturnType = {
- /**
- * The current state of the composable's client method call.
- */
- state: Ref
-
- /**
- * Data returned by the client.
- */
- data: Ref
-
- /**
- * Error returned by the composable's client method call if in an errror
- * state.
- */
- error: Ref
-
- /**
- * Perform the composable's client method call again.
- */
- refresh: () => Promise
-}
-
-/**
- * Determines if a value is a `@prismicio/client` params object.
- *
- * @param value - The value to check
- *
- * @returns `true` if `value` is a `@prismicio/client` params object, `false`
- * otherwise
- */
-const isParams = (
- value: unknown,
-): value is ClientMethodParameters<"get">[0] & ComposableOnlyParameters => {
- // This is a *very* naive check.
- return typeof value === "object" && value !== null && !Array.isArray(value)
-}
-
-/**
- * A low level Vue composable that uses provided method name on plugin or
- * provided client with given arguments. The composable has its own internal
- * state manager to report async status, such as pending or error statuses.
- *
- * @typeParam TClientMethodName - A method name from `@prismicio/client`
- * @typeParam TClientMethodArguments - The method expected arguments
- * @typeParam TClientMethodReturnType - The method expected return type
- *
- * @param method - The `@prismicio/client` method name to use
- * @param args - The arguments to use with requested method
- *
- * @returns The composable payload {@link ClientComposableReturnType}
- *
- * @internal
- */
-export const useStatefulPrismicClientMethod = <
- TClientMethodName extends keyof ClientMethods,
- TClientMethodArguments extends ClientMethodParameters,
- TClientMethodReturnType extends UnwrapPromise<
- ClientMethodReturnType
- >,
->(
- methodName: TClientMethodName,
- args: TClientMethodArguments,
-): ClientComposableReturnType => {
- const { client } = usePrismic()
-
- const state = ref(
- PrismicClientComposableState.Idle,
- )
- const data = shallowRef(null)
- const error = ref(null)
- const refresh = async (): Promise => {
- const lastArg = unref(args[args.length - 1])
- const { client: explicitClient, ...params } = isParams(lastArg)
- ? (lastArg as ClientMethodParameters<"get">[0] & ComposableOnlyParameters)
- : ({} as ComposableOnlyParameters)
- const argsWithoutParams = isParams(lastArg) ? args.slice(0, -1) : args
-
- state.value = PrismicClientComposableState.Pending
- data.value = null
- error.value = null
- try {
- data.value = await (
- (unref(explicitClient) || client)[methodName] as ClientMethodLike
- )(
- ...argsWithoutParams.map((arg: Ref | unknown) => unref(arg)),
- params,
- )
- state.value = PrismicClientComposableState.Success
- } catch (err) {
- state.value = PrismicClientComposableState.Error
- error.value = err as ClientError | Error
- }
- }
-
- // Watch reactive args
- const refArgs = args.filter((arg) => isRef(arg))
- if (refArgs.length) {
- watch(refArgs, refresh, { deep: true })
- }
-
- // Fetch once
- refresh()
-
- return { state, data, error, refresh }
-}
diff --git a/test/components-PrismicEmbed.test.ts b/test/components-PrismicEmbed.test.ts
index 3a03877..6d78963 100644
--- a/test/components-PrismicEmbed.test.ts
+++ b/test/components-PrismicEmbed.test.ts
@@ -6,7 +6,7 @@ import { markRaw } from "vue"
import { WrapperComponent } from "./__fixtures__/WrapperComponent"
-import { PrismicEmbed } from "../src/components"
+import { PrismicEmbed } from "../src"
describe("renders an embed field", () => {
it("empty", () => {
diff --git a/test/components-PrismicImage.test.ts b/test/components-PrismicImage.test.ts
index a23256f..a2fe437 100644
--- a/test/components-PrismicImage.test.ts
+++ b/test/components-PrismicImage.test.ts
@@ -2,8 +2,7 @@ import { describe, expect, it, vi } from "vitest"
import { mount } from "@vue/test-utils"
-import { createPrismic } from "../src"
-import { PrismicImage } from "../src/components"
+import { PrismicImage, createPrismic } from "../src"
describe("renders an image field", () => {
it("empty", () => {
diff --git a/test/components-PrismicRichText.test.ts b/test/components-PrismicRichText.test.ts
index 770ee57..b50ae09 100644
--- a/test/components-PrismicRichText.test.ts
+++ b/test/components-PrismicRichText.test.ts
@@ -9,8 +9,7 @@ import { routerKey } from "vue-router"
import { WrapperComponent } from "./__fixtures__/WrapperComponent"
import { richTextFixture } from "./__fixtures__/richText"
-import { createPrismic } from "../src"
-import { PrismicRichTextImpl } from "../src/components"
+import { PrismicRichTextImpl, createPrismic } from "../src"
it("renders rich text field as HTML", () => {
const wrapper = mount(PrismicRichTextImpl, {
diff --git a/test/components-PrismicText.test.ts b/test/components-PrismicText.test.ts
index 13727fc..98cf048 100644
--- a/test/components-PrismicText.test.ts
+++ b/test/components-PrismicText.test.ts
@@ -6,7 +6,7 @@ import { markRaw } from "vue"
import { WrapperComponent } from "./__fixtures__/WrapperComponent"
-import { PrismicText } from "../src/components"
+import { PrismicText } from "../src"
describe("renders a rich text field", () => {
it("as plain text", () => {
diff --git a/test/components-SliceZone.test.ts b/test/components-SliceZone.test.ts
index 0c01b9d..be91a83 100644
--- a/test/components-SliceZone.test.ts
+++ b/test/components-SliceZone.test.ts
@@ -9,19 +9,19 @@ import {
createWrapperComponent,
} from "./__fixtures__/WrapperComponent"
-import { createPrismic } from "../src"
import type {
SliceComponentProps,
SliceComponentType,
SliceLike,
SliceZoneLike,
SliceZoneResolver,
-} from "../src/components"
+} from "../src"
import {
SliceZoneImpl,
+ createPrismic,
defineSliceZoneComponents,
getSliceComponentProps,
-} from "../src/components"
+} from "../src"
it("renders slice zone with correct component mapping from components", async () => {
const Foo = createWrapperComponent(
@@ -304,7 +304,9 @@ it("provides context to each slice", () => {
).toStrictEqual(context)
})
-it("renders TODO component if component mapping is missing", () => {
+it.skip("renders TODO component if component mapping is missing", () => {
+ const originalNodeEnv = process.env.NODE_ENV
+ process.env.NODE_ENV = "development"
vi.stubGlobal("console", { warn: vi.fn() })
const Foo = createWrapperComponent(
@@ -339,9 +341,12 @@ it("renders TODO component if component mapping is missing", () => {
)
vi.resetAllMocks()
+ process.env.NODE_ENV = originalNodeEnv
})
-it("renders TODO component if component mapping is missing with GraphQL API", () => {
+it.skip("renders TODO component if component mapping is missing with GraphQL API", () => {
+ const originalNodeEnv = process.env.NODE_ENV
+ process.env.NODE_ENV = "development"
vi.stubGlobal("console", { warn: vi.fn() })
const Foo = createWrapperComponent(
@@ -368,6 +373,7 @@ it("renders TODO component if component mapping is missing with GraphQL API", ()
)
vi.resetAllMocks()
+ process.env.NODE_ENV = originalNodeEnv
})
it("renders plugin provided TODO component if component mapping is missing", () => {
@@ -447,7 +453,7 @@ it("renders provided TODO component over plugin provided if component mapping is
)
})
-it.skip("doesn't render TODO component in production", () => {
+it("doesn't render TODO component in production", () => {
const originalNodeEnv = process.env.NODE_ENV
process.env.NODE_ENV = "production"
const consoleWarnSpy = vi