@nexusts/cli 0.7.3 → 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.
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ var __toESM = (mod, isNodeMode, target) => {
19
19
  var __require = import.meta.require;
20
20
 
21
21
  // packages/cli/src/commands/info.ts
22
- import { resolve as resolve3 } from "path";
22
+ import { resolve as resolve4 } from "path";
23
23
 
24
24
  // packages/cli/src/core/args.ts
25
25
  var LONG_RE = /^--([^=]+)(?:=(.*))?$/;
@@ -493,6 +493,24 @@ function singularize(s) {
493
493
  return s.slice(0, -1);
494
494
  return s;
495
495
  }
496
+ // packages/cli/src/core/version.ts
497
+ import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
498
+ import { resolve as resolve3, dirname as dirname2 } from "path";
499
+ import { fileURLToPath } from "url";
500
+ var __dirname2 = dirname2(fileURLToPath(import.meta.url));
501
+ var PKG_JSON = resolve3(__dirname2, "..", "package.json");
502
+ function loadVersion() {
503
+ try {
504
+ if (!existsSync3(PKG_JSON))
505
+ return "0.0.0";
506
+ const raw = readFileSync3(PKG_JSON, "utf-8");
507
+ const pkg = JSON.parse(raw);
508
+ return pkg.version ?? "0.0.0";
509
+ } catch {
510
+ return "0.0.0";
511
+ }
512
+ }
513
+ var VERSION = loadVersion();
496
514
  // packages/cli/src/commands/info.ts
497
515
  var infoCommand = {
498
516
  name: "info",
@@ -500,7 +518,7 @@ var infoCommand = {
500
518
  summary: "Show project configuration",
501
519
  description: "Prints the resolved nx.config.ts plus relevant env vars.",
502
520
  async run(ctx) {
503
- logger.heading("Nexus CLI \u2014 Project Info");
521
+ logger.heading("NexusTS CLI \u2014 Project Info");
504
522
  logger.info(colors.bold("Resolved configuration"));
505
523
  logger.blank();
506
524
  logger.table([
@@ -544,7 +562,7 @@ var infoCommand = {
544
562
  logger.blank();
545
563
  logger.info(colors.bold("Working directory"));
546
564
  logger.blank();
547
- logger.info(` ${resolve3(ctx.cwd)}`);
565
+ logger.info(` ${resolve4(ctx.cwd)}`);
548
566
  logger.blank();
549
567
  return 0;
550
568
  }
@@ -552,8 +570,8 @@ var infoCommand = {
552
570
  var info_default = infoCommand;
553
571
 
554
572
  // packages/cli/src/commands/init.ts
555
- import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync3, writeFileSync as writeFileSync2 } from "fs";
556
- import { resolve as resolve4 } from "path";
573
+ import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "fs";
574
+ import { resolve as resolve5 } from "path";
557
575
 
558
576
  // packages/cli/src/templates/controller/adonis.ts
559
577
  var adonis_default = `
@@ -960,7 +978,7 @@ export class {{ name }}Module {}
960
978
 
961
979
  // packages/cli/src/templates/project/nx.config.ts
962
980
  var nx_config_default = `/**
963
- * Nexus project configuration.
981
+ * NexusTS project configuration.
964
982
  * Run \`nx info\` to see the resolved values.
965
983
  */
966
984
 
@@ -1181,8 +1199,8 @@ var initCommand = {
1181
1199
  async run(ctx) {
1182
1200
  const interactive = !flagBool(ctx.flags, "no-interaction", false);
1183
1201
  const force = flagBool(ctx.flags, "force", false);
1184
- const target = resolve4(ctx.cwd, ctx.flags["target"] ?? ".");
1185
- if (!existsSync3(target)) {
1202
+ const target = resolve5(ctx.cwd, ctx.flags["target"] ?? ".");
1203
+ if (!existsSync4(target)) {
1186
1204
  logger.error(`Target directory does not exist: ${target}`);
1187
1205
  logger.info(`Run \`nx new <name>\` to create a fresh project, or \`mkdir -p ${target}\` first.`);
1188
1206
  return 1;
@@ -1225,14 +1243,14 @@ var initCommand = {
1225
1243
  const created = [];
1226
1244
  const skipped = [];
1227
1245
  const merged = [];
1228
- mkdirSync2(resolve4(target, "app/controllers"), { recursive: true });
1229
- mkdirSync2(resolve4(target, "public"), { recursive: true });
1246
+ mkdirSync2(resolve5(target, "app/controllers"), { recursive: true });
1247
+ mkdirSync2(resolve5(target, "public"), { recursive: true });
1230
1248
  if (view !== "none") {
1231
- mkdirSync2(resolve4(target, "resources/views"), { recursive: true });
1249
+ mkdirSync2(resolve5(target, "resources/views"), { recursive: true });
1232
1250
  }
1233
1251
  for (const entry of plan) {
1234
- const abs = resolve4(target, entry.path);
1235
- const exists = existsSync3(abs);
1252
+ const abs = resolve5(target, entry.path);
1253
+ const exists = existsSync4(abs);
1236
1254
  if (entry.mode === "merge-pkg") {
1237
1255
  const coreDeps = {
1238
1256
  "@nexusts/core": "*",
@@ -1453,7 +1471,7 @@ export class HomeController {
1453
1471
  case "README.md":
1454
1472
  return `# ${ctx.targetName}
1455
1473
 
1456
- A Nexus project.
1474
+ A NexusTS project.
1457
1475
 
1458
1476
  ## Run
1459
1477
 
@@ -1490,7 +1508,7 @@ function defaultTsconfig() {
1490
1508
  `;
1491
1509
  }
1492
1510
  function mergePackageJson(path, additions) {
1493
- const raw = readFileSync3(path, "utf8");
1511
+ const raw = readFileSync4(path, "utf8");
1494
1512
  const pkg = parseJsonLoose(raw);
1495
1513
  let changed = false;
1496
1514
  if (!pkg["type"]) {
@@ -1532,7 +1550,7 @@ function mergePackageJson(path, additions) {
1532
1550
  }
1533
1551
  }
1534
1552
  function mergeTsconfig(path, additions) {
1535
- const raw = readFileSync3(path, "utf8");
1553
+ const raw = readFileSync4(path, "utf8");
1536
1554
  const cfg = parseJsonLoose(raw);
1537
1555
  const co = cfg.compilerOptions ?? {};
1538
1556
  let changed = false;
@@ -1561,7 +1579,7 @@ function mergeTsconfig(path, additions) {
1561
1579
  var init_default = initCommand;
1562
1580
 
1563
1581
  // packages/cli/src/commands/make-auth.ts
1564
- import { resolve as resolve5 } from "path";
1582
+ import { resolve as resolve6 } from "path";
1565
1583
  var AUTH_INSTANCE_TEMPLATE = `/**
1566
1584
  * Better-auth instance \u2014 generated by \`nx make:auth\`.
1567
1585
  *
@@ -1676,7 +1694,7 @@ var makeAuthCommand = {
1676
1694
  passkeyRpId: rpId,
1677
1695
  passkeyOrigin: Array.isArray(origin) ? origin.join(",") : origin
1678
1696
  });
1679
- const authOut = resolve5(ctx.cwd, "app/auth/auth.ts");
1697
+ const authOut = resolve6(ctx.cwd, "app/auth/auth.ts");
1680
1698
  if (writeFile(authOut, authCode)) {
1681
1699
  logger.success(`created ${authOut}`);
1682
1700
  } else {
@@ -1686,7 +1704,7 @@ var makeAuthCommand = {
1686
1704
  providers: providers.length > 0,
1687
1705
  entries
1688
1706
  });
1689
- const envOut = resolve5(ctx.cwd, ".env.example");
1707
+ const envOut = resolve6(ctx.cwd, ".env.example");
1690
1708
  if (writeFile(envOut, envCode, { skipIfExists: true })) {
1691
1709
  logger.success(`created ${envOut}`);
1692
1710
  } else {
@@ -1712,7 +1730,7 @@ var makeAuthCommand = {
1712
1730
  var make_auth_default = makeAuthCommand;
1713
1731
 
1714
1732
  // packages/cli/src/commands/make-controller.ts
1715
- import { resolve as resolve6 } from "path";
1733
+ import { resolve as resolve7 } from "path";
1716
1734
  var makeControllerCommand = {
1717
1735
  name: "make:controller",
1718
1736
  aliases: ["mc", "make-controller"],
@@ -1758,7 +1776,7 @@ var makeControllerCommand = {
1758
1776
  service: serviceName,
1759
1777
  serviceCamel
1760
1778
  }).replace(/import .*\n/g, skipService ? (m) => m.includes("services/") ? "" : m : (m) => m);
1761
- const out = resolve6(ctx.cwd, ctx.config.paths.controllers, `${variants.kebab}.controller.ts`);
1779
+ const out = resolve7(ctx.cwd, ctx.config.paths.controllers, `${variants.kebab}.controller.ts`);
1762
1780
  const ok = writeFile(out, code, { skipIfExists: false });
1763
1781
  if (!ok) {
1764
1782
  logger.error(`Refusing to overwrite existing file: ${out}`);
@@ -1773,7 +1791,7 @@ var make_controller_default = makeControllerCommand;
1773
1791
 
1774
1792
  // packages/cli/src/commands/make-crud.ts
1775
1793
  import { mkdirSync as mkdirSync3 } from "fs";
1776
- import { dirname as dirname2, resolve as resolve7 } from "path";
1794
+ import { dirname as dirname3, resolve as resolve8 } from "path";
1777
1795
 
1778
1796
  // packages/cli/src/templates/model/drizzle-dialect.ts
1779
1797
  function renderDrizzleDialect(dialect) {
@@ -1823,7 +1841,7 @@ var DIALECT_SPECS = {
1823
1841
  idOpts: "{ autoIncrement: true }",
1824
1842
  tsTimestamp: "text",
1825
1843
  tsDateMode: "",
1826
- defaultTs: `.default("(datetime('now'))")`,
1844
+ defaultTs: ".$defaultFn(() => new Date().toISOString())",
1827
1845
  defaultTsUpdate: ""
1828
1846
  },
1829
1847
  sqlite: {
@@ -1948,7 +1966,7 @@ var makeCrudCommand = {
1948
1966
  viewShowComponent,
1949
1967
  hasInertia
1950
1968
  });
1951
- const out = resolve7(ctx.cwd, ctx.config.paths.controllers, `${variants.kebab}.controller.ts`);
1969
+ const out = resolve8(ctx.cwd, ctx.config.paths.controllers, `${variants.kebab}.controller.ts`);
1952
1970
  if (!writeFile(out, code, { skipIfExists: true })) {
1953
1971
  logger.warn(`skipped (exists): ${out}`);
1954
1972
  } else {
@@ -1966,7 +1984,7 @@ var makeCrudCommand = {
1966
1984
  repository,
1967
1985
  repositoryCamel: variants.camel + "Repository"
1968
1986
  });
1969
- const out = resolve7(ctx.cwd, ctx.config.paths.services, `${variants.kebab}.service.ts`);
1987
+ const out = resolve8(ctx.cwd, ctx.config.paths.services, `${variants.kebab}.service.ts`);
1970
1988
  if (!writeFile(out, code, { skipIfExists: true })) {
1971
1989
  logger.warn(`skipped (exists): ${out}`);
1972
1990
  } else {
@@ -2000,7 +2018,7 @@ var makeCrudCommand = {
2000
2018
  prismaBlock: ""
2001
2019
  });
2002
2020
  }
2003
- const out = resolve7(ctx.cwd, ctx.config.paths.models, `${variants.kebab}.model.ts`);
2021
+ const out = resolve8(ctx.cwd, ctx.config.paths.models, `${variants.kebab}.model.ts`);
2004
2022
  if (!writeFile(out, code, { skipIfExists: true })) {
2005
2023
  logger.warn(`skipped (exists): ${out}`);
2006
2024
  } else {
@@ -2016,8 +2034,8 @@ var makeCrudCommand = {
2016
2034
  tableName,
2017
2035
  repository
2018
2036
  });
2019
- const repoOut = resolve7(ctx.cwd, `${ctx.config.paths.app}/repositories`, `${variants.kebab}.repository.ts`);
2020
- mkdirSync3(dirname2(repoOut), { recursive: true });
2037
+ const repoOut = resolve8(ctx.cwd, `${ctx.config.paths.app}/repositories`, `${variants.kebab}.repository.ts`);
2038
+ mkdirSync3(dirname3(repoOut), { recursive: true });
2021
2039
  if (!writeFile(repoOut, repoCode, { skipIfExists: true })) {
2022
2040
  logger.warn(`skipped (exists): ${repoOut}`);
2023
2041
  } else {
@@ -2031,7 +2049,7 @@ var makeCrudCommand = {
2031
2049
  camel: variants.camel,
2032
2050
  kebab: variants.kebab
2033
2051
  });
2034
- const out = resolve7(ctx.cwd, ctx.config.paths.dto, `${variants.kebab}.dto.ts`);
2052
+ const out = resolve8(ctx.cwd, ctx.config.paths.dto, `${variants.kebab}.dto.ts`);
2035
2053
  if (!writeFile(out, code, { skipIfExists: true })) {
2036
2054
  logger.warn(`skipped (exists): ${out}`);
2037
2055
  } else {
@@ -2049,7 +2067,7 @@ var makeCrudCommand = {
2049
2067
  repository,
2050
2068
  hasRepo: !noRepo
2051
2069
  });
2052
- const out = resolve7(ctx.cwd, ctx.config.paths.modules, `${variants.kebab}.module.ts`);
2070
+ const out = resolve8(ctx.cwd, ctx.config.paths.modules, `${variants.kebab}.module.ts`);
2053
2071
  if (!writeFile(out, code, { skipIfExists: true })) {
2054
2072
  logger.warn(`skipped (exists): ${out}`);
2055
2073
  } else {
@@ -2065,7 +2083,7 @@ var makeCrudCommand = {
2065
2083
  controller,
2066
2084
  service
2067
2085
  });
2068
- const out = resolve7(ctx.cwd, "tests", `${variants.kebab}.test.ts`);
2086
+ const out = resolve8(ctx.cwd, "tests", `${variants.kebab}.test.ts`);
2069
2087
  if (!writeFile(out, code, { skipIfExists: true })) {
2070
2088
  logger.warn(`skipped (exists): ${out}`);
2071
2089
  } else {
@@ -2101,7 +2119,7 @@ function renderDrizzleColumns(dialect) {
2101
2119
  var make_crud_default = makeCrudCommand;
2102
2120
 
2103
2121
  // packages/cli/src/commands/make-listener.ts
2104
- import { resolve as resolve8 } from "path";
2122
+ import { resolve as resolve9 } from "path";
2105
2123
  var LISTENER_TEMPLATE = `
2106
2124
  import { Inject, Injectable } from '@nexusts/core';
2107
2125
  import { EventService, OnEvent } from '@nexusts/events';
@@ -2152,7 +2170,7 @@ var makeListenerCommand = {
2152
2170
  name: variants.pascal,
2153
2171
  kebab: variants.kebab
2154
2172
  });
2155
- const out = resolve8(ctx.cwd, "app/events/listeners", `${variants.kebab}.listener.ts`);
2173
+ const out = resolve9(ctx.cwd, "app/events/listeners", `${variants.kebab}.listener.ts`);
2156
2174
  if (writeFile(out, code, { skipIfExists: true })) {
2157
2175
  logger.success(`created ${out}`);
2158
2176
  } else {
@@ -2172,7 +2190,7 @@ var makeListenerCommand = {
2172
2190
  var make_listener_default = makeListenerCommand;
2173
2191
 
2174
2192
  // packages/cli/src/commands/make-middleware.ts
2175
- import { resolve as resolve9 } from "path";
2193
+ import { resolve as resolve10 } from "path";
2176
2194
  var makeMiddlewareCommand = {
2177
2195
  name: "make:middleware",
2178
2196
  aliases: ["mwm", "make-middleware"],
@@ -2189,7 +2207,7 @@ var makeMiddlewareCommand = {
2189
2207
  const code = render(templates.middleware, {
2190
2208
  name: variants.pascal
2191
2209
  });
2192
- const out = resolve9(ctx.cwd, ctx.config.paths.middleware, `${variants.kebab}.middleware.ts`);
2210
+ const out = resolve10(ctx.cwd, ctx.config.paths.middleware, `${variants.kebab}.middleware.ts`);
2193
2211
  writeFile(out, code);
2194
2212
  logger.success(`created ${out}`);
2195
2213
  logger.finger(`register with: app.server.app.use('*', new ${variants.pascal}Middleware().handle)`);
@@ -2199,7 +2217,7 @@ var makeMiddlewareCommand = {
2199
2217
  var make_middleware_default = makeMiddlewareCommand;
2200
2218
 
2201
2219
  // packages/cli/src/commands/make-migration.ts
2202
- import { resolve as resolve10 } from "path";
2220
+ import { resolve as resolve11 } from "path";
2203
2221
  var makeMigrationCommand = {
2204
2222
  name: "make:migration",
2205
2223
  aliases: ["mkm", "make-migration"],
@@ -2271,7 +2289,7 @@ var makeMigrationCommand = {
2271
2289
  return 1;
2272
2290
  }
2273
2291
  const filename = `${formatTimestamp(new Date)}_${variants.snake}.${extension}`;
2274
- const out = resolve10(ctx.cwd, ctx.config.paths.migrations, filename);
2292
+ const out = resolve11(ctx.cwd, ctx.config.paths.migrations, filename);
2275
2293
  writeFile(out, code);
2276
2294
  logger.success(`created ${out}`);
2277
2295
  if (isDrizzle) {
@@ -2359,7 +2377,7 @@ function formatTimestamp(d) {
2359
2377
  var make_migration_default = makeMigrationCommand;
2360
2378
 
2361
2379
  // packages/cli/src/commands/make-model.ts
2362
- import { resolve as resolve11 } from "path";
2380
+ import { resolve as resolve12 } from "path";
2363
2381
  var makeModelCommand = {
2364
2382
  name: "make:model",
2365
2383
  aliases: ["mmodel", "make-model"],
@@ -2431,7 +2449,7 @@ var makeModelCommand = {
2431
2449
  prismaBlock
2432
2450
  });
2433
2451
  }
2434
- const out = resolve11(ctx.cwd, ctx.config.paths.models, `${variants.kebab}.model.ts`);
2452
+ const out = resolve12(ctx.cwd, ctx.config.paths.models, `${variants.kebab}.model.ts`);
2435
2453
  writeFile(out, code);
2436
2454
  logger.success(`created ${out}`);
2437
2455
  logger.finger(`run \`nx make:migration create_${tableName}_table\` to scaffold a migration.`);
@@ -2490,7 +2508,7 @@ function capitalize(s) {
2490
2508
  var make_model_default = makeModelCommand;
2491
2509
 
2492
2510
  // packages/cli/src/commands/make-module.ts
2493
- import { resolve as resolve12 } from "path";
2511
+ import { resolve as resolve13 } from "path";
2494
2512
  var makeModuleCommand = {
2495
2513
  name: "make:module",
2496
2514
  aliases: ["mm", "make-module"],
@@ -2524,7 +2542,7 @@ var makeModuleCommand = {
2524
2542
  hasService,
2525
2543
  hasRepo
2526
2544
  });
2527
- const out = resolve12(ctx.cwd, ctx.config.paths.modules, `${variants.kebab}.module.ts`);
2545
+ const out = resolve13(ctx.cwd, ctx.config.paths.modules, `${variants.kebab}.module.ts`);
2528
2546
  writeFile(out, code);
2529
2547
  logger.success(`created ${out}`);
2530
2548
  logger.finger(`add ${variants.pascal}Module to AppModule.imports.`);
@@ -2534,7 +2552,7 @@ var makeModuleCommand = {
2534
2552
  var make_module_default = makeModuleCommand;
2535
2553
 
2536
2554
  // packages/cli/src/commands/make-queue.ts
2537
- import { resolve as resolve13 } from "path";
2555
+ import { resolve as resolve14 } from "path";
2538
2556
  var WORKER_TEMPLATE = `
2539
2557
  import { Inject, Injectable } from '@nexusts/core';
2540
2558
  import { QueueService, OnQueueReady } from '@nexusts/queue';
@@ -2662,7 +2680,7 @@ var makeQueueCommand = {
2662
2680
  name: variants.pascal,
2663
2681
  kebab: variants.kebab
2664
2682
  });
2665
- const out = resolve13(ctx.cwd, "app/queue/workers", `${variants.kebab}.worker.ts`);
2683
+ const out = resolve14(ctx.cwd, "app/queue/workers", `${variants.kebab}.worker.ts`);
2666
2684
  if (writeFile(out, code, { skipIfExists: true })) {
2667
2685
  logger.success(`created ${out}`);
2668
2686
  } else {
@@ -2674,7 +2692,7 @@ var makeQueueCommand = {
2674
2692
  name: variants.pascal,
2675
2693
  kebab: variants.kebab
2676
2694
  });
2677
- const out = resolve13(ctx.cwd, "app/queue/jobs", `${variants.kebab}.job.ts`);
2695
+ const out = resolve14(ctx.cwd, "app/queue/jobs", `${variants.kebab}.job.ts`);
2678
2696
  if (writeFile(out, code, { skipIfExists: true })) {
2679
2697
  logger.success(`created ${out}`);
2680
2698
  } else {
@@ -2696,8 +2714,44 @@ var makeQueueCommand = {
2696
2714
  };
2697
2715
  var make_queue_default = makeQueueCommand;
2698
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
+
2699
2753
  // packages/cli/src/commands/make-schedule.ts
2700
- import { resolve as resolve14 } from "path";
2754
+ import { resolve as resolve16 } from "path";
2701
2755
  var TASK_TEMPLATE = `
2702
2756
  import { Injectable } from '@nexusts/core';
2703
2757
  import { Cron, Interval, Timeout } from '@nexusts/schedule';
@@ -2741,7 +2795,7 @@ var makeScheduleCommand = {
2741
2795
  name: variants.pascal,
2742
2796
  kebab: variants.kebab
2743
2797
  });
2744
- const out = resolve14(ctx.cwd, "app/schedule/tasks", `${variants.kebab}.task.ts`);
2798
+ const out = resolve16(ctx.cwd, "app/schedule/tasks", `${variants.kebab}.task.ts`);
2745
2799
  if (writeFile(out, code, { skipIfExists: true })) {
2746
2800
  logger.success(`created ${out}`);
2747
2801
  } else {
@@ -2759,7 +2813,7 @@ var makeScheduleCommand = {
2759
2813
  var make_schedule_default = makeScheduleCommand;
2760
2814
 
2761
2815
  // packages/cli/src/commands/make-service.ts
2762
- import { resolve as resolve15 } from "path";
2816
+ import { resolve as resolve17 } from "path";
2763
2817
  var makeServiceCommand = {
2764
2818
  name: "make:service",
2765
2819
  aliases: ["ms", "make-service"],
@@ -2786,11 +2840,12 @@ var makeServiceCommand = {
2786
2840
  name: variants.pascal,
2787
2841
  camel: variants.camel,
2788
2842
  kebab: variants.kebab,
2843
+ snake: variants.snake,
2789
2844
  hasRepo,
2790
2845
  repository,
2791
2846
  repositoryCamel
2792
2847
  });
2793
- const out = resolve15(ctx.cwd, ctx.config.paths.services, `${variants.kebab}.service.ts`);
2848
+ const out = resolve17(ctx.cwd, ctx.config.paths.services, `${variants.kebab}.service.ts`);
2794
2849
  writeFile(out, code);
2795
2850
  logger.success(`created ${out}`);
2796
2851
  return 0;
@@ -2799,7 +2854,7 @@ var makeServiceCommand = {
2799
2854
  var make_service_default = makeServiceCommand;
2800
2855
 
2801
2856
  // packages/cli/src/commands/make-session.ts
2802
- import { resolve as resolve16 } from "path";
2857
+ import { resolve as resolve18 } from "path";
2803
2858
  var SESSION_TEMPLATE = `
2804
2859
  import { Inject, Injectable } from '@nexusts/core';
2805
2860
  import { SessionService } from '@nexusts/session';
@@ -2861,7 +2916,7 @@ var makeSessionCommand = {
2861
2916
  name: variants.pascal,
2862
2917
  kebab: variants.kebab
2863
2918
  });
2864
- const out = resolve16(ctx.cwd, "app/session/services", `${variants.kebab}.session.ts`);
2919
+ const out = resolve18(ctx.cwd, "app/session/services", `${variants.kebab}.session.ts`);
2865
2920
  if (writeFile(out, code, { skipIfExists: true })) {
2866
2921
  logger.success(`created ${out}`);
2867
2922
  } else {
@@ -2879,7 +2934,7 @@ var makeSessionCommand = {
2879
2934
  var make_session_default = makeSessionCommand;
2880
2935
 
2881
2936
  // packages/cli/src/commands/make-validator.ts
2882
- import { resolve as resolve17 } from "path";
2937
+ import { resolve as resolve19 } from "path";
2883
2938
  var makeValidatorCommand = {
2884
2939
  name: "make:validator",
2885
2940
  aliases: ["mv", "make-validator"],
@@ -2896,7 +2951,7 @@ var makeValidatorCommand = {
2896
2951
  const code = render(templates.validator, {
2897
2952
  name: variants.pascal
2898
2953
  });
2899
- const out = resolve17(ctx.cwd, ctx.config.paths.dto, `${variants.kebab}.dto.ts`);
2954
+ const out = resolve19(ctx.cwd, ctx.config.paths.dto, `${variants.kebab}.dto.ts`);
2900
2955
  writeFile(out, code);
2901
2956
  logger.success(`created ${out}`);
2902
2957
  return 0;
@@ -2906,8 +2961,8 @@ var make_validator_default = makeValidatorCommand;
2906
2961
 
2907
2962
  // packages/cli/src/commands/db-migrate.ts
2908
2963
  import { spawn } from "child_process";
2909
- import { existsSync as existsSync4 } from "fs";
2910
- import { resolve as resolve18 } from "path";
2964
+ import { existsSync as existsSync5 } from "fs";
2965
+ import { resolve as resolve20 } from "path";
2911
2966
  var dbMigrateCommand = {
2912
2967
  name: "db:migrate",
2913
2968
  aliases: ["db:m", "migrate"],
@@ -2942,15 +2997,15 @@ var dbMigrateCommand = {
2942
2997
  }
2943
2998
  ],
2944
2999
  async run(ctx) {
2945
- const folder = ctx.flags["folder"] ?? resolve18(ctx.cwd, ctx.config.paths.migrations);
3000
+ const folder = ctx.flags["folder"] ?? resolve20(ctx.cwd, ctx.config.paths.migrations);
2946
3001
  const dialect = ctx.flags["dialect"] ?? ctx.config.dialect ?? "bun-sqlite";
2947
- const configPath = ctx.flags["config"] ?? resolve18(ctx.cwd, "drizzle.config.ts");
3002
+ const configPath = ctx.flags["config"] ?? resolve20(ctx.cwd, "drizzle.config.ts");
2948
3003
  const wantStatus = Boolean(ctx.flags["status"]);
2949
3004
  const generateName = ctx.flags["generate"];
2950
3005
  if (generateName) {
2951
3006
  return runDrizzleKit(ctx.cwd, [
2952
3007
  "generate",
2953
- ...existsSync4(configPath) ? [`--config=${configPath}`] : [],
3008
+ ...existsSync5(configPath) ? [`--config=${configPath}`] : [],
2954
3009
  "--name",
2955
3010
  generateName
2956
3011
  ]);
@@ -2960,7 +3015,7 @@ var dbMigrateCommand = {
2960
3015
  }
2961
3016
  return runDrizzleKit(ctx.cwd, [
2962
3017
  "migrate",
2963
- ...existsSync4(configPath) ? [`--config=${configPath}`] : []
3018
+ ...existsSync5(configPath) ? [`--config=${configPath}`] : []
2964
3019
  ]);
2965
3020
  }
2966
3021
  };
@@ -2981,7 +3036,7 @@ function runDrizzleKit(cwd, args2) {
2981
3036
  });
2982
3037
  }
2983
3038
  async function runStatus(cwd, folder, dialect, configUrl = "") {
2984
- if (!existsSync4(folder)) {
3039
+ if (!existsSync5(folder)) {
2985
3040
  logger.warn(`migrations folder not found: ${folder}`);
2986
3041
  return 0;
2987
3042
  }
@@ -3005,7 +3060,7 @@ const applied = await svc.appliedMigrations();
3005
3060
  console.log(JSON.stringify({ total: applied.length, applied }, null, 2));
3006
3061
  await svc.close();
3007
3062
  `;
3008
- const tmpFile = resolve18(cwd, ".nx-migrate-status.mjs");
3063
+ const tmpFile = resolve20(cwd, ".nx-migrate-status.mjs");
3009
3064
  await import("fs/promises").then((m) => m.writeFile(tmpFile, script, "utf-8"));
3010
3065
  try {
3011
3066
  const code = await new Promise((resP) => {
@@ -3029,7 +3084,7 @@ function readEnvUrl(dialect) {
3029
3084
  var db_migrate_default = dbMigrateCommand;
3030
3085
 
3031
3086
  // packages/cli/src/commands/db-generate.ts
3032
- import { resolve as resolve19 } from "path";
3087
+ import { resolve as resolve21 } from "path";
3033
3088
  var dbGenerateCommand = {
3034
3089
  name: "db:generate",
3035
3090
  aliases: ["db:g", "db-generate", "generate-migration"],
@@ -3062,7 +3117,7 @@ var dbGenerateCommand = {
3062
3117
  logger.info(`Generating raw SQL migration: ${name} (dialect=${dialect})`);
3063
3118
  return runSqlTemplate(ctx.cwd, name, dialect);
3064
3119
  }
3065
- const configPath = resolve19(ctx.cwd, "drizzle.config.ts");
3120
+ const configPath = resolve21(ctx.cwd, "drizzle.config.ts");
3066
3121
  const args2 = ["generate", "--config", configPath];
3067
3122
  if (name)
3068
3123
  args2.push("--name", name);
@@ -3071,10 +3126,10 @@ var dbGenerateCommand = {
3071
3126
  }
3072
3127
  };
3073
3128
  async function runSqlTemplate(cwd, name, dialect) {
3074
- const { mkdirSync: mkdirSync4, writeFileSync: writeFileSync3 } = await import("fs");
3129
+ const { mkdirSync: mkdirSync5, writeFileSync: writeFileSync3 } = await import("fs");
3075
3130
  const { join } = await import("path");
3076
3131
  const migrationsDir = join(cwd, "app", "database", "migrations");
3077
- mkdirSync4(migrationsDir, { recursive: true });
3132
+ mkdirSync5(migrationsDir, { recursive: true });
3078
3133
  const timestamp = Date.now();
3079
3134
  const filename = `${timestamp}_${name.replace(/[^a-z0-9_]+/g, "_")}.sql`;
3080
3135
  const filepath = join(migrationsDir, filename);
@@ -3096,9 +3151,9 @@ var db_generate_default = dbGenerateCommand;
3096
3151
 
3097
3152
  // packages/cli/src/commands/db-seed.ts
3098
3153
  import { spawn as spawn2 } from "child_process";
3099
- import { existsSync as existsSync5 } from "fs";
3154
+ import { existsSync as existsSync6 } from "fs";
3100
3155
  import { mkdir, readdir, writeFile as writeFile2, unlink } from "fs/promises";
3101
- import { resolve as resolve20 } from "path";
3156
+ import { resolve as resolve22 } from "path";
3102
3157
  var SEED_TEMPLATE = `/**
3103
3158
  * Seed: {name}
3104
3159
  *
@@ -3159,7 +3214,7 @@ var dbSeedCommand = {
3159
3214
  }
3160
3215
  ],
3161
3216
  async run(ctx) {
3162
- const folder = resolve20(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");
3163
3218
  const dialect = ctx.flags["dialect"] ?? ctx.config.dialect ?? "bun-sqlite";
3164
3219
  const createName = ctx.flags["create"];
3165
3220
  const fileName = ctx.flags["file"];
@@ -3167,10 +3222,10 @@ var dbSeedCommand = {
3167
3222
  if (createName) {
3168
3223
  return await createSeedFile(folder, createName);
3169
3224
  }
3170
- if (!existsSync5(folder)) {
3225
+ if (!existsSync6(folder)) {
3171
3226
  logger.info(`creating empty seeds folder at ${folder}`);
3172
3227
  await mkdir(folder, { recursive: true });
3173
- await writeFile2(resolve20(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
3174
3229
  `, "utf-8");
3175
3230
  return 0;
3176
3231
  }
@@ -3194,14 +3249,14 @@ var dbSeedCommand = {
3194
3249
  if (reset) {
3195
3250
  logger.warn("--reset is set: truncating every table in the schema before running seeds.");
3196
3251
  }
3197
- const seedImports = target.map((f, i) => `import seed_${i} from ${JSON.stringify(resolve20(folder, f))};`).join(`
3252
+ const seedImports = target.map((f, i) => `import seed_${i} from ${JSON.stringify(resolve22(folder, f))};`).join(`
3198
3253
  `);
3199
3254
  const seedCalls = target.map((_, i) => ` await seed_${i}({ db, logger, dialect, truncate: (t) => db.truncate(t) });`).join(`
3200
3255
  `);
3201
3256
  const script = `
3202
3257
  import 'reflect-metadata';
3203
- import { DrizzleService } from '${relativeImport(ctx.cwd, "src/drizzle/index.js")}';
3204
- import { logger as frameworkLogger } from '${relativeImport(ctx.cwd, "src/logger/index.js")}';
3258
+ import { DrizzleService } from '@nexusts/drizzle';
3259
+ import { Logger } from '@nexusts/logger';
3205
3260
 
3206
3261
  const url = ${JSON.stringify(url)};
3207
3262
  const dialect = ${JSON.stringify(dialect)};
@@ -3210,7 +3265,8 @@ const reset = ${JSON.stringify(reset)};
3210
3265
  const cfg = { dialect, connection: { url }, schema: dialect === 'postgres' ? 'public' : undefined };
3211
3266
  const db = new DrizzleService(cfg);
3212
3267
  await db.open();
3213
- const logger = frameworkLogger;
3268
+ const logger = new Logger({ level: 'info' });
3269
+ await logger.ready();
3214
3270
 
3215
3271
  if (reset) {
3216
3272
  const tables = await db.allTables();
@@ -3227,7 +3283,7 @@ ${seedCalls}
3227
3283
  await db.close();
3228
3284
  logger.info(\`Seeds complete (\${${target.length}} file(s))\`);
3229
3285
  `;
3230
- const tmpFile = resolve20(ctx.cwd, ".nx-db-seed.mjs");
3286
+ const tmpFile = resolve22(ctx.cwd, ".nx-db-seed.mjs");
3231
3287
  await writeFile2(tmpFile, script, "utf-8");
3232
3288
  try {
3233
3289
  const code = await new Promise((resP) => {
@@ -3265,15 +3321,15 @@ async function createSeedFile(folder, name) {
3265
3321
  logger.error(`invalid seed name "${name}" \u2014 use letters, numbers, dash, underscore.`);
3266
3322
  return 1;
3267
3323
  }
3268
- if (!existsSync5(folder))
3324
+ if (!existsSync6(folder))
3269
3325
  await mkdir(folder, { recursive: true });
3270
3326
  let candidate = `${name}.ts`;
3271
3327
  let i = 1;
3272
- while (existsSync5(resolve20(folder, candidate))) {
3328
+ while (existsSync6(resolve22(folder, candidate))) {
3273
3329
  candidate = `${name}_${i}.ts`;
3274
3330
  i++;
3275
3331
  }
3276
- const path = resolve20(folder, candidate);
3332
+ const path = resolve22(folder, candidate);
3277
3333
  const body = SEED_TEMPLATE.replace(/\{name\}/g, name);
3278
3334
  await writeFile2(path, body, "utf-8");
3279
3335
  logger.info(`created ${path}`);
@@ -3283,26 +3339,15 @@ function readEnvUrl2(dialect) {
3283
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);
3284
3340
  return url ?? null;
3285
3341
  }
3286
- function relativeImport(cwd, target) {
3287
- const abs = resolve20(cwd, target);
3288
- let rel = abs;
3289
- if (rel.startsWith(cwd))
3290
- rel = rel.slice(cwd.length);
3291
- if (rel.startsWith("/"))
3292
- rel = rel.slice(1);
3293
- if (!rel.startsWith("."))
3294
- rel = "./" + rel;
3295
- return rel;
3296
- }
3297
3342
  var db_seed_default = dbSeedCommand;
3298
3343
 
3299
3344
  // packages/cli/src/commands/new.ts
3300
- import { existsSync as existsSync6, mkdirSync as mkdirSync4, writeFileSync as writeFileSync3 } from "fs";
3301
- import { resolve as resolve21 } from "path";
3345
+ import { existsSync as existsSync7, mkdirSync as mkdirSync5, writeFileSync as writeFileSync3 } from "fs";
3346
+ import { resolve as resolve23 } from "path";
3302
3347
  var newCommand = {
3303
3348
  name: "new",
3304
3349
  aliases: ["n"],
3305
- summary: "Create a new Nexus project",
3350
+ summary: "Create a new NexusTS project",
3306
3351
  description: "Generates a new project directory with nx.config.ts, tsconfig, package.json, and a starter app/main.ts.",
3307
3352
  examples: [
3308
3353
  "nx new my-app",
@@ -3333,8 +3378,8 @@ var newCommand = {
3333
3378
  return 1;
3334
3379
  }
3335
3380
  const interactive = !flagBool(ctx.flags, "no-interaction", false);
3336
- const target = resolve21(ctx.cwd, name);
3337
- if (existsSync6(target)) {
3381
+ const target = resolve23(ctx.cwd, name);
3382
+ if (existsSync7(target)) {
3338
3383
  logger.error(`Directory already exists: ${target}`);
3339
3384
  return 1;
3340
3385
  }
@@ -3359,21 +3404,21 @@ var newCommand = {
3359
3404
  default: "react"
3360
3405
  });
3361
3406
  const ssr = !flagBool(ctx.flags, "no-ssr", false);
3362
- mkdirSync4(resolve21(target, "app"), { recursive: true });
3407
+ mkdirSync5(resolve23(target, "app"), { recursive: true });
3363
3408
  if (view !== "none") {
3364
- mkdirSync4(resolve21(target, "resources/views"), { recursive: true });
3409
+ mkdirSync5(resolve23(target, "resources/views"), { recursive: true });
3365
3410
  }
3366
- mkdirSync4(resolve21(target, "public"), { recursive: true });
3367
- writeFileSync3(resolve21(target, "public/.gitkeep"), "");
3411
+ mkdirSync5(resolve23(target, "public"), { recursive: true });
3412
+ writeFileSync3(resolve23(target, "public/.gitkeep"), "");
3368
3413
  if (view !== "none") {
3369
- writeFileSync3(resolve21(target, "resources/views/welcome.html"), `<h1>Welcome to ${name}</h1>
3414
+ writeFileSync3(resolve23(target, "resources/views/welcome.html"), `<h1>Welcome to ${name}</h1>
3370
3415
  <p>This is a sample Rendu template.</p>
3371
3416
  <p>Founded <?= year ?>.</p>
3372
3417
  `);
3373
3418
  }
3374
- writeFileSync3(resolve21(target, ".env"), generateEnvFile());
3375
- writeFileSync3(resolve21(target, ".env.local"), generateEnvLocalFile());
3376
- writeFileSync3(resolve21(target, ".gitignore"), generateGitIgnore());
3419
+ writeFileSync3(resolve23(target, ".env"), generateEnvFile());
3420
+ writeFileSync3(resolve23(target, ".env.local"), generateEnvLocalFile());
3421
+ writeFileSync3(resolve23(target, ".gitignore"), generateGitIgnore());
3377
3422
  const code = render(templates.project["nx.config.ts"], {
3378
3423
  routing,
3379
3424
  view,
@@ -3385,7 +3430,7 @@ var newCommand = {
3385
3430
  inertiaSSR: ssr,
3386
3431
  inertiaVersion: "1.0.0"
3387
3432
  });
3388
- writeFileSync3(resolve21(target, "nx.config.ts"), code);
3433
+ writeFileSync3(resolve23(target, "nx.config.ts"), code);
3389
3434
  const deps = {
3390
3435
  "@nexusts/core": "*",
3391
3436
  "reflect-metadata": "^0.2.2",
@@ -3399,7 +3444,7 @@ var newCommand = {
3399
3444
  if (view !== "none") {
3400
3445
  deps["@nexusts/static"] = "*";
3401
3446
  }
3402
- writeFileSync3(resolve21(target, "package.json"), JSON.stringify({
3447
+ writeFileSync3(resolve23(target, "package.json"), JSON.stringify({
3403
3448
  name,
3404
3449
  version: "0.1.0",
3405
3450
  type: "module",
@@ -3412,7 +3457,7 @@ var newCommand = {
3412
3457
  },
3413
3458
  dependencies: deps
3414
3459
  }, null, 2));
3415
- writeFileSync3(resolve21(target, "tsconfig.json"), `{
3460
+ writeFileSync3(resolve23(target, "tsconfig.json"), `{
3416
3461
  "compilerOptions": {
3417
3462
  "target": "ES2022",
3418
3463
  "module": "ESNext",
@@ -3433,7 +3478,7 @@ const staticMiddleware = StaticModule.mount({ root: './public', prefix: '/static
3433
3478
  ` : "";
3434
3479
  const staticOption = hasView ? `
3435
3480
  middleware: [staticMiddleware],` : "";
3436
- writeFileSync3(resolve21(target, "app/main.ts"), `import 'reflect-metadata';
3481
+ writeFileSync3(resolve23(target, "app/main.ts"), `import 'reflect-metadata';
3437
3482
  import { Application } from '@nexusts/core';
3438
3483
  ${staticImport}import { AppModule } from './app.module.js';
3439
3484
 
@@ -3453,7 +3498,7 @@ console.log('[nexus] Listening on http://localhost:' + (process.env['PORT'] ?? 3
3453
3498
  connection: { filename: 'app.db' },
3454
3499
  logging: true,
3455
3500
  })` : "";
3456
- writeFileSync3(resolve21(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';
3457
3502
  import { HomeController } from './controllers/home.controller.js';
3458
3503
 
3459
3504
  @Module({
@@ -3464,12 +3509,12 @@ ${ormBlock},
3464
3509
  })
3465
3510
  export class AppModule {}
3466
3511
  `);
3467
- mkdirSync4(resolve21(target, "app/controllers"), { recursive: true });
3512
+ mkdirSync5(resolve23(target, "app/controllers"), { recursive: true });
3468
3513
  const homeViewReturn = view !== "none" ? `{
3469
3514
  view: 'welcome.html',
3470
3515
  data: { year: new Date().getFullYear() },
3471
3516
  }` : `{ status: 200, body: { message: 'Hello from NexusTS!' } }`;
3472
- writeFileSync3(resolve21(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';
3473
3518
 
3474
3519
  @Controller('/')
3475
3520
  export class HomeController {
@@ -3479,9 +3524,9 @@ export class HomeController {
3479
3524
  }
3480
3525
  }
3481
3526
  `);
3482
- writeFileSync3(resolve21(target, "README.md"), `# ${name}
3527
+ writeFileSync3(resolve23(target, "README.md"), `# ${name}
3483
3528
 
3484
- A new Nexus project.
3529
+ A new NexusTS project.
3485
3530
 
3486
3531
  ## Run
3487
3532
 
@@ -3560,8 +3605,8 @@ dist/
3560
3605
  var new_default = newCommand;
3561
3606
 
3562
3607
  // packages/cli/src/commands/config.ts
3563
- import { existsSync as existsSync7, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "fs";
3564
- import { resolve as resolve22 } from "path";
3608
+ import { existsSync as existsSync8, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
3609
+ import { resolve as resolve24 } from "path";
3565
3610
  var DEFAULT_VALUES = {
3566
3611
  routing: "nest",
3567
3612
  view: "rendu",
@@ -3575,9 +3620,9 @@ var DEFAULT_VALUES = {
3575
3620
  };
3576
3621
  function parseExistingConfig(path) {
3577
3622
  const out = { ...DEFAULT_VALUES };
3578
- if (!existsSync7(path))
3623
+ if (!existsSync8(path))
3579
3624
  return out;
3580
- const src = readFileSync4(path, "utf8");
3625
+ const src = readFileSync5(path, "utf8");
3581
3626
  const grab = (re) => {
3582
3627
  const m = src.match(re);
3583
3628
  return m?.[1];
@@ -3676,12 +3721,12 @@ var configCommand = {
3676
3721
  async run(ctx) {
3677
3722
  const interactive = !flagBool(ctx.flags, "no-interaction", false);
3678
3723
  const force = flagBool(ctx.flags, "force", false);
3679
- const target = resolve22(ctx.cwd, ctx.flags["target"] ?? ".");
3680
- if (!existsSync7(target)) {
3724
+ const target = resolve24(ctx.cwd, ctx.flags["target"] ?? ".");
3725
+ if (!existsSync8(target)) {
3681
3726
  logger.error(`Target directory does not exist: ${target}`);
3682
3727
  return 1;
3683
3728
  }
3684
- const nxConfigPath = resolve22(target, "nx.config.ts");
3729
+ const nxConfigPath = resolve24(target, "nx.config.ts");
3685
3730
  const values = parseExistingConfig(nxConfigPath);
3686
3731
  const flag = (k) => ctx.flags[k];
3687
3732
  const flagBoolStrict = (k, def) => flagBool(ctx.flags, k, def);
@@ -3705,7 +3750,7 @@ var configCommand = {
3705
3750
  if (flagBoolStrict("no-ssr", false))
3706
3751
  values.inertiaSSR = false;
3707
3752
  const anyFlag = Object.values(ctx.flags).some((v) => v !== undefined && v !== false);
3708
- if (interactive && !anyFlag && !existsSync7(nxConfigPath)) {
3753
+ if (interactive && !anyFlag && !existsSync8(nxConfigPath)) {
3709
3754
  values.routing = await select("Routing style", ["nest", "adonis", "functional"], {
3710
3755
  interactive,
3711
3756
  default: values.routing
@@ -3724,7 +3769,7 @@ var configCommand = {
3724
3769
  if (flag("db-url") === undefined && flag("db") !== undefined) {
3725
3770
  values.dbUrl = defaultDbUrl(values.dbDriver);
3726
3771
  }
3727
- const existed = existsSync7(nxConfigPath);
3772
+ const existed = existsSync8(nxConfigPath);
3728
3773
  if (existed && !force) {
3729
3774
  if (anyFlag) {
3730
3775
  writeNxConfig(target, values);
@@ -3736,18 +3781,18 @@ var configCommand = {
3736
3781
  writeNxConfig(target, values);
3737
3782
  logger.info(` + nx.config.ts`);
3738
3783
  }
3739
- const drizzleConfigPath = resolve22(target, "drizzle.config.ts");
3784
+ const drizzleConfigPath = resolve24(target, "drizzle.config.ts");
3740
3785
  if (values.orm === "drizzle") {
3741
3786
  const dialect = driverToDialect(values.dbDriver);
3742
3787
  const dbUrl = values.dbUrl;
3743
- const existedDrizzle = existsSync7(drizzleConfigPath);
3788
+ const existedDrizzle = existsSync8(drizzleConfigPath);
3744
3789
  if (existedDrizzle && !force && !anyFlag) {
3745
3790
  logger.info(` - drizzle.config.ts (unchanged; pass --force or a flag to update)`);
3746
3791
  } else {
3747
3792
  writeDrizzleConfig(target, { dialect, dbUrl });
3748
3793
  logger.info(` ${existedDrizzle ? "~" : "+"} drizzle.config.ts`);
3749
3794
  }
3750
- } else if (existsSync7(drizzleConfigPath)) {
3795
+ } else if (existsSync8(drizzleConfigPath)) {
3751
3796
  logger.info(` - drizzle.config.ts (left as-is; ORM is '${values.orm}', not 'drizzle')`);
3752
3797
  }
3753
3798
  logger.blank();
@@ -3764,29 +3809,43 @@ var configCommand = {
3764
3809
  };
3765
3810
  function writeNxConfig(target, values) {
3766
3811
  const code = render(templates.project["nx.config.ts"], values);
3767
- writeFileSync4(resolve22(target, "nx.config.ts"), code);
3812
+ writeFileSync4(resolve24(target, "nx.config.ts"), code);
3768
3813
  }
3769
3814
  function writeDrizzleConfig(target, values) {
3770
3815
  const code = render(templates.project["drizzle.config.ts"], values);
3771
- writeFileSync4(resolve22(target, "drizzle.config.ts"), code);
3816
+ writeFileSync4(resolve24(target, "drizzle.config.ts"), code);
3772
3817
  }
3773
3818
  var config_default = configCommand;
3774
3819
 
3775
3820
  // packages/cli/src/commands/repl.ts
3776
3821
  import {
3777
- existsSync as existsSync8,
3778
- mkdirSync as mkdirSync5,
3779
- readFileSync as readFileSync5,
3822
+ existsSync as existsSync9,
3823
+ mkdirSync as mkdirSync6,
3824
+ readFileSync as readFileSync6,
3780
3825
  writeFileSync as writeFileSync5
3781
3826
  } from "fs";
3782
- import { dirname as dirname3, resolve as resolve23 } from "path";
3827
+ import { dirname as dirname5, resolve as resolve25 } from "path";
3783
3828
  import * as readline from "readline";
3784
3829
  import * as vm from "vm";
3785
- var BANNER = `
3786
- \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E
3787
- \u2502 NexusTS REPL \u2502
3788
- \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F
3789
- `;
3830
+ var BANNER = (() => {
3831
+ const W = 49;
3832
+ const dash = "\u2500".repeat(W);
3833
+ const ver = `v${VERSION}`;
3834
+ const verLen = ver.length;
3835
+ const TITLE = "NexusTS REPL";
3836
+ const HINT = "Type .help for available commands";
3837
+ const titleGap = " ".repeat(W - 2 - TITLE.length - verLen - 1);
3838
+ const hintGap = " ".repeat(W - 2 - HINT.length);
3839
+ const L = (s) => `\u2502${s}\u2502`;
3840
+ return [
3841
+ `\u256D${dash}\u256E`,
3842
+ L(` ${TITLE}${titleGap}${ver} `),
3843
+ L(" ".repeat(W)),
3844
+ L(` ${HINT}${hintGap}`),
3845
+ `\u2570${dash}\u256F`
3846
+ ].join(`
3847
+ `);
3848
+ })();
3790
3849
  var HELP = `
3791
3850
  Available commands:
3792
3851
  .help Show this help
@@ -3813,11 +3872,11 @@ Examples:
3813
3872
  > app.container.size
3814
3873
  `;
3815
3874
  var PRELOAD = [
3816
- ["db", "../../drizzle/drizzle.service.js", "DrizzleService"],
3817
- ["logger", "../../logger/logger.service.js", "LoggerService"],
3818
- ["cfg", "../../config/config.service.js", "ConfigService"],
3819
- ["cache", "../../cache/cache.service.js", "CacheService"],
3820
- ["events", "../../events/event.service.js", "EventService"]
3875
+ ["db", "@nexusts/drizzle", "DrizzleService"],
3876
+ ["logger", "@nexusts/logger", "Logger"],
3877
+ ["cfg", "@nexusts/config", "ConfigService"],
3878
+ ["cache", "@nexusts/cache", "CacheService"],
3879
+ ["events", "@nexusts/events", "EventService"]
3821
3880
  ];
3822
3881
  var replCommand = {
3823
3882
  name: "repl",
@@ -3847,11 +3906,11 @@ var replCommand = {
3847
3906
  async run(ctx) {
3848
3907
  const mod = ctx.flags["module"];
3849
3908
  const noBoot = Boolean(ctx.flags["no-boot"]);
3850
- const histPath = resolve23(ctx.cwd, ctx.flags["history"] ?? ".nx-repl-history");
3909
+ const histPath = resolve25(ctx.cwd, ctx.flags["history"] ?? ".nx-repl-history");
3851
3910
  const env = { console };
3852
3911
  if (!noBoot) {
3853
- const modPath = resolve23(ctx.cwd, mod ?? "app/app.module.ts");
3854
- if (!existsSync8(modPath)) {
3912
+ const modPath = resolve25(ctx.cwd, mod ?? "app/app.module.ts");
3913
+ if (!existsSync9(modPath)) {
3855
3914
  logger.error(`module not found: ${modPath}`);
3856
3915
  logger.info("pass --module <path> or --no-boot to skip booting");
3857
3916
  return 1;
@@ -3950,20 +4009,33 @@ var replCommand = {
3950
4009
  console.log(" (no modules)");
3951
4010
  } else {
3952
4011
  for (const m of mods) {
3953
- console.log(` ${m.name ?? m.constructor?.name ?? "(anon)"}`);
4012
+ console.log(` ${m.moduleClass?.name ?? "(anon)"}`);
3954
4013
  }
3955
4014
  }
3956
4015
  return true;
3957
4016
  }
3958
4017
  case ".routes": {
3959
4018
  const app = env.app;
3960
- 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
+ });
3961
4029
  if (routes.length === 0) {
3962
4030
  console.log(" (no routes registered)");
3963
4031
  } else {
4032
+ const methodPad = Math.max(...routes.map((r) => r.method.length));
4033
+ const pathPad = Math.max(...routes.map((r) => r.path.length));
3964
4034
  for (const r of routes) {
3965
- const m = (r.method ?? "?").padEnd(7);
3966
- 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}`);
3967
4039
  }
3968
4040
  }
3969
4041
  return true;
@@ -4016,19 +4088,39 @@ async function preloadService(env, app, name, path, className) {
4016
4088
  try {
4017
4089
  const mod = await import(path);
4018
4090
  const ServiceClass = mod[className];
4019
- if (!ServiceClass)
4091
+ if (!ServiceClass) {
4092
+ logger.debug(`repl: ${className} not found in ${path}`);
4020
4093
  return;
4094
+ }
4021
4095
  const Token = ServiceClass.TOKEN ?? ServiceClass[`${className.toUpperCase()}_TOKEN`];
4022
- if (!Token)
4096
+ if (!Token) {
4097
+ logger.debug(`repl: ${className}.TOKEN not found`);
4023
4098
  return;
4099
+ }
4024
4100
  try {
4025
4101
  env[name] = app.container.resolve(Token);
4102
+ logger.debug(`repl: loaded ${name} (${className})`);
4026
4103
  } catch {
4027
4104
  try {
4028
4105
  env[name] = app.container.resolve(ServiceClass);
4029
- } catch {}
4106
+ logger.debug(`repl: loaded ${name} (${className}) via class`);
4107
+ } catch {
4108
+ logger.debug(`repl: ${name} (${className}) not registered in container`);
4109
+ }
4030
4110
  }
4031
- } catch {}
4111
+ } catch {
4112
+ logger.debug(`repl: ${path} not installed \u2014 skipping ${name}`);
4113
+ }
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);
4032
4124
  }
4033
4125
  function listServices(container) {
4034
4126
  if (!container)
@@ -4037,7 +4129,7 @@ function listServices(container) {
4037
4129
  if (typeof c2.listProviders !== "function")
4038
4130
  return [];
4039
4131
  try {
4040
- return c2.listProviders().map((p) => p.token?.toString?.() ?? String(p.token));
4132
+ return c2.listProviders().map((p) => describeToken(p.token));
4041
4133
  } catch {
4042
4134
  return [];
4043
4135
  }
@@ -4121,10 +4213,10 @@ function formatError(e) {
4121
4213
  `) : e.message;
4122
4214
  }
4123
4215
  function loadHistory(path) {
4124
- if (!existsSync8(path))
4216
+ if (!existsSync9(path))
4125
4217
  return [];
4126
4218
  try {
4127
- return readFileSync5(path, "utf-8").split(`
4219
+ return readFileSync6(path, "utf-8").split(`
4128
4220
  `).filter(Boolean);
4129
4221
  } catch {
4130
4222
  return [];
@@ -4132,9 +4224,9 @@ function loadHistory(path) {
4132
4224
  }
4133
4225
  function saveHistoryFile(path, history) {
4134
4226
  try {
4135
- const dir = dirname3(path);
4136
- if (!existsSync8(dir))
4137
- mkdirSync5(dir, { recursive: true });
4227
+ const dir = dirname5(path);
4228
+ if (!existsSync9(dir))
4229
+ mkdirSync6(dir, { recursive: true });
4138
4230
  writeFileSync5(path, history.slice(-1000).join(`
4139
4231
  `));
4140
4232
  } catch {}
@@ -4143,7 +4235,7 @@ var repl_default = replCommand;
4143
4235
 
4144
4236
  // packages/cli/src/commands/route-list.ts
4145
4237
  import { readdirSync, statSync as statSync2 } from "fs";
4146
- import { resolve as resolve24 } from "path";
4238
+ import { resolve as resolve26 } from "path";
4147
4239
  var routeListCommand = {
4148
4240
  name: "route:list",
4149
4241
  aliases: ["routes", "route-list"],
@@ -4153,7 +4245,7 @@ var routeListCommand = {
4153
4245
  { name: "format", description: "Output format: table (default) | json" }
4154
4246
  ],
4155
4247
  async run(ctx) {
4156
- const controllersDir = resolve24(ctx.cwd, ctx.config.paths.controllers);
4248
+ const controllersDir = resolve26(ctx.cwd, ctx.config.paths.controllers);
4157
4249
  try {
4158
4250
  statSync2(controllersDir);
4159
4251
  } catch {
@@ -4167,14 +4259,15 @@ var routeListCommand = {
4167
4259
  }
4168
4260
  const routes = [];
4169
4261
  for (const file of files) {
4170
- const fullPath = resolve24(controllersDir, file);
4262
+ const fullPath = resolve26(controllersDir, file);
4171
4263
  try {
4172
4264
  const mod = await import(`${fullPath}?t=${Date.now()}`);
4173
4265
  for (const exportName of Object.keys(mod)) {
4174
4266
  const cls = mod[exportName];
4175
4267
  if (typeof cls !== "function")
4176
4268
  continue;
4177
- const prefix = Reflect.getMetadata("nexus:controller:prefix", cls) ?? "";
4269
+ const controllerMeta = Reflect.getMetadata("nexus:controller", cls);
4270
+ const prefix = controllerMeta?.prefix ?? "";
4178
4271
  const routeList = Reflect.getMetadata("nexus:routes", cls) ?? [];
4179
4272
  for (const r of routeList) {
4180
4273
  routes.push({
@@ -4236,6 +4329,7 @@ var commands = [
4236
4329
  config_default,
4237
4330
  make_crud_default,
4238
4331
  make_controller_default,
4332
+ make_repository_default,
4239
4333
  make_service_default,
4240
4334
  make_module_default,
4241
4335
  make_model_default,
@@ -4298,7 +4392,7 @@ function renderHelp(commandName) {
4298
4392
  renderCommandHelp(cmd);
4299
4393
  return 0;
4300
4394
  }
4301
- logger.heading("nx \u2014 Nexus CLI");
4395
+ logger.heading("nx \u2014 NexusTS CLI");
4302
4396
  console.log(`
4303
4397
  ${colors.dim("Adonis ACE-style command runner for the NexusTS framework.")}
4304
4398
 
@@ -4367,5 +4461,5 @@ main().then((code) => process.exit(code)).catch((err) => {
4367
4461
  process.exit(1);
4368
4462
  });
4369
4463
 
4370
- //# debugId=46928ABDDF8EB83F64756E2164756E21
4464
+ //# debugId=4E358A646E4C456564756E2164756E21
4371
4465
  //# sourceMappingURL=index.js.map