@nexusts/cli 0.7.4 → 0.7.5

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.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `nx make:repository <Name>` — generate a repository class.
3
+ */
4
+ import type { Command } from "../core/index.js";
5
+ export declare const makeRepositoryCommand: Command;
6
+ export default makeRepositoryCommand;
@@ -34,6 +34,7 @@ export declare function preloadService(env: Record<string, unknown>, app: {
34
34
  resolve: (t: unknown) => unknown;
35
35
  };
36
36
  }, name: string, path: string, className: string): Promise<void>;
37
+ export declare function describeToken(token: unknown): string;
37
38
  export declare function listServices(container: unknown): string[];
38
39
  export declare function isIncomplete(code: string): boolean;
39
40
  export declare function formatResult(r: unknown): string;
@@ -41,3 +41,15 @@ export interface CommandContext {
41
41
  positional: string[];
42
42
  flags: Record<string, string | boolean | string[]>;
43
43
  }
44
+ /**
45
+ * Context passed to seed file default exports.
46
+ *
47
+ * import type { SeedContext } from "@nexusts/cli";
48
+ * export default async function seed(ctx: SeedContext) { ... }
49
+ */
50
+ export interface SeedContext {
51
+ db: import("@nexusts/drizzle").DrizzleService;
52
+ logger: import("@nexusts/logger").Logger;
53
+ dialect: string;
54
+ truncate: (table: any) => Promise<void>;
55
+ }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  /**
3
- * `nx` — the Nexus CLI entry point.
3
+ * `nx` — the NexusTS CLI entry point.
4
4
  *
5
5
  * Invocation:
6
6
  * bunx nx <command> [args...]
package/dist/index.js CHANGED
@@ -518,7 +518,7 @@ var infoCommand = {
518
518
  summary: "Show project configuration",
519
519
  description: "Prints the resolved nx.config.ts plus relevant env vars.",
520
520
  async run(ctx) {
521
- logger.heading("Nexus CLI \u2014 Project Info");
521
+ logger.heading("NexusTS CLI \u2014 Project Info");
522
522
  logger.info(colors.bold("Resolved configuration"));
523
523
  logger.blank();
524
524
  logger.table([
@@ -978,7 +978,7 @@ export class {{ name }}Module {}
978
978
 
979
979
  // packages/cli/src/templates/project/nx.config.ts
980
980
  var nx_config_default = `/**
981
- * Nexus project configuration.
981
+ * NexusTS project configuration.
982
982
  * Run \`nx info\` to see the resolved values.
983
983
  */
984
984
 
@@ -1471,7 +1471,7 @@ export class HomeController {
1471
1471
  case "README.md":
1472
1472
  return `# ${ctx.targetName}
1473
1473
 
1474
- A Nexus project.
1474
+ A NexusTS project.
1475
1475
 
1476
1476
  ## Run
1477
1477
 
@@ -1841,7 +1841,7 @@ var DIALECT_SPECS = {
1841
1841
  idOpts: "{ autoIncrement: true }",
1842
1842
  tsTimestamp: "text",
1843
1843
  tsDateMode: "",
1844
- defaultTs: `.default("(datetime('now'))")`,
1844
+ defaultTs: ".$defaultFn(() => new Date().toISOString())",
1845
1845
  defaultTsUpdate: ""
1846
1846
  },
1847
1847
  sqlite: {
@@ -2714,8 +2714,44 @@ var makeQueueCommand = {
2714
2714
  };
2715
2715
  var make_queue_default = makeQueueCommand;
2716
2716
 
2717
+ // packages/cli/src/commands/make-repository.ts
2718
+ import { mkdirSync as mkdirSync4 } from "fs";
2719
+ import { resolve as resolve15, dirname as dirname4 } from "path";
2720
+ var makeRepositoryCommand = {
2721
+ name: "make:repository",
2722
+ aliases: ["mr", "make-repository", "make:repo"],
2723
+ summary: "Generate a repository class",
2724
+ description: "Generates a DrizzleRepository class under app/repositories/. Requires a model file at app/models/<name>.model.ts.",
2725
+ examples: [
2726
+ "nx make:repository User",
2727
+ "nx make:repository Post"
2728
+ ],
2729
+ async run(ctx) {
2730
+ const name = ctx.positional[0];
2731
+ if (!name) {
2732
+ logger.error("Usage: nx make:repository <Name>");
2733
+ return 1;
2734
+ }
2735
+ const variants = nameVariants(name);
2736
+ const repository = `${variants.pascal}Repository`;
2737
+ const code = render(templates.repository, {
2738
+ name: variants.pascal,
2739
+ camel: variants.camel,
2740
+ kebab: variants.kebab,
2741
+ snake: variants.snake,
2742
+ repository
2743
+ });
2744
+ const out = resolve15(ctx.cwd, `${ctx.config.paths.app}/repositories`, `${variants.kebab}.repository.ts`);
2745
+ mkdirSync4(dirname4(out), { recursive: true });
2746
+ writeFile(out, code);
2747
+ logger.success(`created ${out}`);
2748
+ return 0;
2749
+ }
2750
+ };
2751
+ var make_repository_default = makeRepositoryCommand;
2752
+
2717
2753
  // packages/cli/src/commands/make-schedule.ts
2718
- import { resolve as resolve15 } from "path";
2754
+ import { resolve as resolve16 } from "path";
2719
2755
  var TASK_TEMPLATE = `
2720
2756
  import { Injectable } from '@nexusts/core';
2721
2757
  import { Cron, Interval, Timeout } from '@nexusts/schedule';
@@ -2759,7 +2795,7 @@ var makeScheduleCommand = {
2759
2795
  name: variants.pascal,
2760
2796
  kebab: variants.kebab
2761
2797
  });
