All files / src/scripts snapshotScriptEventDefs.ts

0% Statements 0/29
0% Branches 0/2
0% Functions 0/6
0% Lines 0/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79                                                                                                                                                             
import { Command } from "commander";
import { eventsRoot } from "consts";
import { readFile, writeJSON } from "fs-extra";
import { glob } from "lib/helpers/glob";
import { scriptEventDefsToSnapshot } from "lib/project/migration/snapshots/scriptEventDefs";
import { loadScriptEventHandlerFromTrustedString } from "lib/scriptEventsHandlers/trustedHandler";
import { join } from "path";
 
const parseFieldTypes = (value: string) =>
  value
    .split(",")
    .map((fieldType) => fieldType.trim())
    .filter(Boolean);
 
const program = new Command()
  .requiredOption("--tag <tag>", "Snapshot tag used in the output filename")
  .option(
    "--fieldTypes <fieldTypes>",
    "Comma-separated field types to include",
    parseFieldTypes,
  )
  .parse();
 
const options = program.opts<{
  tag: string;
  fieldTypes?: string[];
}>();
 
if (!/^[a-zA-Z0-9_-]+$/.test(options.tag)) {
  throw new Error(
    "Snapshot tag may only contain letters, numbers, underscores, and hyphens",
  );
}
 
const main = async () => {
  const eventPaths = await glob("event*.js", {
    cwd: eventsRoot,
    absolute: true,
  });
  const handlers = await Promise.all(
    eventPaths.map(async (eventPath) =>
      loadScriptEventHandlerFromTrustedString(
        await readFile(eventPath, "utf8"),
        eventPath,
      ),
    ),
  );
  const scriptEventDefs = Object.fromEntries(
    handlers.map((handler) => [handler.id, handler]),
  );
  const snapshot = scriptEventDefsToSnapshot(
    scriptEventDefs,
    options.fieldTypes,
  );
  const outputPath = join(
    process.cwd(),
    "src",
    "lib",
    "project",
    "migration",
    "snapshots",
    `scriptEventDefs${options.tag}.json`,
  );
 
  await writeJSON(outputPath, snapshot, { spaces: 2 });
  console.log(
    `Wrote ${Object.keys(snapshot).length} definitions to ${outputPath}`,
  );
 
  for (const handler of handlers) {
    handler.cleanup();
  }
};
 
main().catch((error: unknown) => {
  console.error(error);
  process.exitCode = 1;
});