@storyblok/schema 0.1.0-alpha.1 → 0.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/field-plugins/index.cjs +4 -0
  2. package/dist/field-plugins/index.d.cts +2 -0
  3. package/dist/field-plugins/index.d.mts +2 -0
  4. package/dist/field-plugins/index.mjs +3 -0
  5. package/dist/field-plugins/storyblok-color-field.cjs +32 -0
  6. package/dist/field-plugins/storyblok-color-field.cjs.map +1 -0
  7. package/dist/field-plugins/storyblok-color-field.d.cts +16 -0
  8. package/dist/field-plugins/storyblok-color-field.d.mts +16 -0
  9. package/dist/field-plugins/storyblok-color-field.mjs +32 -0
  10. package/dist/field-plugins/storyblok-color-field.mjs.map +1 -0
  11. package/dist/generated/overlay/zod.gen.cjs +0 -2
  12. package/dist/generated/overlay/zod.gen.cjs.map +1 -1
  13. package/dist/generated/overlay/zod.gen.mjs +228 -229
  14. package/dist/generated/overlay/zod.gen.mjs.map +1 -1
  15. package/dist/generated/types/block.d.cts +6 -0
  16. package/dist/generated/types/block.d.mts +6 -0
  17. package/dist/generated/types/field.d.cts +53 -18
  18. package/dist/generated/types/field.d.mts +53 -18
  19. package/dist/generated/types/mapi-story.d.cts +4 -4
  20. package/dist/generated/types/mapi-story.d.mts +4 -4
  21. package/dist/generated/types/story.d.cts +3 -3
  22. package/dist/generated/types/story.d.mts +3 -3
  23. package/dist/helpers/define-block.cjs +6 -1
  24. package/dist/helpers/define-block.cjs.map +1 -1
  25. package/dist/helpers/define-block.d.cts +14 -4
  26. package/dist/helpers/define-block.d.mts +14 -4
  27. package/dist/helpers/define-block.mjs +6 -1
  28. package/dist/helpers/define-block.mjs.map +1 -1
  29. package/dist/helpers/define-field-plugin.cjs +21 -0
  30. package/dist/helpers/define-field-plugin.cjs.map +1 -0
  31. package/dist/helpers/define-field-plugin.d.cts +33 -0
  32. package/dist/helpers/define-field-plugin.d.mts +33 -0
  33. package/dist/helpers/define-field-plugin.mjs +20 -0
  34. package/dist/helpers/define-field-plugin.mjs.map +1 -0
  35. package/dist/helpers/define-field.cjs +8 -1
  36. package/dist/helpers/define-field.cjs.map +1 -1
  37. package/dist/helpers/define-field.d.cts +12 -3
  38. package/dist/helpers/define-field.d.mts +12 -3
  39. package/dist/helpers/define-field.mjs +8 -1
  40. package/dist/helpers/define-field.mjs.map +1 -1
  41. package/dist/helpers/define-folder.cjs +19 -0
  42. package/dist/helpers/define-folder.cjs.map +1 -0
  43. package/dist/helpers/define-folder.d.cts +39 -0
  44. package/dist/helpers/define-folder.d.mts +39 -0
  45. package/dist/helpers/define-folder.mjs +18 -0
  46. package/dist/helpers/define-folder.mjs.map +1 -0
  47. package/dist/helpers/define-schema.cjs +23 -0
  48. package/dist/helpers/define-schema.cjs.map +1 -0
  49. package/dist/helpers/define-schema.d.cts +31 -0
  50. package/dist/helpers/define-schema.d.mts +31 -0
  51. package/dist/helpers/define-schema.mjs +22 -0
  52. package/dist/helpers/define-schema.mjs.map +1 -0
  53. package/dist/helpers/schema-type.d.cts +16 -8
  54. package/dist/helpers/schema-type.d.mts +16 -8
  55. package/dist/index.cjs +6 -0
  56. package/dist/index.d.cts +4 -1
  57. package/dist/index.d.mts +4 -1
  58. package/dist/index.mjs +4 -1
  59. package/dist/utils/slugify-folder-path.cjs +21 -0
  60. package/dist/utils/slugify-folder-path.cjs.map +1 -0
  61. package/dist/utils/slugify-folder-path.mjs +20 -0
  62. package/dist/utils/slugify-folder-path.mjs.map +1 -0
  63. package/dist/validators/internal-schemas.mjs +1 -1
  64. package/dist/validators/shapes.cjs.map +1 -1
  65. package/dist/validators/shapes.d.cts +16 -3
  66. package/dist/validators/shapes.d.mts +16 -3
  67. package/dist/validators/shapes.mjs.map +1 -1
  68. package/dist/validators/validate-schema.cjs +21 -1
  69. package/dist/validators/validate-schema.cjs.map +1 -1
  70. package/dist/validators/validate-schema.d.cts +2 -1
  71. package/dist/validators/validate-schema.d.mts +2 -1
  72. package/dist/validators/validate-schema.mjs +21 -1
  73. package/dist/validators/validate-schema.mjs.map +1 -1
  74. package/dist/validators/validate-story.cjs +96 -32
  75. package/dist/validators/validate-story.cjs.map +1 -1
  76. package/dist/validators/validate-story.mjs +96 -33
  77. package/dist/validators/validate-story.mjs.map +1 -1
  78. package/package.json +13 -2
