@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/commands/make-repository.d.ts +6 -0
- package/dist/commands/repl.d.ts +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/version.d.ts +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +255 -161
- package/dist/index.js.map +17 -15
- package/dist/templates/project/nx.config.d.ts +1 -1
- package/package.json +2 -2
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
|
|
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("
|
|
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(` ${
|
|
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
|
|
556
|
-
import { resolve as
|
|
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
|
-
*
|
|
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 =
|
|
1185
|
-
if (!
|
|
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(
|
|
1229
|
-
mkdirSync2(
|
|
1246
|
+
mkdirSync2(resolve5(target, "app/controllers"), { recursive: true });
|
|
1247
|
+
mkdirSync2(resolve5(target, "public"), { recursive: true });
|
|
1230
1248
|
if (view !== "none") {
|
|
1231
|
-
mkdirSync2(
|
|
1249
|
+
mkdirSync2(resolve5(target, "resources/views"), { recursive: true });
|
|
1232
1250
|
}
|
|
1233
1251
|
for (const entry of plan) {
|
|
1234
|
-
const abs =
|
|
1235
|
-
const exists =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
2020
|
-
mkdirSync3(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
2910
|
-
import { resolve as
|
|
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"] ??
|
|
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"] ??
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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 (!
|
|
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 =
|
|
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
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
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
|
|
3154
|
+
import { existsSync as existsSync6 } from "fs";
|
|
3100
3155
|
import { mkdir, readdir, writeFile as writeFile2, unlink } from "fs/promises";
|
|
3101
|
-
import { resolve as
|
|
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 =
|
|
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 (!
|
|
3225
|
+
if (!existsSync6(folder)) {
|
|
3171
3226
|
logger.info(`creating empty seeds folder at ${folder}`);
|
|
3172
3227
|
await mkdir(folder, { recursive: true });
|
|
3173
|
-
await writeFile2(
|
|
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(
|
|
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 '
|
|
3204
|
-
import {
|
|
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 =
|
|
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 =
|
|
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 (!
|
|
3324
|
+
if (!existsSync6(folder))
|
|
3269
3325
|
await mkdir(folder, { recursive: true });
|
|
3270
3326
|
let candidate = `${name}.ts`;
|
|
3271
3327
|
let i = 1;
|
|
3272
|
-
while (
|
|
3328
|
+
while (existsSync6(resolve22(folder, candidate))) {
|
|
3273
3329
|
candidate = `${name}_${i}.ts`;
|
|
3274
3330
|
i++;
|
|
3275
3331
|
}
|
|
3276
|
-
const path =
|
|
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
|
|
3301
|
-
import { resolve as
|
|
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
|
|
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 =
|
|
3337
|
-
if (
|
|
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
|
-
|
|
3407
|
+
mkdirSync5(resolve23(target, "app"), { recursive: true });
|
|
3363
3408
|
if (view !== "none") {
|
|
3364
|
-
|
|
3409
|
+
mkdirSync5(resolve23(target, "resources/views"), { recursive: true });
|
|
3365
3410
|
}
|
|
3366
|
-
|
|
3367
|
-
writeFileSync3(
|
|
3411
|
+
mkdirSync5(resolve23(target, "public"), { recursive: true });
|
|
3412
|
+
writeFileSync3(resolve23(target, "public/.gitkeep"), "");
|
|
3368
3413
|
if (view !== "none") {
|
|
3369
|
-
writeFileSync3(
|
|
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(
|
|
3375
|
-
writeFileSync3(
|
|
3376
|
-
writeFileSync3(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
3527
|
+
writeFileSync3(resolve23(target, "README.md"), `# ${name}
|
|
3483
3528
|
|
|
3484
|
-
A new
|
|
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
|
|
3564
|
-
import { resolve as
|
|
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 (!
|
|
3623
|
+
if (!existsSync8(path))
|
|
3579
3624
|
return out;
|
|
3580
|
-
const src =
|
|
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 =
|
|
3680
|
-
if (!
|
|
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 =
|
|
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 && !
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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(
|
|
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(
|
|
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
|
|
3778
|
-
mkdirSync as
|
|
3779
|
-
readFileSync as
|
|
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
|
|
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
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
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", "
|
|
3817
|
-
["logger", "
|
|
3818
|
-
["cfg", "
|
|
3819
|
-
["cache", "
|
|
3820
|
-
["events", "
|
|
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 =
|
|
3909
|
+
const histPath = resolve25(ctx.cwd, ctx.flags["history"] ?? ".nx-repl-history");
|
|
3851
3910
|
const env = { console };
|
|
3852
3911
|
if (!noBoot) {
|
|
3853
|
-
const modPath =
|
|
3854
|
-
if (!
|
|
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.
|
|
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
|
|
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 =
|
|
3966
|
-
|
|
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
|
-
|
|
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) =>
|
|
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 (!
|
|
4216
|
+
if (!existsSync9(path))
|
|
4125
4217
|
return [];
|
|
4126
4218
|
try {
|
|
4127
|
-
return
|
|
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 =
|
|
4136
|
-
if (!
|
|
4137
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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=
|
|
4464
|
+
//# debugId=4E358A646E4C456564756E2164756E21
|
|
4371
4465
|
//# sourceMappingURL=index.js.map
|