@prismicio/vue 5.3.0-pr.88.72388e2 → 5.3.0-pr.89.d0f4ac2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/PrismicImage.vue.d.cts +13 -19
  2. package/dist/PrismicImage.vue.d.cts.map +1 -1
  3. package/dist/PrismicLink.vue.d.cts +1 -4
  4. package/dist/PrismicLink.vue.d.cts.map +1 -1
  5. package/dist/PrismicRichText/PrismicRichText.vue.d.cts +5 -6
  6. package/dist/PrismicRichText/PrismicRichText.vue.d.cts.map +1 -1
  7. package/dist/PrismicRichText/types.d.cts +25 -26
  8. package/dist/PrismicRichText/types.d.cts.map +1 -1
  9. package/dist/PrismicTable/PrismicTable.vue.d.cts +5 -6
  10. package/dist/PrismicTable/PrismicTable.vue.d.cts.map +1 -1
  11. package/dist/PrismicTable/types.d.cts +7 -8
  12. package/dist/PrismicTable/types.d.cts.map +1 -1
  13. package/dist/PrismicText.vue.d.cts +1 -3
  14. package/dist/PrismicText.vue.d.cts.map +1 -1
  15. package/dist/SliceZone/types.d.cts +3 -9
  16. package/dist/SliceZone/types.d.cts.map +1 -1
  17. package/dist/createPrismic.d.cts +61 -0
  18. package/dist/createPrismic.d.cts.map +1 -0
  19. package/dist/index.cjs +4 -1
  20. package/dist/index.d.cts +4 -2
  21. package/dist/index.d.ts +4 -2
  22. package/dist/index.js +2 -1
  23. package/dist/package.cjs +1 -1
  24. package/dist/package.cjs.map +1 -1
  25. package/dist/package.js +1 -1
  26. package/dist/package.js.map +1 -1
  27. package/dist/src/PrismicImage.cjs.map +1 -1
  28. package/dist/src/PrismicImage.js.map +1 -1
  29. package/dist/src/PrismicImage.vue.d.ts +17 -23
  30. package/dist/src/PrismicImage.vue.d.ts.map +1 -1
  31. package/dist/src/PrismicImage.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  32. package/dist/src/PrismicImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/src/PrismicLink.cjs.map +1 -1
  34. package/dist/src/PrismicLink.js.map +1 -1
  35. package/dist/src/PrismicLink.vue.d.ts +5 -8
  36. package/dist/src/PrismicLink.vue.d.ts.map +1 -1
  37. package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.cjs +6 -10
  38. package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  39. package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.js +6 -10
  40. package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/src/PrismicRichText/PrismicRichText.cjs.map +1 -1
  42. package/dist/src/PrismicRichText/PrismicRichText.js.map +1 -1
  43. package/dist/src/PrismicRichText/PrismicRichText.vue.d.ts +9 -10
  44. package/dist/src/PrismicRichText/PrismicRichText.vue.d.ts.map +1 -1
  45. package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.cjs +11 -5
  46. package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  47. package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.js +11 -5
  48. package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.cjs.map +1 -1
  50. package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.js.map +1 -1
  51. package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.cjs +2 -2
  52. package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  53. package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.js +2 -2
  54. package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/src/PrismicRichText/PrismicRichTextSerialize.cjs.map +1 -1
  56. package/dist/src/PrismicRichText/PrismicRichTextSerialize.js.map +1 -1
  57. package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.cjs +10 -4
  58. package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  59. package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.js +11 -5
  60. package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/src/PrismicRichText/index.d.ts +1 -1
  62. package/dist/src/PrismicRichText/types.d.ts +25 -26
  63. package/dist/src/PrismicRichText/types.d.ts.map +1 -1
  64. package/dist/src/PrismicTable/PrismicTable.cjs.map +1 -1
  65. package/dist/src/PrismicTable/PrismicTable.js.map +1 -1
  66. package/dist/src/PrismicTable/PrismicTable.vue.d.ts +5 -6
  67. package/dist/src/PrismicTable/PrismicTable.vue.d.ts.map +1 -1
  68. package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.cjs +17 -9
  69. package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  70. package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.js +17 -9
  71. package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/src/PrismicTable/PrismicTableDefaultComponents.cjs +12 -30
  73. package/dist/src/PrismicTable/PrismicTableDefaultComponents.cjs.map +1 -1
  74. package/dist/src/PrismicTable/PrismicTableDefaultComponents.js +12 -30
  75. package/dist/src/PrismicTable/PrismicTableDefaultComponents.js.map +1 -1
  76. package/dist/src/PrismicTable/PrismicTableRow.cjs.map +1 -1
  77. package/dist/src/PrismicTable/PrismicTableRow.js.map +1 -1
  78. package/dist/src/PrismicTable/PrismicTableRow.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  79. package/dist/src/PrismicTable/PrismicTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/src/PrismicTable/index.d.ts +1 -0
  81. package/dist/src/PrismicTable/types.d.ts +7 -8
  82. package/dist/src/PrismicTable/types.d.ts.map +1 -1
  83. package/dist/src/PrismicText.cjs.map +1 -1
  84. package/dist/src/PrismicText.js.map +1 -1
  85. package/dist/src/PrismicText.vue.d.ts +3 -5
  86. package/dist/src/PrismicText.vue.d.ts.map +1 -1
  87. package/dist/src/PrismicText.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  88. package/dist/src/PrismicText.vue_vue_type_script_setup_true_lang.js.map +1 -1
  89. package/dist/src/SliceZone/SliceZone.vue.d.ts +2 -2
  90. package/dist/src/SliceZone/types.d.ts +3 -9
  91. package/dist/src/SliceZone/types.d.ts.map +1 -1
  92. package/dist/src/createPrismic.cjs +33 -0
  93. package/dist/src/createPrismic.cjs.map +1 -0
  94. package/dist/src/createPrismic.d.ts +63 -0
  95. package/dist/src/createPrismic.d.ts.map +1 -0
  96. package/dist/src/createPrismic.js +32 -0
  97. package/dist/src/createPrismic.js.map +1 -0
  98. package/dist/src/lib/isInternalURL.cjs +2 -6
  99. package/dist/src/lib/isInternalURL.cjs.map +1 -1
  100. package/dist/src/lib/isInternalURL.js +2 -6
  101. package/dist/src/lib/isInternalURL.js.map +1 -1
  102. package/dist/src/types.cjs.map +1 -1
  103. package/dist/src/types.d.ts +11 -1
  104. package/dist/src/types.d.ts.map +1 -1
  105. package/dist/src/types.js.map +1 -1
  106. package/dist/types.d.cts +11 -1
  107. package/dist/types.d.cts.map +1 -1
  108. package/package.json +1 -3
  109. package/src/PrismicImage.vue +5 -8
  110. package/src/PrismicLink.vue +14 -14
  111. package/src/PrismicRichText/PrismicRichText.vue +24 -15
  112. package/src/PrismicRichText/PrismicRichTextDefaultComponent.vue +8 -4
  113. package/src/PrismicRichText/PrismicRichTextSerialize.vue +4 -3
  114. package/src/PrismicRichText/index.ts +1 -1
  115. package/src/PrismicRichText/types.ts +57 -29
  116. package/src/PrismicTable/PrismicTable.vue +27 -19
  117. package/src/PrismicTable/PrismicTableDefaultComponents.ts +14 -39
  118. package/src/PrismicTable/PrismicTableRow.vue +2 -2
  119. package/src/PrismicTable/index.ts +2 -0
  120. package/src/PrismicTable/types.ts +41 -23
  121. package/src/PrismicText.vue +1 -3
  122. package/src/SliceZone/types.ts +3 -9
  123. package/src/createPrismic.ts +86 -0
  124. package/src/index.ts +5 -1
  125. package/src/lib/isInternalURL.ts +2 -6
  126. package/src/types.ts +13 -1