2762
- const out = resolve15(ctx.cwd, "app/schedule/tasks", `${variants.kebab}.task.ts`);
2798
+ const out = resolve16(ctx.cwd, "app/schedule/tasks", `${variants.kebab}.task.ts`);
2763
2799
  if (writeFile(out, code, { skipIfExists: true })) {
2764
2800
  logger.success(`created ${out}`);
2765
2801
  } else {
@@ -2777,7 +2813,7 @@ var makeScheduleCommand = {
2777
2813
  var make_schedule_default = makeScheduleCommand;
2778
2814
 
2779
2815
  // packages/cli/src/commands/make-service.ts
2780
- import { resolve as resolve16 } from "path";
2816
+ import { resolve as resolve17 } from "path";
2781
2817
  var makeServiceCommand = {
2782
2818
  name: "make:service",
2783
2819
  aliases: ["ms", "make-service"],
@@ -2804,11 +2840,12 @@ var makeServiceCommand = {
2804
2840
  name: variants.pascal,
2805
2841
  camel: variants.camel,
2806
2842
  kebab: variants.kebab,
2843
+ snake: variants.snake,
2807
2844
  hasRepo,
2808
2845
  repository,
2809
2846
  repositoryCamel
2810
2847
  });
2811
- const out = resolve16(ctx.cwd, ctx.config.paths.services, `${variants.kebab}.service.ts`);
2848
+ const out = resolve17(ctx.cwd, ctx.config.paths.services, `${variants.kebab}.service.ts`);
2812
2849
  writeFile(out, code);
2813
2850
  logger.success(`created ${out}`);
2814
2851
  return 0;
@@ -2817,7 +2854,7 @@ var makeServiceCommand = {
2817
2854
  var make_service_default = makeServiceCommand;
2818
2855
 
2819
2856
  // packages/cli/src/commands/make-session.ts
2820
- import { resolve as resolve17 } from "path";
2857
+ import { resolve as resolve18 } from "path";
2821
2858
  var SESSION_TEMPLATE = `
2822
2859
  import { Inject, Injectable } from '@nexusts/core';
2823
2860
  import { SessionService } from '@nexusts/session';
@@ -2879,7 +2916,7 @@ var makeSessionCommand = {
2879
2916
  name: variants.pascal,
2880
2917
  kebab: variants.kebab
2881
2918
  });
2882
- const out = resolve17(ctx.cwd, "app/session/services", `${variants.kebab}.session.ts`);
2919
+ const out = resolve18(ctx.cwd, "app/session/services", `${variants.kebab}.session.ts`);
2883
2920
  if (writeFile(out, code, { skipIfExists: true })) {
2884
2921
  logger.success(`created ${out}`);
2885
2922
  } else {
@@ -2897,7 +2934,7 @@ var makeSessionCommand = {
2897
2934
  var make_session_default = makeSessionCommand;
2898
2935
 
2899
2936
  // packages/cli/src/commands/make-validator.ts
2900
- import { resolve as resolve18 } from "path";
2937
+ import { resolve as resolve19 } from "path";
2901
2938
  var makeValidatorCommand = {
2902
2939
  name: "make:validator",
2903
2940
  aliases: ["mv", "make-validator"],
@@ -2914,7 +2951,7 @@ var makeValidatorCommand = {
2914
2951
  const code = render(templates.validator, {
2915
2952
  name: variants.pascal
2916
2953
  });
2917
- const out = resolve18(ctx.cwd, ctx.config.paths.dto, `${variants.kebab}.dto.ts`);
2954
+ const out = resolve19(ctx.cwd, ctx.config.paths.dto, `${variants.kebab}.dto.ts`);
2918
2955
  writeFile(out, code);
2919
2956
  logger.success(`created ${out}`);
2920
2957
  return 0;
@@ -2925,7 +2962,7 @@ var make_validator_default = makeValidatorCommand;
2925
2962
  // packages/cli/src/commands/db-migrate.ts
2926
2963
  import { spawn } from "child_process";
2927
2964
  import { existsSync as existsSync5 } from "fs";
2928
- import { resolve as resolve19 } from "path";
2965
+ import { resolve as resolve20 } from "path";
2929
2966
  var dbMigrateCommand = {
2930
2967
  name: "db:migrate",
2931
2968
  aliases: ["db:m", "migrate"],
@@ -2960,9 +2997,9 @@ var dbMigrateCommand = {
2960
2997
  }
2961
2998
  ],
2962
2999
  async run(ctx) {
2963
- const folder = ctx.flags["folder"] ?? resolve19(ctx.cwd, ctx.config.paths.migrations);
3000
+ const folder = ctx.flags["folder"] ?? resolve20(ctx.cwd, ctx.config.paths.migrations);
2964
3001
  const dialect = ctx.flags["dialect"] ?? ctx.config.dialect ?? "bun-sqlite";
2965
- const configPath = ctx.flags["config"] ?? resolve19(ctx.cwd, "drizzle.config.ts");
3002
+ const configPath = ctx.flags["config"] ?? resolve20(ctx.cwd, "drizzle.config.ts");
2966
3003
  const wantStatus = Boolean(ctx.flags["status"]);
2967
3004
  const generateName = ctx.flags["generate"];
2968
3005
  if (generateName) {
@@ -3023,7 +3060,7 @@ const applied = await svc.appliedMigrations();
3023
3060
  console.log(JSON.stringify({ total: applied.length, applied }, null, 2));
3024
3061
  await svc.close();
3025
3062
  `;
3026
- const tmpFile = resolve19(cwd, ".nx-migrate-status.mjs");
3063
+ const tmpFile = resolve20(cwd, ".nx-migrate-status.mjs");
3027
3064
  await import("fs/promises").then((m) => m.writeFile(tmpFile, script, "utf-8"));
3028
3065
  try {
3029
3066
  const code = await new Promise((resP) => {
@@ -3047,7 +3084,7 @@ function readEnvUrl(dialect) {
3047
3084
  var db_migrate_default = dbMigrateCommand;
3048
3085
 
3049
3086
  // packages/cli/src/commands/db-generate.ts
3050
- import { resolve as resolve20 } from "path";
3087
+ import { resolve as resolve21 } from "path";
3051
3088
  var dbGenerateCommand = {
3052
3089
  name: "db:generate",
3053
3090
  aliases: ["db:g", "db-generate", "generate-migration"],
@@ -3080,7 +3117,7 @@ var dbGenerateCommand = {
3080
3117
  logger.info(`Generating raw SQL migration: ${name} (dialect=${dialect})`);
3081
3118
  return runSqlTemplate(ctx.cwd, name, dialect);
3082
3119
  }
3083
- const configPath = resolve20(ctx.cwd, "drizzle.config.ts");
3120
+ const configPath = resolve21(ctx.cwd, "drizzle.config.ts");
3084
3121
  const args2 = ["generate", "--config", configPath];
3085
3122
  if (name)
3086
3123
  args2.push("--name", name);
@@ -3089,10 +3126,10 @@ var dbGenerateCommand = {
3089
3126
  }
3090
3127
  };
3091
3128
  async function runSqlTemplate(cwd, name, dialect) {
3092
- const { mkdirSync: mkdirSync4, writeFileSync: writeFileSync3 } = await import("fs");
3129
+ const { mkdirSync: mkdirSync5, writeFileSync: writeFileSync3 } = await import("fs");
3093
3130
  const { join } = await import("path");
3094
3131
  const migrationsDir = join(cwd, "app", "database", "migrations");
3095
- mkdirSync4(migrationsDir, { recursive: true });
3132
+ mkdirSync5(migrationsDir, { recursive: true });
3096
3133
  const timestamp = Date.now();
3097
3134
  const filename = `${timestamp}_${name.replace(/[^a-z0-9_]+/g, "_")}.sql`;
3098
3135
  const filepath = join(migrationsDir, filename);
@@ -3116,7 +3153,7 @@ var db_generate_default = dbGenerateCommand;
3116
3153
  import { spawn as spawn2 } from "child_process";
3117
3154
  import { existsSync as existsSync6 } from "fs";
3118
3155
  import { mkdir, readdir, writeFile as writeFile2, unlink } from "fs/promises";
3119
- import { resolve as resolve21 } from "path";
3156
+ import { resolve as resolve22 } from "path";
3120
3157
  var SEED_TEMPLATE = `/**
3121
3158
  * Seed: {name}
3122
3159
  *
@@ -3177,7 +3214,7 @@ var dbSeedCommand = {
3177
3214
  }
3178
3215
  ],
3179
3216
  async run(ctx) {
3180
- const folder = resolve21(ctx.cwd, ctx.flags["folder"] ?? ctx.config.paths?.seeds ?? "db/seeds");
3217
+ const folder = resolve22(ctx.cwd, ctx.flags["folder"] ?? ctx.config.paths?.seeds ?? "db/seeds");
3181
3218
  const dialect = ctx.flags["dialect"] ?? ctx.config.dialect ?? "bun-sqlite";
3182
3219
  const createName = ctx.flags["create"];
3183
3220
  const fileName = ctx.flags["file"];
@@ -3188,7 +3225,7 @@ var dbSeedCommand = {
3188
3225
  if (!existsSync6(folder)) {
3189
3226
  logger.info(`creating empty seeds folder at ${folder}`);
3190
3227
  await mkdir(folder, { recursive: true });
3191
- await writeFile2(resolve21(folder, "_README.ts"), `// Seed files go here. Run with: nx db:seed
3228
+ await writeFile2(resolve22(folder, "_README.ts"), `// Seed files go here. Run with: nx db:seed
3192
3229
  `, "utf-8");
3193
3230
  return 0;
3194
3231
  }
@@ -3212,14 +3249,14 @@ var dbSeedCommand = {
3212
3249
  if (reset) {
3213
3250
  logger.warn("--reset is set: truncating every table in the schema before running seeds.");
3214
3251
  }
3215
- const seedImports = target.map((f, i) => `import seed_${i} from ${JSON.stringify(resolve21(folder, f))};`).join(`
3252
+ const seedImports = target.map((f, i) => `import seed_${i} from ${JSON.stringify(resolve22(folder, f))};`).join(`
3216
3253
  `);
3217
3254
  const seedCalls = target.map((_, i) => ` await seed_${i}({ db, logger, dialect, truncate: (t) => db.truncate(t) });`).join(`
3218
3255
  `);
3219
3256
  const script = `
3220
3257
  import 'reflect-metadata';
3221
- import { DrizzleService } from '${relativeImport(ctx.cwd, "src/drizzle/index.js")}';
3222
- import { logger as frameworkLogger } from '${relativeImport(ctx.cwd, "src/logger/index.js")}';
3258
+ import { DrizzleService } from '@nexusts/drizzle';
3259
+ import { Logger } from '@nexusts/logger';
3223
3260
 
3224
3261
  const url = ${JSON.stringify(url)};
3225
3262
  const dialect = ${JSON.stringify(dialect)};
@@ -3228,7 +3265,8 @@ const reset = ${JSON.stringify(reset)};
3228
3265
  const cfg = { dialect, connection: { url }, schema: dialect === 'postgres' ? 'public' : undefined };
3229
3266
  const db = new DrizzleService(cfg);
3230
3267
  await db.open();
3231
- const logger = frameworkLogger;
3268
+ const logger = new Logger({ level: 'info' });
3269
+ await logger.ready();
3232
3270
 
3233
3271
  if (reset) {
3234
3272
  const tables = await db.allTables();
@@ -3245,7 +3283,7 @@ ${seedCalls}
3245
3283
  await db.close();
3246
3284
  logger.info(\`Seeds complete (\${${target.length}} file(s))\`);
3247
3285
  `;
3248
- const tmpFile = resolve21(ctx.cwd, ".nx-db-seed.mjs");
3286
+ const tmpFile = resolve22(ctx.cwd, ".nx-db-seed.mjs");
3249
3287
  await writeFile2(tmpFile, script, "utf-8");
3250
3288
  try {
3251
3289
  const code = await new Promise((resP) => {
@@ -3287,11 +3325,11 @@ async function createSeedFile(folder, name) {
3287
3325
  await mkdir(folder, { recursive: true });
3288
3326
  let candidate = `${name}.ts`;
3289
3327
  let i = 1;
3290
- while (existsSync6(resolve21(folder, candidate))) {
3328
+ while (existsSync6(resolve22(folder, candidate))) {
3291
3329
  candidate = `${name}_${i}.ts`;
3292
3330
  i++;
3293
3331
  }
3294
- const path = resolve21(folder, candidate);
3332
+ const path = resolve22(folder, candidate);
3295
3333
  const body = SEED_TEMPLATE.replace(/\{name\}/g, name);
3296
3334
  await writeFile2(path, body, "utf-8");
3297
3335
  logger.info(`created ${path}`);
@@ -3301,26 +3339,15 @@ function readEnvUrl2(dialect) {
3301
3339
  const url = process.env["DATABASE_URL"] ?? process.env["NEXUS_DB_URL"] ?? (dialect === "postgres" ? process.env["POSTGRES_URL"] : dialect === "mysql" ? process.env["MYSQL_URL"] : dialect.includes("sqlite") ? process.env["SQLITE_FILENAME"] : null);
3302
3340
  return url ?? null;
3303
3341
  }
3304
- function relativeImport(cwd, target) {
3305
- const abs = resolve21(cwd, target);
3306
- let rel = abs;
3307
- if (rel.startsWith(cwd))
3308
- rel = rel.slice(cwd.length);
3309
- if (rel.startsWith("/"))
3310
- rel = rel.slice(1);
3311
- if (!rel.startsWith("."))
3312
- rel = "./" + rel;
3313
- return rel;
3314
- }
3315
3342
  var db_seed_default = dbSeedCommand;
3316
3343
 
3317
3344
  // packages/cli/src/commands/new.ts
3318
- import { existsSync as existsSync7, mkdirSync as mkdirSync4, writeFileSync as writeFileSync3 } from "fs";
3319
- import { resolve as resolve22 } from "path";
3345
+ import { existsSync as existsSync7, mkdirSync as mkdirSync5, writeFileSync as writeFileSync3 } from "fs";
3346
+ import { resolve as resolve23 } from "path";
3320
3347
  var newCommand = {
3321
3348
  name: "new",
3322
3349
  aliases: ["n"],
3323
- summary: "Create a new Nexus project",
3350
+ summary: "Create a new NexusTS project",
3324
3351
  description: "Generates a new project directory with nx.config.ts, tsconfig, package.json, and a starter app/main.ts.",
3325
3352
  examples: [
3326
3353
  "nx new my-app",
@@ -3351,7 +3378,7 @@ var newCommand = {
3351
3378
  return 1;
3352
3379
  }
3353
3380
  const interactive = !flagBool(ctx.flags, "no-interaction", false);
3354
- const target = resolve22(ctx.cwd, name);
3381
+ const target = resolve23(ctx.cwd, name);
3355
3382
  if (existsSync7(target)) {
3356
3383
  logger.error(`Directory already exists: ${target}`);
3357
3384
  return 1;
@@ -3377,21 +3404,21 @@ var newCommand = {
3377
3404
  default: "react"
3378
3405
  });
3379
3406
  const ssr = !flagBool(ctx.flags, "no-ssr", false);
3380
- mkdirSync4(resolve22(target, "app"), { recursive: true });
3407
+ mkdirSync5(resolve23(target, "app"), { recursive: true });
3381
3408
  if (view !== "none") {
3382
- mkdirSync4(resolve22(target, "resources/views"), { recursive: true });
3409
+ mkdirSync5(resolve23(target, "resources/views"), { recursive: true });
3383
3410
  }
3384
- mkdirSync4(resolve22(target, "public"), { recursive: true });
3385
- writeFileSync3(resolve22(target, "public/.gitkeep"), "");
3411
+ mkdirSync5(resolve23(target, "public"), { recursive: true });
3412
+ writeFileSync3(resolve23(target, "public/.gitkeep"), "");
3386
3413
  if (view !== "none") {
3387
- writeFileSync3(resolve22(target, "resources/views/welcome.html"), `<h1>Welcome to ${name}</h1>
3414
+ writeFileSync3(resolve23(target, "resources/views/welcome.html"), `<h1>Welcome to ${name}</h1>
3388
3415
  <p>This is a sample Rendu template.</p>
3389
3416
  <p>Founded <?= year ?>.</p>
3390
3417
  `);
3391
3418
  }
3392
- writeFileSync3(resolve22(target, ".env"), generateEnvFile());
3393
- writeFileSync3(resolve22(target, ".env.local"), generateEnvLocalFile());
3394
- writeFileSync3(resolve22(target, ".gitignore"), generateGitIgnore());
3419
+ writeFileSync3(resolve23(target, ".env"), generateEnvFile());
3420
+ writeFileSync3(resolve23(target, ".env.local"), generateEnvLocalFile());
3421
+ writeFileSync3(resolve23(target, ".gitignore"), generateGitIgnore());
3395
3422
  const code = render(templates.project["nx.config.ts"], {
3396
3423
  routing,
3397
3424
  view,
@@ -3403,7 +3430,7 @@ var newCommand = {
3403
3430
  inertiaSSR: ssr,
3404
3431
  inertiaVersion: "1.0.0"
3405
3432
  });
3406
- writeFileSync3(resolve22(target, "nx.config.ts"), code);
3433
+ writeFileSync3(resolve23(target, "nx.config.ts"), code);
3407
3434
  const deps = {
3408
3435
  "@nexusts/core": "*",
3409
3436
  "reflect-metadata": "^0.2.2",
@@ -3417,7 +3444,7 @@ var newCommand = {
3417
3444
  if (view !== "none") {
3418
3445
  deps["@nexusts/static"] = "*";
3419
3446
  }
3420
- writeFileSync3(resolve22(target, "package.json"), JSON.stringify({
3447
+ writeFileSync3(resolve23(target, "package.json"), JSON.stringify({
3421
3448
  name,
3422
3449
  version: "0.1.0",
3423
3450
  type: "module",
@@ -3430,7 +3457,7 @@ var newCommand = {
3430
3457
  },
3431
3458
  dependencies: deps
3432
3459
  }, null, 2));
3433
- writeFileSync3(resolve22(target, "tsconfig.json"), `{
3460
+ writeFileSync3(resolve23(target, "tsconfig.json"), `{
3434
3461
  "compilerOptions": {
3435
3462
  "target": "ES2022",
3436
3463
  "module": "ESNext",
@@ -3451,7 +3478,7 @@ const staticMiddleware = StaticModule.mount({ root: './public', prefix: '/static
3451
3478
  ` : "";
3452
3479
  const staticOption = hasView ? `
3453
3480
  middleware: [staticMiddleware],` : "";
3454
- writeFileSync3(resolve22(target, "app/main.ts"), `import 'reflect-metadata';
3481
+ writeFileSync3(resolve23(target, "app/main.ts"), `import 'reflect-metadata';
3455
3482
  import { Application } from '@nexusts/core';
3456
3483
  ${staticImport}import { AppModule } from './app.module.js';
3457
3484
 
@@ -3471,7 +3498,7 @@ console.log('[nexus] Listening on http://localhost:' + (process.env['PORT'] ?? 3
3471
3498
  connection: { filename: 'app.db' },
3472
3499
  logging: true,
3473
3500
  })` : "";
3474
- writeFileSync3(resolve22(target, "app/app.module.ts"), `${ormImport}import { Module } from '@nexusts/core';
3501
+ writeFileSync3(resolve23(target, "app/app.module.ts"), `${ormImport}import { Module } from '@nexusts/core';
3475
3502
  import { HomeController } from './controllers/home.controller.js';
3476
3503
 
3477
3504
  @Module({
@@ -3482,12 +3509,12 @@ ${ormBlock},
3482
3509
  })
3483
3510
  export class AppModule {}
3484
3511
  `);
3485
- mkdirSync4(resolve22(target, "app/controllers"), { recursive: true });
3512
+ mkdirSync5(resolve23(target, "app/controllers"), { recursive: true });
3486
3513
  const homeViewReturn = view !== "none" ? `{
3487
3514
  view: 'welcome.html',
3488
3515
  data: { year: new Date().getFullYear() },
3489
3516
  }` : `{ status: 200, body: { message: 'Hello from NexusTS!' } }`;
3490
- writeFileSync3(resolve22(target, "app/controllers/home.controller.ts"), `import { Controller, Get } from '@nexusts/core';
3517
+ writeFileSync3(resolve23(target, "app/controllers/home.controller.ts"), `import { Controller, Get } from '@nexusts/core';
3491
3518
 
3492
3519
  @Controller('/')
3493
3520
  export class HomeController {
@@ -3497,9 +3524,9 @@ export class HomeController {
3497
3524
  }
3498
3525
  }
3499
3526
  `);
3500
- writeFileSync3(resolve22(target, "README.md"), `# ${name}
3527
+ writeFileSync3(resolve23(target, "README.md"), `# ${name}
3501
3528
 
3502
- A new Nexus project.
3529
+ A new NexusTS project.
3503
3530
 
3504
3531
  ## Run
3505
3532
 
@@ -3579,7 +3606,7 @@ var new_default = newCommand;
3579
3606
 
3580
3607
  // packages/cli/src/commands/config.ts
3581
3608
  import { existsSync as existsSync8, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
3582
- import { resolve as resolve23 } from "path";
3609
+ import { resolve as resolve24 } from "path";
3583
3610
  var DEFAULT_VALUES = {
3584
3611
  routing: "nest",
3585
3612
  view: "rendu",
@@ -3694,12 +3721,12 @@ var configCommand = {
3694
3721
  async run(ctx) {
3695
3722
  const interactive = !flagBool(ctx.flags, "no-interaction", false);
3696
3723
  const force = flagBool(ctx.flags, "force", false);
3697
- const target = resolve23(ctx.cwd, ctx.flags["target"] ?? ".");
3724
+ const target = resolve24(ctx.cwd, ctx.flags["target"] ?? ".");
3698
3725
  if (!existsSync8(target)) {
3699
3726
  logger.error(`Target directory does not exist: ${target}`);
3700
3727
  return 1;
3701
3728
  }
3702
- const nxConfigPath = resolve23(target, "nx.config.ts");
3729
+ const nxConfigPath = resolve24(target, "nx.config.ts");
3703
3730
  const values = parseExistingConfig(nxConfigPath);
3704
3731
  const flag = (k) => ctx.flags[k];
3705
3732
  const flagBoolStrict = (k, def) => flagBool(ctx.flags, k, def);
@@ -3754,7 +3781,7 @@ var configCommand = {
3754
3781
  writeNxConfig(target, values);
3755
3782
  logger.info(` + nx.config.ts`);
3756
3783
  }
3757
- const drizzleConfigPath = resolve23(target, "drizzle.config.ts");
3784
+ const drizzleConfigPath = resolve24(target, "drizzle.config.ts");
3758
3785
  if (values.orm === "drizzle") {
3759
3786
  const dialect = driverToDialect(values.dbDriver);
3760
3787
  const dbUrl = values.dbUrl;
@@ -3782,22 +3809,22 @@ var configCommand = {
3782
3809
  };
3783
3810
  function writeNxConfig(target, values) {
3784
3811
  const code = render(templates.project["nx.config.ts"], values);
3785
- writeFileSync4(resolve23(target, "nx.config.ts"), code);
3812
+ writeFileSync4(resolve24(target, "nx.config.ts"), code);
3786
3813
  }
3787
3814
  function writeDrizzleConfig(target, values) {
3788
3815
  const code = render(templates.project["drizzle.config.ts"], values);
3789
- writeFileSync4(resolve23(target, "drizzle.config.ts"), code);
3816
+ writeFileSync4(resolve24(target, "drizzle.config.ts"), code);
3790
3817
  }
3791
3818
  var config_default = configCommand;
3792
3819
 
3793
3820
  // packages/cli/src/commands/repl.ts
3794
3821
  import {
3795
3822
  existsSync as existsSync9,
3796
- mkdirSync as mkdirSync5,
3823
+ mkdirSync as mkdirSync6,
3797
3824
  readFileSync as readFileSync6,
3798
3825
  writeFileSync as writeFileSync5
3799
3826
  } from "fs";
3800
- import { dirname as dirname4, resolve as resolve24 } from "path";
3827
+ import { dirname as dirname5, resolve as resolve25 } from "path";
3801
3828
  import * as readline from "readline";
3802
3829
  import * as vm from "vm";
3803
3830
  var BANNER = (() => {
@@ -3879,10 +3906,10 @@ var replCommand = {
3879
3906
  async run(ctx) {
3880
3907
  const mod = ctx.flags["module"];
3881
3908
  const noBoot = Boolean(ctx.flags["no-boot"]);
3882
- const histPath = resolve24(ctx.cwd, ctx.flags["history"] ?? ".nx-repl-history");
3909
+ const histPath = resolve25(ctx.cwd, ctx.flags["history"] ?? ".nx-repl-history");
3883
3910
  const env = { console };
3884
3911
  if (!noBoot) {
3885
- const modPath = resolve24(ctx.cwd, mod ?? "app/app.module.ts");
3912
+ const modPath = resolve25(ctx.cwd, mod ?? "app/app.module.ts");
3886
3913
  if (!existsSync9(modPath)) {
3887
3914
  logger.error(`module not found: ${modPath}`);
3888
3915
  logger.info("pass --module <path> or --no-boot to skip booting");
@@ -3982,20 +4009,33 @@ var replCommand = {
3982
4009
  console.log(" (no modules)");
3983
4010
  } else {
3984
4011
  for (const m of mods) {
3985
- console.log(` ${m.name ?? m.constructor?.name ?? "(anon)"}`);
4012
+ console.log(` ${m.moduleClass?.name ?? "(anon)"}`);
3986
4013
  }
3987
4014
  }
3988
4015
  return true;
3989
4016
  }
3990
4017
  case ".routes": {
3991
4018
  const app = env.app;
3992
- const routes = app?.server?.app?.routes ?? [];
4019
+ const getRoutes = app?.server?.router?.getRoutes;
4020
+ const raw = typeof getRoutes === "function" ? getRoutes.call(app.server.router) : [];
4021
+ const seen = new Set;
4022
+ const routes = raw.filter((r) => {
4023
+ const key = `${r.method}:${r.path}:${r.target?.name ?? ""}:${typeof r.propertyKey === "symbol" ? r.propertyKey.description ?? "" : String(r.propertyKey)}`;
4024
+ if (seen.has(key))
4025
+ return false;
4026
+ seen.add(key);
4027
+ return true;
4028
+ });
3993
4029
  if (routes.length === 0) {
3994
4030
  console.log(" (no routes registered)");
3995
4031
  } else {
4032
+ const methodPad = Math.max(...routes.map((r) => r.method.length));
4033
+ const pathPad = Math.max(...routes.map((r) => r.path.length));
3996
4034
  for (const r of routes) {
3997
- const m = (r.method ?? "?").padEnd(7);
3998
- console.log(` ${m} ${r.path ?? "?"}`);
4035
+ const m = r.method.padEnd(methodPad);
4036
+ const p = r.path.padEnd(pathPad);
4037
+ const c2 = `${r.target?.name ?? "?"}.${typeof r.propertyKey === "symbol" ? r.propertyKey.description ?? "?" : String(r.propertyKey)}`;
4038
+ console.log(` ${m} ${p} ${c2}`);
3999
4039
  }
4000
4040
  }
4001
4041
  return true;
@@ -4072,6 +4112,16 @@ async function preloadService(env, app, name, path, className) {
4072
4112
  logger.debug(`repl: ${path} not installed \u2014 skipping ${name}`);
4073
4113
  }
4074
4114
  }
4115
+ function describeToken(token) {
4116
+ if (typeof token === "symbol") {
4117
+ const desc = token.description ?? "(symbol)";
4118
+ return `Symbol(${desc})`;
4119
+ }
4120
+ if (typeof token === "function") {
4121
+ return token.name || "(anonymous class)";
4122
+ }
4123
+ return String(token);
4124
+ }
4075
4125
  function listServices(container) {
4076
4126
  if (!container)
4077
4127
  return [];
@@ -4079,7 +4129,7 @@ function listServices(container) {
4079
4129
  if (typeof c2.listProviders !== "function")
4080
4130
  return [];
4081
4131
  try {
4082
- return c2.listProviders().map((p) => p.token?.toString?.() ?? String(p.token));
4132
+ return c2.listProviders().map((p) => describeToken(p.token));
4083
4133
  } catch {
4084
4134
  return [];
4085
4135
  }
@@ -4174,9 +4224,9 @@ function loadHistory(path) {
4174
4224
  }
4175
4225
  function saveHistoryFile(path, history) {
4176
4226
  try {
4177
- const dir = dirname4(path);
4227
+ const dir = dirname5(path);
4178
4228
  if (!existsSync9(dir))
4179
- mkdirSync5(dir, { recursive: true });
4229
+ mkdirSync6(dir, { recursive: true });
4180
4230
  writeFileSync5(path, history.slice(-1000).join(`
4181
4231
  `));
4182
4232
  } catch {}
@@ -4185,7 +4235,7 @@ var repl_default = replCommand;
4185
4235
 
4186
4236
  // packages/cli/src/commands/route-list.ts
4187
4237
  import { readdirSync, statSync as statSync2 } from "fs";
4188
- import { resolve as resolve25 } from "path";
4238
+ import { resolve as resolve26 } from "path";
4189
4239
  var routeListCommand = {
4190
4240
  name: "route:list",
4191
4241
  aliases: ["routes", "route-list"],
@@ -4195,7 +4245,7 @@ var routeListCommand = {
4195
4245
  { name: "format", description: "Output format: table (default) | json" }
4196
4246
  ],
4197
4247
  async run(ctx) {
4198
- const controllersDir = resolve25(ctx.cwd, ctx.config.paths.controllers);
4248
+ const controllersDir = resolve26(ctx.cwd, ctx.config.paths.controllers);
4199
4249
  try {
4200
4250
  statSync2(controllersDir);
4201
4251
  } catch {
@@ -4209,14 +4259,15 @@ var routeListCommand = {
4209
4259
  }
4210
4260
  const routes = [];
4211
4261
  for (const file of files) {
4212
- const fullPath = resolve25(controllersDir, file);
4262
+ const fullPath = resolve26(controllersDir, file);
4213
4263
  try {
4214
4264
  const mod = await import(`${fullPath}?t=${Date.now()}`);
4215
4265
  for (const exportName of Object.keys(mod)) {
4216
4266
  const cls = mod[exportName];
4217
4267
  if (typeof cls !== "function")
4218
4268
  continue;
4219
- const prefix = Reflect.getMetadata("nexus:controller:prefix", cls) ?? "";
4269
+ const controllerMeta = Reflect.getMetadata("nexus:controller", cls);
4270
+ const prefix = controllerMeta?.prefix ?? "";
4220
4271
  const routeList = Reflect.getMetadata("nexus:routes", cls) ?? [];
4221
4272
  for (const r of routeList) {
4222
4273
  routes.push({
@@ -4278,6 +4329,7 @@ var commands = [
4278
4329
  config_default,
4279
4330
  make_crud_default,
4280
4331
  make_controller_default,
4332
+ make_repository_default,
4281
4333
  make_service_default,
4282
4334
  make_module_default,
4283
4335
  make_model_default,
@@ -4340,7 +4392,7 @@ function renderHelp(commandName) {
4340
4392
  renderCommandHelp(cmd);
4341
4393
  return 0;
4342
4394
  }
4343
- logger.heading("nx \u2014 Nexus CLI");
4395
+ logger.heading("nx \u2014 NexusTS CLI");
4344
4396
  console.log(`
4345
4397
  ${colors.dim("Adonis ACE-style command runner for the NexusTS framework.")}
4346
4398
 
@@ -4409,5 +4461,5 @@ main().then((code) => process.exit(code)).catch((err) => {
4409
4461
  process.exit(1);
4410
4462
  });
4411
4463
 
4412
- //# debugId=9D68E94AB6C5D92664756E2164756E21
4464
+ //# debugId=4E358A646E4C456564756E2164756E21
4413
4465
  //# sourceMappingURL=index.js.map