@athosjs/pro 0.1.4-alpha
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 +518 -0
- package/bootstrap.cjs +107 -0
- package/bootstrap.cjs.map +1 -0
- package/bootstrap.d.ts +8 -0
- package/bootstrap.d.ts.map +1 -0
- package/bootstrap.js +103 -0
- package/bootstrap.js.map +1 -0
- package/core/athos-application.cjs +362 -0
- package/core/athos-application.cjs.map +1 -0
- package/core/athos-application.d.ts +17 -0
- package/core/athos-application.d.ts.map +1 -0
- package/core/athos-application.js +357 -0
- package/core/athos-application.js.map +1 -0
- package/core/discovery.cjs +47 -0
- package/core/discovery.cjs.map +1 -0
- package/core/discovery.d.ts +6 -0
- package/core/discovery.d.ts.map +1 -0
- package/core/discovery.js +45 -0
- package/core/discovery.js.map +1 -0
- package/core/i18n.cjs +12 -0
- package/core/i18n.cjs.map +1 -0
- package/core/i18n.d.ts +4 -0
- package/core/i18n.d.ts.map +1 -0
- package/core/i18n.js +10 -0
- package/core/i18n.js.map +1 -0
- package/core/pipeline.cjs +251 -0
- package/core/pipeline.cjs.map +1 -0
- package/core/pipeline.d.ts +11 -0
- package/core/pipeline.d.ts.map +1 -0
- package/core/pipeline.js +246 -0
- package/core/pipeline.js.map +1 -0
- package/core/router-initializer.cjs +158 -0
- package/core/router-initializer.cjs.map +1 -0
- package/core/router-initializer.d.ts +26 -0
- package/core/router-initializer.d.ts.map +1 -0
- package/core/router-initializer.js +156 -0
- package/core/router-initializer.js.map +1 -0
- package/core/scanner.cjs +141 -0
- package/core/scanner.cjs.map +1 -0
- package/core/scanner.d.ts +7 -0
- package/core/scanner.d.ts.map +1 -0
- package/core/scanner.js +139 -0
- package/core/scanner.js.map +1 -0
- package/experimental.cjs +23 -0
- package/experimental.cjs.map +1 -0
- package/experimental.d.ts +9 -0
- package/experimental.d.ts.map +1 -0
- package/experimental.js +5 -0
- package/experimental.js.map +1 -0
- package/functions.cjs +67 -0
- package/functions.cjs.map +1 -0
- package/functions.d.ts +10 -0
- package/functions.d.ts.map +1 -0
- package/functions.js +62 -0
- package/functions.js.map +1 -0
- package/http-profile.cjs +48 -0
- package/http-profile.cjs.map +1 -0
- package/http-profile.d.ts +6 -0
- package/http-profile.d.ts.map +1 -0
- package/http-profile.js +44 -0
- package/http-profile.js.map +1 -0
- package/index.cjs +281 -0
- package/index.cjs.map +1 -0
- package/index.d.ts +23 -0
- package/index.d.ts.map +1 -0
- package/index.js +23 -0
- package/index.js.map +1 -0
- package/observability.cjs +191 -0
- package/observability.cjs.map +1 -0
- package/observability.d.ts +8 -0
- package/observability.d.ts.map +1 -0
- package/observability.js +188 -0
- package/observability.js.map +1 -0
- package/package.json +42 -0
- package/policies.cjs +30 -0
- package/policies.cjs.map +1 -0
- package/policies.d.ts +21 -0
- package/policies.d.ts.map +1 -0
- package/policies.js +27 -0
- package/policies.js.map +1 -0
- package/resilience.cjs +280 -0
- package/resilience.cjs.map +1 -0
- package/resilience.d.ts +6 -0
- package/resilience.d.ts.map +1 -0
- package/resilience.js +276 -0
- package/resilience.js.map +1 -0
- package/security.cjs +142 -0
- package/security.cjs.map +1 -0
- package/security.d.ts +11 -0
- package/security.d.ts.map +1 -0
- package/security.js +136 -0
- package/security.js.map +1 -0
- package/types.d.ts +3 -0
- package/types.d.ts.map +1 -0
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { resolveAthosConfig } from '@athosjs/config';
|
|
2
|
+
import { ConfigLoader, setAthosEnv, setAthosOptions, printAthosError, formatAthosEnvValidationError, ATHOS_CONFIG_SOURCE_URL } from '@athosjs/core';
|
|
3
|
+
import { createHttpApplication } from '@athosjs/http';
|
|
4
|
+
import { ConsoleAthosLogger } from '@athosjs/observability';
|
|
5
|
+
import { detectRuntime, readRuntimeEnvRecord } from '@athosjs/runtime';
|
|
6
|
+
import { ProApplication } from '../functions.js';
|
|
7
|
+
import { ComponentDiscovery } from './discovery.js';
|
|
8
|
+
import { normalizeConfiguredProMiddlewareInput, normalizeProPolicyInput, normalizeProInterceptorInput } from './pipeline.js';
|
|
9
|
+
import { registerConfiguredI18n } from './i18n.js';
|
|
10
|
+
import { RouterInitializer } from './router-initializer.js';
|
|
11
|
+
|
|
12
|
+
const applicationMetadataRegistry = new Map();
|
|
13
|
+
function AthosApplicationDecorator(options = {}) {
|
|
14
|
+
return (target)=>{
|
|
15
|
+
applicationMetadataRegistry.set(target, options);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function getAthosApplicationOptions(target) {
|
|
19
|
+
if (typeof target !== "function") {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return applicationMetadataRegistry.get(target);
|
|
23
|
+
}
|
|
24
|
+
function compileAthosApplicationManifest(target) {
|
|
25
|
+
const metadataOptions = getAthosApplicationOptions(target);
|
|
26
|
+
return {
|
|
27
|
+
controllers: [
|
|
28
|
+
...metadataOptions?.controllers ?? []
|
|
29
|
+
],
|
|
30
|
+
providers: [
|
|
31
|
+
...metadataOptions?.providers?.filter((provider)=>typeof provider === "function") ?? []
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
class AthosApplication {
|
|
36
|
+
static logger = new ConsoleAthosLogger();
|
|
37
|
+
static async bootstrap(appClassOrOptions, optionsOrUndefined) {
|
|
38
|
+
const hasClass = arguments.length === 2 && typeof appClassOrOptions === "function";
|
|
39
|
+
const appClass = hasClass ? appClassOrOptions : null;
|
|
40
|
+
let options = hasClass ? optionsOrUndefined : appClassOrOptions;
|
|
41
|
+
const runtimeResult = options.runtime ? {
|
|
42
|
+
name: options.runtime
|
|
43
|
+
} : detectRuntime();
|
|
44
|
+
const runtime = runtimeResult.name === "unknown" ? "node" : runtimeResult.name;
|
|
45
|
+
const loadedConfig = await ConfigLoader.load();
|
|
46
|
+
const resolvedConfig = loadedConfig ? await resolveConfigForRuntime(loadedConfig, runtime) : null;
|
|
47
|
+
if (resolvedConfig) {
|
|
48
|
+
options = {
|
|
49
|
+
...resolvedConfig.config,
|
|
50
|
+
...options,
|
|
51
|
+
port: options.port ?? resolvedConfig.config.port ?? 3000,
|
|
52
|
+
hostname: options.hostname ?? resolvedConfig.config.hostname
|
|
53
|
+
};
|
|
54
|
+
setAthosEnv(resolvedConfig.env ?? resolvedConfig.rawEnv);
|
|
55
|
+
}
|
|
56
|
+
setAthosOptions(options);
|
|
57
|
+
if (options.logLevel) {
|
|
58
|
+
AthosApplication.logger = new ConsoleAthosLogger({
|
|
59
|
+
level: options.logLevel
|
|
60
|
+
});
|
|
61
|
+
} else if (typeof options.logger === "object" && "level" in options.logger) {
|
|
62
|
+
AthosApplication.logger = new ConsoleAthosLogger({
|
|
63
|
+
level: options.logger.level
|
|
64
|
+
});
|
|
65
|
+
} else if (typeof options.logger === "function" || typeof options.logger === "object" && options.logger !== null) {
|
|
66
|
+
AthosApplication.logger = options.logger;
|
|
67
|
+
}
|
|
68
|
+
AthosApplication.logger.trace("Bootstrapping Athos application...");
|
|
69
|
+
const metadataOptions = appClass ? applicationMetadataRegistry.get(appClass) : undefined;
|
|
70
|
+
const discoveryEnabled = options.discovery?.enabled ?? resolvedConfig?.config.discovery?.enabled ?? false;
|
|
71
|
+
const discoveryRoot = options.discovery?.root ?? resolvedConfig?.config.discovery?.root;
|
|
72
|
+
const discoveryDirectories = options.discovery?.includeDirectories ?? resolvedConfig?.config.discovery?.includeDirectories;
|
|
73
|
+
if (discoveryEnabled && !discoveryRoot) {
|
|
74
|
+
throw new Error("Athos discovery requires an explicit discovery.root. Implicit process.cwd() scanning is not supported.");
|
|
75
|
+
}
|
|
76
|
+
const discovered = options.manifest ?? (discoveryEnabled ? await ComponentDiscovery.discover({
|
|
77
|
+
root: discoveryRoot,
|
|
78
|
+
includeDirectories: discoveryDirectories
|
|
79
|
+
}) : {
|
|
80
|
+
controllers: [],
|
|
81
|
+
providers: []
|
|
82
|
+
});
|
|
83
|
+
const discovery = {
|
|
84
|
+
controllers: [
|
|
85
|
+
...metadataOptions?.controllers ?? [],
|
|
86
|
+
...discovered.controllers
|
|
87
|
+
],
|
|
88
|
+
providers: [
|
|
89
|
+
...metadataOptions?.providers?.filter((provider)=>typeof provider === "function") ?? [],
|
|
90
|
+
...discovered.providers
|
|
91
|
+
]
|
|
92
|
+
};
|
|
93
|
+
AthosApplication.logger.debug(`Prepared ${discovery.controllers.length} controllers and ${discovery.providers.length} providers.`);
|
|
94
|
+
AthosApplication.logger.trace("Creating pro application kernel...");
|
|
95
|
+
const proResult = await ProApplication.create({
|
|
96
|
+
runtime: {
|
|
97
|
+
name: runtime
|
|
98
|
+
},
|
|
99
|
+
providers: [
|
|
100
|
+
...discovery.providers,
|
|
101
|
+
...discovery.controllers
|
|
102
|
+
],
|
|
103
|
+
manifests: [
|
|
104
|
+
...normalizeApplicationImports(metadataOptions?.imports),
|
|
105
|
+
...options.manifests ?? []
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
const kernel = proResult.kernel;
|
|
109
|
+
const container = proResult.container;
|
|
110
|
+
AthosApplication.logger.trace("Initializing HTTP application layer...");
|
|
111
|
+
const httpApp = createHttpApplication(kernel);
|
|
112
|
+
const serverConfig = options.server;
|
|
113
|
+
if (serverConfig?.cors) {
|
|
114
|
+
AthosApplication.logger.trace("Enabling built-in CORS support...");
|
|
115
|
+
const corsModule = await import('@athosjs/http');
|
|
116
|
+
const corsOptions = typeof serverConfig.cors === "object" ? serverConfig.cors : {};
|
|
117
|
+
httpApp.use(corsModule.createCorsMiddleware(corsOptions));
|
|
118
|
+
}
|
|
119
|
+
if (serverConfig?.compression) {
|
|
120
|
+
AthosApplication.logger.trace("Enabling built-in Compression support...");
|
|
121
|
+
const { compressionMiddleware } = await import('@athosjs/http');
|
|
122
|
+
httpApp.use(compressionMiddleware);
|
|
123
|
+
}
|
|
124
|
+
if (serverConfig?.onError) {
|
|
125
|
+
const userOnError = serverConfig.onError;
|
|
126
|
+
httpApp.setHooks({
|
|
127
|
+
onError: (context, error)=>userOnError({
|
|
128
|
+
context,
|
|
129
|
+
error
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (options.i18n) {
|
|
134
|
+
AthosApplication.logger.trace("Registering configured i18n middleware...");
|
|
135
|
+
await registerConfiguredI18n(httpApp, options.i18n);
|
|
136
|
+
}
|
|
137
|
+
if (options.middlewares) {
|
|
138
|
+
AthosApplication.logger.trace(`Registering ${options.middlewares.length} global middlewares...`);
|
|
139
|
+
for (const middleware of options.middlewares){
|
|
140
|
+
httpApp.use(await normalizeConfiguredProMiddlewareInput(container, middleware));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (options.policies) {
|
|
144
|
+
AthosApplication.logger.trace(`Registering ${options.policies.length} global policies...`);
|
|
145
|
+
for (const policy of options.policies){
|
|
146
|
+
httpApp.policy(await normalizeProPolicyInput(container, policy));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (options.interceptors) {
|
|
150
|
+
AthosApplication.logger.trace(`Registering ${options.interceptors.length} global interceptors...`);
|
|
151
|
+
for (const interceptor of options.interceptors){
|
|
152
|
+
httpApp.intercept(await normalizeProInterceptorInput(container, interceptor));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (options.validation && typeof options.validation === "object") {
|
|
156
|
+
httpApp.setValidation(options.validation);
|
|
157
|
+
}
|
|
158
|
+
AthosApplication.logger.trace("Binding discovered routes to router...");
|
|
159
|
+
RouterInitializer.initialize(httpApp, container, discovery.controllers);
|
|
160
|
+
if (options.openapi) {
|
|
161
|
+
AthosApplication.logger.trace("Registering OpenAPI routes from athos.config...");
|
|
162
|
+
const { registerOpenApiRoutes } = await import('@athosjs/openapi');
|
|
163
|
+
registerOpenApiRoutes(httpApp, normalizeConfiguredOpenApiOptions(options.openapi, {
|
|
164
|
+
controllers: discovery.controllers
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
await kernel.start();
|
|
168
|
+
const server = await AthosApplication.startServer(httpApp, runtime, options);
|
|
169
|
+
setupGracefulShutdown(server, kernel);
|
|
170
|
+
return server;
|
|
171
|
+
}
|
|
172
|
+
static async startServer(app, runtime, options) {
|
|
173
|
+
let serveFn;
|
|
174
|
+
try {
|
|
175
|
+
if (runtime === "node") {
|
|
176
|
+
const adapter = await import('@athosjs/runtime/node');
|
|
177
|
+
serveFn = adapter.serve;
|
|
178
|
+
} else if (runtime === "bun") {
|
|
179
|
+
const adapter = await import('@athosjs/runtime/bun');
|
|
180
|
+
serveFn = adapter.serve;
|
|
181
|
+
} else if (runtime === "deno") {
|
|
182
|
+
const adapter = await import('@athosjs/runtime/deno');
|
|
183
|
+
serveFn = adapter.serve;
|
|
184
|
+
} else {
|
|
185
|
+
throw new Error(`Unsupported runtime: ${runtime}`);
|
|
186
|
+
}
|
|
187
|
+
} catch (err) {
|
|
188
|
+
AthosApplication.logger.error(`Failed to load adapter for runtime '${runtime}'.`);
|
|
189
|
+
throw err;
|
|
190
|
+
}
|
|
191
|
+
if (!serveFn) {
|
|
192
|
+
throw new Error(`The runtime adapter for '${runtime}' does not export a 'serve' function.`);
|
|
193
|
+
}
|
|
194
|
+
const server = serveFn(app, {
|
|
195
|
+
port: options.port,
|
|
196
|
+
hostname: options.hostname,
|
|
197
|
+
...runtime === "node" && options.nodeAdapter ? {
|
|
198
|
+
adapter: options.nodeAdapter
|
|
199
|
+
} : {},
|
|
200
|
+
...runtime === "node" && options.server?.maxHeaderBytes !== undefined ? {
|
|
201
|
+
maxHeaderBytes: options.server.maxHeaderBytes
|
|
202
|
+
} : {}
|
|
203
|
+
});
|
|
204
|
+
AthosApplication.logger.info(`Application started on port ${options.port} (${runtime})`);
|
|
205
|
+
logOpenApiEndpoints(AthosApplication.logger, options.openapi, options.hostname, options.port);
|
|
206
|
+
return server;
|
|
207
|
+
}
|
|
208
|
+
static async run(appClassOrOptions, optionsOrUndefined) {
|
|
209
|
+
try {
|
|
210
|
+
const hasClass = arguments.length === 2 && typeof appClassOrOptions === "function";
|
|
211
|
+
if (hasClass) {
|
|
212
|
+
return await AthosApplication.bootstrap(appClassOrOptions, optionsOrUndefined);
|
|
213
|
+
}
|
|
214
|
+
return await AthosApplication.bootstrap(appClassOrOptions ?? {});
|
|
215
|
+
} catch (error) {
|
|
216
|
+
printAthosError(error);
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
static async compile(appClassOrManifest) {
|
|
221
|
+
if (!appClassOrManifest) {
|
|
222
|
+
throw new Error("Athos.compile() requires an explicit application class or manifest. Implicit filesystem discovery is no longer supported.");
|
|
223
|
+
}
|
|
224
|
+
if (typeof appClassOrManifest === "object" && appClassOrManifest !== null && ("controllers" in appClassOrManifest || "providers" in appClassOrManifest)) {
|
|
225
|
+
return {
|
|
226
|
+
controllers: [
|
|
227
|
+
...appClassOrManifest.controllers ?? []
|
|
228
|
+
],
|
|
229
|
+
providers: [
|
|
230
|
+
...appClassOrManifest.providers ?? []
|
|
231
|
+
]
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (typeof appClassOrManifest === "function") {
|
|
235
|
+
return compileAthosApplicationManifest(appClassOrManifest);
|
|
236
|
+
}
|
|
237
|
+
throw new Error("Athos.compile() received an unsupported input. Pass an application class decorated with @AthosApplication() or an explicit manifest.");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function normalizeConfiguredOpenApiOptions(config, defaultSource) {
|
|
241
|
+
const explorer = config.explorer;
|
|
242
|
+
const docsPath = explorer?.path ?? config.docsPath ?? "/docs";
|
|
243
|
+
const documentPath = config.documentPath ?? (explorer?.enabled === false ? "/openapi.json" : deriveOpenApiDocumentPathFromDocsPath(docsPath));
|
|
244
|
+
return {
|
|
245
|
+
...config,
|
|
246
|
+
documentPath,
|
|
247
|
+
source: config.source ?? defaultSource,
|
|
248
|
+
explorer: explorer?.enabled === false ? false : explorer ? {
|
|
249
|
+
...explorer,
|
|
250
|
+
path: docsPath,
|
|
251
|
+
documentPath: explorer.documentPath ?? documentPath
|
|
252
|
+
} : {
|
|
253
|
+
path: docsPath,
|
|
254
|
+
documentPath
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function normalizeApplicationImports(imports) {
|
|
259
|
+
if (!imports || imports.length === 0) {
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
return imports.filter((entry)=>entry !== undefined && entry !== null);
|
|
263
|
+
}
|
|
264
|
+
function logOpenApiEndpoints(logger, openapi, hostname, port) {
|
|
265
|
+
if (!openapi) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const docsEnabled = openapi.explorer?.enabled !== false;
|
|
269
|
+
const docsPath = openapi.explorer?.path ?? openapi.docsPath ?? "/docs";
|
|
270
|
+
const documentPath = openapi.documentPath ?? (docsEnabled ? deriveOpenApiDocumentPathFromDocsPath(docsPath) : "/openapi.json");
|
|
271
|
+
const baseUrl = createBaseUrl(hostname, port);
|
|
272
|
+
const documentUrl = new URL(documentPath, baseUrl).toString();
|
|
273
|
+
if (docsEnabled) {
|
|
274
|
+
logger.info(`OpenAPI docs available at ${new URL(docsPath, baseUrl).toString()}`);
|
|
275
|
+
}
|
|
276
|
+
logger.info(`OpenAPI JSON available at ${documentUrl}`);
|
|
277
|
+
}
|
|
278
|
+
function createBaseUrl(hostname, port) {
|
|
279
|
+
const resolvedHostname = normalizePublicHostname(hostname);
|
|
280
|
+
const resolvedPort = port ?? 3000;
|
|
281
|
+
return `http://${resolvedHostname}:${resolvedPort}`;
|
|
282
|
+
}
|
|
283
|
+
function setupGracefulShutdown(server, kernel) {
|
|
284
|
+
const timeoutMs = 30_000;
|
|
285
|
+
let shuttingDown = false;
|
|
286
|
+
const shutdown = async ()=>{
|
|
287
|
+
if (shuttingDown) return;
|
|
288
|
+
shuttingDown = true;
|
|
289
|
+
const timer = setTimeout(()=>{
|
|
290
|
+
process.stderr.write("Graceful shutdown timed out, forcing exit.\n");
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}, timeoutMs);
|
|
293
|
+
try {
|
|
294
|
+
await Promise.all([
|
|
295
|
+
server.close(),
|
|
296
|
+
kernel.shutdown()
|
|
297
|
+
]);
|
|
298
|
+
} catch {
|
|
299
|
+
process.exit(1);
|
|
300
|
+
} finally{
|
|
301
|
+
clearTimeout(timer);
|
|
302
|
+
process.exit(0);
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
process.on("SIGTERM", shutdown);
|
|
306
|
+
process.on("SIGINT", shutdown);
|
|
307
|
+
}
|
|
308
|
+
function normalizePublicHostname(hostname) {
|
|
309
|
+
if (!hostname || hostname === "0.0.0.0" || hostname === "::") {
|
|
310
|
+
return "localhost";
|
|
311
|
+
}
|
|
312
|
+
return hostname.includes(":") && !hostname.startsWith("[") ? `[${hostname}]` : hostname;
|
|
313
|
+
}
|
|
314
|
+
function deriveOpenApiDocumentPathFromDocsPath(docsPath) {
|
|
315
|
+
const normalized = docsPath === "/" ? "/" : docsPath.replace(/\/$/, "");
|
|
316
|
+
return `${normalized}.json`;
|
|
317
|
+
}
|
|
318
|
+
async function resolveConfigForRuntime(loadedConfig, runtime) {
|
|
319
|
+
try {
|
|
320
|
+
if (runtime === "node") {
|
|
321
|
+
const { ensureNodeEnvFilesLoaded } = await import('@athosjs/runtime/node');
|
|
322
|
+
ensureNodeEnvFilesLoaded();
|
|
323
|
+
}
|
|
324
|
+
const resolved = await resolveAthosConfig(loadedConfig ?? {}, {
|
|
325
|
+
env: readRuntimeEnvRecord(),
|
|
326
|
+
runtime: {
|
|
327
|
+
name: runtime,
|
|
328
|
+
provider: runtime
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
const sourceUrl = readConfigSourceUrl(loadedConfig);
|
|
332
|
+
if (sourceUrl && resolved.config.i18n && !resolved.config.i18n.baseUrl) {
|
|
333
|
+
return {
|
|
334
|
+
...resolved,
|
|
335
|
+
config: {
|
|
336
|
+
...resolved.config,
|
|
337
|
+
i18n: {
|
|
338
|
+
...resolved.config.i18n,
|
|
339
|
+
baseUrl: sourceUrl
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return resolved;
|
|
345
|
+
} catch (error) {
|
|
346
|
+
throw formatAthosEnvValidationError(error);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function readConfigSourceUrl(input) {
|
|
350
|
+
if ((typeof input !== "object" || input === null) && typeof input !== "function") {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
return input[ATHOS_CONFIG_SOURCE_URL];
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export { AthosApplication, AthosApplicationDecorator, compileAthosApplicationManifest, getAthosApplicationOptions };
|
|
357
|
+
//# sourceMappingURL=athos-application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"athos-application.js","sources":["../../../../packages/pro/src/core/athos-application.ts"],"sourcesContent":["import type { HavenOpenApiConfig } from \"@athosjs/config\";\nimport { resolveAthosConfig } from \"@athosjs/config\";\nimport {\n\tATHOS_CONFIG_SOURCE_URL,\n\tConfigLoader,\n\tformatAthosEnvValidationError,\n\tprintAthosError,\n\tsetAthosEnv,\n\tsetAthosOptions,\n} from \"@athosjs/core\";\nimport { createHttpApplication } from \"@athosjs/http\";\nimport type { Constructable as Constructor } from \"@athosjs/metadata\";\nimport { ConsoleAthosLogger, type AthosLogger, type LogLevel } from \"@athosjs/observability\";\nimport { detectRuntime, readRuntimeEnvRecord, type SupportedRuntime } from \"@athosjs/runtime\";\nimport type { AthosApplicationOptions, AthosManifest, AthosRunOptions } from \"@athosjs/types/pro\";\nimport { ProApplication } from \"../functions\";\nimport { ComponentDiscovery } from \"./discovery\";\nimport {\n\tnormalizeConfiguredProMiddlewareInput,\n\tnormalizeProInterceptorInput,\n\tnormalizeProPolicyInput,\n} from \"./pipeline\";\nimport { registerConfiguredI18n } from \"./i18n\";\nimport { RouterInitializer } from \"./router-initializer\";\n\nexport type { AthosApplicationOptions, AthosManifest, AthosRunOptions };\nconst applicationMetadataRegistry = new Map<any, AthosApplicationOptions>();\n\nexport function AthosApplicationDecorator(options: AthosApplicationOptions = {}): ClassDecorator {\n\treturn (target: any) => {\n\t\tapplicationMetadataRegistry.set(target, options);\n\t};\n}\n\nexport function getAthosApplicationOptions(target: unknown): AthosApplicationOptions | undefined {\n\tif (typeof target !== \"function\") {\n\t\treturn undefined;\n\t}\n\n\treturn applicationMetadataRegistry.get(target);\n}\n\nexport function compileAthosApplicationManifest(target: unknown): AthosManifest {\n\tconst metadataOptions = getAthosApplicationOptions(target);\n\n\treturn {\n\t\tcontrollers: [...(metadataOptions?.controllers ?? [])],\n\t\tproviders: [\n\t\t\t...(metadataOptions?.providers?.filter(\n\t\t\t\t(provider): provider is Constructor<any> => typeof provider === \"function\",\n\t\t\t) ?? []),\n\t\t],\n\t};\n}\n\nexport class AthosApplication {\n\tstatic logger: AthosLogger = new ConsoleAthosLogger();\n\n\tstatic async bootstrap(options: AthosRunOptions): Promise<any>;\n\tstatic async bootstrap(appClass: any, options: AthosRunOptions): Promise<any>;\n\tstatic async bootstrap(appClassOrOptions: any, optionsOrUndefined?: AthosRunOptions): Promise<any> {\n\t\tconst hasClass = arguments.length === 2 && typeof appClassOrOptions === \"function\";\n\t\tconst appClass = hasClass ? appClassOrOptions : null;\n\t\tlet options = hasClass ? optionsOrUndefined! : appClassOrOptions;\n\n\t\tconst runtimeResult = options.runtime ? { name: options.runtime } : detectRuntime();\n\t\tconst runtime = runtimeResult.name === \"unknown\" ? \"node\" : runtimeResult.name;\n\n\t\tconst loadedConfig = await ConfigLoader.load();\n\t\tconst resolvedConfig = loadedConfig ? await resolveConfigForRuntime(loadedConfig, runtime) : null;\n\n\t\tif (resolvedConfig) {\n\t\t\toptions = {\n\t\t\t\t...resolvedConfig.config,\n\t\t\t\t...options,\n\t\t\t\tport: options.port ?? resolvedConfig.config.port ?? 3000,\n\t\t\t\thostname: options.hostname ?? resolvedConfig.config.hostname,\n\t\t\t} as any;\n\t\t\tsetAthosEnv((resolvedConfig.env ?? resolvedConfig.rawEnv) as Readonly<Record<string, unknown>>);\n\t\t}\n\t\tsetAthosOptions(options as Readonly<Record<string, unknown>>);\n\n\t\tif (options.logLevel) {\n\t\t\tAthosApplication.logger = new ConsoleAthosLogger({ level: options.logLevel });\n\t\t} else if (typeof options.logger === \"object\" && \"level\" in options.logger) {\n\t\t\tAthosApplication.logger = new ConsoleAthosLogger({ level: options.logger.level as LogLevel });\n\t\t} else if (\n\t\t\ttypeof options.logger === \"function\" ||\n\t\t\t(typeof options.logger === \"object\" && options.logger !== null)\n\t\t) {\n\t\t\tAthosApplication.logger = options.logger as AthosLogger;\n\t\t}\n\n\t\tAthosApplication.logger.trace(\"Bootstrapping Athos application...\");\n\n\t\tconst metadataOptions = appClass ? applicationMetadataRegistry.get(appClass) : undefined;\n\t\tconst discoveryEnabled =\n\t\t\t(options.discovery as any)?.enabled ?? (resolvedConfig?.config.discovery as any)?.enabled ?? false;\n\t\tconst discoveryRoot = options.discovery?.root ?? resolvedConfig?.config.discovery?.root;\n\t\tconst discoveryDirectories =\n\t\t\t(options.discovery as any)?.includeDirectories ?? (resolvedConfig?.config.discovery as any)?.includeDirectories;\n\n\t\tif (discoveryEnabled && !discoveryRoot) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Athos discovery requires an explicit discovery.root. Implicit process.cwd() scanning is not supported.\",\n\t\t\t);\n\t\t}\n\n\t\tconst discovered =\n\t\t\toptions.manifest ??\n\t\t\t(discoveryEnabled\n\t\t\t\t? await ComponentDiscovery.discover({\n\t\t\t\t\t\troot: discoveryRoot!,\n\t\t\t\t\t\tincludeDirectories: discoveryDirectories,\n\t\t\t\t\t})\n\t\t\t\t: { controllers: [], providers: [] });\n\t\tconst discovery = {\n\t\t\tcontrollers: [...(metadataOptions?.controllers ?? []), ...discovered.controllers],\n\t\t\tproviders: [\n\t\t\t\t...(metadataOptions?.providers?.filter(\n\t\t\t\t\t(provider): provider is Constructor<any> => typeof provider === \"function\",\n\t\t\t\t) ?? []),\n\t\t\t\t...discovered.providers,\n\t\t\t],\n\t\t};\n\t\tAthosApplication.logger.debug(\n\t\t\t`Prepared ${discovery.controllers.length} controllers and ${discovery.providers.length} providers.`,\n\t\t);\n\n\t\tAthosApplication.logger.trace(\"Creating pro application kernel...\");\n\t\tconst proResult = await ProApplication.create({\n\t\t\truntime: { name: runtime } as any,\n\t\t\tproviders: [...discovery.providers, ...discovery.controllers] as any,\n\t\t\tmanifests: [...normalizeApplicationImports(metadataOptions?.imports), ...(options.manifests ?? [])],\n\t\t});\n\t\tconst kernel = (proResult as any).kernel;\n\t\tconst container = (proResult as any).container;\n\n\t\tAthosApplication.logger.trace(\"Initializing HTTP application layer...\");\n\t\tconst httpApp = createHttpApplication(kernel);\n\t\tconst serverConfig = (options as any).server as AthosRunOptions[\"server\"] | undefined;\n\n\t\tif (serverConfig?.cors) {\n\t\t\tAthosApplication.logger.trace(\"Enabling built-in CORS support...\");\n\t\t\tconst corsModule = await import(\"@athosjs/http\");\n\t\t\tconst corsOptions = typeof serverConfig.cors === \"object\" ? serverConfig.cors : {};\n\t\t\thttpApp.use(corsModule.createCorsMiddleware(corsOptions as any));\n\t\t}\n\n\t\tif (serverConfig?.compression) {\n\t\t\tAthosApplication.logger.trace(\"Enabling built-in Compression support...\");\n\t\t\tconst { compressionMiddleware } = await import(\"@athosjs/http\");\n\t\t\thttpApp.use(compressionMiddleware);\n\t\t}\n\n\t\tif (serverConfig?.onError) {\n\t\t\tconst userOnError = serverConfig.onError;\n\t\t\thttpApp.setHooks({\n\t\t\t\tonError: (context: any, error: any) => userOnError({ context, error }),\n\t\t\t});\n\t\t}\n\n\t\tif ((options as any).i18n) {\n\t\t\tAthosApplication.logger.trace(\"Registering configured i18n middleware...\");\n\t\t\tawait registerConfiguredI18n(httpApp, (options as any).i18n);\n\t\t}\n\n\t\tif (options.middlewares) {\n\t\t\tAthosApplication.logger.trace(`Registering ${options.middlewares.length} global middlewares...`);\n\t\t\tfor (const middleware of options.middlewares) {\n\t\t\t\thttpApp.use(await normalizeConfiguredProMiddlewareInput(container, middleware));\n\t\t\t}\n\t\t}\n\n\t\tif (options.policies) {\n\t\t\tAthosApplication.logger.trace(`Registering ${options.policies.length} global policies...`);\n\t\t\tfor (const policy of options.policies) {\n\t\t\t\thttpApp.policy(await normalizeProPolicyInput(container, policy));\n\t\t\t}\n\t\t}\n\n\t\tif (options.interceptors) {\n\t\t\tAthosApplication.logger.trace(`Registering ${options.interceptors.length} global interceptors...`);\n\t\t\tfor (const interceptor of options.interceptors) {\n\t\t\t\thttpApp.intercept(await normalizeProInterceptorInput(container, interceptor));\n\t\t\t}\n\t\t}\n\n\t\tif ((options as any).validation && typeof (options as any).validation === \"object\") {\n\t\t\thttpApp.setValidation((options as any).validation);\n\t\t}\n\n\t\tAthosApplication.logger.trace(\"Binding discovered routes to router...\");\n\t\tRouterInitializer.initialize(httpApp, container, discovery.controllers);\n\n\t\tif ((options as any).openapi) {\n\t\t\tAthosApplication.logger.trace(\"Registering OpenAPI routes from athos.config...\");\n\t\t\tconst { registerOpenApiRoutes } = await import(\"@athosjs/openapi\");\n\t\t\tregisterOpenApiRoutes(\n\t\t\t\thttpApp,\n\t\t\t\tnormalizeConfiguredOpenApiOptions((options as any).openapi, {\n\t\t\t\t\tcontrollers: discovery.controllers,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tawait kernel.start();\n\n\t\tconst server = await AthosApplication.startServer(httpApp, runtime, options);\n\t\tsetupGracefulShutdown(server, kernel);\n\t\treturn server;\n\t}\n\n\tprivate static async startServer(app: any, runtime: SupportedRuntime, options: AthosRunOptions) {\n\t\tlet serveFn;\n\t\ttry {\n\t\t\tif (runtime === \"node\") {\n\t\t\t\tconst adapter = await import(\"@athosjs/runtime/node\");\n\t\t\t\tserveFn = adapter.serve;\n\t\t\t} else if (runtime === \"bun\") {\n\t\t\t\tconst adapter = await import(\"@athosjs/runtime/bun\");\n\t\t\t\tserveFn = (adapter as any).serve;\n\t\t\t} else if (runtime === \"deno\") {\n\t\t\t\tconst adapter = await import(\"@athosjs/runtime/deno\");\n\t\t\t\tserveFn = (adapter as any).serve;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Unsupported runtime: ${runtime}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tAthosApplication.logger.error(`Failed to load adapter for runtime '${runtime}'.`);\n\t\t\tthrow err;\n\t\t}\n\n\t\tif (!serveFn) {\n\t\t\tthrow new Error(`The runtime adapter for '${runtime}' does not export a 'serve' function.`);\n\t\t}\n\n\t\tconst server = serveFn(app, {\n\t\t\tport: options.port,\n\t\t\thostname: options.hostname,\n\t\t\t...(runtime === \"node\" && options.nodeAdapter ? { adapter: options.nodeAdapter } : {}),\n\t\t\t...(runtime === \"node\" && (options as any).server?.maxHeaderBytes !== undefined\n\t\t\t\t? { maxHeaderBytes: (options as any).server.maxHeaderBytes }\n\t\t\t\t: {}),\n\t\t});\n\t\tAthosApplication.logger.info(`Application started on port ${options.port} (${runtime})`);\n\t\tlogOpenApiEndpoints(AthosApplication.logger, options.openapi as any, options.hostname, options.port);\n\n\t\treturn server;\n\t}\n\n\tstatic async run(options?: AthosRunOptions): Promise<any>;\n\tstatic async run(appClass: any, options: AthosRunOptions): Promise<any>;\n\tstatic async run(appClassOrOptions?: any, optionsOrUndefined?: AthosRunOptions): Promise<any> {\n\t\ttry {\n\t\t\tconst hasClass = arguments.length === 2 && typeof appClassOrOptions === \"function\";\n\n\t\t\tif (hasClass) {\n\t\t\t\treturn await AthosApplication.bootstrap(appClassOrOptions, optionsOrUndefined!);\n\t\t\t}\n\n\t\t\treturn await AthosApplication.bootstrap(appClassOrOptions ?? {});\n\t\t} catch (error) {\n\t\t\tprintAthosError(error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tstatic async compile(manifest: AthosManifest): Promise<AthosManifest>;\n\tstatic async compile(appClass: any): Promise<AthosManifest>;\n\tstatic async compile(appClassOrManifest?: any): Promise<AthosManifest> {\n\t\tif (!appClassOrManifest) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Athos.compile() requires an explicit application class or manifest. Implicit filesystem discovery is no longer supported.\",\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\ttypeof appClassOrManifest === \"object\" &&\n\t\t\tappClassOrManifest !== null &&\n\t\t\t(\"controllers\" in appClassOrManifest || \"providers\" in appClassOrManifest)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tcontrollers: [...(appClassOrManifest.controllers ?? [])],\n\t\t\t\tproviders: [...(appClassOrManifest.providers ?? [])],\n\t\t\t};\n\t\t}\n\n\t\tif (typeof appClassOrManifest === \"function\") {\n\t\t\treturn compileAthosApplicationManifest(appClassOrManifest);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t\"Athos.compile() received an unsupported input. Pass an application class decorated with @AthosApplication() or an explicit manifest.\",\n\t\t);\n\t}\n}\n\nfunction normalizeConfiguredOpenApiOptions(\n\tconfig: HavenOpenApiConfig,\n\tdefaultSource: import(\"@athosjs/openapi\").RegisterOpenApiRoutesOptions[\"source\"],\n): import(\"@athosjs/openapi\").RegisterOpenApiRoutesOptions {\n\tconst explorer = config.explorer;\n\tconst docsPath = explorer?.path ?? config.docsPath ?? \"/docs\";\n\tconst documentPath =\n\t\tconfig.documentPath ??\n\t\t(explorer?.enabled === false ? \"/openapi.json\" : deriveOpenApiDocumentPathFromDocsPath(docsPath));\n\n\treturn {\n\t\t...config,\n\t\tdocumentPath,\n\t\tsource: config.source ?? defaultSource,\n\t\texplorer:\n\t\t\texplorer?.enabled === false\n\t\t\t\t? false\n\t\t\t\t: explorer\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...explorer,\n\t\t\t\t\t\t\tpath: docsPath,\n\t\t\t\t\t\t\tdocumentPath: explorer.documentPath ?? documentPath,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tpath: docsPath,\n\t\t\t\t\t\t\tdocumentPath,\n\t\t\t\t\t\t},\n\t};\n}\n\nfunction normalizeApplicationImports(imports: readonly unknown[] | undefined): readonly unknown[] {\n\tif (!imports || imports.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn imports.filter((entry) => entry !== undefined && entry !== null);\n}\n\nfunction logOpenApiEndpoints(\n\tlogger: AthosLogger,\n\topenapi: HavenOpenApiConfig | undefined,\n\thostname: string | undefined,\n\tport: number | undefined,\n): void {\n\tif (!openapi) {\n\t\treturn;\n\t}\n\n\tconst docsEnabled = openapi.explorer?.enabled !== false;\n\tconst docsPath = openapi.explorer?.path ?? openapi.docsPath ?? \"/docs\";\n\tconst documentPath =\n\t\topenapi.documentPath ?? (docsEnabled ? deriveOpenApiDocumentPathFromDocsPath(docsPath) : \"/openapi.json\");\n\tconst baseUrl = createBaseUrl(hostname, port);\n\tconst documentUrl = new URL(documentPath, baseUrl).toString();\n\n\tif (docsEnabled) {\n\t\tlogger.info(`OpenAPI docs available at ${new URL(docsPath, baseUrl).toString()}`);\n\t}\n\n\tlogger.info(`OpenAPI JSON available at ${documentUrl}`);\n}\n\nfunction createBaseUrl(hostname: string | undefined, port: number | undefined): string {\n\tconst resolvedHostname = normalizePublicHostname(hostname);\n\tconst resolvedPort = port ?? 3000;\n\treturn `http://${resolvedHostname}:${resolvedPort}`;\n}\n\nfunction setupGracefulShutdown(\n\tserver: { close(): void | Promise<void> },\n\tkernel: { shutdown(): void | Promise<void> },\n): void {\n\tconst timeoutMs = 30_000;\n\tlet shuttingDown = false;\n\n\tconst shutdown = async () => {\n\t\tif (shuttingDown) return;\n\t\tshuttingDown = true;\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tprocess.stderr.write(\"Graceful shutdown timed out, forcing exit.\\n\");\n\t\t\tprocess.exit(1);\n\t\t}, timeoutMs);\n\n\t\ttry {\n\t\t\tawait Promise.all([server.close(), kernel.shutdown()]);\n\t\t} catch {\n\t\t\tprocess.exit(1);\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t\tprocess.exit(0);\n\t\t}\n\t};\n\n\tprocess.on(\"SIGTERM\", shutdown);\n\tprocess.on(\"SIGINT\", shutdown);\n}\n\nfunction normalizePublicHostname(hostname: string | undefined): string {\n\tif (!hostname || hostname === \"0.0.0.0\" || hostname === \"::\") {\n\t\treturn \"localhost\";\n\t}\n\n\treturn hostname.includes(\":\") && !hostname.startsWith(\"[\") ? `[${hostname}]` : hostname;\n}\n\nfunction deriveOpenApiDocumentPathFromDocsPath(docsPath: string): string {\n\tconst normalized = docsPath === \"/\" ? \"/\" : docsPath.replace(/\\/$/, \"\");\n\treturn `${normalized}.json`;\n}\n\nasync function resolveConfigForRuntime(\n\tloadedConfig: Awaited<ReturnType<typeof ConfigLoader.load>>,\n\truntime: SupportedRuntime,\n) {\n\ttry {\n\t\tif (runtime === \"node\") {\n\t\t\tconst { ensureNodeEnvFilesLoaded } = await import(\"@athosjs/runtime/node\");\n\t\t\tensureNodeEnvFilesLoaded();\n\t\t}\n\n\t\tconst resolved = await resolveAthosConfig(loadedConfig ?? {}, {\n\t\t\tenv: readRuntimeEnvRecord() as any,\n\t\t\truntime: {\n\t\t\t\tname: runtime,\n\t\t\t\tprovider: runtime,\n\t\t\t},\n\t\t});\n\t\tconst sourceUrl = readConfigSourceUrl(loadedConfig);\n\t\tif (sourceUrl && resolved.config.i18n && !resolved.config.i18n.baseUrl) {\n\t\t\treturn {\n\t\t\t\t...resolved,\n\t\t\t\tconfig: {\n\t\t\t\t\t...resolved.config,\n\t\t\t\t\ti18n: {\n\t\t\t\t\t\t...resolved.config.i18n,\n\t\t\t\t\t\tbaseUrl: sourceUrl,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn resolved;\n\t} catch (error) {\n\t\tthrow formatAthosEnvValidationError(error);\n\t}\n}\n\nfunction readConfigSourceUrl(input: unknown): string | undefined {\n\tif ((typeof input !== \"object\" || input === null) && typeof input !== \"function\") {\n\t\treturn undefined;\n\t}\n\n\treturn (input as Record<string | symbol, unknown>)[ATHOS_CONFIG_SOURCE_URL] as string | undefined;\n}\n"],"names":["applicationMetadataRegistry","Map","AthosApplicationDecorator","options","target","set","getAthosApplicationOptions","undefined","get","compileAthosApplicationManifest","metadataOptions","controllers","providers","filter","provider","AthosApplication","logger","ConsoleAthosLogger","bootstrap","appClassOrOptions","optionsOrUndefined","hasClass","arguments","length","appClass","runtimeResult","runtime","name","detectRuntime","loadedConfig","ConfigLoader","load","resolvedConfig","resolveConfigForRuntime","config","port","hostname","setAthosEnv","env","rawEnv","setAthosOptions","logLevel","level","trace","discoveryEnabled","discovery","enabled","discoveryRoot","root","discoveryDirectories","includeDirectories","Error","discovered","manifest","ComponentDiscovery","discover","debug","proResult","ProApplication","create","manifests","normalizeApplicationImports","imports","kernel","container","httpApp","createHttpApplication","serverConfig","server","cors","corsModule","corsOptions","use","createCorsMiddleware","compression","compressionMiddleware","onError","userOnError","setHooks","context","error","i18n","registerConfiguredI18n","middlewares","middleware","normalizeConfiguredProMiddlewareInput","policies","policy","normalizeProPolicyInput","interceptors","interceptor","intercept","normalizeProInterceptorInput","validation","setValidation","RouterInitializer","initialize","openapi","registerOpenApiRoutes","normalizeConfiguredOpenApiOptions","start","startServer","setupGracefulShutdown","app","serveFn","adapter","serve","err","nodeAdapter","maxHeaderBytes","info","logOpenApiEndpoints","run","printAthosError","compile","appClassOrManifest","defaultSource","explorer","docsPath","path","documentPath","deriveOpenApiDocumentPathFromDocsPath","source","entry","docsEnabled","baseUrl","createBaseUrl","documentUrl","URL","toString","resolvedHostname","normalizePublicHostname","resolvedPort","timeoutMs","shuttingDown","shutdown","timer","setTimeout","process","stderr","write","exit","Promise","all","close","clearTimeout","on","includes","startsWith","normalized","replace","ensureNodeEnvFilesLoaded","resolved","resolveAthosConfig","readRuntimeEnvRecord","sourceUrl","readConfigSourceUrl","formatAthosEnvValidationError","input","ATHOS_CONFIG_SOURCE_URL"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@athosjs/core');
|
|
4
|
+
var metadata = require('@athosjs/metadata');
|
|
5
|
+
var scanner = require('./scanner.cjs');
|
|
6
|
+
|
|
7
|
+
class ComponentDiscovery {
|
|
8
|
+
static async discover(rootOrOptions) {
|
|
9
|
+
const options = typeof rootOrOptions === "string" ? {
|
|
10
|
+
root: rootOrOptions
|
|
11
|
+
} : rootOrOptions ?? {};
|
|
12
|
+
const normalizedRoot = options.root;
|
|
13
|
+
if (!normalizedRoot) {
|
|
14
|
+
throw new Error("ComponentDiscovery.discover() requires an explicit root. Implicit process.cwd() scanning is no longer supported.");
|
|
15
|
+
}
|
|
16
|
+
const includeDirectories = options.includeDirectories ?? [
|
|
17
|
+
"src",
|
|
18
|
+
"app"
|
|
19
|
+
];
|
|
20
|
+
const loadedModules = await scanner.FileScanner.scanAndLoad(normalizedRoot, includeDirectories);
|
|
21
|
+
const discovered = collectDiscoveredClasses(loadedModules);
|
|
22
|
+
const result = {
|
|
23
|
+
controllers: discovered.filter((c)=>metadata.getMetadata(c, core.CONTROLLER_METADATA_KEY)),
|
|
24
|
+
providers: discovered.filter((c)=>!metadata.getMetadata(c, core.CONTROLLER_METADATA_KEY) && metadata.getInjectableMetadata(c) !== undefined)
|
|
25
|
+
};
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function collectDiscoveredClasses(modules) {
|
|
30
|
+
const discovered = new Set();
|
|
31
|
+
for (const moduleExports of modules){
|
|
32
|
+
for (const value of Object.values(moduleExports)){
|
|
33
|
+
if (typeof value !== "function") {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (metadata.getMetadata(value, core.CONTROLLER_METADATA_KEY) || metadata.getInjectableMetadata(value)) {
|
|
37
|
+
discovered.add(value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [
|
|
42
|
+
...discovered
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
exports.ComponentDiscovery = ComponentDiscovery;
|
|
47
|
+
//# sourceMappingURL=discovery.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.cjs","sources":["../../../../packages/pro/src/core/discovery.ts"],"sourcesContent":["import { CONTROLLER_METADATA_KEY } from \"@athosjs/core\";\nimport type { Constructable as Constructor } from \"@athosjs/metadata\";\nimport { getInjectableMetadata, getMetadata } from \"@athosjs/metadata\";\nimport type { ComponentDiscoveryOptions, DiscoveredComponents } from \"@athosjs/types/pro\";\nimport { FileScanner } from \"./scanner\";\n\nexport type { ComponentDiscoveryOptions, DiscoveredComponents };\n\nexport class ComponentDiscovery {\n\tstatic async discover(rootOrOptions?: string | ComponentDiscoveryOptions): Promise<DiscoveredComponents> {\n\t\tconst options = typeof rootOrOptions === \"string\" ? { root: rootOrOptions } : (rootOrOptions ?? {});\n\t\tconst normalizedRoot = options.root;\n\n\t\tif (!normalizedRoot) {\n\t\t\tthrow new Error(\n\t\t\t\t\"ComponentDiscovery.discover() requires an explicit root. Implicit process.cwd() scanning is no longer supported.\",\n\t\t\t);\n\t\t}\n\n\t\tconst includeDirectories = options.includeDirectories ?? [\"src\", \"app\"];\n\n\t\tconst loadedModules = await FileScanner.scanAndLoad(normalizedRoot, includeDirectories);\n\t\tconst discovered = collectDiscoveredClasses(loadedModules);\n\n\t\tconst result = {\n\t\t\tcontrollers: discovered.filter((c) => getMetadata(c, CONTROLLER_METADATA_KEY)),\n\t\t\tproviders: discovered.filter(\n\t\t\t\t(c) => !getMetadata(c, CONTROLLER_METADATA_KEY) && getInjectableMetadata(c) !== undefined,\n\t\t\t),\n\t\t};\n\t\treturn result;\n\t}\n}\n\nfunction collectDiscoveredClasses(modules: readonly Record<string, unknown>[]): Constructor<any>[] {\n\tconst discovered = new Set<Constructor<any>>();\n\n\tfor (const moduleExports of modules) {\n\t\tfor (const value of Object.values(moduleExports)) {\n\t\t\tif (typeof value !== \"function\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (getMetadata(value as any, CONTROLLER_METADATA_KEY) || getInjectableMetadata(value as any)) {\n\t\t\t\tdiscovered.add(value as any);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [...discovered];\n}\n"],"names":["ComponentDiscovery","discover","rootOrOptions","options","root","normalizedRoot","Error","includeDirectories","loadedModules","FileScanner","scanAndLoad","discovered","collectDiscoveredClasses","result","controllers","filter","c","getMetadata","CONTROLLER_METADATA_KEY","providers","getInjectableMetadata","undefined","modules","Set","moduleExports","value","Object","values","add"],"mappings":";;;;;;AAQO,MAAMA,kBAAAA,CAAAA;IACZ,aAAaC,QAAAA,CAASC,aAAkD,EAAiC;QACxG,MAAMC,OAAAA,GAAU,OAAOD,aAAAA,KAAkB,QAAA,GAAW;YAAEE,IAAAA,EAAMF;AAAc,SAAA,GAAKA,iBAAiB,EAAC;QACjG,MAAMG,cAAAA,GAAiBF,QAAQC,IAAI;AAEnC,QAAA,IAAI,CAACC,cAAAA,EAAgB;AACpB,YAAA,MAAM,IAAIC,KAAAA,CACT,kHAAA,CAAA;AAEF,QAAA;QAEA,MAAMC,kBAAAA,GAAqBJ,OAAAA,CAAQI,kBAAkB,IAAI;AAAC,YAAA,KAAA;AAAO,YAAA;AAAM,SAAA;AAEvE,QAAA,MAAMC,aAAAA,GAAgB,MAAMC,mBAAAA,CAAYC,WAAW,CAACL,cAAAA,EAAgBE,kBAAAA,CAAAA;AACpE,QAAA,MAAMI,aAAaC,wBAAAA,CAAyBJ,aAAAA,CAAAA;AAE5C,QAAA,MAAMK,MAAAA,GAAS;AACdC,YAAAA,WAAAA,EAAaH,WAAWI,MAAM,CAAC,CAACC,CAAAA,GAAMC,qBAAYD,CAAAA,EAAGE,4BAAAA,CAAAA,CAAAA;YACrDC,SAAAA,EAAWR,UAAAA,CAAWI,MAAM,CAC3B,CAACC,CAAAA,GAAM,CAACC,oBAAAA,CAAYD,CAAAA,EAAGE,4BAAAA,CAAAA,IAA4BE,8BAAAA,CAAsBJ,CAAAA,CAAAA,KAAOK,SAAAA;AAElF,SAAA;QACA,OAAOR,MAAAA;AACR,IAAA;AACD;AAEA,SAASD,yBAAyBU,OAA2C,EAAA;AAC5E,IAAA,MAAMX,aAAa,IAAIY,GAAAA,EAAAA;IAEvB,KAAK,MAAMC,iBAAiBF,OAAAA,CAAS;AACpC,QAAA,KAAK,MAAMG,KAAAA,IAASC,MAAAA,CAAOC,MAAM,CAACH,aAAAA,CAAAA,CAAgB;YACjD,IAAI,OAAOC,UAAU,UAAA,EAAY;AAChC,gBAAA;AACD,YAAA;AAEA,YAAA,IAAIR,oBAAAA,CAAYQ,KAAAA,EAAcP,4BAAAA,CAAAA,IAA4BE,8BAAAA,CAAsBK,KAAAA,CAAAA,EAAe;AAC9Fd,gBAAAA,UAAAA,CAAWiB,GAAG,CAACH,KAAAA,CAAAA;AAChB,YAAA;AACD,QAAA;AACD,IAAA;IAEA,OAAO;AAAId,QAAAA,GAAAA;AAAW,KAAA;AACvB;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ComponentDiscoveryOptions, DiscoveredComponents } from "@athosjs/types/pro";
|
|
2
|
+
export type { ComponentDiscoveryOptions, DiscoveredComponents };
|
|
3
|
+
export declare class ComponentDiscovery {
|
|
4
|
+
static discover(rootOrOptions?: string | ComponentDiscoveryOptions): Promise<DiscoveredComponents>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../../../../../packages/pro/src/core/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1F,YAAY,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,CAAC;AAEhE,qBAAa,kBAAkB;WACjB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAuBxG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CONTROLLER_METADATA_KEY } from '@athosjs/core';
|
|
2
|
+
import { getMetadata, getInjectableMetadata } from '@athosjs/metadata';
|
|
3
|
+
import { FileScanner } from './scanner.js';
|
|
4
|
+
|
|
5
|
+
class ComponentDiscovery {
|
|
6
|
+
static async discover(rootOrOptions) {
|
|
7
|
+
const options = typeof rootOrOptions === "string" ? {
|
|
8
|
+
root: rootOrOptions
|
|
9
|
+
} : rootOrOptions ?? {};
|
|
10
|
+
const normalizedRoot = options.root;
|
|
11
|
+
if (!normalizedRoot) {
|
|
12
|
+
throw new Error("ComponentDiscovery.discover() requires an explicit root. Implicit process.cwd() scanning is no longer supported.");
|
|
13
|
+
}
|
|
14
|
+
const includeDirectories = options.includeDirectories ?? [
|
|
15
|
+
"src",
|
|
16
|
+
"app"
|
|
17
|
+
];
|
|
18
|
+
const loadedModules = await FileScanner.scanAndLoad(normalizedRoot, includeDirectories);
|
|
19
|
+
const discovered = collectDiscoveredClasses(loadedModules);
|
|
20
|
+
const result = {
|
|
21
|
+
controllers: discovered.filter((c)=>getMetadata(c, CONTROLLER_METADATA_KEY)),
|
|
22
|
+
providers: discovered.filter((c)=>!getMetadata(c, CONTROLLER_METADATA_KEY) && getInjectableMetadata(c) !== undefined)
|
|
23
|
+
};
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function collectDiscoveredClasses(modules) {
|
|
28
|
+
const discovered = new Set();
|
|
29
|
+
for (const moduleExports of modules){
|
|
30
|
+
for (const value of Object.values(moduleExports)){
|
|
31
|
+
if (typeof value !== "function") {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (getMetadata(value, CONTROLLER_METADATA_KEY) || getInjectableMetadata(value)) {
|
|
35
|
+
discovered.add(value);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return [
|
|
40
|
+
...discovered
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { ComponentDiscovery };
|
|
45
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sources":["../../../../packages/pro/src/core/discovery.ts"],"sourcesContent":["import { CONTROLLER_METADATA_KEY } from \"@athosjs/core\";\nimport type { Constructable as Constructor } from \"@athosjs/metadata\";\nimport { getInjectableMetadata, getMetadata } from \"@athosjs/metadata\";\nimport type { ComponentDiscoveryOptions, DiscoveredComponents } from \"@athosjs/types/pro\";\nimport { FileScanner } from \"./scanner\";\n\nexport type { ComponentDiscoveryOptions, DiscoveredComponents };\n\nexport class ComponentDiscovery {\n\tstatic async discover(rootOrOptions?: string | ComponentDiscoveryOptions): Promise<DiscoveredComponents> {\n\t\tconst options = typeof rootOrOptions === \"string\" ? { root: rootOrOptions } : (rootOrOptions ?? {});\n\t\tconst normalizedRoot = options.root;\n\n\t\tif (!normalizedRoot) {\n\t\t\tthrow new Error(\n\t\t\t\t\"ComponentDiscovery.discover() requires an explicit root. Implicit process.cwd() scanning is no longer supported.\",\n\t\t\t);\n\t\t}\n\n\t\tconst includeDirectories = options.includeDirectories ?? [\"src\", \"app\"];\n\n\t\tconst loadedModules = await FileScanner.scanAndLoad(normalizedRoot, includeDirectories);\n\t\tconst discovered = collectDiscoveredClasses(loadedModules);\n\n\t\tconst result = {\n\t\t\tcontrollers: discovered.filter((c) => getMetadata(c, CONTROLLER_METADATA_KEY)),\n\t\t\tproviders: discovered.filter(\n\t\t\t\t(c) => !getMetadata(c, CONTROLLER_METADATA_KEY) && getInjectableMetadata(c) !== undefined,\n\t\t\t),\n\t\t};\n\t\treturn result;\n\t}\n}\n\nfunction collectDiscoveredClasses(modules: readonly Record<string, unknown>[]): Constructor<any>[] {\n\tconst discovered = new Set<Constructor<any>>();\n\n\tfor (const moduleExports of modules) {\n\t\tfor (const value of Object.values(moduleExports)) {\n\t\t\tif (typeof value !== \"function\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (getMetadata(value as any, CONTROLLER_METADATA_KEY) || getInjectableMetadata(value as any)) {\n\t\t\t\tdiscovered.add(value as any);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [...discovered];\n}\n"],"names":["ComponentDiscovery","discover","rootOrOptions","options","root","normalizedRoot","Error","includeDirectories","loadedModules","FileScanner","scanAndLoad","discovered","collectDiscoveredClasses","result","controllers","filter","c","getMetadata","CONTROLLER_METADATA_KEY","providers","getInjectableMetadata","undefined","modules","Set","moduleExports","value","Object","values","add"],"mappings":";;;;AAQO,MAAMA,kBAAAA,CAAAA;IACZ,aAAaC,QAAAA,CAASC,aAAkD,EAAiC;QACxG,MAAMC,OAAAA,GAAU,OAAOD,aAAAA,KAAkB,QAAA,GAAW;YAAEE,IAAAA,EAAMF;AAAc,SAAA,GAAKA,iBAAiB,EAAC;QACjG,MAAMG,cAAAA,GAAiBF,QAAQC,IAAI;AAEnC,QAAA,IAAI,CAACC,cAAAA,EAAgB;AACpB,YAAA,MAAM,IAAIC,KAAAA,CACT,kHAAA,CAAA;AAEF,QAAA;QAEA,MAAMC,kBAAAA,GAAqBJ,OAAAA,CAAQI,kBAAkB,IAAI;AAAC,YAAA,KAAA;AAAO,YAAA;AAAM,SAAA;AAEvE,QAAA,MAAMC,aAAAA,GAAgB,MAAMC,WAAAA,CAAYC,WAAW,CAACL,cAAAA,EAAgBE,kBAAAA,CAAAA;AACpE,QAAA,MAAMI,aAAaC,wBAAAA,CAAyBJ,aAAAA,CAAAA;AAE5C,QAAA,MAAMK,MAAAA,GAAS;AACdC,YAAAA,WAAAA,EAAaH,WAAWI,MAAM,CAAC,CAACC,CAAAA,GAAMC,YAAYD,CAAAA,EAAGE,uBAAAA,CAAAA,CAAAA;YACrDC,SAAAA,EAAWR,UAAAA,CAAWI,MAAM,CAC3B,CAACC,CAAAA,GAAM,CAACC,WAAAA,CAAYD,CAAAA,EAAGE,uBAAAA,CAAAA,IAA4BE,qBAAAA,CAAsBJ,CAAAA,CAAAA,KAAOK,SAAAA;AAElF,SAAA;QACA,OAAOR,MAAAA;AACR,IAAA;AACD;AAEA,SAASD,yBAAyBU,OAA2C,EAAA;AAC5E,IAAA,MAAMX,aAAa,IAAIY,GAAAA,EAAAA;IAEvB,KAAK,MAAMC,iBAAiBF,OAAAA,CAAS;AACpC,QAAA,KAAK,MAAMG,KAAAA,IAASC,MAAAA,CAAOC,MAAM,CAACH,aAAAA,CAAAA,CAAgB;YACjD,IAAI,OAAOC,UAAU,UAAA,EAAY;AAChC,gBAAA;AACD,YAAA;AAEA,YAAA,IAAIR,WAAAA,CAAYQ,KAAAA,EAAcP,uBAAAA,CAAAA,IAA4BE,qBAAAA,CAAsBK,KAAAA,CAAAA,EAAe;AAC9Fd,gBAAAA,UAAAA,CAAWiB,GAAG,CAACH,KAAAA,CAAAA;AAChB,YAAA;AACD,QAAA;AACD,IAAA;IAEA,OAAO;AAAId,QAAAA,GAAAA;AAAW,KAAA;AACvB;;;;"}
|
package/core/i18n.cjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
async function registerConfiguredI18n(httpApp, config) {
|
|
4
|
+
if (!config) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
const { createI18nMiddleware } = await import('@athosjs/i18n');
|
|
8
|
+
httpApp.use(createI18nMiddleware(config));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
exports.registerConfiguredI18n = registerConfiguredI18n;
|
|
12
|
+
//# sourceMappingURL=i18n.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.cjs","sources":["../../../../packages/pro/src/core/i18n.ts"],"sourcesContent":["import type { HttpApplication } from \"@athosjs/http\";\nimport type { AthosI18nConfig } from \"@athosjs/types/i18n\";\n\nexport async function registerConfiguredI18n(httpApp: HttpApplication, config: AthosI18nConfig | undefined): Promise<void> {\n\tif (!config) {\n\t\treturn;\n\t}\n\n\tconst { createI18nMiddleware } = await import(\"@athosjs/i18n\");\n\thttpApp.use(createI18nMiddleware(config));\n}\n"],"names":["registerConfiguredI18n","httpApp","config","createI18nMiddleware","use"],"mappings":";;AAGO,eAAeA,sBAAAA,CAAuBC,OAAwB,EAAEC,MAAmC,EAAA;AACzG,IAAA,IAAI,CAACA,MAAAA,EAAQ;AACZ,QAAA;AACD,IAAA;AAEA,IAAA,MAAM,EAAEC,oBAAoB,EAAE,GAAG,MAAM,OAAO,eAAA,CAAA;IAC9CF,OAAAA,CAAQG,GAAG,CAACD,oBAAAA,CAAqBD,MAAAA,CAAAA,CAAAA;AAClC;;;;"}
|
package/core/i18n.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HttpApplication } from "@athosjs/http";
|
|
2
|
+
import type { AthosI18nConfig } from "@athosjs/types/i18n";
|
|
3
|
+
export declare function registerConfiguredI18n(httpApp: HttpApplication, config: AthosI18nConfig | undefined): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../../../packages/pro/src/core/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzH"}
|
package/core/i18n.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
async function registerConfiguredI18n(httpApp, config) {
|
|
2
|
+
if (!config) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
const { createI18nMiddleware } = await import('@athosjs/i18n');
|
|
6
|
+
httpApp.use(createI18nMiddleware(config));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export { registerConfiguredI18n };
|
|
10
|
+
//# sourceMappingURL=i18n.js.map
|
package/core/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sources":["../../../../packages/pro/src/core/i18n.ts"],"sourcesContent":["import type { HttpApplication } from \"@athosjs/http\";\nimport type { AthosI18nConfig } from \"@athosjs/types/i18n\";\n\nexport async function registerConfiguredI18n(httpApp: HttpApplication, config: AthosI18nConfig | undefined): Promise<void> {\n\tif (!config) {\n\t\treturn;\n\t}\n\n\tconst { createI18nMiddleware } = await import(\"@athosjs/i18n\");\n\thttpApp.use(createI18nMiddleware(config));\n}\n"],"names":["registerConfiguredI18n","httpApp","config","createI18nMiddleware","use"],"mappings":"AAGO,eAAeA,sBAAAA,CAAuBC,OAAwB,EAAEC,MAAmC,EAAA;AACzG,IAAA,IAAI,CAACA,MAAAA,EAAQ;AACZ,QAAA;AACD,IAAA;AAEA,IAAA,MAAM,EAAEC,oBAAoB,EAAE,GAAG,MAAM,OAAO,eAAA,CAAA;IAC9CF,OAAAA,CAAQG,GAAG,CAACD,oBAAAA,CAAqBD,MAAAA,CAAAA,CAAAA;AAClC;;;;"}
|