@storyblok/migrations 0.1.4 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -271,7 +271,7 @@ function mapRefs(story, options) {
271
271
  parent_id: maps.stories?.get(mappedAlternate.parent_id) ?? mappedAlternate.parent_id
272
272
  };
273
273
  }) : story.alternates;
274
- const parentId = maps.stories?.get(story.parent_id) ?? story.parent_id;
274
+ const parentId = maps.stories?.get(story.parent_id);
275
275
  const mappedContentRaw = story.content?.component ? traverseAndMapBySchema(story.content, {
276
276
  schemas,
277
277
  maps,
@@ -285,7 +285,7 @@ function mapRefs(story, options) {
285
285
  content: mappedContentRaw,
286
286
  id: Number(maps.stories?.get(story.id) ?? story.id),
287
287
  uuid: String(maps.stories?.get(story.uuid) ?? story.uuid),
288
- parent_id: parentId != null ? Number(parentId) : null,
288
+ parent_id: parentId != null ? Number(parentId) : story.parent_id,
289
289
  alternates
290
290
  },
291
291
  processedFields,
@@ -366,11 +366,27 @@ function renameDataSourceValue(story, componentsToUpdate, oldValue, newValue) {
366
366
  //#endregion
367
367
  //#region src/url-to-asset.ts
368
368
  function urlToAsset(url, options) {
369
+ return {
370
+ id: 0,
371
+ filename: url,
372
+ space_id: 0,
373
+ created_at: "",
374
+ updated_at: "",
375
+ short_filename: url.split("/").at(-1) || url,
376
+ content_type: "",
377
+ content_length: 0,
378
+ is_private: false,
379
+ ...options
380
+ };
381
+ }
382
+
383
+ //#endregion
384
+ //#region src/url-to-asset-field.ts
385
+ function urlToAssetField(url, options) {
369
386
  return {
370
387
  fieldtype: "asset",
371
388
  id: 0,
372
389
  filename: url,
373
- src: url,
374
390
  name: url.split("/").at(-1) || url,
375
391
  alt: null,
376
392
  title: null,
@@ -379,13 +395,6 @@ function urlToAsset(url, options) {
379
395
  meta_data: {},
380
396
  source: null,
381
397
  is_external_url: true,
382
- is_private: false,
383
- updated_at: "",
384
- width: null,
385
- height: null,
386
- aspect_ratio: null,
387
- public_id: null,
388
- content_type: "",
389
398
  ...options
390
399
  };
391
400
  }
@@ -396,10 +405,9 @@ function urlToLink(url, options) {
396
405
  if (url.startsWith("mailto:")) return {
397
406
  fieldtype: "multilink",
398
407
  id: "",
399
- url: "",
400
- cached_url: "",
408
+ url: url.slice(7),
409
+ cached_url: url.slice(7),
401
410
  linktype: "email",
402
- email: url.slice(7),
403
411
  ...options
404
412
  };
405
413
  const hashIndex = url.indexOf("#");
@@ -441,5 +449,6 @@ exports.updateLocalComponent = updateLocalComponent;
441
449
  exports.updateLocalDatasource = updateLocalDatasource;
442
450
  exports.updateLocalStory = updateLocalStory;
443
451
  exports.urlToAsset = urlToAsset;
452
+ exports.urlToAssetField = urlToAssetField;
444
453
  exports.urlToLink = urlToLink;
445
454
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/delete-out-of-schema-fields.ts","../src/local-utils.ts","../src/local-assets.ts","../src/local-components.ts","../src/local-datasources.ts","../src/local-stories.ts","../src/map-refs.ts","../src/rename-datasource-value.ts","../src/url-to-asset.ts","../src/url-to-link.ts"],"sourcesContent":["import type { Story } from '@storyblok/management-api-client/resources/stories';\n\nimport type { ComponentSchemas } from './map-refs';\n\nconst SYSTEM_FIELDS = new Set(['_uid', 'component', '_editable']);\n\ninterface RemovedField {\n component: string;\n field: string;\n}\n\nfunction cleanBlok(\n blok: Record<string, unknown>,\n schemaDefinition: ComponentSchemas,\n removedFields: RemovedField[],\n): Record<string, unknown> {\n const componentName = blok.component as string | undefined;\n if (!componentName) {\n return blok;\n }\n\n const schema = schemaDefinition[componentName];\n if (!schema) {\n // Unknown component — leave untouched\n return blok;\n }\n\n const validFieldSet = new Set(Object.keys(schema));\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(blok)) {\n // Always keep system fields\n if (SYSTEM_FIELDS.has(key)) {\n result[key] = value;\n continue;\n }\n\n // Strip i18n suffix to get base field name\n const baseFieldName = key.replace(/__i18n__.*/, '');\n\n // Field not in schema — remove it\n if (!validFieldSet.has(baseFieldName)) {\n removedFields.push({ component: componentName, field: key });\n continue;\n }\n\n // Check if this is an array of bloks (objects with component property)\n const isBlokArray\n = Array.isArray(value)\n && value.some(\n item =>\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component,\n );\n\n if (isBlokArray) {\n // Traverse blok arrays and process nested bloks recursively\n result[key] = (value as unknown[]).map((item) => {\n if (\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component\n ) {\n return cleanBlok(\n item as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n }\n return item;\n });\n }\n else {\n // Valid field — keep it\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport function deleteOutOfSchemaFields(\n story: Story,\n schemaDefinition: ComponentSchemas,\n): { story: Story; removedFields: RemovedField[] } {\n const removedFields: RemovedField[] = [];\n\n if (!story.content) {\n return { story, removedFields };\n }\n\n const newContent = cleanBlok(\n story.content as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n\n return {\n // cleanBlok returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n removedFields,\n };\n}\n","import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { extname, join } from 'pathe';\n\nexport async function readLocalJsonFiles<T>(dir: string): Promise<T[]> {\n let files: string[];\n try {\n files = await readdir(dir);\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n\n const jsonFiles = files.filter(f => extname(f) === '.json');\n\n const items = await Promise.all(\n jsonFiles.map(async (file) => {\n const filePath = join(dir, file);\n const content = await readFile(filePath, 'utf8');\n try {\n return JSON.parse(content) as T;\n }\n catch (error: unknown) {\n throw new Error(\n `Failed to parse ${filePath}: ${(error as Error).message}`,\n );\n }\n }),\n );\n\n return items;\n}\n\nexport async function writeLocalJsonFile(\n dir: string,\n filename: string,\n data: unknown,\n): Promise<void> {\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, filename);\n await writeFile(filePath, JSON.stringify(data, undefined, 2), 'utf8');\n}\n","import type { Asset } from '@storyblok/management-api-client/resources/assets';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getAssetFilename(asset: Pick<Asset, 'id' | 'short_filename'>): string {\n const name = (asset.short_filename || String(asset.id)).replace(\n /\\.[^.]+$/,\n '',\n ); // strip extension\n return `${name}_${asset.id}.json`;\n}\n\nexport async function getLocalAssets(dir: string): Promise<Asset[]> {\n return readLocalJsonFiles<Asset>(dir);\n}\n\nexport async function updateLocalAsset(\n dir: string,\n asset: Asset,\n): Promise<void> {\n await writeLocalJsonFile(dir, getAssetFilename(asset), asset);\n}\n","import type { Component } from '@storyblok/management-api-client/resources/components';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getComponentFilename(component: Pick<Component, 'name'>): string {\n return `${component.name}.json`;\n}\n\nexport async function getLocalComponents(dir: string): Promise<Component[]> {\n return readLocalJsonFiles<Component>(dir);\n}\n\nexport async function updateLocalComponent(\n dir: string,\n component: Component,\n): Promise<void> {\n await writeLocalJsonFile(dir, getComponentFilename(component), component);\n}\n","import type { Datasource } from '@storyblok/management-api-client/resources/datasources';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getDatasourceFilename(\n datasource: Pick<Datasource, 'slug' | 'id'>,\n): string {\n return `${datasource.slug}_${datasource.id}.json`;\n}\n\nexport async function getLocalDatasources(dir: string): Promise<Datasource[]> {\n return readLocalJsonFiles<Datasource>(dir);\n}\n\nexport async function updateLocalDatasource(\n dir: string,\n datasource: Datasource,\n): Promise<void> {\n await writeLocalJsonFile(dir, getDatasourceFilename(datasource), datasource);\n}\n\nexport type { Datasource };\n","import type { Story } from '@storyblok/management-api-client/resources/stories';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getStoryFilename(story: Pick<Story, 'slug' | 'uuid'>): string {\n return `${story.slug}_${story.uuid}.json`;\n}\n\nexport async function getLocalStories(dir: string): Promise<Story[]> {\n return readLocalJsonFiles<Story>(dir);\n}\n\nexport async function updateLocalStory(\n dir: string,\n story: Story,\n): Promise<void> {\n await writeLocalJsonFile(dir, getStoryFilename(story), story);\n}\n","import type { Component } from '@storyblok/management-api-client/resources/components';\nimport type { Story } from '@storyblok/management-api-client/resources/stories';\n\nexport interface RefMaps {\n assets?: Map<unknown, string | number>;\n stories?: Map<unknown, string | number>;\n users?: Map<unknown, string | number>;\n tags?: Map<unknown, string | number>;\n datasources?: Map<unknown, string | number>;\n}\n\nexport type ComponentSchemas = Record<\n string,\n Record<string, { type: string; source?: string }>\n>;\n\nexport interface MapRefsOptions {\n schemas: ComponentSchemas;\n maps: RefMaps;\n}\n\ntype ProcessedFields = Set<Component['schema']>;\ntype MissingSchemas = Set<Component['name']>;\ntype UnknownRecord = Record<string, unknown>;\n\ntype RefMapper = (\n data: unknown,\n options: {\n schema: Component['schema'];\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n) => unknown;\n\ntype FieldRefMappers = Record<string, RefMapper>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): UnknownRecord {\n return isRecord(value) ? value : {};\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nconst traverseAndMapBySchema = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (!isRecord(data) || typeof data.component !== 'string') {\n return data ?? {};\n }\n\n const schema = schemas[data.component];\n if (!schema) {\n missingSchemas.add(data.component);\n return data;\n }\n\n const dataNew: UnknownRecord = { ...data };\n\n for (const [fieldName, fieldValue] of Object.entries(data)) {\n const fieldSchema = schema[\n fieldName.replace(/__i18n__.*/, '')\n ] as Component['schema'];\n const fieldType\n = fieldSchema\n && typeof fieldSchema === 'object'\n && 'type' in fieldSchema\n && fieldSchema.type;\n const fieldRefMapper\n = typeof fieldType === 'string' && fieldRefMappers[fieldType];\n\n if (fieldSchema) {\n processedFields.add(fieldSchema);\n }\n\n if (fieldRefMapper) {\n dataNew[fieldName] = fieldRefMapper(fieldValue, {\n schema: fieldSchema,\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n }\n\n return dataNew;\n};\n\nconst traverseAndMapRichtextDoc = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (Array.isArray(data)) {\n return data.map(item =>\n traverseAndMapRichtextDoc(item, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n }\n\n if (isRecord(data)) {\n if (data.type === 'link' && asRecord(data.attrs).linktype === 'story') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n uuid:\n maps.stories?.get(asRecord(data.attrs).uuid)\n ?? asRecord(data.attrs).uuid,\n },\n };\n }\n\n if (data.type === 'blok') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n body: asArray(asRecord(data.attrs).body).map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n ),\n },\n };\n }\n\n const newData: UnknownRecord = {};\n for (const [k, value] of Object.entries(data)) {\n newData[k] = traverseAndMapRichtextDoc(value, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n\n return newData;\n }\n\n return data;\n};\n\nconst richtextFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) =>\n traverseAndMapRichtextDoc(data, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n\nconst multilinkFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data) || data.linktype !== 'story') {\n return data;\n }\n\n return {\n ...data,\n id: maps.stories?.get(data.id) ?? data.id,\n };\n};\n\nconst bloksFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid bloks field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n};\n\nconst assetFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data)) {\n return data;\n }\n\n const newId\n = typeof data.id === 'number' ? maps.assets?.get(data.id) : undefined;\n return newId === undefined ? data : { ...data, id: newId };\n};\n\nconst multiassetFieldRefMapper: RefMapper = (data, options) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid multiasset field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d => assetFieldRefMapper(d, options));\n};\n\nconst optionsFieldRefMapper: RefMapper = (data, { schema, maps }) => {\n if (!Array.isArray(data)) {\n return data;\n }\n\n const sourceMapBySchema: Record<\n string,\n Map<unknown, string | number> | undefined\n > = {\n internal_stories: maps.stories,\n internal_users: maps.users,\n internal_tags: maps.tags,\n internal_datasources: maps.datasources,\n };\n\n const sourceMap\n = sourceMapBySchema[(schema as { source?: string }).source ?? ''];\n if (!sourceMap) {\n return data;\n }\n\n return data.map(d => sourceMap.get(d) ?? d);\n};\n\nconst fieldRefMappers = {\n asset: assetFieldRefMapper,\n bloks: bloksFieldRefMapper,\n multiasset: multiassetFieldRefMapper,\n multilink: multilinkFieldRefMapper,\n options: optionsFieldRefMapper,\n richtext: richtextFieldRefMapper,\n} as const;\n\nexport function mapRefs(\n story: Story,\n options: MapRefsOptions,\n): {\n mappedStory: Story;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n } {\n const { schemas, maps } = options;\n const processedFields: ProcessedFields = new Set();\n const missingSchemas: MissingSchemas = new Set();\n\n const alternatesRaw = story.alternates\n ? (story.alternates as Required<Story>['alternates']).map((alternate) => {\n const mappedAlternate = asRecord(alternate);\n return {\n ...mappedAlternate,\n id: maps.stories?.get(mappedAlternate.id) ?? mappedAlternate.id,\n parent_id:\n maps.stories?.get(mappedAlternate.parent_id)\n ?? mappedAlternate.parent_id,\n };\n })\n : story.alternates;\n // mapped ids may be string|number at runtime but shape is compatible\n const alternates = alternatesRaw as Story['alternates'];\n\n const parentId = maps.stories?.get(story.parent_id) ?? story.parent_id;\n const mappedContentRaw = story.content?.component\n ? traverseAndMapBySchema(story.content, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n })\n : story.content;\n\n const mappedStory = {\n ...story,\n // traverseAndMapBySchema returns unknown; runtime shape satisfies Blok\n content: mappedContentRaw as unknown as Story['content'],\n id: Number(maps.stories?.get(story.id) ?? story.id),\n uuid: String(maps.stories?.get(story.uuid) ?? story.uuid),\n parent_id: parentId != null ? Number(parentId) : null,\n alternates,\n } satisfies Story;\n\n return {\n mappedStory,\n processedFields,\n missingSchemas,\n };\n}\n","import type { Story } from '@storyblok/management-api-client/resources/stories';\n\ninterface ComponentToUpdate {\n field: string;\n name: string;\n}\n\ninterface Change {\n component: string;\n field: string;\n path: string;\n}\n\nfunction traverseRichtext(\n data: unknown,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): unknown {\n if (Array.isArray(data)) {\n return data.map((item, index) =>\n traverseRichtext(item, componentsToUpdate, oldValue, newValue, changes, `${path}[${index}]`),\n );\n }\n\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const record = data as Record<string, unknown>;\n\n if (record.type === 'blok' && record.attrs && typeof record.attrs === 'object') {\n const attrs = record.attrs as Record<string, unknown>;\n if (Array.isArray(attrs.body)) {\n return {\n ...record,\n attrs: {\n ...attrs,\n body: attrs.body.map((item: unknown, index: number) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.attrs.body[${index}]`,\n );\n }\n return item;\n }),\n },\n };\n }\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n return result;\n }\n\n return data;\n}\n\nfunction traverseObject(\n obj: Record<string, unknown>,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): Record<string, unknown> {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj;\n }\n\n const result = { ...obj };\n const componentName = obj.component as string | undefined;\n\n if (componentName) {\n for (const { field, name } of componentsToUpdate) {\n if (name !== componentName) {\n continue;\n }\n\n const fieldValue = result[field];\n\n if (typeof fieldValue === 'string' && fieldValue === oldValue) {\n result[field] = newValue;\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}`,\n });\n }\n else if (Array.isArray(fieldValue)) {\n const newArray = fieldValue.map((item) => {\n if (item === oldValue) {\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}[]`,\n });\n return newValue;\n }\n return item;\n });\n result[field] = newArray;\n }\n }\n }\n\n // Traverse nested arrays (bloks fields) and richtext fields\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item, index) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.${key}[${index}]`,\n );\n }\n return item;\n });\n }\n else if (\n value\n && typeof value === 'object'\n && !Array.isArray(value)\n && (value as Record<string, unknown>).type === 'doc'\n && Array.isArray((value as Record<string, unknown>).content)\n ) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n }\n\n return result;\n}\n\nexport function renameDataSourceValue(\n story: Story,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n): { story: Story; changes: Change[] } {\n const changes: Change[] = [];\n\n const newContent = traverseObject(\n story.content as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n 'content',\n );\n\n return {\n // traverseObject returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n changes,\n };\n}\n","import type { StoryblokAsset } from './types';\n\nexport interface UrlToAssetOptions {\n alt?: string | null;\n title?: string | null;\n copyright?: string | null;\n focus?: string | null;\n}\n\nexport function urlToAsset(\n url: string,\n options?: UrlToAssetOptions,\n): StoryblokAsset {\n // Derive name from last path segment\n const pathSegments = url.split('/');\n const name = pathSegments.at(-1) || url;\n\n return {\n fieldtype: 'asset',\n id: 0,\n filename: url,\n src: url,\n name,\n alt: null,\n title: null,\n copyright: null,\n focus: null,\n meta_data: {},\n source: null,\n is_external_url: true,\n is_private: false,\n updated_at: '',\n width: null,\n height: null,\n aspect_ratio: null,\n public_id: null,\n content_type: '',\n ...options,\n };\n}\n","import type { StoryblokMultilink } from './types';\n\nexport interface UrlToLinkOptions {\n target?: '_blank' | '_self';\n title?: string;\n rel?: string;\n anchor?: string;\n}\n\nexport function urlToLink(\n url: string,\n options?: UrlToLinkOptions,\n): StoryblokMultilink {\n // Detect mailto: links\n if (url.startsWith('mailto:')) {\n return {\n fieldtype: 'multilink',\n id: '',\n url: '',\n cached_url: '',\n linktype: 'email',\n email: url.slice('mailto:'.length),\n ...options,\n };\n }\n\n // Extract anchor from fragment\n const hashIndex = url.indexOf('#');\n const anchor = hashIndex === -1 ? undefined : url.slice(hashIndex + 1);\n const cleanUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);\n\n return {\n fieldtype: 'multilink',\n id: '',\n url: cleanUrl,\n cached_url: cleanUrl,\n linktype: 'url',\n ...(anchor ? { anchor } : {}),\n ...options,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/delete-out-of-schema-fields.ts","../src/local-utils.ts","../src/local-assets.ts","../src/local-components.ts","../src/local-datasources.ts","../src/local-stories.ts","../src/map-refs.ts","../src/rename-datasource-value.ts","../src/url-to-asset.ts","../src/url-to-asset-field.ts","../src/url-to-link.ts"],"sourcesContent":["import type { Story } from './types';\n\nimport type { ComponentSchemas } from './map-refs';\n\nconst SYSTEM_FIELDS = new Set(['_uid', 'component', '_editable']);\n\ninterface RemovedField {\n component: string;\n field: string;\n}\n\nfunction cleanBlok(\n blok: Record<string, unknown>,\n schemaDefinition: ComponentSchemas,\n removedFields: RemovedField[],\n): Record<string, unknown> {\n const componentName = blok.component as string | undefined;\n if (!componentName) {\n return blok;\n }\n\n const schema = schemaDefinition[componentName];\n if (!schema) {\n // Unknown component — leave untouched\n return blok;\n }\n\n const validFieldSet = new Set(Object.keys(schema));\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(blok)) {\n // Always keep system fields\n if (SYSTEM_FIELDS.has(key)) {\n result[key] = value;\n continue;\n }\n\n // Strip i18n suffix to get base field name\n const baseFieldName = key.replace(/__i18n__.*/, '');\n\n // Field not in schema — remove it\n if (!validFieldSet.has(baseFieldName)) {\n removedFields.push({ component: componentName, field: key });\n continue;\n }\n\n // Check if this is an array of bloks (objects with component property)\n const isBlokArray\n = Array.isArray(value)\n && value.some(\n item =>\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component,\n );\n\n if (isBlokArray) {\n // Traverse blok arrays and process nested bloks recursively\n result[key] = (value as unknown[]).map((item) => {\n if (\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component\n ) {\n return cleanBlok(\n item as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n }\n return item;\n });\n }\n else {\n // Valid field — keep it\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport function deleteOutOfSchemaFields(\n story: Story,\n schemaDefinition: ComponentSchemas,\n): { story: Story; removedFields: RemovedField[] } {\n const removedFields: RemovedField[] = [];\n\n if (!story.content) {\n return { story, removedFields };\n }\n\n const newContent = cleanBlok(\n story.content as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n\n return {\n // cleanBlok returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n removedFields,\n };\n}\n","import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { extname, join } from 'pathe';\n\nexport async function readLocalJsonFiles<T>(dir: string): Promise<T[]> {\n let files: string[];\n try {\n files = await readdir(dir);\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n\n const jsonFiles = files.filter(f => extname(f) === '.json');\n\n const items = await Promise.all(\n jsonFiles.map(async (file) => {\n const filePath = join(dir, file);\n const content = await readFile(filePath, 'utf8');\n try {\n return JSON.parse(content) as T;\n }\n catch (error: unknown) {\n throw new Error(\n `Failed to parse ${filePath}: ${(error as Error).message}`,\n );\n }\n }),\n );\n\n return items;\n}\n\nexport async function writeLocalJsonFile(\n dir: string,\n filename: string,\n data: unknown,\n): Promise<void> {\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, filename);\n await writeFile(filePath, JSON.stringify(data, undefined, 2), 'utf8');\n}\n","import type { Asset } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getAssetFilename(asset: Pick<Asset, 'id' | 'short_filename'>): string {\n const name = (asset.short_filename || String(asset.id)).replace(\n /\\.[^.]+$/,\n '',\n ); // strip extension\n return `${name}_${asset.id}.json`;\n}\n\nexport async function getLocalAssets(dir: string): Promise<Asset[]> {\n return readLocalJsonFiles<Asset>(dir);\n}\n\nexport async function updateLocalAsset(\n dir: string,\n asset: Asset,\n): Promise<void> {\n await writeLocalJsonFile(dir, getAssetFilename(asset), asset);\n}\n","import type { Component } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getComponentFilename(component: Pick<Component, 'name'>): string {\n return `${component.name}.json`;\n}\n\nexport async function getLocalComponents(dir: string): Promise<Component[]> {\n return readLocalJsonFiles<Component>(dir);\n}\n\nexport async function updateLocalComponent(\n dir: string,\n component: Component,\n): Promise<void> {\n await writeLocalJsonFile(dir, getComponentFilename(component), component);\n}\n","import type { Datasource } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getDatasourceFilename(\n datasource: Pick<Datasource, 'slug' | 'id'>,\n): string {\n return `${datasource.slug}_${datasource.id}.json`;\n}\n\nexport async function getLocalDatasources(dir: string): Promise<Datasource[]> {\n return readLocalJsonFiles<Datasource>(dir);\n}\n\nexport async function updateLocalDatasource(\n dir: string,\n datasource: Datasource,\n): Promise<void> {\n await writeLocalJsonFile(dir, getDatasourceFilename(datasource), datasource);\n}\n\nexport type { Datasource };\n","import type { Story } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getStoryFilename(story: Pick<Story, 'slug' | 'uuid'>): string {\n return `${story.slug}_${story.uuid}.json`;\n}\n\nexport async function getLocalStories(dir: string): Promise<Story[]> {\n return readLocalJsonFiles<Story>(dir);\n}\n\nexport async function updateLocalStory(\n dir: string,\n story: Story,\n): Promise<void> {\n await writeLocalJsonFile(dir, getStoryFilename(story), story);\n}\n","import type { Component, Story } from './types';\n\nexport interface RefMaps {\n assets?: Map<unknown, string | number>;\n stories?: Map<unknown, string | number>;\n users?: Map<unknown, string | number>;\n tags?: Map<unknown, string | number>;\n datasources?: Map<unknown, string | number>;\n}\n\nexport type ComponentSchemas = Record<\n string,\n Record<string, { type: string; source?: string }>\n>;\n\nexport interface MapRefsOptions {\n schemas: ComponentSchemas;\n maps: RefMaps;\n}\n\ntype ProcessedFields = Set<Component['schema']>;\ntype MissingSchemas = Set<Component['name']>;\ntype UnknownRecord = Record<string, unknown>;\n\ntype RefMapper = (\n data: unknown,\n options: {\n schema: Component['schema'];\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n) => unknown;\n\ntype FieldRefMappers = Record<string, RefMapper>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): UnknownRecord {\n return isRecord(value) ? value : {};\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nconst traverseAndMapBySchema = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (!isRecord(data) || typeof data.component !== 'string') {\n return data ?? {};\n }\n\n const schema = schemas[data.component];\n if (!schema) {\n missingSchemas.add(data.component);\n return data;\n }\n\n const dataNew: UnknownRecord = { ...data };\n\n for (const [fieldName, fieldValue] of Object.entries(data)) {\n const fieldSchema = schema[\n fieldName.replace(/__i18n__.*/, '')\n ] as Component['schema'];\n const fieldType\n = fieldSchema\n && typeof fieldSchema === 'object'\n && 'type' in fieldSchema\n && fieldSchema.type;\n const fieldRefMapper\n = typeof fieldType === 'string' && fieldRefMappers[fieldType];\n\n if (fieldSchema) {\n processedFields.add(fieldSchema);\n }\n\n if (fieldRefMapper) {\n dataNew[fieldName] = fieldRefMapper(fieldValue, {\n schema: fieldSchema,\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n }\n\n return dataNew;\n};\n\nconst traverseAndMapRichtextDoc = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (Array.isArray(data)) {\n return data.map(item =>\n traverseAndMapRichtextDoc(item, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n }\n\n if (isRecord(data)) {\n if (data.type === 'link' && asRecord(data.attrs).linktype === 'story') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n uuid:\n maps.stories?.get(asRecord(data.attrs).uuid)\n ?? asRecord(data.attrs).uuid,\n },\n };\n }\n\n if (data.type === 'blok') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n body: asArray(asRecord(data.attrs).body).map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n ),\n },\n };\n }\n\n const newData: UnknownRecord = {};\n for (const [k, value] of Object.entries(data)) {\n newData[k] = traverseAndMapRichtextDoc(value, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n\n return newData;\n }\n\n return data;\n};\n\nconst richtextFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) =>\n traverseAndMapRichtextDoc(data, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n\nconst multilinkFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data) || data.linktype !== 'story') {\n return data;\n }\n\n return {\n ...data,\n id: maps.stories?.get(data.id) ?? data.id,\n };\n};\n\nconst bloksFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid bloks field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n};\n\nconst assetFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data)) {\n return data;\n }\n\n const newId\n = typeof data.id === 'number' ? maps.assets?.get(data.id) : undefined;\n return newId === undefined ? data : { ...data, id: newId };\n};\n\nconst multiassetFieldRefMapper: RefMapper = (data, options) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid multiasset field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d => assetFieldRefMapper(d, options));\n};\n\nconst optionsFieldRefMapper: RefMapper = (data, { schema, maps }) => {\n if (!Array.isArray(data)) {\n return data;\n }\n\n const sourceMapBySchema: Record<\n string,\n Map<unknown, string | number> | undefined\n > = {\n internal_stories: maps.stories,\n internal_users: maps.users,\n internal_tags: maps.tags,\n internal_datasources: maps.datasources,\n };\n\n const sourceMap\n = sourceMapBySchema[(schema as { source?: string }).source ?? ''];\n if (!sourceMap) {\n return data;\n }\n\n return data.map(d => sourceMap.get(d) ?? d);\n};\n\nconst fieldRefMappers = {\n asset: assetFieldRefMapper,\n bloks: bloksFieldRefMapper,\n multiasset: multiassetFieldRefMapper,\n multilink: multilinkFieldRefMapper,\n options: optionsFieldRefMapper,\n richtext: richtextFieldRefMapper,\n} as const;\n\nexport function mapRefs(\n story: Story,\n options: MapRefsOptions,\n): {\n mappedStory: Story;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n } {\n const { schemas, maps } = options;\n const processedFields: ProcessedFields = new Set();\n const missingSchemas: MissingSchemas = new Set();\n\n const alternatesRaw = story.alternates\n ? (story.alternates as Required<Story>['alternates']).map((alternate) => {\n const mappedAlternate = asRecord(alternate);\n return {\n ...mappedAlternate,\n id: maps.stories?.get(mappedAlternate.id) ?? mappedAlternate.id,\n parent_id:\n maps.stories?.get(mappedAlternate.parent_id)\n ?? mappedAlternate.parent_id,\n };\n })\n : story.alternates;\n // mapped ids may be string|number at runtime but shape is compatible\n const alternates = alternatesRaw as Story['alternates'];\n\n const parentId = maps.stories?.get(story.parent_id);\n const mappedContentRaw = story.content?.component\n ? traverseAndMapBySchema(story.content, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n })\n : story.content;\n\n const mappedStory = {\n ...story,\n // traverseAndMapBySchema returns unknown; runtime shape satisfies Blok\n content: mappedContentRaw as unknown as Story['content'],\n id: Number(maps.stories?.get(story.id) ?? story.id),\n uuid: String(maps.stories?.get(story.uuid) ?? story.uuid),\n parent_id: parentId != null ? Number(parentId) : story.parent_id,\n alternates,\n } satisfies Story;\n\n return {\n mappedStory,\n processedFields,\n missingSchemas,\n };\n}\n","import type { Story } from './types';\n\ninterface ComponentToUpdate {\n field: string;\n name: string;\n}\n\ninterface Change {\n component: string;\n field: string;\n path: string;\n}\n\nfunction traverseRichtext(\n data: unknown,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): unknown {\n if (Array.isArray(data)) {\n return data.map((item, index) =>\n traverseRichtext(item, componentsToUpdate, oldValue, newValue, changes, `${path}[${index}]`),\n );\n }\n\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const record = data as Record<string, unknown>;\n\n if (record.type === 'blok' && record.attrs && typeof record.attrs === 'object') {\n const attrs = record.attrs as Record<string, unknown>;\n if (Array.isArray(attrs.body)) {\n return {\n ...record,\n attrs: {\n ...attrs,\n body: attrs.body.map((item: unknown, index: number) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.attrs.body[${index}]`,\n );\n }\n return item;\n }),\n },\n };\n }\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n return result;\n }\n\n return data;\n}\n\nfunction traverseObject(\n obj: Record<string, unknown>,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): Record<string, unknown> {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj;\n }\n\n const result = { ...obj };\n const componentName = obj.component as string | undefined;\n\n if (componentName) {\n for (const { field, name } of componentsToUpdate) {\n if (name !== componentName) {\n continue;\n }\n\n const fieldValue = result[field];\n\n if (typeof fieldValue === 'string' && fieldValue === oldValue) {\n result[field] = newValue;\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}`,\n });\n }\n else if (Array.isArray(fieldValue)) {\n const newArray = fieldValue.map((item) => {\n if (item === oldValue) {\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}[]`,\n });\n return newValue;\n }\n return item;\n });\n result[field] = newArray;\n }\n }\n }\n\n // Traverse nested arrays (bloks fields) and richtext fields\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item, index) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.${key}[${index}]`,\n );\n }\n return item;\n });\n }\n else if (\n value\n && typeof value === 'object'\n && !Array.isArray(value)\n && (value as Record<string, unknown>).type === 'doc'\n && Array.isArray((value as Record<string, unknown>).content)\n ) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n }\n\n return result;\n}\n\nexport function renameDataSourceValue(\n story: Story,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n): { story: Story; changes: Change[] } {\n const changes: Change[] = [];\n\n const newContent = traverseObject(\n story.content as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n 'content',\n );\n\n return {\n // traverseObject returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n changes,\n };\n}\n","import type { Asset } from './types';\n\nexport type UrlToAssetOptions = Partial<Omit<Asset, 'id' | 'filename' | 'space_id' | 'created_at' | 'updated_at' | 'short_filename' | 'content_type' | 'content_length'>>;\n\nexport function urlToAsset(\n url: string,\n options?: UrlToAssetOptions,\n): Asset {\n // Derive name from last path segment\n const pathSegments = url.split('/');\n const short_filename = pathSegments.at(-1) || url;\n\n return {\n id: 0,\n filename: url,\n space_id: 0,\n created_at: '',\n updated_at: '',\n short_filename,\n content_type: '',\n content_length: 0,\n is_private: false,\n ...options,\n };\n}\n","import type { AssetField } from './types';\n\nexport type UrlToAssetFieldOptions = Partial<Omit<AssetField, 'fieldtype' | 'filename' | 'id'>>;\n\nexport function urlToAssetField(\n url: string,\n options?: UrlToAssetFieldOptions,\n): AssetField {\n // Derive name from last path segment\n const pathSegments = url.split('/');\n const name = pathSegments.at(-1) || url;\n\n return {\n fieldtype: 'asset',\n id: 0,\n filename: url,\n name,\n alt: null,\n title: null,\n copyright: null,\n focus: null,\n meta_data: {},\n source: null,\n is_external_url: true,\n ...options,\n };\n}\n","import type { MultilinkField } from './types';\n\nexport type UrlToLinkOptions = Partial<Omit<MultilinkField, 'fieldtype' | 'id' | 'url' | 'cached_url' | 'linktype'>>;\n\nexport function urlToLink(\n url: string,\n options?: UrlToLinkOptions,\n): MultilinkField {\n // Detect mailto: links\n if (url.startsWith('mailto:')) {\n return {\n fieldtype: 'multilink',\n id: '',\n url: url.slice('mailto:'.length),\n cached_url: url.slice('mailto:'.length),\n linktype: 'email',\n ...options,\n };\n }\n\n // Extract anchor from fragment\n const hashIndex = url.indexOf('#');\n const anchor = hashIndex === -1 ? undefined : url.slice(hashIndex + 1);\n const cleanUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);\n\n return {\n fieldtype: 'multilink',\n id: '',\n url: cleanUrl,\n cached_url: cleanUrl,\n linktype: 'url',\n ...(anchor ? { anchor } : {}),\n ...options,\n };\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,4 @@
1
- import { Story } from "@storyblok/management-api-client/resources/stories";
2
- import { Component } from "@storyblok/management-api-client/resources/components";
3
- import { Asset } from "@storyblok/management-api-client/resources/assets";
4
- import { Datasource } from "@storyblok/management-api-client/resources/datasources";
1
+ import { Asset, AssetField, Component, Datasource, MultilinkField, RichtextField, Story, TableField } from "@storyblok/management-api-client";
5
2
  import { htmlToStoryblokRichtext } from "@storyblok/richtext/html-parser";
6
3
  import { markdownToStoryblokRichtext } from "@storyblok/richtext/markdown-parser";
7
4
 
@@ -70,134 +67,17 @@ declare function renameDataSourceValue(story: Story, componentsToUpdate: Compone
70
67
  changes: Change[];
71
68
  };
72
69
  //#endregion
73
- //#region src/types.d.ts
74
- type StoryblokPropertyType = 'asset' | 'multiasset' | 'multilink' | 'table' | 'richtext';
75
- interface StoryblokAsset {
76
- alt: string | null;
77
- copyright: string | null;
78
- fieldtype: 'asset';
79
- id: number;
80
- filename: string | null;
81
- name: string;
82
- title: string | null;
83
- focus: string | null;
84
- meta_data: Record<string, any>;
85
- source: string | null;
86
- is_external_url: boolean;
87
- is_private: boolean;
88
- src: string;
89
- updated_at: string;
90
- width: number | null;
91
- height: number | null;
92
- aspect_ratio: number | null;
93
- public_id: string | null;
94
- content_type: string;
95
- }
96
- type StoryblokMultiasset = StoryblokAsset[];
97
- interface StoryblokMultilinkStory {
98
- name: string;
99
- created_at: string;
100
- published_at: string;
101
- id: number;
102
- uuid: string;
103
- content: Record<string, any>;
104
- slug: string;
105
- full_slug: string;
106
- sort_by_date?: string;
107
- position?: number;
108
- tag_list?: string[];
109
- is_startpage?: boolean;
110
- parent_id?: number | null;
111
- meta_data?: Record<string, any> | null;
112
- group_id?: string;
113
- first_published_at?: string;
114
- release_id?: number | null;
115
- lang?: string;
116
- path?: string | null;
117
- alternates?: any[];
118
- default_full_slug?: string | null;
119
- translated_slugs?: any[] | null;
120
- }
121
- interface StoryblokMultilinkLink {
122
- id: number;
123
- uuid: string;
124
- slug: string;
125
- path: string | null;
126
- parent_id: number;
127
- name: string;
128
- is_folder: boolean;
129
- published: boolean;
130
- is_startpage: boolean;
131
- position: number;
132
- real_path: string;
133
- }
134
- interface StoryblokMultilinkUrl {
135
- name: string;
136
- id: number;
137
- uuid: string;
138
- slug: string;
139
- url: string;
140
- full_slug: string;
141
- }
142
- interface StoryblokMultilink {
143
- fieldtype: 'multilink';
144
- id: string;
145
- url: string;
146
- cached_url: string;
147
- target?: '_blank' | '_self';
148
- anchor?: string;
149
- rel?: string;
150
- title?: string;
151
- prep?: string;
152
- linktype: 'story' | 'url' | 'email' | 'asset';
153
- story?: StoryblokMultilinkStory | StoryblokMultilinkLink | StoryblokMultilinkUrl;
154
- email?: string;
155
- }
156
- interface StoryblokTable {
157
- fieldtype: 'table';
158
- thead: Array<{
159
- _uid: string;
160
- value: string;
161
- component: '_table_head';
162
- _editable?: string;
163
- }>;
164
- tbody: Array<{
165
- _uid: string;
166
- component: '_table_row';
167
- _editable?: string;
168
- body: Array<{
169
- _uid: string;
170
- value: string;
171
- component: '_table_col';
172
- _editable?: string;
173
- }>;
174
- }>;
175
- }
176
- interface StoryblokRichtext {
177
- type: string;
178
- content?: StoryblokRichtext[];
179
- marks?: StoryblokRichtext[];
180
- attrs?: Record<string, any>;
181
- text?: string;
182
- }
183
- //#endregion
184
70
  //#region src/url-to-asset.d.ts
185
- interface UrlToAssetOptions {
186
- alt?: string | null;
187
- title?: string | null;
188
- copyright?: string | null;
189
- focus?: string | null;
190
- }
191
- declare function urlToAsset(url: string, options?: UrlToAssetOptions): StoryblokAsset;
71
+ type UrlToAssetOptions = Partial<Omit<Asset, 'id' | 'filename' | 'space_id' | 'created_at' | 'updated_at' | 'short_filename' | 'content_type' | 'content_length'>>;
72
+ declare function urlToAsset(url: string, options?: UrlToAssetOptions): Asset;
73
+ //#endregion
74
+ //#region src/url-to-asset-field.d.ts
75
+ type UrlToAssetFieldOptions = Partial<Omit<AssetField, 'fieldtype' | 'filename' | 'id'>>;
76
+ declare function urlToAssetField(url: string, options?: UrlToAssetFieldOptions): AssetField;
192
77
  //#endregion
193
78
  //#region src/url-to-link.d.ts
194
- interface UrlToLinkOptions {
195
- target?: '_blank' | '_self';
196
- title?: string;
197
- rel?: string;
198
- anchor?: string;
199
- }
200
- declare function urlToLink(url: string, options?: UrlToLinkOptions): StoryblokMultilink;
79
+ type UrlToLinkOptions = Partial<Omit<MultilinkField, 'fieldtype' | 'id' | 'url' | 'cached_url' | 'linktype'>>;
80
+ declare function urlToLink(url: string, options?: UrlToLinkOptions): MultilinkField;
201
81
  //#endregion
202
- export { type ComponentSchemas, type Datasource, type MapRefsOptions, type RefMaps, StoryblokAsset, StoryblokMultiasset, StoryblokMultilink, StoryblokMultilinkLink, StoryblokMultilinkStory, StoryblokMultilinkUrl, StoryblokPropertyType, StoryblokRichtext, StoryblokTable, type UrlToAssetOptions, type UrlToLinkOptions, deleteOutOfSchemaFields, getLocalAssets, getLocalComponents, getLocalDatasources, getLocalStories, htmlToStoryblokRichtext, mapRefs, markdownToStoryblokRichtext, renameDataSourceValue, updateLocalAsset, updateLocalComponent, updateLocalDatasource, updateLocalStory, urlToAsset, urlToLink };
82
+ export { type Asset, type AssetField, type Component, type ComponentSchemas, type Datasource, type MapRefsOptions, type MultilinkField, type RefMaps, type RichtextField, type Story, type TableField, type UrlToAssetFieldOptions, type UrlToAssetOptions, type UrlToLinkOptions, deleteOutOfSchemaFields, getLocalAssets, getLocalComponents, getLocalDatasources, getLocalStories, htmlToStoryblokRichtext, mapRefs, markdownToStoryblokRichtext, renameDataSourceValue, updateLocalAsset, updateLocalComponent, updateLocalDatasource, updateLocalStory, urlToAsset, urlToAssetField, urlToLink };
203
83
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -1,9 +1,6 @@
1
1
  import { htmlToStoryblokRichtext } from "@storyblok/richtext/html-parser";
2
2
  import { markdownToStoryblokRichtext } from "@storyblok/richtext/markdown-parser";
3
- import { Story } from "@storyblok/management-api-client/resources/stories";
4
- import { Component } from "@storyblok/management-api-client/resources/components";
5
- import { Asset } from "@storyblok/management-api-client/resources/assets";
6
- import { Datasource } from "@storyblok/management-api-client/resources/datasources";
3
+ import { Asset, AssetField, Component, Datasource, MultilinkField, RichtextField, Story, TableField } from "@storyblok/management-api-client";
7
4
 
8
5
  //#region src/map-refs.d.ts
9
6
  interface RefMaps {
@@ -70,134 +67,17 @@ declare function renameDataSourceValue(story: Story, componentsToUpdate: Compone
70
67
  changes: Change[];
71
68
  };
72
69
  //#endregion
73
- //#region src/types.d.ts
74
- type StoryblokPropertyType = 'asset' | 'multiasset' | 'multilink' | 'table' | 'richtext';
75
- interface StoryblokAsset {
76
- alt: string | null;
77
- copyright: string | null;
78
- fieldtype: 'asset';
79
- id: number;
80
- filename: string | null;
81
- name: string;
82
- title: string | null;
83
- focus: string | null;
84
- meta_data: Record<string, any>;
85
- source: string | null;
86
- is_external_url: boolean;
87
- is_private: boolean;
88
- src: string;
89
- updated_at: string;
90
- width: number | null;
91
- height: number | null;
92
- aspect_ratio: number | null;
93
- public_id: string | null;
94
- content_type: string;
95
- }
96
- type StoryblokMultiasset = StoryblokAsset[];
97
- interface StoryblokMultilinkStory {
98
- name: string;
99
- created_at: string;
100
- published_at: string;
101
- id: number;
102
- uuid: string;
103
- content: Record<string, any>;
104
- slug: string;
105
- full_slug: string;
106
- sort_by_date?: string;
107
- position?: number;
108
- tag_list?: string[];
109
- is_startpage?: boolean;
110
- parent_id?: number | null;
111
- meta_data?: Record<string, any> | null;
112
- group_id?: string;
113
- first_published_at?: string;
114
- release_id?: number | null;
115
- lang?: string;
116
- path?: string | null;
117
- alternates?: any[];
118
- default_full_slug?: string | null;
119
- translated_slugs?: any[] | null;
120
- }
121
- interface StoryblokMultilinkLink {
122
- id: number;
123
- uuid: string;
124
- slug: string;
125
- path: string | null;
126
- parent_id: number;
127
- name: string;
128
- is_folder: boolean;
129
- published: boolean;
130
- is_startpage: boolean;
131
- position: number;
132
- real_path: string;
133
- }
134
- interface StoryblokMultilinkUrl {
135
- name: string;
136
- id: number;
137
- uuid: string;
138
- slug: string;
139
- url: string;
140
- full_slug: string;
141
- }
142
- interface StoryblokMultilink {
143
- fieldtype: 'multilink';
144
- id: string;
145
- url: string;
146
- cached_url: string;
147
- target?: '_blank' | '_self';
148
- anchor?: string;
149
- rel?: string;
150
- title?: string;
151
- prep?: string;
152
- linktype: 'story' | 'url' | 'email' | 'asset';
153
- story?: StoryblokMultilinkStory | StoryblokMultilinkLink | StoryblokMultilinkUrl;
154
- email?: string;
155
- }
156
- interface StoryblokTable {
157
- fieldtype: 'table';
158
- thead: Array<{
159
- _uid: string;
160
- value: string;
161
- component: '_table_head';
162
- _editable?: string;
163
- }>;
164
- tbody: Array<{
165
- _uid: string;
166
- component: '_table_row';
167
- _editable?: string;
168
- body: Array<{
169
- _uid: string;
170
- value: string;
171
- component: '_table_col';
172
- _editable?: string;
173
- }>;
174
- }>;
175
- }
176
- interface StoryblokRichtext {
177
- type: string;
178
- content?: StoryblokRichtext[];
179
- marks?: StoryblokRichtext[];
180
- attrs?: Record<string, any>;
181
- text?: string;
182
- }
183
- //#endregion
184
70
  //#region src/url-to-asset.d.ts
185
- interface UrlToAssetOptions {
186
- alt?: string | null;
187
- title?: string | null;
188
- copyright?: string | null;
189
- focus?: string | null;
190
- }
191
- declare function urlToAsset(url: string, options?: UrlToAssetOptions): StoryblokAsset;
71
+ type UrlToAssetOptions = Partial<Omit<Asset, 'id' | 'filename' | 'space_id' | 'created_at' | 'updated_at' | 'short_filename' | 'content_type' | 'content_length'>>;
72
+ declare function urlToAsset(url: string, options?: UrlToAssetOptions): Asset;
73
+ //#endregion
74
+ //#region src/url-to-asset-field.d.ts
75
+ type UrlToAssetFieldOptions = Partial<Omit<AssetField, 'fieldtype' | 'filename' | 'id'>>;
76
+ declare function urlToAssetField(url: string, options?: UrlToAssetFieldOptions): AssetField;
192
77
  //#endregion
193
78
  //#region src/url-to-link.d.ts
194
- interface UrlToLinkOptions {
195
- target?: '_blank' | '_self';
196
- title?: string;
197
- rel?: string;
198
- anchor?: string;
199
- }
200
- declare function urlToLink(url: string, options?: UrlToLinkOptions): StoryblokMultilink;
79
+ type UrlToLinkOptions = Partial<Omit<MultilinkField, 'fieldtype' | 'id' | 'url' | 'cached_url' | 'linktype'>>;
80
+ declare function urlToLink(url: string, options?: UrlToLinkOptions): MultilinkField;
201
81
  //#endregion
202
- export { type ComponentSchemas, type Datasource, type MapRefsOptions, type RefMaps, StoryblokAsset, StoryblokMultiasset, StoryblokMultilink, StoryblokMultilinkLink, StoryblokMultilinkStory, StoryblokMultilinkUrl, StoryblokPropertyType, StoryblokRichtext, StoryblokTable, type UrlToAssetOptions, type UrlToLinkOptions, deleteOutOfSchemaFields, getLocalAssets, getLocalComponents, getLocalDatasources, getLocalStories, htmlToStoryblokRichtext, mapRefs, markdownToStoryblokRichtext, renameDataSourceValue, updateLocalAsset, updateLocalComponent, updateLocalDatasource, updateLocalStory, urlToAsset, urlToLink };
82
+ export { type Asset, type AssetField, type Component, type ComponentSchemas, type Datasource, type MapRefsOptions, type MultilinkField, type RefMaps, type RichtextField, type Story, type TableField, type UrlToAssetFieldOptions, type UrlToAssetOptions, type UrlToLinkOptions, deleteOutOfSchemaFields, getLocalAssets, getLocalComponents, getLocalDatasources, getLocalStories, htmlToStoryblokRichtext, mapRefs, markdownToStoryblokRichtext, renameDataSourceValue, updateLocalAsset, updateLocalComponent, updateLocalDatasource, updateLocalStory, urlToAsset, urlToAssetField, urlToLink };
203
83
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -270,7 +270,7 @@ function mapRefs(story, options) {
270
270
  parent_id: maps.stories?.get(mappedAlternate.parent_id) ?? mappedAlternate.parent_id
271
271
  };
272
272
  }) : story.alternates;
273
- const parentId = maps.stories?.get(story.parent_id) ?? story.parent_id;
273
+ const parentId = maps.stories?.get(story.parent_id);
274
274
  const mappedContentRaw = story.content?.component ? traverseAndMapBySchema(story.content, {
275
275
  schemas,
276
276
  maps,
@@ -284,7 +284,7 @@ function mapRefs(story, options) {
284
284
  content: mappedContentRaw,
285
285
  id: Number(maps.stories?.get(story.id) ?? story.id),
286
286
  uuid: String(maps.stories?.get(story.uuid) ?? story.uuid),
287
- parent_id: parentId != null ? Number(parentId) : null,
287
+ parent_id: parentId != null ? Number(parentId) : story.parent_id,
288
288
  alternates
289
289
  },
290
290
  processedFields,
@@ -365,11 +365,27 @@ function renameDataSourceValue(story, componentsToUpdate, oldValue, newValue) {
365
365
  //#endregion
366
366
  //#region src/url-to-asset.ts
367
367
  function urlToAsset(url, options) {
368
+ return {
369
+ id: 0,
370
+ filename: url,
371
+ space_id: 0,
372
+ created_at: "",
373
+ updated_at: "",
374
+ short_filename: url.split("/").at(-1) || url,
375
+ content_type: "",
376
+ content_length: 0,
377
+ is_private: false,
378
+ ...options
379
+ };
380
+ }
381
+
382
+ //#endregion
383
+ //#region src/url-to-asset-field.ts
384
+ function urlToAssetField(url, options) {
368
385
  return {
369
386
  fieldtype: "asset",
370
387
  id: 0,
371
388
  filename: url,
372
- src: url,
373
389
  name: url.split("/").at(-1) || url,
374
390
  alt: null,
375
391
  title: null,
@@ -378,13 +394,6 @@ function urlToAsset(url, options) {
378
394
  meta_data: {},
379
395
  source: null,
380
396
  is_external_url: true,
381
- is_private: false,
382
- updated_at: "",
383
- width: null,
384
- height: null,
385
- aspect_ratio: null,
386
- public_id: null,
387
- content_type: "",
388
397
  ...options
389
398
  };
390
399
  }
@@ -395,10 +404,9 @@ function urlToLink(url, options) {
395
404
  if (url.startsWith("mailto:")) return {
396
405
  fieldtype: "multilink",
397
406
  id: "",
398
- url: "",
399
- cached_url: "",
407
+ url: url.slice(7),
408
+ cached_url: url.slice(7),
400
409
  linktype: "email",
401
- email: url.slice(7),
402
410
  ...options
403
411
  };
404
412
  const hashIndex = url.indexOf("#");
@@ -416,5 +424,5 @@ function urlToLink(url, options) {
416
424
  }
417
425
 
418
426
  //#endregion
419
- export { deleteOutOfSchemaFields, getLocalAssets, getLocalComponents, getLocalDatasources, getLocalStories, htmlToStoryblokRichtext, mapRefs, markdownToStoryblokRichtext, renameDataSourceValue, updateLocalAsset, updateLocalComponent, updateLocalDatasource, updateLocalStory, urlToAsset, urlToLink };
427
+ export { deleteOutOfSchemaFields, getLocalAssets, getLocalComponents, getLocalDatasources, getLocalStories, htmlToStoryblokRichtext, mapRefs, markdownToStoryblokRichtext, renameDataSourceValue, updateLocalAsset, updateLocalComponent, updateLocalDatasource, updateLocalStory, urlToAsset, urlToAssetField, urlToLink };
420
428
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/delete-out-of-schema-fields.ts","../src/local-utils.ts","../src/local-assets.ts","../src/local-components.ts","../src/local-datasources.ts","../src/local-stories.ts","../src/map-refs.ts","../src/rename-datasource-value.ts","../src/url-to-asset.ts","../src/url-to-link.ts"],"sourcesContent":["import type { Story } from '@storyblok/management-api-client/resources/stories';\n\nimport type { ComponentSchemas } from './map-refs';\n\nconst SYSTEM_FIELDS = new Set(['_uid', 'component', '_editable']);\n\ninterface RemovedField {\n component: string;\n field: string;\n}\n\nfunction cleanBlok(\n blok: Record<string, unknown>,\n schemaDefinition: ComponentSchemas,\n removedFields: RemovedField[],\n): Record<string, unknown> {\n const componentName = blok.component as string | undefined;\n if (!componentName) {\n return blok;\n }\n\n const schema = schemaDefinition[componentName];\n if (!schema) {\n // Unknown component — leave untouched\n return blok;\n }\n\n const validFieldSet = new Set(Object.keys(schema));\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(blok)) {\n // Always keep system fields\n if (SYSTEM_FIELDS.has(key)) {\n result[key] = value;\n continue;\n }\n\n // Strip i18n suffix to get base field name\n const baseFieldName = key.replace(/__i18n__.*/, '');\n\n // Field not in schema — remove it\n if (!validFieldSet.has(baseFieldName)) {\n removedFields.push({ component: componentName, field: key });\n continue;\n }\n\n // Check if this is an array of bloks (objects with component property)\n const isBlokArray\n = Array.isArray(value)\n && value.some(\n item =>\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component,\n );\n\n if (isBlokArray) {\n // Traverse blok arrays and process nested bloks recursively\n result[key] = (value as unknown[]).map((item) => {\n if (\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component\n ) {\n return cleanBlok(\n item as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n }\n return item;\n });\n }\n else {\n // Valid field — keep it\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport function deleteOutOfSchemaFields(\n story: Story,\n schemaDefinition: ComponentSchemas,\n): { story: Story; removedFields: RemovedField[] } {\n const removedFields: RemovedField[] = [];\n\n if (!story.content) {\n return { story, removedFields };\n }\n\n const newContent = cleanBlok(\n story.content as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n\n return {\n // cleanBlok returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n removedFields,\n };\n}\n","import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { extname, join } from 'pathe';\n\nexport async function readLocalJsonFiles<T>(dir: string): Promise<T[]> {\n let files: string[];\n try {\n files = await readdir(dir);\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n\n const jsonFiles = files.filter(f => extname(f) === '.json');\n\n const items = await Promise.all(\n jsonFiles.map(async (file) => {\n const filePath = join(dir, file);\n const content = await readFile(filePath, 'utf8');\n try {\n return JSON.parse(content) as T;\n }\n catch (error: unknown) {\n throw new Error(\n `Failed to parse ${filePath}: ${(error as Error).message}`,\n );\n }\n }),\n );\n\n return items;\n}\n\nexport async function writeLocalJsonFile(\n dir: string,\n filename: string,\n data: unknown,\n): Promise<void> {\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, filename);\n await writeFile(filePath, JSON.stringify(data, undefined, 2), 'utf8');\n}\n","import type { Asset } from '@storyblok/management-api-client/resources/assets';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getAssetFilename(asset: Pick<Asset, 'id' | 'short_filename'>): string {\n const name = (asset.short_filename || String(asset.id)).replace(\n /\\.[^.]+$/,\n '',\n ); // strip extension\n return `${name}_${asset.id}.json`;\n}\n\nexport async function getLocalAssets(dir: string): Promise<Asset[]> {\n return readLocalJsonFiles<Asset>(dir);\n}\n\nexport async function updateLocalAsset(\n dir: string,\n asset: Asset,\n): Promise<void> {\n await writeLocalJsonFile(dir, getAssetFilename(asset), asset);\n}\n","import type { Component } from '@storyblok/management-api-client/resources/components';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getComponentFilename(component: Pick<Component, 'name'>): string {\n return `${component.name}.json`;\n}\n\nexport async function getLocalComponents(dir: string): Promise<Component[]> {\n return readLocalJsonFiles<Component>(dir);\n}\n\nexport async function updateLocalComponent(\n dir: string,\n component: Component,\n): Promise<void> {\n await writeLocalJsonFile(dir, getComponentFilename(component), component);\n}\n","import type { Datasource } from '@storyblok/management-api-client/resources/datasources';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getDatasourceFilename(\n datasource: Pick<Datasource, 'slug' | 'id'>,\n): string {\n return `${datasource.slug}_${datasource.id}.json`;\n}\n\nexport async function getLocalDatasources(dir: string): Promise<Datasource[]> {\n return readLocalJsonFiles<Datasource>(dir);\n}\n\nexport async function updateLocalDatasource(\n dir: string,\n datasource: Datasource,\n): Promise<void> {\n await writeLocalJsonFile(dir, getDatasourceFilename(datasource), datasource);\n}\n\nexport type { Datasource };\n","import type { Story } from '@storyblok/management-api-client/resources/stories';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getStoryFilename(story: Pick<Story, 'slug' | 'uuid'>): string {\n return `${story.slug}_${story.uuid}.json`;\n}\n\nexport async function getLocalStories(dir: string): Promise<Story[]> {\n return readLocalJsonFiles<Story>(dir);\n}\n\nexport async function updateLocalStory(\n dir: string,\n story: Story,\n): Promise<void> {\n await writeLocalJsonFile(dir, getStoryFilename(story), story);\n}\n","import type { Component } from '@storyblok/management-api-client/resources/components';\nimport type { Story } from '@storyblok/management-api-client/resources/stories';\n\nexport interface RefMaps {\n assets?: Map<unknown, string | number>;\n stories?: Map<unknown, string | number>;\n users?: Map<unknown, string | number>;\n tags?: Map<unknown, string | number>;\n datasources?: Map<unknown, string | number>;\n}\n\nexport type ComponentSchemas = Record<\n string,\n Record<string, { type: string; source?: string }>\n>;\n\nexport interface MapRefsOptions {\n schemas: ComponentSchemas;\n maps: RefMaps;\n}\n\ntype ProcessedFields = Set<Component['schema']>;\ntype MissingSchemas = Set<Component['name']>;\ntype UnknownRecord = Record<string, unknown>;\n\ntype RefMapper = (\n data: unknown,\n options: {\n schema: Component['schema'];\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n) => unknown;\n\ntype FieldRefMappers = Record<string, RefMapper>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): UnknownRecord {\n return isRecord(value) ? value : {};\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nconst traverseAndMapBySchema = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (!isRecord(data) || typeof data.component !== 'string') {\n return data ?? {};\n }\n\n const schema = schemas[data.component];\n if (!schema) {\n missingSchemas.add(data.component);\n return data;\n }\n\n const dataNew: UnknownRecord = { ...data };\n\n for (const [fieldName, fieldValue] of Object.entries(data)) {\n const fieldSchema = schema[\n fieldName.replace(/__i18n__.*/, '')\n ] as Component['schema'];\n const fieldType\n = fieldSchema\n && typeof fieldSchema === 'object'\n && 'type' in fieldSchema\n && fieldSchema.type;\n const fieldRefMapper\n = typeof fieldType === 'string' && fieldRefMappers[fieldType];\n\n if (fieldSchema) {\n processedFields.add(fieldSchema);\n }\n\n if (fieldRefMapper) {\n dataNew[fieldName] = fieldRefMapper(fieldValue, {\n schema: fieldSchema,\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n }\n\n return dataNew;\n};\n\nconst traverseAndMapRichtextDoc = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (Array.isArray(data)) {\n return data.map(item =>\n traverseAndMapRichtextDoc(item, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n }\n\n if (isRecord(data)) {\n if (data.type === 'link' && asRecord(data.attrs).linktype === 'story') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n uuid:\n maps.stories?.get(asRecord(data.attrs).uuid)\n ?? asRecord(data.attrs).uuid,\n },\n };\n }\n\n if (data.type === 'blok') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n body: asArray(asRecord(data.attrs).body).map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n ),\n },\n };\n }\n\n const newData: UnknownRecord = {};\n for (const [k, value] of Object.entries(data)) {\n newData[k] = traverseAndMapRichtextDoc(value, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n\n return newData;\n }\n\n return data;\n};\n\nconst richtextFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) =>\n traverseAndMapRichtextDoc(data, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n\nconst multilinkFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data) || data.linktype !== 'story') {\n return data;\n }\n\n return {\n ...data,\n id: maps.stories?.get(data.id) ?? data.id,\n };\n};\n\nconst bloksFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid bloks field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n};\n\nconst assetFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data)) {\n return data;\n }\n\n const newId\n = typeof data.id === 'number' ? maps.assets?.get(data.id) : undefined;\n return newId === undefined ? data : { ...data, id: newId };\n};\n\nconst multiassetFieldRefMapper: RefMapper = (data, options) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid multiasset field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d => assetFieldRefMapper(d, options));\n};\n\nconst optionsFieldRefMapper: RefMapper = (data, { schema, maps }) => {\n if (!Array.isArray(data)) {\n return data;\n }\n\n const sourceMapBySchema: Record<\n string,\n Map<unknown, string | number> | undefined\n > = {\n internal_stories: maps.stories,\n internal_users: maps.users,\n internal_tags: maps.tags,\n internal_datasources: maps.datasources,\n };\n\n const sourceMap\n = sourceMapBySchema[(schema as { source?: string }).source ?? ''];\n if (!sourceMap) {\n return data;\n }\n\n return data.map(d => sourceMap.get(d) ?? d);\n};\n\nconst fieldRefMappers = {\n asset: assetFieldRefMapper,\n bloks: bloksFieldRefMapper,\n multiasset: multiassetFieldRefMapper,\n multilink: multilinkFieldRefMapper,\n options: optionsFieldRefMapper,\n richtext: richtextFieldRefMapper,\n} as const;\n\nexport function mapRefs(\n story: Story,\n options: MapRefsOptions,\n): {\n mappedStory: Story;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n } {\n const { schemas, maps } = options;\n const processedFields: ProcessedFields = new Set();\n const missingSchemas: MissingSchemas = new Set();\n\n const alternatesRaw = story.alternates\n ? (story.alternates as Required<Story>['alternates']).map((alternate) => {\n const mappedAlternate = asRecord(alternate);\n return {\n ...mappedAlternate,\n id: maps.stories?.get(mappedAlternate.id) ?? mappedAlternate.id,\n parent_id:\n maps.stories?.get(mappedAlternate.parent_id)\n ?? mappedAlternate.parent_id,\n };\n })\n : story.alternates;\n // mapped ids may be string|number at runtime but shape is compatible\n const alternates = alternatesRaw as Story['alternates'];\n\n const parentId = maps.stories?.get(story.parent_id) ?? story.parent_id;\n const mappedContentRaw = story.content?.component\n ? traverseAndMapBySchema(story.content, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n })\n : story.content;\n\n const mappedStory = {\n ...story,\n // traverseAndMapBySchema returns unknown; runtime shape satisfies Blok\n content: mappedContentRaw as unknown as Story['content'],\n id: Number(maps.stories?.get(story.id) ?? story.id),\n uuid: String(maps.stories?.get(story.uuid) ?? story.uuid),\n parent_id: parentId != null ? Number(parentId) : null,\n alternates,\n } satisfies Story;\n\n return {\n mappedStory,\n processedFields,\n missingSchemas,\n };\n}\n","import type { Story } from '@storyblok/management-api-client/resources/stories';\n\ninterface ComponentToUpdate {\n field: string;\n name: string;\n}\n\ninterface Change {\n component: string;\n field: string;\n path: string;\n}\n\nfunction traverseRichtext(\n data: unknown,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): unknown {\n if (Array.isArray(data)) {\n return data.map((item, index) =>\n traverseRichtext(item, componentsToUpdate, oldValue, newValue, changes, `${path}[${index}]`),\n );\n }\n\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const record = data as Record<string, unknown>;\n\n if (record.type === 'blok' && record.attrs && typeof record.attrs === 'object') {\n const attrs = record.attrs as Record<string, unknown>;\n if (Array.isArray(attrs.body)) {\n return {\n ...record,\n attrs: {\n ...attrs,\n body: attrs.body.map((item: unknown, index: number) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.attrs.body[${index}]`,\n );\n }\n return item;\n }),\n },\n };\n }\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n return result;\n }\n\n return data;\n}\n\nfunction traverseObject(\n obj: Record<string, unknown>,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): Record<string, unknown> {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj;\n }\n\n const result = { ...obj };\n const componentName = obj.component as string | undefined;\n\n if (componentName) {\n for (const { field, name } of componentsToUpdate) {\n if (name !== componentName) {\n continue;\n }\n\n const fieldValue = result[field];\n\n if (typeof fieldValue === 'string' && fieldValue === oldValue) {\n result[field] = newValue;\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}`,\n });\n }\n else if (Array.isArray(fieldValue)) {\n const newArray = fieldValue.map((item) => {\n if (item === oldValue) {\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}[]`,\n });\n return newValue;\n }\n return item;\n });\n result[field] = newArray;\n }\n }\n }\n\n // Traverse nested arrays (bloks fields) and richtext fields\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item, index) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.${key}[${index}]`,\n );\n }\n return item;\n });\n }\n else if (\n value\n && typeof value === 'object'\n && !Array.isArray(value)\n && (value as Record<string, unknown>).type === 'doc'\n && Array.isArray((value as Record<string, unknown>).content)\n ) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n }\n\n return result;\n}\n\nexport function renameDataSourceValue(\n story: Story,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n): { story: Story; changes: Change[] } {\n const changes: Change[] = [];\n\n const newContent = traverseObject(\n story.content as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n 'content',\n );\n\n return {\n // traverseObject returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n changes,\n };\n}\n","import type { StoryblokAsset } from './types';\n\nexport interface UrlToAssetOptions {\n alt?: string | null;\n title?: string | null;\n copyright?: string | null;\n focus?: string | null;\n}\n\nexport function urlToAsset(\n url: string,\n options?: UrlToAssetOptions,\n): StoryblokAsset {\n // Derive name from last path segment\n const pathSegments = url.split('/');\n const name = pathSegments.at(-1) || url;\n\n return {\n fieldtype: 'asset',\n id: 0,\n filename: url,\n src: url,\n name,\n alt: null,\n title: null,\n copyright: null,\n focus: null,\n meta_data: {},\n source: null,\n is_external_url: true,\n is_private: false,\n updated_at: '',\n width: null,\n height: null,\n aspect_ratio: null,\n public_id: null,\n content_type: '',\n ...options,\n };\n}\n","import type { StoryblokMultilink } from './types';\n\nexport interface UrlToLinkOptions {\n target?: '_blank' | '_self';\n title?: string;\n rel?: string;\n anchor?: string;\n}\n\nexport function urlToLink(\n url: string,\n options?: UrlToLinkOptions,\n): StoryblokMultilink {\n // Detect mailto: links\n if (url.startsWith('mailto:')) {\n return {\n fieldtype: 'multilink',\n id: '',\n url: '',\n cached_url: '',\n linktype: 'email',\n email: url.slice('mailto:'.length),\n ...options,\n };\n }\n\n // Extract anchor from fragment\n const hashIndex = url.indexOf('#');\n const anchor = hashIndex === -1 ? undefined : url.slice(hashIndex + 1);\n const cleanUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);\n\n return {\n fieldtype: 'multilink',\n id: '',\n url: cleanUrl,\n cached_url: cleanUrl,\n linktype: 'url',\n ...(anchor ? { anchor } : {}),\n ...options,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/delete-out-of-schema-fields.ts","../src/local-utils.ts","../src/local-assets.ts","../src/local-components.ts","../src/local-datasources.ts","../src/local-stories.ts","../src/map-refs.ts","../src/rename-datasource-value.ts","../src/url-to-asset.ts","../src/url-to-asset-field.ts","../src/url-to-link.ts"],"sourcesContent":["import type { Story } from './types';\n\nimport type { ComponentSchemas } from './map-refs';\n\nconst SYSTEM_FIELDS = new Set(['_uid', 'component', '_editable']);\n\ninterface RemovedField {\n component: string;\n field: string;\n}\n\nfunction cleanBlok(\n blok: Record<string, unknown>,\n schemaDefinition: ComponentSchemas,\n removedFields: RemovedField[],\n): Record<string, unknown> {\n const componentName = blok.component as string | undefined;\n if (!componentName) {\n return blok;\n }\n\n const schema = schemaDefinition[componentName];\n if (!schema) {\n // Unknown component — leave untouched\n return blok;\n }\n\n const validFieldSet = new Set(Object.keys(schema));\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(blok)) {\n // Always keep system fields\n if (SYSTEM_FIELDS.has(key)) {\n result[key] = value;\n continue;\n }\n\n // Strip i18n suffix to get base field name\n const baseFieldName = key.replace(/__i18n__.*/, '');\n\n // Field not in schema — remove it\n if (!validFieldSet.has(baseFieldName)) {\n removedFields.push({ component: componentName, field: key });\n continue;\n }\n\n // Check if this is an array of bloks (objects with component property)\n const isBlokArray\n = Array.isArray(value)\n && value.some(\n item =>\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component,\n );\n\n if (isBlokArray) {\n // Traverse blok arrays and process nested bloks recursively\n result[key] = (value as unknown[]).map((item) => {\n if (\n item\n && typeof item === 'object'\n && !Array.isArray(item)\n && (item as Record<string, unknown>).component\n ) {\n return cleanBlok(\n item as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n }\n return item;\n });\n }\n else {\n // Valid field — keep it\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport function deleteOutOfSchemaFields(\n story: Story,\n schemaDefinition: ComponentSchemas,\n): { story: Story; removedFields: RemovedField[] } {\n const removedFields: RemovedField[] = [];\n\n if (!story.content) {\n return { story, removedFields };\n }\n\n const newContent = cleanBlok(\n story.content as Record<string, unknown>,\n schemaDefinition,\n removedFields,\n );\n\n return {\n // cleanBlok returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n removedFields,\n };\n}\n","import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { extname, join } from 'pathe';\n\nexport async function readLocalJsonFiles<T>(dir: string): Promise<T[]> {\n let files: string[];\n try {\n files = await readdir(dir);\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n\n const jsonFiles = files.filter(f => extname(f) === '.json');\n\n const items = await Promise.all(\n jsonFiles.map(async (file) => {\n const filePath = join(dir, file);\n const content = await readFile(filePath, 'utf8');\n try {\n return JSON.parse(content) as T;\n }\n catch (error: unknown) {\n throw new Error(\n `Failed to parse ${filePath}: ${(error as Error).message}`,\n );\n }\n }),\n );\n\n return items;\n}\n\nexport async function writeLocalJsonFile(\n dir: string,\n filename: string,\n data: unknown,\n): Promise<void> {\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, filename);\n await writeFile(filePath, JSON.stringify(data, undefined, 2), 'utf8');\n}\n","import type { Asset } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getAssetFilename(asset: Pick<Asset, 'id' | 'short_filename'>): string {\n const name = (asset.short_filename || String(asset.id)).replace(\n /\\.[^.]+$/,\n '',\n ); // strip extension\n return `${name}_${asset.id}.json`;\n}\n\nexport async function getLocalAssets(dir: string): Promise<Asset[]> {\n return readLocalJsonFiles<Asset>(dir);\n}\n\nexport async function updateLocalAsset(\n dir: string,\n asset: Asset,\n): Promise<void> {\n await writeLocalJsonFile(dir, getAssetFilename(asset), asset);\n}\n","import type { Component } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getComponentFilename(component: Pick<Component, 'name'>): string {\n return `${component.name}.json`;\n}\n\nexport async function getLocalComponents(dir: string): Promise<Component[]> {\n return readLocalJsonFiles<Component>(dir);\n}\n\nexport async function updateLocalComponent(\n dir: string,\n component: Component,\n): Promise<void> {\n await writeLocalJsonFile(dir, getComponentFilename(component), component);\n}\n","import type { Datasource } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getDatasourceFilename(\n datasource: Pick<Datasource, 'slug' | 'id'>,\n): string {\n return `${datasource.slug}_${datasource.id}.json`;\n}\n\nexport async function getLocalDatasources(dir: string): Promise<Datasource[]> {\n return readLocalJsonFiles<Datasource>(dir);\n}\n\nexport async function updateLocalDatasource(\n dir: string,\n datasource: Datasource,\n): Promise<void> {\n await writeLocalJsonFile(dir, getDatasourceFilename(datasource), datasource);\n}\n\nexport type { Datasource };\n","import type { Story } from './types';\n\nimport { readLocalJsonFiles, writeLocalJsonFile } from './local-utils';\n\nfunction getStoryFilename(story: Pick<Story, 'slug' | 'uuid'>): string {\n return `${story.slug}_${story.uuid}.json`;\n}\n\nexport async function getLocalStories(dir: string): Promise<Story[]> {\n return readLocalJsonFiles<Story>(dir);\n}\n\nexport async function updateLocalStory(\n dir: string,\n story: Story,\n): Promise<void> {\n await writeLocalJsonFile(dir, getStoryFilename(story), story);\n}\n","import type { Component, Story } from './types';\n\nexport interface RefMaps {\n assets?: Map<unknown, string | number>;\n stories?: Map<unknown, string | number>;\n users?: Map<unknown, string | number>;\n tags?: Map<unknown, string | number>;\n datasources?: Map<unknown, string | number>;\n}\n\nexport type ComponentSchemas = Record<\n string,\n Record<string, { type: string; source?: string }>\n>;\n\nexport interface MapRefsOptions {\n schemas: ComponentSchemas;\n maps: RefMaps;\n}\n\ntype ProcessedFields = Set<Component['schema']>;\ntype MissingSchemas = Set<Component['name']>;\ntype UnknownRecord = Record<string, unknown>;\n\ntype RefMapper = (\n data: unknown,\n options: {\n schema: Component['schema'];\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n) => unknown;\n\ntype FieldRefMappers = Record<string, RefMapper>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): UnknownRecord {\n return isRecord(value) ? value : {};\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nconst traverseAndMapBySchema = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (!isRecord(data) || typeof data.component !== 'string') {\n return data ?? {};\n }\n\n const schema = schemas[data.component];\n if (!schema) {\n missingSchemas.add(data.component);\n return data;\n }\n\n const dataNew: UnknownRecord = { ...data };\n\n for (const [fieldName, fieldValue] of Object.entries(data)) {\n const fieldSchema = schema[\n fieldName.replace(/__i18n__.*/, '')\n ] as Component['schema'];\n const fieldType\n = fieldSchema\n && typeof fieldSchema === 'object'\n && 'type' in fieldSchema\n && fieldSchema.type;\n const fieldRefMapper\n = typeof fieldType === 'string' && fieldRefMappers[fieldType];\n\n if (fieldSchema) {\n processedFields.add(fieldSchema);\n }\n\n if (fieldRefMapper) {\n dataNew[fieldName] = fieldRefMapper(fieldValue, {\n schema: fieldSchema,\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n }\n\n return dataNew;\n};\n\nconst traverseAndMapRichtextDoc = (\n data: unknown,\n {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }: {\n schemas: ComponentSchemas;\n maps: RefMaps;\n fieldRefMappers: FieldRefMappers;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n },\n): unknown => {\n if (Array.isArray(data)) {\n return data.map(item =>\n traverseAndMapRichtextDoc(item, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n }\n\n if (isRecord(data)) {\n if (data.type === 'link' && asRecord(data.attrs).linktype === 'story') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n uuid:\n maps.stories?.get(asRecord(data.attrs).uuid)\n ?? asRecord(data.attrs).uuid,\n },\n };\n }\n\n if (data.type === 'blok') {\n return {\n ...data,\n attrs: {\n ...asRecord(data.attrs),\n body: asArray(asRecord(data.attrs).body).map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n ),\n },\n };\n }\n\n const newData: UnknownRecord = {};\n for (const [k, value] of Object.entries(data)) {\n newData[k] = traverseAndMapRichtextDoc(value, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n }\n\n return newData;\n }\n\n return data;\n};\n\nconst richtextFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) =>\n traverseAndMapRichtextDoc(data, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n });\n\nconst multilinkFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data) || data.linktype !== 'story') {\n return data;\n }\n\n return {\n ...data,\n id: maps.stories?.get(data.id) ?? data.id,\n };\n};\n\nconst bloksFieldRefMapper: RefMapper = (\n data,\n { schemas, maps, fieldRefMappers, processedFields, missingSchemas },\n) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid bloks field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d =>\n traverseAndMapBySchema(d, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n }),\n );\n};\n\nconst assetFieldRefMapper: RefMapper = (data, { maps }) => {\n if (!isRecord(data)) {\n return data;\n }\n\n const newId\n = typeof data.id === 'number' ? maps.assets?.get(data.id) : undefined;\n return newId === undefined ? data : { ...data, id: newId };\n};\n\nconst multiassetFieldRefMapper: RefMapper = (data, options) => {\n if (!Array.isArray(data)) {\n throw new TypeError(\n `Invalid multiasset field: expected an array, but received ${JSON.stringify(data)}.`,\n );\n }\n\n return data.map(d => assetFieldRefMapper(d, options));\n};\n\nconst optionsFieldRefMapper: RefMapper = (data, { schema, maps }) => {\n if (!Array.isArray(data)) {\n return data;\n }\n\n const sourceMapBySchema: Record<\n string,\n Map<unknown, string | number> | undefined\n > = {\n internal_stories: maps.stories,\n internal_users: maps.users,\n internal_tags: maps.tags,\n internal_datasources: maps.datasources,\n };\n\n const sourceMap\n = sourceMapBySchema[(schema as { source?: string }).source ?? ''];\n if (!sourceMap) {\n return data;\n }\n\n return data.map(d => sourceMap.get(d) ?? d);\n};\n\nconst fieldRefMappers = {\n asset: assetFieldRefMapper,\n bloks: bloksFieldRefMapper,\n multiasset: multiassetFieldRefMapper,\n multilink: multilinkFieldRefMapper,\n options: optionsFieldRefMapper,\n richtext: richtextFieldRefMapper,\n} as const;\n\nexport function mapRefs(\n story: Story,\n options: MapRefsOptions,\n): {\n mappedStory: Story;\n processedFields: ProcessedFields;\n missingSchemas: MissingSchemas;\n } {\n const { schemas, maps } = options;\n const processedFields: ProcessedFields = new Set();\n const missingSchemas: MissingSchemas = new Set();\n\n const alternatesRaw = story.alternates\n ? (story.alternates as Required<Story>['alternates']).map((alternate) => {\n const mappedAlternate = asRecord(alternate);\n return {\n ...mappedAlternate,\n id: maps.stories?.get(mappedAlternate.id) ?? mappedAlternate.id,\n parent_id:\n maps.stories?.get(mappedAlternate.parent_id)\n ?? mappedAlternate.parent_id,\n };\n })\n : story.alternates;\n // mapped ids may be string|number at runtime but shape is compatible\n const alternates = alternatesRaw as Story['alternates'];\n\n const parentId = maps.stories?.get(story.parent_id);\n const mappedContentRaw = story.content?.component\n ? traverseAndMapBySchema(story.content, {\n schemas,\n maps,\n fieldRefMappers,\n processedFields,\n missingSchemas,\n })\n : story.content;\n\n const mappedStory = {\n ...story,\n // traverseAndMapBySchema returns unknown; runtime shape satisfies Blok\n content: mappedContentRaw as unknown as Story['content'],\n id: Number(maps.stories?.get(story.id) ?? story.id),\n uuid: String(maps.stories?.get(story.uuid) ?? story.uuid),\n parent_id: parentId != null ? Number(parentId) : story.parent_id,\n alternates,\n } satisfies Story;\n\n return {\n mappedStory,\n processedFields,\n missingSchemas,\n };\n}\n","import type { Story } from './types';\n\ninterface ComponentToUpdate {\n field: string;\n name: string;\n}\n\ninterface Change {\n component: string;\n field: string;\n path: string;\n}\n\nfunction traverseRichtext(\n data: unknown,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): unknown {\n if (Array.isArray(data)) {\n return data.map((item, index) =>\n traverseRichtext(item, componentsToUpdate, oldValue, newValue, changes, `${path}[${index}]`),\n );\n }\n\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const record = data as Record<string, unknown>;\n\n if (record.type === 'blok' && record.attrs && typeof record.attrs === 'object') {\n const attrs = record.attrs as Record<string, unknown>;\n if (Array.isArray(attrs.body)) {\n return {\n ...record,\n attrs: {\n ...attrs,\n body: attrs.body.map((item: unknown, index: number) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.attrs.body[${index}]`,\n );\n }\n return item;\n }),\n },\n };\n }\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n return result;\n }\n\n return data;\n}\n\nfunction traverseObject(\n obj: Record<string, unknown>,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n changes: Change[],\n path: string,\n): Record<string, unknown> {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj;\n }\n\n const result = { ...obj };\n const componentName = obj.component as string | undefined;\n\n if (componentName) {\n for (const { field, name } of componentsToUpdate) {\n if (name !== componentName) {\n continue;\n }\n\n const fieldValue = result[field];\n\n if (typeof fieldValue === 'string' && fieldValue === oldValue) {\n result[field] = newValue;\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}`,\n });\n }\n else if (Array.isArray(fieldValue)) {\n const newArray = fieldValue.map((item) => {\n if (item === oldValue) {\n changes.push({\n component: componentName,\n field,\n path: `${path}.${field}[]`,\n });\n return newValue;\n }\n return item;\n });\n result[field] = newArray;\n }\n }\n }\n\n // Traverse nested arrays (bloks fields) and richtext fields\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item, index) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return traverseObject(\n item as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n `${path}.${key}[${index}]`,\n );\n }\n return item;\n });\n }\n else if (\n value\n && typeof value === 'object'\n && !Array.isArray(value)\n && (value as Record<string, unknown>).type === 'doc'\n && Array.isArray((value as Record<string, unknown>).content)\n ) {\n result[key] = traverseRichtext(value, componentsToUpdate, oldValue, newValue, changes, `${path}.${key}`);\n }\n }\n\n return result;\n}\n\nexport function renameDataSourceValue(\n story: Story,\n componentsToUpdate: ComponentToUpdate[],\n oldValue: string,\n newValue: string,\n): { story: Story; changes: Change[] } {\n const changes: Change[] = [];\n\n const newContent = traverseObject(\n story.content as Record<string, unknown>,\n componentsToUpdate,\n oldValue,\n newValue,\n changes,\n 'content',\n );\n\n return {\n // traverseObject returns Record<string,unknown>; runtime shape satisfies Blok\n story: { ...story, content: newContent as unknown as Story['content'] },\n changes,\n };\n}\n","import type { Asset } from './types';\n\nexport type UrlToAssetOptions = Partial<Omit<Asset, 'id' | 'filename' | 'space_id' | 'created_at' | 'updated_at' | 'short_filename' | 'content_type' | 'content_length'>>;\n\nexport function urlToAsset(\n url: string,\n options?: UrlToAssetOptions,\n): Asset {\n // Derive name from last path segment\n const pathSegments = url.split('/');\n const short_filename = pathSegments.at(-1) || url;\n\n return {\n id: 0,\n filename: url,\n space_id: 0,\n created_at: '',\n updated_at: '',\n short_filename,\n content_type: '',\n content_length: 0,\n is_private: false,\n ...options,\n };\n}\n","import type { AssetField } from './types';\n\nexport type UrlToAssetFieldOptions = Partial<Omit<AssetField, 'fieldtype' | 'filename' | 'id'>>;\n\nexport function urlToAssetField(\n url: string,\n options?: UrlToAssetFieldOptions,\n): AssetField {\n // Derive name from last path segment\n const pathSegments = url.split('/');\n const name = pathSegments.at(-1) || url;\n\n return {\n fieldtype: 'asset',\n id: 0,\n filename: url,\n name,\n alt: null,\n title: null,\n copyright: null,\n focus: null,\n meta_data: {},\n source: null,\n is_external_url: true,\n ...options,\n };\n}\n","import type { MultilinkField } from './types';\n\nexport type UrlToLinkOptions = Partial<Omit<MultilinkField, 'fieldtype' | 'id' | 'url' | 'cached_url' | 'linktype'>>;\n\nexport function urlToLink(\n url: string,\n options?: UrlToLinkOptions,\n): MultilinkField {\n // Detect mailto: links\n if (url.startsWith('mailto:')) {\n return {\n fieldtype: 'multilink',\n id: '',\n url: url.slice('mailto:'.length),\n cached_url: url.slice('mailto:'.length),\n linktype: 'email',\n ...options,\n };\n }\n\n // Extract anchor from fragment\n const hashIndex = url.indexOf('#');\n const anchor = hashIndex === -1 ? undefined : url.slice(hashIndex + 1);\n const cleanUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);\n\n return {\n fieldtype: 'multilink',\n id: '',\n url: cleanUrl,\n cached_url: cleanUrl,\n linktype: 'url',\n ...(anchor ? { anchor } : {}),\n ...options,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@storyblok/migrations",
3
3
  "type": "module",
4
- "version": "0.1.4",
4
+ "version": "0.1.8",
5
5
  "private": false,
6
6
  "description": "Migration utilities for Storyblok",
7
7
  "author": "Storyblok",
@@ -43,8 +43,8 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "pathe": "^2.0.3",
46
- "@storyblok/management-api-client": "0.2.2",
47
- "@storyblok/richtext": "4.1.2"
46
+ "@storyblok/management-api-client": "0.2.4",
47
+ "@storyblok/richtext": "4.3.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/node": "^22.15.18",