swallowkit 1.0.0-beta.21 โ†’ 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.
Files changed (36) hide show
  1. package/README.ja.md +4 -4
  2. package/README.md +4 -4
  3. package/dist/cli/commands/dev.d.ts +11 -0
  4. package/dist/cli/commands/dev.d.ts.map +1 -1
  5. package/dist/cli/commands/dev.js +80 -7
  6. package/dist/cli/commands/dev.js.map +1 -1
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +17 -18
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/scaffold.d.ts +0 -3
  11. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  12. package/dist/cli/commands/scaffold.js +3 -172
  13. package/dist/cli/commands/scaffold.js.map +1 -1
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +37 -1
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/core/project/validation.js +2 -2
  18. package/dist/core/project/validation.js.map +1 -1
  19. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  20. package/dist/core/scaffold/model-parser.js +5 -6
  21. package/dist/core/scaffold/model-parser.js.map +1 -1
  22. package/dist/core/scaffold/native-schema-generator.d.ts +13 -0
  23. package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
  24. package/dist/core/scaffold/native-schema-generator.js +667 -0
  25. package/dist/core/scaffold/native-schema-generator.js.map +1 -0
  26. package/package.json +1 -1
  27. package/src/__tests__/dev.test.ts +53 -1
  28. package/src/__tests__/model-parser.test.ts +44 -64
  29. package/src/__tests__/scaffold.test.ts +54 -26
  30. package/src/cli/commands/dev.ts +101 -8
  31. package/src/cli/commands/init.ts +26 -19
  32. package/src/cli/commands/scaffold.ts +3 -213
  33. package/src/cli/index.ts +4 -1
  34. package/src/core/project/validation.ts +2 -2
  35. package/src/core/scaffold/model-parser.ts +7 -7
  36. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swallowkit",
3
- "version": "1.0.0-beta.21",
3
+ "version": "1.0.0-beta.23",
4
4
  "description": "Type-safe schema-driven development toolkit for Next.js applications on Azure",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,15 +1,22 @@
1
+ import { readFileSync } from "fs";
1
2
  import * as path from "path";
2
3
  import {
3
4
  buildFunctionsStartArgs,
5
+ buildFunctionsCoreToolsCommand,
4
6
  buildNextDevArgs,
5
7
  buildDevCommand,
6
8
  buildPythonFunctionsEnv,
9
+ compareVersionNumbers,
7
10
  DevOptions,
11
+ getCSharpFunctionsBuildArtifactPaths,
8
12
  getPythonVirtualEnvPaths,
13
+ parseCoreToolsVersion,
9
14
  } from "../cli/commands/dev";
10
15
  import { CLI_VERSION, createProgram, normalizeDevCommandArgv } from "../cli/index";
11
16
 
12
- const { version: packageVersion } = require("../../package.json");
17
+ const packageVersion = JSON.parse(
18
+ readFileSync(path.resolve(__dirname, "../../package.json"), "utf8")
19
+ ).version as string;
13
20
 
