monecromanci 0.1.0 → 0.1.1

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/cli.js CHANGED
@@ -1690,7 +1690,7 @@ function syncToolOwned(repoRoot, specs, shouldApply) {
1690
1690
  // package.json
1691
1691
  var package_default = {
1692
1692
  name: "monecromanci",
1693
- version: "0.0.0",
1693
+ version: "0.1.1",
1694
1694
  description: "MoNecromanCI \u2014 interactive CLI to summon, conjure, raise and validate NX monorepos (Azure DevOps & GitHub Actions): function/node apps, React/Vue/Svelte/Next.js apps, internal/publishable libs, CLI tools.",
1695
1695
  bin: {
1696
1696
  monecromanci: "./dist/cli.js",
@@ -1703,6 +1703,7 @@ var package_default = {
1703
1703
  node: "^22.13.0 || >=24"
1704
1704
  },
1705
1705
  scripts: {
1706
+ prepack: "npm run build",
1706
1707
  build: "tsup && node scripts/copyAssets.mjs",
1707
1708
  dev: "tsup --watch",
1708
1709
  lint: "eslint .",
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/engine/config.ts","../src/engine/constants.ts","../src/engine/fsx.ts","../src/util/logger.ts","../src/util/prompts.ts","../src/util/strings.ts","../src/engine/apply.ts","../src/engine/rootPackage.ts","../src/templates/frontendApp.ts","../src/engine/assets.ts","../src/templates/functionApp.ts","../src/templates/internalLib.ts","../src/templates/nextApp.ts","../src/templates/nodeApp.ts","../src/engine/registry.ts","../src/templates/publishableLib.ts","../src/templates/reactApp.ts","../src/generators/scaffold.ts","../src/generators/addProject.ts","../src/engine/projects.ts","../src/engine/sync.ts","../package.json","../src/templates/monorepo.ts","../src/commands/doctor.ts","../src/generators/createMonorepo.ts","../src/commands/update.ts","../src/util/exec.ts","../src/commands/validate.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { Command } from 'commander'\r\nimport { runAdd } from './commands/add'\r\nimport { runDoctor } from './commands/doctor'\r\nimport { runNew } from './commands/new'\r\nimport { runUpdate } from './commands/update'\r\nimport { runValidate } from './commands/validate'\r\nimport { logger } from './util/logger'\r\nimport type { CiProvider, RegistryConfig } from './engine/types'\r\n\r\n/** Reads the CLI version from the packaged package.json (next to dist/). */\r\nfunction readVersion (): string {\r\n try {\r\n const package_ = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')) as { version?: string }\r\n return package_.version ?? '0.0.0'\r\n } catch {\r\n return '0.0.0'\r\n }\r\n}\r\n\r\nconst program = new Command()\r\n\r\nprogram\r\n .name('monecromanci')\r\n .description('MoNecromanCI — summon, conjure, raise and validate NX monorepos')\r\n .version(readVersion())\r\n\r\nprogram\r\n .command('new')\r\n .alias('summon')\r\n .argument('[name]', 'monorepo name')\r\n .option('-y, --yes', 'non-interactive: accept provided values and defaults')\r\n .option('--scope <scope>', 'npm scope, e.g. @auto')\r\n .option('--ci <provider>', 'CI provider: azure | github | both')\r\n .option('--registry <kind>', 'registry: azure-artifacts | github-packages | npm')\r\n .option('--owner <owner>', 'GitHub owner for the github-packages registry')\r\n .option('--org <org>', 'Azure DevOps organization')\r\n .option('--project <project>', 'Azure DevOps project')\r\n .option('--feed <feed>', 'Azure Artifacts feed')\r\n .option('--base <branch>', 'default git branch')\r\n .option('--lib <name>', 'initial internal library name (empty string to skip)')\r\n .description('Scaffold a brand-new canonical NX monorepo')\r\n .action(async (name: string | undefined, options: {\r\n yes?: boolean\r\n scope?: string\r\n ci?: string\r\n registry?: string\r\n owner?: string\r\n org?: string\r\n project?: string\r\n feed?: string\r\n base?: string\r\n lib?: string\r\n }) => {\r\n await runNew({\r\n name,\r\n yes: options.yes,\r\n scope: options.scope,\r\n ci: options.ci as CiProvider | undefined,\r\n registry: options.registry as RegistryConfig['kind'] | undefined,\r\n owner: options.owner,\r\n organization: options.org,\r\n project: options.project,\r\n feed: options.feed,\r\n base: options.base,\r\n lib: options.lib,\r\n })\r\n })\r\n\r\nprogram\r\n .command('add')\r\n .alias('conjure')\r\n .argument('[type]', 'function-app | react-app | internal-lib | publishable-lib | cli-tool')\r\n .argument('[name]', 'project name')\r\n .description('Add a new project to the current monorepo')\r\n .action(async (type?: string, name?: string) => {\r\n await runAdd({ type, name })\r\n })\r\n\r\nprogram\r\n .command('doctor')\r\n .aliases(['fix', 'raise'])\r\n .option('--fix', 'apply fixes instead of only reporting')\r\n .description('Detect and repair configuration drift in the current monorepo')\r\n .action(async (options: { fix?: boolean }) => {\r\n await runDoctor({ apply: options.fix ?? false })\r\n })\r\n\r\nprogram\r\n .command('update')\r\n .alias('ascend')\r\n .description('Re-sync tool-owned files to the latest templates and apply migrations')\r\n .action(async () => {\r\n await runUpdate()\r\n })\r\n\r\nprogram\r\n .command('validate')\r\n .alias('ritual')\r\n .option('--all', 'run every project (nx run-many) instead of only affected')\r\n .description('Run lint/test/build locally (nx affected) before pushing to CI')\r\n .action(async (options: { all?: boolean }) => {\r\n await runValidate({ all: options.all ?? false })\r\n })\r\n\r\n/** Runs the CLI, reporting uncaught command errors instead of letting them crash the process. */\r\nasync function main (): Promise<void> {\r\n try {\r\n await program.parseAsync(process.argv)\r\n } catch (error) {\r\n logger.error(error instanceof Error ? error.message : String(error))\r\n process.exitCode = 1\r\n }\r\n}\r\n\r\nmain()\r\n","import { join } from 'node:path'\r\nimport { STAMP_FILE, TEMPLATE_VERSION } from './constants'\r\nimport { fileExists, readJsonSafe, toJson, writeFileEnsured } from './fsx'\r\nimport type { CiProvider, MonorepoVars, MonecromanciConfig, RegistryConfig } from './types'\r\n\r\n/** The raw on-disk stamp shape, where v1 fields may be missing pre-migration. */\r\ntype RawConfig = Omit<MonecromanciConfig, 'ci' | 'registry'> & { ci?: CiProvider, registry?: RegistryConfig }\r\n\r\n/**\r\n * Absolute path to a repo's `.monecromanci.json` stamp.\r\n *\r\n * @remarks\r\n * Pure path join; does not check whether the file exists.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @returns The absolute path to the stamp file.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function stampPath (repoRoot: string): string {\r\n return join(repoRoot, STAMP_FILE)\r\n}\r\n\r\n/**\r\n * Returns whether the given directory looks like a MoNecromanCI monorepo.\r\n *\r\n * @remarks\r\n * Checks only for the presence of the `.monecromanci.json` stamp file.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @returns `true` when the stamp file exists.\r\n * @throws Never - delegates to {@link fileExists}, which does not throw.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function isManagedRepo (repoRoot: string): boolean {\r\n return fileExists(stampPath(repoRoot))\r\n}\r\n\r\n/** Upgrades a legacy v1 stamp (Azure-only `azure` field) to the `ci`/`registry` shape. */\r\nfunction migrateConfig (raw: RawConfig): MonecromanciConfig {\r\n const registry: RegistryConfig = raw.registry\r\n ?? (raw.azure ? { kind: 'azure-artifacts', ...raw.azure } : { kind: 'npm' })\r\n\r\n return { ...raw, ci: raw.ci ?? 'azure', registry }\r\n}\r\n\r\n/**\r\n * Loads the `.monecromanci.json` stamp, or `undefined` when absent/invalid.\r\n *\r\n * @remarks\r\n * Returns early when {@link isManagedRepo} reports no stamp file. Legacy v1\r\n * stamps are migrated to the current `ci`/`registry` shape via `migrateConfig`.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @returns The parsed (and migrated) stamp, or `undefined` when missing/invalid.\r\n * @throws Never - delegates to {@link readJsonSafe}, which swallows parse errors.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function loadConfig (repoRoot: string): MonecromanciConfig | undefined {\r\n if (!isManagedRepo(repoRoot)) {\r\n return undefined\r\n }\r\n\r\n const raw = readJsonSafe<RawConfig | undefined>(stampPath(repoRoot), undefined)\r\n return raw ? migrateConfig(raw) : undefined\r\n}\r\n\r\n/**\r\n * Writes the `.monecromanci.json` stamp for a repo.\r\n *\r\n * @remarks\r\n * Overwrites any existing stamp file.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @param config - The stamp contents to persist.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * while writing the file.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function saveConfig (repoRoot: string, config: MonecromanciConfig): void {\r\n writeFileEnsured(stampPath(repoRoot), toJson(config))\r\n}\r\n\r\n/**\r\n * Builds the stamp contents from the monorepo template inputs.\r\n *\r\n * @remarks\r\n * Pure data transform; performs no I/O.\r\n *\r\n * @param vars - The monorepo template inputs.\r\n * @returns The stamp contents to be persisted via {@link saveConfig}.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function configFromVars (vars: MonorepoVars): MonecromanciConfig {\r\n return {\r\n templateVersion: TEMPLATE_VERSION,\r\n workspaceName: vars.workspaceName,\r\n displayName: vars.displayName,\r\n scope: vars.scope,\r\n defaultBase: vars.defaultBase,\r\n nodeVersion: vars.nodeVersion,\r\n ci: vars.ci,\r\n registry: vars.registry,\r\n }\r\n}\r\n","/**\r\n * Version stamp written into `.monecromanci.json`; bump when templates change.\r\n *\r\n * @remarks\r\n * `doctor`/`update` compare this against the stamp on disk to know whether a\r\n * repo's tool-owned files need re-syncing.\r\n */\r\nexport const TEMPLATE_VERSION = '0.2.0'\r\n\r\n/**\r\n * Name of the per-repo manifest that records how a repo was generated.\r\n *\r\n * @remarks\r\n * Lives at the repo root, alongside `package.json`.\r\n */\r\nexport const STAMP_FILE = '.monecromanci.json'\r\n\r\n/**\r\n * Default Node major version targeted by generated monorepos.\r\n *\r\n * @remarks\r\n * Used as the fallback when `monecromanci new` runs non-interactively.\r\n */\r\nexport const DEFAULT_NODE_VERSION = '24'\r\n\r\n/**\r\n * Default git base branch used by Nx affected detection.\r\n *\r\n * @remarks\r\n * Used as the fallback when `monecromanci new` runs non-interactively.\r\n */\r\nexport const DEFAULT_BASE = 'main'\r\n\r\n/**\r\n * Canonical NX project tags used to classify projects in CI.\r\n *\r\n * @remarks\r\n * Read back by {@link discoverProjects} to infer a project's {@link ProjectKind}\r\n * from its `project.json` tags.\r\n */\r\nexport const TAGS = {\r\n functionApp: 'type:function-app',\r\n nodeApp: 'type:node-app',\r\n reactApp: 'type:react-app',\r\n vueApp: 'type:vue-app',\r\n svelteApp: 'type:svelte-app',\r\n nextjsApp: 'type:nextjs-app',\r\n publishableLib: 'type:publishable-lib',\r\n internalLib: 'type:internal-lib',\r\n ignore: 'ci:ignore',\r\n} as const\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport { dirname } from 'node:path'\r\n\r\n/**\r\n * Creates a directory (and parents) if it does not already exist.\r\n *\r\n * @remarks\r\n * No-op when the directory is already present.\r\n *\r\n * @param directory - Absolute path to ensure exists.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * by the underlying `mkdirSync` call.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function ensureDirectory (directory: string): void {\r\n if (!existsSync(directory)) {\r\n mkdirSync(directory, { recursive: true })\r\n }\r\n}\r\n\r\n/**\r\n * Writes a UTF-8 file, creating parent directories as needed.\r\n *\r\n * @remarks\r\n * Delegates directory creation to {@link ensureDirectory}.\r\n *\r\n * @param filePath - Absolute path of the file to write.\r\n * @param content - UTF-8 text content to write.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * by the underlying write.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function writeFileEnsured (filePath: string, content: string): void {\r\n ensureDirectory(dirname(filePath))\r\n writeFileSync(filePath, content, 'utf8')\r\n}\r\n\r\n/**\r\n * Reads and parses a JSON file as `T`.\r\n *\r\n * @remarks\r\n * Overload: returns `undefined` when the file is missing or invalid (no\r\n * fallback supplied).\r\n *\r\n * @param filePath - Absolute path to the JSON file.\r\n * @param fallback - Not provided in this overload.\r\n * @returns The parsed value, or `undefined` on any error.\r\n * @throws Never - read and parse errors are caught and `undefined` returned.\r\n * @typeParam T - The shape of the expected parsed value.\r\n */\r\nexport function readJsonSafe<T> (filePath: string): T | undefined\r\n/**\r\n * Reads and parses a JSON file as `T`, falling back to `fallback` on any error.\r\n *\r\n * @remarks\r\n * Overload: always returns a value of type `T`.\r\n *\r\n * @param filePath - Absolute path to the JSON file.\r\n * @param fallback - Value returned when the file is missing or invalid.\r\n * @returns The parsed value, or `fallback` on any error.\r\n * @throws Never - read and parse errors are caught and `fallback` returned.\r\n * @typeParam T - The shape of the expected parsed value.\r\n */\r\nexport function readJsonSafe<T> (filePath: string, fallback: T): T\r\n/**\r\n * Implementation for the {@link readJsonSafe} overloads above.\r\n *\r\n * @remarks\r\n * Catches all read/parse errors and returns `fallback` (or `undefined`).\r\n *\r\n * @param filePath - Absolute path to the JSON file.\r\n * @param fallback - Value returned when the file is missing or invalid.\r\n * @returns The parsed value, or `fallback`/`undefined` on any error.\r\n * @throws Never - read and parse errors are caught and replaced by `fallback`.\r\n * @typeParam T - The shape of the expected parsed value.\r\n */\r\nexport function readJsonSafe<T> (filePath: string, fallback?: T): T | undefined {\r\n try {\r\n return JSON.parse(readFileSync(filePath, 'utf8')) as T\r\n } catch {\r\n return fallback\r\n }\r\n}\r\n\r\n/**\r\n * Returns the trimmed text content of a file, or an empty string.\r\n *\r\n * @remarks\r\n * Swallows all read errors (e.g. file not found) and returns `''` instead.\r\n *\r\n * @param filePath - Absolute path to the file to read.\r\n * @returns The file's UTF-8 content, or `''` on any error.\r\n * @throws Never - read errors are caught and an empty string returned.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function readTextSafe (filePath: string): string {\r\n try {\r\n return readFileSync(filePath, 'utf8')\r\n } catch {\r\n return ''\r\n }\r\n}\r\n\r\n/**\r\n * Serialises a value as pretty-printed JSON with a trailing newline.\r\n *\r\n * @remarks\r\n * Uses a 2-space indent to match the project's formatting conventions.\r\n *\r\n * @param value - The value to serialise.\r\n * @returns The JSON string, terminated with `\\n`.\r\n * @throws Propagates any error `JSON.stringify` raises (e.g. circular references).\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function toJson (value: unknown): string {\r\n return `${JSON.stringify(value, undefined, 2)}\\n`\r\n}\r\n\r\nexport { existsSync as fileExists } from 'node:fs'\r\n","/**\r\n * Minimal namespaced console logger used across the CLI.\r\n *\r\n * @remarks\r\n * Each method prefixes `message` with a small glyph to distinguish severity\r\n * when scanning terminal output.\r\n */\r\nexport const logger = {\r\n info (message: string): void {\r\n console.log(message)\r\n },\r\n step (message: string): void {\r\n console.log(`→ ${message}`)\r\n },\r\n success (message: string): void {\r\n console.log(`✓ ${message}`)\r\n },\r\n warn (message: string): void {\r\n console.warn(`! ${message}`)\r\n },\r\n error (message: string): void {\r\n console.error(`✗ ${message}`)\r\n },\r\n}\r\n","import { input } from '@inquirer/prompts'\r\n\r\n/**\r\n * Prompts for a non-empty trimmed string with an optional default.\r\n *\r\n * @remarks\r\n * Wraps `@inquirer/prompts`'s `input`, enforcing a non-empty result.\r\n *\r\n * @param message - The prompt message to display.\r\n * @param fallback - Optional default value pre-filled in the prompt.\r\n * @returns The trimmed, non-empty string the user entered.\r\n * @throws Propagates any error `@inquirer/prompts`'s `input` raises (e.g. when\r\n * stdin is not a TTY).\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function promptText (message: string, fallback?: string): Promise<string> {\r\n const value = await input({\r\n message,\r\n default: fallback,\r\n validate: (value: string) => value.trim().length > 0 || 'A value is required',\r\n })\r\n return value.trim()\r\n}\r\n\r\nexport { checkbox, select, confirm, input } from '@inquirer/prompts'\r\n","/**\r\n * Converts an arbitrary workspace or project name into a safe kebab-case slug\r\n * (lower-case, single dashes, no leading/trailing separators). Splits\r\n * camelCase/PascalCase boundaries so `QuotesManager` becomes `quotes-manager`.\r\n *\r\n * @remarks\r\n * Pure string transform; performs no I/O.\r\n *\r\n * @param input - The raw name to slugify.\r\n * @returns The kebab-case slug.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function toSlug (input: string): string {\r\n return input\r\n .trim()\r\n .replaceAll(/([a-z0-9])([A-Z])/g, '$1-$2')\r\n .replaceAll(/[^a-zA-Z0-9]+/g, '-')\r\n .replaceAll(/^-+|-+$/g, '')\r\n .toLowerCase()\r\n}\r\n\r\n/**\r\n * Sanitises a name into an UPPER_SNAKE token usable as an Azure pipeline\r\n * variable suffix (mirrors `sanitizeVariableToken` in the build templates).\r\n *\r\n * @remarks\r\n * Pure string transform; performs no I/O.\r\n *\r\n * @param input - The raw name to sanitise.\r\n * @returns The UPPER_SNAKE token.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function toVariableToken (input: string): string {\r\n return input\r\n .trim()\r\n .replaceAll(/[^A-Za-z0-9]+/g, '_')\r\n .replaceAll(/^_+|_+$/g, '')\r\n .toUpperCase()\r\n}\r\n","import { join } from 'node:path'\r\nimport { fileExists, writeFileEnsured } from './fsx'\r\nimport { logger } from '../util/logger'\r\nimport type { FileSpec } from './types'\r\n\r\n/**\r\n * Outcome of writing a batch of {@link FileSpec}s to disk.\r\n *\r\n * @remarks\r\n * Returned by {@link applyFiles} and consumed by {@link reportApply}.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface ApplyResult {\r\n created: string[]\r\n overwritten: string[]\r\n skipped: string[]\r\n}\r\n\r\n/**\r\n * Writes a set of {@link FileSpec}s into `repoRoot`.\r\n *\r\n * @remarks\r\n * `tool-owned` files are always written; `scaffold` files are only written when\r\n * they do not yet exist, so user edits are preserved on re-runs.\r\n *\r\n * @param repoRoot - Absolute path to the target repo root.\r\n * @param files - The file specs to write.\r\n * @returns Which paths were created, overwritten, or skipped.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * while writing a file.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function applyFiles (repoRoot: string, files: FileSpec[]): ApplyResult {\r\n const result: ApplyResult = { created: [], overwritten: [], skipped: [] }\r\n\r\n for (const file of files) {\r\n const absolute = join(repoRoot, file.path)\r\n const exists = fileExists(absolute)\r\n\r\n if (file.ownership === 'scaffold' && exists) {\r\n result.skipped.push(file.path)\r\n continue\r\n }\r\n\r\n writeFileEnsured(absolute, file.content)\r\n if (exists) {\r\n result.overwritten.push(file.path)\r\n } else {\r\n result.created.push(file.path)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Logs a concise summary of an {@link ApplyResult}.\r\n *\r\n * @remarks\r\n * Purely a logging side effect; does not touch the filesystem.\r\n *\r\n * @param result - The result to summarise.\r\n * @returns Nothing.\r\n * @throws Never - only writes to the logger.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function reportApply (result: ApplyResult): void {\r\n for (const path of result.created) {\r\n logger.success(`created ${path}`)\r\n }\r\n for (const path of result.overwritten) {\r\n logger.step(`updated ${path}`)\r\n }\r\n for (const path of result.skipped) {\r\n logger.info(` kept ${path} (already exists)`)\r\n }\r\n}\r\n","import { join } from 'node:path'\r\nimport { readJsonSafe, toJson, writeFileEnsured } from './fsx'\r\n\r\ntype DependencySection = 'dependencies' | 'devDependencies'\r\n\r\n/**\r\n * Merges entries into a section of the monorepo ROOT package.json (where all\r\n * deps live). Only adds names not already present, then sorts the section.\r\n *\r\n * @remarks\r\n * Existing versions for already-present names are left untouched.\r\n *\r\n * @param repoRoot - Absolute path to the monorepo root.\r\n * @param dependencies - Name-to-version-range entries to merge in.\r\n * @param section - Which `package.json` section to merge into.\r\n * @returns The names that were newly added (already-present names are skipped).\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * while writing `package.json`.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function addRootDependencies (\r\n repoRoot: string,\r\n dependencies: Record<string, string>,\r\n section: DependencySection = 'dependencies',\r\n): string[] {\r\n const manifestPath = join(repoRoot, 'package.json')\r\n const manifest = readJsonSafe<Record<string, unknown>>(manifestPath, {})\r\n const existing = (manifest[section] as Record<string, string> | undefined) ?? {}\r\n const added: string[] = []\r\n\r\n for (const [name, version] of Object.entries(dependencies)) {\r\n if (Object.hasOwn(existing, name)) {\r\n continue\r\n }\r\n\r\n existing[name] = version\r\n added.push(name)\r\n }\r\n\r\n manifest[section] = Object.fromEntries(\r\n Object.entries(existing).toSorted(([left], [right]) => left.localeCompare(right)),\r\n )\r\n writeFileEnsured(manifestPath, toJson(manifest))\r\n\r\n return added\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\n/** Per-framework specifics layered onto the shared Vite frontend template. */\r\ninterface FrontendFramework {\r\n tag: string\r\n /** DOM id the app mounts into. */\r\n mountId: string\r\n /** Vite plugin import line and call expression. */\r\n vitePluginImport: string\r\n vitePluginCall: string\r\n /** Sample single-file-component path + content. */\r\n componentPath: string\r\n componentContent: string\r\n /** `src/main.ts` content. */\r\n mainContent: string\r\n /** `src/vite-env.d.ts` content (client types + a module shim). */\r\n envContent: string\r\n}\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n 'build:dev': 'vite build --mode dev --outDir dist-dev',\r\n 'build:uat': 'vite build --mode uat --outDir dist-uat',\r\n 'build:prod': 'vite build --mode prod --outDir dist-prod',\r\n 'build:all': 'npm run build:dev && npm run build:uat && npm run build:prod',\r\n build: 'npm run build:dev',\r\n preview: 'vite preview',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars, framework: FrontendFramework): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [framework.tag],\r\n targets: {\r\n build: {\r\n executor: 'nx:run-commands',\r\n outputs: ['{projectRoot}/dist-dev', '{projectRoot}/dist-uat', '{projectRoot}/dist-prod'],\r\n options: { command: `npm run build -w ${vars.packageName}` },\r\n },\r\n serve: run('dev'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n lib: ['es2022', 'DOM', 'DOM.Iterable'],\r\n module: 'esnext',\r\n moduleResolution: 'bundler',\r\n types: ['vite/client', 'node'],\r\n noEmit: true,\r\n sourceMap: true,\r\n allowSyntheticDefaultImports: true,\r\n esModuleInterop: true,\r\n },\r\n include: ['src', 'vite.config.ts'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction viteConfig (framework: FrontendFramework): string {\r\n return `${framework.vitePluginImport}\r\nimport { defineConfig } from 'vite'\r\n\r\nexport default defineConfig({ plugins: [${framework.vitePluginCall}], server: { port: 5173 }, build: { sourcemap: true } })\r\n`\r\n}\r\n\r\nfunction indexHtml (vars: ProjectVars, framework: FrontendFramework): string {\r\n return `<!doctype html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${vars.name}</title>\r\n </head>\r\n <body>\r\n <div id=\"${framework.mountId}\"></div>\r\n <script type=\"module\" src=\"/src/main.ts\"></script>\r\n </body>\r\n</html>\r\n`\r\n}\r\n\r\nconst greetingTs = `/**\r\n * Returns the greeting rendered by the app.\r\n *\r\n * @remarks Shared TS logic — unit-tested directly so no SFC test transform is needed.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n return 'Hello from ' + name + '!'\r\n}\r\n`\r\n\r\nconst greetingTestTs = `import { greet } from './greeting'\r\n\r\ndescribe('greet', () => {\r\n it('greets the given name', () => {\r\n expect(greet('world')).toBe('Hello from world!')\r\n })\r\n})\r\n`\r\n\r\nfunction envFile (environment: string): string {\r\n return `VITE_ENVIRONMENT=${environment}\\nVITE_API_URL=https://${environment}.example.com\\n`\r\n}\r\n\r\nconst VUE: FrontendFramework = {\r\n tag: TAGS.vueApp,\r\n mountId: 'app',\r\n vitePluginImport: 'import vue from \\'@vitejs/plugin-vue\\'',\r\n vitePluginCall: 'vue()',\r\n componentPath: 'src/App.vue',\r\n componentContent: `<script setup lang=\"ts\">\r\nimport { greet } from './greeting'\r\n\r\nconst message = greet('Vue')\r\n</script>\r\n\r\n<template>\r\n <main>\r\n <h1>{{ message }}</h1>\r\n </main>\r\n</template>\r\n`,\r\n mainContent: `import { createApp } from 'vue'\r\nimport App from './App.vue'\r\n\r\ncreateApp(App).mount('#app')\r\n`,\r\n envContent: `/// <reference types=\"vite/client\" />\r\n\r\ndeclare module '*.vue' {\r\n import type { DefineComponent } from 'vue'\r\n\r\n const component: DefineComponent\r\n export default component\r\n}\r\n`,\r\n}\r\n\r\nconst SVELTE: FrontendFramework = {\r\n tag: TAGS.svelteApp,\r\n mountId: 'app',\r\n vitePluginImport: 'import { svelte } from \\'@sveltejs/vite-plugin-svelte\\'',\r\n vitePluginCall: 'svelte()',\r\n componentPath: 'src/App.svelte',\r\n componentContent: `<script lang=\"ts\">\r\n import { greet } from './greeting'\r\n\r\n const message = greet('Svelte')\r\n</script>\r\n\r\n<main>\r\n <h1>{ message }</h1>\r\n</main>\r\n`,\r\n mainContent: `import { mount } from 'svelte'\r\nimport App from './App.svelte'\r\n\r\nmount(App, { target: document.querySelector('#app')! })\r\n`,\r\n envContent: `/// <reference types=\"vite/client\" />\r\n\r\ndeclare module '*.svelte' {\r\n import type { Component } from 'svelte'\r\n\r\n const component: Component\r\n export default component\r\n}\r\n`,\r\n}\r\n\r\nfunction frontendAppFiles (vars: ProjectVars, framework: FrontendFramework): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars, framework), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('vite.config.ts', viteConfig(framework), 'scaffold'),\r\n file('index.html', indexHtml(vars, framework), 'scaffold'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('.env.dev', envFile('dev'), 'scaffold'),\r\n file('.env.uat', envFile('uat'), 'scaffold'),\r\n file('.env.prod', envFile('prod'), 'scaffold'),\r\n file('src/vite-env.d.ts', framework.envContent, 'scaffold'),\r\n file('src/main.ts', framework.mainContent, 'scaffold'),\r\n file(framework.componentPath, framework.componentContent, 'scaffold'),\r\n file('src/greeting.ts', greetingTs, 'scaffold'),\r\n file('src/greeting.test.ts', greetingTestTs, 'scaffold'),\r\n ]\r\n}\r\n\r\n/**\r\n * Files for a Vue (Vite) app at `apps/<name>` with dev/uat/prod builds.\r\n *\r\n * @remarks\r\n * The `.vue` SFC is built by Vite (and not linted); jest covers the shared TS\r\n * helper so no SFC test transform is required.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Vue app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function vueAppFiles (vars: ProjectVars): FileSpec[] {\r\n return frontendAppFiles(vars, VUE)\r\n}\r\n\r\n/**\r\n * Files for a Svelte (Vite) app at `apps/<name>` with dev/uat/prod builds.\r\n *\r\n * @remarks\r\n * The `.svelte` SFC is built by Vite (and not linted); jest covers the shared TS\r\n * helper so no SFC test transform is required.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Svelte app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function svelteAppFiles (vars: ProjectVars): FileSpec[] {\r\n return frontendAppFiles(vars, SVELTE)\r\n}\r\n","import { existsSync, readdirSync, readFileSync } from 'node:fs'\r\nimport { dirname, join, relative, sep } from 'node:path'\r\n\r\n/**\r\n * Resolves the bundled `assets/` directory. Works both from `dist/` (after\r\n * build, where assets sit beside the bundle) and from `src/` during tests by\r\n * walking up until an `assets` directory is found.\r\n *\r\n * Memoized in a closure (rather than a top-level variable) so the result\r\n * survives across calls without exposing mutable module-level state.\r\n *\r\n * @remarks\r\n * Throws if no `assets` directory is found within 8 levels up from this\r\n * module's directory.\r\n */\r\nexport const assetsRoot = (() => {\r\n let cachedRoot: string | undefined\r\n\r\n return (): string => {\r\n if (cachedRoot) {\r\n return cachedRoot\r\n }\r\n\r\n let directory = __dirname\r\n for (let level = 0; level < 8; level++) {\r\n const candidate = join(directory, 'assets')\r\n if (existsSync(candidate)) {\r\n cachedRoot = candidate\r\n return candidate\r\n }\r\n\r\n const parent = dirname(directory)\r\n if (parent === directory) {\r\n break\r\n }\r\n directory = parent\r\n }\r\n\r\n throw new Error('MoNecromanCI assets directory not found')\r\n }\r\n})()\r\n\r\n/**\r\n * Reads a bundled asset file as UTF-8 text.\r\n *\r\n * @remarks\r\n * Resolves `relativePath` against {@link assetsRoot}.\r\n *\r\n * @param relativePath - Path relative to the assets root.\r\n * @returns The file's UTF-8 content.\r\n * @throws Propagates any Node.js `fs` error (e.g. file not found) raised by\r\n * the underlying read.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function readAsset (relativePath: string): string {\r\n return readFileSync(join(assetsRoot(), relativePath), 'utf8')\r\n}\r\n\r\n/**\r\n * Lists every file under an asset directory as forward-slash relative paths.\r\n *\r\n * @remarks\r\n * Recurses into subdirectories; paths are normalised to forward slashes\r\n * regardless of platform.\r\n *\r\n * @param relativeDirectory - Directory, relative to {@link assetsRoot}, to list.\r\n * @returns The relative file paths found, in directory-traversal order.\r\n * @throws Propagates any Node.js `fs` error (e.g. directory not found) raised\r\n * by the underlying read.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function listAssetFiles (relativeDirectory: string): string[] {\r\n const base = join(assetsRoot(), relativeDirectory)\r\n const files: string[] = []\r\n\r\n const walk = (directory: string): void => {\r\n const entries = readdirSync(directory, { withFileTypes: true })\r\n for (const entry of entries) {\r\n const full = join(directory, entry.name)\r\n if (entry.isDirectory()) {\r\n walk(full)\r\n } else {\r\n files.push(relative(base, full).split(sep).join('/'))\r\n }\r\n }\r\n }\r\n\r\n walk(base)\r\n return files\r\n}\r\n","import { readAsset } from '../engine/assets'\r\nimport { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'commonjs',\r\n main: 'dist/index.js',\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p tsconfig.app.json',\r\n watch: 'tsc -p tsconfig.app.json -w',\r\n start: 'func start',\r\n 'clean:config': 'node ../../tools/clean-config.mjs',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n doc: 'typedoc --tsconfig tsconfig.app.json',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.functionApp],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: `npm run build -w ${vars.packageName}` } },\r\n serve: run('start'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n target: 'es2022',\r\n sourceMap: true,\r\n declaration: false,\r\n declarationMap: false,\r\n esModuleInterop: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction appTsconfigApp (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n sourceMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction hostJson (): string {\r\n return toJson({\r\n version: '2.0',\r\n logging: {\r\n applicationInsights: {\r\n samplingSettings: { isEnabled: true, excludedTypes: 'Request' },\r\n },\r\n },\r\n extensionBundle: {\r\n id: 'Microsoft.Azure.Functions.ExtensionBundle',\r\n version: '[4.*, 5.0.0)',\r\n },\r\n })\r\n}\r\n\r\nfunction localSettingsJson (): string {\r\n // Gitignored. The --inspect arg lets VSCode attach on :9229 for TS debugging.\r\n return toJson({\r\n IsEncrypted: false,\r\n Values: {\r\n FUNCTIONS_WORKER_RUNTIME: 'node',\r\n AzureWebJobsStorage: '',\r\n languageWorkers__node__arguments: '--inspect=9229',\r\n },\r\n })\r\n}\r\n\r\nfunction configurationFile (environment: string): string {\r\n return toJson([\r\n { name: 'FUNCTIONS_WORKER_RUNTIME', value: 'node', slotSetting: false },\r\n { name: 'WEBSITE_NODE_DEFAULT_VERSION', value: '~24', slotSetting: false },\r\n { name: 'ENVIRONMENT', value: environment, slotSetting: false },\r\n ])\r\n}\r\n\r\nconst greetingTs = `/**\r\n * Builds the greeting returned by the sample HTTP function.\r\n *\r\n * @remarks Pure string helper — replace with your own logic.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function buildGreeting (name: string): string {\r\n return 'Hello, ' + name + '!'\r\n}\r\n`\r\n\r\nconst greetingTestTs = `import { buildGreeting } from './greeting'\r\n\r\ndescribe('buildGreeting', () => {\r\n it('greets a name', () => {\r\n expect(buildGreeting('world')).toBe('Hello, world!')\r\n })\r\n})\r\n`\r\n\r\nconst helloTs = `import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions'\r\nimport { buildGreeting } from '../greeting'\r\n\r\n/**\r\n * Sample HTTP-triggered function.\r\n *\r\n * @remarks Registered with the Functions host via the app.http call below.\r\n * @param request - The incoming HTTP request.\r\n * @param context - The Azure Functions invocation context.\r\n * @returns The HTTP response payload.\r\n * @throws Never - failures are surfaced by the Functions host.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function hello (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {\r\n context.log('HTTP function processed a request for ' + request.url)\r\n const name = request.query.get('name') ?? 'world'\r\n\r\n return { body: buildGreeting(name) }\r\n}\r\n\r\n// app.http performs the Azure Functions v4 registration at import time.\r\n// eslint-disable-next-line unicorn/no-top-level-side-effects\r\napp.http('hello', { methods: ['GET'], authLevel: 'anonymous', handler: hello })\r\n`\r\n\r\nconst indexTs = `import './functions/hello'\r\n`\r\n\r\n/**\r\n * Files for an Azure Function App at `apps/<name>`.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the function app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function functionAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('tsconfig.app.json', appTsconfigApp(), 'tool-owned'),\r\n file('host.json', hostJson(), 'scaffold'),\r\n file('local.settings.json', localSettingsJson(), 'scaffold'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('.configurations/dev.json', configurationFile('dev'), 'scaffold'),\r\n file('.configurations/uat.json', configurationFile('uat'), 'scaffold'),\r\n file('.configurations/prod.json', configurationFile('prod'), 'scaffold'),\r\n file('src/index.ts', indexTs, 'scaffold'),\r\n file('src/greeting.ts', greetingTs, 'scaffold'),\r\n file('src/greeting.test.ts', greetingTestTs, 'scaffold'),\r\n file('src/functions/hello.ts', helloTs, 'scaffold'),\r\n { path: 'tools/clean-config.mjs', content: readAsset('scripts/clean-config.mjs'), ownership: 'tool-owned' },\r\n ]\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction libPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'commonjs',\r\n // Point at source so consumers resolve TS directly: enables step-into-source\r\n // debugging and editor \"find references\" across internal libraries.\r\n main: './src/index.ts',\r\n types: './src/index.ts',\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p ./tsconfig.lib.json',\r\n test: 'jest --collectCoverage',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n doc: 'typedoc --tsconfig tsconfig.lib.json',\r\n },\r\n })\r\n}\r\n\r\nfunction libProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `libs/${vars.name}/src`,\r\n projectType: 'library',\r\n tags: [TAGS.internalLib],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: `npm run build -w ${vars.packageName}` } },\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nfunction libTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'nodenext',\r\n moduleResolution: 'nodenext',\r\n target: 'es2024',\r\n lib: ['es2024'],\r\n noEmit: true,\r\n emitDeclarationOnly: true,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n allowSyntheticDefaultImports: true,\r\n importHelpers: true,\r\n isolatedModules: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction libTsconfigLib (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n emitDeclarationOnly: false,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts', './src/_jest/**'],\r\n })\r\n}\r\n\r\nfunction libTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nconst indexTs = `export * from './greeter'\r\n`\r\n\r\nconst greeterTs = `/**\r\n * Returns a friendly greeting for the given name.\r\n *\r\n * @remarks Demonstrates step-into-source debugging across internal libraries.\r\n * @param name - The name to greet (surrounding whitespace is trimmed).\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n const trimmed = name.trim() // ← set a breakpoint here, then run \"Debug Jest (current file)\"\r\n\r\n return 'Hello, ' + trimmed + '!'\r\n}\r\n`\r\n\r\nconst greeterTestTs = `import { greet } from './index'\r\n\r\ndescribe('greet', () => {\r\n it('greets a trimmed name', () => {\r\n expect(greet(' Ada ')).toBe('Hello, Ada!')\r\n })\r\n})\r\n`\r\n\r\n/**\r\n * Returns every file for a new internal library at `libs/<name>`.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the internal library.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function internalLibFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `libs/${vars.name}`\r\n const toolOwned = (path: string, content: string): FileSpec => ({ path: `${root}/${path}`, content, ownership: 'tool-owned' })\r\n const scaffold = (path: string, content: string): FileSpec => ({ path: `${root}/${path}`, content, ownership: 'scaffold' })\r\n\r\n return [\r\n scaffold('package.json', libPackageJson(vars)),\r\n toolOwned('project.json', libProjectJson(vars)),\r\n toolOwned('tsconfig.json', libTsconfig()),\r\n toolOwned('tsconfig.lib.json', libTsconfigLib()),\r\n scaffold('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`),\r\n toolOwned('typedoc.json', libTypedoc()),\r\n scaffold('src/index.ts', indexTs),\r\n scaffold('src/greeter.ts', greeterTs),\r\n scaffold('src/greeter.test.ts', greeterTestTs),\r\n ]\r\n}\r\n","import { readAsset } from '../engine/assets'\r\nimport { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nconst buildEnvScript = (environment: string): string => `dotenv -e .env.${environment} -- node ../../tools/next-build.mjs ${environment}`\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'next dev',\r\n 'build:dev': buildEnvScript('dev'),\r\n 'build:uat': buildEnvScript('uat'),\r\n 'build:prod': buildEnvScript('prod'),\r\n 'build:all': 'npm run build:dev && npm run build:uat && npm run build:prod',\r\n build: 'npm run build:dev',\r\n start: 'next start',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.nextjsApp],\r\n targets: {\r\n build: {\r\n executor: 'nx:run-commands',\r\n outputs: ['{projectRoot}/dist-dev', '{projectRoot}/dist-uat', '{projectRoot}/dist-prod'],\r\n options: { command: `npm run build -w ${vars.packageName}` },\r\n },\r\n serve: run('dev'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n lib: ['es2022', 'dom', 'dom.iterable'],\r\n jsx: 'preserve',\r\n module: 'esnext',\r\n moduleResolution: 'bundler',\r\n types: ['node'],\r\n noEmit: true,\r\n allowJs: true,\r\n esModuleInterop: true,\r\n incremental: true,\r\n plugins: [{ name: 'next' }],\r\n },\r\n include: ['next-env.d.ts', 'src', '.next/types/**/*.ts'],\r\n exclude: ['node_modules'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nconst nextConfig = `import path from 'node:path'\r\n\r\n// ESLint runs as its own monorepo target (npm run lint); Next type-checks the build.\r\nconst nextConfig = { output: process.env.NEXT_OUTPUT === 'export' ? 'export' : 'standalone', outputFileTracingRoot: path.join(import.meta.dirname, '..', '..'), eslint: { ignoreDuringBuilds: true } }\r\n\r\nexport default nextConfig\r\n`\r\n\r\nfunction layoutTsx (vars: ProjectVars): string {\r\n return `import type { ReactNode } from 'react'\r\n\r\nexport const metadata = { title: '${vars.name}' }\r\n\r\n// Root layout required by the Next.js App Router; wraps every page.\r\nexport default function RootLayout ({ children }: { children: ReactNode }) {\r\n return (\r\n <html lang='en'>\r\n <body>{ children }</body>\r\n </html>\r\n )\r\n}\r\n`\r\n}\r\n\r\nconst pageTsx = `import { greet } from '../greeting'\r\n\r\n// Home page (App Router server component).\r\nexport default function Home () {\r\n return (\r\n <main>\r\n <h1>{greet('Next.js')}</h1>\r\n </main>\r\n )\r\n}\r\n`\r\n\r\nconst greetingTs = `/**\r\n * Returns the greeting rendered on the home page.\r\n *\r\n * @remarks Shared TS logic — unit-tested directly (no Next.js test transform needed).\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n return 'Hello from ' + name + '!'\r\n}\r\n`\r\n\r\nconst greetingTestTs = `import { greet } from './greeting'\r\n\r\ndescribe('greet', () => {\r\n it('greets the given name', () => {\r\n expect(greet('world')).toBe('Hello from world!')\r\n })\r\n})\r\n`\r\n\r\nfunction envFile (environment: string): string {\r\n return `NEXT_PUBLIC_ENVIRONMENT=${environment}\\nNEXT_PUBLIC_API_URL=https://${environment}.example.com\\n`\r\n}\r\n\r\n/**\r\n * Files for a full-stack Next.js app at `apps/<name>`.\r\n *\r\n * @remarks\r\n * App Router with dev/uat/prod builds assembled into `dist-<env>` by the\r\n * vendored `tools/next-build.mjs` (server-standalone by default, or static\r\n * export via `NEXT_OUTPUT=export`). The page/layout are built by Next; jest\r\n * covers the shared TS helper.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Next.js app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function nextAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('next.config.mjs', nextConfig, 'scaffold'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('.env.dev', envFile('dev'), 'scaffold'),\r\n file('.env.uat', envFile('uat'), 'scaffold'),\r\n file('.env.prod', envFile('prod'), 'scaffold'),\r\n file('src/app/layout.tsx', layoutTsx(vars), 'scaffold'),\r\n file('src/app/page.tsx', pageTsx, 'scaffold'),\r\n file('src/greeting.ts', greetingTs, 'scaffold'),\r\n file('src/greeting.test.ts', greetingTestTs, 'scaffold'),\r\n { path: 'tools/next-build.mjs', content: readAsset('scripts/next-build.mjs'), ownership: 'tool-owned' },\r\n ]\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'commonjs',\r\n main: 'dist/index.js',\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p tsconfig.app.json',\r\n watch: 'tsc -p tsconfig.app.json -w',\r\n start: 'node dist/index.js',\r\n dev: 'tsx watch src/index.ts',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n doc: 'typedoc --tsconfig tsconfig.app.json',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.nodeApp],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: `npm run build -w ${vars.packageName}` } },\r\n serve: run('start'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n target: 'es2022',\r\n sourceMap: true,\r\n declaration: false,\r\n declarationMap: false,\r\n esModuleInterop: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction appTsconfigApp (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n sourceMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nconst serverTs = `import { IncomingMessage, ServerResponse } from 'node:http'\r\n\r\n/**\r\n * Builds the greeting returned by the server.\r\n *\r\n * @remarks Pure string helper — replace with your own logic.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function buildGreeting (name: string): string {\r\n return 'Hello, ' + name + '!'\r\n}\r\n\r\n/**\r\n * Handles an HTTP request, replying with a plain-text greeting.\r\n *\r\n * @remarks Swap in Express, Koa, Fastify, Nest or any framework you prefer.\r\n * @param request - The incoming HTTP request.\r\n * @param response - The HTTP response to write to.\r\n * @returns Nothing.\r\n * @throws Never - failures surface through the Node HTTP server.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function handleRequest (request: IncomingMessage, response: ServerResponse): void {\r\n const requestUrl = new URL(request.url ?? '/', 'http://localhost')\r\n const name = requestUrl.searchParams.get('name') ?? 'world'\r\n\r\n response.writeHead(200, { 'content-type': 'text/plain' })\r\n response.end(buildGreeting(name))\r\n}\r\n`\r\n\r\nconst indexTs = `import { createServer } from 'node:http'\r\nimport { handleRequest } from './server'\r\n\r\nconst port = Number(process.env.PORT ?? 3000)\r\n\r\ncreateServer(handleRequest).listen(port, () => {\r\n console.log('Server listening on http://localhost:' + port)\r\n})\r\n`\r\n\r\nconst serverTestTs = `import { buildGreeting } from './server'\r\n\r\ndescribe('buildGreeting', () => {\r\n it('greets a name', () => {\r\n expect(buildGreeting('world')).toBe('Hello, world!')\r\n })\r\n})\r\n`\r\n\r\n/**\r\n * Files for a generic Node.js app at `apps/<name>`.\r\n *\r\n * @remarks\r\n * A framework-agnostic TS HTTP server (node:http) the user extends with any\r\n * framework. Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Node app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function nodeAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('tsconfig.app.json', appTsconfigApp(), 'tool-owned'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('src/index.ts', indexTs, 'scaffold'),\r\n file('src/server.ts', serverTs, 'scaffold'),\r\n file('src/server.test.ts', serverTestTs, 'scaffold'),\r\n ]\r\n}\r\n","import type { RegistryConfig } from './types'\r\n\r\n/**\r\n * Returns the npm registry URL for a registry config.\r\n *\r\n * @remarks\r\n * Public npm needs no scoped registry, so it returns `undefined`.\r\n *\r\n * @param registry - The monorepo's resolved registry configuration.\r\n * @returns The registry URL, or `undefined` for the public npm registry.\r\n * @throws Never - performs a pure mapping with no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function registryUrl (registry: RegistryConfig): string | undefined {\r\n switch (registry.kind) {\r\n case 'azure-artifacts': {\r\n return `https://pkgs.dev.azure.com/${registry.organization}/${registry.project}/_packaging/${registry.artifactsFeed}/npm/registry/`\r\n }\r\n case 'github-packages': {\r\n return 'https://npm.pkg.github.com/'\r\n }\r\n default: {\r\n return undefined\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds the `.npmrc` body for a registry configuration.\r\n *\r\n * @remarks\r\n * Always points the default registry at public npm, then adds a scoped registry\r\n * plus auth-token line for Azure Artifacts / GitHub Packages. The\r\n * `${NODE_AUTH_TOKEN}` placeholder is kept literal (the CI authenticates it).\r\n *\r\n * @param registry - The monorepo's resolved registry configuration.\r\n * @param scope - The npm scope (e.g. `@auto`) the scoped registry applies to.\r\n * @returns The full text of the generated `.npmrc`.\r\n * @throws Never - performs a pure mapping with no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function npmrcContent (registry: RegistryConfig, scope: string): string {\r\n const scopeName = scope.replace(/^@/, '')\r\n const url = registryUrl(registry)\r\n const lines = [\r\n 'registry=https://registry.npmjs.org/',\r\n '; ESLint 10 lands ahead of some plugins\\' peer ranges; accept the resolved tree.',\r\n 'legacy-peer-deps=true',\r\n ]\r\n\r\n if (url) {\r\n const host = url.replace(/^https:\\/\\//, '')\r\n lines.push(`@${scopeName}:registry=${url}`, `//${host}:_authToken=\\${NODE_AUTH_TOKEN}`)\r\n }\r\n\r\n lines.push('')\r\n return lines.join('\\n')\r\n}\r\n","import { readAsset } from '../engine/assets'\r\nimport { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport { registryUrl } from '../engine/registry'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction publishConfig (vars: ProjectVars): Record<string, string> | undefined {\r\n const url = vars.registry ? registryUrl(vars.registry) : undefined\r\n return url ? { registry: url } : undefined\r\n}\r\n\r\nfunction tsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'nodenext',\r\n moduleResolution: 'nodenext',\r\n target: 'es2024',\r\n lib: ['es2024'],\r\n noEmit: true,\r\n emitDeclarationOnly: true,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n allowSyntheticDefaultImports: true,\r\n importHelpers: true,\r\n isolatedModules: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction tsconfigLib (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n emitDeclarationOnly: false,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction typedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction projectJson (vars: ProjectVars, buildCommand: string): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `libs/${vars.name}/src`,\r\n projectType: vars.kind === 'cli-tool' ? 'application' : 'library',\r\n tags: [TAGS.publishableLib],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: buildCommand } },\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nconst greeterTs = `/**\r\n * Returns a friendly greeting for the given name.\r\n *\r\n * @remarks The package's public API entry point.\r\n * @param name - The name to greet (surrounding whitespace is trimmed).\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n const trimmed = name.trim() // ← breakpoint here works under \"Debug Jest (current file)\"\r\n\r\n return 'Hello, ' + trimmed + '!'\r\n}\r\n`\r\n\r\nconst greeterTestTs = `import { greet } from './index'\r\n\r\ndescribe('greet', () => {\r\n it('greets a trimmed name', () => {\r\n expect(greet(' Ada ')).toBe('Hello, Ada!')\r\n })\r\n})\r\n`\r\n\r\n/** The vendored resolved-deps script, written once at the repo root tools/ dir. */\r\nfunction distPackageScript (): FileSpec {\r\n return {\r\n path: 'tools/generate-dist-package.mjs',\r\n content: readAsset('scripts/generate-dist-package.mjs'),\r\n ownership: 'tool-owned',\r\n }\r\n}\r\n\r\n/**\r\n * Files for a publishable library at `libs/<name>` (published to Azure Artifacts).\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the publishable library.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function publishableLibFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `libs/${vars.name}`\r\n const buildCommand = `npm run build -w ${vars.packageName}`\r\n const packageJson = toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n type: 'commonjs',\r\n main: './src/index.ts',\r\n types: './src/index.ts',\r\n publishConfig: publishConfig(vars),\r\n monecromanci: { dist: { main: './index.js', types: './index.d.ts' } },\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p ./tsconfig.lib.json && node ../../tools/generate-dist-package.mjs',\r\n test: 'jest --collectCoverage',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n doc: 'typedoc --tsconfig tsconfig.lib.json',\r\n publish: 'npm publish ./dist',\r\n },\r\n })\r\n\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', packageJson, 'scaffold'),\r\n file('project.json', projectJson(vars, buildCommand), 'tool-owned'),\r\n file('tsconfig.json', tsconfig(), 'tool-owned'),\r\n file('tsconfig.lib.json', tsconfigLib(), 'tool-owned'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', typedoc(), 'tool-owned'),\r\n file('src/index.ts', 'export * from \\'./greeter\\'\\n', 'scaffold'),\r\n file('src/greeter.ts', greeterTs, 'scaffold'),\r\n file('src/greeter.test.ts', greeterTestTs, 'scaffold'),\r\n distPackageScript(),\r\n ]\r\n}\r\n\r\nconst cliMainTs = String.raw`/** Sample CLI entry point. Replace with your own command logic. */\r\nfunction main (argv: string[]): void {\r\n const name = argv[0] ?? 'world'\r\n process.stdout.write('Hello, ' + name + '!\\n')\r\n}\r\n\r\nmain(process.argv.slice(2))\r\n`\r\n\r\nconst cliMainTestTs = `import { greet } from './greeter'\r\n\r\ndescribe('greet', () => {\r\n it('greets a name', () => {\r\n expect(greet('world')).toBe('Hello, world!')\r\n })\r\n})\r\n`\r\n\r\nconst cliGreeterTs = `/**\r\n * Returns the greeting printed by the CLI.\r\n *\r\n * @remarks Replace with your own command logic.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n return 'Hello, ' + name + '!'\r\n}\r\n`\r\n\r\n/**\r\n * Files for an executable CLI tool (a publishable lib that also ships a bin).\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the CLI tool.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function cliToolFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `libs/${vars.name}`\r\n const buildCommand = `npm run build -w ${vars.packageName}`\r\n const esbuild = 'esbuild src/cli.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js'\r\n const packageJson = toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n type: 'commonjs',\r\n main: './src/cli.ts',\r\n bin: { [vars.name]: './dist/cli.js' },\r\n publishConfig: publishConfig(vars),\r\n monecromanci: { dist: { main: './cli.js', bin: { [vars.name]: './cli.js' } } },\r\n dependencies: {},\r\n scripts: {\r\n build: `${esbuild} && node ../../tools/generate-dist-package.mjs`,\r\n test: 'jest --collectCoverage',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n doc: 'typedoc --tsconfig tsconfig.lib.json',\r\n publish: 'npm publish ./dist',\r\n },\r\n })\r\n\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', packageJson, 'scaffold'),\r\n file('project.json', projectJson(vars, buildCommand), 'tool-owned'),\r\n file('tsconfig.json', tsconfig(), 'tool-owned'),\r\n file('tsconfig.lib.json', tsconfigLib(), 'tool-owned'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', typedoc(), 'tool-owned'),\r\n file('src/cli.ts', cliMainTs, 'scaffold'),\r\n file('src/greeter.ts', cliGreeterTs, 'scaffold'),\r\n file('src/greeter.test.ts', cliMainTestTs, 'scaffold'),\r\n distPackageScript(),\r\n ]\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n 'build:dev': 'vite build --mode dev --outDir dist-dev',\r\n 'build:uat': 'vite build --mode uat --outDir dist-uat',\r\n 'build:prod': 'vite build --mode prod --outDir dist-prod',\r\n 'build:all': 'npm run build:dev && npm run build:uat && npm run build:prod',\r\n build: 'npm run build:dev',\r\n preview: 'vite preview',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.reactApp],\r\n targets: {\r\n build: {\r\n executor: 'nx:run-commands',\r\n outputs: ['{projectRoot}/dist-dev', '{projectRoot}/dist-uat', '{projectRoot}/dist-prod'],\r\n options: { command: `npm run build -w ${vars.packageName}` },\r\n },\r\n serve: run('dev'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n lib: ['es2022', 'DOM', 'DOM.Iterable'],\r\n module: 'esnext',\r\n moduleResolution: 'bundler',\r\n jsx: 'react-jsx',\r\n types: ['vite/client', 'node'],\r\n noEmit: true,\r\n sourceMap: true,\r\n allowSyntheticDefaultImports: true,\r\n esModuleInterop: true,\r\n },\r\n include: ['src', 'vite.config.ts'],\r\n })\r\n}\r\n\r\nfunction appTsconfigSpec (): string {\r\n // Used by ts-jest: CommonJS + react-jsx so .tsx tests transpile under Jest.\r\n return toJson({\r\n extends: '../../tsconfig.jest.json',\r\n compilerOptions: {\r\n jsx: 'react-jsx',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n types: ['jest', 'node'],\r\n },\r\n })\r\n}\r\n\r\nconst viteConfigTs = `import react from '@vitejs/plugin-react'\r\nimport { defineConfig } from 'vite'\r\n\r\nexport default defineConfig({ plugins: [react()], server: { port: 5173 }, build: { sourcemap: true } })\r\n`\r\n\r\nconst viteEnvDts = `/// <reference types=\"vite/client\" />\r\n`\r\n\r\nfunction indexHtml (vars: ProjectVars): string {\r\n return `<!doctype html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${vars.name}</title>\r\n </head>\r\n <body>\r\n <div id=\"root\"></div>\r\n <script type=\"module\" src=\"/src/main.tsx\"></script>\r\n </body>\r\n</html>\r\n`\r\n}\r\n\r\nconst mainTsx = `import { StrictMode } from 'react'\r\nimport { createRoot } from 'react-dom/client'\r\nimport { App } from './App'\r\n\r\n// Vite exposes the per-environment .env values on import.meta.env (build --mode).\r\nconst environment = import.meta.env.VITE_ENVIRONMENT ?? 'local'\r\nconsole.info('Starting app in ' + environment + ' mode')\r\n\r\ncreateRoot(document.querySelector('#root')!).render(\r\n <StrictMode>\r\n <App />\r\n </StrictMode>,\r\n)\r\n`\r\n\r\nconst appTsx = `/**\r\n * Root application component.\r\n *\r\n * @remarks The app's UI entry point, rendered by main.tsx.\r\n * @returns The rendered application markup.\r\n * @throws Never - a pure render.\r\n * @typeParam None - this component has no generic type parameters.\r\n */\r\nexport function App () {\r\n return (\r\n <main>\r\n <h1>Hello from your new app</h1>\r\n </main>\r\n )\r\n}\r\n`\r\n\r\nconst appTestTsx = `import '@testing-library/jest-dom'\r\nimport { render, screen } from '@testing-library/react'\r\nimport { App } from './App'\r\n\r\ndescribe('App', () => {\r\n it('renders a heading', () => {\r\n render(<App />)\r\n expect(screen.getByRole('heading')).toBeInTheDocument()\r\n })\r\n})\r\n`\r\n\r\nconst jestConfigMjs = (name: string): string => String.raw`import { createConfig } from '../../jest.preset.mjs'\r\n\r\nconst base = createConfig('${name}')\r\n\r\nexport default { ...base, testEnvironment: 'jsdom', transform: { '^.+\\\\.[tj]sx?$': ['ts-jest', { tsconfig: './tsconfig.spec.json' }] } }\r\n`\r\n\r\nfunction envFile (environment: string): string {\r\n return `VITE_ENVIRONMENT=${environment}\\nVITE_API_URL=https://${environment}.example.com\\n`\r\n}\r\n\r\n/**\r\n * Files for a React (Vite) app at `apps/<name>` with dev/uat/prod builds.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the React app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function reactAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('tsconfig.spec.json', appTsconfigSpec(), 'tool-owned'),\r\n file('vite.config.ts', viteConfigTs, 'scaffold'),\r\n file('index.html', indexHtml(vars), 'scaffold'),\r\n file('jest.config.mjs', jestConfigMjs(vars.name), 'scaffold'),\r\n file('.env.dev', envFile('dev'), 'scaffold'),\r\n file('.env.uat', envFile('uat'), 'scaffold'),\r\n file('.env.prod', envFile('prod'), 'scaffold'),\r\n file('src/vite-env.d.ts', viteEnvDts, 'scaffold'),\r\n file('src/main.tsx', mainTsx, 'scaffold'),\r\n file('src/App.tsx', appTsx, 'scaffold'),\r\n file('src/App.test.tsx', appTestTsx, 'scaffold'),\r\n ]\r\n}\r\n","import { applyFiles, reportApply } from '../engine/apply'\r\nimport { addRootDependencies } from '../engine/rootPackage'\r\nimport type { FileSpec, MonecromanciConfig, ProjectKind, ProjectVars } from '../engine/types'\r\nimport { svelteAppFiles, vueAppFiles } from '../templates/frontendApp'\r\nimport { functionAppFiles } from '../templates/functionApp'\r\nimport { internalLibFiles } from '../templates/internalLib'\r\nimport { nextAppFiles } from '../templates/nextApp'\r\nimport { nodeAppFiles } from '../templates/nodeApp'\r\nimport { cliToolFiles, publishableLibFiles } from '../templates/publishableLib'\r\nimport { reactAppFiles } from '../templates/reactApp'\r\nimport { logger } from '../util/logger'\r\n\r\ninterface RootDependencies {\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n}\r\n\r\n/** Root dependencies each project kind requires (all deps live in the root). */\r\nconst ROOT_DEPENDENCIES: Partial<Record<ProjectKind, RootDependencies>> = {\r\n 'function-app': {\r\n dependencies: { '@azure/functions': '^4.16.0' },\r\n },\r\n 'node-app': {\r\n devDependencies: { tsx: '^4.20.6' },\r\n },\r\n 'vue-app': {\r\n dependencies: { vue: '^3.5.13' },\r\n devDependencies: { '@vitejs/plugin-vue': '^5.2.4', vite: '^6.0.7' },\r\n },\r\n 'svelte-app': {\r\n devDependencies: { '@sveltejs/vite-plugin-svelte': '^5.0.3', svelte: '^5.19.0', vite: '^6.0.7' },\r\n },\r\n 'nextjs-app': {\r\n dependencies: { next: '^15.1.4', react: '^19.2.0', 'react-dom': '^19.2.0' },\r\n devDependencies: { '@types/react': '^19.2.0', '@types/react-dom': '^19.2.0', 'dotenv-cli': '^8.0.0' },\r\n },\r\n 'react-app': {\r\n dependencies: { react: '^19.2.0', 'react-dom': '^19.2.0' },\r\n devDependencies: {\r\n '@testing-library/dom': '^10.4.0',\r\n '@testing-library/jest-dom': '^6.6.3',\r\n '@testing-library/react': '^16.1.0',\r\n '@types/react': '^19.2.0',\r\n '@types/react-dom': '^19.2.0',\r\n '@vitejs/plugin-react': '^4.3.4',\r\n 'jest-environment-jsdom': '^30.0.0',\r\n vite: '^6.0.7',\r\n },\r\n },\r\n}\r\n\r\nfunction filesForKind (kind: ProjectKind, vars: ProjectVars): FileSpec[] {\r\n switch (kind) {\r\n case 'internal-lib': {\r\n return internalLibFiles(vars)\r\n }\r\n case 'publishable-lib': {\r\n return publishableLibFiles(vars)\r\n }\r\n case 'cli-tool': {\r\n return cliToolFiles(vars)\r\n }\r\n case 'function-app': {\r\n return functionAppFiles(vars)\r\n }\r\n case 'node-app': {\r\n return nodeAppFiles(vars)\r\n }\r\n case 'react-app': {\r\n return reactAppFiles(vars)\r\n }\r\n case 'vue-app': {\r\n return vueAppFiles(vars)\r\n }\r\n case 'svelte-app': {\r\n return svelteAppFiles(vars)\r\n }\r\n case 'nextjs-app': {\r\n return nextAppFiles(vars)\r\n }\r\n default: {\r\n throw new Error(`The '${kind as string}' generator is not implemented yet.`)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Public accessor used by `doctor` to recompute a project's expected files.\r\n *\r\n * @remarks\r\n * Thin wrapper around the internal `filesForKind` dispatch.\r\n *\r\n * @param kind - The project kind to generate files for.\r\n * @param vars - The project's template inputs.\r\n * @returns The expected file specs for this project.\r\n * @throws Throws when `kind` is not one of the implemented {@link ProjectKind}\r\n * values.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function projectFiles (kind: ProjectKind, vars: ProjectVars): FileSpec[] {\r\n return filesForKind(kind, vars)\r\n}\r\n\r\nfunction applyRootDependencies (repoRoot: string, kind: ProjectKind): void {\r\n const root = ROOT_DEPENDENCIES[kind]\r\n if (!root) {\r\n return\r\n }\r\n\r\n const added = [\r\n ...(root.dependencies ? addRootDependencies(repoRoot, root.dependencies, 'dependencies') : []),\r\n ...(root.devDependencies ? addRootDependencies(repoRoot, root.devDependencies, 'devDependencies') : []),\r\n ]\r\n if (added.length > 0) {\r\n logger.step(`added root dependencies: ${added.join(', ')}`)\r\n }\r\n}\r\n\r\n/**\r\n * Writes a single project's files into an existing monorepo.\r\n *\r\n * @remarks\r\n * Also applies any root-level dependencies the project kind requires (see\r\n * {@link addRootDependencies}).\r\n *\r\n * @param repoRoot - Absolute path to the monorepo root.\r\n * @param kind - The project kind to generate.\r\n * @param name - The kebab-case project name.\r\n * @param config - The monorepo's `.monecromanci.json` stamp.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error raised while writing files, and\r\n * throws when `kind` is not one of the implemented {@link ProjectKind} values.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function generateProject (repoRoot: string, kind: ProjectKind, name: string, config: MonecromanciConfig): void {\r\n const vars: ProjectVars = {\r\n kind,\r\n name,\r\n packageName: `${config.scope}/${name}`,\r\n scope: config.scope,\r\n registry: config.registry,\r\n }\r\n\r\n logger.step(`Adding ${kind} '${name}' (${vars.packageName})`)\r\n reportApply(applyFiles(repoRoot, filesForKind(kind, vars)))\r\n applyRootDependencies(repoRoot, kind)\r\n}\r\n","import { isManagedRepo, loadConfig } from '../engine/config'\r\nimport type { ProjectKind } from '../engine/types'\r\nimport { logger } from '../util/logger'\r\nimport { promptText, select } from '../util/prompts'\r\nimport { toSlug } from '../util/strings'\r\nimport { generateProject } from './scaffold'\r\n\r\n/**\r\n * Options accepted by {@link runAdd}.\r\n *\r\n * @remarks\r\n * Mirrors the CLI's `add <type> <name>` arguments.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface AddOptions {\r\n type?: string\r\n name?: string\r\n}\r\n\r\n/**\r\n * Interactive `monecromanci add`: pick a project kind and scaffold it.\r\n *\r\n * @remarks\r\n * Prompts for any value not supplied via `options`, then delegates to\r\n * {@link generateProject}.\r\n *\r\n * @param options - Project type/name supplied on the command line, if any.\r\n * @returns A promise that resolves once the project has been scaffolded.\r\n * @throws Propagates errors from the underlying file or config operations; the\r\n * CLI entry point in `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runAdd (options: AddOptions): Promise<void> {\r\n const repoRoot = process.cwd()\r\n\r\n if (!isManagedRepo(repoRoot)) {\r\n logger.error('No .monecromanci.json found here. Run this from the monorepo root, or create one with `monecromanci new`.')\r\n return\r\n }\r\n\r\n const config = loadConfig(repoRoot)\r\n if (!config) {\r\n logger.error('Could not read .monecromanci.json.')\r\n return\r\n }\r\n\r\n const kind = (options.type as ProjectKind | undefined) ?? await select<ProjectKind>({\r\n message: 'What do you want to add?',\r\n choices: [\r\n { name: 'Internal library', value: 'internal-lib' },\r\n { name: 'Publishable library', value: 'publishable-lib' },\r\n { name: 'CLI tool', value: 'cli-tool' },\r\n { name: 'Azure Function App', value: 'function-app' },\r\n { name: 'Node.js app (generic server)', value: 'node-app' },\r\n { name: 'React app', value: 'react-app' },\r\n { name: 'Vue app', value: 'vue-app' },\r\n { name: 'Svelte app', value: 'svelte-app' },\r\n { name: 'Next.js app (full-stack)', value: 'nextjs-app' },\r\n ],\r\n })\r\n\r\n const name = toSlug(options.name ?? await promptText('Project name'))\r\n generateProject(repoRoot, kind, name, config)\r\n logger.success('Done. Run `npm install` to link the new workspace, then `npm run graph`.')\r\n}\r\n","import { existsSync, readdirSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { TAGS } from './constants'\r\nimport { readJsonSafe } from './fsx'\r\nimport type { MonecromanciConfig, ProjectKind, ProjectVars } from './types'\r\n\r\nfunction readTags (projectJson: Record<string, unknown>): string[] {\r\n return Array.isArray(projectJson.tags) ? projectJson.tags.map(String) : []\r\n}\r\n\r\nfunction hasBin (packageJson: Record<string, unknown>): boolean {\r\n if (packageJson.bin) {\r\n return true\r\n }\r\n\r\n const marker = packageJson.monecromanci as { dist?: { bin?: unknown } } | undefined\r\n return Boolean(marker?.dist?.bin)\r\n}\r\n\r\n/** Infers a project's MoNecromanCI kind from its tags (and bin for CLI vs lib). */\r\nfunction kindFromProject (projectJson: Record<string, unknown>, packageJson: Record<string, unknown>): ProjectKind | undefined {\r\n const tags = readTags(projectJson)\r\n\r\n if (tags.includes(TAGS.functionApp)) {\r\n return 'function-app'\r\n }\r\n if (tags.includes(TAGS.nodeApp)) {\r\n return 'node-app'\r\n }\r\n if (tags.includes(TAGS.reactApp)) {\r\n return 'react-app'\r\n }\r\n if (tags.includes(TAGS.vueApp)) {\r\n return 'vue-app'\r\n }\r\n if (tags.includes(TAGS.svelteApp)) {\r\n return 'svelte-app'\r\n }\r\n if (tags.includes(TAGS.nextjsApp)) {\r\n return 'nextjs-app'\r\n }\r\n if (tags.includes(TAGS.internalLib)) {\r\n return 'internal-lib'\r\n }\r\n if (tags.includes(TAGS.publishableLib)) {\r\n return hasBin(packageJson) ? 'cli-tool' : 'publishable-lib'\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nfunction scanArea (areaDirectory: string, config: MonecromanciConfig): ProjectVars[] {\r\n const projects: ProjectVars[] = []\r\n const entries = readdirSync(areaDirectory, { withFileTypes: true })\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory()) {\r\n continue\r\n }\r\n\r\n const projectDirectory = join(areaDirectory, entry.name)\r\n const projectJson = readJsonSafe<Record<string, unknown>>(join(projectDirectory, 'project.json'), {})\r\n const packageJson = readJsonSafe<Record<string, unknown>>(join(projectDirectory, 'package.json'), {})\r\n const kind = kindFromProject(projectJson, packageJson)\r\n if (!kind) {\r\n continue\r\n }\r\n\r\n const packageName = typeof packageJson.name === 'string' ? packageJson.name : `${config.scope}/${entry.name}`\r\n projects.push({ kind, name: entry.name, packageName, scope: config.scope, registry: config.registry })\r\n }\r\n\r\n return projects\r\n}\r\n\r\n/**\r\n * Scans apps/ and libs/ and returns the MoNecromanCI project descriptors found.\r\n *\r\n * @remarks\r\n * Skips directories that don't carry a recognisable NX project/package kind\r\n * (see `kindFromProject`).\r\n *\r\n * @param repoRoot - Absolute path to the monorepo root.\r\n * @param config - The monorepo's `.monecromanci.json` stamp.\r\n * @returns The discovered project descriptors.\r\n * @throws Never - delegates to {@link readJsonSafe}, which swallows read/parse\r\n * errors.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function discoverProjects (repoRoot: string, config: MonecromanciConfig): ProjectVars[] {\r\n const projects: ProjectVars[] = []\r\n\r\n for (const area of ['apps', 'libs']) {\r\n const areaDirectory = join(repoRoot, area)\r\n if (existsSync(areaDirectory)) {\r\n projects.push(...scanArea(areaDirectory, config))\r\n }\r\n }\r\n\r\n return projects\r\n}\r\n","import { join } from 'node:path'\r\nimport { fileExists, readTextSafe, writeFileEnsured } from './fsx'\r\nimport type { FileSpec } from './types'\r\n\r\n/**\r\n * Outcome of comparing a tool-owned file on disk against its expected content.\r\n *\r\n * @remarks\r\n * Returned by {@link checkFile} and aggregated into a {@link SyncReport}.\r\n *\r\n * @typeParam None - this type has no generic type parameters.\r\n */\r\nexport type FileStatus = 'ok' | 'missing' | 'drift'\r\n\r\n/**\r\n * Compares a tool-owned file on disk against its expected content.\r\n *\r\n * @remarks\r\n * Returns `'missing'` rather than `'drift'` when the file does not exist.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @param spec - The file spec to compare against disk.\r\n * @returns Whether the file is in sync, missing, or has drifted.\r\n * @throws Never - delegates to {@link readTextSafe}, which swallows read errors.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function checkFile (repoRoot: string, spec: FileSpec): FileStatus {\r\n const absolute = join(repoRoot, spec.path)\r\n if (!fileExists(absolute)) {\r\n return 'missing'\r\n }\r\n\r\n return readTextSafe(absolute) === spec.content ? 'ok' : 'drift'\r\n}\r\n\r\n/**\r\n * Outcome of a {@link syncToolOwned} pass.\r\n *\r\n * @remarks\r\n * `fixed` is always a subset of `missing` plus `drift`.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface SyncReport {\r\n ok: string[]\r\n missing: string[]\r\n drift: string[]\r\n fixed: string[]\r\n}\r\n\r\n/**\r\n * Checks every `tool-owned` spec against the repo and, when `apply` is set,\r\n * rewrites the ones that are missing or have drifted. `scaffold` files are\r\n * never touched, so user edits survive.\r\n *\r\n * @remarks\r\n * Used by both `doctor` (report-only by default) and `update` (always applies).\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @param specs - The file specs to check (only `tool-owned` ones are inspected).\r\n * @param shouldApply - Whether to rewrite missing/drifted files.\r\n * @returns A report of which files are ok, missing, drifted, or were fixed.\r\n * @throws Propagates any Node.js `fs` error raised while rewriting a file when\r\n * `shouldApply` is set.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function syncToolOwned (repoRoot: string, specs: FileSpec[], shouldApply: boolean): SyncReport {\r\n const report: SyncReport = { ok: [], missing: [], drift: [], fixed: [] }\r\n\r\n for (const spec of specs) {\r\n if (spec.ownership !== 'tool-owned') {\r\n continue\r\n }\r\n\r\n const status = checkFile(repoRoot, spec)\r\n if (status === 'ok') {\r\n report.ok.push(spec.path)\r\n continue\r\n }\r\n\r\n if (status === 'missing') {\r\n report.missing.push(spec.path)\r\n } else {\r\n report.drift.push(spec.path)\r\n }\r\n\r\n if (shouldApply) {\r\n writeFileEnsured(join(repoRoot, spec.path), spec.content)\r\n report.fixed.push(spec.path)\r\n }\r\n }\r\n\r\n return report\r\n}\r\n","{\r\n \"name\": \"monecromanci\",\r\n \"version\": \"0.0.0\",\r\n \"description\": \"MoNecromanCI — interactive CLI to summon, conjure, raise and validate NX monorepos (Azure DevOps & GitHub Actions): function/node apps, React/Vue/Svelte/Next.js apps, internal/publishable libs, CLI tools.\",\r\n \"bin\": {\r\n \"monecromanci\": \"./dist/cli.js\",\r\n \"mnci\": \"./dist/cli.js\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"engines\": {\r\n \"node\": \"^22.13.0 || >=24\"\r\n },\r\n \"scripts\": {\r\n \"build\": \"tsup && node scripts/copyAssets.mjs\",\r\n \"dev\": \"tsup --watch\",\r\n \"lint\": \"eslint .\",\r\n \"lint:fix\": \"eslint . --fix\",\r\n \"test\": \"jest\",\r\n \"test:cov\": \"jest --coverage\",\r\n \"typecheck\": \"tsc --noEmit\",\r\n \"start\": \"node dist/cli.js\"\r\n },\r\n \"keywords\": [\r\n \"nx\",\r\n \"monorepo\",\r\n \"azure-devops\",\r\n \"cli\",\r\n \"scaffold\",\r\n \"typescript\"\r\n ],\r\n \"author\": \"Eduardo Russo\",\r\n \"license\": \"MIT\",\r\n \"dependencies\": {\r\n \"@inquirer/prompts\": \"^8.5.2\",\r\n \"commander\": \"^15.0.0\"\r\n },\r\n \"devDependencies\": {\r\n \"@eslint/markdown\": \"^8.0.2\",\r\n \"@stylistic/eslint-plugin\": \"^5.10.0\",\r\n \"@types/jest\": \"^30.0.0\",\r\n \"@types/node\": \"^26.0.1\",\r\n \"eslint\": \"^10.6.0\",\r\n \"eslint-plugin-jest\": \"^29.15.3\",\r\n \"eslint-plugin-jsonc\": \"^3.2.0\",\r\n \"eslint-plugin-n\": \"^18.2.1\",\r\n \"eslint-plugin-promise\": \"^7.3.0\",\r\n \"eslint-plugin-react\": \"^7.37.5\",\r\n \"eslint-plugin-react-hooks\": \"^7.1.1\",\r\n \"eslint-plugin-react-refresh\": \"^0.5.3\",\r\n \"eslint-plugin-tsdoc\": \"^0.5.2\",\r\n \"eslint-plugin-tsdoc-require-2\": \"^1.2.3\",\r\n \"eslint-plugin-unicorn\": \"^69.0.0\",\r\n \"eslint-plugin-unused-imports\": \"^4.4.1\",\r\n \"eslint-plugin-yml\": \"^3.5.0\",\r\n \"globals\": \"^17.7.0\",\r\n \"jest\": \"^30.4.2\",\r\n \"ts-jest\": \"^29.4.11\",\r\n \"tsup\": \"^8.5.1\",\r\n \"typescript\": \"^6.0.3\",\r\n \"typescript-eslint\": \"^8.62.0\"\r\n }\r\n}\r\n","import { listAssetFiles, readAsset } from '../engine/assets'\r\nimport { toJson } from '../engine/fsx'\r\nimport { npmrcContent } from '../engine/registry'\r\nimport type { FileSpec, MonorepoVars, RegistryConfig } from '../engine/types'\r\nimport rootPackageJson from '../../package.json'\r\n\r\nconst sharedDependency = (name: keyof typeof rootPackageJson.devDependencies): string => rootPackageJson.devDependencies[name]\r\n\r\n/**\r\n * Pinned toolchain for generated monorepos (mirrors the proven JATO set).\r\n *\r\n * Shared entries (ESLint/TS/Jest toolchain) reuse the exact versions MoNecromanCI\r\n * itself depends on, sourced from this package's own `devDependencies`, so the\r\n * two never drift apart. Generated-repo-only packages (nx, esbuild, husky, the\r\n * commitlint/typedoc tooling) are pinned here directly since MoNecromanCI has no\r\n * use for them itself.\r\n */\r\nconst DEV_DEPENDENCIES: Record<string, string> = {\r\n '@commitlint/cli': '^21.1.0',\r\n '@commitlint/config-conventional': '^21.1.0',\r\n '@eslint/markdown': sharedDependency('@eslint/markdown'),\r\n '@stylistic/eslint-plugin': sharedDependency('@stylistic/eslint-plugin'),\r\n '@types/jest': sharedDependency('@types/jest'),\r\n '@types/node': sharedDependency('@types/node'),\r\n esbuild: '^0.28.1',\r\n eslint: sharedDependency('eslint'),\r\n 'eslint-plugin-jest': sharedDependency('eslint-plugin-jest'),\r\n 'eslint-plugin-jsonc': sharedDependency('eslint-plugin-jsonc'),\r\n 'eslint-plugin-n': sharedDependency('eslint-plugin-n'),\r\n 'eslint-plugin-promise': sharedDependency('eslint-plugin-promise'),\r\n 'eslint-plugin-react': sharedDependency('eslint-plugin-react'),\r\n 'eslint-plugin-react-hooks': sharedDependency('eslint-plugin-react-hooks'),\r\n 'eslint-plugin-react-refresh': sharedDependency('eslint-plugin-react-refresh'),\r\n 'eslint-plugin-tsdoc': sharedDependency('eslint-plugin-tsdoc'),\r\n 'eslint-plugin-tsdoc-require-2': sharedDependency('eslint-plugin-tsdoc-require-2'),\r\n 'eslint-plugin-unicorn': sharedDependency('eslint-plugin-unicorn'),\r\n 'eslint-plugin-unused-imports': sharedDependency('eslint-plugin-unused-imports'),\r\n 'eslint-plugin-yml': sharedDependency('eslint-plugin-yml'),\r\n globals: sharedDependency('globals'),\r\n husky: '^9.1.7',\r\n jest: sharedDependency('jest'),\r\n 'jest-junit': '^17.0.0',\r\n nx: '^23.0.1',\r\n 'ts-jest': sharedDependency('ts-jest'),\r\n 'tsc-alias': '^1.8.17',\r\n tslib: '^2.8.1',\r\n typedoc: '^0.28.19',\r\n 'typedoc-plugin-missing-exports': '^4.1.3',\r\n typescript: sharedDependency('typescript'),\r\n 'typescript-eslint': sharedDependency('typescript-eslint'),\r\n}\r\n\r\nfunction packageJson (vars: MonorepoVars): string {\r\n return toJson({\r\n name: vars.workspaceName,\r\n version: '0.0.0',\r\n private: true,\r\n license: 'UNLICENSED',\r\n workspaces: ['apps/*', 'libs/*'],\r\n scripts: {\r\n build: 'nx run-many -t build --all',\r\n 'build:affected': 'nx affected -t build',\r\n lint: 'nx run-many -t lint --all',\r\n 'lint:affected': 'nx affected -t lint',\r\n test: 'nx run-many -t test --all',\r\n 'test:affected': 'nx affected -t test',\r\n doc: 'nx run-many -t doc --all',\r\n 'doc:affected': 'nx affected -t doc',\r\n affected: 'nx affected -t lint,test,build',\r\n projects: 'nx show projects',\r\n graph: 'nx graph',\r\n 'nx:reset': 'nx reset',\r\n 'pipeline:plan': 'node .build-templates/01-preparation.mjs',\r\n 'pipeline:package': 'node .build-templates/03-package-apps.mjs --dry-run',\r\n release: 'nx release',\r\n 'release:version': 'nx release version',\r\n 'release:publish': 'nx release publish',\r\n prepare: 'husky',\r\n },\r\n dependencies: {\r\n tslib: '^2.8.1',\r\n },\r\n devDependencies: DEV_DEPENDENCIES,\r\n engines: {\r\n node: `>=${vars.nodeVersion}`,\r\n },\r\n })\r\n}\r\n\r\nfunction nxJson (vars: MonorepoVars): string {\r\n return toJson({\r\n $schema: './node_modules/nx/schemas/nx-schema.json',\r\n workspaceLayout: { appsDir: 'apps', libsDir: 'libs' },\r\n defaultBase: vars.defaultBase,\r\n namedInputs: {\r\n sharedGlobals: [\r\n '{workspaceRoot}/package.json',\r\n '{workspaceRoot}/package-lock.json',\r\n '{workspaceRoot}/nx.json',\r\n '{workspaceRoot}/tsconfig.base.json',\r\n '{workspaceRoot}/jest.preset.mjs',\r\n '{workspaceRoot}/eslint.config.mjs',\r\n ],\r\n default: ['{projectRoot}/**/*', 'sharedGlobals'],\r\n production: [\r\n 'default',\r\n '!{projectRoot}/coverage/**',\r\n '!{projectRoot}/dist/**',\r\n '!{projectRoot}/doc/**',\r\n '!{projectRoot}/**/*.test.ts',\r\n '!{projectRoot}/src/_jest/**',\r\n ],\r\n },\r\n targetDefaults: {\r\n build: { dependsOn: ['^build'], inputs: ['production', '^production'], cache: true },\r\n lint: { inputs: ['default', '^production'], cache: true },\r\n test: { dependsOn: ['build'], inputs: ['default', '^production'], cache: true },\r\n doc: { inputs: ['production', '^production'], cache: true },\r\n },\r\n release: {\r\n projectsRelationship: 'independent',\r\n projects: ['tag:type:publishable-lib'],\r\n releaseTagPattern: '{projectName}@{version}',\r\n version: { conventionalCommits: true },\r\n changelog: { projectChangelogs: true },\r\n },\r\n analytics: false,\r\n })\r\n}\r\n\r\nfunction tsconfigBase (): string {\r\n return toJson({\r\n $schema: 'https://json.schemastore.org/tsconfig',\r\n compilerOptions: {\r\n ignoreDeprecations: '6.0',\r\n target: 'es2024',\r\n types: ['jest', 'node'],\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n forceConsistentCasingInFileNames: true,\r\n isolatedModules: true,\r\n noFallthroughCasesInSwitch: true,\r\n noUnusedLocals: true,\r\n noUnusedParameters: true,\r\n resolveJsonModule: true,\r\n skipLibCheck: true,\r\n strict: true,\r\n strictNullChecks: true,\r\n strictPropertyInitialization: false,\r\n },\r\n })\r\n}\r\n\r\nfunction tsconfigJest (): string {\r\n // sourceMap MUST be true so ts-jest emits maps and VSCode binds breakpoints.\r\n return toJson({\r\n extends: './tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n noEmit: false,\r\n emitDeclarationOnly: false,\r\n declaration: false,\r\n declarationMap: false,\r\n sourceMap: true,\r\n esModuleInterop: true,\r\n },\r\n })\r\n}\r\n\r\nfunction typedocJson (): string {\r\n return toJson({\r\n $schema: 'https://typedoc.org/schema.json',\r\n entryPointStrategy: 'expand',\r\n plugin: ['typedoc-plugin-missing-exports'],\r\n excludePrivate: false,\r\n categorizeByGroup: true,\r\n cleanOutputDir: true,\r\n })\r\n}\r\n\r\n// Root Jest config: discover every project that ships a jest config, normalising\r\n// Windows backslashes so the paths are valid for Jest's `projects` option.\r\nconst jestConfigMjs = String.raw`import { globSync } from 'node:fs'\r\n\r\nconst projects = globSync('{libs,apps}/*/jest.config.mjs').map((path) => path.replaceAll('\\\\', '/'))\r\n\r\nexport default {\r\n projects: projects.length > 0 ? projects : ['<rootDir>'],\r\n maxWorkers: '75%',\r\n}\r\n`\r\n\r\n// Shared Jest preset factory. Per-project config is one line: createConfig('name').\r\nconst jestPresetMjs = String.raw`/** Shared Jest preset — generated by MoNecromanCI. Re-sync with 'monecromanci doctor'. */\r\nexport function createConfig (projectName) {\r\n return {\r\n displayName: projectName,\r\n testEnvironment: 'node',\r\n rootDir: '.',\r\n roots: ['<rootDir>/src'],\r\n setupFilesAfterEnv: [\r\n '<rootDir>/../../jest.setup.mjs',\r\n '<rootDir>/../../jest.clear.mjs',\r\n ],\r\n transform: {\r\n '^.+\\\\.[tj]sx?$': ['ts-jest', { tsconfig: '<rootDir>/../../tsconfig.jest.json' }],\r\n },\r\n moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json'],\r\n collectCoverageFrom: [\r\n '<rootDir>/src/**/*.ts',\r\n '!<rootDir>/src/**/*.d.ts',\r\n '!<rootDir>/src/index.ts',\r\n ],\r\n coverageProvider: 'v8',\r\n coverageDirectory: './coverage',\r\n coverageReporters: ['text', 'cobertura', 'html', 'lcov'],\r\n reporters: [\r\n 'default',\r\n ['jest-junit', { outputDirectory: './coverage', outputName: 'test-results.xml' }],\r\n ],\r\n }\r\n}\r\n`\r\n\r\nconst jestSetupMjs = `process.env.TZ = 'UTC'\r\n\r\nbeforeAll(() => {\r\n jest.useFakeTimers()\r\n jest.setSystemTime(new Date('2000-01-01T00:00:00.000Z'))\r\n})\r\n\r\nafterAll(() => {\r\n jest.useRealTimers()\r\n})\r\n`\r\n\r\nconst jestClearMjs = `afterEach(() => {\r\n jest.restoreAllMocks()\r\n jest.clearAllMocks()\r\n jest.resetModules()\r\n})\r\n`\r\n\r\nfunction npmrc (vars: MonorepoVars): string {\r\n return npmrcContent(vars.registry, vars.scope)\r\n}\r\n\r\nconst editorconfig = `root = true\r\n\r\n[*]\r\ncharset = utf-8\r\nend_of_line = lf\r\nindent_style = space\r\nindent_size = 2\r\ninsert_final_newline = true\r\ntrim_trailing_whitespace = true\r\n\r\n[*.md]\r\ntrim_trailing_whitespace = false\r\n`\r\n\r\nconst gitignore = `node_modules/\r\ndist/\r\ndist-dev/\r\ndist-uat/\r\ndist-prod/\r\ncoverage/\r\ndoc/\r\n.nx/\r\ntmp/\r\n.azurite/\r\n.next/\r\nnext-env.d.ts\r\n.pipeline-out/\r\n.pipeline-staging/\r\n*.log\r\n.DS_Store\r\nlocal.settings.json\r\n`\r\n\r\nconst commitlintConfigMjs = `export default {\r\n extends: ['@commitlint/config-conventional'],\r\n}\r\n`\r\n\r\nconst huskyCommitMessage = `npx --no -- commitlint --edit \"$1\"\r\n`\r\n\r\nfunction readme (vars: MonorepoVars): string {\r\n return `# ${vars.displayName}\r\n\r\nNX monorepo generated by [MoNecromanCI](https://github.com/russoedu/monecromanci).\r\n\r\n## Common commands\r\n\r\n\\`\\`\\`sh\r\nnpm run build # build all projects\r\nnpm run test # run all tests\r\nnpm run lint # lint everything\r\nnpm run affected # lint + test + build only what changed\r\nnpm run graph # open the project graph\r\n\\`\\`\\`\r\n\r\n## Debugging\r\n\r\nOpen \\`${vars.displayName}.code-workspace\\` in VSCode. Use the **Run and Debug** panel:\r\nbreakpoints work in \\`.ts\\` test files (and step into internal libs). The\r\n\\`Orta.vscode-jest\\` extension also adds a **Debug** lens above each test.\r\n\r\n## Adding projects\r\n\r\n\\`\\`\\`sh\r\nnpx monecromanci add # (alias: conjure) function-app | node-app | react-app | vue-app | svelte-app | nextjs-app | internal-lib | publishable-lib | cli-tool\r\n\\`\\`\\`\r\n`\r\n}\r\n\r\n/** Human label for a registry, used in the generated nx-release doc. */\r\nfunction registryLabelFor (registry: RegistryConfig): string {\r\n switch (registry.kind) {\r\n case 'azure-artifacts': {\r\n return 'the Azure Artifacts feed `' + registry.artifactsFeed + '`'\r\n }\r\n case 'github-packages': {\r\n return 'GitHub Packages'\r\n }\r\n default: {\r\n return 'the public npm registry'\r\n }\r\n }\r\n}\r\n\r\nfunction nxReleaseDocument (vars: MonorepoVars): string {\r\n const registryLabel = registryLabelFor(vars.registry)\r\n\r\n return `# Releasing publishable libraries & CLI tools\r\n\r\nThis monorepo uses **\\`nx release\\`** with **independent** versioning driven by\r\n**Conventional Commits**. Only projects tagged \\`type:publishable-lib\\` (libraries\r\nand CLI tools) are released; internal libs and apps are never published.\r\n\r\n## How versions are decided (auto-bump)\r\n\r\nYou do **not** hand-edit \\`version\\` in any \\`package.json\\`. \\`nx release\\` reads the\r\nConventional Commit messages since each project's last release tag and bumps:\r\n\r\n| Commit type | Bump |\r\n| ---------------------- | ------ |\r\n| \\`fix: …\\` | patch |\r\n| \\`feat: …\\` | minor |\r\n| \\`feat!: …\\` / \\`BREAKING CHANGE\\` | major |\r\n\r\nCommit messages are enforced by commitlint (\\`commitlint.config.mjs\\`) via a husky\r\n\\`commit-msg\\` hook, so the history stays releasable. Scope a commit to a project\r\nwith \\`fix(my-lib): …\\`.\r\n\r\n## Local commands\r\n\r\n\\`\\`\\`sh\r\nnpm run release # interactive: version + changelog + (optional) publish\r\nnpm run release:version # bump versions + write changelogs from commits\r\nnpm run release:publish # publish what changed to the configured registry\r\nnpx nx release --dry-run # preview everything, change nothing\r\n\\`\\`\\`\r\n\r\n## What gets published\r\n\r\n\\`build\\` emits \\`dist/\\` and runs \\`tools/generate-dist-package.mjs\\`, which writes a\r\ncorrect \\`dist/package.json\\`: it resolves real dependency versions from the **root**\r\npackage.json (all deps live there) and from internal workspace packages. This is\r\nwhy published packages declare their dependencies even though project\r\n\\`package.json\\` files keep \\`dependencies: {}\\`. Publishing runs \\`npm publish ./dist\\`.\r\n\r\n## First release\r\n\r\nFor a project that has never been released, set its starting version once:\r\n\r\n\\`\\`\\`sh\r\nnpx nx release version 1.0.0 --projects=my-lib --first-release\r\n\\`\\`\\`\r\n\r\n## CI\r\n\r\nOn \\`${vars.defaultBase}\\` (non-PR builds), CI runs \\`nx release version --yes\\`\r\nthen publishes affected publishable projects to ${registryLabel}. See the publish\r\nstep (\\`04-publish-libs\\`, or the GitHub Actions \\`publish\\` job).\r\n`\r\n}\r\n\r\nfunction codeWorkspace (vars: MonorepoVars): string {\r\n return toJson({\r\n folders: [{ path: '.', name: vars.displayName }],\r\n settings: {\r\n 'eslint.useFlatConfig': true,\r\n 'eslint.validate': ['javascript', 'typescript', 'typescriptreact', 'json', 'jsonc', 'json5', 'yaml', 'markdown'],\r\n 'files.exclude': {\r\n '**/.nx': true,\r\n '**/node_modules': true,\r\n '**/coverage': true,\r\n '**/.azurite': true,\r\n tmp: true,\r\n },\r\n 'typescript.tsdk': 'node_modules/typescript/lib',\r\n 'jest.runMode': 'on-demand',\r\n },\r\n extensions: {\r\n recommendations: [\r\n 'dbaeumer.vscode-eslint',\r\n 'orta.vscode-jest',\r\n 'ms-azuretools.vscode-azurefunctions',\r\n 'ms-edgedevtools.vscode-edge-devtools',\r\n ],\r\n },\r\n // NOTE: launch/tasks are TOP-LEVEL workspace keys (NOT under settings) so VSCode surfaces them.\r\n launch: {\r\n version: '0.2.0',\r\n configurations: [\r\n // --- breakpoint-capable debug configs ---\r\n {\r\n name: 'Debug Jest (current file)',\r\n type: 'node',\r\n request: 'launch',\r\n program: '${workspaceFolder}/node_modules/jest/bin/jest.js',\r\n args: ['--runInBand', '--watchAll=false', '--runTestsByPath', '${relativeFile}'],\r\n cwd: '${workspaceFolder}',\r\n console: 'integratedTerminal',\r\n internalConsoleOptions: 'neverOpen',\r\n disableOptimisticBPs: true,\r\n resolveSourceMapLocations: null,\r\n sourceMaps: true,\r\n },\r\n {\r\n name: 'Debug Jest (all)',\r\n type: 'node',\r\n request: 'launch',\r\n program: '${workspaceFolder}/node_modules/jest/bin/jest.js',\r\n args: ['--runInBand', '--watchAll=false'],\r\n cwd: '${workspaceFolder}',\r\n console: 'integratedTerminal',\r\n internalConsoleOptions: 'neverOpen',\r\n disableOptimisticBPs: true,\r\n resolveSourceMapLocations: null,\r\n sourceMaps: true,\r\n },\r\n {\r\n // Function App: run `func start` (inspects via local.settings.json), then attach.\r\n // Node app: run `node --inspect=9229 dist/index.js` (after build), then attach;\r\n // or run `npm run dev -w <app>` in a JavaScript Debug Terminal for source-level tsx.\r\n name: 'Debug Function/Node App (attach :9229)',\r\n type: 'node',\r\n request: 'attach',\r\n port: 9229,\r\n restart: true,\r\n sourceMaps: true,\r\n resolveSourceMapLocations: null,\r\n outFiles: ['${workspaceFolder}/apps/*/dist/**/*.js'],\r\n skipFiles: ['<node_internals>/**'],\r\n },\r\n {\r\n // Start the dev server first (`npm run dev -w <app>`), then launch the browser.\r\n // Or use the JavaScript Debug Terminal: run `npm run dev -w <app>` there.\r\n name: 'Debug React/Vue/Svelte (Edge)',\r\n type: 'msedge',\r\n request: 'launch',\r\n url: 'http://localhost:5173',\r\n webRoot: '${workspaceFolder}',\r\n sourceMaps: true,\r\n resolveSourceMapLocations: null,\r\n },\r\n {\r\n // Next.js dev server runs on :3000. For server-side breakpoints, run\r\n // `npm run dev -w <app>` in a JavaScript Debug Terminal instead.\r\n name: 'Debug Next.js (Edge)',\r\n type: 'msedge',\r\n request: 'launch',\r\n url: 'http://localhost:3000',\r\n webRoot: '${workspaceFolder}',\r\n sourceMaps: true,\r\n resolveSourceMapLocations: null,\r\n },\r\n // --- convenience run configs (no breakpoints; quick npm scripts) ---\r\n { name: 'Run: build (all)', type: 'node-terminal', request: 'launch', command: 'npm run build' },\r\n { name: 'Run: build (affected)', type: 'node-terminal', request: 'launch', command: 'npm run build:affected' },\r\n { name: 'Run: test (all)', type: 'node-terminal', request: 'launch', command: 'npm run test' },\r\n { name: 'Run: lint (all)', type: 'node-terminal', request: 'launch', command: 'npm run lint' },\r\n { name: 'Run: docs (all)', type: 'node-terminal', request: 'launch', command: 'npm run doc' },\r\n { name: 'Run: graph', type: 'node-terminal', request: 'launch', command: 'npm run graph' },\r\n ],\r\n },\r\n tasks: {\r\n version: '2.0.0',\r\n tasks: [\r\n { label: 'build all', type: 'shell', command: 'npm run build', problemMatcher: ['$tsc'] },\r\n { label: 'test all', type: 'shell', command: 'npm run test', problemMatcher: [] },\r\n { label: 'lint all', type: 'shell', command: 'npm run lint', problemMatcher: [] },\r\n ],\r\n },\r\n })\r\n}\r\n\r\n/**\r\n * Vendored CI: the shared `.build-templates` engine (always) plus the workflow\r\n * wrapper(s) for the selected provider(s) — Azure Pipelines and/or GitHub Actions.\r\n */\r\nfunction pipelineFiles (vars: MonorepoVars): FileSpec[] {\r\n const files: FileSpec[] = Array.from(listAssetFiles('build-templates'), relativePath => ({\r\n path: `.build-templates/${relativePath}`,\r\n content: readAsset(`build-templates/${relativePath}`),\r\n ownership: 'tool-owned',\r\n }))\r\n\r\n if (vars.ci === 'azure' || vars.ci === 'both') {\r\n files.push({ path: 'azure-pipelines.yml', content: readAsset('azure-pipelines.yml'), ownership: 'tool-owned' })\r\n }\r\n\r\n if (vars.ci === 'github' || vars.ci === 'both') {\r\n files.push({ path: '.github/workflows/ci.yml', content: readAsset('github/workflows/ci.yml'), ownership: 'tool-owned' })\r\n }\r\n\r\n return files\r\n}\r\n\r\n/**\r\n * Returns every root-level file for a fresh monorepo.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The monorepo's template inputs.\r\n * @returns The full set of file specs for the monorepo root.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function monorepoFiles (vars: MonorepoVars): FileSpec[] {\r\n const toolOwned = (path: string, content: string): FileSpec => ({ path, content, ownership: 'tool-owned' })\r\n const scaffold = (path: string, content: string): FileSpec => ({ path, content, ownership: 'scaffold' })\r\n\r\n return [\r\n scaffold('package.json', packageJson(vars)),\r\n toolOwned('nx.json', nxJson(vars)),\r\n toolOwned('tsconfig.base.json', tsconfigBase()),\r\n toolOwned('tsconfig.jest.json', tsconfigJest()),\r\n toolOwned('jest.config.mjs', jestConfigMjs),\r\n toolOwned('jest.preset.mjs', jestPresetMjs),\r\n toolOwned('jest.setup.mjs', jestSetupMjs),\r\n toolOwned('jest.clear.mjs', jestClearMjs),\r\n toolOwned('eslint.config.mjs', readAsset('eslint.config.mjs')),\r\n toolOwned('typedoc.json', typedocJson()),\r\n scaffold('.npmrc', npmrc(vars)),\r\n toolOwned('.editorconfig', editorconfig),\r\n scaffold('.gitignore', gitignore),\r\n toolOwned('commitlint.config.mjs', commitlintConfigMjs),\r\n scaffold('.husky/commit-msg', huskyCommitMessage),\r\n scaffold('README.md', readme(vars)),\r\n scaffold('docs/nx-release.md', nxReleaseDocument(vars)),\r\n toolOwned(`${vars.displayName}.code-workspace`, codeWorkspace(vars)),\r\n ...pipelineFiles(vars),\r\n // Keep apps/ and libs/ present even before any project is added.\r\n scaffold('apps/.gitkeep', ''),\r\n scaffold('libs/.gitkeep', ''),\r\n ]\r\n}\r\n","import { isManagedRepo, loadConfig, saveConfig } from '../engine/config'\r\nimport { TEMPLATE_VERSION } from '../engine/constants'\r\nimport { discoverProjects } from '../engine/projects'\r\nimport { syncToolOwned } from '../engine/sync'\r\nimport type { FileSpec, MonorepoVars } from '../engine/types'\r\nimport { projectFiles } from '../generators/scaffold'\r\nimport { monorepoFiles } from '../templates/monorepo'\r\nimport { logger } from '../util/logger'\r\n\r\n/**\r\n * Options accepted by {@link runDoctor}.\r\n *\r\n * @remarks\r\n * Mirrors the CLI's `--fix` flag.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface DoctorOptions {\r\n apply: boolean\r\n}\r\n\r\n/**\r\n * Detects and (optionally) repairs configuration drift.\r\n *\r\n * @remarks\r\n * Re-derives the canonical `tool-owned` files for the monorepo and every project\r\n * it discovers, then compares them to disk. `scaffold` files (package.json, src,\r\n * .env, …) are never touched.\r\n *\r\n * @param options - Whether to apply fixes (`apply: true`) or only report drift.\r\n * @returns A promise that resolves once the report has been logged (and, when\r\n * applying, the repo's tool-owned files repaired).\r\n * @throws Propagates errors from the underlying file or config operations; the\r\n * CLI entry point in `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runDoctor (options: DoctorOptions): Promise<void> {\r\n const repoRoot = process.cwd()\r\n\r\n if (!isManagedRepo(repoRoot)) {\r\n logger.error('No .monecromanci.json found here. Run `doctor` from a MoNecromanCI monorepo root.')\r\n return\r\n }\r\n\r\n const config = loadConfig(repoRoot)\r\n if (!config) {\r\n logger.error('Could not read .monecromanci.json.')\r\n return\r\n }\r\n\r\n const vars: MonorepoVars = {\r\n workspaceName: config.workspaceName,\r\n displayName: config.displayName,\r\n scope: config.scope,\r\n defaultBase: config.defaultBase,\r\n nodeVersion: config.nodeVersion,\r\n ci: config.ci,\r\n registry: config.registry,\r\n }\r\n\r\n const specs: FileSpec[] = [...monorepoFiles(vars)]\r\n for (const project of discoverProjects(repoRoot, config)) {\r\n specs.push(...projectFiles(project.kind, project))\r\n }\r\n\r\n const report = syncToolOwned(repoRoot, specs, options.apply)\r\n\r\n for (const path of report.missing) {\r\n logger.warn(`missing: ${path}`)\r\n }\r\n for (const path of report.drift) {\r\n logger.warn(`drift: ${path}`)\r\n }\r\n for (const path of report.fixed) {\r\n logger.success(`fixed: ${path}`)\r\n }\r\n\r\n const issues = report.missing.length + report.drift.length\r\n\r\n if (issues === 0) {\r\n logger.success(`Everything is in sync (${report.ok.length} tool-owned files checked).`)\r\n return\r\n }\r\n\r\n if (!options.apply) {\r\n logger.info(`${issues} issue(s) found. Re-run with --fix to repair (scaffold files are left untouched).`)\r\n return\r\n }\r\n\r\n saveConfig(repoRoot, { ...config, templateVersion: TEMPLATE_VERSION })\r\n logger.success(`Repaired ${report.fixed.length} file(s); stamped template version ${TEMPLATE_VERSION}.`)\r\n}\r\n","import { join, resolve } from 'node:path'\r\nimport { applyFiles, reportApply } from '../engine/apply'\r\nimport { configFromVars, saveConfig } from '../engine/config'\r\nimport { DEFAULT_BASE, DEFAULT_NODE_VERSION } from '../engine/constants'\r\nimport { fileExists } from '../engine/fsx'\r\nimport type { CiProvider, MonorepoVars, RegistryConfig } from '../engine/types'\r\nimport { monorepoFiles } from '../templates/monorepo'\r\nimport { logger } from '../util/logger'\r\nimport { confirm, promptText, select } from '../util/prompts'\r\nimport { toSlug } from '../util/strings'\r\nimport { generateProject } from './scaffold'\r\n\r\n/**\r\n * Options accepted by {@link runNew}.\r\n *\r\n * @remarks\r\n * Each field mirrors a CLI flag; omitted fields are prompted for unless `yes`\r\n * is set.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface NewOptions {\r\n name?: string\r\n scope?: string\r\n ci?: CiProvider\r\n registry?: RegistryConfig['kind']\r\n /** GitHub owner (org or user) for the `github-packages` registry. */\r\n owner?: string\r\n organization?: string\r\n project?: string\r\n feed?: string\r\n base?: string\r\n /** Initial internal library name; empty string skips it. */\r\n lib?: string\r\n /** Non-interactive: accept provided values and defaults without prompting. */\r\n yes?: boolean\r\n}\r\n\r\n/**\r\n * Interactive (or `--yes` non-interactive) `monecromanci new`: scaffold a monorepo.\r\n *\r\n * @remarks\r\n * Prompts for any value not supplied via `options` (unless `yes` is set):\r\n * name, CI provider, package registry (+ its fields), npm scope and base branch.\r\n * Then writes the monorepo template files and, optionally, an initial library.\r\n *\r\n * @param options - Monorepo inputs supplied on the command line, if any.\r\n * @returns A promise that resolves once the monorepo has been scaffolded.\r\n * @throws Propagates errors from the underlying file or config operations; the\r\n * CLI entry point in `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runNew (options: NewOptions): Promise<void> {\r\n const yes = options.yes ?? false\r\n const ask = async (message: string, fallback: string, provided?: string): Promise<string> =>\r\n provided ?? (yes ? fallback : await promptText(message, fallback))\r\n const askChoice = async <T extends string>(message: string, choices: Array<{ name: string, value: T }>, fallback: T, provided?: T): Promise<T> =>\r\n provided ?? (yes ? fallback : await select<T>({ message, choices }))\r\n\r\n const displayName = await ask('Monorepo name', 'My Monorepo', options.name)\r\n const workspaceName = toSlug(displayName)\r\n\r\n const ci = await askChoice<CiProvider>('CI provider', [\r\n { name: 'Azure DevOps Pipelines', value: 'azure' },\r\n { name: 'GitHub Actions', value: 'github' },\r\n { name: 'Both', value: 'both' },\r\n ], 'azure', options.ci)\r\n\r\n const registry = await resolveRegistry(ci, options, ask, askChoice)\r\n\r\n const defaultScope = registry.kind === 'github-packages' ? `@${registry.owner}` : '@auto'\r\n const scopeInput = await ask('npm scope', defaultScope, options.scope)\r\n const scope = scopeInput.startsWith('@') ? scopeInput : `@${scopeInput}`\r\n const defaultBase = await ask('Default git branch', DEFAULT_BASE, options.base)\r\n\r\n const targetDirectory = resolve(process.cwd(), workspaceName)\r\n if (fileExists(join(targetDirectory, 'package.json')) && !yes) {\r\n const overwrite = await confirm({ message: `${targetDirectory} already contains a package.json. Continue and overwrite tool-owned files?`, default: false })\r\n if (!overwrite) {\r\n logger.warn('Aborted.')\r\n return\r\n }\r\n }\r\n\r\n const vars: MonorepoVars = {\r\n workspaceName,\r\n displayName,\r\n scope,\r\n defaultBase,\r\n nodeVersion: DEFAULT_NODE_VERSION,\r\n ci,\r\n registry,\r\n }\r\n\r\n logger.step(`Creating monorepo in ${targetDirectory}`)\r\n reportApply(applyFiles(targetDirectory, monorepoFiles(vars)))\r\n saveConfig(targetDirectory, configFromVars(vars))\r\n\r\n const libName = await resolveInitialLib(options.lib, yes)\r\n if (libName) {\r\n generateProject(targetDirectory, 'internal-lib', libName, configFromVars(vars))\r\n }\r\n\r\n logger.success('Done. Next steps:')\r\n logger.info(` cd ${workspaceName}`)\r\n logger.info(' npm install')\r\n logger.info(` code \"${displayName}.code-workspace\"`)\r\n}\r\n\r\ntype AskText = (message: string, fallback: string, provided?: string) => Promise<string>\r\ntype AskChoice = <T extends string>(message: string, choices: Array<{ name: string, value: T }>, fallback: T, provided?: T) => Promise<T>\r\n\r\n/** Resolves the registry config from flags/prompts (default keyed off the CI provider). */\r\nasync function resolveRegistry (ci: CiProvider, options: NewOptions, ask: AskText, askChoice: AskChoice): Promise<RegistryConfig> {\r\n const fallbackKind: RegistryConfig['kind'] = ci === 'github' ? 'github-packages' : 'azure-artifacts'\r\n const kind = await askChoice<RegistryConfig['kind']>('Package registry', [\r\n { name: 'Azure Artifacts', value: 'azure-artifacts' },\r\n { name: 'GitHub Packages', value: 'github-packages' },\r\n { name: 'Public npm', value: 'npm' },\r\n ], fallbackKind, options.registry)\r\n\r\n if (kind === 'azure-artifacts') {\r\n const organization = await ask('Azure DevOps organization', 'my-org', options.organization)\r\n const project = await ask('Azure DevOps project', 'Automation', options.project)\r\n const artifactsFeed = await ask('Azure Artifacts feed', 'AUTO', options.feed)\r\n return { kind, organization, project, artifactsFeed }\r\n }\r\n\r\n if (kind === 'github-packages') {\r\n const owner = await ask('GitHub owner (org or user)', 'my-org', options.owner)\r\n return { kind, owner }\r\n }\r\n\r\n return { kind: 'npm' }\r\n}\r\n\r\n/** Resolves the initial library name from flags/prompts (undefined = skip). */\r\nasync function resolveInitialLib (provided: string | undefined, shouldAcceptDefaults: boolean): Promise<string | undefined> {\r\n if (provided !== undefined) {\r\n return provided === '' ? undefined : toSlug(provided)\r\n }\r\n if (shouldAcceptDefaults) {\r\n return 'helpers'\r\n }\r\n\r\n const addLib = await confirm({ message: 'Add an initial internal library now?', default: true })\r\n return addLib ? toSlug(await promptText('Library name', 'helpers')) : undefined\r\n}\r\n","import { runDoctor } from './doctor'\r\n\r\n/**\r\n * Re-syncs tool-owned files to the latest templates (doctor with --fix).\r\n *\r\n * @remarks\r\n * Thin wrapper around {@link runDoctor} that always applies fixes.\r\n *\r\n * @param None - this function takes no parameters.\r\n * @returns A promise that resolves once the repo's tool-owned files have been\r\n * repaired and the report logged.\r\n * @throws Propagates errors from {@link runDoctor}; the CLI entry point in\r\n * `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runUpdate (): Promise<void> {\r\n await runDoctor({ apply: true })\r\n}\r\n","import { spawnSync } from 'node:child_process'\n\n/**\n * Runs a command synchronously, inheriting stdio so its output streams live.\n *\n * @remarks\n * Used by the `validate`/`ritual` command to shell out to the repo's local Nx.\n * `shell: true` lets Windows resolve `npx` (a `.cmd` shim) without an explicit\n * extension. The command and arguments are joined into one line rather than\n * passed as an args array (which, combined with `shell: true`, triggers Node's\n * DEP0190); our argument tokens contain no spaces or shell metacharacters.\n *\n * @param command - The executable to run (e.g. `npx`).\n * @param arguments_ - The arguments passed to the executable.\n * @param cwd - The working directory to run the command in.\n * @returns The child process exit status (`0` on success); `1` when the process\n * was terminated by a signal or never produced a status (e.g. spawn failure).\n * @throws Never - spawn failures surface through the returned status, not a throw.\n * @typeParam None - this function has no generic type parameters.\n */\nexport function runShell (command: string, arguments_: string[], cwd: string): number {\n const line = [command, ...arguments_].join(' ')\n const result = spawnSync(line, { stdio: 'inherit', shell: true, cwd })\n return result.status ?? 1\n}\n","import { isManagedRepo } from '../engine/config'\nimport { runShell } from '../util/exec'\nimport { logger } from '../util/logger'\n\n/**\n * Options accepted by {@link runValidate}.\n *\n * @remarks\n * Mirrors the CLI's `--all` flag.\n *\n * @typeParam None - this interface has no generic type parameters.\n */\nexport interface ValidateOptions {\n all: boolean\n}\n\n/**\n * Runs lint/test/build locally so failures surface before reaching CI.\n *\n * @remarks\n * Delegates to the repo's own Nx: `nx affected` by default (only projects touched\n * since the base branch) or `nx run-many` with `--all`. Targets a project does not\n * define are skipped by Nx, so mixed project kinds are safe. The child's exit\n * status is propagated through `process.exitCode`.\n *\n * @param options - Whether to validate every project (`all: true`) or only affected.\n * @returns A promise that resolves once the Nx run has completed.\n * @throws Never - the child exit status is surfaced via `process.exitCode`, not a throw.\n * @typeParam None - this function has no generic type parameters.\n */\nexport async function runValidate (options: ValidateOptions): Promise<void> {\n const repoRoot = process.cwd()\n\n if (!isManagedRepo(repoRoot)) {\n logger.error('No .monecromanci.json found here. Run `validate` from a MoNecromanCI monorepo root.')\n return\n }\n\n const arguments_ = ['nx', options.all ? 'run-many' : 'affected', '-t', 'lint', 'test', 'build']\n\n logger.info(`Running: npx ${arguments_.join(' ')}`)\n const status = runShell('npx', arguments_, repoRoot)\n\n if (status === 0) {\n logger.success('Validation passed.')\n return\n }\n\n logger.error(`Validation failed (exit ${status}).`)\n process.exitCode = status\n}\n"],"mappings":";;;;AAAA,IAAAA,kBAA6B;AAC7B,IAAAC,oBAAqB;AACrB,uBAAwB;;;ACFxB,IAAAC,oBAAqB;;;ACOd,IAAM,mBAAmB;AAQzB,IAAM,aAAa;AAQnB,IAAM,uBAAuB;AAQ7B,IAAM,eAAe;AASrB,IAAM,OAAO;AAAA,EAClB,aAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,aAAgB;AAAA,EAChB,QAAgB;AAClB;;;AClDA,qBAAmE;AACnE,uBAAwB;AAuHxB,IAAAC,kBAAyC;AAzGlC,SAAS,gBAAiB,WAAyB;AACxD,MAAI,KAAC,2BAAW,SAAS,GAAG;AAC1B,kCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AACF;AAeO,SAAS,iBAAkB,UAAkB,SAAuB;AACzE,sBAAgB,0BAAQ,QAAQ,CAAC;AACjC,oCAAc,UAAU,SAAS,MAAM;AACzC;AAyCO,SAAS,aAAiB,UAAkB,UAA6B;AAC9E,MAAI;AACF,WAAO,KAAK,UAAM,6BAAa,UAAU,MAAM,CAAC;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,SAAS,aAAc,UAA0B;AACtD,MAAI;AACF,eAAO,6BAAa,UAAU,MAAM;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,SAAS,OAAQ,OAAwB;AAC9C,SAAO,GAAG,KAAK,UAAU,OAAO,QAAW,CAAC,CAAC;AAAA;AAC/C;;;AFnGO,SAAS,UAAW,UAA0B;AACnD,aAAO,wBAAK,UAAU,UAAU;AAClC;AAaO,SAAS,cAAe,UAA2B;AACxD,aAAO,4BAAW,UAAU,QAAQ,CAAC;AACvC;AAGA,SAAS,cAAe,KAAoC;AAC1D,QAAM,WAA2B,IAAI,aAC/B,IAAI,QAAQ,EAAE,MAAM,mBAAmB,GAAG,IAAI,MAAM,IAAI,EAAE,MAAM,MAAM;AAE5E,SAAO,EAAE,GAAG,KAAK,IAAI,IAAI,MAAM,SAAS,SAAS;AACnD;AAcO,SAAS,WAAY,UAAkD;AAC5E,MAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,aAAoC,UAAU,QAAQ,GAAG,MAAS;AAC9E,SAAO,MAAM,cAAc,GAAG,IAAI;AACpC;AAeO,SAAS,WAAY,UAAkB,QAAkC;AAC9E,mBAAiB,UAAU,QAAQ,GAAG,OAAO,MAAM,CAAC;AACtD;AAaO,SAAS,eAAgB,MAAwC;AACtE,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,eAAiB,KAAK;AAAA,IACtB,aAAiB,KAAK;AAAA,IACtB,OAAiB,KAAK;AAAA,IACtB,aAAiB,KAAK;AAAA,IACtB,aAAiB,KAAK;AAAA,IACtB,IAAiB,KAAK;AAAA,IACtB,UAAiB,KAAK;AAAA,EACxB;AACF;;;AGnGO,IAAM,SAAS;AAAA,EACpB,KAAM,SAAuB;AAC3B,YAAQ,IAAI,OAAO;AAAA,EACrB;AAAA,EACA,KAAM,SAAuB;AAC3B,YAAQ,IAAI,UAAK,OAAO,EAAE;AAAA,EAC5B;AAAA,EACA,QAAS,SAAuB;AAC9B,YAAQ,IAAI,UAAK,OAAO,EAAE;AAAA,EAC5B;AAAA,EACA,KAAM,SAAuB;AAC3B,YAAQ,KAAK,KAAK,OAAO,EAAE;AAAA,EAC7B;AAAA,EACA,MAAO,SAAuB;AAC5B,YAAQ,MAAM,UAAK,OAAO,EAAE;AAAA,EAC9B;AACF;;;ACvBA,qBAAsB;AAwBtB,IAAAC,kBAAiD;AATjD,eAAsB,WAAY,SAAiB,UAAoC;AACrF,QAAM,QAAQ,UAAM,sBAAM;AAAA,IACxB;AAAA,IACA,SAAU;AAAA,IACV,UAAU,CAACC,WAAkBA,OAAM,KAAK,EAAE,SAAS,KAAK;AAAA,EAC1D,CAAC;AACD,SAAO,MAAM,KAAK;AACpB;;;ACTO,SAAS,OAAQC,QAAuB;AAC7C,SAAOA,OACJ,KAAK,EACL,WAAW,sBAAsB,OAAO,EACxC,WAAW,kBAAkB,GAAG,EAChC,WAAW,YAAY,EAAE,EACzB,YAAY;AACjB;;;ACpBA,IAAAC,oBAAqB;AAiCd,SAAS,WAAY,UAAkB,OAAgC;AAC5E,QAAM,SAAsB,EAAE,SAAS,CAAC,GAAG,aAAa,CAAC,GAAG,SAAS,CAAC,EAAE;AAExE,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAW,wBAAK,UAAU,KAAK,IAAI;AACzC,UAAM,aAAS,4BAAW,QAAQ;AAElC,QAAI,KAAK,cAAc,cAAc,QAAQ;AAC3C,aAAO,QAAQ,KAAK,KAAK,IAAI;AAC7B;AAAA,IACF;AAEA,qBAAiB,UAAU,KAAK,OAAO;AACvC,QAAI,QAAQ;AACV,aAAO,YAAY,KAAK,KAAK,IAAI;AAAA,IACnC,OAAO;AACL,aAAO,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAaO,SAAS,YAAa,QAA2B;AACtD,aAAW,QAAQ,OAAO,SAAS;AACjC,WAAO,QAAQ,WAAW,IAAI,EAAE;AAAA,EAClC;AACA,aAAW,QAAQ,OAAO,aAAa;AACrC,WAAO,KAAK,WAAW,IAAI,EAAE;AAAA,EAC/B;AACA,aAAW,QAAQ,OAAO,SAAS;AACjC,WAAO,KAAK,aAAa,IAAI,mBAAmB;AAAA,EAClD;AACF;;;AC7EA,IAAAC,oBAAqB;AAoBd,SAAS,oBACd,UACA,cACA,UAA6B,gBACnB;AACV,QAAM,mBAAe,wBAAK,UAAU,cAAc;AAClD,QAAM,WAAW,aAAsC,cAAc,CAAC,CAAC;AACvE,QAAM,WAAY,SAAS,OAAO,KAA4C,CAAC;AAC/E,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC1D,QAAI,OAAO,OAAO,UAAU,IAAI,GAAG;AACjC;AAAA,IACF;AAEA,aAAS,IAAI,IAAI;AACjB,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,WAAS,OAAO,IAAI,OAAO;AAAA,IACzB,OAAO,QAAQ,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC;AAAA,EAClF;AACA,mBAAiB,cAAc,OAAO,QAAQ,CAAC;AAE/C,SAAO;AACT;;;ACxBA,SAAS,eAAgB,MAA2B;AAClD,SAAO,OAAO;AAAA,IACZ,MAAS,KAAK;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAS;AAAA,IACT,SAAS;AAAA,MACP,KAAc;AAAA,MACd,aAAc;AAAA,MACd,aAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAc;AAAA,MACd,OAAc;AAAA,MACd,SAAc;AAAA,MACd,MAAc;AAAA,MACd,MAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAgB,MAAmB,WAAsC;AAChF,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa;AAAA,IACb,MAAa,CAAC,UAAU,GAAG;AAAA,IAC3B,SAAa;AAAA,MACX,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAU,CAAC,0BAA0B,0BAA0B,yBAAyB;AAAA,QACxF,SAAU,EAAE,SAAS,oBAAoB,KAAK,WAAW,GAAG;AAAA,MAC9D;AAAA,MACA,OAAO,IAAI,KAAK;AAAA,MAChB,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,QAA8B;AAAA,MAC9B,KAA8B,CAAC,UAAU,OAAO,cAAc;AAAA,MAC9D,QAA8B;AAAA,MAC9B,kBAA8B;AAAA,MAC9B,OAA8B,CAAC,eAAe,MAAM;AAAA,MACpD,QAA8B;AAAA,MAC9B,WAA8B;AAAA,MAC9B,8BAA8B;AAAA,MAC9B,iBAA8B;AAAA,IAChC;AAAA,IACA,SAAS,CAAC,OAAO,gBAAgB;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,aAAsB;AAC7B,SAAO,OAAO;AAAA,IACZ,SAAa,CAAC,oBAAoB;AAAA,IAClC,aAAa,CAAC,OAAO;AAAA,IACrB,KAAa;AAAA,IACb,SAAa,CAAC,qBAAqB,oBAAoB;AAAA,EACzD,CAAC;AACH;AAEA,SAAS,WAAY,WAAsC;AACzD,SAAO,GAAG,UAAU,gBAAgB;AAAA;AAAA;AAAA,0CAGI,UAAU,cAAc;AAAA;AAElE;AAEA,SAAS,UAAW,MAAmB,WAAsC;AAC3E,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKI,KAAK,IAAI;AAAA;AAAA;AAAA,eAGP,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA;AAKhC;AAEA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcnB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvB,SAAS,QAAS,aAA6B;AAC7C,SAAO,oBAAoB,WAAW;AAAA,uBAA0B,WAAW;AAAA;AAC7E;AAEA,IAAM,MAAyB;AAAA,EAC7B,KAAkB,KAAK;AAAA,EACvB,SAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAkB;AAAA,EAClB,eAAkB;AAAA,EAClB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYlB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASd;AAEA,IAAM,SAA4B;AAAA,EAChC,KAAkB,KAAK;AAAA,EACvB,SAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAkB;AAAA,EAClB,eAAkB;AAAA,EAClB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASd;AAEA,SAAS,iBAAkB,MAAmB,WAA0C;AACtF,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgB,eAAe,IAAI,GAAG,UAAU;AAAA,IACrD,KAAK,gBAAgB,eAAe,MAAM,SAAS,GAAG,YAAY;AAAA,IAClE,KAAK,iBAAiB,YAAY,GAAG,YAAY;AAAA,IACjD,KAAK,kBAAkB,WAAW,SAAS,GAAG,UAAU;AAAA,IACxD,KAAK,cAAc,UAAU,MAAM,SAAS,GAAG,UAAU;AAAA,IACzD,KAAK,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,GAAQ,UAAU;AAAA,IAC3I,KAAK,gBAAgB,WAAW,GAAG,YAAY;AAAA,IAC/C,KAAK,YAAY,QAAQ,KAAK,GAAG,UAAU;AAAA,IAC3C,KAAK,YAAY,QAAQ,KAAK,GAAG,UAAU;AAAA,IAC3C,KAAK,aAAa,QAAQ,MAAM,GAAG,UAAU;AAAA,IAC7C,KAAK,qBAAqB,UAAU,YAAY,UAAU;AAAA,IAC1D,KAAK,eAAe,UAAU,aAAa,UAAU;AAAA,IACrD,KAAK,UAAU,eAAe,UAAU,kBAAkB,UAAU;AAAA,IACpE,KAAK,mBAAmB,YAAY,UAAU;AAAA,IAC9C,KAAK,wBAAwB,gBAAgB,UAAU;AAAA,EACzD;AACF;AAcO,SAAS,YAAa,MAA+B;AAC1D,SAAO,iBAAiB,MAAM,GAAG;AACnC;AAcO,SAAS,eAAgB,MAA+B;AAC7D,SAAO,iBAAiB,MAAM,MAAM;AACtC;;;ACvQA,IAAAC,kBAAsD;AACtD,IAAAC,oBAA6C;AActC,IAAM,aAAc,uBAAM;AAC/B,MAAI;AAEJ,SAAO,MAAc;AACnB,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,QAAI,YAAY;AAChB,aAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,YAAM,gBAAY,wBAAK,WAAW,QAAQ;AAC1C,cAAI,4BAAW,SAAS,GAAG;AACzB,qBAAa;AACb,eAAO;AAAA,MACT;AAEA,YAAM,aAAS,2BAAQ,SAAS;AAChC,UAAI,WAAW,WAAW;AACxB;AAAA,MACF;AACA,kBAAY;AAAA,IACd;AAEA,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACF,GAAG;AAcI,SAAS,UAAW,cAA8B;AACvD,aAAO,kCAAa,wBAAK,WAAW,GAAG,YAAY,GAAG,MAAM;AAC9D;AAeO,SAAS,eAAgB,mBAAqC;AACnE,QAAM,WAAO,wBAAK,WAAW,GAAG,iBAAiB;AACjD,QAAM,QAAkB,CAAC;AAEzB,QAAM,OAAO,CAAC,cAA4B;AACxC,UAAM,cAAU,6BAAY,WAAW,EAAE,eAAe,KAAK,CAAC;AAC9D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAO,wBAAK,WAAW,MAAM,IAAI;AACvC,UAAI,MAAM,YAAY,GAAG;AACvB,aAAK,IAAI;AAAA,MACX,OAAO;AACL,cAAM,SAAK,4BAAS,MAAM,IAAI,EAAE,MAAM,qBAAG,EAAE,KAAK,GAAG,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,OAAK,IAAI;AACT,SAAO;AACT;;;ACpFA,SAASC,gBAAgB,MAA2B;AAClD,SAAO,OAAO;AAAA,IACZ,MAAc,KAAK;AAAA,IACnB,SAAc;AAAA,IACd,SAAc;AAAA,IACd,MAAc;AAAA,IACd,MAAc;AAAA,IACd,cAAc,CAAC;AAAA,IACf,SAAc;AAAA,MACZ,OAAgB;AAAA,MAChB,OAAgB;AAAA,MAChB,OAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,MAAgB;AAAA,MAChB,MAAgB;AAAA,MAChB,KAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,gBAAgB,MAA2B;AAClD,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa;AAAA,IACb,MAAa,CAAC,KAAK,WAAW;AAAA,IAC9B,SAAa;AAAA,MACX,OAAO,EAAE,UAAU,mBAAmB,SAAS,CAAC,oBAAoB,GAAG,SAAS,EAAE,SAAS,oBAAoB,KAAK,WAAW,GAAG,EAAE;AAAA,MACpI,OAAO,IAAI,OAAO;AAAA,MAClB,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,MACjB,KAAO,IAAI,KAAK;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,eAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAAkB;AAAA,MAClB,SAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,WAAkB;AAAA,MAClB,aAAkB;AAAA,MAClB,gBAAkB;AAAA,MAClB,iBAAkB;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,mBAAmB;AAAA,EACzE,CAAC;AACH;AAEA,SAAS,iBAA0B;AACjC,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAAgB;AAAA,MAChB,QAAgB;AAAA,MAChB,WAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,qBAAqB,oBAAoB;AAAA,EAC/F,CAAC;AACH;AAEA,SAASC,cAAsB;AAC7B,SAAO,OAAO;AAAA,IACZ,SAAa,CAAC,oBAAoB;AAAA,IAClC,aAAa,CAAC,OAAO;AAAA,IACrB,KAAa;AAAA,IACb,SAAa,CAAC,qBAAqB,oBAAoB;AAAA,EACzD,CAAC;AACH;AAEA,SAAS,WAAoB;AAC3B,SAAO,OAAO;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,MACP,qBAAqB;AAAA,QACnB,kBAAkB,EAAE,WAAW,MAAM,eAAe,UAAU;AAAA,MAChE;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,IAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAA6B;AAEpC,SAAO,OAAO;AAAA,IACZ,aAAa;AAAA,IACb,QAAa;AAAA,MACX,0BAAkC;AAAA,MAClC,qBAAkC;AAAA,MAClC,kCAAkC;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAmB,aAA6B;AACvD,SAAO,OAAO;AAAA,IACZ,EAAE,MAAM,4BAA4B,OAAO,QAAQ,aAAa,MAAM;AAAA,IACtE,EAAE,MAAM,gCAAgC,OAAO,OAAO,aAAa,MAAM;AAAA,IACzE,EAAE,MAAM,eAAe,OAAO,aAAa,aAAa,MAAM;AAAA,EAChE,CAAC;AACH;AAEA,IAAMC,cAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcnB,IAAMC,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvB,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBhB,IAAM,UAAU;AAAA;AAcT,SAAS,iBAAkB,MAA+B;AAC/D,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgBL,gBAAe,IAAI,GAAG,UAAU;AAAA,IACrD,KAAK,gBAAgBC,gBAAe,IAAI,GAAG,YAAY;AAAA,IACvD,KAAK,iBAAiBC,aAAY,GAAG,YAAY;AAAA,IACjD,KAAK,qBAAqB,eAAe,GAAG,YAAY;AAAA,IACxD,KAAK,aAAa,SAAS,GAAG,UAAU;AAAA,IACxC,KAAK,uBAAuB,kBAAkB,GAAG,UAAU;AAAA,IAC3D,KAAK,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,GAAQ,UAAU;AAAA,IAC3I,KAAK,gBAAgBC,YAAW,GAAG,YAAY;AAAA,IAC/C,KAAK,4BAA4B,kBAAkB,KAAK,GAAG,UAAU;AAAA,IACrE,KAAK,4BAA4B,kBAAkB,KAAK,GAAG,UAAU;AAAA,IACrE,KAAK,6BAA6B,kBAAkB,MAAM,GAAG,UAAU;AAAA,IACvE,KAAK,gBAAgB,SAAS,UAAU;AAAA,IACxC,KAAK,mBAAmBC,aAAY,UAAU;AAAA,IAC9C,KAAK,wBAAwBC,iBAAgB,UAAU;AAAA,IACvD,KAAK,0BAA0B,SAAS,UAAU;AAAA,IAClD,EAAE,MAAM,0BAA0B,SAAS,UAAU,0BAA0B,GAAG,WAAW,aAAa;AAAA,EAC5G;AACF;;;AC3MA,SAAS,eAAgB,MAA2B;AAClD,SAAO,OAAO;AAAA,IACZ,MAAc,KAAK;AAAA,IACnB,SAAc;AAAA,IACd,SAAc;AAAA,IACd,MAAc;AAAA;AAAA;AAAA,IAGd,MAAc;AAAA,IACd,OAAc;AAAA,IACd,cAAc,CAAC;AAAA,IACf,SAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAO;AAAA,MACP,MAAO;AAAA,MACP,KAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAgB,MAA2B;AAClD,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa;AAAA,IACb,MAAa,CAAC,KAAK,WAAW;AAAA,IAC9B,SAAa;AAAA,MACX,OAAO,EAAE,UAAU,mBAAmB,SAAS,CAAC,oBAAoB,GAAG,SAAS,EAAE,SAAS,oBAAoB,KAAK,WAAW,GAAG,EAAE;AAAA,MACpI,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,MACjB,KAAO,IAAI,KAAK;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAA8B;AAAA,MAC9B,SAA8B;AAAA,MAC9B,QAA8B;AAAA,MAC9B,QAA8B;AAAA,MAC9B,kBAA8B;AAAA,MAC9B,QAA8B;AAAA,MAC9B,KAA8B,CAAC,QAAQ;AAAA,MACvC,QAA8B;AAAA,MAC9B,qBAA8B;AAAA,MAC9B,WAA8B;AAAA,MAC9B,aAA8B;AAAA,MAC9B,gBAA8B;AAAA,MAC9B,gBAA8B;AAAA,MAC9B,8BAA8B;AAAA,MAC9B,eAA8B;AAAA,MAC9B,iBAA8B;AAAA,IAChC;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,mBAAmB;AAAA,EACzE,CAAC;AACH;AAEA,SAAS,iBAA0B;AACjC,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAAqB;AAAA,MACrB,QAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,WAAqB;AAAA,MACrB,aAAqB;AAAA,MACrB,gBAAqB;AAAA,MACrB,gBAAqB;AAAA,IACvB;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,qBAAqB,sBAAsB,gBAAgB;AAAA,EACjH,CAAC;AACH;AAEA,SAAS,aAAsB;AAC7B,SAAO,OAAO;AAAA,IACZ,SAAa,CAAC,oBAAoB;AAAA,IAClC,aAAa,CAAC,OAAO;AAAA,IACrB,KAAa;AAAA,IACb,SAAa,CAAC,qBAAqB,oBAAoB;AAAA,EACzD,CAAC;AACH;AAEA,IAAMC,WAAU;AAAA;AAGhB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBlB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBf,SAAS,iBAAkB,MAA+B;AAC/D,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,YAAY,CAAC,MAAc,aAA+B,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,WAAW,aAAa;AAC5H,QAAM,WAAW,CAAC,MAAc,aAA+B,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,WAAW,WAAW;AAEzH,SAAO;AAAA,IACL,SAAS,gBAAgB,eAAe,IAAI,CAAC;AAAA,IAC7C,UAAU,gBAAgB,eAAe,IAAI,CAAC;AAAA,IAC9C,UAAU,iBAAiB,YAAY,CAAC;AAAA,IACxC,UAAU,qBAAqB,eAAe,CAAC;AAAA,IAC/C,SAAS,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,CAAM;AAAA,IACnI,UAAU,gBAAgB,WAAW,CAAC;AAAA,IACtC,SAAS,gBAAgBA,QAAO;AAAA,IAChC,SAAS,kBAAkB,SAAS;AAAA,IACpC,SAAS,uBAAuB,aAAa;AAAA,EAC/C;AACF;;;ACjJA,IAAM,iBAAiB,CAAC,gBAAgC,kBAAkB,WAAW,uCAAuC,WAAW;AAEvI,SAASC,gBAAgB,MAA2B;AAClD,SAAO,OAAO;AAAA,IACZ,MAAS,KAAK;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAS;AAAA,IACT,SAAS;AAAA,MACP,KAAc;AAAA,MACd,aAAc,eAAe,KAAK;AAAA,MAClC,aAAc,eAAe,KAAK;AAAA,MAClC,cAAc,eAAe,MAAM;AAAA,MACnC,aAAc;AAAA,MACd,OAAc;AAAA,MACd,OAAc;AAAA,MACd,MAAc;AAAA,MACd,MAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,gBAAgB,MAA2B;AAClD,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa;AAAA,IACb,MAAa,CAAC,KAAK,SAAS;AAAA,IAC5B,SAAa;AAAA,MACX,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAU,CAAC,0BAA0B,0BAA0B,yBAAyB;AAAA,QACxF,SAAU,EAAE,SAAS,oBAAoB,KAAK,WAAW,GAAG;AAAA,MAC9D;AAAA,MACA,OAAO,IAAI,KAAK;AAAA,MAChB,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,eAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,QAAkB;AAAA,MAClB,KAAkB,CAAC,UAAU,OAAO,cAAc;AAAA,MAClD,KAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,OAAkB,CAAC,MAAM;AAAA,MACzB,QAAkB;AAAA,MAClB,SAAkB;AAAA,MAClB,iBAAkB;AAAA,MAClB,aAAkB;AAAA,MAClB,SAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,iBAAiB,OAAO,qBAAqB;AAAA,IACvD,SAAS,CAAC,cAAc;AAAA,EAC1B,CAAC;AACH;AAEA,SAASC,cAAsB;AAC7B,SAAO,OAAO;AAAA,IACZ,SAAa,CAAC,oBAAoB;AAAA,IAClC,aAAa,CAAC,OAAO;AAAA,IACrB,KAAa;AAAA,IACb,SAAa,CAAC,qBAAqB,oBAAoB;AAAA,EACzD,CAAC;AACH;AAEA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnB,SAAS,UAAW,MAA2B;AAC7C,SAAO;AAAA;AAAA,oCAE2B,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW7C;AAEA,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYhB,IAAMC,cAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcnB,IAAMC,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvB,SAASC,SAAS,aAA6B;AAC7C,SAAO,2BAA2B,WAAW;AAAA,8BAAiC,WAAW;AAAA;AAC3F;AAgBO,SAAS,aAAc,MAA+B;AAC3D,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgBN,gBAAe,IAAI,GAAG,UAAU;AAAA,IACrD,KAAK,gBAAgBC,gBAAe,IAAI,GAAG,YAAY;AAAA,IACvD,KAAK,iBAAiBC,aAAY,GAAG,YAAY;AAAA,IACjD,KAAK,mBAAmB,YAAY,UAAU;AAAA,IAC9C,KAAK,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,GAAQ,UAAU;AAAA,IAC3I,KAAK,gBAAgBC,YAAW,GAAG,YAAY;AAAA,IAC/C,KAAK,YAAYG,SAAQ,KAAK,GAAG,UAAU;AAAA,IAC3C,KAAK,YAAYA,SAAQ,KAAK,GAAG,UAAU;AAAA,IAC3C,KAAK,aAAaA,SAAQ,MAAM,GAAG,UAAU;AAAA,IAC7C,KAAK,sBAAsB,UAAU,IAAI,GAAG,UAAU;AAAA,IACtD,KAAK,oBAAoB,SAAS,UAAU;AAAA,IAC5C,KAAK,mBAAmBF,aAAY,UAAU;AAAA,IAC9C,KAAK,wBAAwBC,iBAAgB,UAAU;AAAA,IACvD,EAAE,MAAM,wBAAwB,SAAS,UAAU,wBAAwB,GAAG,WAAW,aAAa;AAAA,EACxG;AACF;;;AC/KA,SAASE,gBAAgB,MAA2B;AAClD,SAAO,OAAO;AAAA,IACZ,MAAc,KAAK;AAAA,IACnB,SAAc;AAAA,IACd,SAAc;AAAA,IACd,MAAc;AAAA,IACd,MAAc;AAAA,IACd,cAAc,CAAC;AAAA,IACf,SAAc;AAAA,MACZ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,KAAO;AAAA,MACP,MAAO;AAAA,MACP,MAAO;AAAA,MACP,KAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,SAASC,gBAAgB,MAA2B;AAClD,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa;AAAA,IACb,MAAa,CAAC,KAAK,OAAO;AAAA,IAC1B,SAAa;AAAA,MACX,OAAO,EAAE,UAAU,mBAAmB,SAAS,CAAC,oBAAoB,GAAG,SAAS,EAAE,SAAS,oBAAoB,KAAK,WAAW,GAAG,EAAE;AAAA,MACpI,OAAO,IAAI,OAAO;AAAA,MAClB,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,MACjB,KAAO,IAAI,KAAK;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,eAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAAkB;AAAA,MAClB,SAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,WAAkB;AAAA,MAClB,aAAkB;AAAA,MAClB,gBAAkB;AAAA,MAClB,iBAAkB;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,mBAAmB;AAAA,EACzE,CAAC;AACH;AAEA,SAASC,kBAA0B;AACjC,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAAgB;AAAA,MAChB,QAAgB;AAAA,MAChB,WAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,qBAAqB,oBAAoB;AAAA,EAC/F,CAAC;AACH;AAEA,SAASC,cAAsB;AAC7B,SAAO,OAAO;AAAA,IACZ,SAAa,CAAC,oBAAoB;AAAA,IAClC,aAAa,CAAC,OAAO;AAAA,IACrB,KAAa;AAAA,IACb,SAAa,CAAC,qBAAqB,oBAAoB;AAAA,EACzD,CAAC;AACH;AAEA,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCjB,IAAMC,WAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUhB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBd,SAAS,aAAc,MAA+B;AAC3D,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgBL,gBAAe,IAAI,GAAG,UAAU;AAAA,IACrD,KAAK,gBAAgBC,gBAAe,IAAI,GAAG,YAAY;AAAA,IACvD,KAAK,iBAAiBC,aAAY,GAAG,YAAY;AAAA,IACjD,KAAK,qBAAqBC,gBAAe,GAAG,YAAY;AAAA,IACxD,KAAK,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,GAAQ,UAAU;AAAA,IAC3I,KAAK,gBAAgBC,YAAW,GAAG,YAAY;AAAA,IAC/C,KAAK,gBAAgBC,UAAS,UAAU;AAAA,IACxC,KAAK,iBAAiB,UAAU,UAAU;AAAA,IAC1C,KAAK,sBAAsB,cAAc,UAAU;AAAA,EACrD;AACF;;;AC1JO,SAAS,YAAa,UAA8C;AACzE,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,mBAAmB;AACtB,aAAO,8BAA8B,SAAS,YAAY,IAAI,SAAS,OAAO,eAAe,SAAS,aAAa;AAAA,IACrH;AAAA,IACA,KAAK,mBAAmB;AACtB,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AACP,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAgBO,SAAS,aAAc,UAA0B,OAAuB;AAC7E,QAAM,YAAY,MAAM,QAAQ,MAAM,EAAE;AACxC,QAAM,MAAM,YAAY,QAAQ;AAChC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,KAAK;AACP,UAAM,OAAO,IAAI,QAAQ,eAAe,EAAE;AAC1C,UAAM,KAAK,IAAI,SAAS,aAAa,GAAG,IAAI,KAAK,IAAI,iCAAiC;AAAA,EACxF;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACnDA,SAAS,cAAe,MAAuD;AAC7E,QAAM,MAAM,KAAK,WAAW,YAAY,KAAK,QAAQ,IAAI;AACzD,SAAO,MAAM,EAAE,UAAU,IAAI,IAAI;AACnC;AAEA,SAAS,WAAoB;AAC3B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAA8B;AAAA,MAC9B,SAA8B;AAAA,MAC9B,QAA8B;AAAA,MAC9B,QAA8B;AAAA,MAC9B,kBAA8B;AAAA,MAC9B,QAA8B;AAAA,MAC9B,KAA8B,CAAC,QAAQ;AAAA,MACvC,QAA8B;AAAA,MAC9B,qBAA8B;AAAA,MAC9B,WAA8B;AAAA,MAC9B,aAA8B;AAAA,MAC9B,gBAA8B;AAAA,MAC9B,gBAA8B;AAAA,MAC9B,8BAA8B;AAAA,MAC9B,eAA8B;AAAA,MAC9B,iBAA8B;AAAA,IAChC;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,mBAAmB;AAAA,EACzE,CAAC;AACH;AAEA,SAAS,cAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,SAAqB;AAAA,MACrB,QAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,WAAqB;AAAA,MACrB,aAAqB;AAAA,MACrB,gBAAqB;AAAA,MACrB,gBAAqB;AAAA,IACvB;AAAA,IACA,SAAS,CAAC,iBAAiB,aAAa,YAAY,qBAAqB,oBAAoB;AAAA,EAC/F,CAAC;AACH;AAEA,SAAS,UAAmB;AAC1B,SAAO,OAAO;AAAA,IACZ,SAAa,CAAC,oBAAoB;AAAA,IAClC,aAAa,CAAC,OAAO;AAAA,IACrB,KAAa;AAAA,IACb,SAAa,CAAC,qBAAqB,oBAAoB;AAAA,EACzD,CAAC;AACH;AAEA,SAAS,YAAa,MAAmB,cAA8B;AACrE,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa,KAAK,SAAS,aAAa,gBAAgB;AAAA,IACxD,MAAa,CAAC,KAAK,cAAc;AAAA,IACjC,SAAa;AAAA,MACX,OAAO,EAAE,UAAU,mBAAmB,SAAS,CAAC,oBAAoB,GAAG,SAAS,EAAE,SAAS,aAAa,EAAE;AAAA,MAC1G,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,MACjB,KAAO,IAAI,KAAK;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,IAAMC,aAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBlB,IAAMC,iBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUtB,SAAS,oBAA+B;AACtC,SAAO;AAAA,IACL,MAAW;AAAA,IACX,SAAW,UAAU,mCAAmC;AAAA,IACxD,WAAW;AAAA,EACb;AACF;AAaO,SAAS,oBAAqB,MAA+B;AAClE,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,eAAe,oBAAoB,KAAK,WAAW;AACzD,QAAMC,eAAc,OAAO;AAAA,IACzB,MAAe,KAAK;AAAA,IACpB,SAAe;AAAA,IACf,MAAe;AAAA,IACf,MAAe;AAAA,IACf,OAAe;AAAA,IACf,eAAe,cAAc,IAAI;AAAA,IACjC,cAAe,EAAE,MAAM,EAAE,MAAM,cAAc,OAAO,eAAe,EAAE;AAAA,IACrE,cAAe,CAAC;AAAA,IAChB,SAAe;AAAA,MACb,OAAS;AAAA,MACT,MAAS;AAAA,MACT,MAAS;AAAA,MACT,KAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgBA,cAAa,UAAU;AAAA,IAC5C,KAAK,gBAAgB,YAAY,MAAM,YAAY,GAAG,YAAY;AAAA,IAClE,KAAK,iBAAiB,SAAS,GAAG,YAAY;AAAA,IAC9C,KAAK,qBAAqB,YAAY,GAAG,YAAY;AAAA,IACrD,KAAK,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,GAAQ,UAAU;AAAA,IAC3I,KAAK,gBAAgB,QAAQ,GAAG,YAAY;AAAA,IAC5C,KAAK,gBAAgB,+BAAiC,UAAU;AAAA,IAChE,KAAK,kBAAkBF,YAAW,UAAU;AAAA,IAC5C,KAAK,uBAAuBC,gBAAe,UAAU;AAAA,IACrD,kBAAkB;AAAA,EACpB;AACF;AAEA,IAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBd,SAAS,aAAc,MAA+B;AAC3D,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,eAAe,oBAAoB,KAAK,WAAW;AACzD,QAAM,UAAU;AAChB,QAAMC,eAAc,OAAO;AAAA,IACzB,MAAe,KAAK;AAAA,IACpB,SAAe;AAAA,IACf,MAAe;AAAA,IACf,MAAe;AAAA,IACf,KAAe,EAAE,CAAC,KAAK,IAAI,GAAG,gBAAgB;AAAA,IAC9C,eAAe,cAAc,IAAI;AAAA,IACjC,cAAe,EAAE,MAAM,EAAE,MAAM,YAAY,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,WAAW,EAAE,EAAE;AAAA,IAC9E,cAAe,CAAC;AAAA,IAChB,SAAe;AAAA,MACb,OAAS,GAAG,OAAO;AAAA,MACnB,MAAS;AAAA,MACT,MAAS;AAAA,MACT,KAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgBA,cAAa,UAAU;AAAA,IAC5C,KAAK,gBAAgB,YAAY,MAAM,YAAY,GAAG,YAAY;AAAA,IAClE,KAAK,iBAAiB,SAAS,GAAG,YAAY;AAAA,IAC9C,KAAK,qBAAqB,YAAY,GAAG,YAAY;AAAA,IACrD,KAAK,mBAAmB;AAAA;AAAA,+BAAwF,KAAK,IAAI;AAAA,GAAQ,UAAU;AAAA,IAC3I,KAAK,gBAAgB,QAAQ,GAAG,YAAY;AAAA,IAC5C,KAAK,cAAc,WAAW,UAAU;AAAA,IACxC,KAAK,kBAAkB,cAAc,UAAU;AAAA,IAC/C,KAAK,uBAAuB,eAAe,UAAU;AAAA,IACrD,kBAAkB;AAAA,EACpB;AACF;;;AC/OA,SAASC,gBAAgB,MAA2B;AAClD,SAAO,OAAO;AAAA,IACZ,MAAS,KAAK;AAAA,IACd,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAS;AAAA,IACT,SAAS;AAAA,MACP,KAAc;AAAA,MACd,aAAc;AAAA,MACd,aAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAc;AAAA,MACd,OAAc;AAAA,MACd,SAAc;AAAA,MACd,MAAc;AAAA,MACd,MAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,gBAAgB,MAA2B;AAClD,QAAM,MAAM,CAAC,YAAwE;AAAA,IACnF,UAAU;AAAA,IACV,SAAU,EAAE,SAAS,WAAW,MAAM,OAAO,KAAK,WAAW,GAAG;AAAA,EAClE;AAEA,SAAO,OAAO;AAAA,IACZ,MAAa,KAAK;AAAA,IAClB,SAAa;AAAA,IACb,YAAa,QAAQ,KAAK,IAAI;AAAA,IAC9B,aAAa;AAAA,IACb,MAAa,CAAC,KAAK,QAAQ;AAAA,IAC3B,SAAa;AAAA,MACX,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAU,CAAC,0BAA0B,0BAA0B,yBAAyB;AAAA,QACxF,SAAU,EAAE,SAAS,oBAAoB,KAAK,WAAW,GAAG;AAAA,MAC9D;AAAA,MACA,OAAO,IAAI,KAAK;AAAA,MAChB,MAAO,IAAI,MAAM;AAAA,MACjB,MAAO,IAAI,MAAM;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAASC,eAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,QAA8B;AAAA,MAC9B,KAA8B,CAAC,UAAU,OAAO,cAAc;AAAA,MAC9D,QAA8B;AAAA,MAC9B,kBAA8B;AAAA,MAC9B,KAA8B;AAAA,MAC9B,OAA8B,CAAC,eAAe,MAAM;AAAA,MACpD,QAA8B;AAAA,MAC9B,WAA8B;AAAA,MAC9B,8BAA8B;AAAA,MAC9B,iBAA8B;AAAA,IAChC;AAAA,IACA,SAAS,CAAC,OAAO,gBAAgB;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,kBAA2B;AAElC,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,KAAkB;AAAA,MAClB,QAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,OAAkB,CAAC,QAAQ,MAAM;AAAA,IACnC;AAAA,EACF,CAAC;AACH;AAEA,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAMrB,IAAM,aAAa;AAAA;AAGnB,SAASC,WAAW,MAA2B;AAC7C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKI,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQtB;AAEA,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAehB,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBf,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYnB,IAAM,gBAAgB,CAAC,SAAyB,OAAO;AAAA;AAAA,6BAE1B,IAAI;AAAA;AAAA;AAAA;AAKjC,SAASC,SAAS,aAA6B;AAC7C,SAAO,oBAAoB,WAAW;AAAA,uBAA0B,WAAW;AAAA;AAC7E;AAaO,SAAS,cAAe,MAA+B;AAC5D,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAM,OAAO,CAAC,MAAc,SAAiB,eAAgD,EAAE,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,SAAS,UAAU;AAE3I,SAAO;AAAA,IACL,KAAK,gBAAgBJ,gBAAe,IAAI,GAAG,UAAU;AAAA,IACrD,KAAK,gBAAgBC,gBAAe,IAAI,GAAG,YAAY;AAAA,IACvD,KAAK,iBAAiBC,aAAY,GAAG,YAAY;AAAA,IACjD,KAAK,sBAAsB,gBAAgB,GAAG,YAAY;AAAA,IAC1D,KAAK,kBAAkB,cAAc,UAAU;AAAA,IAC/C,KAAK,cAAcC,WAAU,IAAI,GAAG,UAAU;AAAA,IAC9C,KAAK,mBAAmB,cAAc,KAAK,IAAI,GAAG,UAAU;AAAA,IAC5D,KAAK,YAAYC,SAAQ,KAAK,GAAG,UAAU;AAAA,IAC3C,KAAK,YAAYA,SAAQ,KAAK,GAAG,UAAU;AAAA,IAC3C,KAAK,aAAaA,SAAQ,MAAM,GAAG,UAAU;AAAA,IAC7C,KAAK,qBAAqB,YAAY,UAAU;AAAA,IAChD,KAAK,gBAAgB,SAAS,UAAU;AAAA,IACxC,KAAK,eAAe,QAAQ,UAAU;AAAA,IACtC,KAAK,oBAAoB,YAAY,UAAU;AAAA,EACjD;AACF;;;AC9KA,IAAM,oBAAoE;AAAA,EACxE,gBAAgB;AAAA,IACd,cAAc,EAAE,oBAAoB,UAAU;AAAA,EAChD;AAAA,EACA,YAAY;AAAA,IACV,iBAAiB,EAAE,KAAK,UAAU;AAAA,EACpC;AAAA,EACA,WAAW;AAAA,IACT,cAAiB,EAAE,KAAK,UAAU;AAAA,IAClC,iBAAiB,EAAE,sBAAsB,UAAU,MAAM,SAAS;AAAA,EACpE;AAAA,EACA,cAAc;AAAA,IACZ,iBAAiB,EAAE,gCAAgC,UAAU,QAAQ,WAAW,MAAM,SAAS;AAAA,EACjG;AAAA,EACA,cAAc;AAAA,IACZ,cAAiB,EAAE,MAAM,WAAW,OAAO,WAAW,aAAa,UAAU;AAAA,IAC7E,iBAAiB,EAAE,gBAAgB,WAAW,oBAAoB,WAAW,cAAc,SAAS;AAAA,EACtG;AAAA,EACA,aAAa;AAAA,IACX,cAAiB,EAAE,OAAO,WAAW,aAAa,UAAU;AAAA,IAC5D,iBAAiB;AAAA,MACf,wBAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,0BAA6B;AAAA,MAC7B,gBAA6B;AAAA,MAC7B,oBAA6B;AAAA,MAC7B,wBAA6B;AAAA,MAC7B,0BAA6B;AAAA,MAC7B,MAA6B;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,SAAS,aAAc,MAAmB,MAA+B;AACvE,UAAQ,MAAM;AAAA,IACZ,KAAK,gBAAgB;AACnB,aAAO,iBAAiB,IAAI;AAAA,IAC9B;AAAA,IACA,KAAK,mBAAmB;AACtB,aAAO,oBAAoB,IAAI;AAAA,IACjC;AAAA,IACA,KAAK,YAAY;AACf,aAAO,aAAa,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK,gBAAgB;AACnB,aAAO,iBAAiB,IAAI;AAAA,IAC9B;AAAA,IACA,KAAK,YAAY;AACf,aAAO,aAAa,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK,aAAa;AAChB,aAAO,cAAc,IAAI;AAAA,IAC3B;AAAA,IACA,KAAK,WAAW;AACd,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,IACA,KAAK,cAAc;AACjB,aAAO,eAAe,IAAI;AAAA,IAC5B;AAAA,IACA,KAAK,cAAc;AACjB,aAAO,aAAa,IAAI;AAAA,IAC1B;AAAA,IACA,SAAS;AACP,YAAM,IAAI,MAAM,QAAQ,IAAc,qCAAqC;AAAA,IAC7E;AAAA,EACF;AACF;AAeO,SAAS,aAAc,MAAmB,MAA+B;AAC9E,SAAO,aAAa,MAAM,IAAI;AAChC;AAEA,SAAS,sBAAuB,UAAkB,MAAyB;AACzE,QAAM,OAAO,kBAAkB,IAAI;AACnC,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,GAAI,KAAK,eAAe,oBAAoB,UAAU,KAAK,cAAc,cAAc,IAAI,CAAC;AAAA,IAC5F,GAAI,KAAK,kBAAkB,oBAAoB,UAAU,KAAK,iBAAiB,iBAAiB,IAAI,CAAC;AAAA,EACvG;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,KAAK,4BAA4B,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5D;AACF;AAkBO,SAAS,gBAAiB,UAAkB,MAAmB,MAAc,QAAkC;AACpH,QAAM,OAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,aAAa,GAAG,OAAO,KAAK,IAAI,IAAI;AAAA,IACpC,OAAa,OAAO;AAAA,IACpB,UAAa,OAAO;AAAA,EACtB;AAEA,SAAO,KAAK,UAAU,IAAI,KAAK,IAAI,MAAM,KAAK,WAAW,GAAG;AAC5D,cAAY,WAAW,UAAU,aAAa,MAAM,IAAI,CAAC,CAAC;AAC1D,wBAAsB,UAAU,IAAI;AACtC;;;ACjHA,eAAsB,OAAQ,SAAoC;AAChE,QAAM,WAAW,QAAQ,IAAI;AAE7B,MAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,WAAO,MAAM,2GAA2G;AACxH;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,QAAQ;AAClC,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM,oCAAoC;AACjD;AAAA,EACF;AAEA,QAAM,OAAQ,QAAQ,QAAoC,UAAM,wBAAoB;AAAA,IAClF,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,oBAAoB,OAAO,eAAe;AAAA,MAClD,EAAE,MAAM,uBAAuB,OAAO,kBAAkB;AAAA,MACxD,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,MACtC,EAAE,MAAM,sBAAsB,OAAO,eAAe;AAAA,MACpD,EAAE,MAAM,gCAAgC,OAAO,WAAW;AAAA,MAC1D,EAAE,MAAM,aAAa,OAAO,YAAY;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,MACpC,EAAE,MAAM,cAAc,OAAO,aAAa;AAAA,MAC1C,EAAE,MAAM,4BAA4B,OAAO,aAAa;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,QAAM,OAAO,OAAO,QAAQ,QAAQ,MAAM,WAAW,cAAc,CAAC;AACpE,kBAAgB,UAAU,MAAM,MAAM,MAAM;AAC5C,SAAO,QAAQ,0EAA0E;AAC3F;;;ACjEA,IAAAC,kBAAwC;AACxC,IAAAC,oBAAqB;AAKrB,SAAS,SAAUC,cAAgD;AACjE,SAAO,MAAM,QAAQA,aAAY,IAAI,IAAIA,aAAY,KAAK,IAAI,MAAM,IAAI,CAAC;AAC3E;AAEA,SAAS,OAAQC,cAA+C;AAC9D,MAAIA,aAAY,KAAK;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,SAASA,aAAY;AAC3B,SAAO,QAAQ,QAAQ,MAAM,GAAG;AAClC;AAGA,SAAS,gBAAiBD,cAAsCC,cAA+D;AAC7H,QAAM,OAAO,SAASD,YAAW;AAEjC,MAAI,KAAK,SAAS,KAAK,WAAW,GAAG;AACnC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,QAAQ,GAAG;AAChC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,MAAM,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,WAAW,GAAG;AACnC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,cAAc,GAAG;AACtC,WAAO,OAAOC,YAAW,IAAI,aAAa;AAAA,EAC5C;AAEA,SAAO;AACT;AAEA,SAAS,SAAU,eAAuB,QAA2C;AACnF,QAAM,WAA0B,CAAC;AACjC,QAAM,cAAU,6BAAY,eAAe,EAAE,eAAe,KAAK,CAAC;AAElE,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,uBAAmB,wBAAK,eAAe,MAAM,IAAI;AACvD,UAAMD,eAAc,iBAAsC,wBAAK,kBAAkB,cAAc,GAAG,CAAC,CAAC;AACpG,UAAMC,eAAc,iBAAsC,wBAAK,kBAAkB,cAAc,GAAG,CAAC,CAAC;AACpG,UAAM,OAAO,gBAAgBD,cAAaC,YAAW;AACrD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,cAAc,OAAOA,aAAY,SAAS,WAAWA,aAAY,OAAO,GAAG,OAAO,KAAK,IAAI,MAAM,IAAI;AAC3G,aAAS,KAAK,EAAE,MAAM,MAAM,MAAM,MAAM,aAAa,OAAO,OAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AAAA,EACvG;AAEA,SAAO;AACT;AAgBO,SAAS,iBAAkB,UAAkB,QAA2C;AAC7F,QAAM,WAA0B,CAAC;AAEjC,aAAW,QAAQ,CAAC,QAAQ,MAAM,GAAG;AACnC,UAAM,oBAAgB,wBAAK,UAAU,IAAI;AACzC,YAAI,4BAAW,aAAa,GAAG;AAC7B,eAAS,KAAK,GAAG,SAAS,eAAe,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,SAAO;AACT;;;ACpGA,IAAAC,oBAAqB;AA0Bd,SAAS,UAAW,UAAkB,MAA4B;AACvE,QAAM,eAAW,wBAAK,UAAU,KAAK,IAAI;AACzC,MAAI,KAAC,4BAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,QAAQ,MAAM,KAAK,UAAU,OAAO;AAC1D;AAiCO,SAAS,cAAe,UAAkB,OAAmB,aAAkC;AACpG,QAAM,SAAqB,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AAEvE,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,cAAc,cAAc;AACnC;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,UAAU,IAAI;AACvC,QAAI,WAAW,MAAM;AACnB,aAAO,GAAG,KAAK,KAAK,IAAI;AACxB;AAAA,IACF;AAEA,QAAI,WAAW,WAAW;AACxB,aAAO,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC/B,OAAO;AACL,aAAO,MAAM,KAAK,KAAK,IAAI;AAAA,IAC7B;AAEA,QAAI,aAAa;AACf,2BAAiB,wBAAK,UAAU,KAAK,IAAI,GAAG,KAAK,OAAO;AACxD,aAAO,MAAM,KAAK,KAAK,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;;;AC7FA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,KAAO;AAAA,IACL,cAAgB;AAAA,IAChB,MAAQ;AAAA,EACV;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAa;AAAA,IACb,OAAS;AAAA,EACX;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,iBAAmB;AAAA,IACjB,oBAAoB;AAAA,IACpB,4BAA4B;AAAA,IAC5B,eAAe;AAAA,IACf,eAAe;AAAA,IACf,QAAU;AAAA,IACV,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,IACvB,6BAA6B;AAAA,IAC7B,+BAA+B;AAAA,IAC/B,uBAAuB;AAAA,IACvB,iCAAiC;AAAA,IACjC,yBAAyB;AAAA,IACzB,gCAAgC;AAAA,IAChC,qBAAqB;AAAA,IACrB,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,WAAW;AAAA,IACX,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,qBAAqB;AAAA,EACvB;AACF;;;ACzDA,IAAM,mBAAmB,CAAC,SAA+D,gBAAgB,gBAAgB,IAAI;AAW7H,IAAM,mBAA2C;AAAA,EAC/C,mBAAmC;AAAA,EACnC,mCAAmC;AAAA,EACnC,oBAAmC,iBAAiB,kBAAkB;AAAA,EACtE,4BAAmC,iBAAiB,0BAA0B;AAAA,EAC9E,eAAmC,iBAAiB,aAAa;AAAA,EACjE,eAAmC,iBAAiB,aAAa;AAAA,EACjE,SAAmC;AAAA,EACnC,QAAmC,iBAAiB,QAAQ;AAAA,EAC5D,sBAAmC,iBAAiB,oBAAoB;AAAA,EACxE,uBAAmC,iBAAiB,qBAAqB;AAAA,EACzE,mBAAmC,iBAAiB,iBAAiB;AAAA,EACrE,yBAAmC,iBAAiB,uBAAuB;AAAA,EAC3E,uBAAmC,iBAAiB,qBAAqB;AAAA,EACzE,6BAAmC,iBAAiB,2BAA2B;AAAA,EAC/E,+BAAmC,iBAAiB,6BAA6B;AAAA,EACjF,uBAAmC,iBAAiB,qBAAqB;AAAA,EACzE,iCAAmC,iBAAiB,+BAA+B;AAAA,EACnF,yBAAmC,iBAAiB,uBAAuB;AAAA,EAC3E,gCAAmC,iBAAiB,8BAA8B;AAAA,EAClF,qBAAmC,iBAAiB,mBAAmB;AAAA,EACvE,SAAmC,iBAAiB,SAAS;AAAA,EAC7D,OAAmC;AAAA,EACnC,MAAmC,iBAAiB,MAAM;AAAA,EAC1D,cAAmC;AAAA,EACnC,IAAmC;AAAA,EACnC,WAAmC,iBAAiB,SAAS;AAAA,EAC7D,aAAmC;AAAA,EACnC,OAAmC;AAAA,EACnC,SAAmC;AAAA,EACnC,kCAAmC;AAAA,EACnC,YAAmC,iBAAiB,YAAY;AAAA,EAChE,qBAAmC,iBAAiB,mBAAmB;AACzE;AAEA,SAAS,YAAa,MAA4B;AAChD,SAAO,OAAO;AAAA,IACZ,MAAY,KAAK;AAAA,IACjB,SAAY;AAAA,IACZ,SAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY,CAAC,UAAU,QAAQ;AAAA,IAC/B,SAAY;AAAA,MACV,OAAoB;AAAA,MACpB,kBAAoB;AAAA,MACpB,MAAoB;AAAA,MACpB,iBAAoB;AAAA,MACpB,MAAoB;AAAA,MACpB,iBAAoB;AAAA,MACpB,KAAoB;AAAA,MACpB,gBAAoB;AAAA,MACpB,UAAoB;AAAA,MACpB,UAAoB;AAAA,MACpB,OAAoB;AAAA,MACpB,YAAoB;AAAA,MACpB,iBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,SAAoB;AAAA,MACpB,mBAAoB;AAAA,MACpB,mBAAoB;AAAA,MACpB,SAAoB;AAAA,IACtB;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,IACjB,SAAiB;AAAA,MACf,MAAM,KAAK,KAAK,WAAW;AAAA,IAC7B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,OAAQ,MAA4B;AAC3C,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB,EAAE,SAAS,QAAQ,SAAS,OAAO;AAAA,IACpD,aAAiB,KAAK;AAAA,IACtB,aAAiB;AAAA,MACf,eAAe;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAY,CAAC,sBAAsB,eAAe;AAAA,MAClD,YAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,EAAE,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC,cAAc,aAAa,GAAG,OAAO,KAAK;AAAA,MACnF,MAAO,EAAE,QAAQ,CAAC,WAAW,aAAa,GAAG,OAAO,KAAK;AAAA,MACzD,MAAO,EAAE,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC,WAAW,aAAa,GAAG,OAAO,KAAK;AAAA,MAC/E,KAAO,EAAE,QAAQ,CAAC,cAAc,aAAa,GAAG,OAAO,KAAK;AAAA,IAC9D;AAAA,IACA,SAAS;AAAA,MACP,sBAAsB;AAAA,MACtB,UAAsB,CAAC,0BAA0B;AAAA,MACjD,mBAAsB;AAAA,MACtB,SAAsB,EAAE,qBAAqB,KAAK;AAAA,MAClD,WAAsB,EAAE,mBAAmB,KAAK;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AACH;AAEA,SAAS,eAAwB;AAC/B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,oBAAkC;AAAA,MAClC,QAAkC;AAAA,MAClC,OAAkC,CAAC,QAAQ,MAAM;AAAA,MACjD,WAAkC;AAAA,MAClC,aAAkC;AAAA,MAClC,gBAAkC;AAAA,MAClC,gBAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,iBAAkC;AAAA,MAClC,4BAAkC;AAAA,MAClC,gBAAkC;AAAA,MAClC,oBAAkC;AAAA,MAClC,mBAAkC;AAAA,MAClC,cAAkC;AAAA,MAClC,QAAkC;AAAA,MAClC,kBAAkC;AAAA,MAClC,8BAAkC;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAwB;AAE/B,SAAO,OAAO;AAAA,IACZ,SAAiB;AAAA,IACjB,iBAAiB;AAAA,MACf,QAAqB;AAAA,MACrB,QAAqB;AAAA,MACrB,kBAAqB;AAAA,MACrB,QAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,aAAqB;AAAA,MACrB,gBAAqB;AAAA,MACrB,WAAqB;AAAA,MACrB,iBAAqB;AAAA,IACvB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAuB;AAC9B,SAAO,OAAO;AAAA,IACZ,SAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,QAAoB,CAAC,gCAAgC;AAAA,IACrD,gBAAoB;AAAA,IACpB,mBAAoB;AAAA,IACpB,gBAAoB;AAAA,EACtB,CAAC;AACH;AAIA,IAAMC,iBAAgB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW7B,IAAM,gBAAgB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+B7B,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYrB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAOrB,SAAS,MAAO,MAA4B;AAC1C,SAAO,aAAa,KAAK,UAAU,KAAK,KAAK;AAC/C;AAEA,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcrB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBlB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAK5B,IAAM,qBAAqB;AAAA;AAG3B,SAAS,OAAQ,MAA4B;AAC3C,SAAO,KAAK,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAgBrB,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzB;AAGA,SAAS,iBAAkB,UAAkC;AAC3D,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,mBAAmB;AACtB,aAAO,+BAA+B,SAAS,gBAAgB;AAAA,IACjE;AAAA,IACA,KAAK,mBAAmB;AACtB,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AACP,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,kBAAmB,MAA4B;AACtD,QAAM,gBAAgB,iBAAiB,KAAK,QAAQ;AAEpD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAgDF,KAAK,WAAW;AAAA,kDAC2B,aAAa;AAAA;AAAA;AAG/D;AAEA,SAAS,cAAe,MAA4B;AAClD,SAAO,OAAO;AAAA,IACZ,SAAU,CAAC,EAAE,MAAM,KAAK,MAAM,KAAK,YAAY,CAAC;AAAA,IAChD,UAAU;AAAA,MACR,wBAAwB;AAAA,MACxB,mBAAwB,CAAC,cAAc,cAAc,mBAAmB,QAAQ,SAAS,SAAS,QAAQ,UAAU;AAAA,MACpH,iBAAwB;AAAA,QACtB,UAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,eAAmB;AAAA,QACnB,eAAmB;AAAA,QACnB,KAAmB;AAAA,MACrB;AAAA,MACA,mBAAmB;AAAA,MACnB,gBAAmB;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAEA,QAAQ;AAAA,MACN,SAAgB;AAAA,MAChB,gBAAgB;AAAA;AAAA,QAEd;AAAA,UACE,MAA2B;AAAA,UAC3B,MAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,MAA2B,CAAC,eAAe,oBAAoB,oBAAoB,iBAAiB;AAAA,UACpG,KAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,wBAA2B;AAAA,UAC3B,sBAA2B;AAAA,UAC3B,2BAA2B;AAAA,UAC3B,YAA2B;AAAA,QAC7B;AAAA,QACA;AAAA,UACE,MAA2B;AAAA,UAC3B,MAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,MAA2B,CAAC,eAAe,kBAAkB;AAAA,UAC7D,KAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,wBAA2B;AAAA,UAC3B,sBAA2B;AAAA,UAC3B,2BAA2B;AAAA,UAC3B,YAA2B;AAAA,QAC7B;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,UAIE,MAA2B;AAAA,UAC3B,MAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,MAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,YAA2B;AAAA,UAC3B,2BAA2B;AAAA,UAC3B,UAA2B,CAAC,wCAAwC;AAAA,UACpE,WAA2B,CAAC,qBAAqB;AAAA,QACnD;AAAA,QACA;AAAA;AAAA;AAAA,UAGE,MAA2B;AAAA,UAC3B,MAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,KAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,YAA2B;AAAA,UAC3B,2BAA2B;AAAA,QAC7B;AAAA,QACA;AAAA;AAAA;AAAA,UAGE,MAA2B;AAAA,UAC3B,MAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,KAA2B;AAAA,UAC3B,SAA2B;AAAA,UAC3B,YAA2B;AAAA,UAC3B,2BAA2B;AAAA,QAC7B;AAAA;AAAA,QAEA,EAAE,MAAM,oBAAoB,MAAM,iBAAiB,SAAS,UAAU,SAAS,gBAAgB;AAAA,QAC/F,EAAE,MAAM,yBAAyB,MAAM,iBAAiB,SAAS,UAAU,SAAS,yBAAyB;AAAA,QAC7G,EAAE,MAAM,mBAAmB,MAAM,iBAAiB,SAAS,UAAU,SAAS,eAAe;AAAA,QAC7F,EAAE,MAAM,mBAAmB,MAAM,iBAAiB,SAAS,UAAU,SAAS,eAAe;AAAA,QAC7F,EAAE,MAAM,mBAAmB,MAAM,iBAAiB,SAAS,UAAU,SAAS,cAAc;AAAA,QAC5F,EAAE,MAAM,cAAc,MAAM,iBAAiB,SAAS,UAAU,SAAS,gBAAgB;AAAA,MAC3F;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAS;AAAA,QACP,EAAE,OAAO,aAAa,MAAM,SAAS,SAAS,iBAAiB,gBAAgB,CAAC,MAAM,EAAE;AAAA,QACxF,EAAE,OAAO,YAAY,MAAM,SAAS,SAAS,gBAAgB,gBAAgB,CAAC,EAAE;AAAA,QAChF,EAAE,OAAO,YAAY,MAAM,SAAS,SAAS,gBAAgB,gBAAgB,CAAC,EAAE;AAAA,MAClF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAMA,SAAS,cAAe,MAAgC;AACtD,QAAM,QAAoB,MAAM,KAAK,eAAe,iBAAiB,GAAG,mBAAiB;AAAA,IACvF,MAAW,oBAAoB,YAAY;AAAA,IAC3C,SAAW,UAAU,mBAAmB,YAAY,EAAE;AAAA,IACtD,WAAW;AAAA,EACb,EAAE;AAEF,MAAI,KAAK,OAAO,WAAW,KAAK,OAAO,QAAQ;AAC7C,UAAM,KAAK,EAAE,MAAM,uBAAuB,SAAS,UAAU,qBAAqB,GAAG,WAAW,aAAa,CAAC;AAAA,EAChH;AAEA,MAAI,KAAK,OAAO,YAAY,KAAK,OAAO,QAAQ;AAC9C,UAAM,KAAK,EAAE,MAAM,4BAA4B,SAAS,UAAU,yBAAyB,GAAG,WAAW,aAAa,CAAC;AAAA,EACzH;AAEA,SAAO;AACT;AAaO,SAAS,cAAe,MAAgC;AAC7D,QAAM,YAAY,CAAC,MAAc,aAA+B,EAAE,MAAM,SAAS,WAAW,aAAa;AACzG,QAAM,WAAW,CAAC,MAAc,aAA+B,EAAE,MAAM,SAAS,WAAW,WAAW;AAEtG,SAAO;AAAA,IACL,SAAS,gBAAgB,YAAY,IAAI,CAAC;AAAA,IAC1C,UAAU,WAAW,OAAO,IAAI,CAAC;AAAA,IACjC,UAAU,sBAAsB,aAAa,CAAC;AAAA,IAC9C,UAAU,sBAAsB,aAAa,CAAC;AAAA,IAC9C,UAAU,mBAAmBA,cAAa;AAAA,IAC1C,UAAU,mBAAmB,aAAa;AAAA,IAC1C,UAAU,kBAAkB,YAAY;AAAA,IACxC,UAAU,kBAAkB,YAAY;AAAA,IACxC,UAAU,qBAAqB,UAAU,mBAAmB,CAAC;AAAA,IAC7D,UAAU,gBAAgB,YAAY,CAAC;AAAA,IACvC,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA,IAC9B,UAAU,iBAAiB,YAAY;AAAA,IACvC,SAAS,cAAc,SAAS;AAAA,IAChC,UAAU,yBAAyB,mBAAmB;AAAA,IACtD,SAAS,qBAAqB,kBAAkB;AAAA,IAChD,SAAS,aAAa,OAAO,IAAI,CAAC;AAAA,IAClC,SAAS,sBAAsB,kBAAkB,IAAI,CAAC;AAAA,IACtD,UAAU,GAAG,KAAK,WAAW,mBAAmB,cAAc,IAAI,CAAC;AAAA,IACnE,GAAG,cAAc,IAAI;AAAA;AAAA,IAErB,SAAS,iBAAiB,EAAE;AAAA,IAC5B,SAAS,iBAAiB,EAAE;AAAA,EAC9B;AACF;;;ACjhBA,eAAsB,UAAW,SAAuC;AACtE,QAAM,WAAW,QAAQ,IAAI;AAE7B,MAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,WAAO,MAAM,mFAAmF;AAChG;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,QAAQ;AAClC,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM,oCAAoC;AACjD;AAAA,EACF;AAEA,QAAM,OAAqB;AAAA,IACzB,eAAe,OAAO;AAAA,IACtB,aAAe,OAAO;AAAA,IACtB,OAAe,OAAO;AAAA,IACtB,aAAe,OAAO;AAAA,IACtB,aAAe,OAAO;AAAA,IACtB,IAAe,OAAO;AAAA,IACtB,UAAe,OAAO;AAAA,EACxB;AAEA,QAAM,QAAoB,CAAC,GAAG,cAAc,IAAI,CAAC;AACjD,aAAW,WAAW,iBAAiB,UAAU,MAAM,GAAG;AACxD,UAAM,KAAK,GAAG,aAAa,QAAQ,MAAM,OAAO,CAAC;AAAA,EACnD;AAEA,QAAM,SAAS,cAAc,UAAU,OAAO,QAAQ,KAAK;AAE3D,aAAW,QAAQ,OAAO,SAAS;AACjC,WAAO,KAAK,YAAY,IAAI,EAAE;AAAA,EAChC;AACA,aAAW,QAAQ,OAAO,OAAO;AAC/B,WAAO,KAAK,YAAY,IAAI,EAAE;AAAA,EAChC;AACA,aAAW,QAAQ,OAAO,OAAO;AAC/B,WAAO,QAAQ,YAAY,IAAI,EAAE;AAAA,EACnC;AAEA,QAAM,SAAS,OAAO,QAAQ,SAAS,OAAO,MAAM;AAEpD,MAAI,WAAW,GAAG;AAChB,WAAO,QAAQ,0BAA0B,OAAO,GAAG,MAAM,6BAA6B;AACtF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,WAAO,KAAK,GAAG,MAAM,mFAAmF;AACxG;AAAA,EACF;AAEA,aAAW,UAAU,EAAE,GAAG,QAAQ,iBAAiB,iBAAiB,CAAC;AACrE,SAAO,QAAQ,YAAY,OAAO,MAAM,MAAM,sCAAsC,gBAAgB,GAAG;AACzG;;;AC3FA,IAAAC,oBAA8B;AAoD9B,eAAsB,OAAQ,SAAoC;AAChE,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,OAAO,SAAiB,UAAkB,aACpD,aAAa,MAAM,WAAW,MAAM,WAAW,SAAS,QAAQ;AAClE,QAAM,YAAY,OAAyB,SAAiB,SAA4C,UAAa,aACnH,aAAa,MAAM,WAAW,UAAM,wBAAU,EAAE,SAAS,QAAQ,CAAC;AAEpE,QAAM,cAAc,MAAM,IAAI,iBAAiB,eAAe,QAAQ,IAAI;AAC1E,QAAM,gBAAgB,OAAO,WAAW;AAExC,QAAM,KAAK,MAAM,UAAsB,eAAe;AAAA,IACpD,EAAE,MAAM,0BAA0B,OAAO,QAAQ;AAAA,IACjD,EAAE,MAAM,kBAAkB,OAAO,SAAS;AAAA,IAC1C,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,EAChC,GAAG,SAAS,QAAQ,EAAE;AAEtB,QAAM,WAAW,MAAM,gBAAgB,IAAI,SAAS,KAAK,SAAS;AAElE,QAAM,eAAe,SAAS,SAAS,oBAAoB,IAAI,SAAS,KAAK,KAAK;AAClF,QAAM,aAAa,MAAM,IAAI,aAAa,cAAc,QAAQ,KAAK;AACrE,QAAM,QAAQ,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,UAAU;AACtE,QAAM,cAAc,MAAM,IAAI,sBAAsB,cAAc,QAAQ,IAAI;AAE9E,QAAM,sBAAkB,2BAAQ,QAAQ,IAAI,GAAG,aAAa;AAC5D,UAAI,gCAAW,wBAAK,iBAAiB,cAAc,CAAC,KAAK,CAAC,KAAK;AAC7D,UAAM,YAAY,UAAM,yBAAQ,EAAE,SAAS,GAAG,eAAe,8EAA8E,SAAS,MAAM,CAAC;AAC3J,QAAI,CAAC,WAAW;AACd,aAAO,KAAK,UAAU;AACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,SAAO,KAAK,wBAAwB,eAAe,EAAE;AACrD,cAAY,WAAW,iBAAiB,cAAc,IAAI,CAAC,CAAC;AAC5D,aAAW,iBAAiB,eAAe,IAAI,CAAC;AAEhD,QAAM,UAAU,MAAM,kBAAkB,QAAQ,KAAK,GAAG;AACxD,MAAI,SAAS;AACX,oBAAgB,iBAAiB,gBAAgB,SAAS,eAAe,IAAI,CAAC;AAAA,EAChF;AAEA,SAAO,QAAQ,mBAAmB;AAClC,SAAO,KAAK,QAAQ,aAAa,EAAE;AACnC,SAAO,KAAK,eAAe;AAC3B,SAAO,KAAK,WAAW,WAAW,kBAAkB;AACtD;AAMA,eAAe,gBAAiB,IAAgB,SAAqB,KAAc,WAA+C;AAChI,QAAM,eAAuC,OAAO,WAAW,oBAAoB;AACnF,QAAM,OAAO,MAAM,UAAkC,oBAAoB;AAAA,IACvE,EAAE,MAAM,mBAAmB,OAAO,kBAAkB;AAAA,IACpD,EAAE,MAAM,mBAAmB,OAAO,kBAAkB;AAAA,IACpD,EAAE,MAAM,cAAc,OAAO,MAAM;AAAA,EACrC,GAAG,cAAc,QAAQ,QAAQ;AAEjC,MAAI,SAAS,mBAAmB;AAC9B,UAAM,eAAe,MAAM,IAAI,6BAA6B,UAAU,QAAQ,YAAY;AAC1F,UAAM,UAAU,MAAM,IAAI,wBAAwB,cAAc,QAAQ,OAAO;AAC/E,UAAM,gBAAgB,MAAM,IAAI,wBAAwB,QAAQ,QAAQ,IAAI;AAC5E,WAAO,EAAE,MAAM,cAAc,SAAS,cAAc;AAAA,EACtD;AAEA,MAAI,SAAS,mBAAmB;AAC9B,UAAM,QAAQ,MAAM,IAAI,8BAA8B,UAAU,QAAQ,KAAK;AAC7E,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,SAAO,EAAE,MAAM,MAAM;AACvB;AAGA,eAAe,kBAAmB,UAA8B,sBAA4D;AAC1H,MAAI,aAAa,QAAW;AAC1B,WAAO,aAAa,KAAK,SAAY,OAAO,QAAQ;AAAA,EACtD;AACA,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,UAAM,yBAAQ,EAAE,SAAS,wCAAwC,SAAS,KAAK,CAAC;AAC/F,SAAO,SAAS,OAAO,MAAM,WAAW,gBAAgB,SAAS,CAAC,IAAI;AACxE;;;ACpIA,eAAsB,YAA4B;AAChD,QAAM,UAAU,EAAE,OAAO,KAAK,CAAC;AACjC;;;ACjBA,gCAA0B;AAoBnB,SAAS,SAAU,SAAiB,YAAsB,KAAqB;AACpF,QAAM,OAAO,CAAC,SAAS,GAAG,UAAU,EAAE,KAAK,GAAG;AAC9C,QAAM,aAAS,qCAAU,MAAM,EAAE,OAAO,WAAW,OAAO,MAAM,IAAI,CAAC;AACrE,SAAO,OAAO,UAAU;AAC1B;;;ACMA,eAAsB,YAAa,SAAyC;AAC1E,QAAM,WAAW,QAAQ,IAAI;AAE7B,MAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,WAAO,MAAM,qFAAqF;AAClG;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,MAAM,QAAQ,MAAM,aAAa,YAAY,MAAM,QAAQ,QAAQ,OAAO;AAE9F,SAAO,KAAK,gBAAgB,WAAW,KAAK,GAAG,CAAC,EAAE;AAClD,QAAM,SAAS,SAAS,OAAO,YAAY,QAAQ;AAEnD,MAAI,WAAW,GAAG;AAChB,WAAO,QAAQ,oBAAoB;AACnC;AAAA,EACF;AAEA,SAAO,MAAM,2BAA2B,MAAM,IAAI;AAClD,UAAQ,WAAW;AACrB;;;A5BtCA,SAAS,cAAuB;AAC9B,MAAI;AACF,UAAM,WAAW,KAAK,UAAM,kCAAa,wBAAK,WAAW,MAAM,cAAc,GAAG,MAAM,CAAC;AACvF,WAAO,SAAS,WAAW;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,cAAc,EACnB,YAAY,sEAAiE,EAC7E,QAAQ,YAAY,CAAC;AAExB,QACG,QAAQ,KAAK,EACb,MAAM,QAAQ,EACd,SAAS,UAAU,eAAe,EAClC,OAAO,aAAa,sDAAsD,EAC1E,OAAO,mBAAmB,uBAAuB,EACjD,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,qBAAqB,mDAAmD,EAC/E,OAAO,mBAAmB,+CAA+C,EACzE,OAAO,eAAe,2BAA2B,EACjD,OAAO,uBAAuB,sBAAsB,EACpD,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,gBAAgB,sDAAsD,EAC7E,YAAY,4CAA4C,EACxD,OAAO,OAAO,MAA0B,YAWnC;AACJ,QAAM,OAAO;AAAA,IACX;AAAA,IACA,KAAc,QAAQ;AAAA,IACtB,OAAc,QAAQ;AAAA,IACtB,IAAc,QAAQ;AAAA,IACtB,UAAc,QAAQ;AAAA,IACtB,OAAc,QAAQ;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,SAAc,QAAQ;AAAA,IACtB,MAAc,QAAQ;AAAA,IACtB,MAAc,QAAQ;AAAA,IACtB,KAAc,QAAQ;AAAA,EACxB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,MAAM,SAAS,EACf,SAAS,UAAU,sEAAsE,EACzF,SAAS,UAAU,cAAc,EACjC,YAAY,2CAA2C,EACvD,OAAO,OAAO,MAAe,SAAkB;AAC9C,QAAM,OAAO,EAAE,MAAM,KAAK,CAAC;AAC7B,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,QAAQ,CAAC,OAAO,OAAO,CAAC,EACxB,OAAO,SAAS,uCAAuC,EACvD,YAAY,+DAA+D,EAC3E,OAAO,OAAO,YAA+B;AAC5C,QAAM,UAAU,EAAE,OAAO,QAAQ,OAAO,MAAM,CAAC;AACjD,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,MAAM,QAAQ,EACd,YAAY,uEAAuE,EACnF,OAAO,YAAY;AAClB,QAAM,UAAU;AAClB,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,MAAM,QAAQ,EACd,OAAO,SAAS,0DAA0D,EAC1E,YAAY,gEAAgE,EAC5E,OAAO,OAAO,YAA+B;AAC5C,QAAM,YAAY,EAAE,KAAK,QAAQ,OAAO,MAAM,CAAC;AACjD,CAAC;AAGH,eAAe,OAAuB;AACpC,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,OAAO;AACd,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,KAAK;","names":["import_node_fs","import_node_path","import_node_path","import_node_fs","import_prompts","value","input","import_node_path","import_node_path","import_node_fs","import_node_path","appPackageJson","appProjectJson","appTsconfig","appTypedoc","greetingTs","greetingTestTs","indexTs","appPackageJson","appProjectJson","appTsconfig","appTypedoc","greetingTs","greetingTestTs","envFile","appPackageJson","appProjectJson","appTsconfig","appTsconfigApp","appTypedoc","indexTs","greeterTs","greeterTestTs","packageJson","appPackageJson","appProjectJson","appTsconfig","indexHtml","envFile","import_node_fs","import_node_path","projectJson","packageJson","import_node_path","jestConfigMjs","import_node_path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/engine/config.ts","../src/engine/constants.ts","../src/engine/fsx.ts","../src/util/logger.ts","../src/util/prompts.ts","../src/util/strings.ts","../src/engine/apply.ts","../src/engine/rootPackage.ts","../src/templates/frontendApp.ts","../src/engine/assets.ts","../src/templates/functionApp.ts","../src/templates/internalLib.ts","../src/templates/nextApp.ts","../src/templates/nodeApp.ts","../src/engine/registry.ts","../src/templates/publishableLib.ts","../src/templates/reactApp.ts","../src/generators/scaffold.ts","../src/generators/addProject.ts","../src/engine/projects.ts","../src/engine/sync.ts","../package.json","../src/templates/monorepo.ts","../src/commands/doctor.ts","../src/generators/createMonorepo.ts","../src/commands/update.ts","../src/util/exec.ts","../src/commands/validate.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { Command } from 'commander'\r\nimport { runAdd } from './commands/add'\r\nimport { runDoctor } from './commands/doctor'\r\nimport { runNew } from './commands/new'\r\nimport { runUpdate } from './commands/update'\r\nimport { runValidate } from './commands/validate'\r\nimport { logger } from './util/logger'\r\nimport type { CiProvider, RegistryConfig } from './engine/types'\r\n\r\n/** Reads the CLI version from the packaged package.json (next to dist/). */\r\nfunction readVersion (): string {\r\n try {\r\n const package_ = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')) as { version?: string }\r\n return package_.version ?? '0.0.0'\r\n } catch {\r\n return '0.0.0'\r\n }\r\n}\r\n\r\nconst program = new Command()\r\n\r\nprogram\r\n .name('monecromanci')\r\n .description('MoNecromanCI — summon, conjure, raise and validate NX monorepos')\r\n .version(readVersion())\r\n\r\nprogram\r\n .command('new')\r\n .alias('summon')\r\n .argument('[name]', 'monorepo name')\r\n .option('-y, --yes', 'non-interactive: accept provided values and defaults')\r\n .option('--scope <scope>', 'npm scope, e.g. @auto')\r\n .option('--ci <provider>', 'CI provider: azure | github | both')\r\n .option('--registry <kind>', 'registry: azure-artifacts | github-packages | npm')\r\n .option('--owner <owner>', 'GitHub owner for the github-packages registry')\r\n .option('--org <org>', 'Azure DevOps organization')\r\n .option('--project <project>', 'Azure DevOps project')\r\n .option('--feed <feed>', 'Azure Artifacts feed')\r\n .option('--base <branch>', 'default git branch')\r\n .option('--lib <name>', 'initial internal library name (empty string to skip)')\r\n .description('Scaffold a brand-new canonical NX monorepo')\r\n .action(async (name: string | undefined, options: {\r\n yes?: boolean\r\n scope?: string\r\n ci?: string\r\n registry?: string\r\n owner?: string\r\n org?: string\r\n project?: string\r\n feed?: string\r\n base?: string\r\n lib?: string\r\n }) => {\r\n await runNew({\r\n name,\r\n yes: options.yes,\r\n scope: options.scope,\r\n ci: options.ci as CiProvider | undefined,\r\n registry: options.registry as RegistryConfig['kind'] | undefined,\r\n owner: options.owner,\r\n organization: options.org,\r\n project: options.project,\r\n feed: options.feed,\r\n base: options.base,\r\n lib: options.lib,\r\n })\r\n })\r\n\r\nprogram\r\n .command('add')\r\n .alias('conjure')\r\n .argument('[type]', 'function-app | react-app | internal-lib | publishable-lib | cli-tool')\r\n .argument('[name]', 'project name')\r\n .description('Add a new project to the current monorepo')\r\n .action(async (type?: string, name?: string) => {\r\n await runAdd({ type, name })\r\n })\r\n\r\nprogram\r\n .command('doctor')\r\n .aliases(['fix', 'raise'])\r\n .option('--fix', 'apply fixes instead of only reporting')\r\n .description('Detect and repair configuration drift in the current monorepo')\r\n .action(async (options: { fix?: boolean }) => {\r\n await runDoctor({ apply: options.fix ?? false })\r\n })\r\n\r\nprogram\r\n .command('update')\r\n .alias('ascend')\r\n .description('Re-sync tool-owned files to the latest templates and apply migrations')\r\n .action(async () => {\r\n await runUpdate()\r\n })\r\n\r\nprogram\r\n .command('validate')\r\n .alias('ritual')\r\n .option('--all', 'run every project (nx run-many) instead of only affected')\r\n .description('Run lint/test/build locally (nx affected) before pushing to CI')\r\n .action(async (options: { all?: boolean }) => {\r\n await runValidate({ all: options.all ?? false })\r\n })\r\n\r\n/** Runs the CLI, reporting uncaught command errors instead of letting them crash the process. */\r\nasync function main (): Promise<void> {\r\n try {\r\n await program.parseAsync(process.argv)\r\n } catch (error) {\r\n logger.error(error instanceof Error ? error.message : String(error))\r\n process.exitCode = 1\r\n }\r\n}\r\n\r\nmain()\r\n","import { join } from 'node:path'\r\nimport { STAMP_FILE, TEMPLATE_VERSION } from './constants'\r\nimport { fileExists, readJsonSafe, toJson, writeFileEnsured } from './fsx'\r\nimport type { CiProvider, MonorepoVars, MonecromanciConfig, RegistryConfig } from './types'\r\n\r\n/** The raw on-disk stamp shape, where v1 fields may be missing pre-migration. */\r\ntype RawConfig = Omit<MonecromanciConfig, 'ci' | 'registry'> & { ci?: CiProvider, registry?: RegistryConfig }\r\n\r\n/**\r\n * Absolute path to a repo's `.monecromanci.json` stamp.\r\n *\r\n * @remarks\r\n * Pure path join; does not check whether the file exists.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @returns The absolute path to the stamp file.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function stampPath (repoRoot: string): string {\r\n return join(repoRoot, STAMP_FILE)\r\n}\r\n\r\n/**\r\n * Returns whether the given directory looks like a MoNecromanCI monorepo.\r\n *\r\n * @remarks\r\n * Checks only for the presence of the `.monecromanci.json` stamp file.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @returns `true` when the stamp file exists.\r\n * @throws Never - delegates to {@link fileExists}, which does not throw.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function isManagedRepo (repoRoot: string): boolean {\r\n return fileExists(stampPath(repoRoot))\r\n}\r\n\r\n/** Upgrades a legacy v1 stamp (Azure-only `azure` field) to the `ci`/`registry` shape. */\r\nfunction migrateConfig (raw: RawConfig): MonecromanciConfig {\r\n const registry: RegistryConfig = raw.registry\r\n ?? (raw.azure ? { kind: 'azure-artifacts', ...raw.azure } : { kind: 'npm' })\r\n\r\n return { ...raw, ci: raw.ci ?? 'azure', registry }\r\n}\r\n\r\n/**\r\n * Loads the `.monecromanci.json` stamp, or `undefined` when absent/invalid.\r\n *\r\n * @remarks\r\n * Returns early when {@link isManagedRepo} reports no stamp file. Legacy v1\r\n * stamps are migrated to the current `ci`/`registry` shape via `migrateConfig`.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @returns The parsed (and migrated) stamp, or `undefined` when missing/invalid.\r\n * @throws Never - delegates to {@link readJsonSafe}, which swallows parse errors.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function loadConfig (repoRoot: string): MonecromanciConfig | undefined {\r\n if (!isManagedRepo(repoRoot)) {\r\n return undefined\r\n }\r\n\r\n const raw = readJsonSafe<RawConfig | undefined>(stampPath(repoRoot), undefined)\r\n return raw ? migrateConfig(raw) : undefined\r\n}\r\n\r\n/**\r\n * Writes the `.monecromanci.json` stamp for a repo.\r\n *\r\n * @remarks\r\n * Overwrites any existing stamp file.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @param config - The stamp contents to persist.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * while writing the file.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function saveConfig (repoRoot: string, config: MonecromanciConfig): void {\r\n writeFileEnsured(stampPath(repoRoot), toJson(config))\r\n}\r\n\r\n/**\r\n * Builds the stamp contents from the monorepo template inputs.\r\n *\r\n * @remarks\r\n * Pure data transform; performs no I/O.\r\n *\r\n * @param vars - The monorepo template inputs.\r\n * @returns The stamp contents to be persisted via {@link saveConfig}.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function configFromVars (vars: MonorepoVars): MonecromanciConfig {\r\n return {\r\n templateVersion: TEMPLATE_VERSION,\r\n workspaceName: vars.workspaceName,\r\n displayName: vars.displayName,\r\n scope: vars.scope,\r\n defaultBase: vars.defaultBase,\r\n nodeVersion: vars.nodeVersion,\r\n ci: vars.ci,\r\n registry: vars.registry,\r\n }\r\n}\r\n","/**\r\n * Version stamp written into `.monecromanci.json`; bump when templates change.\r\n *\r\n * @remarks\r\n * `doctor`/`update` compare this against the stamp on disk to know whether a\r\n * repo's tool-owned files need re-syncing.\r\n */\r\nexport const TEMPLATE_VERSION = '0.2.0'\r\n\r\n/**\r\n * Name of the per-repo manifest that records how a repo was generated.\r\n *\r\n * @remarks\r\n * Lives at the repo root, alongside `package.json`.\r\n */\r\nexport const STAMP_FILE = '.monecromanci.json'\r\n\r\n/**\r\n * Default Node major version targeted by generated monorepos.\r\n *\r\n * @remarks\r\n * Used as the fallback when `monecromanci new` runs non-interactively.\r\n */\r\nexport const DEFAULT_NODE_VERSION = '24'\r\n\r\n/**\r\n * Default git base branch used by Nx affected detection.\r\n *\r\n * @remarks\r\n * Used as the fallback when `monecromanci new` runs non-interactively.\r\n */\r\nexport const DEFAULT_BASE = 'main'\r\n\r\n/**\r\n * Canonical NX project tags used to classify projects in CI.\r\n *\r\n * @remarks\r\n * Read back by {@link discoverProjects} to infer a project's {@link ProjectKind}\r\n * from its `project.json` tags.\r\n */\r\nexport const TAGS = {\r\n functionApp: 'type:function-app',\r\n nodeApp: 'type:node-app',\r\n reactApp: 'type:react-app',\r\n vueApp: 'type:vue-app',\r\n svelteApp: 'type:svelte-app',\r\n nextjsApp: 'type:nextjs-app',\r\n publishableLib: 'type:publishable-lib',\r\n internalLib: 'type:internal-lib',\r\n ignore: 'ci:ignore',\r\n} as const\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport { dirname } from 'node:path'\r\n\r\n/**\r\n * Creates a directory (and parents) if it does not already exist.\r\n *\r\n * @remarks\r\n * No-op when the directory is already present.\r\n *\r\n * @param directory - Absolute path to ensure exists.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * by the underlying `mkdirSync` call.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function ensureDirectory (directory: string): void {\r\n if (!existsSync(directory)) {\r\n mkdirSync(directory, { recursive: true })\r\n }\r\n}\r\n\r\n/**\r\n * Writes a UTF-8 file, creating parent directories as needed.\r\n *\r\n * @remarks\r\n * Delegates directory creation to {@link ensureDirectory}.\r\n *\r\n * @param filePath - Absolute path of the file to write.\r\n * @param content - UTF-8 text content to write.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * by the underlying write.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function writeFileEnsured (filePath: string, content: string): void {\r\n ensureDirectory(dirname(filePath))\r\n writeFileSync(filePath, content, 'utf8')\r\n}\r\n\r\n/**\r\n * Reads and parses a JSON file as `T`.\r\n *\r\n * @remarks\r\n * Overload: returns `undefined` when the file is missing or invalid (no\r\n * fallback supplied).\r\n *\r\n * @param filePath - Absolute path to the JSON file.\r\n * @param fallback - Not provided in this overload.\r\n * @returns The parsed value, or `undefined` on any error.\r\n * @throws Never - read and parse errors are caught and `undefined` returned.\r\n * @typeParam T - The shape of the expected parsed value.\r\n */\r\nexport function readJsonSafe<T> (filePath: string): T | undefined\r\n/**\r\n * Reads and parses a JSON file as `T`, falling back to `fallback` on any error.\r\n *\r\n * @remarks\r\n * Overload: always returns a value of type `T`.\r\n *\r\n * @param filePath - Absolute path to the JSON file.\r\n * @param fallback - Value returned when the file is missing or invalid.\r\n * @returns The parsed value, or `fallback` on any error.\r\n * @throws Never - read and parse errors are caught and `fallback` returned.\r\n * @typeParam T - The shape of the expected parsed value.\r\n */\r\nexport function readJsonSafe<T> (filePath: string, fallback: T): T\r\n/**\r\n * Implementation for the {@link readJsonSafe} overloads above.\r\n *\r\n * @remarks\r\n * Catches all read/parse errors and returns `fallback` (or `undefined`).\r\n *\r\n * @param filePath - Absolute path to the JSON file.\r\n * @param fallback - Value returned when the file is missing or invalid.\r\n * @returns The parsed value, or `fallback`/`undefined` on any error.\r\n * @throws Never - read and parse errors are caught and replaced by `fallback`.\r\n * @typeParam T - The shape of the expected parsed value.\r\n */\r\nexport function readJsonSafe<T> (filePath: string, fallback?: T): T | undefined {\r\n try {\r\n return JSON.parse(readFileSync(filePath, 'utf8')) as T\r\n } catch {\r\n return fallback\r\n }\r\n}\r\n\r\n/**\r\n * Returns the trimmed text content of a file, or an empty string.\r\n *\r\n * @remarks\r\n * Swallows all read errors (e.g. file not found) and returns `''` instead.\r\n *\r\n * @param filePath - Absolute path to the file to read.\r\n * @returns The file's UTF-8 content, or `''` on any error.\r\n * @throws Never - read errors are caught and an empty string returned.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function readTextSafe (filePath: string): string {\r\n try {\r\n return readFileSync(filePath, 'utf8')\r\n } catch {\r\n return ''\r\n }\r\n}\r\n\r\n/**\r\n * Serialises a value as pretty-printed JSON with a trailing newline.\r\n *\r\n * @remarks\r\n * Uses a 2-space indent to match the project's formatting conventions.\r\n *\r\n * @param value - The value to serialise.\r\n * @returns The JSON string, terminated with `\\n`.\r\n * @throws Propagates any error `JSON.stringify` raises (e.g. circular references).\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function toJson (value: unknown): string {\r\n return `${JSON.stringify(value, undefined, 2)}\\n`\r\n}\r\n\r\nexport { existsSync as fileExists } from 'node:fs'\r\n","/**\r\n * Minimal namespaced console logger used across the CLI.\r\n *\r\n * @remarks\r\n * Each method prefixes `message` with a small glyph to distinguish severity\r\n * when scanning terminal output.\r\n */\r\nexport const logger = {\r\n info (message: string): void {\r\n console.log(message)\r\n },\r\n step (message: string): void {\r\n console.log(`→ ${message}`)\r\n },\r\n success (message: string): void {\r\n console.log(`✓ ${message}`)\r\n },\r\n warn (message: string): void {\r\n console.warn(`! ${message}`)\r\n },\r\n error (message: string): void {\r\n console.error(`✗ ${message}`)\r\n },\r\n}\r\n","import { input } from '@inquirer/prompts'\r\n\r\n/**\r\n * Prompts for a non-empty trimmed string with an optional default.\r\n *\r\n * @remarks\r\n * Wraps `@inquirer/prompts`'s `input`, enforcing a non-empty result.\r\n *\r\n * @param message - The prompt message to display.\r\n * @param fallback - Optional default value pre-filled in the prompt.\r\n * @returns The trimmed, non-empty string the user entered.\r\n * @throws Propagates any error `@inquirer/prompts`'s `input` raises (e.g. when\r\n * stdin is not a TTY).\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function promptText (message: string, fallback?: string): Promise<string> {\r\n const value = await input({\r\n message,\r\n default: fallback,\r\n validate: (value: string) => value.trim().length > 0 || 'A value is required',\r\n })\r\n return value.trim()\r\n}\r\n\r\nexport { checkbox, select, confirm, input } from '@inquirer/prompts'\r\n","/**\r\n * Converts an arbitrary workspace or project name into a safe kebab-case slug\r\n * (lower-case, single dashes, no leading/trailing separators). Splits\r\n * camelCase/PascalCase boundaries so `QuotesManager` becomes `quotes-manager`.\r\n *\r\n * @remarks\r\n * Pure string transform; performs no I/O.\r\n *\r\n * @param input - The raw name to slugify.\r\n * @returns The kebab-case slug.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function toSlug (input: string): string {\r\n return input\r\n .trim()\r\n .replaceAll(/([a-z0-9])([A-Z])/g, '$1-$2')\r\n .replaceAll(/[^a-zA-Z0-9]+/g, '-')\r\n .replaceAll(/^-+|-+$/g, '')\r\n .toLowerCase()\r\n}\r\n\r\n/**\r\n * Sanitises a name into an UPPER_SNAKE token usable as an Azure pipeline\r\n * variable suffix (mirrors `sanitizeVariableToken` in the build templates).\r\n *\r\n * @remarks\r\n * Pure string transform; performs no I/O.\r\n *\r\n * @param input - The raw name to sanitise.\r\n * @returns The UPPER_SNAKE token.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function toVariableToken (input: string): string {\r\n return input\r\n .trim()\r\n .replaceAll(/[^A-Za-z0-9]+/g, '_')\r\n .replaceAll(/^_+|_+$/g, '')\r\n .toUpperCase()\r\n}\r\n","import { join } from 'node:path'\r\nimport { fileExists, writeFileEnsured } from './fsx'\r\nimport { logger } from '../util/logger'\r\nimport type { FileSpec } from './types'\r\n\r\n/**\r\n * Outcome of writing a batch of {@link FileSpec}s to disk.\r\n *\r\n * @remarks\r\n * Returned by {@link applyFiles} and consumed by {@link reportApply}.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface ApplyResult {\r\n created: string[]\r\n overwritten: string[]\r\n skipped: string[]\r\n}\r\n\r\n/**\r\n * Writes a set of {@link FileSpec}s into `repoRoot`.\r\n *\r\n * @remarks\r\n * `tool-owned` files are always written; `scaffold` files are only written when\r\n * they do not yet exist, so user edits are preserved on re-runs.\r\n *\r\n * @param repoRoot - Absolute path to the target repo root.\r\n * @param files - The file specs to write.\r\n * @returns Which paths were created, overwritten, or skipped.\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * while writing a file.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function applyFiles (repoRoot: string, files: FileSpec[]): ApplyResult {\r\n const result: ApplyResult = { created: [], overwritten: [], skipped: [] }\r\n\r\n for (const file of files) {\r\n const absolute = join(repoRoot, file.path)\r\n const exists = fileExists(absolute)\r\n\r\n if (file.ownership === 'scaffold' && exists) {\r\n result.skipped.push(file.path)\r\n continue\r\n }\r\n\r\n writeFileEnsured(absolute, file.content)\r\n if (exists) {\r\n result.overwritten.push(file.path)\r\n } else {\r\n result.created.push(file.path)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Logs a concise summary of an {@link ApplyResult}.\r\n *\r\n * @remarks\r\n * Purely a logging side effect; does not touch the filesystem.\r\n *\r\n * @param result - The result to summarise.\r\n * @returns Nothing.\r\n * @throws Never - only writes to the logger.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function reportApply (result: ApplyResult): void {\r\n for (const path of result.created) {\r\n logger.success(`created ${path}`)\r\n }\r\n for (const path of result.overwritten) {\r\n logger.step(`updated ${path}`)\r\n }\r\n for (const path of result.skipped) {\r\n logger.info(` kept ${path} (already exists)`)\r\n }\r\n}\r\n","import { join } from 'node:path'\r\nimport { readJsonSafe, toJson, writeFileEnsured } from './fsx'\r\n\r\ntype DependencySection = 'dependencies' | 'devDependencies'\r\n\r\n/**\r\n * Merges entries into a section of the monorepo ROOT package.json (where all\r\n * deps live). Only adds names not already present, then sorts the section.\r\n *\r\n * @remarks\r\n * Existing versions for already-present names are left untouched.\r\n *\r\n * @param repoRoot - Absolute path to the monorepo root.\r\n * @param dependencies - Name-to-version-range entries to merge in.\r\n * @param section - Which `package.json` section to merge into.\r\n * @returns The names that were newly added (already-present names are skipped).\r\n * @throws Propagates any Node.js `fs` error (e.g. permission denied) raised\r\n * while writing `package.json`.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function addRootDependencies (\r\n repoRoot: string,\r\n dependencies: Record<string, string>,\r\n section: DependencySection = 'dependencies',\r\n): string[] {\r\n const manifestPath = join(repoRoot, 'package.json')\r\n const manifest = readJsonSafe<Record<string, unknown>>(manifestPath, {})\r\n const existing = (manifest[section] as Record<string, string> | undefined) ?? {}\r\n const added: string[] = []\r\n\r\n for (const [name, version] of Object.entries(dependencies)) {\r\n if (Object.hasOwn(existing, name)) {\r\n continue\r\n }\r\n\r\n existing[name] = version\r\n added.push(name)\r\n }\r\n\r\n manifest[section] = Object.fromEntries(\r\n Object.entries(existing).toSorted(([left], [right]) => left.localeCompare(right)),\r\n )\r\n writeFileEnsured(manifestPath, toJson(manifest))\r\n\r\n return added\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\n/** Per-framework specifics layered onto the shared Vite frontend template. */\r\ninterface FrontendFramework {\r\n tag: string\r\n /** DOM id the app mounts into. */\r\n mountId: string\r\n /** Vite plugin import line and call expression. */\r\n vitePluginImport: string\r\n vitePluginCall: string\r\n /** Sample single-file-component path + content. */\r\n componentPath: string\r\n componentContent: string\r\n /** `src/main.ts` content. */\r\n mainContent: string\r\n /** `src/vite-env.d.ts` content (client types + a module shim). */\r\n envContent: string\r\n}\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n 'build:dev': 'vite build --mode dev --outDir dist-dev',\r\n 'build:uat': 'vite build --mode uat --outDir dist-uat',\r\n 'build:prod': 'vite build --mode prod --outDir dist-prod',\r\n 'build:all': 'npm run build:dev && npm run build:uat && npm run build:prod',\r\n build: 'npm run build:dev',\r\n preview: 'vite preview',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars, framework: FrontendFramework): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [framework.tag],\r\n targets: {\r\n build: {\r\n executor: 'nx:run-commands',\r\n outputs: ['{projectRoot}/dist-dev', '{projectRoot}/dist-uat', '{projectRoot}/dist-prod'],\r\n options: { command: `npm run build -w ${vars.packageName}` },\r\n },\r\n serve: run('dev'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n lib: ['es2022', 'DOM', 'DOM.Iterable'],\r\n module: 'esnext',\r\n moduleResolution: 'bundler',\r\n types: ['vite/client', 'node'],\r\n noEmit: true,\r\n sourceMap: true,\r\n allowSyntheticDefaultImports: true,\r\n esModuleInterop: true,\r\n },\r\n include: ['src', 'vite.config.ts'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction viteConfig (framework: FrontendFramework): string {\r\n return `${framework.vitePluginImport}\r\nimport { defineConfig } from 'vite'\r\n\r\nexport default defineConfig({ plugins: [${framework.vitePluginCall}], server: { port: 5173 }, build: { sourcemap: true } })\r\n`\r\n}\r\n\r\nfunction indexHtml (vars: ProjectVars, framework: FrontendFramework): string {\r\n return `<!doctype html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${vars.name}</title>\r\n </head>\r\n <body>\r\n <div id=\"${framework.mountId}\"></div>\r\n <script type=\"module\" src=\"/src/main.ts\"></script>\r\n </body>\r\n</html>\r\n`\r\n}\r\n\r\nconst greetingTs = `/**\r\n * Returns the greeting rendered by the app.\r\n *\r\n * @remarks Shared TS logic — unit-tested directly so no SFC test transform is needed.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n return 'Hello from ' + name + '!'\r\n}\r\n`\r\n\r\nconst greetingTestTs = `import { greet } from './greeting'\r\n\r\ndescribe('greet', () => {\r\n it('greets the given name', () => {\r\n expect(greet('world')).toBe('Hello from world!')\r\n })\r\n})\r\n`\r\n\r\nfunction envFile (environment: string): string {\r\n return `VITE_ENVIRONMENT=${environment}\\nVITE_API_URL=https://${environment}.example.com\\n`\r\n}\r\n\r\nconst VUE: FrontendFramework = {\r\n tag: TAGS.vueApp,\r\n mountId: 'app',\r\n vitePluginImport: 'import vue from \\'@vitejs/plugin-vue\\'',\r\n vitePluginCall: 'vue()',\r\n componentPath: 'src/App.vue',\r\n componentContent: `<script setup lang=\"ts\">\r\nimport { greet } from './greeting'\r\n\r\nconst message = greet('Vue')\r\n</script>\r\n\r\n<template>\r\n <main>\r\n <h1>{{ message }}</h1>\r\n </main>\r\n</template>\r\n`,\r\n mainContent: `import { createApp } from 'vue'\r\nimport App from './App.vue'\r\n\r\ncreateApp(App).mount('#app')\r\n`,\r\n envContent: `/// <reference types=\"vite/client\" />\r\n\r\ndeclare module '*.vue' {\r\n import type { DefineComponent } from 'vue'\r\n\r\n const component: DefineComponent\r\n export default component\r\n}\r\n`,\r\n}\r\n\r\nconst SVELTE: FrontendFramework = {\r\n tag: TAGS.svelteApp,\r\n mountId: 'app',\r\n vitePluginImport: 'import { svelte } from \\'@sveltejs/vite-plugin-svelte\\'',\r\n vitePluginCall: 'svelte()',\r\n componentPath: 'src/App.svelte',\r\n componentContent: `<script lang=\"ts\">\r\n import { greet } from './greeting'\r\n\r\n const message = greet('Svelte')\r\n</script>\r\n\r\n<main>\r\n <h1>{ message }</h1>\r\n</main>\r\n`,\r\n mainContent: `import { mount } from 'svelte'\r\nimport App from './App.svelte'\r\n\r\nmount(App, { target: document.querySelector('#app')! })\r\n`,\r\n envContent: `/// <reference types=\"vite/client\" />\r\n\r\ndeclare module '*.svelte' {\r\n import type { Component } from 'svelte'\r\n\r\n const component: Component\r\n export default component\r\n}\r\n`,\r\n}\r\n\r\nfunction frontendAppFiles (vars: ProjectVars, framework: FrontendFramework): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars, framework), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('vite.config.ts', viteConfig(framework), 'scaffold'),\r\n file('index.html', indexHtml(vars, framework), 'scaffold'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('.env.dev', envFile('dev'), 'scaffold'),\r\n file('.env.uat', envFile('uat'), 'scaffold'),\r\n file('.env.prod', envFile('prod'), 'scaffold'),\r\n file('src/vite-env.d.ts', framework.envContent, 'scaffold'),\r\n file('src/main.ts', framework.mainContent, 'scaffold'),\r\n file(framework.componentPath, framework.componentContent, 'scaffold'),\r\n file('src/greeting.ts', greetingTs, 'scaffold'),\r\n file('src/greeting.test.ts', greetingTestTs, 'scaffold'),\r\n ]\r\n}\r\n\r\n/**\r\n * Files for a Vue (Vite) app at `apps/<name>` with dev/uat/prod builds.\r\n *\r\n * @remarks\r\n * The `.vue` SFC is built by Vite (and not linted); jest covers the shared TS\r\n * helper so no SFC test transform is required.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Vue app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function vueAppFiles (vars: ProjectVars): FileSpec[] {\r\n return frontendAppFiles(vars, VUE)\r\n}\r\n\r\n/**\r\n * Files for a Svelte (Vite) app at `apps/<name>` with dev/uat/prod builds.\r\n *\r\n * @remarks\r\n * The `.svelte` SFC is built by Vite (and not linted); jest covers the shared TS\r\n * helper so no SFC test transform is required.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Svelte app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function svelteAppFiles (vars: ProjectVars): FileSpec[] {\r\n return frontendAppFiles(vars, SVELTE)\r\n}\r\n","import { existsSync, readdirSync, readFileSync } from 'node:fs'\r\nimport { dirname, join, relative, sep } from 'node:path'\r\n\r\n/**\r\n * Resolves the bundled `assets/` directory. Works both from `dist/` (after\r\n * build, where assets sit beside the bundle) and from `src/` during tests by\r\n * walking up until an `assets` directory is found.\r\n *\r\n * Memoized in a closure (rather than a top-level variable) so the result\r\n * survives across calls without exposing mutable module-level state.\r\n *\r\n * @remarks\r\n * Throws if no `assets` directory is found within 8 levels up from this\r\n * module's directory.\r\n */\r\nexport const assetsRoot = (() => {\r\n let cachedRoot: string | undefined\r\n\r\n return (): string => {\r\n if (cachedRoot) {\r\n return cachedRoot\r\n }\r\n\r\n let directory = __dirname\r\n for (let level = 0; level < 8; level++) {\r\n const candidate = join(directory, 'assets')\r\n if (existsSync(candidate)) {\r\n cachedRoot = candidate\r\n return candidate\r\n }\r\n\r\n const parent = dirname(directory)\r\n if (parent === directory) {\r\n break\r\n }\r\n directory = parent\r\n }\r\n\r\n throw new Error('MoNecromanCI assets directory not found')\r\n }\r\n})()\r\n\r\n/**\r\n * Reads a bundled asset file as UTF-8 text.\r\n *\r\n * @remarks\r\n * Resolves `relativePath` against {@link assetsRoot}.\r\n *\r\n * @param relativePath - Path relative to the assets root.\r\n * @returns The file's UTF-8 content.\r\n * @throws Propagates any Node.js `fs` error (e.g. file not found) raised by\r\n * the underlying read.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function readAsset (relativePath: string): string {\r\n return readFileSync(join(assetsRoot(), relativePath), 'utf8')\r\n}\r\n\r\n/**\r\n * Lists every file under an asset directory as forward-slash relative paths.\r\n *\r\n * @remarks\r\n * Recurses into subdirectories; paths are normalised to forward slashes\r\n * regardless of platform.\r\n *\r\n * @param relativeDirectory - Directory, relative to {@link assetsRoot}, to list.\r\n * @returns The relative file paths found, in directory-traversal order.\r\n * @throws Propagates any Node.js `fs` error (e.g. directory not found) raised\r\n * by the underlying read.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function listAssetFiles (relativeDirectory: string): string[] {\r\n const base = join(assetsRoot(), relativeDirectory)\r\n const files: string[] = []\r\n\r\n const walk = (directory: string): void => {\r\n const entries = readdirSync(directory, { withFileTypes: true })\r\n for (const entry of entries) {\r\n const full = join(directory, entry.name)\r\n if (entry.isDirectory()) {\r\n walk(full)\r\n } else {\r\n files.push(relative(base, full).split(sep).join('/'))\r\n }\r\n }\r\n }\r\n\r\n walk(base)\r\n return files\r\n}\r\n","import { readAsset } from '../engine/assets'\r\nimport { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'commonjs',\r\n main: 'dist/index.js',\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p tsconfig.app.json',\r\n watch: 'tsc -p tsconfig.app.json -w',\r\n start: 'func start',\r\n 'clean:config': 'node ../../tools/clean-config.mjs',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n doc: 'typedoc --tsconfig tsconfig.app.json',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.functionApp],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: `npm run build -w ${vars.packageName}` } },\r\n serve: run('start'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n target: 'es2022',\r\n sourceMap: true,\r\n declaration: false,\r\n declarationMap: false,\r\n esModuleInterop: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction appTsconfigApp (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n sourceMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction hostJson (): string {\r\n return toJson({\r\n version: '2.0',\r\n logging: {\r\n applicationInsights: {\r\n samplingSettings: { isEnabled: true, excludedTypes: 'Request' },\r\n },\r\n },\r\n extensionBundle: {\r\n id: 'Microsoft.Azure.Functions.ExtensionBundle',\r\n version: '[4.*, 5.0.0)',\r\n },\r\n })\r\n}\r\n\r\nfunction localSettingsJson (): string {\r\n // Gitignored. The --inspect arg lets VSCode attach on :9229 for TS debugging.\r\n return toJson({\r\n IsEncrypted: false,\r\n Values: {\r\n FUNCTIONS_WORKER_RUNTIME: 'node',\r\n AzureWebJobsStorage: '',\r\n languageWorkers__node__arguments: '--inspect=9229',\r\n },\r\n })\r\n}\r\n\r\nfunction configurationFile (environment: string): string {\r\n return toJson([\r\n { name: 'FUNCTIONS_WORKER_RUNTIME', value: 'node', slotSetting: false },\r\n { name: 'WEBSITE_NODE_DEFAULT_VERSION', value: '~24', slotSetting: false },\r\n { name: 'ENVIRONMENT', value: environment, slotSetting: false },\r\n ])\r\n}\r\n\r\nconst greetingTs = `/**\r\n * Builds the greeting returned by the sample HTTP function.\r\n *\r\n * @remarks Pure string helper — replace with your own logic.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function buildGreeting (name: string): string {\r\n return 'Hello, ' + name + '!'\r\n}\r\n`\r\n\r\nconst greetingTestTs = `import { buildGreeting } from './greeting'\r\n\r\ndescribe('buildGreeting', () => {\r\n it('greets a name', () => {\r\n expect(buildGreeting('world')).toBe('Hello, world!')\r\n })\r\n})\r\n`\r\n\r\nconst helloTs = `import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions'\r\nimport { buildGreeting } from '../greeting'\r\n\r\n/**\r\n * Sample HTTP-triggered function.\r\n *\r\n * @remarks Registered with the Functions host via the app.http call below.\r\n * @param request - The incoming HTTP request.\r\n * @param context - The Azure Functions invocation context.\r\n * @returns The HTTP response payload.\r\n * @throws Never - failures are surfaced by the Functions host.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function hello (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {\r\n context.log('HTTP function processed a request for ' + request.url)\r\n const name = request.query.get('name') ?? 'world'\r\n\r\n return { body: buildGreeting(name) }\r\n}\r\n\r\n// app.http performs the Azure Functions v4 registration at import time.\r\n// eslint-disable-next-line unicorn/no-top-level-side-effects\r\napp.http('hello', { methods: ['GET'], authLevel: 'anonymous', handler: hello })\r\n`\r\n\r\nconst indexTs = `import './functions/hello'\r\n`\r\n\r\n/**\r\n * Files for an Azure Function App at `apps/<name>`.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the function app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function functionAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('tsconfig.app.json', appTsconfigApp(), 'tool-owned'),\r\n file('host.json', hostJson(), 'scaffold'),\r\n file('local.settings.json', localSettingsJson(), 'scaffold'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('.configurations/dev.json', configurationFile('dev'), 'scaffold'),\r\n file('.configurations/uat.json', configurationFile('uat'), 'scaffold'),\r\n file('.configurations/prod.json', configurationFile('prod'), 'scaffold'),\r\n file('src/index.ts', indexTs, 'scaffold'),\r\n file('src/greeting.ts', greetingTs, 'scaffold'),\r\n file('src/greeting.test.ts', greetingTestTs, 'scaffold'),\r\n file('src/functions/hello.ts', helloTs, 'scaffold'),\r\n { path: 'tools/clean-config.mjs', content: readAsset('scripts/clean-config.mjs'), ownership: 'tool-owned' },\r\n ]\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction libPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'commonjs',\r\n // Point at source so consumers resolve TS directly: enables step-into-source\r\n // debugging and editor \"find references\" across internal libraries.\r\n main: './src/index.ts',\r\n types: './src/index.ts',\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p ./tsconfig.lib.json',\r\n test: 'jest --collectCoverage',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n doc: 'typedoc --tsconfig tsconfig.lib.json',\r\n },\r\n })\r\n}\r\n\r\nfunction libProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `libs/${vars.name}/src`,\r\n projectType: 'library',\r\n tags: [TAGS.internalLib],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: `npm run build -w ${vars.packageName}` } },\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nfunction libTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'nodenext',\r\n moduleResolution: 'nodenext',\r\n target: 'es2024',\r\n lib: ['es2024'],\r\n noEmit: true,\r\n emitDeclarationOnly: true,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n allowSyntheticDefaultImports: true,\r\n importHelpers: true,\r\n isolatedModules: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction libTsconfigLib (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n emitDeclarationOnly: false,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts', './src/_jest/**'],\r\n })\r\n}\r\n\r\nfunction libTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nconst indexTs = `export * from './greeter'\r\n`\r\n\r\nconst greeterTs = `/**\r\n * Returns a friendly greeting for the given name.\r\n *\r\n * @remarks Demonstrates step-into-source debugging across internal libraries.\r\n * @param name - The name to greet (surrounding whitespace is trimmed).\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n const trimmed = name.trim() // ← set a breakpoint here, then run \"Debug Jest (current file)\"\r\n\r\n return 'Hello, ' + trimmed + '!'\r\n}\r\n`\r\n\r\nconst greeterTestTs = `import { greet } from './index'\r\n\r\ndescribe('greet', () => {\r\n it('greets a trimmed name', () => {\r\n expect(greet(' Ada ')).toBe('Hello, Ada!')\r\n })\r\n})\r\n`\r\n\r\n/**\r\n * Returns every file for a new internal library at `libs/<name>`.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the internal library.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function internalLibFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `libs/${vars.name}`\r\n const toolOwned = (path: string, content: string): FileSpec => ({ path: `${root}/${path}`, content, ownership: 'tool-owned' })\r\n const scaffold = (path: string, content: string): FileSpec => ({ path: `${root}/${path}`, content, ownership: 'scaffold' })\r\n\r\n return [\r\n scaffold('package.json', libPackageJson(vars)),\r\n toolOwned('project.json', libProjectJson(vars)),\r\n toolOwned('tsconfig.json', libTsconfig()),\r\n toolOwned('tsconfig.lib.json', libTsconfigLib()),\r\n scaffold('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`),\r\n toolOwned('typedoc.json', libTypedoc()),\r\n scaffold('src/index.ts', indexTs),\r\n scaffold('src/greeter.ts', greeterTs),\r\n scaffold('src/greeter.test.ts', greeterTestTs),\r\n ]\r\n}\r\n","import { readAsset } from '../engine/assets'\r\nimport { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nconst buildEnvScript = (environment: string): string => `dotenv -e .env.${environment} -- node ../../tools/next-build.mjs ${environment}`\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'next dev',\r\n 'build:dev': buildEnvScript('dev'),\r\n 'build:uat': buildEnvScript('uat'),\r\n 'build:prod': buildEnvScript('prod'),\r\n 'build:all': 'npm run build:dev && npm run build:uat && npm run build:prod',\r\n build: 'npm run build:dev',\r\n start: 'next start',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.nextjsApp],\r\n targets: {\r\n build: {\r\n executor: 'nx:run-commands',\r\n outputs: ['{projectRoot}/dist-dev', '{projectRoot}/dist-uat', '{projectRoot}/dist-prod'],\r\n options: { command: `npm run build -w ${vars.packageName}` },\r\n },\r\n serve: run('dev'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n lib: ['es2022', 'dom', 'dom.iterable'],\r\n jsx: 'preserve',\r\n module: 'esnext',\r\n moduleResolution: 'bundler',\r\n types: ['node'],\r\n noEmit: true,\r\n allowJs: true,\r\n esModuleInterop: true,\r\n incremental: true,\r\n plugins: [{ name: 'next' }],\r\n },\r\n include: ['next-env.d.ts', 'src', '.next/types/**/*.ts'],\r\n exclude: ['node_modules'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nconst nextConfig = `import path from 'node:path'\r\n\r\n// ESLint runs as its own monorepo target (npm run lint); Next type-checks the build.\r\nconst nextConfig = { output: process.env.NEXT_OUTPUT === 'export' ? 'export' : 'standalone', outputFileTracingRoot: path.join(import.meta.dirname, '..', '..'), eslint: { ignoreDuringBuilds: true } }\r\n\r\nexport default nextConfig\r\n`\r\n\r\nfunction layoutTsx (vars: ProjectVars): string {\r\n return `import type { ReactNode } from 'react'\r\n\r\nexport const metadata = { title: '${vars.name}' }\r\n\r\n// Root layout required by the Next.js App Router; wraps every page.\r\nexport default function RootLayout ({ children }: { children: ReactNode }) {\r\n return (\r\n <html lang='en'>\r\n <body>{ children }</body>\r\n </html>\r\n )\r\n}\r\n`\r\n}\r\n\r\nconst pageTsx = `import { greet } from '../greeting'\r\n\r\n// Home page (App Router server component).\r\nexport default function Home () {\r\n return (\r\n <main>\r\n <h1>{greet('Next.js')}</h1>\r\n </main>\r\n )\r\n}\r\n`\r\n\r\nconst greetingTs = `/**\r\n * Returns the greeting rendered on the home page.\r\n *\r\n * @remarks Shared TS logic — unit-tested directly (no Next.js test transform needed).\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n return 'Hello from ' + name + '!'\r\n}\r\n`\r\n\r\nconst greetingTestTs = `import { greet } from './greeting'\r\n\r\ndescribe('greet', () => {\r\n it('greets the given name', () => {\r\n expect(greet('world')).toBe('Hello from world!')\r\n })\r\n})\r\n`\r\n\r\nfunction envFile (environment: string): string {\r\n return `NEXT_PUBLIC_ENVIRONMENT=${environment}\\nNEXT_PUBLIC_API_URL=https://${environment}.example.com\\n`\r\n}\r\n\r\n/**\r\n * Files for a full-stack Next.js app at `apps/<name>`.\r\n *\r\n * @remarks\r\n * App Router with dev/uat/prod builds assembled into `dist-<env>` by the\r\n * vendored `tools/next-build.mjs` (server-standalone by default, or static\r\n * export via `NEXT_OUTPUT=export`). The page/layout are built by Next; jest\r\n * covers the shared TS helper.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Next.js app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function nextAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('next.config.mjs', nextConfig, 'scaffold'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('.env.dev', envFile('dev'), 'scaffold'),\r\n file('.env.uat', envFile('uat'), 'scaffold'),\r\n file('.env.prod', envFile('prod'), 'scaffold'),\r\n file('src/app/layout.tsx', layoutTsx(vars), 'scaffold'),\r\n file('src/app/page.tsx', pageTsx, 'scaffold'),\r\n file('src/greeting.ts', greetingTs, 'scaffold'),\r\n file('src/greeting.test.ts', greetingTestTs, 'scaffold'),\r\n { path: 'tools/next-build.mjs', content: readAsset('scripts/next-build.mjs'), ownership: 'tool-owned' },\r\n ]\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'commonjs',\r\n main: 'dist/index.js',\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p tsconfig.app.json',\r\n watch: 'tsc -p tsconfig.app.json -w',\r\n start: 'node dist/index.js',\r\n dev: 'tsx watch src/index.ts',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n doc: 'typedoc --tsconfig tsconfig.app.json',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.nodeApp],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: `npm run build -w ${vars.packageName}` } },\r\n serve: run('start'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n target: 'es2022',\r\n sourceMap: true,\r\n declaration: false,\r\n declarationMap: false,\r\n esModuleInterop: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction appTsconfigApp (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n sourceMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction appTypedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nconst serverTs = `import { IncomingMessage, ServerResponse } from 'node:http'\r\n\r\n/**\r\n * Builds the greeting returned by the server.\r\n *\r\n * @remarks Pure string helper — replace with your own logic.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function buildGreeting (name: string): string {\r\n return 'Hello, ' + name + '!'\r\n}\r\n\r\n/**\r\n * Handles an HTTP request, replying with a plain-text greeting.\r\n *\r\n * @remarks Swap in Express, Koa, Fastify, Nest or any framework you prefer.\r\n * @param request - The incoming HTTP request.\r\n * @param response - The HTTP response to write to.\r\n * @returns Nothing.\r\n * @throws Never - failures surface through the Node HTTP server.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function handleRequest (request: IncomingMessage, response: ServerResponse): void {\r\n const requestUrl = new URL(request.url ?? '/', 'http://localhost')\r\n const name = requestUrl.searchParams.get('name') ?? 'world'\r\n\r\n response.writeHead(200, { 'content-type': 'text/plain' })\r\n response.end(buildGreeting(name))\r\n}\r\n`\r\n\r\nconst indexTs = `import { createServer } from 'node:http'\r\nimport { handleRequest } from './server'\r\n\r\nconst port = Number(process.env.PORT ?? 3000)\r\n\r\ncreateServer(handleRequest).listen(port, () => {\r\n console.log('Server listening on http://localhost:' + port)\r\n})\r\n`\r\n\r\nconst serverTestTs = `import { buildGreeting } from './server'\r\n\r\ndescribe('buildGreeting', () => {\r\n it('greets a name', () => {\r\n expect(buildGreeting('world')).toBe('Hello, world!')\r\n })\r\n})\r\n`\r\n\r\n/**\r\n * Files for a generic Node.js app at `apps/<name>`.\r\n *\r\n * @remarks\r\n * A framework-agnostic TS HTTP server (node:http) the user extends with any\r\n * framework. Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the Node app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function nodeAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('tsconfig.app.json', appTsconfigApp(), 'tool-owned'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', appTypedoc(), 'tool-owned'),\r\n file('src/index.ts', indexTs, 'scaffold'),\r\n file('src/server.ts', serverTs, 'scaffold'),\r\n file('src/server.test.ts', serverTestTs, 'scaffold'),\r\n ]\r\n}\r\n","import type { RegistryConfig } from './types'\r\n\r\n/**\r\n * Returns the npm registry URL for a registry config.\r\n *\r\n * @remarks\r\n * Public npm needs no scoped registry, so it returns `undefined`.\r\n *\r\n * @param registry - The monorepo's resolved registry configuration.\r\n * @returns The registry URL, or `undefined` for the public npm registry.\r\n * @throws Never - performs a pure mapping with no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function registryUrl (registry: RegistryConfig): string | undefined {\r\n switch (registry.kind) {\r\n case 'azure-artifacts': {\r\n return `https://pkgs.dev.azure.com/${registry.organization}/${registry.project}/_packaging/${registry.artifactsFeed}/npm/registry/`\r\n }\r\n case 'github-packages': {\r\n return 'https://npm.pkg.github.com/'\r\n }\r\n default: {\r\n return undefined\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds the `.npmrc` body for a registry configuration.\r\n *\r\n * @remarks\r\n * Always points the default registry at public npm, then adds a scoped registry\r\n * plus auth-token line for Azure Artifacts / GitHub Packages. The\r\n * `${NODE_AUTH_TOKEN}` placeholder is kept literal (the CI authenticates it).\r\n *\r\n * @param registry - The monorepo's resolved registry configuration.\r\n * @param scope - The npm scope (e.g. `@auto`) the scoped registry applies to.\r\n * @returns The full text of the generated `.npmrc`.\r\n * @throws Never - performs a pure mapping with no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function npmrcContent (registry: RegistryConfig, scope: string): string {\r\n const scopeName = scope.replace(/^@/, '')\r\n const url = registryUrl(registry)\r\n const lines = [\r\n 'registry=https://registry.npmjs.org/',\r\n '; ESLint 10 lands ahead of some plugins\\' peer ranges; accept the resolved tree.',\r\n 'legacy-peer-deps=true',\r\n ]\r\n\r\n if (url) {\r\n const host = url.replace(/^https:\\/\\//, '')\r\n lines.push(`@${scopeName}:registry=${url}`, `//${host}:_authToken=\\${NODE_AUTH_TOKEN}`)\r\n }\r\n\r\n lines.push('')\r\n return lines.join('\\n')\r\n}\r\n","import { readAsset } from '../engine/assets'\r\nimport { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport { registryUrl } from '../engine/registry'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction publishConfig (vars: ProjectVars): Record<string, string> | undefined {\r\n const url = vars.registry ? registryUrl(vars.registry) : undefined\r\n return url ? { registry: url } : undefined\r\n}\r\n\r\nfunction tsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n baseUrl: '.',\r\n rootDir: '.',\r\n outDir: './dist',\r\n module: 'nodenext',\r\n moduleResolution: 'nodenext',\r\n target: 'es2024',\r\n lib: ['es2024'],\r\n noEmit: true,\r\n emitDeclarationOnly: true,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n allowSyntheticDefaultImports: true,\r\n importHelpers: true,\r\n isolatedModules: true,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**'],\r\n })\r\n}\r\n\r\nfunction tsconfigLib (): string {\r\n return toJson({\r\n extends: './tsconfig.json',\r\n compilerOptions: {\r\n rootDir: './src',\r\n noEmit: false,\r\n emitDeclarationOnly: false,\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n },\r\n exclude: ['./coverage/**', './dist/**', './doc/**', './node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction typedoc (): string {\r\n return toJson({\r\n extends: ['../../typedoc.json'],\r\n entryPoints: ['./src'],\r\n out: 'doc',\r\n exclude: ['./node_modules/**', './src/**/*.test.ts'],\r\n })\r\n}\r\n\r\nfunction projectJson (vars: ProjectVars, buildCommand: string): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `libs/${vars.name}/src`,\r\n projectType: vars.kind === 'cli-tool' ? 'application' : 'library',\r\n tags: [TAGS.publishableLib],\r\n targets: {\r\n build: { executor: 'nx:run-commands', outputs: ['{projectRoot}/dist'], options: { command: buildCommand } },\r\n test: run('test'),\r\n lint: run('lint'),\r\n doc: run('doc'),\r\n },\r\n })\r\n}\r\n\r\nconst greeterTs = `/**\r\n * Returns a friendly greeting for the given name.\r\n *\r\n * @remarks The package's public API entry point.\r\n * @param name - The name to greet (surrounding whitespace is trimmed).\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n const trimmed = name.trim() // ← breakpoint here works under \"Debug Jest (current file)\"\r\n\r\n return 'Hello, ' + trimmed + '!'\r\n}\r\n`\r\n\r\nconst greeterTestTs = `import { greet } from './index'\r\n\r\ndescribe('greet', () => {\r\n it('greets a trimmed name', () => {\r\n expect(greet(' Ada ')).toBe('Hello, Ada!')\r\n })\r\n})\r\n`\r\n\r\n/** The vendored resolved-deps script, written once at the repo root tools/ dir. */\r\nfunction distPackageScript (): FileSpec {\r\n return {\r\n path: 'tools/generate-dist-package.mjs',\r\n content: readAsset('scripts/generate-dist-package.mjs'),\r\n ownership: 'tool-owned',\r\n }\r\n}\r\n\r\n/**\r\n * Files for a publishable library at `libs/<name>` (published to Azure Artifacts).\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the publishable library.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function publishableLibFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `libs/${vars.name}`\r\n const buildCommand = `npm run build -w ${vars.packageName}`\r\n const packageJson = toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n type: 'commonjs',\r\n main: './src/index.ts',\r\n types: './src/index.ts',\r\n publishConfig: publishConfig(vars),\r\n monecromanci: { dist: { main: './index.js', types: './index.d.ts' } },\r\n dependencies: {},\r\n scripts: {\r\n build: 'tsc -p ./tsconfig.lib.json && node ../../tools/generate-dist-package.mjs',\r\n test: 'jest --collectCoverage',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n doc: 'typedoc --tsconfig tsconfig.lib.json',\r\n publish: 'npm publish ./dist',\r\n },\r\n })\r\n\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', packageJson, 'scaffold'),\r\n file('project.json', projectJson(vars, buildCommand), 'tool-owned'),\r\n file('tsconfig.json', tsconfig(), 'tool-owned'),\r\n file('tsconfig.lib.json', tsconfigLib(), 'tool-owned'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', typedoc(), 'tool-owned'),\r\n file('src/index.ts', 'export * from \\'./greeter\\'\\n', 'scaffold'),\r\n file('src/greeter.ts', greeterTs, 'scaffold'),\r\n file('src/greeter.test.ts', greeterTestTs, 'scaffold'),\r\n distPackageScript(),\r\n ]\r\n}\r\n\r\nconst cliMainTs = String.raw`/** Sample CLI entry point. Replace with your own command logic. */\r\nfunction main (argv: string[]): void {\r\n const name = argv[0] ?? 'world'\r\n process.stdout.write('Hello, ' + name + '!\\n')\r\n}\r\n\r\nmain(process.argv.slice(2))\r\n`\r\n\r\nconst cliMainTestTs = `import { greet } from './greeter'\r\n\r\ndescribe('greet', () => {\r\n it('greets a name', () => {\r\n expect(greet('world')).toBe('Hello, world!')\r\n })\r\n})\r\n`\r\n\r\nconst cliGreeterTs = `/**\r\n * Returns the greeting printed by the CLI.\r\n *\r\n * @remarks Replace with your own command logic.\r\n * @param name - The name to greet.\r\n * @returns The greeting text.\r\n * @throws Never - performs no I/O.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function greet (name: string): string {\r\n return 'Hello, ' + name + '!'\r\n}\r\n`\r\n\r\n/**\r\n * Files for an executable CLI tool (a publishable lib that also ships a bin).\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the CLI tool.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function cliToolFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `libs/${vars.name}`\r\n const buildCommand = `npm run build -w ${vars.packageName}`\r\n const esbuild = 'esbuild src/cli.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js'\r\n const packageJson = toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n type: 'commonjs',\r\n main: './src/cli.ts',\r\n bin: { [vars.name]: './dist/cli.js' },\r\n publishConfig: publishConfig(vars),\r\n monecromanci: { dist: { main: './cli.js', bin: { [vars.name]: './cli.js' } } },\r\n dependencies: {},\r\n scripts: {\r\n build: `${esbuild} && node ../../tools/generate-dist-package.mjs`,\r\n test: 'jest --collectCoverage',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n doc: 'typedoc --tsconfig tsconfig.lib.json',\r\n publish: 'npm publish ./dist',\r\n },\r\n })\r\n\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', packageJson, 'scaffold'),\r\n file('project.json', projectJson(vars, buildCommand), 'tool-owned'),\r\n file('tsconfig.json', tsconfig(), 'tool-owned'),\r\n file('tsconfig.lib.json', tsconfigLib(), 'tool-owned'),\r\n file('jest.config.mjs', `import { createConfig } from '../../jest.preset.mjs'\\n\\nexport default createConfig('${vars.name}')\\n`, 'scaffold'),\r\n file('typedoc.json', typedoc(), 'tool-owned'),\r\n file('src/cli.ts', cliMainTs, 'scaffold'),\r\n file('src/greeter.ts', cliGreeterTs, 'scaffold'),\r\n file('src/greeter.test.ts', cliMainTestTs, 'scaffold'),\r\n distPackageScript(),\r\n ]\r\n}\r\n","import { TAGS } from '../engine/constants'\r\nimport { toJson } from '../engine/fsx'\r\nimport type { FileSpec, ProjectVars } from '../engine/types'\r\n\r\nfunction appPackageJson (vars: ProjectVars): string {\r\n return toJson({\r\n name: vars.packageName,\r\n version: '0.0.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n 'build:dev': 'vite build --mode dev --outDir dist-dev',\r\n 'build:uat': 'vite build --mode uat --outDir dist-uat',\r\n 'build:prod': 'vite build --mode prod --outDir dist-prod',\r\n 'build:all': 'npm run build:dev && npm run build:uat && npm run build:prod',\r\n build: 'npm run build:dev',\r\n preview: 'vite preview',\r\n lint: 'eslint . -c ../../eslint.config.mjs',\r\n test: 'jest --collectCoverage',\r\n },\r\n })\r\n}\r\n\r\nfunction appProjectJson (vars: ProjectVars): string {\r\n const run = (target: string): { executor: string, options: { command: string } } => ({\r\n executor: 'nx:run-commands',\r\n options: { command: `npm run ${target} -w ${vars.packageName}` },\r\n })\r\n\r\n return toJson({\r\n name: vars.name,\r\n $schema: '../../node_modules/nx/schemas/project-schema.json',\r\n sourceRoot: `apps/${vars.name}/src`,\r\n projectType: 'application',\r\n tags: [TAGS.reactApp],\r\n targets: {\r\n build: {\r\n executor: 'nx:run-commands',\r\n outputs: ['{projectRoot}/dist-dev', '{projectRoot}/dist-uat', '{projectRoot}/dist-prod'],\r\n options: { command: `npm run build -w ${vars.packageName}` },\r\n },\r\n serve: run('dev'),\r\n test: run('test'),\r\n lint: run('lint'),\r\n },\r\n })\r\n}\r\n\r\nfunction appTsconfig (): string {\r\n return toJson({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n lib: ['es2022', 'DOM', 'DOM.Iterable'],\r\n module: 'esnext',\r\n moduleResolution: 'bundler',\r\n jsx: 'react-jsx',\r\n types: ['vite/client', 'node'],\r\n noEmit: true,\r\n sourceMap: true,\r\n allowSyntheticDefaultImports: true,\r\n esModuleInterop: true,\r\n },\r\n include: ['src', 'vite.config.ts'],\r\n })\r\n}\r\n\r\nfunction appTsconfigSpec (): string {\r\n // Used by ts-jest: CommonJS + react-jsx so .tsx tests transpile under Jest.\r\n return toJson({\r\n extends: '../../tsconfig.jest.json',\r\n compilerOptions: {\r\n jsx: 'react-jsx',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n types: ['jest', 'node'],\r\n },\r\n })\r\n}\r\n\r\nconst viteConfigTs = `import react from '@vitejs/plugin-react'\r\nimport { defineConfig } from 'vite'\r\n\r\nexport default defineConfig({ plugins: [react()], server: { port: 5173 }, build: { sourcemap: true } })\r\n`\r\n\r\nconst viteEnvDts = `/// <reference types=\"vite/client\" />\r\n`\r\n\r\nfunction indexHtml (vars: ProjectVars): string {\r\n return `<!doctype html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${vars.name}</title>\r\n </head>\r\n <body>\r\n <div id=\"root\"></div>\r\n <script type=\"module\" src=\"/src/main.tsx\"></script>\r\n </body>\r\n</html>\r\n`\r\n}\r\n\r\nconst mainTsx = `import { StrictMode } from 'react'\r\nimport { createRoot } from 'react-dom/client'\r\nimport { App } from './App'\r\n\r\n// Vite exposes the per-environment .env values on import.meta.env (build --mode).\r\nconst environment = import.meta.env.VITE_ENVIRONMENT ?? 'local'\r\nconsole.info('Starting app in ' + environment + ' mode')\r\n\r\ncreateRoot(document.querySelector('#root')!).render(\r\n <StrictMode>\r\n <App />\r\n </StrictMode>,\r\n)\r\n`\r\n\r\nconst appTsx = `/**\r\n * Root application component.\r\n *\r\n * @remarks The app's UI entry point, rendered by main.tsx.\r\n * @returns The rendered application markup.\r\n * @throws Never - a pure render.\r\n * @typeParam None - this component has no generic type parameters.\r\n */\r\nexport function App () {\r\n return (\r\n <main>\r\n <h1>Hello from your new app</h1>\r\n </main>\r\n )\r\n}\r\n`\r\n\r\nconst appTestTsx = `import '@testing-library/jest-dom'\r\nimport { render, screen } from '@testing-library/react'\r\nimport { App } from './App'\r\n\r\ndescribe('App', () => {\r\n it('renders a heading', () => {\r\n render(<App />)\r\n expect(screen.getByRole('heading')).toBeInTheDocument()\r\n })\r\n})\r\n`\r\n\r\nconst jestConfigMjs = (name: string): string => String.raw`import { createConfig } from '../../jest.preset.mjs'\r\n\r\nconst base = createConfig('${name}')\r\n\r\nexport default { ...base, testEnvironment: 'jsdom', transform: { '^.+\\\\.[tj]sx?$': ['ts-jest', { tsconfig: './tsconfig.spec.json' }] } }\r\n`\r\n\r\nfunction envFile (environment: string): string {\r\n return `VITE_ENVIRONMENT=${environment}\\nVITE_API_URL=https://${environment}.example.com\\n`\r\n}\r\n\r\n/**\r\n * Files for a React (Vite) app at `apps/<name>` with dev/uat/prod builds.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The project's template inputs.\r\n * @returns The full set of file specs for the React app.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function reactAppFiles (vars: ProjectVars): FileSpec[] {\r\n const root = `apps/${vars.name}`\r\n const file = (path: string, content: string, ownership: FileSpec['ownership']): FileSpec => ({ path: `${root}/${path}`, content, ownership })\r\n\r\n return [\r\n file('package.json', appPackageJson(vars), 'scaffold'),\r\n file('project.json', appProjectJson(vars), 'tool-owned'),\r\n file('tsconfig.json', appTsconfig(), 'tool-owned'),\r\n file('tsconfig.spec.json', appTsconfigSpec(), 'tool-owned'),\r\n file('vite.config.ts', viteConfigTs, 'scaffold'),\r\n file('index.html', indexHtml(vars), 'scaffold'),\r\n file('jest.config.mjs', jestConfigMjs(vars.name), 'scaffold'),\r\n file('.env.dev', envFile('dev'), 'scaffold'),\r\n file('.env.uat', envFile('uat'), 'scaffold'),\r\n file('.env.prod', envFile('prod'), 'scaffold'),\r\n file('src/vite-env.d.ts', viteEnvDts, 'scaffold'),\r\n file('src/main.tsx', mainTsx, 'scaffold'),\r\n file('src/App.tsx', appTsx, 'scaffold'),\r\n file('src/App.test.tsx', appTestTsx, 'scaffold'),\r\n ]\r\n}\r\n","import { applyFiles, reportApply } from '../engine/apply'\r\nimport { addRootDependencies } from '../engine/rootPackage'\r\nimport type { FileSpec, MonecromanciConfig, ProjectKind, ProjectVars } from '../engine/types'\r\nimport { svelteAppFiles, vueAppFiles } from '../templates/frontendApp'\r\nimport { functionAppFiles } from '../templates/functionApp'\r\nimport { internalLibFiles } from '../templates/internalLib'\r\nimport { nextAppFiles } from '../templates/nextApp'\r\nimport { nodeAppFiles } from '../templates/nodeApp'\r\nimport { cliToolFiles, publishableLibFiles } from '../templates/publishableLib'\r\nimport { reactAppFiles } from '../templates/reactApp'\r\nimport { logger } from '../util/logger'\r\n\r\ninterface RootDependencies {\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n}\r\n\r\n/** Root dependencies each project kind requires (all deps live in the root). */\r\nconst ROOT_DEPENDENCIES: Partial<Record<ProjectKind, RootDependencies>> = {\r\n 'function-app': {\r\n dependencies: { '@azure/functions': '^4.16.0' },\r\n },\r\n 'node-app': {\r\n devDependencies: { tsx: '^4.20.6' },\r\n },\r\n 'vue-app': {\r\n dependencies: { vue: '^3.5.13' },\r\n devDependencies: { '@vitejs/plugin-vue': '^5.2.4', vite: '^6.0.7' },\r\n },\r\n 'svelte-app': {\r\n devDependencies: { '@sveltejs/vite-plugin-svelte': '^5.0.3', svelte: '^5.19.0', vite: '^6.0.7' },\r\n },\r\n 'nextjs-app': {\r\n dependencies: { next: '^15.1.4', react: '^19.2.0', 'react-dom': '^19.2.0' },\r\n devDependencies: { '@types/react': '^19.2.0', '@types/react-dom': '^19.2.0', 'dotenv-cli': '^8.0.0' },\r\n },\r\n 'react-app': {\r\n dependencies: { react: '^19.2.0', 'react-dom': '^19.2.0' },\r\n devDependencies: {\r\n '@testing-library/dom': '^10.4.0',\r\n '@testing-library/jest-dom': '^6.6.3',\r\n '@testing-library/react': '^16.1.0',\r\n '@types/react': '^19.2.0',\r\n '@types/react-dom': '^19.2.0',\r\n '@vitejs/plugin-react': '^4.3.4',\r\n 'jest-environment-jsdom': '^30.0.0',\r\n vite: '^6.0.7',\r\n },\r\n },\r\n}\r\n\r\nfunction filesForKind (kind: ProjectKind, vars: ProjectVars): FileSpec[] {\r\n switch (kind) {\r\n case 'internal-lib': {\r\n return internalLibFiles(vars)\r\n }\r\n case 'publishable-lib': {\r\n return publishableLibFiles(vars)\r\n }\r\n case 'cli-tool': {\r\n return cliToolFiles(vars)\r\n }\r\n case 'function-app': {\r\n return functionAppFiles(vars)\r\n }\r\n case 'node-app': {\r\n return nodeAppFiles(vars)\r\n }\r\n case 'react-app': {\r\n return reactAppFiles(vars)\r\n }\r\n case 'vue-app': {\r\n return vueAppFiles(vars)\r\n }\r\n case 'svelte-app': {\r\n return svelteAppFiles(vars)\r\n }\r\n case 'nextjs-app': {\r\n return nextAppFiles(vars)\r\n }\r\n default: {\r\n throw new Error(`The '${kind as string}' generator is not implemented yet.`)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Public accessor used by `doctor` to recompute a project's expected files.\r\n *\r\n * @remarks\r\n * Thin wrapper around the internal `filesForKind` dispatch.\r\n *\r\n * @param kind - The project kind to generate files for.\r\n * @param vars - The project's template inputs.\r\n * @returns The expected file specs for this project.\r\n * @throws Throws when `kind` is not one of the implemented {@link ProjectKind}\r\n * values.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function projectFiles (kind: ProjectKind, vars: ProjectVars): FileSpec[] {\r\n return filesForKind(kind, vars)\r\n}\r\n\r\nfunction applyRootDependencies (repoRoot: string, kind: ProjectKind): void {\r\n const root = ROOT_DEPENDENCIES[kind]\r\n if (!root) {\r\n return\r\n }\r\n\r\n const added = [\r\n ...(root.dependencies ? addRootDependencies(repoRoot, root.dependencies, 'dependencies') : []),\r\n ...(root.devDependencies ? addRootDependencies(repoRoot, root.devDependencies, 'devDependencies') : []),\r\n ]\r\n if (added.length > 0) {\r\n logger.step(`added root dependencies: ${added.join(', ')}`)\r\n }\r\n}\r\n\r\n/**\r\n * Writes a single project's files into an existing monorepo.\r\n *\r\n * @remarks\r\n * Also applies any root-level dependencies the project kind requires (see\r\n * {@link addRootDependencies}).\r\n *\r\n * @param repoRoot - Absolute path to the monorepo root.\r\n * @param kind - The project kind to generate.\r\n * @param name - The kebab-case project name.\r\n * @param config - The monorepo's `.monecromanci.json` stamp.\r\n * @returns Nothing.\r\n * @throws Propagates any Node.js `fs` error raised while writing files, and\r\n * throws when `kind` is not one of the implemented {@link ProjectKind} values.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function generateProject (repoRoot: string, kind: ProjectKind, name: string, config: MonecromanciConfig): void {\r\n const vars: ProjectVars = {\r\n kind,\r\n name,\r\n packageName: `${config.scope}/${name}`,\r\n scope: config.scope,\r\n registry: config.registry,\r\n }\r\n\r\n logger.step(`Adding ${kind} '${name}' (${vars.packageName})`)\r\n reportApply(applyFiles(repoRoot, filesForKind(kind, vars)))\r\n applyRootDependencies(repoRoot, kind)\r\n}\r\n","import { isManagedRepo, loadConfig } from '../engine/config'\r\nimport type { ProjectKind } from '../engine/types'\r\nimport { logger } from '../util/logger'\r\nimport { promptText, select } from '../util/prompts'\r\nimport { toSlug } from '../util/strings'\r\nimport { generateProject } from './scaffold'\r\n\r\n/**\r\n * Options accepted by {@link runAdd}.\r\n *\r\n * @remarks\r\n * Mirrors the CLI's `add <type> <name>` arguments.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface AddOptions {\r\n type?: string\r\n name?: string\r\n}\r\n\r\n/**\r\n * Interactive `monecromanci add`: pick a project kind and scaffold it.\r\n *\r\n * @remarks\r\n * Prompts for any value not supplied via `options`, then delegates to\r\n * {@link generateProject}.\r\n *\r\n * @param options - Project type/name supplied on the command line, if any.\r\n * @returns A promise that resolves once the project has been scaffolded.\r\n * @throws Propagates errors from the underlying file or config operations; the\r\n * CLI entry point in `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runAdd (options: AddOptions): Promise<void> {\r\n const repoRoot = process.cwd()\r\n\r\n if (!isManagedRepo(repoRoot)) {\r\n logger.error('No .monecromanci.json found here. Run this from the monorepo root, or create one with `monecromanci new`.')\r\n return\r\n }\r\n\r\n const config = loadConfig(repoRoot)\r\n if (!config) {\r\n logger.error('Could not read .monecromanci.json.')\r\n return\r\n }\r\n\r\n const kind = (options.type as ProjectKind | undefined) ?? await select<ProjectKind>({\r\n message: 'What do you want to add?',\r\n choices: [\r\n { name: 'Internal library', value: 'internal-lib' },\r\n { name: 'Publishable library', value: 'publishable-lib' },\r\n { name: 'CLI tool', value: 'cli-tool' },\r\n { name: 'Azure Function App', value: 'function-app' },\r\n { name: 'Node.js app (generic server)', value: 'node-app' },\r\n { name: 'React app', value: 'react-app' },\r\n { name: 'Vue app', value: 'vue-app' },\r\n { name: 'Svelte app', value: 'svelte-app' },\r\n { name: 'Next.js app (full-stack)', value: 'nextjs-app' },\r\n ],\r\n })\r\n\r\n const name = toSlug(options.name ?? await promptText('Project name'))\r\n generateProject(repoRoot, kind, name, config)\r\n logger.success('Done. Run `npm install` to link the new workspace, then `npm run graph`.')\r\n}\r\n","import { existsSync, readdirSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { TAGS } from './constants'\r\nimport { readJsonSafe } from './fsx'\r\nimport type { MonecromanciConfig, ProjectKind, ProjectVars } from './types'\r\n\r\nfunction readTags (projectJson: Record<string, unknown>): string[] {\r\n return Array.isArray(projectJson.tags) ? projectJson.tags.map(String) : []\r\n}\r\n\r\nfunction hasBin (packageJson: Record<string, unknown>): boolean {\r\n if (packageJson.bin) {\r\n return true\r\n }\r\n\r\n const marker = packageJson.monecromanci as { dist?: { bin?: unknown } } | undefined\r\n return Boolean(marker?.dist?.bin)\r\n}\r\n\r\n/** Infers a project's MoNecromanCI kind from its tags (and bin for CLI vs lib). */\r\nfunction kindFromProject (projectJson: Record<string, unknown>, packageJson: Record<string, unknown>): ProjectKind | undefined {\r\n const tags = readTags(projectJson)\r\n\r\n if (tags.includes(TAGS.functionApp)) {\r\n return 'function-app'\r\n }\r\n if (tags.includes(TAGS.nodeApp)) {\r\n return 'node-app'\r\n }\r\n if (tags.includes(TAGS.reactApp)) {\r\n return 'react-app'\r\n }\r\n if (tags.includes(TAGS.vueApp)) {\r\n return 'vue-app'\r\n }\r\n if (tags.includes(TAGS.svelteApp)) {\r\n return 'svelte-app'\r\n }\r\n if (tags.includes(TAGS.nextjsApp)) {\r\n return 'nextjs-app'\r\n }\r\n if (tags.includes(TAGS.internalLib)) {\r\n return 'internal-lib'\r\n }\r\n if (tags.includes(TAGS.publishableLib)) {\r\n return hasBin(packageJson) ? 'cli-tool' : 'publishable-lib'\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nfunction scanArea (areaDirectory: string, config: MonecromanciConfig): ProjectVars[] {\r\n const projects: ProjectVars[] = []\r\n const entries = readdirSync(areaDirectory, { withFileTypes: true })\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory()) {\r\n continue\r\n }\r\n\r\n const projectDirectory = join(areaDirectory, entry.name)\r\n const projectJson = readJsonSafe<Record<string, unknown>>(join(projectDirectory, 'project.json'), {})\r\n const packageJson = readJsonSafe<Record<string, unknown>>(join(projectDirectory, 'package.json'), {})\r\n const kind = kindFromProject(projectJson, packageJson)\r\n if (!kind) {\r\n continue\r\n }\r\n\r\n const packageName = typeof packageJson.name === 'string' ? packageJson.name : `${config.scope}/${entry.name}`\r\n projects.push({ kind, name: entry.name, packageName, scope: config.scope, registry: config.registry })\r\n }\r\n\r\n return projects\r\n}\r\n\r\n/**\r\n * Scans apps/ and libs/ and returns the MoNecromanCI project descriptors found.\r\n *\r\n * @remarks\r\n * Skips directories that don't carry a recognisable NX project/package kind\r\n * (see `kindFromProject`).\r\n *\r\n * @param repoRoot - Absolute path to the monorepo root.\r\n * @param config - The monorepo's `.monecromanci.json` stamp.\r\n * @returns The discovered project descriptors.\r\n * @throws Never - delegates to {@link readJsonSafe}, which swallows read/parse\r\n * errors.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function discoverProjects (repoRoot: string, config: MonecromanciConfig): ProjectVars[] {\r\n const projects: ProjectVars[] = []\r\n\r\n for (const area of ['apps', 'libs']) {\r\n const areaDirectory = join(repoRoot, area)\r\n if (existsSync(areaDirectory)) {\r\n projects.push(...scanArea(areaDirectory, config))\r\n }\r\n }\r\n\r\n return projects\r\n}\r\n","import { join } from 'node:path'\r\nimport { fileExists, readTextSafe, writeFileEnsured } from './fsx'\r\nimport type { FileSpec } from './types'\r\n\r\n/**\r\n * Outcome of comparing a tool-owned file on disk against its expected content.\r\n *\r\n * @remarks\r\n * Returned by {@link checkFile} and aggregated into a {@link SyncReport}.\r\n *\r\n * @typeParam None - this type has no generic type parameters.\r\n */\r\nexport type FileStatus = 'ok' | 'missing' | 'drift'\r\n\r\n/**\r\n * Compares a tool-owned file on disk against its expected content.\r\n *\r\n * @remarks\r\n * Returns `'missing'` rather than `'drift'` when the file does not exist.\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @param spec - The file spec to compare against disk.\r\n * @returns Whether the file is in sync, missing, or has drifted.\r\n * @throws Never - delegates to {@link readTextSafe}, which swallows read errors.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function checkFile (repoRoot: string, spec: FileSpec): FileStatus {\r\n const absolute = join(repoRoot, spec.path)\r\n if (!fileExists(absolute)) {\r\n return 'missing'\r\n }\r\n\r\n return readTextSafe(absolute) === spec.content ? 'ok' : 'drift'\r\n}\r\n\r\n/**\r\n * Outcome of a {@link syncToolOwned} pass.\r\n *\r\n * @remarks\r\n * `fixed` is always a subset of `missing` plus `drift`.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface SyncReport {\r\n ok: string[]\r\n missing: string[]\r\n drift: string[]\r\n fixed: string[]\r\n}\r\n\r\n/**\r\n * Checks every `tool-owned` spec against the repo and, when `apply` is set,\r\n * rewrites the ones that are missing or have drifted. `scaffold` files are\r\n * never touched, so user edits survive.\r\n *\r\n * @remarks\r\n * Used by both `doctor` (report-only by default) and `update` (always applies).\r\n *\r\n * @param repoRoot - Absolute path to the repo root.\r\n * @param specs - The file specs to check (only `tool-owned` ones are inspected).\r\n * @param shouldApply - Whether to rewrite missing/drifted files.\r\n * @returns A report of which files are ok, missing, drifted, or were fixed.\r\n * @throws Propagates any Node.js `fs` error raised while rewriting a file when\r\n * `shouldApply` is set.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function syncToolOwned (repoRoot: string, specs: FileSpec[], shouldApply: boolean): SyncReport {\r\n const report: SyncReport = { ok: [], missing: [], drift: [], fixed: [] }\r\n\r\n for (const spec of specs) {\r\n if (spec.ownership !== 'tool-owned') {\r\n continue\r\n }\r\n\r\n const status = checkFile(repoRoot, spec)\r\n if (status === 'ok') {\r\n report.ok.push(spec.path)\r\n continue\r\n }\r\n\r\n if (status === 'missing') {\r\n report.missing.push(spec.path)\r\n } else {\r\n report.drift.push(spec.path)\r\n }\r\n\r\n if (shouldApply) {\r\n writeFileEnsured(join(repoRoot, spec.path), spec.content)\r\n report.fixed.push(spec.path)\r\n }\r\n }\r\n\r\n return report\r\n}\r\n","{\r\n \"name\": \"monecromanci\",\r\n \"version\": \"0.1.1\",\r\n \"description\": \"MoNecromanCI — interactive CLI to summon, conjure, raise and validate NX monorepos (Azure DevOps & GitHub Actions): function/node apps, React/Vue/Svelte/Next.js apps, internal/publishable libs, CLI tools.\",\r\n \"bin\": {\r\n \"monecromanci\": \"./dist/cli.js\",\r\n \"mnci\": \"./dist/cli.js\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"engines\": {\r\n \"node\": \"^22.13.0 || >=24\"\r\n },\r\n \"scripts\": {\r\n \"prepack\": \"npm run build\",\r\n \"build\": \"tsup && node scripts/copyAssets.mjs\",\r\n \"dev\": \"tsup --watch\",\r\n \"lint\": \"eslint .\",\r\n \"lint:fix\": \"eslint . --fix\",\r\n \"test\": \"jest\",\r\n \"test:cov\": \"jest --coverage\",\r\n \"typecheck\": \"tsc --noEmit\",\r\n \"start\": \"node dist/cli.js\"\r\n },\r\n \"keywords\": [\r\n \"nx\",\r\n \"monorepo\",\r\n \"azure-devops\",\r\n \"cli\",\r\n \"scaffold\",\r\n \"typescript\"\r\n ],\r\n \"author\": \"Eduardo Russo\",\r\n \"license\": \"MIT\",\r\n \"dependencies\": {\r\n \"@inquirer/prompts\": \"^8.5.2\",\r\n \"commander\": \"^15.0.0\"\r\n },\r\n \"devDependencies\": {\r\n \"@eslint/markdown\": \"^8.0.2\",\r\n \"@stylistic/eslint-plugin\": \"^5.10.0\",\r\n \"@types/jest\": \"^30.0.0\",\r\n \"@types/node\": \"^26.0.1\",\r\n \"eslint\": \"^10.6.0\",\r\n \"eslint-plugin-jest\": \"^29.15.3\",\r\n \"eslint-plugin-jsonc\": \"^3.2.0\",\r\n \"eslint-plugin-n\": \"^18.2.1\",\r\n \"eslint-plugin-promise\": \"^7.3.0\",\r\n \"eslint-plugin-react\": \"^7.37.5\",\r\n \"eslint-plugin-react-hooks\": \"^7.1.1\",\r\n \"eslint-plugin-react-refresh\": \"^0.5.3\",\r\n \"eslint-plugin-tsdoc\": \"^0.5.2\",\r\n \"eslint-plugin-tsdoc-require-2\": \"^1.2.3\",\r\n \"eslint-plugin-unicorn\": \"^69.0.0\",\r\n \"eslint-plugin-unused-imports\": \"^4.4.1\",\r\n \"eslint-plugin-yml\": \"^3.5.0\",\r\n \"globals\": \"^17.7.0\",\r\n \"jest\": \"^30.4.2\",\r\n \"ts-jest\": \"^29.4.11\",\r\n \"tsup\": \"^8.5.1\",\r\n \"typescript\": \"^6.0.3\",\r\n \"typescript-eslint\": \"^8.62.0\"\r\n }\r\n}\r\n","import { listAssetFiles, readAsset } from '../engine/assets'\r\nimport { toJson } from '../engine/fsx'\r\nimport { npmrcContent } from '../engine/registry'\r\nimport type { FileSpec, MonorepoVars, RegistryConfig } from '../engine/types'\r\nimport rootPackageJson from '../../package.json'\r\n\r\nconst sharedDependency = (name: keyof typeof rootPackageJson.devDependencies): string => rootPackageJson.devDependencies[name]\r\n\r\n/**\r\n * Pinned toolchain for generated monorepos (mirrors the proven JATO set).\r\n *\r\n * Shared entries (ESLint/TS/Jest toolchain) reuse the exact versions MoNecromanCI\r\n * itself depends on, sourced from this package's own `devDependencies`, so the\r\n * two never drift apart. Generated-repo-only packages (nx, esbuild, husky, the\r\n * commitlint/typedoc tooling) are pinned here directly since MoNecromanCI has no\r\n * use for them itself.\r\n */\r\nconst DEV_DEPENDENCIES: Record<string, string> = {\r\n '@commitlint/cli': '^21.1.0',\r\n '@commitlint/config-conventional': '^21.1.0',\r\n '@eslint/markdown': sharedDependency('@eslint/markdown'),\r\n '@stylistic/eslint-plugin': sharedDependency('@stylistic/eslint-plugin'),\r\n '@types/jest': sharedDependency('@types/jest'),\r\n '@types/node': sharedDependency('@types/node'),\r\n esbuild: '^0.28.1',\r\n eslint: sharedDependency('eslint'),\r\n 'eslint-plugin-jest': sharedDependency('eslint-plugin-jest'),\r\n 'eslint-plugin-jsonc': sharedDependency('eslint-plugin-jsonc'),\r\n 'eslint-plugin-n': sharedDependency('eslint-plugin-n'),\r\n 'eslint-plugin-promise': sharedDependency('eslint-plugin-promise'),\r\n 'eslint-plugin-react': sharedDependency('eslint-plugin-react'),\r\n 'eslint-plugin-react-hooks': sharedDependency('eslint-plugin-react-hooks'),\r\n 'eslint-plugin-react-refresh': sharedDependency('eslint-plugin-react-refresh'),\r\n 'eslint-plugin-tsdoc': sharedDependency('eslint-plugin-tsdoc'),\r\n 'eslint-plugin-tsdoc-require-2': sharedDependency('eslint-plugin-tsdoc-require-2'),\r\n 'eslint-plugin-unicorn': sharedDependency('eslint-plugin-unicorn'),\r\n 'eslint-plugin-unused-imports': sharedDependency('eslint-plugin-unused-imports'),\r\n 'eslint-plugin-yml': sharedDependency('eslint-plugin-yml'),\r\n globals: sharedDependency('globals'),\r\n husky: '^9.1.7',\r\n jest: sharedDependency('jest'),\r\n 'jest-junit': '^17.0.0',\r\n nx: '^23.0.1',\r\n 'ts-jest': sharedDependency('ts-jest'),\r\n 'tsc-alias': '^1.8.17',\r\n tslib: '^2.8.1',\r\n typedoc: '^0.28.19',\r\n 'typedoc-plugin-missing-exports': '^4.1.3',\r\n typescript: sharedDependency('typescript'),\r\n 'typescript-eslint': sharedDependency('typescript-eslint'),\r\n}\r\n\r\nfunction packageJson (vars: MonorepoVars): string {\r\n return toJson({\r\n name: vars.workspaceName,\r\n version: '0.0.0',\r\n private: true,\r\n license: 'UNLICENSED',\r\n workspaces: ['apps/*', 'libs/*'],\r\n scripts: {\r\n build: 'nx run-many -t build --all',\r\n 'build:affected': 'nx affected -t build',\r\n lint: 'nx run-many -t lint --all',\r\n 'lint:affected': 'nx affected -t lint',\r\n test: 'nx run-many -t test --all',\r\n 'test:affected': 'nx affected -t test',\r\n doc: 'nx run-many -t doc --all',\r\n 'doc:affected': 'nx affected -t doc',\r\n affected: 'nx affected -t lint,test,build',\r\n projects: 'nx show projects',\r\n graph: 'nx graph',\r\n 'nx:reset': 'nx reset',\r\n 'pipeline:plan': 'node .build-templates/01-preparation.mjs',\r\n 'pipeline:package': 'node .build-templates/03-package-apps.mjs --dry-run',\r\n release: 'nx release',\r\n 'release:version': 'nx release version',\r\n 'release:publish': 'nx release publish',\r\n prepare: 'husky',\r\n },\r\n dependencies: {\r\n tslib: '^2.8.1',\r\n },\r\n devDependencies: DEV_DEPENDENCIES,\r\n engines: {\r\n node: `>=${vars.nodeVersion}`,\r\n },\r\n })\r\n}\r\n\r\nfunction nxJson (vars: MonorepoVars): string {\r\n return toJson({\r\n $schema: './node_modules/nx/schemas/nx-schema.json',\r\n workspaceLayout: { appsDir: 'apps', libsDir: 'libs' },\r\n defaultBase: vars.defaultBase,\r\n namedInputs: {\r\n sharedGlobals: [\r\n '{workspaceRoot}/package.json',\r\n '{workspaceRoot}/package-lock.json',\r\n '{workspaceRoot}/nx.json',\r\n '{workspaceRoot}/tsconfig.base.json',\r\n '{workspaceRoot}/jest.preset.mjs',\r\n '{workspaceRoot}/eslint.config.mjs',\r\n ],\r\n default: ['{projectRoot}/**/*', 'sharedGlobals'],\r\n production: [\r\n 'default',\r\n '!{projectRoot}/coverage/**',\r\n '!{projectRoot}/dist/**',\r\n '!{projectRoot}/doc/**',\r\n '!{projectRoot}/**/*.test.ts',\r\n '!{projectRoot}/src/_jest/**',\r\n ],\r\n },\r\n targetDefaults: {\r\n build: { dependsOn: ['^build'], inputs: ['production', '^production'], cache: true },\r\n lint: { inputs: ['default', '^production'], cache: true },\r\n test: { dependsOn: ['build'], inputs: ['default', '^production'], cache: true },\r\n doc: { inputs: ['production', '^production'], cache: true },\r\n },\r\n release: {\r\n projectsRelationship: 'independent',\r\n projects: ['tag:type:publishable-lib'],\r\n releaseTagPattern: '{projectName}@{version}',\r\n version: { conventionalCommits: true },\r\n changelog: { projectChangelogs: true },\r\n },\r\n analytics: false,\r\n })\r\n}\r\n\r\nfunction tsconfigBase (): string {\r\n return toJson({\r\n $schema: 'https://json.schemastore.org/tsconfig',\r\n compilerOptions: {\r\n ignoreDeprecations: '6.0',\r\n target: 'es2024',\r\n types: ['jest', 'node'],\r\n sourceMap: true,\r\n declaration: true,\r\n declarationMap: true,\r\n removeComments: false,\r\n forceConsistentCasingInFileNames: true,\r\n isolatedModules: true,\r\n noFallthroughCasesInSwitch: true,\r\n noUnusedLocals: true,\r\n noUnusedParameters: true,\r\n resolveJsonModule: true,\r\n skipLibCheck: true,\r\n strict: true,\r\n strictNullChecks: true,\r\n strictPropertyInitialization: false,\r\n },\r\n })\r\n}\r\n\r\nfunction tsconfigJest (): string {\r\n // sourceMap MUST be true so ts-jest emits maps and VSCode binds breakpoints.\r\n return toJson({\r\n extends: './tsconfig.base.json',\r\n compilerOptions: {\r\n target: 'es2022',\r\n module: 'commonjs',\r\n moduleResolution: 'node',\r\n noEmit: false,\r\n emitDeclarationOnly: false,\r\n declaration: false,\r\n declarationMap: false,\r\n sourceMap: true,\r\n esModuleInterop: true,\r\n },\r\n })\r\n}\r\n\r\nfunction typedocJson (): string {\r\n return toJson({\r\n $schema: 'https://typedoc.org/schema.json',\r\n entryPointStrategy: 'expand',\r\n plugin: ['typedoc-plugin-missing-exports'],\r\n excludePrivate: false,\r\n categorizeByGroup: true,\r\n cleanOutputDir: true,\r\n })\r\n}\r\n\r\n// Root Jest config: discover every project that ships a jest config, normalising\r\n// Windows backslashes so the paths are valid for Jest's `projects` option.\r\nconst jestConfigMjs = String.raw`import { globSync } from 'node:fs'\r\n\r\nconst projects = globSync('{libs,apps}/*/jest.config.mjs').map((path) => path.replaceAll('\\\\', '/'))\r\n\r\nexport default {\r\n projects: projects.length > 0 ? projects : ['<rootDir>'],\r\n maxWorkers: '75%',\r\n}\r\n`\r\n\r\n// Shared Jest preset factory. Per-project config is one line: createConfig('name').\r\nconst jestPresetMjs = String.raw`/** Shared Jest preset — generated by MoNecromanCI. Re-sync with 'monecromanci doctor'. */\r\nexport function createConfig (projectName) {\r\n return {\r\n displayName: projectName,\r\n testEnvironment: 'node',\r\n rootDir: '.',\r\n roots: ['<rootDir>/src'],\r\n setupFilesAfterEnv: [\r\n '<rootDir>/../../jest.setup.mjs',\r\n '<rootDir>/../../jest.clear.mjs',\r\n ],\r\n transform: {\r\n '^.+\\\\.[tj]sx?$': ['ts-jest', { tsconfig: '<rootDir>/../../tsconfig.jest.json' }],\r\n },\r\n moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json'],\r\n collectCoverageFrom: [\r\n '<rootDir>/src/**/*.ts',\r\n '!<rootDir>/src/**/*.d.ts',\r\n '!<rootDir>/src/index.ts',\r\n ],\r\n coverageProvider: 'v8',\r\n coverageDirectory: './coverage',\r\n coverageReporters: ['text', 'cobertura', 'html', 'lcov'],\r\n reporters: [\r\n 'default',\r\n ['jest-junit', { outputDirectory: './coverage', outputName: 'test-results.xml' }],\r\n ],\r\n }\r\n}\r\n`\r\n\r\nconst jestSetupMjs = `process.env.TZ = 'UTC'\r\n\r\nbeforeAll(() => {\r\n jest.useFakeTimers()\r\n jest.setSystemTime(new Date('2000-01-01T00:00:00.000Z'))\r\n})\r\n\r\nafterAll(() => {\r\n jest.useRealTimers()\r\n})\r\n`\r\n\r\nconst jestClearMjs = `afterEach(() => {\r\n jest.restoreAllMocks()\r\n jest.clearAllMocks()\r\n jest.resetModules()\r\n})\r\n`\r\n\r\nfunction npmrc (vars: MonorepoVars): string {\r\n return npmrcContent(vars.registry, vars.scope)\r\n}\r\n\r\nconst editorconfig = `root = true\r\n\r\n[*]\r\ncharset = utf-8\r\nend_of_line = lf\r\nindent_style = space\r\nindent_size = 2\r\ninsert_final_newline = true\r\ntrim_trailing_whitespace = true\r\n\r\n[*.md]\r\ntrim_trailing_whitespace = false\r\n`\r\n\r\nconst gitignore = `node_modules/\r\ndist/\r\ndist-dev/\r\ndist-uat/\r\ndist-prod/\r\ncoverage/\r\ndoc/\r\n.nx/\r\ntmp/\r\n.azurite/\r\n.next/\r\nnext-env.d.ts\r\n.pipeline-out/\r\n.pipeline-staging/\r\n*.log\r\n.DS_Store\r\nlocal.settings.json\r\n`\r\n\r\nconst commitlintConfigMjs = `export default {\r\n extends: ['@commitlint/config-conventional'],\r\n}\r\n`\r\n\r\nconst huskyCommitMessage = `npx --no -- commitlint --edit \"$1\"\r\n`\r\n\r\nfunction readme (vars: MonorepoVars): string {\r\n return `# ${vars.displayName}\r\n\r\nNX monorepo generated by [MoNecromanCI](https://github.com/russoedu/monecromanci).\r\n\r\n## Common commands\r\n\r\n\\`\\`\\`sh\r\nnpm run build # build all projects\r\nnpm run test # run all tests\r\nnpm run lint # lint everything\r\nnpm run affected # lint + test + build only what changed\r\nnpm run graph # open the project graph\r\n\\`\\`\\`\r\n\r\n## Debugging\r\n\r\nOpen \\`${vars.displayName}.code-workspace\\` in VSCode. Use the **Run and Debug** panel:\r\nbreakpoints work in \\`.ts\\` test files (and step into internal libs). The\r\n\\`Orta.vscode-jest\\` extension also adds a **Debug** lens above each test.\r\n\r\n## Adding projects\r\n\r\n\\`\\`\\`sh\r\nnpx monecromanci add # (alias: conjure) function-app | node-app | react-app | vue-app | svelte-app | nextjs-app | internal-lib | publishable-lib | cli-tool\r\n\\`\\`\\`\r\n`\r\n}\r\n\r\n/** Human label for a registry, used in the generated nx-release doc. */\r\nfunction registryLabelFor (registry: RegistryConfig): string {\r\n switch (registry.kind) {\r\n case 'azure-artifacts': {\r\n return 'the Azure Artifacts feed `' + registry.artifactsFeed + '`'\r\n }\r\n case 'github-packages': {\r\n return 'GitHub Packages'\r\n }\r\n default: {\r\n return 'the public npm registry'\r\n }\r\n }\r\n}\r\n\r\nfunction nxReleaseDocument (vars: MonorepoVars): string {\r\n const registryLabel = registryLabelFor(vars.registry)\r\n\r\n return `# Releasing publishable libraries & CLI tools\r\n\r\nThis monorepo uses **\\`nx release\\`** with **independent** versioning driven by\r\n**Conventional Commits**. Only projects tagged \\`type:publishable-lib\\` (libraries\r\nand CLI tools) are released; internal libs and apps are never published.\r\n\r\n## How versions are decided (auto-bump)\r\n\r\nYou do **not** hand-edit \\`version\\` in any \\`package.json\\`. \\`nx release\\` reads the\r\nConventional Commit messages since each project's last release tag and bumps:\r\n\r\n| Commit type | Bump |\r\n| ---------------------- | ------ |\r\n| \\`fix: …\\` | patch |\r\n| \\`feat: …\\` | minor |\r\n| \\`feat!: …\\` / \\`BREAKING CHANGE\\` | major |\r\n\r\nCommit messages are enforced by commitlint (\\`commitlint.config.mjs\\`) via a husky\r\n\\`commit-msg\\` hook, so the history stays releasable. Scope a commit to a project\r\nwith \\`fix(my-lib): …\\`.\r\n\r\n## Local commands\r\n\r\n\\`\\`\\`sh\r\nnpm run release # interactive: version + changelog + (optional) publish\r\nnpm run release:version # bump versions + write changelogs from commits\r\nnpm run release:publish # publish what changed to the configured registry\r\nnpx nx release --dry-run # preview everything, change nothing\r\n\\`\\`\\`\r\n\r\n## What gets published\r\n\r\n\\`build\\` emits \\`dist/\\` and runs \\`tools/generate-dist-package.mjs\\`, which writes a\r\ncorrect \\`dist/package.json\\`: it resolves real dependency versions from the **root**\r\npackage.json (all deps live there) and from internal workspace packages. This is\r\nwhy published packages declare their dependencies even though project\r\n\\`package.json\\` files keep \\`dependencies: {}\\`. Publishing runs \\`npm publish ./dist\\`.\r\n\r\n## First release\r\n\r\nFor a project that has never been released, set its starting version once:\r\n\r\n\\`\\`\\`sh\r\nnpx nx release version 1.0.0 --projects=my-lib --first-release\r\n\\`\\`\\`\r\n\r\n## CI\r\n\r\nOn \\`${vars.defaultBase}\\` (non-PR builds), CI runs \\`nx release version --yes\\`\r\nthen publishes affected publishable projects to ${registryLabel}. See the publish\r\nstep (\\`04-publish-libs\\`, or the GitHub Actions \\`publish\\` job).\r\n`\r\n}\r\n\r\nfunction codeWorkspace (vars: MonorepoVars): string {\r\n return toJson({\r\n folders: [{ path: '.', name: vars.displayName }],\r\n settings: {\r\n 'eslint.useFlatConfig': true,\r\n 'eslint.validate': ['javascript', 'typescript', 'typescriptreact', 'json', 'jsonc', 'json5', 'yaml', 'markdown'],\r\n 'files.exclude': {\r\n '**/.nx': true,\r\n '**/node_modules': true,\r\n '**/coverage': true,\r\n '**/.azurite': true,\r\n tmp: true,\r\n },\r\n 'typescript.tsdk': 'node_modules/typescript/lib',\r\n 'jest.runMode': 'on-demand',\r\n },\r\n extensions: {\r\n recommendations: [\r\n 'dbaeumer.vscode-eslint',\r\n 'orta.vscode-jest',\r\n 'ms-azuretools.vscode-azurefunctions',\r\n 'ms-edgedevtools.vscode-edge-devtools',\r\n ],\r\n },\r\n // NOTE: launch/tasks are TOP-LEVEL workspace keys (NOT under settings) so VSCode surfaces them.\r\n launch: {\r\n version: '0.2.0',\r\n configurations: [\r\n // --- breakpoint-capable debug configs ---\r\n {\r\n name: 'Debug Jest (current file)',\r\n type: 'node',\r\n request: 'launch',\r\n program: '${workspaceFolder}/node_modules/jest/bin/jest.js',\r\n args: ['--runInBand', '--watchAll=false', '--runTestsByPath', '${relativeFile}'],\r\n cwd: '${workspaceFolder}',\r\n console: 'integratedTerminal',\r\n internalConsoleOptions: 'neverOpen',\r\n disableOptimisticBPs: true,\r\n resolveSourceMapLocations: null,\r\n sourceMaps: true,\r\n },\r\n {\r\n name: 'Debug Jest (all)',\r\n type: 'node',\r\n request: 'launch',\r\n program: '${workspaceFolder}/node_modules/jest/bin/jest.js',\r\n args: ['--runInBand', '--watchAll=false'],\r\n cwd: '${workspaceFolder}',\r\n console: 'integratedTerminal',\r\n internalConsoleOptions: 'neverOpen',\r\n disableOptimisticBPs: true,\r\n resolveSourceMapLocations: null,\r\n sourceMaps: true,\r\n },\r\n {\r\n // Function App: run `func start` (inspects via local.settings.json), then attach.\r\n // Node app: run `node --inspect=9229 dist/index.js` (after build), then attach;\r\n // or run `npm run dev -w <app>` in a JavaScript Debug Terminal for source-level tsx.\r\n name: 'Debug Function/Node App (attach :9229)',\r\n type: 'node',\r\n request: 'attach',\r\n port: 9229,\r\n restart: true,\r\n sourceMaps: true,\r\n resolveSourceMapLocations: null,\r\n outFiles: ['${workspaceFolder}/apps/*/dist/**/*.js'],\r\n skipFiles: ['<node_internals>/**'],\r\n },\r\n {\r\n // Start the dev server first (`npm run dev -w <app>`), then launch the browser.\r\n // Or use the JavaScript Debug Terminal: run `npm run dev -w <app>` there.\r\n name: 'Debug React/Vue/Svelte (Edge)',\r\n type: 'msedge',\r\n request: 'launch',\r\n url: 'http://localhost:5173',\r\n webRoot: '${workspaceFolder}',\r\n sourceMaps: true,\r\n resolveSourceMapLocations: null,\r\n },\r\n {\r\n // Next.js dev server runs on :3000. For server-side breakpoints, run\r\n // `npm run dev -w <app>` in a JavaScript Debug Terminal instead.\r\n name: 'Debug Next.js (Edge)',\r\n type: 'msedge',\r\n request: 'launch',\r\n url: 'http://localhost:3000',\r\n webRoot: '${workspaceFolder}',\r\n sourceMaps: true,\r\n resolveSourceMapLocations: null,\r\n },\r\n // --- convenience run configs (no breakpoints; quick npm scripts) ---\r\n { name: 'Run: build (all)', type: 'node-terminal', request: 'launch', command: 'npm run build' },\r\n { name: 'Run: build (affected)', type: 'node-terminal', request: 'launch', command: 'npm run build:affected' },\r\n { name: 'Run: test (all)', type: 'node-terminal', request: 'launch', command: 'npm run test' },\r\n { name: 'Run: lint (all)', type: 'node-terminal', request: 'launch', command: 'npm run lint' },\r\n { name: 'Run: docs (all)', type: 'node-terminal', request: 'launch', command: 'npm run doc' },\r\n { name: 'Run: graph', type: 'node-terminal', request: 'launch', command: 'npm run graph' },\r\n ],\r\n },\r\n tasks: {\r\n version: '2.0.0',\r\n tasks: [\r\n { label: 'build all', type: 'shell', command: 'npm run build', problemMatcher: ['$tsc'] },\r\n { label: 'test all', type: 'shell', command: 'npm run test', problemMatcher: [] },\r\n { label: 'lint all', type: 'shell', command: 'npm run lint', problemMatcher: [] },\r\n ],\r\n },\r\n })\r\n}\r\n\r\n/**\r\n * Vendored CI: the shared `.build-templates` engine (always) plus the workflow\r\n * wrapper(s) for the selected provider(s) — Azure Pipelines and/or GitHub Actions.\r\n */\r\nfunction pipelineFiles (vars: MonorepoVars): FileSpec[] {\r\n const files: FileSpec[] = Array.from(listAssetFiles('build-templates'), relativePath => ({\r\n path: `.build-templates/${relativePath}`,\r\n content: readAsset(`build-templates/${relativePath}`),\r\n ownership: 'tool-owned',\r\n }))\r\n\r\n if (vars.ci === 'azure' || vars.ci === 'both') {\r\n files.push({ path: 'azure-pipelines.yml', content: readAsset('azure-pipelines.yml'), ownership: 'tool-owned' })\r\n }\r\n\r\n if (vars.ci === 'github' || vars.ci === 'both') {\r\n files.push({ path: '.github/workflows/ci.yml', content: readAsset('github/workflows/ci.yml'), ownership: 'tool-owned' })\r\n }\r\n\r\n return files\r\n}\r\n\r\n/**\r\n * Returns every root-level file for a fresh monorepo.\r\n *\r\n * @remarks\r\n * Generates both `tool-owned` config and `scaffold` source files.\r\n *\r\n * @param vars - The monorepo's template inputs.\r\n * @returns The full set of file specs for the monorepo root.\r\n * @throws Never - performs no I/O; callers (e.g. {@link applyFiles}) handle writes.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport function monorepoFiles (vars: MonorepoVars): FileSpec[] {\r\n const toolOwned = (path: string, content: string): FileSpec => ({ path, content, ownership: 'tool-owned' })\r\n const scaffold = (path: string, content: string): FileSpec => ({ path, content, ownership: 'scaffold' })\r\n\r\n return [\r\n scaffold('package.json', packageJson(vars)),\r\n toolOwned('nx.json', nxJson(vars)),\r\n toolOwned('tsconfig.base.json', tsconfigBase()),\r\n toolOwned('tsconfig.jest.json', tsconfigJest()),\r\n toolOwned('jest.config.mjs', jestConfigMjs),\r\n toolOwned('jest.preset.mjs', jestPresetMjs),\r\n toolOwned('jest.setup.mjs', jestSetupMjs),\r\n toolOwned('jest.clear.mjs', jestClearMjs),\r\n toolOwned('eslint.config.mjs', readAsset('eslint.config.mjs')),\r\n toolOwned('typedoc.json', typedocJson()),\r\n scaffold('.npmrc', npmrc(vars)),\r\n toolOwned('.editorconfig', editorconfig),\r\n scaffold('.gitignore', gitignore),\r\n toolOwned('commitlint.config.mjs', commitlintConfigMjs),\r\n scaffold('.husky/commit-msg', huskyCommitMessage),\r\n scaffold('README.md', readme(vars)),\r\n scaffold('docs/nx-release.md', nxReleaseDocument(vars)),\r\n toolOwned(`${vars.displayName}.code-workspace`, codeWorkspace(vars)),\r\n ...pipelineFiles(vars),\r\n // Keep apps/ and libs/ present even before any project is added.\r\n scaffold('apps/.gitkeep', ''),\r\n scaffold('libs/.gitkeep', ''),\r\n ]\r\n}\r\n","import { isManagedRepo, loadConfig, saveConfig } from '../engine/config'\r\nimport { TEMPLATE_VERSION } from '../engine/constants'\r\nimport { discoverProjects } from '../engine/projects'\r\nimport { syncToolOwned } from '../engine/sync'\r\nimport type { FileSpec, MonorepoVars } from '../engine/types'\r\nimport { projectFiles } from '../generators/scaffold'\r\nimport { monorepoFiles } from '../templates/monorepo'\r\nimport { logger } from '../util/logger'\r\n\r\n/**\r\n * Options accepted by {@link runDoctor}.\r\n *\r\n * @remarks\r\n * Mirrors the CLI's `--fix` flag.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface DoctorOptions {\r\n apply: boolean\r\n}\r\n\r\n/**\r\n * Detects and (optionally) repairs configuration drift.\r\n *\r\n * @remarks\r\n * Re-derives the canonical `tool-owned` files for the monorepo and every project\r\n * it discovers, then compares them to disk. `scaffold` files (package.json, src,\r\n * .env, …) are never touched.\r\n *\r\n * @param options - Whether to apply fixes (`apply: true`) or only report drift.\r\n * @returns A promise that resolves once the report has been logged (and, when\r\n * applying, the repo's tool-owned files repaired).\r\n * @throws Propagates errors from the underlying file or config operations; the\r\n * CLI entry point in `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runDoctor (options: DoctorOptions): Promise<void> {\r\n const repoRoot = process.cwd()\r\n\r\n if (!isManagedRepo(repoRoot)) {\r\n logger.error('No .monecromanci.json found here. Run `doctor` from a MoNecromanCI monorepo root.')\r\n return\r\n }\r\n\r\n const config = loadConfig(repoRoot)\r\n if (!config) {\r\n logger.error('Could not read .monecromanci.json.')\r\n return\r\n }\r\n\r\n const vars: MonorepoVars = {\r\n workspaceName: config.workspaceName,\r\n displayName: config.displayName,\r\n scope: config.scope,\r\n defaultBase: config.defaultBase,\r\n nodeVersion: config.nodeVersion,\r\n ci: config.ci,\r\n registry: config.registry,\r\n }\r\n\r\n const specs: FileSpec[] = [...monorepoFiles(vars)]\r\n for (const project of discoverProjects(repoRoot, config)) {\r\n specs.push(...projectFiles(project.kind, project))\r\n }\r\n\r\n const report = syncToolOwned(repoRoot, specs, options.apply)\r\n\r\n for (const path of report.missing) {\r\n logger.warn(`missing: ${path}`)\r\n }\r\n for (const path of report.drift) {\r\n logger.warn(`drift: ${path}`)\r\n }\r\n for (const path of report.fixed) {\r\n logger.success(`fixed: ${path}`)\r\n }\r\n\r\n const issues = report.missing.length + report.drift.length\r\n\r\n if (issues === 0) {\r\n logger.success(`Everything is in sync (${report.ok.length} tool-owned files checked).`)\r\n return\r\n }\r\n\r\n if (!options.apply) {\r\n logger.info(`${issues} issue(s) found. Re-run with --fix to repair (scaffold files are left untouched).`)\r\n return\r\n }\r\n\r\n saveConfig(repoRoot, { ...config, templateVersion: TEMPLATE_VERSION })\r\n logger.success(`Repaired ${report.fixed.length} file(s); stamped template version ${TEMPLATE_VERSION}.`)\r\n}\r\n","import { join, resolve } from 'node:path'\r\nimport { applyFiles, reportApply } from '../engine/apply'\r\nimport { configFromVars, saveConfig } from '../engine/config'\r\nimport { DEFAULT_BASE, DEFAULT_NODE_VERSION } from '../engine/constants'\r\nimport { fileExists } from '../engine/fsx'\r\nimport type { CiProvider, MonorepoVars, RegistryConfig } from '../engine/types'\r\nimport { monorepoFiles } from '../templates/monorepo'\r\nimport { logger } from '../util/logger'\r\nimport { confirm, promptText, select } from '../util/prompts'\r\nimport { toSlug } from '../util/strings'\r\nimport { generateProject } from './scaffold'\r\n\r\n/**\r\n * Options accepted by {@link runNew}.\r\n *\r\n * @remarks\r\n * Each field mirrors a CLI flag; omitted fields are prompted for unless `yes`\r\n * is set.\r\n *\r\n * @typeParam None - this interface has no generic type parameters.\r\n */\r\nexport interface NewOptions {\r\n name?: string\r\n scope?: string\r\n ci?: CiProvider\r\n registry?: RegistryConfig['kind']\r\n /** GitHub owner (org or user) for the `github-packages` registry. */\r\n owner?: string\r\n organization?: string\r\n project?: string\r\n feed?: string\r\n base?: string\r\n /** Initial internal library name; empty string skips it. */\r\n lib?: string\r\n /** Non-interactive: accept provided values and defaults without prompting. */\r\n yes?: boolean\r\n}\r\n\r\n/**\r\n * Interactive (or `--yes` non-interactive) `monecromanci new`: scaffold a monorepo.\r\n *\r\n * @remarks\r\n * Prompts for any value not supplied via `options` (unless `yes` is set):\r\n * name, CI provider, package registry (+ its fields), npm scope and base branch.\r\n * Then writes the monorepo template files and, optionally, an initial library.\r\n *\r\n * @param options - Monorepo inputs supplied on the command line, if any.\r\n * @returns A promise that resolves once the monorepo has been scaffolded.\r\n * @throws Propagates errors from the underlying file or config operations; the\r\n * CLI entry point in `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runNew (options: NewOptions): Promise<void> {\r\n const yes = options.yes ?? false\r\n const ask = async (message: string, fallback: string, provided?: string): Promise<string> =>\r\n provided ?? (yes ? fallback : await promptText(message, fallback))\r\n const askChoice = async <T extends string>(message: string, choices: Array<{ name: string, value: T }>, fallback: T, provided?: T): Promise<T> =>\r\n provided ?? (yes ? fallback : await select<T>({ message, choices }))\r\n\r\n const displayName = await ask('Monorepo name', 'My Monorepo', options.name)\r\n const workspaceName = toSlug(displayName)\r\n\r\n const ci = await askChoice<CiProvider>('CI provider', [\r\n { name: 'Azure DevOps Pipelines', value: 'azure' },\r\n { name: 'GitHub Actions', value: 'github' },\r\n { name: 'Both', value: 'both' },\r\n ], 'azure', options.ci)\r\n\r\n const registry = await resolveRegistry(ci, options, ask, askChoice)\r\n\r\n const defaultScope = registry.kind === 'github-packages' ? `@${registry.owner}` : '@auto'\r\n const scopeInput = await ask('npm scope', defaultScope, options.scope)\r\n const scope = scopeInput.startsWith('@') ? scopeInput : `@${scopeInput}`\r\n const defaultBase = await ask('Default git branch', DEFAULT_BASE, options.base)\r\n\r\n const targetDirectory = resolve(process.cwd(), workspaceName)\r\n if (fileExists(join(targetDirectory, 'package.json')) && !yes) {\r\n const overwrite = await confirm({ message: `${targetDirectory} already contains a package.json. Continue and overwrite tool-owned files?`, default: false })\r\n if (!overwrite) {\r\n logger.warn('Aborted.')\r\n return\r\n }\r\n }\r\n\r\n const vars: MonorepoVars = {\r\n workspaceName,\r\n displayName,\r\n scope,\r\n defaultBase,\r\n nodeVersion: DEFAULT_NODE_VERSION,\r\n ci,\r\n registry,\r\n }\r\n\r\n logger.step(`Creating monorepo in ${targetDirectory}`)\r\n reportApply(applyFiles(targetDirectory, monorepoFiles(vars)))\r\n saveConfig(targetDirectory, configFromVars(vars))\r\n\r\n const libName = await resolveInitialLib(options.lib, yes)\r\n if (libName) {\r\n generateProject(targetDirectory, 'internal-lib', libName, configFromVars(vars))\r\n }\r\n\r\n logger.success('Done. Next steps:')\r\n logger.info(` cd ${workspaceName}`)\r\n logger.info(' npm install')\r\n logger.info(` code \"${displayName}.code-workspace\"`)\r\n}\r\n\r\ntype AskText = (message: string, fallback: string, provided?: string) => Promise<string>\r\ntype AskChoice = <T extends string>(message: string, choices: Array<{ name: string, value: T }>, fallback: T, provided?: T) => Promise<T>\r\n\r\n/** Resolves the registry config from flags/prompts (default keyed off the CI provider). */\r\nasync function resolveRegistry (ci: CiProvider, options: NewOptions, ask: AskText, askChoice: AskChoice): Promise<RegistryConfig> {\r\n const fallbackKind: RegistryConfig['kind'] = ci === 'github' ? 'github-packages' : 'azure-artifacts'\r\n const kind = await askChoice<RegistryConfig['kind']>('Package registry', [\r\n { name: 'Azure Artifacts', value: 'azure-artifacts' },\r\n { name: 'GitHub Packages', value: 'github-packages' },\r\n { name: 'Public npm', value: 'npm' },\r\n ], fallbackKind, options.registry)\r\n\r\n if (kind === 'azure-artifacts') {\r\n const organization = await ask('Azure DevOps organization', 'my-org', options.organization)\r\n const project = await ask('Azure DevOps project', 'Automation', options.project)\r\n const artifactsFeed = await ask('Azure Artifacts feed', 'AUTO', options.feed)\r\n return { kind, organization, project, artifactsFeed }\r\n }\r\n\r\n if (kind === 'github-packages') {\r\n const owner = await ask('GitHub owner (org or user)', 'my-org', options.owner)\r\n return { kind, owner }\r\n }\r\n\r\n return { kind: 'npm' }\r\n}\r\n\r\n/** Resolves the initial library name from flags/prompts (undefined = skip). */\r\nasync function resolveInitialLib (provided: string | undefined, shouldAcceptDefaults: boolean): Promise<string | undefined> {\r\n if (provided !== undefined) {\r\n return provided === '' ? undefined : toSlug(provided)\r\n }\r\n if (shouldAcceptDefaults) {\r\n return 'helpers'\r\n }\r\n\r\n const addLib = await confirm({ message: 'Add an initial internal library now?', default: true })\r\n return addLib ? toSlug(await promptText('Library name', 'helpers')) : undefined\r\n}\r\n","import { runDoctor } from './doctor'\r\n\r\n/**\r\n * Re-syncs tool-owned files to the latest templates (doctor with --fix).\r\n *\r\n * @remarks\r\n * Thin wrapper around {@link runDoctor} that always applies fixes.\r\n *\r\n * @param None - this function takes no parameters.\r\n * @returns A promise that resolves once the repo's tool-owned files have been\r\n * repaired and the report logged.\r\n * @throws Propagates errors from {@link runDoctor}; the CLI entry point in\r\n * `cli.ts` catches and reports them.\r\n * @typeParam None - this function has no generic type parameters.\r\n */\r\nexport async function runUpdate (): Promise<void> {\r\n await runDoctor({ apply: true })\r\n}\r\n","import { spawnSync } from 'node:child_process'\n\n/**\n * Runs a command synchronously, inheriting stdio so its output streams live.\n *\n * @remarks\n * Used by the `validate`/`ritual` command to shell out to the repo's local Nx.\n * `shell: true` lets Windows resolve `npx` (a `.cmd` shim) without an explicit\n * extension. The command and arguments are joined into one line rather than\n * passed as an args array (which, combined with `shell: true`, triggers Node's\n * DEP0190); our argument tokens contain no spaces or shell metacharacters.\n *\n * @param command - The executable to run (e.g. `npx`).\n * @param arguments_ - The arguments passed to the executable.\n * @param cwd - The working directory to run the command in.\n * @returns The child process exit status (`0` on success); `1` when the process\n * was terminated by a signal or never produced a status (e.g. spawn failure).\n * @throws Never - spawn failures surface through the returned status, not a throw.\n * @typeParam None - this function has no generic type parameters.\n */\nexport function runShell (command: string, arguments_: string[], cwd: string): number {\n const line = [command, ...arguments_].join(' ')\n const result = spawnSync(line, { stdio: 'inherit', shell: true, cwd })\n return result.status ?? 1\n}\n","import { isManagedRepo } from '../engine/config'\nimport { runShell } from '../util/exec'\nimport { logger } from '../util/logger'\n\n/**\n * Options accepted by {@link runValidate}.\n *\n * @remarks\n * Mirrors the CLI's `--all` flag.\n *\n * @typeParam None - this interface has no generic type parameters.\n */\nexport interface ValidateOptions {\n all: boolean\n}\n\n/**\n * Runs lint/test/build locally so failures surface before reaching CI.\n *\n * @remarks\n * Delegates to the repo's own Nx: `nx affected` by default (only projects touched\n * since the base branch) or `nx run-many` with `--all`. Targets a project does not\n * define are skipped by Nx, so mixed project kinds are safe. The child's exit\n * status is propagated through `process.exitCode`.\n *\n * @param options - Whether to validate every project (`all: true`) or only affected.\n * @returns A promise that resolves once the Nx run has completed.\n * @throws Never - the child exit status is surfaced via `process.exitCode`, not a throw.\n * @typeParam None - this function has no generic type parameters.\n */\nexport async function runValidate (options: ValidateOptions): Promise<void> {\n const repoRoot = process.cwd()\n\n if (!isManagedRepo(repoRoot)) {\n logger.error('No .monecromanci.json found here. Run `validate` from a MoNecromanCI monorepo root.')\n return\n }\n\n const arguments_ = ['nx', options.all ? 'run-many' : 'affected', '-t', 'lint', 'test', 'build']\n\n logger.info(`Running: npx ${arguments_.join(' ')}`)\n const status = runShell('npx', arguments_, repoRoot)\n\n if (status === 0) {\n logger.success('Validation passed.')\n return\n }\n\n logger.error(`Validation failed (exit ${status}).`)\n process.exitCode = status\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_node_path","import_node_fs","import_prompts","value","input","import_node_path","import_node_path","import_node_fs","import_node_path","appPackageJson","appProjectJson","appTsconfig","appTypedoc","greetingTs","greetingTestTs","indexTs","appPackageJson","appProjectJson","appTsconfig","appTypedoc","greetingTs","greetingTestTs","envFile","appPackageJson","appProjectJson","appTsconfig","appTsconfigApp","appTypedoc","indexTs","greeterTs","greeterTestTs","packageJson","appPackageJson","appProjectJson","appTsconfig","indexHtml","envFile","import_node_fs","import_node_path","projectJson","packageJson","import_node_path","jestConfigMjs","import_node_path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monecromanci",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "MoNecromanCI — interactive CLI to summon, conjure, raise and validate NX monorepos (Azure DevOps & GitHub Actions): function/node apps, React/Vue/Svelte/Next.js apps, internal/publishable libs, CLI tools.",
5
5
  "bin": {
6
6
  "monecromanci": "./dist/cli.js",
@@ -13,6 +13,7 @@
13
13
  "node": "^22.13.0 || >=24"
14
14
  },
15
15
  "scripts": {
16
+ "prepack": "npm run build",
16
17
  "build": "tsup && node scripts/copyAssets.mjs",
17
18
  "dev": "tsup --watch",
18
19
  "lint": "eslint .",