everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
60 lines (58 loc) • 2.45 kB
JavaScript
import { fileExists, listFiles, readText } from "./fs.mjs";
import { OBSOLETE_FILES } from "./obsolete-files.mjs";
import { Effect } from "effect";
//#region src/services/scaffold/upgrade-audit/manifest.ts
const readConfigKeys = (projectDir) => Effect.gen(function* () {
if (!(yield* fileExists(projectDir, "bos.config.json"))) return [];
const parsed = JSON.parse(yield* readText(projectDir, "bos.config.json"));
return Object.keys(parsed);
});
const existingOf = (projectDir, paths) => Effect.gen(function* () {
const existing = [];
for (const path of paths) if (yield* fileExists(projectDir, path)) existing.push(path);
return existing;
});
const localPluginName = (entry) => {
return (typeof entry.development === "string" ? entry.development : "").match(/^local:plugins\/([^/]+)$/)?.[1] ?? null;
};
const pluginInventory = (projectDir) => Effect.gen(function* () {
if (!(yield* fileExists(projectDir, "bos.config.json"))) return [];
const config = JSON.parse(yield* readText(projectDir, "bos.config.json"));
const inventories = [];
for (const [key, entry] of Object.entries(config.plugins ?? {})) {
const name = localPluginName(entry) ?? key;
inventories.push({
name,
hasBackend: yield* fileExists(projectDir, `plugins/${name}/src/index.ts`),
hasWeb: yield* fileExists(projectDir, `plugins/${name}/web`),
extendsParent: typeof entry.extends === "string",
variables: entry.variables ? Object.keys(entry.variables) : [],
secrets: Array.isArray(entry.secrets) ? entry.secrets.map(String) : []
});
}
return inventories;
});
const buildManifest = (projectDir, tier, blockerCount, warnCount, importRewrites, configKeys, routerSeam) => Effect.gen(function* () {
const deleteFiles = yield* existingOf(projectDir, OBSOLETE_FILES);
const plugins = yield* pluginInventory(projectDir);
const schemaFile = yield* fileExists(projectDir, "api/src/db/schema.ts");
const migrationFiles = yield* listFiles(projectDir, "api/src/db/migrations/**/*");
return {
tier,
blockerCount,
warnCount,
deleteFiles,
importRewrites: importRewrites.filter((rewrite) => rewrite.files.length > 0),
configKeys,
routerSeam,
authoredConfigTarget: "bos.app.ts",
plugins,
db: {
schemaFile: schemaFile ? "api/src/db/schema.ts" : null,
migrationsDir: migrationFiles.length > 0 ? "api/src/db/migrations" : null
}
};
});
//#endregion
export { buildManifest, readConfigKeys };
//# sourceMappingURL=manifest.mjs.map