@danceroutine/tango-codegen 1.0.1 → 1.1.0

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 (30) hide show
  1. package/README.md +1 -0
  2. package/dist/commands/index.js +2 -2
  3. package/dist/{commands-C2Xr9uRE.js → commands-lJSW2Kuf.js} +4 -3
  4. package/dist/{commands-C2Xr9uRE.js.map → commands-lJSW2Kuf.js.map} +1 -1
  5. package/dist/frameworks/contracts/FrameworkScaffoldStrategy.d.ts +1 -0
  6. package/dist/frameworks/contracts/template/TemplateBuilder.d.ts +1 -1
  7. package/dist/frameworks/index.d.ts +1 -0
  8. package/dist/frameworks/index.js +2 -2
  9. package/dist/frameworks/strategies/nuxt/NuxtScaffoldStrategy.d.ts +14 -0
  10. package/dist/frameworks/strategies/nuxt/templates/bootstrap.d.ts +6 -0
  11. package/dist/frameworks/strategies/nuxt/templates/healthRoute.d.ts +6 -0
  12. package/dist/frameworks/strategies/nuxt/templates/layout.d.ts +6 -0
  13. package/dist/frameworks/strategies/nuxt/templates/models.d.ts +11 -0
  14. package/dist/frameworks/strategies/nuxt/templates/nuxtConfig.d.ts +6 -0
  15. package/dist/frameworks/strategies/nuxt/templates/openapi.d.ts +6 -0
  16. package/dist/frameworks/strategies/nuxt/templates/openapiRoute.d.ts +6 -0
  17. package/dist/frameworks/strategies/nuxt/templates/packageJson.d.ts +6 -0
  18. package/dist/frameworks/strategies/nuxt/templates/page.d.ts +6 -0
  19. package/dist/frameworks/strategies/nuxt/templates/readme.d.ts +6 -0
  20. package/dist/frameworks/strategies/nuxt/templates/serializers.d.ts +10 -0
  21. package/dist/frameworks/strategies/nuxt/templates/tangoConfig.d.ts +6 -0
  22. package/dist/frameworks/strategies/nuxt/templates/todoRoute.d.ts +6 -0
  23. package/dist/frameworks/strategies/nuxt/templates/tsconfig.d.ts +6 -0
  24. package/dist/frameworks/strategies/nuxt/templates/viewSet.d.ts +6 -0
  25. package/dist/{frameworks-Dv0HsD4K.js → frameworks-DOnjbO9C.js} +572 -49
  26. package/dist/frameworks-DOnjbO9C.js.map +1 -0
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +3 -3
  29. package/package.json +2 -2
  30. package/dist/frameworks-Dv0HsD4K.js.map +0 -1
