arri 0.57.0 → 0.57.3

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
@@ -11,7 +11,7 @@ const esbuild = require('esbuild');
11
11
  const esbuildPluginReplace = require('esbuild-plugin-replace');
12
12
  const path = require('pathe');
13
13
  const prettier = require('prettier');
14
- const dev = require('./shared/arri.42cdc72b.cjs');
14
+ const dev = require('./shared/arri.976d7393.cjs');
15
15
  const ofetch = require('ofetch');
16
16
  const Degit = require('degit');
17
17
  const enquirer = require('enquirer');
package/dist/cli.mjs CHANGED
@@ -9,7 +9,7 @@ import { build as build$1 } from 'esbuild';
9
9
  import { replace } from 'esbuild-plugin-replace';
10
10
  import path from 'pathe';
11
11
  import prettier from 'prettier';
12
- import { d as defaultConfig, l as logger, s as setupWorkingDir, c as createAppWithRoutesModule, O as OUT_CODEGEN, e as OUT_SERVER_ENTRY, G as GEN_APP_FILE, f as OUT_APP_FILE, i as isArriConfig, g as getArriPackageMetadata, h as dev } from './shared/arri.e6e562ed.mjs';
12
+ import { d as defaultConfig, l as logger, s as setupWorkingDir, c as createAppWithRoutesModule, O as OUT_CODEGEN, e as OUT_SERVER_ENTRY, G as GEN_APP_FILE, f as OUT_APP_FILE, i as isArriConfig, g as getArriPackageMetadata, h as dev } from './shared/arri.1de410ff.mjs';
13
13
  import { ofetch } from 'ofetch';
14
14
  import Degit from 'degit';
15
15
  import enquirer from 'enquirer';
package/dist/index.cjs CHANGED
@@ -4,19 +4,19 @@ const codegenDart = require('@arrirpc/codegen-dart');
4
4
  const codegenKotlin = require('@arrirpc/codegen-kotlin');
5
5
  const codegenRust = require('@arrirpc/codegen-rust');
6
6
  const codegenTs = require('@arrirpc/codegen-ts');
7
- const dev = require('./shared/arri.42cdc72b.cjs');
7
+ const dev = require('./shared/arri.976d7393.cjs');
8
8
  const codegenUtils = require('@arrirpc/codegen-utils');
9
9
  require('node:fs');
10
- require('node:fs/promises');
11
10
  require('@joshmossas/listhen');
12
11
  require('c12');
13
12
  require('citty');
14
13
  require('esbuild');
15
14
  require('h3');
16
- require('ofetch');
17
15
  require('pathe');
16
+ require('node:fs/promises');
18
17
  require('@arrirpc/schema');
19
18
  require('consola');
19
+ require('ofetch');
20
20
  require('prettier');
21
21
 