@@ -1 +1 @@
1
- {"version":3,"file":"zod.gen.mjs","names":[],"sources":["../../../src/generated/overlay/zod.gen.ts"],"sourcesContent":["// Generated by @storyblok/openapi-codegen. Do not edit by hand.\n// Internal Zod v4 schemas — imported only by runtime validators, never by public types.\n\n// This file is auto-generated by @hey-api/openapi-ts\n\nimport * as z from 'zod';\n\n/**\n * Universal identity and display properties shared by every field type\n */\nexport const zBaseFieldRoot = z.object({\n type: z.optional(z.string()),\n id: z.optional(z.string()),\n display_name: z.optional(z.string()),\n description: z.optional(z.string()),\n tooltip: z.optional(z.boolean()),\n pos: z.optional(z.int()),\n conditional_settings: z.optional(z.array(z.record(z.string(), z.unknown())))\n});\n\nexport const zSectionFieldRoot = zBaseFieldRoot.and(z.object({\n type: z.enum(['section']),\n keys: z.optional(z.array(z.string())),\n fieldset: z.optional(z.object({\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n collapsible: z.optional(z.boolean()),\n collapsed: z.optional(z.boolean())\n }))\n}));\n\nexport const zTabFieldRoot = zBaseFieldRoot.and(z.object({\n type: z.enum(['tab']),\n keys: z.optional(z.array(z.string()))\n}));\n\n/**\n * Properties shared by content-bearing fields (i.e. fields that hold a value).\n * Layout-only field types like `section` and `tab` do not include these.\n *\n */\nexport const zValueFieldRoot = z.object({\n required: z.optional(z.boolean()),\n regex: z.optional(z.string()),\n default_value: z.optional(z.string()),\n translatable: z.optional(z.boolean()),\n no_translate: z.optional(z.boolean()),\n exclude_from_ai_translation: z.optional(z.boolean()),\n exclude_from_merge: z.optional(z.boolean()),\n exclude_from_overwrite: z.optional(z.boolean()),\n force_merge: z.optional(z.boolean())\n});\n\nexport const zAssetFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['asset']),\n filetypes: z.optional(z.array(z.string())),\n asset_folder_id: z.optional(z.int()),\n allow_external_url: z.optional(z.boolean()),\n height: z.optional(z.int()),\n width: z.optional(z.int()),\n restrict_assets: z.optional(z.boolean()),\n asset_whitelist: z.optional(z.array(z.string()))\n}));\n\nexport const zBloksFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['bloks']),\n restrict_type: z.optional(z.string()),\n restrict_components: z.optional(z.boolean()),\n component_whitelist: z.optional(z.array(z.string())),\n component_denylist: z.optional(z.array(z.string())),\n component_tag_whitelist: z.optional(z.array(z.int())),\n component_tag_denylist: z.optional(z.array(z.int())),\n component_group_whitelist: z.optional(z.array(z.string())),\n component_group_denylist: z.optional(z.array(z.string())),\n minimum: z.optional(z.int()),\n maximum: z.optional(z.int()),\n maximum_entries: z.optional(z.int()),\n minimum_entries: z.optional(z.int())\n}));\n\nexport const zBooleanFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['boolean']),\n inline_label: z.optional(z.boolean())\n}));\n\nexport const zCustomFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['custom']),\n field_type: z.optional(z.string()),\n options: z.optional(z.array(z.object({\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n required_fields: z.optional(z.string()),\n source: z.optional(z.enum(['self', 'internal'])),\n datasource_slug: z.optional(z.string()),\n external_datasource: z.optional(z.string())\n}));\n\nexport const zDatetimeFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['datetime']),\n disable_time: z.optional(z.boolean())\n}));\n\nexport const zMarkdownFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['markdown']),\n rich_markdown: z.optional(z.boolean()),\n rtl: z.optional(z.boolean()),\n customize_toolbar: z.optional(z.boolean()),\n toolbar: z.optional(z.array(z.enum([\n 'bold',\n 'italic',\n 'inlinecode',\n 'code',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'list',\n 'olist',\n 'quote',\n 'hrule',\n 'link',\n 'image',\n 'paragraph',\n 'help',\n 'toggle-richtext',\n 'auto',\n 'ltr',\n 'rtl'\n ]))),\n allow_multiline: z.optional(z.boolean()),\n max_length: z.optional(z.int())\n}));\n\nexport const zMultiassetFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['multiasset']),\n filetypes: z.optional(z.array(z.string())),\n asset_folder_id: z.optional(z.int()),\n allow_external_url: z.optional(z.boolean()),\n height: z.optional(z.int()),\n width: z.optional(z.int()),\n restrict_assets: z.optional(z.boolean()),\n asset_whitelist: z.optional(z.array(z.string())),\n maximum_entries: z.optional(z.int()),\n minimum_entries: z.optional(z.int())\n}));\n\nexport const zMultilinkFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['multilink']),\n restrict_content_types: z.optional(z.boolean()),\n component_whitelist: z.optional(z.array(z.string())),\n allow_target_blank: z.optional(z.boolean()),\n allow_custom_attributes: z.optional(z.boolean()),\n force_link_scope: z.optional(z.boolean()),\n link_scope: z.optional(z.string()),\n show_anchor: z.optional(z.boolean()),\n email_link_type: z.optional(z.boolean()),\n asset_link_type: z.optional(z.boolean())\n}));\n\nexport const zNumberFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['number']),\n min_value: z.optional(z.number()),\n max_value: z.optional(z.number()),\n decimals: z.optional(z.int()),\n steps: z.optional(z.number())\n}));\n\nexport const zOptionFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['option']),\n options: z.optional(z.array(z.object({\n _uid: z.optional(z.string()),\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n source: z.optional(z.string()),\n datasource_slug: z.optional(z.string()),\n external_datasource: z.optional(z.string()),\n folder_slug: z.optional(z.string()),\n filter_content_type: z.optional(z.array(z.string())),\n exclude_empty_option: z.optional(z.boolean()),\n include_empty_option: z.optional(z.boolean()),\n use_uuid: z.optional(z.boolean()),\n entry_appearance: z.optional(z.string()),\n allow_advanced_search: z.optional(z.boolean()),\n max_options: z.optional(z.string()),\n min_options: z.optional(z.string()),\n multiple: z.optional(z.boolean())\n}));\n\nexport const zOptionsFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['options']),\n options: z.optional(z.array(z.object({\n _uid: z.optional(z.string()),\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n source: z.optional(z.string()),\n datasource_slug: z.optional(z.string()),\n external_datasource: z.optional(z.string()),\n folder_slug: z.optional(z.string()),\n filter_content_type: z.optional(z.array(z.string())),\n use_uuid: z.optional(z.boolean()),\n is_reference_type: z.optional(z.boolean()),\n entry_appearance: z.optional(z.string()),\n allow_advanced_search: z.optional(z.boolean()),\n max_options: z.optional(z.string()),\n min_options: z.optional(z.string()),\n multiple: z.optional(z.boolean())\n}));\n\nexport const zRichtextFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['richtext']),\n customize_toolbar: z.optional(z.boolean()),\n toolbar: z.optional(z.array(z.enum([\n 'ai-complete',\n 'ai-shorten',\n 'ai-extend',\n 'ai-rephrase',\n 'ai-summarize',\n 'ai-simplify',\n 'ai-tone',\n 'ai-emoji',\n 'ai-translate',\n 'ai-tldr',\n 'ai-spelling',\n 'blok',\n 'ltr',\n 'rtl',\n 'export',\n 'import',\n 'bold',\n 'list',\n 'inlinecode',\n 'code',\n 'color',\n 'copy',\n 'cut',\n 'emoji',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'highlight',\n 'unset',\n 'hrule',\n 'image',\n 'italic',\n 'link',\n 'anchor',\n 'olist',\n 'paragraph',\n 'paste-action',\n 'paste',\n 'quote',\n 'redo',\n 'strike',\n 'subscript',\n 'superscript',\n 'underline',\n 'undo',\n 'align-left',\n 'align-center',\n 'align-right',\n 'align-justify'\n ]))),\n style_options: z.optional(z.array(z.object({\n _uid: z.optional(z.string()),\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n restrict_type: z.optional(z.string()),\n restrict_components: z.optional(z.boolean()),\n component_whitelist: z.optional(z.array(z.string())),\n component_denylist: z.optional(z.array(z.string())),\n component_tag_whitelist: z.optional(z.array(z.int())),\n component_tag_denylist: z.optional(z.array(z.int())),\n component_group_whitelist: z.optional(z.array(z.string())),\n component_group_denylist: z.optional(z.array(z.string())),\n allow_target_blank: z.optional(z.boolean()),\n allow_custom_attributes: z.optional(z.boolean())\n}));\n\nexport const zTableFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['table'])\n}));\n\nexport const zTextFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['text']),\n max_length: z.optional(z.int()),\n maxlength: z.optional(z.int()),\n minlength: z.optional(z.int()),\n size: z.optional(z.string()),\n rtl: z.optional(z.boolean())\n}));\n\nexport const zTextareaFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['textarea']),\n max_length: z.optional(z.int()),\n maxlength: z.optional(z.int()),\n minlength: z.optional(z.int()),\n size: z.optional(z.string()),\n rtl: z.optional(z.boolean()),\n rich_text: z.optional(z.boolean()),\n markdown: z.optional(z.boolean())\n}));\n\n/**\n * A component schema field. Discriminated by the literal `type` enum on each variant.\n */\nexport const zComponentSchemaField = z.union([\n zTextFieldRoot,\n zTextareaFieldRoot,\n zRichtextFieldRoot,\n zMarkdownFieldRoot,\n zNumberFieldRoot,\n zDatetimeFieldRoot,\n zBooleanFieldRoot,\n zOptionFieldRoot,\n zOptionsFieldRoot,\n zAssetFieldRoot,\n zMultiassetFieldRoot,\n zMultilinkFieldRoot,\n zBloksFieldRoot,\n zTableFieldRoot,\n zSectionFieldRoot,\n zTabFieldRoot,\n zCustomFieldRoot\n]);\n\n/**\n * Asset field type - single asset (image, video, audio, or document)\n */\nexport const zAssetFieldValueRoot = z.object({\n fieldtype: z.enum(['asset']),\n id: z.union([\n z.int(),\n z.null()\n ]),\n alt: z.union([\n z.string(),\n z.null()\n ]),\n name: z.optional(z.string()),\n focus: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n title: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n source: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n filename: z.string(),\n copyright: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n meta_data: z.optional(z.record(z.string(), z.unknown())),\n is_external_url: z.optional(z.boolean())\n});\n\nexport const zAssetFieldValue = zAssetFieldValueRoot;\n\n/**\n * Multilink field type - link to internal stories, external URLs, emails, etc.\n */\nexport const zMultilinkFieldValueRoot = z.object({\n fieldtype: z.enum(['multilink']),\n id: z.string(),\n url: z.string(),\n linktype: z.enum([\n 'story',\n 'url',\n 'email',\n 'asset'\n ]),\n cached_url: z.string(),\n anchor: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n target: z.optional(z.union([\n z.literal('_self'),\n z.literal('_blank'),\n z.null()\n ]))\n});\n\nexport const zMultilinkFieldValue = zMultilinkFieldValueRoot;\n\n/**\n * Plugin/Custom field type - field plugin with custom structure\n */\nexport const zPluginFieldValueRoot = z.object({\n plugin: z.string(),\n _uid: z.optional(z.uuid())\n});\n\nexport const zPluginFieldValue = zPluginFieldValueRoot;\n\n/**\n * Richtext field type - structured rich text document (ProseMirror format)\n */\nexport const zRichtextFieldValueRoot = z.object({\n type: z.enum(['doc']),\n content: z.optional(z.array(z.record(z.string(), z.unknown())))\n});\n\nexport const zRichtextFieldValue = zRichtextFieldValueRoot;\n\n/**\n * Table field type - structured table data\n */\nexport const zTableFieldValueRoot = z.object({\n thead: z.array(z.object({\n _uid: z.string(),\n component: z.enum(['_table_head']),\n value: z.optional(z.string())\n })),\n tbody: z.array(z.object({\n _uid: z.string(),\n component: z.enum(['_table_row']),\n body: z.optional(z.array(z.object({\n _uid: z.string(),\n component: z.enum(['_table_col']),\n value: z.optional(z.string())\n })))\n }))\n});\n\nexport const zTableFieldValue = zTableFieldValueRoot;\n\n/**\n * Content object for creating or updating a component instance. Contains a component technical name and dynamic fields whose values depend on the component's schema field types. The _uid is optional — Storyblok will auto-generate one if not provided.\n */\nexport const zBlockContentInputRoot = z.object({\n _uid: z.optional(z.string()),\n component: z.string(),\n _editable: z.optional(z.string())\n});\n\nexport const zBlockContentInput = zBlockContentInputRoot;\n\n/**\n * Content object representing a component instance. Contains a _uid, a component technical name, and dynamic fields whose values depend on the component's schema field types (text, textarea, richtext, markdown, number, datetime, boolean, option, options, asset, multiasset, multilink, bloks, table, section, custom/plugin).\n */\nexport const zBlockContentRoot = z.object({\n _uid: z.string(),\n component: z.string(),\n _editable: z.optional(z.string())\n});\n\nexport const zBlockContent = zBlockContentRoot;\n"],"mappings":"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"}
1
+ {"version":3,"file":"zod.gen.mjs","names":["z"],"sources":["../../../src/generated/overlay/zod.gen.ts"],"sourcesContent":["// Generated by @storyblok/openapi-codegen. Do not edit by hand.\n// Internal Zod v4 schemas — imported only by runtime validators, never by public types.\n\n// This file is auto-generated by @hey-api/openapi-ts\n\nimport * as z from 'zod';\n\n/**\n * Universal identity and display properties shared by every field type\n */\nexport const zBaseFieldRoot = z.object({\n type: z.optional(z.string()),\n id: z.optional(z.string()),\n display_name: z.optional(z.string()),\n description: z.optional(z.string()),\n tooltip: z.optional(z.boolean()),\n pos: z.optional(z.int()),\n conditional_settings: z.optional(z.array(z.record(z.string(), z.unknown())))\n});\n\nexport const zSectionFieldRoot = zBaseFieldRoot.and(z.object({\n type: z.enum(['section']),\n keys: z.optional(z.array(z.string())),\n fieldset: z.optional(z.object({\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n collapsible: z.optional(z.boolean()),\n collapsed: z.optional(z.boolean())\n }))\n}));\n\nexport const zTabFieldRoot = zBaseFieldRoot.and(z.object({\n type: z.enum(['tab']),\n keys: z.optional(z.array(z.string()))\n}));\n\n/**\n * Properties shared by content-bearing fields (i.e. fields that hold a value).\n * Layout-only field types like `section` and `tab` do not include these.\n *\n */\nexport const zValueFieldRoot = z.object({\n required: z.optional(z.boolean()),\n regex: z.optional(z.string()),\n default_value: z.optional(z.string()),\n translatable: z.optional(z.boolean()),\n no_translate: z.optional(z.boolean()),\n exclude_from_ai_translation: z.optional(z.boolean()),\n exclude_from_merge: z.optional(z.boolean()),\n exclude_from_overwrite: z.optional(z.boolean()),\n force_merge: z.optional(z.boolean())\n});\n\nexport const zAssetFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['asset']),\n filetypes: z.optional(z.array(z.string())),\n asset_folder_id: z.optional(z.int()),\n allow_external_url: z.optional(z.boolean()),\n height: z.optional(z.int()),\n width: z.optional(z.int()),\n restrict_assets: z.optional(z.boolean()),\n asset_whitelist: z.optional(z.array(z.string()))\n}));\n\nexport const zBloksFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['bloks']),\n restrict_type: z.optional(z.string()),\n restrict_components: z.optional(z.boolean()),\n component_whitelist: z.optional(z.array(z.string())),\n component_denylist: z.optional(z.array(z.string())),\n component_tag_whitelist: z.optional(z.array(z.int())),\n component_tag_denylist: z.optional(z.array(z.int())),\n component_group_whitelist: z.optional(z.array(z.string())),\n component_group_denylist: z.optional(z.array(z.string())),\n minimum: z.optional(z.int()),\n maximum: z.optional(z.int()),\n maximum_entries: z.optional(z.int()),\n minimum_entries: z.optional(z.int())\n}));\n\nexport const zBooleanFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['boolean']),\n inline_label: z.optional(z.boolean())\n}));\n\nexport const zCustomFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['custom']),\n field_type: z.optional(z.string()),\n options: z.optional(z.array(z.object({\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n required_fields: z.optional(z.string()),\n source: z.optional(z.enum(['self', 'internal'])),\n datasource_slug: z.optional(z.string()),\n external_datasource: z.optional(z.string())\n}));\n\nexport const zDatetimeFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['datetime']),\n disable_time: z.optional(z.boolean())\n}));\n\nexport const zMarkdownFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['markdown']),\n rich_markdown: z.optional(z.boolean()),\n rtl: z.optional(z.boolean()),\n customize_toolbar: z.optional(z.boolean()),\n toolbar: z.optional(z.array(z.enum([\n 'bold',\n 'italic',\n 'inlinecode',\n 'code',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'list',\n 'olist',\n 'quote',\n 'hrule',\n 'link',\n 'image',\n 'paragraph',\n 'help',\n 'toggle-richtext',\n 'auto',\n 'ltr',\n 'rtl'\n ]))),\n allow_multiline: z.optional(z.boolean()),\n max_length: z.optional(z.int())\n}));\n\nexport const zMultiassetFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['multiasset']),\n filetypes: z.optional(z.array(z.string())),\n asset_folder_id: z.optional(z.int()),\n allow_external_url: z.optional(z.boolean()),\n height: z.optional(z.int()),\n width: z.optional(z.int()),\n restrict_assets: z.optional(z.boolean()),\n asset_whitelist: z.optional(z.array(z.string())),\n maximum_entries: z.optional(z.int()),\n minimum_entries: z.optional(z.int())\n}));\n\nexport const zMultilinkFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['multilink']),\n restrict_content_types: z.optional(z.boolean()),\n component_whitelist: z.optional(z.array(z.string())),\n allow_target_blank: z.optional(z.boolean()),\n allow_custom_attributes: z.optional(z.boolean()),\n force_link_scope: z.optional(z.boolean()),\n link_scope: z.optional(z.string()),\n show_anchor: z.optional(z.boolean()),\n email_link_type: z.optional(z.boolean()),\n asset_link_type: z.optional(z.boolean())\n}));\n\nexport const zNumberFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['number']),\n min_value: z.optional(z.number()),\n max_value: z.optional(z.number()),\n decimals: z.optional(z.int()),\n steps: z.optional(z.number())\n}));\n\nexport const zOptionFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['option']),\n options: z.optional(z.array(z.object({\n _uid: z.optional(z.string()),\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n source: z.optional(z.string()),\n datasource_slug: z.optional(z.string()),\n external_datasource: z.optional(z.string()),\n folder_slug: z.optional(z.string()),\n filter_content_type: z.optional(z.array(z.string())),\n exclude_empty_option: z.optional(z.boolean()),\n include_empty_option: z.optional(z.boolean()),\n use_uuid: z.optional(z.boolean()),\n entry_appearance: z.optional(z.string()),\n allow_advanced_search: z.optional(z.boolean()),\n max_options: z.optional(z.string()),\n min_options: z.optional(z.string()),\n multiple: z.optional(z.boolean())\n}));\n\nexport const zOptionsFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['options']),\n options: z.optional(z.array(z.object({\n _uid: z.optional(z.string()),\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n source: z.optional(z.string()),\n datasource_slug: z.optional(z.string()),\n external_datasource: z.optional(z.string()),\n folder_slug: z.optional(z.string()),\n filter_content_type: z.optional(z.array(z.string())),\n use_uuid: z.optional(z.boolean()),\n is_reference_type: z.optional(z.boolean()),\n entry_appearance: z.optional(z.string()),\n allow_advanced_search: z.optional(z.boolean()),\n max_options: z.optional(z.string()),\n min_options: z.optional(z.string()),\n multiple: z.optional(z.boolean())\n}));\n\nexport const zRichtextFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['richtext']),\n customize_toolbar: z.optional(z.boolean()),\n toolbar: z.optional(z.array(z.enum([\n 'ai-complete',\n 'ai-shorten',\n 'ai-extend',\n 'ai-rephrase',\n 'ai-summarize',\n 'ai-simplify',\n 'ai-tone',\n 'ai-emoji',\n 'ai-translate',\n 'ai-tldr',\n 'ai-spelling',\n 'blok',\n 'ltr',\n 'rtl',\n 'export',\n 'import',\n 'bold',\n 'list',\n 'inlinecode',\n 'code',\n 'color',\n 'copy',\n 'cut',\n 'emoji',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'highlight',\n 'unset',\n 'hrule',\n 'image',\n 'italic',\n 'link',\n 'anchor',\n 'olist',\n 'paragraph',\n 'paste-action',\n 'paste',\n 'quote',\n 'redo',\n 'strike',\n 'subscript',\n 'superscript',\n 'underline',\n 'undo',\n 'align-left',\n 'align-center',\n 'align-right',\n 'align-justify'\n ]))),\n style_options: z.optional(z.array(z.object({\n _uid: z.optional(z.string()),\n name: z.optional(z.string()),\n value: z.optional(z.string())\n }))),\n restrict_type: z.optional(z.string()),\n restrict_components: z.optional(z.boolean()),\n component_whitelist: z.optional(z.array(z.string())),\n component_denylist: z.optional(z.array(z.string())),\n component_tag_whitelist: z.optional(z.array(z.int())),\n component_tag_denylist: z.optional(z.array(z.int())),\n component_group_whitelist: z.optional(z.array(z.string())),\n component_group_denylist: z.optional(z.array(z.string())),\n allow_target_blank: z.optional(z.boolean()),\n allow_custom_attributes: z.optional(z.boolean())\n}));\n\nexport const zTableFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['table'])\n}));\n\nexport const zTextFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['text']),\n max_length: z.optional(z.int()),\n maxlength: z.optional(z.int()),\n minlength: z.optional(z.int()),\n size: z.optional(z.string()),\n rtl: z.optional(z.boolean())\n}));\n\nexport const zTextareaFieldRoot = zBaseFieldRoot.and(zValueFieldRoot).and(z.object({\n type: z.enum(['textarea']),\n max_length: z.optional(z.int()),\n maxlength: z.optional(z.int()),\n minlength: z.optional(z.int()),\n size: z.optional(z.string()),\n rtl: z.optional(z.boolean()),\n rich_text: z.optional(z.boolean()),\n markdown: z.optional(z.boolean())\n}));\n\n/**\n * A component schema field. Discriminated by the literal `type` enum on each variant.\n */\nexport const zComponentSchemaField = z.union([\n zTextFieldRoot,\n zTextareaFieldRoot,\n zRichtextFieldRoot,\n zMarkdownFieldRoot,\n zNumberFieldRoot,\n zDatetimeFieldRoot,\n zBooleanFieldRoot,\n zOptionFieldRoot,\n zOptionsFieldRoot,\n zAssetFieldRoot,\n zMultiassetFieldRoot,\n zMultilinkFieldRoot,\n zBloksFieldRoot,\n zTableFieldRoot,\n zSectionFieldRoot,\n zTabFieldRoot,\n zCustomFieldRoot\n]);\n\n/**\n * Asset field type - single asset (image, video, audio, or document)\n */\nexport const zAssetFieldValueRoot = z.object({\n fieldtype: z.enum(['asset']),\n id: z.union([\n z.int(),\n z.null()\n ]),\n alt: z.union([\n z.string(),\n z.null()\n ]),\n name: z.optional(z.string()),\n focus: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n title: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n source: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n filename: z.string(),\n copyright: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n meta_data: z.optional(z.record(z.string(), z.unknown())),\n is_external_url: z.optional(z.boolean())\n});\n\nexport const zAssetFieldValue = zAssetFieldValueRoot;\n\n/**\n * Multilink field type - link to internal stories, external URLs, emails, etc.\n */\nexport const zMultilinkFieldValueRoot = z.object({\n fieldtype: z.enum(['multilink']),\n id: z.string(),\n url: z.string(),\n linktype: z.enum([\n 'story',\n 'url',\n 'email',\n 'asset'\n ]),\n cached_url: z.string(),\n anchor: z.optional(z.union([\n z.string(),\n z.null()\n ])),\n target: z.optional(z.union([\n z.literal('_self'),\n z.literal('_blank'),\n z.null()\n ]))\n});\n\nexport const zMultilinkFieldValue = zMultilinkFieldValueRoot;\n\n/**\n * Plugin/Custom field type - field plugin with custom structure\n */\nexport const zPluginFieldValueRoot = z.object({\n plugin: z.string(),\n _uid: z.optional(z.uuid())\n});\n\nexport const zPluginFieldValue = zPluginFieldValueRoot;\n\n/**\n * Richtext field type - structured rich text document (ProseMirror format)\n */\nexport const zRichtextFieldValueRoot = z.object({\n type: z.enum(['doc']),\n content: z.optional(z.array(z.record(z.string(), z.unknown())))\n});\n\nexport const zRichtextFieldValue = zRichtextFieldValueRoot;\n\n/**\n * Table field type - structured table data\n */\nexport const zTableFieldValueRoot = z.object({\n thead: z.array(z.object({\n _uid: z.string(),\n component: z.enum(['_table_head']),\n value: z.optional(z.string())\n })),\n tbody: z.array(z.object({\n _uid: z.string(),\n component: z.enum(['_table_row']),\n body: z.optional(z.array(z.object({\n _uid: z.string(),\n component: z.enum(['_table_col']),\n value: z.optional(z.string())\n })))\n }))\n});\n\nexport const zTableFieldValue = zTableFieldValueRoot;\n\n/**\n * Content object for creating or updating a component instance. Contains a component technical name and dynamic fields whose values depend on the component's schema field types. The _uid is optional — Storyblok will auto-generate one if not provided.\n */\nexport const zBlockContentInputRoot = z.object({\n _uid: z.optional(z.string()),\n component: z.string(),\n _editable: z.optional(z.string())\n});\n\nexport const zBlockContentInput = zBlockContentInputRoot;\n\n/**\n * Content object representing a component instance. Contains a _uid, a component technical name, and dynamic fields whose values depend on the component's schema field types (text, textarea, richtext, markdown, number, datetime, boolean, option, options, asset, multiasset, multilink, bloks, table, section, custom/plugin).\n */\nexport const zBlockContentRoot = z.object({\n _uid: z.string(),\n component: z.string(),\n _editable: z.optional(z.string())\n});\n\nexport const zBlockContent = zBlockContentRoot;\n"],"mappings":"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"}
@@ -34,6 +34,12 @@ type Block<TName extends string = string, TFields extends BlockFields = BlockFie
34
34
  * directory layout.
