@zlooks.cn/global-config-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/command/index.d.ts +3 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +24 -0
- package/dist/command/index.js.map +1 -0
- package/dist/config/global-config-revision-conflict-error.d.ts +5 -0
- package/dist/config/global-config-revision-conflict-error.d.ts.map +1 -0
- package/dist/config/global-config-revision-conflict-error.js +9 -0
- package/dist/config/global-config-revision-conflict-error.js.map +1 -0
- package/dist/config/schema.d.ts +14 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +8 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/typeorm-site-presentation-store.d.ts +17 -0
- package/dist/config/typeorm-site-presentation-store.d.ts.map +1 -0
- package/dist/config/typeorm-site-presentation-store.js +131 -0
- package/dist/config/typeorm-site-presentation-store.js.map +1 -0
- package/dist/config/typeorm-site-profile-store.d.ts +16 -0
- package/dist/config/typeorm-site-profile-store.d.ts.map +1 -0
- package/dist/config/typeorm-site-profile-store.js +74 -0
- package/dist/config/typeorm-site-profile-store.js.map +1 -0
- package/dist/mcp/global-config-provider.d.ts +10 -0
- package/dist/mcp/global-config-provider.d.ts.map +1 -0
- package/dist/mcp/global-config-provider.js +160 -0
- package/dist/mcp/global-config-provider.js.map +1 -0
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/persistence/entities.d.ts +21 -0
- package/dist/persistence/entities.d.ts.map +1 -0
- package/dist/persistence/entities.js +26 -0
- package/dist/persistence/entities.js.map +1 -0
- package/dist/runtime/config-snapshot-publisher.d.ts +22 -0
- package/dist/runtime/config-snapshot-publisher.d.ts.map +1 -0
- package/dist/runtime/config-snapshot-publisher.js +92 -0
- package/dist/runtime/config-snapshot-publisher.js.map +1 -0
- package/dist/runtime/site-presentation-publisher.d.ts +9 -0
- package/dist/runtime/site-presentation-publisher.d.ts.map +1 -0
- package/dist/runtime/site-presentation-publisher.js +8 -0
- package/dist/runtime/site-presentation-publisher.js.map +1 -0
- package/dist/runtime/site-profile-publisher.d.ts +9 -0
- package/dist/runtime/site-profile-publisher.d.ts.map +1 -0
- package/dist/runtime/site-profile-publisher.js +8 -0
- package/dist/runtime/site-profile-publisher.js.map +1 -0
- package/dist/services/application.service.d.ts +4 -0
- package/dist/services/application.service.d.ts.map +1 -0
- package/dist/services/application.service.js +21 -0
- package/dist/services/application.service.js.map +1 -0
- package/dist/services/config.service.d.ts +3 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +17 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/database.service.d.ts +3 -0
- package/dist/services/database.service.d.ts.map +1 -0
- package/dist/services/database.service.js +23 -0
- package/dist/services/database.service.js.map +1 -0
- package/dist/services/global-config-runtime.service.d.ts +152 -0
- package/dist/services/global-config-runtime.service.d.ts.map +1 -0
- package/dist/services/global-config-runtime.service.js +63 -0
- package/dist/services/global-config-runtime.service.js.map +1 -0
- package/dist/services/global-config.boot.d.ts +3 -0
- package/dist/services/global-config.boot.d.ts.map +1 -0
- package/dist/services/global-config.boot.js +8 -0
- package/dist/services/global-config.boot.js.map +1 -0
- package/dist/services/logger.service.d.ts +4 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +8 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/mcp-provider.service.d.ts +3 -0
- package/dist/services/mcp-provider.service.d.ts.map +1 -0
- package/dist/services/mcp-provider.service.js +19 -0
- package/dist/services/mcp-provider.service.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { createRegistryDatabaseDataSource, registerDatabaseCommands, } from '@zlooks.cn/database-command';
|
|
4
|
+
import { runServiceCommand } from '@zlooks.cn/service-command';
|
|
5
|
+
import { globalConfigMigrations } from '../migrations/index.js';
|
|
6
|
+
import { SitePresentationEntity, SiteProfileEntity } from '../persistence/entities.js';
|
|
7
|
+
await runServiceCommand({
|
|
8
|
+
packageRoot: fileURLToPath(new URL('../../', import.meta.url)),
|
|
9
|
+
requiresReactServer: false,
|
|
10
|
+
configure(program) {
|
|
11
|
+
registerDatabaseCommands(program, {
|
|
12
|
+
createDataSource: (envFile) => createRegistryDatabaseDataSource(envFile, {
|
|
13
|
+
commandNamespace: 'cn.zlooks.global.config.db.command',
|
|
14
|
+
entities: [SitePresentationEntity, SiteProfileEntity],
|
|
15
|
+
}),
|
|
16
|
+
migrations: globalConfigMigrations,
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
}).catch(reportStartupFailure);
|
|
20
|
+
function reportStartupFailure(error) {
|
|
21
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEvF,MAAM,iBAAiB,CAAC;IACtB,WAAW,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,mBAAmB,EAAE,KAAK;IAC1B,SAAS,CAAC,OAAO;QACf,wBAAwB,CAAC,OAAO,EAAE;YAChC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,CAC5B,gCAAgC,CAAC,OAAO,EAAE;gBACxC,gBAAgB,EAAE,oCAAoC;gBACtD,QAAQ,EAAE,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;aACtD,CAAC;YACJ,UAAU,EAAE,sBAAsB;SACnC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE/B,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config-revision-conflict-error.d.ts","sourceRoot":"","sources":["../../src/config/global-config-revision-conflict-error.ts"],"names":[],"mappings":"AAAA,qBAAa,iCAAkC,SAAQ,KAAK;aACvB,eAAe,EAAE,MAAM;IAA1D,YAAmC,eAAe,EAAE,MAAM,EAGzD;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export class GlobalConfigRevisionConflictError extends Error {
|
|
2
|
+
currentRevision;
|
|
3
|
+
constructor(currentRevision) {
|
|
4
|
+
super(`Global configuration revision conflict; current revision is ${currentRevision}`);
|
|
5
|
+
this.currentRevision = currentRevision;
|
|
6
|
+
this.name = 'GlobalConfigRevisionConflictError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=global-config-revision-conflict-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config-revision-conflict-error.js","sourceRoot":"","sources":["../../src/config/global-config-revision-conflict-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IACvB,eAAe;IAAlD,YAAmC,eAAuB;QACxD,KAAK,CAAC,+DAA+D,eAAe,EAAE,CAAC,CAAC;+BADvD,eAAe;QAEhD,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type PostgresConfig } from '@zlooks.cn/infrastructure';
|
|
2
|
+
export interface GlobalConfigServerConfigSources {
|
|
3
|
+
readonly postgres: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface GlobalConfigServerConfig {
|
|
6
|
+
readonly infrastructure: {
|
|
7
|
+
readonly postgres: PostgresConfig;
|
|
8
|
+
};
|
|
9
|
+
readonly publisher: {
|
|
10
|
+
readonly refreshIntervalMs: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function parseGlobalConfigServerConfig(input: GlobalConfigServerConfigSources): GlobalConfigServerConfig;
|
|
14
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAErF,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;KAAE,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,+BAA+B,GACrC,wBAAwB,CAK1B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { parsePostgresConfig } from '@zlooks.cn/infrastructure';
|
|
2
|
+
export function parseGlobalConfigServerConfig(input) {
|
|
3
|
+
return Object.freeze({
|
|
4
|
+
infrastructure: Object.freeze({ postgres: parsePostgresConfig(input.postgres) }),
|
|
5
|
+
publisher: Object.freeze({ refreshIntervalMs: 1_000 }),
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,2BAA2B,CAAC;AAWrF,MAAM,UAAU,6BAA6B,CAC3C,KAAsC;IAEtC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;KACvD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SitePresentation, type SitePresentationSnapshot } from '@zlooks.cn/global-config-shared';
|
|
2
|
+
import type { DataSource } from 'typeorm';
|
|
3
|
+
export { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
|
|
4
|
+
export declare class TypeOrmSitePresentationStore {
|
|
5
|
+
#private;
|
|
6
|
+
private readonly dataSource;
|
|
7
|
+
constructor(dataSource: DataSource, options?: {
|
|
8
|
+
readonly clock?: () => Date;
|
|
9
|
+
});
|
|
10
|
+
read(): Promise<SitePresentationSnapshot>;
|
|
11
|
+
update(input: {
|
|
12
|
+
readonly expectedRevision: number;
|
|
13
|
+
readonly updatedBy: string;
|
|
14
|
+
readonly value: SitePresentation;
|
|
15
|
+
}): Promise<SitePresentationSnapshot>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=typeorm-site-presentation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-site-presentation-store.d.ts","sourceRoot":"","sources":["../../src/config/typeorm-site-presentation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAkB1C,OAAO,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAiB/F,qBAAa,4BAA4B;;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAD7B,YACmB,UAAU,EAAE,UAAU,EACvC,OAAO,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO,EAG9C;IAEY,IAAI,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAGrD;IAEY,MAAM,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;KAClC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAiBpC;CA+EF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { parseSitePresentation, parseSitePresentationSnapshot, } from '@zlooks.cn/global-config-shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { SitePresentationEntity } from '../persistence/entities.js';
|
|
4
|
+
import { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
|
|
5
|
+
const DOCUMENT_ID = 'site.presentation';
|
|
6
|
+
const DEFAULT_BACKGROUND_VIDEO_URL = 'https://assets.mixkit.co/videos/47650/47650-720.mp4';
|
|
7
|
+
const DEFAULT_SITE_PRESENTATION = parseSitePresentation({
|
|
8
|
+
identity: {
|
|
9
|
+
name: 'ZLOOKS',
|
|
10
|
+
homeHref: '/',
|
|
11
|
+
backgroundVideoUrl: DEFAULT_BACKGROUND_VIDEO_URL,
|
|
12
|
+
description: '让服务独立演进,让体验自然汇聚。',
|
|
13
|
+
},
|
|
14
|
+
linkGroups: [],
|
|
15
|
+
legal: { copyright: '© Zlooks.cn', registrations: [] },
|
|
16
|
+
});
|
|
17
|
+
export { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
|
|
18
|
+
const legacyPresentationSchema = z.strictObject({
|
|
19
|
+
identity: z.strictObject({
|
|
20
|
+
name: z.string(),
|
|
21
|
+
homeHref: z.string(),
|
|
22
|
+
logoUrl: z.string().optional(),
|
|
23
|
+
description: z.string().optional(),
|
|
24
|
+
}),
|
|
25
|
+
linkGroups: z.array(z.unknown()),
|
|
26
|
+
legal: z.strictObject({
|
|
27
|
+
copyright: z.string().optional(),
|
|
28
|
+
registration: z.string().optional(),
|
|
29
|
+
registrationHref: z.string().optional(),
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
export class TypeOrmSitePresentationStore {
|
|
33
|
+
dataSource;
|
|
34
|
+
#clock;
|
|
35
|
+
constructor(dataSource, options = {}) {
|
|
36
|
+
this.dataSource = dataSource;
|
|
37
|
+
this.#clock = options.clock ?? (() => new Date());
|
|
38
|
+
}
|
|
39
|
+
async read() {
|
|
40
|
+
await this.#ensureInitialDocument();
|
|
41
|
+
return this.#readExisting();
|
|
42
|
+
}
|
|
43
|
+
async update(input) {
|
|
44
|
+
const value = parseSitePresentation(input.value);
|
|
45
|
+
await this.#ensureInitialDocument();
|
|
46
|
+
const updatedAt = this.#clock();
|
|
47
|
+
const result = await this.dataSource.getRepository(SitePresentationEntity).update({ id: DOCUMENT_ID, revision: input.expectedRevision }, {
|
|
48
|
+
revision: input.expectedRevision + 1,
|
|
49
|
+
value,
|
|
50
|
+
updatedAt,
|
|
51
|
+
updatedBy: input.updatedBy,
|
|
52
|
+
});
|
|
53
|
+
if (result.affected !== 1) {
|
|
54
|
+
throw new GlobalConfigRevisionConflictError((await this.#readExisting()).revision);
|
|
55
|
+
}
|
|
56
|
+
return this.#readExisting();
|
|
57
|
+
}
|
|
58
|
+
async #ensureInitialDocument() {
|
|
59
|
+
const now = this.#clock();
|
|
60
|
+
await this.dataSource.getRepository(SitePresentationEntity)
|
|
61
|
+
.createQueryBuilder()
|
|
62
|
+
.insert()
|
|
63
|
+
.into(SitePresentationEntity)
|
|
64
|
+
.values({
|
|
65
|
+
id: DOCUMENT_ID,
|
|
66
|
+
schemaVersion: 2,
|
|
67
|
+
revision: 0,
|
|
68
|
+
value: DEFAULT_SITE_PRESENTATION,
|
|
69
|
+
updatedAt: now,
|
|
70
|
+
updatedBy: 'bootstrap',
|
|
71
|
+
})
|
|
72
|
+
.orIgnore()
|
|
73
|
+
.execute();
|
|
74
|
+
}
|
|
75
|
+
async #readExisting() {
|
|
76
|
+
const row = await this.dataSource.getRepository(SitePresentationEntity).findOneByOrFail({
|
|
77
|
+
id: DOCUMENT_ID,
|
|
78
|
+
});
|
|
79
|
+
if (row.schemaVersion === 1)
|
|
80
|
+
return this.#migrateLegacy(row);
|
|
81
|
+
const snapshot = parseSitePresentationSnapshot({
|
|
82
|
+
schemaVersion: row.schemaVersion,
|
|
83
|
+
revision: row.revision,
|
|
84
|
+
value: row.value,
|
|
85
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
86
|
+
updatedBy: row.updatedBy,
|
|
87
|
+
});
|
|
88
|
+
if (snapshot.value.identity.backgroundVideoUrl !== undefined)
|
|
89
|
+
return snapshot;
|
|
90
|
+
return parseSitePresentationSnapshot({
|
|
91
|
+
...snapshot,
|
|
92
|
+
value: {
|
|
93
|
+
...snapshot.value,
|
|
94
|
+
identity: {
|
|
95
|
+
...snapshot.value.identity,
|
|
96
|
+
backgroundVideoUrl: DEFAULT_BACKGROUND_VIDEO_URL,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async #migrateLegacy(row) {
|
|
102
|
+
const legacy = legacyPresentationSchema.parse(row.value);
|
|
103
|
+
const registrationNumber = legacy.legal.registration ?? legacy.legal.registrationHref;
|
|
104
|
+
const value = parseSitePresentation({
|
|
105
|
+
identity: { ...legacy.identity, backgroundVideoUrl: DEFAULT_BACKGROUND_VIDEO_URL },
|
|
106
|
+
linkGroups: legacy.linkGroups,
|
|
107
|
+
legal: {
|
|
108
|
+
...(legacy.legal.copyright ? { copyright: legacy.legal.copyright } : {}),
|
|
109
|
+
registrations: registrationNumber ? [{
|
|
110
|
+
id: 'legacy-registration',
|
|
111
|
+
kind: 'other',
|
|
112
|
+
number: registrationNumber,
|
|
113
|
+
...(legacy.legal.registration && legacy.legal.registrationHref
|
|
114
|
+
? { verificationUrl: legacy.legal.registrationHref }
|
|
115
|
+
: {}),
|
|
116
|
+
}] : [],
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
const result = await this.dataSource.getRepository(SitePresentationEntity).update({ id: DOCUMENT_ID, schemaVersion: 1, revision: row.revision }, {
|
|
120
|
+
schemaVersion: 2,
|
|
121
|
+
revision: row.revision + 1,
|
|
122
|
+
value,
|
|
123
|
+
updatedAt: this.#clock(),
|
|
124
|
+
updatedBy: 'migration:v2',
|
|
125
|
+
});
|
|
126
|
+
if (result.affected !== 1)
|
|
127
|
+
return this.#readExisting();
|
|
128
|
+
return this.#readExisting();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=typeorm-site-presentation-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-site-presentation-store.js","sourceRoot":"","sources":["../../src/config/typeorm-site-presentation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type SiteProfile, type SiteProfileSnapshot } from '@zlooks.cn/global-config-shared';
|
|
2
|
+
import type { DataSource } from 'typeorm';
|
|
3
|
+
export declare class TypeOrmSiteProfileStore {
|
|
4
|
+
#private;
|
|
5
|
+
private readonly dataSource;
|
|
6
|
+
constructor(dataSource: DataSource, options?: {
|
|
7
|
+
readonly clock?: () => Date;
|
|
8
|
+
});
|
|
9
|
+
read(): Promise<SiteProfileSnapshot>;
|
|
10
|
+
update(input: {
|
|
11
|
+
readonly expectedRevision: number;
|
|
12
|
+
readonly updatedBy: string;
|
|
13
|
+
readonly value: SiteProfile;
|
|
14
|
+
}): Promise<SiteProfileSnapshot>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=typeorm-site-profile-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-site-profile-store.d.ts","sourceRoot":"","sources":["../../src/config/typeorm-site-profile-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAoB1C,qBAAa,uBAAuB;;IAIhC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAD7B,YACmB,UAAU,EAAE,UAAU,EACvC,OAAO,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO,EAG9C;IAEY,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAGhD;IAEY,MAAM,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;KAC7B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgB/B;CAgCF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { parseSiteProfile, parseSiteProfileSnapshot, } from '@zlooks.cn/global-config-shared';
|
|
2
|
+
import { SiteProfileEntity } from '../persistence/entities.js';
|
|
3
|
+
import { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
|
|
4
|
+
const DOCUMENT_ID = 'site.profile';
|
|
5
|
+
const DEFAULT_SITE_PROFILE = parseSiteProfile({
|
|
6
|
+
profile: {
|
|
7
|
+
displayName: 'ZLOOKS',
|
|
8
|
+
headline: '保持好奇,认真生活。',
|
|
9
|
+
biography: '这里是我的个人网站。我把值得记住的想法、作品与生活片刻留在这里,不急着更新,也不急着给每件事情下结论。',
|
|
10
|
+
},
|
|
11
|
+
topics: [
|
|
12
|
+
{ id: 'thoughts', name: '想法', summary: '观察、记录与继续思考' },
|
|
13
|
+
{ id: 'works', name: '作品', summary: '完成的作品与进行中的尝试' },
|
|
14
|
+
{ id: 'life', name: '生活', summary: '普通但值得记住的片刻' },
|
|
15
|
+
{ id: 'travel', name: '远方', summary: '旅行、见闻与仍在保持的好奇' },
|
|
16
|
+
],
|
|
17
|
+
featuredLinks: [{ id: 'blog', label: '阅读文章', href: '/blog', external: false }],
|
|
18
|
+
});
|
|
19
|
+
export class TypeOrmSiteProfileStore {
|
|
20
|
+
dataSource;
|
|
21
|
+
#clock;
|
|
22
|
+
constructor(dataSource, options = {}) {
|
|
23
|
+
this.dataSource = dataSource;
|
|
24
|
+
this.#clock = options.clock ?? (() => new Date());
|
|
25
|
+
}
|
|
26
|
+
async read() {
|
|
27
|
+
await this.#ensureInitialDocument();
|
|
28
|
+
return this.#readExisting();
|
|
29
|
+
}
|
|
30
|
+
async update(input) {
|
|
31
|
+
const value = parseSiteProfile(input.value);
|
|
32
|
+
await this.#ensureInitialDocument();
|
|
33
|
+
const result = await this.dataSource.getRepository(SiteProfileEntity).update({ id: DOCUMENT_ID, revision: input.expectedRevision }, {
|
|
34
|
+
revision: input.expectedRevision + 1,
|
|
35
|
+
value,
|
|
36
|
+
updatedAt: this.#clock(),
|
|
37
|
+
updatedBy: input.updatedBy,
|
|
38
|
+
});
|
|
39
|
+
if (result.affected !== 1) {
|
|
40
|
+
throw new GlobalConfigRevisionConflictError((await this.#readExisting()).revision);
|
|
41
|
+
}
|
|
42
|
+
return this.#readExisting();
|
|
43
|
+
}
|
|
44
|
+
async #ensureInitialDocument() {
|
|
45
|
+
const now = this.#clock();
|
|
46
|
+
await this.dataSource.getRepository(SiteProfileEntity)
|
|
47
|
+
.createQueryBuilder()
|
|
48
|
+
.insert()
|
|
49
|
+
.into(SiteProfileEntity)
|
|
50
|
+
.values({
|
|
51
|
+
id: DOCUMENT_ID,
|
|
52
|
+
schemaVersion: 1,
|
|
53
|
+
revision: 0,
|
|
54
|
+
value: DEFAULT_SITE_PROFILE,
|
|
55
|
+
updatedAt: now,
|
|
56
|
+
updatedBy: 'bootstrap',
|
|
57
|
+
})
|
|
58
|
+
.orIgnore()
|
|
59
|
+
.execute();
|
|
60
|
+
}
|
|
61
|
+
async #readExisting() {
|
|
62
|
+
const row = await this.dataSource.getRepository(SiteProfileEntity).findOneByOrFail({
|
|
63
|
+
id: DOCUMENT_ID,
|
|
64
|
+
});
|
|
65
|
+
return parseSiteProfileSnapshot({
|
|
66
|
+
schemaVersion: row.schemaVersion,
|
|
67
|
+
revision: row.revision,
|
|
68
|
+
value: row.value,
|
|
69
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
70
|
+
updatedBy: row.updatedBy,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=typeorm-site-profile-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-site-profile-store.js","sourceRoot":"","sources":["../../src/config/typeorm-site-profile-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SitePresentationSnapshot, type SiteProfileSnapshot } from '@zlooks.cn/global-config-shared';
|
|
2
|
+
interface GlobalConfigMcpOperations {
|
|
3
|
+
readPresentation(): Promise<SitePresentationSnapshot>;
|
|
4
|
+
updatePresentationFromMcp(input: unknown): Promise<SitePresentationSnapshot>;
|
|
5
|
+
readProfile(): Promise<SiteProfileSnapshot>;
|
|
6
|
+
updateProfileFromMcp(input: unknown): Promise<SiteProfileSnapshot>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createGlobalConfigMcpProvider(operations: GlobalConfigMcpOperations): import("@hile/mcp").McpProviderDefinition;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=global-config-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/global-config-provider.ts"],"names":[],"mappings":"AAOA,OAAO,EAeL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAGzC,UAAU,yBAAyB;IACjC,gBAAgB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACtD,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC7E,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACpE;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,yBAAyB,6CAyGlF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { defineMcpPrompt, defineMcpProvider, defineMcpTool, } from '@hile/mcp';
|
|
2
|
+
import { GLOBAL_CONFIG_MCP_EDIT_PROFILE_PROMPT, GLOBAL_CONFIG_MCP_EDIT_PROMPT, GLOBAL_CONFIG_MCP_PROVIDER_ID, GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL, GLOBAL_CONFIG_MCP_READ_SCOPE, GLOBAL_CONFIG_MCP_READ_TOOL, GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL, GLOBAL_CONFIG_MCP_UPDATE_TOOL, GLOBAL_CONFIG_MCP_WRITE_SCOPE, globalConfigMcpEditPromptSchema, globalConfigMcpProfileUpdateSchema, globalConfigMcpUpdateSchema, sitePresentationSnapshotSchema, siteProfileSnapshotSchema, } from '@zlooks.cn/global-config-shared';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export function createGlobalConfigMcpProvider(operations) {
|
|
5
|
+
const readPresentation = defineMcpTool({
|
|
6
|
+
name: GLOBAL_CONFIG_MCP_READ_TOOL,
|
|
7
|
+
title: '读取站点展示配置',
|
|
8
|
+
description: '读取当前完整的站点展示配置快照及 revision,包括站点身份、链接分组、版权、备案和背景资源等公开字段。此工具只读且不会修改配置;执行更新前应先调用它,以最新快照为基础保留未要求变更的字段并取得 expectedRevision。',
|
|
9
|
+
inputSchema: z.strictObject({}),
|
|
10
|
+
outputSchema: sitePresentationSnapshotSchema,
|
|
11
|
+
annotations: { readOnlyHint: true, idempotentHint: true, destructiveHint: false },
|
|
12
|
+
access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE] },
|
|
13
|
+
execution: { timeoutMs: 10_000, retry: 'idempotent-failover' },
|
|
14
|
+
}, async (_input, context) => cancellableRead(context.signal, operations.readPresentation));
|
|
15
|
+
const updatePresentation = defineMcpTool({
|
|
16
|
+
name: GLOBAL_CONFIG_MCP_UPDATE_TOOL,
|
|
17
|
+
title: '修改站点展示配置',
|
|
18
|
+
description: '使用完整 value 替换站点身份、链接分组、版权、备案和背景资源配置,成功后返回新的完整快照与 revision。该操作不是局部补丁,会影响首页及博客页脚等读取这些投影的位置;必须传入刚读取的 expectedRevision,写入前确认完整内容,版本冲突时重新读取且不得自动重试覆盖。',
|
|
19
|
+
inputSchema: globalConfigMcpUpdateSchema,
|
|
20
|
+
outputSchema: sitePresentationSnapshotSchema,
|
|
21
|
+
annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true },
|
|
22
|
+
access: { scopes: [GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
|
|
23
|
+
execution: { timeoutMs: 10_000, retry: 'never' },
|
|
24
|
+
}, async (input, context) => {
|
|
25
|
+
context.signal.throwIfAborted();
|
|
26
|
+
const snapshot = await operations.updatePresentationFromMcp({
|
|
27
|
+
...input,
|
|
28
|
+
updatedBy: actorFrom(context.principal),
|
|
29
|
+
});
|
|
30
|
+
await bestEffortUpdateNotice(context.emit, {
|
|
31
|
+
event: 'global-config.site-presentation.updated',
|
|
32
|
+
revision: snapshot.revision,
|
|
33
|
+
updatedBy: snapshot.updatedBy,
|
|
34
|
+
});
|
|
35
|
+
return result(snapshot, `站点展示配置已更新到 revision ${snapshot.revision}`);
|
|
36
|
+
});
|
|
37
|
+
const readProfile = defineMcpTool({
|
|
38
|
+
name: GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL,
|
|
39
|
+
title: '读取站点资料',
|
|
40
|
+
description: '读取当前完整的语义站点资料快照及 revision,包括主体资料、长期关注主题、重点链接和审计信息。此工具只读且不包含页面布局、样式或组件配置;执行资料更新前应先调用它,以最新快照保留未要求变更的字段并取得 expectedRevision。',
|
|
41
|
+
inputSchema: z.strictObject({}),
|
|
42
|
+
outputSchema: siteProfileSnapshotSchema,
|
|
43
|
+
annotations: { readOnlyHint: true, idempotentHint: true, destructiveHint: false },
|
|
44
|
+
access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE] },
|
|
45
|
+
execution: { timeoutMs: 10_000, retry: 'idempotent-failover' },
|
|
46
|
+
}, async (_input, context) => cancellableRead(context.signal, operations.readProfile));
|
|
47
|
+
const updateProfile = defineMcpTool({
|
|
48
|
+
name: GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL,
|
|
49
|
+
title: '修改站点资料',
|
|
50
|
+
description: '使用完整 value 替换主体资料、长期关注主题和重点链接,成功后返回新的完整快照与 revision。该操作不是局部补丁,也不接受 hero、布局、样式或组件字段;必须传入刚读取的 expectedRevision,写入前确认完整内容,版本冲突时重新读取且不得自动重试覆盖。',
|
|
51
|
+
inputSchema: globalConfigMcpProfileUpdateSchema,
|
|
52
|
+
outputSchema: siteProfileSnapshotSchema,
|
|
53
|
+
annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true },
|
|
54
|
+
access: { scopes: [GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
|
|
55
|
+
execution: { timeoutMs: 10_000, retry: 'never' },
|
|
56
|
+
}, async (input, context) => {
|
|
57
|
+
context.signal.throwIfAborted();
|
|
58
|
+
const snapshot = await operations.updateProfileFromMcp({
|
|
59
|
+
...input,
|
|
60
|
+
updatedBy: actorFrom(context.principal),
|
|
61
|
+
});
|
|
62
|
+
await bestEffortUpdateNotice(context.emit, {
|
|
63
|
+
event: 'global-config.site-profile.updated',
|
|
64
|
+
revision: snapshot.revision,
|
|
65
|
+
updatedBy: snapshot.updatedBy,
|
|
66
|
+
});
|
|
67
|
+
return result(snapshot, `站点资料已更新到 revision ${snapshot.revision}`);
|
|
68
|
+
});
|
|
69
|
+
const editPresentation = defineMcpPrompt({
|
|
70
|
+
name: GLOBAL_CONFIG_MCP_EDIT_PROMPT,
|
|
71
|
+
title: '修改站点展示配置',
|
|
72
|
+
description: '读取当前快照,安全修改站点身份、favicon、链接、版权或备案,经确认后提交并验证。',
|
|
73
|
+
argsSchema: globalConfigMcpEditPromptSchema,
|
|
74
|
+
access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE, GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
|
|
75
|
+
}, ({ changeRequest }, context) => {
|
|
76
|
+
context.signal.throwIfAborted();
|
|
77
|
+
return promptResult('安全修改站点展示配置', editPresentationMessage(changeRequest));
|
|
78
|
+
});
|
|
79
|
+
const editProfile = defineMcpPrompt({
|
|
80
|
+
name: GLOBAL_CONFIG_MCP_EDIT_PROFILE_PROMPT,
|
|
81
|
+
title: '修改站点资料',
|
|
82
|
+
description: '读取当前快照,安全修改主体资料、关注主题或重点链接,经确认后提交并验证。',
|
|
83
|
+
argsSchema: globalConfigMcpEditPromptSchema,
|
|
84
|
+
access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE, GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
|
|
85
|
+
}, ({ changeRequest }, context) => {
|
|
86
|
+
context.signal.throwIfAborted();
|
|
87
|
+
return promptResult('安全修改站点资料', editProfileMessage(changeRequest));
|
|
88
|
+
});
|
|
89
|
+
return defineMcpProvider({
|
|
90
|
+
id: GLOBAL_CONFIG_MCP_PROVIDER_ID,
|
|
91
|
+
displayName: '全局配置',
|
|
92
|
+
tools: {
|
|
93
|
+
[GLOBAL_CONFIG_MCP_READ_TOOL]: readPresentation,
|
|
94
|
+
[GLOBAL_CONFIG_MCP_UPDATE_TOOL]: updatePresentation,
|
|
95
|
+
[GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL]: readProfile,
|
|
96
|
+
[GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL]: updateProfile,
|
|
97
|
+
},
|
|
98
|
+
prompts: {
|
|
99
|
+
[GLOBAL_CONFIG_MCP_EDIT_PROMPT]: editPresentation,
|
|
100
|
+
[GLOBAL_CONFIG_MCP_EDIT_PROFILE_PROMPT]: editProfile,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function bestEffortUpdateNotice(emit, data) {
|
|
105
|
+
try {
|
|
106
|
+
await emit.log('notice', data);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Observability must not turn a committed configuration update into a reported failure.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function cancellableRead(signal, read) {
|
|
113
|
+
signal.throwIfAborted();
|
|
114
|
+
const snapshot = await read();
|
|
115
|
+
signal.throwIfAborted();
|
|
116
|
+
return result(snapshot);
|
|
117
|
+
}
|
|
118
|
+
function result(snapshot, message) {
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: 'text', text: message ?? JSON.stringify(snapshot) }],
|
|
121
|
+
structuredContent: snapshot,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function promptResult(description, text) {
|
|
125
|
+
return {
|
|
126
|
+
description,
|
|
127
|
+
messages: [{ role: 'user', content: { type: 'text', text } }],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function editPresentationMessage(changeRequest) {
|
|
131
|
+
return `请按以下要求修改站点展示配置:${changeRequest}
|
|
132
|
+
1. 先调用 global-config.${GLOBAL_CONFIG_MCP_READ_TOOL} 获取当前完整配置和 revision;不得凭旧上下文构造更新。
|
|
133
|
+
2. 只修改 identity、linkGroups、legal 中用户明确要求的字段,保留所有未提及字段。backgroundVideoUrl、logoUrl、faviconUrl 只能是站内绝对路径或 HTTP/HTTPS URL;backgroundVideoUrl 设为 null 表示关闭动态背景。legal 会同步投影到首页和博客页脚;registrations 必须使用 id、kind、number、可选 verificationUrl/iconUrl 的结构。
|
|
134
|
+
3. 修改备案信息时,number、kind 和 verificationUrl 必须来自用户提供或已核验的权威来源;缺失的事实不得推断、猜测或编造。
|
|
135
|
+
4. 不得加入密钥、令牌、任意 HTML、脚本或未经核验的法律登记信息。
|
|
136
|
+
5. 向用户展示字段级变更摘要和即将提交的完整配置,并在写入前取得明确确认。
|
|
137
|
+
6. 确认后调用 global-config.${GLOBAL_CONFIG_MCP_UPDATE_TOOL},传入完整 value 和刚读取到的 expectedRevision。
|
|
138
|
+
7. 若版本冲突,重新读取最新快照,只重新应用原始变更要求并再次确认;不得覆盖并发修改。
|
|
139
|
+
8. 更新成功后再次调用 global-config.${GLOBAL_CONFIG_MCP_READ_TOOL},核对 revision 和目标字段,再报告结果。`;
|
|
140
|
+
}
|
|
141
|
+
function editProfileMessage(changeRequest) {
|
|
142
|
+
return `请按以下要求修改站点资料:${changeRequest}
|
|
143
|
+
1. 先调用 global-config.${GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL} 获取当前完整配置和 revision;不得凭旧上下文构造更新。
|
|
144
|
+
2. 只修改用户明确要求的 profile、topics、featuredLinks,保留所有未提及字段。profile 表达主体资料,topics 表达长期关注主题,featuredLinks 表达重点目的地;不得加入 hero、orbit、card、布局、样式或组件配置。
|
|
145
|
+
3. 不得加入密钥、令牌、任意 HTML、脚本或未经用户提供的个人资料。
|
|
146
|
+
4. 向用户展示字段级变更摘要和即将提交的完整配置,并在写入前取得明确确认。
|
|
147
|
+
5. 确认后调用 global-config.${GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL},传入完整 value 和刚读取到的 expectedRevision。
|
|
148
|
+
6. 若版本冲突,重新读取最新快照,只重新应用原始变更要求并再次确认;不得覆盖并发修改。
|
|
149
|
+
7. 更新成功后再次调用 global-config.${GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL},核对 revision 和目标字段,再报告结果。`;
|
|
150
|
+
}
|
|
151
|
+
function actorFrom(principal) {
|
|
152
|
+
if (!principal)
|
|
153
|
+
throw new Error('Verified MCP principal is required');
|
|
154
|
+
const identity = principal.clientId ?? principal.subject;
|
|
155
|
+
const actor = `mcp:${identity}`;
|
|
156
|
+
if (actor.length > 256)
|
|
157
|
+
throw new Error('MCP principal identity is too long');
|
|
158
|
+
return actor;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=global-config-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config-provider.js","sourceRoot":"","sources":["../../src/mcp/global-config-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,eAAO,MAAM,sBAAsB,EAAE,SAAS,iBAAiB,EAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAiC,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SiteProfile, SitePresentation } from '@zlooks.cn/global-config-shared';
|
|
2
|
+
import { EntitySchema } from 'typeorm';
|
|
3
|
+
export interface SitePresentationRow {
|
|
4
|
+
id: 'site.presentation';
|
|
5
|
+
schemaVersion: number;
|
|
6
|
+
revision: number;
|
|
7
|
+
value: SitePresentation | unknown;
|
|
8
|
+
updatedAt: Date;
|
|
9
|
+
updatedBy: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const SitePresentationEntity: EntitySchema<SitePresentationRow>;
|
|
12
|
+
export interface SiteProfileRow {
|
|
13
|
+
id: 'site.profile';
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
revision: number;
|
|
16
|
+
value: SiteProfile;
|
|
17
|
+
updatedAt: Date;
|
|
18
|
+
updatedBy: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const SiteProfileEntity: EntitySchema<SiteProfileRow>;
|
|
21
|
+
//# sourceMappingURL=entities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/persistence/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,mBAAmB,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAClC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,mCAWjC,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,cAAc,CAAC;IACnB,aAAa,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,8BAW5B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EntitySchema } from 'typeorm';
|
|
2
|
+
export const SitePresentationEntity = new EntitySchema({
|
|
3
|
+
name: 'SitePresentation',
|
|
4
|
+
tableName: 'global_config_site_presentation',
|
|
5
|
+
columns: {
|
|
6
|
+
id: { type: 'varchar', length: 64, primary: true },
|
|
7
|
+
schemaVersion: { name: 'schema_version', type: 'integer' },
|
|
8
|
+
revision: { type: 'integer' },
|
|
9
|
+
value: { type: 'jsonb' },
|
|
10
|
+
updatedAt: { name: 'updated_at', type: 'timestamptz' },
|
|
11
|
+
updatedBy: { name: 'updated_by', type: 'varchar', length: 256 },
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
export const SiteProfileEntity = new EntitySchema({
|
|
15
|
+
name: 'SiteProfile',
|
|
16
|
+
tableName: 'global_config_site_profile',
|
|
17
|
+
columns: {
|
|
18
|
+
id: { type: 'varchar', length: 64, primary: true },
|
|
19
|
+
schemaVersion: { name: 'schema_version', type: 'integer' },
|
|
20
|
+
revision: { type: 'integer' },
|
|
21
|
+
value: { type: 'jsonb' },
|
|
22
|
+
updatedAt: { name: 'updated_at', type: 'timestamptz' },
|
|
23
|
+
updatedBy: { name: 'updated_by', type: 'varchar', length: 256 },
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/persistence/entities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,YAAY,CAAsB;IAC1E,IAAI,EAAE,kBAAkB;IACxB,SAAS,EAAE,iCAAiC;IAC5C,OAAO,EAAE;QACP,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAClD,aAAa,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1D,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;QACtD,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE;KAChE;CACF,CAAC,CAAC;AAWH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAiB;IAChE,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,4BAA4B;IACvC,OAAO,EAAE;QACP,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAClD,aAAa,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1D,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;QACtD,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE;KAChE;CACF,CAAC,CAAC"}
|