arri 0.31.0 → 0.32.1

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/cli.cjs CHANGED
@@ -7,18 +7,19 @@ const fs = require('node:fs');
7
7
  const fs$1 = require('node:fs/promises');
8
8
  const arriCodegenUtils = require('arri-codegen-utils');
9
9
  const c12 = require('c12');
10
- const consola = require('consola');
11
10
  const esbuild = require('esbuild');
12
11
  const esbuildPluginReplace = require('esbuild-plugin-replace');
13
12
  const path = require('pathe');
14
13
  const prettier = require('prettier');
15
- const config = require('./shared/arri.7b317e03.cjs');
14
+ const config = require('./shared/arri.7b5179bf.cjs');
15
+ const consola = require('consola');
16
16
  const globby = require('globby');
17
17
  const scule = require('scule');
18
18
  const ofetch = require('ofetch');
19
19
  const listhen = require('@joshmossas/listhen');
20
20
  const chokidar = require('chokidar');
21
21
  const Degit = require('degit');
22
+ const enquirer = require('enquirer');
22
23
  require('h3');
23
24
  require('arri-validate');
24
25
  require('h3-sse');
@@ -39,13 +40,14 @@ function _interopNamespaceCompat(e) {
39
40
 
40
41
  const fs__default$1 = /*#__PURE__*/_interopDefaultCompat(fs);
41
42
  const fs__default = /*#__PURE__*/_interopDefaultCompat(fs$1);
42
- const consola__default = /*#__PURE__*/_interopDefaultCompat(consola);
43
43
  const esbuild__namespace = /*#__PURE__*/_interopNamespaceCompat(esbuild);
44
44
  const path__default = /*#__PURE__*/_interopDefaultCompat(path);
45
45
  const prettier__default = /*#__PURE__*/_interopDefaultCompat(prettier);
46
46
  const chokidar__default = /*#__PURE__*/_interopDefaultCompat(chokidar);
47
47
  const Degit__default = /*#__PURE__*/_interopDefaultCompat(Degit);
48
+ const enquirer__default = /*#__PURE__*/_interopDefaultCompat(enquirer);
48
49
 
50
+ const logger = consola.createConsola().withTag("arri");
49
51
  const GEN_APP_FILE = "__arri_app.js";
50
52
  const GEN_SERVER_ENTRY_FILE = "__arri_server.js";
51
53
  const OUT_APP_FILE = "app.mjs";
@@ -205,9 +207,13 @@ const build = citty.defineCommand({
205
207
  await startBuild(config$1, args.skipCodegen);
206
208
  }
207
209
  });
