@storyblok/schema 1.0.0-alpha.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.
Files changed (104) hide show
  1. package/README.md +72 -0
  2. package/dist/generated/mapi-types.d.cts +732 -0
  3. package/dist/generated/mapi-types.d.mts +732 -0
  4. package/dist/generated/types.d.cts +155 -0
  5. package/dist/generated/types.d.mts +155 -0
  6. package/dist/helpers/create-story-helpers.cjs +42 -0
  7. package/dist/helpers/create-story-helpers.cjs.map +1 -0
  8. package/dist/helpers/create-story-helpers.d.cts +48 -0
  9. package/dist/helpers/create-story-helpers.d.mts +48 -0
  10. package/dist/helpers/create-story-helpers.mjs +42 -0
  11. package/dist/helpers/create-story-helpers.mjs.map +1 -0
  12. package/dist/helpers/define-asset-folder.cjs +40 -0
  13. package/dist/helpers/define-asset-folder.cjs.map +1 -0
  14. package/dist/helpers/define-asset-folder.d.cts +33 -0
  15. package/dist/helpers/define-asset-folder.d.mts +33 -0
  16. package/dist/helpers/define-asset-folder.mjs +37 -0
  17. package/dist/helpers/define-asset-folder.mjs.map +1 -0
  18. package/dist/helpers/define-asset.cjs +43 -0
  19. package/dist/helpers/define-asset.cjs.map +1 -0
  20. package/dist/helpers/define-asset.d.cts +32 -0
  21. package/dist/helpers/define-asset.d.mts +32 -0
  22. package/dist/helpers/define-asset.mjs +40 -0
  23. package/dist/helpers/define-asset.mjs.map +1 -0
  24. package/dist/helpers/define-block-folder.cjs +40 -0
  25. package/dist/helpers/define-block-folder.cjs.map +1 -0
  26. package/dist/helpers/define-block-folder.d.cts +34 -0
  27. package/dist/helpers/define-block-folder.d.mts +34 -0
  28. package/dist/helpers/define-block-folder.mjs +37 -0
  29. package/dist/helpers/define-block-folder.mjs.map +1 -0
  30. package/dist/helpers/define-block.cjs +51 -0
  31. package/dist/helpers/define-block.cjs.map +1 -0
  32. package/dist/helpers/define-block.d.cts +90 -0
  33. package/dist/helpers/define-block.d.mts +90 -0
  34. package/dist/helpers/define-block.mjs +48 -0
  35. package/dist/helpers/define-block.mjs.map +1 -0
  36. package/dist/helpers/define-datasource-entry.cjs +41 -0
  37. package/dist/helpers/define-datasource-entry.cjs.map +1 -0
  38. package/dist/helpers/define-datasource-entry.d.cts +48 -0
  39. package/dist/helpers/define-datasource-entry.d.mts +48 -0
  40. package/dist/helpers/define-datasource-entry.mjs +37 -0
  41. package/dist/helpers/define-datasource-entry.mjs.map +1 -0
  42. package/dist/helpers/define-datasource.cjs +33 -0
  43. package/dist/helpers/define-datasource.cjs.map +1 -0
  44. package/dist/helpers/define-datasource.d.cts +41 -0
  45. package/dist/helpers/define-datasource.d.mts +41 -0
  46. package/dist/helpers/define-datasource.mjs +30 -0
  47. package/dist/helpers/define-datasource.mjs.map +1 -0
  48. package/dist/helpers/define-field.cjs +17 -0
  49. package/dist/helpers/define-field.cjs.map +1 -0
  50. package/dist/helpers/define-field.d.cts +100 -0
  51. package/dist/helpers/define-field.d.mts +100 -0
  52. package/dist/helpers/define-field.mjs +16 -0
  53. package/dist/helpers/define-field.mjs.map +1 -0
  54. package/dist/helpers/define-internal-tag.cjs +37 -0
  55. package/dist/helpers/define-internal-tag.cjs.map +1 -0
  56. package/dist/helpers/define-internal-tag.d.cts +34 -0
  57. package/dist/helpers/define-internal-tag.d.mts +34 -0
  58. package/dist/helpers/define-internal-tag.mjs +34 -0
  59. package/dist/helpers/define-internal-tag.mjs.map +1 -0
  60. package/dist/helpers/define-link.cjs +22 -0
  61. package/dist/helpers/define-link.cjs.map +1 -0
  62. package/dist/helpers/define-link.d.cts +31 -0
  63. package/dist/helpers/define-link.d.mts +31 -0
  64. package/dist/helpers/define-link.mjs +21 -0
  65. package/dist/helpers/define-link.mjs.map +1 -0
  66. package/dist/helpers/define-preset.cjs +37 -0
  67. package/dist/helpers/define-preset.cjs.map +1 -0
  68. package/dist/helpers/define-preset.d.cts +35 -0
  69. package/dist/helpers/define-preset.d.mts +35 -0
  70. package/dist/helpers/define-preset.mjs +34 -0
  71. package/dist/helpers/define-preset.mjs.map +1 -0
  72. package/dist/helpers/define-space.cjs +34 -0
  73. package/dist/helpers/define-space.cjs.map +1 -0
  74. package/dist/helpers/define-space.d.cts +31 -0
  75. package/dist/helpers/define-space.d.mts +31 -0
  76. package/dist/helpers/define-space.mjs +31 -0
  77. package/dist/helpers/define-space.mjs.map +1 -0
  78. package/dist/helpers/define-story.cjs +94 -0
  79. package/dist/helpers/define-story.cjs.map +1 -0
  80. package/dist/helpers/define-story.d.cts +127 -0
  81. package/dist/helpers/define-story.d.mts +127 -0
  82. package/dist/helpers/define-story.mjs +90 -0
  83. package/dist/helpers/define-story.mjs.map +1 -0
  84. package/dist/helpers/define-tag.cjs +13 -0
  85. package/dist/helpers/define-tag.cjs.map +1 -0
  86. package/dist/helpers/define-tag.d.cts +23 -0
  87. package/dist/helpers/define-tag.d.mts +23 -0
  88. package/dist/helpers/define-tag.mjs +12 -0
  89. package/dist/helpers/define-tag.mjs.map +1 -0
  90. package/dist/helpers/define-user.cjs +32 -0
  91. package/dist/helpers/define-user.cjs.map +1 -0
  92. package/dist/helpers/define-user.d.cts +26 -0
  93. package/dist/helpers/define-user.d.mts +26 -0
  94. package/dist/helpers/define-user.mjs +30 -0
  95. package/dist/helpers/define-user.mjs.map +1 -0
  96. package/dist/helpers/schema-type.d.cts +40 -0
  97. package/dist/helpers/schema-type.d.mts +40 -0
  98. package/dist/index.cjs +55 -0
  99. package/dist/index.d.cts +19 -0
  100. package/dist/index.d.mts +19 -0
  101. package/dist/index.mjs +17 -0
  102. package/dist/utils/prettify.d.cts +9 -0
  103. package/dist/utils/prettify.d.mts +9 -0
  104. package/package.json +85 -0
