openxiangda-devkit-core 2.10.0 → 2.11.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.
@@ -9,12 +9,31 @@ const NEST_CLASS_DECORATORS = new Set([
9
9
  "Module",
10
10
  "WebSocketGateway",
11
11
  ]);
12
+ const NEST_ROUTE_METHOD_DECORATORS = new Set([
13
+ "All",
14
+ "Delete",
15
+ "Get",
16
+ "Head",
17
+ "Options",
18
+ "Patch",
19
+ "Post",
20
+ "Put",
21
+ "RequestMapping",
22
+ ]);
23
+ const OPENXIANGDA_OPERATION_DECORATOR = "OpenXiangdaOperation";
24
+ const DECLARED_CONTRACTS_MODULE = "@app/contracts";
12
25
  export function validateNestInjectionContract(root) {
13
26
  const sourceRoot = join(root, "apps", "server", "src");
14
27
  if (!existsSync(sourceRoot))
15
28
  return [];
16
29
  return sourceFiles(sourceRoot).flatMap(file => validateNestInjectionSource(readFileSync(file, "utf8"), relative(root, file).replaceAll("\\", "/")));
17
30
  }
31
+ export function validateNestControllerOperationContract(root) {
32
+ const sourceRoot = join(root, "apps", "server", "src");
33
+ if (!existsSync(sourceRoot))
34
+ return [];
35
+ return sourceFiles(sourceRoot).flatMap(file => validateNestControllerOperationSource(readFileSync(file, "utf8"), relative(root, file).replaceAll("\\", "/")));
36
+ }
18
37
  export function validateNestInjectionSource(source, path = "apps/server/src/unknown.ts") {
19
38
  const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, path.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
20
39
  const nestDecorators = nestDecoratorBindings(file);
@@ -58,6 +77,115 @@ function sourceFiles(root) {
58
77
  }
59
78
  return files;
60
79
  }