35
35
  */
36
36
  component_group_uuid?: string | null;
37
+ /**
38
+ * Folder membership as a display name path (e.g. `'Layout/Heros'`); `null` =
39
+ * explicitly ungrouped (push clears the group). Absent = unmanaged (push
40
+ * leaves the remote group untouched).
41
+ */
42
+ folder?: string | null;
37
43
  }>;
38
44
  /**
39
45
  * A root {@link Block} (`is_root: true`). Given a union of blocks, narrows to
@@ -34,6 +34,12 @@ type Block<TName extends string = string, TFields extends BlockFields = BlockFie
34
34
  * directory layout.
35
35
  */
36
36
  component_group_uuid?: string | null;
37
+ /**
38
+ * Folder membership as a display name path (e.g. `'Layout/Heros'`); `null` =
39
+ * explicitly ungrouped (push clears the group). Absent = unmanaged (push
40
+ * leaves the remote group untouched).
41
+ */
42
+ folder?: string | null;
37
43
  }>;
38
44
  /**
39
45
  * A root {@link Block} (`is_root: true`). Given a union of blocks, narrows to
@@ -16,35 +16,35 @@ type IsBaseBlock<T> = [Block] extends [T] ? true : false;
16
16
  * required (`required: true`) from optional fields. Each `F` is a member of the
17
17
  * field union, so it provably satisfies `FieldValue`'s `Field` constraint.
18
18
  */