208
- const logger$2 = consola.createConsola().withTag("arri");
209
210
  async function startBuild(config, skipCodeGen = false) {
210
- logger$2.log("Bundling server....");
211
+ logger.log("Bundling server....");
212
+ const appEntry = path__default.resolve(config.rootDir, config.srcDir, config.entry);
213
+ if (!fs.existsSync(path__default.resolve(config.rootDir, config.srcDir, config.entry))) {
214
+ logger.error(`Unabled to find entry at ${appEntry}`);
215
+ process.exit(1);
216
+ }
211
217
  await setupWorkingDir(config);
212
218
  await Promise.all([
213
219
  createAppWithRoutesModule(config),
@@ -216,11 +222,11 @@ async function startBuild(config, skipCodeGen = false) {
216
222
  transpileFiles(config)
217
223
  ]);
218
224
  await bundleAppEntry(config);
219
- logger$2.log("Finished bundling");
220
- const clientCount = config.clientGenerators.length;
225
+ logger.log("Finished bundling");
226
+ const clientCount = config.generators.length;
221
227
  const codegenModule = path__default.resolve(config.rootDir, ".output", OUT_CODEGEN);
222
228
  if (!skipCodeGen) {
223
- logger$2.log("Generating Arri app definition (__definition.json)");
229
+ logger.log("Generating Arri app definition (__definition.json)");
224
230
  node_child_process.execSync(`node ${codegenModule}`, { env: process.env });
225
231
  const defJson = path__default.resolve(
226
232
  config.rootDir,
@@ -229,22 +235,22 @@ async function startBuild(config, skipCodeGen = false) {
229
235
  );
230
236
  const def = JSON.parse(fs.readFileSync(defJson, { encoding: "utf-8" }));
231
237
  if (arriCodegenUtils.isAppDefinition(def) && clientCount > 0) {
232
- logger$2.log(`Generating ${clientCount} clients`);
238
+ logger.log(`Generating ${clientCount} clients`);
233
239
  await Promise.all(
234
- config.clientGenerators.map((plugin) => plugin.generator(def))
240
+ config.generators.map((plugin) => plugin.generator(def))
235
241
  );
236
- logger$2.log(`${clientCount} clients generated`);
242
+ logger.log(`${clientCount} clients generated`);
237
243
  } else {
238
- logger$2.warn(
244
+ logger.warn(
239
245
  "No client generators specified. Skipping client codegen."
240
246
  );
241
247
  }
242
248
  } else {
243
- logger$2.log("Skipping codegen");
249
+ logger.log("Skipping codegen");
244
250
  }
245
- logger$2.log("Cleaning up files");
251
+ logger.log("Cleaning up files");
246
252
  await fs__default.rm(codegenModule);
247
- logger$2.success(
253
+ logger.success(
248
254
  `Build finished! You can start your server by running "node .output/${OUT_SERVER_ENTRY}"`
249
255
  );
250
256
  }
@@ -403,13 +409,17 @@ const codegen = citty.defineCommand({
403
409
  }
404
410
  const configPath = path__default.resolve(args.config);
405
411
  const { config: config$1 } = await c12.loadConfig({ configFile: configPath });
406
- if (!config.isResolvedArriConfig(config$1)) {
412
+ if (!config.isArriConfig(config$1)) {
407
413
  throw new Error(`Invalid arri config at ${args.config}`);
408
414
  }
409
- consola__default.info(`Generating ${config$1.clientGenerators.length} clients`);
415
+ if (!config$1.generators?.length) {
416
+ logger.warn(`No generators specified in ${args.config}`);
417
+ process.exit(1);
418
+ }
419
+ logger.info(`Generating ${config$1.generators?.length} client(s)`);
410
420
  await Promise.allSettled(
411
421
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
412
- config$1.clientGenerators.map(
422
+ config$1.generators.map(
413
423
  (gen) => gen.generator(
414
424
  def ?? {
415
425
  arriSchemaVersion: "0.0.4",
@@ -419,10 +429,10 @@ const codegen = citty.defineCommand({
419
429
  )
420
430
  )
421
431
  );
432
+ process.exit(0);
422
433
  }
423
434
  });
424
435
 
425
- const logger$1 = consola.createConsola().withTag("arri");
426
436
  const dev = citty.defineCommand({
427
437
  meta: {
428
438
  name: "dev",
@@ -444,13 +454,21 @@ const dev = citty.defineCommand({
444
454
  if (!config.isResolvedArriConfig(config$1)) {
445
455
  throw new Error("Unable to find config");
446
456
  }
457
+ const appEntry = path__default.resolve(
458
+ config$1.rootDir,
459
+ config$1.srcDir,
460
+ config$1.entry
461
+ );
462
+ if (!fs.existsSync(appEntry)) {
463
+ throw new Error(`Unable to find entry at ${appEntry}`);
464
+ }
447
465
  await startDevServer(config$1);
448
466
  }
449
467
  });
450
468
  const startListener = (config, showQr = false) => listhen.listenAndWatch(path__default.resolve(config.rootDir, ".output", OUT_SERVER_ENTRY), {
451
469
  public: true,
452
470
  port: config.port,
453
- logger: logger$1,
471
+ logger,
454
472
  qr: showQr,
455
473
  https: config.https,
456
474
  http2: config.http2
@@ -525,17 +543,17 @@ async function startDevServer(config) {
525
543
  await createAppWithRoutesModule(config);
526
544
  let bundleCreated = false;
527
545
  try {
528
- logger$1.log(
546
+ logger.log(
529
547
  "Change detected. Bundling files and restarting server...."
530
548
  );
531
549
  await transpileFiles(config);
532
550
  await bundleFiles.rebuild();
533
551
  bundleCreated = true;
534
552
  } catch (err) {
535
- logger$1.error("ERROR", err);
553
+ logger.error("ERROR", err);
536
554
  bundleCreated = false;
537
555
  }
538
- if (bundleCreated && config.clientGenerators.length) {
556
+ if (bundleCreated && config.generators.length) {
539
557
  setTimeout(async () => {
540
558
  await generateClients(config);
541
559
  bundleCreated = false;
@@ -559,14 +577,14 @@ async function generateClients(config$1) {
559
577
  if (!arriCodegenUtils.isAppDefinition(result)) {
560
578
  return;
561
579
  }
562
- logger$1.log(`Generating client code...`);
563
- const clientCount = config$1.clientGenerators.length;
580
+ logger.log(`Generating client code...`);
581
+ const clientCount = config$1.generators.length;
564
582
  await Promise.all(
565
- config$1.clientGenerators.map(
566
- (generator) => generator.generator(result)
583
+ config$1.generators.map(
584
+ (generator) => generator.generator(result, true)
567
585
  )
568
586
  );
569
- logger$1.success(
587
+ logger.success(
570
588
  `Generated ${clientCount} client${clientCount === 1 ? "" : "s"}`
571
589
  );
572
590
  } catch (err) {
@@ -587,7 +605,6 @@ export default app.h3App;`;
587
605
  );
588
606
  }
589
607
 
590
- const logger = consola.createConsola();
591
608
  const init = citty.defineCommand({
592
609
  meta: {
593
610
  name: "Init",
@@ -604,9 +621,44 @@ const init = citty.defineCommand({
604
621
  default: false,
605
622
  alias: "f",
606
623
  description: "Force created a project when if a directory already exists"
624
+ },
625
+ type: {
626
+ type: "string",
627
+ description: `"app" | "plugin"`
607
628
  }
608
629
  },
609
630
  async run(context) {
631
+ let type;
632
+ switch (context.args.type?.toLowerCase()) {
633
+ case "app":
634
+ type = "app";
635
+ break;
636
+ case "plugin":
637
+ type = "plugin";
638
+ break;
639
+ }
640
+ if (!type) {
641
+ const { projectType } = await enquirer__default.prompt([
642
+ {
643
+ type: "select",
644
+ name: "projectType",
645
+ message: "What kind of project do you want to initialize?",
646
+ choices: ["application", "generator plugin"]
647
+ }
648
+ ]);
649
+ switch (projectType) {
650
+ case "application":
651
+ type = "app";
652
+ break;
653
+ case "generator plugin":
654
+ type = "plugin";
655
+ break;
656
+ default:
657
+ throw new Error(
658
+ `Unknown project type "${projectType}"`
659
+ );
660
+ }
661
+ }
610
662
  const dir = path__default.resolve(context.args.dir);
611
663
  if (!fs__default$1.existsSync(dir)) {
612
664
  fs__default$1.mkdirSync(dir);
@@ -618,42 +670,71 @@ const init = citty.defineCommand({
618
670
  );
619
671
  process.exit(1);
620
672
  }
621
- const degit = Degit__default("https://github.com/modiimedia/arri-starters", {
622
- force: context.args.force
623
- });
624
- await degit.clone(dir);
625
- fs.rmSync(path__default.resolve(dir, "pnpm-lock.yaml"));
626
- const packageJson = JSON.parse(
627
- fs.readFileSync(path__default.resolve(dir, "package.json"), {
628
- encoding: "utf-8"
629
- })
630
- );
631
- packageJson.name = scule.kebabCase(context.args.dir);
632
- packageJson.description = "An RPC server created with Arri RPC";
633
- packageJson.private = true;
634
- delete packageJson.license;
635
- delete packageJson.main;
636
- delete packageJson.author;
637
- delete packageJson.tags;
638
- fs.writeFileSync(
639
- path__default.resolve(dir, "package.json"),
640
- await prettier__default.format(JSON.stringify(packageJson), {
641
- parser: "json",
642
- tabWidth: 4,
643
- semi: true,
644
- endOfLine: "lf",
645
- trailingComma: "all"
646
- })
647
- );
648
- consola__default.log(
649
- `Project initialized in ${context.args.dir}. To get started:
650
- cd ${context.args.dir}
651
- npm install
652
- npm run dev`
653
- );
673
+ switch (type) {
674
+ case "app":
675
+ await initApp(context.args.dir, context.args.force);
676
+ break;
677
+ case "plugin":
678
+ await initPlugin(context.args.dir, context.args.force);
679
+ break;
680
+ default:
681
+ logger.error(`Unknown app type: '${type}'"`);
682
+ break;
683
+ }
654
684
  process.exit(0);
655
685
  }
656
686
  });
687
+ async function initApp(dir, force) {
688
+ const degit = Degit__default("modiimedia/arri-starters/app-starter-ts", {
689
+ force
690
+ });
691
+ await degit.clone(dir);
692
+ fs.rmSync(path__default.resolve(dir, "pnpm-lock.yaml"));
693
+ const packageJson = JSON.parse(
694
+ fs.readFileSync(path__default.resolve(dir, "package.json"), {
695
+ encoding: "utf-8"
696
+ })
697
+ );
698
+ packageJson.name = scule.kebabCase(dir);
699
+ packageJson.description = "An RPC server created with Arri RPC";
700
+ packageJson.private = true;
701
+ delete packageJson.license;
702
+ delete packageJson.main;
703
+ delete packageJson.author;
704
+ delete packageJson.tags;
705
+ fs.writeFileSync(
706
+ path__default.resolve(dir, "package.json"),
707
+ await prettier__default.format(JSON.stringify(packageJson), {
708
+ parser: "json",
709
+ tabWidth: 4,
710
+ semi: true,
711
+ endOfLine: "lf",
712
+ trailingComma: "all"
713
+ })
714
+ );
715
+ logger.success(`Project initialized in ${dir}!`);
716
+ logger.info(`To get started:
717
+ - cd ${dir}
718
+ - pnpm install
719
+ - pnpm run dev`);
720
+ }
721
+ async function initPlugin(dir, force) {
722
+ const name = scule.kebabCase(dir);
723
+ const degit = Degit__default("modiimedia/arri-starters/generator-starter", {
724
+ force
725
+ });
726
+ await degit.clone(dir);
727
+ fs.rmSync(path__default.resolve(dir, "pnpm-lock.yaml"));
728
+ let packageJson = fs.readFileSync(path__default.resolve(dir, "package.json"), {
729
+ encoding: "utf8"
730
+ });
731
+ packageJson = packageJson.replace(`"arri-generator-name"`, `"${name}"`);
732
+ fs.writeFileSync(path__default.resolve(dir, "package.json"), packageJson);
733
+ logger.success(`Project initialized in ${dir}!`);
734
+ logger.info(`To get started:
735
+ - cd ${dir}
736
+ - pnpm install`);
737
+ }
657
738
 
658
739
  const main = citty.defineCommand({
659
740
  subCommands: {
package/dist/cli.mjs CHANGED
@@ -5,23 +5,25 @@ import fs$1, { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
5
5
  import fs from 'node:fs/promises';
6
6
  import { removeDisallowedChars, isAppDefinition } from 'arri-codegen-utils';
7
7
  import { loadConfig } from 'c12';
8
- import consola, { createConsola } from 'consola';
9
8
  import * as esbuild from 'esbuild';
10
9
  import { build as build$1 } from 'esbuild';
11
10
  import { replace } from 'esbuild-plugin-replace';
12
11
  import path from 'pathe';
13
12
  import prettier from 'prettier';
14
- import { o as defaultConfig, n as isResolvedArriConfig, a as DEV_DEFINITION_ENDPOINT } from './shared/arri.e9a56e75.mjs';
13
+ import { o as defaultConfig, m as isArriConfig, n as isResolvedArriConfig, a as DEV_DEFINITION_ENDPOINT } from './shared/arri.bbe2aa44.mjs';
14
+ import { createConsola } from 'consola';
15
15
  import { globby } from 'globby';
16
16
  import { camelCase, kebabCase } from 'scule';
17
17
  import { ofetch } from 'ofetch';
18
18
  import { listenAndWatch } from '@joshmossas/listhen';
19
19
  import chokidar from 'chokidar';
20
20
  import Degit from 'degit';
21
+ import enquirer from 'enquirer';
21
22
  import 'h3';
22
23
  import 'arri-validate';
23
24
  import 'h3-sse';
24
25
 
26
+ const logger = createConsola().withTag("arri");
25
27
  const GEN_APP_FILE = "__arri_app.js";
26
28
  const GEN_SERVER_ENTRY_FILE = "__arri_server.js";
27
29
  const OUT_APP_FILE = "app.mjs";
@@ -181,9 +183,13 @@ const build = defineCommand({
181
183
  await startBuild(config, args.skipCodegen);
182
184
  }
183
185
  });
184
- const logger$2 = createConsola().withTag("arri");
185
186
  async function startBuild(config, skipCodeGen = false) {
186
- logger$2.log("Bundling server....");
187
+ logger.log("Bundling server....");
188
+ const appEntry = path.resolve(config.rootDir, config.srcDir, config.entry);
189
+ if (!existsSync(path.resolve(config.rootDir, config.srcDir, config.entry))) {
190
+ logger.error(`Unabled to find entry at ${appEntry}`);
191
+ process.exit(1);
192
+ }
187
193
  await setupWorkingDir(config);
188
194
  await Promise.all([
189
195
  createAppWithRoutesModule(config),
@@ -192,11 +198,11 @@ async function startBuild(config, skipCodeGen = false) {
192
198
  transpileFiles(config)
193
199
  ]);
194
200
  await bundleAppEntry(config);
195
- logger$2.log("Finished bundling");
196
- const clientCount = config.clientGenerators.length;
201
+ logger.log("Finished bundling");
202
+ const clientCount = config.generators.length;
197
203
  const codegenModule = path.resolve(config.rootDir, ".output", OUT_CODEGEN);
198
204
  if (!skipCodeGen) {
199
- logger$2.log("Generating Arri app definition (__definition.json)");
205
+ logger.log("Generating Arri app definition (__definition.json)");
200
206
  execSync(`node ${codegenModule}`, { env: process.env });
201
207
  const defJson = path.resolve(
202
208
  config.rootDir,
@@ -205,22 +211,22 @@ async function startBuild(config, skipCodeGen = false) {
205
211
  );
206
212
  const def = JSON.parse(readFileSync(defJson, { encoding: "utf-8" }));
207
213
  if (isAppDefinition(def) && clientCount > 0) {
208
- logger$2.log(`Generating ${clientCount} clients`);
214
+ logger.log(`Generating ${clientCount} clients`);
209
215
  await Promise.all(
210
- config.clientGenerators.map((plugin) => plugin.generator(def))
216
+ config.generators.map((plugin) => plugin.generator(def))
211
217
  );
212
- logger$2.log(`${clientCount} clients generated`);
218
+ logger.log(`${clientCount} clients generated`);
213
219
  } else {
214
- logger$2.warn(
220
+ logger.warn(
215
221
  "No client generators specified. Skipping client codegen."
216
222
  );
217
223
  }
218
224
  } else {
219
- logger$2.log("Skipping codegen");
225
+ logger.log("Skipping codegen");
220
226
  }
221
- logger$2.log("Cleaning up files");
227
+ logger.log("Cleaning up files");
222
228
  await fs.rm(codegenModule);
223
- logger$2.success(
229
+ logger.success(
224
230
  `Build finished! You can start your server by running "node .output/${OUT_SERVER_ENTRY}"`
225
231
  );
226
232
  }
@@ -379,13 +385,17 @@ const codegen = defineCommand({
379
385
  }
380
386
  const configPath = path.resolve(args.config);
381
387
  const { config } = await loadConfig({ configFile: configPath });
382
- if (!isResolvedArriConfig(config)) {
388
+ if (!isArriConfig(config)) {
383
389
  throw new Error(`Invalid arri config at ${args.config}`);
384
390
  }
385
- consola.info(`Generating ${config.clientGenerators.length} clients`);
391
+ if (!config.generators?.length) {
392
+ logger.warn(`No generators specified in ${args.config}`);
393
+ process.exit(1);
394
+ }
395
+ logger.info(`Generating ${config.generators?.length} client(s)`);
386
396
  await Promise.allSettled(
387
397
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
388
- config.clientGenerators.map(
398
+ config.generators.map(
389
399
  (gen) => gen.generator(
390
400
  def ?? {
391
401
  arriSchemaVersion: "0.0.4",
@@ -395,10 +405,10 @@ const codegen = defineCommand({
395
405
  )
396
406
  )
397
407
  );
408
+ process.exit(0);
398
409
  }
399
410
  });
400
411
 
401
- const logger$1 = createConsola().withTag("arri");
402
412
  const dev = defineCommand({
403
413
  meta: {
404
414
  name: "dev",
@@ -420,13 +430,21 @@ const dev = defineCommand({
420
430
  if (!isResolvedArriConfig(config)) {
421
431
  throw new Error("Unable to find config");
422
432
  }
433
+ const appEntry = path.resolve(
434
+ config.rootDir,
435
+ config.srcDir,
436
+ config.entry
437
+ );
438
+ if (!existsSync(appEntry)) {
439
+ throw new Error(`Unable to find entry at ${appEntry}`);
440
+ }
423
441
  await startDevServer(config);
424
442
  }
425
443
  });
426
444
  const startListener = (config, showQr = false) => listenAndWatch(path.resolve(config.rootDir, ".output", OUT_SERVER_ENTRY), {
427
445
  public: true,
428
446
  port: config.port,
429
- logger: logger$1,
447
+ logger,
430
448
  qr: showQr,
431
449
  https: config.https,
432
450
  http2: config.http2
@@ -501,17 +519,17 @@ async function startDevServer(config) {
501
519
  await createAppWithRoutesModule(config);
502
520
  let bundleCreated = false;
503
521
  try {
504
- logger$1.log(
522
+ logger.log(
505
523
  "Change detected. Bundling files and restarting server...."
506
524
  );
507
525
  await transpileFiles(config);
508
526
  await bundleFiles.rebuild();
509
527
  bundleCreated = true;
510
528
  } catch (err) {
511
- logger$1.error("ERROR", err);
529
+ logger.error("ERROR", err);
512
530
  bundleCreated = false;
513
531
  }
514
- if (bundleCreated && config.clientGenerators.length) {
532
+ if (bundleCreated && config.generators.length) {
515
533
  setTimeout(async () => {
516
534
  await generateClients(config);
517
535
  bundleCreated = false;
@@ -535,14 +553,14 @@ async function generateClients(config) {
535
553
  if (!isAppDefinition(result)) {
536
554
  return;
537
555
  }
538
- logger$1.log(`Generating client code...`);
539
- const clientCount = config.clientGenerators.length;
556
+ logger.log(`Generating client code...`);
557
+ const clientCount = config.generators.length;
540
558
  await Promise.all(
541
- config.clientGenerators.map(
542
- (generator) => generator.generator(result)
559
+ config.generators.map(
560
+ (generator) => generator.generator(result, true)
543
561
  )
544
562
  );
545
- logger$1.success(
563
+ logger.success(
546
564
  `Generated ${clientCount} client${clientCount === 1 ? "" : "s"}`
547
565
  );
548
566
  } catch (err) {
@@ -563,7 +581,6 @@ export default app.h3App;`;
563
581
  );
564
582
  }
565
583
 
566
- const logger = createConsola();
567
584
  const init = defineCommand({
568
585
  meta: {
569
586
  name: "Init",
@@ -580,9 +597,44 @@ const init = defineCommand({
580
597
  default: false,
581
598
  alias: "f",
582
599
  description: "Force created a project when if a directory already exists"
600
+ },
601
+ type: {
602
+ type: "string",
603
+ description: `"app" | "plugin"`
583
604
  }
584
605
  },
585
606
  async run(context) {
607
+ let type;
608
+ switch (context.args.type?.toLowerCase()) {
609
+ case "app":
610
+ type = "app";
611
+ break;
612
+ case "plugin":
613
+ type = "plugin";
614
+ break;
615
+ }
616
+ if (!type) {
617
+ const { projectType } = await enquirer.prompt([
618
+ {
619
+ type: "select",
620
+ name: "projectType",
621
+ message: "What kind of project do you want to initialize?",
622
+ choices: ["application", "generator plugin"]
623
+ }
624
+ ]);
625
+ switch (projectType) {
626
+ case "application":
627
+ type = "app";
628
+ break;
629
+ case "generator plugin":
630
+ type = "plugin";
631
+ break;
632
+ default:
633
+ throw new Error(
634
+ `Unknown project type "${projectType}"`
635
+ );
636
+ }
637
+ }
586
638
  const dir = path.resolve(context.args.dir);
587
639
  if (!fs$1.existsSync(dir)) {
588
640
  fs$1.mkdirSync(dir);
@@ -594,42 +646,71 @@ const init = defineCommand({
594
646
  );
595
647
  process.exit(1);
596
648
  }
597
- const degit = Degit("https://github.com/modiimedia/arri-starters", {
598
- force: context.args.force
599
- });
600
- await degit.clone(dir);
601
- rmSync(path.resolve(dir, "pnpm-lock.yaml"));
602
- const packageJson = JSON.parse(
603
- readFileSync(path.resolve(dir, "package.json"), {
604
- encoding: "utf-8"
605
- })
606
- );
607
- packageJson.name = kebabCase(context.args.dir);
608
- packageJson.description = "An RPC server created with Arri RPC";
609
- packageJson.private = true;
610
- delete packageJson.license;
611
- delete packageJson.main;
612
- delete packageJson.author;
613
- delete packageJson.tags;
614
- writeFileSync(
615
- path.resolve(dir, "package.json"),
616
- await prettier.format(JSON.stringify(packageJson), {
617
- parser: "json",
618
- tabWidth: 4,
619
- semi: true,
620
- endOfLine: "lf",
621
- trailingComma: "all"
622
- })
623
- );
624
- consola.log(
625
- `Project initialized in ${context.args.dir}. To get started:
626
- cd ${context.args.dir}
627
- npm install
628
- npm run dev`
629
- );
649
+ switch (type) {
650
+ case "app":
651
+ await initApp(context.args.dir, context.args.force);
652
+ break;
653
+ case "plugin":
654
+ await initPlugin(context.args.dir, context.args.force);
655
+ break;
656
+ default:
657
+ logger.error(`Unknown app type: '${type}'"`);
658
+ break;
659
+ }
630
660
  process.exit(0);
631
661
  }
632
662
  });
663
+ async function initApp(dir, force) {
664
+ const degit = Degit("modiimedia/arri-starters/app-starter-ts", {
665
+ force
666
+ });
667
+ await degit.clone(dir);
668
+ rmSync(path.resolve(dir, "pnpm-lock.yaml"));
669
+ const packageJson = JSON.parse(
670
+ readFileSync(path.resolve(dir, "package.json"), {
671
+ encoding: "utf-8"
672
+ })
673
+ );
674
+ packageJson.name = kebabCase(dir);
675
+ packageJson.description = "An RPC server created with Arri RPC";
676
+ packageJson.private = true;
677
+ delete packageJson.license;
678
+ delete packageJson.main;
679
+ delete packageJson.author;
680
+ delete packageJson.tags;
681
+ writeFileSync(
682
+ path.resolve(dir, "package.json"),
683
+ await prettier.format(JSON.stringify(packageJson), {
684
+ parser: "json",
685
+ tabWidth: 4,
686
+ semi: true,
687
+ endOfLine: "lf",
688
+ trailingComma: "all"
689
+ })
690
+ );
691
+ logger.success(`Project initialized in ${dir}!`);
692
+ logger.info(`To get started:
693
+ - cd ${dir}
694
+ - pnpm install
695
+ - pnpm run dev`);
696
+ }
697
+ async function initPlugin(dir, force) {
698
+ const name = kebabCase(dir);
699
+ const degit = Degit("modiimedia/arri-starters/generator-starter", {
700
+ force
701
+ });
702
+ await degit.clone(dir);
703
+ rmSync(path.resolve(dir, "pnpm-lock.yaml"));
704
+ let packageJson = readFileSync(path.resolve(dir, "package.json"), {
705
+ encoding: "utf8"
706
+ });
707
+ packageJson = packageJson.replace(`"arri-generator-name"`, `"${name}"`);
708
+ writeFileSync(path.resolve(dir, "package.json"), packageJson);
709
+ logger.success(`Project initialized in ${dir}!`);
710
+ logger.info(`To get started:
711
+ - cd ${dir}
712
+ - pnpm install`);
713
+ }
633
714
 
634
715
  const main = defineCommand({
635
716
  subCommands: {
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const config = require('./shared/arri.7b317e03.cjs');
3
+ const config = require('./shared/arri.7b5179bf.cjs');
4
4
  const h3 = require('h3');
5
5
  require('arri-codegen-utils');
6
6
  require('arri-validate');
package/dist/index.d.cts CHANGED
@@ -212,8 +212,8 @@ interface ArriOptions {
212
212
  }
213
213
 
214
214
  interface ArriConfig {
215
- port: number;
216
- entry: string;
215
+ port?: number;
216
+ entry?: string;
217
217
  serverEntry?: string;
218
218
  rootDir?: string;
219
219
  srcDir?: string;
@@ -222,7 +222,7 @@ interface ArriConfig {
222
222
  * this defaults to ["***\/*\*.rpc.ts"]
223
223
  */
224
224
  procedureGlobPatterns?: string[];
225
- clientGenerators?: Array<ClientGenerator<any>>;
225
+ generators?: Array<ClientGenerator<any>>;
226
226
  buildDir?: string;
227
227
  esbuild?: Omit<BuildOptions, "outfile" | "outdir" | "entryNames" | "entryPoints">;
228
228
  https?: {
package/dist/index.d.mts CHANGED
@@ -212,8 +212,8 @@ interface ArriOptions {
212
212
  }
213
213
 
214
214
  interface ArriConfig {
215
- port: number;
216
- entry: string;
215
+ port?: number;
216
+ entry?: string;
217
217
  serverEntry?: string;
218
218
  rootDir?: string;
219
219
  srcDir?: string;
@@ -222,7 +222,7 @@ interface ArriConfig {
222
222
  * this defaults to ["***\/*\*.rpc.ts"]
223
223
  */
224
224
  procedureGlobPatterns?: string[];
225
- clientGenerators?: Array<ClientGenerator<any>>;
225
+ generators?: Array<ClientGenerator<any>>;
226
226
  buildDir?: string;
227
227
  esbuild?: Omit<BuildOptions, "outfile" | "outdir" | "entryNames" | "entryPoints">;
228
228
  https?: {
package/dist/index.d.ts CHANGED
@@ -212,8 +212,8 @@ interface ArriOptions {
212
212
  }
213
213
 
214
214
  interface ArriConfig {
215
- port: number;
216
- entry: string;
215
+ port?: number;
216
+ entry?: string;
217
217
  serverEntry?: string;
218
218
  rootDir?: string;
219
219
  srcDir?: string;
@@ -222,7 +222,7 @@ interface ArriConfig {
222
222
  * this defaults to ["***\/*\*.rpc.ts"]
223
223
  */
224
224
  procedureGlobPatterns?: string[];
225
- clientGenerators?: Array<ClientGenerator<any>>;
225
+ generators?: Array<ClientGenerator<any>>;
226
226
  buildDir?: string;
227
227
  esbuild?: Omit<BuildOptions, "outfile" | "outdir" | "entryNames" | "entryPoints">;
228
228
  https?: {
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ArriApp, q as ArriRouter, a as DEV_DEFINITION_ENDPOINT, D as DEV_ENDPOINT_ROOT, E as ErrorResponse, y as EventStreamConnection, c as createAppDefinition, e as createHttpRpcDefinition, o as defaultConfig, p as defineConfig, j as defineError, w as defineEventStreamRpc, s as defineRoute, d as defineRpc, k as errorResponseFromValidationErrors, f as getRpcParamName, g as getRpcPath, h as getRpcResponseName, l as handleH3Error, u as handleRoute, m as isArriConfig, x as isEventStreamRpc, n as isResolvedArriConfig, b as isRpc, i as isRpcParamSchema, z as registerEventStreamRpc, t as registerRoute, r as registerRpc, v as validateRpcRequestInput } from './shared/arri.e9a56e75.mjs';
1
+ export { A as ArriApp, q as ArriRouter, a as DEV_DEFINITION_ENDPOINT, D as DEV_ENDPOINT_ROOT, E as ErrorResponse, y as EventStreamConnection, c as createAppDefinition, e as createHttpRpcDefinition, o as defaultConfig, p as defineConfig, j as defineError, w as defineEventStreamRpc, s as defineRoute, d as defineRpc, k as errorResponseFromValidationErrors, f as getRpcParamName, g as getRpcPath, h as getRpcResponseName, l as handleH3Error, u as handleRoute, m as isArriConfig, x as isEventStreamRpc, n as isResolvedArriConfig, b as isRpc, i as isRpcParamSchema, z as registerEventStreamRpc, t as registerRoute, r as registerRpc, v as validateRpcRequestInput } from './shared/arri.bbe2aa44.mjs';
2
2
  export * from 'h3';
3
3
  import 'arri-codegen-utils';
4
4
  import 'arri-validate';
@@ -951,27 +951,41 @@ class ArriApp {
951
951
  }
952
952
 
953
953
  function isArriConfig(input) {
954
- if (typeof input !== "object" || !input) {
954
+ if (typeof input !== "object" || input === null) {
955
955
  return false;
956
956
  }
957
- return "port" in input && typeof input.port === "number" && !Number.isNaN(input.port) && "entry" in input && typeof input.entry === "string";
957
+ if ("generators" in input) {
958
+ if (!Array.isArray(input)) {
959
+ return false;
960
+ }
961
+ }
962
+ if ("port" in input && typeof input.port !== "number") {
963
+ return false;
964
+ }
965
+ if (Number.isNaN(input.port)) {
966
+ return false;
967
+ }
968
+ if ("entry" in input && typeof input.entry !== "string") {
969
+ return false;
970
+ }
971
+ return true;
958
972
  }
959
973
  function isResolvedArriConfig(input) {
960
974
  if (!isArriConfig(input)) {
961
975
  return false;
962
976
  }
963
- return typeof input.rootDir === "string" && typeof input.srcDir === "string" && (typeof input.procedureDir === "string" || typeof input.procedureDir === "boolean") && Array.isArray(input.procedureGlobPatterns) && Array.isArray(input.clientGenerators) && typeof input.buildDir === "string" && typeof input.esbuild === "object" && input.esbuild && !Array.isArray(input.esbuild);
977
+ return typeof input.rootDir === "string" && typeof input.srcDir === "string" && (typeof input.procedureDir === "string" || typeof input.procedureDir === "boolean") && Array.isArray(input.procedureGlobPatterns) && Array.isArray(input.generators) && typeof input.buildDir === "string" && typeof input.esbuild === "object" && input.esbuild && !Array.isArray(input.esbuild);
964
978
  }
965
979
  const defaultConfig = {
966
980
  port: 3e3,
967
981
  rootDir: ".",
968
982
  srcDir: "src",
969
983
  entry: "app.ts",
984
+ serverEntry: "",
970
985
  procedureDir: "procedures",
971
986
  procedureGlobPatterns: ["**/*.rpc.ts"],
972
- clientGenerators: [],
987
+ generators: [],
973
988
  buildDir: ".arri",
974
- serverEntry: "",
975
989
  esbuild: {},
976
990
  https: false,
977
991
  http2: false
@@ -984,7 +998,7 @@ function defineConfig(config) {
984
998
  entry: config.entry ?? defaultConfig.entry,
985
999
  procedureDir: config.procedureDir ?? defaultConfig.procedureDir,
986
1000
  procedureGlobPatterns: config.procedureGlobPatterns ?? defaultConfig.procedureGlobPatterns,
987
- clientGenerators: config.clientGenerators ?? defaultConfig.clientGenerators,
1001
+ generators: config.generators ?? defaultConfig.generators,
988
1002
  buildDir: config.buildDir ?? defaultConfig.buildDir,
989
1003
  esbuild: config.esbuild ?? defaultConfig.esbuild,
990
1004
  serverEntry: config.serverEntry ?? "",
@@ -949,27 +949,41 @@ class ArriApp {
949
949
  }
950
950
 
951
951
  function isArriConfig(input) {
952
- if (typeof input !== "object" || !input) {
952
+ if (typeof input !== "object" || input === null) {
953
953
  return false;
954
954
  }
955
- return "port" in input && typeof input.port === "number" && !Number.isNaN(input.port) && "entry" in input && typeof input.entry === "string";
955
+ if ("generators" in input) {
956
+ if (!Array.isArray(input)) {
957
+ return false;
958
+ }
959
+ }
960
+ if ("port" in input && typeof input.port !== "number") {
961
+ return false;
962
+ }
963
+ if (Number.isNaN(input.port)) {
964
+ return false;
965
+ }
966
+ if ("entry" in input && typeof input.entry !== "string") {
967
+ return false;
968
+ }
969
+ return true;
956
970
  }
957
971
  function isResolvedArriConfig(input) {
958
972
  if (!isArriConfig(input)) {
959
973
  return false;
960
974
  }
961
- return typeof input.rootDir === "string" && typeof input.srcDir === "string" && (typeof input.procedureDir === "string" || typeof input.procedureDir === "boolean") && Array.isArray(input.procedureGlobPatterns) && Array.isArray(input.clientGenerators) && typeof input.buildDir === "string" && typeof input.esbuild === "object" && input.esbuild && !Array.isArray(input.esbuild);
975
+ return typeof input.rootDir === "string" && typeof input.srcDir === "string" && (typeof input.procedureDir === "string" || typeof input.procedureDir === "boolean") && Array.isArray(input.procedureGlobPatterns) && Array.isArray(input.generators) && typeof input.buildDir === "string" && typeof input.esbuild === "object" && input.esbuild && !Array.isArray(input.esbuild);
962
976
  }
963
977
  const defaultConfig = {
964
978
  port: 3e3,
965
979
  rootDir: ".",
966
980
  srcDir: "src",
967
981
  entry: "app.ts",
982
+ serverEntry: "",
968
983
  procedureDir: "procedures",
969
984
  procedureGlobPatterns: ["**/*.rpc.ts"],
970
- clientGenerators: [],
985
+ generators: [],
971
986
  buildDir: ".arri",
972
- serverEntry: "",
973
987
  esbuild: {},
974
988
  https: false,
975
989
  http2: false
@@ -982,7 +996,7 @@ function defineConfig(config) {
982
996
  entry: config.entry ?? defaultConfig.entry,
983
997
  procedureDir: config.procedureDir ?? defaultConfig.procedureDir,
984
998
  procedureGlobPatterns: config.procedureGlobPatterns ?? defaultConfig.procedureGlobPatterns,
985
- clientGenerators: config.clientGenerators ?? defaultConfig.clientGenerators,
999
+ generators: config.generators ?? defaultConfig.generators,
986
1000
  buildDir: config.buildDir ?? defaultConfig.buildDir,
987
1001
  esbuild: config.esbuild ?? defaultConfig.esbuild,
988
1002
  serverEntry: config.serverEntry ?? "",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arri",
3
- "version": "0.31.0",
3
+ "version": "0.32.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -31,6 +31,7 @@
31
31
  "citty": "^0.1.6",
32
32
  "consola": "^3.2.3",
33
33
  "degit": "^2.8.4",
34
+ "enquirer": "^2.4.1",
34
35
  "esbuild": "^0.20.1",
35
36
  "esbuild-plugin-replace": "^1.4.0",
36
37
  "globby": "^14.0.1",
@@ -42,10 +43,10 @@
42
43
  "prettier": "^3.2.5",
43
44
  "scule": "^1.3.0",
44
45
  "uncrypto": "^0.1.3",
45
- "arri-codegen-dart": "0.31.0",
46
- "arri-codegen-ts": "0.31.0",
47
- "arri-codegen-utils": "0.31.0",
48
- "arri-validate": "0.31.0"
46
+ "arri-codegen-dart": "0.32.1",
47
+ "arri-validate": "0.32.1",
48
+ "arri-codegen-ts": "0.32.1",
49
+ "arri-codegen-utils": "0.32.1"
49
50
  },
50
51
  "devDependencies": {
51
52
  "@types/degit": "^2.8.6",