80
+ export function validateNestControllerOperationSource(source, path = "apps/server/src/unknown.ts") {
81
+ const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, path.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
82
+ const nestCommon = moduleImports(file, specifier => specifier === "@nestjs/common");
83
+ const nestSdk = moduleImports(file, specifier => specifier === "openxiangda/nest");
84
+ const contractsNames = moduleImports(file, specifier => specifier === DECLARED_CONTRACTS_MODULE);
85
+ const diagnostics = [];
86
+ for (const statement of file.statements) {
87
+ if (!ts.isClassDeclaration(statement))
88
+ continue;
89
+ if (!hasNamedDecorator(statement, "Controller", nestCommon))
90
+ continue;
91
+ const className = statement.name?.getText(file) ?? "?";
92
+ for (const member of statement.members) {
93
+ if (!ts.isMethodDeclaration(member) || !member.body)
94
+ continue;
95
+ if (!hasAnyNamedDecorator(member, NEST_ROUTE_METHOD_DECORATORS, nestCommon))
96
+ continue;
97
+ const position = file.getLineAndCharacterOfPosition(member.getStart(file));
98
+ const operation = decorators(member).find(decorator => decoratorNameMatches(decorator, OPENXIANGDA_OPERATION_DECORATOR, nestSdk));
99
+ const handler = member.name.getText(file);
100
+ if (!operation) {
101
+ diagnostics.push({
102
+ schemaVersion: SCHEMA_VERSIONS.diagnostic,
103
+ code: "OPENXIANGDA_NEST_CONTROLLER_OPERATION_REQUIRED",
104
+ severity: "error",
105
+ message: `应用路由 ${className}.${handler} 必须以 @OpenXiangdaOperation 绑定已声明的 operation`,
106
+ path: `${path}:${position.line + 1}:${position.character + 1}`,
107
+ retryable: false,
108
+ remediation: "普通 CRUD 由浏览器经平台 Data API 执行,不在 controller 转发;真实业务动作先在 openxiangda.config.ts 声明 operation(capability kind: 'backend'),再在此路由绑定 @OpenXiangdaOperation(appOperations.<code>)。参见 docs development#backend-decision",
109
+ });
110
+ continue;
111
+ }
112
+ const call = ts.isCallExpression(operation.expression) ? operation.expression : undefined;
113
+ const contractArgument = call?.arguments[0];
114
+ if (!call ||
115
+ call.arguments.length !== 1 ||
116
+ !isDeclaredOperationContract(contractArgument, contractsNames)) {
117
+ diagnostics.push({
118
+ schemaVersion: SCHEMA_VERSIONS.diagnostic,
119
+ code: "OPENXIANGDA_NEST_OPERATION_CONTRACT_MUST_BE_DECLARED",
120
+ severity: "error",
121
+ message: `路由 ${className}.${handler} 的 @OpenXiangdaOperation 参数必须是生成契约 appOperations.<code>`,
122
+ path: `${path}:${position.line + 1}:${position.character + 1}`,
123
+ retryable: false,
124
+ remediation: "operation 合同只能来自编译器产物:import { appOperations } from '@app/contracts' 并传递其中的具名 operation;不接受手写字面量或其他来源",
125
+ });
126
+ }
127
+ }
128
+ }
129
+ return diagnostics;
130
+ }
131
+ function isDeclaredOperationContract(node, contractsNames) {
132
+ if (!node || !ts.isPropertyAccessExpression(node))
133
+ return false;
134
+ const receiver = node.expression;
135
+ if (!ts.isIdentifier(receiver))
136
+ return false;
137
+ return contractsNames.direct.has(receiver.text);
138
+ }
139
+ function moduleImports(file, specifierMatches) {
140
+ const direct = new Set();
141
+ const namespaces = new Set();
142
+ for (const statement of file.statements) {
143
+ if (!ts.isImportDeclaration(statement))
144
+ continue;
145
+ const specifier = statement.moduleSpecifier;
146
+ if (!ts.isStringLiteral(specifier) || !specifierMatches(specifier.text))
147
+ continue;
148
+ const bindings = statement.importClause?.namedBindings;
149
+ if (bindings && ts.isNamespaceImport(bindings)) {
150
+ namespaces.add(bindings.name.text);
151
+ }
152
+ else if (bindings && ts.isNamedImports(bindings)) {
153
+ for (const element of bindings.elements) {
154
+ direct.add(element.name.text);
155
+ }
156
+ }
157
+ }
158
+ return { direct, namespaces };
159
+ }
160
+ function decoratorNameMatches(decorator, name, bindings) {
161
+ const expression = decoratorExpression(decorator);
162
+ if (ts.isIdentifier(expression))
163
+ return expression.text === name && bindings.direct.has(name);
164
+ return (ts.isPropertyAccessExpression(expression) &&
165
+ ts.isIdentifier(expression.expression) &&
166
+ bindings.namespaces.has(expression.expression.text) &&
167
+ expression.name.text === name);
168
+ }
169
+ function hasNamedDecorator(node, name, bindings) {
170
+ return decorators(node).some(decorator => decoratorNameMatches(decorator, name, bindings));
171
+ }
172
+ function hasAnyNamedDecorator(node, names, bindings) {
173
+ return decorators(node).some(decorator => {
174
+ const expression = decoratorExpression(decorator);
175
+ const name = ts.isIdentifier(expression)
176
+ ? expression.text
177
+ : ts.isPropertyAccessExpression(expression)
178
+ ? expression.name.text
179
+ : "";
180
+ if (!names.has(name))
181
+ return false;
182
+ if (ts.isIdentifier(expression))
183
+ return bindings.direct.has(name);
184
+ return (ts.isPropertyAccessExpression(expression) &&
185
+ ts.isIdentifier(expression.expression) &&
186
+ bindings.namespaces.has(expression.expression.text));
187
+ });
188
+ }
61
189
  function nestDecoratorBindings(file) {
62
190
  const direct = new Set();
63
191
  const namespaces = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"nest-injection-contract.js","sourceRoot":"","sources":["../src/nest-injection-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nest-injection-contract.js","sourceRoot":"","sources":["../src/nest-injection-contract.ts"],"names":[],"mappings":"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"}
package/dist/session.d.ts CHANGED
@@ -82,7 +82,7 @@ export declare function developerAuthorizationStatus(input: {
82
82
  data: {
83
83
  baseUrl: string;
84
84
  observedAt: string;
85
- state: "unavailable" | "missing" | "authorized" | "platform_mismatch" | "refresh_required" | "unauthorized";
85
+ state: "unavailable" | "authorized" | "missing" | "platform_mismatch" | "refresh_required" | "unauthorized";
86
86
  authorized: boolean;
87
87
  sessionPath: string;
88
88
  sessionScope: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda-devkit-core",
3
- "version": "2.10.0",
3
+ "version": "2.11.0",
4
4
  "description": "OpenXiangda 2.0 的编译、开发、检查、部署与中文资料服务。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,34 +0,0 @@
1
- import type { CompiledAppPackage } from './package-compiler.js';
2
- declare const CACHE_SCHEMA = "openxiangda.local-delivery-evidence/v1";
3
- export interface DeliveryCacheContext {
4
- root: string;
5
- frontendRoot: string;
6
- backendRoot?: string;
7
- toolchain: unknown;
8
- environment?: NodeJS.ProcessEnv;
9
- }
10
- export interface ValidationEvidence {
11
- schemaVersion: typeof CACHE_SCHEMA;
12
- inputDigest: string;
13
- outputDigest: string;
14
- }
15
- export interface FileSnapshot {
16
- path: string;
17
- digest: string;
18
- bytes: number;
19
- }
20
- /** 锁文件、安装状态、源码(包含 .env)、工具链及进程环境共同决定输入;不落盘明文环境变量。 */
21
- export declare function deliveryInputDigest(context: DeliveryCacheContext): string | null;
22
- export declare function deliveryOutputDigest(context: DeliveryCacheContext): string | null;
23
- export declare function reusableValidation(context: DeliveryCacheContext, inputDigest?: string | null): ValidationEvidence | null;
24
- export declare function recordValidation(context: DeliveryCacheContext, before: string | null): ValidationEvidence | null;
25
- export declare function recordSealedCandidate(context: DeliveryCacheContext, compiled: CompiledAppPackage): void;
26
- export declare function reusableSealedCandidate(context: DeliveryCacheContext, source: {
27
- repository: string;
28
- commit: string;
29
- }, backendImage?: string): Promise<{
30
- package: CompiledAppPackage;
31
- artifactContent: Record<string, string>;
32
- } | null>;
33
- export {};
34
- //# sourceMappingURL=delivery-cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery-cache.d.ts","sourceRoot":"","sources":["../src/delivery-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,QAAA,MAAM,YAAY,2CAA2C,CAAC;AAM9D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACjC;AACD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,YAAY,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAuC7E,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAoBhF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAIjF;AAiBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE,WAAW,gBAA+B,GAAG,kBAAkB,GAAG,IAAI,CAOvI;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAWhH;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,kBAAkB,QAMhG;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,CAAC,EAAE,MAAM;;;UAyBjJ"}
@@ -1,186 +0,0 @@
1
- import { createHash, randomUUID } from 'node:crypto';
2
- import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
- import { dirname, join, relative, resolve } from 'node:path';
4
- import { canonicalJson, sha256Digest } from 'openxiangda-contracts';
5
- import { verifySealedAppPackage } from './deployment.js';
6
- const CACHE_SCHEMA = 'openxiangda.local-delivery-evidence/v1';
7
- const MAX_FILES = 20_000;
8
- const MAX_BYTES = 256 * 1024 * 1024;
9
- const MAX_TIME_MS = 10_000;
10
- const EXCLUDED = new Set(['.git', '.codegraph', '.openxiangda', 'node_modules', '.turbo', 'coverage', 'playwright-report', 'test-results']);
11
- /** 有界读取且不跟随符号链接。摘要只用于复核本地证据,不代表平台授权。 */
12
- function snapshot(root, excluded = () => false) {
13
- const files = [];
14
- const started = Date.now();
15
- let bytes = 0;
16
- let entries = 0;
17
- function visit(directory) {
18
- if (Date.now() - started > MAX_TIME_MS)
19
- throw new Error('CACHE_SCAN_TIME_LIMIT');
20
- for (const name of readdirSync(directory).sort()) {
21
- if (++entries > MAX_FILES)
22
- throw new Error('CACHE_SCAN_FILE_LIMIT');
23
- const path = join(directory, name);
24
- const local = relative(root, path).replaceAll('\\', '/');
25
- if (excluded(local, name))
26
- continue;
27
- const stat = lstatSync(path);
28
- if (stat.isSymbolicLink())
29
- throw new Error('CACHE_SYMLINK_UNSUPPORTED');
30
- if (stat.isDirectory())
31
- visit(path);
32
- else if (stat.isFile()) {
33
- bytes += stat.size;
34
- if (bytes > MAX_BYTES || Date.now() - started > MAX_TIME_MS)
35
- throw new Error('CACHE_SCAN_LIMIT');
36
- const content = readFileSync(path);
37
- if (content.length !== stat.size)
38
- throw new Error('CACHE_INPUT_CHANGED');
39
- files.push({ path: local, digest: createHash('sha256').update(content).digest('hex'), bytes: content.length });
40
- }
41
- else
42
- throw new Error('CACHE_SPECIAL_FILE_UNSUPPORTED');
43
- }
44
- }
45
- visit(root);
46
- return files;
47
- }
48
- function outputRoots(context) {
49
- return [...new Set([context.frontendRoot, ...(context.backendRoot ? [context.backendRoot] : [])])].map(root => {
50
- const path = relative(context.root, resolve(context.root, root, 'dist')).replaceAll('\\', '/');
51
- if (!path || path.startsWith('../'))
52
- throw new Error('CACHE_OUTPUT_OUTSIDE_WORKSPACE');
53
- return path;
54
- });
55
- }
56
- /** 锁文件、安装状态、源码(包含 .env)、工具链及进程环境共同决定输入;不落盘明文环境变量。 */
57
- export function deliveryInputDigest(context) {
58
- try {
59
- const outputs = outputRoots(context);
60
- const files = snapshot(context.root, (path, name) => EXCLUDED.has(name) || outputs.some(root => path === root || path.startsWith(`${root}/`)));
61
- const locks = files.filter(file => /(^|\/)(pnpm-lock.yaml|package-lock.json|yarn.lock)$/.test(file.path));
62
- if (!locks.length)
63
- return null;
64
- // 未由当前工作区覆盖的本地依赖没有可靠输入闭包,直接执行正式检查。
65
- for (const lock of locks) {
66
- if (/(?:file|link):/.test(readFileSync(join(context.root, lock.path), 'utf8')))
67
- return null;
68
- }
69
- const installation = ['node_modules/.modules.yaml', 'node_modules/.pnpm/lock.yaml', 'node_modules/.package-lock.json'].map(path => {
70
- const file = join(context.root, path);
71
- if (!existsSync(file))
72
- return { path, digest: null };
73
- const stat = lstatSync(file);
74
- if (!stat.isFile() || stat.size > 16 * 1024 * 1024)
75
- throw new Error('CACHE_DEPENDENCY_STATE_INVALID');
76
- return { path, digest: createHash('sha256').update(readFileSync(file)).digest('hex') };
77
- });
78
- return sha256Digest({ files, installation, toolchain: context.toolchain, node: process.version,
79
- platform: process.platform, arch: process.arch, environment: { ...(context.environment || process.env) } });
80
- }
81
- catch {
82
- return null;
83
- }
84
- }
85
- export function deliveryOutputDigest(context) {
86
- try {
87
- return sha256Digest(outputRoots(context).map(path => ({ path, files: snapshot(join(context.root, path)) })));
88
- }
89
- catch {
90
- return null;
91
- }
92
- }
93
- function cachePath(root, name) { return join(root, '.openxiangda', 'build', name); }
94
- function readJson(path, maxBytes = 1024 * 1024) {
95
- const stat = lstatSync(path);
96
- if (!stat.isFile() || stat.size > maxBytes)
97
- throw new Error('CACHE_RECEIPT_INVALID');
98
- return JSON.parse(readFileSync(path, 'utf8'));
99
- }
100
- function writeJson(path, value) {
101
- mkdirSync(dirname(path), { recursive: true });
102
- const temporary = `${path}.${randomUUID()}.tmp`;
103
- try {
104
- writeFileSync(temporary, `${canonicalJson(value)}\n`, { mode: 0o600 });
105
- renameSync(temporary, path);
106
- }
107
- finally {
108
- rmSync(temporary, { force: true });
109
- }
110
- }
111
- export function reusableValidation(context, inputDigest = deliveryInputDigest(context)) {
112
- try {
113
- if (!inputDigest)
114
- return null;
115
- const evidence = readJson(cachePath(context.root, 'validation-evidence.json'));
116
- if (evidence.schemaVersion !== CACHE_SCHEMA || evidence.inputDigest !== inputDigest || evidence.outputDigest !== deliveryOutputDigest(context))
117
- return null;
118
- return { schemaVersion: CACHE_SCHEMA, inputDigest, outputDigest: evidence.outputDigest };
119
- }
120
- catch {
121
- return null;
122
- }
123
- }
124
- export function recordValidation(context, before) {
125
- const after = deliveryInputDigest(context);
126
- if (before && after !== before) {
127
- throw Object.assign(new Error('检查期间源码、依赖或构建环境发生变化,请在修改结束后重新检查'), { code: 'OPENXIANGDA_VALIDATION_INPUT_CHANGED' });
128
- }
129
- const outputDigest = deliveryOutputDigest(context);
130
- if (!before || !outputDigest)
131
- return null;
132
- const evidence = { schemaVersion: CACHE_SCHEMA, inputDigest: before, outputDigest };
133
- try {
134
- writeJson(cachePath(context.root, 'validation-evidence.json'), evidence);
135
- }
136
- catch {
137
- return null;
138
- }
139
- return evidence;
140
- }
141
- export function recordSealedCandidate(context, compiled) {
142
- const evidence = reusableValidation(context);
143
- if (evidence) {
144
- try {
145
- writeJson(cachePath(context.root, 'candidate-evidence.json'), { ...evidence, packageDigest: compiled.digest });
146
- }
147
- catch { /* 缓存不可写不改变正式部署结果。 */ }
148
- }
149
- }
150
- export async function reusableSealedCandidate(context, source, backendImage) {
151
- try {
152
- const evidence = reusableValidation(context);
153
- if (!evidence)
154
- return null;
155
- const candidate = readJson(cachePath(context.root, 'candidate-evidence.json'));
156
- if (candidate.schemaVersion !== CACHE_SCHEMA || candidate.inputDigest !== evidence.inputDigest || candidate.outputDigest !== evidence.outputDigest)
157
- return null;
158
- const manifest = readJson(cachePath(context.root, 'app-package.json'), 5 * 1024 * 1024);
159
- if (manifest.source?.repository !== source.repository || manifest.source?.commit !== source.commit || manifest.source?.dirty !== false || !Array.isArray(manifest.artifacts) || manifest.artifacts.length > 8)
160
- return null;
161
- const compiled = { manifest, digest: candidate.packageDigest };
162
- if (sha256Digest(manifest) !== compiled.digest)
163
- return null;
164
- const backend = manifest.artifacts.find((artifact) => artifact.kind === 'backend');
165
- if (backendImage && backend?.metadata?.imageDigest !== backendImage)
166
- return null;
167
- const artifactContent = {};
168
- let bytes = 0;
169
- for (const artifact of manifest.artifacts) {
170
- if (!/^[a-f0-9]{64}$/.test(artifact.digest))
171
- return null;
172
- const path = cachePath(context.root, `artifacts/${artifact.digest}`);
173
- const stat = lstatSync(path);
174
- bytes += stat.size;
175
- if (!stat.isFile() || bytes > MAX_BYTES)
176
- return null;
177
- artifactContent[artifact.digest] = readFileSync(path, 'utf8');
178
- }
179
- await verifySealedAppPackage(compiled, artifactContent);
180
- return { package: compiled, artifactContent };
181
- }
182
- catch {
183
- return null;
184
- }
185
- }
186
- //# sourceMappingURL=delivery-cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery-cache.js","sourceRoot":"","sources":["../src/delivery-cache.ts"],"names":[],"mappings":"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"}