exisjs 0.7.6 → 0.7.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +12 -0
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/clean.d.ts +5 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +30 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +15 -1
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +6 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +57 -2
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.js +16 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manifest.d.ts +1 -0
- package/dist/cli/manifest.d.ts.map +1 -1
- package/dist/cli/manifest.js +161 -23
- package/dist/cli/manifest.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +9 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +4 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/cron/expressions.d.ts +45 -0
- package/dist/cron/expressions.d.ts.map +1 -0
- package/dist/cron/expressions.js +87 -0
- package/dist/cron/expressions.js.map +1 -0
- package/dist/cron/index.d.ts +6 -0
- package/dist/cron/index.d.ts.map +1 -0
- package/dist/cron/index.js +22 -0
- package/dist/cron/index.js.map +1 -0
- package/dist/cron/job.d.ts +50 -0
- package/dist/cron/job.d.ts.map +1 -0
- package/dist/cron/job.js +247 -0
- package/dist/cron/job.js.map +1 -0
- package/dist/cron/manager.d.ts +105 -0
- package/dist/cron/manager.d.ts.map +1 -0
- package/dist/cron/manager.js +245 -0
- package/dist/cron/manager.js.map +1 -0
- package/dist/cron/parser.d.ts +22 -0
- package/dist/cron/parser.d.ts.map +1 -0
- package/dist/cron/parser.js +269 -0
- package/dist/cron/parser.js.map +1 -0
- package/dist/cron/types.d.ts +76 -0
- package/dist/cron/types.d.ts.map +1 -0
- package/dist/cron/types.js +3 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/decorators/constants.d.ts +2 -0
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +3 -1
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core.d.ts +29 -11
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +49 -11
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/cron.d.ts +57 -0
- package/dist/decorators/cron.d.ts.map +1 -0
- package/dist/decorators/cron.js +143 -0
- package/dist/decorators/cron.js.map +1 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +2 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/params.d.ts +97 -2
- package/dist/decorators/params.d.ts.map +1 -1
- package/dist/decorators/params.js +94 -2
- package/dist/decorators/params.js.map +1 -1
- package/dist/decorators/routing.d.ts +81 -16
- package/dist/decorators/routing.d.ts.map +1 -1
- package/dist/decorators/routing.js +81 -16
- package/dist/decorators/routing.js.map +1 -1
- package/dist/docs/content/cron.mdx +196 -0
- package/dist/docs/content/errors.mdx +58 -9
- package/dist/docs/content/structure.mdx +1 -1
- package/dist/docs/content/swagger.mdx +289 -0
- package/dist/docs/reference/cron.mdx +300 -0
- package/dist/docs/reference/decorators.mdx +8 -0
- package/dist/docs/reference/error.mdx +44 -0
- package/dist/docs/reference/swagger.mdx +226 -0
- package/dist/docs/reference/validator.mdx +1 -1
- package/dist/router/boundary.d.ts +24 -2
- package/dist/router/boundary.d.ts.map +1 -1
- package/dist/router/boundary.js +24 -2
- package/dist/router/boundary.js.map +1 -1
- package/dist/router/controller-registrar.d.ts.map +1 -1
- package/dist/router/controller-registrar.js +52 -3
- package/dist/router/controller-registrar.js.map +1 -1
- package/dist/router/route-builder.d.ts +196 -33
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js +171 -11
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +6 -0
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +69 -812
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +27 -0
- package/dist/router/router.js.map +1 -1
- package/dist/router/scanner/boundary-loader.d.ts +18 -0
- package/dist/router/scanner/boundary-loader.d.ts.map +1 -0
- package/dist/router/scanner/boundary-loader.js +539 -0
- package/dist/router/scanner/boundary-loader.js.map +1 -0
- package/dist/router/scanner/cron-mounter.d.ts +15 -0
- package/dist/router/scanner/cron-mounter.d.ts.map +1 -0
- package/dist/router/scanner/cron-mounter.js +216 -0
- package/dist/router/scanner/cron-mounter.js.map +1 -0
- package/dist/router/scanner/error-mounter.d.ts +14 -0
- package/dist/router/scanner/error-mounter.d.ts.map +1 -0
- package/dist/router/scanner/error-mounter.js +200 -0
- package/dist/router/scanner/error-mounter.js.map +1 -0
- package/dist/router/scanner/fs-scanner.d.ts +25 -0
- package/dist/router/scanner/fs-scanner.d.ts.map +1 -0
- package/dist/router/scanner/fs-scanner.js +115 -0
- package/dist/router/scanner/fs-scanner.js.map +1 -0
- package/dist/router/scanner/functional-compiler.d.ts +9 -0
- package/dist/router/scanner/functional-compiler.d.ts.map +1 -0
- package/dist/router/scanner/functional-compiler.js +233 -0
- package/dist/router/scanner/functional-compiler.js.map +1 -0
- package/dist/router/scanner/index.d.ts +9 -0
- package/dist/router/scanner/index.d.ts.map +1 -0
- package/dist/router/scanner/index.js +19 -0
- package/dist/router/scanner/index.js.map +1 -0
- package/dist/router/types.d.ts +15 -0
- package/dist/router/types.d.ts.map +1 -1
- package/dist/server/app.d.ts +2 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +3 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/helpers/body-parser.d.ts +18 -0
- package/dist/server/helpers/body-parser.d.ts.map +1 -0
- package/dist/server/helpers/body-parser.js +246 -0
- package/dist/server/helpers/body-parser.js.map +1 -0
- package/dist/server/helpers/cookie.d.ts +4 -0
- package/dist/server/helpers/cookie.d.ts.map +1 -0
- package/dist/server/helpers/cookie.js +61 -0
- package/dist/server/helpers/cookie.js.map +1 -0
- package/dist/server/helpers/etag.d.ts +3 -0
- package/dist/server/helpers/etag.d.ts.map +1 -0
- package/dist/server/helpers/etag.js +25 -0
- package/dist/server/helpers/etag.js.map +1 -0
- package/dist/server/helpers/index.d.ts +6 -0
- package/dist/server/helpers/index.d.ts.map +1 -0
- package/dist/server/helpers/index.js +21 -0
- package/dist/server/helpers/index.js.map +1 -0
- package/dist/server/helpers/ip.d.ts +9 -0
- package/dist/server/helpers/ip.d.ts.map +1 -0
- package/dist/server/helpers/ip.js +62 -0
- package/dist/server/helpers/ip.js.map +1 -0
- package/dist/server/helpers/stream.d.ts +4 -0
- package/dist/server/helpers/stream.d.ts.map +1 -0
- package/dist/server/helpers/stream.js +193 -0
- package/dist/server/helpers/stream.js.map +1 -0
- package/dist/server/request.d.ts +1 -139
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +19 -433
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +105 -158
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +121 -423
- package/dist/server/response.js.map +1 -1
- package/dist/swagger/decorators.d.ts +81 -0
- package/dist/swagger/decorators.d.ts.map +1 -0
- package/dist/swagger/decorators.js +172 -0
- package/dist/swagger/decorators.js.map +1 -0
- package/dist/swagger/generator.d.ts +19 -0
- package/dist/swagger/generator.d.ts.map +1 -0
- package/dist/swagger/generator.js +344 -0
- package/dist/swagger/generator.js.map +1 -0
- package/dist/swagger/index.d.ts +31 -0
- package/dist/swagger/index.d.ts.map +1 -0
- package/dist/swagger/index.js +53 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/swagger/mounter.d.ts +7 -0
- package/dist/swagger/mounter.d.ts.map +1 -0
- package/dist/swagger/mounter.js +56 -0
- package/dist/swagger/mounter.js.map +1 -0
- package/dist/swagger/types.d.ts +190 -0
- package/dist/swagger/types.d.ts.map +1 -0
- package/dist/swagger/types.js +3 -0
- package/dist/swagger/types.js.map +1 -0
- package/dist/swagger/ui.d.ts +6 -0
- package/dist/swagger/ui.d.ts.map +1 -0
- package/dist/swagger/ui.js +118 -0
- package/dist/swagger/ui.js.map +1 -0
- package/dist/validator/builder.d.ts +223 -0
- package/dist/validator/builder.d.ts.map +1 -0
- package/dist/validator/builder.js +517 -0
- package/dist/validator/builder.js.map +1 -0
- package/dist/validator/engine.d.ts +19 -0
- package/dist/validator/engine.d.ts.map +1 -0
- package/dist/validator/engine.js +568 -0
- package/dist/validator/engine.js.map +1 -0
- package/dist/validator/error.d.ts +12 -0
- package/dist/validator/error.d.ts.map +1 -0
- package/dist/validator/error.js +63 -0
- package/dist/validator/error.js.map +1 -0
- package/dist/validator/pagination.d.ts +40 -0
- package/dist/validator/pagination.d.ts.map +1 -0
- package/dist/validator/pagination.js +60 -0
- package/dist/validator/pagination.js.map +1 -0
- package/dist/validator/tex.d.ts +6 -158
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +14 -971
- package/dist/validator/tex.js.map +1 -1
- package/dist/validator/types.d.ts +83 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +3 -0
- package/dist/validator/types.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.mountCronJobs = mountCronJobs;
|
|
37
|
+
exports.mountCronJobsFromEntries = mountCronJobsFromEntries;
|
|
38
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
const node_url_1 = require("node:url");
|
|
41
|
+
const fs_scanner_1 = require("./fs-scanner");
|
|
42
|
+
/**
|
|
43
|
+
* Discovers and mounts all cron jobs from dedicated directories (e.g. `src/cron/`)
|
|
44
|
+
* and single-file/colocated cron definitions (e.g. `src/http/cron.ts`).
|
|
45
|
+
*/
|
|
46
|
+
async function mountCronJobs(root, app, allApiDirs) {
|
|
47
|
+
const cronFiles = [];
|
|
48
|
+
// 1. Scan dedicated src/cron and .exis/server/src/cron directories (all files are cron jobs)
|
|
49
|
+
const dedicatedCronDirs = [
|
|
50
|
+
path.join(root, '.exis', 'server', 'src', 'cron'),
|
|
51
|
+
path.join(root, '.exis', 'src', 'cron'),
|
|
52
|
+
path.join(root, 'src', 'cron'),
|
|
53
|
+
];
|
|
54
|
+
for (const dir of dedicatedCronDirs) {
|
|
55
|
+
try {
|
|
56
|
+
const stat = await fs.stat(dir);
|
|
57
|
+
if (stat.isDirectory()) {
|
|
58
|
+
const files = await (0, fs_scanner_1.getFilesRecursively)(dir);
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
if (!cronFiles.includes(file)) {
|
|
61
|
+
cronFiles.push(file);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// ignore
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 2. Scan single-file and colocated cron files in src/http (e.g. src/http/cron.ts)
|
|
71
|
+
const httpDirs = allApiDirs && allApiDirs.length > 0
|
|
72
|
+
? allApiDirs
|
|
73
|
+
: [
|
|
74
|
+
path.join(root, '.exis', 'server', 'src', 'http'),
|
|
75
|
+
path.join(root, '.exis', 'src', 'http'),
|
|
76
|
+
path.join(root, 'src', 'http'),
|
|
77
|
+
];
|
|
78
|
+
for (const dir of httpDirs) {
|
|
79
|
+
try {
|
|
80
|
+
const stat = await fs.stat(dir).catch(() => null);
|
|
81
|
+
if (!stat || !stat.isDirectory())
|
|
82
|
+
continue;
|
|
83
|
+
const scan = await (0, fs_scanner_1.scanDirectory)(dir);
|
|
84
|
+
for (const { filePath } of scan) {
|
|
85
|
+
const baseName = path.basename(filePath);
|
|
86
|
+
if (baseName === 'cron.ts' ||
|
|
87
|
+
baseName === 'cron.js' ||
|
|
88
|
+
baseName === 'cron.mjs' ||
|
|
89
|
+
baseName === 'cron.cjs') {
|
|
90
|
+
if (!cronFiles.includes(filePath)) {
|
|
91
|
+
cronFiles.push(filePath);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// ignore
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const entries = [];
|
|
101
|
+
for (const file of cronFiles) {
|
|
102
|
+
try {
|
|
103
|
+
const url = process.env.VITEST || process.env.NODE_ENV === 'test'
|
|
104
|
+
? (0, node_url_1.pathToFileURL)(file).href
|
|
105
|
+
: (0, node_url_1.pathToFileURL)(file).href + '?t=' + Date.now();
|
|
106
|
+
let mod;
|
|
107
|
+
try {
|
|
108
|
+
if (process.env.VITEST || process.env.NODE_ENV === 'test') {
|
|
109
|
+
mod = await Promise.resolve(`${url}`).then(s => __importStar(require(s)));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const dynamicImport = new Function('specifier', 'return import(specifier)');
|
|
113
|
+
mod = await dynamicImport(url);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
118
|
+
mod = require(file);
|
|
119
|
+
}
|
|
120
|
+
entries.push({ filePath: file, module: mod });
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
app.log.error({ err: err.message, file }, `Failed to load cron file: ${file}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
mountCronJobsFromEntries(entries, app);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Mounts cron jobs from pre-loaded module entries (used by both filesystem discovery and manifest boot).
|
|
130
|
+
*/
|
|
131
|
+
function mountCronJobsFromEntries(entries, app) {
|
|
132
|
+
const CRON_REGISTRY = Symbol.for('exisjs:cron_jobs');
|
|
133
|
+
const registeredCronEntities = new Set();
|
|
134
|
+
for (const { filePath: file, module: mod } of entries) {
|
|
135
|
+
try {
|
|
136
|
+
const candidateExports = [];
|
|
137
|
+
const unwrapped = mod && mod.default && mod.default.default
|
|
138
|
+
? mod.default.default
|
|
139
|
+
: mod && mod.default
|
|
140
|
+
? mod.default
|
|
141
|
+
: mod;
|
|
142
|
+
if (unwrapped) {
|
|
143
|
+
candidateExports.push({ key: 'default', value: unwrapped });
|
|
144
|
+
}
|
|
145
|
+
if (mod && typeof mod === 'object' && !mod.__isExisCron) {
|
|
146
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
147
|
+
if (key !== 'default' && key !== '__esModule') {
|
|
148
|
+
candidateExports.push({ key, value });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const fileBaseName = path.basename(file).replace(/\.[jmt]s$/, '');
|
|
153
|
+
for (const { key, value } of candidateExports) {
|
|
154
|
+
if (!value || registeredCronEntities.has(value))
|
|
155
|
+
continue;
|
|
156
|
+
// Handle array of cron jobs (e.g. export default [job1, job2])
|
|
157
|
+
const items = Array.isArray(value) ? value : [value];
|
|
158
|
+
for (const item of items) {
|
|
159
|
+
if (!item || registeredCronEntities.has(item))
|
|
160
|
+
continue;
|
|
161
|
+
// 1. Functional Cron Definition
|
|
162
|
+
if (item.__isExisCron) {
|
|
163
|
+
registeredCronEntities.add(item);
|
|
164
|
+
const jobName = item.options.name ||
|
|
165
|
+
(key === 'default' ? fileBaseName : `${fileBaseName}_${key}`);
|
|
166
|
+
app.cron.schedule({
|
|
167
|
+
...item.options,
|
|
168
|
+
name: jobName,
|
|
169
|
+
});
|
|
170
|
+
app.log.info({ file }, `Mounted cron job "${jobName}" from ${file}`);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// 2. Class-Based Decorated Cron
|
|
174
|
+
const targetClass = typeof item === 'function' && item.prototype?.[CRON_REGISTRY]
|
|
175
|
+
? item
|
|
176
|
+
: null;
|
|
177
|
+
if (targetClass) {
|
|
178
|
+
registeredCronEntities.add(targetClass);
|
|
179
|
+
let instance;
|
|
180
|
+
try {
|
|
181
|
+
instance = app.container.resolve(targetClass);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
instance = null;
|
|
185
|
+
}
|
|
186
|
+
if (!instance) {
|
|
187
|
+
try {
|
|
188
|
+
instance = app.container.instantiateClass(targetClass);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
instance = new targetClass();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const decoratedJobs = targetClass.prototype[CRON_REGISTRY];
|
|
195
|
+
if (Array.isArray(decoratedJobs)) {
|
|
196
|
+
for (const jobMeta of decoratedJobs) {
|
|
197
|
+
const jobName = jobMeta.options.name ||
|
|
198
|
+
`${targetClass.name}.${jobMeta.methodName}`;
|
|
199
|
+
app.cron.schedule({
|
|
200
|
+
...jobMeta.options,
|
|
201
|
+
name: jobName,
|
|
202
|
+
run: instance[jobMeta.methodName].bind(instance),
|
|
203
|
+
});
|
|
204
|
+
app.log.info({ file }, `Mounted OOP cron job "${jobName}" from ${file}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
app.log.error({ err: err.message, file }, `Failed to load cron file: ${file}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=cron-mounter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-mounter.js","sourceRoot":"","sources":["../../../src/router/scanner/cron-mounter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { App } from '../../server/app';
|
|
2
|
+
/**
|
|
3
|
+
* Discovers and mounts the global error handler for a given HTTP directory.
|
|
4
|
+
*/
|
|
5
|
+
export declare function mountErrorHandler(dir: string, app: App): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Mounts a global error handler from an already loaded module export.
|
|
8
|
+
* Supports:
|
|
9
|
+
* - OOP class error handlers with DI resolution (`onError`, `catch`, `handle`, `handleError`)
|
|
10
|
+
* - Object-based error handlers
|
|
11
|
+
* - Functional error handler callbacks `(err, req, res, next)`
|
|
12
|
+
*/
|
|
13
|
+
export declare function mountErrorHandlerFromModule(mod: any, app: App, errorFile?: string): void;
|
|
14
|
+
//# sourceMappingURL=error-mounter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mounter.d.ts","sourceRoot":"","sources":["../../../src/router/scanner/error-mounter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D5E;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,SAAS,SAAa,GACrB,IAAI,CA+GN"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.mountErrorHandler = mountErrorHandler;
|
|
37
|
+
exports.mountErrorHandlerFromModule = mountErrorHandlerFromModule;
|
|
38
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
const node_url_1 = require("node:url");
|
|
41
|
+
/**
|
|
42
|
+
* Discovers and mounts the global error handler for a given HTTP directory.
|
|
43
|
+
*/
|
|
44
|
+
async function mountErrorHandler(dir, app) {
|
|
45
|
+
const candidateFiles = [
|
|
46
|
+
path.join(dir, 'error.ts'),
|
|
47
|
+
path.join(dir, 'error.js'),
|
|
48
|
+
path.join(dir, 'error.mjs'),
|
|
49
|
+
path.join(dir, 'error.cjs'),
|
|
50
|
+
];
|
|
51
|
+
let errorFile = null;
|
|
52
|
+
for (const file of candidateFiles) {
|
|
53
|
+
try {
|
|
54
|
+
const stat = await fs.stat(file);
|
|
55
|
+
if (stat.isFile()) {
|
|
56
|
+
errorFile = file;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// ignore
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!errorFile) {
|
|
65
|
+
try {
|
|
66
|
+
const dirFiles = await fs.readdir(dir).catch(() => []);
|
|
67
|
+
const namedError = dirFiles.find((f) => /\.error\.[jmt]s$/.test(f));
|
|
68
|
+
if (namedError) {
|
|
69
|
+
errorFile = path.join(dir, namedError);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// ignore
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!errorFile)
|
|
77
|
+
return;
|
|
78
|
+
try {
|
|
79
|
+
const url = process.env.VITEST || process.env.NODE_ENV === 'test'
|
|
80
|
+
? (0, node_url_1.pathToFileURL)(errorFile).href
|
|
81
|
+
: (0, node_url_1.pathToFileURL)(errorFile).href + '?t=' + Date.now();
|
|
82
|
+
let mod;
|
|
83
|
+
if (process.env.VITEST || process.env.NODE_ENV === 'test') {
|
|
84
|
+
mod = await Promise.resolve(`${url}`).then(s => __importStar(require(s)));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const dynamicImport = new Function('specifier', 'return import(specifier)');
|
|
88
|
+
mod = await dynamicImport(url);
|
|
89
|
+
}
|
|
90
|
+
mountErrorHandlerFromModule(mod, app, errorFile);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
app.log.error({ err, file: errorFile }, `Failed to load error handler file: ${errorFile}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Mounts a global error handler from an already loaded module export.
|
|
98
|
+
* Supports:
|
|
99
|
+
* - OOP class error handlers with DI resolution (`onError`, `catch`, `handle`, `handleError`)
|
|
100
|
+
* - Object-based error handlers
|
|
101
|
+
* - Functional error handler callbacks `(err, req, res, next)`
|
|
102
|
+
*/
|
|
103
|
+
function mountErrorHandlerFromModule(mod, app, errorFile = 'error.ts') {
|
|
104
|
+
try {
|
|
105
|
+
const unwrapped = mod && mod.default && mod.default.default
|
|
106
|
+
? mod.default.default
|
|
107
|
+
: mod && mod.default
|
|
108
|
+
? mod.default
|
|
109
|
+
: mod;
|
|
110
|
+
let handler = null;
|
|
111
|
+
const isClass = (fn) => {
|
|
112
|
+
if (typeof fn !== 'function')
|
|
113
|
+
return false;
|
|
114
|
+
if (fn.prototype &&
|
|
115
|
+
(typeof fn.prototype.onError === 'function' ||
|
|
116
|
+
typeof fn.prototype.catch === 'function' ||
|
|
117
|
+
typeof fn.prototype.handle === 'function' ||
|
|
118
|
+
typeof fn.prototype.handleError === 'function')) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return /^class\s/.test(Function.prototype.toString.call(fn));
|
|
122
|
+
};
|
|
123
|
+
const targetClass = isClass(unwrapped)
|
|
124
|
+
? unwrapped
|
|
125
|
+
: isClass(mod?.GlobalErrorHandler)
|
|
126
|
+
? mod.GlobalErrorHandler
|
|
127
|
+
: isClass(mod?.ErrorHandler)
|
|
128
|
+
? mod.ErrorHandler
|
|
129
|
+
: null;
|
|
130
|
+
if (targetClass) {
|
|
131
|
+
let instance;
|
|
132
|
+
try {
|
|
133
|
+
instance = app.container.resolve(targetClass);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
instance = null;
|
|
137
|
+
}
|
|
138
|
+
if (!instance) {
|
|
139
|
+
try {
|
|
140
|
+
instance = app.container.instantiateClass(targetClass);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
instance = new targetClass();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const method = instance.onError ||
|
|
147
|
+
instance.catch ||
|
|
148
|
+
instance.handle ||
|
|
149
|
+
instance.handleError;
|
|
150
|
+
if (typeof method === 'function') {
|
|
151
|
+
handler = (err, req, res, next) => {
|
|
152
|
+
if (method.length === 2 && instance.catch === method) {
|
|
153
|
+
return method.call(instance, err, { req, res, next });
|
|
154
|
+
}
|
|
155
|
+
return method.call(instance, err, req, res, next);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else if (unwrapped &&
|
|
160
|
+
typeof unwrapped === 'object' &&
|
|
161
|
+
(typeof unwrapped.onError === 'function' ||
|
|
162
|
+
typeof unwrapped.catch === 'function' ||
|
|
163
|
+
typeof unwrapped.handle === 'function' ||
|
|
164
|
+
typeof unwrapped.handleError === 'function')) {
|
|
165
|
+
const method = unwrapped.onError ||
|
|
166
|
+
unwrapped.catch ||
|
|
167
|
+
unwrapped.handle ||
|
|
168
|
+
unwrapped.handleError;
|
|
169
|
+
handler = (err, req, res, next) => {
|
|
170
|
+
if (method.length === 2 && unwrapped.catch === method) {
|
|
171
|
+
return method.call(unwrapped, err, { req, res, next });
|
|
172
|
+
}
|
|
173
|
+
return method.call(unwrapped, err, req, res, next);
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (!handler) {
|
|
177
|
+
handler =
|
|
178
|
+
mod.onError ||
|
|
179
|
+
(unwrapped && unwrapped.onError) ||
|
|
180
|
+
(typeof unwrapped === 'function' && !isClass(unwrapped)
|
|
181
|
+
? unwrapped
|
|
182
|
+
: null) ||
|
|
183
|
+
mod.errorHandler ||
|
|
184
|
+
mod.handleError;
|
|
185
|
+
}
|
|
186
|
+
if (typeof handler === 'function') {
|
|
187
|
+
if (handler.length === 4) {
|
|
188
|
+
app.use(handler);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
app.onError(handler);
|
|
192
|
+
}
|
|
193
|
+
app.log.info({ file: errorFile }, 'Mounted global error handler from error.ts');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
app.log.error({ err, file: errorFile }, `Failed to load error handler file: ${errorFile}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=error-mounter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mounter.js","sourceRoot":"","sources":["../../../src/router/scanner/error-mounter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ScannedRoute {
|
|
2
|
+
filePath: string;
|
|
3
|
+
routePath: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Recursively scans a directory and computes the route path for each file.
|
|
7
|
+
* Handles:
|
|
8
|
+
* - `(group)` route groups (skipped from URL path)
|
|
9
|
+
* - `[...param]` wildcard parameters (transformed to `*param`)
|
|
10
|
+
* - `[param]` dynamic route parameters (transformed to `:param`)
|
|
11
|
+
*/
|
|
12
|
+
export declare function scanDirectory(dir: string, baseRoute?: string): Promise<ScannedRoute[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Recursively retrieves all files within a directory matching script extensions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getFilesRecursively(dir: string): Promise<string[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Determines whether a file path represents a boundary definition.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isBoundaryFile(filePath: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Determines whether a file path represents a route definition.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isRouteFile(filePath: string): boolean;
|
|
25
|
+
//# sourceMappingURL=fs-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-scanner.d.ts","sourceRoot":"","sources":["../../../src/router/scanner/fs-scanner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,SAAS,SAAM,GACd,OAAO,CAAC,YAAY,EAAE,CAAC,CAiCzB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMrD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.scanDirectory = scanDirectory;
|
|
37
|
+
exports.getFilesRecursively = getFilesRecursively;
|
|
38
|
+
exports.isBoundaryFile = isBoundaryFile;
|
|
39
|
+
exports.isRouteFile = isRouteFile;
|
|
40
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
/**
|
|
43
|
+
* Recursively scans a directory and computes the route path for each file.
|
|
44
|
+
* Handles:
|
|
45
|
+
* - `(group)` route groups (skipped from URL path)
|
|
46
|
+
* - `[...param]` wildcard parameters (transformed to `*param`)
|
|
47
|
+
* - `[param]` dynamic route parameters (transformed to `:param`)
|
|
48
|
+
*/
|
|
49
|
+
async function scanDirectory(dir, baseRoute = '/') {
|
|
50
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
51
|
+
const results = [];
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
const fullPath = path.join(dir, entry.name);
|
|
54
|
+
if (entry.isDirectory()) {
|
|
55
|
+
let segment = entry.name;
|
|
56
|
+
// Route groups: (group) -> do not add segment to URL
|
|
57
|
+
if (segment.startsWith('(') && segment.endsWith(')')) {
|
|
58
|
+
const subResults = await scanDirectory(fullPath, baseRoute);
|
|
59
|
+
results.push(...subResults);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Wildcard / Catch-all params: [...slug] -> *slug
|
|
63
|
+
if (segment.startsWith('[...') && segment.endsWith(']')) {
|
|
64
|
+
segment = '*' + segment.slice(4, -1);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Dynamic route params: [id] -> :id
|
|
68
|
+
segment = segment.replace(/\[(.*?)\]/g, ':$1');
|
|
69
|
+
}
|
|
70
|
+
const nextBase = baseRoute === '/' ? `/${segment}` : `${baseRoute}/${segment}`;
|
|
71
|
+
const subResults = await scanDirectory(fullPath, nextBase);
|
|
72
|
+
results.push(...subResults);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
results.push({ filePath: fullPath, routePath: baseRoute });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Recursively retrieves all files within a directory matching script extensions.
|
|
82
|
+
*/
|
|
83
|
+
async function getFilesRecursively(dir) {
|
|
84
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
85
|
+
const files = [];
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
const full = path.join(dir, entry.name);
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
files.push(...(await getFilesRecursively(full)));
|
|
90
|
+
}
|
|
91
|
+
else if (entry.isFile() &&
|
|
92
|
+
/\.[jmt]s$/.test(entry.name) &&
|
|
93
|
+
!entry.name.endsWith('.d.ts')) {
|
|
94
|
+
files.push(full);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return files;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Determines whether a file path represents a boundary definition.
|
|
101
|
+
*/
|
|
102
|
+
function isBoundaryFile(filePath) {
|
|
103
|
+
return (filePath.endsWith('boundary.ts') ||
|
|
104
|
+
filePath.endsWith('boundary.js') ||
|
|
105
|
+
/\.boundary\.[jt]s$/.test(filePath));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Determines whether a file path represents a route definition.
|
|
109
|
+
*/
|
|
110
|
+
function isRouteFile(filePath) {
|
|
111
|
+
return (filePath.endsWith('route.ts') ||
|
|
112
|
+
filePath.endsWith('route.js') ||
|
|
113
|
+
/\.route\.[jt]s$/.test(filePath));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=fs-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-scanner.js","sourceRoot":"","sources":["../../../src/router/scanner/fs-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Router } from '../router';
|
|
2
|
+
import type { App } from '../../server/app';
|
|
3
|
+
/**
|
|
4
|
+
* Compiles a modern functional controller configuration object into an ExisJS Router instance.
|
|
5
|
+
* Assembles middleware, route parameter / body validation, guard checking, context injection,
|
|
6
|
+
* and error interception into an ultra-high performance handler pipeline.
|
|
7
|
+
*/
|
|
8
|
+
export declare function compileFunctionalController(config: any, app: App): Router;
|
|
9
|
+
//# sourceMappingURL=functional-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functional-compiler.d.ts","sourceRoot":"","sources":["../../../src/router/scanner/functional-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAIlC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAwPzE"}
|