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