arri 0.0.18 → 0.0.20
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/chunks/index.cjs +10 -9
- package/dist/chunks/index.mjs +10 -9
- package/dist/cli.cjs +348 -225
- package/dist/cli.mjs +348 -213
- package/dist/codegen.mjs +4 -4
- package/dist/index.cjs +5 -2
- package/dist/index.d.cts +4 -1
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.mjs +6 -4
- package/dist/shared/{arri.4d2ea869.mjs → arri.c6b92822.mjs} +1 -1
- package/dist/shared/{arri.54e67ffe.mjs → arri.e547206a.mjs} +1 -1
- package/package.json +8 -8
package/dist/cli.mjs
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
#! /usr/bin/env node
|
|
2
2
|
import { defineCommand, runMain } from 'citty';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
3
4
|
import fs$e, { existsSync, readFileSync, realpathSync, statSync as statSync$1, Stats, promises } from 'node:fs';
|
|
4
|
-
import { ofetch } from 'ofetch';
|
|
5
|
-
import require$$0 from 'fs';
|
|
6
|
-
import * as prettier from 'prettier';
|
|
7
|
-
import '@sinclair/typebox';
|
|
8
|
-
import 'h3';
|
|
9
|
-
import { a as DEV_DEFINITION_ENDPOINT, C as isApplicationDef, z as camelCase, G as removeDisallowedChars, L as kebabCase } from './shared/arri.54e67ffe.mjs';
|
|
10
|
-
import '@sinclair/typebox/errors';
|
|
11
|
-
import '@sinclair/typebox/value';
|
|
12
|
-
import { a as dartClientGenerator } from './shared/arri.4d2ea869.mjs';
|
|
13
5
|
import fs$f, { rm } from 'node:fs/promises';
|
|
14
6
|
import path$e, { isAbsolute, resolve as resolve$1, dirname, join, extname as extname$1, basename } from 'pathe';
|
|
7
|
+
import require$$0 from 'fs';
|
|
15
8
|
import require$$0$1 from 'path';
|
|
16
9
|
import require$$2 from 'os';
|
|
17
10
|
import require$$3 from 'crypto';
|
|
@@ -28,79 +21,20 @@ import require$$0$4 from 'events';
|
|
|
28
21
|
import require$$0$2 from 'util';
|
|
29
22
|
import require$$0$3 from 'stream';
|
|
30
23
|
import { createConsola } from 'consola';
|
|
31
|
-
import { build } from 'esbuild';
|
|
24
|
+
import { build as build$1 } from 'esbuild';
|
|
25
|
+
import prettier from 'prettier';
|
|
26
|
+
import { h as camelCase, r as removeDisallowedChars, m as kebabCase, j as isApplicationDef, D as DEV_DEFINITION_ENDPOINT } from './shared/arri.e547206a.mjs';
|
|
27
|
+
import { defaultConfig } from './index.mjs';
|
|
32
28
|
import 'node:stream';
|
|
29
|
+
import { ofetch } from 'ofetch';
|
|
30
|
+
import '@sinclair/typebox';
|
|
31
|
+
import 'h3';
|
|
32
|
+
import '@sinclair/typebox/errors';
|
|
33
|
+
import '@sinclair/typebox/value';
|
|
34
|
+
import { a as dartClientGenerator } from './shared/arri.c6b92822.mjs';
|
|
33
35
|
import { listenAndWatch } from 'listhen';
|
|
34
36
|
import 'child_process';
|
|
35
37
|
|
|
36
|
-
const codegenDart = defineCommand({
|
|
37
|
-
args: {
|
|
38
|
-
location: {
|
|
39
|
-
type: "positional",
|
|
40
|
-
required: true,
|
|
41
|
-
description: "The path to an Arri definition file or a url that returns an Arri definition file."
|
|
42
|
-
},
|
|
43
|
-
clientName: {
|
|
44
|
-
type: "string",
|
|
45
|
-
alias: ["name"],
|
|
46
|
-
required: true
|
|
47
|
-
},
|
|
48
|
-
outFile: {
|
|
49
|
-
type: "string",
|
|
50
|
-
alias: ["out", "o"],
|
|
51
|
-
required: true
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
async run({ args }) {
|
|
55
|
-
const isUrl = args.location.startsWith("http://") || args.location.startsWith("https://");
|
|
56
|
-
let def;
|
|
57
|
-
if (isUrl) {
|
|
58
|
-
const result = await ofetch(args.location);
|
|
59
|
-
def = result;
|
|
60
|
-
} else {
|
|
61
|
-
if (!existsSync(args.location)) {
|
|
62
|
-
throw new Error(`Unable to find ${args.location}`);
|
|
63
|
-
}
|
|
64
|
-
const jsonString = JSON.parse(
|
|
65
|
-
readFileSync(args.location, { encoding: "utf-8" })
|
|
66
|
-
);
|
|
67
|
-
def = jsonString;
|
|
68
|
-
}
|
|
69
|
-
if (!def) {
|
|
70
|
-
throw new Error("Unable to load ApplicationDefinition json file");
|
|
71
|
-
}
|
|
72
|
-
await dartClientGenerator({
|
|
73
|
-
clientName: args.clientName,
|
|
74
|
-
outputFile: args.outFile
|
|
75
|
-
}).generator(def);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
const codegenTypescript = defineCommand({
|
|
79
|
-
args: {
|
|
80
|
-
location: {
|
|
81
|
-
type: "positional",
|
|
82
|
-
required: true,
|
|
83
|
-
description: "The path to an Arri definition file or a url that returns an Arri definition file."
|
|
84
|
-
},
|
|
85
|
-
clientName: {
|
|
86
|
-
type: "string",
|
|
87
|
-
alias: ["name"],
|
|
88
|
-
required: true
|
|
89
|
-
},
|
|
90
|
-
outFile: {
|
|
91
|
-
type: "string",
|
|
92
|
-
alias: ["out", "o"],
|
|
93
|
-
required: true
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
const codegen = defineCommand({
|
|
98
|
-
subCommands: {
|
|
99
|
-
dart: codegenDart,
|
|
100
|
-
typescript: codegenTypescript
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
|
|
104
38
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
105
39
|
|
|
106
40
|
function getDefaultExportFromCjs (x) {
|
|
@@ -132,12 +66,12 @@ function getAugmentedNamespace(n) {
|
|
|
132
66
|
return a;
|
|
133
67
|
}
|
|
134
68
|
|
|
135
|
-
var main$
|
|
69
|
+
var main$2 = {exports: {}};
|
|
136
70
|
|
|
137
71
|
const name = "dotenv";
|
|
138
72
|
const version$2 = "16.3.1";
|
|
139
73
|
const description = "Loads environment variables from .env file";
|
|
140
|
-
const main$
|
|
74
|
+
const main$1 = "lib/main.js";
|
|
141
75
|
const types$2 = "lib/main.d.ts";
|
|
142
76
|
const exports = {
|
|
143
77
|
".": {
|
|
@@ -200,7 +134,7 @@ const _package = {
|
|
|
200
134
|
name: name,
|
|
201
135
|
version: version$2,
|
|
202
136
|
description: description,
|
|
203
|
-
main: main$
|
|
137
|
+
main: main$1,
|
|
204
138
|
types: types$2,
|
|
205
139
|
exports: exports,
|
|
206
140
|
scripts: scripts,
|
|
@@ -215,23 +149,23 @@ const _package = {
|
|
|
215
149
|
};
|
|
216
150
|
|
|
217
151
|
const _package$1 = {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
152
|
+
__proto__: null,
|
|
153
|
+
browser: browser,
|
|
154
|
+
default: _package,
|
|
155
|
+
description: description,
|
|
156
|
+
devDependencies: devDependencies,
|
|
157
|
+
engines: engines,
|
|
158
|
+
exports: exports,
|
|
159
|
+
funding: funding,
|
|
160
|
+
keywords: keywords$2,
|
|
161
|
+
license: license,
|
|
162
|
+
main: main$1,
|
|
163
|
+
name: name,
|
|
164
|
+
readmeFilename: readmeFilename,
|
|
165
|
+
repository: repository,
|
|
166
|
+
scripts: scripts,
|
|
167
|
+
types: types$2,
|
|
168
|
+
version: version$2
|
|
235
169
|
};
|
|
236
170
|
|
|
237
171
|
const require$$4 = /*@__PURE__*/getAugmentedNamespace(_package$1);
|
|
@@ -541,15 +475,15 @@ const DotenvModule = {
|
|
|
541
475
|
populate
|
|
542
476
|
};
|
|
543
477
|
|
|
544
|
-
main$
|
|
545
|
-
main$
|
|
546
|
-
main$
|
|
547
|
-
main$
|
|
548
|
-
main$
|
|
549
|
-
var parse_1$2 = main$
|
|
550
|
-
main$
|
|
478
|
+
main$2.exports.configDotenv = DotenvModule.configDotenv;
|
|
479
|
+
main$2.exports._configVault = DotenvModule._configVault;
|
|
480
|
+
main$2.exports._parseVault = DotenvModule._parseVault;
|
|
481
|
+
main$2.exports.config = DotenvModule.config;
|
|
482
|
+
main$2.exports.decrypt = DotenvModule.decrypt;
|
|
483
|
+
var parse_1$2 = main$2.exports.parse = DotenvModule.parse;
|
|
484
|
+
main$2.exports.populate = DotenvModule.populate;
|
|
551
485
|
|
|
552
|
-
main$
|
|
486
|
+
main$2.exports = DotenvModule;
|
|
553
487
|
|
|
554
488
|
const suspectProtoRx = /"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/;
|
|
555
489
|
const suspectConstructorRx = /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/;
|
|
@@ -19854,9 +19788,294 @@ const globby = normalizeArguments(async (patterns, options) => {
|
|
|
19854
19788
|
return unionFastGlobResults(results, filter);
|
|
19855
19789
|
});
|
|
19856
19790
|
|
|
19791
|
+
async function setupWorkingDir(config) {
|
|
19792
|
+
const arriDir = path$e.resolve(config.rootDir, config.buildDir);
|
|
19793
|
+
const outDir = path$e.resolve(config.rootDir, ".output");
|
|
19794
|
+
if (existsSync(arriDir)) {
|
|
19795
|
+
await fs$f.rm(arriDir, { recursive: true, force: true });
|
|
19796
|
+
}
|
|
19797
|
+
if (existsSync(outDir)) {
|
|
19798
|
+
await fs$f.rm(outDir, { recursive: true, force: true });
|
|
19799
|
+
}
|
|
19800
|
+
await fs$f.mkdir(arriDir);
|
|
19801
|
+
await fs$f.mkdir(outDir);
|
|
19802
|
+
}
|
|
19803
|
+
async function createRoutesModule(config) {
|
|
19804
|
+
const routes = [];
|
|
19805
|
+
await Promise.all(
|
|
19806
|
+
config.procedureGlobPatterns.map(async (pattern) => {
|
|
19807
|
+
const results = await getVirtualRouteBatch(pattern, config);
|
|
19808
|
+
for (const result of results) {
|
|
19809
|
+
routes.push(result);
|
|
19810
|
+
}
|
|
19811
|
+
})
|
|
19812
|
+
);
|
|
19813
|
+
routes.sort((a, b) => a.name < b.name ? -1 : 1);
|
|
19814
|
+
const module = await prettier.format(
|
|
19815
|
+
`${routes.map(
|
|
19816
|
+
(route) => `import ${route.importName} from '${route.importPath}';`
|
|
19817
|
+
).join("\n")}
|
|
19818
|
+
const routes: { id: string; route: any }[] = [${routes.map(
|
|
19819
|
+
(route) => `{ id: '${route.name}', route: ${route.importName} }`
|
|
19820
|
+
).join(",\n")}
|
|
19821
|
+
];
|
|
19822
|
+
export default routes`,
|
|
19823
|
+
{ parser: "typescript", tabWidth: 4 }
|
|
19824
|
+
);
|
|
19825
|
+
await fs$f.writeFile(
|
|
19826
|
+
path$e.resolve(config.rootDir, config.buildDir, "routes.ts"),
|
|
19827
|
+
module
|
|
19828
|
+
);
|
|
19829
|
+
}
|
|
19830
|
+
async function getVirtualRouteBatch(globPattern, config) {
|
|
19831
|
+
if (!config.procedureDir) {
|
|
19832
|
+
return [];
|
|
19833
|
+
}
|
|
19834
|
+
const target = `${config.rootDir}/${config.srcDir}/${config.procedureDir}/${globPattern}`.split("//").join("/").split("//").join("/");
|
|
19835
|
+
const files = await globby(target, {
|
|
19836
|
+
onlyFiles: true
|
|
19837
|
+
});
|
|
19838
|
+
const routes = [];
|
|
19839
|
+
for (const file of files) {
|
|
19840
|
+
const meta = getRpcMetaFromPath(config, file);
|
|
19841
|
+
if (meta) {
|
|
19842
|
+
const importParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), file).split(".");
|
|
19843
|
+
importParts.pop();
|
|
19844
|
+
routes.push({
|
|
19845
|
+
name: meta.id,
|
|
19846
|
+
importName: camelCase(meta.id.split(".").join("_")),
|
|
19847
|
+
importPath: `./${importParts.join(".")}`
|
|
19848
|
+
});
|
|
19849
|
+
}
|
|
19850
|
+
}
|
|
19851
|
+
return routes;
|
|
19852
|
+
}
|
|
19853
|
+
const disallowedNameChars = "~`!@#$%^&*()-+=[]{}\\|:;\"'<>,./";
|
|
19854
|
+
const getRpcMetaFromPath = (config, filePath) => {
|
|
19855
|
+
if (!config.procedureDir) {
|
|
19856
|
+
return void 0;
|
|
19857
|
+
}
|
|
19858
|
+
const resolvedFilePath = filePath.split("./").join("/");
|
|
19859
|
+
const parts = resolvedFilePath.split("/");
|
|
19860
|
+
const reversedParts = [...parts].reverse();
|
|
19861
|
+
const nameParts = [];
|
|
19862
|
+
for (const part of reversedParts) {
|
|
19863
|
+
if (part === config.procedureDir) {
|
|
19864
|
+
break;
|
|
19865
|
+
}
|
|
19866
|
+
nameParts.push(part);
|
|
19867
|
+
}
|
|
19868
|
+
const fileName = nameParts.reverse().pop() ?? "";
|
|
19869
|
+
const serviceParts = nameParts.filter((part) => part.trim().length > 0).map((part) => removeDisallowedChars(part, disallowedNameChars));
|
|
19870
|
+
const fileNameParts = fileName.split(".");
|
|
19871
|
+
if (!fileNameParts.length) {
|
|
19872
|
+
return void 0;
|
|
19873
|
+
}
|
|
19874
|
+
const rpcName = removeDisallowedChars(
|
|
19875
|
+
fileNameParts[0],
|
|
19876
|
+
disallowedNameChars
|
|
19877
|
+
);
|
|
19878
|
+
const httpParts = [
|
|
19879
|
+
...serviceParts.map((part) => kebabCase(part)),
|
|
19880
|
+
kebabCase(rpcName)
|
|
19881
|
+
];
|
|
19882
|
+
return {
|
|
19883
|
+
id: [...serviceParts, rpcName].join("."),
|
|
19884
|
+
httpPath: `/${httpParts.join("/")}`
|
|
19885
|
+
};
|
|
19886
|
+
};
|
|
19887
|
+
|
|
19888
|
+
const build = defineCommand({
|
|
19889
|
+
args: {
|
|
19890
|
+
config: {
|
|
19891
|
+
type: "string",
|
|
19892
|
+
description: "Path to the arri config file",
|
|
19893
|
+
alias: "c",
|
|
19894
|
+
default: "./arri.config.ts"
|
|
19895
|
+
},
|
|
19896
|
+
skipCodegen: {
|
|
19897
|
+
type: "boolean",
|
|
19898
|
+
default: false
|
|
19899
|
+
}
|
|
19900
|
+
},
|
|
19901
|
+
async run({ args }) {
|
|
19902
|
+
const { config } = await loadConfig({
|
|
19903
|
+
configFile: args.config,
|
|
19904
|
+
defaultConfig
|
|
19905
|
+
});
|
|
19906
|
+
if (!config) {
|
|
19907
|
+
throw new Error("Unable to find arri config");
|
|
19908
|
+
}
|
|
19909
|
+
await startBuild(config);
|
|
19910
|
+
}
|
|
19911
|
+
});
|
|
19912
|
+
const logger$1 = createConsola({
|
|
19913
|
+
fancy: true
|
|
19914
|
+
}).withTag("arri");
|
|
19915
|
+
async function startBuild(config) {
|
|
19916
|
+
logger$1.log("Bundling server....");
|
|
19917
|
+
await setupWorkingDir(config);
|
|
19918
|
+
await Promise.all([
|
|
19919
|
+
createRoutesModule(config),
|
|
19920
|
+
createBuildEntryModule(config),
|
|
19921
|
+
createBuildCodegenModule(config)
|
|
19922
|
+
]);
|
|
19923
|
+
await bundleFiles$1(config);
|
|
19924
|
+
logger$1.log("Finished bundling");
|
|
19925
|
+
const clientCount = config.clientGenerators.length;
|
|
19926
|
+
const codegenModule = path$e.resolve(config.rootDir, ".output", "codegen.js");
|
|
19927
|
+
if (clientCount > 0) {
|
|
19928
|
+
logger$1.log("Generating clients");
|
|
19929
|
+
execSync(`node ${codegenModule}`);
|
|
19930
|
+
const defJson = path$e.resolve(
|
|
19931
|
+
config.rootDir,
|
|
19932
|
+
".output",
|
|
19933
|
+
"__definition.json"
|
|
19934
|
+
);
|
|
19935
|
+
const def = JSON.parse(readFileSync(defJson, { encoding: "utf-8" }));
|
|
19936
|
+
if (isApplicationDef(def)) {
|
|
19937
|
+
await Promise.all(
|
|
19938
|
+
config.clientGenerators.map((plugin) => plugin.generator(def))
|
|
19939
|
+
);
|
|
19940
|
+
}
|
|
19941
|
+
logger$1.log(`${clientCount} clients generated`);
|
|
19942
|
+
} else {
|
|
19943
|
+
logger$1.log("No client generators specified. Skipping codegen.");
|
|
19944
|
+
}
|
|
19945
|
+
logger$1.log("Cleaning up files");
|
|
19946
|
+
await fs$f.rm(codegenModule);
|
|
19947
|
+
logger$1.log(
|
|
19948
|
+
`Build finished! You can start your server by running "node .output/server.js"`
|
|
19949
|
+
);
|
|
19950
|
+
}
|
|
19951
|
+
async function bundleFiles$1(config) {
|
|
19952
|
+
await build$1({
|
|
19953
|
+
...config.esbuild,
|
|
19954
|
+
entryPoints: [
|
|
19955
|
+
path$e.resolve(config.rootDir, config.buildDir, "server.ts"),
|
|
19956
|
+
path$e.resolve(config.rootDir, config.buildDir, "codegen.ts")
|
|
19957
|
+
],
|
|
19958
|
+
platform: config.esbuild.platform ?? "node",
|
|
19959
|
+
target: config.esbuild.target ?? "node18",
|
|
19960
|
+
bundle: true,
|
|
19961
|
+
outdir: path$e.resolve(config.rootDir, ".output")
|
|
19962
|
+
});
|
|
19963
|
+
}
|
|
19964
|
+
async function createBuildEntryModule(config) {
|
|
19965
|
+
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(".");
|
|
19967
|
+
appImportParts.pop();
|
|
19968
|
+
const virtualEntry = `import { toNodeListener } from 'h3';
|
|
19969
|
+
import { listen } from 'listhen';
|
|
19970
|
+
import routes from './routes';
|
|
19971
|
+
import app from './${appImportParts.join(".")}';
|
|
19972
|
+
|
|
19973
|
+
for (const route of routes) {
|
|
19974
|
+
app.registerRpc(route.id, route.route);
|
|
19975
|
+
}
|
|
19976
|
+
|
|
19977
|
+
void listen(toNodeListener(app.getH3Instance()), {
|
|
19978
|
+
port: process.env.PORT ?? ${config.port},
|
|
19979
|
+
});`;
|
|
19980
|
+
await fs$f.writeFile(
|
|
19981
|
+
path$e.resolve(config.rootDir, config.buildDir, "server.ts"),
|
|
19982
|
+
virtualEntry
|
|
19983
|
+
);
|
|
19984
|
+
}
|
|
19985
|
+
async function createBuildCodegenModule(config) {
|
|
19986
|
+
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(".");
|
|
19988
|
+
appImportParts.pop();
|
|
19989
|
+
const virtualModule = await prettier.format(
|
|
19990
|
+
`
|
|
19991
|
+
import { writeFileSync } from 'node:fs';
|
|
19992
|
+
import path from 'pathe';
|
|
19993
|
+
import app from './${appImportParts.join(".")}';
|
|
19994
|
+
|
|
19995
|
+
const def = app.getAppDefinition();
|
|
19996
|
+
writeFileSync(
|
|
19997
|
+
path.resolve(__dirname, "__definition.json"),
|
|
19998
|
+
JSON.stringify(def),
|
|
19999
|
+
);`,
|
|
20000
|
+
{ tabWidth: 4, parser: "typescript" }
|
|
20001
|
+
);
|
|
20002
|
+
await fs$f.writeFile(
|
|
20003
|
+
path$e.resolve(config.rootDir, config.buildDir, "codegen.ts"),
|
|
20004
|
+
virtualModule
|
|
20005
|
+
);
|
|
20006
|
+
}
|
|
20007
|
+
|
|
20008
|
+
const codegenDart = defineCommand({
|
|
20009
|
+
args: {
|
|
20010
|
+
location: {
|
|
20011
|
+
type: "positional",
|
|
20012
|
+
required: true,
|
|
20013
|
+
description: "The path to an Arri definition file or a url that returns an Arri definition file."
|
|
20014
|
+
},
|
|
20015
|
+
clientName: {
|
|
20016
|
+
type: "string",
|
|
20017
|
+
alias: ["name"],
|
|
20018
|
+
required: true
|
|
20019
|
+
},
|
|
20020
|
+
outFile: {
|
|
20021
|
+
type: "string",
|
|
20022
|
+
alias: ["out", "o"],
|
|
20023
|
+
required: true
|
|
20024
|
+
}
|
|
20025
|
+
},
|
|
20026
|
+
async run({ args }) {
|
|
20027
|
+
const isUrl = args.location.startsWith("http://") || args.location.startsWith("https://");
|
|
20028
|
+
let def;
|
|
20029
|
+
if (isUrl) {
|
|
20030
|
+
const result = await ofetch(args.location);
|
|
20031
|
+
def = result;
|
|
20032
|
+
} else {
|
|
20033
|
+
if (!existsSync(args.location)) {
|
|
20034
|
+
throw new Error(`Unable to find ${args.location}`);
|
|
20035
|
+
}
|
|
20036
|
+
const jsonString = JSON.parse(
|
|
20037
|
+
readFileSync(args.location, { encoding: "utf-8" })
|
|
20038
|
+
);
|
|
20039
|
+
def = jsonString;
|
|
20040
|
+
}
|
|
20041
|
+
if (!def) {
|
|
20042
|
+
throw new Error("Unable to load ApplicationDefinition json file");
|
|
20043
|
+
}
|
|
20044
|
+
await dartClientGenerator({
|
|
20045
|
+
clientName: args.clientName,
|
|
20046
|
+
outputFile: args.outFile
|
|
20047
|
+
}).generator(def);
|
|
20048
|
+
}
|
|
20049
|
+
});
|
|
20050
|
+
const codegenTypescript = defineCommand({
|
|
20051
|
+
args: {
|
|
20052
|
+
location: {
|
|
20053
|
+
type: "positional",
|
|
20054
|
+
required: true,
|
|
20055
|
+
description: "The path to an Arri definition file or a url that returns an Arri definition file."
|
|
20056
|
+
},
|
|
20057
|
+
clientName: {
|
|
20058
|
+
type: "string",
|
|
20059
|
+
alias: ["name"],
|
|
20060
|
+
required: true
|
|
20061
|
+
},
|
|
20062
|
+
outFile: {
|
|
20063
|
+
type: "string",
|
|
20064
|
+
alias: ["out", "o"],
|
|
20065
|
+
required: true
|
|
20066
|
+
}
|
|
20067
|
+
}
|
|
20068
|
+
});
|
|
20069
|
+
const codegen = defineCommand({
|
|
20070
|
+
subCommands: {
|
|
20071
|
+
dart: codegenDart,
|
|
20072
|
+
typescript: codegenTypescript
|
|
20073
|
+
}
|
|
20074
|
+
});
|
|
20075
|
+
|
|
19857
20076
|
const logger = createConsola({
|
|
19858
20077
|
fancy: true
|
|
19859
|
-
}).withTag("
|
|
20078
|
+
}).withTag("arri");
|
|
19860
20079
|
const dev = defineCommand({
|
|
19861
20080
|
meta: {
|
|
19862
20081
|
name: "dev",
|
|
@@ -19873,14 +20092,19 @@ const dev = defineCommand({
|
|
|
19873
20092
|
async run({ args }) {
|
|
19874
20093
|
process.env.ARRI_DEV_MODE = "true";
|
|
19875
20094
|
const config = await loadConfig({
|
|
19876
|
-
configFile: path$e.resolve(args.config)
|
|
20095
|
+
configFile: path$e.resolve(args.config),
|
|
20096
|
+
defaultConfig
|
|
19877
20097
|
});
|
|
19878
|
-
|
|
20098
|
+
if (!config) {
|
|
20099
|
+
throw new Error("Unable to find config");
|
|
20100
|
+
}
|
|
20101
|
+
await startDevServer(config.config);
|
|
19879
20102
|
}
|
|
19880
20103
|
});
|
|
19881
20104
|
async function bundleFiles(config) {
|
|
19882
20105
|
const outDir = path$e.resolve(config.rootDir, ".output");
|
|
19883
|
-
await build({
|
|
20106
|
+
await build$1({
|
|
20107
|
+
...config.esbuild,
|
|
19884
20108
|
entryPoints: [
|
|
19885
20109
|
path$e.resolve(config.rootDir, config.buildDir, "entry.ts")
|
|
19886
20110
|
],
|
|
@@ -19890,16 +20114,18 @@ async function bundleFiles(config) {
|
|
|
19890
20114
|
platform: "node"
|
|
19891
20115
|
});
|
|
19892
20116
|
}
|
|
19893
|
-
|
|
20117
|
+
const startListener = (config, showQr = false) => listenAndWatch(path$e.resolve(config.rootDir, ".output", "entry.js"), {
|
|
20118
|
+
public: true,
|
|
20119
|
+
port: config.port,
|
|
20120
|
+
logger,
|
|
20121
|
+
qr: showQr
|
|
20122
|
+
});
|
|
20123
|
+
async function startDevServer(config) {
|
|
19894
20124
|
await setupWorkingDir(config);
|
|
19895
20125
|
let fileWatcher;
|
|
19896
20126
|
await Promise.all([createRoutesModule(config), createEntryModule(config)]);
|
|
19897
20127
|
await bundleFiles(config);
|
|
19898
|
-
await
|
|
19899
|
-
public: true,
|
|
19900
|
-
port: config.port,
|
|
19901
|
-
logger
|
|
19902
|
-
});
|
|
20128
|
+
let listener = await startListener(config, true);
|
|
19903
20129
|
setTimeout(async () => {
|
|
19904
20130
|
await generateClients(config);
|
|
19905
20131
|
}, 1e3);
|
|
@@ -19922,8 +20148,12 @@ async function main$1(config) {
|
|
|
19922
20148
|
await createRoutesModule(config);
|
|
19923
20149
|
let bundleCreated = false;
|
|
19924
20150
|
try {
|
|
19925
|
-
logger.log(
|
|
20151
|
+
logger.log(
|
|
20152
|
+
"Change detected. Bundling files and restarting server...."
|
|
20153
|
+
);
|
|
19926
20154
|
await bundleFiles(config);
|
|
20155
|
+
await listener.close();
|
|
20156
|
+
listener = await startListener(config);
|
|
19927
20157
|
bundleCreated = true;
|
|
19928
20158
|
} catch (err) {
|
|
19929
20159
|
logger.error(err);
|
|
@@ -19963,18 +20193,6 @@ async function generateClients(config) {
|
|
|
19963
20193
|
console.error(err);
|
|
19964
20194
|
}
|
|
19965
20195
|
}
|
|
19966
|
-
async function setupWorkingDir(config) {
|
|
19967
|
-
const arriDir = path$e.resolve(config.rootDir, config.buildDir);
|
|
19968
|
-
const outDir = path$e.resolve(config.rootDir, ".output");
|
|
19969
|
-
if (existsSync(arriDir)) {
|
|
19970
|
-
await fs$f.rm(arriDir, { recursive: true, force: true });
|
|
19971
|
-
}
|
|
19972
|
-
if (existsSync(outDir)) {
|
|
19973
|
-
await fs$f.rm(outDir, { recursive: true, force: true });
|
|
19974
|
-
}
|
|
19975
|
-
await fs$f.mkdir(arriDir);
|
|
19976
|
-
await fs$f.mkdir(outDir);
|
|
19977
|
-
}
|
|
19978
20196
|
async function createEntryModule(config) {
|
|
19979
20197
|
const appModule = path$e.resolve(config.rootDir, config.srcDir, config.entry);
|
|
19980
20198
|
const appImportParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), appModule).split(".");
|
|
@@ -19994,93 +20212,10 @@ export default app.getH3Instance();`;
|
|
|
19994
20212
|
virtualEntry
|
|
19995
20213
|
);
|
|
19996
20214
|
}
|
|
19997
|
-
async function createRoutesModule(config) {
|
|
19998
|
-
const routes = [];
|
|
19999
|
-
await Promise.all(
|
|
20000
|
-
config.procedureGlobPatterns.map(async (pattern) => {
|
|
20001
|
-
const results = await getVirtualRouteBatch(pattern, config);
|
|
20002
|
-
for (const result of results) {
|
|
20003
|
-
routes.push(result);
|
|
20004
|
-
}
|
|
20005
|
-
})
|
|
20006
|
-
);
|
|
20007
|
-
routes.sort((a, b) => a.name < b.name ? -1 : 1);
|
|
20008
|
-
const module = await prettier.format(
|
|
20009
|
-
`${routes.map(
|
|
20010
|
-
(route) => `import ${route.importName} from '${route.importPath}';`
|
|
20011
|
-
).join("\n")}
|
|
20012
|
-
const routes: { id: string; route: any }[] = [${routes.map(
|
|
20013
|
-
(route) => `{ id: '${route.name}', route: ${route.importName} }`
|
|
20014
|
-
).join(",\n")}
|
|
20015
|
-
];
|
|
20016
|
-
export default routes`,
|
|
20017
|
-
{ parser: "typescript", tabWidth: 4 }
|
|
20018
|
-
);
|
|
20019
|
-
await fs$f.writeFile(
|
|
20020
|
-
path$e.resolve(config.rootDir, config.buildDir, "routes.ts"),
|
|
20021
|
-
module
|
|
20022
|
-
);
|
|
20023
|
-
}
|
|
20024
|
-
async function getVirtualRouteBatch(globPattern, config) {
|
|
20025
|
-
if (!config.procedureDir) {
|
|
20026
|
-
return [];
|
|
20027
|
-
}
|
|
20028
|
-
const target = `${config.rootDir}/${config.srcDir}/${config.procedureDir}/${globPattern}`.split("//").join("/").split("//").join("/");
|
|
20029
|
-
const files = await globby(target, {
|
|
20030
|
-
onlyFiles: true
|
|
20031
|
-
});
|
|
20032
|
-
const routes = [];
|
|
20033
|
-
for (const file of files) {
|
|
20034
|
-
const meta = getRpcMetaFromPath(config, file);
|
|
20035
|
-
if (meta) {
|
|
20036
|
-
const importParts = path$e.relative(path$e.resolve(config.rootDir, config.buildDir), file).split(".");
|
|
20037
|
-
importParts.pop();
|
|
20038
|
-
routes.push({
|
|
20039
|
-
name: meta.id,
|
|
20040
|
-
importName: camelCase(meta.id.split(".").join("_")),
|
|
20041
|
-
importPath: `./${importParts.join(".")}`
|
|
20042
|
-
});
|
|
20043
|
-
}
|
|
20044
|
-
}
|
|
20045
|
-
return routes;
|
|
20046
|
-
}
|
|
20047
|
-
const disallowedNameChars = "~`!@#$%^&*()-+=[]{}\\|:;\"'<>,./";
|
|
20048
|
-
const getRpcMetaFromPath = (config, filePath) => {
|
|
20049
|
-
if (!config.procedureDir) {
|
|
20050
|
-
return void 0;
|
|
20051
|
-
}
|
|
20052
|
-
const resolvedFilePath = filePath.split("./").join("/");
|
|
20053
|
-
const parts = resolvedFilePath.split("/");
|
|
20054
|
-
const reversedParts = [...parts].reverse();
|
|
20055
|
-
const nameParts = [];
|
|
20056
|
-
for (const part of reversedParts) {
|
|
20057
|
-
if (part === config.procedureDir) {
|
|
20058
|
-
break;
|
|
20059
|
-
}
|
|
20060
|
-
nameParts.push(part);
|
|
20061
|
-
}
|
|
20062
|
-
const fileName = nameParts.reverse().pop() ?? "";
|
|
20063
|
-
const serviceParts = nameParts.filter((part) => part.trim().length > 0).map((part) => removeDisallowedChars(part, disallowedNameChars));
|
|
20064
|
-
const fileNameParts = fileName.split(".");
|
|
20065
|
-
if (!fileNameParts.length) {
|
|
20066
|
-
return void 0;
|
|
20067
|
-
}
|
|
20068
|
-
const rpcName = removeDisallowedChars(
|
|
20069
|
-
fileNameParts[0],
|
|
20070
|
-
disallowedNameChars
|
|
20071
|
-
);
|
|
20072
|
-
const httpParts = [
|
|
20073
|
-
...serviceParts.map((part) => kebabCase(part)),
|
|
20074
|
-
kebabCase(rpcName)
|
|
20075
|
-
];
|
|
20076
|
-
return {
|
|
20077
|
-
id: [...serviceParts, rpcName].join("."),
|
|
20078
|
-
httpPath: `/${httpParts.join("/")}`
|
|
20079
|
-
};
|
|
20080
|
-
};
|
|
20081
20215
|
|
|
20082
20216
|
const main = defineCommand({
|
|
20083
20217
|
subCommands: {
|
|
20218
|
+
build,
|
|
20084
20219
|
dev,
|
|
20085
20220
|
codegen
|
|
20086
20221
|
}
|
package/dist/codegen.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { writeFileSync } from 'fs';
|
|
2
2
|
import { format } from 'prettier';
|
|
3
|
-
import { u as unflattenObject,
|
|
4
|
-
export {
|
|
5
|
-
import { d as defineClientGeneratorPlugin } from './shared/arri.
|
|
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.
|
|
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
|
+
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';
|
|
7
7
|
import '@sinclair/typebox';
|
|
8
8
|
import 'h3';
|
|
9
9
|
import '@sinclair/typebox/errors';
|