22
22
  const generators = {
package/dist/index.mjs CHANGED
@@ -2,19 +2,19 @@ import { dartClientGenerator } from '@arrirpc/codegen-dart';
2
2
  import { kotlinClientGenerator } from '@arrirpc/codegen-kotlin';
3
3
  import { rustClientGenerator } from '@arrirpc/codegen-rust';
4
4
  import { typescriptClientGenerator } from '@arrirpc/codegen-ts';
5
- export { D as DEV_DEFINITION_ENDPOINT, d as defaultConfig, b as defineConfig, i as isArriConfig, a as isResolvedArriConfig } from './shared/arri.e6e562ed.mjs';
5
+ export { D as DEV_DEFINITION_ENDPOINT, d as defaultConfig, b as defineConfig, i as isArriConfig, a as isResolvedArriConfig } from './shared/arri.1de410ff.mjs';
6
6
  export { createAppDefinition } from '@arrirpc/codegen-utils';
7
7
  import 'node:fs';
8
- import 'node:fs/promises';
9
8
  import '@joshmossas/listhen';
10
9
  import 'c12';
11
10
  import 'citty';
12
11
  import 'esbuild';
13
12
  import 'h3';
14
- import 'ofetch';
15
13
  import 'pathe';
14
+ import 'node:fs/promises';
16
15
  import '@arrirpc/schema';
17
16
  import 'consola';
17
+ import 'ofetch';
18
18
  import 'prettier';
19
19
 
20
20
  const generators = {
@@ -1,20 +1,19 @@
1
1
  import { existsSync } from 'node:fs';
2
- import fs from 'node:fs/promises';
3
- import { camelCase, removeDisallowedChars, kebabCase, isAppDefinition } from '@arrirpc/codegen-utils';
4
- import { listenAndWatch } from '@joshmossas/listhen';
2
+ import { listen } from '@joshmossas/listhen';
5
3
  import { loadConfig } from 'c12';
6
4
  import { defineCommand } from 'citty';
7
5
  import * as esbuild from 'esbuild';
8
- import 'h3';
9
- import { ofetch } from 'ofetch';
6
+ import { dynamicEventHandler, toNodeListener, fromNodeMiddleware } from 'h3';
10
7
  import path from 'pathe';
8
+ import fs from 'node:fs/promises';
9
+ import { camelCase, removeDisallowedChars, kebabCase } from '@arrirpc/codegen-utils';
11
10
  import { a, ValidationError } from '@arrirpc/schema';
12
11
  import { createConsola } from 'consola';
12
+ import { ofetch } from 'ofetch';
13
13
  import prettier from 'prettier';
14
14
 
15
15
  const logger = createConsola().withTag("arri");
16
16
  const GEN_APP_FILE = "__arri_app.ts";
17
- const GEN_SERVER_ENTRY_FILE = "__arri_server.ts";
18
17
  const OUT_APP_FILE = "app.mjs";
19
18
  const OUT_SERVER_ENTRY = "server.mjs";
20
19
  const OUT_CODEGEN = "codegen.mjs";
@@ -290,7 +289,6 @@ const dev = defineCommand({
290
289
  }
291
290
  },
292
291
  async run({ args }) {
293
- process.env.ARRI_DEV_MODE = "true";
294
292
  const { config } = await loadConfig({
295
293
  configFile: path.resolve(args.config)
296
294
  });
@@ -308,23 +306,7 @@ const dev = defineCommand({
308
306
  await startDevServer(config);
309
307
  }
310
308
  });
311
- const startListener = (config, showQr = false) => listenAndWatch(path.resolve(config.rootDir, ".output", OUT_SERVER_ENTRY), {
312
- public: true,
313
- port: config.port,
314
- logger,
315
- qr: showQr,
316
- https: config.https,
317
- http2: config.http2,
318
- ws: true
319
- });
320
309
  async function bundleFilesContext(config) {
321
- const serverContent = `import app from './${OUT_APP_FILE}';
322
-
323
- export default app.h3App;`;
324
- await fs.writeFile(
325
- path.resolve(config.rootDir, ".output", OUT_SERVER_ENTRY),
326
- serverContent
327
- );
328
310
  return await esbuild.context({
329
311
  ...config.esbuild,
330
312
  entryPoints: [
@@ -339,29 +321,67 @@ export default app.h3App;`;
339
321
  platform: config.esbuild.platform ?? "node"
340
322
  });
341
323
  }
324
+ async function createDevServer(config) {
325
+ const h3 = await import('h3');
326
+ const app = h3.createApp();
327
+ const dynamicHandler = dynamicEventHandler(
328
+ () => "<div>initializing server...</div>"
329
+ );
330
+ app.use(dynamicHandler);
331
+ let ws;
332
+ const listener = await listen(toNodeListener(app), {
333
+ port: config.port,
334
+ https: config.https,
335
+ http2: config.http2,
336
+ public: true,
337
+ ws: {
338
+ resolve(info) {
339
+ if (ws?.resolve) {
340
+ return ws.resolve(info);
341
+ }
342
+ return {};
343
+ }
344
+ }
345
+ });
346
+ async function reload() {
347
+ const appEntry = (await import(path.resolve(
348
+ config.rootDir,
349
+ ".output",
350
+ `${OUT_APP_FILE}?version=${Date.now()}`
351
+ ))).default;
352
+ dynamicHandler.set(fromNodeMiddleware(appEntry.h3App.handler));
353
+ ws = appEntry.h3App.websocket;
354
+ return appEntry.getAppDefinition();
355
+ }
356
+ await reload();
357
+ return {
358
+ h3App: app,
359
+ listener,
360
+ reload,
361
+ ws
362
+ };
363
+ }
342
364
  async function startDevServer(config) {
343
365
  await setupWorkingDir(config);
344
366
  const watcher = await import('chokidar');
345
367
  let fileWatcher;
346
- await Promise.all([
347
- createEntryModule(config),
348
- createAppWithRoutesModule(config)
349
- ]);
368
+ await createAppWithRoutesModule(config);
350
369
  const context = await bundleFilesContext(config);
351
370
  await context.rebuild();
352
- const listener = await startListener(config, true);
353
- setTimeout(async () => {
354
- await generateClients(config);
355
- }, 1e3);
371
+ const devServer = await createDevServer(config);
372
+ let appDef = await devServer.reload();
373
+ let appDefStr = JSON.stringify(appDef);
374
+ if (config.generators.length) {
375
+ logger.info(`Running generators...`);
376
+ await generateClientsFromDefinition(appDef, config);
377
+ } else {
378
+ logger.warn(`No generators specified in config. Skipping codegen.`);
379
+ }
356
380
  const cleanExit = async () => {
357
381
  process.exit();
358
382
  };
359
383
  process.on("exit", async () => {
360
- await Promise.allSettled([
361
- listener.close(),
362
- fileWatcher?.close(),
363
- context.dispose()
364
- ]);
384
+ await Promise.allSettled([fileWatcher?.close(), context.dispose()]);
365
385
  });
366
386
  process.on("SIGINT", cleanExit);
367
387
  process.on("SIGTERM", cleanExit);
@@ -404,65 +424,47 @@ async function startDevServer(config) {
404
424
  return;
405
425
  }
406
426
  await createAppWithRoutesModule(config);
407
- let bundleCreated = false;
408
427
  try {
428
+ const reloadStart = (/* @__PURE__ */ new Date()).getTime();
409
429
  logger.log(
410
430
  "Change detected. Bundling files and restarting server...."
411
431
  );
412
432
  await context.rebuild();
413
- bundleCreated = true;
433
+ const newAppDef = await devServer.reload();
434
+ const newAppDefStr = JSON.stringify(newAppDef);
435
+ logger.log(
436
+ `Server restarted in ${( new Date()).getTime() - reloadStart}ms`
437
+ );
438
+ if (config.generators.length && newAppDefStr !== appDefStr) {
439
+ logger.info(
440
+ `App Definition updated. Regenerating clients...`
441
+ );
442
+ await generateClientsFromDefinition(newAppDef, config);
443
+ appDef = newAppDef;
444
+ appDefStr = newAppDefStr;
445
+ }
414
446
  } catch (err) {
415
447
  logger.error("ERROR", err);
416
- bundleCreated = false;
417
- }
418
- if (bundleCreated && config.generators.length) {
419
- setTimeout(async () => {
420
- await generateClients(config);
421
- bundleCreated = false;
422
- }, 1e3);
423
448
  }
424
449
  });
425
450
  }
426
451
  await load();
427
452
  }
428
- async function generateClients(config) {
453
+ async function generateClientsFromDefinition(appDef, config) {
454
+ const startTime = (/* @__PURE__ */ new Date()).getTime();
429
455
  try {
430
- const protocol = config.https === true || typeof config.https === "object" ? "https" : "http";
431
- if (protocol === "https") {
432
- process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
433
- }
434
- const result = await ofetch(
435
- `${protocol}://127.0.0.1:${config.port}${DEV_DEFINITION_ENDPOINT}`
436
- );
437
- if (!isAppDefinition(result)) {
438
- return;
439
- }
440
- logger.log(`Generating client code...`);
441
456
  const clientCount = config.generators.length;
442
457
  await Promise.allSettled(
443
458
  config.generators.map(
444
- (generator) => generator.generator(result, true)
459
+ (generator) => generator.generator(appDef, true)
445
460
  )
446
461
  );
447
462
  logger.success(
448
- `Generated ${clientCount} client${clientCount === 1 ? "" : "s"}`
463
+ `Generated ${clientCount} client${clientCount === 1 ? "" : "s"} in ${( new Date()).getTime() - startTime}ms`
449
464
  );
450
465
  } catch (err) {
451
466
  logger.error(err);
452
467
  }
453
468
  }
454
- async function createEntryModule(config) {
455
- const appModule = path.resolve(config.rootDir, config.srcDir, config.entry);
456
- const appImportParts = path.relative(path.resolve(config.rootDir, config.srcDir), appModule).split(".");
457
- appImportParts.pop();
458
- const virtualEntry = `import { toNodeListener } from '@arrirpc/server';
459
- import app from './${GEN_APP_FILE}';
460
-
461
- export default app.h3App;`;
462
- await fs.writeFile(
463
- path.resolve(config.rootDir, config.buildDir, GEN_SERVER_ENTRY_FILE),
464
- virtualEntry
465
- );
466
- }
467
469
 
468
470
  export { DEV_DEFINITION_ENDPOINT as D, GEN_APP_FILE as G, OUT_CODEGEN as O, isResolvedArriConfig as a, defineConfig as b, createAppWithRoutesModule as c, defaultConfig as d, OUT_SERVER_ENTRY as e, OUT_APP_FILE as f, getArriPackageMetadata as g, dev as h, isArriConfig as i, logger as l, setupWorkingDir as s };
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
3
  const fs = require('node:fs');
4
- const fs$1 = require('node:fs/promises');
5
- const codegenUtils = require('@arrirpc/codegen-utils');
6
4
  const listhen = require('@joshmossas/listhen');
7
5
  const c12 = require('c12');
8
6
  const citty = require('citty');
9
7
  const esbuild = require('esbuild');
10
- require('h3');
11
- const ofetch = require('ofetch');
8
+ const h3 = require('h3');
12
9
  const path = require('pathe');
10
+ const fs$1 = require('node:fs/promises');
11
+ const codegenUtils = require('@arrirpc/codegen-utils');
13
12
  const schema = require('@arrirpc/schema');
14
13
  const consola = require('consola');
14
+ const ofetch = require('ofetch');
15
15
  const prettier = require('prettier');
16
16
 
17
17
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
@@ -28,14 +28,13 @@ function _interopNamespaceCompat(e) {
28
28
  return n;
29
29
  }
30
30
 
31
- const fs__default = /*#__PURE__*/_interopDefaultCompat(fs$1);
32
31
  const esbuild__namespace = /*#__PURE__*/_interopNamespaceCompat(esbuild);
33
32
  const path__default = /*#__PURE__*/_interopDefaultCompat(path);
33
+ const fs__default = /*#__PURE__*/_interopDefaultCompat(fs$1);
34
34
  const prettier__default = /*#__PURE__*/_interopDefaultCompat(prettier);
35
35
 
36
36
  const logger = consola.createConsola().withTag("arri");
37
37
  const GEN_APP_FILE = "__arri_app.ts";
38
- const GEN_SERVER_ENTRY_FILE = "__arri_server.ts";
39
38
  const OUT_APP_FILE = "app.mjs";
40
39
  const OUT_SERVER_ENTRY = "server.mjs";
41
40
  const OUT_CODEGEN = "codegen.mjs";
@@ -311,7 +310,6 @@ const dev = citty.defineCommand({
311
310
  }
312
311
  },
313
312
  async run({ args }) {
314
- process.env.ARRI_DEV_MODE = "true";
315
313
  const { config } = await c12.loadConfig({
316
314
  configFile: path__default.resolve(args.config)
317
315
  });
@@ -329,23 +327,7 @@ const dev = citty.defineCommand({
329
327
  await startDevServer(config);
330
328
  }
331
329
  });
332
- const startListener = (config, showQr = false) => listhen.listenAndWatch(path__default.resolve(config.rootDir, ".output", OUT_SERVER_ENTRY), {
333
- public: true,
334
- port: config.port,
335
- logger,
336
- qr: showQr,
337
- https: config.https,
338
- http2: config.http2,
339
- ws: true
340
- });
341
330
  async function bundleFilesContext(config) {
342
- const serverContent = `import app from './${OUT_APP_FILE}';
343
-
344
- export default app.h3App;`;
345
- await fs__default.writeFile(
346
- path__default.resolve(config.rootDir, ".output", OUT_SERVER_ENTRY),
347
- serverContent
348
- );
349
331
  return await esbuild__namespace.context({
350
332
  ...config.esbuild,
351
333
  entryPoints: [
@@ -360,29 +342,67 @@ export default app.h3App;`;
360
342
  platform: config.esbuild.platform ?? "node"
361
343
  });
362
344
  }
345
+ async function createDevServer(config) {
346
+ const h3$1 = await import('h3');
347
+ const app = h3$1.createApp();
348
+ const dynamicHandler = h3.dynamicEventHandler(
349
+ () => "<div>initializing server...</div>"
350
+ );
351
+ app.use(dynamicHandler);
352
+ let ws;
353
+ const listener = await listhen.listen(h3.toNodeListener(app), {
354
+ port: config.port,
355
+ https: config.https,
356
+ http2: config.http2,
357
+ public: true,
358
+ ws: {
359
+ resolve(info) {
360
+ if (ws?.resolve) {
361
+ return ws.resolve(info);
362
+ }
363
+ return {};
364
+ }
365
+ }
366
+ });
367
+ async function reload() {
368
+ const appEntry = (await import(path__default.resolve(
369
+ config.rootDir,
370
+ ".output",
371
+ `${OUT_APP_FILE}?version=${Date.now()}`
372
+ ))).default;
373
+ dynamicHandler.set(h3.fromNodeMiddleware(appEntry.h3App.handler));
374
+ ws = appEntry.h3App.websocket;
375
+ return appEntry.getAppDefinition();
376
+ }
377
+ await reload();
378
+ return {
379
+ h3App: app,
380
+ listener,
381
+ reload,
382
+ ws
383
+ };
384
+ }
363
385
  async function startDevServer(config) {
364
386
  await setupWorkingDir(config);
365
387
  const watcher = await import('chokidar');
366
388
  let fileWatcher;
367
- await Promise.all([
368
- createEntryModule(config),
369
- createAppWithRoutesModule(config)
370
- ]);
389
+ await createAppWithRoutesModule(config);
371
390
  const context = await bundleFilesContext(config);
372
391
  await context.rebuild();
373
- const listener = await startListener(config, true);
374
- setTimeout(async () => {
375
- await generateClients(config);
376
- }, 1e3);
392
+ const devServer = await createDevServer(config);
393
+ let appDef = await devServer.reload();
394
+ let appDefStr = JSON.stringify(appDef);
395
+ if (config.generators.length) {
396
+ logger.info(`Running generators...`);
397
+ await generateClientsFromDefinition(appDef, config);
398
+ } else {
399
+ logger.warn(`No generators specified in config. Skipping codegen.`);
400
+ }
377
401
  const cleanExit = async () => {
378
402
  process.exit();
379
403
  };
380
404
  process.on("exit", async () => {
381
- await Promise.allSettled([
382
- listener.close(),
383
- fileWatcher?.close(),
384
- context.dispose()
385
- ]);
405
+ await Promise.allSettled([fileWatcher?.close(), context.dispose()]);
386
406
  });
387
407
  process.on("SIGINT", cleanExit);
388
408
  process.on("SIGTERM", cleanExit);
@@ -425,66 +445,48 @@ async function startDevServer(config) {
425
445
  return;
426
446
  }
427
447
  await createAppWithRoutesModule(config);
428
- let bundleCreated = false;
429
448
  try {
449
+ const reloadStart = (/* @__PURE__ */ new Date()).getTime();
430
450
  logger.log(
431
451
  "Change detected. Bundling files and restarting server...."
432
452
  );
433
453
  await context.rebuild();
434
- bundleCreated = true;
454
+ const newAppDef = await devServer.reload();
455
+ const newAppDefStr = JSON.stringify(newAppDef);
456
+ logger.log(
457
+ `Server restarted in ${( new Date()).getTime() - reloadStart}ms`
458
+ );
459
+ if (config.generators.length && newAppDefStr !== appDefStr) {
460
+ logger.info(
461
+ `App Definition updated. Regenerating clients...`
462
+ );
463
+ await generateClientsFromDefinition(newAppDef, config);
464
+ appDef = newAppDef;
465
+ appDefStr = newAppDefStr;
466
+ }
435
467
  } catch (err) {
436
468
  logger.error("ERROR", err);
437
- bundleCreated = false;
438
- }
439
- if (bundleCreated && config.generators.length) {
440
- setTimeout(async () => {
441
- await generateClients(config);
442
- bundleCreated = false;
443
- }, 1e3);
444
469
  }
445
470
  });
446
471
  }
447
472
  await load();
448
473
  }
449
- async function generateClients(config) {
474
+ async function generateClientsFromDefinition(appDef, config) {
475
+ const startTime = (/* @__PURE__ */ new Date()).getTime();
450
476
  try {
451
- const protocol = config.https === true || typeof config.https === "object" ? "https" : "http";
452
- if (protocol === "https") {
453
- process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
454
- }
455
- const result = await ofetch.ofetch(
456
- `${protocol}://127.0.0.1:${config.port}${DEV_DEFINITION_ENDPOINT}`
457
- );
458
- if (!codegenUtils.isAppDefinition(result)) {
459
- return;
460
- }
461
- logger.log(`Generating client code...`);
462
477
  const clientCount = config.generators.length;
463
478
  await Promise.allSettled(
464
479
  config.generators.map(
465
- (generator) => generator.generator(result, true)
480
+ (generator) => generator.generator(appDef, true)
466
481
  )
467
482
  );
468
483
  logger.success(
469
- `Generated ${clientCount} client${clientCount === 1 ? "" : "s"}`
484
+ `Generated ${clientCount} client${clientCount === 1 ? "" : "s"} in ${( new Date()).getTime() - startTime}ms`
470
485
  );
471
486
  } catch (err) {
472
487
  logger.error(err);
473
488
  }
474
489
  }
475
- async function createEntryModule(config) {
476
- const appModule = path__default.resolve(config.rootDir, config.srcDir, config.entry);
477
- const appImportParts = path__default.relative(path__default.resolve(config.rootDir, config.srcDir), appModule).split(".");
478
- appImportParts.pop();
479
- const virtualEntry = `import { toNodeListener } from '@arrirpc/server';
480
- import app from './${GEN_APP_FILE}';
481
-
482
- export default app.h3App;`;
483
- await fs__default.writeFile(
484
- path__default.resolve(config.rootDir, config.buildDir, GEN_SERVER_ENTRY_FILE),
485
- virtualEntry
486
- );
487
- }
488
490
 
489
491
  exports.DEV_DEFINITION_ENDPOINT = DEV_DEFINITION_ENDPOINT;
490
492
  exports.GEN_APP_FILE = GEN_APP_FILE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arri",
3
- "version": "0.57.0",
3
+ "version": "0.57.3",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -39,12 +39,12 @@
39
39
  "ofetch": "^1.3.4",
40
40
  "pathe": "^1.1.2",
41
41
  "prettier": "^3.3.3",
42
- "@arrirpc/codegen-dart": "0.57.0",
43
- "@arrirpc/codegen-kotlin": "0.57.0",
44
- "@arrirpc/codegen-rust": "0.57.0",
45
- "@arrirpc/codegen-ts": "0.57.0",
46
- "@arrirpc/codegen-utils": "0.57.0",
47
- "@arrirpc/schema": "0.57.0"
42
+ "@arrirpc/codegen-dart": "0.57.3",
43
+ "@arrirpc/codegen-rust": "0.57.3",
44
+ "@arrirpc/codegen-kotlin": "0.57.3",
45
+ "@arrirpc/codegen-ts": "0.57.3",
46
+ "@arrirpc/schema": "0.57.3",
47
+ "@arrirpc/codegen-utils": "0.57.3"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/degit": "^2.8.6"