@trinacria/cli 0.1.1-alpha.1

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.

Potentially problematic release.


This version of @trinacria/cli might be problematic. Click here for more details.

Files changed (129) hide show
  1. package/README.md +109 -0
  2. package/README.npm.md +109 -0
  3. package/dist/cli.d.ts +19 -0
  4. package/dist/cli.js +88 -0
  5. package/dist/commands/build.d.ts +2 -0
  6. package/dist/commands/build.js +102 -0
  7. package/dist/commands/dev.d.ts +28 -0
  8. package/dist/commands/dev.js +186 -0
  9. package/dist/commands/new.d.ts +41 -0
  10. package/dist/commands/new.js +280 -0
  11. package/dist/commands/start.d.ts +13 -0
  12. package/dist/commands/start.js +110 -0
  13. package/dist/config/config.contract.d.ts +9 -0
  14. package/dist/config/config.contract.js +2 -0
  15. package/dist/config/default-config.d.ts +2 -0
  16. package/dist/config/default-config.js +11 -0
  17. package/dist/config/load-config.d.ts +2 -0
  18. package/dist/config/load-config.js +113 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +5 -0
  21. package/dist/templates/api-events-rabbitmq/.env.example +23 -0
  22. package/dist/templates/api-events-rabbitmq/Dockerfile +18 -0
  23. package/dist/templates/api-events-rabbitmq/README.md +97 -0
  24. package/dist/templates/api-events-rabbitmq/docker-compose.yml +30 -0
  25. package/dist/templates/api-events-rabbitmq/package.json +21 -0
  26. package/dist/templates/api-events-rabbitmq/src/global/config.service.ts +95 -0
  27. package/dist/templates/api-events-rabbitmq/src/global/controllers/swagger/docs.html +28 -0
  28. package/dist/templates/api-events-rabbitmq/src/global/controllers/swagger/swagger-docs.controller.ts +79 -0
  29. package/dist/templates/api-events-rabbitmq/src/global/rabbitmq.service.ts +86 -0
  30. package/dist/templates/api-events-rabbitmq/src/global/register-global-controllers.ts +20 -0
  31. package/dist/templates/api-events-rabbitmq/src/main.ts +89 -0
  32. package/dist/templates/api-events-rabbitmq/src/modules/events/dto/event.dto.ts +24 -0
  33. package/dist/templates/api-events-rabbitmq/src/modules/events/dto/index.ts +2 -0
  34. package/dist/templates/api-events-rabbitmq/src/modules/events/dto/publish-event.dto.ts +12 -0
  35. package/dist/templates/api-events-rabbitmq/src/modules/events/events.controller.ts +76 -0
  36. package/dist/templates/api-events-rabbitmq/src/modules/events/events.module.ts +27 -0
  37. package/dist/templates/api-events-rabbitmq/src/modules/events/events.provider.ts +28 -0
  38. package/dist/templates/api-events-rabbitmq/src/modules/events/events.service.ts +19 -0
  39. package/dist/templates/api-events-rabbitmq/src/modules/events/events.store.ts +42 -0
  40. package/dist/templates/api-events-rabbitmq/src/modules/events/events.tokens.ts +11 -0
  41. package/dist/templates/api-events-rabbitmq/trinacria.config.mjs +12 -0
  42. package/dist/templates/api-events-rabbitmq/tsconfig.json +14 -0
  43. package/dist/templates/api-events-redis/.env.example +18 -0
  44. package/dist/templates/api-events-redis/Dockerfile +18 -0
  45. package/dist/templates/api-events-redis/README.md +97 -0
  46. package/dist/templates/api-events-redis/docker-compose.yml +33 -0
  47. package/dist/templates/api-events-redis/package.json +18 -0
  48. package/dist/templates/api-events-redis/src/global/config.service.ts +93 -0
  49. package/dist/templates/api-events-redis/src/global/controllers/swagger/docs.html +28 -0
  50. package/dist/templates/api-events-redis/src/global/controllers/swagger/swagger-docs.controller.ts +79 -0
  51. package/dist/templates/api-events-redis/src/global/redis.service.ts +50 -0
  52. package/dist/templates/api-events-redis/src/global/register-global-controllers.ts +20 -0
  53. package/dist/templates/api-events-redis/src/main.ts +88 -0
  54. package/dist/templates/api-events-redis/src/modules/events/dto/event.dto.ts +24 -0
  55. package/dist/templates/api-events-redis/src/modules/events/dto/index.ts +2 -0
  56. package/dist/templates/api-events-redis/src/modules/events/dto/publish-event.dto.ts +12 -0
  57. package/dist/templates/api-events-redis/src/modules/events/events.controller.ts +76 -0
  58. package/dist/templates/api-events-redis/src/modules/events/events.module.ts +27 -0
  59. package/dist/templates/api-events-redis/src/modules/events/events.provider.ts +28 -0
  60. package/dist/templates/api-events-redis/src/modules/events/events.service.ts +19 -0
  61. package/dist/templates/api-events-redis/src/modules/events/events.store.ts +42 -0
  62. package/dist/templates/api-events-redis/src/modules/events/events.tokens.ts +11 -0
  63. package/dist/templates/api-events-redis/trinacria.config.mjs +12 -0
  64. package/dist/templates/api-events-redis/tsconfig.json +14 -0
  65. package/dist/templates/api-mongoose-mongodb/.env.example +17 -0
  66. package/dist/templates/api-mongoose-mongodb/Dockerfile +18 -0
  67. package/dist/templates/api-mongoose-mongodb/README.md +98 -0
  68. package/dist/templates/api-mongoose-mongodb/docker-compose.yml +34 -0
  69. package/dist/templates/api-mongoose-mongodb/package.json +17 -0
  70. package/dist/templates/api-mongoose-mongodb/src/global/config.service.ts +92 -0
  71. package/dist/templates/api-mongoose-mongodb/src/global/controllers/swagger/docs.html +28 -0
  72. package/dist/templates/api-mongoose-mongodb/src/global/controllers/swagger/swagger-docs.controller.ts +79 -0
  73. package/dist/templates/api-mongoose-mongodb/src/global/mongoose-schema.provider.ts +18 -0
  74. package/dist/templates/api-mongoose-mongodb/src/global/mongoose.service.ts +36 -0
  75. package/dist/templates/api-mongoose-mongodb/src/global/register-global-controllers.ts +20 -0
  76. package/dist/templates/api-mongoose-mongodb/src/main.ts +70 -0
  77. package/dist/templates/api-mongoose-mongodb/src/modules/users/dto/create-user.dto.ts +14 -0
  78. package/dist/templates/api-mongoose-mongodb/src/modules/users/dto/index.ts +2 -0
  79. package/dist/templates/api-mongoose-mongodb/src/modules/users/dto/public-user.dto.ts +22 -0
  80. package/dist/templates/api-mongoose-mongodb/src/modules/users/users.controller.ts +89 -0
  81. package/dist/templates/api-mongoose-mongodb/src/modules/users/users.module.ts +17 -0
  82. package/dist/templates/api-mongoose-mongodb/src/modules/users/users.schema.ts +35 -0
  83. package/dist/templates/api-mongoose-mongodb/src/modules/users/users.service.ts +35 -0
  84. package/dist/templates/api-mongoose-mongodb/src/modules/users/users.tokens.ts +9 -0
  85. package/dist/templates/api-mongoose-mongodb/trinacria.config.mjs +12 -0
  86. package/dist/templates/api-mongoose-mongodb/tsconfig.json +14 -0
  87. package/dist/templates/api-prisma-postgresql/.env.example +19 -0
  88. package/dist/templates/api-prisma-postgresql/Dockerfile +24 -0
  89. package/dist/templates/api-prisma-postgresql/README.md +107 -0
  90. package/dist/templates/api-prisma-postgresql/docker-compose.yml +38 -0
  91. package/dist/templates/api-prisma-postgresql/package.json +26 -0
  92. package/dist/templates/api-prisma-postgresql/prisma/schema.prisma +15 -0
  93. package/dist/templates/api-prisma-postgresql/prisma.config.ts +9 -0
  94. package/dist/templates/api-prisma-postgresql/src/global/config.service.ts +92 -0
  95. package/dist/templates/api-prisma-postgresql/src/global/controllers/swagger/docs.html +28 -0
  96. package/dist/templates/api-prisma-postgresql/src/global/controllers/swagger/swagger-docs.controller.ts +79 -0
  97. package/dist/templates/api-prisma-postgresql/src/global/prisma.service.ts +20 -0
  98. package/dist/templates/api-prisma-postgresql/src/global/register-global-controllers.ts +20 -0
  99. package/dist/templates/api-prisma-postgresql/src/main.ts +70 -0
  100. package/dist/templates/api-prisma-postgresql/src/modules/users/dto/create-user.dto.ts +14 -0
  101. package/dist/templates/api-prisma-postgresql/src/modules/users/dto/index.ts +2 -0
  102. package/dist/templates/api-prisma-postgresql/src/modules/users/dto/public-user.dto.ts +22 -0
  103. package/dist/templates/api-prisma-postgresql/src/modules/users/users.controller.ts +89 -0
  104. package/dist/templates/api-prisma-postgresql/src/modules/users/users.module.ts +15 -0
  105. package/dist/templates/api-prisma-postgresql/src/modules/users/users.service.ts +36 -0
  106. package/dist/templates/api-prisma-postgresql/src/modules/users/users.tokens.ts +7 -0
  107. package/dist/templates/api-prisma-postgresql/trinacria.config.mjs +12 -0
  108. package/dist/templates/api-prisma-postgresql/tsconfig.json +14 -0
  109. package/dist/templates/app-starter/.env.example +1 -0
  110. package/dist/templates/app-starter/Dockerfile +13 -0
  111. package/dist/templates/app-starter/README.md +32 -0
  112. package/dist/templates/app-starter/docker-compose.yml +8 -0
  113. package/dist/templates/app-starter/package.json +14 -0
  114. package/dist/templates/app-starter/src/main.ts +14 -0
  115. package/dist/templates/app-starter/trinacria.config.mjs +12 -0
  116. package/dist/templates/app-starter/tsconfig.json +14 -0
  117. package/dist/templates/cron-example/.env.example +11 -0
  118. package/dist/templates/cron-example/Dockerfile +13 -0
  119. package/dist/templates/cron-example/README.md +68 -0
  120. package/dist/templates/cron-example/docker-compose.yml +11 -0
  121. package/dist/templates/cron-example/package.json +15 -0
  122. package/dist/templates/cron-example/src/config.service.ts +46 -0
  123. package/dist/templates/cron-example/src/main.ts +41 -0
  124. package/dist/templates/cron-example/src/modules/cron/cron.module.ts +15 -0
  125. package/dist/templates/cron-example/src/modules/cron/cron.tokens.ts +6 -0
  126. package/dist/templates/cron-example/src/modules/cron/example-cron-jobs.provider.ts +48 -0
  127. package/dist/templates/cron-example/trinacria.config.mjs +12 -0
  128. package/dist/templates/cron-example/tsconfig.json +14 -0
  129. package/package.json +32 -0
