arri 0.0.21 → 0.0.23

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.
@@ -42,7 +42,7 @@ require('@sinclair/typebox/errors');
42
42
  require('@sinclair/typebox/value');
43
43
  require('../index.cjs');
44
44
  require('ofetch');
45
- require('../shared/arri.234caf5e.cjs');
45
+ require('../shared/arri.12a51234.cjs');
46
46
  require('child_process');
47
47
  require('listhen');
48
48
 
@@ -40,7 +40,7 @@ import '@sinclair/typebox/errors';
40
40
  import '@sinclair/typebox/value';
41
41
  import '../index.mjs';
42
42
  import 'ofetch';
43
- import '../shared/arri.c6b92822.mjs';
43
+ import '../shared/arri.6966fa30.mjs';
44
44
  import 'child_process';
45
45
  import 'listhen';
46
46
 
package/dist/cli.cjs CHANGED
@@ -33,7 +33,7 @@ require('@sinclair/typebox');
33
33
  require('h3');
34
34
  require('@sinclair/typebox/errors');
35
35
  require('@sinclair/typebox/value');
36
- const dart = require('./shared/arri.234caf5e.cjs');
36
+ const dart = require('./shared/arri.12a51234.cjs');
37
37
  const listhen = require('listhen');
38
38
  require('child_process');
39
39
 
@@ -19823,11 +19823,15 @@ async function setupWorkingDir(config) {
19823
19823
  }
