@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.
- package/dist/PrismicImage.vue.d.cts +13 -19
- package/dist/PrismicImage.vue.d.cts.map +1 -1
- package/dist/PrismicLink.vue.d.cts +1 -4
- package/dist/PrismicLink.vue.d.cts.map +1 -1
- package/dist/PrismicRichText/PrismicRichText.vue.d.cts +5 -6
- package/dist/PrismicRichText/PrismicRichText.vue.d.cts.map +1 -1
- package/dist/PrismicRichText/types.d.cts +25 -26
- package/dist/PrismicRichText/types.d.cts.map +1 -1
- package/dist/PrismicTable/PrismicTable.vue.d.cts +5 -6
- package/dist/PrismicTable/PrismicTable.vue.d.cts.map +1 -1
- package/dist/PrismicTable/types.d.cts +7 -8
- package/dist/PrismicTable/types.d.cts.map +1 -1
- package/dist/PrismicText.vue.d.cts +1 -3
- package/dist/PrismicText.vue.d.cts.map +1 -1
- package/dist/SliceZone/types.d.cts +3 -9
- package/dist/SliceZone/types.d.cts.map +1 -1
- package/dist/createPrismic.d.cts +61 -0
- package/dist/createPrismic.d.cts.map +1 -0
- package/dist/index.cjs +4 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +2 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/src/PrismicImage.cjs.map +1 -1
- package/dist/src/PrismicImage.js.map +1 -1
- package/dist/src/PrismicImage.vue.d.ts +17 -23
- package/dist/src/PrismicImage.vue.d.ts.map +1 -1
- package/dist/src/PrismicImage.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicLink.cjs.map +1 -1
- package/dist/src/PrismicLink.js.map +1 -1
- package/dist/src/PrismicLink.vue.d.ts +5 -8
- package/dist/src/PrismicLink.vue.d.ts.map +1 -1
- package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.cjs +6 -10
- package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.js +6 -10
- package/dist/src/PrismicLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichText.cjs.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichText.js.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichText.vue.d.ts +9 -10
- package/dist/src/PrismicRichText/PrismicRichText.vue.d.ts.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.cjs +11 -5
- package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.js +11 -5
- package/dist/src/PrismicRichText/PrismicRichText.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.cjs.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.js.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.cjs +2 -2
- package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/src/PrismicRichText/PrismicRichTextDefaultComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextSerialize.cjs.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextSerialize.js.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.cjs +10 -4
- package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.js +11 -5
- package/dist/src/PrismicRichText/PrismicRichTextSerialize.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicRichText/index.d.ts +1 -1
- package/dist/src/PrismicRichText/types.d.ts +25 -26
- package/dist/src/PrismicRichText/types.d.ts.map +1 -1
- package/dist/src/PrismicTable/PrismicTable.cjs.map +1 -1
- package/dist/src/PrismicTable/PrismicTable.js.map +1 -1
- package/dist/src/PrismicTable/PrismicTable.vue.d.ts +5 -6
- package/dist/src/PrismicTable/PrismicTable.vue.d.ts.map +1 -1
- package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.cjs +17 -9
- package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.js +17 -9
- package/dist/src/PrismicTable/PrismicTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicTable/PrismicTableDefaultComponents.cjs +12 -30
- package/dist/src/PrismicTable/PrismicTableDefaultComponents.cjs.map +1 -1
- package/dist/src/PrismicTable/PrismicTableDefaultComponents.js +12 -30
- package/dist/src/PrismicTable/PrismicTableDefaultComponents.js.map +1 -1
- package/dist/src/PrismicTable/PrismicTableRow.cjs.map +1 -1
- package/dist/src/PrismicTable/PrismicTableRow.js.map +1 -1
- package/dist/src/PrismicTable/PrismicTableRow.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicTable/PrismicTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/PrismicTable/index.d.ts +1 -0
- package/dist/src/PrismicTable/types.d.ts +7 -8
- package/dist/src/PrismicTable/types.d.ts.map +1 -1
- package/dist/src/PrismicText.cjs.map +1 -1
- package/dist/src/PrismicText.js.map +1 -1
- package/dist/src/PrismicText.vue.d.ts +3 -5
- package/dist/src/PrismicText.vue.d.ts.map +1 -1
- package/dist/src/PrismicText.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
- package/dist/src/PrismicText.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/src/SliceZone/SliceZone.vue.d.ts +2 -2
- package/dist/src/SliceZone/types.d.ts +3 -9
- package/dist/src/SliceZone/types.d.ts.map +1 -1
- package/dist/src/createPrismic.cjs +33 -0
- package/dist/src/createPrismic.cjs.map +1 -0
- package/dist/src/createPrismic.d.ts +63 -0
- package/dist/src/createPrismic.d.ts.map +1 -0
- package/dist/src/createPrismic.js +32 -0
- package/dist/src/createPrismic.js.map +1 -0
- package/dist/src/lib/isInternalURL.cjs +2 -6
- package/dist/src/lib/isInternalURL.cjs.map +1 -1
- package/dist/src/lib/isInternalURL.js +2 -6
- package/dist/src/lib/isInternalURL.js.map +1 -1
- package/dist/src/types.cjs.map +1 -1
- package/dist/src/types.d.ts +11 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/types.d.cts +11 -1
- package/dist/types.d.cts.map +1 -1
- package/package.json +1 -3
- package/src/PrismicImage.vue +5 -8
- package/src/PrismicLink.vue +14 -14
- package/src/PrismicRichText/PrismicRichText.vue +24 -15
- package/src/PrismicRichText/PrismicRichTextDefaultComponent.vue +8 -4
- package/src/PrismicRichText/PrismicRichTextSerialize.vue +4 -3
- package/src/PrismicRichText/index.ts +1 -1
- package/src/PrismicRichText/types.ts +57 -29
- package/src/PrismicTable/PrismicTable.vue +27 -19
- package/src/PrismicTable/PrismicTableDefaultComponents.ts +14 -39
- package/src/PrismicTable/PrismicTableRow.vue +2 -2
- package/src/PrismicTable/index.ts +2 -0
- package/src/PrismicTable/types.ts +41 -23
- package/src/PrismicText.vue +1 -3
- package/src/SliceZone/types.ts +3 -9
- package/src/createPrismic.ts +86 -0
- package/src/index.ts +5 -1
- package/src/lib/isInternalURL.ts +2 -6
- package/src/types.ts +13 -1
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
LinkResolverFunction,
|
|
3
3
|
RTAnyNode,
|
|
4
|
-
|
|
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
|
|
16
|
-
|
|
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> =
|
|
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
|
|
51
|
-
|
|
77
|
+
export type InternalVueRichTextComponents = Record<
|
|
78
|
+
RichTextNodeTypes,
|
|
52
79
|
{
|
|
53
80
|
is: VueRichTextComponent
|
|
54
|
-
|
|
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 {
|
|
6
|
-
import {
|
|
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 {
|
|
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
|
|
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 &
|
|
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 =
|
|
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
|
|
63
|
+
shorthand: maybeComponentOrShorthand as VueComponentShorthand,
|
|
56
64
|
}
|
|
57
65
|
}
|
|
58
66
|
|
|
59
|
-
const
|
|
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="
|
|
82
|
+
:is="internalTableComponents.table.is"
|
|
75
83
|
:table="field"
|
|
76
|
-
v-bind="{ ...$attrs, ...
|
|
84
|
+
v-bind="{ ...$attrs, ...internalTableComponents.table.shorthand }"
|
|
77
85
|
>
|
|
78
86
|
<component
|
|
79
87
|
v-if="field.head"
|
|
80
|
-
:is="
|
|
88
|
+
:is="internalTableComponents.thead.is"
|
|
81
89
|
:head="field.head"
|
|
82
|
-
v-bind="
|
|
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="
|
|
96
|
+
:internalTableComponents="internalTableComponents"
|
|
89
97
|
:components="components"
|
|
90
98
|
/>
|
|
91
99
|
</component>
|
|
92
100
|
<component
|
|
93
|
-
:is="
|
|
101
|
+
:is="internalTableComponents.tbody.is"
|
|
94
102
|
:body="field.body"
|
|
95
|
-
v-bind="
|
|
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="
|
|
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 {
|
|
3
|
+
import type { VueTableComponents } from "./types"
|
|
5
4
|
|
|
6
5
|
import * as getTableComponentProps from "./getTableComponentProps"
|
|
7
6
|
|
|
8
|
-
export const defaultTableComponents:
|
|
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 {
|
|
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?:
|
|
12
|
+
components?: VueRichTextComponents
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
const props = defineProps<PrismicTableRowProps>()
|
|
@@ -8,8 +8,7 @@ import type {
|
|
|
8
8
|
TableFieldHeaderCell,
|
|
9
9
|
} from "@prismicio/client"
|
|
10
10
|
|
|
11
|
-
import type {
|
|
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?:
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
|
27
|
-
th?:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
}
|
package/src/PrismicText.vue
CHANGED
|
@@ -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
|
package/src/SliceZone/types.ts
CHANGED
|
@@ -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
|
-
|
|
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"
|
package/src/lib/isInternalURL.ts
CHANGED
|
@@ -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> |
|
|
36
|
+
component: VueComponent<T> | VueComponentShorthand | undefined,
|
|
25
37
|
): component is VueComponent<T> => {
|
|
26
38
|
return (
|
|
27
39
|
!!component &&
|