@objectifthunes/create-sandstone 0.2.0 → 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 (114) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +31 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/add-adapter.d.ts +2 -0
  6. package/dist/commands/add-adapter.d.ts.map +1 -0
  7. package/dist/commands/add-adapter.js +683 -0
  8. package/dist/commands/add-adapter.js.map +1 -0
  9. package/dist/commands/generate-adapter.d.ts +2 -0
  10. package/dist/commands/generate-adapter.d.ts.map +1 -0
  11. package/dist/commands/generate-adapter.js +467 -0
  12. package/dist/commands/generate-adapter.js.map +1 -0
  13. package/dist/commands/generate-entity.d.ts +2 -0
  14. package/dist/commands/generate-entity.d.ts.map +1 -0
  15. package/dist/commands/generate-entity.js +217 -0
  16. package/dist/commands/generate-entity.js.map +1 -0
  17. package/dist/generator.d.ts.map +1 -1
  18. package/dist/generator.js +92 -25
  19. package/dist/generator.js.map +1 -1
  20. package/dist/index.js +6 -5
  21. package/dist/index.js.map +1 -1
  22. package/dist/presets.d.ts +24 -4
  23. package/dist/presets.d.ts.map +1 -1
  24. package/dist/presets.js +42 -19
  25. package/dist/presets.js.map +1 -1
  26. package/dist/prompts.d.ts.map +1 -1
  27. package/dist/prompts.js +181 -7
  28. package/dist/prompts.js.map +1 -1
  29. package/dist/templates/auth-test.d.ts +3 -0
  30. package/dist/templates/auth-test.d.ts.map +1 -0
  31. package/dist/templates/auth-test.js +52 -0
  32. package/dist/templates/auth-test.js.map +1 -0
  33. package/dist/templates/claude-md.d.ts.map +1 -1
  34. package/dist/templates/claude-md.js +472 -4
  35. package/dist/templates/claude-md.js.map +1 -1
  36. package/dist/templates/docker-compose.d.ts.map +1 -1
  37. package/dist/templates/docker-compose.js +42 -0
  38. package/dist/templates/docker-compose.js.map +1 -1
  39. package/dist/templates/entities-repositories.d.ts +3 -0
  40. package/dist/templates/entities-repositories.d.ts.map +1 -0
  41. package/dist/templates/entities-repositories.js +19 -0
  42. package/dist/templates/entities-repositories.js.map +1 -0
  43. package/dist/templates/entities-types.d.ts +3 -0
  44. package/dist/templates/entities-types.d.ts.map +1 -0
  45. package/dist/templates/entities-types.js +24 -0
  46. package/dist/templates/entities-types.js.map +1 -0
  47. package/dist/templates/env-example.d.ts.map +1 -1
  48. package/dist/templates/env-example.js +81 -2
  49. package/dist/templates/env-example.js.map +1 -1
  50. package/dist/templates/graphql-auth.d.ts +3 -0
  51. package/dist/templates/graphql-auth.d.ts.map +1 -0
  52. package/dist/templates/graphql-auth.js +160 -0
  53. package/dist/templates/graphql-auth.js.map +1 -0
  54. package/dist/templates/graphql-enums.d.ts +2 -0
  55. package/dist/templates/graphql-enums.d.ts.map +1 -0
  56. package/dist/templates/graphql-enums.js +28 -0
  57. package/dist/templates/graphql-enums.js.map +1 -0
  58. package/dist/templates/graphql-helpers.d.ts +2 -0
  59. package/dist/templates/graphql-helpers.d.ts.map +1 -0
  60. package/dist/templates/graphql-helpers.js +134 -0
  61. package/dist/templates/graphql-helpers.js.map +1 -0
  62. package/dist/templates/graphql-inputs.d.ts +2 -0
  63. package/dist/templates/graphql-inputs.d.ts.map +1 -0
  64. package/dist/templates/graphql-inputs.js +28 -0
  65. package/dist/templates/graphql-inputs.js.map +1 -0
  66. package/dist/templates/graphql-schema.d.ts +3 -0
  67. package/dist/templates/graphql-schema.d.ts.map +1 -0
  68. package/dist/templates/graphql-schema.js +33 -0
  69. package/dist/templates/graphql-schema.js.map +1 -0
  70. package/dist/templates/graphql-types.d.ts +3 -0
  71. package/dist/templates/graphql-types.d.ts.map +1 -0
  72. package/dist/templates/graphql-types.js +61 -0
  73. package/dist/templates/graphql-types.js.map +1 -0
  74. package/dist/templates/graphql-validation.d.ts +3 -0
  75. package/dist/templates/graphql-validation.d.ts.map +1 -0
  76. package/dist/templates/graphql-validation.js +37 -0
  77. package/dist/templates/graphql-validation.js.map +1 -0
  78. package/dist/templates/health-e2e-test.d.ts +3 -0
  79. package/dist/templates/health-e2e-test.d.ts.map +1 -0
  80. package/dist/templates/health-e2e-test.js +50 -0
  81. package/dist/templates/health-e2e-test.js.map +1 -0
  82. package/dist/templates/infrastructure.d.ts.map +1 -1
  83. package/dist/templates/infrastructure.js +433 -32
  84. package/dist/templates/infrastructure.js.map +1 -1
  85. package/dist/templates/main-express.d.ts.map +1 -1
  86. package/dist/templates/main-express.js +87 -8
  87. package/dist/templates/main-express.js.map +1 -1
  88. package/dist/templates/main-fastify.d.ts +3 -0
  89. package/dist/templates/main-fastify.d.ts.map +1 -0
  90. package/dist/templates/main-fastify.js +73 -0
  91. package/dist/templates/main-fastify.js.map +1 -0
  92. package/dist/templates/main-hono.d.ts.map +1 -1
  93. package/dist/templates/main-hono.js +45 -9
  94. package/dist/templates/main-hono.js.map +1 -1
  95. package/dist/templates/package-json.d.ts.map +1 -1
  96. package/dist/templates/package-json.js +67 -3
  97. package/dist/templates/package-json.js.map +1 -1
  98. package/dist/templates/test-setup.d.ts +1 -1
  99. package/dist/templates/test-setup.d.ts.map +1 -1
  100. package/dist/templates/test-setup.js +10 -39
  101. package/dist/templates/test-setup.js.map +1 -1
  102. package/dist/templates/vitest-config.d.ts +2 -0
  103. package/dist/templates/vitest-config.d.ts.map +1 -0
  104. package/dist/templates/vitest-config.js +13 -0
  105. package/dist/templates/vitest-config.js.map +1 -0
  106. package/dist/templates/vitest-e2e-config.d.ts +2 -0
  107. package/dist/templates/vitest-e2e-config.d.ts.map +1 -0
  108. package/dist/templates/vitest-e2e-config.js +16 -0
  109. package/dist/templates/vitest-e2e-config.js.map +1 -0
  110. package/dist/templates/workers-index.d.ts +3 -0
  111. package/dist/templates/workers-index.d.ts.map +1 -0
  112. package/dist/templates/workers-index.js +19 -0
  113. package/dist/templates/workers-index.js.map +1 -0
  114. package/package.json +6 -2