19
- type ContentFields<TFields extends BlockFields, TBlocks> = Prettify<{ [F in TFields[number] as F extends {
19
+ type ContentFields<TFields extends BlockFields, TBlocks, TFieldPlugins = Record<never, never>> = Prettify<{ [F in TFields[number] as F extends {
20
20
  required: true;
21
- } ? F['name'] : never]: FieldValue<F, TBlocks> } & { [F in TFields[number] as F extends {
21
+ } ? F['name'] : never]: FieldValue<F, TBlocks, TFieldPlugins> } & { [F in TFields[number] as F extends {
22
22
  required: true;
23
- } ? never : F['name']]?: FieldValue<F, TBlocks> | null }>;
23
+ } ? never : F['name']]?: FieldValue<F, TBlocks, TFieldPlugins> | null }>;
24
24
  /** Input (write) variant of {@link ContentFields}, resolving each field via {@link FieldValueInput}. */
25
- type ContentFieldsInput<TFields extends BlockFields, TBlocks> = Prettify<{ [F in TFields[number] as F extends {
25
+ type ContentFieldsInput<TFields extends BlockFields, TBlocks, TFieldPlugins = Record<never, never>> = Prettify<{ [F in TFields[number] as F extends {
26
26
  required: true;
27
- } ? F['name'] : never]: FieldValueInput<F, TBlocks> } & { [F in TFields[number] as F extends {
27
+ } ? F['name'] : never]: FieldValueInput<F, TBlocks, TFieldPlugins> } & { [F in TFields[number] as F extends {
28
28
  required: true;
29
- } ? never : F['name']]?: FieldValueInput<F, TBlocks> | null }>;
29
+ } ? never : F['name']]?: FieldValueInput<F, TBlocks, TFieldPlugins> | null }>;
30
30
  /**
31
31
  * Content object for a single block instance as returned by the Storyblok
32
32
  * Content Delivery API. Without a `TBlock` argument, this is the loose
33
33
  * runtime shape (any block, `_editable` optional). With a schema-typed
34
34
  * `TBlock`, fields are narrowed per the block's `fields`.
35
35
  */
36
- type BlockContent<TBlock extends Block = Block, TBlocks = NoBlocks> = IsBaseBlock<TBlock> extends true ? BlockContentBase : TBlock extends any ? Prettify<{
36
+ type BlockContent<TBlock extends Block = Block, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = IsBaseBlock<TBlock> extends true ? BlockContentBase : TBlock extends any ? Prettify<{
37
37
  _uid: string;
38
38
  component: TBlock['name'];
39
39
  _editable?: string;
40
- } & ContentFields<TBlock['fields'], TBlocks>> : never;
40
+ } & ContentFields<TBlock['fields'], TBlocks, TFieldPlugins>> : never;
41
41
  /** Input variant of {@link BlockContent} for write operations (creating/updating stories via the MAPI). `_uid` is optional. */
