@faasjs/dev 8.0.0-beta.5 → 8.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -5
- package/dist/chunk-3FXFWIBW.mjs +221 -0
- package/dist/cli.cjs +335 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.mjs +136 -0
- package/dist/index.cjs +276 -26
- package/dist/index.d.ts +19 -21
- package/dist/index.mjs +78 -43
- package/faas-types.mjs +7 -0
- package/package.json +27 -17
package/dist/cli.mjs
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { generateFaasTypes } from './chunk-3FXFWIBW.mjs';
|
|
2
|
+
|
|
3
|
+
// package.json
|
|
4
|
+
var package_default = {
|
|
5
|
+
name: "@faasjs/dev",
|
|
6
|
+
version: "v8.0.0-beta.5",
|
|
7
|
+
license: "MIT",
|
|
8
|
+
type: "module",
|
|
9
|
+
main: "dist/index.cjs",
|
|
10
|
+
module: "dist/index.mjs",
|
|
11
|
+
types: "dist/index.d.ts",
|
|
12
|
+
bin: {
|
|
13
|
+
"faas-types": "faas-types.mjs"
|
|
14
|
+
},
|
|
15
|
+
exports: {
|
|
16
|
+
".": {
|
|
17
|
+
types: "./dist/index.d.ts",
|
|
18
|
+
import: "./dist/index.mjs",
|
|
19
|
+
require: "./dist/index.cjs"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
homepage: "https://faasjs.com/doc/dev",
|
|
23
|
+
repository: {
|
|
24
|
+
type: "git",
|
|
25
|
+
url: "git+https://github.com/faasjs/faasjs.git",
|
|
26
|
+
directory: "packages/dev"
|
|
27
|
+
},
|
|
28
|
+
bugs: {
|
|
29
|
+
url: "https://github.com/faasjs/faasjs/issues"
|
|
30
|
+
},
|
|
31
|
+
funding: "https://github.com/sponsors/faasjs",
|
|
32
|
+
scripts: {
|
|
33
|
+
build: "tsup-node --entry src/index.ts --entry src/cli.ts --config ../../tsup.config.ts"
|
|
34
|
+
},
|
|
35
|
+
files: [
|
|
36
|
+
"dist",
|
|
37
|
+
"faas-types.mjs"
|
|
38
|
+
],
|
|
39
|
+
peerDependencies: {
|
|
40
|
+
"@electric-sql/pglite": "*",
|
|
41
|
+
"@faasjs/deep_merge": ">=v8.0.0-beta.5",
|
|
42
|
+
"@faasjs/func": ">=v8.0.0-beta.5",
|
|
43
|
+
"@faasjs/http": ">=v8.0.0-beta.5",
|
|
44
|
+
"@faasjs/server": ">=v8.0.0-beta.5",
|
|
45
|
+
"@faasjs/knex": ">=v8.0.0-beta.5",
|
|
46
|
+
"@faasjs/load": ">=v8.0.0-beta.5",
|
|
47
|
+
"@faasjs/logger": ">=v8.0.0-beta.5",
|
|
48
|
+
"@types/node": "*",
|
|
49
|
+
knex: "*",
|
|
50
|
+
vite: "*",
|
|
51
|
+
vitest: "*",
|
|
52
|
+
"knex-pglite": "*"
|
|
53
|
+
},
|
|
54
|
+
devDependencies: {
|
|
55
|
+
"@electric-sql/pglite": "*",
|
|
56
|
+
"@faasjs/deep_merge": ">=v8.0.0-beta.5",
|
|
57
|
+
"@faasjs/func": ">=v8.0.0-beta.5",
|
|
58
|
+
"@faasjs/http": ">=v8.0.0-beta.5",
|
|
59
|
+
"@faasjs/server": ">=v8.0.0-beta.5",
|
|
60
|
+
"@faasjs/knex": ">=v8.0.0-beta.5",
|
|
61
|
+
"@faasjs/load": ">=v8.0.0-beta.5",
|
|
62
|
+
"@faasjs/logger": ">=v8.0.0-beta.5",
|
|
63
|
+
"@types/node": "*",
|
|
64
|
+
knex: "*",
|
|
65
|
+
vite: "*",
|
|
66
|
+
vitest: "*",
|
|
67
|
+
"knex-pglite": "*"
|
|
68
|
+
},
|
|
69
|
+
engines: {
|
|
70
|
+
node: ">=24.0.0",
|
|
71
|
+
npm: ">=11.0.0"
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// src/cli.ts
|
|
76
|
+
var HelpText = `Generate FaasJS API/event type declarations.
|
|
77
|
+
|
|
78
|
+
Usage:
|
|
79
|
+
faas-types [options]
|
|
80
|
+
|
|
81
|
+
Options:
|
|
82
|
+
--root <path> Project root path (default: process.cwd())
|
|
83
|
+
-h, --help Show help
|
|
84
|
+
-v, --version Show version
|
|
85
|
+
`;
|
|
86
|
+
function parseCliArgs(argv) {
|
|
87
|
+
const args = argv.slice(2);
|
|
88
|
+
const options = {};
|
|
89
|
+
const readValue = (index, name) => {
|
|
90
|
+
const value = args[index + 1];
|
|
91
|
+
if (!value || value.startsWith("-"))
|
|
92
|
+
throw Error(`[faas-types] Missing value for ${name}`);
|
|
93
|
+
return value;
|
|
94
|
+
};
|
|
95
|
+
for (let i = 0; i < args.length; i++) {
|
|
96
|
+
const arg = args[i];
|
|
97
|
+
if (arg === "-h" || arg === "--help") return { showHelp: true, options };
|
|
98
|
+
if (arg === "-v" || arg === "--version")
|
|
99
|
+
return {
|
|
100
|
+
showVersion: true,
|
|
101
|
+
options
|
|
102
|
+
};
|
|
103
|
+
if (arg === "--root") {
|
|
104
|
+
options.root = readValue(i, arg);
|
|
105
|
+
i++;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
throw Error(`[faas-types] Unknown option: ${arg}`);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
options
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async function main(argv = process.argv) {
|
|
115
|
+
try {
|
|
116
|
+
const parsed = parseCliArgs(argv);
|
|
117
|
+
if (parsed.showHelp) {
|
|
118
|
+
console.log(HelpText);
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
if (parsed.showVersion) {
|
|
122
|
+
console.log(package_default.version);
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
const result = await generateFaasTypes(parsed.options);
|
|
126
|
+
console.log(
|
|
127
|
+
`[faas-types] ${result.changed ? "Generated" : "Up to date"} ${result.output} (${result.routeCount} routes from ${result.fileCount} files)`
|
|
128
|
+
);
|
|
129
|
+
return 0;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error(error?.message || error);
|
|
132
|
+
return 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export { main };
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var pglite = require('@electric-sql/pglite');
|
|
4
4
|
var knex = require('knex');
|
|
5
5
|
var PgliteDialect = require('knex-pglite');
|
|
6
6
|
var zlib = require('zlib');
|
|
@@ -9,6 +9,8 @@ var http = require('@faasjs/http');
|
|
|
9
9
|
var load = require('@faasjs/load');
|
|
10
10
|
var logger = require('@faasjs/logger');
|
|
11
11
|
var func_star = require('@faasjs/func');
|
|
12
|
+
var fs = require('fs');
|
|
13
|
+
var promises = require('fs/promises');
|
|
12
14
|
var path = require('path');
|
|
13
15
|
var server = require('@faasjs/server');
|
|
14
16
|
|
|
@@ -32,6 +34,7 @@ function _interopNamespace(e) {
|
|
|
32
34
|
return Object.freeze(n);
|
|
33
35
|
}
|
|
34
36
|
|
|
37
|
+
var knex__default = /*#__PURE__*/_interopDefault(knex);
|
|
35
38
|
var PgliteDialect__default = /*#__PURE__*/_interopDefault(PgliteDialect);
|
|
36
39
|
var func_star__namespace = /*#__PURE__*/_interopNamespace(func_star);
|
|
37
40
|
|
|
@@ -58,19 +61,37 @@ var index_exports = {};
|
|
|
58
61
|
__export(index_exports, {
|
|
59
62
|
FuncWarper: () => FuncWarper,
|
|
60
63
|
createPgliteKnex: () => createPgliteKnex,
|
|
64
|
+
generateFaasTypes: () => generateFaasTypes,
|
|
65
|
+
isTypegenSourceFile: () => isTypegenSourceFile,
|
|
61
66
|
mountFaasKnex: () => mountFaasKnex,
|
|
62
|
-
runPgliteSql: () => runPgliteSql,
|
|
63
|
-
runPgliteSqlFile: () => runPgliteSqlFile,
|
|
64
67
|
streamToString: () => streamToString,
|
|
65
68
|
test: () => test,
|
|
66
69
|
unmountFaasKnex: () => unmountFaasKnex,
|
|
67
70
|
viteFaasJsServer: () => viteFaasJsServer
|
|
68
71
|
});
|
|
72
|
+
var postgresTypeParsers = {
|
|
73
|
+
[pglite.types.INT2]: (v) => Number.parseInt(v, 10),
|
|
74
|
+
[pglite.types.INT4]: (v) => Number.parseInt(v, 10),
|
|
75
|
+
[pglite.types.INT8]: (v) => Number.parseInt(v, 10),
|
|
76
|
+
[pglite.types.FLOAT4]: (v) => Number.parseFloat(v),
|
|
77
|
+
[pglite.types.FLOAT8]: (v) => Number.parseFloat(v),
|
|
78
|
+
[pglite.types.NUMERIC]: (v) => Number.parseFloat(v)
|
|
79
|
+
};
|
|
69
80
|
function createPgliteKnex(config = {}, connection = {}) {
|
|
70
|
-
|
|
81
|
+
const pgliteConnection = connection;
|
|
82
|
+
const dataDir = typeof pgliteConnection.filename === "string" ? pgliteConnection.filename : typeof pgliteConnection.connectionString === "string" ? pgliteConnection.connectionString : void 0;
|
|
83
|
+
const pglite$1 = new pglite.PGlite({
|
|
84
|
+
...dataDir ? { dataDir } : {},
|
|
85
|
+
parsers: postgresTypeParsers
|
|
86
|
+
});
|
|
87
|
+
const pgliteKnexConnection = {
|
|
88
|
+
...connection,
|
|
89
|
+
pglite: pglite$1
|
|
90
|
+
};
|
|
91
|
+
return knex__default.default({
|
|
71
92
|
...config,
|
|
72
93
|
client: PgliteDialect__default.default,
|
|
73
|
-
connection
|
|
94
|
+
connection: pgliteKnexConnection
|
|
74
95
|
});
|
|
75
96
|
}
|
|
76
97
|
function mountFaasKnex(db, options = {}) {
|
|
@@ -88,17 +109,6 @@ function unmountFaasKnex(name = "knex") {
|
|
|
88
109
|
if (!globalWithFaasKnex.FaasJS_Knex) return;
|
|
89
110
|
delete globalWithFaasKnex.FaasJS_Knex[name];
|
|
90
111
|
}
|
|
91
|
-
async function runPgliteSql(db, sql) {
|
|
92
|
-
if (!sql.trim()) return;
|
|
93
|
-
await db.raw(sql);
|
|
94
|
-
}
|
|
95
|
-
async function runPgliteSqlFile(db, filePath, options = {}) {
|
|
96
|
-
const stripUuidOsspExtension = options.stripUuidOsspExtension !== false;
|
|
97
|
-
let sql = fs.readFileSync(filePath, "utf8");
|
|
98
|
-
if (stripUuidOsspExtension)
|
|
99
|
-
sql = sql.replace(/CREATE EXTENSION IF NOT EXISTS "uuid-ossp";\s*/gi, "");
|
|
100
|
-
await runPgliteSql(db, sql);
|
|
101
|
-
}
|
|
102
112
|
|
|
103
113
|
// src/test.ts
|
|
104
114
|
var test_exports = {};
|
|
@@ -134,8 +144,7 @@ var FuncWarper = class {
|
|
|
134
144
|
plugins;
|
|
135
145
|
_handler;
|
|
136
146
|
/**
|
|
137
|
-
* @param
|
|
138
|
-
* @param func {Func} A FaasJs function
|
|
147
|
+
* @param initBy {Func} A FaasJS function
|
|
139
148
|
* ```ts
|
|
140
149
|
* import { FuncWarper } from '@faasjs/dev'
|
|
141
150
|
*
|
|
@@ -278,6 +287,203 @@ function test(initBy) {
|
|
|
278
287
|
|
|
279
288
|
// src/index.ts
|
|
280
289
|
__reExport(index_exports, test_exports);
|
|
290
|
+
function resolveFaasStaging() {
|
|
291
|
+
return process.env.FaasEnv || "development";
|
|
292
|
+
}
|
|
293
|
+
function resolveServerConfig(root, logger, defaultBase = "/") {
|
|
294
|
+
const projectRoot = path.resolve(root);
|
|
295
|
+
const staging = resolveFaasStaging();
|
|
296
|
+
const srcRoot = path.join(projectRoot, "src");
|
|
297
|
+
const config = load.loadConfig(
|
|
298
|
+
srcRoot,
|
|
299
|
+
path.join(srcRoot, "index.func.ts"),
|
|
300
|
+
staging,
|
|
301
|
+
logger
|
|
302
|
+
);
|
|
303
|
+
const server = config && typeof config === "object" ? config.server : void 0;
|
|
304
|
+
const resolvedRoot = server && typeof server.root === "string" && server.root.length ? path.resolve(projectRoot, server.root) : projectRoot;
|
|
305
|
+
const resolvedBase = server && typeof server.base === "string" && server.base.length ? server.base : defaultBase;
|
|
306
|
+
return {
|
|
307
|
+
root: resolvedRoot,
|
|
308
|
+
base: resolvedBase,
|
|
309
|
+
staging
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// src/typegen.ts
|
|
314
|
+
function normalizeSlashes(path) {
|
|
315
|
+
return path.replace(/\\/g, "/");
|
|
316
|
+
}
|
|
317
|
+
function normalizeRoute(path) {
|
|
318
|
+
const normalized = path.replace(/\/+/g, "/");
|
|
319
|
+
if (!normalized.length || normalized === "/") return "/";
|
|
320
|
+
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
321
|
+
}
|
|
322
|
+
function toRoute(srcRoot, file) {
|
|
323
|
+
const relativePath = normalizeSlashes(path.relative(srcRoot, file));
|
|
324
|
+
const noTsPath = relativePath.replace(/\.ts$/, "");
|
|
325
|
+
if (noTsPath === "index.func") return { route: "/", priority: 2 };
|
|
326
|
+
if (noTsPath === "default.func") return { route: "/*", priority: 1 };
|
|
327
|
+
if (noTsPath.endsWith("/index.func"))
|
|
328
|
+
return {
|
|
329
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -"/index.func".length)}`),
|
|
330
|
+
priority: 2
|
|
331
|
+
};
|
|
332
|
+
if (noTsPath.endsWith("/default.func"))
|
|
333
|
+
return {
|
|
334
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -"/default.func".length)}/*`),
|
|
335
|
+
priority: 1
|
|
336
|
+
};
|
|
337
|
+
if (noTsPath.endsWith(".func"))
|
|
338
|
+
return {
|
|
339
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -".func".length)}`),
|
|
340
|
+
priority: 3
|
|
341
|
+
};
|
|
342
|
+
throw Error(`[faas-types] Invalid func filename: ${file}`);
|
|
343
|
+
}
|
|
344
|
+
function toImportPath(fromFile, targetFile) {
|
|
345
|
+
const fromDir = path.dirname(fromFile);
|
|
346
|
+
const importPath = normalizeSlashes(path.relative(fromDir, targetFile)).replace(
|
|
347
|
+
/\.ts$/,
|
|
348
|
+
""
|
|
349
|
+
);
|
|
350
|
+
if (importPath.startsWith(".")) return importPath;
|
|
351
|
+
return `./${importPath}`;
|
|
352
|
+
}
|
|
353
|
+
function parsePluginTypes(config) {
|
|
354
|
+
const pluginConfig = config.plugins;
|
|
355
|
+
if (!pluginConfig || typeof pluginConfig !== "object") return [];
|
|
356
|
+
const pluginTypes = /* @__PURE__ */ new Set();
|
|
357
|
+
for (const key in pluginConfig) {
|
|
358
|
+
const data = pluginConfig[key];
|
|
359
|
+
if (typeof data === "string" && data.length) {
|
|
360
|
+
pluginTypes.add(data);
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
if (data && typeof data === "object") {
|
|
364
|
+
if (typeof data.type === "string" && data.type.length)
|
|
365
|
+
pluginTypes.add(data.type);
|
|
366
|
+
else pluginTypes.add(key);
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
pluginTypes.add(key);
|
|
370
|
+
}
|
|
371
|
+
return Array.from(pluginTypes).sort((a, b) => a.localeCompare(b));
|
|
372
|
+
}
|
|
373
|
+
async function readFuncFiles(dir) {
|
|
374
|
+
const result = [];
|
|
375
|
+
async function walk(currentDir) {
|
|
376
|
+
const entries = await promises.readdir(currentDir, {
|
|
377
|
+
withFileTypes: true
|
|
378
|
+
});
|
|
379
|
+
for (const entry of entries) {
|
|
380
|
+
if (entry.name === ".faasjs" || entry.name === "node_modules") continue;
|
|
381
|
+
const filePath = path.join(currentDir, entry.name);
|
|
382
|
+
if (entry.isDirectory()) {
|
|
383
|
+
await walk(filePath);
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
if (entry.isFile() && entry.name.endsWith(".func.ts"))
|
|
387
|
+
result.push(filePath);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
await walk(dir);
|
|
391
|
+
return result.sort((a, b) => a.localeCompare(b));
|
|
392
|
+
}
|
|
393
|
+
function formatTypes(items) {
|
|
394
|
+
const actionLines = items.map((item) => {
|
|
395
|
+
return ` ${JSON.stringify(item.route)}: __FaasFuncAction<__FaasModuleFunc<typeof import(${JSON.stringify(item.importPath)})>>`;
|
|
396
|
+
});
|
|
397
|
+
const eventLines = items.map((item) => {
|
|
398
|
+
const plugins = item.pluginTypes.length ? `[${item.pluginTypes.map((type) => JSON.stringify(type)).join(", ")}]` : "[]";
|
|
399
|
+
return ` ${JSON.stringify(item.route)}: InferPluginEvent<${plugins}>`;
|
|
400
|
+
});
|
|
401
|
+
return `/**
|
|
402
|
+
* Generated by @faasjs/dev.
|
|
403
|
+
*
|
|
404
|
+
* Do not edit this file manually.
|
|
405
|
+
*/
|
|
406
|
+
import type { Func, InferPluginEvent } from '@faasjs/func'
|
|
407
|
+
|
|
408
|
+
type __FaasModuleFunc<TModule> = TModule extends { func: infer TFunc }
|
|
409
|
+
? TFunc extends Func
|
|
410
|
+
? TFunc
|
|
411
|
+
: never
|
|
412
|
+
: TModule extends { default: infer TFunc }
|
|
413
|
+
? TFunc extends Func
|
|
414
|
+
? TFunc
|
|
415
|
+
: never
|
|
416
|
+
: never
|
|
417
|
+
|
|
418
|
+
type __FaasFuncAction<TFunc extends Func> = {
|
|
419
|
+
Params: Parameters<ReturnType<TFunc['export']>['handler']>[0]['params']
|
|
420
|
+
Data: Awaited<ReturnType<ReturnType<TFunc['export']>['handler']>>
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
declare module '@faasjs/types' {
|
|
424
|
+
interface FaasActions {
|
|
425
|
+
${actionLines.length ? `${actionLines.join("\n")}
|
|
426
|
+
` : ""} }
|
|
427
|
+
|
|
428
|
+
interface FaasEvents {
|
|
429
|
+
${eventLines.length ? `${eventLines.join("\n")}
|
|
430
|
+
` : ""} }
|
|
431
|
+
}
|
|
432
|
+
`;
|
|
433
|
+
}
|
|
434
|
+
function isTypegenSourceFile(filePath) {
|
|
435
|
+
return /\.func\.ts$/.test(filePath) || /(^|[\\/])faas\.ya?ml$/.test(filePath);
|
|
436
|
+
}
|
|
437
|
+
async function generateFaasTypes(options = {}) {
|
|
438
|
+
const logger$1 = options.logger || new logger.Logger("FaasJs:Typegen");
|
|
439
|
+
const { root: projectRoot, staging } = resolveServerConfig(
|
|
440
|
+
options.root || process.cwd(),
|
|
441
|
+
logger$1
|
|
442
|
+
);
|
|
443
|
+
const srcRoot = path.join(projectRoot, "src");
|
|
444
|
+
const output = path.join(srcRoot, ".faasjs", "types.d.ts");
|
|
445
|
+
if (!fs.existsSync(srcRoot))
|
|
446
|
+
throw Error(`[faas-types] Source directory not found: ${srcRoot}`);
|
|
447
|
+
const files = await readFuncFiles(srcRoot);
|
|
448
|
+
const routeMap = /* @__PURE__ */ new Map();
|
|
449
|
+
for (const file of files) {
|
|
450
|
+
const { route, priority } = toRoute(srcRoot, file);
|
|
451
|
+
const config = load.loadConfig(srcRoot, file, staging, logger$1);
|
|
452
|
+
const pluginTypes = parsePluginTypes(config);
|
|
453
|
+
const importPath = toImportPath(output, file);
|
|
454
|
+
const prev = routeMap.get(route);
|
|
455
|
+
if (!prev || priority > prev.priority)
|
|
456
|
+
routeMap.set(route, {
|
|
457
|
+
route,
|
|
458
|
+
importPath,
|
|
459
|
+
pluginTypes,
|
|
460
|
+
priority
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
const items = Array.from(routeMap.values()).sort(
|
|
464
|
+
(a, b) => a.route.localeCompare(b.route)
|
|
465
|
+
);
|
|
466
|
+
const content = formatTypes(items);
|
|
467
|
+
let changed = true;
|
|
468
|
+
try {
|
|
469
|
+
const previous = await promises.readFile(output, "utf8");
|
|
470
|
+
if (previous === content) changed = false;
|
|
471
|
+
} catch (_error) {
|
|
472
|
+
}
|
|
473
|
+
if (changed) {
|
|
474
|
+
await promises.mkdir(path.dirname(output), {
|
|
475
|
+
recursive: true
|
|
476
|
+
});
|
|
477
|
+
await promises.writeFile(output, content);
|
|
478
|
+
}
|
|
479
|
+
return {
|
|
480
|
+
output,
|
|
481
|
+
changed,
|
|
482
|
+
fileCount: files.length,
|
|
483
|
+
routeCount: items.length
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
var TYPEGEN_DEBOUNCE = 120;
|
|
281
487
|
function normalizeBase(base) {
|
|
282
488
|
const normalized = base.startsWith("/") ? base : `/${base}`;
|
|
283
489
|
if (normalized === "/") return "/";
|
|
@@ -293,7 +499,7 @@ function stripBase(url, base) {
|
|
|
293
499
|
return `${pathname.slice(base.length)}${search}`;
|
|
294
500
|
return url;
|
|
295
501
|
}
|
|
296
|
-
function viteFaasJsServer(
|
|
502
|
+
function viteFaasJsServer() {
|
|
297
503
|
let config;
|
|
298
504
|
let server$1 = null;
|
|
299
505
|
const logger$1 = new logger.Logger("FaasJs:Vite");
|
|
@@ -301,20 +507,64 @@ function viteFaasJsServer(options = {}) {
|
|
|
301
507
|
name: "vite:faasjs",
|
|
302
508
|
enforce: "pre",
|
|
303
509
|
configResolved(resolvedConfig) {
|
|
304
|
-
const
|
|
305
|
-
|
|
510
|
+
const serverConfig = resolveServerConfig(
|
|
511
|
+
resolvedConfig.root,
|
|
512
|
+
logger$1,
|
|
513
|
+
resolvedConfig.base
|
|
514
|
+
);
|
|
306
515
|
config = {
|
|
307
|
-
root,
|
|
308
|
-
base
|
|
516
|
+
root: serverConfig.root,
|
|
517
|
+
base: normalizeBase(serverConfig.base)
|
|
309
518
|
};
|
|
310
519
|
},
|
|
311
|
-
configureServer: async ({ middlewares }) => {
|
|
520
|
+
configureServer: async ({ middlewares, watcher }) => {
|
|
312
521
|
if (process.env.VITEST) {
|
|
313
522
|
logger$1.debug("Skipping faas server in vitest environment");
|
|
314
523
|
return;
|
|
315
524
|
}
|
|
316
525
|
if (!config) throw new Error("viteFaasJsServer: config is not resolved");
|
|
317
526
|
server$1 = new server.Server(path.join(config.root, "src"));
|
|
527
|
+
const runTypegen = async () => {
|
|
528
|
+
try {
|
|
529
|
+
const result = await generateFaasTypes({
|
|
530
|
+
root: config.root
|
|
531
|
+
});
|
|
532
|
+
logger$1.debug(
|
|
533
|
+
"[faas-types] %s %s (%i routes)",
|
|
534
|
+
result.changed ? "generated" : "up-to-date",
|
|
535
|
+
result.output,
|
|
536
|
+
result.routeCount
|
|
537
|
+
);
|
|
538
|
+
} catch (error) {
|
|
539
|
+
logger$1.error("[faas-types] %s", error.message);
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
let timer = null;
|
|
543
|
+
let runningTypegen = false;
|
|
544
|
+
let pendingTypegen = false;
|
|
545
|
+
const flushTypegen = async () => {
|
|
546
|
+
if (runningTypegen || !pendingTypegen) return;
|
|
547
|
+
pendingTypegen = false;
|
|
548
|
+
runningTypegen = true;
|
|
549
|
+
try {
|
|
550
|
+
await runTypegen();
|
|
551
|
+
} finally {
|
|
552
|
+
runningTypegen = false;
|
|
553
|
+
if (pendingTypegen) void flushTypegen();
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
const scheduleTypegen = () => {
|
|
557
|
+
pendingTypegen = true;
|
|
558
|
+
if (timer) clearTimeout(timer);
|
|
559
|
+
timer = setTimeout(() => {
|
|
560
|
+
void flushTypegen();
|
|
561
|
+
}, TYPEGEN_DEBOUNCE);
|
|
562
|
+
};
|
|
563
|
+
await runTypegen();
|
|
564
|
+
watcher.on("all", (_eventName, filePath) => {
|
|
565
|
+
if (!isTypegenSourceFile(filePath)) return;
|
|
566
|
+
scheduleTypegen();
|
|
567
|
+
});
|
|
318
568
|
middlewares.use(async (req, res, next) => {
|
|
319
569
|
if (!req.url || req.method !== "POST" || !server$1) return next();
|
|
320
570
|
const originalUrl = req.url;
|
|
@@ -347,9 +597,9 @@ function viteFaasJsServer(options = {}) {
|
|
|
347
597
|
|
|
348
598
|
exports.FuncWarper = FuncWarper;
|
|
349
599
|
exports.createPgliteKnex = createPgliteKnex;
|
|
600
|
+
exports.generateFaasTypes = generateFaasTypes;
|
|
601
|
+
exports.isTypegenSourceFile = isTypegenSourceFile;
|
|
350
602
|
exports.mountFaasKnex = mountFaasKnex;
|
|
351
|
-
exports.runPgliteSql = runPgliteSql;
|
|
352
|
-
exports.runPgliteSqlFile = runPgliteSqlFile;
|
|
353
603
|
exports.streamToString = streamToString;
|
|
354
604
|
exports.test = test;
|
|
355
605
|
exports.unmountFaasKnex = unmountFaasKnex;
|
package/dist/index.d.ts
CHANGED
|
@@ -22,16 +22,6 @@ declare function mountFaasKnex(db: Knex, options?: MountFaasKnexOptions): void;
|
|
|
22
22
|
* Remove mounted knex adapter from `globalThis.FaasJS_Knex`.
|
|
23
23
|
*/
|
|
24
24
|
declare function unmountFaasKnex(name?: string): void;
|
|
25
|
-
/**
|
|
26
|
-
* Run a SQL string on a PGlite-backed knex instance.
|
|
27
|
-
*/
|
|
28
|
-
declare function runPgliteSql(db: Knex, sql: string): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Run SQL from file on a PGlite-backed knex instance.
|
|
31
|
-
*/
|
|
32
|
-
declare function runPgliteSqlFile(db: Knex, filePath: string, options?: {
|
|
33
|
-
stripUuidOsspExtension?: boolean;
|
|
34
|
-
}): Promise<void>;
|
|
35
25
|
|
|
36
26
|
/**
|
|
37
27
|
* Convert ReadableStream to string.
|
|
@@ -62,8 +52,7 @@ declare class FuncWarper {
|
|
|
62
52
|
readonly plugins: Plugin[];
|
|
63
53
|
private readonly _handler;
|
|
64
54
|
/**
|
|
65
|
-
* @param
|
|
66
|
-
* @param func {Func} A FaasJs function
|
|
55
|
+
* @param initBy {Func} A FaasJS function
|
|
67
56
|
* ```ts
|
|
68
57
|
* import { FuncWarper } from '@faasjs/dev'
|
|
69
58
|
*
|
|
@@ -114,18 +103,27 @@ declare class FuncWarper {
|
|
|
114
103
|
*/
|
|
115
104
|
declare function test(initBy: Func): FuncWarper;
|
|
116
105
|
|
|
117
|
-
type
|
|
118
|
-
/** faas project root path, default is
|
|
119
|
-
root
|
|
120
|
-
/**
|
|
121
|
-
|
|
106
|
+
type GenerateFaasTypesOptions = {
|
|
107
|
+
/** faas project root path, default is process.cwd() */
|
|
108
|
+
root?: string;
|
|
109
|
+
/** optional logger instance */
|
|
110
|
+
logger?: Logger;
|
|
111
|
+
};
|
|
112
|
+
type GenerateFaasTypesResult = {
|
|
113
|
+
output: string;
|
|
114
|
+
changed: boolean;
|
|
115
|
+
fileCount: number;
|
|
116
|
+
routeCount: number;
|
|
122
117
|
};
|
|
118
|
+
declare function isTypegenSourceFile(filePath: string): boolean;
|
|
119
|
+
declare function generateFaasTypes(options?: GenerateFaasTypesOptions): Promise<GenerateFaasTypesResult>;
|
|
120
|
+
|
|
123
121
|
/**
|
|
124
122
|
* Create a Vite plugin that proxies POST requests to an in-process FaasJS server.
|
|
125
123
|
*
|
|
126
|
-
* It resolves
|
|
127
|
-
* before forwarding to `@faasjs/server`.
|
|
124
|
+
* It resolves server root/base from `src/faas.yaml` and strips `base` from
|
|
125
|
+
* request URL before forwarding to `@faasjs/server`.
|
|
128
126
|
*/
|
|
129
|
-
declare function viteFaasJsServer(
|
|
127
|
+
declare function viteFaasJsServer(): Plugin$1;
|
|
130
128
|
|
|
131
|
-
export { FuncWarper, type
|
|
129
|
+
export { FuncWarper, type GenerateFaasTypesOptions, type GenerateFaasTypesResult, type MountFaasKnexOptions, createPgliteKnex, generateFaasTypes, isTypegenSourceFile, mountFaasKnex, streamToString, test, unmountFaasKnex, viteFaasJsServer };
|