@@ -0,0 +1,43 @@
1
+
2
+ //#region src/helpers/define-asset.ts
3
+ const MAPI_ASSET_DEFAULTS = {
4
+ id: 1,
5
+ filename: "",
6
+ space_id: 1,
7
+ created_at: "",
8
+ updated_at: "",
9
+ short_filename: "",
10
+ content_type: "",
11
+ content_length: 0
12
+ };
13
+ /**
14
+ * Defines a MAPI asset (standalone asset entity).
15
+ * For asset fields embedded in story content, use {@link AssetFieldValue} instead.
16
+ *
17
+ * @example
18
+ * const asset = defineMapiAsset({ filename: 'hero.png' });
19
+ */
20
+ const defineMapiAsset = (asset) => ({
21
+ ...MAPI_ASSET_DEFAULTS,
22
+ ...asset
23
+ });
24
+ /**
25
+ * Defines an asset creation payload for the upload flow.
26
+ *
27
+ * @example
28
+ * const payload = defineAssetCreate({ filename: 'hero.png', alt: 'Hero image' });
29
+ */
30
+ const defineAssetCreate = (asset) => asset;
31
+ /**
32
+ * Defines an asset update payload.
33
+ *
34
+ * @example
35
+ * const payload = defineAssetUpdate({ alt: 'Updated hero image' });
36
+ */
37
+ const defineAssetUpdate = (asset) => asset;
38
+
39
+ //#endregion
40
+ exports.defineAssetCreate = defineAssetCreate;
41
+ exports.defineAssetUpdate = defineAssetUpdate;
42
+ exports.defineMapiAsset = defineMapiAsset;
43
+ //# sourceMappingURL=define-asset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-asset.cjs","names":[],"sources":["../../src/helpers/define-asset.ts"],"sourcesContent":["import type { Asset, AssetCreate, AssetUpdate } from '../generated/mapi-types';\n\nconst MAPI_ASSET_DEFAULTS = {\n id: 1,\n filename: '',\n space_id: 1,\n created_at: '',\n updated_at: '',\n short_filename: '',\n content_type: '',\n content_length: 0,\n};\n\nexport type MapiAsset = Asset;\nexport type { AssetCreate, AssetUpdate };\n\ntype MapiAssetInput = { filename: string } & Partial<Omit<Asset, 'filename'>>;\n\n/**\n * Defines a MAPI asset (standalone asset entity).\n * For asset fields embedded in story content, use {@link AssetFieldValue} instead.\n *\n * @example\n * const asset = defineMapiAsset({ filename: 'hero.png' });\n */\nexport const defineMapiAsset = (asset: MapiAssetInput): MapiAsset => ({ ...MAPI_ASSET_DEFAULTS, ...asset });\n\n/**\n * Defines an asset creation payload for the upload flow.\n *\n * @example\n * const payload = defineAssetCreate({ filename: 'hero.png', alt: 'Hero image' });\n */\nexport const defineAssetCreate = (asset: AssetCreate): AssetCreate => asset;\n\n/**\n * Defines an asset update payload.\n *\n * @example\n * const payload = defineAssetUpdate({ alt: 'Updated hero image' });\n */\nexport const defineAssetUpdate = (asset: AssetUpdate): AssetUpdate => asset;\n"],"mappings":";;AAEA,MAAM,sBAAsB;CAC1B,IAAI;CACJ,UAAU;CACV,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,gBAAgB;CACjB;;;;;;;;AAcD,MAAa,mBAAmB,WAAsC;CAAE,GAAG;CAAqB,GAAG;CAAO;;;;;;;AAQ1G,MAAa,qBAAqB,UAAoC;;;;;;;AAQtE,MAAa,qBAAqB,UAAoC"}
@@ -0,0 +1,32 @@
1
+ import { Asset, AssetCreate, AssetUpdate } from "../generated/mapi-types.cjs";
2
+
3
+ //#region src/helpers/define-asset.d.ts
4
+ type MapiAsset = Asset;
5
+ type MapiAssetInput = {
6
+ filename: string;
7
+ } & Partial<Omit<Asset, 'filename'>>;
8
+ /**
9
+ * Defines a MAPI asset (standalone asset entity).
10
+ * For asset fields embedded in story content, use {@link AssetFieldValue} instead.
11
+ *
12
+ * @example
13
+ * const asset = defineMapiAsset({ filename: 'hero.png' });
14
+ */
15
+ declare const defineMapiAsset: (asset: MapiAssetInput) => MapiAsset;
16
+ /**
17
+ * Defines an asset creation payload for the upload flow.
18
+ *
19
+ * @example
20
+ * const payload = defineAssetCreate({ filename: 'hero.png', alt: 'Hero image' });
21
+ */
22
+ declare const defineAssetCreate: (asset: AssetCreate) => AssetCreate;
23
+ /**
24
+ * Defines an asset update payload.
25
+ *
26
+ * @example
27
+ * const payload = defineAssetUpdate({ alt: 'Updated hero image' });
28
+ */
29
+ declare const defineAssetUpdate: (asset: AssetUpdate) => AssetUpdate;
30
+ //#endregion
31
+ export { MapiAsset, defineAssetCreate, defineAssetUpdate, defineMapiAsset };
32
+ //# sourceMappingURL=define-asset.d.cts.map
@@ -0,0 +1,32 @@
1
+ import { Asset, AssetCreate, AssetUpdate } from "../generated/mapi-types.mjs";
2
+
3
+ //#region src/helpers/define-asset.d.ts
4
+ type MapiAsset = Asset;
5
+ type MapiAssetInput = {
6
+ filename: string;
7
+ } & Partial<Omit<Asset, 'filename'>>;
8
+ /**
9
+ * Defines a MAPI asset (standalone asset entity).
10
+ * For asset fields embedded in story content, use {@link AssetFieldValue} instead.
11
+ *
12
+ * @example
13
+ * const asset = defineMapiAsset({ filename: 'hero.png' });
14
+ */
15
+ declare const defineMapiAsset: (asset: MapiAssetInput) => MapiAsset;
16
+ /**
17
+ * Defines an asset creation payload for the upload flow.
18
+ *
19
+ * @example
20
+ * const payload = defineAssetCreate({ filename: 'hero.png', alt: 'Hero image' });
21
+ */
22
+ declare const defineAssetCreate: (asset: AssetCreate) => AssetCreate;
23
+ /**
24
+ * Defines an asset update payload.
25
+ *
26
+ * @example
27
+ * const payload = defineAssetUpdate({ alt: 'Updated hero image' });
28
+ */
29
+ declare const defineAssetUpdate: (asset: AssetUpdate) => AssetUpdate;
30
+ //#endregion
31
+ export { MapiAsset, defineAssetCreate, defineAssetUpdate, defineMapiAsset };
32
+ //# sourceMappingURL=define-asset.d.mts.map
@@ -0,0 +1,40 @@
1
+ //#region src/helpers/define-asset.ts
2
+ const MAPI_ASSET_DEFAULTS = {
3
+ id: 1,
4
+ filename: "",
5
+ space_id: 1,
6
+ created_at: "",
7
+ updated_at: "",
8
+ short_filename: "",
9
+ content_type: "",
10
+ content_length: 0
11
+ };
12
+ /**
13
+ * Defines a MAPI asset (standalone asset entity).
14
+ * For asset fields embedded in story content, use {@link AssetFieldValue} instead.
15
+ *
16
+ * @example
17
+ * const asset = defineMapiAsset({ filename: 'hero.png' });
18
+ */
19
+ const defineMapiAsset = (asset) => ({
20
+ ...MAPI_ASSET_DEFAULTS,
21
+ ...asset
22
+ });
23
+ /**
24
+ * Defines an asset creation payload for the upload flow.
25
+ *
26
+ * @example
27
+ * const payload = defineAssetCreate({ filename: 'hero.png', alt: 'Hero image' });
28
+ */
29
+ const defineAssetCreate = (asset) => asset;
30
+ /**
31
+ * Defines an asset update payload.
32
+ *
33
+ * @example
34
+ * const payload = defineAssetUpdate({ alt: 'Updated hero image' });
35
+ */
36
+ const defineAssetUpdate = (asset) => asset;
37
+
38
+ //#endregion
39
+ export { defineAssetCreate, defineAssetUpdate, defineMapiAsset };
40
+ //# sourceMappingURL=define-asset.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-asset.mjs","names":[],"sources":["../../src/helpers/define-asset.ts"],"sourcesContent":["import type { Asset, AssetCreate, AssetUpdate } from '../generated/mapi-types';\n\nconst MAPI_ASSET_DEFAULTS = {\n id: 1,\n filename: '',\n space_id: 1,\n created_at: '',\n updated_at: '',\n short_filename: '',\n content_type: '',\n content_length: 0,\n};\n\nexport type MapiAsset = Asset;\nexport type { AssetCreate, AssetUpdate };\n\ntype MapiAssetInput = { filename: string } & Partial<Omit<Asset, 'filename'>>;\n\n/**\n * Defines a MAPI asset (standalone asset entity).\n * For asset fields embedded in story content, use {@link AssetFieldValue} instead.\n *\n * @example\n * const asset = defineMapiAsset({ filename: 'hero.png' });\n */\nexport const defineMapiAsset = (asset: MapiAssetInput): MapiAsset => ({ ...MAPI_ASSET_DEFAULTS, ...asset });\n\n/**\n * Defines an asset creation payload for the upload flow.\n *\n * @example\n * const payload = defineAssetCreate({ filename: 'hero.png', alt: 'Hero image' });\n */\nexport const defineAssetCreate = (asset: AssetCreate): AssetCreate => asset;\n\n/**\n * Defines an asset update payload.\n *\n * @example\n * const payload = defineAssetUpdate({ alt: 'Updated hero image' });\n */\nexport const defineAssetUpdate = (asset: AssetUpdate): AssetUpdate => asset;\n"],"mappings":";AAEA,MAAM,sBAAsB;CAC1B,IAAI;CACJ,UAAU;CACV,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,gBAAgB;CACjB;;;;;;;;AAcD,MAAa,mBAAmB,WAAsC;CAAE,GAAG;CAAqB,GAAG;CAAO;;;;;;;AAQ1G,MAAa,qBAAqB,UAAoC;;;;;;;AAQtE,MAAa,qBAAqB,UAAoC"}
@@ -0,0 +1,40 @@
1
+
2
+ //#region src/helpers/define-block-folder.ts
3
+ const BLOCK_FOLDER_DEFAULTS = {
4
+ id: 1,
5
+ uuid: ""
6
+ };
7
+ /**
8
+ * Defines a block folder for the MAPI.
9
+ * API-assigned fields (`id`, `uuid`) are optional and filled with safe defaults.
10
+ *
11
+ * @example
12
+ * import { defineBlockFolder } from '@storyblok/schema';
13
+ * const folder = defineBlockFolder({ name: 'Layout' });
14
+ */
15
+ const defineBlockFolder = (blockFolder) => ({
16
+ ...BLOCK_FOLDER_DEFAULTS,
17
+ ...blockFolder
18
+ });
19
+ /**
20
+ * Defines a block folder creation payload for the MAPI.
21
+ *
22
+ * @example
23
+ * import { defineBlockFolderCreate } from '@storyblok/schema';
24
+ * const payload = defineBlockFolderCreate({ name: 'Layout' });
25
+ */
26
+ const defineBlockFolderCreate = (blockFolder) => blockFolder;
27
+ /**
28
+ * Defines a block folder update payload for the MAPI.
29
+ *
30
+ * @example
31
+ * import { defineBlockFolderUpdate } from '@storyblok/schema';
32
+ * const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });
33
+ */
34
+ const defineBlockFolderUpdate = (blockFolder) => blockFolder;
35
+
36
+ //#endregion
37
+ exports.defineBlockFolder = defineBlockFolder;
38
+ exports.defineBlockFolderCreate = defineBlockFolderCreate;
39
+ exports.defineBlockFolderUpdate = defineBlockFolderUpdate;
40
+ //# sourceMappingURL=define-block-folder.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-block-folder.cjs","names":[],"sources":["../../src/helpers/define-block-folder.ts"],"sourcesContent":["import type { ComponentFolder, ComponentFolderCreate, ComponentFolderUpdate } from '../generated/mapi-types';\n\nexport type { ComponentFolder, ComponentFolderCreate, ComponentFolderUpdate };\n\nconst BLOCK_FOLDER_DEFAULTS = {\n id: 1,\n uuid: '',\n};\n\ntype BlockFolderInput = { name: string } & Partial<Omit<ComponentFolder, 'name'>>;\n\n/**\n * Defines a block folder for the MAPI.\n * API-assigned fields (`id`, `uuid`) are optional and filled with safe defaults.\n *\n * @example\n * import { defineBlockFolder } from '@storyblok/schema';\n * const folder = defineBlockFolder({ name: 'Layout' });\n */\nexport const defineBlockFolder = (blockFolder: BlockFolderInput): ComponentFolder => ({\n ...BLOCK_FOLDER_DEFAULTS,\n ...blockFolder,\n});\n\n/**\n * Defines a block folder creation payload for the MAPI.\n *\n * @example\n * import { defineBlockFolderCreate } from '@storyblok/schema';\n * const payload = defineBlockFolderCreate({ name: 'Layout' });\n */\nexport const defineBlockFolderCreate = (blockFolder: ComponentFolderCreate): ComponentFolderCreate => blockFolder;\n\n/**\n * Defines a block folder update payload for the MAPI.\n *\n * @example\n * import { defineBlockFolderUpdate } from '@storyblok/schema';\n * const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });\n */\nexport const defineBlockFolderUpdate = (blockFolder: ComponentFolderUpdate): ComponentFolderUpdate => blockFolder;\n"],"mappings":";;AAIA,MAAM,wBAAwB;CAC5B,IAAI;CACJ,MAAM;CACP;;;;;;;;;AAYD,MAAa,qBAAqB,iBAAoD;CACpF,GAAG;CACH,GAAG;CACJ;;;;;;;;AASD,MAAa,2BAA2B,gBAA8D;;;;;;;;AAStG,MAAa,2BAA2B,gBAA8D"}
@@ -0,0 +1,34 @@
1
+ import { ComponentFolder, ComponentFolderCreate, ComponentFolderUpdate } from "../generated/mapi-types.cjs";
2
+
3
+ //#region src/helpers/define-block-folder.d.ts
4
+ type BlockFolderInput = {
5
+ name: string;
6
+ } & Partial<Omit<ComponentFolder, 'name'>>;
7
+ /**
8
+ * Defines a block folder for the MAPI.
9
+ * API-assigned fields (`id`, `uuid`) are optional and filled with safe defaults.
10
+ *
11
+ * @example
12
+ * import { defineBlockFolder } from '@storyblok/schema';
13
+ * const folder = defineBlockFolder({ name: 'Layout' });
14
+ */
15
+ declare const defineBlockFolder: (blockFolder: BlockFolderInput) => ComponentFolder;
16
+ /**
17
+ * Defines a block folder creation payload for the MAPI.
18
+ *
19
+ * @example
20
+ * import { defineBlockFolderCreate } from '@storyblok/schema';
21
+ * const payload = defineBlockFolderCreate({ name: 'Layout' });
22
+ */
23
+ declare const defineBlockFolderCreate: (blockFolder: ComponentFolderCreate) => ComponentFolderCreate;
24
+ /**
25
+ * Defines a block folder update payload for the MAPI.
26
+ *
27
+ * @example
28
+ * import { defineBlockFolderUpdate } from '@storyblok/schema';
29
+ * const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });
30
+ */
31
+ declare const defineBlockFolderUpdate: (blockFolder: ComponentFolderUpdate) => ComponentFolderUpdate;
32
+ //#endregion
33
+ export { defineBlockFolder, defineBlockFolderCreate, defineBlockFolderUpdate };
34
+ //# sourceMappingURL=define-block-folder.d.cts.map
@@ -0,0 +1,34 @@
1
+ import { ComponentFolder, ComponentFolderCreate, ComponentFolderUpdate } from "../generated/mapi-types.mjs";
2
+
3
+ //#region src/helpers/define-block-folder.d.ts
4
+ type BlockFolderInput = {
5
+ name: string;
6
+ } & Partial<Omit<ComponentFolder, 'name'>>;
7
+ /**
8
+ * Defines a block folder for the MAPI.
9
+ * API-assigned fields (`id`, `uuid`) are optional and filled with safe defaults.
10
+ *
11
+ * @example
12
+ * import { defineBlockFolder } from '@storyblok/schema';
13
+ * const folder = defineBlockFolder({ name: 'Layout' });
14
+ */
15
+ declare const defineBlockFolder: (blockFolder: BlockFolderInput) => ComponentFolder;
16
+ /**
17
+ * Defines a block folder creation payload for the MAPI.
18
+ *
19
+ * @example
20
+ * import { defineBlockFolderCreate } from '@storyblok/schema';
21
+ * const payload = defineBlockFolderCreate({ name: 'Layout' });
22
+ */
23
+ declare const defineBlockFolderCreate: (blockFolder: ComponentFolderCreate) => ComponentFolderCreate;
24
+ /**
25
+ * Defines a block folder update payload for the MAPI.
26
+ *
27
+ * @example
28
+ * import { defineBlockFolderUpdate } from '@storyblok/schema';
29
+ * const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });
30
+ */
31
+ declare const defineBlockFolderUpdate: (blockFolder: ComponentFolderUpdate) => ComponentFolderUpdate;
32
+ //#endregion
33
+ export { defineBlockFolder, defineBlockFolderCreate, defineBlockFolderUpdate };
34
+ //# sourceMappingURL=define-block-folder.d.mts.map
@@ -0,0 +1,37 @@
1
+ //#region src/helpers/define-block-folder.ts
2
+ const BLOCK_FOLDER_DEFAULTS = {
3
+ id: 1,
4
+ uuid: ""
5
+ };
6
+ /**
7
+ * Defines a block folder for the MAPI.
8
+ * API-assigned fields (`id`, `uuid`) are optional and filled with safe defaults.
9
+ *
10
+ * @example
11
+ * import { defineBlockFolder } from '@storyblok/schema';
12
+ * const folder = defineBlockFolder({ name: 'Layout' });
13
+ */
14
+ const defineBlockFolder = (blockFolder) => ({
15
+ ...BLOCK_FOLDER_DEFAULTS,
16
+ ...blockFolder
17
+ });
18
+ /**
19
+ * Defines a block folder creation payload for the MAPI.
20
+ *
21
+ * @example
22
+ * import { defineBlockFolderCreate } from '@storyblok/schema';
23
+ * const payload = defineBlockFolderCreate({ name: 'Layout' });
24
+ */
25
+ const defineBlockFolderCreate = (blockFolder) => blockFolder;
26
+ /**
27
+ * Defines a block folder update payload for the MAPI.
28
+ *
29
+ * @example
30
+ * import { defineBlockFolderUpdate } from '@storyblok/schema';
31
+ * const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });
32
+ */
33
+ const defineBlockFolderUpdate = (blockFolder) => blockFolder;
34
+
35
+ //#endregion
36
+ export { defineBlockFolder, defineBlockFolderCreate, defineBlockFolderUpdate };
37
+ //# sourceMappingURL=define-block-folder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-block-folder.mjs","names":[],"sources":["../../src/helpers/define-block-folder.ts"],"sourcesContent":["import type { ComponentFolder, ComponentFolderCreate, ComponentFolderUpdate } from '../generated/mapi-types';\n\nexport type { ComponentFolder, ComponentFolderCreate, ComponentFolderUpdate };\n\nconst BLOCK_FOLDER_DEFAULTS = {\n id: 1,\n uuid: '',\n};\n\ntype BlockFolderInput = { name: string } & Partial<Omit<ComponentFolder, 'name'>>;\n\n/**\n * Defines a block folder for the MAPI.\n * API-assigned fields (`id`, `uuid`) are optional and filled with safe defaults.\n *\n * @example\n * import { defineBlockFolder } from '@storyblok/schema';\n * const folder = defineBlockFolder({ name: 'Layout' });\n */\nexport const defineBlockFolder = (blockFolder: BlockFolderInput): ComponentFolder => ({\n ...BLOCK_FOLDER_DEFAULTS,\n ...blockFolder,\n});\n\n/**\n * Defines a block folder creation payload for the MAPI.\n *\n * @example\n * import { defineBlockFolderCreate } from '@storyblok/schema';\n * const payload = defineBlockFolderCreate({ name: 'Layout' });\n */\nexport const defineBlockFolderCreate = (blockFolder: ComponentFolderCreate): ComponentFolderCreate => blockFolder;\n\n/**\n * Defines a block folder update payload for the MAPI.\n *\n * @example\n * import { defineBlockFolderUpdate } from '@storyblok/schema';\n * const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });\n */\nexport const defineBlockFolderUpdate = (blockFolder: ComponentFolderUpdate): ComponentFolderUpdate => blockFolder;\n"],"mappings":";AAIA,MAAM,wBAAwB;CAC5B,IAAI;CACJ,MAAM;CACP;;;;;;;;;AAYD,MAAa,qBAAqB,iBAAoD;CACpF,GAAG;CACH,GAAG;CACJ;;;;;;;;AASD,MAAa,2BAA2B,gBAA8D;;;;;;;;AAStG,MAAa,2BAA2B,gBAA8D"}
@@ -0,0 +1,51 @@
1
+
2
+ //#region src/helpers/define-block.ts
3
+ const BLOCK_DEFAULTS = {
4
+ id: 1,
5
+ created_at: "",
6
+ updated_at: "",
7
+ is_root: false,
8
+ is_nestable: true,
9
+ component_group_uuid: null
10
+ };
11
+ function defineBlock(block) {
12
+ const inputSchema = Array.isArray(block?.schema) ? block.schema : [];
13
+ const seen = /* @__PURE__ */ new Set();
14
+ const schemaRecord = {};
15
+ inputSchema.forEach((field, index) => {
16
+ const name = field?.name;
17
+ if (typeof name !== "string") return;
18
+ if (seen.has(name)) throw new Error(`defineBlock: duplicate field name "${name}" in block "${block?.name ?? ""}"`);
19
+ seen.add(name);
20
+ const { name: _name, ...rest } = field;
21
+ schemaRecord[name] = {
22
+ ...rest,
23
+ pos: index
24
+ };
25
+ });
26
+ return {
27
+ ...BLOCK_DEFAULTS,
28
+ ...block,
29
+ schema: schemaRecord
30
+ };
31
+ }
32
+ /**
33
+ * Defines a block creation payload for the MAPI.
34
+ *
35
+ * @example
36
+ * const payload = defineBlockCreate({ name: 'page', schema: { ... } });
37
+ */
38
+ const defineBlockCreate = (block) => block;
39
+ /**
40
+ * Defines a block update payload for the MAPI.
41
+ *
42
+ * @example
43
+ * const payload = defineBlockUpdate({ display_name: 'Page' });
44
+ */
45
+ const defineBlockUpdate = (block) => block;
46
+
47
+ //#endregion
48
+ exports.defineBlock = defineBlock;
49
+ exports.defineBlockCreate = defineBlockCreate;
50
+ exports.defineBlockUpdate = defineBlockUpdate;
51
+ //# sourceMappingURL=define-block.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-block.cjs","names":[],"sources":["../../src/helpers/define-block.ts"],"sourcesContent":["import type { ComponentCreate, Component as ComponentGenerated, ComponentUpdate, ComponentSchemaField as Field } from '../generated/mapi-types';\nimport type { Prettify } from '../utils/prettify';\n\nexport type { ComponentCreate, ComponentUpdate };\n\nconst BLOCK_DEFAULTS = {\n id: 1,\n created_at: '',\n updated_at: '',\n is_root: false,\n is_nestable: true,\n component_group_uuid: null,\n};\n\n/** Input form: an ordered array of named fields. The array index becomes `pos`. */\nexport type BlockSchemaInput = ReadonlyArray<Field & { name: string; required?: boolean }>;\n\n/** Wire form: the MAPI object map keyed by field name. This is what `defineBlock` returns. */\nexport type BlockSchema = Record<string, Field & { required?: boolean }>;\n\n/** Converts an array-form schema input into the wire-shape object map at the type level. */\nexport type SchemaArrayToRecord<T extends BlockSchemaInput> = {\n [F in T[number] as F['name']]: Omit<F, 'name'>;\n};\n\n/**\n * A Storyblok block.\n */\nexport type Block<\n TName extends string = string,\n TBlockSchema extends BlockSchema = BlockSchema,\n TIsRoot extends boolean = boolean,\n TIsNestable extends boolean = boolean,\n TComponentGroupUuid extends string | null = string | null,\n> = Prettify<\n Omit<ComponentGenerated, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {\n name: TName;\n schema: TBlockSchema;\n is_root?: TIsRoot;\n is_nestable?: TIsNestable;\n component_group_uuid?: TComponentGroupUuid;\n }\n>;\n\n/** Extract only root blocks from a schema union. */\nexport type RootBlocks<T extends Block> =\n T extends { is_root: true } ? T : never;\n\n/** Extract only nestable blocks from a schema union. */\nexport type NestableBlocks<T extends Block> =\n T extends { is_nestable: true } ? T : never;\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 TInputSchema extends BlockSchemaInput = BlockSchemaInput,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n TComponentGroupUuid extends string | null = null,\n> = Prettify<\n Omit<ComponentGenerated, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid' | BlockOptional> & {\n name: TName;\n schema: TInputSchema;\n is_root?: TIsRoot;\n is_nestable?: TIsNestable;\n component_group_uuid?: TComponentGroupUuid;\n } & Partial<Pick<ComponentGenerated, Exclude<BlockOptional, 'is_root' | 'is_nestable' | 'component_group_uuid'>>>\n>;\n\ntype DefinedBlock<\n TName extends string,\n TBlockSchema,\n TIsRoot extends boolean,\n TIsNestable extends boolean,\n TComponentGroupUuid extends string | null,\n> = Prettify<\n Omit<ComponentGenerated, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {\n name: TName;\n schema: TBlockSchema;\n is_root: TIsRoot;\n is_nestable: TIsNestable;\n component_group_uuid: TComponentGroupUuid;\n }\n>;\n\n/**\n * Returns a {@link Block} with object-shape `schema` (matches the MAPI wire\n * shape). The user-facing input is an ordered array of `defineField` calls;\n * the array index becomes the field's `pos` in the returned map. Throws if\n * two fields share the same `name`.\n *\n * @example\n * const pageBlock = defineBlock({\n * name: 'page',\n * is_root: true,\n * schema: [\n * defineField('headline', { type: 'text', required: true }),\n * ],\n * });\n */\nexport function defineBlock<\n TName extends string,\n const TInputSchema extends BlockSchemaInput,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n TComponentGroupUuid extends string | null = null,\n>(\n block: BlockInput<TName, TInputSchema, TIsRoot, TIsNestable, TComponentGroupUuid>,\n): DefinedBlock<TName, SchemaArrayToRecord<TInputSchema>, TIsRoot, TIsNestable, TComponentGroupUuid>;\n\nexport function defineBlock(block: any) {\n const inputSchema = Array.isArray(block?.schema) ? block.schema : [];\n const seen = new Set<string>();\n const schemaRecord: Record<string, unknown> = {};\n inputSchema.forEach((field: any, index: number) => {\n const name = field?.name;\n if (typeof name !== 'string') {\n return;\n }\n if (seen.has(name)) {\n throw new Error(`defineBlock: duplicate field name \"${name}\" in block \"${block?.name ?? ''}\"`);\n }\n seen.add(name);\n const { name: _name, ...rest } = field;\n schemaRecord[name] = { ...rest, pos: index };\n });\n return { ...BLOCK_DEFAULTS, ...block, schema: schemaRecord };\n}\n\n/**\n * Defines a block creation payload for the MAPI.\n *\n * @example\n * const payload = defineBlockCreate({ name: 'page', schema: { ... } });\n */\nexport const defineBlockCreate = (block: ComponentCreate): ComponentCreate => block;\n\n/**\n * Defines a block update payload for the MAPI.\n *\n * @example\n * const payload = defineBlockUpdate({ display_name: 'Page' });\n */\nexport const defineBlockUpdate = (block: ComponentUpdate): ComponentUpdate => block;\n"],"mappings":";;AAKA,MAAM,iBAAiB;CACrB,IAAI;CACJ,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,aAAa;CACb,sBAAsB;CACvB;AAoGD,SAAgB,YAAY,OAAY;CACtC,MAAM,cAAc,MAAM,QAAQ,OAAO,OAAO,GAAG,MAAM,SAAS,EAAE;CACpE,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,eAAwC,EAAE;AAChD,aAAY,SAAS,OAAY,UAAkB;EACjD,MAAM,OAAO,OAAO;AACpB,MAAI,OAAO,SAAS,SAClB;AAEF,MAAI,KAAK,IAAI,KAAK,CAChB,OAAM,IAAI,MAAM,sCAAsC,KAAK,cAAc,OAAO,QAAQ,GAAG,GAAG;AAEhG,OAAK,IAAI,KAAK;EACd,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;AACjC,eAAa,QAAQ;GAAE,GAAG;GAAM,KAAK;GAAO;GAC5C;AACF,QAAO;EAAE,GAAG;EAAgB,GAAG;EAAO,QAAQ;EAAc;;;;;;;;AAS9D,MAAa,qBAAqB,UAA4C;;;;;;;AAQ9E,MAAa,qBAAqB,UAA4C"}
@@ -0,0 +1,90 @@
1
+ import { Component, ComponentCreate, ComponentSchemaField, ComponentUpdate } from "../generated/mapi-types.cjs";
2
+ import { Prettify } from "../utils/prettify.cjs";
3
+
4
+ //#region src/helpers/define-block.d.ts
5
+ declare const BLOCK_DEFAULTS: {
6
+ id: number;
7
+ created_at: string;
8
+ updated_at: string;
9
+ is_root: boolean;
10
+ is_nestable: boolean;
11
+ component_group_uuid: null;
12
+ };
13
+ /** Input form: an ordered array of named fields. The array index becomes `pos`. */
14
+ type BlockSchemaInput = ReadonlyArray<ComponentSchemaField & {
15
+ name: string;
16
+ required?: boolean;
17
+ }>;
18
+ /** Wire form: the MAPI object map keyed by field name. This is what `defineBlock` returns. */
19
+ type BlockSchema = Record<string, ComponentSchemaField & {
20
+ required?: boolean;
21
+ }>;
22
+ /** Converts an array-form schema input into the wire-shape object map at the type level. */
23
+ type SchemaArrayToRecord<T extends BlockSchemaInput> = { [F in T[number] as F['name']]: Omit<F, 'name'> };
24
+ /**
25
+ * A Storyblok block.
26
+ */
27
+ type Block<TName extends string = string, TBlockSchema extends BlockSchema = BlockSchema, TIsRoot extends boolean = boolean, TIsNestable extends boolean = boolean, TComponentGroupUuid extends string | null = string | null> = Prettify<Omit<Component, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {
28
+ name: TName;
29
+ schema: TBlockSchema;
30
+ is_root?: TIsRoot;
31
+ is_nestable?: TIsNestable;
32
+ component_group_uuid?: TComponentGroupUuid;
33
+ }>;
34
+ /** Extract only root blocks from a schema union. */
35
+ type RootBlocks<T extends Block> = T extends {
36
+ is_root: true;
37
+ } ? T : never;
38
+ /** Extract only nestable blocks from a schema union. */
39
+ type NestableBlocks<T extends Block> = T extends {
40
+ is_nestable: true;
41
+ } ? T : never;
42
+ /** Fields that have safe defaults and may be omitted from block input. */
43
+ type BlockOptional = keyof typeof BLOCK_DEFAULTS;
44
+ type BlockInput<TName extends string = string, TInputSchema extends BlockSchemaInput = BlockSchemaInput, TIsRoot extends boolean = false, TIsNestable extends boolean = true, TComponentGroupUuid extends string | null = null> = Prettify<Omit<Component, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid' | BlockOptional> & {
45
+ name: TName;
46
+ schema: TInputSchema;
47
+ is_root?: TIsRoot;
48
+ is_nestable?: TIsNestable;
49
+ component_group_uuid?: TComponentGroupUuid;
50
+ } & Partial<Pick<Component, Exclude<BlockOptional, 'is_root' | 'is_nestable' | 'component_group_uuid'>>>>;
51
+ type DefinedBlock<TName extends string, TBlockSchema, TIsRoot extends boolean, TIsNestable extends boolean, TComponentGroupUuid extends string | null> = Prettify<Omit<Component, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {
52
+ name: TName;
53
+ schema: TBlockSchema;
54
+ is_root: TIsRoot;
55
+ is_nestable: TIsNestable;
56
+ component_group_uuid: TComponentGroupUuid;
57
+ }>;
58
+ /**
59
+ * Returns a {@link Block} with object-shape `schema` (matches the MAPI wire
60
+ * shape). The user-facing input is an ordered array of `defineField` calls;
61
+ * the array index becomes the field's `pos` in the returned map. Throws if
62
+ * two fields share the same `name`.
63
+ *
64
+ * @example
65
+ * const pageBlock = defineBlock({
66
+ * name: 'page',
67
+ * is_root: true,
68
+ * schema: [
69
+ * defineField('headline', { type: 'text', required: true }),
70
+ * ],
71
+ * });
72
+ */
73
+ declare function defineBlock<TName extends string, const TInputSchema extends BlockSchemaInput, TIsRoot extends boolean = false, TIsNestable extends boolean = true, TComponentGroupUuid extends string | null = null>(block: BlockInput<TName, TInputSchema, TIsRoot, TIsNestable, TComponentGroupUuid>): DefinedBlock<TName, SchemaArrayToRecord<TInputSchema>, TIsRoot, TIsNestable, TComponentGroupUuid>;
74
+ /**
75
+ * Defines a block creation payload for the MAPI.
76
+ *
77
+ * @example
78
+ * const payload = defineBlockCreate({ name: 'page', schema: { ... } });
79
+ */
80
+ declare const defineBlockCreate: (block: ComponentCreate) => ComponentCreate;
81
+ /**
82
+ * Defines a block update payload for the MAPI.
83
+ *
84
+ * @example
85
+ * const payload = defineBlockUpdate({ display_name: 'Page' });
86
+ */
87
+ declare const defineBlockUpdate: (block: ComponentUpdate) => ComponentUpdate;
88
+ //#endregion
89
+ export { Block, BlockSchema, NestableBlocks, RootBlocks, defineBlock, defineBlockCreate, defineBlockUpdate };
90
+ //# sourceMappingURL=define-block.d.cts.map
@@ -0,0 +1,90 @@
1
+ import { Component, ComponentCreate, ComponentSchemaField, ComponentUpdate } from "../generated/mapi-types.mjs";
2
+ import { Prettify } from "../utils/prettify.mjs";
3
+
4
+ //#region src/helpers/define-block.d.ts
5
+ declare const BLOCK_DEFAULTS: {
6
+ id: number;
7
+ created_at: string;
8
+ updated_at: string;
9
+ is_root: boolean;
10
+ is_nestable: boolean;
11
+ component_group_uuid: null;
12
+ };
13
+ /** Input form: an ordered array of named fields. The array index becomes `pos`. */
14
+ type BlockSchemaInput = ReadonlyArray<ComponentSchemaField & {
15
+ name: string;
16
+ required?: boolean;
17
+ }>;
18
+ /** Wire form: the MAPI object map keyed by field name. This is what `defineBlock` returns. */
19
+ type BlockSchema = Record<string, ComponentSchemaField & {
20
+ required?: boolean;
21
+ }>;
22
+ /** Converts an array-form schema input into the wire-shape object map at the type level. */
23
+ type SchemaArrayToRecord<T extends BlockSchemaInput> = { [F in T[number] as F['name']]: Omit<F, 'name'> };
24
+ /**
25
+ * A Storyblok block.
26
+ */
27
+ type Block<TName extends string = string, TBlockSchema extends BlockSchema = BlockSchema, TIsRoot extends boolean = boolean, TIsNestable extends boolean = boolean, TComponentGroupUuid extends string | null = string | null> = Prettify<Omit<Component, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {
28
+ name: TName;
29
+ schema: TBlockSchema;
30
+ is_root?: TIsRoot;
31
+ is_nestable?: TIsNestable;
32
+ component_group_uuid?: TComponentGroupUuid;
33
+ }>;
34
+ /** Extract only root blocks from a schema union. */
35
+ type RootBlocks<T extends Block> = T extends {
36
+ is_root: true;
37
+ } ? T : never;
38
+ /** Extract only nestable blocks from a schema union. */
39
+ type NestableBlocks<T extends Block> = T extends {
40
+ is_nestable: true;
41
+ } ? T : never;
42
+ /** Fields that have safe defaults and may be omitted from block input. */
43
+ type BlockOptional = keyof typeof BLOCK_DEFAULTS;
44
+ type BlockInput<TName extends string = string, TInputSchema extends BlockSchemaInput = BlockSchemaInput, TIsRoot extends boolean = false, TIsNestable extends boolean = true, TComponentGroupUuid extends string | null = null> = Prettify<Omit<Component, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid' | BlockOptional> & {
45
+ name: TName;
46
+ schema: TInputSchema;
47
+ is_root?: TIsRoot;
48
+ is_nestable?: TIsNestable;
49
+ component_group_uuid?: TComponentGroupUuid;
50
+ } & Partial<Pick<Component, Exclude<BlockOptional, 'is_root' | 'is_nestable' | 'component_group_uuid'>>>>;
51
+ type DefinedBlock<TName extends string, TBlockSchema, TIsRoot extends boolean, TIsNestable extends boolean, TComponentGroupUuid extends string | null> = Prettify<Omit<Component, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {
52
+ name: TName;
53
+ schema: TBlockSchema;
54
+ is_root: TIsRoot;
55
+ is_nestable: TIsNestable;
56
+ component_group_uuid: TComponentGroupUuid;
57
+ }>;
58
+ /**
59
+ * Returns a {@link Block} with object-shape `schema` (matches the MAPI wire
60
+ * shape). The user-facing input is an ordered array of `defineField` calls;
61
+ * the array index becomes the field's `pos` in the returned map. Throws if
62
+ * two fields share the same `name`.
63
+ *
64
+ * @example
65
+ * const pageBlock = defineBlock({
66
+ * name: 'page',
67
+ * is_root: true,
68
+ * schema: [
69
+ * defineField('headline', { type: 'text', required: true }),
70
+ * ],
71
+ * });
72
+ */
73
+ declare function defineBlock<TName extends string, const TInputSchema extends BlockSchemaInput, TIsRoot extends boolean = false, TIsNestable extends boolean = true, TComponentGroupUuid extends string | null = null>(block: BlockInput<TName, TInputSchema, TIsRoot, TIsNestable, TComponentGroupUuid>): DefinedBlock<TName, SchemaArrayToRecord<TInputSchema>, TIsRoot, TIsNestable, TComponentGroupUuid>;
74
+ /**
75
+ * Defines a block creation payload for the MAPI.
76
+ *
77
+ * @example
78
+ * const payload = defineBlockCreate({ name: 'page', schema: { ... } });
79
+ */
80
+ declare const defineBlockCreate: (block: ComponentCreate) => ComponentCreate;
81
+ /**
82
+ * Defines a block update payload for the MAPI.
83
+ *
84
+ * @example
85
+ * const payload = defineBlockUpdate({ display_name: 'Page' });
86
+ */
87
+ declare const defineBlockUpdate: (block: ComponentUpdate) => ComponentUpdate;
88
+ //#endregion
89
+ export { Block, BlockSchema, NestableBlocks, RootBlocks, defineBlock, defineBlockCreate, defineBlockUpdate };
90
+ //# sourceMappingURL=define-block.d.mts.map
@@ -0,0 +1,48 @@
1
+ //#region src/helpers/define-block.ts
2
+ const BLOCK_DEFAULTS = {
3
+ id: 1,
4
+ created_at: "",
5
+ updated_at: "",
6
+ is_root: false,
7
+ is_nestable: true,
8
+ component_group_uuid: null
9
+ };
10
+ function defineBlock(block) {
11
+ const inputSchema = Array.isArray(block?.schema) ? block.schema : [];
12
+ const seen = /* @__PURE__ */ new Set();
13
+ const schemaRecord = {};
14
+ inputSchema.forEach((field, index) => {
15
+ const name = field?.name;
16
+ if (typeof name !== "string") return;
17
+ if (seen.has(name)) throw new Error(`defineBlock: duplicate field name "${name}" in block "${block?.name ?? ""}"`);
18
+ seen.add(name);
19
+ const { name: _name, ...rest } = field;
20
+ schemaRecord[name] = {
21
+ ...rest,
22
+ pos: index
23
+ };
24
+ });
25
+ return {
26
+ ...BLOCK_DEFAULTS,
27
+ ...block,
28
+ schema: schemaRecord
29
+ };
30
+ }
31
+ /**
32
+ * Defines a block creation payload for the MAPI.
33
+ *
34
+ * @example
35
+ * const payload = defineBlockCreate({ name: 'page', schema: { ... } });
36
+ */
37
+ const defineBlockCreate = (block) => block;
38
+ /**
39
+ * Defines a block update payload for the MAPI.
40
+ *
41
+ * @example
42
+ * const payload = defineBlockUpdate({ display_name: 'Page' });
43
+ */
44
+ const defineBlockUpdate = (block) => block;
45
+
46
+ //#endregion
47
+ export { defineBlock, defineBlockCreate, defineBlockUpdate };
48
+ //# sourceMappingURL=define-block.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-block.mjs","names":[],"sources":["../../src/helpers/define-block.ts"],"sourcesContent":["import type { ComponentCreate, Component as ComponentGenerated, ComponentUpdate, ComponentSchemaField as Field } from '../generated/mapi-types';\nimport type { Prettify } from '../utils/prettify';\n\nexport type { ComponentCreate, ComponentUpdate };\n\nconst BLOCK_DEFAULTS = {\n id: 1,\n created_at: '',\n updated_at: '',\n is_root: false,\n is_nestable: true,\n component_group_uuid: null,\n};\n\n/** Input form: an ordered array of named fields. The array index becomes `pos`. */\nexport type BlockSchemaInput = ReadonlyArray<Field & { name: string; required?: boolean }>;\n\n/** Wire form: the MAPI object map keyed by field name. This is what `defineBlock` returns. */\nexport type BlockSchema = Record<string, Field & { required?: boolean }>;\n\n/** Converts an array-form schema input into the wire-shape object map at the type level. */\nexport type SchemaArrayToRecord<T extends BlockSchemaInput> = {\n [F in T[number] as F['name']]: Omit<F, 'name'>;\n};\n\n/**\n * A Storyblok block.\n */\nexport type Block<\n TName extends string = string,\n TBlockSchema extends BlockSchema = BlockSchema,\n TIsRoot extends boolean = boolean,\n TIsNestable extends boolean = boolean,\n TComponentGroupUuid extends string | null = string | null,\n> = Prettify<\n Omit<ComponentGenerated, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {\n name: TName;\n schema: TBlockSchema;\n is_root?: TIsRoot;\n is_nestable?: TIsNestable;\n component_group_uuid?: TComponentGroupUuid;\n }\n>;\n\n/** Extract only root blocks from a schema union. */\nexport type RootBlocks<T extends Block> =\n T extends { is_root: true } ? T : never;\n\n/** Extract only nestable blocks from a schema union. */\nexport type NestableBlocks<T extends Block> =\n T extends { is_nestable: true } ? T : never;\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 TInputSchema extends BlockSchemaInput = BlockSchemaInput,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n TComponentGroupUuid extends string | null = null,\n> = Prettify<\n Omit<ComponentGenerated, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid' | BlockOptional> & {\n name: TName;\n schema: TInputSchema;\n is_root?: TIsRoot;\n is_nestable?: TIsNestable;\n component_group_uuid?: TComponentGroupUuid;\n } & Partial<Pick<ComponentGenerated, Exclude<BlockOptional, 'is_root' | 'is_nestable' | 'component_group_uuid'>>>\n>;\n\ntype DefinedBlock<\n TName extends string,\n TBlockSchema,\n TIsRoot extends boolean,\n TIsNestable extends boolean,\n TComponentGroupUuid extends string | null,\n> = Prettify<\n Omit<ComponentGenerated, 'name' | 'schema' | 'is_root' | 'is_nestable' | 'component_group_uuid'> & {\n name: TName;\n schema: TBlockSchema;\n is_root: TIsRoot;\n is_nestable: TIsNestable;\n component_group_uuid: TComponentGroupUuid;\n }\n>;\n\n/**\n * Returns a {@link Block} with object-shape `schema` (matches the MAPI wire\n * shape). The user-facing input is an ordered array of `defineField` calls;\n * the array index becomes the field's `pos` in the returned map. Throws if\n * two fields share the same `name`.\n *\n * @example\n * const pageBlock = defineBlock({\n * name: 'page',\n * is_root: true,\n * schema: [\n * defineField('headline', { type: 'text', required: true }),\n * ],\n * });\n */\nexport function defineBlock<\n TName extends string,\n const TInputSchema extends BlockSchemaInput,\n TIsRoot extends boolean = false,\n TIsNestable extends boolean = true,\n TComponentGroupUuid extends string | null = null,\n>(\n block: BlockInput<TName, TInputSchema, TIsRoot, TIsNestable, TComponentGroupUuid>,\n): DefinedBlock<TName, SchemaArrayToRecord<TInputSchema>, TIsRoot, TIsNestable, TComponentGroupUuid>;\n\nexport function defineBlock(block: any) {\n const inputSchema = Array.isArray(block?.schema) ? block.schema : [];\n const seen = new Set<string>();\n const schemaRecord: Record<string, unknown> = {};\n inputSchema.forEach((field: any, index: number) => {\n const name = field?.name;\n if (typeof name !== 'string') {\n return;\n }\n if (seen.has(name)) {\n throw new Error(`defineBlock: duplicate field name \"${name}\" in block \"${block?.name ?? ''}\"`);\n }\n seen.add(name);\n const { name: _name, ...rest } = field;\n schemaRecord[name] = { ...rest, pos: index };\n });\n return { ...BLOCK_DEFAULTS, ...block, schema: schemaRecord };\n}\n\n/**\n * Defines a block creation payload for the MAPI.\n *\n * @example\n * const payload = defineBlockCreate({ name: 'page', schema: { ... } });\n */\nexport const defineBlockCreate = (block: ComponentCreate): ComponentCreate => block;\n\n/**\n * Defines a block update payload for the MAPI.\n *\n * @example\n * const payload = defineBlockUpdate({ display_name: 'Page' });\n */\nexport const defineBlockUpdate = (block: ComponentUpdate): ComponentUpdate => block;\n"],"mappings":";AAKA,MAAM,iBAAiB;CACrB,IAAI;CACJ,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,aAAa;CACb,sBAAsB;CACvB;AAoGD,SAAgB,YAAY,OAAY;CACtC,MAAM,cAAc,MAAM,QAAQ,OAAO,OAAO,GAAG,MAAM,SAAS,EAAE;CACpE,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,eAAwC,EAAE;AAChD,aAAY,SAAS,OAAY,UAAkB;EACjD,MAAM,OAAO,OAAO;AACpB,MAAI,OAAO,SAAS,SAClB;AAEF,MAAI,KAAK,IAAI,KAAK,CAChB,OAAM,IAAI,MAAM,sCAAsC,KAAK,cAAc,OAAO,QAAQ,GAAG,GAAG;AAEhG,OAAK,IAAI,KAAK;EACd,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;AACjC,eAAa,QAAQ;GAAE,GAAG;GAAM,KAAK;GAAO;GAC5C;AACF,QAAO;EAAE,GAAG;EAAgB,GAAG;EAAO,QAAQ;EAAc;;;;;;;;AAS9D,MAAa,qBAAqB,UAA4C;;;;;;;AAQ9E,MAAa,qBAAqB,UAA4C"}