@storyblok/management-api-client 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (50) hide show
  1. package/dist/client.cjs +6 -0
  2. package/dist/client.cjs.map +1 -1
  3. package/dist/client.d.cts +134 -11
  4. package/dist/client.d.mts +134 -11
  5. package/dist/client.mjs +6 -0
  6. package/dist/client.mjs.map +1 -1
  7. package/dist/generated/mapi/types-aliased.gen.d.cts +2 -2
  8. package/dist/generated/mapi/types-aliased.gen.d.mts +2 -2
  9. package/dist/generated/mapi/types.gen.d.cts +2 -2
  10. package/dist/generated/mapi/types.gen.d.mts +2 -2
  11. package/dist/generated/types/block.d.cts +6 -0
  12. package/dist/generated/types/block.d.mts +6 -0
  13. package/dist/generated/types/field.d.cts +53 -18
  14. package/dist/generated/types/field.d.mts +53 -18
  15. package/dist/generated/types/mapi-story.d.cts +6 -6
  16. package/dist/generated/types/mapi-story.d.mts +6 -6
  17. package/dist/index.d.cts +4 -1
  18. package/dist/index.d.mts +4 -1
  19. package/dist/resources/assets.cjs +1 -0
  20. package/dist/resources/assets.cjs.map +1 -1
  21. package/dist/resources/assets.mjs +1 -1
  22. package/dist/resources/assets.mjs.map +1 -1
  23. package/dist/resources/datasource-entries.cjs +2 -1
  24. package/dist/resources/datasource-entries.cjs.map +1 -1
  25. package/dist/resources/datasource-entries.mjs +2 -1
  26. package/dist/resources/datasource-entries.mjs.map +1 -1
  27. package/dist/resources/shared-asset-folders.cjs +81 -0
  28. package/dist/resources/shared-asset-folders.cjs.map +1 -0
  29. package/dist/resources/shared-asset-folders.d.cts +41 -0
  30. package/dist/resources/shared-asset-folders.d.mts +41 -0
  31. package/dist/resources/shared-asset-folders.mjs +81 -0
  32. package/dist/resources/shared-asset-folders.mjs.map +1 -0
  33. package/dist/resources/shared-assets.cjs +197 -0
  34. package/dist/resources/shared-assets.cjs.map +1 -0
  35. package/dist/resources/shared-assets.d.cts +29 -0
  36. package/dist/resources/shared-assets.d.mts +28 -0
  37. package/dist/resources/shared-assets.mjs +197 -0
  38. package/dist/resources/shared-assets.mjs.map +1 -0
  39. package/dist/resources/shared-internal-tags.cjs +73 -0
  40. package/dist/resources/shared-internal-tags.cjs.map +1 -0
  41. package/dist/resources/shared-internal-tags.d.cts +32 -0
  42. package/dist/resources/shared-internal-tags.d.mts +32 -0
  43. package/dist/resources/shared-internal-tags.mjs +73 -0
  44. package/dist/resources/shared-internal-tags.mjs.map +1 -0
  45. package/dist/resources/stories.cjs.map +1 -1
  46. package/dist/resources/stories.d.cts +26 -26
  47. package/dist/resources/stories.d.mts +26 -26
  48. package/dist/resources/stories.mjs.map +1 -1
  49. package/package.json +3 -3
  50. package/playground/integration-tests/test/types/stories.test-d.ts +39 -2
