@fgv/repo-template 5.1.0-27 → 5.1.0-28
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/eslint.config.js +16 -0
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +1 -3
- package/lib/cli.js.map +1 -1
- package/lib/commands/create.d.ts.map +1 -1
- package/lib/commands/create.js +0 -1
- package/lib/commands/create.js.map +1 -1
- package/lib/commands/init-library.d.ts +3 -3
- package/lib/commands/init-library.d.ts.map +1 -1
- package/lib/commands/init-library.js +7 -7
- package/lib/commands/init-library.js.map +1 -1
- package/lib/commands/link.d.ts +12 -0
- package/lib/commands/link.d.ts.map +1 -1
- package/lib/commands/link.js +6 -6
- package/lib/commands/link.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packlets/fs/index.d.ts.map +1 -1
- package/lib/packlets/fs/index.js +9 -1
- package/lib/packlets/fs/index.js.map +1 -1
- package/lib/packlets/jsonc/index.d.ts.map +1 -1
- package/lib/packlets/jsonc/index.js +1 -0
- package/lib/packlets/jsonc/index.js.map +1 -1
- package/lib/packlets/template/index.d.ts.map +1 -1
- package/lib/packlets/template/index.js +1 -0
- package/lib/packlets/template/index.js.map +1 -1
- package/package.json +3 -2
package/eslint.config.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// ESLint 9 flat config
|
|
2
|
+
const nodeProfile = require('@rushstack/eslint-config/flat/profile/node');
|
|
3
|
+
const packletsPlugin = require('@rushstack/eslint-config/flat/mixins/packlets');
|
|
4
|
+
const tsdocPlugin = require('@rushstack/eslint-config/flat/mixins/tsdoc');
|
|
5
|
+
|
|
6
|
+
module.exports = [
|
|
7
|
+
...nodeProfile,
|
|
8
|
+
packletsPlugin,
|
|
9
|
+
...tsdocPlugin,
|
|
10
|
+
{
|
|
11
|
+
// Override specific rules if needed
|
|
12
|
+
rules: {
|
|
13
|
+
'@rushstack/packlets/mechanics': 'warn'
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
];
|
package/lib/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;;IAOtB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;;IAOtB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,cAAc;IAsJtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAW1B"}
|
package/lib/cli.js
CHANGED
|
@@ -134,9 +134,7 @@ class RepoTemplateCli {
|
|
|
134
134
|
.description('Apply targeted edits to a JSONC config file while preserving comments')
|
|
135
135
|
.allowUnknownOption(true)
|
|
136
136
|
.helpOption(false)
|
|
137
|
-
.action(async (file,
|
|
138
|
-
// Parse the raw args after the file argument as patch operations
|
|
139
|
-
const rawArgs = cmd.args.slice(1); // skip the file arg
|
|
137
|
+
.action(async (file, __opts, cmd) => {
|
|
140
138
|
// Actually, commander passes remaining args differently. Let's get them from process.argv
|
|
141
139
|
const allArgs = process.argv;
|
|
142
140
|
const patchIdx = allArgs.indexOf('patch');
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CLI entry point — sets up commander with create, sync, and patch subcommands.\n */\n\nimport { Command } from 'commander';\nimport { detectSourceDir } from './packlets/fs';\nimport { runCreate } from './commands/create';\nimport { runSync } from './commands/sync';\nimport { runPatch, parsePatchArgs } from './commands/patch';\nimport {\n runInitLibrary,\n resolveFgvDepVersion,\n RigType,\n CategoryType,\n DepChannelType\n} from './commands/init-library';\nimport { runLink, runUnlink, runUpdateFgvVersions } from './commands/link';\n\nexport class RepoTemplateCli {\n private readonly _program: Command;\n\n public constructor() {\n this._program = new Command();\n this._setupCommands();\n }\n\n public async run(argv: string[]): Promise<void> {\n await this._program.parseAsync(argv);\n }\n\n private _setupCommands(): void {\n this._program\n .name('repo-template')\n .description('Create and maintain fgv-derived Rush monorepos')\n .version('5.1.0');\n\n // ── create ──\n this._program\n .command('create')\n .description('Stamp out a new fgv-derived Rush monorepo using rush init + JSONC patching')\n .requiredOption('-t, --target-dir <path>', 'Directory to create the new repo in')\n .requiredOption('-u, --repo-url <url>', 'GitHub repository URL')\n .option('-p, --version-policy <name>', 'Version policy name', 'default')\n .option('--initial-version <ver>', 'Initial version', '0.1.0')\n .option('-s, --source-dir <path>', 'Source repo for shared files (auto-detected if in fgv repo)')\n .option('--allow-existing', 'Allow target directory to already exist', false)\n .option('--no-git-init', 'Skip git init and initial commit')\n .action(async (opts) => {\n const sourceDir = opts.sourceDir ?? this._resolveSourceDir();\n await runCreate({\n targetDir: opts.targetDir,\n repoUrl: opts.repoUrl,\n versionPolicy: opts.versionPolicy,\n version: opts.initialVersion,\n sourceDir,\n allowExisting: opts.allowExisting,\n gitInit: opts.gitInit\n });\n });\n\n // ── sync ──\n this._program\n .command('sync')\n .description('Sync shared files from the fgv source repo to a consumer repo')\n .requiredOption('-t, --target-dir <path>', 'Consumer repo to update')\n .option('-s, --source-dir <path>', 'Source repo (auto-detected if in fgv repo)')\n .option('-n, --dry-run', 'Show what would change without modifying files', false)\n .action(async (opts) => {\n const sourceDir = opts.sourceDir ?? this._resolveSourceDir();\n await runSync({\n targetDir: opts.targetDir,\n sourceDir,\n dryRun: opts.dryRun\n });\n });\n\n // ── init-library ──\n this._program\n .command('init-library')\n .description('Scaffold a new library package within an existing Rush monorepo')\n .requiredOption('-n, --name <name>', 'Package name (e.g. \"ts-my-lib\" — auto-prefixed with @fgv/)')\n .option('-d, --description <text>', 'Package description', '')\n .option('-r, --rig <type>', 'Heft rig: dual (default), node, or browser', 'dual')\n .option(\n '-c, --category <type>',\n 'Category folder: libraries (default), tools, apps, services',\n 'libraries'\n )\n .option('--repo-dir <path>', 'Rush monorepo root (default: cwd)', process.cwd())\n .option('-p, --version-policy <name>', 'Version policy name', 'default')\n .option('--initial-version <ver>', 'Initial version', '0.1.0')\n .option(\n '--fgv-dep-version <ver>',\n 'Explicit version spec for @fgv/* deps (auto-detected if omitted: \"workspace:*\" in fgv, derived from repo-template version in consumers)'\n )\n .option(\n '--fgv-dep-channel <channel>',\n 'Channel for auto-detected @fgv/* dep version: alpha, release, or auto (default: auto — infers from repo-template build)',\n 'auto'\n )\n .action(async (opts) => {\n const repoDir = opts.repoDir as string;\n const fgvDepVersion =\n opts.fgvDepVersion ?? resolveFgvDepVersion(repoDir, opts.fgvDepChannel as DepChannelType);\n await runInitLibrary({\n name: opts.name,\n description: opts.description,\n rig: opts.rig as RigType,\n category: opts.category as CategoryType,\n repoDir,\n versionPolicy: opts.versionPolicy,\n version: opts.initialVersion,\n fgvDepVersion\n });\n });\n\n // ── link ──\n this._program\n .command('link')\n .description('Link to a local fgv worktree for cross-repo development')\n .requiredOption('--fgv-dir <path>', 'Path to the local fgv worktree')\n .option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())\n .action(async (opts) => {\n await runLink({\n fgvDir: opts.fgvDir,\n repoDir: opts.repoDir\n });\n });\n\n // ── unlink ──\n this._program\n .command('unlink')\n .description('Switch back from local fgv worktree to published npm packages')\n .option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())\n .option('--fgv-version <spec>', 'Also bump @fgv/* deps to this version spec')\n .action(async (opts) => {\n await runUnlink({\n repoDir: opts.repoDir,\n version: opts.fgvVersion\n });\n });\n\n // ── update-fgv-versions ──\n this._program\n .command('update-fgv-versions')\n .description('Bump @fgv/* dependency version specs across all projects')\n .option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())\n .option(\n '--fgv-version <spec>',\n 'Version spec to set (e.g. \"~5.2.0\"). If omitted, queries npm for latest.'\n )\n .action(async (opts) => {\n await runUpdateFgvVersions({\n repoDir: opts.repoDir,\n version: opts.fgvVersion\n });\n });\n\n // ── patch ──\n this._program\n .command('patch <file>')\n .description('Apply targeted edits to a JSONC config file while preserving comments')\n .allowUnknownOption(true)\n .helpOption(false)\n .action(async (file, _opts, cmd) => {\n // Parse the raw args after the file argument as patch operations\n const rawArgs = cmd.args.slice(1); // skip the file arg\n // Actually, commander passes remaining args differently. Let's get them from process.argv\n const allArgs = process.argv;\n const patchIdx = allArgs.indexOf('patch');\n const fileIdx = patchIdx + 1;\n const opArgs = allArgs.slice(fileIdx + 1);\n\n const operations = parsePatchArgs(opArgs);\n if (operations.length === 0) {\n console.error('No operations specified. Use --set, --uncomment, --add-to-array, etc.');\n process.exit(1);\n }\n await runPatch({ file, operations });\n });\n }\n\n /**\n * Auto-detect the fgv source directory by walking up from the current working directory.\n */\n private _resolveSourceDir(): string {\n const detected = detectSourceDir(process.cwd());\n if (!detected) {\n console.error(\n 'ERROR: Could not auto-detect fgv source repo. ' +\n 'Please specify --source-dir or run from within the fgv repository.'\n );\n process.exit(1);\n }\n return detected;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CLI entry point — sets up commander with create, sync, and patch subcommands.\n */\n\nimport { Command } from 'commander';\nimport { detectSourceDir } from './packlets/fs';\nimport { runCreate } from './commands/create';\nimport { runSync } from './commands/sync';\nimport { runPatch, parsePatchArgs } from './commands/patch';\nimport {\n runInitLibrary,\n resolveFgvDepVersion,\n RigType,\n CategoryType,\n DepChannelType\n} from './commands/init-library';\nimport { runLink, runUnlink, runUpdateFgvVersions } from './commands/link';\n\nexport class RepoTemplateCli {\n private readonly _program: Command;\n\n public constructor() {\n this._program = new Command();\n this._setupCommands();\n }\n\n public async run(argv: string[]): Promise<void> {\n await this._program.parseAsync(argv);\n }\n\n private _setupCommands(): void {\n this._program\n .name('repo-template')\n .description('Create and maintain fgv-derived Rush monorepos')\n .version('5.1.0');\n\n // ── create ──\n this._program\n .command('create')\n .description('Stamp out a new fgv-derived Rush monorepo using rush init + JSONC patching')\n .requiredOption('-t, --target-dir <path>', 'Directory to create the new repo in')\n .requiredOption('-u, --repo-url <url>', 'GitHub repository URL')\n .option('-p, --version-policy <name>', 'Version policy name', 'default')\n .option('--initial-version <ver>', 'Initial version', '0.1.0')\n .option('-s, --source-dir <path>', 'Source repo for shared files (auto-detected if in fgv repo)')\n .option('--allow-existing', 'Allow target directory to already exist', false)\n .option('--no-git-init', 'Skip git init and initial commit')\n .action(async (opts) => {\n const sourceDir = opts.sourceDir ?? this._resolveSourceDir();\n await runCreate({\n targetDir: opts.targetDir,\n repoUrl: opts.repoUrl,\n versionPolicy: opts.versionPolicy,\n version: opts.initialVersion,\n sourceDir,\n allowExisting: opts.allowExisting,\n gitInit: opts.gitInit\n });\n });\n\n // ── sync ──\n this._program\n .command('sync')\n .description('Sync shared files from the fgv source repo to a consumer repo')\n .requiredOption('-t, --target-dir <path>', 'Consumer repo to update')\n .option('-s, --source-dir <path>', 'Source repo (auto-detected if in fgv repo)')\n .option('-n, --dry-run', 'Show what would change without modifying files', false)\n .action(async (opts) => {\n const sourceDir = opts.sourceDir ?? this._resolveSourceDir();\n await runSync({\n targetDir: opts.targetDir,\n sourceDir,\n dryRun: opts.dryRun\n });\n });\n\n // ── init-library ──\n this._program\n .command('init-library')\n .description('Scaffold a new library package within an existing Rush monorepo')\n .requiredOption('-n, --name <name>', 'Package name (e.g. \"ts-my-lib\" — auto-prefixed with @fgv/)')\n .option('-d, --description <text>', 'Package description', '')\n .option('-r, --rig <type>', 'Heft rig: dual (default), node, or browser', 'dual')\n .option(\n '-c, --category <type>',\n 'Category folder: libraries (default), tools, apps, services',\n 'libraries'\n )\n .option('--repo-dir <path>', 'Rush monorepo root (default: cwd)', process.cwd())\n .option('-p, --version-policy <name>', 'Version policy name', 'default')\n .option('--initial-version <ver>', 'Initial version', '0.1.0')\n .option(\n '--fgv-dep-version <ver>',\n 'Explicit version spec for @fgv/* deps (auto-detected if omitted: \"workspace:*\" in fgv, derived from repo-template version in consumers)'\n )\n .option(\n '--fgv-dep-channel <channel>',\n 'Channel for auto-detected @fgv/* dep version: alpha, release, or auto (default: auto — infers from repo-template build)',\n 'auto'\n )\n .action(async (opts) => {\n const repoDir = opts.repoDir as string;\n const fgvDepVersion =\n opts.fgvDepVersion ?? resolveFgvDepVersion(repoDir, opts.fgvDepChannel as DepChannelType);\n await runInitLibrary({\n name: opts.name,\n description: opts.description,\n rig: opts.rig as RigType,\n category: opts.category as CategoryType,\n repoDir,\n versionPolicy: opts.versionPolicy,\n version: opts.initialVersion,\n fgvDepVersion\n });\n });\n\n // ── link ──\n this._program\n .command('link')\n .description('Link to a local fgv worktree for cross-repo development')\n .requiredOption('--fgv-dir <path>', 'Path to the local fgv worktree')\n .option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())\n .action(async (opts) => {\n await runLink({\n fgvDir: opts.fgvDir,\n repoDir: opts.repoDir\n });\n });\n\n // ── unlink ──\n this._program\n .command('unlink')\n .description('Switch back from local fgv worktree to published npm packages')\n .option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())\n .option('--fgv-version <spec>', 'Also bump @fgv/* deps to this version spec')\n .action(async (opts) => {\n await runUnlink({\n repoDir: opts.repoDir,\n version: opts.fgvVersion\n });\n });\n\n // ── update-fgv-versions ──\n this._program\n .command('update-fgv-versions')\n .description('Bump @fgv/* dependency version specs across all projects')\n .option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())\n .option(\n '--fgv-version <spec>',\n 'Version spec to set (e.g. \"~5.2.0\"). If omitted, queries npm for latest.'\n )\n .action(async (opts) => {\n await runUpdateFgvVersions({\n repoDir: opts.repoDir,\n version: opts.fgvVersion\n });\n });\n\n // ── patch ──\n this._program\n .command('patch <file>')\n .description('Apply targeted edits to a JSONC config file while preserving comments')\n .allowUnknownOption(true)\n .helpOption(false)\n .action(async (file, __opts, cmd) => {\n // Actually, commander passes remaining args differently. Let's get them from process.argv\n const allArgs = process.argv;\n const patchIdx = allArgs.indexOf('patch');\n const fileIdx = patchIdx + 1;\n const opArgs = allArgs.slice(fileIdx + 1);\n\n const operations = parsePatchArgs(opArgs);\n if (operations.length === 0) {\n console.error('No operations specified. Use --set, --uncomment, --add-to-array, etc.');\n process.exit(1);\n }\n await runPatch({ file, operations });\n });\n }\n\n /**\n * Auto-detect the fgv source directory by walking up from the current working directory.\n */\n private _resolveSourceDir(): string {\n const detected = detectSourceDir(process.cwd());\n if (!detected) {\n console.error(\n 'ERROR: Could not auto-detect fgv source repo. ' +\n 'Please specify --source-dir or run from within the fgv repository.'\n );\n process.exit(1);\n }\n return detected;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyLtE"}
|
package/lib/commands/create.js
CHANGED
|
@@ -58,7 +58,6 @@ async function runCreate(options) {
|
|
|
58
58
|
throw new Error(`Source directory is not a Rush repo: ${sourceDir}`);
|
|
59
59
|
}
|
|
60
60
|
const manifestPath = (0, manifest_1.getDefaultManifestPath)();
|
|
61
|
-
const templatesDir = (0, template_1.getDefaultTemplatesDir)();
|
|
62
61
|
const manifest = (0, manifest_1.loadManifest)(manifestPath);
|
|
63
62
|
console.log(`Creating new monorepo at: ${targetDir}`);
|
|
64
63
|
console.log(` Source repo: ${sourceDir}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Create command — stamps out a new fgv-derived Rush monorepo.\n *\n * Uses `rush init` to generate base config with full documentation,\n * then applies fgv-specific customizations via JSONC patching and shared file sync.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { loadManifest, getDefaultManifestPath } from '../packlets/manifest';\nimport { patchFile, IPatchOperation } from '../packlets/jsonc';\nimport { renderTemplateFile, getDefaultTemplatesDir, ITemplateVars } from '../packlets/template';\nimport { copyFile, copyPackage, exec, getGitCommit, getGitRemoteUrl } from '../packlets/fs';\n\nexport interface ICreateOptions {\n targetDir: string;\n repoUrl: string;\n versionPolicy: string;\n version: string;\n sourceDir: string;\n allowExisting: boolean;\n gitInit: boolean;\n}\n\nconst RUSH_VERSION = '5.175.1';\n\nconst NODE_VERSION_RANGE = '>=22.22.0 <23.0.0 || >=24.15.0 <25.0.0';\n\nexport async function runCreate(options: ICreateOptions): Promise<void> {\n const { targetDir, repoUrl, versionPolicy, version, sourceDir, allowExisting, gitInit } = options;\n\n // Validate\n if (!allowExisting && fs.existsSync(targetDir)) {\n throw new Error(`Target directory already exists: ${targetDir} (use --allow-existing to override)`);\n }\n if (!fs.existsSync(path.join(sourceDir, 'rush.json'))) {\n throw new Error(`Source directory is not a Rush repo: ${sourceDir}`);\n }\n\n const manifestPath = getDefaultManifestPath();\n const templatesDir = getDefaultTemplatesDir();\n const manifest = loadManifest(manifestPath);\n\n console.log(`Creating new monorepo at: ${targetDir}`);\n console.log(` Source repo: ${sourceDir}`);\n console.log(` Repo URL: ${repoUrl}`);\n console.log(` Version: ${versionPolicy}@${version}`);\n console.log('');\n\n fs.mkdirSync(targetDir, { recursive: true });\n\n // ── Step 1: rush init ──\n if (fs.existsSync(path.join(targetDir, 'rush.json'))) {\n console.log('==> Target already has rush.json, skipping rush init');\n } else {\n console.log('==> Running rush init...');\n try {\n const output = exec(`npx \"@microsoft/rush@${RUSH_VERSION}\" init`, { cwd: targetDir });\n for (const line of output.split('\\n')) {\n console.log(` ${line}`);\n }\n } catch (err: unknown) {\n // rush init writes to stderr for some messages, check if rush.json was created\n if (!fs.existsSync(path.join(targetDir, 'rush.json'))) {\n throw new Error(`rush init failed: ${(err as Error).message}`);\n }\n }\n }\n\n // ── Step 2: Patch rush.json ──\n console.log('');\n console.log('==> Patching rush.json with fgv customizations...');\n\n const rushJsonOps: IPatchOperation[] = [\n { type: 'set', path: 'nodeSupportedVersionRange', value: NODE_VERSION_RANGE },\n { type: 'set', path: 'ensureConsistentVersions', value: true },\n { type: 'uncomment', path: 'projectFolderMinDepth' },\n { type: 'set', path: 'projectFolderMinDepth', value: 2 },\n { type: 'uncomment', path: 'projectFolderMaxDepth' },\n { type: 'set', path: 'projectFolderMaxDepth', value: 2 },\n { type: 'uncomment', path: 'url' },\n { type: 'set', path: 'repository.url', value: repoUrl },\n { type: 'uncomment', path: 'defaultBranch' },\n { type: 'uncomment', path: 'defaultRemote' }\n ];\n\n patchFile(path.join(targetDir, 'rush.json'), rushJsonOps);\n for (const op of rushJsonOps) {\n const desc =\n op.type === 'uncomment' || op.type === 'remove'\n ? ` ${op.type}: ${op.path}`\n : ` ${op.type}: ${op.path}`;\n console.log(desc);\n }\n\n // ── Step 3: Patch other rush config files ──\n console.log('');\n console.log('==> Patching rush config files...');\n\n patchFile(path.join(targetDir, 'common/config/rush/build-cache.json'), [\n { type: 'set', path: 'buildCacheEnabled', value: true }\n ]);\n console.log(' build-cache.json: buildCacheEnabled = true');\n\n patchFile(path.join(targetDir, 'common/config/rush/pnpm-config.json'), [\n { type: 'uncomment', path: 'strictPeerDependencies' },\n { type: 'set', path: 'strictPeerDependencies', value: true }\n ]);\n console.log(' pnpm-config.json: strictPeerDependencies = true');\n\n // ── Step 4: Generate templated files ──\n console.log('');\n console.log('==> Generating templated config files...');\n\n const templateVars: ITemplateVars = {\n REPO_URL: repoUrl,\n VERSION_POLICY_NAME: versionPolicy,\n VERSION: version\n };\n\n for (const tmpl of manifest.templated.files) {\n const templatePath = path.join(sourceDir, tmpl.template);\n const destPath = path.join(targetDir, tmpl.destination);\n renderTemplateFile(templatePath, destPath, templateVars);\n }\n\n // ── Step 5: Copy shared files ──\n console.log('');\n console.log('==> Copying shared files...');\n\n for (const file of manifest.shared.files) {\n const srcPath = path.join(sourceDir, file.source);\n const destPath = path.join(targetDir, file.destination);\n if (!fs.existsSync(srcPath)) {\n console.warn(` WARNING: Source file not found, skipping: ${file.source}`);\n continue;\n }\n copyFile(srcPath, destPath);\n console.log(` Copied: ${file.destination}`);\n }\n\n for (const pkg of manifest.sharedPackages.packages) {\n const srcPath = path.join(sourceDir, pkg.source);\n const destPath = path.join(targetDir, pkg.destination);\n if (!fs.existsSync(srcPath)) {\n console.warn(` WARNING: Source directory not found, skipping: ${pkg.source}`);\n continue;\n }\n copyPackage(srcPath, destPath);\n console.log(` Copied package: ${pkg.destination}`);\n }\n\n // ── Step 6: Create standard directories ──\n console.log('');\n console.log('==> Creating directory structure...');\n\n const dirs = ['libraries', 'tools', 'apps', 'services', '.claude/project', '.claude/skills'];\n for (const dir of dirs) {\n fs.mkdirSync(path.join(targetDir, dir), { recursive: true });\n }\n\n const gitkeeps = ['.claude/project/.gitkeep', '.claude/skills/.gitkeep'];\n for (const gk of gitkeeps) {\n fs.writeFileSync(path.join(targetDir, gk), '');\n }\n console.log(' Created standard directory structure');\n\n // ── Step 7: Record template metadata ──\n console.log('');\n console.log('==> Recording template metadata...');\n\n const sourceCommit = getGitCommit(sourceDir);\n const sourceRepo = getGitRemoteUrl(sourceDir);\n\n const syncMetadata = {\n templateSource: repoUrl,\n sourceRepo,\n sourceCommit,\n createdAt: new Date().toISOString(),\n lastSyncedAt: new Date().toISOString(),\n manifestVersion: '1.0.0'\n };\n fs.writeFileSync(path.join(targetDir, '.template-sync'), JSON.stringify(syncMetadata, null, 2) + '\\n');\n console.log(' Created .template-sync');\n\n // ── Step 8: Git init ──\n if (gitInit) {\n console.log('');\n console.log('==> Initializing git repository...');\n try {\n exec('git init -b main', { cwd: targetDir });\n exec('git add -A', { cwd: targetDir });\n exec(\n `git commit -m \"Initial commit from fgv monorepo template\\n\\nSource: ${sourceDir}\\nTemplate commit: ${sourceCommit}\"`,\n { cwd: targetDir }\n );\n console.log(' Git repository initialized with initial commit');\n } catch (err: unknown) {\n console.warn(` WARNING: Git init failed: ${(err as Error).message}`);\n }\n }\n\n // ── Done ──\n console.log('');\n console.log(`=== Monorepo created successfully at: ${targetDir} ===`);\n console.log('');\n console.log('Next steps:');\n console.log(' 1. Add your domain packages to libraries/, apps/, tools/, services/');\n console.log(' 2. Register them in rush.json');\n console.log(' 3. Fill in the project table in CLAUDE.md');\n console.log(' 4. Fill in ACTIVE_DEVELOPMENT.md with your domain projects');\n console.log(' 5. Add domain-specific Rush commands to common/config/rush/command-line.json');\n console.log(` 6. Run: cd ${targetDir} && rush install && rush build`);\n console.log('');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Create command — stamps out a new fgv-derived Rush monorepo.\n *\n * Uses `rush init` to generate base config with full documentation,\n * then applies fgv-specific customizations via JSONC patching and shared file sync.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { loadManifest, getDefaultManifestPath } from '../packlets/manifest';\nimport { patchFile, IPatchOperation } from '../packlets/jsonc';\nimport { renderTemplateFile, ITemplateVars } from '../packlets/template';\nimport { copyFile, copyPackage, exec, getGitCommit, getGitRemoteUrl } from '../packlets/fs';\n\nexport interface ICreateOptions {\n targetDir: string;\n repoUrl: string;\n versionPolicy: string;\n version: string;\n sourceDir: string;\n allowExisting: boolean;\n gitInit: boolean;\n}\n\nconst RUSH_VERSION: string = '5.175.1';\n\nconst NODE_VERSION_RANGE: string = '>=22.22.0 <23.0.0 || >=24.15.0 <25.0.0';\n\nexport async function runCreate(options: ICreateOptions): Promise<void> {\n const { targetDir, repoUrl, versionPolicy, version, sourceDir, allowExisting, gitInit } = options;\n\n // Validate\n if (!allowExisting && fs.existsSync(targetDir)) {\n throw new Error(`Target directory already exists: ${targetDir} (use --allow-existing to override)`);\n }\n if (!fs.existsSync(path.join(sourceDir, 'rush.json'))) {\n throw new Error(`Source directory is not a Rush repo: ${sourceDir}`);\n }\n\n const manifestPath = getDefaultManifestPath();\n const manifest = loadManifest(manifestPath);\n\n console.log(`Creating new monorepo at: ${targetDir}`);\n console.log(` Source repo: ${sourceDir}`);\n console.log(` Repo URL: ${repoUrl}`);\n console.log(` Version: ${versionPolicy}@${version}`);\n console.log('');\n\n fs.mkdirSync(targetDir, { recursive: true });\n\n // ── Step 1: rush init ──\n if (fs.existsSync(path.join(targetDir, 'rush.json'))) {\n console.log('==> Target already has rush.json, skipping rush init');\n } else {\n console.log('==> Running rush init...');\n try {\n const output = exec(`npx \"@microsoft/rush@${RUSH_VERSION}\" init`, { cwd: targetDir });\n for (const line of output.split('\\n')) {\n console.log(` ${line}`);\n }\n } catch (err: unknown) {\n // rush init writes to stderr for some messages, check if rush.json was created\n if (!fs.existsSync(path.join(targetDir, 'rush.json'))) {\n throw new Error(`rush init failed: ${(err as Error).message}`);\n }\n }\n }\n\n // ── Step 2: Patch rush.json ──\n console.log('');\n console.log('==> Patching rush.json with fgv customizations...');\n\n const rushJsonOps: IPatchOperation[] = [\n { type: 'set', path: 'nodeSupportedVersionRange', value: NODE_VERSION_RANGE },\n { type: 'set', path: 'ensureConsistentVersions', value: true },\n { type: 'uncomment', path: 'projectFolderMinDepth' },\n { type: 'set', path: 'projectFolderMinDepth', value: 2 },\n { type: 'uncomment', path: 'projectFolderMaxDepth' },\n { type: 'set', path: 'projectFolderMaxDepth', value: 2 },\n { type: 'uncomment', path: 'url' },\n { type: 'set', path: 'repository.url', value: repoUrl },\n { type: 'uncomment', path: 'defaultBranch' },\n { type: 'uncomment', path: 'defaultRemote' }\n ];\n\n patchFile(path.join(targetDir, 'rush.json'), rushJsonOps);\n for (const op of rushJsonOps) {\n const desc =\n op.type === 'uncomment' || op.type === 'remove'\n ? ` ${op.type}: ${op.path}`\n : ` ${op.type}: ${op.path}`;\n console.log(desc);\n }\n\n // ── Step 3: Patch other rush config files ──\n console.log('');\n console.log('==> Patching rush config files...');\n\n patchFile(path.join(targetDir, 'common/config/rush/build-cache.json'), [\n { type: 'set', path: 'buildCacheEnabled', value: true }\n ]);\n console.log(' build-cache.json: buildCacheEnabled = true');\n\n patchFile(path.join(targetDir, 'common/config/rush/pnpm-config.json'), [\n { type: 'uncomment', path: 'strictPeerDependencies' },\n { type: 'set', path: 'strictPeerDependencies', value: true }\n ]);\n console.log(' pnpm-config.json: strictPeerDependencies = true');\n\n // ── Step 4: Generate templated files ──\n console.log('');\n console.log('==> Generating templated config files...');\n\n const templateVars: ITemplateVars = {\n REPO_URL: repoUrl,\n VERSION_POLICY_NAME: versionPolicy,\n VERSION: version\n };\n\n for (const tmpl of manifest.templated.files) {\n const templatePath = path.join(sourceDir, tmpl.template);\n const destPath = path.join(targetDir, tmpl.destination);\n renderTemplateFile(templatePath, destPath, templateVars);\n }\n\n // ── Step 5: Copy shared files ──\n console.log('');\n console.log('==> Copying shared files...');\n\n for (const file of manifest.shared.files) {\n const srcPath = path.join(sourceDir, file.source);\n const destPath = path.join(targetDir, file.destination);\n if (!fs.existsSync(srcPath)) {\n console.warn(` WARNING: Source file not found, skipping: ${file.source}`);\n continue;\n }\n copyFile(srcPath, destPath);\n console.log(` Copied: ${file.destination}`);\n }\n\n for (const pkg of manifest.sharedPackages.packages) {\n const srcPath = path.join(sourceDir, pkg.source);\n const destPath = path.join(targetDir, pkg.destination);\n if (!fs.existsSync(srcPath)) {\n console.warn(` WARNING: Source directory not found, skipping: ${pkg.source}`);\n continue;\n }\n copyPackage(srcPath, destPath);\n console.log(` Copied package: ${pkg.destination}`);\n }\n\n // ── Step 6: Create standard directories ──\n console.log('');\n console.log('==> Creating directory structure...');\n\n const dirs = ['libraries', 'tools', 'apps', 'services', '.claude/project', '.claude/skills'];\n for (const dir of dirs) {\n fs.mkdirSync(path.join(targetDir, dir), { recursive: true });\n }\n\n const gitkeeps = ['.claude/project/.gitkeep', '.claude/skills/.gitkeep'];\n for (const gk of gitkeeps) {\n fs.writeFileSync(path.join(targetDir, gk), '');\n }\n console.log(' Created standard directory structure');\n\n // ── Step 7: Record template metadata ──\n console.log('');\n console.log('==> Recording template metadata...');\n\n const sourceCommit = getGitCommit(sourceDir);\n const sourceRepo = getGitRemoteUrl(sourceDir);\n\n const syncMetadata = {\n templateSource: repoUrl,\n sourceRepo,\n sourceCommit,\n createdAt: new Date().toISOString(),\n lastSyncedAt: new Date().toISOString(),\n manifestVersion: '1.0.0'\n };\n fs.writeFileSync(path.join(targetDir, '.template-sync'), JSON.stringify(syncMetadata, null, 2) + '\\n');\n console.log(' Created .template-sync');\n\n // ── Step 8: Git init ──\n if (gitInit) {\n console.log('');\n console.log('==> Initializing git repository...');\n try {\n exec('git init -b main', { cwd: targetDir });\n exec('git add -A', { cwd: targetDir });\n exec(\n `git commit -m \"Initial commit from fgv monorepo template\\n\\nSource: ${sourceDir}\\nTemplate commit: ${sourceCommit}\"`,\n { cwd: targetDir }\n );\n console.log(' Git repository initialized with initial commit');\n } catch (err: unknown) {\n console.warn(` WARNING: Git init failed: ${(err as Error).message}`);\n }\n }\n\n // ── Done ──\n console.log('');\n console.log(`=== Monorepo created successfully at: ${targetDir} ===`);\n console.log('');\n console.log('Next steps:');\n console.log(' 1. Add your domain packages to libraries/, apps/, tools/, services/');\n console.log(' 2. Register them in rush.json');\n console.log(' 3. Fill in the project table in CLAUDE.md');\n console.log(' 4. Fill in ACTIVE_DEVELOPMENT.md with your domain projects');\n console.log(' 5. Add domain-specific Rush commands to common/config/rush/command-line.json');\n console.log(` 6. Run: cd ${targetDir} && rush install && rush build`);\n console.log('');\n}\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export type DepChannelType = 'alpha' | 'release' | 'auto';
|
|
5
5
|
/**
|
|
6
|
-
* Resolve the
|
|
6
|
+
* Resolve the \@fgv/* dependency version spec for init-library.
|
|
7
7
|
*
|
|
8
8
|
* - In the fgv repo itself: returns "workspace:*"
|
|
9
9
|
* - In a sibling/consumer repo: derives a version range from the repo-template's own
|
|
@@ -17,7 +17,7 @@ export declare function resolveFgvDepVersion(repoDir: string, channel: DepChanne
|
|
|
17
17
|
export type RigType = 'dual' | 'node' | 'browser';
|
|
18
18
|
export type CategoryType = 'libraries' | 'tools' | 'apps' | 'services';
|
|
19
19
|
export interface IInitLibraryOptions {
|
|
20
|
-
/** Package name (e.g. "ts-my-lib" — will be prefixed with
|
|
20
|
+
/** Package name (e.g. "ts-my-lib" — will be prefixed with \@fgv/) */
|
|
21
21
|
name: string;
|
|
22
22
|
/** Short description */
|
|
23
23
|
description: string;
|
|
@@ -31,7 +31,7 @@ export interface IInitLibraryOptions {
|
|
|
31
31
|
versionPolicy: string;
|
|
32
32
|
/** Initial version */
|
|
33
33
|
version: string;
|
|
34
|
-
/** Dependency version for
|
|
34
|
+
/** Dependency version for \@fgv/* packages ("workspace:*" for fgv, "^5.1.0-0" for consumers) */
|
|
35
35
|
fgvDepVersion: string;
|
|
36
36
|
}
|
|
37
37
|
export declare function runInitLibrary(options: IInitLibraryOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-library.d.ts","sourceRoot":"","sources":["../../src/commands/init-library.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAmB1D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAYrF;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,
|
|
1
|
+
{"version":3,"file":"init-library.d.ts","sourceRoot":"","sources":["../../src/commands/init-library.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAmB1D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAYrF;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,GAAG,EAAE,OAAO,CAAC;IACb,sBAAsB;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,aAAa,EAAE,MAAM,CAAC;CACvB;AA6CD,wBAAsB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmMhF"}
|
|
@@ -57,7 +57,7 @@ function getOwnPackageVersion() {
|
|
|
57
57
|
return pkg.version;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
* Resolve the
|
|
60
|
+
* Resolve the \@fgv/* dependency version spec for init-library.
|
|
61
61
|
*
|
|
62
62
|
* - In the fgv repo itself: returns "workspace:*"
|
|
63
63
|
* - In a sibling/consumer repo: derives a version range from the repo-template's own
|
|
@@ -145,11 +145,11 @@ async function runInitLibrary(options) {
|
|
|
145
145
|
devDependencies['@types/heft-jest'] = '1.0.6';
|
|
146
146
|
devDependencies['@types/jest'] = '^29.5.14';
|
|
147
147
|
devDependencies['@types/node'] = '^20.14.9';
|
|
148
|
-
devDependencies
|
|
148
|
+
devDependencies.typescript = '5.9.3';
|
|
149
149
|
devDependencies['@rushstack/eslint-config'] = '4.6.4';
|
|
150
|
-
devDependencies
|
|
150
|
+
devDependencies.eslint = '^9.39.2';
|
|
151
151
|
// Typedoc dependencies
|
|
152
|
-
devDependencies
|
|
152
|
+
devDependencies.typedoc = '~0.28.16';
|
|
153
153
|
devDependencies['@fgv/typedoc-compact-theme'] = fgvDepVersion;
|
|
154
154
|
const packageJson = {
|
|
155
155
|
name: packageName,
|
|
@@ -180,8 +180,8 @@ async function runInitLibrary(options) {
|
|
|
180
180
|
};
|
|
181
181
|
// Add dual-emit exports for dual rig
|
|
182
182
|
if (rig === 'dual') {
|
|
183
|
-
packageJson
|
|
184
|
-
packageJson
|
|
183
|
+
packageJson.module = 'dist/index.js';
|
|
184
|
+
packageJson.exports = {
|
|
185
185
|
'.': {
|
|
186
186
|
types: './lib/index.d.ts',
|
|
187
187
|
import: './dist/index.js',
|
|
@@ -205,7 +205,7 @@ async function runInitLibrary(options) {
|
|
|
205
205
|
rigPackageName: rigConfig.rigPackageName
|
|
206
206
|
};
|
|
207
207
|
if (rigConfig.rigProfile) {
|
|
208
|
-
rigJson
|
|
208
|
+
rigJson.rigProfile = rigConfig.rigProfile;
|
|
209
209
|
}
|
|
210
210
|
fs.writeFileSync(path.join(projectDir, 'config', 'rig.json'), JSON.stringify(rigJson, null, 2) + '\n');
|
|
211
211
|
// ── config/jest.config.json ──
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-library.js","sourceRoot":"","sources":["../../src/commands/init-library.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * init-library command — scaffolds a new library package within an existing Rush monorepo.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { patchFile, IPatchOperation } from '../packlets/jsonc';\n\nexport type DepChannelType = 'alpha' | 'release' | 'auto';\n\n/**\n * Check whether a given Rush repo root is the fgv source repo itself\n * (as opposed to a consumer/sibling repo).\n */\nfunction isFgvRepo(repoDir: string): boolean {\n return fs.existsSync(path.join(repoDir, 'tools', 'repo-template', 'sync-manifest.json'));\n}\n\n/**\n * Read the repo-template package's own version from its package.json.\n */\nfunction getOwnPackageVersion(): string {\n const pkgPath = path.resolve(__dirname, '..', '..', 'package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return pkg.version as string;\n}\n\n/**\n * Resolve the @fgv/* dependency version spec for init-library.\n *\n * - In the fgv repo itself: returns \"workspace:*\"\n * - In a sibling/consumer repo: derives a version range from the repo-template's own\n * package version, choosing alpha or release channel.\n *\n * @param repoDir - Rush monorepo root being targeted\n * @param channel - \"alpha\" for prerelease, \"release\" for stable, \"auto\" to infer from\n * whether the repo-template is itself a prerelease build.\n */\nexport function resolveFgvDepVersion(repoDir: string, channel: DepChannelType): string {\n if (isFgvRepo(repoDir)) {\n return 'workspace:*';\n }\n\n const version = getOwnPackageVersion(); // e.g. \"5.1.0-6\" or \"5.1.0\"\n const dashIdx = version.indexOf('-');\n const baseVersion = dashIdx >= 0 ? version.substring(0, dashIdx) : version;\n const isPrerelease = dashIdx >= 0;\n\n const useAlpha = channel === 'alpha' || (channel === 'auto' && isPrerelease);\n return useAlpha ? `~${baseVersion}-0` : `~${baseVersion}`;\n}\n\nexport type RigType = 'dual' | 'node' | 'browser';\nexport type CategoryType = 'libraries' | 'tools' | 'apps' | 'services';\n\nexport interface IInitLibraryOptions {\n /** Package name (e.g. \"ts-my-lib\" — will be prefixed with @fgv/) */\n name: string;\n /** Short description */\n description: string;\n /** Heft rig to use */\n rig: RigType;\n /** Category folder */\n category: CategoryType;\n /** Rush monorepo root */\n repoDir: string;\n /** Version policy name (from version-policies.json) */\n versionPolicy: string;\n /** Initial version */\n version: string;\n /** Dependency version for @fgv/* packages (\"workspace:*\" for fgv, \"^5.1.0-0\" for consumers) */\n fgvDepVersion: string;\n}\n\ninterface IRigConfig {\n rigPackageName: string;\n rigProfile?: string;\n rigDevDeps: Record<string, string>;\n tsconfigExtends: string;\n tsconfigTypes: string[];\n tsconfigLib?: string[];\n}\n\nconst RIG_CONFIGS: Record<RigType, IRigConfig> = {\n dual: {\n rigPackageName: '@fgv/heft-dual-rig',\n rigDevDeps: {\n '@fgv/heft-dual-rig': 'FGV_DEP',\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-node-rig': '2.11.27'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node'],\n tsconfigLib: ['es2018']\n },\n node: {\n rigPackageName: '@rushstack/heft-node-rig',\n rigDevDeps: {\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-node-rig': '2.11.27'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node']\n },\n browser: {\n rigPackageName: '@rushstack/heft-web-rig',\n rigProfile: 'library',\n rigDevDeps: {\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-web-rig': '1.4.3'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-web-rig/profiles/library/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node'],\n tsconfigLib: ['es2018', 'DOM']\n }\n};\n\nexport async function runInitLibrary(options: IInitLibraryOptions): Promise<void> {\n const { name, description, rig, category, repoDir, versionPolicy, version, fgvDepVersion } = options;\n\n const packageName = name.startsWith('@fgv/') ? name : `@fgv/${name}`;\n const shortName = packageName.replace('@fgv/', '');\n const projectFolder = `${category}/${shortName}`;\n const projectDir = path.join(repoDir, projectFolder);\n\n if (fs.existsSync(projectDir)) {\n throw new Error(`Project directory already exists: ${projectDir}`);\n }\n\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`Not a Rush repo (no rush.json): ${repoDir}`);\n }\n\n const rigConfig = RIG_CONFIGS[rig];\n\n console.log(`Initializing library: ${packageName}`);\n console.log(` Directory: ${projectFolder}`);\n console.log(` Rig: ${rig} (${rigConfig.rigPackageName})`);\n console.log(` Version: ${versionPolicy}@${version}`);\n console.log('');\n\n // ── Create directory structure ──\n fs.mkdirSync(path.join(projectDir, 'src', 'test', 'unit'), { recursive: true });\n fs.mkdirSync(path.join(projectDir, 'config'), { recursive: true });\n\n // ── package.json ──\n console.log('==> Creating package.json...');\n\n const devDependencies: Record<string, string> = {};\n // Add rig dependencies — @fgv/* packages use fgvDepVersion, others use their pinned version\n for (const [dep, ver] of Object.entries(rigConfig.rigDevDeps)) {\n devDependencies[dep] = dep.startsWith('@fgv/') ? fgvDepVersion : ver;\n }\n // Standard dev dependencies\n devDependencies['@fgv/ts-utils-jest'] = fgvDepVersion;\n devDependencies['@types/heft-jest'] = '1.0.6';\n devDependencies['@types/jest'] = '^29.5.14';\n devDependencies['@types/node'] = '^20.14.9';\n devDependencies['typescript'] = '5.9.3';\n devDependencies['@rushstack/eslint-config'] = '4.6.4';\n devDependencies['eslint'] = '^9.39.2';\n // Typedoc dependencies\n devDependencies['typedoc'] = '~0.28.16';\n devDependencies['@fgv/typedoc-compact-theme'] = fgvDepVersion;\n\n const packageJson: Record<string, unknown> = {\n name: packageName,\n version,\n description,\n main: 'lib/index.js',\n types: 'lib/index.d.ts',\n scripts: {\n build: 'heft build --clean',\n clean: 'heft clean',\n test: 'heft test --clean',\n coverage: 'jest --coverage',\n 'build-docs': 'typedoc --options ./config/typedoc.json',\n lint: 'eslint src --ext .ts',\n fixlint: 'eslint src --ext .ts --fix'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n '@fgv/ts-utils': fgvDepVersion,\n '@fgv/ts-json-base': fgvDepVersion\n },\n devDependencies,\n repository: {\n type: 'git',\n url: ''\n }\n };\n\n // Add dual-emit exports for dual rig\n if (rig === 'dual') {\n packageJson['module'] = 'dist/index.js';\n packageJson['exports'] = {\n '.': {\n types: './lib/index.d.ts',\n import: './dist/index.js',\n require: './lib/index.js',\n default: './lib/index.js'\n }\n };\n }\n\n fs.writeFileSync(path.join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\\n');\n\n // ── tsconfig.json ──\n console.log(' Creating tsconfig.json...');\n\n const tsconfig: Record<string, unknown> = {\n extends: rigConfig.tsconfigExtends,\n compilerOptions: {\n types: rigConfig.tsconfigTypes,\n ...(rigConfig.tsconfigLib ? { lib: rigConfig.tsconfigLib } : {})\n }\n };\n\n fs.writeFileSync(path.join(projectDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n');\n\n // ── config/rig.json ──\n console.log(' Creating config/rig.json...');\n\n const rigJson: Record<string, unknown> = {\n $schema: 'https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json',\n rigPackageName: rigConfig.rigPackageName\n };\n if (rigConfig.rigProfile) {\n rigJson['rigProfile'] = rigConfig.rigProfile;\n }\n\n fs.writeFileSync(path.join(projectDir, 'config', 'rig.json'), JSON.stringify(rigJson, null, 2) + '\\n');\n\n // ── config/jest.config.json ──\n console.log(' Creating config/jest.config.json...');\n\n const jestConfig = {\n extends: '@rushstack/heft-node-rig/profiles/default/config/jest.config.json',\n coverageThreshold: {\n global: {\n branches: 100,\n functions: 100,\n lines: 100,\n statements: 100\n }\n },\n collectCoverage: true,\n coverageReporters: ['text', 'lcov', 'html']\n };\n\n fs.writeFileSync(\n path.join(projectDir, 'config', 'jest.config.json'),\n JSON.stringify(jestConfig, null, 2) + '\\n'\n );\n\n // ── config/typedoc.json ──\n console.log(' Creating config/typedoc.json...');\n\n const typedocConfig = {\n $schema: 'https://typedoc.org/schema.json',\n extends: ['@fgv/heft-dual-rig/profiles/default/config/typedoc.compact-base.json'],\n plugin: ['../../../plugins/typedoc-compact-theme/lib/index.js'],\n entryPoints: ['../src/index.ts'],\n out: '../docs'\n };\n\n fs.writeFileSync(\n path.join(projectDir, 'config', 'typedoc.json'),\n JSON.stringify(typedocConfig, null, 2) + '\\n'\n );\n\n // ── src/index.ts ──\n console.log(' Creating src/index.ts...');\n\n fs.writeFileSync(\n path.join(projectDir, 'src', 'index.ts'),\n `/**\\n * @packageDocumentation\\n * ${description}\\n */\\n`\n );\n\n // ── Register in rush.json ──\n console.log('');\n console.log('==> Registering in rush.json...');\n\n const rushJsonOps: IPatchOperation[] = [\n {\n type: 'add-to-array',\n path: 'projects',\n value: JSON.stringify({\n packageName,\n projectFolder,\n shouldPublish: true,\n versionPolicyName: versionPolicy,\n tags: [category]\n })\n }\n ];\n\n patchFile(rushJsonPath, rushJsonOps);\n console.log(` Added ${packageName} at ${projectFolder}`);\n\n // ── Done ──\n console.log('');\n console.log(`=== Library ${packageName} initialized at ${projectFolder} ===`);\n console.log('');\n console.log('Next steps:');\n console.log(` 1. cd ${projectDir}`);\n console.log(' 2. rush update');\n console.log(' 3. rushx build');\n console.log(' 4. Start adding code to src/');\n console.log('');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"init-library.js","sourceRoot":"","sources":["../../src/commands/init-library.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCH,oDAYC;AAmED,wCAmMC;AApTD,uCAAyB;AACzB,2CAA6B;AAC7B,6CAA+D;AAI/D;;;GAGG;AACH,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC,OAAiB,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,oBAAoB,CAAC,OAAe,EAAE,OAAuB;IAC3E,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC,CAAC,4BAA4B;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,OAAO,KAAK,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC;IAC7E,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC;AAC5D,CAAC;AAiCD,MAAM,WAAW,GAAgC;IAC/C,IAAI,EAAE;QACJ,cAAc,EAAE,oBAAoB;QACpC,UAAU,EAAE;YACV,oBAAoB,EAAE,SAAS;YAC/B,iBAAiB,EAAE,OAAO;YAC1B,0BAA0B,EAAE,SAAS;SACtC;QACD,eAAe,EAAE,6EAA6E;QAC9F,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;QACpC,WAAW,EAAE,CAAC,QAAQ,CAAC;KACxB;IACD,IAAI,EAAE;QACJ,cAAc,EAAE,0BAA0B;QAC1C,UAAU,EAAE;YACV,iBAAiB,EAAE,OAAO;YAC1B,0BAA0B,EAAE,SAAS;SACtC;QACD,eAAe,EAAE,6EAA6E;QAC9F,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;KACrC;IACD,OAAO,EAAE;QACP,cAAc,EAAE,yBAAyB;QACzC,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE;YACV,iBAAiB,EAAE,OAAO;YAC1B,yBAAyB,EAAE,OAAO;SACnC;QACD,eAAe,EAAE,4EAA4E;QAC7F,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;QACpC,WAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;KAC/B;CACF,CAAC;AAEK,KAAK,UAAU,cAAc,CAAC,OAA4B;IAC/D,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAErG,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,gBAAgB,aAAa,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,KAAK,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,gBAAgB,aAAa,IAAI,OAAO,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,mCAAmC;IACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,4FAA4F;IAC5F,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;IACvE,CAAC;IACD,4BAA4B;IAC5B,eAAe,CAAC,oBAAoB,CAAC,GAAG,aAAa,CAAC;IACtD,eAAe,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC;IAC9C,eAAe,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;IAC5C,eAAe,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;IAC5C,eAAe,CAAC,UAAU,GAAG,OAAO,CAAC;IACrC,eAAe,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC;IACtD,eAAe,CAAC,MAAM,GAAG,SAAS,CAAC;IACnC,uBAAuB;IACvB,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC;IACrC,eAAe,CAAC,4BAA4B,CAAC,GAAG,aAAa,CAAC;IAE9D,MAAM,WAAW,GAA4B;QAC3C,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,WAAW;QACX,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE;YACP,KAAK,EAAE,oBAAoB;YAC3B,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,iBAAiB;YAC3B,YAAY,EAAE,yCAAyC;YACvD,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,4BAA4B;SACtC;QACD,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,KAAK;QACd,YAAY,EAAE;YACZ,eAAe,EAAE,aAAa;YAC9B,mBAAmB,EAAE,aAAa;SACnC;QACD,eAAe;QACf,UAAU,EAAE;YACV,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,EAAE;SACR;KACF,CAAC;IAEF,qCAAqC;IACrC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,WAAW,CAAC,MAAM,GAAG,eAAe,CAAC;QACrC,WAAW,CAAC,OAAO,GAAG;YACpB,GAAG,EAAE;gBACH,KAAK,EAAE,kBAAkB;gBACzB,MAAM,EAAE,iBAAiB;gBACzB,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,gBAAgB;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErG,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAA4B;QACxC,OAAO,EAAE,SAAS,CAAC,eAAe;QAClC,eAAe,kBACb,KAAK,EAAE,SAAS,CAAC,aAAa,IAC3B,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACjE;KACF,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEnG,wBAAwB;IACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,MAAM,OAAO,GAA4B;QACvC,OAAO,EAAE,0EAA0E;QACnF,cAAc,EAAE,SAAS,CAAC,cAAc;KACzC,CAAC;IACF,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;IAC5C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvG,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG;QACjB,OAAO,EAAE,mEAAmE;QAC5E,iBAAiB,EAAE;YACjB,MAAM,EAAE;gBACN,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,GAAG;gBACd,KAAK,EAAE,GAAG;gBACV,UAAU,EAAE,GAAG;aAChB;SACF;QACD,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAC5C,CAAC;IAEF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACnD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC3C,CAAC;IAEF,4BAA4B;IAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,iCAAiC;QAC1C,OAAO,EAAE,CAAC,sEAAsE,CAAC;QACjF,MAAM,EAAE,CAAC,qDAAqD,CAAC;QAC/D,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,GAAG,EAAE,SAAS;KACf,CAAC;IAEF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC,EAC/C,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC9C,CAAC;IAEF,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,EACxC,qCAAqC,WAAW,SAAS,CAC1D,CAAC;IAEF,8BAA8B;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAsB;QACrC;YACE,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,WAAW;gBACX,aAAa;gBACb,aAAa,EAAE,IAAI;gBACnB,iBAAiB,EAAE,aAAa;gBAChC,IAAI,EAAE,CAAC,QAAQ,CAAC;aACjB,CAAC;SACH;KACF,CAAC;IAEF,IAAA,iBAAS,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,OAAO,aAAa,EAAE,CAAC,CAAC;IAE1D,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,mBAAmB,aAAa,MAAM,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC","sourcesContent":["/**\n * init-library command — scaffolds a new library package within an existing Rush monorepo.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { patchFile, IPatchOperation } from '../packlets/jsonc';\n\nexport type DepChannelType = 'alpha' | 'release' | 'auto';\n\n/**\n * Check whether a given Rush repo root is the fgv source repo itself\n * (as opposed to a consumer/sibling repo).\n */\nfunction isFgvRepo(repoDir: string): boolean {\n return fs.existsSync(path.join(repoDir, 'tools', 'repo-template', 'sync-manifest.json'));\n}\n\n/**\n * Read the repo-template package's own version from its package.json.\n */\nfunction getOwnPackageVersion(): string {\n const pkgPath = path.resolve(__dirname, '..', '..', 'package.json');\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return pkg.version as string;\n}\n\n/**\n * Resolve the \\@fgv/* dependency version spec for init-library.\n *\n * - In the fgv repo itself: returns \"workspace:*\"\n * - In a sibling/consumer repo: derives a version range from the repo-template's own\n * package version, choosing alpha or release channel.\n *\n * @param repoDir - Rush monorepo root being targeted\n * @param channel - \"alpha\" for prerelease, \"release\" for stable, \"auto\" to infer from\n * whether the repo-template is itself a prerelease build.\n */\nexport function resolveFgvDepVersion(repoDir: string, channel: DepChannelType): string {\n if (isFgvRepo(repoDir)) {\n return 'workspace:*';\n }\n\n const version = getOwnPackageVersion(); // e.g. \"5.1.0-6\" or \"5.1.0\"\n const dashIdx = version.indexOf('-');\n const baseVersion = dashIdx >= 0 ? version.substring(0, dashIdx) : version;\n const isPrerelease = dashIdx >= 0;\n\n const useAlpha = channel === 'alpha' || (channel === 'auto' && isPrerelease);\n return useAlpha ? `~${baseVersion}-0` : `~${baseVersion}`;\n}\n\nexport type RigType = 'dual' | 'node' | 'browser';\nexport type CategoryType = 'libraries' | 'tools' | 'apps' | 'services';\n\nexport interface IInitLibraryOptions {\n /** Package name (e.g. \"ts-my-lib\" — will be prefixed with \\@fgv/) */\n name: string;\n /** Short description */\n description: string;\n /** Heft rig to use */\n rig: RigType;\n /** Category folder */\n category: CategoryType;\n /** Rush monorepo root */\n repoDir: string;\n /** Version policy name (from version-policies.json) */\n versionPolicy: string;\n /** Initial version */\n version: string;\n /** Dependency version for \\@fgv/* packages (\"workspace:*\" for fgv, \"^5.1.0-0\" for consumers) */\n fgvDepVersion: string;\n}\n\ninterface IRigConfig {\n rigPackageName: string;\n rigProfile?: string;\n rigDevDeps: Record<string, string>;\n tsconfigExtends: string;\n tsconfigTypes: string[];\n tsconfigLib?: string[];\n}\n\nconst RIG_CONFIGS: Record<RigType, IRigConfig> = {\n dual: {\n rigPackageName: '@fgv/heft-dual-rig',\n rigDevDeps: {\n '@fgv/heft-dual-rig': 'FGV_DEP',\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-node-rig': '2.11.27'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node'],\n tsconfigLib: ['es2018']\n },\n node: {\n rigPackageName: '@rushstack/heft-node-rig',\n rigDevDeps: {\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-node-rig': '2.11.27'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node']\n },\n browser: {\n rigPackageName: '@rushstack/heft-web-rig',\n rigProfile: 'library',\n rigDevDeps: {\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-web-rig': '1.4.3'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-web-rig/profiles/library/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node'],\n tsconfigLib: ['es2018', 'DOM']\n }\n};\n\nexport async function runInitLibrary(options: IInitLibraryOptions): Promise<void> {\n const { name, description, rig, category, repoDir, versionPolicy, version, fgvDepVersion } = options;\n\n const packageName = name.startsWith('@fgv/') ? name : `@fgv/${name}`;\n const shortName = packageName.replace('@fgv/', '');\n const projectFolder = `${category}/${shortName}`;\n const projectDir = path.join(repoDir, projectFolder);\n\n if (fs.existsSync(projectDir)) {\n throw new Error(`Project directory already exists: ${projectDir}`);\n }\n\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`Not a Rush repo (no rush.json): ${repoDir}`);\n }\n\n const rigConfig = RIG_CONFIGS[rig];\n\n console.log(`Initializing library: ${packageName}`);\n console.log(` Directory: ${projectFolder}`);\n console.log(` Rig: ${rig} (${rigConfig.rigPackageName})`);\n console.log(` Version: ${versionPolicy}@${version}`);\n console.log('');\n\n // ── Create directory structure ──\n fs.mkdirSync(path.join(projectDir, 'src', 'test', 'unit'), { recursive: true });\n fs.mkdirSync(path.join(projectDir, 'config'), { recursive: true });\n\n // ── package.json ──\n console.log('==> Creating package.json...');\n\n const devDependencies: Record<string, string> = {};\n // Add rig dependencies — @fgv/* packages use fgvDepVersion, others use their pinned version\n for (const [dep, ver] of Object.entries(rigConfig.rigDevDeps)) {\n devDependencies[dep] = dep.startsWith('@fgv/') ? fgvDepVersion : ver;\n }\n // Standard dev dependencies\n devDependencies['@fgv/ts-utils-jest'] = fgvDepVersion;\n devDependencies['@types/heft-jest'] = '1.0.6';\n devDependencies['@types/jest'] = '^29.5.14';\n devDependencies['@types/node'] = '^20.14.9';\n devDependencies.typescript = '5.9.3';\n devDependencies['@rushstack/eslint-config'] = '4.6.4';\n devDependencies.eslint = '^9.39.2';\n // Typedoc dependencies\n devDependencies.typedoc = '~0.28.16';\n devDependencies['@fgv/typedoc-compact-theme'] = fgvDepVersion;\n\n const packageJson: Record<string, unknown> = {\n name: packageName,\n version,\n description,\n main: 'lib/index.js',\n types: 'lib/index.d.ts',\n scripts: {\n build: 'heft build --clean',\n clean: 'heft clean',\n test: 'heft test --clean',\n coverage: 'jest --coverage',\n 'build-docs': 'typedoc --options ./config/typedoc.json',\n lint: 'eslint src --ext .ts',\n fixlint: 'eslint src --ext .ts --fix'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n '@fgv/ts-utils': fgvDepVersion,\n '@fgv/ts-json-base': fgvDepVersion\n },\n devDependencies,\n repository: {\n type: 'git',\n url: ''\n }\n };\n\n // Add dual-emit exports for dual rig\n if (rig === 'dual') {\n packageJson.module = 'dist/index.js';\n packageJson.exports = {\n '.': {\n types: './lib/index.d.ts',\n import: './dist/index.js',\n require: './lib/index.js',\n default: './lib/index.js'\n }\n };\n }\n\n fs.writeFileSync(path.join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\\n');\n\n // ── tsconfig.json ──\n console.log(' Creating tsconfig.json...');\n\n const tsconfig: Record<string, unknown> = {\n extends: rigConfig.tsconfigExtends,\n compilerOptions: {\n types: rigConfig.tsconfigTypes,\n ...(rigConfig.tsconfigLib ? { lib: rigConfig.tsconfigLib } : {})\n }\n };\n\n fs.writeFileSync(path.join(projectDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n');\n\n // ── config/rig.json ──\n console.log(' Creating config/rig.json...');\n\n const rigJson: Record<string, unknown> = {\n $schema: 'https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json',\n rigPackageName: rigConfig.rigPackageName\n };\n if (rigConfig.rigProfile) {\n rigJson.rigProfile = rigConfig.rigProfile;\n }\n\n fs.writeFileSync(path.join(projectDir, 'config', 'rig.json'), JSON.stringify(rigJson, null, 2) + '\\n');\n\n // ── config/jest.config.json ──\n console.log(' Creating config/jest.config.json...');\n\n const jestConfig = {\n extends: '@rushstack/heft-node-rig/profiles/default/config/jest.config.json',\n coverageThreshold: {\n global: {\n branches: 100,\n functions: 100,\n lines: 100,\n statements: 100\n }\n },\n collectCoverage: true,\n coverageReporters: ['text', 'lcov', 'html']\n };\n\n fs.writeFileSync(\n path.join(projectDir, 'config', 'jest.config.json'),\n JSON.stringify(jestConfig, null, 2) + '\\n'\n );\n\n // ── config/typedoc.json ──\n console.log(' Creating config/typedoc.json...');\n\n const typedocConfig = {\n $schema: 'https://typedoc.org/schema.json',\n extends: ['@fgv/heft-dual-rig/profiles/default/config/typedoc.compact-base.json'],\n plugin: ['../../../plugins/typedoc-compact-theme/lib/index.js'],\n entryPoints: ['../src/index.ts'],\n out: '../docs'\n };\n\n fs.writeFileSync(\n path.join(projectDir, 'config', 'typedoc.json'),\n JSON.stringify(typedocConfig, null, 2) + '\\n'\n );\n\n // ── src/index.ts ──\n console.log(' Creating src/index.ts...');\n\n fs.writeFileSync(\n path.join(projectDir, 'src', 'index.ts'),\n `/**\\n * @packageDocumentation\\n * ${description}\\n */\\n`\n );\n\n // ── Register in rush.json ──\n console.log('');\n console.log('==> Registering in rush.json...');\n\n const rushJsonOps: IPatchOperation[] = [\n {\n type: 'add-to-array',\n path: 'projects',\n value: JSON.stringify({\n packageName,\n projectFolder,\n shouldPublish: true,\n versionPolicyName: versionPolicy,\n tags: [category]\n })\n }\n ];\n\n patchFile(rushJsonPath, rushJsonOps);\n console.log(` Added ${packageName} at ${projectFolder}`);\n\n // ── Done ──\n console.log('');\n console.log(`=== Library ${packageName} initialized at ${projectFolder} ===`);\n console.log('');\n console.log('Next steps:');\n console.log(` 1. cd ${projectDir}`);\n console.log(' 2. rush update');\n console.log(' 3. rushx build');\n console.log(' 4. Start adding code to src/');\n console.log('');\n}\n"]}
|
package/lib/commands/link.d.ts
CHANGED
|
@@ -2,14 +2,26 @@
|
|
|
2
2
|
* Link/unlink/update-fgv-versions commands — automate cross-repo development
|
|
3
3
|
* between fgv and consumer Rush monorepos.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Options for the link command, which sets up file: overrides to a local fgv worktree.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
5
9
|
export interface ILinkOptions {
|
|
6
10
|
fgvDir: string;
|
|
7
11
|
repoDir: string;
|
|
8
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Options for the unlink command, which restores published package dependencies.
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
9
17
|
export interface IUnlinkOptions {
|
|
10
18
|
repoDir: string;
|
|
11
19
|
version?: string;
|
|
12
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Options for the update-fgv-versions command, which bumps \@fgv/* dependency version specs across all projects.
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
13
25
|
export interface IUpdateFgvVersionsOptions {
|
|
14
26
|
repoDir: string;
|
|
15
27
|
version?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsOD,wBAAsB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5F"}
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsOD,wBAAsB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5F"}
|
package/lib/commands/link.js
CHANGED
|
@@ -75,8 +75,8 @@ function collectDirectFgvDependencies(pkgJson) {
|
|
|
75
75
|
return deps;
|
|
76
76
|
}
|
|
77
77
|
/**
|
|
78
|
-
* Scan a consumer Rush repo and collect all
|
|
79
|
-
* Returns a map of packageName
|
|
78
|
+
* Scan a consumer Rush repo and collect all \@fgv/* dependencies (excluding workspace:* entries).
|
|
79
|
+
* Returns a map of packageName to list of project folders that depend on it.
|
|
80
80
|
*/
|
|
81
81
|
function discoverFgvDeps(repoDir) {
|
|
82
82
|
var _a;
|
|
@@ -101,7 +101,7 @@ function discoverFgvDeps(repoDir) {
|
|
|
101
101
|
return deps;
|
|
102
102
|
}
|
|
103
103
|
/**
|
|
104
|
-
* Build an internal
|
|
104
|
+
* Build an internal \@fgv package dependency graph from the fgv worktree.
|
|
105
105
|
* Only dependencies that exist in the fgv Rush projects are retained.
|
|
106
106
|
*/
|
|
107
107
|
function buildFgvDependencyGraph(fgvDir, fgvPackageMap) {
|
|
@@ -154,7 +154,7 @@ function expandFgvDependencyClosure(seedPackageNames, graph) {
|
|
|
154
154
|
return resolved;
|
|
155
155
|
}
|
|
156
156
|
/**
|
|
157
|
-
* Read the fgv worktree's rush.json and build a map of packageName
|
|
157
|
+
* Read the fgv worktree's rush.json and build a map of packageName to projectFolder.
|
|
158
158
|
*/
|
|
159
159
|
function buildFgvPackageMap(fgvDir) {
|
|
160
160
|
const rushJsonPath = path.join(fgvDir, 'rush.json');
|
|
@@ -170,7 +170,7 @@ function buildFgvPackageMap(fgvDir) {
|
|
|
170
170
|
}
|
|
171
171
|
// ── Version helpers ──
|
|
172
172
|
/**
|
|
173
|
-
* Query npm for the latest prerelease version of
|
|
173
|
+
* Query npm for the latest prerelease version of \@fgv/ts-utils and construct a ~X.Y.Z spec.
|
|
174
174
|
*/
|
|
175
175
|
function resolveLatestFgvVersion() {
|
|
176
176
|
var _a;
|
|
@@ -183,7 +183,7 @@ function resolveLatestFgvVersion() {
|
|
|
183
183
|
return `~${version}`;
|
|
184
184
|
}
|
|
185
185
|
/**
|
|
186
|
-
* Update all
|
|
186
|
+
* Update all \@fgv/* dependency versions (excluding workspace:*) in a consumer repo's package.json files.
|
|
187
187
|
* Uses jsonc-parser modify() to preserve formatting.
|
|
188
188
|
*/
|
|
189
189
|
function updateVersionsInPackageJsons(repoDir, versionSpec) {
|
package/lib/commands/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Link/unlink/update-fgv-versions commands — automate cross-repo development\n * between fgv and consumer Rush monorepos.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { parse as parseJsonc } from 'jsonc-parser';\nimport { IPatchOperation, patchFile } from '../packlets/jsonc';\n\n// ── Interfaces ──\n\nexport interface ILinkOptions {\n fgvDir: string;\n repoDir: string;\n}\n\nexport interface IUnlinkOptions {\n repoDir: string;\n version?: string;\n}\n\nexport interface IUpdateFgvVersionsOptions {\n repoDir: string;\n version?: string;\n}\n\ninterface IRushProject {\n packageName: string;\n projectFolder: string;\n}\n\ninterface IPackageJsonDependencies {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\ntype FgvDependencyGraph = Map<string, Set<string>>;\n\n// ── Discovery helpers ──\n\n/**\n * Read a rush.json and return its project entries.\n */\nfunction readRushProjects(rushJsonPath: string): IRushProject[] {\n const content = fs.readFileSync(rushJsonPath, 'utf-8');\n const rush = parseJsonc(content) as { projects: IRushProject[] };\n return rush.projects;\n}\n\n/**\n * Read a package.json and return its dependency sections.\n */\nfunction readPackageJson(pkgJsonPath: string): IPackageJsonDependencies {\n return JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')) as IPackageJsonDependencies;\n}\n\n/**\n * Collect a package.json's dependency names for direct consumer discovery.\n */\nfunction collectDirectFgvDependencies(pkgJson: IPackageJsonDependencies): Set<string> {\n const allDeps: Record<string, string> = {\n ...(pkgJson.dependencies ?? {}),\n ...(pkgJson.devDependencies ?? {}),\n ...(pkgJson.peerDependencies ?? {})\n };\n\n const deps = new Set<string>();\n for (const [name, spec] of Object.entries(allDeps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n deps.add(name);\n }\n }\n\n return deps;\n}\n\n/**\n * Scan a consumer Rush repo and collect all @fgv/* dependencies (excluding workspace:* entries).\n * Returns a map of packageName -> list of project folders that depend on it.\n */\nfunction discoverFgvDeps(repoDir: string): Map<string, string[]> {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const deps = new Map<string, string[]>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = readPackageJson(pkgJsonPath);\n for (const name of collectDirectFgvDependencies(pkgJson)) {\n const existing = deps.get(name) ?? [];\n existing.push(project.projectFolder);\n deps.set(name, existing);\n }\n }\n\n return deps;\n}\n\n/**\n * Build an internal @fgv package dependency graph from the fgv worktree.\n * Only dependencies that exist in the fgv Rush projects are retained.\n */\nfunction buildFgvDependencyGraph(fgvDir: string, fgvPackageMap: Map<string, string>): FgvDependencyGraph {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const graph = new Map<string, Set<string>>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(fgvDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = readPackageJson(pkgJsonPath);\n const internalDeps = new Set<string>();\n const allDeps: Record<string, string> = {\n ...(pkgJson.dependencies ?? {}),\n ...(pkgJson.devDependencies ?? {}),\n ...(pkgJson.peerDependencies ?? {})\n };\n\n for (const [dependencyName] of Object.entries(allDeps)) {\n if (fgvPackageMap.has(dependencyName) && dependencyName !== project.packageName) {\n internalDeps.add(dependencyName);\n }\n }\n\n graph.set(project.packageName, internalDeps);\n }\n\n return graph;\n}\n\n/**\n * Expand a set of package names to include all transitive internal dependencies.\n */\nfunction expandFgvDependencyClosure(\n seedPackageNames: Iterable<string>,\n graph: FgvDependencyGraph\n): Set<string> {\n const resolved = new Set<string>();\n const pending = [...seedPackageNames];\n\n while (pending.length > 0) {\n const packageName = pending.pop();\n if (!packageName || resolved.has(packageName)) {\n continue;\n }\n\n resolved.add(packageName);\n const directDeps = graph.get(packageName);\n if (!directDeps) {\n continue;\n }\n\n for (const dependencyName of directDeps) {\n if (!resolved.has(dependencyName)) {\n pending.push(dependencyName);\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Read the fgv worktree's rush.json and build a map of packageName -> projectFolder.\n */\nfunction buildFgvPackageMap(fgvDir: string): Map<string, string> {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const map = new Map<string, string>();\n for (const project of projects) {\n map.set(project.packageName, project.projectFolder);\n }\n return map;\n}\n\n// ── Version helpers ──\n\n/**\n * Query npm for the latest prerelease version of @fgv/ts-utils and construct a ~X.Y.Z spec.\n */\nfunction resolveLatestFgvVersion(): string {\n const output = execSync('npm view @fgv/ts-utils dist-tags --json', { encoding: 'utf-8' });\n const tags = JSON.parse(output) as Record<string, string>;\n const version = tags.alpha ?? tags.latest;\n if (!version) {\n throw new Error('Could not determine latest @fgv version from npm dist-tags');\n }\n return `~${version}`;\n}\n\n/**\n * Update all @fgv/* dependency versions (excluding workspace:*) in a consumer repo's package.json files.\n * Uses jsonc-parser modify() to preserve formatting.\n */\nfunction updateVersionsInPackageJsons(repoDir: string, versionSpec: string): string[] {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n const projects = readRushProjects(rushJsonPath);\n const changed: string[] = [];\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n const operations: IPatchOperation[] = [];\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps: Record<string, string> | undefined = pkgJson[depField];\n if (!deps) continue;\n\n for (const [name, spec] of Object.entries(deps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n operations.push({\n type: 'set-json',\n path: `${depField}.${name}`,\n value: JSON.stringify(versionSpec)\n });\n }\n }\n }\n\n if (operations.length > 0) {\n patchFile(pkgJsonPath, operations);\n changed.push(pkgJsonPath);\n }\n }\n\n return changed;\n}\n\n// ── Command runners ──\n\nexport async function runLink(options: ILinkOptions): Promise<void> {\n const { fgvDir, repoDir } = options;\n\n console.log(`==> Linking to local fgv worktree`);\n console.log(` fgv dir: ${fgvDir}`);\n console.log(` repo dir: ${repoDir}`);\n\n const fgvDeps = discoverFgvDeps(repoDir);\n if (fgvDeps.size === 0) {\n console.log(' No @fgv/* dependencies found in consumer repo.');\n return;\n }\n\n const fgvPackageMap = buildFgvPackageMap(fgvDir);\n const fgvDependencyGraph = buildFgvDependencyGraph(fgvDir, fgvPackageMap);\n const linkedPackageNames = expandFgvDependencyClosure(fgvDeps.keys(), fgvDependencyGraph);\n\n // Compute file: overrides relative to common/temp/\n const commonTempDir = path.join(repoDir, 'common', 'temp');\n const overrides: Record<string, string> = {};\n const warnings: string[] = [];\n\n for (const packageName of linkedPackageNames) {\n const projectFolder = fgvPackageMap.get(packageName);\n if (!projectFolder) {\n warnings.push(` Warning: ${packageName} not found in fgv worktree — skipping`);\n continue;\n }\n const absoluteProjectPath = path.join(fgvDir, projectFolder);\n const relativePath = path.relative(commonTempDir, absoluteProjectPath);\n overrides[packageName] = `file:${relativePath}`;\n }\n\n for (const w of warnings) {\n console.warn(w);\n }\n\n // Patch pnpm-config.json\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify(overrides)\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: false\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({ ignoreMissing: ['mustache'], allowAny: ['@fgv/*'] })\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n\n console.log(`\\n Patched: ${pnpmConfigPath}`);\n console.log(` Overrides (${Object.keys(overrides).length} packages):`);\n for (const [name, filePath] of Object.entries(overrides)) {\n console.log(` ${name} -> ${filePath}`);\n }\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUnlink(options: IUnlinkOptions): Promise<void> {\n const { repoDir, version } = options;\n\n console.log(`==> Unlinking from local fgv worktree`);\n console.log(` repo dir: ${repoDir}`);\n\n // Restore pnpm-config.json to defaults\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify({})\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: true\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({})\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n console.log(` Patched: ${pnpmConfigPath} (restored defaults)`);\n\n // Optionally bump versions\n if (version) {\n console.log(`\\n Bumping @fgv/* deps to ${version}...`);\n const changed = updateVersionsInPackageJsons(repoDir, version);\n console.log(` Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n }\n\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUpdateFgvVersions(options: IUpdateFgvVersionsOptions): Promise<void> {\n const { repoDir } = options;\n\n console.log(`==> Updating @fgv/* version specs`);\n console.log(` repo dir: ${repoDir}`);\n\n // Resolve version\n let versionSpec: string;\n if (options.version) {\n versionSpec = options.version;\n console.log(` Using explicit version: ${versionSpec}`);\n } else {\n console.log(' Querying npm for latest version...');\n versionSpec = resolveLatestFgvVersion();\n console.log(` Resolved version: ${versionSpec}`);\n }\n\n const changed = updateVersionsInPackageJsons(repoDir, versionSpec);\n console.log(`\\n Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n\n if (changed.length > 0) {\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Link/unlink/update-fgv-versions commands — automate cross-repo development\n * between fgv and consumer Rush monorepos.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { parse as parseJsonc } from 'jsonc-parser';\nimport { IPatchOperation, patchFile } from '../packlets/jsonc';\n\n// ── Interfaces ──\n\n/**\n * Options for the link command, which sets up file: overrides to a local fgv worktree.\n * @public\n */\nexport interface ILinkOptions {\n fgvDir: string;\n repoDir: string;\n}\n\n/**\n * Options for the unlink command, which restores published package dependencies.\n * @public\n */\nexport interface IUnlinkOptions {\n repoDir: string;\n version?: string;\n}\n\n/**\n * Options for the update-fgv-versions command, which bumps \\@fgv/* dependency version specs across all projects.\n * @public\n */\nexport interface IUpdateFgvVersionsOptions {\n repoDir: string;\n version?: string;\n}\n\ninterface IRushProject {\n packageName: string;\n projectFolder: string;\n}\n\ninterface IPackageJsonDependencies {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\ntype FgvDependencyGraph = Map<string, Set<string>>;\n\n// ── Discovery helpers ──\n\n/**\n * Read a rush.json and return its project entries.\n */\nfunction readRushProjects(rushJsonPath: string): IRushProject[] {\n const content = fs.readFileSync(rushJsonPath, 'utf-8');\n const rush = parseJsonc(content) as { projects: IRushProject[] };\n return rush.projects;\n}\n\n/**\n * Read a package.json and return its dependency sections.\n */\nfunction readPackageJson(pkgJsonPath: string): IPackageJsonDependencies {\n return JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')) as IPackageJsonDependencies;\n}\n\n/**\n * Collect a package.json's dependency names for direct consumer discovery.\n */\nfunction collectDirectFgvDependencies(pkgJson: IPackageJsonDependencies): Set<string> {\n const allDeps: Record<string, string> = {\n ...(pkgJson.dependencies ?? {}),\n ...(pkgJson.devDependencies ?? {}),\n ...(pkgJson.peerDependencies ?? {})\n };\n\n const deps = new Set<string>();\n for (const [name, spec] of Object.entries(allDeps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n deps.add(name);\n }\n }\n\n return deps;\n}\n\n/**\n * Scan a consumer Rush repo and collect all \\@fgv/* dependencies (excluding workspace:* entries).\n * Returns a map of packageName to list of project folders that depend on it.\n */\nfunction discoverFgvDeps(repoDir: string): Map<string, string[]> {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const deps = new Map<string, string[]>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = readPackageJson(pkgJsonPath);\n for (const name of collectDirectFgvDependencies(pkgJson)) {\n const existing = deps.get(name) ?? [];\n existing.push(project.projectFolder);\n deps.set(name, existing);\n }\n }\n\n return deps;\n}\n\n/**\n * Build an internal \\@fgv package dependency graph from the fgv worktree.\n * Only dependencies that exist in the fgv Rush projects are retained.\n */\nfunction buildFgvDependencyGraph(fgvDir: string, fgvPackageMap: Map<string, string>): FgvDependencyGraph {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const graph = new Map<string, Set<string>>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(fgvDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = readPackageJson(pkgJsonPath);\n const internalDeps = new Set<string>();\n const allDeps: Record<string, string> = {\n ...(pkgJson.dependencies ?? {}),\n ...(pkgJson.devDependencies ?? {}),\n ...(pkgJson.peerDependencies ?? {})\n };\n\n for (const [dependencyName] of Object.entries(allDeps)) {\n if (fgvPackageMap.has(dependencyName) && dependencyName !== project.packageName) {\n internalDeps.add(dependencyName);\n }\n }\n\n graph.set(project.packageName, internalDeps);\n }\n\n return graph;\n}\n\n/**\n * Expand a set of package names to include all transitive internal dependencies.\n */\nfunction expandFgvDependencyClosure(\n seedPackageNames: Iterable<string>,\n graph: FgvDependencyGraph\n): Set<string> {\n const resolved = new Set<string>();\n const pending = [...seedPackageNames];\n\n while (pending.length > 0) {\n const packageName = pending.pop();\n if (!packageName || resolved.has(packageName)) {\n continue;\n }\n\n resolved.add(packageName);\n const directDeps = graph.get(packageName);\n if (!directDeps) {\n continue;\n }\n\n for (const dependencyName of directDeps) {\n if (!resolved.has(dependencyName)) {\n pending.push(dependencyName);\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Read the fgv worktree's rush.json and build a map of packageName to projectFolder.\n */\nfunction buildFgvPackageMap(fgvDir: string): Map<string, string> {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const map = new Map<string, string>();\n for (const project of projects) {\n map.set(project.packageName, project.projectFolder);\n }\n return map;\n}\n\n// ── Version helpers ──\n\n/**\n * Query npm for the latest prerelease version of \\@fgv/ts-utils and construct a ~X.Y.Z spec.\n */\nfunction resolveLatestFgvVersion(): string {\n const output = execSync('npm view @fgv/ts-utils dist-tags --json', { encoding: 'utf-8' });\n const tags = JSON.parse(output) as Record<string, string>;\n const version = tags.alpha ?? tags.latest;\n if (!version) {\n throw new Error('Could not determine latest @fgv version from npm dist-tags');\n }\n return `~${version}`;\n}\n\n/**\n * Update all \\@fgv/* dependency versions (excluding workspace:*) in a consumer repo's package.json files.\n * Uses jsonc-parser modify() to preserve formatting.\n */\nfunction updateVersionsInPackageJsons(repoDir: string, versionSpec: string): string[] {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n const projects = readRushProjects(rushJsonPath);\n const changed: string[] = [];\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n const operations: IPatchOperation[] = [];\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps: Record<string, string> | undefined = pkgJson[depField];\n if (!deps) continue;\n\n for (const [name, spec] of Object.entries(deps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n operations.push({\n type: 'set-json',\n path: `${depField}.${name}`,\n value: JSON.stringify(versionSpec)\n });\n }\n }\n }\n\n if (operations.length > 0) {\n patchFile(pkgJsonPath, operations);\n changed.push(pkgJsonPath);\n }\n }\n\n return changed;\n}\n\n// ── Command runners ──\n\nexport async function runLink(options: ILinkOptions): Promise<void> {\n const { fgvDir, repoDir } = options;\n\n console.log(`==> Linking to local fgv worktree`);\n console.log(` fgv dir: ${fgvDir}`);\n console.log(` repo dir: ${repoDir}`);\n\n const fgvDeps = discoverFgvDeps(repoDir);\n if (fgvDeps.size === 0) {\n console.log(' No @fgv/* dependencies found in consumer repo.');\n return;\n }\n\n const fgvPackageMap = buildFgvPackageMap(fgvDir);\n const fgvDependencyGraph = buildFgvDependencyGraph(fgvDir, fgvPackageMap);\n const linkedPackageNames = expandFgvDependencyClosure(fgvDeps.keys(), fgvDependencyGraph);\n\n // Compute file: overrides relative to common/temp/\n const commonTempDir = path.join(repoDir, 'common', 'temp');\n const overrides: Record<string, string> = {};\n const warnings: string[] = [];\n\n for (const packageName of linkedPackageNames) {\n const projectFolder = fgvPackageMap.get(packageName);\n if (!projectFolder) {\n warnings.push(` Warning: ${packageName} not found in fgv worktree — skipping`);\n continue;\n }\n const absoluteProjectPath = path.join(fgvDir, projectFolder);\n const relativePath = path.relative(commonTempDir, absoluteProjectPath);\n overrides[packageName] = `file:${relativePath}`;\n }\n\n for (const w of warnings) {\n console.warn(w);\n }\n\n // Patch pnpm-config.json\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify(overrides)\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: false\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({ ignoreMissing: ['mustache'], allowAny: ['@fgv/*'] })\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n\n console.log(`\\n Patched: ${pnpmConfigPath}`);\n console.log(` Overrides (${Object.keys(overrides).length} packages):`);\n for (const [name, filePath] of Object.entries(overrides)) {\n console.log(` ${name} -> ${filePath}`);\n }\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUnlink(options: IUnlinkOptions): Promise<void> {\n const { repoDir, version } = options;\n\n console.log(`==> Unlinking from local fgv worktree`);\n console.log(` repo dir: ${repoDir}`);\n\n // Restore pnpm-config.json to defaults\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify({})\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: true\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({})\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n console.log(` Patched: ${pnpmConfigPath} (restored defaults)`);\n\n // Optionally bump versions\n if (version) {\n console.log(`\\n Bumping @fgv/* deps to ${version}...`);\n const changed = updateVersionsInPackageJsons(repoDir, version);\n console.log(` Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n }\n\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUpdateFgvVersions(options: IUpdateFgvVersionsOptions): Promise<void> {\n const { repoDir } = options;\n\n console.log(`==> Updating @fgv/* version specs`);\n console.log(` repo dir: ${repoDir}`);\n\n // Resolve version\n let versionSpec: string;\n if (options.version) {\n versionSpec = options.version;\n console.log(` Using explicit version: ${versionSpec}`);\n } else {\n console.log(' Querying npm for latest version...');\n versionSpec = resolveLatestFgvVersion();\n console.log(` Resolved version: ${versionSpec}`);\n }\n\n const changed = updateVersionsInPackageJsons(repoDir, versionSpec);\n console.log(`\\n Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n\n if (changed.length > 0) {\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6BAAwC;AAA/B,sGAAA,eAAe,OAAA;AACxB,4CAA8D;AAArD,mGAAA,SAAS,OAAA;AAClB,wCAAwD;AAA/C,+FAAA,OAAO,OAAA;AAChB,0CAA2E;AAAlE,iGAAA,QAAQ,OAAA;AAAiB,uGAAA,cAAc,OAAA;AAChD,wDAAqG;AAA5F,8GAAA,cAAc,OAAA;AACvB,wCAOyB;AANvB,+FAAA,OAAO,OAAA;AACP,iGAAA,SAAS,OAAA;AACT,4GAAA,oBAAoB,OAAA;AAKtB,0CAA+F;AAAtF,wGAAA,eAAe,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,kGAAA,SAAS,OAAA;AACnD,gDAA2G;AAAlG,wGAAA,YAAY,OAAA;AACrB,gDAAwF;AAA/E,0GAAA,cAAc,OAAA;AAAE,8GAAA,kBAAkB,OAAA","sourcesContent":["/**\n *
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6BAAwC;AAA/B,sGAAA,eAAe,OAAA;AACxB,4CAA8D;AAArD,mGAAA,SAAS,OAAA;AAClB,wCAAwD;AAA/C,+FAAA,OAAO,OAAA;AAChB,0CAA2E;AAAlE,iGAAA,QAAQ,OAAA;AAAiB,uGAAA,cAAc,OAAA;AAChD,wDAAqG;AAA5F,8GAAA,cAAc,OAAA;AACvB,wCAOyB;AANvB,+FAAA,OAAO,OAAA;AACP,iGAAA,SAAS,OAAA;AACT,4GAAA,oBAAoB,OAAA;AAKtB,0CAA+F;AAAtF,wGAAA,eAAe,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,kGAAA,SAAS,OAAA;AACnD,gDAA2G;AAAlG,wGAAA,YAAY,OAAA;AACrB,gDAAwF;AAA/E,0GAAA,cAAc,OAAA;AAAE,8GAAA,kBAAkB,OAAA","sourcesContent":["/**\n * \\@fgv/repo-template — CLI tool for creating and maintaining fgv-derived Rush monorepos.\n *\n * @packageDocumentation\n */\n\nexport { RepoTemplateCli } from './cli';\nexport { runCreate, ICreateOptions } from './commands/create';\nexport { runSync, ISyncOptions } from './commands/sync';\nexport { runPatch, IPatchOptions, parsePatchArgs } from './commands/patch';\nexport { runInitLibrary, IInitLibraryOptions, RigType, CategoryType } from './commands/init-library';\nexport {\n runLink,\n runUnlink,\n runUpdateFgvVersions,\n ILinkOptions,\n IUnlinkOptions,\n IUpdateFgvVersionsOptions\n} from './commands/link';\nexport { applyOperations, applyOperation, patchFile, IPatchOperation } from './packlets/jsonc';\nexport { loadManifest, IManifest, ISharedFile, ISharedPackage, ITemplatedFile } from './packlets/manifest';\nexport { renderTemplate, renderTemplateFile, ITemplateVars } from './packlets/template';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/fs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAY,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/fs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAY,eAAe,EAAE,MAAM,eAAe,CAAC;AAe1D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAS3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAOnE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAOvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAK5E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBpE"}
|
package/lib/packlets/fs/index.js
CHANGED
|
@@ -50,7 +50,15 @@ const child_process_1 = require("child_process");
|
|
|
50
50
|
/**
|
|
51
51
|
* Directories to exclude when copying shared packages.
|
|
52
52
|
*/
|
|
53
|
-
const EXCLUDED_DIRS = new Set([
|
|
53
|
+
const EXCLUDED_DIRS = new Set([
|
|
54
|
+
'node_modules',
|
|
55
|
+
'lib',
|
|
56
|
+
'dist',
|
|
57
|
+
'.heft',
|
|
58
|
+
'temp',
|
|
59
|
+
'coverage',
|
|
60
|
+
'rush-logs'
|
|
61
|
+
]);
|
|
54
62
|
/**
|
|
55
63
|
* Copy a single file, creating parent directories as needed.
|
|
56
64
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/fs/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/fs/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * File system and shell execution helpers.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync, ExecSyncOptions } from 'child_process';\n\n/**\n * Directories to exclude when copying shared packages.\n */\nconst EXCLUDED_DIRS: Set<string> = new Set([\n 'node_modules',\n 'lib',\n 'dist',\n '.heft',\n 'temp',\n 'coverage',\n 'rush-logs'\n]);\n\n/**\n * Copy a single file, creating parent directories as needed.\n */\nexport function copyFile(src: string, dest: string): void {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.copyFileSync(src, dest);\n}\n\n/**\n * Copy a directory recursively, excluding build artifacts.\n */\nexport function copyPackage(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n fs.cpSync(src, dest, {\n recursive: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n return !EXCLUDED_DIRS.has(basename);\n }\n });\n}\n\n/**\n * Compare two files for equality.\n * Returns true if files are identical.\n */\nexport function filesAreEqual(pathA: string, pathB: string): boolean {\n if (!fs.existsSync(pathA) || !fs.existsSync(pathB)) {\n return false;\n }\n const a = fs.readFileSync(pathA);\n const b = fs.readFileSync(pathB);\n return Buffer.compare(a, b) === 0;\n}\n\n/**\n * Execute a shell command, returning stdout.\n */\nexport function exec(command: string, options?: ExecSyncOptions): string {\n const result = execSync(command, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n ...options\n });\n return (result as string).trim();\n}\n\n/**\n * Execute a shell command, inheriting stdio (output goes to terminal).\n */\nexport function execInherit(command: string, options?: ExecSyncOptions): void {\n execSync(command, {\n stdio: 'inherit',\n ...options\n });\n}\n\n/**\n * Try to get the current git commit hash from a directory.\n * Returns empty string if not a git repo or git is not available.\n */\nexport function getGitCommit(dir: string): string {\n try {\n return exec('git rev-parse HEAD', { cwd: dir });\n } catch {\n return '';\n }\n}\n\n/**\n * Try to get the git remote URL from a directory.\n */\nexport function getGitRemoteUrl(dir: string): string {\n try {\n return exec('git remote get-url origin', { cwd: dir });\n } catch {\n return 'local';\n }\n}\n\n/**\n * Auto-detect the fgv source repository root by walking up from a starting directory,\n * looking for a rush.json that belongs to the fgv repo.\n */\nexport function detectSourceDir(startDir: string): string | undefined {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const rushJsonPath = path.join(dir, 'rush.json');\n if (fs.existsSync(rushJsonPath)) {\n // Verify it looks like the fgv repo by checking for the template tool\n const manifestPath = path.join(dir, 'tools', 'repo-template', 'sync-manifest.json');\n if (fs.existsSync(manifestPath)) {\n return dir;\n }\n }\n dir = path.dirname(dir);\n }\n return undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/jsonc/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAaD;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcpD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/jsonc/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAaD;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcpD;AAyBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CAoC1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM,CAMrF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,CAK/E"}
|
|
@@ -52,6 +52,7 @@ function escapeRegExp(str) {
|
|
|
52
52
|
* Handles `// "propertyName": value` patterns.
|
|
53
53
|
*/
|
|
54
54
|
function uncommentProperty(source, propertyName) {
|
|
55
|
+
/* eslint-disable-next-line @rushstack/security/no-unsafe-regexp */
|
|
55
56
|
const pattern = new RegExp(`^(\\s*)\\/\\/\\s*("${escapeRegExp(propertyName)}"\\s*:.*)$`, 'm');
|
|
56
57
|
const match = source.match(pattern);
|
|
57
58
|
if (!match) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/jsonc/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAgCH,gCAcC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/jsonc/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAgCH,gCAcC;AA4BD,wCAoCC;AAKD,0CAMC;AAKD,8BAKC;AAjID,+CAAqE;AAErE,MAAM,kBAAkB,GAAsB;IAC5C,OAAO,EAAE,CAAC;IACV,YAAY,EAAE,IAAI;IAClB,GAAG,EAAE,IAAI;CACV,CAAC;AAUF;;;GAGG;AACH,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IACtD,sCAAsC;IACtC,IACE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EACpD,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,YAAoB;IAC7D,mEAAmE;IACnE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,sBAAsB,YAAY,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAE9F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,qDAAqD,YAAY,gBAAgB,CAAC,CAAC;QAChG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAc,EAAE,EAAmB;IAChE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAA,qBAAM,EAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC5F,OAAO,IAAA,yBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAe,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAA,qBAAM,EAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACzF,OAAO,IAAA,yBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,oEAAoE;YACpE,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;YAC3C,OAAO,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAe,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAA,qBAAM,EAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;gBACrD,iBAAiB,EAAE,kBAAkB;gBACrC,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAC;YACH,OAAO,IAAA,yBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAA,qBAAM,EAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC7F,OAAO,IAAA,yBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,2BAA4B,EAAsB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,MAAc,EAAE,UAA6B;IAC3E,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,QAAgB,EAAE,UAA6B;IACvE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC","sourcesContent":["/**\n * JSONC patching operations using jsonc-parser.\n * Modifies JSON-with-comments files while preserving all comments and formatting.\n */\n\nimport { modify, applyEdits, FormattingOptions } from 'jsonc-parser';\n\nconst FORMATTING_OPTIONS: FormattingOptions = {\n tabSize: 2,\n insertSpaces: true,\n eol: '\\n'\n};\n\nexport type PatchOperationType = 'set' | 'set-json' | 'uncomment' | 'add-to-array' | 'remove';\n\nexport interface IPatchOperation {\n type: PatchOperationType;\n path: string;\n value?: unknown;\n}\n\n/**\n * Parse a dot-separated path into a JSON path array.\n * Numeric segments are treated as array indices.\n */\nfunction parsePath(pathStr: string): (string | number)[] {\n return pathStr.split('.').map((seg) => {\n const num = Number(seg);\n return Number.isInteger(num) && num >= 0 ? num : seg;\n });\n}\n\n/**\n * Parse a value string into a JS value.\n */\nexport function parseValue(valueStr: string): unknown {\n if (valueStr === 'true') return true;\n if (valueStr === 'false') return false;\n if (valueStr === 'null') return null;\n const num = Number(valueStr);\n if (!isNaN(num) && valueStr.trim() !== '') return num;\n // Strip surrounding quotes if present\n if (\n (valueStr.startsWith('\"') && valueStr.endsWith('\"')) ||\n (valueStr.startsWith(\"'\") && valueStr.endsWith(\"'\"))\n ) {\n return valueStr.slice(1, -1);\n }\n return valueStr;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Uncomment a commented-out JSON property in a JSONC string.\n * Handles `// \"propertyName\": value` patterns.\n */\nfunction uncommentProperty(source: string, propertyName: string): string {\n /* eslint-disable-next-line @rushstack/security/no-unsafe-regexp */\n const pattern = new RegExp(`^(\\\\s*)\\\\/\\\\/\\\\s*(\"${escapeRegExp(propertyName)}\"\\\\s*:.*)$`, 'm');\n\n const match = source.match(pattern);\n if (!match) {\n console.warn(` Warning: Could not find commented-out property \"${propertyName}\" to uncomment`);\n return source;\n }\n\n const indent = match[1];\n const content = match[2];\n return source.replace(match[0], `${indent}${content}`);\n}\n\n/**\n * Apply a single patch operation to a JSONC source string.\n */\nexport function applyOperation(source: string, op: IPatchOperation): string {\n switch (op.type) {\n case 'set': {\n const jsonPath = parsePath(op.path);\n const edits = modify(source, jsonPath, op.value, { formattingOptions: FORMATTING_OPTIONS });\n return applyEdits(source, edits);\n }\n case 'set-json': {\n const jsonPath = parsePath(op.path);\n const value = JSON.parse(op.value as string);\n const edits = modify(source, jsonPath, value, { formattingOptions: FORMATTING_OPTIONS });\n return applyEdits(source, edits);\n }\n case 'uncomment': {\n // Use the leaf property name for the regex, since nested properties\n // appear as just their leaf name in the file.\n const leafName = op.path.split('.').pop()!;\n return uncommentProperty(source, leafName);\n }\n case 'add-to-array': {\n const jsonPath = parsePath(op.path);\n const value = JSON.parse(op.value as string);\n const edits = modify(source, [...jsonPath, -1], value, {\n formattingOptions: FORMATTING_OPTIONS,\n isArrayInsertion: true\n });\n return applyEdits(source, edits);\n }\n case 'remove': {\n const jsonPath = parsePath(op.path);\n const edits = modify(source, jsonPath, undefined, { formattingOptions: FORMATTING_OPTIONS });\n return applyEdits(source, edits);\n }\n default:\n throw new Error(`Unknown operation type: ${(op as IPatchOperation).type}`);\n }\n}\n\n/**\n * Apply a sequence of patch operations to a JSONC source string.\n */\nexport function applyOperations(source: string, operations: IPatchOperation[]): string {\n let result = source;\n for (const op of operations) {\n result = applyOperation(result, op);\n }\n return result;\n}\n\n/**\n * Read a JSONC file, apply patch operations, and write it back.\n */\nexport function patchFile(filePath: string, operations: IPatchOperation[]): void {\n const fs = require('fs');\n let source = fs.readFileSync(filePath, 'utf-8');\n source = applyOperations(source, operations);\n fs.writeFileSync(filePath, source);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/template/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/template/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAO5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAWpG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C"}
|
|
@@ -47,6 +47,7 @@ const path = __importStar(require("path"));
|
|
|
47
47
|
function renderTemplate(template, vars) {
|
|
48
48
|
let result = template;
|
|
49
49
|
for (const [key, value] of Object.entries(vars)) {
|
|
50
|
+
/* eslint-disable-next-line @rushstack/security/no-unsafe-regexp */
|
|
50
51
|
result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
|
|
51
52
|
}
|
|
52
53
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/template/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/template/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeH,wCAOC;AAKD,gDAWC;AAKD,wDAGC;AA5CD,uCAAyB;AACzB,2CAA6B;AAS7B;;GAEG;AACH,SAAgB,cAAc,CAAC,QAAgB,EAAE,IAAmB;IAClE,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,mEAAmE;QACnE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,YAAoB,EAAE,QAAgB,EAAE,IAAmB;IAC5F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/**\n * Template rendering — simple variable substitution for .tmpl files.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface ITemplateVars {\n REPO_URL: string;\n VERSION_POLICY_NAME: string;\n VERSION: string;\n [key: string]: string;\n}\n\n/**\n * Render a template string by replacing `{{VAR_NAME}}` placeholders.\n */\nexport function renderTemplate(template: string, vars: ITemplateVars): string {\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n /* eslint-disable-next-line @rushstack/security/no-unsafe-regexp */\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n}\n\n/**\n * Read a template file, render it with variables, and write to destination.\n */\nexport function renderTemplateFile(templatePath: string, destPath: string, vars: ITemplateVars): void {\n if (!fs.existsSync(templatePath)) {\n console.warn(` WARNING: Template not found, skipping: ${templatePath}`);\n return;\n }\n\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n const template = fs.readFileSync(templatePath, 'utf-8');\n const rendered = renderTemplate(template, vars);\n fs.writeFileSync(destPath, rendered);\n console.log(` Generated: ${destPath}`);\n}\n\n/**\n * Resolve the default templates directory relative to this tool's location.\n */\nexport function getDefaultTemplatesDir(): string {\n const toolRoot = path.resolve(__dirname, '..', '..', '..');\n return path.join(toolRoot, 'templates');\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fgv/repo-template",
|
|
3
|
-
"version": "5.1.0-
|
|
3
|
+
"version": "5.1.0-28",
|
|
4
4
|
"description": "CLI tool for creating and maintaining fgv-derived Rush monorepos",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"@rushstack/heft": "1.2.7",
|
|
16
16
|
"@rushstack/heft-node-rig": "2.11.27",
|
|
17
17
|
"@types/node": "^20.14.9",
|
|
18
|
-
"typescript": "5.9.3"
|
|
18
|
+
"typescript": "5.9.3",
|
|
19
|
+
"@rushstack/eslint-config": "4.6.4"
|
|
19
20
|
},
|
|
20
21
|
"repository": {
|
|
21
22
|
"type": "git",
|