@@ -31,7 +31,7 @@ var ScaffoldTemplateDescriptor = class {
31
31
  //#endregion
32
32
  //#region package.json
33
33
  var name = "@danceroutine/tango-codegen";
34
- var version$1 = "1.0.1";
34
+ var version$1 = "1.1.0";
35
35
  var description = "CLI for generating repositories, types, migrations, and OpenAPI specs for Tango";
36
36
  var type = "module";
37
37
  var main = "./dist/index.js";
@@ -157,7 +157,7 @@ var TemplateBuilder = class TemplateBuilder {
157
157
  "@danceroutine/tango-openapi": v,
158
158
  "@danceroutine/tango-config": v
159
159
  };
160
- const adapter = framework === "express" ? { "@danceroutine/tango-adapters-express": v } : { "@danceroutine/tango-adapters-next": v };
160
+ const adapter = framework === "express" ? { "@danceroutine/tango-adapters-express": v } : framework === "next" ? { "@danceroutine/tango-adapters-next": v } : { "@danceroutine/tango-adapters-nuxt": v };
161
161
  const dialectDeps = dialect === "sqlite" ? { "better-sqlite3": "^11.10.0" } : { pg: "^8.16.3" };
162
162
  return {
163
163
  ...core,
@@ -192,7 +192,8 @@ var TemplateBuilder = class TemplateBuilder {
192
192
  //#region src/frameworks/contracts/FrameworkScaffoldStrategy.ts
193
193
  const SUPPORTED_FRAMEWORK = {
194
194
  EXPRESS: "express",
195
- NEXT: "next"
195
+ NEXT: "next",
196
+ NUXT: "nuxt"
196
197
  };
197
198
  const PACKAGE_MANAGER = {
198
199
  PNPM: "pnpm",
@@ -227,7 +228,7 @@ var FrameworkScaffoldStrategy = class {
227
228
 
228
229
  //#endregion
229
230
  //#region src/frameworks/strategies/express/templates/packageJson.ts
230
- var PackageJsonTemplateBuilder$1 = class extends TemplateBuilder {
231
+ var PackageJsonTemplateBuilder$2 = class extends TemplateBuilder {
231
232
  constructor() {
232
233
  super({ name: "package.json" });
233
234
  }
@@ -268,7 +269,7 @@ var PackageJsonTemplateBuilder$1 = class extends TemplateBuilder {
268
269
 
269
270
  //#endregion
270
271
  //#region src/frameworks/strategies/express/templates/tsconfig.ts
271
- var TsConfigTemplateBuilder$1 = class extends TemplateBuilder {
272
+ var TsConfigTemplateBuilder$2 = class extends TemplateBuilder {
272
273
  constructor() {
273
274
  super({ name: "tsconfig.json" });
274
275
  }
@@ -325,7 +326,7 @@ var TsConfigBuildTemplateBuilder = class extends TemplateBuilder {
325
326
 
326
327
  //#endregion
327
328
  //#region src/frameworks/strategies/express/templates/tangoConfig.ts
328
- var TangoConfigTemplateBuilder$1 = class extends TemplateBuilder {
329
+ var TangoConfigTemplateBuilder$2 = class extends TemplateBuilder {
329
330
  constructor() {
330
331
  super({ name: "tango.config.ts" });
331
332
  }
@@ -445,7 +446,7 @@ main().catch((error: unknown) => {
445
446
 
446
447
  //#endregion
447
448
  //#region src/frameworks/strategies/express/templates/models.ts
448
- var TodoModelTemplateBuilder$1 = class extends TemplateBuilder {
449
+ var TodoModelTemplateBuilder$2 = class extends TemplateBuilder {
449
450
  constructor() {
450
451
  super({ name: "src/models/TodoModel.ts" });
451
452
  }
@@ -485,7 +486,7 @@ export const TodoModel = Model({
485
486
  `;
486
487
  }
487
488
  };
488
- var ModelsBarrelTemplateBuilder$1 = class extends TemplateBuilder {
489
+ var ModelsBarrelTemplateBuilder$2 = class extends TemplateBuilder {
489
490
  constructor() {
490
491
  super({ name: "src/models/index.ts" });
491
492
  }
@@ -497,7 +498,7 @@ var ModelsBarrelTemplateBuilder$1 = class extends TemplateBuilder {
497
498
 
498
499
  //#endregion
499
500
  //#region src/frameworks/strategies/express/templates/serializers.ts
500
- var TodoSerializerTemplateBuilder$1 = class extends TemplateBuilder {
501
+ var TodoSerializerTemplateBuilder$2 = class extends TemplateBuilder {
501
502
  constructor() {
502
503
  super({ name: "src/serializers/TodoSerializer.ts" });
503
504
  }
@@ -519,7 +520,7 @@ export class TodoSerializer extends ModelSerializer<
519
520
  `;
520
521
  }
521
522
  };
522
- var SerializersBarrelTemplateBuilder$1 = class extends TemplateBuilder {
523
+ var SerializersBarrelTemplateBuilder$2 = class extends TemplateBuilder {
523
524
  constructor() {
524
525
  super({ name: "src/serializers/index.ts" });
525
526
  }
@@ -531,7 +532,7 @@ var SerializersBarrelTemplateBuilder$1 = class extends TemplateBuilder {
531
532
 
532
533
  //#endregion
533
534
  //#region src/frameworks/strategies/express/templates/openapi.ts
534
- var OpenAPITemplateBuilder$1 = class extends TemplateBuilder {
535
+ var OpenAPITemplateBuilder$2 = class extends TemplateBuilder {
535
536
  constructor() {
536
537
  super({ name: "src/openapi.ts" });
537
538
  }
@@ -553,7 +554,7 @@ export function createOpenAPISpec(): OpenAPISpec {
553
554
 
554
555
  //#endregion
555
556
  //#region src/frameworks/strategies/express/templates/viewSet.ts
556
- var ViewSetTemplateBuilder$1 = class extends TemplateBuilder {
557
+ var ViewSetTemplateBuilder$2 = class extends TemplateBuilder {
557
558
  constructor() {
558
559
  super({ name: "src/viewsets/TodoViewSet.ts" });
559
560
  }
@@ -585,7 +586,7 @@ export class TodoViewSet extends ModelViewSet<Todo, typeof TodoSerializer> {
585
586
 
586
587
  //#endregion
587
588
  //#region src/frameworks/strategies/express/templates/bootstrap.ts
588
- var BootstrapTemplateBuilder$1 = class extends TemplateBuilder {
589
+ var BootstrapTemplateBuilder$2 = class extends TemplateBuilder {
589
590
  constructor() {
590
591
  super({ name: "src/bootstrap.ts" });
591
592
  }
@@ -628,7 +629,7 @@ if (import.meta.url === \`file://\${process.argv[1]}\`) {
628
629
 
629
630
  //#endregion
630
631
  //#region src/frameworks/strategies/express/templates/readme.ts
631
- var ReadmeTemplateBuilder$1 = class extends TemplateBuilder {
632
+ var ReadmeTemplateBuilder$2 = class extends TemplateBuilder {
632
633
  constructor() {
633
634
  super({ name: "README.md" });
634
635
  }
@@ -714,20 +715,20 @@ var ExpressScaffoldStrategy = class extends FrameworkScaffoldStrategy {
714
715
  */
715
716
  getTemplates() {
716
717
  return [
717
- this.addFrameworkTemplate(new PackageJsonTemplateBuilder$1()),
718
- this.addFrameworkTemplate(new TsConfigTemplateBuilder$1()),
718
+ this.addFrameworkTemplate(new PackageJsonTemplateBuilder$2()),
719
+ this.addFrameworkTemplate(new TsConfigTemplateBuilder$2()),
719
720
  this.addFrameworkTemplate(new TsConfigBuildTemplateBuilder()),
720
- this.addTangoTemplate(new TangoConfigTemplateBuilder$1()),
721
+ this.addTangoTemplate(new TangoConfigTemplateBuilder$2()),
721
722
  this.addFrameworkTemplate(new AppSourceTemplateBuilder()),
722
- this.addTangoTemplate(new TodoModelTemplateBuilder$1()),
723
- this.addTangoTemplate(new ModelsBarrelTemplateBuilder$1()),
724
- this.addTangoTemplate(new TodoSerializerTemplateBuilder$1()),
725
- this.addTangoTemplate(new SerializersBarrelTemplateBuilder$1()),
726
- this.addTangoTemplate(new OpenAPITemplateBuilder$1()),
727
- this.addTangoTemplate(new ViewSetTemplateBuilder$1()),
728
- this.addTangoTemplate(new BootstrapTemplateBuilder$1()),
723
+ this.addTangoTemplate(new TodoModelTemplateBuilder$2()),
724
+ this.addTangoTemplate(new ModelsBarrelTemplateBuilder$2()),
725
+ this.addTangoTemplate(new TodoSerializerTemplateBuilder$2()),
726
+ this.addTangoTemplate(new SerializersBarrelTemplateBuilder$2()),
727
+ this.addTangoTemplate(new OpenAPITemplateBuilder$2()),
728
+ this.addTangoTemplate(new ViewSetTemplateBuilder$2()),
729
+ this.addTangoTemplate(new BootstrapTemplateBuilder$2()),
729
730
  this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate("migrations/.gitkeep", "")),
730
- this.addFrameworkTemplate(new ReadmeTemplateBuilder$1()),
731
+ this.addFrameworkTemplate(new ReadmeTemplateBuilder$2()),
731
732
  this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate(".gitignore", "node_modules\ndist\n.data\n.env\n")),
732
733
  this.addTangoTemplate(new TangoRegisterTemplateBuilder())
733
734
  ];
@@ -736,7 +737,7 @@ var ExpressScaffoldStrategy = class extends FrameworkScaffoldStrategy {
736
737
 
737
738
  //#endregion
738
739
  //#region src/frameworks/strategies/next/templates/packageJson.ts
739
- var PackageJsonTemplateBuilder = class extends TemplateBuilder {
740
+ var PackageJsonTemplateBuilder$1 = class extends TemplateBuilder {
740
741
  constructor() {
741
742
  super({ name: "package.json" });
742
743
  }
@@ -780,7 +781,7 @@ var PackageJsonTemplateBuilder = class extends TemplateBuilder {
780
781
 
781
782
  //#endregion
782
783
  //#region src/frameworks/strategies/next/templates/tsconfig.ts
783
- var TsConfigTemplateBuilder = class extends TemplateBuilder {
784
+ var TsConfigTemplateBuilder$1 = class extends TemplateBuilder {
784
785
  constructor() {
785
786
  super({ name: "tsconfig.json" });
786
787
  }
@@ -817,7 +818,7 @@ var TsConfigTemplateBuilder = class extends TemplateBuilder {
817
818
 
818
819
  //#endregion
819
820
  //#region src/frameworks/strategies/next/templates/tangoConfig.ts
820
- var TangoConfigTemplateBuilder = class extends TemplateBuilder {
821
+ var TangoConfigTemplateBuilder$1 = class extends TemplateBuilder {
821
822
  constructor() {
822
823
  super({ name: "tango.config.ts" });
823
824
  }
@@ -897,12 +898,12 @@ export default defineConfig({
897
898
 
898
899
  //#endregion
899
900
  //#region src/frameworks/strategies/next/templates/models.ts
900
- var TodoModelTemplateBuilder = class TodoModelTemplateBuilder extends TemplateBuilder {
901
+ var TodoModelTemplateBuilder$1 = class TodoModelTemplateBuilder$1 extends TemplateBuilder {
901
902
  constructor() {
902
903
  super({ name: "src/lib/models/TodoModel.ts" });
903
904
  }
904
905
  static context(context) {
905
- return new TodoModelTemplateBuilder().setContext(context);
906
+ return new TodoModelTemplateBuilder$1().setContext(context);
906
907
  }
907
908
  resolveTemplate(_context) {
908
909
  return `import { z } from 'zod';
@@ -940,7 +941,7 @@ export const TodoModel = Model({
940
941
  `;
941
942
  }
942
943
  };
943
- var ModelsBarrelTemplateBuilder = class extends TemplateBuilder {
944
+ var ModelsBarrelTemplateBuilder$1 = class extends TemplateBuilder {
944
945
  constructor() {
945
946
  super({ name: "src/lib/models/index.ts" });
946
947
  }
@@ -952,7 +953,7 @@ var ModelsBarrelTemplateBuilder = class extends TemplateBuilder {
952
953
 
953
954
  //#endregion
954
955
  //#region src/frameworks/strategies/next/templates/serializers.ts
955
- var TodoSerializerTemplateBuilder = class extends TemplateBuilder {
956
+ var TodoSerializerTemplateBuilder$1 = class extends TemplateBuilder {
956
957
  constructor() {
957
958
  super({ name: "src/serializers/TodoSerializer.ts" });
958
959
  }
@@ -974,7 +975,7 @@ export class TodoSerializer extends ModelSerializer<
974
975
  `;
975
976
  }
976
977
  };
977
- var SerializersBarrelTemplateBuilder = class extends TemplateBuilder {
978
+ var SerializersBarrelTemplateBuilder$1 = class extends TemplateBuilder {
978
979
  constructor() {
979
980
  super({ name: "src/serializers/index.ts" });
980
981
  }
@@ -986,7 +987,7 @@ var SerializersBarrelTemplateBuilder = class extends TemplateBuilder {
986
987
 
987
988
  //#endregion
988
989
  //#region src/frameworks/strategies/next/templates/openapi.ts
989
- var OpenAPITemplateBuilder = class extends TemplateBuilder {
990
+ var OpenAPITemplateBuilder$1 = class extends TemplateBuilder {
990
991
  constructor() {
991
992
  super({ name: "src/lib/openapi.ts" });
992
993
  }
@@ -1008,7 +1009,7 @@ export function createOpenAPISpec(): OpenAPISpec {
1008
1009
 
1009
1010
  //#endregion
1010
1011
  //#region src/frameworks/strategies/next/templates/viewSet.ts
1011
- var ViewSetTemplateBuilder = class extends TemplateBuilder {
1012
+ var ViewSetTemplateBuilder$1 = class extends TemplateBuilder {
1012
1013
  constructor() {
1013
1014
  super({ name: "src/viewsets/TodoViewSet.ts" });
1014
1015
  }
@@ -1040,7 +1041,7 @@ export class TodoViewSet extends ModelViewSet<Todo, typeof TodoSerializer> {
1040
1041
 
1041
1042
  //#endregion
1042
1043
  //#region src/frameworks/strategies/next/templates/page.ts
1043
- var PageTemplateBuilder = class extends TemplateBuilder {
1044
+ var PageTemplateBuilder$1 = class extends TemplateBuilder {
1044
1045
  constructor() {
1045
1046
  super({ name: "src/app/page.tsx" });
1046
1047
  }
@@ -1097,7 +1098,7 @@ export default function RootLayout({
1097
1098
 
1098
1099
  //#endregion
1099
1100
  //#region src/frameworks/strategies/next/templates/healthRoute.ts
1100
- var HealthRouteTemplateBuilder = class extends TemplateBuilder {
1101
+ var HealthRouteTemplateBuilder$1 = class extends TemplateBuilder {
1101
1102
  constructor() {
1102
1103
  super({ name: "src/app/api/health/route.ts" });
1103
1104
  }
@@ -1111,7 +1112,7 @@ var HealthRouteTemplateBuilder = class extends TemplateBuilder {
1111
1112
 
1112
1113
  //#endregion
1113
1114
  //#region src/frameworks/strategies/next/templates/todoRoute.ts
1114
- var TodoRouteTemplateBuilder = class extends TemplateBuilder {
1115
+ var TodoRouteTemplateBuilder$1 = class extends TemplateBuilder {
1115
1116
  constructor() {
1116
1117
  super({ name: "src/app/api/todos/[[...tango]]/route.ts" });
1117
1118
  }
@@ -1127,7 +1128,7 @@ export const { GET, POST, PUT, PATCH, DELETE } = adapter.adaptViewSet(new TodoVi
1127
1128
 
1128
1129
  //#endregion
1129
1130
  //#region src/frameworks/strategies/next/templates/openapiRoute.ts
1130
- var OpenAPIRouteTemplateBuilder = class extends TemplateBuilder {
1131
+ var OpenAPIRouteTemplateBuilder$1 = class extends TemplateBuilder {
1131
1132
  constructor() {
1132
1133
  super({ name: "src/app/api/openapi/route.ts" });
1133
1134
  }
@@ -1143,7 +1144,7 @@ export async function GET(): Promise<Response> {
1143
1144
 
1144
1145
  //#endregion
1145
1146
  //#region src/frameworks/strategies/next/templates/bootstrap.ts
1146
- var BootstrapTemplateBuilder = class extends TemplateBuilder {
1147
+ var BootstrapTemplateBuilder$1 = class extends TemplateBuilder {
1147
1148
  constructor() {
1148
1149
  super({ name: "scripts/bootstrap.ts" });
1149
1150
  }
@@ -1184,7 +1185,7 @@ seedExampleData(Number.isFinite(count) ? count : 100).catch((error: unknown) =>
1184
1185
 
1185
1186
  //#endregion
1186
1187
  //#region src/frameworks/strategies/next/templates/readme.ts
1187
- var ReadmeTemplateBuilder = class extends TemplateBuilder {
1188
+ var ReadmeTemplateBuilder$1 = class extends TemplateBuilder {
1188
1189
  constructor() {
1189
1190
  super({ name: "README.md" });
1190
1191
  }
@@ -1244,26 +1245,546 @@ var NextScaffoldStrategy = class extends FrameworkScaffoldStrategy {
1244
1245
  */
1245
1246
  getTemplates() {
1246
1247
  return [
1247
- this.addFrameworkTemplate(new PackageJsonTemplateBuilder()),
1248
- this.addTangoTemplate(new TangoConfigTemplateBuilder()),
1249
- this.addFrameworkTemplate(new TsConfigTemplateBuilder()),
1248
+ this.addFrameworkTemplate(new PackageJsonTemplateBuilder$1()),
1249
+ this.addTangoTemplate(new TangoConfigTemplateBuilder$1()),
1250
+ this.addFrameworkTemplate(new TsConfigTemplateBuilder$1()),
1250
1251
  this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate("next-env.d.ts", "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n")),
1251
1252
  this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate("next.config.mjs", "export default {};\n")),
1253
+ this.addTangoTemplate(new TodoModelTemplateBuilder$1()),
1254
+ this.addTangoTemplate(new ModelsBarrelTemplateBuilder$1()),
1255
+ this.addTangoTemplate(new TodoSerializerTemplateBuilder$1()),
1256
+ this.addTangoTemplate(new SerializersBarrelTemplateBuilder$1()),
1257
+ this.addTangoTemplate(new OpenAPITemplateBuilder$1()),
1258
+ this.addTangoTemplate(new ViewSetTemplateBuilder$1()),
1259
+ this.addFrameworkTemplate(new LayoutTemplateBuilder()),
1260
+ this.addFrameworkTemplate(new PageTemplateBuilder$1()),
1261
+ this.addTangoTemplate(new HealthRouteTemplateBuilder$1()),
1262
+ this.addTangoTemplate(new OpenAPIRouteTemplateBuilder$1()),
1263
+ this.addTangoTemplate(new TodoRouteTemplateBuilder$1()),
1264
+ this.addTangoTemplate(new BootstrapTemplateBuilder$1()),
1265
+ this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate("migrations/.gitkeep", "")),
1266
+ this.addFrameworkTemplate(new ReadmeTemplateBuilder$1()),
1267
+ this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate(".gitignore", "node_modules\n.next\n.data\n.env\n"))
1268
+ ];
1269
+ }
1270
+ };
1271
+
1272
+ //#endregion
1273
+ //#region src/frameworks/strategies/nuxt/templates/packageJson.ts
1274
+ var PackageJsonTemplateBuilder = class extends TemplateBuilder {
1275
+ constructor() {
1276
+ super({ name: "package.json" });
1277
+ }
1278
+ resolveTemplate(context) {
1279
+ const deps = this.getTangoDependencyEntries(context);
1280
+ const devDeps = this.getTangoDevDependencyEntries(context);
1281
+ return JSON.stringify({
1282
+ name: context.projectName,
1283
+ private: true,
1284
+ type: "module",
1285
+ scripts: {
1286
+ predev: "sh -c 'if [ \"$TANGO_SKIP_SETUP_SCHEMA\" = \"true\" ]; then exit 0; fi; pnpm run setup:schema'",
1287
+ dev: "NUXT_TELEMETRY_DISABLED=1 nuxt dev",
1288
+ prestart: "sh -c 'if [ \"$TANGO_SKIP_SETUP_SCHEMA\" = \"true\" ]; then exit 0; fi; pnpm run setup:schema'",
1289
+ build: "NUXT_TELEMETRY_DISABLED=1 nuxt build",
1290
+ start: "NUXT_TELEMETRY_DISABLED=1 nuxt preview",
1291
+ typecheck: "NUXT_TELEMETRY_DISABLED=1 nuxt typecheck",
1292
+ "setup:schema": "pnpm exec tango migrate --config ./tango.config.ts",
1293
+ "make:migrations": "pnpm exec tango make:migrations --config ./tango.config.ts --models ./lib/models/index.ts --name \"\${npm_config_name:-manual_change}\"",
1294
+ prebootstrap: "pnpm run setup:schema",
1295
+ bootstrap: "tsx scripts/bootstrap.ts"
1296
+ },
1297
+ dependencies: {
1298
+ ...deps,
1299
+ nuxt: "^4.4.2",
1300
+ vue: "^3.5.31",
1301
+ zod: "^4.0.0"
1302
+ },
1303
+ devDependencies: {
1304
+ ...devDeps,
1305
+ "@types/node": "^22.9.0",
1306
+ tsx: "^4.20.6",
1307
+ typescript: "^5.6.3",
1308
+ "vue-tsc": "^3.1.2"
1309
+ }
1310
+ }, null, 4);
1311
+ }
1312
+ };
1313
+
1314
+ //#endregion
1315
+ //#region src/frameworks/strategies/nuxt/templates/tsconfig.ts
1316
+ var TsConfigTemplateBuilder = class extends TemplateBuilder {
1317
+ constructor() {
1318
+ super({ name: "tsconfig.json" });
1319
+ }
1320
+ resolveTemplate(_context) {
1321
+ return JSON.stringify({
1322
+ extends: "./.nuxt/tsconfig.json",
1323
+ compilerOptions: { strict: true },
1324
+ include: [
1325
+ ".nuxt/**/*.d.ts",
1326
+ "**/*.ts",
1327
+ "**/*.vue",
1328
+ "migrations/**/*.ts"
1329
+ ]
1330
+ }, null, 4);
1331
+ }
1332
+ };
1333
+
1334
+ //#endregion
1335
+ //#region src/frameworks/strategies/nuxt/templates/nuxtConfig.ts
1336
+ var NuxtConfigTemplateBuilder = class extends TemplateBuilder {
1337
+ constructor() {
1338
+ super({ name: "nuxt.config.ts" });
1339
+ }
1340
+ resolveTemplate(_context) {
1341
+ return `import { defineNuxtConfig } from 'nuxt/config';
1342
+
1343
+ export default defineNuxtConfig({
1344
+ compatibilityDate: '2026-03-31',
1345
+ serverHandlers: [
1346
+ { route: '/api/health', handler: './server/tango/health.ts' },
1347
+ { route: '/api/openapi', handler: './server/tango/openapi.ts' },
1348
+ { route: '/api/todos', handler: './server/tango/todos.ts' },
1349
+ { route: '/api/todos/**:tango', handler: './server/tango/todos.ts' },
1350
+ ],
1351
+ });
1352
+ `;
1353
+ }
1354
+ };
1355
+
1356
+ //#endregion
1357
+ //#region src/frameworks/strategies/nuxt/templates/models.ts
1358
+ var TodoModelTemplateBuilder = class TodoModelTemplateBuilder extends TemplateBuilder {
1359
+ constructor() {
1360
+ super({ name: "lib/models/TodoModel.ts" });
1361
+ }
1362
+ static context(context) {
1363
+ return new TodoModelTemplateBuilder().setContext(context);
1364
+ }
1365
+ resolveTemplate(_context) {
1366
+ return `import { z } from 'zod';
1367
+ import { registerModelObjects } from '@danceroutine/tango-orm/runtime';
1368
+ import { Model, t } from '@danceroutine/tango-schema';
1369
+
1370
+ // Nuxt/Nitro can tree-shake side-effect-only runtime imports from source-linked packages.
1371
+ // Registering model objects here keeps \`TodoModel.objects\` available in SSR pages and handlers.
1372
+ registerModelObjects();
1373
+
1374
+ export const TodoReadSchema = z.object({
1375
+ id: z.number(),
1376
+ title: z.string().min(1),
1377
+ completed: z.coerce.boolean(),
1378
+ createdAt: z.string(),
1379
+ updatedAt: z.string(),
1380
+ });
1381
+
1382
+ export const TodoCreateSchema = z.object({
1383
+ title: z.string().min(1),
1384
+ completed: z.boolean().optional().default(false),
1385
+ });
1386
+
1387
+ export const TodoUpdateSchema = TodoCreateSchema.partial();
1388
+
1389
+ export type Todo = z.output<typeof TodoReadSchema>;
1390
+
1391
+ export const TodoModel = Model({
1392
+ namespace: 'app',
1393
+ name: 'Todo',
1394
+ schema: TodoReadSchema.extend({
1395
+ id: t.primaryKey(z.number().int()),
1396
+ title: z.string().min(1),
1397
+ completed: t.default(z.coerce.boolean(), 'false'),
1398
+ createdAt: t.default(z.string(), { now: true }),
1399
+ updatedAt: t.default(z.string(), { now: true }),
1400
+ }),
1401
+ });
1402
+ `;
1403
+ }
1404
+ };
1405
+ var ModelsBarrelTemplateBuilder = class extends TemplateBuilder {
1406
+ constructor() {
1407
+ super({ name: "lib/models/index.ts" });
1408
+ }
1409
+ resolveTemplate(_context) {
1410
+ return `export { TodoReadSchema, TodoCreateSchema, TodoUpdateSchema, TodoModel, type Todo } from './TodoModel';
1411
+ `;
1412
+ }
1413
+ };
1414
+
1415
+ //#endregion
1416
+ //#region src/frameworks/strategies/nuxt/templates/serializers.ts
1417
+ var TodoSerializerTemplateBuilder = class extends TemplateBuilder {
1418
+ constructor() {
1419
+ super({ name: "serializers/TodoSerializer.ts" });
1420
+ }
1421
+ resolveTemplate(_context) {
1422
+ return `import { ModelSerializer } from '@danceroutine/tango-resources';
1423
+ import { TodoCreateSchema, TodoModel, TodoReadSchema, TodoUpdateSchema, type Todo } from '~~/lib/models';
1424
+
1425
+ export class TodoSerializer extends ModelSerializer<
1426
+ Todo,
1427
+ typeof TodoCreateSchema,
1428
+ typeof TodoUpdateSchema,
1429
+ typeof TodoReadSchema
1430
+ > {
1431
+ static override readonly model = TodoModel;
1432
+ static override readonly createSchema = TodoCreateSchema;
1433
+ static override readonly updateSchema = TodoUpdateSchema;
1434
+ static override readonly outputSchema = TodoReadSchema;
1435
+ }
1436
+ `;
1437
+ }
1438
+ };
1439
+ var SerializersBarrelTemplateBuilder = class extends TemplateBuilder {
1440
+ constructor() {
1441
+ super({ name: "serializers/index.ts" });
1442
+ }
1443
+ resolveTemplate(_context) {
1444
+ return `export { TodoSerializer } from './TodoSerializer';
1445
+ `;
1446
+ }
1447
+ };
1448
+
1449
+ //#endregion
1450
+ //#region src/frameworks/strategies/nuxt/templates/openapi.ts
1451
+ var OpenAPITemplateBuilder = class extends TemplateBuilder {
1452
+ constructor() {
1453
+ super({ name: "lib/openapi.ts" });
1454
+ }
1455
+ resolveTemplate(_context) {
1456
+ return `import { describeViewSet, generateOpenAPISpec, type OpenAPISpec } from '@danceroutine/tango-openapi';
1457
+ import { TodoViewSet } from '~~/viewsets/TodoViewSet';
1458
+
1459
+ export function createOpenAPISpec(): OpenAPISpec {
1460
+ return generateOpenAPISpec({
1461
+ title: 'Tango Nuxt Todo API',
1462
+ version: '1.0.0',
1463
+ description: 'OpenAPI document generated from Tango resource instances.',
1464
+ resources: [describeViewSet({ basePath: '/api/todos', resource: new TodoViewSet() })],
1465
+ });
1466
+ }
1467
+ `;
1468
+ }
1469
+ };
1470
+
1471
+ //#endregion
1472
+ //#region src/frameworks/strategies/nuxt/templates/viewSet.ts
1473
+ var ViewSetTemplateBuilder = class extends TemplateBuilder {
1474
+ constructor() {
1475
+ super({ name: "viewsets/TodoViewSet.ts" });
1476
+ }
1477
+ resolveTemplate(_context) {
1478
+ return `import { FilterSet, ModelViewSet } from '@danceroutine/tango-resources';
1479
+ import { type Todo } from '~~/lib/models';
1480
+ import { TodoSerializer } from '~~/serializers';
1481
+
1482
+ export class TodoViewSet extends ModelViewSet<Todo, typeof TodoSerializer> {
1483
+ constructor() {
1484
+ super({
1485
+ serializer: TodoSerializer,
1486
+ filters: FilterSet.define<Todo>({
1487
+ fields: {
1488
+ completed: true,
1489
+ },
1490
+ aliases: {
1491
+ q: { fields: ['title'], lookup: 'icontains' },
1492
+ },
1493
+ }),
1494
+ orderingFields: ['id', 'createdAt', 'updatedAt', 'title'],
1495
+ searchFields: ['title'],
1496
+ });
1497
+ }
1498
+ }
1499
+ `;
1500
+ }
1501
+ };
1502
+
1503
+ //#endregion
1504
+ //#region src/frameworks/strategies/nuxt/templates/page.ts
1505
+ var PageTemplateBuilder = class extends TemplateBuilder {
1506
+ constructor() {
1507
+ super({ name: "app/pages/index.server.vue" });
1508
+ }
1509
+ resolveTemplate(_context) {
1510
+ return `<script setup lang="ts">
1511
+ import { TodoModel, TodoReadSchema } from '~/lib/models';
1512
+
1513
+ const todos = await TodoModel.objects.query().orderBy('-createdAt').limit(10).fetch(TodoReadSchema);
1514
+ </script>
1515
+
1516
+ <template>
1517
+ <main style="font-family: system-ui; margin: 2rem auto; max-width: 60ch;">
1518
+ <h1>Tango + Nuxt</h1>
1519
+ <p>Showing {{ todos.results.length }} todos through Tango's runtime-backed model manager.</p>
1520
+ <ul>
1521
+ <li v-for="todo in todos.results" :key="todo.id">{{ todo.title }}</li>
1522
+ </ul>
1523
+ </main>
1524
+ </template>
1525
+ `;
1526
+ }
1527
+ };
1528
+
1529
+ //#endregion
1530
+ //#region src/frameworks/strategies/nuxt/templates/layout.ts
1531
+ var AppShellTemplateBuilder = class extends TemplateBuilder {
1532
+ constructor() {
1533
+ super({ name: "app/app.vue" });
1534
+ }
1535
+ resolveTemplate(_context) {
1536
+ return `<template>
1537
+ <NuxtPage />
1538
+ </template>
1539
+ `;
1540
+ }
1541
+ };
1542
+
1543
+ //#endregion
1544
+ //#region src/frameworks/strategies/nuxt/templates/healthRoute.ts
1545
+ var HealthRouteTemplateBuilder = class extends TemplateBuilder {
1546
+ constructor() {
1547
+ super({ name: "server/tango/health.ts" });
1548
+ }
1549
+ resolveTemplate(_context) {
1550
+ return `export default defineEventHandler(() => ({ ok: true }));
1551
+ `;
1552
+ }
1553
+ };
1554
+
1555
+ //#endregion
1556
+ //#region src/frameworks/strategies/nuxt/templates/todoRoute.ts
1557
+ var TodoRouteTemplateBuilder = class extends TemplateBuilder {
1558
+ constructor() {
1559
+ super({ name: "server/tango/todos.ts" });
1560
+ }
1561
+ resolveTemplate(_context) {
1562
+ return `import { NuxtAdapter } from '@danceroutine/tango-adapters-nuxt/adapter';
1563
+ import { TodoViewSet } from '~~/viewsets/TodoViewSet';
1564
+
1565
+ const adapter = new NuxtAdapter();
1566
+ export default adapter.adaptViewSet(new TodoViewSet());
1567
+ `;
1568
+ }
1569
+ };
1570
+
1571
+ //#endregion
1572
+ //#region src/frameworks/strategies/nuxt/templates/openapiRoute.ts
1573
+ var OpenAPIRouteTemplateBuilder = class extends TemplateBuilder {
1574
+ constructor() {
1575
+ super({ name: "server/tango/openapi.ts" });
1576
+ }
1577
+ resolveTemplate(_context) {
1578
+ return `import { createOpenAPISpec } from '~~/lib/openapi';
1579
+
1580
+ export default defineEventHandler(() => createOpenAPISpec());
1581
+ `;
1582
+ }
1583
+ };
1584
+
1585
+ //#endregion
1586
+ //#region src/frameworks/strategies/nuxt/templates/bootstrap.ts
1587
+ var BootstrapTemplateBuilder = class extends TemplateBuilder {
1588
+ constructor() {
1589
+ super({ name: "scripts/bootstrap.ts" });
1590
+ }
1591
+ resolveTemplate(_context) {
1592
+ return `import { TodoModel, type Todo } from '../lib/models';
1593
+
1594
+ async function seedExampleData(count = 100): Promise<void> {
1595
+ const existing = await TodoModel.objects.query().count();
1596
+ if (existing >= count) {
1597
+ console.log(\`[bootstrap] Skipped; already have \${existing} todos.\`);
1598
+ return;
1599
+ }
1600
+
1601
+ const rows: Array<Partial<Todo>> = [];
1602
+ for (let index = existing; index < count; index += 1) {
1603
+ const now = new Date(Date.now() - index * 60_000).toISOString();
1604
+ rows.push({
1605
+ title: \`Seeded todo #\${index + 1}\`,
1606
+ completed: index % 3 === 0,
1607
+ createdAt: now,
1608
+ updatedAt: now,
1609
+ });
1610
+ }
1611
+
1612
+ await TodoModel.objects.bulkCreate(rows);
1613
+ console.log(\`[bootstrap] Seeded \${rows.length} todos.\`);
1614
+ }
1615
+
1616
+ const count = Number(process.env.SEED_TODOS_COUNT || '100');
1617
+ // oxlint-disable-next-line unicorn/prefer-top-level-await
1618
+ seedExampleData(Number.isFinite(count) ? count : 100).catch((error: unknown) => {
1619
+ console.error('[bootstrap] Failed:', error);
1620
+ process.exit(1);
1621
+ });
1622
+ `;
1623
+ }
1624
+ };
1625
+
1626
+ //#endregion
1627
+ //#region src/frameworks/strategies/nuxt/templates/tangoConfig.ts
1628
+ var TangoConfigTemplateBuilder = class extends TemplateBuilder {
1629
+ constructor() {
1630
+ super({ name: "tango.config.ts" });
1631
+ }
1632
+ resolveTemplate(context) {
1633
+ if (context.dialect === "sqlite") return `import { defineConfig } from '@danceroutine/tango-config';
1634
+
1635
+ export default defineConfig({
1636
+ current: (process.env.NODE_ENV || 'development') as 'development' | 'test' | 'production',
1637
+ environments: {
1638
+ development: {
1639
+ name: 'development',
1640
+ db: {
1641
+ adapter: 'sqlite',
1642
+ filename: process.env.TANGO_SQLITE_FILENAME || './.data/${context.projectName}.sqlite',
1643
+ maxConnections: 1,
1644
+ },
1645
+ migrations: { dir: './migrations', online: false },
1646
+ },
1647
+ test: {
1648
+ name: 'test',
1649
+ db: {
1650
+ adapter: 'sqlite',
1651
+ filename: process.env.TANGO_SQLITE_FILENAME || ':memory:',
1652
+ maxConnections: 1,
1653
+ },
1654
+ migrations: { dir: './migrations', online: false },
1655
+ },
1656
+ production: {
1657
+ name: 'production',
1658
+ db: {
1659
+ adapter: 'sqlite',
1660
+ filename: process.env.TANGO_SQLITE_FILENAME || './.data/${context.projectName}.sqlite',
1661
+ maxConnections: 1,
1662
+ },
1663
+ migrations: { dir: './migrations', online: false },
1664
+ },
1665
+ },
1666
+ });
1667
+ `;
1668
+ return `import { defineConfig } from '@danceroutine/tango-config';
1669
+
1670
+ export default defineConfig({
1671
+ current: (process.env.NODE_ENV || 'development') as 'development' | 'test' | 'production',
1672
+ environments: {
1673
+ development: {
1674
+ name: 'development',
1675
+ db: {
1676
+ adapter: 'postgres',
1677
+ url: process.env.TANGO_DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/${context.projectName}',
1678
+ maxConnections: 10,
1679
+ },
1680
+ migrations: { dir: './migrations', online: true },
1681
+ },
1682
+ test: {
1683
+ name: 'test',
1684
+ db: {
1685
+ adapter: 'postgres',
1686
+ url: process.env.TANGO_DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/${context.projectName}_test',
1687
+ maxConnections: 5,
1688
+ },
1689
+ migrations: { dir: './migrations', online: true },
1690
+ },
1691
+ production: {
1692
+ name: 'production',
1693
+ db: {
1694
+ adapter: 'postgres',
1695
+ url: process.env.TANGO_DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/${context.projectName}',
1696
+ maxConnections: 20,
1697
+ },
1698
+ migrations: { dir: './migrations', online: true },
1699
+ },
1700
+ },
1701
+ });
1702
+ `;
1703
+ }
1704
+ };
1705
+
1706
+ //#endregion
1707
+ //#region src/frameworks/strategies/nuxt/templates/readme.ts
1708
+ var ReadmeTemplateBuilder = class extends TemplateBuilder {
1709
+ constructor() {
1710
+ super({ name: "README.md" });
1711
+ }
1712
+ resolveTemplate(context) {
1713
+ return `# ${context.projectName}
1714
+
1715
+ This project was scaffolded by \`tango new --framework nuxt\`.
1716
+
1717
+ Nuxt still owns pages and SSR rendering; Tango owns model metadata, \`Model.objects\`, serializers, migrations, querying, and resource behavior.
1718
+
1719
+ ## First-time setup
1720
+
1721
+ Generate your first migration from the scaffolded models, then start the app:
1722
+
1723
+ \`\`\`bash
1724
+ ${context.packageManager} run make:migrations --name initial
1725
+ ${context.packageManager} run dev
1726
+ \`\`\`
1727
+
1728
+ ## Scripts
1729
+
1730
+ - \`${context.packageManager} run dev\`
1731
+ - \`${context.packageManager} run make:migrations --name add_field\`
1732
+ - \`${context.packageManager} run setup:schema\`
1733
+ - \`${context.packageManager} run bootstrap\`
1734
+ - \`${context.packageManager} run typecheck\`
1735
+
1736
+ ## Useful endpoints
1737
+
1738
+ - \`GET /api/health\`
1739
+ - \`GET /api/openapi\`
1740
+ - \`GET|POST|PATCH|DELETE /api/todos...\`
1741
+
1742
+ ## Project layout
1743
+
1744
+ - \`nuxt.config.ts\` Nuxt config and explicit Tango server handler registration
1745
+ - \`tango.config.ts\` Tango configuration
1746
+ - \`lib/models/\` schemas and Tango model metadata; explicit ORM registration keeps \`Model.objects\` available in SSR pages and handlers
1747
+ - \`serializers/\` serializer-backed API contracts for Tango resources
1748
+ - \`viewsets/\` CRUD resources backed by \`Model.objects\`
1749
+ - \`app/pages/index.server.vue\` server-rendered page reading through \`TodoModel.objects\`
1750
+ - \`server/tango/todos.ts\` Nuxt adapter wiring for the viewset
1751
+ - \`lib/openapi.ts\` OpenAPI document generation
1752
+ - \`scripts/bootstrap.ts\` seed utility for a larger demo dataset
1753
+ - \`migrations/\` checked-in Tango migrations
1754
+ `;
1755
+ }
1756
+ };
1757
+
1758
+ //#endregion
1759
+ //#region src/frameworks/strategies/nuxt/NuxtScaffoldStrategy.ts
1760
+ var NuxtScaffoldStrategy = class extends FrameworkScaffoldStrategy {
1761
+ id = "nuxt";
1762
+ name = "Nuxt";
1763
+ description = "Bootstrap a Tango application hosted by Nuxt Nitro and SSR pages.";
1764
+ /**
1765
+ * Return the file templates needed for the generated Nuxt project.
1766
+ */
1767
+ getTemplates() {
1768
+ return [
1769
+ this.addFrameworkTemplate(new PackageJsonTemplateBuilder()),
1770
+ this.addFrameworkTemplate(new NuxtConfigTemplateBuilder()),
1771
+ this.addFrameworkTemplate(new TsConfigTemplateBuilder()),
1772
+ this.addFrameworkTemplate(new AppShellTemplateBuilder()),
1773
+ this.addFrameworkTemplate(new PageTemplateBuilder()),
1774
+ this.addTangoTemplate(new TangoConfigTemplateBuilder()),
1252
1775
  this.addTangoTemplate(new TodoModelTemplateBuilder()),
1253
1776
  this.addTangoTemplate(new ModelsBarrelTemplateBuilder()),
1254
1777
  this.addTangoTemplate(new TodoSerializerTemplateBuilder()),
1255
1778
  this.addTangoTemplate(new SerializersBarrelTemplateBuilder()),
1256
1779
  this.addTangoTemplate(new OpenAPITemplateBuilder()),
1257
1780
  this.addTangoTemplate(new ViewSetTemplateBuilder()),
1258
- this.addFrameworkTemplate(new LayoutTemplateBuilder()),
1259
- this.addFrameworkTemplate(new PageTemplateBuilder()),
1260
1781
  this.addTangoTemplate(new HealthRouteTemplateBuilder()),
1261
1782
  this.addTangoTemplate(new OpenAPIRouteTemplateBuilder()),
1262
1783
  this.addTangoTemplate(new TodoRouteTemplateBuilder()),
1263
1784
  this.addTangoTemplate(new BootstrapTemplateBuilder()),
1264
1785
  this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate("migrations/.gitkeep", "")),
1265
1786
  this.addFrameworkTemplate(new ReadmeTemplateBuilder()),
1266
- this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate(".gitignore", "node_modules\n.next\n.data\n.env\n"))
1787
+ this.addFrameworkTemplate(TemplateBuilder.createStaticTemplate(".gitignore", "node_modules\n.nuxt\n.output\n.data\n.env\n"))
1267
1788
  ];
1268
1789
  }
1269
1790
  };
@@ -1279,6 +1800,7 @@ var FrameworkScaffoldRegistry = class FrameworkScaffoldRegistry {
1279
1800
  const registry = new FrameworkScaffoldRegistry();
1280
1801
  registry.register(new ExpressScaffoldStrategy());
1281
1802
  registry.register(new NextScaffoldStrategy());
1803
+ registry.register(new NuxtScaffoldStrategy());
1282
1804
  return registry;
1283
1805
  }
1284
1806
  /**
@@ -1356,11 +1878,12 @@ __export(frameworks_exports, {
1356
1878
  FrameworkScaffoldRegistry: () => FrameworkScaffoldRegistry,
1357
1879
  FrameworkScaffoldStrategy: () => FrameworkScaffoldStrategy,
1358
1880
  NextScaffoldStrategy: () => NextScaffoldStrategy,
1881
+ NuxtScaffoldStrategy: () => NuxtScaffoldStrategy,
1359
1882
  SCAFFOLD_TEMPLATE_CATEGORY: () => SCAFFOLD_TEMPLATE_CATEGORY,
1360
1883
  ScaffoldTemplateDescriptor: () => ScaffoldTemplateDescriptor,
1361
1884
  scaffoldProject: () => scaffoldProject
1362
1885
  });
1363
1886
 
1364
1887
  //#endregion
1365
- export { ExpressScaffoldStrategy, FrameworkScaffoldRegistry, FrameworkScaffoldStrategy, NextScaffoldStrategy, PACKAGE_MANAGER, SCAFFOLD_DATABASE_DIALECT, SCAFFOLD_TEMPLATE_CATEGORY, SUPPORTED_FRAMEWORK, ScaffoldTemplateDescriptor, frameworks_exports, scaffoldProject };
1366
- //# sourceMappingURL=frameworks-Dv0HsD4K.js.map
1888
+ export { ExpressScaffoldStrategy, FrameworkScaffoldRegistry, FrameworkScaffoldStrategy, NextScaffoldStrategy, NuxtScaffoldStrategy, PACKAGE_MANAGER, SCAFFOLD_DATABASE_DIALECT, SCAFFOLD_TEMPLATE_CATEGORY, SUPPORTED_FRAMEWORK, ScaffoldTemplateDescriptor, frameworks_exports, scaffoldProject };
1889
+ //# sourceMappingURL=frameworks-DOnjbO9C.js.map