@nest-arch/tui 0.2.7 → 0.4.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 (71) hide show
  1. package/README.md +20 -42
  2. package/dist/cli.js +1 -1
  3. package/dist/constants-C3xmDWeK.js +1 -0
  4. package/dist/index.js +295 -82
  5. package/dist/templates/base/.env.example.hbs +4 -2
  6. package/dist/templates/base/.env.hbs +4 -2
  7. package/dist/templates/base/.gitignore.hbs +2 -1
  8. package/dist/templates/base/.yarnrc.yml.hbs +0 -5
  9. package/dist/templates/base/README.md.hbs +33 -5
  10. package/dist/templates/base/nest-cli.json.hbs +2 -1
  11. package/dist/templates/base/pnpm-workspace.yaml.hbs +9 -0
  12. package/dist/templates/base/prisma.config.ts.hbs +32 -6
  13. package/dist/templates/base/src/app.controller.spec.ts.hbs +3 -11
  14. package/dist/templates/base/src/app.controller.ts.hbs +2 -2
  15. package/dist/templates/base/src/app.module.ts.hbs +19 -1
  16. package/dist/templates/base/src/app.router.ts.hbs +2 -2
  17. package/dist/templates/base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs +7 -0
  18. package/dist/templates/base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs +25 -1
  19. package/dist/templates/base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs +17 -12
  20. package/dist/templates/base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs +9 -0
  21. package/dist/templates/base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs +7 -4
  22. package/dist/templates/base/src/database/adapters/sql/raw-sql.adapter.ts.hbs +37 -0
  23. package/dist/templates/base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs +8 -3
  24. package/dist/templates/base/src/database/db.module.ts.hbs +32 -35
  25. package/dist/templates/base/src/database/db.service.ts.hbs +40 -6
  26. package/dist/templates/base/src/database/entities/todo.entity.ts.hbs +12 -7
  27. package/dist/templates/base/src/database/index.ts.hbs +1 -0
  28. package/dist/templates/base/src/database/orm/drizzle/schema.ts.hbs +47 -5
  29. package/dist/templates/base/src/database/orm/typeorm/data-source.ts.hbs +12 -4
  30. package/dist/templates/base/src/libs/trpc/error.handler.ts.hbs +1 -1
  31. package/dist/templates/base/src/main.ts.hbs +21 -6
  32. package/dist/templates/base/test/app.e2e-spec.ts.hbs +208 -6
  33. package/dist/templates/base/test/bootstrap.e2e-spec.ts.hbs +74 -0
  34. package/dist/templates/base/tsconfig.build.json.hbs +2 -0
  35. package/dist/templates/base/tsconfig.json.hbs +1 -1
  36. package/dist/templates/base/vitest.config.e2e.ts.hbs +4 -3
  37. package/dist/templates/base/vitest.config.ts.hbs +4 -3
  38. package/dist/templates/base/yarn.lock.hbs +1 -0
  39. package/dist/templates/extras/docker/Dockerfile.hbs +4 -1
  40. package/dist/templates/extras/swagger/create-docs.ts.hbs +47 -119
  41. package/dist/templates/feature/graphql/src/graphql/graphql.module.ts.hbs +8 -1
  42. package/dist/templates/feature/graphql/src/graphql/models/todo.model.ts.hbs +4 -0
  43. package/dist/templates/feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs +4 -3
  44. package/dist/templates/feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs +69 -24
  45. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs +3 -1
  46. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.module.ts.hbs +1 -3
  47. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.service.ts.hbs +98 -32
  48. package/dist/templates/monorepo/apps/api-gateway/package.json.hbs +0 -1
  49. package/dist/templates/monorepo/apps/api-gateway/src/app.controller.spec.ts.hbs +1 -1
  50. package/dist/templates/monorepo/apps/api-gateway/test/app.e2e-spec.ts.hbs +20 -1
  51. package/dist/templates/monorepo/apps/api-gateway/tsconfig.build.json.hbs +2 -1
  52. package/dist/templates/monorepo/apps/api-gateway/vitest.config.e2e.ts.hbs +3 -2
  53. package/dist/templates/monorepo/apps/api-gateway/vitest.config.ts.hbs +3 -2
  54. package/dist/templates/monorepo/feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs +24 -21
  55. package/dist/templates/monorepo/packages/env/src/api-gateway.ts.hbs +9 -3
  56. package/dist/templates/monorepo/root/.gitignore.hbs +1 -0
  57. package/dist/templates/monorepo/root/pnpm-workspace.yaml.hbs +9 -0
  58. package/dist/templates/monorepo/root/tsconfig.json.hbs +1 -1
  59. package/dist/templates/monorepo/root/turbo.json.hbs +2 -0
  60. package/dist/templates/single-project/architecture/nest-api/.env.hbs +3 -1
  61. package/dist/templates/single-project/architecture/nest-api/package.json.hbs +0 -1
  62. package/dist/templates/single-project/architecture/nest-api/src/main.ts.hbs +20 -5
  63. package/dist/templates/single-project/architecture/nest-microservice/.env.hbs +18 -0
  64. package/dist/templates/single-project/architecture/nest-microservice/proto/app.proto.hbs +13 -0
  65. package/dist/templates/single-project/architecture/nest-microservice/src/app.controller.ts.hbs +14 -1
  66. package/dist/templates/single-project/architecture/nest-microservice/src/app.service.ts.hbs +4 -0
  67. package/dist/templates/single-project/architecture/nest-microservice/src/main.ts.hbs +13 -2
  68. package/dist/templates/single-project/architecture/nest-microservice/test/microservice.e2e-spec.ts.hbs +64 -0
  69. package/dist/templates/single-project/shared/config/env.ts.hbs +27 -3
  70. package/package.json +7 -4
  71. package/dist/constants-Cgtoxhmd.js +0 -1