@@ -1,10 +1,29 @@
1
1
  import type {
2
2
  LinkResolverFunction,
3
3
  RTAnyNode,
4
- RichTextNodeType,
4
+ RTEmNode,
5
+ RTEmbedNode,
6
+ RTHeading1Node,
7
+ RTHeading2Node,
8
+ RTHeading3Node,
9
+ RTHeading4Node,
10
+ RTHeading5Node,
11
+ RTHeading6Node,
12
+ RTImageNode,
13
+ RTLabelNode,
14
+ RTLinkNode,
15
+ RTListItemNode,
16
+ RTListNode,
17
+ RTOListItemNode,
18
+ RTOListNode,
19
+ RTParagraphNode,
20
+ RTPreformattedNode,
21
+ RTSpanNode,
22
+ RTStrongNode,
23
+ RichTextNodeTypes,
5
24
  } from "@prismicio/client"
6
25
 
7
- import type { VueComponent } from "../types"
26
+ import type { VueComponent, VueComponentShorthand } from "../types"
8
27
 
9
28
  /**
10
29
  * A map of Rich Text block types to Vue Components. It is used to render Rich
@@ -12,13 +31,37 @@ import type { VueComponent } from "../types"
12
31
  *
13
32
  * @see Templating Rich Text and title fields from Prismic {@link https://prismic.io/docs/rich-text}
14
33
  */
