@passelin/mock-bff 0.4.2
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/LICENSE +21 -0
- package/README.md +185 -0
- package/admin/dist/assets/bff_candy_heart-tUzGTaBH.svg +1 -0
- package/admin/dist/assets/index-DqEQC4bI.js +268 -0
- package/admin/dist/assets/index-QJ-IaVhl.js +256 -0
- package/admin/dist/assets/index-tkgDpq0U.css +1 -0
- package/admin/dist/index.html +18 -0
- package/dist/ai.js +289 -0
- package/dist/app.js +869 -0
- package/dist/cli.js +94 -0
- package/dist/har.js +106 -0
- package/dist/matcher.js +41 -0
- package/dist/openapi.js +116 -0
- package/dist/server.js +16 -0
- package/dist/storage.js +257 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +62 -0
- package/package.json +81 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export function normalizePath(pathname) {
|
|
3
|
+
if (!pathname || pathname === "/")
|
|
4
|
+
return "/";
|
|
5
|
+
const cleaned = pathname.replace(/\/+/g, "/");
|
|
6
|
+
return cleaned.endsWith("/") ? cleaned.slice(0, -1) : cleaned;
|
|
7
|
+
}
|
|
8
|
+
export function canonicalize(value) {
|
|
9
|
+
if (value === null || value === undefined)
|
|
10
|
+
return "";
|
|
11
|
+
if (typeof value !== "object")
|
|
12
|
+
return String(value);
|
|
13
|
+
if (Array.isArray(value)) {
|
|
14
|
+
return `[${value.map((v) => canonicalize(v)).join(",")}]`;
|
|
15
|
+
}
|
|
16
|
+
const entries = Object.entries(value)
|
|
17
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
18
|
+
.map(([k, v]) => `${k}:${canonicalize(v)}`);
|
|
19
|
+
return `{${entries.join(",")}}`;
|
|
20
|
+
}
|
|
21
|
+
export function shortHash(input) {
|
|
22
|
+
return createHash("sha1").update(input).digest("hex").slice(0, 8);
|
|
23
|
+
}
|
|
24
|
+
export function safePathKey(pathname) {
|
|
25
|
+
return normalizePath(pathname)
|
|
26
|
+
.replace(/^\//, "")
|
|
27
|
+
.replace(/\//g, "__") || "root";
|
|
28
|
+
}
|
|
29
|
+
export function normalizeQuery(query, ignoredKeys) {
|
|
30
|
+
const ignored = new Set(ignoredKeys);
|
|
31
|
+
const out = {};
|
|
32
|
+
for (const key of Object.keys(query).sort((a, b) => a.localeCompare(b))) {
|
|
33
|
+
if (ignored.has(key))
|
|
34
|
+
continue;
|
|
35
|
+
out[key] = query[key];
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
export function redactHeaders(headers, redactList) {
|
|
40
|
+
const out = { ...headers };
|
|
41
|
+
const redact = new Set(redactList.map((v) => v.toLowerCase()));
|
|
42
|
+
for (const key of Object.keys(out)) {
|
|
43
|
+
if (redact.has(key.toLowerCase()))
|
|
44
|
+
out[key] = "[REDACTED]";
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
export function redactJsonValue(value, redactKeys) {
|
|
49
|
+
if (value === null || value === undefined)
|
|
50
|
+
return value;
|
|
51
|
+
if (Array.isArray(value))
|
|
52
|
+
return value.map((v) => redactJsonValue(v, redactKeys));
|
|
53
|
+
if (typeof value !== "object")
|
|
54
|
+
return value;
|
|
55
|
+
const redact = new Set(redactKeys.map((k) => k.toLowerCase()));
|
|
56
|
+
const obj = value;
|
|
57
|
+
const out = {};
|
|
58
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
59
|
+
out[key] = redact.has(key.toLowerCase()) ? "[REDACTED]" : redactJsonValue(val, redactKeys);
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@passelin/mock-bff",
|
|
3
|
+
"version": "0.4.2",
|
|
4
|
+
"description": "Mock BFF server for UI modernization using HAR/OpenAPI + AI fallback",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mock-bff": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"admin/dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"dev": "concurrently --names server,admin --prefix-colors blue,green \"tsx watch src/server.ts\" \"vite build --watch --config admin/vite.config.ts\"",
|
|
17
|
+
"dev:server": "tsx watch src/server.ts",
|
|
18
|
+
"dev:admin": "vite --config admin/vite.config.ts",
|
|
19
|
+
"prebuild": "rm -rf dist admin/dist",
|
|
20
|
+
"build": "tsc -p tsconfig.json && npm run build:admin",
|
|
21
|
+
"build:admin": "vite build --config admin/vite.config.ts",
|
|
22
|
+
"start": "node dist/server.js",
|
|
23
|
+
"start:cli": "node dist/cli.js",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"pack:check": "npm pack --dry-run"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"mock",
|
|
30
|
+
"bff",
|
|
31
|
+
"har",
|
|
32
|
+
"openapi",
|
|
33
|
+
"ui-testing"
|
|
34
|
+
],
|
|
35
|
+
"author": "Pierre Asselin",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/passelin/mock-bff.git"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/passelin/mock-bff#readme",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/passelin/mock-bff/issues"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=20"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@ai-sdk/anthropic": "^3.0.63",
|
|
50
|
+
"@ai-sdk/openai": "^3.0.47",
|
|
51
|
+
"@fastify/cors": "^11.2.0",
|
|
52
|
+
"@fastify/multipart": "^9.0.1",
|
|
53
|
+
"@fastify/static": "^9.0.0",
|
|
54
|
+
"ai": "^6.0.134",
|
|
55
|
+
"ai-sdk-ollama": "~3.0.0",
|
|
56
|
+
"ajv": "^8.17.1",
|
|
57
|
+
"dotenv": "^16.6.1",
|
|
58
|
+
"fastify": "^5.0.0",
|
|
59
|
+
"js-yaml": "^4.1.0",
|
|
60
|
+
"zod": "^4.3.6"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/js-yaml": "^4.0.9",
|
|
64
|
+
"@types/node": "^25.5.0",
|
|
65
|
+
"@types/react": "^19.2.14",
|
|
66
|
+
"@vitejs/plugin-react": "^5.0.4",
|
|
67
|
+
"autoprefixer": "^10.4.27",
|
|
68
|
+
"concurrently": "^9.2.1",
|
|
69
|
+
"lucide-react": "^0.577.0",
|
|
70
|
+
"postcss": "^8.5.8",
|
|
71
|
+
"react": "^19.2.4",
|
|
72
|
+
"react-dom": "^19.2.4",
|
|
73
|
+
"react-router-dom": "^7.13.1",
|
|
74
|
+
"swagger-ui-react": "^5.27.0",
|
|
75
|
+
"tailwindcss": "^3.4.17",
|
|
76
|
+
"tsx": "^4.19.2",
|
|
77
|
+
"typescript": "^5.7.2",
|
|
78
|
+
"vite": "^5.4.21",
|
|
79
|
+
"vitest": "^4.1.0"
|
|
80
|
+
}
|
|
81
|
+
}
|