19824
19824
  async function createRoutesModule(config) {
19825
19825
  const routes = [];
19826
+ const existingRoutes = [];
19826
19827
  await Promise.all(
19827
19828
  config.procedureGlobPatterns.map(async (pattern) => {
19828
19829
  const results = await getVirtualRouteBatch(pattern, config);
19829
19830
  for (const result of results) {
19830
- routes.push(result);
19831
+ if (!existingRoutes.includes(result.name)) {
19832
+ routes.push(result);
19833
+ existingRoutes.push(result.name);
19834
+ }
19831
19835
  }
19832
19836
  })
19833
19837
  );
@@ -19836,7 +19840,7 @@ async function createRoutesModule(config) {
19836
19840
  `${routes.map(
19837
19841
  (route) => `import ${route.importName} from '${route.importPath}';`
19838
19842
  ).join("\n")}
19839
- const routes: { id: string; route: any }[] = [${routes.map(
19843
+ const routes = [${routes.map(
19840
19844
  (route) => `{ id: '${route.name}', route: ${route.importName} }`
19841
19845
  ).join(",\n")}
19842
19846
  ];
@@ -19844,7 +19848,7 @@ async function createRoutesModule(config) {
19844
19848
  { parser: "typescript", tabWidth: 4 }
19845
19849
  );
19846
19850
  await fs__default$1.writeFile(
19847
- path__default$1.resolve(config.rootDir, config.buildDir, "routes.ts"),
19851
+ path__default$1.resolve(config.rootDir, config.buildDir, "routes.js"),
19848
19852
  module
19849
19853
  );
19850
19854
  }
@@ -19860,8 +19864,9 @@ async function getVirtualRouteBatch(globPattern, config) {
19860
19864
  for (const file of files) {
19861
19865
  const meta = getRpcMetaFromPath(config, file);
19862
19866
  if (meta) {
19863
- const importParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.buildDir), file).split(".");
19867
+ const importParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.srcDir), file).split(".");
19864
19868
  importParts.pop();
19869
+ importParts.push("js");
19865
19870
  routes.push({
19866
19871
  name: meta.id,
19867
19872
  importName: app.camelCase(meta.id.split(".").join("_")),
@@ -19905,6 +19910,25 @@ const getRpcMetaFromPath = (config, filePath) => {
19905
19910
  httpPath: `/${httpParts.join("/")}`
19906
19911
  };
19907
19912
  };
19913
+ async function transpileFiles(config) {
19914
+ const outDir = path__default$1.resolve(config.rootDir, config.buildDir);
19915
+ const files = await globby(["**/*.ts"], {
19916
+ cwd: path__default$1.resolve(config.rootDir, config.srcDir)
19917
+ });
19918
+ await esbuild.build({
19919
+ ...config.esbuild,
19920
+ entryPoints: [
19921
+ ...files.map(
19922
+ (file) => path__default$1.resolve(config.rootDir, config.srcDir, file)
19923
+ )
19924
+ ],
19925
+ outdir: outDir,
19926
+ bundle: true,
19927
+ format: "esm",
19928
+ target: "node18",
19929
+ platform: "node"
19930
+ });
19931
+ }
19908
19932
 
19909
19933
  const build = citty.defineCommand({
19910
19934
  args: {
@@ -19937,14 +19961,19 @@ async function startBuild(config) {
19937
19961
  logger$1.log("Bundling server....");
19938
19962
  await setupWorkingDir(config);
19939
19963
  await Promise.all([
19964
+ transpileFiles(config),
19940
19965
  createRoutesModule(config),
19941
19966
  createBuildEntryModule(config),
19942
19967
  createBuildCodegenModule(config)
19943
19968
  ]);
19944
- await bundleFiles$1(config);
19969
+ await bundleFiles(config);
19945
19970
  logger$1.log("Finished bundling");
19946
19971
  const clientCount = config.clientGenerators.length;
19947
- const codegenModule = path__default$1.resolve(config.rootDir, ".output", "codegen.js");
19972
+ const codegenModule = path__default$1.resolve(
19973
+ config.rootDir,
19974
+ config.buildDir,
19975
+ "codegen.js"
19976
+ );
19948
19977
  if (clientCount > 0) {
19949
19978
  logger$1.log("Generating clients");
19950
19979
  node_child_process.execSync(`node ${codegenModule}`);
@@ -19969,27 +19998,32 @@ async function startBuild(config) {
19969
19998
  `Build finished! You can start your server by running "node .output/server.js"`
19970
19999
  );
19971
20000
  }
19972
- async function bundleFiles$1(config) {
20001
+ async function bundleFiles(config) {
19973
20002
  await esbuild.build({
19974
20003
  ...config.esbuild,
19975
20004
  entryPoints: [
19976
- path__default$1.resolve(config.rootDir, config.buildDir, "server.ts"),
19977
- path__default$1.resolve(config.rootDir, config.buildDir, "codegen.ts")
20005
+ path__default$1.resolve(config.rootDir, config.buildDir, "server.js")
19978
20006
  ],
19979
20007
  platform: config.esbuild.platform ?? "node",
19980
20008
  target: config.esbuild.target ?? "node18",
19981
20009
  bundle: true,
20010
+ format: "esm",
20011
+ sourcemap: true,
20012
+ minifyWhitespace: true,
20013
+ banner: {
20014
+ js: "import { createRequire as topLevelCreateRequire } from 'module';\n const require = topLevelCreateRequire(import.meta.url);"
20015
+ },
19982
20016
  outdir: path__default$1.resolve(config.rootDir, ".output")
19983
20017
  });
19984
20018
  }
19985
20019
  async function createBuildEntryModule(config) {
19986
20020
  const appModule = path__default$1.resolve(config.rootDir, config.srcDir, config.entry);
19987
- const appImportParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.buildDir), appModule).split(".");
20021
+ const appImportParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.srcDir), appModule).split(".");
19988
20022
  appImportParts.pop();
19989
20023
  const virtualEntry = `import { toNodeListener } from 'h3';
19990
20024
  import { listen } from 'listhen';
19991
- import routes from './routes';
19992
- import app from './${appImportParts.join(".")}';
20025
+ import routes from './routes.js';
20026
+ import app from './${appImportParts.join(".")}.js';
19993
20027
 
19994
20028
  for (const route of routes) {
19995
20029
  app.registerRpc(route.id, route.route);
@@ -19999,29 +20033,35 @@ void listen(toNodeListener(app.getH3Instance()), {
19999
20033
  port: process.env.PORT ?? ${config.port},
20000
20034
  });`;
20001
20035
  await fs__default$1.writeFile(
20002
- path__default$1.resolve(config.rootDir, config.buildDir, "server.ts"),
20036
+ path__default$1.resolve(config.rootDir, config.buildDir, "server.js"),
20003
20037
  virtualEntry
20004
20038
  );
20005
20039
  }
20006
20040
  async function createBuildCodegenModule(config) {
20007
20041
  const appModule = path__default$1.resolve(config.rootDir, config.srcDir, config.entry);
20008
- const appImportParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.buildDir), appModule).split(".");
20042
+ const appImportParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.srcDir), appModule).split(".");
20009
20043
  appImportParts.pop();
20010
20044
  const virtualModule = await prettier__default.format(
20011
20045
  `
20012
20046
  import { writeFileSync } from 'node:fs';
20013
20047
  import path from 'pathe';
20014
- import app from './${appImportParts.join(".")}';
20048
+ import app from './${appImportParts.join(".")}.js';
20049
+ import routes from './routes.js';
20050
+
20051
+ for(const route of routes) {
20052
+ app.registerRpc(route.id, route.route);
20053
+ }
20015
20054
 
20055
+ const __dirname = new URL(".", import.meta.url).pathname;
20016
20056
  const def = app.getAppDefinition();
20017
20057
  writeFileSync(
20018
- path.resolve(__dirname, "__definition.json"),
20058
+ path.resolve(__dirname, "../.output", "__definition.json"),
20019
20059
  JSON.stringify(def),
20020
20060
  );`,
20021
20061
  { tabWidth: 4, parser: "typescript" }
20022
20062
  );
20023
20063
  await fs__default$1.writeFile(
20024
- path__default$1.resolve(config.rootDir, config.buildDir, "codegen.ts"),
20064
+ path__default$1.resolve(config.rootDir, config.buildDir, "codegen.js"),
20025
20065
  virtualModule
20026
20066
  );
20027
20067
  }
@@ -20113,8 +20153,7 @@ const dev = citty.defineCommand({
20113
20153
  async run({ args }) {
20114
20154
  process.env.ARRI_DEV_MODE = "true";
20115
20155
  const config = await loadConfig({
20116
- configFile: path__default$1.resolve(args.config),
20117
- defaultConfig: index.defaultConfig
20156
+ configFile: path__default$1.resolve(args.config)
20118
20157
  });
20119
20158
  if (!config) {
20120
20159
  throw new Error("Unable to find config");
@@ -20122,20 +20161,7 @@ const dev = citty.defineCommand({
20122
20161
  await startDevServer(config.config);
20123
20162
  }
20124
20163
  });
20125
- async function bundleFiles(config) {
20126
- const outDir = path__default$1.resolve(config.rootDir, ".output");
20127
- await esbuild.build({
20128
- ...config.esbuild,
20129
- entryPoints: [
20130
- path__default$1.resolve(config.rootDir, config.buildDir, "entry.ts")
20131
- ],
20132
- outdir: outDir,
20133
- bundle: true,
20134
- target: "node18",
20135
- platform: "node"
20136
- });
20137
- }
20138
- const startListener = (config, showQr = false) => listhen.listenAndWatch(path__default$1.resolve(config.rootDir, ".output", "entry.js"), {
20164
+ const startListener = (config, showQr = false) => listhen.listenAndWatch(path__default$1.resolve(config.rootDir, config.buildDir, "entry.js"), {
20139
20165
  public: true,
20140
20166
  port: config.port,
20141
20167
  logger,
@@ -20145,8 +20171,8 @@ async function startDevServer(config) {
20145
20171
  await setupWorkingDir(config);
20146
20172
  let fileWatcher;
20147
20173
  await Promise.all([createRoutesModule(config), createEntryModule(config)]);
20148
- await bundleFiles(config);
20149
- let listener = await startListener(config, true);
20174
+ await transpileFiles(config);
20175
+ await startListener(config, true);
20150
20176
  setTimeout(async () => {
20151
20177
  await generateClients(config);
20152
20178
  }, 1e3);
@@ -20166,15 +20192,14 @@ async function startDevServer(config) {
20166
20192
  ignoreInitial: true
20167
20193
  });
20168
20194
  fileWatcher.on("all", async (_event, file) => {
20195
+ await transpileFiles(config);
20169
20196
  await createRoutesModule(config);
20170
20197
  let bundleCreated = false;
20171
20198
  try {
20172
20199
  logger.log(
20173
20200
  "Change detected. Bundling files and restarting server...."
20174
20201
  );
20175
- await listener.close();
20176
- await bundleFiles(config);
20177
- listener = await startListener(config);
20202
+ await transpileFiles(config);
20178
20203
  bundleCreated = true;
20179
20204
  } catch (err) {
20180
20205
  logger.error(err);
@@ -20216,7 +20241,7 @@ async function generateClients(config) {
20216
20241
  }
20217
20242
  async function createEntryModule(config) {
20218
20243
  const appModule = path__default$1.resolve(config.rootDir, config.srcDir, config.entry);
20219
- const appImportParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.buildDir), appModule).split(".");
20244
+ const appImportParts = path__default$1.relative(path__default$1.resolve(config.rootDir, config.srcDir), appModule).split(".");
20220
20245
  appImportParts.pop();
20221
20246
  const virtualEntry = `import { toNodeListener } from 'h3';
20222
20247
  import { listen } from 'listhen';
@@ -20229,7 +20254,7 @@ for (const route of routes) {
20229
20254
 
20230
20255
  export default app.getH3Instance();`;
20231
20256
  await fs__default$1.writeFile(
20232
- path__default$1.resolve(config.rootDir, config.buildDir, "entry.ts"),
20257
+ path__default$1.resolve(config.rootDir, config.buildDir, "entry.js"),
20233
20258
  virtualEntry
20234
20259
  );
20235
20260
  }
package/dist/cli.mjs CHANGED
@@ -31,7 +31,7 @@ import '@sinclair/typebox';
31
31
  import 'h3';
32
32
  import '@sinclair/typebox/errors';
33
33
  import '@sinclair/typebox/value';
34
- import { a as dartClientGenerator } from './shared/arri.c6b92822.mjs';
34
+ import { a as dartClientGenerator } from './shared/arri.6966fa30.mjs';
35
35
  import { listenAndWatch } from 'listhen';
36
36
  import 'child_process';
37
37
 
@@ -19802,11 +19802,15 @@ async function setupWorkingDir(config) {
19802
19802
  }
19803
19803
  async function createRoutesModule(config) {
19804
19804
  const routes = [];
19805
+ const existingRoutes = [];
19805
19806
  await Promise.all(
19806
19807
  config.procedureGlobPatterns.map(async (pattern) => {
19807
19808
  const results = await getVirtualRouteBatch(pattern, config);
19808
19809
  for (const result of results) {
19809
- routes.push(result);
19810
+ if (!existingRoutes.includes(result.name)) {
19811
+ routes.push(result);
19812
+ existingRoutes.push(result.name);
19813
+ }
19810
19814
  }
19811
19815
  })
19812
19816
  );
@@ -19815,7 +19819,7 @@ async function createRoutesModule(config) {
19815
19819
  `${routes.map(
19816
19820
  (route) => `import ${route.importName} from '${route.importPath}';`
19817
19821
  ).join("\n")}
19818
- const routes: { id: string; route: any }[] = [${routes.map(
19822
+ const routes = [${routes.map(
19819
19823
  (route) => `{ id: '${route.name}', route: ${route.importName} }`
19820
19824
  ).join(",\n")}
19821
19825
  ];
@@ -19823,7 +19827,7 @@ async function createRoutesModule(config) {
19823
19827
  { parser: "typescript", tabWidth: 4 }
19824
19828
  );
19825
19829
  await fs$f.writeFile(
19826
- path$e.resolve(config.rootDir, config.buildDir, "routes.ts"),
19830
+ path$e.resolve(config.rootDir, config.buildDir, "routes.js"),
19827
19831
  module
19828
19832
  );
19829
19833
  }
@@ -19839,8 +19843,9 @@ async function getVirtualRouteBatch(globPattern, config) {
19839
19843
  for (const file of files) {
19840
19844
  const meta = getRpcMetaFromPath(config, file);
19841
19845
  if (meta) {
19842
- const importParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), file).split(".");
19846
+ const importParts = path$e.relative(path$e.resolve(config.rootDir, config.srcDir), file).split(".");
19843
19847
  importParts.pop();
19848
+ importParts.push("js");
19844
19849
  routes.push({
19845
19850
  name: meta.id,
19846
19851
  importName: camelCase(meta.id.split(".").join("_")),
@@ -19884,6 +19889,25 @@ const getRpcMetaFromPath = (config, filePath) => {
19884
19889
  httpPath: `/${httpParts.join("/")}`
19885
19890
  };
19886
19891
  };
19892
+ async function transpileFiles(config) {
19893
+ const outDir = path$e.resolve(config.rootDir, config.buildDir);
19894
+ const files = await globby(["**/*.ts"], {
19895
+ cwd: path$e.resolve(config.rootDir, config.srcDir)
19896
+ });
19897
+ await build$1({
19898
+ ...config.esbuild,
19899
+ entryPoints: [
19900
+ ...files.map(
19901
+ (file) => path$e.resolve(config.rootDir, config.srcDir, file)
19902
+ )
19903
+ ],
19904
+ outdir: outDir,
19905
+ bundle: true,
19906
+ format: "esm",
19907
+ target: "node18",
19908
+ platform: "node"
19909
+ });
19910
+ }
19887
19911
 
19888
19912
  const build = defineCommand({
19889
19913
  args: {
@@ -19916,14 +19940,19 @@ async function startBuild(config) {
19916
19940
  logger$1.log("Bundling server....");
19917
19941
  await setupWorkingDir(config);
19918
19942
  await Promise.all([
19943
+ transpileFiles(config),
19919
19944
  createRoutesModule(config),
19920
19945
  createBuildEntryModule(config),
19921
19946
  createBuildCodegenModule(config)
19922
19947
  ]);
19923
- await bundleFiles$1(config);
19948
+ await bundleFiles(config);
19924
19949
  logger$1.log("Finished bundling");
19925
19950
  const clientCount = config.clientGenerators.length;
19926
- const codegenModule = path$e.resolve(config.rootDir, ".output", "codegen.js");
19951
+ const codegenModule = path$e.resolve(
19952
+ config.rootDir,
19953
+ config.buildDir,
19954
+ "codegen.js"
19955
+ );
19927
19956
  if (clientCount > 0) {
19928
19957
  logger$1.log("Generating clients");
19929
19958
  execSync(`node ${codegenModule}`);
@@ -19948,27 +19977,32 @@ async function startBuild(config) {
19948
19977
  `Build finished! You can start your server by running "node .output/server.js"`
19949
19978
  );
19950
19979
  }
19951
- async function bundleFiles$1(config) {
19980
+ async function bundleFiles(config) {
19952
19981
  await build$1({
19953
19982
  ...config.esbuild,
19954
19983
  entryPoints: [
19955
- path$e.resolve(config.rootDir, config.buildDir, "server.ts"),
19956
- path$e.resolve(config.rootDir, config.buildDir, "codegen.ts")
19984
+ path$e.resolve(config.rootDir, config.buildDir, "server.js")
19957
19985
  ],
19958
19986
  platform: config.esbuild.platform ?? "node",
19959
19987
  target: config.esbuild.target ?? "node18",
19960
19988
  bundle: true,
19989
+ format: "esm",
19990
+ sourcemap: true,
19991
+ minifyWhitespace: true,
19992
+ banner: {
19993
+ js: "import { createRequire as topLevelCreateRequire } from 'module';\n const require = topLevelCreateRequire(import.meta.url);"
19994
+ },
19961
19995
  outdir: path$e.resolve(config.rootDir, ".output")
19962
19996
  });
19963
19997
  }
19964
19998
  async function createBuildEntryModule(config) {
19965
19999
  const appModule = path$e.resolve(config.rootDir, config.srcDir, config.entry);
19966
- const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), appModule).split(".");
20000
+ const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.srcDir), appModule).split(".");
19967
20001
  appImportParts.pop();
19968
20002
  const virtualEntry = `import { toNodeListener } from 'h3';
19969
20003
  import { listen } from 'listhen';
19970
- import routes from './routes';
19971
- import app from './${appImportParts.join(".")}';
20004
+ import routes from './routes.js';
20005
+ import app from './${appImportParts.join(".")}.js';
19972
20006
 
19973
20007
  for (const route of routes) {
19974
20008
  app.registerRpc(route.id, route.route);
@@ -19978,29 +20012,35 @@ void listen(toNodeListener(app.getH3Instance()), {
19978
20012
  port: process.env.PORT ?? ${config.port},
19979
20013
  });`;
19980
20014
  await fs$f.writeFile(
19981
- path$e.resolve(config.rootDir, config.buildDir, "server.ts"),
20015
+ path$e.resolve(config.rootDir, config.buildDir, "server.js"),
19982
20016
  virtualEntry
19983
20017
  );
19984
20018
  }
19985
20019
  async function createBuildCodegenModule(config) {
19986
20020
  const appModule = path$e.resolve(config.rootDir, config.srcDir, config.entry);
19987
- const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), appModule).split(".");
20021
+ const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.srcDir), appModule).split(".");
19988
20022
  appImportParts.pop();
19989
20023
  const virtualModule = await prettier.format(
19990
20024
  `
19991
20025
  import { writeFileSync } from 'node:fs';
19992
20026
  import path from 'pathe';
19993
- import app from './${appImportParts.join(".")}';
20027
+ import app from './${appImportParts.join(".")}.js';
20028
+ import routes from './routes.js';
20029
+
20030
+ for(const route of routes) {
20031
+ app.registerRpc(route.id, route.route);
20032
+ }
19994
20033
 
20034
+ const __dirname = new URL(".", import.meta.url).pathname;
19995
20035
  const def = app.getAppDefinition();
19996
20036
  writeFileSync(
19997
- path.resolve(__dirname, "__definition.json"),
20037
+ path.resolve(__dirname, "../.output", "__definition.json"),
19998
20038
  JSON.stringify(def),
19999
20039
  );`,
20000
20040
  { tabWidth: 4, parser: "typescript" }
20001
20041
  );
20002
20042
  await fs$f.writeFile(
20003
- path$e.resolve(config.rootDir, config.buildDir, "codegen.ts"),
20043
+ path$e.resolve(config.rootDir, config.buildDir, "codegen.js"),
20004
20044
  virtualModule
20005
20045
  );
20006
20046
  }
@@ -20092,8 +20132,7 @@ const dev = defineCommand({
20092
20132
  async run({ args }) {
20093
20133
  process.env.ARRI_DEV_MODE = "true";
20094
20134
  const config = await loadConfig({
20095
- configFile: path$e.resolve(args.config),
20096
- defaultConfig
20135
+ configFile: path$e.resolve(args.config)
20097
20136
  });
20098
20137
  if (!config) {
20099
20138
  throw new Error("Unable to find config");
@@ -20101,20 +20140,7 @@ const dev = defineCommand({
20101
20140
  await startDevServer(config.config);
20102
20141
  }
20103
20142
  });
20104
- async function bundleFiles(config) {
20105
- const outDir = path$e.resolve(config.rootDir, ".output");
20106
- await build$1({
20107
- ...config.esbuild,
20108
- entryPoints: [
20109
- path$e.resolve(config.rootDir, config.buildDir, "entry.ts")
20110
- ],
20111
- outdir: outDir,
20112
- bundle: true,
20113
- target: "node18",
20114
- platform: "node"
20115
- });
20116
- }
20117
- const startListener = (config, showQr = false) => listenAndWatch(path$e.resolve(config.rootDir, ".output", "entry.js"), {
20143
+ const startListener = (config, showQr = false) => listenAndWatch(path$e.resolve(config.rootDir, config.buildDir, "entry.js"), {
20118
20144
  public: true,
20119
20145
  port: config.port,
20120
20146
  logger,
@@ -20124,8 +20150,8 @@ async function startDevServer(config) {
20124
20150
  await setupWorkingDir(config);
20125
20151
  let fileWatcher;
20126
20152
  await Promise.all([createRoutesModule(config), createEntryModule(config)]);
20127
- await bundleFiles(config);
20128
- let listener = await startListener(config, true);
20153
+ await transpileFiles(config);
20154
+ await startListener(config, true);
20129
20155
  setTimeout(async () => {
20130
20156
  await generateClients(config);
20131
20157
  }, 1e3);
@@ -20145,15 +20171,14 @@ async function startDevServer(config) {
20145
20171
  ignoreInitial: true
20146
20172
  });
20147
20173
  fileWatcher.on("all", async (_event, file) => {
20174
+ await transpileFiles(config);
20148
20175
  await createRoutesModule(config);
20149
20176
  let bundleCreated = false;
20150
20177
  try {
20151
20178
  logger.log(
20152
20179
  "Change detected. Bundling files and restarting server...."
20153
20180
  );
20154
- await listener.close();
20155
- await bundleFiles(config);
20156
- listener = await startListener(config);
20181
+ await transpileFiles(config);
20157
20182
  bundleCreated = true;
20158
20183
  } catch (err) {
20159
20184
  logger.error(err);
@@ -20195,7 +20220,7 @@ async function generateClients(config) {
20195
20220
  }
20196
20221
  async function createEntryModule(config) {
20197
20222
  const appModule = path$e.resolve(config.rootDir, config.srcDir, config.entry);
20198
- const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), appModule).split(".");
20223
+ const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.srcDir), appModule).split(".");
20199
20224
  appImportParts.pop();
20200
20225
  const virtualEntry = `import { toNodeListener } from 'h3';
20201
20226
  import { listen } from 'listhen';
@@ -20208,7 +20233,7 @@ for (const route of routes) {
20208
20233
 
20209
20234
  export default app.getH3Instance();`;
20210
20235
  await fs$f.writeFile(
20211
- path$e.resolve(config.rootDir, config.buildDir, "entry.ts"),
20236
+ path$e.resolve(config.rootDir, config.buildDir, "entry.js"),
20212
20237
  virtualEntry
20213
20238
  );
20214
20239
  }
package/dist/codegen.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  const require$$0 = require('fs');
4
4
  const prettier = require('prettier');
5
5
  const app = require('./shared/arri.38792eb4.cjs');
6
- const dart = require('./shared/arri.234caf5e.cjs');
6
+ const dart = require('./shared/arri.12a51234.cjs');
7
7
  require('@sinclair/typebox');
8
8
  require('h3');
9
9
  require('@sinclair/typebox/errors');
@@ -20,6 +20,11 @@ const typescriptClientGenerator = dart.defineClientGeneratorPlugin(
20
20
  if (!options.outputFile) {
21
21
  throw new Error("No output file specified");
22
22
  }
23
+ if (Object.keys(def.procedures).length <= 0) {
24
+ throw new Error(
25
+ "No procedures found in definition file. Typescript client will not be generated."
26
+ );
27
+ }
23
28
  const result = await createTypescriptClient(
24
29
  def,
25
30
  options.clientName
package/dist/codegen.mjs CHANGED
@@ -2,8 +2,8 @@ import { writeFileSync } from 'fs';
2
2
  import { format } from 'prettier';
3
3
  import { u as unflattenObject, i as isServiceDef, p as pascalCase, a as isProcedureDef, b as isJsonSchemaScalarType, c as isJsonSchemaNullType, d as isJsonSchemaObject, e as isJsonSchemaEnum, f as isJsonSchemaArray, g as unflattenProcedures, h as camelCase } from './shared/arri.e547206a.mjs';
4
4
  export { l as JsonSchemaComplexTypeValues, k as JsonSchemaNullTypeValues, J as JsonSchemaScalarTypeValues, j as isApplicationDef, n as normalizeWhitespace, r as removeDisallowedChars, s as setNestedObjectProperty } from './shared/arri.e547206a.mjs';
5
- import { d as defineClientGeneratorPlugin } from './shared/arri.c6b92822.mjs';
6
- export { j as classListTransformer, i as classTransformer, c as createDartClient, a as dartClientGenerator, f as dartModelFromJsonSchema, h as dartParsedJsonField, e as dartProcedureFromServiceDefinition, g as dartPropertyTypeFromSchema, b as dartServiceFromServiceDefinition, k as isDartType, l as isDartTypeWithNullables, t as transformers } from './shared/arri.c6b92822.mjs';
5
+ import { d as defineClientGeneratorPlugin } from './shared/arri.6966fa30.mjs';
6
+ export { j as classListTransformer, i as classTransformer, c as createDartClient, a as dartClientGenerator, f as dartModelFromJsonSchema, h as dartParsedJsonField, e as dartProcedureFromServiceDefinition, g as dartPropertyTypeFromSchema, b as dartServiceFromServiceDefinition, k as isDartType, l as isDartTypeWithNullables, t as transformers } from './shared/arri.6966fa30.mjs';
7
7
  import '@sinclair/typebox';
8
8
  import 'h3';
9
9
  import '@sinclair/typebox/errors';
@@ -20,6 +20,11 @@ const typescriptClientGenerator = defineClientGeneratorPlugin(
20
20
  if (!options.outputFile) {
21
21
  throw new Error("No output file specified");
22
22
  }
23
+ if (Object.keys(def.procedures).length <= 0) {
24
+ throw new Error(
25
+ "No procedures found in definition file. Typescript client will not be generated."
26
+ );
27
+ }
23
28
  const result = await createTypescriptClient(
24
29
  def,
25
30
  options.clientName
@@ -22,6 +22,13 @@ const dartClientGenerator = defineClientGeneratorPlugin(
22
22
  'Missing "outputFile" cannot generate dart client'
23
23
  );
24
24
  }
25
+ const numProcedures = Object.keys(def.procedures).length;
26
+ if (numProcedures <= 0) {
27
+ console.warn(
28
+ "No procedures found in definition file. Dart client will not be generated"
29
+ );
30
+ return;
31
+ }
25
32
  const result = createDartClient(def, {
26
33
  clientName: options.clientName
27
34
  });
@@ -448,14 +455,32 @@ function dartParsedJsonField(fieldName, jsonKey, dartType) {
448
455
  jsonKey,
449
456
  "false"
450
457
  );
458
+ case "bool?":
459
+ return transformers.bool.fromJsonBody(
460
+ fieldName,
461
+ jsonKey,
462
+ "null"
463
+ );
451
464
  case "double":
452
465
  return transformers.double.fromJsonBody(
453
466
  fieldName,
454
467
  jsonKey,
455
468
  "0.0"
456
469
  );
470
+ case "double?":
471
+ return transformers.double.fromJsonBody(
472
+ fieldName,
473
+ jsonKey,
474
+ "null"
475
+ );
457
476
  case "int":
458
477
  return transformers.int.fromJsonBody(fieldName, jsonKey, "0");
478
+ case "int?":
479
+ return transformers.int.fromJsonBody(
480
+ fieldName,
481
+ jsonKey,
482
+ "null"
483
+ );
459
484
  case "null":
460
485
  return transformers.null.fromJsonBody(fieldName, jsonKey, "");
461
486
  case "DateTime":
@@ -524,11 +549,11 @@ const transformers = {
524
549
  toJsonBody: defaultToJsonBody
525
550
  },
526
551
  int: {
527
- fromJsonBody: (key, jsonKey, fallback) => defaultFromJsonBody(key, jsonKey, "int", fallback),
552
+ fromJsonBody: (key, jsonKey, fallback) => fallback === "null" ? `${key}: nullableIntFromDynamic(json["${jsonKey}"])` : `${key}: intFromDynamic(json["${jsonKey}"], ${fallback})`,
528
553
  toJsonBody: defaultToJsonBody
529
554
  },
530
555
  double: {
531
- fromJsonBody: (key, jsonKey, fallback) => defaultFromJsonBody(key, jsonKey, "double", fallback),
556
+ fromJsonBody: (key, jsonKey, fallback) => fallback === "null" ? `${key}: nullableDoubleFromDynamic(json["${jsonKey}"])` : `${key}: doubleFromDynamic(json["${jsonKey}"], ${fallback})`,
532
557
  toJsonBody: defaultToJsonBody
533
558
  },
534
559
  String: {
@@ -540,7 +565,7 @@ const transformers = {
540
565
  toJsonBody: defaultToJsonBody
541
566
  },
542
567
  DateTime: {
543
- fromJsonBody: (key, jsonKey, fallback) => `${key}: json["${jsonKey}"] is String ? DateTime.parse(json["${jsonKey}"]) : ${fallback}`,
568
+ fromJsonBody: (key, jsonKey, fallback) => fallback === "null" ? `${key}: nullableDateTimeFromDynamic(json["${jsonKey}"])` : `${key}: dateTimeFromDynamic(json["${jsonKey}"], ${fallback})`,
544
569
  toJsonBody: (key, jsonKey, isNullable) => `"${jsonKey}": ${key}${isNullable ? "?" : ""}.toIso8601String()`
545
570
  },
546
571
  "List<null>": {
@@ -579,7 +604,10 @@ const transformers = {
579
604
  }
580
605
  };
581
606
  function defaultFromJsonBody(key, jsonKey, typename, fallback) {
582
- return `${key}: json["${jsonKey}"] is ${typename} ? json["${jsonKey}"] : ${fallback}`;
607
+ if (fallback === "null") {
608
+ return `${key}: nullableTypeFromDynamic<${typename}>(json["${jsonKey}"])`;
609
+ }
610
+ return `${key}: typeFromDynamic<${typename}>(json["${jsonKey}"], ${fallback})`;
583
611
  }
584
612
  function defaultListFromJsonBody(key, jsonKey, typename, fallback) {
585
613
  return `${key}: json["${jsonKey}"] is List<${typename}> ? json["${jsonKey}"] : ${fallback}`;
@@ -604,7 +632,7 @@ const classTransformer = (typename, nullable) => {
604
632
  const classListTransformer = (typename) => {
605
633
  return {
606
634
  fromJsonBody: (key, jsonKey, fallback) => {
607
- return `${key}: json["${jsonKey}"] is List<Map<String, dynamic>> ?
635
+ return `${key}: json["${jsonKey}"] is List ?
608
636
  (json["${jsonKey}"] as List<Map<String, dynamic>>)
609
637
  .map((val) => ${typename}.fromJson(val)).toList() : ${fallback}`;
610
638
  },
@@ -20,6 +20,13 @@ const dartClientGenerator = defineClientGeneratorPlugin(
20
20
  'Missing "outputFile" cannot generate dart client'
21
21
  );
22
22
  }
23
+ const numProcedures = Object.keys(def.procedures).length;
24
+ if (numProcedures <= 0) {
25
+ console.warn(
26
+ "No procedures found in definition file. Dart client will not be generated"
27
+ );
28
+ return;
29
+ }
23
30
  const result = createDartClient(def, {
24
31
  clientName: options.clientName
25
32
  });
@@ -446,14 +453,32 @@ function dartParsedJsonField(fieldName, jsonKey, dartType) {
446
453
  jsonKey,
447
454
  "false"
448
455
  );
456
+ case "bool?":
457
+ return transformers.bool.fromJsonBody(
458
+ fieldName,
459
+ jsonKey,
460
+ "null"
461
+ );
449
462
  case "double":
450
463
  return transformers.double.fromJsonBody(
451
464
  fieldName,
452
465
  jsonKey,
453
466
  "0.0"
454
467
  );
468
+ case "double?":
469
+ return transformers.double.fromJsonBody(
470
+ fieldName,
471
+ jsonKey,
472
+ "null"
473
+ );
455
474
  case "int":
456
475
  return transformers.int.fromJsonBody(fieldName, jsonKey, "0");
476
+ case "int?":
477
+ return transformers.int.fromJsonBody(
478
+ fieldName,
479
+ jsonKey,
480
+ "null"
481
+ );
457
482
  case "null":
458
483
  return transformers.null.fromJsonBody(fieldName, jsonKey, "");
459
484
  case "DateTime":
@@ -522,11 +547,11 @@ const transformers = {
522
547
  toJsonBody: defaultToJsonBody
523
548
  },
524
549
  int: {
525
- fromJsonBody: (key, jsonKey, fallback) => defaultFromJsonBody(key, jsonKey, "int", fallback),
550
+ fromJsonBody: (key, jsonKey, fallback) => fallback === "null" ? `${key}: nullableIntFromDynamic(json["${jsonKey}"])` : `${key}: intFromDynamic(json["${jsonKey}"], ${fallback})`,
526
551
  toJsonBody: defaultToJsonBody
527
552
  },
528
553
  double: {
529
- fromJsonBody: (key, jsonKey, fallback) => defaultFromJsonBody(key, jsonKey, "double", fallback),
554
+ fromJsonBody: (key, jsonKey, fallback) => fallback === "null" ? `${key}: nullableDoubleFromDynamic(json["${jsonKey}"])` : `${key}: doubleFromDynamic(json["${jsonKey}"], ${fallback})`,
530
555
  toJsonBody: defaultToJsonBody
531
556
  },
532
557
  String: {
@@ -538,7 +563,7 @@ const transformers = {
538
563
  toJsonBody: defaultToJsonBody
539
564
  },
540
565
  DateTime: {
541
- fromJsonBody: (key, jsonKey, fallback) => `${key}: json["${jsonKey}"] is String ? DateTime.parse(json["${jsonKey}"]) : ${fallback}`,
566
+ fromJsonBody: (key, jsonKey, fallback) => fallback === "null" ? `${key}: nullableDateTimeFromDynamic(json["${jsonKey}"])` : `${key}: dateTimeFromDynamic(json["${jsonKey}"], ${fallback})`,
542
567
  toJsonBody: (key, jsonKey, isNullable) => `"${jsonKey}": ${key}${isNullable ? "?" : ""}.toIso8601String()`
543
568
  },
544
569
  "List<null>": {
@@ -577,7 +602,10 @@ const transformers = {
577
602
  }
578
603
  };
579
604
  function defaultFromJsonBody(key, jsonKey, typename, fallback) {
580
- return `${key}: json["${jsonKey}"] is ${typename} ? json["${jsonKey}"] : ${fallback}`;
605
+ if (fallback === "null") {
606
+ return `${key}: nullableTypeFromDynamic<${typename}>(json["${jsonKey}"])`;
607
+ }
608
+ return `${key}: typeFromDynamic<${typename}>(json["${jsonKey}"], ${fallback})`;
581
609
  }
582
610
  function defaultListFromJsonBody(key, jsonKey, typename, fallback) {
583
611
  return `${key}: json["${jsonKey}"] is List<${typename}> ? json["${jsonKey}"] : ${fallback}`;
@@ -602,7 +630,7 @@ const classTransformer = (typename, nullable) => {
602
630
  const classListTransformer = (typename) => {
603
631
  return {
604
632
  fromJsonBody: (key, jsonKey, fallback) => {
605
- return `${key}: json["${jsonKey}"] is List<Map<String, dynamic>> ?
633
+ return `${key}: json["${jsonKey}"] is List ?
606
634
  (json["${jsonKey}"] as List<Map<String, dynamic>>)
607
635
  .map((val) => ${typename}.fromJson(val)).toList() : ${fallback}`;
608
636
  },
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "chokidar": "^3.5.3",
26
26
  "listhen": "^1.4.4"
27
27
  },
28
- "version": "0.0.21",
28
+ "version": "0.0.23",
29
29
  "repository": {
30
30
  "url": "https://github.com/modiimedia/arri"
31
31
  }