42
- type BlockContentInput<TBlock extends Block = Block, TBlocks = NoBlocks> = IsBaseBlock<TBlock> extends true ? BlockContentInputBase : TBlock extends any ? Prettify<{
42
+ type BlockContentInput<TBlock extends Block = Block, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = IsBaseBlock<TBlock> extends true ? BlockContentInputBase : TBlock extends any ? Prettify<{
43
43
  _uid?: string;
44
44
  component: TBlock['name'];
45
45
  _editable?: string;
46
- } & ContentFieldsInput<TBlock['fields'], TBlocks>> : never;
47
- type BlocksFieldValue<TBlock extends Block = Block, TBlocks = NoBlocks> = BlockContent<TBlock, TBlocks>[];
46
+ } & ContentFieldsInput<TBlock['fields'], TBlocks, TFieldPlugins>> : never;
47
+ type BlocksFieldValue<TBlock extends Block = Block, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = BlockContent<TBlock, TBlocks, TFieldPlugins>[];
48
48
  /** Union of all valid Storyblok field type discriminants (e.g., `text`, `bloks`). */
49
49
  type FieldType = Field['type'];
50
50
  interface FieldTypeValueMap {
@@ -71,19 +71,54 @@ type IsNestable<T> = T extends {
71
71
  } ? false : T extends {
72
72
  is_nestable: true;
73
73
  } ? true : true;
74
+ type AllowEntry = string | {
75
+ folder: string;
76
+ };
77
+ /**
78
+ * Keeps `TBlock` when its `folder` is `TFolder` or any nested subfolder (mirrors
79
+ * the editor's `isAnywhereInFolder`). This is a best-effort compile-time check,
80
+ * compared case-insensitively via `Lowercase` so `folder: 'blog'` and a `Blog`
81
+ * folder ref narrow the same. TypeScript cannot replicate the CLI's full slug at
82
+ * the type level, so separator/symbol drift (`'My Layout'` vs `'my-layout'`) is
83
+ * only reconciled at push/validate time — full folder identity is enforced
84
+ * there, not here. To rely on narrowing, prefer a `defineFolder` ref over a
85
+ * string path on both the block's `folder` and the field's `allow`: a shared ref
86
+ * carries the exact path on both sides, so no drift is possible.
87
+ */
88
+ type MatchesFolder<TBlock, TFolder extends string> = TBlock extends {
89
+ folder: infer BF extends string;
90
+ } ? Lowercase<BF> extends Lowercase<TFolder> | `${Lowercase<TFolder>}/${string}` ? TBlock : never : never;
74
91
  type ApplyAllow<TField, TBlocks> = TField extends {
75
- allow: ReadonlyArray<infer TAllowed extends string>;
76
- } ? Extract<TBlocks, {
92
+ allow: ReadonlyArray<infer TAllowed extends AllowEntry>;
93
+ } ? TAllowed extends string ? Extract<TBlocks, {
77
94
  name: TAllowed;
78
- }> : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
95
+ }> : TAllowed extends {
96
+ folder: infer F extends string;
97
+ } ? TBlocks extends any ? MatchesFolder<TBlocks, F> : never : never : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
98
+ /**
99
+ * Resolves a `custom` field to its registered plugin value. When the field's
100
+ * `field_type` is a key of `TFieldPlugins`, the validator output is merged with
101
+ * the plugin envelope (`plugin`, optional `_uid`); otherwise it falls back to
102
+ * the untyped {@link PluginFieldValue}. Same shape for read and write.
103
+ */
104
+ type ResolveCustom<TField, TFieldPlugins> = TField extends {
105
+ field_type: infer F extends string;
106
+ } ? F extends keyof TFieldPlugins ? Prettify<TFieldPlugins[F] & {
107
+ plugin: string;
108
+ _uid?: string;
109
+ }> : PluginFieldValue : PluginFieldValue;
79
110
  /** Resolves a field definition to its runtime content value type (read). */
80
- type FieldValue<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
111
+ type FieldValue<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
81
112
  type: 'bloks';
82
- } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentBase[] : FieldTypeValueMap[TField['type']]>;
113
+ } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentBase[] : TField extends {
114
+ type: 'custom';
115
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
83
116
  /** Resolves a field definition to its input value type (write). */
84
- type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
117
+ type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
85
118
  type: 'bloks';
86
- } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentInputBase[] : FieldTypeValueMap[TField['type']]>;
119
+ } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentInputBase[] : TField extends {
120
+ type: 'custom';
121
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
87
122
  //#endregion
88
123
  export { BlockContent, BlockContentInput, BlocksFieldValue, FieldType, FieldValue, FieldValueInput };
89
124
  //# sourceMappingURL=field.d.cts.map
@@ -16,35 +16,35 @@ type IsBaseBlock<T> = [Block] extends [T] ? true : false;
16
16
  * required (`required: true`) from optional fields. Each `F` is a member of the
17
17
  * field union, so it provably satisfies `FieldValue`'s `Field` constraint.
18
18
  */
19
- type ContentFields<TFields extends BlockFields, TBlocks> = Prettify<{ [F in TFields[number] as F extends {
19
+ type ContentFields<TFields extends BlockFields, TBlocks, TFieldPlugins = Record<never, never>> = Prettify<{ [F in TFields[number] as F extends {
20
20
  required: true;
21
- } ? F['name'] : never]: FieldValue<F, TBlocks> } & { [F in TFields[number] as F extends {
21
+ } ? F['name'] : never]: FieldValue<F, TBlocks, TFieldPlugins> } & { [F in TFields[number] as F extends {
22
22
  required: true;
23
- } ? never : F['name']]?: FieldValue<F, TBlocks> | null }>;
23
+ } ? never : F['name']]?: FieldValue<F, TBlocks, TFieldPlugins> | null }>;
24
24
  /** Input (write) variant of {@link ContentFields}, resolving each field via {@link FieldValueInput}. */
25
- type ContentFieldsInput<TFields extends BlockFields, TBlocks> = Prettify<{ [F in TFields[number] as F extends {
25
+ type ContentFieldsInput<TFields extends BlockFields, TBlocks, TFieldPlugins = Record<never, never>> = Prettify<{ [F in TFields[number] as F extends {
26
26
  required: true;
27
- } ? F['name'] : never]: FieldValueInput<F, TBlocks> } & { [F in TFields[number] as F extends {
27
+ } ? F['name'] : never]: FieldValueInput<F, TBlocks, TFieldPlugins> } & { [F in TFields[number] as F extends {
28
28
  required: true;
29
- } ? never : F['name']]?: FieldValueInput<F, TBlocks> | null }>;
29
+ } ? never : F['name']]?: FieldValueInput<F, TBlocks, TFieldPlugins> | null }>;
30
30
  /**
31
31
  * Content object for a single block instance as returned by the Storyblok
32
32
  * Content Delivery API. Without a `TBlock` argument, this is the loose
33
33
  * runtime shape (any block, `_editable` optional). With a schema-typed
34
34
  * `TBlock`, fields are narrowed per the block's `fields`.
35
35
  */
36
- type BlockContent<TBlock extends Block = Block, TBlocks = NoBlocks> = IsBaseBlock<TBlock> extends true ? BlockContentBase : TBlock extends any ? Prettify<{
36
+ type BlockContent<TBlock extends Block = Block, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = IsBaseBlock<TBlock> extends true ? BlockContentBase : TBlock extends any ? Prettify<{
37
37
  _uid: string;
38
38
  component: TBlock['name'];
39
39
  _editable?: string;
40
- } & ContentFields<TBlock['fields'], TBlocks>> : never;
40
+ } & ContentFields<TBlock['fields'], TBlocks, TFieldPlugins>> : never;
41
41
  /** Input variant of {@link BlockContent} for write operations (creating/updating stories via the MAPI). `_uid` is optional. */
42
- type BlockContentInput<TBlock extends Block = Block, TBlocks = NoBlocks> = IsBaseBlock<TBlock> extends true ? BlockContentInputBase : TBlock extends any ? Prettify<{
42
+ type BlockContentInput<TBlock extends Block = Block, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = IsBaseBlock<TBlock> extends true ? BlockContentInputBase : TBlock extends any ? Prettify<{
43
43
  _uid?: string;
44
44
  component: TBlock['name'];
45
45
  _editable?: string;
46
- } & ContentFieldsInput<TBlock['fields'], TBlocks>> : never;
47
- type BlocksFieldValue<TBlock extends Block = Block, TBlocks = NoBlocks> = BlockContent<TBlock, TBlocks>[];
46
+ } & ContentFieldsInput<TBlock['fields'], TBlocks, TFieldPlugins>> : never;
47
+ type BlocksFieldValue<TBlock extends Block = Block, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = BlockContent<TBlock, TBlocks, TFieldPlugins>[];
48
48
  /** Union of all valid Storyblok field type discriminants (e.g., `text`, `bloks`). */
49
49
  type FieldType = Field['type'];
50
50
  interface FieldTypeValueMap {
@@ -71,19 +71,54 @@ type IsNestable<T> = T extends {
71
71
  } ? false : T extends {
72
72
  is_nestable: true;
73
73
  } ? true : true;
74
+ type AllowEntry = string | {
75
+ folder: string;
76
+ };
77
+ /**
78
+ * Keeps `TBlock` when its `folder` is `TFolder` or any nested subfolder (mirrors
79
+ * the editor's `isAnywhereInFolder`). This is a best-effort compile-time check,
80
+ * compared case-insensitively via `Lowercase` so `folder: 'blog'` and a `Blog`
81
+ * folder ref narrow the same. TypeScript cannot replicate the CLI's full slug at
82
+ * the type level, so separator/symbol drift (`'My Layout'` vs `'my-layout'`) is
83
+ * only reconciled at push/validate time — full folder identity is enforced
84
+ * there, not here. To rely on narrowing, prefer a `defineFolder` ref over a
85
+ * string path on both the block's `folder` and the field's `allow`: a shared ref
86
+ * carries the exact path on both sides, so no drift is possible.
87
+ */
88
+ type MatchesFolder<TBlock, TFolder extends string> = TBlock extends {
89
+ folder: infer BF extends string;
90
+ } ? Lowercase<BF> extends Lowercase<TFolder> | `${Lowercase<TFolder>}/${string}` ? TBlock : never : never;
74
91
  type ApplyAllow<TField, TBlocks> = TField extends {
75
- allow: ReadonlyArray<infer TAllowed extends string>;
76
- } ? Extract<TBlocks, {
92
+ allow: ReadonlyArray<infer TAllowed extends AllowEntry>;
93
+ } ? TAllowed extends string ? Extract<TBlocks, {
77
94
  name: TAllowed;
78
- }> : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
95
+ }> : TAllowed extends {
96
+ folder: infer F extends string;
97
+ } ? TBlocks extends any ? MatchesFolder<TBlocks, F> : never : never : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
98
+ /**
99
+ * Resolves a `custom` field to its registered plugin value. When the field's
100
+ * `field_type` is a key of `TFieldPlugins`, the validator output is merged with
101
+ * the plugin envelope (`plugin`, optional `_uid`); otherwise it falls back to
102
+ * the untyped {@link PluginFieldValue}. Same shape for read and write.
103
+ */
104
+ type ResolveCustom<TField, TFieldPlugins> = TField extends {
105
+ field_type: infer F extends string;
106
+ } ? F extends keyof TFieldPlugins ? Prettify<TFieldPlugins[F] & {
107
+ plugin: string;
108
+ _uid?: string;
109
+ }> : PluginFieldValue : PluginFieldValue;
79
110
  /** Resolves a field definition to its runtime content value type (read). */
80
- type FieldValue<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
111
+ type FieldValue<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
81
112
  type: 'bloks';
82
- } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentBase[] : FieldTypeValueMap[TField['type']]>;
113
+ } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentBase[] : TField extends {
114
+ type: 'custom';
115
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
83
116
  /** Resolves a field definition to its input value type (write). */
84
- type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
117
+ type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
85
118
  type: 'bloks';
86
- } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentInputBase[] : FieldTypeValueMap[TField['type']]>;
119
+ } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentInputBase[] : TField extends {
120
+ type: 'custom';
121
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
87
122
  //#endregion
88
123
  export { BlockContent, BlockContentInput, BlocksFieldValue, FieldType, FieldValue, FieldValueInput };
89
124
  //# sourceMappingURL=field.d.mts.map
@@ -14,12 +14,12 @@ type NoBlocks = false;
14
14
  * Base (un-narrowed) `RootBlock` means no schema was supplied, so the generated
15
15
  * story passes through unchanged.
16
16
  */
17
- type MapiStoryWithSchemaContent<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
- content: TStory extends StoryCreate | StoryUpdate ? BlockContentInput<TBlock, TBlocks> : BlockContent<TBlock, TBlocks>;
17
+ type MapiStoryWithSchemaContent<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
+ content: TStory extends StoryCreate | StoryUpdate ? BlockContentInput<TBlock, TBlocks, TFieldPlugins> : BlockContent<TBlock, TBlocks, TFieldPlugins>;
19
19
  }>;
