@hyprcart/app-testing 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/README.md +5 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { HyprcartFixturePack } from '@hyprcart/app-sdk';
|
|
2
|
+
|
|
3
|
+
declare const defaultFixturePacks: HyprcartFixturePack[];
|
|
4
|
+
|
|
5
|
+
interface PreviewDiagnostic {
|
|
6
|
+
requestId: string;
|
|
7
|
+
surface: string;
|
|
8
|
+
quotaClass: string;
|
|
9
|
+
fixtureId: string;
|
|
10
|
+
level: "info" | "warning" | "error";
|
|
11
|
+
message: string;
|
|
12
|
+
data?: unknown;
|
|
13
|
+
}
|
|
14
|
+
declare function redactedDiagnostic(diagnostic: PreviewDiagnostic): PreviewDiagnostic;
|
|
15
|
+
|
|
16
|
+
interface PreviewServerState {
|
|
17
|
+
fixtures: HyprcartFixturePack[];
|
|
18
|
+
diagnostics: PreviewDiagnostic[];
|
|
19
|
+
remoteVersionCreated: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare function createPreviewServer(fixtures?: HyprcartFixturePack[]): PreviewServerState;
|
|
22
|
+
declare function previewSurface(state: PreviewServerState, surface: string, fixtureId?: string | undefined): Promise<{
|
|
23
|
+
html: string;
|
|
24
|
+
requestId: string;
|
|
25
|
+
}>;
|
|
26
|
+
|
|
27
|
+
declare function findForbiddenInternalImports(files: Record<string, string>): string[];
|
|
28
|
+
|
|
29
|
+
interface PlaywrightEvidenceRow {
|
|
30
|
+
rowId: string;
|
|
31
|
+
url: string;
|
|
32
|
+
status: "pass" | "fail" | "blocked";
|
|
33
|
+
requestIds: string[];
|
|
34
|
+
notes: string;
|
|
35
|
+
}
|
|
36
|
+
declare function recordEvidence(row: PlaywrightEvidenceRow): PlaywrightEvidenceRow;
|
|
37
|
+
|
|
38
|
+
interface DriftInput {
|
|
39
|
+
docsCommands: string[];
|
|
40
|
+
cliCommands: string[];
|
|
41
|
+
templateNames: string[];
|
|
42
|
+
schemaOperations: string[];
|
|
43
|
+
}
|
|
44
|
+
declare function findDeveloperToolingDrift(input: DriftInput): string[];
|
|
45
|
+
|
|
46
|
+
interface PerformanceBudget {
|
|
47
|
+
name: string;
|
|
48
|
+
actualMs: number;
|
|
49
|
+
budgetMs: number;
|
|
50
|
+
}
|
|
51
|
+
declare function evaluateBudgets(budgets: PerformanceBudget[]): {
|
|
52
|
+
ok: boolean;
|
|
53
|
+
name: string;
|
|
54
|
+
actualMs: number;
|
|
55
|
+
budgetMs: number;
|
|
56
|
+
}[];
|
|
57
|
+
|
|
58
|
+
export { type DriftInput, type PerformanceBudget, type PlaywrightEvidenceRow, type PreviewDiagnostic, type PreviewServerState, createPreviewServer, defaultFixturePacks, evaluateBudgets, findDeveloperToolingDrift, findForbiddenInternalImports, previewSurface, recordEvidence, redactedDiagnostic };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// src/fixtures/default-packs.ts
|
|
2
|
+
import { createDefaultFixturePack } from "@hyprcart/app-sdk";
|
|
3
|
+
var defaultFixturePacks = [
|
|
4
|
+
createDefaultFixturePack(),
|
|
5
|
+
createDefaultFixturePack({
|
|
6
|
+
id: "fixture_de",
|
|
7
|
+
name: "German storefront fixture",
|
|
8
|
+
locale: "de",
|
|
9
|
+
market: "DE"
|
|
10
|
+
}),
|
|
11
|
+
createDefaultFixturePack({
|
|
12
|
+
id: "fixture_b2b",
|
|
13
|
+
name: "B2B customer fixture",
|
|
14
|
+
customerSegment: { id: "segment_b2b", tags: ["b2b", "approved"] }
|
|
15
|
+
})
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
// src/preview-server/diagnostics.ts
|
|
19
|
+
import { redact } from "@hyprcart/app-sdk";
|
|
20
|
+
function redactedDiagnostic(diagnostic) {
|
|
21
|
+
return {
|
|
22
|
+
...diagnostic,
|
|
23
|
+
message: String(redact(diagnostic.message)),
|
|
24
|
+
data: redact(diagnostic.data)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/preview-server/server.ts
|
|
29
|
+
import { createSurfaceContext, renderSurface } from "@hyprcart/app-sdk";
|
|
30
|
+
function createPreviewServer(fixtures = defaultFixturePacks) {
|
|
31
|
+
return {
|
|
32
|
+
fixtures,
|
|
33
|
+
diagnostics: [],
|
|
34
|
+
remoteVersionCreated: false
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function previewSurface(state, surface, fixtureId = state.fixtures[0]?.id) {
|
|
38
|
+
const fixture = state.fixtures.find((candidate) => candidate.id === fixtureId) ?? state.fixtures[0];
|
|
39
|
+
if (!fixture) {
|
|
40
|
+
throw new Error("No preview fixtures are available.");
|
|
41
|
+
}
|
|
42
|
+
const context = createSurfaceContext({ surface, fixture });
|
|
43
|
+
const result = await renderSurface(context, () => `<div data-hyprcart-preview="${surface}">${fixture.name}</div>`);
|
|
44
|
+
state.diagnostics.push(
|
|
45
|
+
redactedDiagnostic({
|
|
46
|
+
requestId: context.requestId,
|
|
47
|
+
surface,
|
|
48
|
+
quotaClass: "local-preview",
|
|
49
|
+
fixtureId: fixture.id,
|
|
50
|
+
level: "info",
|
|
51
|
+
message: "Preview rendered."
|
|
52
|
+
})
|
|
53
|
+
);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/clean-room/no-internal-imports.ts
|
|
58
|
+
var forbiddenPatterns = [/from\s+["']\.\.\/\.\.\/apps\//, /from\s+["']apps\//, /@repo\/(?!typescript-config)/];
|
|
59
|
+
function findForbiddenInternalImports(files) {
|
|
60
|
+
return Object.entries(files).filter(([, content]) => forbiddenPatterns.some((pattern) => pattern.test(content))).map(([path]) => path);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/playwright/production/evidence.ts
|
|
64
|
+
import { redact as redact2 } from "@hyprcart/app-sdk";
|
|
65
|
+
function recordEvidence(row) {
|
|
66
|
+
return redact2(row);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/drift/developer-tooling-drift.ts
|
|
70
|
+
function findDeveloperToolingDrift(input) {
|
|
71
|
+
const drift = [];
|
|
72
|
+
for (const command of input.docsCommands) {
|
|
73
|
+
if (!input.cliCommands.includes(command)) {
|
|
74
|
+
drift.push(`docs command missing from CLI: ${command}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
for (const template of input.templateNames) {
|
|
78
|
+
if (!input.schemaOperations.includes("appTemplates")) {
|
|
79
|
+
drift.push(`template metadata not exposed by schema: ${template}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return drift;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/performance/developer-tooling-performance.ts
|
|
86
|
+
function evaluateBudgets(budgets) {
|
|
87
|
+
return budgets.map((budget) => ({
|
|
88
|
+
...budget,
|
|
89
|
+
ok: budget.actualMs <= budget.budgetMs
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
createPreviewServer,
|
|
94
|
+
defaultFixturePacks,
|
|
95
|
+
evaluateBudgets,
|
|
96
|
+
findDeveloperToolingDrift,
|
|
97
|
+
findForbiddenInternalImports,
|
|
98
|
+
previewSurface,
|
|
99
|
+
recordEvidence,
|
|
100
|
+
redactedDiagnostic
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/fixtures/default-packs.ts","../src/preview-server/diagnostics.ts","../src/preview-server/server.ts","../src/clean-room/no-internal-imports.ts","../src/playwright/production/evidence.ts","../src/drift/developer-tooling-drift.ts","../src/performance/developer-tooling-performance.ts"],"sourcesContent":["import { createDefaultFixturePack, type HyprcartFixturePack } from \"@hyprcart/app-sdk\";\n\nexport const defaultFixturePacks: HyprcartFixturePack[] = [\n createDefaultFixturePack(),\n createDefaultFixturePack({\n id: \"fixture_de\",\n name: \"German storefront fixture\",\n locale: \"de\",\n market: \"DE\",\n }),\n createDefaultFixturePack({\n id: \"fixture_b2b\",\n name: \"B2B customer fixture\",\n customerSegment: { id: \"segment_b2b\", tags: [\"b2b\", \"approved\"] },\n }),\n];\n","import { redact } from \"@hyprcart/app-sdk\";\n\nexport interface PreviewDiagnostic {\n requestId: string;\n surface: string;\n quotaClass: string;\n fixtureId: string;\n level: \"info\" | \"warning\" | \"error\";\n message: string;\n data?: unknown;\n}\n\nexport function redactedDiagnostic(diagnostic: PreviewDiagnostic): PreviewDiagnostic {\n return {\n ...diagnostic,\n message: String(redact(diagnostic.message)),\n data: redact(diagnostic.data),\n };\n}\n","import { createSurfaceContext, renderSurface, type HyprcartFixturePack } from \"@hyprcart/app-sdk\";\nimport { defaultFixturePacks } from \"../fixtures/default-packs\";\nimport { redactedDiagnostic, type PreviewDiagnostic } from \"./diagnostics\";\n\nexport interface PreviewServerState {\n fixtures: HyprcartFixturePack[];\n diagnostics: PreviewDiagnostic[];\n remoteVersionCreated: boolean;\n}\n\nexport function createPreviewServer(fixtures = defaultFixturePacks): PreviewServerState {\n return {\n fixtures,\n diagnostics: [],\n remoteVersionCreated: false,\n };\n}\n\nexport async function previewSurface(state: PreviewServerState, surface: string, fixtureId = state.fixtures[0]?.id) {\n const fixture = state.fixtures.find((candidate) => candidate.id === fixtureId) ?? state.fixtures[0];\n if (!fixture) {\n throw new Error(\"No preview fixtures are available.\");\n }\n\n const context = createSurfaceContext({ surface, fixture });\n const result = await renderSurface(context, () => `<div data-hyprcart-preview=\"${surface}\">${fixture.name}</div>`);\n state.diagnostics.push(\n redactedDiagnostic({\n requestId: context.requestId,\n surface,\n quotaClass: \"local-preview\",\n fixtureId: fixture.id,\n level: \"info\",\n message: \"Preview rendered.\",\n }),\n );\n return result;\n}\n","const forbiddenPatterns = [/from\\s+[\"']\\.\\.\\/\\.\\.\\/apps\\//, /from\\s+[\"']apps\\//, /@repo\\/(?!typescript-config)/];\n\nexport function findForbiddenInternalImports(files: Record<string, string>): string[] {\n return Object.entries(files)\n .filter(([, content]) => forbiddenPatterns.some((pattern) => pattern.test(content)))\n .map(([path]) => path);\n}\n","import { redact } from \"@hyprcart/app-sdk\";\n\nexport interface PlaywrightEvidenceRow {\n rowId: string;\n url: string;\n status: \"pass\" | \"fail\" | \"blocked\";\n requestIds: string[];\n notes: string;\n}\n\nexport function recordEvidence(row: PlaywrightEvidenceRow): PlaywrightEvidenceRow {\n return redact(row) as PlaywrightEvidenceRow;\n}\n","export interface DriftInput {\n docsCommands: string[];\n cliCommands: string[];\n templateNames: string[];\n schemaOperations: string[];\n}\n\nexport function findDeveloperToolingDrift(input: DriftInput): string[] {\n const drift: string[] = [];\n for (const command of input.docsCommands) {\n if (!input.cliCommands.includes(command)) {\n drift.push(`docs command missing from CLI: ${command}`);\n }\n }\n for (const template of input.templateNames) {\n if (!input.schemaOperations.includes(\"appTemplates\")) {\n drift.push(`template metadata not exposed by schema: ${template}`);\n }\n }\n return drift;\n}\n","export interface PerformanceBudget {\n name: string;\n actualMs: number;\n budgetMs: number;\n}\n\nexport function evaluateBudgets(budgets: PerformanceBudget[]) {\n return budgets.map((budget) => ({\n ...budget,\n ok: budget.actualMs <= budget.budgetMs,\n }));\n}\n"],"mappings":";AAAA,SAAS,gCAA0D;AAE5D,IAAM,sBAA6C;AAAA,EACxD,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,IACvB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,yBAAyB;AAAA,IACvB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,iBAAiB,EAAE,IAAI,eAAe,MAAM,CAAC,OAAO,UAAU,EAAE;AAAA,EAClE,CAAC;AACH;;;ACfA,SAAS,cAAc;AAYhB,SAAS,mBAAmB,YAAkD;AACnF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,OAAO,OAAO,WAAW,OAAO,CAAC;AAAA,IAC1C,MAAM,OAAO,WAAW,IAAI;AAAA,EAC9B;AACF;;;AClBA,SAAS,sBAAsB,qBAA+C;AAUvE,SAAS,oBAAoB,WAAW,qBAAyC;AACtF,SAAO;AAAA,IACL;AAAA,IACA,aAAa,CAAC;AAAA,IACd,sBAAsB;AAAA,EACxB;AACF;AAEA,eAAsB,eAAe,OAA2B,SAAiB,YAAY,MAAM,SAAS,CAAC,GAAG,IAAI;AAClH,QAAM,UAAU,MAAM,SAAS,KAAK,CAAC,cAAc,UAAU,OAAO,SAAS,KAAK,MAAM,SAAS,CAAC;AAClG,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,UAAU,qBAAqB,EAAE,SAAS,QAAQ,CAAC;AACzD,QAAM,SAAS,MAAM,cAAc,SAAS,MAAM,+BAA+B,OAAO,KAAK,QAAQ,IAAI,QAAQ;AACjH,QAAM,YAAY;AAAA,IAChB,mBAAmB;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,YAAY;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;ACrCA,IAAM,oBAAoB,CAAC,iCAAiC,qBAAqB,8BAA8B;AAExG,SAAS,6BAA6B,OAAyC;AACpF,SAAO,OAAO,QAAQ,KAAK,EACxB,OAAO,CAAC,CAAC,EAAE,OAAO,MAAM,kBAAkB,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC,CAAC,EAClF,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACzB;;;ACNA,SAAS,UAAAA,eAAc;AAUhB,SAAS,eAAe,KAAmD;AAChF,SAAOA,QAAO,GAAG;AACnB;;;ACLO,SAAS,0BAA0B,OAA6B;AACrE,QAAM,QAAkB,CAAC;AACzB,aAAW,WAAW,MAAM,cAAc;AACxC,QAAI,CAAC,MAAM,YAAY,SAAS,OAAO,GAAG;AACxC,YAAM,KAAK,kCAAkC,OAAO,EAAE;AAAA,IACxD;AAAA,EACF;AACA,aAAW,YAAY,MAAM,eAAe;AAC1C,QAAI,CAAC,MAAM,iBAAiB,SAAS,cAAc,GAAG;AACpD,YAAM,KAAK,4CAA4C,QAAQ,EAAE;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AACT;;;ACdO,SAAS,gBAAgB,SAA8B;AAC5D,SAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,IAC9B,GAAG;AAAA,IACH,IAAI,OAAO,YAAY,OAAO;AAAA,EAChC,EAAE;AACJ;","names":["redact"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hyprcart/app-testing",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Testing fixtures, preview helpers, and clean-room checks for Hyprcart apps.",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"registry": "https://registry.npmjs.org/"
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@hyprcart/app-manifest": "1.0.0",
|
|
25
|
+
"@hyprcart/app-sdk": "1.0.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.10.5",
|
|
29
|
+
"tsup": "^8.3.5",
|
|
30
|
+
"typescript": "^5.7.2",
|
|
31
|
+
"vitest": "^4.0.18",
|
|
32
|
+
"@repo/typescript-config": "0.0.1"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"dev": "tsup --watch",
|
|
37
|
+
"lint": "tsc --noEmit",
|
|
38
|
+
"type-check": "tsc --noEmit",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"clean": "rm -rf dist .turbo"
|
|
41
|
+
}
|
|
42
|
+
}
|