@@ -0,0 +1,68 @@
1
+ # Cron Example App
2
+
3
+ App minimale di esempio per usare `@trinacria/cron`.
4
+
5
+ Mostra:
6
+
7
+ - job a intervallo (`interval`)
8
+ - job con espressione cron (`cron`)
9
+ - protezione overlap con `allowConcurrent: false`
10
+ - hook `onError` e `onEvent` del plugin
11
+
12
+ ## Requisiti
13
+
14
+ - build dei package framework:
15
+
16
+ ```bash
17
+ npm run build:packages
18
+ ```
19
+
20
+ ## Setup
21
+
22
+ ```bash
23
+ cp apps/cron-example/.env.example apps/cron-example/.env.development
24
+ ```
25
+
26
+ ## Avvio
27
+
28
+ ```bash
29
+ npm run dev -w cron-example
30
+ ```
31
+
32
+ Oppure dalla root:
33
+
34
+ ```bash
35
+ npm run dev:cron-example
36
+ ```
37
+
38
+ ## Docker quick start
39
+
40
+ 1. Crea il file `.env` da template:
41
+
42
+ ```bash
43
+ cp apps/cron-example/.env.example apps/cron-example/.env
44
+ ```
45
+
46
+ 2. Avvia il container:
47
+
48
+ ```bash
49
+ docker compose \
50
+ --env-file apps/cron-example/.env \
51
+ -f apps/cron-example/docker-compose.yml \
52
+ up --build -d
53
+ ```
54
+
55
+ 3. Ferma il container:
56
+
57
+ ```bash
58
+ docker compose \
59
+ --env-file apps/cron-example/.env \
60
+ -f apps/cron-example/docker-compose.yml \
61
+ down
62
+ ```
63
+
64
+ ## Job inclusi
65
+
66
+ - `cron-example:heartbeat` ogni `HEARTBEAT_INTERVAL_MS` (default `10000`)
67
+ - `cron-example:minute-tick` ogni minuto (`* * * * *`)
68
+ - `cron-example:overlap-guard-demo` ogni 5 secondi ma con lavoro da 8 secondi per mostrare skip overlap
@@ -0,0 +1,11 @@
1
+ services:
2
+ app:
3
+ build:
4
+ context: ../..
5
+ dockerfile: apps/cron-example/Dockerfile
6
+ environment:
7
+ ENV: production
8
+ CRON_ENABLED: ${DOCKER_CRON_ENABLED}
9
+ CRON_TICK_MS: ${DOCKER_CRON_TICK_MS}
10
+ HEARTBEAT_INTERVAL_MS: ${DOCKER_HEARTBEAT_INTERVAL_MS}
11
+ restart: unless-stopped
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "cron-example",
3
+ "private": true,
4
+ "type": "commonjs",
5
+ "scripts": {
6
+ "start": "node ../../packages/cli/dist/index.js start",
7
+ "build": "node ../../packages/cli/dist/index.js build",
8
+ "dev": "node ../../packages/cli/dist/index.js dev"
9
+ },
10
+ "dependencies": {
11
+ "@trinacria/cli": "*",
12
+ "@trinacria/core": "*",
13
+ "@trinacria/cron": "*"
14
+ }
15
+ }
@@ -0,0 +1,46 @@
1
+ import { createToken } from "@trinacria/core";
2
+
3
+ export interface AppConfig {
4
+ readonly CRON_ENABLED: boolean;
5
+ readonly CRON_TICK_MS: number;
6
+ readonly HEARTBEAT_INTERVAL_MS: number;
7
+ }
8
+
9
+ export const CONFIG_SERVICE = createToken<ConfigService>(
10
+ "CRON_EXAMPLE_CONFIG_SERVICE",
11
+ );
12
+
13
+ function parseBoolean(value: string | undefined, fallback: boolean): boolean {
14
+ if (value == null || value.trim() === "") {
15
+ return fallback;
16
+ }
17
+
18
+ const normalized = value.trim().toLowerCase();
19
+ return normalized === "1" || normalized === "true" || normalized === "yes";
20
+ }
21
+
22
+ function parseNumber(value: string | undefined, fallback: number): number {
23
+ if (value == null || value.trim() === "") {
24
+ return fallback;
25
+ }
26
+
27
+ const parsed = Number(value);
28
+ if (!Number.isFinite(parsed)) {
29
+ return fallback;
30
+ }
31
+
32
+ return parsed;
33
+ }
34
+
35
+ export class ConfigService {
36
+ getAll(): AppConfig {
37
+ return {
38
+ CRON_ENABLED: parseBoolean(process.env.CRON_ENABLED, true),
39
+ CRON_TICK_MS: parseNumber(process.env.CRON_TICK_MS, 1_000),
40
+ HEARTBEAT_INTERVAL_MS: parseNumber(
41
+ process.env.HEARTBEAT_INTERVAL_MS,
42
+ 10_000,
43
+ ),
44
+ };
45
+ }
46
+ }
@@ -0,0 +1,41 @@
1
+ import { ConsoleLogger, TrinacriaApp, valueProvider } from "@trinacria/core";
2
+ import { createCronPlugin } from "@trinacria/cron";
3
+ import { CONFIG_SERVICE, ConfigService } from "./config.service";
4
+ import { CronModule } from "./modules/cron/cron.module";
5
+
6
+ async function bootstrap() {
7
+ const app = new TrinacriaApp();
8
+ const configService = new ConfigService();
9
+ const config = configService.getAll();
10
+ const logger = new ConsoleLogger("cron-example");
11
+
12
+ app.registerGlobalProvider(valueProvider(CONFIG_SERVICE, configService));
13
+
14
+ if (config.CRON_ENABLED) {
15
+ app.use(
16
+ createCronPlugin({
17
+ cronTickMs: config.CRON_TICK_MS,
18
+ onError: (error, job) => {
19
+ logger.error(`Cron job error: ${job.name}`, error);
20
+ },
21
+ onEvent: (event) => {
22
+ logger.info(
23
+ `Cron event job=${event.jobName} status=${event.status} attempts=${event.attempts} durationMs=${event.durationMs}`,
24
+ );
25
+ },
26
+ }),
27
+ );
28
+
29
+ await app.registerModule(CronModule);
30
+ logger.info("Cron plugin enabled");
31
+ } else {
32
+ logger.warn("Cron disabled (CRON_ENABLED=false)");
33
+ }
34
+
35
+ await app.start();
36
+ }
37
+
38
+ bootstrap().catch((error) => {
39
+ console.error(error);
40
+ process.exit(1);
41
+ });
@@ -0,0 +1,15 @@
1
+ import { defineModule } from "@trinacria/core";
2
+ import { cronProvider } from "@trinacria/cron";
3
+ import { CONFIG_SERVICE } from "../../config.service";
4
+ import { ExampleCronJobsProvider } from "./example-cron-jobs.provider";
5
+ import { CRON_EXAMPLE_JOBS_PROVIDER } from "./cron.tokens";
6
+
7
+ export const CronModule = defineModule({
8
+ name: "CronModule",
9
+ providers: [
10
+ cronProvider(CRON_EXAMPLE_JOBS_PROVIDER, ExampleCronJobsProvider, [
11
+ CONFIG_SERVICE,
12
+ ]),
13
+ ],
14
+ exports: [CRON_EXAMPLE_JOBS_PROVIDER],
15
+ });
@@ -0,0 +1,6 @@
1
+ import { createToken } from "@trinacria/core";
2
+ import type { CronJobProvider } from "@trinacria/cron";
3
+
4
+ export const CRON_EXAMPLE_JOBS_PROVIDER = createToken<CronJobProvider>(
5
+ "CRON_EXAMPLE_JOBS_PROVIDER",
6
+ );
@@ -0,0 +1,48 @@
1
+ import { ConsoleLogger } from "@trinacria/core";
2
+ import type { CronJobDefinition, CronJobProvider } from "@trinacria/cron";
3
+ import { ConfigService } from "../../config.service";
4
+
5
+ function wait(ms: number): Promise<void> {
6
+ return new Promise((resolve) => setTimeout(resolve, ms));
7
+ }
8
+
9
+ export class ExampleCronJobsProvider implements CronJobProvider {
10
+ private readonly logger = new ConsoleLogger("cron-example:jobs");
11
+
12
+ constructor(private readonly config: ConfigService) {}
13
+
14
+ jobs(): readonly CronJobDefinition[] {
15
+ const { HEARTBEAT_INTERVAL_MS } = this.config.getAll();
16
+
17
+ return [
18
+ {
19
+ name: "cron-example:heartbeat",
20
+ schedule: { type: "interval", everyMs: HEARTBEAT_INTERVAL_MS },
21
+ runOnInit: true,
22
+ run: ({ scheduledAt }) => {
23
+ this.logger.info(
24
+ `[heartbeat] scheduledAt=${scheduledAt.toISOString()} intervalMs=${HEARTBEAT_INTERVAL_MS}`,
25
+ );
26
+ },
27
+ },
28
+ {
29
+ name: "cron-example:minute-tick",
30
+ schedule: { type: "cron", expression: "* * * * *" },
31
+ run: ({ scheduledAt }) => {
32
+ this.logger.info(
33
+ `[minute-tick] scheduledAt=${scheduledAt.toISOString()}`,
34
+ );
35
+ },
36
+ },
37
+ {
38
+ name: "cron-example:overlap-guard-demo",
39
+ schedule: { type: "interval", everyMs: 5_000 },
40
+ allowConcurrent: false,
41
+ run: async () => {
42
+ await wait(8_000);
43
+ this.logger.info("[overlap-guard-demo] completed");
44
+ },
45
+ },
46
+ ];
47
+ }
48
+ }
@@ -0,0 +1,12 @@
1
+ /** @type {import('@trinacria/cli').TrinacriaConfig} */
2
+
3
+ const config = {
4
+ entry: "src/main.ts",
5
+ outDir: "dist",
6
+ watchDir: "src",
7
+ env: "development",
8
+ crashLoopWindowMs: 15_000,
9
+ maxConsecutiveCrashRestarts: 3,
10
+ };
11
+
12
+ export default config;
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "types": ["node"],
4
+ "target": "ES2022",
5
+ "module": "CommonJS",
6
+ "strict": true,
7
+ "declaration": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true,
10
+ "rootDir": "src",
11
+ "outDir": "dist"
12
+ },
13
+ "include": ["src"]
14
+ }
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@trinacria/cli",
3
+ "version": "0.1.1-alpha.1",
4
+ "private": false,
5
+ "license": "MIT",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "trinacria": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc && node scripts/copy-templates.mjs && chmod +x dist/index.js",
12
+ "test": "tsx --test test/**/*.test.ts",
13
+ "test:coverage": "tsx --test --experimental-test-coverage --test-coverage-include=src/**/*.ts test/**/*.test.ts"
14
+ },
15
+ "dependencies": {
16
+ "chokidar": "^5.0.0",
17
+ "tsx": "^4.21.0",
18
+ "typescript": "^5.9.3"
19
+ },
20
+ "peerDependencies": {
21
+ "@trinacria/core": "*"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/tascaenzo/trinacria.git",
26
+ "directory": "packages/cli"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md"
31
+ ]
32
+ }