@portabletext/schema 2.1.0 → 2.2.0
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/LICENSE +1 -1
- package/dist/index.d.ts +93 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +125 -17
- package/dist/index.js.map +1 -1
- package/package.json +5 -8
package/LICENSE
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -66,10 +66,81 @@ type InlineObjectSchemaType = BaseDefinition & {
|
|
|
66
66
|
};
|
|
67
67
|
/**
|
|
68
68
|
* @public
|
|
69
|
+
* Describes a member type within an array field's `of`.
|
|
70
|
+
*
|
|
71
|
+
* Three forms:
|
|
72
|
+
* - `BlockOfDefinition` (`type: 'block'`) - declares a nested text block,
|
|
73
|
+
* with PTE sub-schema configurable inline.
|
|
74
|
+
* - `InlineObjectOfDefinition` (`type: 'object'`) - inline-declares an
|
|
75
|
+
* object shape at this position. `name` is the type identity; `fields`
|
|
76
|
+
* defines the shape.
|
|
77
|
+
* - `ReferenceOfDefinition` (`type: <name>`) - a bare reference to a type
|
|
78
|
+
* declared in `blockObjects` or `inlineObjects` at the schema root.
|
|
79
|
+
*/
|
|
80
|
+
type OfDefinition = BlockOfDefinition | InlineObjectOfDefinition | ReferenceOfDefinition;
|
|
81
|
+
/**
|
|
82
|
+
* @public
|
|
83
|
+
* An `of` member with `type: 'block'` -- supports nested PTE sub-schema.
|
|
84
|
+
*
|
|
85
|
+
* When this entry appears in a container field's `of`, it declares a nested
|
|
86
|
+
* text block. Each sub-schema field is inherited from the root schema when
|
|
87
|
+
* absent, or fully overrides root when defined. Resolution happens at
|
|
88
|
+
* `compileSchema` time; after compilation, all fields are populated and can
|
|
89
|
+
* be read directly without merging.
|
|
90
|
+
*/
|
|
91
|
+
type BlockOfDefinition = {
|
|
92
|
+
type: 'block';
|
|
93
|
+
name?: string;
|
|
94
|
+
title?: string;
|
|
95
|
+
styles?: ReadonlyArray<BaseDefinition>;
|
|
96
|
+
decorators?: ReadonlyArray<BaseDefinition>;
|
|
97
|
+
annotations?: ReadonlyArray<BaseDefinition & {
|
|
98
|
+
fields?: ReadonlyArray<FieldDefinition>;
|
|
99
|
+
}>;
|
|
100
|
+
lists?: ReadonlyArray<BaseDefinition>;
|
|
101
|
+
inlineObjects?: ReadonlyArray<BaseDefinition & {
|
|
102
|
+
fields?: ReadonlyArray<FieldDefinition>;
|
|
103
|
+
}>;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* @public
|
|
107
|
+
* An `of` member with `type: 'object'` -- inline-declares an object shape.
|
|
108
|
+
*
|
|
109
|
+
* `name` is the type identity at this position. `fields` defines the shape.
|
|
110
|
+
* Use this when the type only needs to exist at this nesting position. For
|
|
111
|
+
* types referenced from multiple positions, declare them once at the schema
|
|
112
|
+
* root (`blockObjects`) and use a `ReferenceOfDefinition` at each call site.
|
|
113
|
+
*/
|
|
114
|
+
type InlineObjectOfDefinition = {
|
|
115
|
+
type: 'object';
|
|
116
|
+
name: string;
|
|
117
|
+
title?: string;
|
|
118
|
+
fields: ReadonlyArray<FieldDefinition>;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* @public
|
|
122
|
+
* An `of` member referencing a type declared elsewhere by name.
|
|
123
|
+
*
|
|
124
|
+
* `type` is the lookup key. Resolves to the matching entry in the schema's
|
|
125
|
+
* `blockObjects` or `inlineObjects`. Self-references and cycles are
|
|
126
|
+
* supported via cycle detection on the resolver walk.
|
|
127
|
+
*
|
|
128
|
+
* Throws at `compileSchema` time when the referenced type isn't declared.
|
|
69
129
|
*/
|
|
70
|
-
type
|
|
71
|
-
type:
|
|
130
|
+
type ReferenceOfDefinition = {
|
|
131
|
+
type: string;
|
|
132
|
+
name?: string;
|
|
133
|
+
title?: string;
|
|
72
134
|
};
|
|
135
|
+
/**
|
|
136
|
+
* @public
|
|
137
|
+
*/
|
|
138
|
+
type FieldDefinition = (BaseDefinition & {
|
|
139
|
+
type: 'array';
|
|
140
|
+
of?: ReadonlyArray<OfDefinition>;
|
|
141
|
+
}) | (BaseDefinition & {
|
|
142
|
+
type: 'string' | 'number' | 'boolean' | 'object';
|
|
143
|
+
});
|
|
73
144
|
/**
|
|
74
145
|
* @public
|
|
75
146
|
*/
|
|
@@ -150,6 +221,25 @@ type InlineObjectDefinition<TBaseDefinition extends BaseDefinition = BaseDefinit
|
|
|
150
221
|
* @public
|
|
151
222
|
*/
|
|
152
223
|
declare function compileSchema(definition: SchemaDefinition): Schema;
|
|
224
|
+
/**
|
|
225
|
+
* Derive the resolved sub-schema for a container field's `of` declaration.
|
|
226
|
+
*
|
|
227
|
+
* Containers declare which types are allowed inside them via the `of`
|
|
228
|
+
* array on a child field. `getSubSchema(schema, of)` returns the resolved
|
|
229
|
+
* `Schema` view that applies inside such a container, so operations and
|
|
230
|
+
* validators that ask "what's allowed at this position?" can treat the
|
|
231
|
+
* result like any other top-level `Schema`.
|
|
232
|
+
*
|
|
233
|
+
* The `{type: 'block'}` entry (if present) supplies the resolved
|
|
234
|
+
* styles, decorators, annotations, lists, and inlineObjects. Non-block
|
|
235
|
+
* `of` members become the schema's block objects. When there is no
|
|
236
|
+
* `{type: 'block'}` entry the returned schema still carries the root
|
|
237
|
+
* schema's `block` and `span` names but every validation list is
|
|
238
|
+
* empty.
|
|
239
|
+
*
|
|
240
|
+
* @public
|
|
241
|
+
*/
|
|
242
|
+
declare function getSubSchema(schema: Schema, of: ReadonlyArray<OfDefinition>): Schema;
|
|
153
243
|
/**
|
|
154
244
|
* @public
|
|
155
245
|
*/
|
|
@@ -217,5 +307,5 @@ interface PortableTextListBlock extends PortableTextTextBlock {
|
|
|
217
307
|
listItem: string;
|
|
218
308
|
level: number;
|
|
219
309
|
}
|
|
220
|
-
export { type AnnotationDefinition, type AnnotationSchemaType, type BaseDefinition, type BlockObjectDefinition, type BlockObjectSchemaType, type DecoratorDefinition, type DecoratorSchemaType, type FieldDefinition, type InlineObjectDefinition, type InlineObjectSchemaType, type ListDefinition, type ListSchemaType, type PortableTextBlock, type PortableTextChild, type PortableTextListBlock, type PortableTextObject, type PortableTextSpan, type PortableTextTextBlock, type Schema, type SchemaDefinition, type StyleDefinition, type StyleSchemaType, type TypedObject, compileSchema, defineSchema, isSpan, isTextBlock, isTypedObject };
|
|
310
|
+
export { type AnnotationDefinition, type AnnotationSchemaType, type BaseDefinition, type BlockObjectDefinition, type BlockObjectSchemaType, type BlockOfDefinition, type DecoratorDefinition, type DecoratorSchemaType, type FieldDefinition, type InlineObjectDefinition, type InlineObjectOfDefinition, type InlineObjectSchemaType, type ListDefinition, type ListSchemaType, type OfDefinition, type PortableTextBlock, type PortableTextChild, type PortableTextListBlock, type PortableTextObject, type PortableTextSpan, type PortableTextTextBlock, type ReferenceOfDefinition, type Schema, type SchemaDefinition, type StyleDefinition, type StyleSchemaType, type TypedObject, compileSchema, defineSchema, getSubSchema, isSpan, isTextBlock, isTypedObject };
|
|
221
311
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/schema.ts","../src/define-schema.ts","../src/compile-schema.ts","../src/types.ts"],"sourcesContent":[],"mappings":"AAGA;;;AAQwB,KARZ,MAAA,GAQY;EAAd,KAAA,EAAA;IACa,IAAA,EAAA,MAAA;IAAd,MAAA,CAAA,EANI,aAMJ,CANkB,eAMlB,CAAA;EACmB,CAAA;EAAd,IAAA,EAAA;IACe,IAAA,EAAA,MAAA;EAAd,CAAA;EACe,MAAA,EAJpB,aAIoB,CAJN,eAIM,CAAA;EAAd,KAAA,EAHP,aAGO,CAHO,cAGP,CAAA;EACe,UAAA,EAHjB,aAGiB,CAHH,mBAGG,CAAA;EAAd,WAAA,EAFF,aAEE,CAFY,oBAEZ,CAAA;EAAa,YAAA,EADd,aACc,CADA,qBACA,CAAA;EAMlB,aAAA,EANK,aAMU,CANI,sBAMa,CAAA;AAW5C,CAAA;AAWA;AAWA;;AACwB,KAlCZ,eAAA,GAAkB,cAkCN,GAAA;EAAd;;AAMV;;EACwB,KAAA,EAAA,MAAA;CAAd;;AAMV;;AACwB,KArCZ,cAAA,GAAiB,cAqCL,GAAA;EAAd;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/schema.ts","../src/define-schema.ts","../src/compile-schema.ts","../src/get-sub-schema.ts","../src/types.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,75 @@
|
|
|
1
|
+
function isBlockOfMember(member) {
|
|
2
|
+
return member.type === "block";
|
|
3
|
+
}
|
|
4
|
+
function isInlineObjectOfMember(member) {
|
|
5
|
+
return member.type === "object";
|
|
6
|
+
}
|
|
7
|
+
function compileOfMember(member, inheritance) {
|
|
8
|
+
return isBlockOfMember(member) ? compileBlockOfMember(member, inheritance) : isInlineObjectOfMember(member) ? compileInlineObjectOfMember(member, inheritance) : member;
|
|
9
|
+
}
|
|
10
|
+
function compileBlockOfMember(member, inheritance) {
|
|
11
|
+
return {
|
|
12
|
+
...member,
|
|
13
|
+
styles: member.styles ? member.styles.map((style) => ({ ...style, value: style.name })) : inheritance.styles,
|
|
14
|
+
decorators: member.decorators ? member.decorators.map((decorator) => ({
|
|
15
|
+
...decorator,
|
|
16
|
+
value: decorator.name
|
|
17
|
+
})) : inheritance.decorators,
|
|
18
|
+
annotations: member.annotations ? member.annotations.map((annotation) => ({
|
|
19
|
+
...annotation,
|
|
20
|
+
fields: annotation.fields?.map(
|
|
21
|
+
(field) => compileField(field, inheritance)
|
|
22
|
+
) ?? []
|
|
23
|
+
})) : inheritance.annotations,
|
|
24
|
+
lists: member.lists ? member.lists.map((list) => ({ ...list, value: list.name })) : inheritance.lists,
|
|
25
|
+
inlineObjects: member.inlineObjects ? member.inlineObjects.map((inlineObject) => ({
|
|
26
|
+
...inlineObject,
|
|
27
|
+
fields: inlineObject.fields?.map(
|
|
28
|
+
(field) => compileField(field, inheritance)
|
|
29
|
+
) ?? []
|
|
30
|
+
})) : inheritance.inlineObjects
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function compileInlineObjectOfMember(member, inheritance) {
|
|
34
|
+
return {
|
|
35
|
+
...member,
|
|
36
|
+
fields: member.fields.map((field) => compileField(field, inheritance))
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function compileField(field, inheritance) {
|
|
40
|
+
return field.type === "array" && field.of ? {
|
|
41
|
+
...field,
|
|
42
|
+
of: field.of.map((member) => compileOfMember(member, inheritance))
|
|
43
|
+
} : field;
|
|
44
|
+
}
|
|
45
|
+
function compileBaseDefinitionWithValue(definition) {
|
|
46
|
+
return { ...definition, value: definition.name };
|
|
47
|
+
}
|
|
1
48
|
function compileSchema(definition) {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
49
|
+
const userStyles = (definition.styles ?? []).map(
|
|
50
|
+
compileBaseDefinitionWithValue
|
|
51
|
+
), styles = userStyles.some((style) => style.value === "normal") ? userStyles : [
|
|
52
|
+
{ value: "normal", name: "normal", title: "Normal" },
|
|
53
|
+
...userStyles
|
|
54
|
+
], lists = (definition.lists ?? []).map(compileBaseDefinitionWithValue), decorators = (definition.decorators ?? []).map(
|
|
55
|
+
compileBaseDefinitionWithValue
|
|
56
|
+
), annotationsShallow = (definition.annotations ?? []).map(
|
|
57
|
+
(annotation) => ({
|
|
58
|
+
...annotation,
|
|
59
|
+
fields: annotation.fields ?? []
|
|
60
|
+
})
|
|
61
|
+
), inlineObjectsShallow = (definition.inlineObjects ?? []).map(
|
|
62
|
+
(inlineObject) => ({
|
|
63
|
+
...inlineObject,
|
|
64
|
+
fields: inlineObject.fields ?? []
|
|
65
|
+
})
|
|
66
|
+
), inheritance = {
|
|
67
|
+
styles,
|
|
68
|
+
decorators,
|
|
69
|
+
annotations: annotationsShallow,
|
|
70
|
+
lists,
|
|
71
|
+
inlineObjects: inlineObjectsShallow
|
|
72
|
+
}, blockFields = [];
|
|
6
73
|
if (definition.block?.fields)
|
|
7
74
|
for (const field of definition.block.fields) {
|
|
8
75
|
if (field.name === "_type" || field.name === "_key" || field.name === "children" || field.name === "markDefs" || field.name === "style" || field.name === "listItem" || field.name === "level") {
|
|
@@ -11,7 +78,7 @@ function compileSchema(definition) {
|
|
|
11
78
|
);
|
|
12
79
|
continue;
|
|
13
80
|
}
|
|
14
|
-
blockFields.push(field);
|
|
81
|
+
blockFields.push(compileField(field, inheritance));
|
|
15
82
|
}
|
|
16
83
|
return {
|
|
17
84
|
block: {
|
|
@@ -21,29 +88,69 @@ function compileSchema(definition) {
|
|
|
21
88
|
span: {
|
|
22
89
|
name: "span"
|
|
23
90
|
},
|
|
24
|
-
styles
|
|
25
|
-
lists
|
|
26
|
-
|
|
27
|
-
value: list.name
|
|
28
|
-
})),
|
|
29
|
-
decorators: (definition.decorators ?? []).map((decorator) => ({
|
|
30
|
-
...decorator,
|
|
31
|
-
value: decorator.name
|
|
32
|
-
})),
|
|
91
|
+
styles,
|
|
92
|
+
lists,
|
|
93
|
+
decorators,
|
|
33
94
|
annotations: (definition.annotations ?? []).map((annotation) => ({
|
|
34
95
|
...annotation,
|
|
35
|
-
fields: annotation.fields ?? []
|
|
96
|
+
fields: annotation.fields?.map((field) => compileField(field, inheritance)) ?? []
|
|
36
97
|
})),
|
|
37
98
|
blockObjects: (definition.blockObjects ?? []).map((blockObject) => ({
|
|
38
99
|
...blockObject,
|
|
39
|
-
fields: blockObject.fields ?? []
|
|
100
|
+
fields: blockObject.fields?.map((field) => compileField(field, inheritance)) ?? []
|
|
40
101
|
})),
|
|
41
102
|
inlineObjects: (definition.inlineObjects ?? []).map((inlineObject) => ({
|
|
42
103
|
...inlineObject,
|
|
43
|
-
fields: inlineObject.fields ?? []
|
|
104
|
+
fields: inlineObject.fields?.map((field) => compileField(field, inheritance)) ?? []
|
|
44
105
|
}))
|
|
45
106
|
};
|
|
46
107
|
}
|
|
108
|
+
function asNamedTypes(resolved) {
|
|
109
|
+
if (resolved)
|
|
110
|
+
return resolved.map((entry) => ({ ...entry, value: entry.name }));
|
|
111
|
+
}
|
|
112
|
+
function asFieldedTypes(resolved) {
|
|
113
|
+
if (resolved)
|
|
114
|
+
return resolved.map(
|
|
115
|
+
(entry) => ({ ...entry, fields: entry.fields ?? [] })
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
function getSubSchema(schema, of) {
|
|
119
|
+
const blockMember = of.find(
|
|
120
|
+
(member) => member.type === "block"
|
|
121
|
+
), blockObjects = of.filter(
|
|
122
|
+
(member) => member.type !== "block"
|
|
123
|
+
).map((member) => {
|
|
124
|
+
const objectMember = member;
|
|
125
|
+
return {
|
|
126
|
+
name: objectMember.name ?? objectMember.type,
|
|
127
|
+
title: objectMember.title,
|
|
128
|
+
fields: objectMember.fields ?? []
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
return blockMember ? {
|
|
132
|
+
block: {
|
|
133
|
+
name: blockMember.name ?? schema.block.name,
|
|
134
|
+
fields: schema.block.fields
|
|
135
|
+
},
|
|
136
|
+
span: { name: schema.span.name },
|
|
137
|
+
styles: asNamedTypes(blockMember.styles) ?? schema.styles,
|
|
138
|
+
decorators: asNamedTypes(blockMember.decorators) ?? schema.decorators,
|
|
139
|
+
annotations: asFieldedTypes(blockMember.annotations) ?? schema.annotations,
|
|
140
|
+
lists: asNamedTypes(blockMember.lists) ?? schema.lists,
|
|
141
|
+
inlineObjects: asFieldedTypes(blockMember.inlineObjects) ?? schema.inlineObjects,
|
|
142
|
+
blockObjects
|
|
143
|
+
} : {
|
|
144
|
+
block: { name: schema.block.name, fields: schema.block.fields },
|
|
145
|
+
span: { name: schema.span.name },
|
|
146
|
+
styles: [],
|
|
147
|
+
decorators: [],
|
|
148
|
+
annotations: [],
|
|
149
|
+
lists: [],
|
|
150
|
+
inlineObjects: [],
|
|
151
|
+
blockObjects
|
|
152
|
+
};
|
|
153
|
+
}
|
|
47
154
|
function defineSchema(definition) {
|
|
48
155
|
return definition;
|
|
49
156
|
}
|
|
@@ -62,6 +169,7 @@ function isSpan(context, child) {
|
|
|
62
169
|
export {
|
|
63
170
|
compileSchema,
|
|
64
171
|
defineSchema,
|
|
172
|
+
getSubSchema,
|
|
65
173
|
isSpan,
|
|
66
174
|
isTextBlock,
|
|
67
175
|
isTypedObject
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/compile-schema.ts","../src/define-schema.ts","../src/types.ts"],"sourcesContent":["import type {SchemaDefinition} from './define-schema'\nimport type {FieldDefinition, Schema} from './schema'\n\n/**\n * @public\n */\nexport function compileSchema(definition: SchemaDefinition): Schema {\n const styles = (definition.styles ?? []).map((style) => ({\n ...style,\n value: style.name,\n }))\n\n const blockFields: Array<FieldDefinition> = []\n\n if (definition.block?.fields) {\n for (const field of definition.block.fields) {\n if (\n field.name === '_type' ||\n field.name === '_key' ||\n field.name === 'children' ||\n field.name === 'markDefs' ||\n field.name === 'style' ||\n field.name === 'listItem' ||\n field.name === 'level'\n ) {\n console.warn(\n `\"${field.name}\" is a reserved field name on Portable Text blocks`,\n )\n continue\n }\n\n blockFields.push(field)\n }\n }\n\n return {\n block: {\n name: definition.block?.name ?? 'block',\n ...(blockFields.length > 0 ? {fields: blockFields} : {}),\n },\n span: {\n name: 'span',\n },\n styles: !styles.some((style) => style.value === 'normal')\n ? [{value: 'normal', name: 'normal', title: 'Normal'}, ...styles]\n : styles,\n lists: (definition.lists ?? []).map((list) => ({\n ...list,\n value: list.name,\n })),\n decorators: (definition.decorators ?? []).map((decorator) => ({\n ...decorator,\n value: decorator.name,\n })),\n annotations: (definition.annotations ?? []).map((annotation) => ({\n ...annotation,\n fields: annotation.fields ?? [],\n })),\n blockObjects: (definition.blockObjects ?? []).map((blockObject) => ({\n ...blockObject,\n fields: blockObject.fields ?? [],\n })),\n inlineObjects: (definition.inlineObjects ?? []).map((inlineObject) => ({\n ...inlineObject,\n fields: inlineObject.fields ?? [],\n })),\n }\n}\n","import type {BaseDefinition, FieldDefinition} from './schema'\n\n/**\n * @public\n */\nexport type SchemaDefinition = {\n block?: {\n name?: string\n fields?: ReadonlyArray<FieldDefinition>\n }\n styles?: ReadonlyArray<StyleDefinition>\n lists?: ReadonlyArray<ListDefinition>\n decorators?: ReadonlyArray<DecoratorDefinition>\n annotations?: ReadonlyArray<AnnotationDefinition>\n blockObjects?: ReadonlyArray<BlockObjectDefinition>\n inlineObjects?: ReadonlyArray<InlineObjectDefinition>\n}\n\n/**\n * @public\n * A helper wrapper that adds editor support, such as autocomplete and type checking, for a schema definition.\n * @example\n * ```ts\n * import { defineSchema } from '@portabletext/editor'\n *\n * const schemaDefinition = defineSchema({\n * decorators: [{name: 'strong'}, {name: 'em'}, {name: 'underline'}],\n * annotations: [{name: 'link'}],\n * styles: [\n * {name: 'normal'},\n * {name: 'h1'},\n * {name: 'h2'},\n * {name: 'h3'},\n * {name: 'blockquote'},\n * ],\n * lists: [],\n * inlineObjects: [],\n * blockObjects: [],\n * }\n * ```\n */\nexport function defineSchema<const TSchemaDefinition extends SchemaDefinition>(\n definition: TSchemaDefinition,\n): TSchemaDefinition {\n return definition\n}\n\n/**\n * @public\n */\nexport type StyleDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition\n\n/**\n * @public\n */\nexport type ListDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition\n\n/**\n * @public\n */\nexport type DecoratorDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition\n\n/**\n * @public\n */\nexport type AnnotationDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition & {\n fields?: ReadonlyArray<FieldDefinition>\n}\n\n/**\n * @public\n */\nexport type BlockObjectDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition & {\n fields?: ReadonlyArray<FieldDefinition>\n}\n\n/**\n * @public\n */\nexport type InlineObjectDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition & {\n fields?: ReadonlyArray<FieldDefinition>\n}\n","import type {Schema} from './schema'\n\n/**\n * @public\n */\nexport interface TypedObject {\n [key: string]: unknown\n _type: string\n}\n\n/**\n * @public\n */\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n\n/**\n * @public\n */\nexport type PortableTextBlock = PortableTextTextBlock | PortableTextObject\n\n/**\n * @public\n */\nexport interface PortableTextTextBlock<\n TChild = PortableTextSpan | PortableTextObject,\n> {\n _type: string\n _key: string\n children: TChild[]\n markDefs?: PortableTextObject[]\n listItem?: string\n style?: string\n level?: number\n}\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: {schema: Schema},\n block: unknown,\n): block is PortableTextTextBlock {\n if (!isTypedObject(block)) {\n return false\n }\n\n if (block._type !== context.schema.block.name) {\n return false\n }\n\n if (!Array.isArray(block.children)) {\n return false\n }\n\n return true\n}\n\n/**\n * @public\n */\nexport interface PortableTextSpan {\n _key: string\n _type: 'span'\n text: string\n marks?: string[]\n}\n\n/**\n * @public\n */\nexport function isSpan(\n context: {schema: Schema},\n child: unknown,\n): child is PortableTextSpan {\n if (!isTypedObject(child)) {\n return false\n }\n\n if (child._type !== context.schema.span.name) {\n return false\n }\n\n if (typeof child.text !== 'string') {\n return false\n }\n\n return true\n}\n\n/**\n * @public\n */\nexport interface PortableTextObject {\n _type: string\n _key: string\n [other: string]: unknown\n}\n\n/**\n * @public\n */\nexport type PortableTextChild = PortableTextSpan | PortableTextObject\n\n/**\n * @public\n */\nexport interface PortableTextListBlock extends PortableTextTextBlock {\n listItem: string\n level: number\n}\n"],"names":[],"mappings":"AAMO,SAAS,cAAc,YAAsC;AAClE,QAAM,UAAU,WAAW,UAAU,CAAA,GAAI,IAAI,CAAC,WAAW;AAAA,IACvD,GAAG;AAAA,IACH,OAAO,MAAM;AAAA,EAAA,EACb,GAEI,cAAsC,CAAA;AAE5C,MAAI,WAAW,OAAO;AACpB,eAAW,SAAS,WAAW,MAAM,QAAQ;AAC3C,UACE,MAAM,SAAS,WACf,MAAM,SAAS,UACf,MAAM,SAAS,cACf,MAAM,SAAS,cACf,MAAM,SAAS,WACf,MAAM,SAAS,cACf,MAAM,SAAS,SACf;AACA,gBAAQ;AAAA,UACN,IAAI,MAAM,IAAI;AAAA,QAAA;AAEhB;AAAA,MACF;AAEA,kBAAY,KAAK,KAAK;AAAA,IACxB;AAGF,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM,WAAW,OAAO,QAAQ;AAAA,MAChC,GAAI,YAAY,SAAS,IAAI,EAAC,QAAQ,YAAA,IAAe,CAAA;AAAA,IAAC;AAAA,IAExD,MAAM;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,QAAS,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,QAAQ,IAEpD,SADA,CAAC,EAAC,OAAO,UAAU,MAAM,UAAU,OAAO,SAAA,GAAW,GAAG,MAAM;AAAA,IAElE,QAAQ,WAAW,SAAS,CAAA,GAAI,IAAI,CAAC,UAAU;AAAA,MAC7C,GAAG;AAAA,MACH,OAAO,KAAK;AAAA,IAAA,EACZ;AAAA,IACF,aAAa,WAAW,cAAc,CAAA,GAAI,IAAI,CAAC,eAAe;AAAA,MAC5D,GAAG;AAAA,MACH,OAAO,UAAU;AAAA,IAAA,EACjB;AAAA,IACF,cAAc,WAAW,eAAe,CAAA,GAAI,IAAI,CAAC,gBAAgB;AAAA,MAC/D,GAAG;AAAA,MACH,QAAQ,WAAW,UAAU,CAAA;AAAA,IAAC,EAC9B;AAAA,IACF,eAAe,WAAW,gBAAgB,CAAA,GAAI,IAAI,CAAC,iBAAiB;AAAA,MAClE,GAAG;AAAA,MACH,QAAQ,YAAY,UAAU,CAAA;AAAA,IAAC,EAC/B;AAAA,IACF,gBAAgB,WAAW,iBAAiB,CAAA,GAAI,IAAI,CAAC,kBAAkB;AAAA,MACrE,GAAG;AAAA,MACH,QAAQ,aAAa,UAAU,CAAA;AAAA,IAAC,EAChC;AAAA,EAAA;AAEN;AC1BO,SAAS,aACd,YACmB;AACnB,SAAO;AACT;AChCO,SAAS,cAAc,QAAwC;AACpE,SAAO,SAAS,MAAM,KAAK,OAAO,OAAO,SAAU;AACrD;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,UAAU,OAAO,SAAU,YAAY,OAAO,SAAU;AACnE;AAyBO,SAAS,YACd,SACA,OACgC;AAShC,SARI,EAAA,CAAC,cAAc,KAAK,KAIpB,MAAM,UAAU,QAAQ,OAAO,MAAM,QAIrC,CAAC,MAAM,QAAQ,MAAM,QAAQ;AAKnC;AAeO,SAAS,OACd,SACA,OAC2B;AAS3B,SARI,EAAA,CAAC,cAAc,KAAK,KAIpB,MAAM,UAAU,QAAQ,OAAO,KAAK,QAIpC,OAAO,MAAM,QAAS;AAK5B;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/compile-schema.ts","../src/get-sub-schema.ts","../src/define-schema.ts","../src/types.ts"],"sourcesContent":["import type {SchemaDefinition} from './define-schema'\nimport type {\n AnnotationSchemaType,\n BaseDefinition,\n BlockOfDefinition,\n DecoratorSchemaType,\n FieldDefinition,\n InlineObjectOfDefinition,\n InlineObjectSchemaType,\n ListSchemaType,\n OfDefinition,\n Schema,\n StyleSchemaType,\n} from './schema'\n\n/**\n * Resolved root schema fields used to fill in unspecified fields on nested\n * `BlockOfDefinition` entries. This is a view into the root schema captured\n * before the `of` tree is walked, so nested blocks inherit the final\n * post-compile values (e.g. `styles` with `normal` prepended).\n */\ntype BlockInheritance = {\n styles: ReadonlyArray<StyleSchemaType>\n decorators: ReadonlyArray<DecoratorSchemaType>\n annotations: ReadonlyArray<AnnotationSchemaType>\n lists: ReadonlyArray<ListSchemaType>\n inlineObjects: ReadonlyArray<InlineObjectSchemaType>\n}\n\nfunction isBlockOfMember(member: OfDefinition): member is BlockOfDefinition {\n return member.type === 'block'\n}\n\nfunction isInlineObjectOfMember(\n member: OfDefinition,\n): member is InlineObjectOfDefinition {\n return member.type === 'object'\n}\n\nfunction compileOfMember(\n member: OfDefinition,\n inheritance: BlockInheritance,\n): OfDefinition {\n if (isBlockOfMember(member)) {\n return compileBlockOfMember(member, inheritance)\n }\n if (isInlineObjectOfMember(member)) {\n return compileInlineObjectOfMember(member, inheritance)\n }\n // Reference: pass through unchanged. The resolver looks up by `type`.\n return member\n}\n\nfunction compileBlockOfMember(\n member: BlockOfDefinition,\n inheritance: BlockInheritance,\n): BlockOfDefinition {\n return {\n ...member,\n styles: member.styles\n ? member.styles.map((style) => ({...style, value: style.name}))\n : inheritance.styles,\n decorators: member.decorators\n ? member.decorators.map((decorator) => ({\n ...decorator,\n value: decorator.name,\n }))\n : inheritance.decorators,\n annotations: member.annotations\n ? member.annotations.map((annotation) => ({\n ...annotation,\n fields:\n annotation.fields?.map((field) =>\n compileField(field, inheritance),\n ) ?? [],\n }))\n : inheritance.annotations,\n lists: member.lists\n ? member.lists.map((list) => ({...list, value: list.name}))\n : inheritance.lists,\n inlineObjects: member.inlineObjects\n ? member.inlineObjects.map((inlineObject) => ({\n ...inlineObject,\n fields:\n inlineObject.fields?.map((field) =>\n compileField(field, inheritance),\n ) ?? [],\n }))\n : inheritance.inlineObjects,\n }\n}\n\nfunction compileInlineObjectOfMember(\n member: InlineObjectOfDefinition,\n inheritance: BlockInheritance,\n): InlineObjectOfDefinition {\n return {\n ...member,\n fields: member.fields.map((field) => compileField(field, inheritance)),\n }\n}\n\nfunction compileField(\n field: FieldDefinition,\n inheritance: BlockInheritance,\n): FieldDefinition {\n if (field.type === 'array' && field.of) {\n return {\n ...field,\n of: field.of.map((member) => compileOfMember(member, inheritance)),\n }\n }\n return field\n}\n\nfunction compileBaseDefinitionWithValue<T extends BaseDefinition>(\n definition: T,\n): T & {value: string} {\n return {...definition, value: definition.name}\n}\n\n/**\n * @public\n */\nexport function compileSchema(definition: SchemaDefinition): Schema {\n const userStyles = (definition.styles ?? []).map(\n compileBaseDefinitionWithValue,\n )\n const styles = !userStyles.some((style) => style.value === 'normal')\n ? [\n {value: 'normal', name: 'normal', title: 'Normal'} as StyleSchemaType,\n ...userStyles,\n ]\n : userStyles\n\n const lists = (definition.lists ?? []).map(compileBaseDefinitionWithValue)\n const decorators = (definition.decorators ?? []).map(\n compileBaseDefinitionWithValue,\n )\n\n // Annotations and inline objects may contain array fields whose `of`\n // includes `{type: 'block'}`. Those nested blocks must inherit from the\n // fully-resolved root. So we build `inheritance` first using the shallow\n // (not-yet-resolved) annotations/inlineObjects — nested blocks inherit from\n // the top-level schema, not from a sibling annotation's schema. Then we\n // resolve annotations, block objects, and inline objects using that view.\n const annotationsShallow = (definition.annotations ?? []).map(\n (annotation) => ({\n ...annotation,\n fields: (annotation.fields ?? []) as ReadonlyArray<FieldDefinition>,\n }),\n )\n const inlineObjectsShallow = (definition.inlineObjects ?? []).map(\n (inlineObject) => ({\n ...inlineObject,\n fields: (inlineObject.fields ?? []) as ReadonlyArray<FieldDefinition>,\n }),\n )\n\n const inheritance: BlockInheritance = {\n styles,\n decorators,\n annotations: annotationsShallow,\n lists,\n inlineObjects: inlineObjectsShallow,\n }\n\n const blockFields: Array<FieldDefinition> = []\n\n if (definition.block?.fields) {\n for (const field of definition.block.fields) {\n if (\n field.name === '_type' ||\n field.name === '_key' ||\n field.name === 'children' ||\n field.name === 'markDefs' ||\n field.name === 'style' ||\n field.name === 'listItem' ||\n field.name === 'level'\n ) {\n console.warn(\n `\"${field.name}\" is a reserved field name on Portable Text blocks`,\n )\n continue\n }\n\n blockFields.push(compileField(field, inheritance))\n }\n }\n\n return {\n block: {\n name: definition.block?.name ?? 'block',\n ...(blockFields.length > 0 ? {fields: blockFields} : {}),\n },\n span: {\n name: 'span',\n },\n styles,\n lists,\n decorators,\n annotations: (definition.annotations ?? []).map((annotation) => ({\n ...annotation,\n fields:\n annotation.fields?.map((field) => compileField(field, inheritance)) ??\n [],\n })),\n blockObjects: (definition.blockObjects ?? []).map((blockObject) => ({\n ...blockObject,\n fields:\n blockObject.fields?.map((field) => compileField(field, inheritance)) ??\n [],\n })),\n inlineObjects: (definition.inlineObjects ?? []).map((inlineObject) => ({\n ...inlineObject,\n fields:\n inlineObject.fields?.map((field) => compileField(field, inheritance)) ??\n [],\n })),\n }\n}\n","import type {\n AnnotationSchemaType,\n BaseDefinition,\n BlockObjectSchemaType,\n DecoratorSchemaType,\n InlineObjectSchemaType,\n ListSchemaType,\n OfDefinition,\n Schema,\n StyleSchemaType,\n} from './schema'\n\ntype ResolvedBlockOfDefinition = {\n type: 'block'\n name?: string\n styles?: ReadonlyArray<BaseDefinition>\n decorators?: ReadonlyArray<BaseDefinition>\n annotations?: ReadonlyArray<\n BaseDefinition & {fields?: ReadonlyArray<unknown>}\n >\n lists?: ReadonlyArray<BaseDefinition>\n inlineObjects?: ReadonlyArray<\n BaseDefinition & {fields?: ReadonlyArray<unknown>}\n >\n}\n\nfunction asNamedTypes<\n T extends StyleSchemaType | DecoratorSchemaType | ListSchemaType,\n>(resolved: ReadonlyArray<BaseDefinition> | undefined): Array<T> | undefined {\n if (!resolved) {\n return undefined\n }\n return resolved.map((entry) => ({...entry, value: entry.name}) as T)\n}\n\nfunction asFieldedTypes<\n T extends AnnotationSchemaType | InlineObjectSchemaType,\n>(\n resolved:\n | ReadonlyArray<BaseDefinition & {fields?: ReadonlyArray<unknown>}>\n | undefined,\n): Array<T> | undefined {\n if (!resolved) {\n return undefined\n }\n return resolved.map(\n (entry) => ({...entry, fields: entry.fields ?? []}) as unknown as T,\n )\n}\n\n/**\n * Derive the resolved sub-schema for a container field's `of` declaration.\n *\n * Containers declare which types are allowed inside them via the `of`\n * array on a child field. `getSubSchema(schema, of)` returns the resolved\n * `Schema` view that applies inside such a container, so operations and\n * validators that ask \"what's allowed at this position?\" can treat the\n * result like any other top-level `Schema`.\n *\n * The `{type: 'block'}` entry (if present) supplies the resolved\n * styles, decorators, annotations, lists, and inlineObjects. Non-block\n * `of` members become the schema's block objects. When there is no\n * `{type: 'block'}` entry the returned schema still carries the root\n * schema's `block` and `span` names but every validation list is\n * empty.\n *\n * @public\n */\nexport function getSubSchema(\n schema: Schema,\n of: ReadonlyArray<OfDefinition>,\n): Schema {\n const blockMember = of.find(\n (member): member is OfDefinition & ResolvedBlockOfDefinition =>\n member.type === 'block',\n )\n\n const blockObjects: ReadonlyArray<BlockObjectSchemaType> = of\n .filter(\n (member): member is OfDefinition & {type: string} =>\n member.type !== 'block',\n )\n .map((member) => {\n const objectMember = member as {\n type: string\n name?: string\n title?: string\n fields?: ReadonlyArray<unknown>\n }\n return {\n name: objectMember.name ?? objectMember.type,\n title: objectMember.title,\n fields: (objectMember.fields ?? []) as BlockObjectSchemaType['fields'],\n }\n })\n\n if (!blockMember) {\n return {\n block: {name: schema.block.name, fields: schema.block.fields},\n span: {name: schema.span.name},\n styles: [],\n decorators: [],\n annotations: [],\n lists: [],\n inlineObjects: [],\n blockObjects,\n }\n }\n\n return {\n block: {\n name: blockMember.name ?? schema.block.name,\n fields: schema.block.fields,\n },\n span: {name: schema.span.name},\n styles: asNamedTypes<StyleSchemaType>(blockMember.styles) ?? schema.styles,\n decorators:\n asNamedTypes<DecoratorSchemaType>(blockMember.decorators) ??\n schema.decorators,\n annotations:\n asFieldedTypes<AnnotationSchemaType>(blockMember.annotations) ??\n schema.annotations,\n lists: asNamedTypes<ListSchemaType>(blockMember.lists) ?? schema.lists,\n inlineObjects:\n asFieldedTypes<InlineObjectSchemaType>(blockMember.inlineObjects) ??\n schema.inlineObjects,\n blockObjects,\n }\n}\n","import type {BaseDefinition, FieldDefinition} from './schema'\n\n/**\n * @public\n */\nexport type SchemaDefinition = {\n block?: {\n name?: string\n fields?: ReadonlyArray<FieldDefinition>\n }\n styles?: ReadonlyArray<StyleDefinition>\n lists?: ReadonlyArray<ListDefinition>\n decorators?: ReadonlyArray<DecoratorDefinition>\n annotations?: ReadonlyArray<AnnotationDefinition>\n blockObjects?: ReadonlyArray<BlockObjectDefinition>\n inlineObjects?: ReadonlyArray<InlineObjectDefinition>\n}\n\n/**\n * @public\n * A helper wrapper that adds editor support, such as autocomplete and type checking, for a schema definition.\n * @example\n * ```ts\n * import { defineSchema } from '@portabletext/editor'\n *\n * const schemaDefinition = defineSchema({\n * decorators: [{name: 'strong'}, {name: 'em'}, {name: 'underline'}],\n * annotations: [{name: 'link'}],\n * styles: [\n * {name: 'normal'},\n * {name: 'h1'},\n * {name: 'h2'},\n * {name: 'h3'},\n * {name: 'blockquote'},\n * ],\n * lists: [],\n * inlineObjects: [],\n * blockObjects: [],\n * }\n * ```\n */\nexport function defineSchema<const TSchemaDefinition extends SchemaDefinition>(\n definition: TSchemaDefinition,\n): TSchemaDefinition {\n return definition\n}\n\n/**\n * @public\n */\nexport type StyleDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition\n\n/**\n * @public\n */\nexport type ListDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition\n\n/**\n * @public\n */\nexport type DecoratorDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition\n\n/**\n * @public\n */\nexport type AnnotationDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition & {\n fields?: ReadonlyArray<FieldDefinition>\n}\n\n/**\n * @public\n */\nexport type BlockObjectDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition & {\n fields?: ReadonlyArray<FieldDefinition>\n}\n\n/**\n * @public\n */\nexport type InlineObjectDefinition<\n TBaseDefinition extends BaseDefinition = BaseDefinition,\n> = TBaseDefinition & {\n fields?: ReadonlyArray<FieldDefinition>\n}\n","import type {Schema} from './schema'\n\n/**\n * @public\n */\nexport interface TypedObject {\n [key: string]: unknown\n _type: string\n}\n\n/**\n * @public\n */\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n\n/**\n * @public\n */\nexport type PortableTextBlock = PortableTextTextBlock | PortableTextObject\n\n/**\n * @public\n */\nexport interface PortableTextTextBlock<\n TChild = PortableTextSpan | PortableTextObject,\n> {\n _type: string\n _key: string\n children: TChild[]\n markDefs?: PortableTextObject[]\n listItem?: string\n style?: string\n level?: number\n}\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: {schema: Schema},\n block: unknown,\n): block is PortableTextTextBlock {\n if (!isTypedObject(block)) {\n return false\n }\n\n if (block._type !== context.schema.block.name) {\n return false\n }\n\n if (!Array.isArray(block.children)) {\n return false\n }\n\n return true\n}\n\n/**\n * @public\n */\nexport interface PortableTextSpan {\n _key: string\n _type: 'span'\n text: string\n marks?: string[]\n}\n\n/**\n * @public\n */\nexport function isSpan(\n context: {schema: Schema},\n child: unknown,\n): child is PortableTextSpan {\n if (!isTypedObject(child)) {\n return false\n }\n\n if (child._type !== context.schema.span.name) {\n return false\n }\n\n if (typeof child.text !== 'string') {\n return false\n }\n\n return true\n}\n\n/**\n * @public\n */\nexport interface PortableTextObject {\n _type: string\n _key: string\n [other: string]: unknown\n}\n\n/**\n * @public\n */\nexport type PortableTextChild = PortableTextSpan | PortableTextObject\n\n/**\n * @public\n */\nexport interface PortableTextListBlock extends PortableTextTextBlock {\n listItem: string\n level: number\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portabletext/schema",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Portable Text Schema",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"portabletext",
|
|
@@ -20,10 +20,7 @@
|
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"type": "module",
|
|
22
22
|
"exports": {
|
|
23
|
-
".":
|
|
24
|
-
"source": "./src/index.ts",
|
|
25
|
-
"default": "./dist/index.js"
|
|
26
|
-
},
|
|
23
|
+
".": "./dist/index.js",
|
|
27
24
|
"./package.json": "./package.json"
|
|
28
25
|
},
|
|
29
26
|
"main": "./dist/index.js",
|
|
@@ -32,10 +29,10 @@
|
|
|
32
29
|
"dist"
|
|
33
30
|
],
|
|
34
31
|
"devDependencies": {
|
|
35
|
-
"@sanity/pkg-utils": "^10.1
|
|
36
|
-
"@sanity/tsconfig": "^2.
|
|
32
|
+
"@sanity/pkg-utils": "^10.2.1",
|
|
33
|
+
"@sanity/tsconfig": "^2.1.0",
|
|
37
34
|
"typescript": "5.9.3",
|
|
38
|
-
"vitest": "^4.
|
|
35
|
+
"vitest": "^4.1.4"
|
|
39
36
|
},
|
|
40
37
|
"engines": {
|
|
41
38
|
"node": ">=20.19 <22 || >=22.12"
|