15
- export type VueRichTextSerializer = Partial<
16
- Record<keyof typeof RichTextNodeType, VueRichTextComponent | VueShorthand>
17
- >
34
+ export type VueRichTextComponents = {
35
+ heading1?: RichTextComponentProps<RTHeading1Node> | VueComponentShorthand
36
+ heading2?: RichTextComponentProps<RTHeading2Node> | VueComponentShorthand
37
+ heading3?: RichTextComponentProps<RTHeading3Node> | VueComponentShorthand
38
+ heading4?: RichTextComponentProps<RTHeading4Node> | VueComponentShorthand
39
+ heading5?: RichTextComponentProps<RTHeading5Node> | VueComponentShorthand
40
+ heading6?: RichTextComponentProps<RTHeading6Node> | VueComponentShorthand
41
+ paragraph?: RichTextComponentProps<RTParagraphNode> | VueComponentShorthand
42
+ preformatted?:
43
+ | RichTextComponentProps<RTPreformattedNode>
44
+ | VueComponentShorthand
45
+ strong?: RichTextComponentProps<RTStrongNode> | VueComponentShorthand
46
+ em?: RichTextComponentProps<RTEmNode> | VueComponentShorthand
47
+ listItem?: RichTextComponentProps<RTListItemNode> | VueComponentShorthand
48
+ oListItem?: RichTextComponentProps<RTOListItemNode> | VueComponentShorthand
49
+ list?: RichTextComponentProps<RTListNode> | VueComponentShorthand
50
+ oList?: RichTextComponentProps<RTOListNode> | VueComponentShorthand
51
+ image?:
52
+ | RichTextComponentProps<RTImageNode>
53
+ | Omit<VueComponentShorthand, "as">
54
+ embed?: RichTextComponentProps<RTEmbedNode> | VueComponentShorthand
55
+ hyperlink?:
56
+ | RichTextComponentProps<RTLinkNode>
57
+ | Omit<VueComponentShorthand, "as">
58
+ label?:
59
+ | RichTextComponentProps<RTLabelNode>
60
+ | Omit<VueComponentShorthand, "as">
61
+ span?: RichTextComponentProps<RTSpanNode>
62
+ }
18
63
 
19
- /**
20
- * Props for a component rendering nodes from a Prismic rich text field.
21
- */
64
+ /** Props for a component rendering nodes from a Prismic rich text field. */
22
65
  export type RichTextComponentProps<TRTNode extends RTAnyNode = RTAnyNode> = {
23
66
  node: TRTNode
24
67
  }
