@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2016 - 2025 Sanity.io
3
+ Copyright (c) 2016 - 2026 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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 FieldDefinition = BaseDefinition & {
71
- type: 'string' | 'number' | 'boolean' | 'array' | 'object';
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
@@ -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":"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"}
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 styles = (definition.styles ?? []).map((style) => ({
3
- ...style,
4
- value: style.name
5
- })), blockFields = [];
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: styles.some((style) => style.value === "normal") ? styles : [{ value: "normal", name: "normal", title: "Normal" }, ...styles],
25
- lists: (definition.lists ?? []).map((list) => ({
26
- ...list,
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.1.0",
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.2",
36
- "@sanity/tsconfig": "^2.0.0",
32
+ "@sanity/pkg-utils": "^10.2.1",
33
+ "@sanity/tsconfig": "^2.1.0",
37
34
  "typescript": "5.9.3",
38
- "vitest": "^4.0.14"
35
+ "vitest": "^4.1.4"
39
36
  },
40
37
  "engines": {
41
38
  "node": ">=20.19 <22 || >=22.12"