swallowkit 1.0.0-beta.60 → 1.0.0-beta.61
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/README.ja.md +3 -0
- package/README.md +3 -0
- package/dist/cli/commands/add-connector.d.ts.map +1 -1
- package/dist/cli/commands/add-connector.js +2 -1
- package/dist/cli/commands/add-connector.js.map +1 -1
- package/dist/cli/commands/create-model.js +1 -1
- package/dist/cli/commands/create-model.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -5
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +45 -154
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/scaffold.js +1 -1
- package/dist/cli/commands/scaffold.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/project/agent-instructions.d.ts.map +1 -1
- package/dist/core/project/agent-instructions.js +2 -1
- package/dist/core/project/agent-instructions.js.map +1 -1
- package/dist/core/scaffold/model-parser.d.ts.map +1 -1
- package/dist/core/scaffold/model-parser.js +43 -92
- package/dist/core/scaffold/model-parser.js.map +1 -1
- package/dist/utils/package-manager.d.ts +4 -10
- package/dist/utils/package-manager.d.ts.map +1 -1
- package/dist/utils/package-manager.js +23 -15
- package/dist/utils/package-manager.js.map +1 -1
- package/package.json +8 -13
- package/src/__tests__/agent-instructions.test.ts +1 -1
- package/src/__tests__/connector-mock-server.test.ts +45 -25
- package/src/__tests__/init.test.ts +2 -50
- package/src/__tests__/model-parser.test.ts +61 -0
- package/src/__tests__/package-manager.test.ts +22 -5
- package/src/cli/commands/add-connector.ts +2 -1
- package/src/cli/commands/create-model.ts +1 -1
- package/src/cli/commands/init.ts +46 -173
- package/src/cli/commands/scaffold.ts +1 -1
- package/src/cli/index.ts +2 -0
- package/src/core/project/agent-instructions.ts +2 -2
- package/src/core/project/agent-templates/AGENTS.md +2 -0
- package/src/core/scaffold/model-parser.ts +40 -113
- package/src/utils/package-manager.ts +22 -17
package/README.ja.md
CHANGED
|
@@ -94,6 +94,9 @@ npx swallowkit init my-app
|
|
|
94
94
|
cd my-app
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
+
pnpm 11/12 は `pnpm dlx swallowkit init my-app` で作成し、以後 project 内で `pnpm exec swallowkit …` を使います。`npx` は npm を選択し、`--package-manager npm|pnpm` で明示指定できます。Node.js 22.14 以上が必要です。MCP は選択した manager で意図的に `latest` を参照します。[コマンド・workspace・security の詳細](docs/ja/package-managers.md)を参照してください。
|
|
98
|
+
|
|
99
|
+
|
|
97
100
|
モデルを作成し、スキーマを編集します。
|
|
98
101
|
|
|
99
102
|
```bash
|
package/README.md
CHANGED
|
@@ -94,6 +94,9 @@ npx swallowkit init my-app
|
|
|
94
94
|
cd my-app
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
+
For pnpm 11/12: bootstrap with `pnpm dlx swallowkit init my-app`, then use `pnpm exec swallowkit …` inside the project. `npx` selects npm; `--package-manager npm|pnpm` overrides detection. Node.js 22.14+ is required. MCP intentionally uses `latest` with the selected package manager. See [commands, workspace setup, and security troubleshooting](docs/en/package-managers.md).
|
|
98
|
+
|
|
99
|
+
|
|
97
100
|
Create a model and customize the schema:
|
|
98
101
|
|
|
99
102
|
```bash
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-connector.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add-connector.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"add-connector.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add-connector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAsB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGtE,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,iBAuBrE;AAoCD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,mBAAmB,GAChC,IAAI,CAwCN"}
|
|
@@ -40,6 +40,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
40
40
|
exports.addConnectorCommand = addConnectorCommand;
|
|
41
41
|
exports.updateConfigWithConnector = updateConfigWithConnector;
|
|
42
42
|
const fs = __importStar(require("fs"));
|
|
43
|
+
const package_manager_1 = require("../../utils/package-manager");
|
|
43
44
|
const path = __importStar(require("path"));
|
|
44
45
|
const config_1 = require("../../core/config");
|
|
45
46
|
const manifest_1 = require("../../core/project/manifest");
|
|
@@ -63,7 +64,7 @@ async function addConnectorCommand(options) {
|
|
|
63
64
|
console.log("\n📝 Next steps:");
|
|
64
65
|
console.log(` 1. Review the connector settings in ${configPath}`);
|
|
65
66
|
console.log(` 2. Set the required environment variables in functions/local.settings.json`);
|
|
66
|
-
console.log(` 3. Create models with:
|
|
67
|
+
console.log(` 3. Create models with: ${(0, package_manager_1.getCommands)((0, package_manager_1.detectFromProject)()).exec} swallowkit create-model <name> --connector=${options.name}`);
|
|
67
68
|
}
|
|
68
69
|
function findConfigFile() {
|
|
69
70
|
const candidates = ["swallowkit.config.js", "swallowkit.config.json", ".swallowkitrc.json"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-connector.js","sourceRoot":"","sources":["../../../src/cli/commands/add-connector.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"add-connector.js","sourceRoot":"","sources":["../../../src/cli/commands/add-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ async function createModelCommand(options) {
|
|
|
81
81
|
if (result.createdFiles.length > 0) {
|
|
82
82
|
console.log("\n📝 Next steps:");
|
|
83
83
|
console.log(" 1. Customize the generated model fields in shared/models/");
|
|
84
|
-
console.log(` 2. Run '${(0, package_manager_1.getCommands)((0, package_manager_1.detectFromProject)()).
|
|
84
|
+
console.log(` 2. Run '${(0, package_manager_1.getCommands)((0, package_manager_1.detectFromProject)()).exec} swallowkit scaffold <model>' to generate CRUD code`);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
//# sourceMappingURL=create-model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-model.js","sourceRoot":"","sources":["../../../src/cli/commands/create-model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,gDA+BC;AA7DD,mDAAqC;AACrC,qEAA0E;AAC1E,iEAA6E;AAQ7E;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAoB,EAAC;QACxC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,QAAQ;QACvB,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,QAAQ,qCAAqC,CAAC;KACjH,CAAC,CAAC;IAEH,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,YAAY,CAAC,MAAM,cAAc,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,YAAY,CAAC,MAAM,cAAc,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,aAAa,IAAA,6BAAW,EAAC,IAAA,mCAAiB,GAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"create-model.js","sourceRoot":"","sources":["../../../src/cli/commands/create-model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,gDA+BC;AA7DD,mDAAqC;AACrC,qEAA0E;AAC1E,iEAA6E;AAQ7E;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAoB,EAAC;QACxC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,QAAQ;QACvB,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,QAAQ,qCAAqC,CAAC;KACjH,CAAC,CAAC;IAEH,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,YAAY,CAAC,MAAM,cAAc,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,YAAY,CAAC,MAAM,cAAc,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,aAAa,IAAA,6BAAW,EAAC,IAAA,mCAAiB,GAAE,CAAC,CAAC,IAAI,qDAAqD,CAAC,CAAC;IACvH,CAAC;AACH,CAAC"}
|
|
@@ -9,6 +9,7 @@ interface InitOptions {
|
|
|
9
9
|
cosmosDbMode?: CosmosDbMode;
|
|
10
10
|
vnet?: VNetOption;
|
|
11
11
|
swaPlan?: StaticWebAppPlan;
|
|
12
|
+
packageManager?: PackageManager;
|
|
12
13
|
}
|
|
13
14
|
type CiCdProvider = 'github' | 'azure' | 'skip';
|
|
14
15
|
type CosmosDbMode = 'freetier' | 'serverless';
|
|
@@ -47,11 +48,6 @@ export declare function withNpmLockfileSafeManifests(projectDir: string, action:
|
|
|
47
48
|
* return the bare package names (without versions), de-duplicated.
|
|
48
49
|
*/
|
|
49
50
|
export declare function parseIgnoredBuilds(output: string): string[];
|
|
50
|
-
/**
|
|
51
|
-
* pnpm-workspace.yaml の allowBuilds にパッケージを true で登録して build script を許可する。
|
|
52
|
-
* (pnpm 11+ の正準設定。失敗時に pnpm が追記する placeholder 行も true に置き換える)
|
|
53
|
-
*/
|
|
54
|
-
export declare function approveBuildsViaWorkspaceYaml(projectDir: string, packages: string[]): void;
|
|
55
51
|
export declare function injectSwallowKitNextConfig(nextConfigContent: string, projectName: string): string;
|
|
56
52
|
export declare function buildCSharpFunctionsProgramSource(): string;
|
|
57
53
|
export declare function buildCSharpFunctionsProjectSource(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,KAAK,cAAc,EAWpB,MAAM,6BAA6B,CAAC;AAUrC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,6 @@ exports.buildSharedTsConfig = buildSharedTsConfig;
|
|
|
42
42
|
exports.initCommand = initCommand;
|
|
43
43
|
exports.withNpmLockfileSafeManifests = withNpmLockfileSafeManifests;
|
|
44
44
|
exports.parseIgnoredBuilds = parseIgnoredBuilds;
|
|
45
|
-
exports.approveBuildsViaWorkspaceYaml = approveBuildsViaWorkspaceYaml;
|
|
46
45
|
exports.injectSwallowKitNextConfig = injectSwallowKitNextConfig;
|
|
47
46
|
exports.buildCSharpFunctionsProgramSource = buildCSharpFunctionsProgramSource;
|
|
48
47
|
exports.buildCSharpFunctionsProjectSource = buildCSharpFunctionsProjectSource;
|
|
@@ -259,6 +258,9 @@ const VALID_COSMOS_DB_MODE = ['freetier', 'serverless'];
|
|
|
259
258
|
const VALID_VNET = ['none', 'outbound'];
|
|
260
259
|
const VALID_SWA_PLAN = ['free', 'standard'];
|
|
261
260
|
function validateInitFlags(options) {
|
|
261
|
+
if (options.packageManager && !['npm', 'pnpm'].includes(options.packageManager)) {
|
|
262
|
+
throw new Error('Invalid --package-manager: expected npm or pnpm');
|
|
263
|
+
}
|
|
262
264
|
if (options.cicd && !VALID_CICD.includes(options.cicd)) {
|
|
263
265
|
console.error(`❌ Invalid --cicd value: "${options.cicd}". Must be: ${VALID_CICD.join(', ')}`);
|
|
264
266
|
process.exit(1);
|
|
@@ -286,7 +288,7 @@ async function initCommand(options) {
|
|
|
286
288
|
console.log(`🚀 Initializing SwallowKit project: ${options.name}`);
|
|
287
289
|
console.log(`📋 Template: ${options.template}`);
|
|
288
290
|
// Detect package manager from invocation context (npx → npm, pnpm dlx → pnpm)
|
|
289
|
-
const pm = (0, package_manager_1.detectFromUserAgent)();
|
|
291
|
+
const pm = options.packageManager || (0, package_manager_1.detectFromUserAgent)();
|
|
290
292
|
const pmCmd = (0, package_manager_1.getCommands)(pm);
|
|
291
293
|
console.log(`📦 Package manager: ${pm}`);
|
|
292
294
|
const projectDir = path.join(process.cwd(), options.name);
|
|
@@ -379,11 +381,11 @@ async function initCommand(options) {
|
|
|
379
381
|
console.log(`\n✅ Project "${options.name}" created successfully!`);
|
|
380
382
|
console.log("\n📝 Next steps:");
|
|
381
383
|
console.log(` cd ${options.name}`);
|
|
382
|
-
console.log(` ${pmCmd.
|
|
383
|
-
console.log(` ${pmCmd.
|
|
384
|
-
console.log(` ${pmCmd.
|
|
384
|
+
console.log(` ${pmCmd.exec} swallowkit create-model <name> # Create your first model`);
|
|
385
|
+
console.log(` ${pmCmd.exec} swallowkit scaffold shared/models/<name>.ts # Generate CRUD code`);
|
|
386
|
+
console.log(` ${pmCmd.exec} swallowkit dev # Start development servers`);
|
|
385
387
|
console.log("\n🚀 Deploy to Azure:");
|
|
386
|
-
console.log(` ${pmCmd.
|
|
388
|
+
console.log(` ${pmCmd.exec} swallowkit provision --resource-group <name>`);
|
|
387
389
|
if (cicdProvider !== 'skip') {
|
|
388
390
|
console.log(" Configure CI/CD secrets and push to repository");
|
|
389
391
|
}
|
|
@@ -405,7 +407,7 @@ async function createNextJsProject(projectName, pm) {
|
|
|
405
407
|
// for npm use "npx create-next-app@latest ..."
|
|
406
408
|
const baseArgs = pm === 'pnpm'
|
|
407
409
|
? ['dlx', 'create-next-app@latest']
|
|
408
|
-
: ['create-next-app@latest'];
|
|
410
|
+
: ['--yes', '--package', 'create-next-app@latest', '--', 'create-next-app'];
|
|
409
411
|
const args = [
|
|
410
412
|
...baseArgs,
|
|
411
413
|
projectName,
|
|
@@ -414,6 +416,7 @@ async function createNextJsProject(projectName, pm) {
|
|
|
414
416
|
'--app',
|
|
415
417
|
'--no-src',
|
|
416
418
|
'--disable-git',
|
|
419
|
+
'--skip-install',
|
|
417
420
|
'--import-alias',
|
|
418
421
|
'@/*',
|
|
419
422
|
...(pmCmd.createNextAppFlag ? [pmCmd.createNextAppFlag] : []),
|
|
@@ -442,20 +445,14 @@ async function upgradeNextJs(projectDir, version, pm) {
|
|
|
442
445
|
console.log(`\n📦 Installing Next.js ${version} (to ensure latest security patches)...\n`);
|
|
443
446
|
// pnpm: pnpm add next@... ; npm: npm install next@...
|
|
444
447
|
const args = pm === 'pnpm'
|
|
445
|
-
? ['add', `next@${version}`, `react@latest`, `react-dom@latest`, '--save-exact']
|
|
446
|
-
: ['install', `next@${version}`, `react@latest`, `react-dom@latest`, '--save-exact'];
|
|
448
|
+
? ['add', `next@${version}`, `react@latest`, `react-dom@latest`, '--save-exact', '--lockfile-only']
|
|
449
|
+
: ['install', `next@${version}`, `react@latest`, `react-dom@latest`, '--save-exact', '--package-lock-only'];
|
|
447
450
|
await runPackageManagerCommand(pm, args, projectDir, `${pm} add next@${version}`);
|
|
448
451
|
console.log(`\n✅ Next.js ${version} installed\n`);
|
|
449
452
|
}
|
|
450
453
|
async function installDependencies(projectDir, pm = 'pnpm') {
|
|
451
454
|
console.log('\n📦 Installing dependencies...\n');
|
|
452
|
-
await runPackageManagerCommand(pm, ['install'], projectDir, `${pm} install`);
|
|
453
|
-
if (pm === 'pnpm') {
|
|
454
|
-
console.log('\n📦 Generating npm lockfile for CI/CD...\n');
|
|
455
|
-
await withNpmLockfileSafeManifests(projectDir, async () => {
|
|
456
|
-
await runPackageManagerCommand('npm', ['install', '--package-lock-only', '--ignore-scripts'], projectDir, 'npm install --package-lock-only');
|
|
457
|
-
});
|
|
458
|
-
}
|
|
455
|
+
await runPackageManagerCommand(pm, pm === 'pnpm' ? ['install', '--no-frozen-lockfile'] : ['install'], projectDir, `${pm} install`);
|
|
459
456
|
console.log('\n✅ Dependencies installed\n');
|
|
460
457
|
}
|
|
461
458
|
async function withNpmLockfileSafeManifests(projectDir, action) {
|
|
@@ -530,56 +527,19 @@ async function withNpmLockfileSafeManifests(projectDir, action) {
|
|
|
530
527
|
}
|
|
531
528
|
}
|
|
532
529
|
}
|
|
533
|
-
/**
|
|
534
|
-
* Run a package-manager command with stdio passed through to the user.
|
|
535
|
-
*
|
|
536
|
-
* For pnpm, additionally tee stdout/stderr to a buffer so that if the command
|
|
537
|
-
* fails due to `ERR_PNPM_IGNORED_BUILDS`, we can:
|
|
538
|
-
* 1. detect which packages were ignored,
|
|
539
|
-
* 2. approve them (interactively or automatically),
|
|
540
|
-
* 3. clean-reinstall and retry — repeating if pnpm reports further ignored
|
|
541
|
-
* packages (pnpm does not always list every unapproved package at once).
|
|
542
|
-
*/
|
|
530
|
+
/** Run installs without changing the project security policy. */
|
|
543
531
|
async function runPackageManagerCommand(pm, args, projectDir, label) {
|
|
544
|
-
|
|
532
|
+
const { code, output } = await spawnAndCapture(pm, args, projectDir, pm === 'pnpm');
|
|
545
533
|
if (code === 0)
|
|
546
534
|
return;
|
|
547
535
|
if (pm === 'pnpm') {
|
|
548
|
-
for (let attempt = 0; attempt < 3; attempt++) {
|
|
549
|
-
const ignoredBuilds = parseIgnoredBuilds(output);
|
|
550
|
-
if (ignoredBuilds.length === 0)
|
|
551
|
-
break;
|
|
552
|
-
const approved = await maybeApproveBuilds(projectDir, ignoredBuilds);
|
|
553
|
-
if (!approved)
|
|
554
|
-
break;
|
|
555
|
-
// 中断された install はパッケージ抽出が不完全なまま "Already up to date"
|
|
556
|
-
// と判定されることがあるため、node_modules を消して決定論的に入れ直す
|
|
557
|
-
removeWorkspaceNodeModules(projectDir);
|
|
558
|
-
const retry = await spawnAndCapture(pm, args, projectDir, true);
|
|
559
|
-
code = retry.code;
|
|
560
|
-
output = retry.output;
|
|
561
|
-
if (code === 0)
|
|
562
|
-
return;
|
|
563
|
-
}
|
|
564
536
|
if (parseIgnoredBuilds(output).length > 0) {
|
|
565
537
|
throw new Error(`${label} exited with code ${code}: pnpm still reports unapproved build scripts. ` +
|
|
566
|
-
'
|
|
538
|
+
'Review the named dependencies and project security policy before allowing any scripts. SwallowKit does not auto-approve them.');
|
|
567
539
|
}
|
|
568
540
|
}
|
|
569
541
|
throw new Error(`${label} exited with code ${code}`);
|
|
570
542
|
}
|
|
571
|
-
/** workspace root と直下パッケージの node_modules を削除する(クリーン再インストール用)。 */
|
|
572
|
-
function removeWorkspaceNodeModules(projectDir) {
|
|
573
|
-
const targets = [projectDir, ...fs.readdirSync(projectDir, { withFileTypes: true })
|
|
574
|
-
.filter((entry) => entry.isDirectory() && entry.name !== 'node_modules' && !entry.name.startsWith('.'))
|
|
575
|
-
.map((entry) => path.join(projectDir, entry.name))];
|
|
576
|
-
for (const dir of targets) {
|
|
577
|
-
const nodeModules = path.join(dir, 'node_modules');
|
|
578
|
-
if (fs.existsSync(nodeModules)) {
|
|
579
|
-
fs.rmSync(nodeModules, { recursive: true, force: true });
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
543
|
/**
|
|
584
544
|
* Spawn a child process inheriting stdin (so interactive prompts still work)
|
|
585
545
|
* while either inheriting or capturing+teeing stdout/stderr.
|
|
@@ -625,86 +585,6 @@ function parseIgnoredBuilds(output) {
|
|
|
625
585
|
.filter((name) => name.length > 0);
|
|
626
586
|
return Array.from(new Set(list));
|
|
627
587
|
}
|
|
628
|
-
/**
|
|
629
|
-
* Prompt the user and, if approved, run `pnpm approve-builds` followed by
|
|
630
|
-
* `pnpm rebuild <packages>`. Returns true if the user approved (regardless of
|
|
631
|
-
* which packages they actually selected inside approve-builds).
|
|
632
|
-
*
|
|
633
|
-
* In non-interactive environments (CI, coding agents, piped output) prompting
|
|
634
|
-
* would hang forever, so build scripts are approved automatically via
|
|
635
|
-
* package.json `pnpm.onlyBuiltDependencies` instead.
|
|
636
|
-
*/
|
|
637
|
-
async function maybeApproveBuilds(projectDir, ignoredBuilds) {
|
|
638
|
-
console.log(`\n⚠️ pnpm refused to run build scripts for: ${ignoredBuilds.join(', ')}\n` +
|
|
639
|
-
' These packages (e.g. sharp) need their build scripts to run correctly.\n');
|
|
640
|
-
const interactive = process.stdin.isTTY === true && process.stdout.isTTY === true && !process.env.CI;
|
|
641
|
-
if (!interactive) {
|
|
642
|
-
console.log('ℹ️ Non-interactive environment detected — approving build scripts automatically\n' +
|
|
643
|
-
' via "allowBuilds" in pnpm-workspace.yaml.\n');
|
|
644
|
-
// rebuild は不要: 呼び出し側がクリーン再インストールで build script を実行する
|
|
645
|
-
approveBuildsViaWorkspaceYaml(projectDir, ignoredBuilds);
|
|
646
|
-
return true;
|
|
647
|
-
}
|
|
648
|
-
const response = await (0, prompts_1.default)({
|
|
649
|
-
type: 'confirm',
|
|
650
|
-
name: 'approve',
|
|
651
|
-
message: 'Run `pnpm approve-builds` now to approve these build scripts?',
|
|
652
|
-
initial: true,
|
|
653
|
-
});
|
|
654
|
-
if (!response.approve) {
|
|
655
|
-
console.log('\nℹ️ Skipped. You can run `pnpm approve-builds` later inside the project directory.\n');
|
|
656
|
-
return false;
|
|
657
|
-
}
|
|
658
|
-
await runSimple('pnpm', ['approve-builds'], projectDir);
|
|
659
|
-
await runSimple('pnpm', ['rebuild', ...ignoredBuilds], projectDir);
|
|
660
|
-
console.log('\n✅ Build scripts approved and packages rebuilt\n');
|
|
661
|
-
return true;
|
|
662
|
-
}
|
|
663
|
-
/**
|
|
664
|
-
* pnpm-workspace.yaml の allowBuilds にパッケージを true で登録して build script を許可する。
|
|
665
|
-
* (pnpm 11+ の正準設定。失敗時に pnpm が追記する placeholder 行も true に置き換える)
|
|
666
|
-
*/
|
|
667
|
-
function approveBuildsViaWorkspaceYaml(projectDir, packages) {
|
|
668
|
-
const workspaceYamlPath = path.join(projectDir, 'pnpm-workspace.yaml');
|
|
669
|
-
const existing = fs.existsSync(workspaceYamlPath)
|
|
670
|
-
? fs.readFileSync(workspaceYamlPath, 'utf-8')
|
|
671
|
-
: '';
|
|
672
|
-
const yamlKey = (pkg) => (/^[A-Za-z0-9_.-]+$/.test(pkg) ? pkg : `'${pkg}'`);
|
|
673
|
-
const lines = existing.length > 0 ? existing.split(/\r?\n/) : [];
|
|
674
|
-
const keyIndex = lines.findIndex((line) => /^allowBuilds\s*:/.test(line));
|
|
675
|
-
if (keyIndex === -1) {
|
|
676
|
-
const block = `allowBuilds:\n${packages.map((pkg) => ` ${yamlKey(pkg)}: true`).join('\n')}\n`;
|
|
677
|
-
const base = existing.length > 0 && !existing.endsWith('\n') ? `${existing}\n` : existing;
|
|
678
|
-
fs.writeFileSync(workspaceYamlPath, `${base}${block}`, 'utf-8');
|
|
679
|
-
return;
|
|
680
|
-
}
|
|
681
|
-
// 既存マップ内の対象パッケージ(placeholder 含む)を true に更新し、無いものは追記する
|
|
682
|
-
let endIndex = keyIndex + 1;
|
|
683
|
-
const updated = new Set();
|
|
684
|
-
while (endIndex < lines.length && /^\s+\S/.test(lines[endIndex])) {
|
|
685
|
-
const entry = lines[endIndex].match(/^\s+['"]?([A-Za-z0-9@/_.-]+)['"]?\s*:/);
|
|
686
|
-
if (entry && packages.includes(entry[1])) {
|
|
687
|
-
lines[endIndex] = ` ${yamlKey(entry[1])}: true`;
|
|
688
|
-
updated.add(entry[1]);
|
|
689
|
-
}
|
|
690
|
-
endIndex++;
|
|
691
|
-
}
|
|
692
|
-
const additions = packages.filter((pkg) => !updated.has(pkg)).map((pkg) => ` ${yamlKey(pkg)}: true`);
|
|
693
|
-
lines.splice(endIndex, 0, ...additions);
|
|
694
|
-
fs.writeFileSync(workspaceYamlPath, lines.join('\n'), 'utf-8');
|
|
695
|
-
}
|
|
696
|
-
function runSimple(command, args, cwd) {
|
|
697
|
-
return new Promise((resolve, reject) => {
|
|
698
|
-
const child = (0, child_process_1.spawn)(command, args, { cwd, stdio: 'inherit', shell: true });
|
|
699
|
-
child.on('close', (code) => {
|
|
700
|
-
if (code !== 0)
|
|
701
|
-
reject(new Error(`${command} ${args.join(' ')} exited with code ${code}`));
|
|
702
|
-
else
|
|
703
|
-
resolve();
|
|
704
|
-
});
|
|
705
|
-
child.on('error', reject);
|
|
706
|
-
});
|
|
707
|
-
}
|
|
708
588
|
function injectSwallowKitNextConfig(nextConfigContent, projectName) {
|
|
709
589
|
return nextConfigContent.replace(/(const\s+nextConfig[:\s]*(?::\s*NextConfig\s*)?=\s*\{)(\s*\/\*[^*]*\*\/)?/, `$1\n output: 'standalone',\n agentRules: false, // SwallowKit owns the canonical root AGENTS.md contract\n transpilePackages: ['@${projectName}/shared'],\n serverExternalPackages: ['applicationinsights', 'diagnostic-channel-publishers'],$2`);
|
|
710
590
|
}
|
|
@@ -822,7 +702,7 @@ async function addSwallowKitFiles(projectDir, options, cicdChoice, azureConfig,
|
|
|
822
702
|
// 1. Update package.json to add runtime dependencies for generated projects
|
|
823
703
|
const packageJsonPath = path.join(projectDir, 'package.json');
|
|
824
704
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
825
|
-
//
|
|
705
|
+
// Root BFF/auth code imports Zod directly; declare it as well as the shared package.
|
|
826
706
|
packageJson.dependencies = {
|
|
827
707
|
...packageJson.dependencies,
|
|
828
708
|
...buildGeneratedProjectDependencies(projectName, pm),
|
|
@@ -838,8 +718,13 @@ async function addSwallowKitFiles(projectDir, options, cicdChoice, azureConfig,
|
|
|
838
718
|
'functions:start': (0, package_manager_1.getFunctionsStartScript)(pm, backendLanguage),
|
|
839
719
|
};
|
|
840
720
|
packageJson.engines = {
|
|
841
|
-
node: '
|
|
721
|
+
node: '>=22.14.0',
|
|
722
|
+
...(pm === 'pnpm' ? { pnpm: '>=11 <13' } : {}),
|
|
723
|
+
};
|
|
724
|
+
packageJson.devEngines = {
|
|
725
|
+
packageManager: { name: pm, version: pm === 'pnpm' ? '>=11 <13' : '>=10', onFail: 'error' },
|
|
842
726
|
};
|
|
727
|
+
delete packageJson.packageManager;
|
|
843
728
|
// Keep package.json workspaces for npm-based CI/CD even when local development uses pnpm.
|
|
844
729
|
const workspacePackages = usesNodeFunctionsProject(backendLanguage) ? ['shared', 'functions'] : ['shared'];
|
|
845
730
|
const wsConfig = (0, package_manager_1.getWorkspaceConfig)(pm, workspacePackages);
|
|
@@ -1614,7 +1499,7 @@ export default function Home() {
|
|
|
1614
1499
|
Create your first model with Zod and generate CRUD operations automatically.
|
|
1615
1500
|
</p>
|
|
1616
1501
|
<code className="block bg-gray-100 dark:bg-gray-900 p-4 rounded text-left text-sm">
|
|
1617
|
-
${pmCmd.
|
|
1502
|
+
${pmCmd.exec} swallowkit scaffold shared/models/your-model.ts
|
|
1618
1503
|
</code>
|
|
1619
1504
|
</div>
|
|
1620
1505
|
</section>
|
|
@@ -1700,7 +1585,7 @@ This project was initialized with the following settings:
|
|
|
1700
1585
|
|
|
1701
1586
|
Before you begin, ensure you have the following installed:
|
|
1702
1587
|
|
|
1703
|
-
1. **Node.js
|
|
1588
|
+
1. **Node.js 22.14+**: [Download](https://nodejs.org/)${pm === 'pnpm' ? `\n2. **pnpm**: \`corepack enable\` or \`npm install -g pnpm\`` : ''}
|
|
1704
1589
|
${pm === 'pnpm' ? '3' : '2'}. **Azure CLI**: Required for provisioning Azure resources
|
|
1705
1590
|
- Install: \`winget install Microsoft.AzureCLI\` (Windows)
|
|
1706
1591
|
- Or: [Download](https://aka.ms/installazurecliwindows)
|
|
@@ -1708,7 +1593,7 @@ ${pm === 'pnpm' ? '4' : '3'}. **Azure Cosmos DB Emulator**: Required for local d
|
|
|
1708
1593
|
- Windows: \`winget install Microsoft.Azure.CosmosEmulator\`
|
|
1709
1594
|
- Or: [Download](https://aka.ms/cosmosdb-emulator)
|
|
1710
1595
|
- Docker: \`docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator\`
|
|
1711
|
-
${pm === 'pnpm' ? '6' : '5'}. **Azure Functions Core Tools**:
|
|
1596
|
+
${pm === 'pnpm' ? '6' : '5'}. **Azure Functions Core Tools v4**: Install separately for local Azure Functions execution
|
|
1712
1597
|
|
|
1713
1598
|
## 📁 Project Structure
|
|
1714
1599
|
|
|
@@ -1734,7 +1619,7 @@ ${functionsTree}
|
|
|
1734
1619
|
Define your data model with Zod schema:
|
|
1735
1620
|
|
|
1736
1621
|
\`\`\`bash
|
|
1737
|
-
${pmCmd.
|
|
1622
|
+
${pmCmd.exec} swallowkit create-model <model-name>
|
|
1738
1623
|
\`\`\`
|
|
1739
1624
|
|
|
1740
1625
|
This creates a model file in \`shared/models/<model-name>.ts\`. Edit it to define your schema.
|
|
@@ -1744,7 +1629,7 @@ This creates a model file in \`shared/models/<model-name>.ts\`. Edit it to defin
|
|
|
1744
1629
|
Generate complete CRUD operations (Functions, API routes, UI):
|
|
1745
1630
|
|
|
1746
1631
|
\`\`\`bash
|
|
1747
|
-
${pmCmd.
|
|
1632
|
+
${pmCmd.exec} swallowkit scaffold shared/models/<model-name>.ts
|
|
1748
1633
|
\`\`\`
|
|
1749
1634
|
|
|
1750
1635
|
This generates:
|
|
@@ -1756,7 +1641,7 @@ ${backendScaffoldNote}
|
|
|
1756
1641
|
### 3. Start Development Servers
|
|
1757
1642
|
|
|
1758
1643
|
\`\`\`bash
|
|
1759
|
-
${pmCmd.
|
|
1644
|
+
${pmCmd.exec} swallowkit dev
|
|
1760
1645
|
\`\`\`
|
|
1761
1646
|
|
|
1762
1647
|
This starts:
|
|
@@ -1774,7 +1659,7 @@ ${pythonLocalDevNote}
|
|
|
1774
1659
|
Create all required Azure resources using Bicep:
|
|
1775
1660
|
|
|
1776
1661
|
\`\`\`bash
|
|
1777
|
-
${pmCmd.
|
|
1662
|
+
${pmCmd.exec} swallowkit provision --resource-group <rg-name>
|
|
1778
1663
|
\`\`\`
|
|
1779
1664
|
|
|
1780
1665
|
This creates:
|
|
@@ -1830,10 +1715,10 @@ func azure functionapp publish func-${projectName}
|
|
|
1830
1715
|
|
|
1831
1716
|
## 🔧 Available Commands
|
|
1832
1717
|
|
|
1833
|
-
- \`${pmCmd.
|
|
1834
|
-
- \`${pmCmd.
|
|
1835
|
-
- \`${pmCmd.
|
|
1836
|
-
- \`${pmCmd.
|
|
1718
|
+
- \`${pmCmd.exec} swallowkit create-model <name>\` - Create a new data model
|
|
1719
|
+
- \`${pmCmd.exec} swallowkit scaffold <model-file>\` - Generate CRUD code
|
|
1720
|
+
- \`${pmCmd.exec} swallowkit dev\` - Start development servers
|
|
1721
|
+
- \`${pmCmd.exec} swallowkit provision -g <rg-name>\` - Provision Azure resources
|
|
1837
1722
|
${azureConfig.vnetOption !== 'none' ? `
|
|
1838
1723
|
## 🔒 Network Security (VNet Configuration)
|
|
1839
1724
|
|
|
@@ -1882,7 +1767,7 @@ This project was generated by SwallowKit. If you encounter any issues or have su
|
|
|
1882
1767
|
}
|
|
1883
1768
|
function createAiAgentFiles(projectDir, projectName, backendLanguage, pm) {
|
|
1884
1769
|
console.log('🤖 Creating AI agent instruction files...\n');
|
|
1885
|
-
const runCmd = pm
|
|
1770
|
+
const runCmd = (0, package_manager_1.getCommands)(pm).exec;
|
|
1886
1771
|
(0, agent_instructions_1.writeAgentInstructionFiles)(projectDir, {
|
|
1887
1772
|
projectName,
|
|
1888
1773
|
backendLanguage,
|
|
@@ -2637,11 +2522,13 @@ function getGitHubFunctionsWorkflow(pm, backendLanguage, projectPm = pm) {
|
|
|
2637
2522
|
const npmWorkspaceNormalizationStep = getGitHubNpmWorkspaceNormalizationStep(pm, projectPm);
|
|
2638
2523
|
const commonSetup = ` - uses: actions/checkout@v4
|
|
2639
2524
|
|
|
2525
|
+
${pnpmSetupStep ? `${pnpmSetupStep}\n` : ''}
|
|
2640
2526
|
- name: Setup Node.js
|
|
2641
2527
|
uses: actions/setup-node@v4
|
|
2642
2528
|
with:
|
|
2643
2529
|
node-version: '22'
|
|
2644
|
-
|
|
2530
|
+
cache: ${pm}
|
|
2531
|
+
cache-dependency-path: ${pm === 'pnpm' ? 'pnpm-lock.yaml' : 'package-lock.json'}
|
|
2645
2532
|
${npmWorkspaceNormalizationStep ? `\n${npmWorkspaceNormalizationStep}` : ''}
|
|
2646
2533
|
- name: Install dependencies
|
|
2647
2534
|
run: |
|
|
@@ -3156,7 +3043,7 @@ async function createGitHubActionsWorkflows(projectDir, azureConfig, pm, backend
|
|
|
3156
3043
|
console.log('📦 Creating GitHub Actions workflows...\n');
|
|
3157
3044
|
const workflowsDir = path.join(projectDir, '.github', 'workflows');
|
|
3158
3045
|
fs.mkdirSync(workflowsDir, { recursive: true });
|
|
3159
|
-
const actionsPm =
|
|
3046
|
+
const actionsPm = pm;
|
|
3160
3047
|
const swaWorkflow = buildGitHubSwaWorkflow(actionsPm, pm);
|
|
3161
3048
|
fs.writeFileSync(path.join(workflowsDir, 'deploy-swa.yml'), swaWorkflow);
|
|
3162
3049
|
// deploy-functions.yml
|
|
@@ -3179,6 +3066,7 @@ on:
|
|
|
3179
3066
|
- 'shared/**'
|
|
3180
3067
|
- 'public/**'
|
|
3181
3068
|
- 'package.json'
|
|
3069
|
+
- '${pm === 'pnpm' ? 'pnpm-lock.yaml' : 'package-lock.json'}'
|
|
3182
3070
|
- 'next.config.js'
|
|
3183
3071
|
- 'next.config.ts'
|
|
3184
3072
|
workflow_dispatch:
|
|
@@ -3192,6 +3080,7 @@ on:
|
|
|
3192
3080
|
- 'shared/**'
|
|
3193
3081
|
- 'public/**'
|
|
3194
3082
|
- 'package.json'
|
|
3083
|
+
- '${pm === 'pnpm' ? 'pnpm-lock.yaml' : 'package-lock.json'}'
|
|
3195
3084
|
- 'next.config.js'
|
|
3196
3085
|
- 'next.config.ts'
|
|
3197
3086
|
|
|
@@ -3205,11 +3094,13 @@ jobs:
|
|
|
3205
3094
|
with:
|
|
3206
3095
|
submodules: true
|
|
3207
3096
|
|
|
3097
|
+
${(0, package_manager_1.getCiSetupStep)(pm) ? `${(0, package_manager_1.getCiSetupStep)(pm)}\n` : ''}
|
|
3208
3098
|
- name: Setup Node.js
|
|
3209
3099
|
uses: actions/setup-node@v4
|
|
3210
3100
|
with:
|
|
3211
3101
|
node-version: '22'
|
|
3212
|
-
|
|
3102
|
+
cache: ${pm}
|
|
3103
|
+
cache-dependency-path: ${pm === 'pnpm' ? 'pnpm-lock.yaml' : 'package-lock.json'}
|
|
3213
3104
|
${npmWorkspaceNormalizationStep ? `\n${npmWorkspaceNormalizationStep}` : ''}
|
|
3214
3105
|
- name: Install and build app
|
|
3215
3106
|
run: |
|
|
@@ -3232,7 +3123,7 @@ ${npmWorkspaceNormalizationStep ? `\n${npmWorkspaceNormalizationStep}` : ''}
|
|
|
3232
3123
|
}
|
|
3233
3124
|
async function createAzurePipelines(projectDir, pm, backendLanguage) {
|
|
3234
3125
|
console.log('📦 Creating Azure Pipelines...\n');
|
|
3235
|
-
const pipelinesPm =
|
|
3126
|
+
const pipelinesPm = pm;
|
|
3236
3127
|
const pipelinesDir = path.join(projectDir, 'pipelines');
|
|
3237
3128
|
fs.mkdirSync(pipelinesDir, { recursive: true });
|
|
3238
3129
|
// swa.yml
|