storyblok 4.15.2 → 4.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/lib/config/types.ts"],"sourcesContent":["import type { RegionCode } from '../../constants';\nimport type { Command, Option } from 'commander';\nimport type { CommandOptions } from '../../types';\nimport type { PullComponentsOptions } from '../../commands/components/pull/constants';\nimport type { PushComponentsOptions } from '../../commands/components/push/constants';\nimport type { PullDatasourcesOptions } from '../../commands/datasources/pull/constants';\nimport type { PushDatasourcesOptions } from '../../commands/datasources/push/constants';\nimport type { DeleteDatasourceOptions } from '../../commands/datasources/delete/constants';\nimport type { MigrationsGenerateOptions } from '../../commands/migrations/generate/constants';\nimport type { MigrationsRunOptions } from '../../commands/migrations/run/constants';\nimport type { MigrationsRollbackOptions } from '../../commands/migrations/rollback/types';\nimport type { GenerateTypesOptions } from '../../commands/types/generate/constants';\nimport type { PullLanguagesOptions } from '../../commands/languages/constants';\nimport type { PullAssetsOptions } from '../../commands/assets/pull/types';\nimport type { PushAssetsOptions } from '../../commands/assets/push/types';\nimport type { PullStoriesOptions } from '../../commands/stories/pull/types';\nimport type { PushStoriesOptions } from '../../commands/stories/push/types';\nimport type { PruneLogsOptions } from '../../commands/logs/prune/types';\nimport type { PruneReportsOptions } from '../../commands/reports/prune/types';\nimport type { DeepPartial } from '../../utils/types';\n\nexport type PlainObject = Record<string, any>;\n\nexport interface ApiConfig {\n maxRetries: number;\n maxConcurrency: number;\n}\n\nexport interface LogConsoleConfig {\n enabled: boolean;\n level: string;\n}\n\nexport interface LogFileConfig {\n enabled: boolean;\n level: string;\n maxFiles: number;\n}\n\nexport interface LogConfig {\n console: LogConsoleConfig;\n file: LogFileConfig;\n}\n\nexport interface ReportConfig {\n enabled: boolean;\n maxFiles: number;\n}\n\nexport interface UiConfig {\n enabled: boolean;\n}\n\nexport interface GlobalConfig {\n region?: RegionCode;\n space?: number | string;\n path?: string;\n api: ApiConfig;\n log: LogConfig;\n report: ReportConfig;\n ui: UiConfig;\n verbose: boolean;\n}\n\nexport interface ResolvedCliConfig extends GlobalConfig {\n [key: string]: any;\n}\n\ntype StripCommandOption<T> = T extends CommandOptions ? Omit<T, keyof CommandOptions> : T;\ntype CommandConfig<T> = Partial<StripCommandOption<T>>;\n\nexport interface SharedConfigOptions {\n space?: number | string;\n path?: string;\n}\n\nexport interface CommandOptionsMap {\n components: { pull: PullComponentsOptions; push: PushComponentsOptions };\n datasources: { pull: PullDatasourcesOptions; push: PushDatasourcesOptions; delete: DeleteDatasourceOptions };\n migrations: { generate: MigrationsGenerateOptions; run: MigrationsRunOptions; rollback: MigrationsRollbackOptions };\n types: { generate: GenerateTypesOptions };\n languages: { pull: PullLanguagesOptions };\n assets: { pull: PullAssetsOptions; push: PushAssetsOptions };\n stories: { pull: PullStoriesOptions; push: PushStoriesOptions };\n logs: { list: Record<string, never>; prune: PruneLogsOptions };\n reports: { list: Record<string, never>; prune: PruneReportsOptions };\n}\n\ntype SubcommandConfig<T> = SharedConfigOptions & CommandConfig<T>;\n\ntype ModuleConfig<Subs extends Record<string, any>> = SharedConfigOptions & {\n [K in keyof Subs]?: SubcommandConfig<Subs[K]>;\n};\n\nexport type ModulesConfig = {\n [K in keyof CommandOptionsMap]?: ModuleConfig<CommandOptionsMap[K]>;\n};\n\nexport type ComponentsModuleConfig = ModulesConfig['components'];\nexport type DatasourcesModuleConfig = ModulesConfig['datasources'];\nexport type MigrationsModuleConfig = ModulesConfig['migrations'];\nexport type TypesModuleConfig = ModulesConfig['types'];\nexport type LanguagesModuleConfig = ModulesConfig['languages'];\nexport type AssetsModuleConfig = ModulesConfig['assets'];\nexport type StoriesModuleConfig = ModulesConfig['stories'];\nexport type LogsModuleConfig = ModulesConfig['logs'];\nexport type ReportsModuleConfig = ModulesConfig['reports'];\n\nexport interface StoryblokConfig extends DeepPartial<GlobalConfig> {\n modules?: ModulesConfig;\n}\n\nexport function defineConfig<T extends StoryblokConfig>(config: T): T {\n return config;\n}\n\nexport type OptionParser<T> = (value: string, previous?: T) => T;\n\nexport interface GlobalOptionDefinition<T = unknown> {\n flags: string;\n description: string;\n defaultValue?: T;\n parser?: OptionParser<T>;\n}\n\nexport interface ConfigLocation {\n cwd: string;\n configFile: string;\n}\n\nexport type CommanderOption = Option;\nexport type CommanderCommand = Command;\n"],"names":[],"mappings":"AAgHO,SAAS,aAAwC,MAAc,EAAA;AACpE,EAAO,OAAA,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/lib/config/types.ts"],"sourcesContent":["import type { RegionCode } from '../../constants';\nimport type { Command, Option } from 'commander';\nimport type { CommandOptions } from '../../types';\nimport type { PullComponentsOptions } from '../../commands/components/pull/constants';\nimport type { PushComponentsOptions } from '../../commands/components/push/constants';\nimport type { PullDatasourcesOptions } from '../../commands/datasources/pull/constants';\nimport type { PushDatasourcesOptions } from '../../commands/datasources/push/constants';\nimport type { DeleteDatasourceOptions } from '../../commands/datasources/delete/constants';\nimport type { MigrationsGenerateOptions } from '../../commands/migrations/generate/constants';\nimport type { MigrationsRunOptions } from '../../commands/migrations/run/constants';\nimport type { MigrationsRollbackOptions } from '../../commands/migrations/rollback/types';\nimport type { GenerateTypesOptions } from '../../commands/types/generate/constants';\nimport type { PullLanguagesOptions } from '../../commands/languages/constants';\nimport type { PullAssetsOptions } from '../../commands/assets/pull/types';\nimport type { PushAssetsOptions } from '../../commands/assets/push/types';\nimport type { PullStoriesOptions } from '../../commands/stories/pull/types';\nimport type { PushStoriesOptions } from '../../commands/stories/push/types';\nimport type { PruneLogsOptions } from '../../commands/logs/prune/types';\nimport type { PruneReportsOptions } from '../../commands/reports/prune/types';\nimport type { DeepPartial } from '../../utils/types';\n\nexport type PlainObject = Record<string, any>;\n\nexport interface ApiConfig {\n maxRetries: number;\n maxConcurrency: number;\n}\n\nexport interface LogConsoleConfig {\n enabled: boolean;\n level: string;\n}\n\nexport interface LogFileConfig {\n enabled: boolean;\n level: string;\n maxFiles: number;\n}\n\nexport interface LogConfig {\n console: LogConsoleConfig;\n file: LogFileConfig;\n}\n\nexport interface ReportConfig {\n enabled: boolean;\n maxFiles: number;\n}\n\nexport interface UiConfig {\n enabled: boolean;\n}\n\nexport interface GlobalConfig {\n region?: RegionCode;\n space?: number | string;\n path?: string;\n api: ApiConfig;\n log: LogConfig;\n report: ReportConfig;\n ui: UiConfig;\n verbose: boolean;\n}\n\nexport interface ResolvedCliConfig extends GlobalConfig {\n [key: string]: any;\n}\n\ntype StripCommandOption<T> = T extends CommandOptions ? Omit<T, keyof CommandOptions> : T;\ntype CommandConfig<T> = Partial<StripCommandOption<T>>;\n\nexport interface SharedConfigOptions {\n space?: number | string;\n path?: string;\n}\n\nexport interface CommandOptionsMap {\n components: { pull: PullComponentsOptions; push: PushComponentsOptions };\n datasources: { pull: PullDatasourcesOptions; push: PushDatasourcesOptions; delete: DeleteDatasourceOptions };\n migrations: { generate: MigrationsGenerateOptions; run: MigrationsRunOptions; rollback: MigrationsRollbackOptions };\n types: { generate: GenerateTypesOptions };\n languages: { pull: PullLanguagesOptions };\n assets: { pull: PullAssetsOptions; push: PushAssetsOptions };\n stories: { pull: PullStoriesOptions; push: PushStoriesOptions };\n logs: { list: Record<string, never>; prune: PruneLogsOptions };\n reports: { list: Record<string, never>; prune: PruneReportsOptions };\n}\n\ntype SubcommandConfig<T> = SharedConfigOptions & CommandConfig<T>;\n\ntype ModuleConfig<Subs extends Record<string, any>> = SharedConfigOptions & {\n [K in keyof Subs]?: SubcommandConfig<Subs[K]>;\n};\n\nexport type ModulesConfig = {\n [K in keyof CommandOptionsMap]?: ModuleConfig<CommandOptionsMap[K]>;\n};\n\nexport type ComponentsModuleConfig = ModulesConfig['components'];\nexport type DatasourcesModuleConfig = ModulesConfig['datasources'];\nexport type MigrationsModuleConfig = ModulesConfig['migrations'];\nexport type TypesModuleConfig = ModulesConfig['types'];\nexport type LanguagesModuleConfig = ModulesConfig['languages'];\nexport type AssetsModuleConfig = ModulesConfig['assets'];\nexport type StoriesModuleConfig = ModulesConfig['stories'];\nexport type LogsModuleConfig = ModulesConfig['logs'];\nexport type ReportsModuleConfig = ModulesConfig['reports'];\n\nexport interface StoryblokConfig extends DeepPartial<GlobalConfig> {\n modules?: ModulesConfig;\n}\n\nexport function defineConfig<T extends StoryblokConfig>(config: T): T {\n return config;\n}\n\nexport type OptionParser<T> = (value: string, previous?: T) => T;\n\nexport interface GlobalOptionDefinition<T = unknown> {\n flags: string;\n description: string;\n defaultValue?: T;\n parser?: OptionParser<T>;\n}\n\nexport interface ConfigLocation {\n cwd: string;\n configFile: string;\n}\n\nexport type CommanderOption = Option;\nexport type CommanderCommand = Command;\n"],"names":[],"mappings":"AAgHO,SAAS,aAAwC,MAAA,EAAc;AACpE,EAAA,OAAO,MAAA;AACT;;;;"}
package/dist/index.mjs CHANGED
@@ -1074,10 +1074,10 @@ const konsola = {
1074
1074
  }
