UNPKG

sb-mig

Version:

CLI to rule the world. (and handle stuff related to Storyblok CMS)

768 lines (767 loc) 35.3 kB
// component resolution file borrowed from great storyblok-migrate // https://github.com/maoberlehner/storyblok-migrate // edit: changed a lot in here, but inspiration still is valid :) import path from "path"; import storyblokConfig, { SCHEMA } from "../../config/config.js"; import { buildOnTheFly } from "../../rollup/build-on-the-fly.js"; import { getFileContentWithRequire, readFile } from "../../utils/files.js"; import { safeGlobSync as globSync } from "../../utils/glob-utils.js"; import { normalizeDiscover, filesPattern, exactFilesPatterns, compare, } from "../../utils/path-utils.js"; export var SCOPE; (function (SCOPE) { SCOPE["local"] = "local"; SCOPE["external"] = "external"; SCOPE["lock"] = "lock"; SCOPE["all"] = "all"; })(SCOPE || (SCOPE = {})); export var LOOKUP_TYPE; (function (LOOKUP_TYPE) { LOOKUP_TYPE["packagName"] = "packageName"; LOOKUP_TYPE["fileName"] = "fileName"; })(LOOKUP_TYPE || (LOOKUP_TYPE = {})); const discoverExactFiles = ({ mainDirectory, componentDirectories, fileNames, ext, }) => exactFilesPatterns({ mainDirectory, componentDirectories, fileNames, ext, }).flatMap((exactPattern) => globSync(exactPattern.replace(/\\/g, "/"), { follow: true, })); // Re-export functions for backwards compatibility export { normalizeDiscover, compare, filesPattern, exactFilesPatterns, } from "../../utils/path-utils.js"; export const discoverManyByPackageName = (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; let listOfPackagesJsonFiles; switch (request.scope) { case SCOPE.local: // ### MANY by PACKAGE - LOCAL - packageName const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", "package.json"); listOfPackagesJsonFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = listOfPackagesJsonFiles .filter((file) => request.packageNames.includes(getFileContentWithRequire({ file }).name)) // filter only package.json from provided request.packageNames .map((file) => { // get path to folder in which current package.json is const fileFolderPath = file .split(path.sep) .slice(0, -1) .join(path.sep); const allStoryblokSchemaFilesWithinFolderPattern = path.join(`${fileFolderPath}`, "**", `[^_]*.${storyblokConfig.schemaFileExt}`); return globSync(allStoryblokSchemaFilesWithinFolderPattern.replace(/\\/g, "/"), { follow: true }); }) .flat(); break; case SCOPE.external: // ### MANY by PACKAGE - EXTERNAL - packageName const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", "package.json"); listOfPackagesJsonFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = listOfPackagesJsonFiles .filter((file) => request.packageNames.includes(getFileContentWithRequire({ file }).name)) // filter only package.json from provided request.packageNames .map((file) => { // get path to folder in which current package.json is const fileFolderPath = file .split(path.sep) .slice(0, -1) .join(path.sep); const allStoryblokSchemaFilesWithinFolderPattern = path.join(`${fileFolderPath}`, "**", `[^_]*.${storyblokConfig.schemaFileExt}`); return globSync(allStoryblokSchemaFilesWithinFolderPattern.replace(/\\/g, "/"), { follow: true }); }) .flat(); break; case SCOPE.all: // ### MANY by PACKAGE - ALL - packageName pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", "package.json"); listOfPackagesJsonFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = listOfPackagesJsonFiles .filter((file) => request.packageNames.includes(getFileContentWithRequire({ file }).name)) // filter only package.json from provided request.packageNames .map((file) => { // get path to folder in which current package.json is const fileFolderPath = file .split(path.sep) .slice(0, -1) .join(path.sep); const allStoryblokSchemaFilesWithinFolderPattern = path.join(`${fileFolderPath}`, "**", `[^_]*.${storyblokConfig.schemaFileExt}`); return globSync(allStoryblokSchemaFilesWithinFolderPattern.replace(/\\/g, "/"), { follow: true }); }) .flat(); break; default: break; } return listOfFiles; }; export const discoverOneByPackageName = (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; let listOfPackagesJsonFiles; switch (request.scope) { case SCOPE.local: // ### ONE by PACKAGE - LOCAL - packageName const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", "package.json"); listOfPackagesJsonFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = listOfPackagesJsonFiles .filter((file) => getFileContentWithRequire({ file }).name === request.packageName) // filter only package.json from provided request.packageName .map((file) => { // get path to folder in which current package.json is const fileFolderPath = file .split(path.sep) .slice(0, -1) .join(path.sep); const allStoryblokSchemaFilesWithinFolderPattern = path.join(`${fileFolderPath}`, "**", `[^_]*.${storyblokConfig.schemaFileExt}`); return globSync(allStoryblokSchemaFilesWithinFolderPattern.replace(/\\/g, "/"), { follow: true }); }) .flat(); break; case SCOPE.external: // ### ONE by PACKAGE - EXTERNAL - packageName const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", "package.json"); listOfPackagesJsonFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = listOfPackagesJsonFiles .filter((file) => getFileContentWithRequire({ file }).name === request.packageName) // filter only package.json from provided request.packageName .map((file) => { // get path to folder in which current package.json is const fileFolderPath = file .split(path.sep) .slice(0, -1) .join(path.sep); const allStoryblokSchemaFilesWithinFolderPattern = path.join(`${fileFolderPath}`, "**", `[^_]*.${storyblokConfig.schemaFileExt}`); return globSync(allStoryblokSchemaFilesWithinFolderPattern.replace(/\\/g, "/"), { follow: true }); }) .flat(); break; case SCOPE.all: // ### ONE by PACKAGE - ALL - packageName pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", "package.json"); listOfPackagesJsonFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = listOfPackagesJsonFiles .filter((file) => getFileContentWithRequire({ file }).name === request.packageName) // filter only package.json from provided request.packageName .map((file) => { // get path to folder in which current package.json is const fileFolderPath = file .split(path.sep) .slice(0, -1) .join(path.sep); const allStoryblokSchemaFilesWithinFolderPattern = path.join(`${fileFolderPath}`, "**", `[^_]*.${storyblokConfig.schemaFileExt}`); return globSync(allStoryblokSchemaFilesWithinFolderPattern.replace(/\\/g, "/"), { follow: true }); }) .flat(); break; default: break; } return listOfFiles; }; export const discoverMany = async (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### MANY - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { const listOfFilesToCompile = discoverExactFiles({ mainDirectory: directory, componentDirectories: onlyLocalComponentsDirectories, fileNames: request.fileNames, ext: `sb.${storyblokConfig.schemaType}`, }); await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.schemaFileExt}`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } listOfFiles = discoverExactFiles({ mainDirectory: directory, componentDirectories: onlyLocalComponentsDirectories, fileNames: request.fileNames, ext: storyblokConfig.schemaFileExt, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; case SCOPE.external: // ### MANY - EXTERNAL - fileName ### const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); listOfFiles = discoverExactFiles({ mainDirectory: directory, componentDirectories: onlyNodeModulesPackagesComponentsDirectories, fileNames: request.fileNames, ext: storyblokConfig.schemaFileExt, }); break; case SCOPE.lock: break; case SCOPE.all: // ### MANY - ALL - fileName ### listOfFiles = discoverExactFiles({ mainDirectory: directory, componentDirectories: storyblokConfig.componentsDirectories, fileNames: request.fileNames, ext: storyblokConfig.schemaFileExt, }); break; default: break; } return listOfFiles; }; export const discoverManyDatasources = async (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### MANY - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames, })}.sb.datasource.${storyblokConfig.schemaType}`); const listOfFilesToCompile = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `${normalizeDiscover({ segments: request.fileNames, })}.${storyblokConfig.datasourceExt}`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames, })}.${storyblokConfig.datasourceExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; case SCOPE.external: // ### MANY - EXTERNAL - fileName ### const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.datasourceExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; case SCOPE.all: // ### MANY - ALL - fileName ### pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.datasourceExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; default: break; } return listOfFiles; }; export const discoverStories = (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### MANY - LOCAL - fileName ### const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); const pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.storiesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; default: break; } return listOfFiles; }; export const discoverMigrationConfig = (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let listOfFiles = []; switch (request.scope) { case SCOPE.local: listOfFiles = exactFilesPatterns({ mainDirectory: directory, componentDirectories: storyblokConfig.componentsDirectories, fileNames: request.fileNames, ext: storyblokConfig.migrationConfigExt, }).flatMap((pattern) => globSync(pattern.replace(/\\/g, "/"), { follow: true, })); break; default: break; } return listOfFiles; }; export const discoverAllMigrationConfigs = (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = []; switch (request.scope) { case SCOPE.local: { const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.migrationConfigExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; } case SCOPE.external: { const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.migrationConfigExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; } case SCOPE.all: { pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.migrationConfigExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; } default: break; } return listOfFiles; }; export const discoverVersionMapping = (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let listOfFiles = []; switch (request.scope) { case SCOPE.all: listOfFiles = exactFilesPatterns({ mainDirectory: directory, componentDirectories: storyblokConfig.componentsDirectories, fileNames: request.fileNames, ext: "sb.migrations.cjs", }).flatMap((pattern) => globSync(pattern.replace(/\\/g, "/"), { follow: true, })); break; default: break; } return listOfFiles; }; export const discoverDatasources = async (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### ALL - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `[^_]*.sb.datasource.${storyblokConfig.schemaType}`); const listOfFilesToCompile = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); if (storyblokConfig.debug) { console.log("############# listOfFileToCompile #############"); console.log(listOfFilesToCompile); console.log("###############################################"); } await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `[^_]*.${storyblokConfig.datasourceExt}`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.datasourceExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; case SCOPE.external: // ### ALL - EXTERNAL - fileName ### const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.datasourceExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; case SCOPE.all: // ### ALL - LOCAL - fileName ### pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.datasourceExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; default: break; } return listOfFiles; }; export const discover = async (request) => { const rootDirectory = "."; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### ALL - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { pattern = filesPattern({ mainDirectory: directory, componentDirectories: onlyLocalComponentsDirectories, ext: "sb.ts", }); const listOfFilesToCompile = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `[^_]*.${storyblokConfig.schemaFileExt}`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } pattern = filesPattern({ mainDirectory: directory, componentDirectories: onlyLocalComponentsDirectories, ext: storyblokConfig.schemaFileExt, }); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; case SCOPE.external: // ### ALL - EXTERNAL - fileName ### const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = filesPattern({ mainDirectory: directory, componentDirectories: onlyNodeModulesPackagesComponentsDirectories, ext: storyblokConfig.schemaFileExt, }); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; case SCOPE.all: // ### ALL - LOCAL - fileName ### pattern = filesPattern({ mainDirectory: directory, componentDirectories: storyblokConfig.componentsDirectories, ext: storyblokConfig.schemaFileExt, }); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; default: break; } return listOfFiles; }; export const discoverResolvers = async (request) => { const rootDirectory = "."; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### ALL - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { pattern = filesPattern({ mainDirectory: directory, componentDirectories: onlyLocalComponentsDirectories, ext: "sb.resolvers.ts", }); const listOfFilesToCompile = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `[^_]*.sb.resolvers.cjs`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } pattern = filesPattern({ mainDirectory: directory, componentDirectories: onlyLocalComponentsDirectories, ext: "sb.resolvers.cjs", }); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; default: break; } return listOfFiles; }; export const discoverRoles = async (request) => { const rootDirectory = "."; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### ALL - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `[^_]*.sb.roles.${storyblokConfig.schemaType}`); const listOfFilesToCompile = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `[^_]*.${storyblokConfig.rolesExt}`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.rolesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; case SCOPE.external: // ### ALL - EXTERNAL - fileName ### const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.rolesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; case SCOPE.all: // ### ALL - LOCAL - fileName ### pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", `[^_]*.${storyblokConfig.rolesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; default: break; } return listOfFiles; }; export const discoverManyRoles = async (request) => { const rootDirectory = "./"; const directory = path.resolve(process.cwd(), rootDirectory); let pattern; let listOfFiles = [""]; switch (request.scope) { case SCOPE.local: // ### ALL - LOCAL - fileName ### let listOFSchemaTSFilesCompiled = []; const onlyLocalComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => !p.includes("node_modules")); if (storyblokConfig.schemaType === SCHEMA.TS) { pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames, })}.sb.roles.${storyblokConfig.schemaType}`); const listOfFilesToCompile = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); await buildOnTheFly({ files: listOfFilesToCompile }); pattern = path.join(directory, ".next", "cache", "sb-mig", "**", `${normalizeDiscover({ segments: request.fileNames, })}.${storyblokConfig.rolesExt}`); listOFSchemaTSFilesCompiled = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); } pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyLocalComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.rolesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); listOfFiles = [...listOfFiles, ...listOFSchemaTSFilesCompiled]; break; case SCOPE.external: // ### ALL - EXTERNAL - fileName ### const onlyNodeModulesPackagesComponentsDirectories = storyblokConfig.componentsDirectories.filter((p) => p.includes("node_modules")); pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: onlyNodeModulesPackagesComponentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.rolesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; case SCOPE.all: // ### ALL - LOCAL - fileName ### pattern = path.join(`${directory}`, `${normalizeDiscover({ segments: storyblokConfig.componentsDirectories, })}`, "**", `${normalizeDiscover({ segments: request.fileNames })}.${storyblokConfig.rolesExt}`); listOfFiles = globSync(pattern.replace(/\\/g, "/"), { follow: true, }); break; default: break; } return listOfFiles; }; export const discoverAllComponents = async () => { // #1: discover all external .sb.js files const allLocalSbComponentsSchemaFiles = await discover({ scope: SCOPE.local, type: LOOKUP_TYPE.fileName, }); // #2: discover all local .sb.js files const allExternalSbComponentsSchemaFiles = await discover({ scope: SCOPE.external, type: LOOKUP_TYPE.fileName, }); // #3: compare results, prefare local ones (so we have to create final external paths array and local array of things to sync from where) const { local, external } = compare({ local: allLocalSbComponentsSchemaFiles, external: allExternalSbComponentsSchemaFiles, }); return { local, external }; }; export const discoverAllMigrations = () => { const allLocalMigrationFiles = discoverAllMigrationConfigs({ scope: SCOPE.local, type: LOOKUP_TYPE.fileName, }); const allExternalMigrationFiles = discoverAllMigrationConfigs({ scope: SCOPE.external, type: LOOKUP_TYPE.fileName, }); const { local, external } = compare({ local: allLocalMigrationFiles, external: allExternalMigrationFiles, }); return { local, external }; }; export const enrichMigrationInfo = async (allMigrations) => { let appliedMigrations = { story: [], preset: [], }; try { const fileContent = (await readFile("applied-backpack-migrations.json")); const parsed = JSON.parse(fileContent); appliedMigrations = parsed.migrations || { story: [], preset: [] }; if (Array.isArray(appliedMigrations)) { appliedMigrations = { story: appliedMigrations, preset: [], }; } } catch { // File doesn't exist or is invalid — treat as no migrations applied } const ext = storyblokConfig.migrationConfigExt; const results = []; const processFiles = (files, scope) => { for (const file of files) { const name = file.name.replace(`.${ext}`, ""); let targetComponents; try { const content = getFileContentWithRequire({ file: file.p, }); targetComponents = Object.keys(content); } catch { targetComponents = ["<error loading>"]; } results.push({ name, filePath: file.p, scope, targetComponents, applied: { story: appliedMigrations.story.includes(name), preset: appliedMigrations.preset.includes(name), }, }); } }; processFiles(allMigrations.local, "local"); processFiles(allMigrations.external, "external"); return results; };