swallowkit 1.0.0-beta.22 โ 1.0.0-beta.23
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 +4 -4
- package/README.md +4 -4
- package/dist/cli/commands/dev.d.ts +11 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +80 -7
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -18
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/scaffold.d.ts +0 -3
- package/dist/cli/commands/scaffold.d.ts.map +1 -1
- package/dist/cli/commands/scaffold.js +3 -172
- package/dist/cli/commands/scaffold.js.map +1 -1
- package/dist/core/project/validation.js +2 -2
- package/dist/core/project/validation.js.map +1 -1
- package/dist/core/scaffold/model-parser.d.ts.map +1 -1
- package/dist/core/scaffold/model-parser.js +5 -6
- package/dist/core/scaffold/model-parser.js.map +1 -1
- package/dist/core/scaffold/native-schema-generator.d.ts +13 -0
- package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
- package/dist/core/scaffold/native-schema-generator.js +667 -0
- package/dist/core/scaffold/native-schema-generator.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/dev.test.ts +49 -0
- package/src/__tests__/model-parser.test.ts +44 -64
- package/src/__tests__/scaffold.test.ts +54 -26
- package/src/cli/commands/dev.ts +101 -8
- package/src/cli/commands/init.ts +26 -19
- package/src/cli/commands/scaffold.ts +3 -213
- package/src/core/project/validation.ts +2 -2
- package/src/core/scaffold/model-parser.ts +7 -7
- package/src/core/scaffold/native-schema-generator.ts +769 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-schema-generator.js","sourceRoot":"","sources":["../../../src/core/scaffold/native-schema-generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,11 +2,15 @@ import { readFileSync } from "fs";
|
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import {
|
|
4
4
|
buildFunctionsStartArgs,
|
|
5
|
+
buildFunctionsCoreToolsCommand,
|
|
5
6
|
buildNextDevArgs,
|
|
6
7
|
buildDevCommand,
|
|
7
8
|
buildPythonFunctionsEnv,
|
|
9
|
+
compareVersionNumbers,
|
|
8
10
|
DevOptions,
|
|
11
|
+
getCSharpFunctionsBuildArtifactPaths,
|
|
9
12
|
getPythonVirtualEnvPaths,
|
|
13
|
+
parseCoreToolsVersion,
|
|
10
14
|
} from "../cli/commands/dev";
|
|
11
15
|
import { CLI_VERSION, createProgram, normalizeDevCommandArgv } from "../cli/index";
|
|
12
16
|
|
|
@@ -23,6 +27,32 @@ describe("dev command helpers", () => {
|
|
|
23
27
|
expect(buildFunctionsStartArgs("7076")).toEqual(["start", "--port", "7076"]);
|
|
24
28
|
});
|
|
25
29
|
|
|
30
|
+
it("parses the Core Tools version from CLI output", () => {
|
|
31
|
+
expect(parseCoreToolsVersion("4.6.0+ab90faafcab539d63cd3d0ce5faf1bca4395fccc")).toBe("4.6.0");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("compares Core Tools versions numerically", () => {
|
|
35
|
+
expect(compareVersionNumbers("4.0.5198", "4.6.0")).toBeLessThan(0);
|
|
36
|
+
expect(compareVersionNumbers("4.6.0", "4.6.0")).toBe(0);
|
|
37
|
+
expect(compareVersionNumbers("4.10.0", "4.6.0")).toBeGreaterThan(0);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("falls back to npm Core Tools for older C# isolated hosts", () => {
|
|
41
|
+
expect(buildFunctionsCoreToolsCommand("csharp", "4.0.5198")).toEqual({
|
|
42
|
+
command: "npm",
|
|
43
|
+
argsPrefix: ["exec", "--yes", "azure-functions-core-tools@4", "--"],
|
|
44
|
+
label: "npm exec azure-functions-core-tools@4 (installed func 4.0.5198 is too old for C# isolated)",
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("keeps the installed func command for supported Core Tools versions", () => {
|
|
49
|
+
expect(buildFunctionsCoreToolsCommand("csharp", "4.6.0")).toEqual({
|
|
50
|
+
command: "func",
|
|
51
|
+
argsPrefix: [],
|
|
52
|
+
label: "func 4.6.0",
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
26
56
|
it("uses webpack mode for npm-based Next.js dev", () => {
|
|
27
57
|
expect(buildNextDevArgs("npm", "3012")).toEqual(["next", "dev", "--port", "3012", "--webpack"]);
|
|
28
58
|
});
|
|
@@ -40,6 +70,15 @@ describe("dev command helpers", () => {
|
|
|
40
70
|
expect(paths.pythonExecutable.endsWith(process.platform === "win32" ? path.join("Scripts", "python.exe") : path.join("bin", "python"))).toBe(true);
|
|
41
71
|
});
|
|
42
72
|
|
|
73
|
+
it("targets C# bin and obj directories for build cleanup", () => {
|
|
74
|
+
const functionsDir = path.join("C:\\repo", "functions");
|
|
75
|
+
|
|
76
|
+
expect(getCSharpFunctionsBuildArtifactPaths(functionsDir)).toEqual([
|
|
77
|
+
path.join(functionsDir, "bin"),
|
|
78
|
+
path.join(functionsDir, "obj"),
|
|
79
|
+
]);
|
|
80
|
+
});
|
|
81
|
+
|
|
43
82
|
it("injects Python virtual environment settings for Functions", () => {
|
|
44
83
|
const functionsDir = path.join("C:\\repo", "functions");
|
|
45
84
|
const env = buildPythonFunctionsEnv({ PATH: "C:\\Windows\\System32" }, functionsDir);
|
|
@@ -154,4 +193,14 @@ describe("dev CLI parser", () => {
|
|
|
154
193
|
expect(optionsBeforeCommand).toMatchObject(expected);
|
|
155
194
|
expect(optionsBeforeCommand).toMatchObject(optionsAfterCommand);
|
|
156
195
|
});
|
|
196
|
+
|
|
197
|
+
it("keeps Azure Functions enabled by default", async () => {
|
|
198
|
+
const options = await parseDevOptions([
|
|
199
|
+
"node",
|
|
200
|
+
"swallowkit",
|
|
201
|
+
"dev",
|
|
202
|
+
]);
|
|
203
|
+
|
|
204
|
+
expect(options.noFunctions).toBe(false);
|
|
205
|
+
});
|
|
157
206
|
});
|
|
@@ -1,72 +1,52 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { parseModelFile } from "../core/scaffold/model-parser";
|
|
2
4
|
|
|
3
|
-
describe("
|
|
4
|
-
it("
|
|
5
|
-
const
|
|
6
|
-
|
|
5
|
+
describe("parseModelFile", () => {
|
|
6
|
+
it("preserves array and enum metadata for schemas with defaults", async () => {
|
|
7
|
+
const tempDir = fs.mkdtempSync(path.join(process.cwd(), ".tmp-model-parser-"));
|
|
8
|
+
const modelPath = path.join(tempDir, "product.ts");
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
export type Todo = z.infer<typeof Todo>;
|
|
13
|
-
`;
|
|
14
|
-
expect(parsePartitionKey(content)).toBe("/id");
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("extracts explicit partitionKey with single quotes", () => {
|
|
18
|
-
const content = `
|
|
19
|
-
import { z } from 'zod/v4';
|
|
10
|
+
try {
|
|
11
|
+
fs.writeFileSync(
|
|
12
|
+
modelPath,
|
|
13
|
+
`import { z } from 'zod/v4';
|
|
20
14
|
|
|
21
|
-
export const
|
|
15
|
+
export const Product = z.object({
|
|
22
16
|
id: z.string(),
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
name: z.string().min(1),
|
|
18
|
+
price: z.number().min(0),
|
|
19
|
+
tags: z.array(z.string()).default([]),
|
|
20
|
+
status: z.enum(['draft', 'active', 'archived']).default('draft'),
|
|
21
|
+
createdAt: z.string().optional(),
|
|
22
|
+
updatedAt: z.string().optional(),
|
|
25
23
|
});
|
|
26
|
-
export type Order = z.infer<typeof Order>;
|
|
27
|
-
export const partitionKey = '/tenantId';
|
|
28
|
-
`;
|
|
29
|
-
expect(parsePartitionKey(content)).toBe("/tenantId");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("extracts explicit partitionKey with double quotes", () => {
|
|
33
|
-
const content = `
|
|
34
|
-
export const User = z.object({ id: z.string(), email: z.string() });
|
|
35
|
-
export const partitionKey = "/email";
|
|
36
|
-
`;
|
|
37
|
-
expect(parsePartitionKey(content)).toBe("/email");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("extracts /id as explicit partitionKey", () => {
|
|
41
|
-
const content = `
|
|
42
|
-
export const Todo = z.object({ id: z.string() });
|
|
43
|
-
export const partitionKey = '/id';
|
|
44
|
-
`;
|
|
45
|
-
expect(parsePartitionKey(content)).toBe("/id");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it("handles nested/hierarchical partition key paths", () => {
|
|
49
|
-
const content = `
|
|
50
|
-
export const partitionKey = '/address/city';
|
|
51
|
-
`;
|
|
52
|
-
expect(parsePartitionKey(content)).toBe("/address/city");
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("ignores commented-out partitionKey", () => {
|
|
56
|
-
const content = `
|
|
57
|
-
// export const partitionKey = '/tenantId';
|
|
58
|
-
export const Todo = z.object({ id: z.string() });
|
|
59
|
-
`;
|
|
60
|
-
// The regex matches inside comments too โ this is acceptable since
|
|
61
|
-
// the pattern follows the same approach as parseConnectorConfig/parseAuthPolicy
|
|
62
|
-
// In practice, commented-out exports are rare in model files
|
|
63
|
-
expect(parsePartitionKey(content)).toBe("/tenantId");
|
|
64
|
-
});
|
|
65
24
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
25
|
+
export type Product = z.infer<typeof Product>;
|
|
26
|
+
`,
|
|
27
|
+
"utf-8"
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const model = await parseModelFile(modelPath);
|
|
31
|
+
expect(model.fields).toEqual(
|
|
32
|
+
expect.arrayContaining([
|
|
33
|
+
expect.objectContaining({
|
|
34
|
+
name: "tags",
|
|
35
|
+
type: "string",
|
|
36
|
+
isArray: true,
|
|
37
|
+
isOptional: true,
|
|
38
|
+
}),
|
|
39
|
+
expect.objectContaining({
|
|
40
|
+
name: "status",
|
|
41
|
+
type: "string",
|
|
42
|
+
isArray: false,
|
|
43
|
+
isOptional: true,
|
|
44
|
+
enumValues: ["draft", "active", "archived"],
|
|
45
|
+
}),
|
|
46
|
+
])
|
|
47
|
+
);
|
|
48
|
+
} finally {
|
|
49
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
50
|
+
}
|
|
71
51
|
});
|
|
72
52
|
});
|
|
@@ -1,39 +1,67 @@
|
|
|
1
1
|
import * as path from "path";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
NSWAG_CONSOLECORE_VERSION,
|
|
4
|
+
buildCSharpCodegenToolManifestSource,
|
|
5
|
+
buildPythonCodegenRequirementsSource,
|
|
6
|
+
getCSharpNativeGeneratorArgs,
|
|
7
|
+
getCSharpSchemaModelPath,
|
|
8
|
+
getCSharpSchemaOptionPath,
|
|
9
|
+
getPythonNativeGeneratorArgs,
|
|
10
|
+
getPythonSchemaModelPath,
|
|
11
|
+
} from "../core/scaffold/native-schema-generator";
|
|
3
12
|
|
|
4
|
-
describe("
|
|
5
|
-
it("
|
|
6
|
-
const
|
|
7
|
-
const globalPropertyIndex = args.indexOf("--global-property");
|
|
13
|
+
describe("native schema generators", () => {
|
|
14
|
+
it("writes a dotnet tool manifest for NSwag", () => {
|
|
15
|
+
const manifest = JSON.parse(buildCSharpCodegenToolManifestSource());
|
|
8
16
|
|
|
9
|
-
expect(
|
|
10
|
-
expect(
|
|
17
|
+
expect(manifest.version).toBe(1);
|
|
18
|
+
expect(manifest.tools["nswag.consolecore"].version).toBe(NSWAG_CONSOLECORE_VERSION);
|
|
19
|
+
expect(manifest.tools["nswag.consolecore"].commands).toEqual(["nswag"]);
|
|
11
20
|
});
|
|
12
21
|
|
|
13
|
-
it("
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
expect(globalPropertyIndex).toBeGreaterThanOrEqual(0);
|
|
18
|
-
expect(args[globalPropertyIndex + 1]).toBe(
|
|
19
|
-
"models,apis=false,supportingFiles=false,modelDocs=false,modelTests=false"
|
|
20
|
-
);
|
|
22
|
+
it("pins python schema generation requirements without Java", () => {
|
|
23
|
+
expect(buildPythonCodegenRequirementsSource()).toContain("datamodel-code-generator");
|
|
24
|
+
expect(buildPythonCodegenRequirementsSource()).not.toContain("openapi-generator");
|
|
21
25
|
});
|
|
22
26
|
|
|
23
|
-
it("
|
|
24
|
-
const
|
|
27
|
+
it("builds NSwag arguments for model-only C# generation", () => {
|
|
28
|
+
const outputPath = path.join("C:\\temp\\generated\\csharp-models", ".native-temp", "Contracts.cs");
|
|
29
|
+
const args = getCSharpNativeGeneratorArgs("C:\\temp\\todo.openapi.json", outputPath);
|
|
25
30
|
|
|
26
|
-
expect(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
expect(args.slice(0, 4)).toEqual(["tool", "run", "nswag", "openapi2csclient"]);
|
|
32
|
+
expect(args).toContain("/GenerateClientClasses:false");
|
|
33
|
+
expect(args).toContain("/GenerateDtoTypes:true");
|
|
34
|
+
expect(args).toContain("/GenerateNullableReferenceTypes:true");
|
|
35
|
+
expect(args).toContain(`/output:${outputPath}`);
|
|
31
36
|
});
|
|
32
37
|
|
|
33
|
-
it("
|
|
34
|
-
const
|
|
38
|
+
it("builds datamodel-code-generator arguments for python assets", () => {
|
|
39
|
+
const outputPath = path.join("C:\\temp\\generated\\python-models", ".native-temp", "models.py");
|
|
40
|
+
const args = getPythonNativeGeneratorArgs("C:\\temp\\todo.openapi.json", outputPath);
|
|
41
|
+
|
|
42
|
+
expect(args).toEqual(
|
|
43
|
+
expect.arrayContaining([
|
|
44
|
+
"-m",
|
|
45
|
+
"datamodel_code_generator",
|
|
46
|
+
"--input-file-type",
|
|
47
|
+
"openapi",
|
|
48
|
+
"--output-model-type",
|
|
49
|
+
"pydantic_v2.BaseModel",
|
|
50
|
+
"--disable-timestamp",
|
|
51
|
+
outputPath,
|
|
52
|
+
])
|
|
53
|
+
);
|
|
54
|
+
});
|
|
35
55
|
|
|
36
|
-
|
|
37
|
-
expect(
|
|
56
|
+
it("keeps generated asset paths under functions/generated", () => {
|
|
57
|
+
expect(getCSharpSchemaModelPath("C:\\temp\\generated\\csharp-models", "Product")).toBe(
|
|
58
|
+
path.join("C:\\temp\\generated\\csharp-models", "src", "SwallowKitBackendModels", "Model", "Product.cs")
|
|
59
|
+
);
|
|
60
|
+
expect(getCSharpSchemaOptionPath("C:\\temp\\generated\\csharp-models")).toBe(
|
|
61
|
+
path.join("C:\\temp\\generated\\csharp-models", "src", "SwallowKitBackendModels", "Client", "Option.cs")
|
|
62
|
+
);
|
|
63
|
+
expect(getPythonSchemaModelPath("C:\\temp\\generated\\python-models", "Product")).toBe(
|
|
64
|
+
path.join("C:\\temp\\generated\\python-models", "backend_models", "models", "product.py")
|
|
65
|
+
);
|
|
38
66
|
});
|
|
39
67
|
});
|
package/src/cli/commands/dev.ts
CHANGED
|
@@ -27,6 +27,15 @@ type ParsedDevActionOptions = DevOptions & {
|
|
|
27
27
|
functions?: boolean;
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
+
interface FunctionsCoreToolsCommand {
|
|
31
|
+
command: string;
|
|
32
|
+
argsPrefix: string[];
|
|
33
|
+
label: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const MINIMUM_CSHARP_CORE_TOOLS_VERSION = '4.6.0';
|
|
37
|
+
const NPM_CORE_TOOLS_PACKAGE = 'azure-functions-core-tools@4';
|
|
38
|
+
|
|
30
39
|
function normalizeParsedDevOptions(options: ParsedDevActionOptions): DevOptions {
|
|
31
40
|
return {
|
|
32
41
|
...options,
|
|
@@ -38,6 +47,54 @@ export function buildFunctionsStartArgs(functionsPort: string): string[] {
|
|
|
38
47
|
return ['start', '--port', functionsPort];
|
|
39
48
|
}
|
|
40
49
|
|
|
50
|
+
export function parseCoreToolsVersion(output: string): string | null {
|
|
51
|
+
const match = output.match(/\d+\.\d+\.\d+/);
|
|
52
|
+
return match ? match[0] : null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function compareVersionNumbers(left: string, right: string): number {
|
|
56
|
+
const leftParts = left.split('.').map((value) => Number.parseInt(value, 10));
|
|
57
|
+
const rightParts = right.split('.').map((value) => Number.parseInt(value, 10));
|
|
58
|
+
const length = Math.max(leftParts.length, rightParts.length);
|
|
59
|
+
|
|
60
|
+
for (let index = 0; index < length; index += 1) {
|
|
61
|
+
const leftPart = leftParts[index] ?? 0;
|
|
62
|
+
const rightPart = rightParts[index] ?? 0;
|
|
63
|
+
|
|
64
|
+
if (leftPart !== rightPart) {
|
|
65
|
+
return leftPart - rightPart;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function buildFunctionsCoreToolsCommand(
|
|
73
|
+
backendLanguage: BackendLanguage,
|
|
74
|
+
installedVersion: string | null
|
|
75
|
+
): FunctionsCoreToolsCommand {
|
|
76
|
+
if (
|
|
77
|
+
backendLanguage === 'csharp' &&
|
|
78
|
+
(!installedVersion || compareVersionNumbers(installedVersion, MINIMUM_CSHARP_CORE_TOOLS_VERSION) < 0)
|
|
79
|
+
) {
|
|
80
|
+
const reason = installedVersion
|
|
81
|
+
? `installed func ${installedVersion} is too old for C# isolated`
|
|
82
|
+
: 'func is not installed';
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
command: 'npm',
|
|
86
|
+
argsPrefix: ['exec', '--yes', NPM_CORE_TOOLS_PACKAGE, '--'],
|
|
87
|
+
label: `npm exec ${NPM_CORE_TOOLS_PACKAGE} (${reason})`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
command: 'func',
|
|
93
|
+
argsPrefix: [],
|
|
94
|
+
label: installedVersion ? `func ${installedVersion}` : 'func',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
41
98
|
export function buildNextDevArgs(pm: string, port: string): string[] {
|
|
42
99
|
const baseArgs = ['next', 'dev', '--port', port, '--webpack'];
|
|
43
100
|
return pm === 'pnpm' ? ['exec', ...baseArgs] : baseArgs;
|
|
@@ -59,6 +116,13 @@ export function getPythonVirtualEnvPaths(functionsDir: string): {
|
|
|
59
116
|
return { venvDir, binDir, pythonExecutable };
|
|
60
117
|
}
|
|
61
118
|
|
|
119
|
+
export function getCSharpFunctionsBuildArtifactPaths(functionsDir: string): string[] {
|
|
120
|
+
return [
|
|
121
|
+
path.join(functionsDir, 'bin'),
|
|
122
|
+
path.join(functionsDir, 'obj'),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
|
|
62
126
|
export function buildPythonFunctionsEnv(baseEnv: NodeJS.ProcessEnv, functionsDir: string): NodeJS.ProcessEnv {
|
|
63
127
|
const { venvDir, binDir, pythonExecutable } = getPythonVirtualEnvPaths(functionsDir);
|
|
64
128
|
const pathKey = getPathEnvKey(baseEnv);
|
|
@@ -143,6 +207,18 @@ async function getCommandPath(command: string): Promise<string | null> {
|
|
|
143
207
|
return firstLine || null;
|
|
144
208
|
}
|
|
145
209
|
|
|
210
|
+
async function resolveInstalledCoreToolsVersion(): Promise<string | null> {
|
|
211
|
+
if (!(await checkCoreTools())) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
return parseCoreToolsVersion(await captureCommandOutput('func', ['--version']));
|
|
217
|
+
} catch {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
146
222
|
async function captureCommandOutput(
|
|
147
223
|
command: string,
|
|
148
224
|
args: string[],
|
|
@@ -338,7 +414,7 @@ export function buildDevCommand(
|
|
|
338
414
|
.option('--host <host>', 'Host name', 'localhost')
|
|
339
415
|
.option('--open', 'Open browser automatically', false)
|
|
340
416
|
.option('--verbose', 'Show verbose logs', false)
|
|
341
|
-
.option('--no-functions', 'Skip Azure Functions startup'
|
|
417
|
+
.option('--no-functions', 'Skip Azure Functions startup')
|
|
342
418
|
.option('--seed-env <environment>', 'Replace Cosmos DB Emulator data from dev-seeds/<environment> before startup')
|
|
343
419
|
.option('--mock-connectors', 'Start mock server for connector models (serves Zod-generated data)', false)
|
|
344
420
|
.action(async (options: ParsedDevActionOptions) => {
|
|
@@ -532,11 +608,14 @@ async function startDevEnvironment(options: DevOptions) {
|
|
|
532
608
|
const functionsDir = path.join(process.cwd(), 'functions');
|
|
533
609
|
const hasFunctions = fs.existsSync(functionsDir) && hasFunctionsProject(functionsDir, backendLanguage);
|
|
534
610
|
|
|
611
|
+
let functionsCoreToolsCommand: FunctionsCoreToolsCommand | null = null;
|
|
612
|
+
let installedCoreToolsVersion: string | null = null;
|
|
613
|
+
|
|
535
614
|
if (hasFunctions && !options.noFunctions) {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
if (!
|
|
615
|
+
installedCoreToolsVersion = await resolveInstalledCoreToolsVersion();
|
|
616
|
+
functionsCoreToolsCommand = buildFunctionsCoreToolsCommand(backendLanguage, installedCoreToolsVersion);
|
|
617
|
+
|
|
618
|
+
if (functionsCoreToolsCommand.command === 'func' && !installedCoreToolsVersion) {
|
|
540
619
|
console.log('');
|
|
541
620
|
console.log('โ ๏ธ Azure Functions Core Tools not found.');
|
|
542
621
|
console.log('');
|
|
@@ -585,6 +664,8 @@ async function startDevEnvironment(options: DevOptions) {
|
|
|
585
664
|
// Skip Azure Functions startup
|
|
586
665
|
options.noFunctions = true;
|
|
587
666
|
}
|
|
667
|
+
} else if (functionsCoreToolsCommand.command !== 'func') {
|
|
668
|
+
console.log(`โน๏ธ Using ${functionsCoreToolsCommand.label}.`);
|
|
588
669
|
}
|
|
589
670
|
|
|
590
671
|
if (!options.noFunctions) {
|
|
@@ -631,8 +712,19 @@ async function startDevEnvironment(options: DevOptions) {
|
|
|
631
712
|
await runCommand(pm, ['install'], functionsDir, `${pm} install`);
|
|
632
713
|
}
|
|
633
714
|
} else if (backendLanguage === 'csharp') {
|
|
634
|
-
|
|
635
|
-
|
|
715
|
+
let cleanedArtifacts = false;
|
|
716
|
+
for (const artifactPath of getCSharpFunctionsBuildArtifactPaths(functionsDir)) {
|
|
717
|
+
if (!fs.existsSync(artifactPath)) {
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
fs.rmSync(artifactPath, { recursive: true, force: true });
|
|
722
|
+
cleanedArtifacts = true;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
if (cleanedArtifacts) {
|
|
726
|
+
console.log('๐งน Cleaned previous C# Functions build artifacts before func start.');
|
|
727
|
+
}
|
|
636
728
|
} else {
|
|
637
729
|
functionsEnv = await preparePythonFunctionsEnvironment(functionsDir);
|
|
638
730
|
}
|
|
@@ -685,7 +777,8 @@ async function startDevEnvironment(options: DevOptions) {
|
|
|
685
777
|
}
|
|
686
778
|
|
|
687
779
|
// Azure Functions ใ่ตทๅ
|
|
688
|
-
const
|
|
780
|
+
const functionsCommand = functionsCoreToolsCommand ?? buildFunctionsCoreToolsCommand(backendLanguage, installedCoreToolsVersion);
|
|
781
|
+
const funcProcess = spawn(functionsCommand.command, [...functionsCommand.argsPrefix, ...buildFunctionsStartArgs(functionsPort)], {
|
|
689
782
|
cwd: functionsDir,
|
|
690
783
|
shell: true,
|
|
691
784
|
stdio: 'pipe', // Always pipe to capture output
|
package/src/cli/commands/init.ts
CHANGED
|
@@ -15,6 +15,10 @@ import {
|
|
|
15
15
|
getFunctionsStartScript,
|
|
16
16
|
} from "../../utils/package-manager";
|
|
17
17
|
import { syncProjectManifest } from "../../core/project/manifest";
|
|
18
|
+
import {
|
|
19
|
+
buildCSharpCodegenToolManifestSource,
|
|
20
|
+
buildPythonCodegenRequirementsSource,
|
|
21
|
+
} from "../../core/scaffold/native-schema-generator";
|
|
18
22
|
|
|
19
23
|
interface InitOptions {
|
|
20
24
|
name: string;
|
|
@@ -473,13 +477,6 @@ async function addSwallowKitFiles(
|
|
|
473
477
|
...buildGeneratedProjectDependencies(projectName),
|
|
474
478
|
};
|
|
475
479
|
|
|
476
|
-
if (backendLanguage !== "typescript") {
|
|
477
|
-
packageJson.devDependencies = {
|
|
478
|
-
...packageJson.devDependencies,
|
|
479
|
-
'@openapitools/openapi-generator-cli': '^2.21.0',
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
|
|
483
480
|
packageJson.scripts = {
|
|
484
481
|
...packageJson.scripts,
|
|
485
482
|
'build': getBuildScript(pm),
|
|
@@ -955,8 +952,9 @@ tsconfig.json
|
|
|
955
952
|
!dist/**/*.js
|
|
956
953
|
`);
|
|
957
954
|
} else if (backendLanguage === 'python') {
|
|
958
|
-
gitignoreLines.unshift('.venv', '__pycache__', '.python_packages');
|
|
955
|
+
gitignoreLines.unshift('.venv', '.codegen-venv', '__pycache__', '.python_packages');
|
|
959
956
|
fs.writeFileSync(path.join(functionsDir, '.funcignore'), `.venv
|
|
957
|
+
.codegen-venv
|
|
960
958
|
__pycache__
|
|
961
959
|
.pytest_cache
|
|
962
960
|
.mypy_cache
|
|
@@ -1083,6 +1081,11 @@ function createCSharpFunctionsProject(projectDir: string, functionsDir: string):
|
|
|
1083
1081
|
const csprojName = `${projectPascal}.Functions.csproj`;
|
|
1084
1082
|
|
|
1085
1083
|
fs.writeFileSync(path.join(functionsDir, csprojName), buildCSharpFunctionsProjectSource());
|
|
1084
|
+
fs.mkdirSync(path.join(functionsDir, '.config'), { recursive: true });
|
|
1085
|
+
fs.writeFileSync(
|
|
1086
|
+
path.join(functionsDir, '.config', 'dotnet-tools.json'),
|
|
1087
|
+
buildCSharpCodegenToolManifestSource()
|
|
1088
|
+
);
|
|
1086
1089
|
|
|
1087
1090
|
fs.writeFileSync(path.join(functionsDir, 'Program.cs'), buildCSharpFunctionsProgramSource());
|
|
1088
1091
|
|
|
@@ -1130,6 +1133,10 @@ function createPythonFunctionsProject(projectDir: string, functionsDir: string):
|
|
|
1130
1133
|
azure-cosmos>=4.9.0
|
|
1131
1134
|
azure-identity>=1.19.0
|
|
1132
1135
|
`);
|
|
1136
|
+
fs.writeFileSync(
|
|
1137
|
+
path.join(functionsDir, 'requirements.codegen.txt'),
|
|
1138
|
+
buildPythonCodegenRequirementsSource()
|
|
1139
|
+
);
|
|
1133
1140
|
|
|
1134
1141
|
const blueprintsDir = path.join(functionsDir, 'blueprints');
|
|
1135
1142
|
fs.mkdirSync(blueprintsDir, { recursive: true });
|
|
@@ -1398,17 +1405,17 @@ function createReadme(
|
|
|
1398
1405
|
const backendLanguageLabel = getBackendLanguageLabel(backendLanguage);
|
|
1399
1406
|
const schemaBridgeDescription = backendLanguage === 'typescript'
|
|
1400
1407
|
? 'Zod (shared between frontend and backend)'
|
|
1401
|
-
: `Zod + OpenAPI
|
|
1408
|
+
: `Zod + OpenAPI export (Zod in shared/, native-generated ${backendLanguageLabel} schemas in functions/generated/)`;
|
|
1402
1409
|
const functionsTree = backendLanguage === 'typescript'
|
|
1403
1410
|
? `โ โโโ src/\nโ โโโ greet.ts # Sample function`
|
|
1404
1411
|
: backendLanguage === 'csharp'
|
|
1405
|
-
? `โ โโโ Crud/\nโ โ โโโ GreetFunction.cs\nโ โโโ generated/ #
|
|
1406
|
-
: `โ โโโ blueprints/\nโ โ โโโ greet.py\nโ โโโ generated/ #
|
|
1412
|
+
? `โ โโโ Crud/\nโ โ โโโ GreetFunction.cs\nโ โโโ generated/ # Native-generated C# schema assets`
|
|
1413
|
+
: `โ โโโ blueprints/\nโ โ โโโ greet.py\nโ โโโ generated/ # Native-generated Python schema assets`;
|
|
1407
1414
|
const backendScaffoldNote = backendLanguage === 'typescript'
|
|
1408
1415
|
? '- Azure Functions CRUD endpoints'
|
|
1409
|
-
: `- Azure Functions ${backendLanguageLabel} CRUD handlers\n- OpenAPI
|
|
1416
|
+
: `- Azure Functions ${backendLanguageLabel} CRUD handlers\n- OpenAPI export + native-generated ${backendLanguageLabel} schema assets`;
|
|
1410
1417
|
const pythonLocalDevNote = backendLanguage === 'python'
|
|
1411
|
-
? `\n**Python local dev note**: SwallowKit uses \`functions/.venv\` for local Azure Functions development. If \`uv\` is installed, \`swallowkit dev\` uses it to create/manage that virtual environment; otherwise it falls back to the standard \`venv\` + \`pip\` workflow. Keep \`functions/requirements.txt\` as the dependency source of truth for Azure Functions compatibility.\n`
|
|
1418
|
+
? `\n**Python local dev note**: SwallowKit uses \`functions/.venv\` for local Azure Functions development. If \`uv\` is installed, \`swallowkit dev\` uses it to create/manage that virtual environment; otherwise it falls back to the standard \`venv\` + \`pip\` workflow. Keep \`functions/requirements.txt\` as the dependency source of truth for Azure Functions compatibility. Scaffold uses a separate \`functions/.codegen-venv\` for Python schema generation.\n`
|
|
1412
1419
|
: '';
|
|
1413
1420
|
|
|
1414
1421
|
const readme = `# ${projectName}
|
|
@@ -1626,14 +1633,14 @@ function createAiAgentFiles(projectDir: string, projectName: string, backendLang
|
|
|
1626
1633
|
const functionsStructureLine = backendLanguage === 'typescript'
|
|
1627
1634
|
? `โ โโโ src/ # HTTP trigger handlers with Cosmos DB bindings`
|
|
1628
1635
|
: backendLanguage === 'csharp'
|
|
1629
|
-
? `โ โโโ Crud/ # C# HTTP trigger handlers\nโ โโโ generated/ #
|
|
1630
|
-
: `โ โโโ blueprints/ # Python HTTP trigger handlers\nโ โโโ generated/ #
|
|
1636
|
+
? `โ โโโ Crud/ # C# HTTP trigger handlers\nโ โโโ generated/ # Native-generated C# schema assets`
|
|
1637
|
+
: `โ โโโ blueprints/ # Python HTTP trigger handlers\nโ โโโ generated/ # Native-generated Python schema assets`;
|
|
1631
1638
|
const backendSchemaNote = backendLanguage === 'typescript'
|
|
1632
1639
|
? `- The shared package (\`@${projectName}/shared\`) is consumed by both Next.js and Azure Functions as a workspace dependency.`
|
|
1633
|
-
: `- The frontend/BFF source of truth stays in \`shared/models/\` as Zod schemas.\n- \`swallowkit scaffold\` exports OpenAPI into \`functions/openapi/\` and generates ${backendLanguageLabel} schema assets into \`functions/generated/\`
|
|
1640
|
+
: `- The frontend/BFF source of truth stays in \`shared/models/\` as Zod schemas.\n- \`swallowkit scaffold\` exports OpenAPI into \`functions/openapi/\` and generates ${backendLanguageLabel} schema assets into \`functions/generated/\` with native ${backendLanguageLabel} tooling.`;
|
|
1634
1641
|
const backendRulesNote = backendLanguage === 'typescript'
|
|
1635
1642
|
? `- All CRUD operations and business logic live in \`functions/src/\`.\n- Use Azure Functions Cosmos DB **input/output bindings** (\`extraInputs\`/\`extraOutputs\`) for reads and writes.\n- Use the Cosmos DB SDK client directly **only** for delete operations (bindings do not support delete).\n- Validate all data against Zod schemas before writing to Cosmos DB.\n- The backend auto-generates \`id\` (UUID), \`createdAt\`, and \`updatedAt\` โ never trust client-sent values for these fields.`
|
|
1636
|
-
: `- All business logic lives in \`functions/\` and the generated handlers perform real Cosmos DB CRUD.\n- Keep Zod schemas in \`shared/models/\` as the source of truth.\n- Regenerate backend contracts with \`swallowkit scaffold shared/models/<name>.ts\` whenever a schema changes.\n- Use the generated
|
|
1643
|
+
: `- All business logic lives in \`functions/\` and the generated handlers perform real Cosmos DB CRUD.\n- Keep Zod schemas in \`shared/models/\` as the source of truth.\n- Regenerate backend contracts with \`swallowkit scaffold shared/models/<name>.ts\` whenever a schema changes.\n- Use the native-generated schema assets in \`functions/generated/\` to keep backend contracts aligned.\n- The backend should still own \`id\`, \`createdAt\`, and \`updatedAt\`.`;
|
|
1637
1644
|
|
|
1638
1645
|
// โโ 1. AGENTS.md (Codex / generic agents) โโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
1639
1646
|
|
|
@@ -1748,7 +1755,7 @@ Key rules:
|
|
|
1748
1755
|
|
|
1749
1756
|
- ${backendRulesNote}
|
|
1750
1757
|
|
|
1751
|
-
${backendLanguage === 'typescript' ? 'Azure Functions handler pattern:' : `Generated ${backendLanguageLabel} handlers live under \`functions/\`. Re-run \`swallowkit scaffold shared/models/<name>.ts\` after schema changes to keep generated CRUD handlers and \`functions/generated/\` in sync.`}
|
|
1758
|
+
${backendLanguage === 'typescript' ? 'Azure Functions handler pattern:' : `Generated ${backendLanguageLabel} handlers live under \`functions/\`. Re-run \`swallowkit scaffold shared/models/<name>.ts\` after schema changes to keep generated CRUD handlers and the native schema assets under \`functions/generated/\` in sync.`}
|
|
1752
1759
|
|
|
1753
1760
|
${backendLanguage === 'typescript' ? `\`\`\`typescript
|
|
1754
1761
|
// functions/src/{model}.ts
|
|
@@ -2018,7 +2025,7 @@ Files in \`functions/\` contain all business logic and data access for this appl
|
|
|
2018
2025
|
|
|
2019
2026
|
- Keep backend contracts aligned with \`shared/models/\` by rerunning \`swallowkit scaffold\` after schema changes.
|
|
2020
2027
|
- For TypeScript backends, use Cosmos DB **input/output bindings** (\`extraInputs\`/\`extraOutputs\`) for reads and writes.
|
|
2021
|
-
- For C#/Python backends, consume the generated
|
|
2028
|
+
- For C#/Python backends, consume the native-generated assets in \`functions/generated/\`.
|
|
2022
2029
|
- Auto-generate \`id\` (UUID), \`createdAt\`, and \`updatedAt\` on the backend. Never trust client-sent values.
|
|
2023
2030
|
- Container names are PascalCase + 's' (e.g., \`Todos\`). Partition key defaults to \`/id\` but can be customized per model.
|
|
2024
2031
|
|