1075
1075
  };
1076
1076
 
1077
- const __filename$1 = fileURLToPath(import.meta.url);
1078
- const __dirname$1 = dirname(__filename$1);
1077
+ const __filename$2 = fileURLToPath(import.meta.url);
1078
+ const __dirname$2 = dirname(__filename$2);
1079
1079
  const result = await readPackageUp({
1080
- cwd: __dirname$1
1080
+ cwd: __dirname$2
1081
1081
  });
1082
1082
  const packageJson$1 = result ? result.packageJson : {
1083
1083
  name: "storyblok",
@@ -1091,8 +1091,8 @@ function getPackageJson() {
1091
1091
  return packageJson$1;
1092
1092
  }
1093
1093
 
1094
- const __filename = fileURLToPath(import.meta.url);
1095
- const __dirname = dirname(__filename);
1094
+ const __filename$1 = fileURLToPath(import.meta.url);
1095
+ const __dirname$1 = dirname(__filename$1);
1096
1096
  function isRegion(value) {
1097
1097
  return Object.values(regions).includes(value);
1098
1098
  }
@@ -4077,6 +4077,36 @@ const updateStory = async (spaceId, storyId, payload) => {
4077
4077
  handleAPIError("update_story", error);
4078
4078
  }
4079
4079
  };