20
- type MakeMapiStory<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? MapiStoryWithSchemaContent<TStory, TBlockOrBlocks, TBlocks> : TBlocks extends NoBlocks ? MapiStoryWithSchemaContent<TStory, Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks> : never>;
20
+ type MakeMapiStory<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? MapiStoryWithSchemaContent<TStory, TBlockOrBlocks, TBlocks, TFieldPlugins> : TBlocks extends NoBlocks ? MapiStoryWithSchemaContent<TStory, Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks, TFieldPlugins> : never>;
21
21
  /** A Storyblok MAPI story. */
22
- type MapiStory<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = MakeMapiStory<MapiStory$1, TBlockOrBlocks, TBlocks>;
22
+ type MapiStory<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = MakeMapiStory<MapiStory$1, TBlockOrBlocks, TFieldPlugins, TBlocks>;
23
23
  //#endregion
24
24
  export { MapiStory };
25
25
  //# sourceMappingURL=mapi-story.d.cts.map
@@ -14,12 +14,12 @@ type NoBlocks = false;
14
14
  * Base (un-narrowed) `RootBlock` means no schema was supplied, so the generated
15
15
  * story passes through unchanged.
16
16
  */
17
- type MapiStoryWithSchemaContent<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
- content: TStory extends StoryCreate | StoryUpdate ? BlockContentInput<TBlock, TBlocks> : BlockContent<TBlock, TBlocks>;
17
+ type MapiStoryWithSchemaContent<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
+ content: TStory extends StoryCreate | StoryUpdate ? BlockContentInput<TBlock, TBlocks, TFieldPlugins> : BlockContent<TBlock, TBlocks, TFieldPlugins>;
19
19
  }>;
20
- type MakeMapiStory<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? MapiStoryWithSchemaContent<TStory, TBlockOrBlocks, TBlocks> : TBlocks extends NoBlocks ? MapiStoryWithSchemaContent<TStory, Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks> : never>;
20
+ type MakeMapiStory<TStory extends MapiStory$1 | StoryCreate | StoryUpdate, TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? MapiStoryWithSchemaContent<TStory, TBlockOrBlocks, TBlocks, TFieldPlugins> : TBlocks extends NoBlocks ? MapiStoryWithSchemaContent<TStory, Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks, TFieldPlugins> : never>;
21
21
  /** A Storyblok MAPI story. */
22
- type MapiStory<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = MakeMapiStory<MapiStory$1, TBlockOrBlocks, TBlocks>;
22
+ type MapiStory<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = MakeMapiStory<MapiStory$1, TBlockOrBlocks, TFieldPlugins, TBlocks>;
23
23
  //#endregion
24
24
  export { MapiStory };
25
25
  //# sourceMappingURL=mapi-story.d.mts.map
@@ -9,11 +9,11 @@ import { BlockContent } from "./field.cjs";
9
9
  * `NoBlocks` (the default) leaves nested content loose (`BlockContentBase`).
10
10
  */
11
11
  type NoBlocks = false;
12
- type CapiStoryWithSchemaContent<TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks> = Override<CapiStory, {
13
- content: BlockContent<TBlock, TBlocks>;
12
+ type CapiStoryWithSchemaContent<TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Override<CapiStory, {
13
+ content: BlockContent<TBlock, TBlocks, TFieldPlugins>;
14
14
  }>;
15
15
  /** A Storyblok CDN (CAPI) story. */
16
- type Story<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? CapiStoryWithSchemaContent<TBlockOrBlocks, TBlocks> : TBlocks extends NoBlocks ? CapiStoryWithSchemaContent<Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks> : never>;
16
+ type Story<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? CapiStoryWithSchemaContent<TBlockOrBlocks, TBlocks, TFieldPlugins> : TBlocks extends NoBlocks ? CapiStoryWithSchemaContent<Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks, TFieldPlugins> : never>;
17
17
  //#endregion
18
18
  export { Story };
19
19
  //# sourceMappingURL=story.d.cts.map
@@ -9,11 +9,11 @@ import { BlockContent } from "./field.mjs";
9
9
  * `NoBlocks` (the default) leaves nested content loose (`BlockContentBase`).
10
10
  */
11
11
  type NoBlocks = false;
12
- type CapiStoryWithSchemaContent<TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks> = Override<CapiStory, {
13
- content: BlockContent<TBlock, TBlocks>;
12
+ type CapiStoryWithSchemaContent<TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Override<CapiStory, {
13
+ content: BlockContent<TBlock, TBlocks, TFieldPlugins>;
14
14
  }>;
15
15
  /** A Storyblok CDN (CAPI) story. */
16
- type Story<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? CapiStoryWithSchemaContent<TBlockOrBlocks, TBlocks> : TBlocks extends NoBlocks ? CapiStoryWithSchemaContent<Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks> : never>;
16
+ type Story<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = Prettify<[TBlockOrBlocks] extends [RootBlock] ? CapiStoryWithSchemaContent<TBlockOrBlocks, TBlocks, TFieldPlugins> : TBlocks extends NoBlocks ? CapiStoryWithSchemaContent<Extract<TBlockOrBlocks, RootBlock>, TBlockOrBlocks, TFieldPlugins> : never>;
17
17
  //#endregion
18
18
  export { Story };
19
19
  //# sourceMappingURL=story.d.mts.map
@@ -21,9 +21,14 @@ function defineBlock(block) {
21
21
  pos: index
22
22
  };
23
23
  });