14
21
  describe("dev command helpers", () => {
15
22
  it("keeps the CLI version in sync with package.json", () => {
@@ -20,6 +27,32 @@ describe("dev command helpers", () => {
20
27
  expect(buildFunctionsStartArgs("7076")).toEqual(["start", "--port", "7076"]);
21
28
  });
22
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
+
23
56
  it("uses webpack mode for npm-based Next.js dev", () => {
24
57
  expect(buildNextDevArgs("npm", "3012")).toEqual(["next", "dev", "--port", "3012", "--webpack"]);
25
58
  });
@@ -37,6 +70,15 @@ describe("dev command helpers", () => {
37
70
  expect(paths.pythonExecutable.endsWith(process.platform === "win32" ? path.join("Scripts", "python.exe") : path.join("bin", "python"))).toBe(true);
38
71
  });
39
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
+
40
82
  it("injects Python virtual environment settings for Functions", () => {
41
83
  const functionsDir = path.join("C:\\repo", "functions");
42
84
  const env = buildPythonFunctionsEnv({ PATH: "C:\\Windows\\System32" }, functionsDir);
@@ -151,4 +193,14 @@ describe("dev CLI parser", () => {
151
193
  expect(optionsBeforeCommand).toMatchObject(expected);
152
194
  expect(optionsBeforeCommand).toMatchObject(optionsAfterCommand);
153
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
+ });
154
206
  });
@@ -1,72 +1,52 @@
1
- import { parsePartitionKey } from "../core/scaffold/model-parser";
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { parseModelFile } from "../core/scaffold/model-parser";
2
4
 
3
- describe("parsePartitionKey", () => {
4
- it("returns default '/id' when no partitionKey export exists", () => {
5
- const content = `
6
- import { z } from 'zod/v4';
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
- export const Todo = z.object({
9
- id: z.string(),
10
- title: z.string(),
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 Order = z.object({
15
+ export const Product = z.object({
22
16
  id: z.string(),
23
- tenantId: z.string(),
24
- items: z.array(z.string()),
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
- it("handles extra spaces around equals sign", () => {
67
- const content = `
68
- export const partitionKey = '/customerId';
69
- `;
70
- expect(parsePartitionKey(content)).toBe("/customerId");
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 { getCSharpSchemaArtifactPruneTargets, getOpenApiGeneratorArgs } from "../cli/commands/scaffold";
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("getOpenApiGeneratorArgs", () => {
5
- it("omits supportingFiles for C# model generation to avoid Polly version conflicts", () => {
6
- const args = getOpenApiGeneratorArgs("spec.json", "out", "csharp");
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(globalPropertyIndex).toBeGreaterThanOrEqual(0);
10
- expect(args[globalPropertyIndex + 1]).toBe("models,apis=false,modelDocs=false,modelTests=false");
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("continues omitting supporting files for Python model generation", () => {
14
- const args = getOpenApiGeneratorArgs("spec.json", "out", "python");
15
- const globalPropertyIndex = args.indexOf("--global-property");
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("prunes extra C# artifacts that pull in unused dependencies", () => {
24
- const targets = getCSharpSchemaArtifactPruneTargets("C:\\temp\\generated\\csharp-models");
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(targets).toEqual([
27
- path.join("C:\\temp\\generated\\csharp-models", "src", "SwallowKitBackendModels.Test"),
28
- path.join("C:\\temp\\generated\\csharp-models", "src", "SwallowKitBackendModels", "Api"),
29
- path.join("C:\\temp\\generated\\csharp-models", "src", "SwallowKitBackendModels", "Extensions"),
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("keeps only Option.cs from generated C# client helpers", () => {
34
- const args = getOpenApiGeneratorArgs("spec.json", "out", "csharp");
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
- expect(args).toContain("csharp");
37
- expect(getCSharpSchemaArtifactPruneTargets("C:\\temp\\generated\\csharp-models")).toHaveLength(3);
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
  });
@@ -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', false)
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
- // Check if Azure Functions Core Tools is installed
537
- const coreToolsInstalled = await checkCoreTools();
538
-
539
- if (!coreToolsInstalled) {
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
- console.log('๐Ÿ“ฆ Building C# Azure Functions project...');
635
- await runCommand('dotnet', ['build'], functionsDir, 'dotnet build');
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 funcProcess = spawn('func', buildFunctionsStartArgs(functionsPort), {
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
@@ -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 bridge (Zod in shared/, generated ${backendLanguageLabel} schemas in functions/generated/)`;
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/ # OpenAPI-derived C# models`
1406
- : `โ”‚ โ”œโ”€โ”€ blueprints/\nโ”‚ โ”‚ โ””โ”€โ”€ greet.py\nโ”‚ โ””โ”€โ”€ generated/ # OpenAPI-derived Python models`;
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 spec + generated ${backendLanguageLabel} schema assets`;
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/ # OpenAPI-derived C# schema assets`
1630
- : `โ”‚ โ”œโ”€โ”€ blueprints/ # Python HTTP trigger handlers\nโ”‚ โ””โ”€โ”€ generated/ # OpenAPI-derived Python schema assets`;
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/\` for backend use.`;
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 OpenAPI-derived models in \`functions/generated/\` to keep backend contracts aligned.\n- The backend should still own \`id\`, \`createdAt\`, and \`updatedAt\`.`;
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 OpenAPI-derived assets in \`functions/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