@@ -28,29 +71,14 @@ export type RichTextComponentProps<TRTNode extends RTAnyNode = RTAnyNode> = {
28
71
  *
29
72
  * @typeParam TRTNode - The type of rich text node(s) this component handles
30
73
  */
31
- type VueRichTextComponent<TRTNode extends RTAnyNode = RTAnyNode> = VueComponent<
32
- RichTextComponentProps<TRTNode>
33
- >
34
-
35
- /**
36
- * A shorthand definition for {@link VueRichTextSerializer} component types.
37
- */
38
- export type VueShorthand = {
39
- /**
40
- * The HTML element type rendered for this node type.
41
- */
42
- as?: string
43
-
44
- /**
45
- * Other attributes to apply to the element type.
46
- */
47
- [Attribute: string]: string | boolean | null | undefined
48
- }
74
+ export type VueRichTextComponent<TRTNode extends RTAnyNode = RTAnyNode> =
75
+ VueComponent<RichTextComponentProps<TRTNode>>
49
76
 
50
- export type InternalVueRichTextComponent = Record<
51
- (typeof RichTextNodeType)[keyof typeof RichTextNodeType],
77
+ export type InternalVueRichTextComponents = Record<
78
+ RichTextNodeTypes,
52
79
  {
53
80
  is: VueRichTextComponent
54
- props?: { linkResolver?: LinkResolverFunction; shorthand?: VueShorthand }
81
+ linkResolver?: LinkResolverFunction
82
+ shorthand?: VueComponentShorthand
55
83
  }
56
84
  >
@@ -2,24 +2,24 @@
2
2
  import { type TableField, isFilled } from "@prismicio/client"
3
3
  import { computed } from "vue"
4
4
 
5
- import type { VueShorthand } from "../PrismicRichText/types"
6
- import { type ComponentOrTagName, isVueComponent } from "../types"
5
+ import type { ComponentOrTagName, VueComponentShorthand } from "../types"
6
+ import { isVueComponent } from "../types"
7
7
  import type { InternalVueTableComponents, VueTableComponents } from "./types"
8
8
 
9
- import type { VueRichTextSerializer } from "../PrismicRichText"
9
+ import type { VueRichTextComponents } from "../PrismicRichText"
10
+ import { usePrismic } from "../createPrismic"
10
11
 
11
12
  import { defaultTableComponents } from "./PrismicTableDefaultComponents"
12
13
  import PrismicTableRow from "./PrismicTableRow.vue"
13
14
 
14
- /**
15
- * Props for `<PrismicTable />`.
16
- */
15
+ /** Props for `<PrismicTable />`. */
17
16
  export type PrismicTableProps = {
18
17
  /** The Prismic table field to render. */
19
18
  field: TableField | undefined
20
19
 
21
20
  /**
22
- * An object that maps a table block type to a Vue component or a shorthand definition.
21
+ * An object that maps a table block type to a Vue component or a shorthand
22
+ * definition.
23
23
  *
24
24
  * @example
25
25
  *
@@ -31,7 +31,7 @@ export type PrismicTableProps = {
31
31
  * }
32
32
  * ```
33
33
  */
34
- components?: VueTableComponents & VueRichTextSerializer
34
+ components?: VueTableComponents & VueRichTextComponents
35
35
 
36
36
  /**
37
37
  * The value to be rendered when the field is empty. If a fallback is not
@@ -43,8 +43,16 @@ export type PrismicTableProps = {
43
43
  const props = defineProps<PrismicTableProps>()
44
44
  defineOptions({ name: "PrismicTable" })
45
45
 
46
+ const { componentsConfig } = usePrismic()
47
+
48
+ const resolvedComponents = computed<VueTableComponents & VueRichTextComponents>(
49
+ () => {
50
+ return { ...componentsConfig?.defaultComponents, ...props.components }
51
+ },
52
+ )
53
+
46
54
  function getInternalComponent(type: keyof VueTableComponents) {
47
- const maybeComponentOrShorthand = props.components?.[type]
55
+ const maybeComponentOrShorthand = resolvedComponents.value?.[type]
48
56
 
49
57
  if (isVueComponent(maybeComponentOrShorthand)) {
50
58
  return { is: maybeComponentOrShorthand }
@@ -52,11 +60,11 @@ function getInternalComponent(type: keyof VueTableComponents) {
52
60
 
53
61
  return {
54
62
  is: defaultTableComponents[type],
55
- shorthand: maybeComponentOrShorthand as VueShorthand,
63
+ shorthand: maybeComponentOrShorthand as VueComponentShorthand,
56
64
  }
57
65
  }
58
66
 
59
- const tableComponents = computed<InternalVueTableComponents>(() => {
67
+ const internalTableComponents = computed<InternalVueTableComponents>(() => {
60
68
  return {
61
69
  table: getInternalComponent("table"),
62
70
  thead: getInternalComponent("thead"),
@@ -71,34 +79,34 @@ const tableComponents = computed<InternalVueTableComponents>(() => {
71
79
  <template>
72
80
  <component
73
81
  v-if="isFilled.table(field)"
74
- :is="tableComponents.table.is"
82
+ :is="internalTableComponents.table.is"
75
83
  :table="field"
76
- v-bind="{ ...$attrs, ...tableComponents.table.shorthand }"
84
+ v-bind="{ ...$attrs, ...internalTableComponents.table.shorthand }"
77
85
  >
78
86
  <component
79
87
  v-if="field.head"
80
- :is="tableComponents.thead.is"
88
+ :is="internalTableComponents.thead.is"
81
89
  :head="field.head"
82
- v-bind="tableComponents.thead.shorthand"
90
+ v-bind="internalTableComponents.thead.shorthand"
83
91
  >
84
92
  <PrismicTableRow
85
93
  v-for="row in field.head.rows"
86
94
  :key="row.key"
87
95
  :row="row"
88
- :internalTableComponents="tableComponents"
96
+ :internalTableComponents="internalTableComponents"
89
97
  :components="components"
90
98
  />
91
99
  </component>
92
100
  <component
93
- :is="tableComponents.tbody.is"
101
+ :is="internalTableComponents.tbody.is"
94
102
  :body="field.body"
95
- v-bind="tableComponents.tbody.shorthand"
103
+ v-bind="internalTableComponents.tbody.shorthand"
96
104
  >
97
105
  <PrismicTableRow
98
106
  v-for="row in field.body.rows"
99
107
  :key="row.key"
100
108
  :row="row"
101
- :internalTableComponents="tableComponents"
109
+ :internalTableComponents="internalTableComponents"
102
110
  :components="components"
103
111
  />
104
112
  </component>
@@ -1,69 +1,44 @@
1
1
  import { defineComponent, h } from "vue"
2
- import type { PropType } from "vue"
3
2
 
4
- import type { DefaultVueTableComponents } from "./types"
3
+ import type { VueTableComponents } from "./types"
5
4
 
6
5
  import * as getTableComponentProps from "./getTableComponentProps"
7
6
 
8
- export const defaultTableComponents: DefaultVueTableComponents = {
7
+ export const defaultTableComponents: Required<VueTableComponents> = {
9
8
  table: defineComponent({
10
- props: {
11
- ...getTableComponentProps.table(),
12
- as: { type: String as PropType<string | undefined> },
13
- },
9
+ props: getTableComponentProps.table(),
14
10
  setup(props, { attrs, slots }) {
15
- return () =>
16
- h(props.as ?? "table", attrs, slots.default ? slots.default() : [])
11
+ return () => h("table", attrs, slots.default ? slots.default() : [])
17
12
  },
18
13
  }),
19
14
  thead: defineComponent({
20
- props: {
21
- ...getTableComponentProps.thead(),
22
- as: { type: String as PropType<string | undefined> },
23
- },
15
+ props: getTableComponentProps.thead(),
24
16
  setup(props, { attrs, slots }) {
25
- return () =>
26
- h(props.as ?? "thead", attrs, slots.default ? slots.default() : [])
17
+ return () => h("thead", attrs, slots.default ? slots.default() : [])
27
18
  },
28
19
  }),
29
20
  tbody: defineComponent({
30
- props: {
31
- ...getTableComponentProps.tbody(),
32
- as: { type: String as PropType<string | undefined> },
33
- },
21
+ props: getTableComponentProps.tbody(),
34
22
  setup(props, { attrs, slots }) {
35
- return () =>
36
- h(props.as ?? "tbody", attrs, slots.default ? slots.default() : [])
23
+ return () => h("tbody", attrs, slots.default ? slots.default() : [])
37
24
  },
38
25
  }),
39
26
  tr: defineComponent({
40
- props: {
41
- ...getTableComponentProps.tr(),
42
- as: { type: String as PropType<string | undefined> },
43
- },
27
+ props: getTableComponentProps.tr(),
44
28
  setup(props, { attrs, slots }) {
45
- return () =>
46
- h(props.as ?? "tr", attrs, slots.default ? slots.default() : [])
29
+ return () => h("tr", attrs, slots.default ? slots.default() : [])
47
30
  },
48
31
  }),
49
32
  th: defineComponent({
50
- props: {
51
- ...getTableComponentProps.th(),
52
- as: { type: String as PropType<string | undefined> },
53
- },
33
+ props: getTableComponentProps.th(),
54
34
  setup(props, { attrs, slots }) {
55
- return () =>
56
- h(props.as ?? "th", attrs, slots.default ? slots.default() : [])
35
+ return () => h("th", attrs, slots.default ? slots.default() : [])
57
36
  },
58
37
  }),
59
38
  td: defineComponent({
60
- props: {
61
- ...getTableComponentProps.td(),
62
- as: { type: String as PropType<string | undefined> },
63
- },
39
+ props: getTableComponentProps.td(),
64
40
  setup(props, { attrs, slots }) {
65
- return () =>
66
- h(props.as ?? "td", attrs, slots.default ? slots.default() : [])
41
+ return () => h("td", attrs, slots.default ? slots.default() : [])
67
42
  },
68
43
  }),
69
44
  }
@@ -3,13 +3,13 @@ import type { TableFieldBodyRow, TableFieldHeadRow } from "@prismicio/client"
3
3
 
4
4
  import type { InternalVueTableComponents } from "./types"
5
5
 
6
- import type { VueRichTextSerializer } from "../PrismicRichText"
6
+ import type { VueRichTextComponents } from "../PrismicRichText"
7
7
  import PrismicRichText from "../PrismicRichText/PrismicRichText.vue"
8
8
 
9
9
  export type PrismicTableRowProps = {
10
10
  row: TableFieldHeadRow | TableFieldBodyRow
11
11
  internalTableComponents: InternalVueTableComponents
12
- components?: VueRichTextSerializer
12
+ components?: VueRichTextComponents
13
13
  }
14
14
 
15
15
  const props = defineProps<PrismicTableRowProps>()
@@ -1 +1,3 @@
1
1
  export * as getTableComponentProps from "./getTableComponentProps"
2
+
3
+ export type { VueTableComponents } from "./types"
@@ -8,8 +8,7 @@ import type {
8
8
  TableFieldHeaderCell,
9
9
  } from "@prismicio/client"
10
10
 
11
- import type { VueShorthand } from "../PrismicRichText/types"
12
- import type { VueComponent } from "../types"
11
+ import type { VueComponent, VueComponentShorthand } from "../types"
13
12
 
14
13
  /**
15
14
  * A map of Table block types to Vue Components. It is used to render table
@@ -18,30 +17,49 @@ import type { VueComponent } from "../types"
18
17
  * @see Templating Table fields from Prismic {@link https://prismic.io/docs/table}
19
18
  */
20
19
  export type VueTableComponents = {
21
- table?: VueComponent<{ table: TableField<"filled"> }> | VueShorthand
22
- thead?: VueComponent<{ head: TableFieldHead }> | VueShorthand
23
- tbody?: VueComponent<{ body: TableFieldBody }> | VueShorthand
20
+ table?:
21
+ | VueComponent<{ table: TableField<"filled"> }>
22
+ | Omit<VueComponentShorthand, "as">
23
+ thead?:
24
+ | VueComponent<{ head: TableFieldHead }>
25
+ | Omit<VueComponentShorthand, "as">
26
+ tbody?:
27
+ | VueComponent<{ body: TableFieldBody }>
28
+ | Omit<VueComponentShorthand, "as">
24
29
  tr?:
25
30
  | VueComponent<{ row: TableFieldBodyRow | TableFieldHeadRow }>
26
- | VueShorthand
27
- th?: VueComponent<{ cell: TableFieldHeaderCell }> | VueShorthand
28
- td?: VueComponent<{ cell: TableFieldDataCell }> | VueShorthand
29
- }
30
-
31
- export type DefaultVueTableComponents = {
32
- table: VueComponent<{ table: TableField<"filled">; as?: string }>
33
- thead: VueComponent<{ head: TableFieldHead; as?: string }>
34
- tbody: VueComponent<{ body: TableFieldBody; as?: string }>
35
- tr: VueComponent<{ row: TableFieldBodyRow | TableFieldHeadRow; as?: string }>
36
- th: VueComponent<{ cell: TableFieldHeaderCell; as?: string }>
37
- td: VueComponent<{ cell: TableFieldDataCell; as?: string }>
31
+ | Omit<VueComponentShorthand, "as">
32
+ th?:
33
+ | VueComponent<{ cell: TableFieldHeaderCell }>
34
+ | Omit<VueComponentShorthand, "as">
35
+ td?:
36
+ | VueComponent<{ cell: TableFieldDataCell }>
37
+ | Omit<VueComponentShorthand, "as">
38
38
  }
39
39
 
40
40
  export type InternalVueTableComponents = {
41
- table: { is: VueTableComponents["table"]; shorthand?: VueShorthand }
42
- thead: { is: VueTableComponents["thead"]; shorthand?: VueShorthand }
43
- tbody: { is: VueTableComponents["tbody"]; shorthand?: VueShorthand }
44
- tr: { is: VueTableComponents["tr"]; shorthand?: VueShorthand }
45
- th: { is: VueTableComponents["th"]; shorthand?: VueShorthand }
46
- td: { is: VueTableComponents["td"]; shorthand?: VueShorthand }
41
+ table: {
42
+ is: VueTableComponents["table"]
43
+ shorthand?: Omit<VueComponentShorthand, "as">
44
+ }
45
+ thead: {
46
+ is: VueTableComponents["thead"]
47
+ shorthand?: Omit<VueComponentShorthand, "as">
48
+ }
49
+ tbody: {
50
+ is: VueTableComponents["tbody"]
51
+ shorthand?: Omit<VueComponentShorthand, "as">
52
+ }
53
+ tr: {
54
+ is: VueTableComponents["tr"]
55
+ shorthand?: Omit<VueComponentShorthand, "as">
56
+ }
57
+ th: {
58
+ is: VueTableComponents["th"]
59
+ shorthand?: Omit<VueComponentShorthand, "as">
60
+ }
61
+ td: {
62
+ is: VueTableComponents["td"]
63
+ shorthand?: Omit<VueComponentShorthand, "as">
64
+ }
47
65
  }
@@ -6,9 +6,7 @@ import { watchEffect } from "vue"
6
6
 
7
7
  import { devMsg } from "./lib/devMsg"
8
8
 
9
- /**
10
- * Props for `<PrismicText />`.
11
- */
9
+ /** Props for `<PrismicText />`. */
12
10
  export type PrismicTextProps = {
13
11
  /** The Prismic rich text field to render. */
14
12
  field: RichTextField | null | undefined
@@ -83,19 +83,13 @@ export type SliceComponentProps<
83
83
  TSlice extends SliceLike = SliceLike,
84
84
  TContext = unknown,
85
85
  > = {
86
- /**
87
- * Slice data for this component.
88
- */
86
+ /** Slice data for this component. */
89
87
  slice: TSlice
90
88
 
91
- /**
92
- * The index of the Slice in the Slice Zone.
93
- */
89
+ /** The index of the Slice in the Slice Zone. */
94
90
  index: number
95
91
 
96
- /**
97
- * All Slices from the Slice Zone to which the Slice belongs.
98
- */
92
+ /** All Slices from the Slice Zone to which the Slice belongs. */
99
93
  // TODO: We have to keep this list of Slices general due to circular
100
94
  // reference limtiations. If we had another generic to determine the full
101
95
  // union of Slice types, it would include TSlice. This causes TypeScript to
@@ -0,0 +1,86 @@
1
+ import type { CreateClient } from "@prismicio/client"
2
+ import { isFilled } from "@prismicio/client"
3
+ import { type App, type InjectionKey, inject } from "vue"
4
+
5
+ import type { ComponentOrTagName } from "./types"
6
+
7
+ import type { VueRichTextComponents } from "./PrismicRichText"
8
+ import type { VueTableComponents } from "./PrismicTable"
9
+
10
+ const prismicKey = Symbol.for(
11
+ "@prismicio/vue/plugin",
12
+ ) as InjectionKey<PrismicPlugin>
13
+
14
+ /** Components configuration. */
15
+ type ComponentsConfig = {
16
+ /** The default component rendered for internal URLs. */
17
+ linkInternalComponent?: ComponentOrTagName
18
+
19
+ /** The default component rendered for external URLs. */
20
+ linkExternalComponent?: ComponentOrTagName
21
+
22
+ /**
23
+ * The default components or shorthand definitions for Rich Text and Table
24
+ * fields.
25
+ */
26
+ defaultComponents?: VueRichTextComponents & VueTableComponents
27
+ }
28
+
29
+ /**
30
+ * Prismic Vue plugin interface accessible through `usePrismic()` and
31
+ * `$prismic`.
32
+ */
33
+ export type PrismicPlugin = {
34
+ /** A Prismic client that can be used to query content from a repository. */
35
+ client: ReturnType<CreateClient>
36
+
37
+ /** Helpers to determine if a field is filled. */
38
+ isFilled: typeof isFilled
39
+
40
+ /** @internal */
41
+ readonly componentsConfig?: ComponentsConfig
42
+
43
+ /** @internal */
44
+ install: (app: App) => void
45
+ }
46
+
47
+ /** Prismic Vue plugin configuration. */
48
+ export type PrismicPluginConfig = {
49
+ /** A Prismic client instance to inject into the Vue app. */
50
+ client: ReturnType<CreateClient>
51
+
52
+ /** Components configuration. */
53
+ componentsConfig?: ComponentsConfig
54
+ }
55
+
56
+ /** Creates a Prismic Vue plugin instance that can be used by a Vue app. */
57
+ export const createPrismic = (config: PrismicPluginConfig): PrismicPlugin => {
58
+ return {
59
+ ...config,
60
+ isFilled,
61
+ install(app: App): void {
62
+ app.provide(prismicKey, this)
63
+ app.config.globalProperties.$prismic = this
64
+ },
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Access the Prismic Vue plugin interface.
70
+ *
71
+ * @example
72
+ *
73
+ * ```typescript
74
+ * const { client, isFilled } = usePrismic()
75
+ * ```
76
+ */
77
+ export const usePrismic = (): PrismicPlugin => {
78
+ return inject(prismicKey, { componentsConfig: {} } as PrismicPlugin)
79
+ }
80
+
81
+ declare module "vue" {
82
+ export interface ComponentCustomProperties {
83
+ /** The Prismic Vue plugin interface. */
84
+ $prismic: PrismicPlugin
85
+ }
86
+ }
package/src/index.ts CHANGED
@@ -2,13 +2,14 @@ export { default as PrismicRichText } from "./PrismicRichText/PrismicRichText.vu
2
2
  export type { PrismicRichTextProps } from "./PrismicRichText/PrismicRichText.vue"
3
3
  export { getRichTextComponentProps } from "./PrismicRichText"
4
4
  export type {
5
- VueRichTextSerializer,
5
+ VueRichTextComponents,
6
6
  RichTextComponentProps,
7
7
  } from "./PrismicRichText"
8
8
 
9
9
  export { default as PrismicTable } from "./PrismicTable/PrismicTable.vue"
10
10
  export type { PrismicTableProps } from "./PrismicTable/PrismicTable.vue"
11
11
  export { getTableComponentProps } from "./PrismicTable"
12
+ export type { VueTableComponents } from "./PrismicTable"
12
13
 
13
14
  export { default as PrismicImage } from "./PrismicImage.vue"
14
15
  export type { PrismicImageProps } from "./PrismicImage.vue"
@@ -35,3 +36,6 @@ export type {
35
36
  SliceZoneComponents,
36
37
  SliceZoneLike,
37
38
  } from "./SliceZone"
39
+
40
+ export { createPrismic, usePrismic } from "./createPrismic"
41
+ export type { PrismicPlugin, PrismicPluginConfig } from "./createPrismic"
@@ -7,13 +7,9 @@
7
7
  */
8
8
  // TODO: This does not detect all relative URLs as internal, such as `about` or `./about`. This function assumes relative URLs start with a "/"`.
9
9
  export const isInternalURL = (url: string): boolean => {
10
- /**
11
- * @see Regex101 expression: {@link https://regex101.com/r/1y7iod/1}
12
- */
10
+ /** @see Regex101 expression: {@link https://regex101.com/r/1y7iod/1} */
13
11
  const isInternal = /^\/(?!\/)/.test(url)
14
- /**
15
- * @see Regex101 expression: {@link https://regex101.com/r/RnUseS/1}
16
- */
12
+ /** @see Regex101 expression: {@link https://regex101.com/r/RnUseS/1} */
17
13
  const isSpecialLink = !isInternal && !/^https?:\/\//i.test(url)
18
14
 
19
15
  return isInternal && !isSpecialLink
package/src/types.ts CHANGED
@@ -20,8 +20,20 @@ export type VueComponent<TProps> =
20
20
  | DefineComponent<TProps>
21
21
  | FunctionalComponent<TProps>
22
22
 
23
+ /**
24
+ * A shorthand definition for `<PrismicRichText />` and `<PrismicTable />`
25
+ * component types.
26
+ */
27
+ export type VueComponentShorthand = {
28
+ /** The HTML element type rendered for this node type. */
29
+ as?: string
30
+
31
+ /** Other attributes to apply to the element type. */
32
+ [Attribute: string]: string | boolean | null | undefined
33
+ }
34
+
23
35
  export const isVueComponent = <T>(
24
- component: VueComponent<T> | unknown,
36
+ component: VueComponent<T> | VueComponentShorthand | undefined,
25
37
  ): component is VueComponent<T> => {
26
38
  return (
27
39
  !!component &&