@@ -22,12 +22,23 @@ import { auth } from "./auth/auth.js";
22
22
 
23
23
  async function bootstrap() {
24
24
  const app = await NestFactory.create{{#if (eq httpProvider "fastify")}}<NestFastifyApplication>(AppModule, new FastifyAdapter()){{else}}(AppModule){{/if}};
25
+ app.enableCors({ origin: env.CORS_ORIGIN });
26
+ app.setGlobalPrefix("api");
27
+ app.enableShutdownHooks();
25
28
 
26
29
  app.connectMicroservice<MicroserviceOptions>({
27
- transport: Transport.TCP,
30
+ transport: {{#if (includes microservices "redis")}}Transport.REDIS{{else if (includes microservices "mqtt")}}Transport.MQTT{{else if (includes microservices "nats")}}Transport.NATS{{else if (includes microservices "rabbitmq")}}Transport.RMQ{{else if (includes microservices "kafka")}}Transport.KAFKA{{else if (includes microservices "grpc")}}Transport.GRPC{{else}}Transport.TCP{{/if}},
28
31
  options: {
32
+ {{#if (includes microservices "redis")}}host: new URL(env.REDIS_URL).hostname, port: Number(new URL(env.REDIS_URL).port || 6379),{{/if}}
33
+ {{#if (includes microservices "mqtt")}}url: env.MQTT_URL ?? "mqtt://127.0.0.1:1883",{{/if}}
34
+ {{#if (includes microservices "nats")}}servers: [env.NATS_URL ?? "nats://127.0.0.1:4222"],{{/if}}
35
+ {{#if (includes microservices "rabbitmq")}}urls: [env.RABBITMQ_URL ?? "amqp://127.0.0.1:5672"], queue: "ping", queueOptions: { durable: false },{{/if}}
36
+ {{#if (includes microservices "kafka")}}client: { brokers: [env.KAFKA_BROKER ?? "127.0.0.1:9092"] },{{/if}}
37
+ {{#if (includes microservices "grpc")}}url: env.GRPC_URL ?? "0.0.0.0:5000", package: "app", protoPath: "proto/app.proto",{{/if}}
38
+ {{#unless (or (includes microservices "redis") (includes microservices "mqtt") (includes microservices "nats") (includes microservices "rabbitmq") (includes microservices "kafka") (includes microservices "grpc"))}}
29
39
  host: "0.0.0.0",
30
- port: env.MICROSERVICE_PORT ?? 3001,
40
+ port: env.MICROSERVICE_PORT,
41
+ {{/unless}}
31
42
  },
32
43
  });
33
44
 
@@ -0,0 +1,64 @@
1
+ import { type INestApplication } from "@nestjs/common";
2
+ import {
3
+ ClientProxyFactory,
4
+ {{#if (includes microservices "grpc")}}type ClientGrpc,{{else if (includes microservices "kafka")}}type ClientKafka,{{else}}type ClientProxy,{{/if}}
5
+ type MicroserviceOptions,
6
+ Transport,
7
+ } from "@nestjs/microservices";
8
+ import { Test } from "@nestjs/testing";
9
+ import { setTimeout as delay } from "node:timers/promises";
10
+ import { firstValueFrom, type Observable } from "rxjs";
11
+ import { afterAll, expect, it } from "vitest";
12
+
13
+ import { AppModule } from "../src/app.module.js";
14
+ import { env } from "../src/config/env.js";
15
+
16
+ const transport = {{#if (includes microservices "redis")}}Transport.REDIS{{else if (includes microservices "mqtt")}}Transport.MQTT{{else if (includes microservices "nats")}}Transport.NATS{{else if (includes microservices "rabbitmq")}}Transport.RMQ{{else if (includes microservices "kafka")}}Transport.KAFKA{{else if (includes microservices "grpc")}}Transport.GRPC{{else}}Transport.TCP{{/if}};
17
+
18
+ const options = {
19
+ {{#if (includes microservices "redis")}}host: new URL(env.REDIS_URL).hostname, port: Number(new URL(env.REDIS_URL).port || 6379),{{/if}}
20
+ {{#if (includes microservices "mqtt")}}url: env.MQTT_URL,{{/if}}
21
+ {{#if (includes microservices "nats")}}servers: [env.NATS_URL],{{/if}}
22
+ {{#if (includes microservices "rabbitmq")}}urls: [env.RABBITMQ_URL], queue: "ping", queueOptions: { durable: false },{{/if}}
23
+ {{#if (includes microservices "kafka")}}client: { brokers: [env.KAFKA_BROKER] }, consumer: { groupId: "ping-consumer" },{{/if}}
24
+ {{#if (includes microservices "grpc")}}url: env.GRPC_URL, package: "app", protoPath: "proto/app.proto",{{/if}}
25
+ };
26
+
27
+ let app: INestApplication;
28
+ let client{{#if (includes microservices "grpc")}}: ClientGrpc = ClientProxyFactory.create({ transport, options } as MicroserviceOptions) as unknown as ClientGrpc;{{else if (includes microservices "kafka")}}: ClientKafka = ClientProxyFactory.create({ transport, options } as MicroserviceOptions) as ClientKafka;{{else}}: ClientProxy = ClientProxyFactory.create({ transport, options } as MicroserviceOptions);{{/if}}
29
+
30
+ it("sends ping through the selected message transport", async () => {
31
+ const module = await Test.createTestingModule({ imports: [AppModule] }).compile();
32
+ app = module.createNestApplication();
33
+ app.connectMicroservice<MicroserviceOptions>({ transport, options } as MicroserviceOptions);
34
+ await app.startAllMicroservices();
35
+ await app.init();
36
+ {{#if (includes microservices "kafka")}}
37
+ client.subscribeToResponseOf("ping");
38
+ {{/if}}
39
+ {{#unless (includes microservices "grpc")}}
40
+ {{#if (includes microservices "kafka")}}
41
+ try {
42
+ await client.connect();
43
+ } catch {
44
+ await delay(1_000);
45
+ await client.connect();
46
+ }
47
+ {{else}}
48
+ await client.connect();
49
+ {{/if}}
50
+ {{/unless}}
51
+ {{#if (includes microservices "grpc")}}
52
+ const service = client.getService<{
53
+ ping: (request: Record<string, never>) => Observable<{ message: string }>;
54
+ }>("AppService");
55
+ await expect(firstValueFrom(service.ping({}))).resolves.toEqual({ message: "pong" });
56
+ {{else}}
57
+ await expect(firstValueFrom(client.send<string, Record<string, never>>("ping", {}))).resolves.toBe("pong");
58
+ {{/if}}
59
+ }, 20_000);
60
+
61
+ afterAll(async () => {
62
+ await app?.close();
63
+ client.close();
64
+ });
@@ -1,6 +1,6 @@
1
1
  import "dotenv/config";
2
2
  import { createEnv } from "@t3-oss/env-core";
3
- import * as z from "zod";
3
+ import { z } from "zod";
4
4
 
5
5
  export const env = createEnv({
6
6
  /**
@@ -31,8 +31,27 @@ export const env = createEnv({
31
31
  .default("development"),
32
32
  PORT: z
33
33
  .string()
34
- .transform((val) => Number.parseInt(val, 10))
34
+ .transform(Number)
35
35
  .default(3000),
36
+ {{#if (includes microservices "redis")}}
37
+ REDIS_URL: z.url().default("redis://127.0.0.1:6379"),
38
+ {{/if}}
39
+ {{#if (includes microservices "mqtt")}}
40
+ MQTT_URL: z.url().default("mqtt://127.0.0.1:1883"),
41
+ {{/if}}
42
+ {{#if (includes microservices "nats")}}
43
+ NATS_URL: z.url().default("nats://127.0.0.1:4222"),
44
+ {{/if}}
45
+ {{#if (includes microservices "rabbitmq")}}
46
+ RABBITMQ_URL: z.url().default("amqp://127.0.0.1:5672"),
47
+ {{/if}}
48
+ {{#if (includes microservices "kafka")}}
49
+ KAFKA_BROKER: z.string().default("127.0.0.1:9092"),
50
+ {{/if}}
51
+ {{#if (includes microservices "grpc")}}
52
+ GRPC_URL: z.string().default("0.0.0.0:5000"),
53
+ {{/if}}
54
+ MICROSERVICE_PORT: z.string().transform(Number).default(3001),
36
55
  {{#if hasPostgres}}
37
56
  POSTGRES_URL: z.url(),
38
57
  {{/if}}
@@ -51,10 +70,15 @@ export const env = createEnv({
51
70
  .transform((val) => val === "true")
52
71
  .default(true),
53
72
  {{/if}}
54
- {{#if (and (eq auth "passport") hasDatabase)}}
73
+ {{#if (eq auth "passport")}}
55
74
  JWT_ACCESS_SECRET: z.string().min(32),
75
+ JWT_ISSUER: z.string().default("{{projectName}}"),
76
+ JWT_AUDIENCE: z.string().default("{{projectName}}-api"),
77
+ JWT_KEY_ID: z.string().default("primary"),
78
+ {{#if hasDatabase}}
56
79
  JWT_REFRESH_SECRET: z.string().min(32),
57
80
  {{/if}}
81
+ {{/if}}
58
82
  {{#if (or (eq auth "better-auth") (eq auth "better-auth:stateless"))}}
59
83
  BETTER_AUTH_SECRET: z.string().min(32),
60
84
  BETTER_AUTH_URL: z.url(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-arch/tui",
3
- "version": "0.2.7",
3
+ "version": "0.4.0",
4
4
  "private": false,
5
5
  "description": "Interactive terminal UI for generating NestJS projects",
6
6
  "keywords": [
@@ -40,17 +40,20 @@
40
40
  "ink-text-input": "^6.0.0",
41
41
  "open": "^11.0.0",
42
42
  "react": "^18.3.1",
43
+ "semver": "^7.8.5",
43
44
  "ts-morph": "^25.0.0",
44
45
  "zod": "^4.1.13"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@types/react": "^18.3.12",
49
+ "@types/semver": "^7.8.0",
50
+ "ink-testing-library": "^4.0.0",
48
51
  "pkgroll": "^2.5.2",
49
52
  "tsx": "^4.19.2",
50
53
  "vitest": "^4.1.7",
51
- "@nest-arch/core": "0.2.7",
52
- "@nest-arch/shared": "0.0.0",
53
- "@nest-arch/env": "0.0.0"
54
+ "@nest-arch/core": "0.4.0",
55
+ "@nest-arch/env": "0.0.0",
56
+ "@nest-arch/shared": "0.0.0"
54
57
  },
55
58
  "peerDependencies": {
56
59
  "typescript": "^5"
@@ -1 +0,0 @@
1
- const O="Nest Arch",A="v0.2.7",t="Build production-ready NestJS projects.",o="#e54545",R="#A0A0A0",c="#6B6B6B",s="#E5E5E5",C="#61AFEF",E="#3A3A3A",n="#7FD99A",_="#E8C468",L="#e96142ff";export{O as APP_NAME,t as APP_TAGLINE,A as APP_VERSION,C as COLOR_ACCENT,R as COLOR_DIM,c as COLOR_DIMMER,E as COLOR_DIVIDER,s as COLOR_FG,o as COLOR_RED,n as COLOR_SUCCESS,_ as COLOR_WARM,L as COLOR_WARM_SECONDARY};