24
+ const { folder, ...restBlock } = block ?? {};
25
+ if (folder !== void 0 && typeof restBlock.component_group_uuid === "string") throw new Error(`defineBlock: block "${block?.name ?? ""}" sets both "folder" and "component_group_uuid"; use one`);
26
+ if (typeof folder === "string" && !folder.split("/").some((segment) => segment.trim() !== "")) throw new Error(`defineBlock: block "${block?.name ?? ""}" has an empty "folder" path`);
27
+ const normalizedFolder = folder === void 0 ? void 0 : folder !== null && typeof folder === "object" ? folder.path : folder;
24
28
  return {
25
29
  ...BLOCK_DEFAULTS,
26
- ...block,
30
+ ...restBlock,
31
+ ...folder !== void 0 && { folder: normalizedFolder },
27
32
  fields
28
33
  };
29
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"define-block.cjs","names":[],"sources":["../../src/helpers/define-block.ts"],"sourcesContent":["import type {\n Block,\n BlockFields,\n NestableBlock,\n RootBlock,\n} from '../generated/types/block';\nimport type { Prettify } from '../utils/prettify';\n\nexport type { Block, BlockFields, NestableBlock, RootBlock };\n\nconst BLOCK_DEFAULTS = {\n id: 1,\n created_at: '',\n updated_at: '',\n is_root: false,\n is_nestable: true,\n};\n\n/** Fields that have safe defaults and may be omitted from block input. */\ntype BlockOptional = keyof typeof BLOCK_DEFAULTS;\n\ntype BlockInput<\n TName extends string = string,\n TFields extends BlockFields = BlockFields,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n> = Prettify<\n Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | BlockOptional> & {\n name: TName;\n fields: TFields;\n is_root?: TIsRoot;\n is_nestable?: TIsNestable;\n } & Partial<Pick<Block, Exclude<BlockOptional, 'is_root' | 'is_nestable'>>>\n>;\n\ntype DefinedBlock<\n TName extends string,\n TFields extends BlockFields,\n TIsRoot extends boolean,\n TIsNestable extends boolean,\n> = Prettify<\n Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable'> & {\n name: TName;\n fields: TFields;\n is_root: TIsRoot;\n is_nestable: TIsNestable;\n }\n>;\n\n/**\n * Returns a {@link Block} content-shape definition. The user-facing input is an\n * ordered array of `defineField` calls under `fields`; the array index becomes\n * each field's `pos`. A thin, strongly-typed helper — it does not map to the\n * MAPI wire shape (the CLI owns the DSL→wire mapping). Throws only on duplicate\n * field names (a programming error).\n *\n * @example\n * const pageBlock = defineBlock({\n * name: 'page',\n * is_root: true,\n * fields: [\n * defineField('headline', { type: 'text', required: true }),\n * ],\n * });\n */\nexport function defineBlock<\n TName extends string,\n const TFields extends BlockFields,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n>(\n block: BlockInput<TName, TFields, TIsRoot, TIsNestable>,\n): DefinedBlock<TName, TFields, TIsRoot, TIsNestable>;\n\nexport function defineBlock(block: any) {\n const inputFields = Array.isArray(block?.fields) ? block.fields : [];\n const seen = new Set<string>();\n const fields = inputFields.map((field: any, index: number) => {\n const name = field?.name;\n if (typeof name === 'string') {\n if (seen.has(name)) {\n throw new Error(`defineBlock: duplicate field name \"${name}\" in block \"${block?.name ?? ''}\"`);\n }\n seen.add(name);\n }\n return { ...field, pos: index };\n });\n return { ...BLOCK_DEFAULTS, ...block, fields };\n}\n"],"mappings":";;AAUA,MAAM,iBAAiB;CACrB,IAAI;CACJ,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,aAAa;CACd;AA0DD,SAAgB,YAAY,OAAY;CACtC,MAAM,cAAc,MAAM,QAAQ,OAAO,OAAO,GAAG,MAAM,SAAS,EAAE;CACpE,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,SAAS,YAAY,KAAK,OAAY,UAAkB;EAC5D,MAAM,OAAO,OAAO;AACpB,MAAI,OAAO,SAAS,UAAU;AAC5B,OAAI,KAAK,IAAI,KAAK,CAChB,OAAM,IAAI,MAAM,sCAAsC,KAAK,cAAc,OAAO,QAAQ,GAAG,GAAG;AAEhG,QAAK,IAAI,KAAK;;AAEhB,SAAO;GAAE,GAAG;GAAO,KAAK;GAAO;GAC/B;AACF,QAAO;EAAE,GAAG;EAAgB,GAAG;EAAO;EAAQ"}
1
+ {"version":3,"file":"define-block.cjs","names":[],"sources":["../../src/helpers/define-block.ts"],"sourcesContent":["import type {\n Block,\n BlockFields,\n NestableBlock,\n RootBlock,\n} from '../generated/types/block';\nimport type { BlockFolder } from './define-folder';\nimport type { Prettify } from '../utils/prettify';\n\nexport type { Block, BlockFields, NestableBlock, RootBlock };\n\nconst BLOCK_DEFAULTS = {\n id: 1,\n created_at: '',\n updated_at: '',\n is_root: false,\n is_nestable: true,\n};\n\n/** Fields that have safe defaults and may be omitted from block input. */\ntype BlockOptional = keyof typeof BLOCK_DEFAULTS;\n\n/** Accepted input for a block's `folder`: a folder ref, a raw path string, or `null` to explicitly ungroup. */\ntype FolderInput = BlockFolder | string | null;\n\n/** Normalizes a folder input type to the display path literal it resolves to. */\ntype NormalizeFolder<T> = T extends { path: infer P extends string } ? P : T;\n\ntype BlockInput<\n TName extends string = string,\n TFields extends BlockFields = BlockFields,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n TFolder extends FolderInput | undefined = undefined,\n> = Prettify<\n Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | 'folder' | BlockOptional> & {\n name: TName;\n fields: TFields;\n is_root?: TIsRoot;\n is_nestable?: TIsNestable;\n folder?: TFolder;\n } & Partial<Pick<Block, Exclude<BlockOptional, 'is_root' | 'is_nestable'>>>\n>;\n\ntype DefinedBlock<\n TName extends string,\n TFields extends BlockFields,\n TIsRoot extends boolean,\n TIsNestable extends boolean,\n TFolder extends FolderInput | undefined = undefined,\n> = Prettify<\n Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | 'folder'> & {\n name: TName;\n fields: TFields;\n is_root: TIsRoot;\n is_nestable: TIsNestable;\n } & (TFolder extends undefined ? unknown : { folder: NormalizeFolder<TFolder> })\n>;\n\n/**\n * Returns a {@link Block} content-shape definition. The user-facing input is an\n * ordered array of `defineField` calls under `fields`; the array index becomes\n * each field's `pos`. A thin, strongly-typed helper — it does not map to the\n * MAPI wire shape (the CLI owns the DSL→wire mapping). Throws only on duplicate\n * field names (a programming error).\n *\n * @example\n * const pageBlock = defineBlock({\n * name: 'page',\n * is_root: true,\n * fields: [\n * defineField('headline', { type: 'text', required: true }),\n * ],\n * });\n */\nexport function defineBlock<\n TName extends string,\n const TFields extends BlockFields,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n const TFolder extends FolderInput | undefined = undefined,\n>(\n block: BlockInput<TName, TFields, TIsRoot, TIsNestable, TFolder>,\n): DefinedBlock<TName, TFields, TIsRoot, TIsNestable, TFolder>;\n\nexport function defineBlock(block: any) {\n const inputFields = Array.isArray(block?.fields) ? block.fields : [];\n const seen = new Set<string>();\n const fields = inputFields.map((field: any, index: number) => {\n const name = field?.name;\n if (typeof name === 'string') {\n if (seen.has(name)) {\n throw new Error(`defineBlock: duplicate field name \"${name}\" in block \"${block?.name ?? ''}\"`);\n }\n seen.add(name);\n }\n return { ...field, pos: index };\n });\n\n const { folder, ...restBlock } = block ?? {};\n if (folder !== undefined && typeof restBlock.component_group_uuid === 'string') {\n throw new Error(`defineBlock: block \"${block?.name ?? ''}\" sets both \"folder\" and \"component_group_uuid\"; use one`);\n }\n if (typeof folder === 'string' && !folder.split('/').some(segment => segment.trim() !== '')) {\n throw new Error(`defineBlock: block \"${block?.name ?? ''}\" has an empty \"folder\" path`);\n }\n const normalizedFolder = folder === undefined\n ? undefined\n : (folder !== null && typeof folder === 'object' ? folder.path : folder);\n\n return {\n ...BLOCK_DEFAULTS,\n ...restBlock,\n ...(folder !== undefined && { folder: normalizedFolder }),\n fields,\n };\n}\n"],"mappings":";;AAWA,MAAM,iBAAiB;CACrB,IAAI;CACJ,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,aAAa;CACd;AAoED,SAAgB,YAAY,OAAY;CACtC,MAAM,cAAc,MAAM,QAAQ,OAAO,OAAO,GAAG,MAAM,SAAS,EAAE;CACpE,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,SAAS,YAAY,KAAK,OAAY,UAAkB;EAC5D,MAAM,OAAO,OAAO;AACpB,MAAI,OAAO,SAAS,UAAU;AAC5B,OAAI,KAAK,IAAI,KAAK,CAChB,OAAM,IAAI,MAAM,sCAAsC,KAAK,cAAc,OAAO,QAAQ,GAAG,GAAG;AAEhG,QAAK,IAAI,KAAK;;AAEhB,SAAO;GAAE,GAAG;GAAO,KAAK;GAAO;GAC/B;CAEF,MAAM,EAAE,QAAQ,GAAG,cAAc,SAAS,EAAE;AAC5C,KAAI,WAAW,UAAa,OAAO,UAAU,yBAAyB,SACpE,OAAM,IAAI,MAAM,uBAAuB,OAAO,QAAQ,GAAG,0DAA0D;AAErH,KAAI,OAAO,WAAW,YAAY,CAAC,OAAO,MAAM,IAAI,CAAC,MAAK,YAAW,QAAQ,MAAM,KAAK,GAAG,CACzF,OAAM,IAAI,MAAM,uBAAuB,OAAO,QAAQ,GAAG,8BAA8B;CAEzF,MAAM,mBAAmB,WAAW,SAChC,SACC,WAAW,QAAQ,OAAO,WAAW,WAAW,OAAO,OAAO;AAEnE,QAAO;EACL,GAAG;EACH,GAAG;EACH,GAAI,WAAW,UAAa,EAAE,QAAQ,kBAAkB;EACxD;EACD"}
@@ -1,5 +1,6 @@
1
1
  import { Block, BlockFields, NestableBlock, RootBlock } from "../generated/types/block.cjs";
