@avijs/cli 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -6,13 +6,13 @@ The avi command for Avi.js projects.
6
6
  npm install -D @avijs/cli
7
7
  ```
8
8
 
9
- | Command | What it does |
10
- | ------------------------- | --------------------------------------------------------------------------------- |
11
- | `avi new <name>` | Creates a project (`--template modular` or `minimal`). Also `npm create avi` |
12
- | `avi g <kind> <path>` | Adds a `module`, `controller` or `service` and registers it in the nearest module |
13
- | `avi dev` | Compiles, then recompiles and restarts on every change |
14
- | `avi check` | Type-checks every `static inject` list |
15
- | `avi manifest <entry.js>` | Writes the app's modules, providers and routes as JSON |
9
+ | Command | What it does |
10
+ | ------------------------- | -------------------------------------------------------------------------------------- |
11
+ | `avi new <name>` | Creates a project (`--template modular` or `minimal`). Also `npm create avi` |
12
+ | `avi g <kind> <path>` | Adds a `module`, `controller`, `service`, or a whole CRUD `resource`, and registers it |
13
+ | `avi dev` | Compiles, then recompiles and restarts on every change |
14
+ | `avi check` | Type-checks every `static inject` list |
15
+ | `avi manifest <entry.js>` | Writes the app's modules, providers and routes as JSON |
16
16
 
17
17
  Part of [Avi.js](https://github.com/chrischase011/avi-js), a TypeScript framework for Node.js with
18
18
  modules, controllers and dependency injection, without `reflect-metadata`. See the
@@ -1,3 +1,3 @@
1
- export declare const GENERATE_USAGE = " avi generate <module|controller|service> <path> [--root .] [--dry-run]\n Create a module, controller or service and register it. Short: avi g co admin/posts.\n Modular projects get src/modules/<path>/<name>.<kind>.ts, registered in the nearest\n module; minimal projects get src/routes/<path>.ts or src/services/<path>.ts, registered\n in src/app.ts.";
1
+ export declare const GENERATE_USAGE = " avi generate <module|controller|service|resource> <path> [--root .] [--dry-run]\n Create a module, controller or service and register it. Short: avi g co admin/posts.\n Modular projects get src/modules/<path>/<name>.<kind>.ts, registered in the nearest\n module; minimal projects get src/routes/<path>.ts or src/services/<path>.ts, registered\n in src/app.ts. A resource (avi g res posts) creates all of them with CRUD routes.";
2
2
  export declare function generate(args: readonly string[]): Promise<number>;
3
3
  //# sourceMappingURL=generate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,cAAc,yXAIN,CAAC;AAiDtB,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDvE"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,cAAc,qcAI6D,CAAC;AAiDzF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDvE"}
package/dist/generate.js CHANGED
@@ -10,13 +10,15 @@ const KINDS = {
10
10
  co: 'controller',
11
11
  service: 'service',
12
12
  s: 'service',
13
+ resource: 'resource',
14
+ res: 'resource',
13
15
  };
14
16
  const SEGMENT = /^[a-z][a-z0-9-]*$/;
15
- export const GENERATE_USAGE = ` avi generate <module|controller|service> <path> [--root .] [--dry-run]
17
+ export const GENERATE_USAGE = ` avi generate <module|controller|service|resource> <path> [--root .] [--dry-run]
16
18
  Create a module, controller or service and register it. Short: avi g co admin/posts.
17
19
  Modular projects get src/modules/<path>/<name>.<kind>.ts, registered in the nearest
18
20
  module; minimal projects get src/routes/<path>.ts or src/services/<path>.ts, registered
19
- in src/app.ts.`;
21
+ in src/app.ts. A resource (avi g res posts) creates all of them with CRUD routes.`;
20
22
  /** Files to write, keyed by absolute path. Reads fall back to disk. */
21
23
  class Plan {
22
24
  #files = new Map();
@@ -102,6 +104,15 @@ export async function generate(args) {
102
104
  }
103
105
  async function modular(plan, src, kind, dirs, names) {
104
106
  const folder = path.join(src, 'modules', ...dirs, names.file);
107
+ if (kind === 'resource') {
108
+ const module = path.join(folder, `${names.file}.module.ts`);
109
+ plan.create(module, resourceModule(names));
110
+ plan.create(path.join(folder, `${names.file}.service.ts`), crudService(names, true));
111
+ plan.create(path.join(folder, `${names.file}.controller.ts`), crudController(names));
112
+ const parent = nearestModule(plan, src, path.dirname(folder));
113
+ await register(plan, parent, 'imports', `${names.pascal}Module`, module);
114
+ return;
115
+ }
105
116
  const file = path.join(folder, `${names.file}.${kind}.ts`);
106
117
  const className = `${names.pascal}${capitalize(kind)}`;
107
118
  if (kind === 'module') {
@@ -159,6 +170,14 @@ async function minimal(plan, src, kind, dirs, names) {
159
170
  const app = path.join(src, 'app.ts');
160
171
  const service = path.join(src, 'services', ...dirs, `${names.file}.ts`);
161
172
  const serviceClass = `${names.pascal}Service`;
173
+ if (kind === 'resource') {
174
+ const routes = path.join(src, 'routes', ...dirs, `${names.file}.ts`);
175
+ plan.create(service, crudService(names, false));
176
+ plan.create(routes, crudRoutes(names, importPath(routes, service)));
177
+ await register(plan, app, 'providers', serviceClass, service);
178
+ await register(plan, app, 'controllers', `${names.camel}Routes`, routes);
179
+ return;
180
+ }
162
181
  if (kind === 'service') {
163
182
  plan.create(service, `export class ${serviceClass} {
164
183
  findAll(): unknown[] {
@@ -305,4 +324,155 @@ function toNames(file) {
305
324
  function capitalize(value) {
306
325
  return value.charAt(0).toUpperCase() + value.slice(1);
307
326
  }
327
+ /** `posts` → `Post`, `categories` → `Category`; names without a plural `s` stay as they are. */
328
+ function singular(pascal) {
329
+ if (pascal.endsWith('ies'))
330
+ return `${pascal.slice(0, -3)}y`;
331
+ if (pascal.endsWith('s') && !pascal.endsWith('ss'))
332
+ return pascal.slice(0, -1);
333
+ return pascal;
334
+ }
335
+ function resourceModule(names) {
336
+ return `import { Module } from '@avijs/core';
337
+ import { ${names.pascal}Controller } from './${names.file}.controller.js';
338
+ import { ${names.pascal}Service } from './${names.file}.service.js';
339
+
340
+ @Module({ controllers: [${names.pascal}Controller], providers: [${names.pascal}Service] })
341
+ export class ${names.pascal}Module {}
342
+ `;
343
+ }
344
+ function crudService(names, decorated) {
345
+ const item = singular(names.pascal);
346
+ const imports = decorated ? 'HttpError, Injectable' : 'HttpError';
347
+ return `import { ${imports} } from '@avijs/core';
348
+
349
+ export interface ${item} {
350
+ id: number;
351
+ [field: string]: unknown;
352
+ }
353
+
354
+ /** Keeps ${names.file} in memory. Swap the Map for your database; the routes stay the same. */
355
+ ${decorated ? '@Injectable()\n' : ''}export class ${names.pascal}Service {
356
+ readonly #items = new Map<number, ${item}>();
357
+ #nextId = 1;
358
+
359
+ findAll(): ${item}[] {
360
+ return [...this.#items.values()];
361
+ }
362
+
363
+ findOne(id: number): ${item} {
364
+ const item = this.#items.get(id);
365
+ if (!item) throw new HttpError(404, \`${item} \${String(id)} not found\`);
366
+ return item;
367
+ }
368
+
369
+ create(data: Record<string, unknown>): ${item} {
370
+ const item = { ...data, id: this.#nextId++ };
371
+ this.#items.set(item.id, item);
372
+ return item;
373
+ }
374
+
375
+ update(id: number, data: Record<string, unknown>): ${item} {
376
+ const item = { ...this.findOne(id), ...data, id };
377
+ this.#items.set(id, item);
378
+ return item;
379
+ }
380
+
381
+ remove(id: number): void {
382
+ this.findOne(id);
383
+ this.#items.delete(id);
384
+ }
385
+ }
386
+ `;
387
+ }
388
+ // Shared by the generated controller and routes. Replace them with route schemas
389
+ // (see the validation chapter) once the shape of the data is known.
390
+ const INPUT_HELPERS = `function idOf(value: string | undefined): number {
391
+ const id = Number(value);
392
+ if (!Number.isInteger(id)) throw new HttpError(400, 'id must be an integer');
393
+ return id;
394
+ }
395
+
396
+ function bodyOf(value: unknown): Record<string, unknown> {
397
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
398
+ throw new HttpError(400, 'Expected a JSON object');
399
+ }
400
+ return value as Record<string, unknown>;
401
+ }`;
402
+ function crudController(names) {
403
+ const service = `${names.pascal}Service`;
404
+ const field = names.camel;
405
+ return `import { Controller, Delete, Get, HttpError, Patch, Post, reply, type Context } from '@avijs/core';
406
+ import { ${service} } from './${names.file}.service.js';
407
+
408
+ ${INPUT_HELPERS}
409
+
410
+ @Controller('/${names.file}')
411
+ export class ${names.pascal}Controller {
412
+ static inject = [${service}] as const;
413
+
414
+ constructor(private readonly ${field}: ${service}) {}
415
+
416
+ @Get()
417
+ findAll() {
418
+ return this.${field}.findAll();
419
+ }
420
+
421
+ @Get('/:id')
422
+ findOne(ctx: Context) {
423
+ return this.${field}.findOne(idOf(ctx.params['id']));
424
+ }
425
+
426
+ @Post()
427
+ async create(ctx: Context) {
428
+ return reply(this.${field}.create(bodyOf(await ctx.json())), { status: 201 });
429
+ }
430
+
431
+ @Patch('/:id')
432
+ async update(ctx: Context) {
433
+ return this.${field}.update(idOf(ctx.params['id']), bodyOf(await ctx.json()));
434
+ }
435
+
436
+ @Delete('/:id')
437
+ remove(ctx: Context) {
438
+ this.${field}.remove(idOf(ctx.params['id']));
439
+ }
440
+ }
441
+ `;
442
+ }
443
+ function crudRoutes(names, serviceImport) {
444
+ const service = `${names.pascal}Service`;
445
+ const field = names.camel;
446
+ return `import { HttpError, defineController, reply, route } from '@avijs/core';
447
+ import { ${service} } from '${serviceImport}';
448
+
449
+ ${INPUT_HELPERS}
450
+
451
+ export const ${field}Routes = defineController({
452
+ prefix: '/${names.file}',
453
+ inject: [${service}],
454
+ routes: (${field}) => [
455
+ route({ method: 'GET', path: '/', handler: () => ${field}.findAll() }),
456
+ route({ method: 'GET', path: '/:id', handler: (ctx) => ${field}.findOne(idOf(ctx.params.id)) }),
457
+ route({
458
+ method: 'POST',
459
+ path: '/',
460
+ handler: async (ctx) => reply(${field}.create(bodyOf(await ctx.json())), { status: 201 }),
461
+ }),
462
+ route({
463
+ method: 'PATCH',
464
+ path: '/:id',
465
+ handler: async (ctx) => ${field}.update(idOf(ctx.params.id), bodyOf(await ctx.json())),
466
+ }),
467
+ route({
468
+ method: 'DELETE',
469
+ path: '/:id',
470
+ handler: (ctx) => {
471
+ ${field}.remove(idOf(ctx.params.id));
472
+ },
473
+ }),
474
+ ],
475
+ });
476
+ `;
477
+ }
308
478
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avijs/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "The avi command: project scaffolding, dev mode and build checks.",
5
5
  "keywords": [
6
6
  "avi",
@@ -10,7 +10,7 @@
10
10
  ],
11
11
  "license": "MIT",
12
12
  "author": "Christopher Robin Chase",
13
- "homepage": "https://github.com/chrischase011/avi-js#readme",
13
+ "homepage": "https://chrischase011.github.io/avi-js/",
14
14
  "bugs": {
15
15
  "url": "https://github.com/chrischase011/avi-js/issues"
16
16
  },
@@ -44,7 +44,7 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
- "@avijs/compiler": "0.1.1"
47
+ "@avijs/compiler": "0.1.2"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "typescript": ">=5.8"
package/src/generate.ts CHANGED
@@ -4,7 +4,7 @@ import path from 'node:path';
4
4
  import { parseArgs } from 'node:util';
5
5
  import ts from 'typescript';
6
6
 
7
- type Kind = 'module' | 'controller' | 'service';
7
+ type Kind = 'module' | 'controller' | 'service' | 'resource';
8
8
  type Layout = 'modular' | 'minimal';
9
9
 
10
10
  const KINDS: Record<string, Kind> = {
@@ -14,14 +14,16 @@ const KINDS: Record<string, Kind> = {
14
14
  co: 'controller',
15
15
  service: 'service',
16
16
  s: 'service',
17
+ resource: 'resource',
18
+ res: 'resource',
17
19
  };
18
20
  const SEGMENT = /^[a-z][a-z0-9-]*$/;
19
21
 
20
- export const GENERATE_USAGE = ` avi generate <module|controller|service> <path> [--root .] [--dry-run]
22
+ export const GENERATE_USAGE = ` avi generate <module|controller|service|resource> <path> [--root .] [--dry-run]
21
23
  Create a module, controller or service and register it. Short: avi g co admin/posts.
22
24
  Modular projects get src/modules/<path>/<name>.<kind>.ts, registered in the nearest
23
25
  module; minimal projects get src/routes/<path>.ts or src/services/<path>.ts, registered
24
- in src/app.ts.`;
26
+ in src/app.ts. A resource (avi g res posts) creates all of them with CRUD routes.`;
25
27
 
26
28
  interface Names {
27
29
  /** kebab-case file name, e.g. `user-profile`. */
@@ -131,6 +133,17 @@ async function modular(
131
133
  names: Names,
132
134
  ): Promise<void> {
133
135
  const folder = path.join(src, 'modules', ...dirs, names.file);
136
+
137
+ if (kind === 'resource') {
138
+ const module = path.join(folder, `${names.file}.module.ts`);
139
+ plan.create(module, resourceModule(names));
140
+ plan.create(path.join(folder, `${names.file}.service.ts`), crudService(names, true));
141
+ plan.create(path.join(folder, `${names.file}.controller.ts`), crudController(names));
142
+ const parent = nearestModule(plan, src, path.dirname(folder));
143
+ await register(plan, parent, 'imports', `${names.pascal}Module`, module);
144
+ return;
145
+ }
146
+
134
147
  const file = path.join(folder, `${names.file}.${kind}.ts`);
135
148
  const className = `${names.pascal}${capitalize(kind)}`;
136
149
 
@@ -216,6 +229,15 @@ async function minimal(
216
229
  const service = path.join(src, 'services', ...dirs, `${names.file}.ts`);
217
230
  const serviceClass = `${names.pascal}Service`;
218
231
 
232
+ if (kind === 'resource') {
233
+ const routes = path.join(src, 'routes', ...dirs, `${names.file}.ts`);
234
+ plan.create(service, crudService(names, false));
235
+ plan.create(routes, crudRoutes(names, importPath(routes, service)));
236
+ await register(plan, app, 'providers', serviceClass, service);
237
+ await register(plan, app, 'controllers', `${names.camel}Routes`, routes);
238
+ return;
239
+ }
240
+
219
241
  if (kind === 'service') {
220
242
  plan.create(
221
243
  service,
@@ -392,3 +414,158 @@ function toNames(file: string): Names {
392
414
  function capitalize(value: string): string {
393
415
  return value.charAt(0).toUpperCase() + value.slice(1);
394
416
  }
417
+
418
+ /** `posts` → `Post`, `categories` → `Category`; names without a plural `s` stay as they are. */
419
+ function singular(pascal: string): string {
420
+ if (pascal.endsWith('ies')) return `${pascal.slice(0, -3)}y`;
421
+ if (pascal.endsWith('s') && !pascal.endsWith('ss')) return pascal.slice(0, -1);
422
+ return pascal;
423
+ }
424
+
425
+ function resourceModule(names: Names): string {
426
+ return `import { Module } from '@avijs/core';
427
+ import { ${names.pascal}Controller } from './${names.file}.controller.js';
428
+ import { ${names.pascal}Service } from './${names.file}.service.js';
429
+
430
+ @Module({ controllers: [${names.pascal}Controller], providers: [${names.pascal}Service] })
431
+ export class ${names.pascal}Module {}
432
+ `;
433
+ }
434
+
435
+ function crudService(names: Names, decorated: boolean): string {
436
+ const item = singular(names.pascal);
437
+ const imports = decorated ? 'HttpError, Injectable' : 'HttpError';
438
+ return `import { ${imports} } from '@avijs/core';
439
+
440
+ export interface ${item} {
441
+ id: number;
442
+ [field: string]: unknown;
443
+ }
444
+
445
+ /** Keeps ${names.file} in memory. Swap the Map for your database; the routes stay the same. */
446
+ ${decorated ? '@Injectable()\n' : ''}export class ${names.pascal}Service {
447
+ readonly #items = new Map<number, ${item}>();
448
+ #nextId = 1;
449
+
450
+ findAll(): ${item}[] {
451
+ return [...this.#items.values()];
452
+ }
453
+
454
+ findOne(id: number): ${item} {
455
+ const item = this.#items.get(id);
456
+ if (!item) throw new HttpError(404, \`${item} \${String(id)} not found\`);
457
+ return item;
458
+ }
459
+
460
+ create(data: Record<string, unknown>): ${item} {
461
+ const item = { ...data, id: this.#nextId++ };
462
+ this.#items.set(item.id, item);
463
+ return item;
464
+ }
465
+
466
+ update(id: number, data: Record<string, unknown>): ${item} {
467
+ const item = { ...this.findOne(id), ...data, id };
468
+ this.#items.set(id, item);
469
+ return item;
470
+ }
471
+
472
+ remove(id: number): void {
473
+ this.findOne(id);
474
+ this.#items.delete(id);
475
+ }
476
+ }
477
+ `;
478
+ }
479
+
480
+ // Shared by the generated controller and routes. Replace them with route schemas
481
+ // (see the validation chapter) once the shape of the data is known.
482
+ const INPUT_HELPERS = `function idOf(value: string | undefined): number {
483
+ const id = Number(value);
484
+ if (!Number.isInteger(id)) throw new HttpError(400, 'id must be an integer');
485
+ return id;
486
+ }
487
+
488
+ function bodyOf(value: unknown): Record<string, unknown> {
489
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
490
+ throw new HttpError(400, 'Expected a JSON object');
491
+ }
492
+ return value as Record<string, unknown>;
493
+ }`;
494
+
495
+ function crudController(names: Names): string {
496
+ const service = `${names.pascal}Service`;
497
+ const field = names.camel;
498
+ return `import { Controller, Delete, Get, HttpError, Patch, Post, reply, type Context } from '@avijs/core';
499
+ import { ${service} } from './${names.file}.service.js';
500
+
501
+ ${INPUT_HELPERS}
502
+
503
+ @Controller('/${names.file}')
504
+ export class ${names.pascal}Controller {
505
+ static inject = [${service}] as const;
506
+
507
+ constructor(private readonly ${field}: ${service}) {}
508
+
509
+ @Get()
510
+ findAll() {
511
+ return this.${field}.findAll();
512
+ }
513
+
514
+ @Get('/:id')
515
+ findOne(ctx: Context) {
516
+ return this.${field}.findOne(idOf(ctx.params['id']));
517
+ }
518
+
519
+ @Post()
520
+ async create(ctx: Context) {
521
+ return reply(this.${field}.create(bodyOf(await ctx.json())), { status: 201 });
522
+ }
523
+
524
+ @Patch('/:id')
525
+ async update(ctx: Context) {
526
+ return this.${field}.update(idOf(ctx.params['id']), bodyOf(await ctx.json()));
527
+ }
528
+
529
+ @Delete('/:id')
530
+ remove(ctx: Context) {
531
+ this.${field}.remove(idOf(ctx.params['id']));
532
+ }
533
+ }
534
+ `;
535
+ }
536
+
537
+ function crudRoutes(names: Names, serviceImport: string): string {
538
+ const service = `${names.pascal}Service`;
539
+ const field = names.camel;
540
+ return `import { HttpError, defineController, reply, route } from '@avijs/core';
541
+ import { ${service} } from '${serviceImport}';
542
+
543
+ ${INPUT_HELPERS}
544
+
545
+ export const ${field}Routes = defineController({
546
+ prefix: '/${names.file}',
547
+ inject: [${service}],
548
+ routes: (${field}) => [
549
+ route({ method: 'GET', path: '/', handler: () => ${field}.findAll() }),
550
+ route({ method: 'GET', path: '/:id', handler: (ctx) => ${field}.findOne(idOf(ctx.params.id)) }),
551
+ route({
552
+ method: 'POST',
553
+ path: '/',
554
+ handler: async (ctx) => reply(${field}.create(bodyOf(await ctx.json())), { status: 201 }),
555
+ }),
556
+ route({
557
+ method: 'PATCH',
558
+ path: '/:id',
559
+ handler: async (ctx) => ${field}.update(idOf(ctx.params.id), bodyOf(await ctx.json())),
560
+ }),
561
+ route({
562
+ method: 'DELETE',
563
+ path: '/:id',
564
+ handler: (ctx) => {
565
+ ${field}.remove(idOf(ctx.params.id));
566
+ },
567
+ }),
568
+ ],
569
+ });
570
+ `;
571
+ }