@@ -0,0 +1,28 @@
1
+ export function graphqlInputsTemplate() {
2
+ return `// Add your GraphQL input types here.
3
+ // Each input type maps to a mutation's args for structured input.
4
+ //
5
+ // Example:
6
+ // import { GraphQLInputObjectType, GraphQLString, GraphQLNonNull, GraphQLFloat } from '@objectifthunes/sandstone-sdk';
7
+ //
8
+ // export const CreateInvoiceInput = new GraphQLInputObjectType({
9
+ // name: 'CreateInvoiceInput',
10
+ // fields: () => ({
11
+ // clientId: { type: new GraphQLNonNull(GraphQLString) },
12
+ // description: { type: new GraphQLNonNull(GraphQLString) },
13
+ // amount: { type: new GraphQLNonNull(GraphQLFloat) },
14
+ // currency: { type: GraphQLString, defaultValue: 'EUR' },
15
+ // }),
16
+ // });
17
+ //
18
+ // export const UpdateInvoiceInput = new GraphQLInputObjectType({
19
+ // name: 'UpdateInvoiceInput',
20
+ // fields: () => ({
21
+ // description: { type: GraphQLString },
22
+ // amount: { type: GraphQLFloat },
23
+ // status: { type: GraphQLString },
24
+ // }),
25
+ // });
26
+ `;
27
+ }
28
+ //# sourceMappingURL=graphql-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-inputs.js","sourceRoot":"","sources":["../../src/templates/graphql-inputs.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function graphqlSchemaTemplate(_config: ProjectConfig): string;
3
+ //# sourceMappingURL=graphql-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-schema.d.ts","sourceRoot":"","sources":["../../src/templates/graphql-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA+BpE"}
@@ -0,0 +1,33 @@
1
+ export function graphqlSchemaTemplate(_config) {
2
+ return `import { buildSchema, GraphQLObjectType } from '@objectifthunes/sandstone-sdk';
3
+ import { authQueries, authMutations } from './auth.js';
4
+
5
+ // Import your domain modules here:
6
+ // import { clientQueries, clientMutations } from './clients.js';
7
+ // import { invoiceQueries, invoiceMutations } from './invoices.js';
8
+
9
+ const QueryType = new GraphQLObjectType({
10
+ name: 'Query',
11
+ fields: () => ({
12
+ ...authQueries,
13
+ // ...clientQueries,
14
+ // ...invoiceQueries,
15
+ }),
16
+ });
17
+
18
+ const MutationType = new GraphQLObjectType({
19
+ name: 'Mutation',
20
+ fields: () => ({
21
+ ...authMutations,
22
+ // ...clientMutations,
23
+ // ...invoiceMutations,
24
+ }),
25
+ });
26
+
27
+ export const schema = buildSchema({
28
+ query: QueryType,
29
+ mutation: MutationType,
30
+ });
31
+ `;
32
+ }
33
+ //# sourceMappingURL=graphql-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-schema.js","sourceRoot":"","sources":["../../src/templates/graphql-schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,OAAsB;IAC1D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BR,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function graphqlTypesTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=graphql-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-types.d.ts","sourceRoot":"","sources":["../../src/templates/graphql-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAkElE"}
@@ -0,0 +1,61 @@
1
+ export function graphqlTypesTemplate(config) {
2
+ const parts = [];
3
+ // ── Imports ──────────────────────────────────────────────────────────────
4
+ const graphqlImports = [
5
+ 'GraphQLObjectType',
6
+ 'GraphQLString',
7
+ 'GraphQLNonNull',
8
+ 'GraphQLBoolean',
9
+ 'GraphQLInt',
10
+ 'GraphQLList',
11
+ 'GraphQLID',
12
+ ];
13
+ parts.push(`import {
14
+ ${graphqlImports.join(',\n ')},
15
+ } from '@objectifthunes/sandstone-sdk';`);
16
+ parts.push('');
17
+ // ── AuthResultType ───────────────────────────────────────────────────────
18
+ parts.push(`export const AuthResultType = new GraphQLObjectType({
19
+ name: 'AuthResult',
20
+ fields: () => ({
21
+ accessToken: { type: new GraphQLNonNull(GraphQLString) },
22
+ refreshToken: { type: new GraphQLNonNull(GraphQLString) },
23
+ isNewUser: { type: new GraphQLNonNull(GraphQLBoolean) },
24
+ }),
25
+ });`);
26
+ parts.push('');
27
+ // ── MeType ───────────────────────────────────────────────────────────────
28
+ parts.push(`export const MeType = new GraphQLObjectType({
29
+ name: 'Me',
30
+ fields: () => ({
31
+ id: { type: new GraphQLNonNull(GraphQLID) },
32
+ email: { type: new GraphQLNonNull(GraphQLString) },
33
+ roles: { type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLString))) },
34
+ }),
35
+ });`);
36
+ parts.push('');
37
+ // ── PaginationInfoType ───────────────────────────────────────────────────
38
+ parts.push(`export const PaginationInfoType = new GraphQLObjectType({
39
+ name: 'PaginationInfo',
40
+ fields: () => ({
41
+ page: { type: new GraphQLNonNull(GraphQLInt) },
42
+ perPage: { type: new GraphQLNonNull(GraphQLInt) },
43
+ total: { type: new GraphQLNonNull(GraphQLInt) },
44
+ totalPages: { type: new GraphQLNonNull(GraphQLInt) },
45
+ }),
46
+ });`);
47
+ // ── UploadUrlResultType (conditional on storage) ─────────────────────────
48
+ if (config.storage) {
49
+ parts.push('');
50
+ parts.push(`export const UploadUrlResultType = new GraphQLObjectType({
51
+ name: 'UploadUrlResult',
52
+ fields: () => ({
53
+ url: { type: new GraphQLNonNull(GraphQLString) },
54
+ key: { type: new GraphQLNonNull(GraphQLString) },
55
+ }),
56
+ });`);
57
+ }
58
+ parts.push('');
59
+ return parts.join('\n');
60
+ }
61
+ //# sourceMappingURL=graphql-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-types.js","sourceRoot":"","sources":["../../src/templates/graphql-types.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,4EAA4E;IAC5E,MAAM,cAAc,GAAG;QACrB,mBAAmB;QACnB,eAAe;QACf,gBAAgB;QAChB,gBAAgB;QAChB,YAAY;QACZ,aAAa;QACb,WAAW;KACZ,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC;IACT,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;wCACQ,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC;;;;;;;IAOT,CAAC,CAAC;IACJ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC;;;;;;;IAOT,CAAC,CAAC;IACJ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC;;;;;;;;IAQT,CAAC,CAAC;IAEJ,4EAA4E;IAC5E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC;;;;;;IAMX,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function graphqlValidationTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=graphql-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-validation.d.ts","sourceRoot":"","sources":["../../src/templates/graphql-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAwCvE"}
@@ -0,0 +1,37 @@
1
+ export function graphqlValidationTemplate(config) {
2
+ const hasPassword = config.auth === 'password+otp' || config.auth === 'all';
3
+ const parts = [];
4
+ parts.push(`import { z } from '@objectifthunes/sandstone-sdk';`);
5
+ parts.push('');
6
+ // ── RegisterSchema (conditional on password auth) ────────────────────────
7
+ if (hasPassword) {
8
+ parts.push(`export const RegisterSchema = z.object({
9
+ email: z.string().email('Invalid email address'),
10
+ password: z
11
+ .string()
12
+ .min(8, 'Password must be at least 8 characters')
13
+ .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')
14
+ .regex(/[0-9]/, 'Password must contain at least one number'),
15
+ });`);
16
+ parts.push('');
17
+ }
18
+ // ── Example validation schema (always included as commented reference) ──
19
+ parts.push(`// Add your validation schemas here. Use with validate(schema, data) in resolvers.
20
+ // Every mutation should validate input before any DB operation.
21
+ //
22
+ // Example:
23
+ // export const CreateEntitySchema = z.object({
24
+ // name: z.string().min(1, 'Name is required').max(200, 'Name too long'),
25
+ // email: z.string().email('Invalid email'),
26
+ // description: z.string().max(2000).optional(),
27
+ // quantity: z.number().int().min(1, 'Must be at least 1').max(10000),
28
+ // price: z.number().min(0, 'Price cannot be negative').max(999999.99),
29
+ // taxRate: z.number().min(0).max(100).optional(),
30
+ // status: z.enum(['draft', 'active', 'archived']).default('draft'),
31
+ // tags: z.array(z.string().max(50)).max(20).optional(),
32
+ // notes: z.string().max(5000).nullable().optional(),
33
+ // });`);
34
+ parts.push('');
35
+ return parts.join('\n');
36
+ }
37
+ //# sourceMappingURL=graphql-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-validation.js","sourceRoot":"","sources":["../../src/templates/graphql-validation.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB,CAAC,MAAqB;IAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC;IAE5E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4EAA4E;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC;;;;;;;IAOX,CAAC,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;;OAcN,CAAC,CAAC;IACP,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function healthE2eTestTemplate(_config: ProjectConfig): string;
3
+ //# sourceMappingURL=health-e2e-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-e2e-test.d.ts","sourceRoot":"","sources":["../../src/templates/health-e2e-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAgDpE"}
@@ -0,0 +1,50 @@
1
+ export function healthE2eTestTemplate(_config) {
2
+ return `import { describe, it, expect, beforeAll, afterAll } from 'vitest';
3
+ import type { Server } from 'node:http';
4
+
5
+ let baseUrl: string;
6
+ let server: Server;
7
+
8
+ describe('Health Check E2E', () => {
9
+ beforeAll(async () => {
10
+ const { app } = await import('../../src/infrastructure.js');
11
+ const { runMigrations } = await import('@objectifthunes/sandstone-sdk');
12
+
13
+ const migrationDir = new URL('../../migrations', import.meta.url).pathname;
14
+ await runMigrations(app.db, { includeBuiltIn: true, directory: migrationDir });
15
+
16
+ // Dynamic import of main module to start server
17
+ // Adjust this based on your framework
18
+ const express = await import('express');
19
+ const { toExpressHandler } = await import('@objectifthunes/sandstone-sdk/adapters');
20
+
21
+ const srv = express.default();
22
+ srv.use(express.default.json());
23
+ srv.get('/health', toExpressHandler(app.healthHandler));
24
+
25
+ await new Promise<void>((resolve) => {
26
+ server = srv.listen(0, () => {
27
+ const addr = server.address();
28
+ const port = typeof addr === 'object' && addr ? addr.port : 3099;
29
+ baseUrl = \`http://localhost:\${port}\`;
30
+ resolve();
31
+ });
32
+ });
33
+ }, 30_000);
34
+
35
+ afterAll(async () => {
36
+ server?.close();
37
+ const { app } = await import('../../src/infrastructure.js');
38
+ await app.shutdown();
39
+ }, 10_000);
40
+
41
+ it('health check returns healthy', async () => {
42
+ const res = await fetch(\`\${baseUrl}/health\`);
43
+ const body = await res.json();
44
+ expect(res.status).toBe(200);
45
+ expect(body.status).toBe('healthy');
46
+ });
47
+ });
48
+ `;
49
+ }
50
+ //# sourceMappingURL=health-e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-e2e-test.js","sourceRoot":"","sources":["../../src/templates/health-e2e-test.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,OAAsB;IAC1D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CR,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"infrastructure.d.ts","sourceRoot":"","sources":["../../src/templates/infrastructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8OpE"}
1
+ {"version":3,"file":"infrastructure.d.ts","sourceRoot":"","sources":["../../src/templates/infrastructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAwmBpE"}