2
2
  import { Prettify } from "../utils/prettify.cjs";
3
+ import { BlockFolder } from "./define-folder.cjs";
3
4
 
4
5
  //#region src/helpers/define-block.d.ts
5
6
  declare const BLOCK_DEFAULTS: {
@@ -11,18 +12,27 @@ declare const BLOCK_DEFAULTS: {
11
12
  };
12
13
  /** Fields that have safe defaults and may be omitted from block input. */
13
14
  type BlockOptional = keyof typeof BLOCK_DEFAULTS;
14
- type BlockInput<TName extends string = string, TFields extends BlockFields = BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | BlockOptional> & {
15
+ /** Accepted input for a block's `folder`: a folder ref, a raw path string, or `null` to explicitly ungroup. */
16
+ type FolderInput = BlockFolder | string | null;
17
+ /** Normalizes a folder input type to the display path literal it resolves to. */
18
+ type NormalizeFolder<T> = T extends {
19
+ path: infer P extends string;
20
+ } ? P : T;
21
+ type BlockInput<TName extends string = string, TFields extends BlockFields = BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true, TFolder extends FolderInput | undefined = undefined> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | 'folder' | BlockOptional> & {
15
22
  name: TName;
16
23
  fields: TFields;
17
24
  is_root?: TIsRoot;
18
25
  is_nestable?: TIsNestable;
26
+ folder?: TFolder;
19
27
  } & Partial<Pick<Block, Exclude<BlockOptional, 'is_root' | 'is_nestable'>>>>;
20
- type DefinedBlock<TName extends string, TFields extends BlockFields, TIsRoot extends boolean, TIsNestable extends boolean> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable'> & {
28
+ type DefinedBlock<TName extends string, TFields extends BlockFields, TIsRoot extends boolean, TIsNestable extends boolean, TFolder extends FolderInput | undefined = undefined> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | 'folder'> & {
21
29
  name: TName;
22
30
  fields: TFields;
23
31
  is_root: TIsRoot;
24
32
  is_nestable: TIsNestable;
25
- }>;
33
+ } & (TFolder extends undefined ? unknown : {
34
+ folder: NormalizeFolder<TFolder>;
35
+ })>;
26
36
  /**
27
37
  * Returns a {@link Block} content-shape definition. The user-facing input is an
28
38
  * ordered array of `defineField` calls under `fields`; the array index becomes
@@ -39,7 +49,7 @@ type DefinedBlock<TName extends string, TFields extends BlockFields, TIsRoot ext
39
49
  * ],
40
50
  * });
41
51
  */
42
- declare function defineBlock<TName extends string, const TFields extends BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true>(block: BlockInput<TName, TFields, TIsRoot, TIsNestable>): DefinedBlock<TName, TFields, TIsRoot, TIsNestable>;
52
+ declare function defineBlock<TName extends string, const TFields extends BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true, const TFolder extends FolderInput | undefined = undefined>(block: BlockInput<TName, TFields, TIsRoot, TIsNestable, TFolder>): DefinedBlock<TName, TFields, TIsRoot, TIsNestable, TFolder>;
43
53
  //#endregion
44
54
  export { defineBlock };
45
55
  //# sourceMappingURL=define-block.d.cts.map
@@ -1,5 +1,6 @@
1
1
  import { Block, BlockFields, NestableBlock, RootBlock } from "../generated/types/block.mjs";
2
2
  import { Prettify } from "../utils/prettify.mjs";
3
+ import { BlockFolder } from "./define-folder.mjs";
3
4
 
4
5
  //#region src/helpers/define-block.d.ts
5
6
  declare const BLOCK_DEFAULTS: {
@@ -11,18 +12,27 @@ declare const BLOCK_DEFAULTS: {
11
12
  };
12
13
  /** Fields that have safe defaults and may be omitted from block input. */
13
14
  type BlockOptional = keyof typeof BLOCK_DEFAULTS;
14
- type BlockInput<TName extends string = string, TFields extends BlockFields = BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | BlockOptional> & {
15
+ /** Accepted input for a block's `folder`: a folder ref, a raw path string, or `null` to explicitly ungroup. */
16
+ type FolderInput = BlockFolder | string | null;
17
+ /** Normalizes a folder input type to the display path literal it resolves to. */
18
+ type NormalizeFolder<T> = T extends {
19
+ path: infer P extends string;
20
+ } ? P : T;
21
+ type BlockInput<TName extends string = string, TFields extends BlockFields = BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true, TFolder extends FolderInput | undefined = undefined> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | 'folder' | BlockOptional> & {
15
22
  name: TName;
16
23
  fields: TFields;
17
24
  is_root?: TIsRoot;
18
25
  is_nestable?: TIsNestable;
26
+ folder?: TFolder;
19
27
  } & Partial<Pick<Block, Exclude<BlockOptional, 'is_root' | 'is_nestable'>>>>;
20
- type DefinedBlock<TName extends string, TFields extends BlockFields, TIsRoot extends boolean, TIsNestable extends boolean> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable'> & {
28
+ type DefinedBlock<TName extends string, TFields extends BlockFields, TIsRoot extends boolean, TIsNestable extends boolean, TFolder extends FolderInput | undefined = undefined> = Prettify<Omit<Block, 'name' | 'fields' | 'is_root' | 'is_nestable' | 'folder'> & {
21
29
  name: TName;
22
30
  fields: TFields;
23
31
  is_root: TIsRoot;
24
32
  is_nestable: TIsNestable;
25
- }>;
33
+ } & (TFolder extends undefined ? unknown : {
34
+ folder: NormalizeFolder<TFolder>;
35
+ })>;
26
36
  /**
27
37
  * Returns a {@link Block} content-shape definition. The user-facing input is an
28
38
  * ordered array of `defineField` calls under `fields`; the array index becomes
@@ -39,7 +49,7 @@ type DefinedBlock<TName extends string, TFields extends BlockFields, TIsRoot ext
39
49
  * ],
40
50
  * });
41
51
  */
42
- declare function defineBlock<TName extends string, const TFields extends BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true>(block: BlockInput<TName, TFields, TIsRoot, TIsNestable>): DefinedBlock<TName, TFields, TIsRoot, TIsNestable>;
52
+ declare function defineBlock<TName extends string, const TFields extends BlockFields, TIsRoot extends boolean = false, TIsNestable extends boolean = true, const TFolder extends FolderInput | undefined = undefined>(block: BlockInput<TName, TFields, TIsRoot, TIsNestable, TFolder>): DefinedBlock<TName, TFields, TIsRoot, TIsNestable, TFolder>;
43
53
  //#endregion
44
54
  export { defineBlock };
45
55
  //# sourceMappingURL=define-block.d.mts.map
@@ -20,9 +20,14 @@ function defineBlock(block) {
20
20
  pos: index
21
21
  };
22
22
  });
23
+ const { folder, ...restBlock } = block ?? {};
24
+ if (folder !== void 0 && typeof restBlock.component_group_uuid === "string") throw new Error(`defineBlock: block "${block?.name ?? ""}" sets both "folder" and "component_group_uuid"; use one`);
25
+ if (typeof folder === "string" && !folder.split("/").some((segment) => segment.trim() !== "")) throw new Error(`defineBlock: block "${block?.name ?? ""}" has an empty "folder" path`);
26
+ const normalizedFolder = folder === void 0 ? void 0 : folder !== null && typeof folder === "object" ? folder.path : folder;
23
27
  return {
24
28
  ...BLOCK_DEFAULTS,
25
- ...block,
29
+ ...restBlock,
30
+ ...folder !== void 0 && { folder: normalizedFolder },
26
31
  fields
27
32
  };
28
33
  }