@taicode/common-server 3.8.0 → 4.0.0-beta.10
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/output/app/index.d.ts +18 -15
- package/output/app/index.d.ts.map +1 -1
- package/output/app/index.js +330 -9
- package/output/auth/index.d.ts +73 -0
- package/output/auth/index.d.ts.map +1 -0
- package/output/auth/index.js +196 -0
- package/output/core/assemble.d.ts +64 -0
- package/output/core/assemble.d.ts.map +1 -0
- package/output/core/assemble.js +88 -0
- package/output/core/boot/context.d.ts +109 -0
- package/output/core/boot/context.d.ts.map +1 -0
- package/output/core/boot/context.js +145 -0
- package/output/core/boot/lifecycle.d.ts +206 -0
- package/output/core/boot/lifecycle.d.ts.map +1 -0
- package/output/core/boot/lifecycle.js +255 -0
- package/output/core/boot/shutdown.d.ts +34 -0
- package/output/core/boot/shutdown.d.ts.map +1 -0
- package/output/core/boot/shutdown.js +50 -0
- package/output/core/boot/signal.d.ts +13 -0
- package/output/core/boot/signal.d.ts.map +1 -0
- package/output/{app → core/boot}/signal.js +5 -4
- package/output/core/boot/steps.d.ts +138 -0
- package/output/core/boot/steps.d.ts.map +1 -0
- package/output/core/boot/steps.js +259 -0
- package/output/core/entries.d.ts +151 -0
- package/output/core/entries.d.ts.map +1 -0
- package/output/core/entries.js +242 -0
- package/output/core/entries.test.d.ts +2 -0
- package/output/core/entries.test.d.ts.map +1 -0
- package/output/core/entries.test.js +458 -0
- package/output/core/env.d.ts +83 -0
- package/output/core/env.d.ts.map +1 -0
- package/output/core/env.js +124 -0
- package/output/{app → core}/env.test.d.ts.map +1 -1
- package/output/core/env.test.js +105 -0
- package/output/core/modules/auth-provider/index.d.ts +10 -0
- package/output/core/modules/auth-provider/index.d.ts.map +1 -0
- package/output/core/modules/auth-provider/index.js +9 -0
- package/output/core/modules/auth-provider/types.d.ts +71 -0
- package/output/core/modules/auth-provider/types.d.ts.map +1 -0
- package/output/core/modules/context/index.d.ts +18 -0
- package/output/core/modules/context/index.d.ts.map +1 -0
- package/output/core/modules/context/index.js +23 -0
- package/output/core/modules/context/index.test.d.ts.map +1 -0
- package/output/core/modules/cookie/index.d.ts +21 -0
- package/output/core/modules/cookie/index.d.ts.map +1 -0
- package/output/core/modules/cookie/index.js +17 -0
- package/output/core/modules/identity/index.d.ts +4 -0
- package/output/core/modules/identity/index.d.ts.map +1 -0
- package/output/core/modules/identity/index.js +14 -0
- package/output/core/modules/logging/index.d.ts +5 -0
- package/output/core/modules/logging/index.d.ts.map +1 -0
- package/output/core/modules/logging/index.js +29 -0
- package/output/core/modules/openapi/index.d.ts +7 -0
- package/output/core/modules/openapi/index.d.ts.map +1 -0
- package/output/core/modules/openapi/index.js +41 -0
- package/output/core/modules/permission-operations/index.d.ts +26 -0
- package/output/core/modules/permission-operations/index.d.ts.map +1 -0
- package/output/core/modules/permission-operations/index.js +36 -0
- package/output/core/modules/permission-operations/index.test.d.ts +2 -0
- package/output/core/modules/permission-operations/index.test.d.ts.map +1 -0
- package/output/core/modules/permission-operations/index.test.js +45 -0
- package/output/core/modules/request-id/index.d.ts +33 -0
- package/output/core/modules/request-id/index.d.ts.map +1 -0
- package/output/core/modules/request-id/index.js +66 -0
- package/output/core/modules/response/index.d.ts +50 -0
- package/output/core/modules/response/index.d.ts.map +1 -0
- package/output/core/modules/response/index.js +102 -0
- package/output/{schema/index.d.ts → core/modules/schema/builders.d.ts} +8 -1
- package/output/core/modules/schema/builders.d.ts.map +1 -0
- package/output/{schema/index.js → core/modules/schema/builders.js} +7 -4
- package/output/core/modules/schema/index.d.ts +34 -0
- package/output/core/modules/schema/index.d.ts.map +1 -0
- package/output/core/modules/schema/index.js +62 -0
- package/output/core/modules/schema/index.test.d.ts +2 -0
- package/output/core/modules/schema/index.test.d.ts.map +1 -0
- package/output/core/modules/schema/index.test.js +55 -0
- package/output/core/modules/system-routes/index.d.ts +15 -0
- package/output/core/modules/system-routes/index.d.ts.map +1 -0
- package/output/core/modules/system-routes/index.js +205 -0
- package/output/core/resource.d.ts +56 -0
- package/output/core/resource.d.ts.map +1 -0
- package/output/core/resource.js +56 -0
- package/output/core/test-support/database.d.ts +89 -0
- package/output/core/test-support/database.d.ts.map +1 -0
- package/output/core/test-support/database.js +131 -0
- package/output/core/test-support/database.test.d.ts.map +1 -0
- package/output/core/test-support/database.test.js +111 -0
- package/output/core/test-support/environment.d.ts +38 -0
- package/output/core/test-support/environment.d.ts.map +1 -0
- package/output/core/test-support/environment.js +45 -0
- package/output/core/test-support/service-context.d.ts +64 -0
- package/output/core/test-support/service-context.d.ts.map +1 -0
- package/output/core/test-support/service-context.js +63 -0
- package/output/core/test-support/service-context.test.d.ts +2 -0
- package/output/core/test-support/service-context.test.d.ts.map +1 -0
- package/output/core/test-support/service-context.test.js +55 -0
- package/output/core/test-support/test-server.d.ts +154 -0
- package/output/core/test-support/test-server.d.ts.map +1 -0
- package/output/core/test-support/test-server.js +114 -0
- package/output/core/test-support/test-server.test.d.ts +2 -0
- package/output/core/test-support/test-server.test.d.ts.map +1 -0
- package/output/core/test-support/test-server.test.js +296 -0
- package/output/core/test-support/testdata.d.ts +255 -0
- package/output/core/test-support/testdata.d.ts.map +1 -0
- package/output/core/test-support/testdata.js +271 -0
- package/output/core/test-support/testdata.test.d.ts +2 -0
- package/output/core/test-support/testdata.test.d.ts.map +1 -0
- package/output/core/test-support/testdata.test.js +334 -0
- package/output/core/type-augment.d.ts +34 -0
- package/output/core/type-augment.d.ts.map +1 -0
- package/output/core/type-augment.js +7 -0
- package/output/core/types.d.ts +582 -0
- package/output/core/types.d.ts.map +1 -0
- package/output/core/types.js +2 -0
- package/output/cors/index.d.ts +3 -0
- package/output/cors/index.d.ts.map +1 -0
- package/output/cors/index.js +28 -0
- package/output/index.d.ts +10 -4
- package/output/index.d.ts.map +1 -1
- package/output/index.js +25 -5
- package/output/rate-limit/index.d.ts +23 -0
- package/output/rate-limit/index.d.ts.map +1 -0
- package/output/rate-limit/index.js +43 -0
- package/output/{rate-limiter/rate-limiter.d.ts → rate-limit/limiter.d.ts} +1 -1
- package/output/rate-limit/limiter.d.ts.map +1 -0
- package/output/{rate-limiter → rate-limit}/memory-store.d.ts +6 -0
- package/output/rate-limit/memory-store.d.ts.map +1 -0
- package/output/{rate-limiter → rate-limit}/memory-store.js +8 -0
- package/output/{rate-limiter → rate-limit}/redis-store.d.ts +18 -0
- package/output/rate-limit/redis-store.d.ts.map +1 -0
- package/output/{rate-limiter → rate-limit}/redis-store.js +35 -0
- package/output/rate-limit/redis-store.test.d.ts.map +1 -0
- package/output/{rate-limiter → rate-limit}/redis-store.test.js +2 -2
- package/output/rate-limit/types.d.ts +45 -0
- package/output/rate-limit/types.d.ts.map +1 -0
- package/output/{redis-cache/redis-cache.d.ts → redis/cache.d.ts} +1 -1
- package/output/redis/cache.d.ts.map +1 -0
- package/output/redis/cache.test.d.ts +2 -0
- package/output/redis/cache.test.d.ts.map +1 -0
- package/output/{redis-cache/redis-cache.test.js → redis/cache.test.js} +1 -1
- package/output/redis/index.d.ts +50 -0
- package/output/redis/index.d.ts.map +1 -0
- package/output/redis/index.js +71 -0
- package/output/redis/index.test.d.ts +2 -0
- package/output/{context → redis}/index.test.d.ts.map +1 -1
- package/output/redis/index.test.js +55 -0
- package/output/redis-queue/index.js +1 -1
- package/output/redis-queue/test-helpers.d.ts +1 -1
- package/output/redis-queue/test-helpers.js +1 -1
- package/output/redis-queue/types.d.ts +3 -12
- package/output/redis-queue/types.d.ts.map +1 -1
- package/package.json +11 -7
- package/output/app/assemble.d.ts +0 -16
- package/output/app/assemble.d.ts.map +0 -1
- package/output/app/assemble.js +0 -124
- package/output/app/database.d.ts +0 -36
- package/output/app/database.d.ts.map +0 -1
- package/output/app/database.js +0 -40
- package/output/app/database.test.d.ts.map +0 -1
- package/output/app/database.test.js +0 -66
- package/output/app/default-modules.d.ts +0 -23
- package/output/app/default-modules.d.ts.map +0 -1
- package/output/app/default-modules.js +0 -40
- package/output/app/define-server.d.ts +0 -12
- package/output/app/define-server.d.ts.map +0 -1
- package/output/app/define-server.js +0 -289
- package/output/app/define-server.test.d.ts +0 -2
- package/output/app/define-server.test.d.ts.map +0 -1
- package/output/app/define-server.test.js +0 -299
- package/output/app/env.d.ts +0 -24
- package/output/app/env.d.ts.map +0 -1
- package/output/app/env.js +0 -38
- package/output/app/env.test.js +0 -78
- package/output/app/module.d.ts +0 -88
- package/output/app/module.d.ts.map +0 -1
- package/output/app/module.js +0 -34
- package/output/app/shutdown.d.ts +0 -9
- package/output/app/shutdown.d.ts.map +0 -1
- package/output/app/shutdown.js +0 -15
- package/output/app/shutdown.test.d.ts +0 -2
- package/output/app/shutdown.test.d.ts.map +0 -1
- package/output/app/shutdown.test.js +0 -149
- package/output/app/signal.d.ts +0 -12
- package/output/app/signal.d.ts.map +0 -1
- package/output/app/steps.d.ts +0 -17
- package/output/app/steps.d.ts.map +0 -1
- package/output/app/steps.js +0 -41
- package/output/app/types.d.ts +0 -149
- package/output/app/types.d.ts.map +0 -1
- package/output/context/index.d.ts +0 -6
- package/output/context/index.d.ts.map +0 -1
- package/output/context/index.js +0 -14
- package/output/rate-limiter/index.d.ts +0 -5
- package/output/rate-limiter/index.d.ts.map +0 -1
- package/output/rate-limiter/index.js +0 -4
- package/output/rate-limiter/memory-store.d.ts.map +0 -1
- package/output/rate-limiter/rate-limiter.d.ts.map +0 -1
- package/output/rate-limiter/redis-store.d.ts.map +0 -1
- package/output/rate-limiter/redis-store.test.d.ts.map +0 -1
- package/output/rate-limiter/types.d.ts +0 -27
- package/output/rate-limiter/types.d.ts.map +0 -1
- package/output/redis-cache/index.d.ts +0 -4
- package/output/redis-cache/index.d.ts.map +0 -1
- package/output/redis-cache/index.js +0 -1
- package/output/redis-cache/redis-cache.d.ts.map +0 -1
- package/output/redis-cache/redis-cache.test.d.ts +0 -2
- package/output/redis-cache/redis-cache.test.d.ts.map +0 -1
- package/output/schema/index.d.ts.map +0 -1
- /package/output/{app → core}/env.test.d.ts +0 -0
- /package/output/{app → core/modules/auth-provider}/types.js +0 -0
- /package/output/{context → core/modules/context}/index.test.d.ts +0 -0
- /package/output/{context → core/modules/context}/index.test.js +0 -0
- /package/output/{app → core/test-support}/database.test.d.ts +0 -0
- /package/output/{rate-limiter/rate-limiter.js → rate-limit/limiter.js} +0 -0
- /package/output/{rate-limiter → rate-limit}/redis-store.test.d.ts +0 -0
- /package/output/{rate-limiter → rate-limit}/types.js +0 -0
- /package/output/{redis-cache/redis-cache.js → redis/cache.js} +0 -0
package/output/app/env.test.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
const ENV_KEYS = [
|
|
6
|
-
'LAYER',
|
|
7
|
-
'OVERRIDE',
|
|
8
|
-
'ONLY_DEV',
|
|
9
|
-
'ONLY_ENV',
|
|
10
|
-
'ONLY_LOCAL',
|
|
11
|
-
'EXTERNAL_ONLY',
|
|
12
|
-
'EXPORTED',
|
|
13
|
-
'QUOTED',
|
|
14
|
-
'MULTI',
|
|
15
|
-
'HASHED',
|
|
16
|
-
];
|
|
17
|
-
describe('loadEnvFiles', () => {
|
|
18
|
-
let previousCwd;
|
|
19
|
-
let directory;
|
|
20
|
-
beforeEach(() => {
|
|
21
|
-
previousCwd = process.cwd();
|
|
22
|
-
directory = mkdtempSync(join(tmpdir(), 'common-app-env-'));
|
|
23
|
-
writeFileSync(join(directory, '.env.dev'), 'LAYER=dev\nONLY_DEV=dev\nOVERRIDE=dev\n');
|
|
24
|
-
writeFileSync(join(directory, '.env'), 'LAYER=env\nONLY_ENV=env\nOVERRIDE=env\n');
|
|
25
|
-
writeFileSync(join(directory, '.env.local'), 'LAYER=local\nONLY_LOCAL=local\nOVERRIDE=local\n');
|
|
26
|
-
process.chdir(directory);
|
|
27
|
-
});
|
|
28
|
-
afterEach(() => {
|
|
29
|
-
process.chdir(previousCwd);
|
|
30
|
-
rmSync(directory, { recursive: true, force: true });
|
|
31
|
-
for (const key of ENV_KEYS) {
|
|
32
|
-
delete process.env[key];
|
|
33
|
-
}
|
|
34
|
-
vi.resetModules();
|
|
35
|
-
});
|
|
36
|
-
it('优先级:外部注入 > .env.local > .env > .env.dev', async () => {
|
|
37
|
-
process.env.LAYER = 'external';
|
|
38
|
-
process.env.EXTERNAL_ONLY = 'external';
|
|
39
|
-
vi.resetModules();
|
|
40
|
-
const { loadEnvFiles } = await import('./env.js');
|
|
41
|
-
loadEnvFiles();
|
|
42
|
-
expect(process.env.LAYER).toBe('external');
|
|
43
|
-
expect(process.env.EXTERNAL_ONLY).toBe('external');
|
|
44
|
-
expect(process.env.OVERRIDE).toBe('local');
|
|
45
|
-
expect(process.env.ONLY_DEV).toBe('dev');
|
|
46
|
-
expect(process.env.ONLY_ENV).toBe('env');
|
|
47
|
-
expect(process.env.ONLY_LOCAL).toBe('local');
|
|
48
|
-
});
|
|
49
|
-
it('追加层(如 .env.test.local)优先级最高', async () => {
|
|
50
|
-
writeFileSync(join(directory, '.env.test.local'), 'OVERRIDE=test-local\n');
|
|
51
|
-
vi.resetModules();
|
|
52
|
-
const { loadEnvFiles } = await import('./env.js');
|
|
53
|
-
loadEnvFiles(['.env.test.local']);
|
|
54
|
-
expect(process.env.OVERRIDE).toBe('test-local');
|
|
55
|
-
});
|
|
56
|
-
it('缺失文件不报错', async () => {
|
|
57
|
-
rmSync(join(directory, '.env.local'));
|
|
58
|
-
vi.resetModules();
|
|
59
|
-
const { loadEnvFiles } = await import('./env.js');
|
|
60
|
-
expect(() => loadEnvFiles()).not.toThrow();
|
|
61
|
-
expect(process.env.ONLY_DEV).toBe('dev');
|
|
62
|
-
});
|
|
63
|
-
it('dotenv 语义:export 前缀 / 引号 / 转义 / 多行 / 行尾注释(与四家现状逐字一致)', async () => {
|
|
64
|
-
writeFileSync(join(directory, '.env.local'), [
|
|
65
|
-
'export EXPORTED=1',
|
|
66
|
-
'QUOTED="a b"',
|
|
67
|
-
'MULTI="line1\\nline2"',
|
|
68
|
-
'HASHED=value # 行尾注释',
|
|
69
|
-
].join('\n'));
|
|
70
|
-
vi.resetModules();
|
|
71
|
-
const { loadEnvFiles } = await import('./env.js');
|
|
72
|
-
loadEnvFiles();
|
|
73
|
-
expect(process.env.EXPORTED).toBe('1');
|
|
74
|
-
expect(process.env.QUOTED).toBe('a b');
|
|
75
|
-
expect(process.env.MULTI).toBe('line1\nline2');
|
|
76
|
-
expect(process.env.HASHED).toBe('value');
|
|
77
|
-
});
|
|
78
|
-
});
|
package/output/app/module.d.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type { SystemError } from '@taicode/common-base';
|
|
2
|
-
import type { FastifyPluginAsync } from 'fastify';
|
|
3
|
-
import type { ConfigModule, ServerHooks, ShutdownImplementations, StepImplementations } from './types.js';
|
|
4
|
-
/**
|
|
5
|
-
* 封闭模块名集合(design §3.1 十项)。
|
|
6
|
-
*
|
|
7
|
-
* 数组顺序即「注册顺序」,也是装配期报错文案里 `Allowed: ...` 的顺序,**不得重排**。
|
|
8
|
-
*/
|
|
9
|
-
export declare const MODULE_NAMES: readonly ["env", "database", "redis", "context", "response", "cors", "schema", "rate-limit", "auth", "openapi"];
|
|
10
|
-
export type ModuleName = (typeof MODULE_NAMES)[number];
|
|
11
|
-
/**
|
|
12
|
-
* P1 尚未提供默认实现的模块 → 各自的落地阶段(design §3.1 十项里除 `env` / `database` / `redis`
|
|
13
|
-
* 之外的七个)。阶段号取自 `proposals/P1-boot-shutdown.md`:`openapi` 在 P2、`auth` 在 P4、其余在 P3。
|
|
14
|
-
*
|
|
15
|
-
* P1 过渡规则(design §3.2 + 提案 §3.3):这些名字**必须由调用方显式写 `false`**(或直接提供
|
|
16
|
-
* 一个同名的整体覆盖实现),否则装配期按**真实阶段号**报错 —— 静默 no-op 会让调用方少注册插件
|
|
17
|
-
* 却启动成功。
|
|
18
|
-
*/
|
|
19
|
-
export declare const PENDING_MODULES: {
|
|
20
|
-
readonly context: "P3";
|
|
21
|
-
readonly response: "P3";
|
|
22
|
-
readonly cors: "P3";
|
|
23
|
-
readonly schema: "P3";
|
|
24
|
-
readonly 'rate-limit': "P3";
|
|
25
|
-
readonly auth: "P4";
|
|
26
|
-
readonly openapi: "P2";
|
|
27
|
-
};
|
|
28
|
-
export type PendingModuleName = keyof typeof PENDING_MODULES;
|
|
29
|
-
export type PendingModuleStage = (typeof PENDING_MODULES)[PendingModuleName];
|
|
30
|
-
/** 模块契约:可贡献「初始化步骤实现 / Fastify 插件 / 生命周期 hook / 关闭逻辑」四类东西(design §3.1) */
|
|
31
|
-
export interface ServerModule {
|
|
32
|
-
/** 具名单元;装配期校验「键 == name」「不重复」「在封闭集合内」 */
|
|
33
|
-
name: ModuleName;
|
|
34
|
-
/** ① 初始化步骤实现:key 只能是 §4.1 的既定槽位,不得新增 / 重排步骤 */
|
|
35
|
-
steps?: Partial<StepImplementations>;
|
|
36
|
-
/** ② Fastify 插件:注册进第 7 步 `registerCorePlugins` */
|
|
37
|
-
plugins?: FastifyPluginAsync[];
|
|
38
|
-
/** ③ 生命周期 hook(见 design §4.2);模块提供的 hook 不再是顶层选项 */
|
|
39
|
-
hooks?: ServerHooks;
|
|
40
|
-
/** ④ 关闭逻辑:只能命中 §5 的 7 个既定槽位 */
|
|
41
|
-
shutdown?: Partial<ShutdownImplementations>;
|
|
42
|
-
/** 依赖的其它模块名;装配期做拓扑校验(指向被跳过的模块即报错) */
|
|
43
|
-
dependsOn?: ModuleName[];
|
|
44
|
-
}
|
|
45
|
-
/** 模块装配入参(design §3.2):未出现 = 默认实现;`false` = 跳过;对象 = 整体覆盖 */
|
|
46
|
-
export interface ModuleAssembly<Db = unknown> {
|
|
47
|
-
env?: false | ServerModule;
|
|
48
|
-
database?: false | DatabaseModule<Db>;
|
|
49
|
-
redis?: false | ServerModule;
|
|
50
|
-
context?: false | ServerModule;
|
|
51
|
-
response?: false | ServerModule;
|
|
52
|
-
cors?: false | ServerModule;
|
|
53
|
-
schema?: false | ServerModule;
|
|
54
|
-
'rate-limit'?: false | ServerModule;
|
|
55
|
-
auth?: false | ServerModule;
|
|
56
|
-
openapi?: false | ServerModule;
|
|
57
|
-
}
|
|
58
|
-
/** `database` 模块步骤 3 的入参(design §3.3) */
|
|
59
|
-
export interface DatabaseClientParams {
|
|
60
|
-
config: ConfigModule;
|
|
61
|
-
postgresConfig: unknown;
|
|
62
|
-
}
|
|
63
|
-
/** 各仓生成的 Prisma 命名空间里、错误分类用到的 5 个错误类构造器(跨包 instanceof 不可靠,决策 #9) */
|
|
64
|
-
export interface PrismaErrorConstructors {
|
|
65
|
-
PrismaClientKnownRequestError: new (...args: never[]) => unknown;
|
|
66
|
-
PrismaClientUnknownRequestError: new (...args: never[]) => unknown;
|
|
67
|
-
PrismaClientValidationError: new (...args: never[]) => unknown;
|
|
68
|
-
PrismaClientInitializationError: new (...args: never[]) => unknown;
|
|
69
|
-
PrismaClientRustPanicError: new (...args: never[]) => unknown;
|
|
70
|
-
}
|
|
71
|
-
export type PrismaOperationKey = 'known' | 'unknown' | 'validation' | 'initialization' | 'rustPanic';
|
|
72
|
-
/** 可选覆盖的 operation 标签(默认对齐 design §2.3 的统一口径) */
|
|
73
|
-
export type PrismaOperationLabels = Partial<Record<PrismaOperationKey, string>>;
|
|
74
|
-
/**
|
|
75
|
-
* 数据层端口(design §3.3):任何实现只要满足它即可整体替换。
|
|
76
|
-
*
|
|
77
|
-
* 契约相同(同名、同贡献面)即可换实现——「支持非 Prisma 数据库」靠模块替换达成。
|
|
78
|
-
*/
|
|
79
|
-
export interface DatabaseModule<Db = unknown> extends ServerModule {
|
|
80
|
-
name: 'database';
|
|
81
|
-
/** 步骤 3:建立连接。默认 Prisma 实现 = `new PrismaClient(...)` */
|
|
82
|
-
createClient(params: DatabaseClientParams): Db | Promise<Db>;
|
|
83
|
-
/** 错误分类:命中 → `SystemError('DATABASE_ERROR', …)`;未命中 → `null`(落回 UNKNOWN_ERROR 兜底) */
|
|
84
|
-
classifyError(error: unknown): SystemError | null;
|
|
85
|
-
/** §5-7:释放连接。默认 = `db.$disconnect()` */
|
|
86
|
-
dispose?(db: Db): Promise<void>;
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=module.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../source/app/module.ts"],"names":[],"mappings":"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"}
|
package/output/app/module.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 封闭模块名集合(design §3.1 十项)。
|
|
3
|
-
*
|
|
4
|
-
* 数组顺序即「注册顺序」,也是装配期报错文案里 `Allowed: ...` 的顺序,**不得重排**。
|
|
5
|
-
*/
|
|
6
|
-
export const MODULE_NAMES = [
|
|
7
|
-
'env',
|
|
8
|
-
'database',
|
|
9
|
-
'redis',
|
|
10
|
-
'context',
|
|
11
|
-
'response',
|
|
12
|
-
'cors',
|
|
13
|
-
'schema',
|
|
14
|
-
'rate-limit',
|
|
15
|
-
'auth',
|
|
16
|
-
'openapi',
|
|
17
|
-
];
|
|
18
|
-
/**
|
|
19
|
-
* P1 尚未提供默认实现的模块 → 各自的落地阶段(design §3.1 十项里除 `env` / `database` / `redis`
|
|
20
|
-
* 之外的七个)。阶段号取自 `proposals/P1-boot-shutdown.md`:`openapi` 在 P2、`auth` 在 P4、其余在 P3。
|
|
21
|
-
*
|
|
22
|
-
* P1 过渡规则(design §3.2 + 提案 §3.3):这些名字**必须由调用方显式写 `false`**(或直接提供
|
|
23
|
-
* 一个同名的整体覆盖实现),否则装配期按**真实阶段号**报错 —— 静默 no-op 会让调用方少注册插件
|
|
24
|
-
* 却启动成功。
|
|
25
|
-
*/
|
|
26
|
-
export const PENDING_MODULES = {
|
|
27
|
-
context: 'P3',
|
|
28
|
-
response: 'P3',
|
|
29
|
-
cors: 'P3',
|
|
30
|
-
schema: 'P3',
|
|
31
|
-
'rate-limit': 'P3',
|
|
32
|
-
auth: 'P4',
|
|
33
|
-
openapi: 'P2',
|
|
34
|
-
};
|
package/output/app/shutdown.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 固定关闭 7 步(design §5)——**顺序写死在数组里**。
|
|
3
|
-
*
|
|
4
|
-
* 关键修正(相对现状):Redis 晚于 queue/cache 消费者释放;afterInit(如 LDAP)资源进第 1 步。
|
|
5
|
-
* 单步抛错记录后**继续**后续步骤,最后聚合上报(避免「config 报错导致 DB 没关」)。
|
|
6
|
-
*/
|
|
7
|
-
export declare const SHUTDOWN_ORDER: readonly ["stopProducers", "unsubscribeConfig", "disposeConfig", "disposeServices", "disposeClients", "disposeRedis", "disposeDb"];
|
|
8
|
-
export type ShutdownStepName = (typeof SHUTDOWN_ORDER)[number];
|
|
9
|
-
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../source/app/shutdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,cAAc,oIAQjB,CAAA;AAEV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA"}
|
package/output/app/shutdown.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 固定关闭 7 步(design §5)——**顺序写死在数组里**。
|
|
3
|
-
*
|
|
4
|
-
* 关键修正(相对现状):Redis 晚于 queue/cache 消费者释放;afterInit(如 LDAP)资源进第 1 步。
|
|
5
|
-
* 单步抛错记录后**继续**后续步骤,最后聚合上报(避免「config 报错导致 DB 没关」)。
|
|
6
|
-
*/
|
|
7
|
-
export const SHUTDOWN_ORDER = [
|
|
8
|
-
'stopProducers',
|
|
9
|
-
'unsubscribeConfig',
|
|
10
|
-
'disposeConfig',
|
|
11
|
-
'disposeServices',
|
|
12
|
-
'disposeClients',
|
|
13
|
-
'disposeRedis',
|
|
14
|
-
'disposeDb',
|
|
15
|
-
];
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown.test.d.ts","sourceRoot":"","sources":["../../source/app/shutdown.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { defineServer } from './define-server.js';
|
|
3
|
-
import { SHUTDOWN_ORDER } from './shutdown.js';
|
|
4
|
-
const P1_OPT_OUT = {
|
|
5
|
-
context: false,
|
|
6
|
-
response: false,
|
|
7
|
-
cors: false,
|
|
8
|
-
schema: false,
|
|
9
|
-
'rate-limit': false,
|
|
10
|
-
auth: false,
|
|
11
|
-
openapi: false,
|
|
12
|
-
database: false,
|
|
13
|
-
};
|
|
14
|
-
const DUMMY_ERRORS = {
|
|
15
|
-
UserError: class extends Error {
|
|
16
|
-
},
|
|
17
|
-
SystemError: class extends Error {
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
function createTestLog() {
|
|
21
|
-
const errors = [];
|
|
22
|
-
const log = {
|
|
23
|
-
debug: () => undefined,
|
|
24
|
-
info: () => undefined,
|
|
25
|
-
warn: () => undefined,
|
|
26
|
-
error: (obj) => {
|
|
27
|
-
errors.push(obj);
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
return { log, errors };
|
|
31
|
-
}
|
|
32
|
-
function createBaseOptions(overrides = {}) {
|
|
33
|
-
return {
|
|
34
|
-
serviceName: 'test',
|
|
35
|
-
title: 'Test',
|
|
36
|
-
description: 'Test service',
|
|
37
|
-
errors: DUMMY_ERRORS,
|
|
38
|
-
config: { loadConfig: () => ({ debug: false, port: 0 }) },
|
|
39
|
-
modules: { ...P1_OPT_OUT },
|
|
40
|
-
serverOptions: { port: 0, host: '127.0.0.1' },
|
|
41
|
-
signal: false,
|
|
42
|
-
createServices: () => ({}),
|
|
43
|
-
registerRouters: () => undefined,
|
|
44
|
-
...overrides,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
function createRecordingShutdownModule(record, throwOn) {
|
|
48
|
-
const createStep = (name) => () => {
|
|
49
|
-
record.push(name);
|
|
50
|
-
if (name === throwOn) {
|
|
51
|
-
throw new Error(`boom:${name}`);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
const shutdown = {
|
|
55
|
-
stopProducers: createStep('stopProducers'),
|
|
56
|
-
unsubscribeConfig: createStep('unsubscribeConfig'),
|
|
57
|
-
disposeConfig: createStep('disposeConfig'),
|
|
58
|
-
disposeServices: createStep('disposeServices'),
|
|
59
|
-
disposeClients: createStep('disposeClients'),
|
|
60
|
-
disposeRedis: createStep('disposeRedis'),
|
|
61
|
-
disposeDb: createStep('disposeDb'),
|
|
62
|
-
};
|
|
63
|
-
return { name: 'env', shutdown };
|
|
64
|
-
}
|
|
65
|
-
describe('关闭 7 步', () => {
|
|
66
|
-
it('顺序写死、beforeShutdown 在最前', async () => {
|
|
67
|
-
const record = [];
|
|
68
|
-
const app = await defineServer(createBaseOptions({
|
|
69
|
-
modules: { ...P1_OPT_OUT, env: createRecordingShutdownModule(record) },
|
|
70
|
-
beforeShutdown: () => {
|
|
71
|
-
record.push('beforeShutdown');
|
|
72
|
-
},
|
|
73
|
-
}));
|
|
74
|
-
await app.close();
|
|
75
|
-
expect(record).toEqual(['beforeShutdown', ...SHUTDOWN_ORDER]);
|
|
76
|
-
});
|
|
77
|
-
it('单步抛错不阻断后续,且聚合上报(不吞第一个错误)', async () => {
|
|
78
|
-
const record = [];
|
|
79
|
-
const { log, errors } = createTestLog();
|
|
80
|
-
const app = await defineServer(createBaseOptions({
|
|
81
|
-
log,
|
|
82
|
-
modules: { ...P1_OPT_OUT, env: createRecordingShutdownModule(record, 'disposeConfig') },
|
|
83
|
-
beforeShutdown: () => {
|
|
84
|
-
record.push('beforeShutdown');
|
|
85
|
-
throw new Error('boom:beforeShutdown');
|
|
86
|
-
},
|
|
87
|
-
}));
|
|
88
|
-
await app.close();
|
|
89
|
-
// disposeConfig 抛错后,4~7 步仍然执行
|
|
90
|
-
expect(record).toEqual(['beforeShutdown', ...SHUTDOWN_ORDER]);
|
|
91
|
-
expect(errors).toHaveLength(1);
|
|
92
|
-
const aggregated = errors[0];
|
|
93
|
-
expect(aggregated.count).toBe(2);
|
|
94
|
-
expect(aggregated.errors).toHaveLength(2);
|
|
95
|
-
});
|
|
96
|
-
it('shutdown 选项整体覆盖默认关闭流程', async () => {
|
|
97
|
-
const record = [];
|
|
98
|
-
const app = await defineServer(createBaseOptions({
|
|
99
|
-
modules: { ...P1_OPT_OUT, env: createRecordingShutdownModule(record) },
|
|
100
|
-
beforeShutdown: () => {
|
|
101
|
-
record.push('beforeShutdown');
|
|
102
|
-
},
|
|
103
|
-
shutdown: () => {
|
|
104
|
-
record.push('custom');
|
|
105
|
-
},
|
|
106
|
-
}));
|
|
107
|
-
await app.close();
|
|
108
|
-
expect(record).toEqual(['custom']);
|
|
109
|
-
});
|
|
110
|
-
it('模块 hooks.beforeShutdown 生效(调用方选项优先)', async () => {
|
|
111
|
-
const record = [];
|
|
112
|
-
const module = {
|
|
113
|
-
name: 'env',
|
|
114
|
-
hooks: {
|
|
115
|
-
beforeShutdown: () => {
|
|
116
|
-
record.push('module-before');
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
shutdown: {
|
|
120
|
-
stopProducers: () => {
|
|
121
|
-
record.push('stopProducers');
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
const app = await defineServer(createBaseOptions({ modules: { ...P1_OPT_OUT, env: module } }));
|
|
126
|
-
await app.close();
|
|
127
|
-
expect(record).toEqual(['module-before', 'stopProducers']);
|
|
128
|
-
});
|
|
129
|
-
it('默认 disposeServices 用 Promise.allSettled 释放 services(单服务抛错不影响其它)', async () => {
|
|
130
|
-
let disposed = 0;
|
|
131
|
-
const app = await defineServer(createBaseOptions({
|
|
132
|
-
createServices: () => ({
|
|
133
|
-
a: {
|
|
134
|
-
dispose: () => {
|
|
135
|
-
disposed += 1;
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
b: {
|
|
139
|
-
dispose: () => {
|
|
140
|
-
disposed += 1;
|
|
141
|
-
throw new Error('service dispose failed');
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
}),
|
|
145
|
-
}));
|
|
146
|
-
await app.close();
|
|
147
|
-
expect(disposed).toBe(2);
|
|
148
|
-
});
|
|
149
|
-
});
|
package/output/app/signal.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { FastifyInstance } from 'fastify';
|
|
2
|
-
import type { LoggerLike } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* 内置信号处理(design §4.1 第 15 步尾部)。
|
|
5
|
-
*
|
|
6
|
-
* `SIGTERM` / `SIGINT` / `uncaughtException` / `unhandledRejection` ⇒ `app.close()`(触发 onClose
|
|
7
|
-
* 的关闭 7 步)⇒ `process.exit(0/1)`。可通过 `signal: false` 整体关掉(测试 / 嵌入场景)。
|
|
8
|
-
*
|
|
9
|
-
* @returns detach 函数(移除本次注册的监听器)
|
|
10
|
-
*/
|
|
11
|
-
export declare function attachSignalHandlers(app: FastifyInstance, log: LoggerLike): () => void;
|
|
12
|
-
//# sourceMappingURL=signal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../source/app/signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI,CA2CtF"}
|
package/output/app/steps.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { ServerMode } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* 固定 15 步(design §4.1)——**顺序写死在数组里**。
|
|
4
|
-
*
|
|
5
|
-
* 模块只能往这些「既定槽位」里填实现,不得新增步骤、不得重排、不得改变 §4.1 的依赖偏序。
|
|
6
|
-
*/
|
|
7
|
-
export declare const STEP_ORDER: readonly ["createFastify", "setupCompilers", "database.createClient", "createRedis", "initGlobalConfig", "initClients", "registerCorePlugins", "createServices", "initServices", "backgroundWorkers", "registerRouters", "onClose", "ready", "afterReady", "listen"];
|
|
8
|
-
export type StepName = (typeof STEP_ORDER)[number];
|
|
9
|
-
/**
|
|
10
|
-
* 各模式跳过的步骤(design §4.1 / §4.3)。
|
|
11
|
-
*
|
|
12
|
-
* - `test`:关后台 worker 与 ready 后动作(第 10 / 14 步)。
|
|
13
|
-
* - `openapi-build`:跳过 [5,6,9,10,14,15] 与一切连库/连 Redis 的动作,但仍保留 [3,4](10-3:
|
|
14
|
-
* P1 沿用四家现状「不跳过第 3/4 步」,跳过错步留 P2),并保留 [7,8,11] 以保证 `app.swagger()` 完整。
|
|
15
|
-
*/
|
|
16
|
-
export declare const SKIP_BY_MODE: Record<ServerMode, readonly StepName[]>;
|
|
17
|
-
//# sourceMappingURL=steps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../source/app/steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;GAIG;AACH,eAAO,MAAM,UAAU,sQAgBb,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,QAAQ,EAAE,CAWhE,CAAA"}
|
package/output/app/steps.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 固定 15 步(design §4.1)——**顺序写死在数组里**。
|
|
3
|
-
*
|
|
4
|
-
* 模块只能往这些「既定槽位」里填实现,不得新增步骤、不得重排、不得改变 §4.1 的依赖偏序。
|
|
5
|
-
*/
|
|
6
|
-
export const STEP_ORDER = [
|
|
7
|
-
'createFastify',
|
|
8
|
-
'setupCompilers',
|
|
9
|
-
'database.createClient',
|
|
10
|
-
'createRedis',
|
|
11
|
-
'initGlobalConfig',
|
|
12
|
-
'initClients',
|
|
13
|
-
'registerCorePlugins',
|
|
14
|
-
'createServices',
|
|
15
|
-
'initServices',
|
|
16
|
-
'backgroundWorkers',
|
|
17
|
-
'registerRouters',
|
|
18
|
-
'onClose',
|
|
19
|
-
'ready',
|
|
20
|
-
'afterReady',
|
|
21
|
-
'listen',
|
|
22
|
-
];
|
|
23
|
-
/**
|
|
24
|
-
* 各模式跳过的步骤(design §4.1 / §4.3)。
|
|
25
|
-
*
|
|
26
|
-
* - `test`:关后台 worker 与 ready 后动作(第 10 / 14 步)。
|
|
27
|
-
* - `openapi-build`:跳过 [5,6,9,10,14,15] 与一切连库/连 Redis 的动作,但仍保留 [3,4](10-3:
|
|
28
|
-
* P1 沿用四家现状「不跳过第 3/4 步」,跳过错步留 P2),并保留 [7,8,11] 以保证 `app.swagger()` 完整。
|
|
29
|
-
*/
|
|
30
|
-
export const SKIP_BY_MODE = {
|
|
31
|
-
production: [],
|
|
32
|
-
test: ['backgroundWorkers', 'afterReady'],
|
|
33
|
-
'openapi-build': [
|
|
34
|
-
'initGlobalConfig',
|
|
35
|
-
'initClients',
|
|
36
|
-
'initServices',
|
|
37
|
-
'backgroundWorkers',
|
|
38
|
-
'afterReady',
|
|
39
|
-
'listen',
|
|
40
|
-
],
|
|
41
|
-
};
|
package/output/app/types.d.ts
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import type { Disposer } from '@taicode/common-base';
|
|
2
|
-
import type { FastifyInstance, FastifyPluginAsync } from 'fastify';
|
|
3
|
-
import type { ModuleAssembly } from './module.js';
|
|
4
|
-
import type { ShutdownStepName } from './shutdown.js';
|
|
5
|
-
import type { StepName } from './steps.js';
|
|
6
|
-
/** 原生 Fastify 实例,原样返回(不包 `fastify-plugin`、不返回包装对象) */
|
|
7
|
-
export type ServerInstance = FastifyInstance;
|
|
8
|
-
export type ServerMode = 'production' | 'test' | 'openapi-build';
|
|
9
|
-
/** 错误工厂:由各服务 `errors.ts` 的 `define()` 产出(`class extends Error`) */
|
|
10
|
-
export type ErrorFactory = new (...args: never[]) => Error;
|
|
11
|
-
export interface ErrorFactories {
|
|
12
|
-
UserError: ErrorFactory;
|
|
13
|
-
SystemError: ErrorFactory;
|
|
14
|
-
}
|
|
15
|
-
/** 运行时配置快照(对应各仓导出的 `config` 常量) */
|
|
16
|
-
export interface RuntimeConfig {
|
|
17
|
-
debug: boolean;
|
|
18
|
-
port: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* 配置模块端口(design §4.2)。`loadConfig` 必填;依赖数据层的服务才需要 `loadPostgresConfig`。
|
|
22
|
-
*
|
|
23
|
-
* 骨架不替调用方加载 env —— 请先自行调用 `loadEnvFiles()`(详见 `./env.js`)。
|
|
24
|
-
*/
|
|
25
|
-
export interface ConfigModule {
|
|
26
|
-
loadConfig: () => RuntimeConfig;
|
|
27
|
-
loadPostgresConfig?: () => unknown | Promise<unknown>;
|
|
28
|
-
resolveRedisUrl?: () => string | undefined;
|
|
29
|
-
resolveCachePrefix?: () => string | undefined;
|
|
30
|
-
}
|
|
31
|
-
/** 骨架只按 `(obj, msg)` 形态打日志;`app.log` 与 `@taicode/common-base` 的 `Logger` 都满足 */
|
|
32
|
-
export interface LoggerLike {
|
|
33
|
-
debug: (obj: unknown, msg?: string) => void;
|
|
34
|
-
info: (obj: unknown, msg?: string) => void;
|
|
35
|
-
warn: (obj: unknown, msg?: string) => void;
|
|
36
|
-
error: (obj: unknown, msg?: string) => void;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* 骨架**不操作** Redis 命令,只持有并在关闭时透传 dispose;
|
|
40
|
-
* 因此保持开放类型,各仓注入自己的客户端(如 node-redis)不受约束。
|
|
41
|
-
*/
|
|
42
|
-
export type RedisLike = unknown;
|
|
43
|
-
export interface RedisHandle {
|
|
44
|
-
client: RedisLike;
|
|
45
|
-
dispose: () => Promise<void>;
|
|
46
|
-
}
|
|
47
|
-
export type DisposeFunction = () => unknown;
|
|
48
|
-
export type UnsubscribeFunction = () => unknown;
|
|
49
|
-
export interface GlobalConfigOptions {
|
|
50
|
-
redisUrl?: string;
|
|
51
|
-
channelPrefix?: string;
|
|
52
|
-
}
|
|
53
|
-
/** 贯穿步骤 5/6/8 的依赖上下文 */
|
|
54
|
-
export interface DbContext<Db = unknown> {
|
|
55
|
-
db: Db;
|
|
56
|
-
redis?: RedisLike;
|
|
57
|
-
globalConfig: unknown;
|
|
58
|
-
}
|
|
59
|
-
export interface ServicesContext<S = unknown> {
|
|
60
|
-
services: S;
|
|
61
|
-
}
|
|
62
|
-
export interface InitContext<Db = unknown, S = unknown> extends DbContext<Db> {
|
|
63
|
-
services: S;
|
|
64
|
-
}
|
|
65
|
-
export interface WorkersContext<Db = unknown, S = unknown> extends DbContext<Db> {
|
|
66
|
-
services: S;
|
|
67
|
-
disposer: Disposer;
|
|
68
|
-
}
|
|
69
|
-
export interface ReadyContext<S = unknown> {
|
|
70
|
-
app: FastifyInstance;
|
|
71
|
-
services: S;
|
|
72
|
-
}
|
|
73
|
-
export interface ServerOptions {
|
|
74
|
-
port: number;
|
|
75
|
-
host?: string;
|
|
76
|
-
}
|
|
77
|
-
export type ResolveMessage = (type: string, context: unknown, explicit?: string) => string | undefined;
|
|
78
|
-
export type MapStatus = (type: string) => number | null;
|
|
79
|
-
/** 骨架内部持有的运行时句柄(配置 / 关闭流程用) */
|
|
80
|
-
export interface RuntimeState {
|
|
81
|
-
app?: FastifyInstance;
|
|
82
|
-
db?: unknown;
|
|
83
|
-
redis?: RedisHandle;
|
|
84
|
-
globalConfig?: unknown;
|
|
85
|
-
services?: unknown;
|
|
86
|
-
disposer: Disposer;
|
|
87
|
-
unsubscribe?: UnsubscribeFunction;
|
|
88
|
-
disposeConfig?: DisposeFunction;
|
|
89
|
-
}
|
|
90
|
-
/** 每个步骤执行时拿到的上下文(`log` 在 `createFastify` 之后默认降级/升级为 `app.log`) */
|
|
91
|
-
export interface StepContext {
|
|
92
|
-
options: DefineServerOptions;
|
|
93
|
-
state: RuntimeState;
|
|
94
|
-
log: LoggerLike;
|
|
95
|
-
}
|
|
96
|
-
export type StepRunner = (ctx: StepContext) => unknown | Promise<unknown>;
|
|
97
|
-
export type StepImplementations = Record<StepName, StepRunner>;
|
|
98
|
-
export type ShutdownRunner = (ctx: StepContext) => unknown | Promise<unknown>;
|
|
99
|
-
export type ShutdownImplementations = Record<ShutdownStepName, ShutdownRunner>;
|
|
100
|
-
/** 模块可贡献的生命周期 hook(design §4.2) */
|
|
101
|
-
export interface ServerHooks {
|
|
102
|
-
beforeShutdown?: () => unknown | Promise<unknown>;
|
|
103
|
-
shutdown?: (signal: string) => unknown | Promise<unknown>;
|
|
104
|
-
disposeServices?: (ctx: ServicesContext) => unknown | Promise<unknown>;
|
|
105
|
-
disposeClients?: () => unknown | Promise<unknown>;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* `defineServer()` 入参(design §3.4)。
|
|
109
|
-
*
|
|
110
|
-
* `Db` 由 `modules.database`(`database` 模块的 `createClient` 返回类型)**推断**(决策 10-2),
|
|
111
|
-
* 因此调用方**不需要**在 `createServices` 里写 `as PrismaClient` 强转。
|
|
112
|
-
*/
|
|
113
|
-
export interface DefineServerOptions<Db = unknown, S = unknown> {
|
|
114
|
-
serviceName: string;
|
|
115
|
-
title: string;
|
|
116
|
-
description: string;
|
|
117
|
-
version?: string;
|
|
118
|
-
mode?: ServerMode;
|
|
119
|
-
serverOptions?: ServerOptions;
|
|
120
|
-
serverUrl?: string | (() => string | null);
|
|
121
|
-
openapiVersion?: string;
|
|
122
|
-
docPath?: string;
|
|
123
|
-
log?: LoggerLike;
|
|
124
|
-
signal?: boolean;
|
|
125
|
-
errors: ErrorFactories;
|
|
126
|
-
messages?: Record<string, string>;
|
|
127
|
-
resolveMessage?: ResolveMessage;
|
|
128
|
-
mapStatus?: MapStatus;
|
|
129
|
-
modules?: ModuleAssembly<Db>;
|
|
130
|
-
config: ConfigModule;
|
|
131
|
-
setupCompilers?: (app: FastifyInstance) => void;
|
|
132
|
-
createRedis?: (config: ConfigModule) => RedisHandle | undefined;
|
|
133
|
-
initGlobalConfig?: (db: Db, opts: GlobalConfigOptions) => void | DisposeFunction;
|
|
134
|
-
onGlobalConfigChange?: (globalConfig: unknown) => void;
|
|
135
|
-
initClients?: (ctx: DbContext<Db>) => Promise<void | UnsubscribeFunction>;
|
|
136
|
-
extraPlugins?: FastifyPluginAsync[];
|
|
137
|
-
createServices: (ctx: DbContext<Db>) => S;
|
|
138
|
-
initServices?: (ctx: ServicesContext<S>) => Promise<void>;
|
|
139
|
-
backgroundWorkers?: (ctx: WorkersContext<Db, S>) => Promise<void>;
|
|
140
|
-
registerRouters: (app: FastifyInstance, ctx: ServicesContext<S>) => Promise<void> | void;
|
|
141
|
-
afterInit?: (ctx: InitContext<Db, S>) => Promise<DisposeFunction | void>;
|
|
142
|
-
afterReady?: (ctx: ReadyContext<S>) => Promise<void>;
|
|
143
|
-
beforeShutdown?: () => Promise<void> | void;
|
|
144
|
-
disposeServices?: (ctx: ServicesContext<S>) => Promise<void> | void;
|
|
145
|
-
disposeClients?: () => Promise<void> | void;
|
|
146
|
-
/** 覆盖默认关闭流程(design §3.4 / §5) */
|
|
147
|
-
shutdown?: (signal: string) => Promise<void> | void;
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../source/app/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEhE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,iBAAiB,CAAA;CACvB;AAcD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAErE"}
|