@lark-apaas/coding-preset-vite-react 1.0.12-alpha.1 → 1.0.12
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/lib/index.d.ts +9 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +153 -114
- package/lib/index.js.map +1 -1
- package/lib/plugins/{basename-injection.d.ts → basename.d.ts} +4 -4
- package/lib/plugins/basename.d.ts.map +1 -0
- package/lib/plugins/{basename-injection.js → basename.js} +7 -15
- package/lib/plugins/basename.js.map +1 -0
- package/lib/plugins/capabilities.d.ts +9 -6
- package/lib/plugins/capabilities.d.ts.map +1 -1
- package/lib/plugins/capabilities.js +27 -29
- package/lib/plugins/capabilities.js.map +1 -1
- package/lib/plugins/dev-proxy.d.ts +41 -0
- package/lib/plugins/dev-proxy.d.ts.map +1 -0
- package/lib/plugins/dev-proxy.js +229 -0
- package/lib/plugins/dev-proxy.js.map +1 -0
- package/lib/plugins/fonts-mirror.d.ts.map +1 -1
- package/lib/plugins/fonts-mirror.js +28 -0
- package/lib/plugins/fonts-mirror.js.map +1 -1
- package/lib/plugins/html-output.d.ts +21 -0
- package/lib/plugins/html-output.d.ts.map +1 -0
- package/lib/plugins/html-output.js +171 -0
- package/lib/plugins/html-output.js.map +1 -0
- package/lib/plugins/server-log.d.ts +45 -0
- package/lib/plugins/server-log.d.ts.map +1 -0
- package/lib/plugins/server-log.js +60 -0
- package/lib/plugins/server-log.js.map +1 -0
- package/lib/plugins/view-context.d.ts +0 -5
- package/lib/plugins/view-context.d.ts.map +1 -1
- package/lib/plugins/view-context.js +0 -3
- package/lib/plugins/view-context.js.map +1 -1
- package/lib/server-log/compat.d.ts +36 -0
- package/lib/server-log/compat.d.ts.map +1 -0
- package/lib/server-log/compat.js +73 -0
- package/lib/server-log/compat.js.map +1 -0
- package/lib/server-log/dev-logs/api-list-handler.d.ts +6 -0
- package/lib/server-log/dev-logs/api-list-handler.d.ts.map +1 -0
- package/lib/server-log/dev-logs/api-list-handler.js +132 -0
- package/lib/server-log/dev-logs/api-list-handler.js.map +1 -0
- package/lib/server-log/dev-logs/controller.d.ts +45 -0
- package/lib/server-log/dev-logs/controller.d.ts.map +1 -0
- package/lib/server-log/dev-logs/controller.js +239 -0
- package/lib/server-log/dev-logs/controller.js.map +1 -0
- package/lib/server-log/dev-logs/health.controller.d.ts +15 -0
- package/lib/server-log/dev-logs/health.controller.d.ts.map +1 -0
- package/lib/server-log/dev-logs/health.controller.js +79 -0
- package/lib/server-log/dev-logs/health.controller.js.map +1 -0
- package/lib/server-log/dev-logs/helper/path-matcher.d.ts +117 -0
- package/lib/server-log/dev-logs/helper/path-matcher.d.ts.map +1 -0
- package/lib/server-log/dev-logs/helper/path-matcher.js +214 -0
- package/lib/server-log/dev-logs/helper/path-matcher.js.map +1 -0
- package/lib/server-log/dev-logs/index.d.ts +12 -0
- package/lib/server-log/dev-logs/index.d.ts.map +1 -0
- package/lib/server-log/dev-logs/index.js +61 -0
- package/lib/server-log/dev-logs/index.js.map +1 -0
- package/lib/server-log/dev-logs/router.d.ts +7 -0
- package/lib/server-log/dev-logs/router.d.ts.map +1 -0
- package/lib/server-log/dev-logs/router.js +40 -0
- package/lib/server-log/dev-logs/router.js.map +1 -0
- package/lib/server-log/dev-logs/services/capability.service.d.ts +33 -0
- package/lib/server-log/dev-logs/services/capability.service.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/capability.service.js +127 -0
- package/lib/server-log/dev-logs/services/capability.service.js.map +1 -0
- package/lib/server-log/dev-logs/services/file-reader.d.ts +10 -0
- package/lib/server-log/dev-logs/services/file-reader.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/file-reader.js +67 -0
- package/lib/server-log/dev-logs/services/file-reader.js.map +1 -0
- package/lib/server-log/dev-logs/services/index.d.ts +8 -0
- package/lib/server-log/dev-logs/services/index.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/index.js +30 -0
- package/lib/server-log/dev-logs/services/index.js.map +1 -0
- package/lib/server-log/dev-logs/services/parsers.d.ts +23 -0
- package/lib/server-log/dev-logs/services/parsers.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/parsers.js +157 -0
- package/lib/server-log/dev-logs/services/parsers.js.map +1 -0
- package/lib/server-log/dev-logs/services/server-log.service.d.ts +17 -0
- package/lib/server-log/dev-logs/services/server-log.service.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/server-log.service.js +119 -0
- package/lib/server-log/dev-logs/services/server-log.service.js.map +1 -0
- package/lib/server-log/dev-logs/services/trace.service.d.ts +14 -0
- package/lib/server-log/dev-logs/services/trace.service.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/trace.service.js +162 -0
- package/lib/server-log/dev-logs/services/trace.service.js.map +1 -0
- package/lib/server-log/dev-logs/services/trigger.service.d.ts +14 -0
- package/lib/server-log/dev-logs/services/trigger.service.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services/trigger.service.js +153 -0
- package/lib/server-log/dev-logs/services/trigger.service.js.map +1 -0
- package/lib/server-log/dev-logs/services.d.ts +7 -0
- package/lib/server-log/dev-logs/services.d.ts.map +1 -0
- package/lib/server-log/dev-logs/services.js +20 -0
- package/lib/server-log/dev-logs/services.js.map +1 -0
- package/lib/server-log/dev-logs/sse/client-manager.d.ts +61 -0
- package/lib/server-log/dev-logs/sse/client-manager.d.ts.map +1 -0
- package/lib/server-log/dev-logs/sse/client-manager.js +140 -0
- package/lib/server-log/dev-logs/sse/client-manager.js.map +1 -0
- package/lib/server-log/dev-logs/sse/index.d.ts +5 -0
- package/lib/server-log/dev-logs/sse/index.d.ts.map +1 -0
- package/lib/server-log/dev-logs/sse/index.js +11 -0
- package/lib/server-log/dev-logs/sse/index.js.map +1 -0
- package/lib/server-log/dev-logs/sse/log-watcher.d.ts +51 -0
- package/lib/server-log/dev-logs/sse/log-watcher.d.ts.map +1 -0
- package/lib/server-log/dev-logs/sse/log-watcher.js +381 -0
- package/lib/server-log/dev-logs/sse/log-watcher.js.map +1 -0
- package/lib/server-log/dev-logs/sse/sse.controller.d.ts +25 -0
- package/lib/server-log/dev-logs/sse/sse.controller.d.ts.map +1 -0
- package/lib/server-log/dev-logs/sse/sse.controller.js +95 -0
- package/lib/server-log/dev-logs/sse/sse.controller.js.map +1 -0
- package/lib/server-log/dev-logs/types.d.ts +104 -0
- package/lib/server-log/dev-logs/types.d.ts.map +1 -0
- package/lib/server-log/dev-logs/types.js +3 -0
- package/lib/server-log/dev-logs/types.js.map +1 -0
- package/lib/server-log/dev-logs/utils.d.ts +68 -0
- package/lib/server-log/dev-logs/utils.d.ts.map +1 -0
- package/lib/server-log/dev-logs/utils.js +151 -0
- package/lib/server-log/dev-logs/utils.js.map +1 -0
- package/lib/server-log/register.d.ts +34 -0
- package/lib/server-log/register.d.ts.map +1 -0
- package/lib/server-log/register.js +196 -0
- package/lib/server-log/register.js.map +1 -0
- package/lib/server-log/types.d.ts +99 -0
- package/lib/server-log/types.d.ts.map +1 -0
- package/lib/server-log/types.js +3 -0
- package/lib/server-log/types.js.map +1 -0
- package/lib/utils/local-dev.d.ts +46 -0
- package/lib/utils/local-dev.d.ts.map +1 -0
- package/lib/utils/local-dev.js +96 -0
- package/lib/utils/local-dev.js.map +1 -0
- package/lib/utils/proxy-error.d.ts +29 -0
- package/lib/utils/proxy-error.d.ts.map +1 -0
- package/lib/utils/proxy-error.js +158 -0
- package/lib/utils/proxy-error.js.map +1 -0
- package/package.json +3 -1
- package/lib/plugins/basename-injection.d.ts.map +0 -1
- package/lib/plugins/basename-injection.js.map +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { LogEntry } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve log directory path
|
|
4
|
+
*/
|
|
5
|
+
export declare function resolveLogDir(provided?: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Get relative path from current working directory
|
|
8
|
+
*/
|
|
9
|
+
export declare function getRelativePath(filePath: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Check if file exists
|
|
12
|
+
*/
|
|
13
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Parse a log line as JSON
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseLogLine(line: string): LogEntry | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Extract number from message using regex pattern
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractNumber(message: string, pattern: RegExp): number | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Parse limit parameter with default and max value
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseLimit(value: string | undefined, defaultValue: number, maxValue: number): number;
|
|
26
|
+
/**
|
|
27
|
+
* Parse positive integer with fallback
|
|
28
|
+
*/
|
|
29
|
+
export declare function parsePositiveInt(value: string | undefined, fallback: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* Resolve log file path with security checks
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveLogFilePath(baseDir: string, fileName: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Check if actual request path matches expected OpenAPI/Swagger path pattern
|
|
36
|
+
*
|
|
37
|
+
* @param actualPath - The actual request path from logs (e.g., /api/users/123)
|
|
38
|
+
* @param pattern - The OpenAPI path pattern to match against (e.g., /api/users/{id})
|
|
39
|
+
* @returns true if the path matches the pattern
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* matchesPath('/api/users/123', '/api/users/{id}') // true
|
|
43
|
+
* matchesPath('/api/users/123', '/api/users') // true (prefix match)
|
|
44
|
+
* matchesPath('/api/posts/456', '/api/users/{id}') // false
|
|
45
|
+
*/
|
|
46
|
+
export declare function matchesPath(actualPath: string | undefined, pattern: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Check if actual request method matches expected HTTP method
|
|
49
|
+
*
|
|
50
|
+
* @param actualMethod - The actual request method from logs (e.g., 'GET', 'POST')
|
|
51
|
+
* @param expectedMethod - The expected HTTP method to match against (e.g., 'GET')
|
|
52
|
+
* @returns true if the method matches (case-insensitive)
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* matchesMethod('GET', 'GET') // true
|
|
56
|
+
* matchesMethod('get', 'GET') // true
|
|
57
|
+
* matchesMethod('POST', 'GET') // false
|
|
58
|
+
* matchesMethod(undefined, 'GET') // false
|
|
59
|
+
*/
|
|
60
|
+
export declare function matchesMethod(actualMethod: string | undefined, expectedMethod: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Serialize error for JSON response
|
|
63
|
+
*/
|
|
64
|
+
export declare function serializeError(error: unknown): {
|
|
65
|
+
name?: string;
|
|
66
|
+
message: string;
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server-log/dev-logs/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGxC;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAS/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQlF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWpG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOpF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAK/F;AAGD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAIjF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveLogDir = resolveLogDir;
|
|
4
|
+
exports.getRelativePath = getRelativePath;
|
|
5
|
+
exports.fileExists = fileExists;
|
|
6
|
+
exports.parseLogLine = parseLogLine;
|
|
7
|
+
exports.extractNumber = extractNumber;
|
|
8
|
+
exports.parseLimit = parseLimit;
|
|
9
|
+
exports.parsePositiveInt = parsePositiveInt;
|
|
10
|
+
exports.resolveLogFilePath = resolveLogFilePath;
|
|
11
|
+
exports.matchesPath = matchesPath;
|
|
12
|
+
exports.matchesMethod = matchesMethod;
|
|
13
|
+
exports.serializeError = serializeError;
|
|
14
|
+
const node_fs_1 = require("node:fs");
|
|
15
|
+
const node_path_1 = require("node:path");
|
|
16
|
+
const path_matcher_1 = require("./helper/path-matcher");
|
|
17
|
+
/**
|
|
18
|
+
* Resolve log directory path
|
|
19
|
+
*/
|
|
20
|
+
function resolveLogDir(provided) {
|
|
21
|
+
if (!provided) {
|
|
22
|
+
return (0, node_path_1.join)(process.cwd(), 'logs');
|
|
23
|
+
}
|
|
24
|
+
return (0, node_path_1.isAbsolute)(provided) ? provided : (0, node_path_1.join)(process.cwd(), provided);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get relative path from current working directory
|
|
28
|
+
*/
|
|
29
|
+
function getRelativePath(filePath) {
|
|
30
|
+
return (0, node_path_1.relative)(process.cwd(), filePath);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if file exists
|
|
34
|
+
*/
|
|
35
|
+
async function fileExists(filePath) {
|
|
36
|
+
try {
|
|
37
|
+
await node_fs_1.promises.access(filePath);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse a log line as JSON
|
|
46
|
+
*/
|
|
47
|
+
function parseLogLine(line) {
|
|
48
|
+
const trimmed = line.trim();
|
|
49
|
+
if (!trimmed)
|
|
50
|
+
return undefined;
|
|
51
|
+
try {
|
|
52
|
+
return JSON.parse(trimmed);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extract number from message using regex pattern
|
|
60
|
+
*/
|
|
61
|
+
function extractNumber(message, pattern) {
|
|
62
|
+
if (typeof message !== 'string')
|
|
63
|
+
return undefined;
|
|
64
|
+
const match = message.match(pattern);
|
|
65
|
+
if (!match)
|
|
66
|
+
return undefined;
|
|
67
|
+
const value = Number(match[1]);
|
|
68
|
+
return Number.isFinite(value) ? value : undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse limit parameter with default and max value
|
|
72
|
+
*/
|
|
73
|
+
function parseLimit(value, defaultValue, maxValue) {
|
|
74
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
75
|
+
return defaultValue;
|
|
76
|
+
}
|
|
77
|
+
const parsed = Number(value);
|
|
78
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
79
|
+
return Math.min(Math.floor(parsed), maxValue);
|
|
80
|
+
}
|
|
81
|
+
return defaultValue;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parse positive integer with fallback
|
|
85
|
+
*/
|
|
86
|
+
function parsePositiveInt(value, fallback) {
|
|
87
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
88
|
+
return fallback;
|
|
89
|
+
}
|
|
90
|
+
const parsed = Number(value);
|
|
91
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolve log file path with security checks
|
|
95
|
+
*/
|
|
96
|
+
function resolveLogFilePath(baseDir, fileName) {
|
|
97
|
+
const sanitized = fileName.replace(/\\/g, '/');
|
|
98
|
+
const segments = sanitized.split('/').filter(Boolean);
|
|
99
|
+
if (segments.some((segment) => segment === '..')) {
|
|
100
|
+
throw new Error('Invalid log file path');
|
|
101
|
+
}
|
|
102
|
+
const resolved = (0, node_path_1.join)(baseDir, segments.join('/'));
|
|
103
|
+
const rel = (0, node_path_1.relative)(baseDir, resolved);
|
|
104
|
+
if (rel.startsWith('..')) {
|
|
105
|
+
throw new Error('Access to the specified log file is denied');
|
|
106
|
+
}
|
|
107
|
+
return resolved;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if actual request path matches expected OpenAPI/Swagger path pattern
|
|
111
|
+
*
|
|
112
|
+
* @param actualPath - The actual request path from logs (e.g., /api/users/123)
|
|
113
|
+
* @param pattern - The OpenAPI path pattern to match against (e.g., /api/users/{id})
|
|
114
|
+
* @returns true if the path matches the pattern
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* matchesPath('/api/users/123', '/api/users/{id}') // true
|
|
118
|
+
* matchesPath('/api/users/123', '/api/users') // true (prefix match)
|
|
119
|
+
* matchesPath('/api/posts/456', '/api/users/{id}') // false
|
|
120
|
+
*/
|
|
121
|
+
function matchesPath(actualPath, pattern) {
|
|
122
|
+
return (0, path_matcher_1.matchesPathPattern)(actualPath, pattern);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if actual request method matches expected HTTP method
|
|
126
|
+
*
|
|
127
|
+
* @param actualMethod - The actual request method from logs (e.g., 'GET', 'POST')
|
|
128
|
+
* @param expectedMethod - The expected HTTP method to match against (e.g., 'GET')
|
|
129
|
+
* @returns true if the method matches (case-insensitive)
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* matchesMethod('GET', 'GET') // true
|
|
133
|
+
* matchesMethod('get', 'GET') // true
|
|
134
|
+
* matchesMethod('POST', 'GET') // false
|
|
135
|
+
* matchesMethod(undefined, 'GET') // false
|
|
136
|
+
*/
|
|
137
|
+
function matchesMethod(actualMethod, expectedMethod) {
|
|
138
|
+
if (!actualMethod || !expectedMethod) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
return actualMethod.toUpperCase() === expectedMethod.toUpperCase();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Serialize error for JSON response
|
|
145
|
+
*/
|
|
146
|
+
function serializeError(error) {
|
|
147
|
+
return error instanceof Error
|
|
148
|
+
? { name: error.name, message: error.message }
|
|
149
|
+
: { message: String(error) };
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/server-log/dev-logs/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Middleware, MiddlewareContext, ExpressApp, ViteMiddleware } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Register middlewares for Express-compatible servers or Vite.
|
|
4
|
+
*
|
|
5
|
+
* MUST stay synchronous (no async/await).
|
|
6
|
+
*
|
|
7
|
+
* Why: when called from webpack/rspack-dev-server's `setupMiddlewares` callback,
|
|
8
|
+
* any `await` here yields a microtask, allowing dev-server to finish registering
|
|
9
|
+
* its own built-ins (proxy, historyApiFallback, serveStatic, ...) BEFORE our
|
|
10
|
+
* later iterations run. The first router lands before historyApiFallback while
|
|
11
|
+
* subsequent routers land after — causing extensionless GETs (e.g. `/dev/openapi/spec`
|
|
12
|
+
* with a wildcard Accept header) to be rewritten to `/index.html`. All registered work
|
|
13
|
+
* (`server.use`, `createRouter`, `createHandler`) is sync, so async/await is also
|
|
14
|
+
* unnecessary.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // In rspack/webpack setupMiddlewares
|
|
19
|
+
* setupMiddlewares: (middlewares, devServer) => {
|
|
20
|
+
* if (devServer.app) {
|
|
21
|
+
* registerMiddlewares(devServer.app, [
|
|
22
|
+
* createDevLogsMiddleware({ logDir: './logs' }),
|
|
23
|
+
* createOpenapiMiddleware({ openapiFilePath: './openapi.json' })
|
|
24
|
+
* ], { basePath: '/api', isDev: true, rootDir: __dirname });
|
|
25
|
+
* }
|
|
26
|
+
* return middlewares;
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function registerMiddlewares(server: ExpressApp | ViteMiddleware, middlewares: Middleware[], options?: Partial<MiddlewareContext>): void;
|
|
31
|
+
export type { Middleware, RouteMiddleware, GlobalMiddleware, MiddlewareContext, RouteInfo, } from './types';
|
|
32
|
+
export { createDevLogsMiddleware } from './dev-logs';
|
|
33
|
+
export { sendJson, sendError, sendSuccess, getQuery, getQueryParam } from './compat';
|
|
34
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/server-log/register.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAGV,iBAAiB,EACjB,UAAU,EACV,cAAc,EACf,MAAM,SAAS,CAAC;AAmIjB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE,UAAU,EAAE,EACzB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACnC,IAAI,CAsDN;AAGD,YAAY,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,GACV,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getQueryParam = exports.getQuery = exports.sendSuccess = exports.sendError = exports.sendJson = exports.createDevLogsMiddleware = void 0;
|
|
7
|
+
exports.registerMiddlewares = registerMiddlewares;
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
/**
|
|
10
|
+
* Enhance Request/Response objects with Express-compatible methods
|
|
11
|
+
* This allows middleware written for Express to work with Vite/Connect
|
|
12
|
+
*/
|
|
13
|
+
function enhanceForCompat(req, res) {
|
|
14
|
+
// Enhance Response with Express-like methods
|
|
15
|
+
if (!res.status) {
|
|
16
|
+
res.status = function (code) {
|
|
17
|
+
res.statusCode = code;
|
|
18
|
+
return res;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (!res.json) {
|
|
22
|
+
res.json = function (data) {
|
|
23
|
+
res.setHeader('Content-Type', 'application/json');
|
|
24
|
+
res.end(JSON.stringify(data));
|
|
25
|
+
return res;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (!res.send) {
|
|
29
|
+
res.send = function (data) {
|
|
30
|
+
if (typeof data === 'object' && data !== null) {
|
|
31
|
+
res.setHeader('Content-Type', 'application/json');
|
|
32
|
+
res.end(JSON.stringify(data));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
res.end(String(data));
|
|
36
|
+
}
|
|
37
|
+
return res;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Enhance Request with parsed query
|
|
41
|
+
if (!req.query) {
|
|
42
|
+
const url = new URL(req.url || '', `http://${req.headers.host || 'localhost'}`);
|
|
43
|
+
req.query = Object.fromEntries(url.searchParams.entries());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Detect if the server is a Connect/Vite middleware server (not Express)
|
|
48
|
+
* Connect servers don't have Express-specific methods like 'set' or 'engine'
|
|
49
|
+
*/
|
|
50
|
+
function isConnectServer(server) {
|
|
51
|
+
return (typeof server === 'function' &&
|
|
52
|
+
!('set' in server) &&
|
|
53
|
+
!('engine' in server));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Type guard to check if middleware is route-based
|
|
57
|
+
*/
|
|
58
|
+
function isRouteMiddleware(middleware) {
|
|
59
|
+
return 'createRouter' in middleware && middleware.createRouter !== undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Type guard to check if middleware is global
|
|
63
|
+
*/
|
|
64
|
+
function isGlobalMiddleware(middleware) {
|
|
65
|
+
return 'createHandler' in middleware && middleware.createHandler !== undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compute the full mount path by combining basePath and middleware mountPath
|
|
69
|
+
*/
|
|
70
|
+
function computeMountPath(basePath, mountPath) {
|
|
71
|
+
const routePath = node_path_1.default.posix.join(basePath, mountPath);
|
|
72
|
+
return routePath.startsWith('/') ? routePath : `/${routePath}`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Log middleware registration with routes info
|
|
76
|
+
*/
|
|
77
|
+
function logMiddlewareRegistration(middleware, fullMountPath) {
|
|
78
|
+
if (middleware.routes && middleware.routes.length > 0) {
|
|
79
|
+
console.log(`[Middleware] Registered: ${middleware.name} at ${fullMountPath}`);
|
|
80
|
+
middleware.routes.forEach((route) => {
|
|
81
|
+
const routePath = route.path === '/' ? fullMountPath : node_path_1.default.posix.join(fullMountPath, route.path);
|
|
82
|
+
console.log(` ${route.method} ${routePath} - ${route.description}`);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(`[Middleware] Registered: ${middleware.name} at ${fullMountPath}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// MUST stay synchronous. See note on `registerMiddlewares` below.
|
|
90
|
+
function registerRouteMiddleware(server, middleware, context) {
|
|
91
|
+
if (!middleware.mountPath) {
|
|
92
|
+
console.error(`[Middleware] ${middleware.name}: Route middleware must have mountPath. Skipping.`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const router = middleware.createRouter(context);
|
|
96
|
+
const fullMountPath = computeMountPath(context.basePath, middleware.mountPath);
|
|
97
|
+
server.use(fullMountPath, router);
|
|
98
|
+
logMiddlewareRegistration(middleware, fullMountPath);
|
|
99
|
+
}
|
|
100
|
+
// MUST stay synchronous. See note on `registerMiddlewares` below.
|
|
101
|
+
function registerGlobalMiddleware(server, middleware, context) {
|
|
102
|
+
if (middleware.mountPath) {
|
|
103
|
+
console.warn(`[Middleware] ${middleware.name}: Global middleware should not have mountPath. ` +
|
|
104
|
+
`Ignoring mountPath "${middleware.mountPath}".`);
|
|
105
|
+
}
|
|
106
|
+
const handler = middleware.createHandler(context);
|
|
107
|
+
server.use(handler);
|
|
108
|
+
console.log(`[Middleware] Registered global: ${middleware.name}`);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Register middlewares for Express-compatible servers or Vite.
|
|
112
|
+
*
|
|
113
|
+
* MUST stay synchronous (no async/await).
|
|
114
|
+
*
|
|
115
|
+
* Why: when called from webpack/rspack-dev-server's `setupMiddlewares` callback,
|
|
116
|
+
* any `await` here yields a microtask, allowing dev-server to finish registering
|
|
117
|
+
* its own built-ins (proxy, historyApiFallback, serveStatic, ...) BEFORE our
|
|
118
|
+
* later iterations run. The first router lands before historyApiFallback while
|
|
119
|
+
* subsequent routers land after — causing extensionless GETs (e.g. `/dev/openapi/spec`
|
|
120
|
+
* with a wildcard Accept header) to be rewritten to `/index.html`. All registered work
|
|
121
|
+
* (`server.use`, `createRouter`, `createHandler`) is sync, so async/await is also
|
|
122
|
+
* unnecessary.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* // In rspack/webpack setupMiddlewares
|
|
127
|
+
* setupMiddlewares: (middlewares, devServer) => {
|
|
128
|
+
* if (devServer.app) {
|
|
129
|
+
* registerMiddlewares(devServer.app, [
|
|
130
|
+
* createDevLogsMiddleware({ logDir: './logs' }),
|
|
131
|
+
* createOpenapiMiddleware({ openapiFilePath: './openapi.json' })
|
|
132
|
+
* ], { basePath: '/api', isDev: true, rootDir: __dirname });
|
|
133
|
+
* }
|
|
134
|
+
* return middlewares;
|
|
135
|
+
* }
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
function registerMiddlewares(server, middlewares, options) {
|
|
139
|
+
// Build context with defaults
|
|
140
|
+
const context = {
|
|
141
|
+
basePath: '/',
|
|
142
|
+
isDev: process.env.NODE_ENV !== 'production',
|
|
143
|
+
rootDir: process.cwd(),
|
|
144
|
+
...options,
|
|
145
|
+
};
|
|
146
|
+
// If running in Connect/Vite environment, register compatibility middleware first
|
|
147
|
+
// This adds Express-like methods (res.status, res.json, req.query) to the request/response
|
|
148
|
+
if (isConnectServer(server)) {
|
|
149
|
+
server.use((req, res, next) => {
|
|
150
|
+
enhanceForCompat(req, res);
|
|
151
|
+
next();
|
|
152
|
+
});
|
|
153
|
+
console.log('[Middleware] Registered Express compatibility layer for Connect/Vite');
|
|
154
|
+
}
|
|
155
|
+
// 合并默认中间件和用户提供的中间件
|
|
156
|
+
const allMiddlewares = [...middlewares];
|
|
157
|
+
for (const middleware of allMiddlewares) {
|
|
158
|
+
// Check if middleware should be enabled
|
|
159
|
+
if (middleware.enabled && !middleware.enabled(context)) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
// Check if both createRouter and createHandler are provided (type-unsafe case)
|
|
164
|
+
const hasCreateRouter = 'createRouter' in middleware && typeof middleware.createRouter === 'function';
|
|
165
|
+
const hasCreateHandler = 'createHandler' in middleware && typeof middleware.createHandler === 'function';
|
|
166
|
+
if (hasCreateRouter && hasCreateHandler) {
|
|
167
|
+
console.warn(`[Middleware] ${middleware.name}: Both createRouter and createHandler provided. ` +
|
|
168
|
+
`Using createRouter and ignoring createHandler.`);
|
|
169
|
+
}
|
|
170
|
+
if (isRouteMiddleware(middleware)) {
|
|
171
|
+
registerRouteMiddleware(server, middleware, context);
|
|
172
|
+
}
|
|
173
|
+
else if (isGlobalMiddleware(middleware)) {
|
|
174
|
+
registerGlobalMiddleware(server, middleware, context);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Type-unsafe middleware that has neither createRouter nor createHandler
|
|
178
|
+
console.error(`[Middleware] ${middleware.name || 'unknown'}: Must provide either createRouter or createHandler.`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error(`[Middleware] Failed to register ${middleware.name}:`, error);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// openapi / collect-logs middleware 没搬过来 (preset 用不到), 只保留 dev-logs
|
|
187
|
+
var dev_logs_1 = require("./dev-logs");
|
|
188
|
+
Object.defineProperty(exports, "createDevLogsMiddleware", { enumerable: true, get: function () { return dev_logs_1.createDevLogsMiddleware; } });
|
|
189
|
+
// Export compat utilities for controllers that want to explicitly use them
|
|
190
|
+
var compat_1 = require("./compat");
|
|
191
|
+
Object.defineProperty(exports, "sendJson", { enumerable: true, get: function () { return compat_1.sendJson; } });
|
|
192
|
+
Object.defineProperty(exports, "sendError", { enumerable: true, get: function () { return compat_1.sendError; } });
|
|
193
|
+
Object.defineProperty(exports, "sendSuccess", { enumerable: true, get: function () { return compat_1.sendSuccess; } });
|
|
194
|
+
Object.defineProperty(exports, "getQuery", { enumerable: true, get: function () { return compat_1.getQuery; } });
|
|
195
|
+
Object.defineProperty(exports, "getQueryParam", { enumerable: true, get: function () { return compat_1.getQueryParam; } });
|
|
196
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/server-log/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { Application, Router, RequestHandler } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Shared context passed to all middlewares
|
|
4
|
+
*/
|
|
5
|
+
export interface MiddlewareContext {
|
|
6
|
+
/** Base path for the application (e.g., '/', '/app') */
|
|
7
|
+
basePath: string;
|
|
8
|
+
/** Whether running in development mode */
|
|
9
|
+
isDev: boolean;
|
|
10
|
+
/** Root directory of the project */
|
|
11
|
+
rootDir: string;
|
|
12
|
+
/** Additional custom options */
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Express-compatible app (rspack/webpack dev server)
|
|
17
|
+
*/
|
|
18
|
+
export type ExpressApp = Application;
|
|
19
|
+
/**
|
|
20
|
+
* Vite-compatible middleware handler (Connect server)
|
|
21
|
+
* Using 'any' to avoid dependency on vite types
|
|
22
|
+
*/
|
|
23
|
+
export type ViteMiddleware = any;
|
|
24
|
+
/**
|
|
25
|
+
* Route registration info for better visibility
|
|
26
|
+
*/
|
|
27
|
+
export interface RouteInfo {
|
|
28
|
+
/** HTTP method (GET, POST, etc.) or '*' for all methods */
|
|
29
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'ALL' | '*';
|
|
30
|
+
/** Route path (relative to mount point) */
|
|
31
|
+
path: string;
|
|
32
|
+
/** Description of what this route does */
|
|
33
|
+
description: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Route-based middleware
|
|
37
|
+
* Mounts a router at a specific path
|
|
38
|
+
*/
|
|
39
|
+
export interface RouteMiddleware {
|
|
40
|
+
/** Unique name for this middleware */
|
|
41
|
+
name: string;
|
|
42
|
+
/**
|
|
43
|
+
* Mount path for this middleware (relative to basePath)
|
|
44
|
+
* e.g., '/dev/logs', '/openapi.json'
|
|
45
|
+
* Required for route-based middlewares
|
|
46
|
+
*/
|
|
47
|
+
mountPath: string;
|
|
48
|
+
/**
|
|
49
|
+
* List of routes provided by this middleware
|
|
50
|
+
* Useful for debugging and documentation
|
|
51
|
+
*/
|
|
52
|
+
routes?: RouteInfo[];
|
|
53
|
+
/**
|
|
54
|
+
* Determine if this middleware should be enabled
|
|
55
|
+
* @param context - Shared context
|
|
56
|
+
* @returns true if middleware should be registered
|
|
57
|
+
*/
|
|
58
|
+
enabled?: (context: MiddlewareContext) => boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Create router for this middleware
|
|
61
|
+
* @param context - Shared context
|
|
62
|
+
* @returns Express Router
|
|
63
|
+
*/
|
|
64
|
+
createRouter: (context: MiddlewareContext) => Router;
|
|
65
|
+
/** Explicitly disallow createHandler for route middleware */
|
|
66
|
+
createHandler?: never;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Global middleware
|
|
70
|
+
* Applies to all requests without a specific mount path
|
|
71
|
+
*/
|
|
72
|
+
export interface GlobalMiddleware {
|
|
73
|
+
/** Unique name for this middleware */
|
|
74
|
+
name: string;
|
|
75
|
+
/**
|
|
76
|
+
* Global middlewares should not have a mount path
|
|
77
|
+
* If you need path-specific behavior, use RouteMiddleware instead
|
|
78
|
+
*/
|
|
79
|
+
mountPath?: never;
|
|
80
|
+
/**
|
|
81
|
+
* Determine if this middleware should be enabled
|
|
82
|
+
* @param context - Shared context
|
|
83
|
+
* @returns true if middleware should be registered
|
|
84
|
+
*/
|
|
85
|
+
enabled?: (context: MiddlewareContext) => boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Create handler for this middleware
|
|
88
|
+
* @param context - Shared context
|
|
89
|
+
* @returns Express request handler
|
|
90
|
+
*/
|
|
91
|
+
createHandler: (context: MiddlewareContext) => RequestHandler;
|
|
92
|
+
/** Explicitly disallow createRouter for global middleware */
|
|
93
|
+
createRouter?: never;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Middleware can be either route-based or global
|
|
97
|
+
*/
|
|
98
|
+
export type Middleware = RouteMiddleware | GlobalMiddleware;
|
|
99
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server-log/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC;AAErC;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;IAClE,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC;IAElD;;;;OAIG;IACH,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,MAAM,CAAC;IAErD,6DAA6D;IAC7D,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC;IAElB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC;IAElD;;;;OAIG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,cAAc,CAAC;IAE9D,6DAA6D;IAC7D,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server-log/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地开发总开关。
|
|
3
|
+
*
|
|
4
|
+
* 由 `dev-local.sh`(平台 CLI `miaoda app sync` 同步到项目)export `MIAODA_LOCAL_DEV=1`。
|
|
5
|
+
* 沙箱 dev / 生产都不设此 env,所以本地专属逻辑(view-context 占位填充、__runtime__ 反代沙箱)
|
|
6
|
+
* 只在用户本机 `npm run dev:local` 时启用,沙箱 / 生产行为完全不受影响。
|
|
7
|
+
*/
|
|
8
|
+
export declare function isLocalDev(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 反代沙箱时的认证组装。两条入口:
|
|
11
|
+
* - 新流(推荐):env `FORCE_AUTHN_PREVIEW_SESSION_ID` —— 后端下发的单值 session(实际是
|
|
12
|
+
* X-Force-Runtime-Session 的值)。SDK 自动拼 cookie,suda-csrf-token 用本地常量。
|
|
13
|
+
* - 老流(兼容):env `SANDBOX_COOKIE` —— 用户从浏览器手抠的完整 cookie 字符串(包含
|
|
14
|
+
* X-Force-Runtime-Session / suda-csrf-token / suda_web_did 等)。原样透传,suda-csrf-token
|
|
15
|
+
* 从其中正则提取作为出向 x-suda-csrf-token header。
|
|
16
|
+
*
|
|
17
|
+
* 两个都给的话 `SANDBOX_COOKIE` 优先("已显式拼好"信号更强)。两个都缺的话返回空字符串
|
|
18
|
+
* (local dev 跑不通,但不抛错——交给上层 `localDev && sandboxBase` 条件兜底)。
|
|
19
|
+
*/
|
|
20
|
+
export declare function composeSandboxOutboundAuth(): {
|
|
21
|
+
cookie: string;
|
|
22
|
+
csrfToken: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* 解析沙箱反代的 target origin。两条入口:
|
|
26
|
+
* - 新流(推荐):env `MIAODA_DEV_PLATFORM_BASE` —— 后端下发的完整 URL,**可能带路径前缀**
|
|
27
|
+
* (例如 `https://ai-tenant-<app>-<sandbox>.aiforce-boe-preview.bytedance.net/app/<app>`)。
|
|
28
|
+
* SDK 抽 `new URL(...).origin` 拿 host,扔掉路径——避免反代 target 双前缀。
|
|
29
|
+
* - 老流(兼容):env `SANDBOX_COOKIE` 配套用的 `SANDBOX_PUBLIC_URL`(用户从沙箱信息手抠 host)。
|
|
30
|
+
*
|
|
31
|
+
* 两个都给的话 `MIAODA_DEV_PLATFORM_BASE` 优先。两个都缺的话返回空字符串
|
|
32
|
+
* (local dev 跑不通,但不抛错——交给上层 `localDev && sandboxBase` 条件兜底)。
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveSandboxOrigin(): string;
|
|
35
|
+
/**
|
|
36
|
+
* 解析 `process.env.SUDA_WEBUSER`,容忍沙箱下发的 shell-quoted JSON。
|
|
37
|
+
*
|
|
38
|
+
* 沙箱 env pull 下发到 .env.local 的 SUDA_WEBUSER 是双引号包裹 + 内部 `\"` 转义;
|
|
39
|
+
* dotenv@17 剥外层引号后**不还原**内部 `\"`,导致 `process.env.SUDA_WEBUSER` 是
|
|
40
|
+
* `{\"user_id\":\"...\"}` 这种带反斜杠的字符串,直接 JSON.parse 会挂在
|
|
41
|
+
* `Expected property name or '}' in JSON at position 1`。
|
|
42
|
+
*
|
|
43
|
+
* 容错:先直接 parse;失败再 unescape `\"` 后 parse;都失败返回 null。
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseSudaWebUserEnv<T = unknown>(raw: string | undefined): T | null;
|
|
46
|
+
//# sourceMappingURL=local-dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-dev.d.ts","sourceRoot":"","sources":["../../src/utils/local-dev.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAIpC;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAclF;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAU7C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,GAAG,IAAI,CAYlF"}
|