4080
+ const prefetchTargetStories = async (spaceId, options) => {
4081
+ const result = {
4082
+ bySlug: /* @__PURE__ */ new Map(),
4083
+ byId: /* @__PURE__ */ new Map()
4084
+ };
4085
+ let page = 1;
4086
+ let totalPages = 1;
4087
+ while (page <= totalPages) {
4088
+ const response = await fetchStories(spaceId, { page, per_page: 100 });
4089
+ if (!response) {
4090
+ break;
4091
+ }
4092
+ const total = Number(response.headers.get("Total"));
4093
+ const perPage = Number(response.headers.get("Per-Page"));
4094
+ totalPages = Math.ceil(total / perPage);
4095
+ if (page === 1) {
4096
+ options?.onTotal?.(total);
4097
+ }
4098
+ for (const story of response.stories) {
4099
+ const ref = { id: story.id, uuid: story.uuid };
4100
+ if (story.full_slug) {
4101
+ result.bySlug.set(story.full_slug, ref);
4102
+ }
4103
+ result.byId.set(story.id, ref);
4104
+ }
4105
+ options?.onIncrement?.(response.stories.length);
4106
+ page++;
4107
+ }
4108
+ return result;
4109
+ };
4080
4110
 
4081
4111
  const ERROR_CODES = {
4082
4112
  MIGRATION_APPLY_TO_STORY_ERROR: "MIGRATION_APPLY_TO_STORY_ERROR",
@@ -5785,7 +5815,7 @@ const saveTypesToComponentsFile = async (space, typedefData, options) => {
5785
5815
  const generateStoryblokTypes = async (options = {}) => {
5786
5816
  const { path } = options;
5787
5817
  try {
5788
- const storyblokTypesPath = resolve(__dirname, "./index.d.ts");
5818
+ const storyblokTypesPath = resolve(__dirname$1, "./index.d.ts");
5789
5819
  const storyblokTypesContent = readFileSync(storyblokTypesPath, "utf-8");
5790
5820
  const typeDefs = [
5791
5821
  "// This file was generated by the Storyblok CLI.",
@@ -8186,23 +8216,8 @@ const mapReferencesStream = ({
8186
8216
  }
8187
8217
  });
8188
8218
  };
8189
- const getRemoteStory = async ({ spaceId, storyId }) => {
8190
- const { data, response } = await getMapiClient().stories.get({
8191
- path: {
8192
- space_id: spaceId,
8193
- story_id: storyId
8194
- }
8195
- });
8196
- if (!response.ok && response.status !== 404) {
8197
- handleAPIError("pull_story", new FetchError(response.statusText, response));
8198
- }
8199
- if (data?.story?.deleted_at) {
8200
- return void 0;
8201
- }
8202
- return data?.story;
8203
- };
8204
8219
  const makeCreateStoryAPITransport = ({ spaceId }) => async (localStory) => {
8205
- const { id: _id, uuid: _uuid, parent_id: _parentId, content, ...newStoryData } = localStory;
8220
+ const { id: _id, uuid: _uuid, parent_id: _parentId, is_startpage: _isStartpage, content, ...newStoryData } = localStory;
8206
8221
  if (!localStory.is_folder && !content?.component) {
8207
8222
  throw new Error(`Story "${localStory.slug}" is missing a content type (content.component). Every story must define a content field with a valid component.`);
8208
8223
  }
@@ -8233,7 +8248,8 @@ const makeAppendToManifestFSTransport = ({ manifestFile }) => async (localStory,
8233
8248
  };
8234
8249
  const createStoryPlaceholderStream = ({
8235
8250
  maps,
8236
- spaceId,
8251
+ existingTargetStories,
8252
+ isCrossSpace,
8237
8253
  transports,
8238
8254
  onIncrement,
8239
8255
  onStorySuccess,
@@ -8248,16 +8264,19 @@ const createStoryPlaceholderStream = ({
8248
8264
  const task = (async () => {
8249
8265
  try {
8250
8266
  const mappedStoryId = maps.stories?.get(localStory.id);
8251
- const mappedRemoteStory = mappedStoryId && await getRemoteStory({ spaceId, storyId: Number(mappedStoryId) });
8267
+ const mappedRemoteStory = mappedStoryId ? existingTargetStories.byId.get(Number(mappedStoryId)) : void 0;
8252
8268
  if (mappedRemoteStory) {
8253
8269
  onStorySkipped?.(localStory, mappedRemoteStory);
8254
8270
  return;
8255
8271
  }
8256
- const existingRemoteStory = await getRemoteStory({ spaceId, storyId: localStory.id });
8257
- if (existingRemoteStory && existingRemoteStory.uuid === localStory.uuid) {
8258
- await transports.appendStoryManifest(localStory, existingRemoteStory);
8259
- onStorySkipped?.(localStory, existingRemoteStory);
8260
- return;
8272
+ const existingBySlug = localStory.full_slug ? existingTargetStories.bySlug.get(localStory.full_slug) : void 0;
8273
+ if (existingBySlug) {
8274
+ const isMatchConfirmed = isCrossSpace || existingBySlug.uuid === localStory.uuid;
8275
+ if (isMatchConfirmed) {
8276
+ await transports.appendStoryManifest(localStory, existingBySlug);
8277
+ onStorySkipped?.(localStory, existingBySlug);
8278
+ return;
8279
+ }
8261
8280
  }
8262
8281
  const newRemoteStory = await transports.createStory(localStory);
8263
8282
  await transports.appendStoryManifest(localStory, newRemoteStory);
@@ -8895,6 +8914,12 @@ pushCmd.action(async (options, command) => {
8895
8914
  logger.error(message);
8896
8915
  return;
8897
8916
  }
8917
+ const fetchProgress = ui.createProgressBar({ title: "Matching Stories...".padEnd(21) });
8918
+ const existingTargetStories = await prefetchTargetStories(space, {
8919
+ onTotal: (total) => fetchProgress.setTotal(total),
8920
+ onIncrement: (count) => fetchProgress.increment(count)
8921
+ });
8922
+ fetchProgress.stop();
8898
8923
  const storiesDirectoryPath = resolveCommandPath(directories.stories, fromSpace, basePath);
8899
8924
  const creationProgress = ui.createProgressBar({ title: "Creating Stories...".padEnd(21) });
8900
8925
  const processProgress = ui.createProgressBar({ title: "Processing Stories...".padEnd(21) });
@@ -8924,7 +8949,8 @@ pushCmd.action(async (options, command) => {
8924
8949
  // Create remote stories.
8925
8950
  createStoryPlaceholderStream({
8926
8951
  maps,
8927
- spaceId: space,
8952
+ existingTargetStories,
8953
+ isCrossSpace: fromSpace !== space,
8928
8954
  transports: {
8929
8955
  createStory: options.dryRun ? async (story) => story : makeCreateStoryAPITransport({
8930
8956
  spaceId: space