@faasjs/dev 8.0.0-beta.5 → 8.0.0-beta.7
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 +21 -31
- package/dist/chunk-CtajNgzt.mjs +36 -0
- package/dist/cli.cjs +67 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.mjs +66 -0
- package/dist/index.cjs +311 -333
- package/dist/index.d.ts +72 -97
- package/dist/index.mjs +274 -310
- package/dist/typegen-C6t9LIyi.cjs +183 -0
- package/dist/typegen-D5s91_xL.mjs +166 -0
- package/faas-types.mjs +7 -0
- package/package.json +23 -19
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
let _faasjs_logger = require("@faasjs/logger");
|
|
2
|
+
let _faasjs_node_utils = require("@faasjs/node-utils");
|
|
3
|
+
let node_fs = require("node:fs");
|
|
4
|
+
let node_fs_promises = require("node:fs/promises");
|
|
5
|
+
let node_path = require("node:path");
|
|
6
|
+
|
|
7
|
+
//#region src/server_config.ts
|
|
8
|
+
function resolveFaasStaging() {
|
|
9
|
+
return process.env.FaasEnv || "development";
|
|
10
|
+
}
|
|
11
|
+
function resolveServerConfig(root, logger, defaultBase = "/") {
|
|
12
|
+
const projectRoot = (0, node_path.resolve)(root);
|
|
13
|
+
const staging = resolveFaasStaging();
|
|
14
|
+
const srcRoot = (0, node_path.join)(projectRoot, "src");
|
|
15
|
+
const config = (0, _faasjs_node_utils.loadConfig)(srcRoot, (0, node_path.join)(srcRoot, "index.func.ts"), staging, logger);
|
|
16
|
+
const server = config && typeof config === "object" ? config.server : void 0;
|
|
17
|
+
return {
|
|
18
|
+
root: server && typeof server.root === "string" && server.root.length ? (0, node_path.resolve)(projectRoot, server.root) : projectRoot,
|
|
19
|
+
base: server && typeof server.base === "string" && server.base.length ? server.base : defaultBase,
|
|
20
|
+
staging
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/typegen.ts
|
|
26
|
+
function normalizeSlashes(path) {
|
|
27
|
+
return path.replace(/\\/g, "/");
|
|
28
|
+
}
|
|
29
|
+
function normalizeRoute(path) {
|
|
30
|
+
const normalized = path.replace(/\/+/g, "/");
|
|
31
|
+
if (!normalized.length || normalized === "/") return "/";
|
|
32
|
+
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
33
|
+
}
|
|
34
|
+
function toRoute(srcRoot, file) {
|
|
35
|
+
const noTsPath = normalizeSlashes((0, node_path.relative)(srcRoot, file)).replace(/\.ts$/, "");
|
|
36
|
+
if (noTsPath === "index.func") return {
|
|
37
|
+
route: "/",
|
|
38
|
+
priority: 2
|
|
39
|
+
};
|
|
40
|
+
if (noTsPath === "default.func") return {
|
|
41
|
+
route: "/*",
|
|
42
|
+
priority: 1
|
|
43
|
+
};
|
|
44
|
+
if (noTsPath.endsWith("/index.func")) return {
|
|
45
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -11)}`),
|
|
46
|
+
priority: 2
|
|
47
|
+
};
|
|
48
|
+
if (noTsPath.endsWith("/default.func")) return {
|
|
49
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -13)}/*`),
|
|
50
|
+
priority: 1
|
|
51
|
+
};
|
|
52
|
+
if (noTsPath.endsWith(".func")) return {
|
|
53
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -5)}`),
|
|
54
|
+
priority: 3
|
|
55
|
+
};
|
|
56
|
+
throw Error(`[faas-types] Invalid func filename: ${file}`);
|
|
57
|
+
}
|
|
58
|
+
function toImportPath(fromFile, targetFile) {
|
|
59
|
+
const importPath = normalizeSlashes((0, node_path.relative)((0, node_path.dirname)(fromFile), targetFile)).replace(/\.ts$/, "");
|
|
60
|
+
if (importPath.startsWith(".")) return importPath;
|
|
61
|
+
return `./${importPath}`;
|
|
62
|
+
}
|
|
63
|
+
function parsePluginTypes(config) {
|
|
64
|
+
const pluginConfig = config.plugins;
|
|
65
|
+
if (!pluginConfig || typeof pluginConfig !== "object") return [];
|
|
66
|
+
const pluginTypes = /* @__PURE__ */ new Set();
|
|
67
|
+
for (const key in pluginConfig) {
|
|
68
|
+
const data = pluginConfig[key];
|
|
69
|
+
if (typeof data === "string" && data.length) {
|
|
70
|
+
pluginTypes.add(data);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (data && typeof data === "object") {
|
|
74
|
+
if (typeof data.type === "string" && data.type.length) pluginTypes.add(data.type);
|
|
75
|
+
else pluginTypes.add(key);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
pluginTypes.add(key);
|
|
79
|
+
}
|
|
80
|
+
return Array.from(pluginTypes).sort((a, b) => a.localeCompare(b));
|
|
81
|
+
}
|
|
82
|
+
async function readFuncFiles(dir) {
|
|
83
|
+
const result = [];
|
|
84
|
+
async function walk(currentDir) {
|
|
85
|
+
const entries = await (0, node_fs_promises.readdir)(currentDir, { withFileTypes: true });
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
if (entry.name === ".faasjs" || entry.name === "node_modules") continue;
|
|
88
|
+
const filePath = (0, node_path.join)(currentDir, entry.name);
|
|
89
|
+
if (entry.isDirectory()) {
|
|
90
|
+
await walk(filePath);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (entry.isFile() && entry.name.endsWith(".func.ts")) result.push(filePath);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await walk(dir);
|
|
97
|
+
return result.sort((a, b) => a.localeCompare(b));
|
|
98
|
+
}
|
|
99
|
+
function formatTypes(items) {
|
|
100
|
+
const actionLines = items.map((item) => {
|
|
101
|
+
return ` ${JSON.stringify(item.route)}: InferFaasAction<InferFaasFunc<typeof import(${JSON.stringify(item.importPath)})>>`;
|
|
102
|
+
});
|
|
103
|
+
const eventLines = items.map((item) => {
|
|
104
|
+
const plugins = item.pluginTypes.length ? `[${item.pluginTypes.map((type) => JSON.stringify(type)).join(", ")}]` : "[]";
|
|
105
|
+
return ` ${JSON.stringify(item.route)}: InferPluginEvent<${plugins}>`;
|
|
106
|
+
});
|
|
107
|
+
return `/**
|
|
108
|
+
* Generated by @faasjs/dev.
|
|
109
|
+
*
|
|
110
|
+
* Do not edit this file manually.
|
|
111
|
+
*/
|
|
112
|
+
import type { Func, InferPluginEvent } from '@faasjs/func'
|
|
113
|
+
import type { InferFaasAction, InferFaasFunc } from '@faasjs/types'
|
|
114
|
+
|
|
115
|
+
declare module '@faasjs/types' {
|
|
116
|
+
interface FaasActions {
|
|
117
|
+
${actionLines.length ? `${actionLines.join("\n")}\n` : ""} }
|
|
118
|
+
|
|
119
|
+
interface FaasEvents {
|
|
120
|
+
${eventLines.length ? `${eventLines.join("\n")}\n` : ""} }
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
function isTypegenSourceFile(filePath) {
|
|
125
|
+
return /\.func\.ts$/.test(filePath) || /(^|[\\/])faas\.ya?ml$/.test(filePath);
|
|
126
|
+
}
|
|
127
|
+
async function generateFaasTypes(options = {}) {
|
|
128
|
+
const logger = options.logger || new _faasjs_logger.Logger("FaasJs:Typegen");
|
|
129
|
+
const { root: projectRoot, staging } = resolveServerConfig(options.root || process.cwd(), logger);
|
|
130
|
+
const srcRoot = (0, node_path.join)(projectRoot, "src");
|
|
131
|
+
const output = (0, node_path.join)(srcRoot, ".faasjs", "types.d.ts");
|
|
132
|
+
if (!(0, node_fs.existsSync)(srcRoot)) throw Error(`[faas-types] Source directory not found: ${srcRoot}`);
|
|
133
|
+
const files = await readFuncFiles(srcRoot);
|
|
134
|
+
const routeMap = /* @__PURE__ */ new Map();
|
|
135
|
+
for (const file of files) {
|
|
136
|
+
const { route, priority } = toRoute(srcRoot, file);
|
|
137
|
+
const pluginTypes = parsePluginTypes((0, _faasjs_node_utils.loadConfig)(srcRoot, file, staging, logger));
|
|
138
|
+
const importPath = toImportPath(output, file);
|
|
139
|
+
const prev = routeMap.get(route);
|
|
140
|
+
if (!prev || priority > prev.priority) routeMap.set(route, {
|
|
141
|
+
route,
|
|
142
|
+
importPath,
|
|
143
|
+
pluginTypes,
|
|
144
|
+
priority
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const items = Array.from(routeMap.values()).sort((a, b) => a.route.localeCompare(b.route));
|
|
148
|
+
const content = formatTypes(items);
|
|
149
|
+
let changed = true;
|
|
150
|
+
try {
|
|
151
|
+
if (await (0, node_fs_promises.readFile)(output, "utf8") === content) changed = false;
|
|
152
|
+
} catch (_error) {}
|
|
153
|
+
if (changed) {
|
|
154
|
+
await (0, node_fs_promises.mkdir)((0, node_path.dirname)(output), { recursive: true });
|
|
155
|
+
await (0, node_fs_promises.writeFile)(output, content);
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
output,
|
|
159
|
+
changed,
|
|
160
|
+
fileCount: files.length,
|
|
161
|
+
routeCount: items.length
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
Object.defineProperty(exports, 'generateFaasTypes', {
|
|
167
|
+
enumerable: true,
|
|
168
|
+
get: function () {
|
|
169
|
+
return generateFaasTypes;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
Object.defineProperty(exports, 'isTypegenSourceFile', {
|
|
173
|
+
enumerable: true,
|
|
174
|
+
get: function () {
|
|
175
|
+
return isTypegenSourceFile;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
Object.defineProperty(exports, 'resolveServerConfig', {
|
|
179
|
+
enumerable: true,
|
|
180
|
+
get: function () {
|
|
181
|
+
return resolveServerConfig;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Logger } from "@faasjs/logger";
|
|
2
|
+
import { loadConfig } from "@faasjs/node-utils";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
5
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
6
|
+
|
|
7
|
+
//#region src/server_config.ts
|
|
8
|
+
function resolveFaasStaging() {
|
|
9
|
+
return process.env.FaasEnv || "development";
|
|
10
|
+
}
|
|
11
|
+
function resolveServerConfig(root, logger, defaultBase = "/") {
|
|
12
|
+
const projectRoot = resolve(root);
|
|
13
|
+
const staging = resolveFaasStaging();
|
|
14
|
+
const srcRoot = join(projectRoot, "src");
|
|
15
|
+
const config = loadConfig(srcRoot, join(srcRoot, "index.func.ts"), staging, logger);
|
|
16
|
+
const server = config && typeof config === "object" ? config.server : void 0;
|
|
17
|
+
return {
|
|
18
|
+
root: server && typeof server.root === "string" && server.root.length ? resolve(projectRoot, server.root) : projectRoot,
|
|
19
|
+
base: server && typeof server.base === "string" && server.base.length ? server.base : defaultBase,
|
|
20
|
+
staging
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/typegen.ts
|
|
26
|
+
function normalizeSlashes(path) {
|
|
27
|
+
return path.replace(/\\/g, "/");
|
|
28
|
+
}
|
|
29
|
+
function normalizeRoute(path) {
|
|
30
|
+
const normalized = path.replace(/\/+/g, "/");
|
|
31
|
+
if (!normalized.length || normalized === "/") return "/";
|
|
32
|
+
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
33
|
+
}
|
|
34
|
+
function toRoute(srcRoot, file) {
|
|
35
|
+
const noTsPath = normalizeSlashes(relative(srcRoot, file)).replace(/\.ts$/, "");
|
|
36
|
+
if (noTsPath === "index.func") return {
|
|
37
|
+
route: "/",
|
|
38
|
+
priority: 2
|
|
39
|
+
};
|
|
40
|
+
if (noTsPath === "default.func") return {
|
|
41
|
+
route: "/*",
|
|
42
|
+
priority: 1
|
|
43
|
+
};
|
|
44
|
+
if (noTsPath.endsWith("/index.func")) return {
|
|
45
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -11)}`),
|
|
46
|
+
priority: 2
|
|
47
|
+
};
|
|
48
|
+
if (noTsPath.endsWith("/default.func")) return {
|
|
49
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -13)}/*`),
|
|
50
|
+
priority: 1
|
|
51
|
+
};
|
|
52
|
+
if (noTsPath.endsWith(".func")) return {
|
|
53
|
+
route: normalizeRoute(`/${noTsPath.slice(0, -5)}`),
|
|
54
|
+
priority: 3
|
|
55
|
+
};
|
|
56
|
+
throw Error(`[faas-types] Invalid func filename: ${file}`);
|
|
57
|
+
}
|
|
58
|
+
function toImportPath(fromFile, targetFile) {
|
|
59
|
+
const importPath = normalizeSlashes(relative(dirname(fromFile), targetFile)).replace(/\.ts$/, "");
|
|
60
|
+
if (importPath.startsWith(".")) return importPath;
|
|
61
|
+
return `./${importPath}`;
|
|
62
|
+
}
|
|
63
|
+
function parsePluginTypes(config) {
|
|
64
|
+
const pluginConfig = config.plugins;
|
|
65
|
+
if (!pluginConfig || typeof pluginConfig !== "object") return [];
|
|
66
|
+
const pluginTypes = /* @__PURE__ */ new Set();
|
|
67
|
+
for (const key in pluginConfig) {
|
|
68
|
+
const data = pluginConfig[key];
|
|
69
|
+
if (typeof data === "string" && data.length) {
|
|
70
|
+
pluginTypes.add(data);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (data && typeof data === "object") {
|
|
74
|
+
if (typeof data.type === "string" && data.type.length) pluginTypes.add(data.type);
|
|
75
|
+
else pluginTypes.add(key);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
pluginTypes.add(key);
|
|
79
|
+
}
|
|
80
|
+
return Array.from(pluginTypes).sort((a, b) => a.localeCompare(b));
|
|
81
|
+
}
|
|
82
|
+
async function readFuncFiles(dir) {
|
|
83
|
+
const result = [];
|
|
84
|
+
async function walk(currentDir) {
|
|
85
|
+
const entries = await readdir(currentDir, { withFileTypes: true });
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
if (entry.name === ".faasjs" || entry.name === "node_modules") continue;
|
|
88
|
+
const filePath = join(currentDir, entry.name);
|
|
89
|
+
if (entry.isDirectory()) {
|
|
90
|
+
await walk(filePath);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (entry.isFile() && entry.name.endsWith(".func.ts")) result.push(filePath);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await walk(dir);
|
|
97
|
+
return result.sort((a, b) => a.localeCompare(b));
|
|
98
|
+
}
|
|
99
|
+
function formatTypes(items) {
|
|
100
|
+
const actionLines = items.map((item) => {
|
|
101
|
+
return ` ${JSON.stringify(item.route)}: InferFaasAction<InferFaasFunc<typeof import(${JSON.stringify(item.importPath)})>>`;
|
|
102
|
+
});
|
|
103
|
+
const eventLines = items.map((item) => {
|
|
104
|
+
const plugins = item.pluginTypes.length ? `[${item.pluginTypes.map((type) => JSON.stringify(type)).join(", ")}]` : "[]";
|
|
105
|
+
return ` ${JSON.stringify(item.route)}: InferPluginEvent<${plugins}>`;
|
|
106
|
+
});
|
|
107
|
+
return `/**
|
|
108
|
+
* Generated by @faasjs/dev.
|
|
109
|
+
*
|
|
110
|
+
* Do not edit this file manually.
|
|
111
|
+
*/
|
|
112
|
+
import type { Func, InferPluginEvent } from '@faasjs/func'
|
|
113
|
+
import type { InferFaasAction, InferFaasFunc } from '@faasjs/types'
|
|
114
|
+
|
|
115
|
+
declare module '@faasjs/types' {
|
|
116
|
+
interface FaasActions {
|
|
117
|
+
${actionLines.length ? `${actionLines.join("\n")}\n` : ""} }
|
|
118
|
+
|
|
119
|
+
interface FaasEvents {
|
|
120
|
+
${eventLines.length ? `${eventLines.join("\n")}\n` : ""} }
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
function isTypegenSourceFile(filePath) {
|
|
125
|
+
return /\.func\.ts$/.test(filePath) || /(^|[\\/])faas\.ya?ml$/.test(filePath);
|
|
126
|
+
}
|
|
127
|
+
async function generateFaasTypes(options = {}) {
|
|
128
|
+
const logger = options.logger || new Logger("FaasJs:Typegen");
|
|
129
|
+
const { root: projectRoot, staging } = resolveServerConfig(options.root || process.cwd(), logger);
|
|
130
|
+
const srcRoot = join(projectRoot, "src");
|
|
131
|
+
const output = join(srcRoot, ".faasjs", "types.d.ts");
|
|
132
|
+
if (!existsSync(srcRoot)) throw Error(`[faas-types] Source directory not found: ${srcRoot}`);
|
|
133
|
+
const files = await readFuncFiles(srcRoot);
|
|
134
|
+
const routeMap = /* @__PURE__ */ new Map();
|
|
135
|
+
for (const file of files) {
|
|
136
|
+
const { route, priority } = toRoute(srcRoot, file);
|
|
137
|
+
const pluginTypes = parsePluginTypes(loadConfig(srcRoot, file, staging, logger));
|
|
138
|
+
const importPath = toImportPath(output, file);
|
|
139
|
+
const prev = routeMap.get(route);
|
|
140
|
+
if (!prev || priority > prev.priority) routeMap.set(route, {
|
|
141
|
+
route,
|
|
142
|
+
importPath,
|
|
143
|
+
pluginTypes,
|
|
144
|
+
priority
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const items = Array.from(routeMap.values()).sort((a, b) => a.route.localeCompare(b.route));
|
|
148
|
+
const content = formatTypes(items);
|
|
149
|
+
let changed = true;
|
|
150
|
+
try {
|
|
151
|
+
if (await readFile(output, "utf8") === content) changed = false;
|
|
152
|
+
} catch (_error) {}
|
|
153
|
+
if (changed) {
|
|
154
|
+
await mkdir(dirname(output), { recursive: true });
|
|
155
|
+
await writeFile(output, content);
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
output,
|
|
159
|
+
changed,
|
|
160
|
+
fileCount: files.length,
|
|
161
|
+
routeCount: items.length
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
export { isTypegenSourceFile as n, resolveServerConfig as r, generateFaasTypes as t };
|
package/faas-types.mjs
ADDED
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faasjs/dev",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0-beta.7",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
7
7
|
"module": "dist/index.mjs",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"faas-types": "faas-types.mjs"
|
|
11
|
+
},
|
|
9
12
|
"exports": {
|
|
10
13
|
".": {
|
|
11
14
|
"types": "./dist/index.d.ts",
|
|
@@ -24,34 +27,35 @@
|
|
|
24
27
|
},
|
|
25
28
|
"funding": "https://github.com/sponsors/faasjs",
|
|
26
29
|
"scripts": {
|
|
27
|
-
"build": "
|
|
30
|
+
"build": "tsdown --entry src/index.ts --entry src/cli.ts --config ../../tsdown.config.ts"
|
|
28
31
|
},
|
|
29
32
|
"files": [
|
|
30
|
-
"dist"
|
|
33
|
+
"dist",
|
|
34
|
+
"faas-types.mjs"
|
|
31
35
|
],
|
|
32
36
|
"peerDependencies": {
|
|
33
|
-
"@faasjs/
|
|
34
|
-
"@faasjs/
|
|
35
|
-
"@faasjs/
|
|
36
|
-
"@faasjs/
|
|
37
|
-
"@faasjs/
|
|
38
|
-
"@faasjs/
|
|
39
|
-
"@
|
|
37
|
+
"@faasjs/func": ">=8.0.0-beta.7",
|
|
38
|
+
"@faasjs/http": ">=8.0.0-beta.7",
|
|
39
|
+
"@faasjs/knex": ">=8.0.0-beta.7",
|
|
40
|
+
"@faasjs/logger": ">=8.0.0-beta.7",
|
|
41
|
+
"@faasjs/node-utils": ">=8.0.0-beta.7",
|
|
42
|
+
"@faasjs/server": ">=8.0.0-beta.7",
|
|
43
|
+
"@types/node": "*",
|
|
40
44
|
"knex": "*",
|
|
41
45
|
"vite": "*",
|
|
42
|
-
"
|
|
46
|
+
"vitest": "*"
|
|
43
47
|
},
|
|
44
48
|
"devDependencies": {
|
|
45
|
-
"@faasjs/
|
|
46
|
-
"@faasjs/
|
|
47
|
-
"@faasjs/
|
|
48
|
-
"@faasjs/
|
|
49
|
-
"@faasjs/
|
|
50
|
-
"@faasjs/
|
|
51
|
-
"@
|
|
49
|
+
"@faasjs/func": ">=8.0.0-beta.7",
|
|
50
|
+
"@faasjs/http": ">=8.0.0-beta.7",
|
|
51
|
+
"@faasjs/knex": ">=8.0.0-beta.7",
|
|
52
|
+
"@faasjs/logger": ">=8.0.0-beta.7",
|
|
53
|
+
"@faasjs/node-utils": ">=8.0.0-beta.7",
|
|
54
|
+
"@faasjs/server": ">=8.0.0-beta.7",
|
|
55
|
+
"@types/node": "*",
|
|
52
56
|
"knex": "*",
|
|
53
57
|
"vite": "*",
|
|
54
|
-
"
|
|
58
|
+
"vitest": "*"
|
|
55
59
|
},
|
|
56
60
|
"engines": {
|
|
57
61
|
"node": ">=24.0.0",
|