@@ -181,7 +181,7 @@ type ComponentCreate = {
181
181
  /**
182
182
  * UUID
183
183
  */
184
- component_group_uuid?: string;
184
+ component_group_uuid?: string | null;
185
185
  /**
186
186
  * Component color for UI display
187
187
  */
@@ -266,7 +266,7 @@ type ComponentUpdate = {
266
266
  /**
267
267
  * UUID
268
268
  */
269
- component_group_uuid?: string;
269
+ component_group_uuid?: string | null;
270
270
  /**
271
271
  * Component color for UI display
272
272
  */
@@ -94,7 +94,7 @@ type ComponentCreateRequest = {
94
94
  /**
95
95
  * UUID
96
96
  */
97
- component_group_uuid?: string;
97
+ component_group_uuid?: string | null;
98
98
  /**
99
99
  * Component color for UI display
100
100
  */
@@ -193,7 +193,7 @@ type ComponentUpdateRequest = {
193
193
  /**
194
194
  * UUID
195
195
  */
196
- component_group_uuid?: string;
196
+ component_group_uuid?: string | null;
197
197
  /**
198
198
  * Component color for UI display
199
199
  */
@@ -94,7 +94,7 @@ type ComponentCreateRequest = {
94
94
  /**
95
95
  * UUID
96
96
  */
97
- component_group_uuid?: string;
97
+ component_group_uuid?: string | null;
98
98
  /**
99
99
  * Component color for UI display
100
100
  */
@@ -193,7 +193,7 @@ type ComponentUpdateRequest = {
193
193
  /**
194
194
  * UUID
195
195
  */
196
- component_group_uuid?: string;
196
+ component_group_uuid?: string | null;
197
197
  /**
198
198
  * Component color for UI display
199
199
  */
@@ -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
  interface FieldTypeValueMap {
49
49
  text: string;
50
50
  textarea: string;
@@ -69,19 +69,54 @@ type IsNestable<T> = T extends {
69
69
  } ? false : T extends {
70
70
  is_nestable: true;
71
71
  } ? true : true;
72
+ type AllowEntry = string | {
73
+ folder: string;
74
+ };
75
+ /**
76
+ * Keeps `TBlock` when its `folder` is `TFolder` or any nested subfolder (mirrors
77
+ * the editor's `isAnywhereInFolder`). This is a best-effort compile-time check,
78
+ * compared case-insensitively via `Lowercase` so `folder: 'blog'` and a `Blog`
79
+ * folder ref narrow the same. TypeScript cannot replicate the CLI's full slug at
80
+ * the type level, so separator/symbol drift (`'My Layout'` vs `'my-layout'`) is
81
+ * only reconciled at push/validate time — full folder identity is enforced
82
+ * there, not here. To rely on narrowing, prefer a `defineFolder` ref over a
83
+ * string path on both the block's `folder` and the field's `allow`: a shared ref
84
+ * carries the exact path on both sides, so no drift is possible.
85
+ */
86
+ type MatchesFolder<TBlock, TFolder extends string> = TBlock extends {
87
+ folder: infer BF extends string;
88
+ } ? Lowercase<BF> extends Lowercase<TFolder> | `${Lowercase<TFolder>}/${string}` ? TBlock : never : never;
72
89
  type ApplyAllow<TField, TBlocks> = TField extends {
73
- allow: ReadonlyArray<infer TAllowed extends string>;
74
- } ? Extract<TBlocks, {
90
+ allow: ReadonlyArray<infer TAllowed extends AllowEntry>;
91
+ } ? TAllowed extends string ? Extract<TBlocks, {
75
92
  name: TAllowed;
76
- }> : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
93
+ }> : TAllowed extends {
94
+ folder: infer F extends string;
95
+ } ? TBlocks extends any ? MatchesFolder<TBlocks, F> : never : never : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
96
+ /**
97
+ * Resolves a `custom` field to its registered plugin value. When the field's
98
+ * `field_type` is a key of `TFieldPlugins`, the validator output is merged with
99
+ * the plugin envelope (`plugin`, optional `_uid`); otherwise it falls back to
100
+ * the untyped {@link PluginFieldValue}. Same shape for read and write.
101
+ */
102
+ type ResolveCustom<TField, TFieldPlugins> = TField extends {
103
+ field_type: infer F extends string;
104
+ } ? F extends keyof TFieldPlugins ? Prettify<TFieldPlugins[F] & {
105
+ plugin: string;
106
+ _uid?: string;
107
+ }> : PluginFieldValue : PluginFieldValue;
77
108
  /** Resolves a field definition to its runtime content value type (read). */
78
- type FieldValue<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
109
+ type FieldValue<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
79
110
  type: 'bloks';
80
- } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentBase[] : FieldTypeValueMap[TField['type']]>;
111
+ } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentBase[] : TField extends {
112
+ type: 'custom';
113
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
81
114
  /** Resolves a field definition to its input value type (write). */
82
- type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
115
+ type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
83
116
  type: 'bloks';
84
- } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentInputBase[] : FieldTypeValueMap[TField['type']]>;
117
+ } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentInputBase[] : TField extends {
118
+ type: 'custom';
119
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
85
120
  //#endregion
86
121
  export { BlockContent, BlockContentInput, BlocksFieldValue };
87
122
  //# 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
  interface FieldTypeValueMap {
49
49
  text: string;
50
50
  textarea: string;
@@ -69,19 +69,54 @@ type IsNestable<T> = T extends {
69
69
  } ? false : T extends {
70
70
  is_nestable: true;
71
71
  } ? true : true;
72
+ type AllowEntry = string | {
73
+ folder: string;
74
+ };
75
+ /**
76
+ * Keeps `TBlock` when its `folder` is `TFolder` or any nested subfolder (mirrors
77
+ * the editor's `isAnywhereInFolder`). This is a best-effort compile-time check,
78
+ * compared case-insensitively via `Lowercase` so `folder: 'blog'` and a `Blog`
79
+ * folder ref narrow the same. TypeScript cannot replicate the CLI's full slug at
80
+ * the type level, so separator/symbol drift (`'My Layout'` vs `'my-layout'`) is
81
+ * only reconciled at push/validate time — full folder identity is enforced
82
+ * there, not here. To rely on narrowing, prefer a `defineFolder` ref over a
83
+ * string path on both the block's `folder` and the field's `allow`: a shared ref
84
+ * carries the exact path on both sides, so no drift is possible.
85
+ */
86
+ type MatchesFolder<TBlock, TFolder extends string> = TBlock extends {
87
+ folder: infer BF extends string;
88
+ } ? Lowercase<BF> extends Lowercase<TFolder> | `${Lowercase<TFolder>}/${string}` ? TBlock : never : never;
72
89
  type ApplyAllow<TField, TBlocks> = TField extends {
73
- allow: ReadonlyArray<infer TAllowed extends string>;
74
- } ? Extract<TBlocks, {
90
+ allow: ReadonlyArray<infer TAllowed extends AllowEntry>;
91
+ } ? TAllowed extends string ? Extract<TBlocks, {
75
92
  name: TAllowed;
76
- }> : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
93
+ }> : TAllowed extends {
94
+ folder: infer F extends string;
95
+ } ? TBlocks extends any ? MatchesFolder<TBlocks, F> : never : never : TBlocks extends any ? IsNestable<TBlocks> extends true ? TBlocks : never : never;
96
+ /**
97
+ * Resolves a `custom` field to its registered plugin value. When the field's
98
+ * `field_type` is a key of `TFieldPlugins`, the validator output is merged with
99
+ * the plugin envelope (`plugin`, optional `_uid`); otherwise it falls back to
100
+ * the untyped {@link PluginFieldValue}. Same shape for read and write.
101
+ */
102
+ type ResolveCustom<TField, TFieldPlugins> = TField extends {
103
+ field_type: infer F extends string;
104
+ } ? F extends keyof TFieldPlugins ? Prettify<TFieldPlugins[F] & {
105
+ plugin: string;
106
+ _uid?: string;
107
+ }> : PluginFieldValue : PluginFieldValue;
77
108
  /** Resolves a field definition to its runtime content value type (read). */
78
- type FieldValue<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
109
+ type FieldValue<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
79
110
  type: 'bloks';
80
- } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentBase[] : FieldTypeValueMap[TField['type']]>;
111
+ } ? [TBlocks] extends [never] ? BlockContentBase[] : [TBlocks] extends [Block] ? BlockContent<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentBase[] : TField extends {
112
+ type: 'custom';
113
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
81
114
  /** Resolves a field definition to its input value type (write). */
82
- type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks> = Prettify<TField extends {
115
+ type FieldValueInput<TField extends Field = Field, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = Prettify<TField extends {
83
116
  type: 'bloks';
84
- } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks>[] : BlockContentInputBase[] : FieldTypeValueMap[TField['type']]>;
117
+ } ? [TBlocks] extends [never] ? BlockContentInputBase[] : [TBlocks] extends [Block] ? BlockContentInput<ApplyAllow<TField, TBlocks>, TBlocks, TFieldPlugins>[] : BlockContentInputBase[] : TField extends {
118
+ type: 'custom';
119
+ } ? ResolveCustom<TField, TFieldPlugins> : FieldTypeValueMap[TField['type']]>;
85
120
  //#endregion
86
121
  export { BlockContent, BlockContentInput, BlocksFieldValue };
87
122
  //# sourceMappingURL=field.d.mts.map
@@ -14,16 +14,16 @@ 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$1 | StoryUpdate$1, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
- content: TStory extends StoryCreate$1 | StoryUpdate$1 ? BlockContentInput<TBlock, TBlocks> : BlockContent<TBlock, TBlocks>;
17
+ type MapiStoryWithSchemaContent<TStory extends MapiStory$1 | StoryCreate$1 | StoryUpdate$1, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
+ content: TStory extends StoryCreate$1 | StoryUpdate$1 ? BlockContentInput<TBlock, TBlocks, TFieldPlugins> : BlockContent<TBlock, TBlocks, TFieldPlugins>;
19
19
  }>;
20
- type MakeMapiStory<TStory extends MapiStory$1 | StoryCreate$1 | StoryUpdate$1, 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$1 | StoryUpdate$1, 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
  /** Payload for creating a story via the MAPI. */
24
- type StoryCreate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = MakeMapiStory<StoryCreate$1, TBlockOrBlocks, TBlocks>;
24
+ type StoryCreate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = MakeMapiStory<StoryCreate$1, TBlockOrBlocks, TFieldPlugins, TBlocks>;
25
25
  /** Payload for updating a story via the MAPI. */
26
- type StoryUpdate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = MakeMapiStory<StoryUpdate$1, TBlockOrBlocks, TBlocks>;
26
+ type StoryUpdate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = MakeMapiStory<StoryUpdate$1, TBlockOrBlocks, TFieldPlugins, TBlocks>;
27
27
  //#endregion
28
28
  export { MapiStory, StoryCreate, StoryUpdate };
29
29
  //# sourceMappingURL=mapi-story.d.cts.map
@@ -14,16 +14,16 @@ 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$1 | StoryUpdate$1, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
- content: TStory extends StoryCreate$1 | StoryUpdate$1 ? BlockContentInput<TBlock, TBlocks> : BlockContent<TBlock, TBlocks>;
17
+ type MapiStoryWithSchemaContent<TStory extends MapiStory$1 | StoryCreate$1 | StoryUpdate$1, TBlock extends RootBlock = RootBlock, TBlocks = NoBlocks, TFieldPlugins = Record<never, never>> = RootBlock extends TBlock ? TStory : Override<TStory, {
18
+ content: TStory extends StoryCreate$1 | StoryUpdate$1 ? BlockContentInput<TBlock, TBlocks, TFieldPlugins> : BlockContent<TBlock, TBlocks, TFieldPlugins>;
19
19
  }>;
20
- type MakeMapiStory<TStory extends MapiStory$1 | StoryCreate$1 | StoryUpdate$1, 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$1 | StoryUpdate$1, 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
  /** Payload for creating a story via the MAPI. */
24
- type StoryCreate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = MakeMapiStory<StoryCreate$1, TBlockOrBlocks, TBlocks>;
24
+ type StoryCreate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = MakeMapiStory<StoryCreate$1, TBlockOrBlocks, TFieldPlugins, TBlocks>;
25
25
  /** Payload for updating a story via the MAPI. */
26
- type StoryUpdate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TBlocks = NoBlocks> = MakeMapiStory<StoryUpdate$1, TBlockOrBlocks, TBlocks>;
26
+ type StoryUpdate<TBlockOrBlocks extends RootBlock | Block = RootBlock, TFieldPlugins = Record<never, never>, TBlocks = NoBlocks> = MakeMapiStory<StoryUpdate$1, TBlockOrBlocks, TFieldPlugins, TBlocks>;
27
27
  //#endregion
28
28
  export { MapiStory, StoryCreate, StoryUpdate };
29
29
  //# sourceMappingURL=mapi-story.d.mts.map
package/dist/index.d.cts CHANGED
@@ -9,6 +9,9 @@ import { BlockContent, BlockContentInput, BlocksFieldValue } from "./generated/t
9
9
  import { MapiStory, StoryCreate, StoryUpdate } from "./generated/types/mapi-story.cjs";
10
10
  import { StoryListQuery } from "./resources/stories.cjs";
11
11
  import { ApiResponse, FetchOptions, HttpRequestOptions, ManagementApiClient, ManagementApiClientConfig, MapiResourceDeps, RequestConfigOverrides, createManagementApiClient } from "./client.cjs";
12
+ import { AccessLevel, AssetFolderAccess, SharedAssetFolder, SharedAssetFolderCreate, SharedAssetFolderGetResponse, SharedAssetFolderListResponse, SharedAssetFolderUpdate } from "./resources/shared-asset-folders.cjs";
13
+ import { SharedAssetCreate, SharedAssetListQuery, SharedAssetListResponse, SharedAssetUploadRequest } from "./resources/shared-assets.cjs";
14
+ import { SharedInternalTag, SharedInternalTagCreate, SharedInternalTagListQuery, SharedInternalTagListResponse, SharedInternalTagMutateResponse, SharedInternalTagObjectType } from "./resources/shared-internal-tags.cjs";
12
15
  import { SpaceCreateQuery } from "./resources/spaces.cjs";
13
16
  import { normalizeAssetUrl } from "./utils/normalize-asset-url.cjs";
14
- export { type ApiErrorBody, type ApiResponse, type Asset, type AssetCreate, type AssetFieldValue, type AssetFolder, type AssetFolderCreate, type AssetFolderUpdate, type AssetListQuery, type AssetUpdate, type AssetUpdateRequest, type AssetCreate$1 as AssetUploadRequest, type BlockContent as BlokContent, type BlockContentInput as BlokContentInput, type BlocksFieldValue as BloksFieldValue, ClientError, type Component, type ComponentCreate, type ComponentFolder, type ComponentFolderCreate, type ComponentFolderUpdate, type ComponentUpdate, type MapiDatasource as Datasource, type DatasourceCreate, type MapiDatasourceEntry as DatasourceEntry, type DatasourceUpdate, type FetchOptions, type Field, type HttpRequestOptions, type InternalTag, type InternalTagCreate, type InternalTagUpdate, type ManagementApiClient, type ManagementApiClientConfig, type MapiResourceDeps, type MultilinkFieldValue, type PluginFieldValue, type Preset, type PresetCreate, type PresetUpdate, type RateLimitConfig, type RequestConfigOverrides, type RichtextFieldValue, type RootBlock as RootComponents, type CreateAsset as SignedResponseObject, type Space, type SpaceCreate, type SpaceCreateQuery, type SpaceDetail, type SpaceUpdate, type MapiStory as Story, type StoryCreate, type StoryListQuery, type StoryLocalizedPath, type StoryTranslatedSlug, type StoryUpdate, type TableFieldValue, type User, type UserUpdate, createManagementApiClient, normalizeAssetUrl };
17
+ export { type AccessLevel, type ApiErrorBody, type ApiResponse, type Asset, type AssetCreate, type AssetFieldValue, type AssetFolder, type AssetFolderAccess, type AssetFolderCreate, type AssetFolderUpdate, type AssetListQuery, type AssetUpdate, type AssetUpdateRequest, type AssetCreate$1 as AssetUploadRequest, type BlockContent as BlokContent, type BlockContentInput as BlokContentInput, type BlocksFieldValue as BloksFieldValue, ClientError, type Component, type ComponentCreate, type ComponentFolder, type ComponentFolderCreate, type ComponentFolderUpdate, type ComponentUpdate, type MapiDatasource as Datasource, type DatasourceCreate, type MapiDatasourceEntry as DatasourceEntry, type DatasourceUpdate, type FetchOptions, type Field, type HttpRequestOptions, type InternalTag, type InternalTagCreate, type InternalTagUpdate, type ManagementApiClient, type ManagementApiClientConfig, type MapiResourceDeps, type MultilinkFieldValue, type PluginFieldValue, type Preset, type PresetCreate, type PresetUpdate, type RateLimitConfig, type RequestConfigOverrides, type RichtextFieldValue, type RootBlock as RootComponents, type SharedAssetCreate, type SharedAssetFolder, type SharedAssetFolderCreate, type SharedAssetFolderGetResponse, type SharedAssetFolderListResponse, type SharedAssetFolderUpdate, type SharedAssetListQuery, type SharedAssetListResponse, type SharedAssetUploadRequest, type SharedInternalTag, type SharedInternalTagCreate, type SharedInternalTagListQuery, type SharedInternalTagListResponse, type SharedInternalTagMutateResponse, type SharedInternalTagObjectType, type CreateAsset as SignedResponseObject, type Space, type SpaceCreate, type SpaceCreateQuery, type SpaceDetail, type SpaceUpdate, type MapiStory as Story, type StoryCreate, type StoryListQuery, type StoryLocalizedPath, type StoryTranslatedSlug, type StoryUpdate, type TableFieldValue, type User, type UserUpdate, createManagementApiClient, normalizeAssetUrl };
package/dist/index.d.mts CHANGED
@@ -9,6 +9,9 @@ import { BlockContent, BlockContentInput, BlocksFieldValue } from "./generated/t
9
9
  import { MapiStory, StoryCreate, StoryUpdate } from "./generated/types/mapi-story.mjs";
10
10
  import { StoryListQuery } from "./resources/stories.mjs";
11
11
  import { ApiResponse, FetchOptions, HttpRequestOptions, ManagementApiClient, ManagementApiClientConfig, MapiResourceDeps, RequestConfigOverrides, createManagementApiClient } from "./client.mjs";
12
+ import { AccessLevel, AssetFolderAccess, SharedAssetFolder, SharedAssetFolderCreate, SharedAssetFolderGetResponse, SharedAssetFolderListResponse, SharedAssetFolderUpdate } from "./resources/shared-asset-folders.mjs";
13
+ import { SharedAssetCreate, SharedAssetListQuery, SharedAssetListResponse, SharedAssetUploadRequest } from "./resources/shared-assets.mjs";
14
+ import { SharedInternalTag, SharedInternalTagCreate, SharedInternalTagListQuery, SharedInternalTagListResponse, SharedInternalTagMutateResponse, SharedInternalTagObjectType } from "./resources/shared-internal-tags.mjs";
12
15
  import { SpaceCreateQuery } from "./resources/spaces.mjs";
13
16
  import { normalizeAssetUrl } from "./utils/normalize-asset-url.mjs";
14
- export { type ApiErrorBody, type ApiResponse, type Asset, type AssetCreate, type AssetFieldValue, type AssetFolder, type AssetFolderCreate, type AssetFolderUpdate, type AssetListQuery, type AssetUpdate, type AssetUpdateRequest, type AssetCreate$1 as AssetUploadRequest, type BlockContent as BlokContent, type BlockContentInput as BlokContentInput, type BlocksFieldValue as BloksFieldValue, ClientError, type Component, type ComponentCreate, type ComponentFolder, type ComponentFolderCreate, type ComponentFolderUpdate, type ComponentUpdate, type MapiDatasource as Datasource, type DatasourceCreate, type MapiDatasourceEntry as DatasourceEntry, type DatasourceUpdate, type FetchOptions, type Field, type HttpRequestOptions, type InternalTag, type InternalTagCreate, type InternalTagUpdate, type ManagementApiClient, type ManagementApiClientConfig, type MapiResourceDeps, type MultilinkFieldValue, type PluginFieldValue, type Preset, type PresetCreate, type PresetUpdate, type RateLimitConfig, type RequestConfigOverrides, type RichtextFieldValue, type RootBlock as RootComponents, type CreateAsset as SignedResponseObject, type Space, type SpaceCreate, type SpaceCreateQuery, type SpaceDetail, type SpaceUpdate, type MapiStory as Story, type StoryCreate, type StoryListQuery, type StoryLocalizedPath, type StoryTranslatedSlug, type StoryUpdate, type TableFieldValue, type User, type UserUpdate, createManagementApiClient, normalizeAssetUrl };
17
+ export { type AccessLevel, type ApiErrorBody, type ApiResponse, type Asset, type AssetCreate, type AssetFieldValue, type AssetFolder, type AssetFolderAccess, type AssetFolderCreate, type AssetFolderUpdate, type AssetListQuery, type AssetUpdate, type AssetUpdateRequest, type AssetCreate$1 as AssetUploadRequest, type BlockContent as BlokContent, type BlockContentInput as BlokContentInput, type BlocksFieldValue as BloksFieldValue, ClientError, type Component, type ComponentCreate, type ComponentFolder, type ComponentFolderCreate, type ComponentFolderUpdate, type ComponentUpdate, type MapiDatasource as Datasource, type DatasourceCreate, type MapiDatasourceEntry as DatasourceEntry, type DatasourceUpdate, type FetchOptions, type Field, type HttpRequestOptions, type InternalTag, type InternalTagCreate, type InternalTagUpdate, type ManagementApiClient, type ManagementApiClientConfig, type MapiResourceDeps, type MultilinkFieldValue, type PluginFieldValue, type Preset, type PresetCreate, type PresetUpdate, type RateLimitConfig, type RequestConfigOverrides, type RichtextFieldValue, type RootBlock as RootComponents, type SharedAssetCreate, type SharedAssetFolder, type SharedAssetFolderCreate, type SharedAssetFolderGetResponse, type SharedAssetFolderListResponse, type SharedAssetFolderUpdate, type SharedAssetListQuery, type SharedAssetListResponse, type SharedAssetUploadRequest, type SharedInternalTag, type SharedInternalTagCreate, type SharedInternalTagListQuery, type SharedInternalTagListResponse, type SharedInternalTagMutateResponse, type SharedInternalTagObjectType, type CreateAsset as SignedResponseObject, type Space, type SpaceCreate, type SpaceCreateQuery, type SpaceDetail, type SpaceUpdate, type MapiStory as Story, type StoryCreate, type StoryListQuery, type StoryLocalizedPath, type StoryTranslatedSlug, type StoryUpdate, type TableFieldValue, type User, type UserUpdate, createManagementApiClient, normalizeAssetUrl };
@@ -320,4 +320,5 @@ function createAssetsResource(deps) {
320
320
 
321
321
  //#endregion
322
322
  exports.createAssetsResource = createAssetsResource;
323
+ exports.uploadToS3 = uploadToS3;
323
324
  //# sourceMappingURL=assets.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"assets.cjs","names":["ClientError","resolveSpaceId"],"sources":["../../src/resources/assets.ts"],"sourcesContent":["import * as mapi from '../generated/mapi/sdk.gen';\nimport type {\n BulkDestroyAssetsData,\n BulkDestroyAssetsResponses,\n BulkRestoreAssetsData,\n BulkRestoreAssetsResponses,\n BulkUpdateAssetsData,\n BulkUpdateAssetsResponses,\n CreateAssetData,\n CreateAssetResponses,\n DeleteAssetResponses,\n FinishAssetUploadResponses,\n GetAssetResponses,\n ListAssetsData,\n ListAssetsResponses,\n CreateAsset as SignedResponseObject,\n UpdateAssetData,\n UpdateAssetResponses,\n} from '../generated/mapi/types.gen';\nimport type { Asset } from '../generated/mapi/types-aliased.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\nimport { ClientError } from '../error';\nimport { resolveSpaceId, type SpaceIdPathOverride } from './shared';\n\nexport type AssetListQuery = NonNullable<ListAssetsData['query']>;\n\n/**\n * Return shape of `list()`.\n *\n * The list endpoint serializes rows with MAPI's `IndexAsset` serializer, which\n * is NOT identical to the `ShowAsset` (= `Asset`) shape returned by `get()`:\n * `IndexAsset` omits `file` and `permanently_deleted`. We deliberately surface\n * list rows as `Asset` so consumers work against a single asset type. The lie:\n * `file`/`permanently_deleted` are absent on list rows at runtime — consumers\n * needing those must re-fetch via `get()`.\n */\nexport type ListAssetsResult = Omit<ListAssetsResponses[200], 'assets'> & { assets: Array<Asset> };\n\n/**\n * Fields for initiating an asset upload. Pass this to `upload()` or `create()`\n * alongside a file buffer.\n */\nexport type AssetUploadRequest = {\n /** The desired filename for the asset (e.g. `\"hero.png\"`). */\n short_filename: string;\n} & Partial<Omit<NonNullable<CreateAssetData['query']>, 'filename'>>;\n\n/**\n * Input for `create()`. Combines upload fields with writable metadata.\n */\nexport type AssetCreate = AssetUploadRequest & NonNullable<UpdateAssetData['body']['asset']>;\n\n/** Uploads the file to S3 using the signed fields from step 1. */\nasync function uploadToS3(\n signedResponse: SignedResponseObject,\n file: Blob | ArrayBuffer,\n filename: string,\n): Promise<void> {\n if (!signedResponse.post_url || !signedResponse.fields) {\n throw new ClientError('Invalid signed response: missing post_url or fields', {\n status: 0,\n statusText: 'Invalid signed response',\n data: signedResponse,\n });\n }\n const formData = new FormData();\n for (const [key, value] of Object.entries(signedResponse.fields)) {\n formData.append(key, value as string);\n }\n const contentType = (signedResponse.fields['Content-Type'] as string | undefined) ?? 'application/octet-stream';\n const blob = file instanceof Blob ? file : new Blob([file], { type: contentType });\n formData.append('file', new File([blob], filename, { type: contentType }));\n const response = await fetch(signedResponse.post_url, { method: 'POST', body: formData });\n if (!response.ok) {\n throw new ClientError(`Failed to upload asset to S3: ${response.statusText}`, {\n status: response.status,\n statusText: response.statusText,\n data: undefined,\n });\n }\n}\n\nconst hasDefinedFields = (value: Record<string, unknown> | undefined): boolean =>\n Object.values(value ?? {}).some(v => v !== undefined && v !== null);\n\nexport function createAssetsResource<DefaultThrowOnError extends boolean = false>(deps: MapiResourceDeps<DefaultThrowOnError>) {\n const { client, spaceId, wrapRequest } = deps;\n const getSpaceId = (path?: SpaceIdPathOverride['path']) => resolveSpaceId(spaceId, path);\n\n return {\n list<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query?: ListAssetsData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<ListAssetsResult, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n // `listAssets` returns `IndexAsset` rows; we present them as `Asset` (see `ListAssetsResult`).\n return wrapRequest<ListAssetsResult, ThrowOnError>(() =>\n mapi.listAssets({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Step 1 of the upload flow: requests a signed S3 upload object from MAPI.\n * Returns the S3 `post_url` and form `fields` needed for the actual upload.\n *\n * In most cases, prefer `upload()` or `create()` which handle all three\n * steps automatically.\n */\n signResponseObject<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query: CreateAssetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<CreateAssetResponses[200], ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<CreateAssetResponses[200], ThrowOnError>(() =>\n mapi.createAsset({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Uploads a file to Storyblok (sign → S3 upload → finish) and returns the\n * resulting `Asset`.\n */\n async upload(options: { body: AssetUploadRequest; file: Blob | ArrayBuffer; signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<Asset> {\n const { body, file, signal, path, fetchOptions } = options;\n const { short_filename, ...rest } = body;\n const resolvedSpaceId = getSpaceId(path);\n const kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n const signResult = await wrapRequest<CreateAssetResponses[200], true>(() =>\n mapi.createAsset({ client, path: { space_id: resolvedSpaceId }, query: { filename: short_filename, ...rest }, signal, throwOnError: true, ...kyOpts }), true);\n\n if (!signResult.data.id) {\n throw new Error('Invalid signed response: missing id');\n }\n\n await uploadToS3(signResult.data, file, short_filename);\n\n await wrapRequest<FinishAssetUploadResponses[200], true>(() =>\n mapi.finishAssetUpload({\n client,\n path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n\n const getResult = await wrapRequest<GetAssetResponses[200], true>(() =>\n mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) }, signal, throwOnError: true, ...kyOpts }), true);\n\n return getResult.data;\n },\n /**\n * Creates a new asset with metadata. Performs the full upload flow then\n * applies any provided metadata in a follow-up update call.\n */\n async create(options: { body: AssetCreate; file: Blob | ArrayBuffer; signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<Asset> {\n const { body, file, signal, path, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n const kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n const { short_filename, asset_folder_id, is_private, size, validate_upload, ext_id, ...metadataOnly } = body;\n const asset = await this.upload({\n body: { short_filename, asset_folder_id, is_private, size, validate_upload, ext_id },\n file,\n signal,\n path: { space_id: resolvedSpaceId },\n fetchOptions,\n });\n\n const hasMetadata = Object.values(metadataOnly).some(v => v !== undefined && v !== null);\n if (hasMetadata) {\n await wrapRequest<UpdateAssetResponses[204], true>(() =>\n mapi.updateAsset({\n client,\n path: { space_id: resolvedSpaceId, id: asset.id! },\n body: { asset: metadataOnly },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n const updatedResult = await wrapRequest<GetAssetResponses[200], true>(() =>\n mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: asset.id! }, signal, throwOnError: true, ...kyOpts }), true);\n return updatedResult.data;\n }\n\n return asset;\n },\n get<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<GetAssetResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<GetAssetResponses[200], ThrowOnError>(() =>\n mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Updates an asset's metadata. When `file` and `body.short_filename` are\n * provided, the file is replaced first (sign → S3 → finish), then metadata\n * is updated.\n */\n async update(\n assetId: number,\n options: (\n | { body: UpdateAssetData['body']; file?: undefined }\n | { body: UpdateAssetData['body'] & { short_filename: string }; file: Blob | ArrayBuffer }\n ) & { signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<void> {\n const { body, file, signal, path, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n const kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n if (file !== undefined) {\n const { short_filename, ...assetBody } = body;\n const signResult = await wrapRequest<CreateAssetResponses[200], true>(() =>\n mapi.createAsset({\n client,\n path: { space_id: resolvedSpaceId },\n query: { filename: short_filename },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n\n if (!signResult.data.id) {\n throw new Error('Invalid signed response: missing id');\n }\n\n await uploadToS3(signResult.data, file, short_filename);\n\n await wrapRequest<FinishAssetUploadResponses[200], true>(() =>\n mapi.finishAssetUpload({\n client,\n path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n\n if (hasDefinedFields(assetBody.asset)) {\n await wrapRequest<UpdateAssetResponses[204], true>(() =>\n mapi.updateAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body: assetBody, signal, throwOnError: true, ...kyOpts }), true);\n }\n }\n else {\n await wrapRequest<UpdateAssetResponses[204], true>(() =>\n mapi.updateAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body, signal, throwOnError: true, ...kyOpts }), true);\n }\n },\n delete<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<DeleteAssetResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<DeleteAssetResponses[200], ThrowOnError>(() =>\n mapi.deleteAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n finalize<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<FinishAssetUploadResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<FinishAssetUploadResponses[200], ThrowOnError>(() =>\n mapi.finishAssetUpload({\n client,\n path: { space_id: resolvedSpaceId, id: assetId },\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }), throwOnError);\n },\n /** POST /assets/bulk_destroy: hard-delete many assets in one call. */\n deleteMany<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkDestroyAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkDestroyAssetsResponses[200], ThrowOnError>> {\n const { body, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<BulkDestroyAssetsResponses[200], ThrowOnError>(() =>\n mapi.bulkDestroyAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /** POST /assets/bulk_update: move many assets between folders in one call. */\n bulkMove<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkUpdateAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkUpdateAssetsResponses[200], ThrowOnError>> {\n const { body, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<BulkUpdateAssetsResponses[200], ThrowOnError>(() =>\n mapi.bulkUpdateAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n bulkRestore<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkRestoreAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkRestoreAssetsResponses[200], ThrowOnError>> {\n const { body, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<BulkRestoreAssetsResponses[200], ThrowOnError>(() =>\n mapi.bulkRestoreAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Converts a space-local asset into a shared (org-level) asset.\n *\n * Wraps `POST /v1/spaces/{space_id}/assets/{asset_id}/convert`, which takes\n * the destination folder as the required `target_asset_folder_id` query\n * param and no request body. One-way only (space to org).\n *\n * Not part of the generated SDK, so this issues a raw `client.post`.\n * The response is assumed to match `Asset`.\n */\n convertToShared<ThrowOnError extends boolean = false>(\n assetId: number | string,\n options: { query: { target_asset_folder_id: number }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<ApiResponse<Asset, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<Asset, ThrowOnError>(() =>\n client.post({\n url: '/v1/spaces/{space_id}/assets/{asset_id}/convert',\n path: { space_id: resolvedSpaceId, asset_id: assetId },\n query,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }), throwOnError);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"assets.cjs","names":["ClientError","resolveSpaceId"],"sources":["../../src/resources/assets.ts"],"sourcesContent":["import * as mapi from '../generated/mapi/sdk.gen';\nimport type {\n BulkDestroyAssetsData,\n BulkDestroyAssetsResponses,\n BulkRestoreAssetsData,\n BulkRestoreAssetsResponses,\n BulkUpdateAssetsData,\n BulkUpdateAssetsResponses,\n CreateAssetData,\n CreateAssetResponses,\n DeleteAssetResponses,\n FinishAssetUploadResponses,\n GetAssetResponses,\n ListAssetsData,\n ListAssetsResponses,\n UpdateAssetData,\n UpdateAssetResponses,\n} from '../generated/mapi/types.gen';\nimport type { Asset } from '../generated/mapi/types-aliased.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\nimport { ClientError } from '../error';\nimport { resolveSpaceId, type SpaceIdPathOverride } from './shared';\n\nexport type AssetListQuery = NonNullable<ListAssetsData['query']>;\n\n/**\n * Return shape of `list()`.\n *\n * The list endpoint serializes rows with MAPI's `IndexAsset` serializer, which\n * is NOT identical to the `ShowAsset` (= `Asset`) shape returned by `get()`:\n * `IndexAsset` omits `file` and `permanently_deleted`. We deliberately surface\n * list rows as `Asset` so consumers work against a single asset type. The lie:\n * `file`/`permanently_deleted` are absent on list rows at runtime — consumers\n * needing those must re-fetch via `get()`.\n */\nexport type ListAssetsResult = Omit<ListAssetsResponses[200], 'assets'> & { assets: Array<Asset> };\n\n/**\n * Fields for initiating an asset upload. Pass this to `upload()` or `create()`\n * alongside a file buffer.\n */\nexport type AssetUploadRequest = {\n /** The desired filename for the asset (e.g. `\"hero.png\"`). */\n short_filename: string;\n} & Partial<Omit<NonNullable<CreateAssetData['query']>, 'filename'>>;\n\n/**\n * Input for `create()`. Combines upload fields with writable metadata.\n */\nexport type AssetCreate = AssetUploadRequest & NonNullable<UpdateAssetData['body']['asset']>;\n\n/** Uploads the file to S3 using the signed fields from step 1. */\nexport async function uploadToS3(\n signedResponse: { post_url?: string; fields?: Record<string, unknown> },\n file: Blob | ArrayBuffer,\n filename: string,\n): Promise<void> {\n if (!signedResponse.post_url || !signedResponse.fields) {\n throw new ClientError('Invalid signed response: missing post_url or fields', {\n status: 0,\n statusText: 'Invalid signed response',\n data: signedResponse,\n });\n }\n const formData = new FormData();\n for (const [key, value] of Object.entries(signedResponse.fields)) {\n formData.append(key, value as string);\n }\n const contentType = (signedResponse.fields['Content-Type'] as string | undefined) ?? 'application/octet-stream';\n const blob = file instanceof Blob ? file : new Blob([file], { type: contentType });\n formData.append('file', new File([blob], filename, { type: contentType }));\n const response = await fetch(signedResponse.post_url, { method: 'POST', body: formData });\n if (!response.ok) {\n throw new ClientError(`Failed to upload asset to S3: ${response.statusText}`, {\n status: response.status,\n statusText: response.statusText,\n data: undefined,\n });\n }\n}\n\nconst hasDefinedFields = (value: Record<string, unknown> | undefined): boolean =>\n Object.values(value ?? {}).some(v => v !== undefined && v !== null);\n\nexport function createAssetsResource<DefaultThrowOnError extends boolean = false>(deps: MapiResourceDeps<DefaultThrowOnError>) {\n const { client, spaceId, wrapRequest } = deps;\n const getSpaceId = (path?: SpaceIdPathOverride['path']) => resolveSpaceId(spaceId, path);\n\n return {\n list<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query?: ListAssetsData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<ListAssetsResult, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n // `listAssets` returns `IndexAsset` rows; we present them as `Asset` (see `ListAssetsResult`).\n return wrapRequest<ListAssetsResult, ThrowOnError>(() =>\n mapi.listAssets({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Step 1 of the upload flow: requests a signed S3 upload object from MAPI.\n * Returns the S3 `post_url` and form `fields` needed for the actual upload.\n *\n * In most cases, prefer `upload()` or `create()` which handle all three\n * steps automatically.\n */\n signResponseObject<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query: CreateAssetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<CreateAssetResponses[200], ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<CreateAssetResponses[200], ThrowOnError>(() =>\n mapi.createAsset({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Uploads a file to Storyblok (sign → S3 upload → finish) and returns the\n * resulting `Asset`.\n */\n async upload(options: { body: AssetUploadRequest; file: Blob | ArrayBuffer; signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<Asset> {\n const { body, file, signal, path, fetchOptions } = options;\n const { short_filename, ...rest } = body;\n const resolvedSpaceId = getSpaceId(path);\n const kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n const signResult = await wrapRequest<CreateAssetResponses[200], true>(() =>\n mapi.createAsset({ client, path: { space_id: resolvedSpaceId }, query: { filename: short_filename, ...rest }, signal, throwOnError: true, ...kyOpts }), true);\n\n if (!signResult.data.id) {\n throw new Error('Invalid signed response: missing id');\n }\n\n await uploadToS3(signResult.data, file, short_filename);\n\n await wrapRequest<FinishAssetUploadResponses[200], true>(() =>\n mapi.finishAssetUpload({\n client,\n path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n\n const getResult = await wrapRequest<GetAssetResponses[200], true>(() =>\n mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) }, signal, throwOnError: true, ...kyOpts }), true);\n\n return getResult.data;\n },\n /**\n * Creates a new asset with metadata. Performs the full upload flow then\n * applies any provided metadata in a follow-up update call.\n */\n async create(options: { body: AssetCreate; file: Blob | ArrayBuffer; signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<Asset> {\n const { body, file, signal, path, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n const kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n const { short_filename, asset_folder_id, is_private, size, validate_upload, ext_id, ...metadataOnly } = body;\n const asset = await this.upload({\n body: { short_filename, asset_folder_id, is_private, size, validate_upload, ext_id },\n file,\n signal,\n path: { space_id: resolvedSpaceId },\n fetchOptions,\n });\n\n const hasMetadata = Object.values(metadataOnly).some(v => v !== undefined && v !== null);\n if (hasMetadata) {\n await wrapRequest<UpdateAssetResponses[204], true>(() =>\n mapi.updateAsset({\n client,\n path: { space_id: resolvedSpaceId, id: asset.id! },\n body: { asset: metadataOnly },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n const updatedResult = await wrapRequest<GetAssetResponses[200], true>(() =>\n mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: asset.id! }, signal, throwOnError: true, ...kyOpts }), true);\n return updatedResult.data;\n }\n\n return asset;\n },\n get<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<GetAssetResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<GetAssetResponses[200], ThrowOnError>(() =>\n mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Updates an asset's metadata. When `file` and `body.short_filename` are\n * provided, the file is replaced first (sign → S3 → finish), then metadata\n * is updated.\n */\n async update(\n assetId: number,\n options: (\n | { body: UpdateAssetData['body']; file?: undefined }\n | { body: UpdateAssetData['body'] & { short_filename: string }; file: Blob | ArrayBuffer }\n ) & { signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<void> {\n const { body, file, signal, path, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n const kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n if (file !== undefined) {\n const { short_filename, ...assetBody } = body;\n const signResult = await wrapRequest<CreateAssetResponses[200], true>(() =>\n mapi.createAsset({\n client,\n path: { space_id: resolvedSpaceId },\n query: { filename: short_filename },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n\n if (!signResult.data.id) {\n throw new Error('Invalid signed response: missing id');\n }\n\n await uploadToS3(signResult.data, file, short_filename);\n\n await wrapRequest<FinishAssetUploadResponses[200], true>(() =>\n mapi.finishAssetUpload({\n client,\n path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n signal,\n throwOnError: true,\n ...kyOpts,\n }), true);\n\n if (hasDefinedFields(assetBody.asset)) {\n await wrapRequest<UpdateAssetResponses[204], true>(() =>\n mapi.updateAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body: assetBody, signal, throwOnError: true, ...kyOpts }), true);\n }\n }\n else {\n await wrapRequest<UpdateAssetResponses[204], true>(() =>\n mapi.updateAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body, signal, throwOnError: true, ...kyOpts }), true);\n }\n },\n delete<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<DeleteAssetResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<DeleteAssetResponses[200], ThrowOnError>(() =>\n mapi.deleteAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n finalize<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<FinishAssetUploadResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<FinishAssetUploadResponses[200], ThrowOnError>(() =>\n mapi.finishAssetUpload({\n client,\n path: { space_id: resolvedSpaceId, id: assetId },\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }), throwOnError);\n },\n /** POST /assets/bulk_destroy: hard-delete many assets in one call. */\n deleteMany<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkDestroyAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkDestroyAssetsResponses[200], ThrowOnError>> {\n const { body, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<BulkDestroyAssetsResponses[200], ThrowOnError>(() =>\n mapi.bulkDestroyAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /** POST /assets/bulk_update: move many assets between folders in one call. */\n bulkMove<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkUpdateAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkUpdateAssetsResponses[200], ThrowOnError>> {\n const { body, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<BulkUpdateAssetsResponses[200], ThrowOnError>(() =>\n mapi.bulkUpdateAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n bulkRestore<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkRestoreAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkRestoreAssetsResponses[200], ThrowOnError>> {\n const { body, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<BulkRestoreAssetsResponses[200], ThrowOnError>(() =>\n mapi.bulkRestoreAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n /**\n * Converts a space-local asset into a shared (org-level) asset.\n *\n * Wraps `POST /v1/spaces/{space_id}/assets/{asset_id}/convert`, which takes\n * the destination folder as the required `target_asset_folder_id` query\n * param and no request body. One-way only (space to org).\n *\n * Not part of the generated SDK, so this issues a raw `client.post`.\n * The response is assumed to match `Asset`.\n */\n convertToShared<ThrowOnError extends boolean = false>(\n assetId: number | string,\n options: { query: { target_asset_folder_id: number }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<ApiResponse<Asset, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<Asset, ThrowOnError>(() =>\n client.post({\n url: '/v1/spaces/{space_id}/assets/{asset_id}/convert',\n path: { space_id: resolvedSpaceId, asset_id: assetId },\n query,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }), throwOnError);\n },\n };\n}\n"],"mappings":"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"}
@@ -319,5 +319,5 @@ function createAssetsResource(deps) {
319
319
  }
320
320
 
321
321
  //#endregion
322
- export { createAssetsResource };
322
+ export { createAssetsResource, uploadToS3 };
323
323
  //# sourceMappingURL=assets.mjs.map