@fgv/repo-template 5.1.0-4 → 5.1.0-41
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 +45 -6
- package/lib/cli.js.map +1 -1
- package/lib/commands/create.d.ts.map +1 -1
- package/lib/commands/create.js +2 -3
- package/lib/commands/create.js.map +1 -1
- package/lib/commands/init-library.d.ts +15 -2
- package/lib/commands/init-library.d.ts.map +1 -1
- package/lib/commands/init-library.js +57 -5
- package/lib/commands/init-library.js.map +1 -1
- package/lib/commands/link.d.ts +32 -0
- package/lib/commands/link.d.ts.map +1 -0
- package/lib/commands/link.js +345 -0
- package/lib/commands/link.js.map +1 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -2
- 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/.rush/temp/7a926ac5cf704689cbc60d1e721f48aca63d7555.tar.log +0 -57
- package/.rush/temp/chunked-rush-logs/repo-template.build.chunks.jsonl +0 -6
- package/.rush/temp/operation/build/all.log +0 -6
- package/.rush/temp/operation/build/log-chunks.jsonl +0 -6
- package/.rush/temp/operation/build/state.json +0 -3
- package/.rush/temp/shrinkwrap-deps.json +0 -576
- package/config/rig.json +0 -4
- package/rush-logs/repo-template.build.cache.log +0 -5
- package/rush-logs/repo-template.build.log +0 -6
- package/src/cli.ts +0 -141
- package/src/commands/create.ts +0 -216
- package/src/commands/init-library.ts +0 -249
- package/src/commands/patch.ts +0 -84
- package/src/commands/sync.ts +0 -137
- package/src/index.ts +0 -14
- package/src/packlets/fs/index.ts +0 -114
- package/src/packlets/jsonc/index.ts +0 -134
- package/src/packlets/manifest/index.ts +0 -29
- package/src/packlets/manifest/types.ts +0 -36
- package/src/packlets/template/index.ts +0 -48
- package/temp/build/typescript/ts_l9Fw4VUO.json +0 -1
- package/tsconfig.json +0 -7
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;
|
|
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
|
@@ -10,6 +10,7 @@ const create_1 = require("./commands/create");
|
|
|
10
10
|
const sync_1 = require("./commands/sync");
|
|
11
11
|
const patch_1 = require("./commands/patch");
|
|
12
12
|
const init_library_1 = require("./commands/init-library");
|
|
13
|
+
const link_1 = require("./commands/link");
|
|
13
14
|
class RepoTemplateCli {
|
|
14
15
|
constructor() {
|
|
15
16
|
this._program = new commander_1.Command();
|
|
@@ -74,17 +75,57 @@ class RepoTemplateCli {
|
|
|
74
75
|
.option('--repo-dir <path>', 'Rush monorepo root (default: cwd)', process.cwd())
|
|
75
76
|
.option('-p, --version-policy <name>', 'Version policy name', 'default')
|
|
76
77
|
.option('--initial-version <ver>', 'Initial version', '0.1.0')
|
|
77
|
-
.option('--fgv-dep-version <ver>', '
|
|
78
|
+
.option('--fgv-dep-version <ver>', 'Explicit version spec for @fgv/* deps (auto-detected if omitted: "workspace:*" in fgv, derived from repo-template version in consumers)')
|
|
79
|
+
.option('--fgv-dep-channel <channel>', 'Channel for auto-detected @fgv/* dep version: alpha, release, or auto (default: auto — infers from repo-template build)', 'auto')
|
|
78
80
|
.action(async (opts) => {
|
|
81
|
+
var _a;
|
|
82
|
+
const repoDir = opts.repoDir;
|
|
83
|
+
const fgvDepVersion = (_a = opts.fgvDepVersion) !== null && _a !== void 0 ? _a : (0, init_library_1.resolveFgvDepVersion)(repoDir, opts.fgvDepChannel);
|
|
79
84
|
await (0, init_library_1.runInitLibrary)({
|
|
80
85
|
name: opts.name,
|
|
81
86
|
description: opts.description,
|
|
82
87
|
rig: opts.rig,
|
|
83
88
|
category: opts.category,
|
|
84
|
-
repoDir
|
|
89
|
+
repoDir,
|
|
85
90
|
versionPolicy: opts.versionPolicy,
|
|
86
91
|
version: opts.initialVersion,
|
|
87
|
-
fgvDepVersion
|
|
92
|
+
fgvDepVersion
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
// ── link ──
|
|
96
|
+
this._program
|
|
97
|
+
.command('link')
|
|
98
|
+
.description('Link to a local fgv worktree for cross-repo development')
|
|
99
|
+
.requiredOption('--fgv-dir <path>', 'Path to the local fgv worktree')
|
|
100
|
+
.option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())
|
|
101
|
+
.action(async (opts) => {
|
|
102
|
+
await (0, link_1.runLink)({
|
|
103
|
+
fgvDir: opts.fgvDir,
|
|
104
|
+
repoDir: opts.repoDir
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// ── unlink ──
|
|
108
|
+
this._program
|
|
109
|
+
.command('unlink')
|
|
110
|
+
.description('Switch back from local fgv worktree to published npm packages')
|
|
111
|
+
.option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())
|
|
112
|
+
.option('--fgv-version <spec>', 'Also bump @fgv/* deps to this version spec')
|
|
113
|
+
.action(async (opts) => {
|
|
114
|
+
await (0, link_1.runUnlink)({
|
|
115
|
+
repoDir: opts.repoDir,
|
|
116
|
+
version: opts.fgvVersion
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
// ── update-fgv-versions ──
|
|
120
|
+
this._program
|
|
121
|
+
.command('update-fgv-versions')
|
|
122
|
+
.description('Bump @fgv/* dependency version specs across all projects')
|
|
123
|
+
.option('--repo-dir <path>', 'Consumer Rush repo root (default: cwd)', process.cwd())
|
|
124
|
+
.option('--fgv-version <spec>', 'Version spec to set (e.g. "~5.2.0"). If omitted, queries npm for latest.')
|
|
125
|
+
.action(async (opts) => {
|
|
126
|
+
await (0, link_1.runUpdateFgvVersions)({
|
|
127
|
+
repoDir: opts.repoDir,
|
|
128
|
+
version: opts.fgvVersion
|
|
88
129
|
});
|
|
89
130
|
});
|
|
90
131
|
// ── patch ──
|
|
@@ -93,9 +134,7 @@ class RepoTemplateCli {
|
|
|
93
134
|
.description('Apply targeted edits to a JSONC config file while preserving comments')
|
|
94
135
|
.allowUnknownOption(true)
|
|
95
136
|
.helpOption(false)
|
|
96
|
-
.action(async (file,
|
|
97
|
-
// Parse the raw args after the file argument as patch operations
|
|
98
|
-
const rawArgs = cmd.args.slice(1); // skip the file arg
|
|
137
|
+
.action(async (file, __opts, cmd) => {
|
|
99
138
|
// Actually, commander passes remaining args differently. Let's get them from process.argv
|
|
100
139
|
const allArgs = process.argv;
|
|
101
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 { runInitLibrary, RigType, CategoryType } from './commands/init-library';\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 'Version spec for @fgv/* deps (\"workspace:*\" in fgv, version range in consumers)',\n 'workspace:*'\n )\n .action(async (opts) => {\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: opts.repoDir,\n versionPolicy: opts.versionPolicy,\n version: opts.initialVersion,\n fgvDepVersion: opts.fgvDepVersion\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;
|
|
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
|
@@ -46,8 +46,8 @@ const manifest_1 = require("../packlets/manifest");
|
|
|
46
46
|
const jsonc_1 = require("../packlets/jsonc");
|
|
47
47
|
const template_1 = require("../packlets/template");
|
|
48
48
|
const fs_1 = require("../packlets/fs");
|
|
49
|
-
const RUSH_VERSION = '5.
|
|
50
|
-
const NODE_VERSION_RANGE = '>=
|
|
49
|
+
const RUSH_VERSION = '5.175.1';
|
|
50
|
+
const NODE_VERSION_RANGE = '>=22.22.0 <23.0.0 || >=24.15.0 <25.0.0';
|
|
51
51
|
async function runCreate(options) {
|
|
52
52
|
const { targetDir, repoUrl, versionPolicy, version, sourceDir, allowExisting, gitInit } = options;
|
|
53
53
|
// Validate
|
|
@@ -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.172.1';\n\nconst NODE_VERSION_RANGE =\n '>=14.15.0 <15.0.0 || >=16.13.0 <17.0.0 || >=18.15.0 <19.0.0 || >=20.18.0 <21.0.0 || >=22.22.0 <23.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"]}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* init-library command — scaffolds a new library package within an existing Rush monorepo.
|
|
3
3
|
*/
|
|
4
|
+
export type DepChannelType = 'alpha' | 'release' | 'auto';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the \@fgv/* dependency version spec for init-library.
|
|
7
|
+
*
|
|
8
|
+
* - In the fgv repo itself: returns "workspace:*"
|
|
9
|
+
* - In a sibling/consumer repo: derives a version range from the repo-template's own
|
|
10
|
+
* package version, choosing alpha or release channel.
|
|
11
|
+
*
|
|
12
|
+
* @param repoDir - Rush monorepo root being targeted
|
|
13
|
+
* @param channel - "alpha" for prerelease, "release" for stable, "auto" to infer from
|
|
14
|
+
* whether the repo-template is itself a prerelease build.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveFgvDepVersion(repoDir: string, channel: DepChannelType): string;
|
|
4
17
|
export type RigType = 'dual' | 'node' | 'browser';
|
|
5
18
|
export type CategoryType = 'libraries' | 'tools' | 'apps' | 'services';
|
|
6
19
|
export interface IInitLibraryOptions {
|
|
7
|
-
/** Package name (e.g. "ts-my-lib" — will be prefixed with
|
|
20
|
+
/** Package name (e.g. "ts-my-lib" — will be prefixed with \@fgv/) */
|
|
8
21
|
name: string;
|
|
9
22
|
/** Short description */
|
|
10
23
|
description: string;
|
|
@@ -18,7 +31,7 @@ export interface IInitLibraryOptions {
|
|
|
18
31
|
versionPolicy: string;
|
|
19
32
|
/** Initial version */
|
|
20
33
|
version: string;
|
|
21
|
-
/** Dependency version for
|
|
34
|
+
/** Dependency version for \@fgv/* packages ("workspace:*" for fgv, "^5.1.0-0" for consumers) */
|
|
22
35
|
fgvDepVersion: string;
|
|
23
36
|
}
|
|
24
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,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"}
|
|
@@ -36,10 +36,48 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.resolveFgvDepVersion = resolveFgvDepVersion;
|
|
39
40
|
exports.runInitLibrary = runInitLibrary;
|
|
40
41
|
const fs = __importStar(require("fs"));
|
|
41
42
|
const path = __importStar(require("path"));
|
|
42
43
|
const jsonc_1 = require("../packlets/jsonc");
|
|
44
|
+
/**
|
|
45
|
+
* Check whether a given Rush repo root is the fgv source repo itself
|
|
46
|
+
* (as opposed to a consumer/sibling repo).
|
|
47
|
+
*/
|
|
48
|
+
function isFgvRepo(repoDir) {
|
|
49
|
+
return fs.existsSync(path.join(repoDir, 'tools', 'repo-template', 'sync-manifest.json'));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Read the repo-template package's own version from its package.json.
|
|
53
|
+
*/
|
|
54
|
+
function getOwnPackageVersion() {
|
|
55
|
+
const pkgPath = path.resolve(__dirname, '..', '..', 'package.json');
|
|
56
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
57
|
+
return pkg.version;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the \@fgv/* dependency version spec for init-library.
|
|
61
|
+
*
|
|
62
|
+
* - In the fgv repo itself: returns "workspace:*"
|
|
63
|
+
* - In a sibling/consumer repo: derives a version range from the repo-template's own
|
|
64
|
+
* package version, choosing alpha or release channel.
|
|
65
|
+
*
|
|
66
|
+
* @param repoDir - Rush monorepo root being targeted
|
|
67
|
+
* @param channel - "alpha" for prerelease, "release" for stable, "auto" to infer from
|
|
68
|
+
* whether the repo-template is itself a prerelease build.
|
|
69
|
+
*/
|
|
70
|
+
function resolveFgvDepVersion(repoDir, channel) {
|
|
71
|
+
if (isFgvRepo(repoDir)) {
|
|
72
|
+
return 'workspace:*';
|
|
73
|
+
}
|
|
74
|
+
const version = getOwnPackageVersion(); // e.g. "5.1.0-6" or "5.1.0"
|
|
75
|
+
const dashIdx = version.indexOf('-');
|
|
76
|
+
const baseVersion = dashIdx >= 0 ? version.substring(0, dashIdx) : version;
|
|
77
|
+
const isPrerelease = dashIdx >= 0;
|
|
78
|
+
const useAlpha = channel === 'alpha' || (channel === 'auto' && isPrerelease);
|
|
79
|
+
return useAlpha ? `~${baseVersion}-0` : `~${baseVersion}`;
|
|
80
|
+
}
|
|
43
81
|
const RIG_CONFIGS = {
|
|
44
82
|
dual: {
|
|
45
83
|
rigPackageName: '@fgv/heft-dual-rig',
|
|
@@ -107,9 +145,12 @@ async function runInitLibrary(options) {
|
|
|
107
145
|
devDependencies['@types/heft-jest'] = '1.0.6';
|
|
108
146
|
devDependencies['@types/jest'] = '^29.5.14';
|
|
109
147
|
devDependencies['@types/node'] = '^20.14.9';
|
|
110
|
-
devDependencies
|
|
148
|
+
devDependencies.typescript = '5.9.3';
|
|
111
149
|
devDependencies['@rushstack/eslint-config'] = '4.6.4';
|
|
112
|
-
devDependencies
|
|
150
|
+
devDependencies.eslint = '^9.39.2';
|
|
151
|
+
// Typedoc dependencies
|
|
152
|
+
devDependencies.typedoc = '~0.28.16';
|
|
153
|
+
devDependencies['@fgv/typedoc-compact-theme'] = fgvDepVersion;
|
|
113
154
|
const packageJson = {
|
|
114
155
|
name: packageName,
|
|
115
156
|
version,
|
|
@@ -121,6 +162,7 @@ async function runInitLibrary(options) {
|
|
|
121
162
|
clean: 'heft clean',
|
|
122
163
|
test: 'heft test --clean',
|
|
123
164
|
coverage: 'jest --coverage',
|
|
165
|
+
'build-docs': 'typedoc --options ./config/typedoc.json',
|
|
124
166
|
lint: 'eslint src --ext .ts',
|
|
125
167
|
fixlint: 'eslint src --ext .ts --fix'
|
|
126
168
|
},
|
|
@@ -138,8 +180,8 @@ async function runInitLibrary(options) {
|
|
|
138
180
|
};
|
|
139
181
|
// Add dual-emit exports for dual rig
|
|
140
182
|
if (rig === 'dual') {
|
|
141
|
-
packageJson
|
|
142
|
-
packageJson
|
|
183
|
+
packageJson.module = 'dist/index.js';
|
|
184
|
+
packageJson.exports = {
|
|
143
185
|
'.': {
|
|
144
186
|
types: './lib/index.d.ts',
|
|
145
187
|
import: './dist/index.js',
|
|
@@ -163,7 +205,7 @@ async function runInitLibrary(options) {
|
|
|
163
205
|
rigPackageName: rigConfig.rigPackageName
|
|
164
206
|
};
|
|
165
207
|
if (rigConfig.rigProfile) {
|
|
166
|
-
rigJson
|
|
208
|
+
rigJson.rigProfile = rigConfig.rigProfile;
|
|
167
209
|
}
|
|
168
210
|
fs.writeFileSync(path.join(projectDir, 'config', 'rig.json'), JSON.stringify(rigJson, null, 2) + '\n');
|
|
169
211
|
// ── config/jest.config.json ──
|
|
@@ -182,6 +224,16 @@ async function runInitLibrary(options) {
|
|
|
182
224
|
coverageReporters: ['text', 'lcov', 'html']
|
|
183
225
|
};
|
|
184
226
|
fs.writeFileSync(path.join(projectDir, 'config', 'jest.config.json'), JSON.stringify(jestConfig, null, 2) + '\n');
|
|
227
|
+
// ── config/typedoc.json ──
|
|
228
|
+
console.log(' Creating config/typedoc.json...');
|
|
229
|
+
const typedocConfig = {
|
|
230
|
+
$schema: 'https://typedoc.org/schema.json',
|
|
231
|
+
extends: ['@fgv/heft-dual-rig/profiles/default/config/typedoc.compact-base.json'],
|
|
232
|
+
plugin: ['../../../plugins/typedoc-compact-theme/lib/index.js'],
|
|
233
|
+
entryPoints: ['../src/index.ts'],
|
|
234
|
+
out: '../docs'
|
|
235
|
+
};
|
|
236
|
+
fs.writeFileSync(path.join(projectDir, 'config', 'typedoc.json'), JSON.stringify(typedocConfig, null, 2) + '\n');
|
|
185
237
|
// ── src/index.ts ──
|
|
186
238
|
console.log(' Creating src/index.ts...');
|
|
187
239
|
fs.writeFileSync(path.join(projectDir, 'src', 'index.ts'), `/**\n * @packageDocumentation\n * ${description}\n */\n`);
|
|
@@ -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 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\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 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 // ── 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":"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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"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link/unlink/update-fgv-versions commands — automate cross-repo development
|
|
3
|
+
* between fgv and consumer Rush monorepos.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Options for the link command, which sets up file: overrides to a local fgv worktree.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export interface ILinkOptions {
|
|
10
|
+
fgvDir: string;
|
|
11
|
+
repoDir: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Options for the unlink command, which restores published package dependencies.
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export interface IUnlinkOptions {
|
|
18
|
+
repoDir: string;
|
|
19
|
+
version?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Options for the update-fgv-versions command, which bumps \@fgv/* dependency version specs across all projects.
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
25
|
+
export interface IUpdateFgvVersionsOptions {
|
|
26
|
+
repoDir: string;
|
|
27
|
+
version?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function runLink(options: ILinkOptions): Promise<void>;
|
|
30
|
+
export declare function runUnlink(options: IUnlinkOptions): Promise<void>;
|
|
31
|
+
export declare function runUpdateFgvVersions(options: IUpdateFgvVersionsOptions): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|