@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.
- package/README.md +1 -0
- package/dist/commands/index.js +2 -2
- package/dist/{commands-C2Xr9uRE.js → commands-lJSW2Kuf.js} +4 -3
- package/dist/{commands-C2Xr9uRE.js.map → commands-lJSW2Kuf.js.map} +1 -1
- package/dist/frameworks/contracts/FrameworkScaffoldStrategy.d.ts +1 -0
- package/dist/frameworks/contracts/template/TemplateBuilder.d.ts +1 -1
- package/dist/frameworks/index.d.ts +1 -0
- package/dist/frameworks/index.js +2 -2
- package/dist/frameworks/strategies/nuxt/NuxtScaffoldStrategy.d.ts +14 -0
- package/dist/frameworks/strategies/nuxt/templates/bootstrap.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/healthRoute.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/layout.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/models.d.ts +11 -0
- package/dist/frameworks/strategies/nuxt/templates/nuxtConfig.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/openapi.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/openapiRoute.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/packageJson.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/page.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/readme.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/serializers.d.ts +10 -0
- package/dist/frameworks/strategies/nuxt/templates/tangoConfig.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/todoRoute.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/tsconfig.d.ts +6 -0
- package/dist/frameworks/strategies/nuxt/templates/viewSet.d.ts +6 -0
- package/dist/{frameworks-Dv0HsD4K.js → frameworks-DOnjbO9C.js} +572 -49
- package/dist/frameworks-DOnjbO9C.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -3
- package/package.json +2 -2
- 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
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
718
|
-
this.addFrameworkTemplate(new TsConfigTemplateBuilder$
|
|
718
|
+
this.addFrameworkTemplate(new PackageJsonTemplateBuilder$2()),
|
|
719
|
+
this.addFrameworkTemplate(new TsConfigTemplateBuilder$2()),
|
|
719
720
|
this.addFrameworkTemplate(new TsConfigBuildTemplateBuilder()),
|
|
720
|
-
this.addTangoTemplate(new TangoConfigTemplateBuilder$
|
|
721
|
+
this.addTangoTemplate(new TangoConfigTemplateBuilder$2()),
|
|
721
722
|
this.addFrameworkTemplate(new AppSourceTemplateBuilder()),
|
|
722
|
-
this.addTangoTemplate(new TodoModelTemplateBuilder$
|
|
723
|
-
this.addTangoTemplate(new ModelsBarrelTemplateBuilder$
|
|
724
|
-
this.addTangoTemplate(new TodoSerializerTemplateBuilder$
|
|
725
|
-
this.addTangoTemplate(new SerializersBarrelTemplateBuilder$
|
|
726
|
-
this.addTangoTemplate(new OpenAPITemplateBuilder$
|
|
727
|
-
this.addTangoTemplate(new ViewSetTemplateBuilder$
|
|
728
|
-
this.addTangoTemplate(new BootstrapTemplateBuilder$
|
|
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$
|
|
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.
|
|
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-
|
|
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
|