@ekairos/testing 1.21.90-beta.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.
@@ -0,0 +1,244 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { initRunContext, copyArtifact, safeFileName, } from "./core.js";
4
+ import { captureLocalWorkflowTrace, recordWorkflowRun, resolveWorkflowDataDir } from "./story.js";
5
+ function statusFromResult(result) {
6
+ if (result.status === "passed")
7
+ return "passed";
8
+ if (result.status === "skipped")
9
+ return "skipped";
10
+ return "failed";
11
+ }
12
+ function caseIdFor(test) {
13
+ const file = test.location?.file || "unknown";
14
+ const titlePath = test.titlePath().join(" :: ");
15
+ return `pw::${file}::${titlePath}`;
16
+ }
17
+ export class EkairosPlaywrightReporter {
18
+ constructor(options = {}) {
19
+ this.ctx = initRunContext("playwright");
20
+ this.artifactSeq = 0;
21
+ this.workflowRunIds = new Set();
22
+ this.options = options;
23
+ }
24
+ onBegin(_suite) {
25
+ this.ctx = initRunContext("playwright", this.options);
26
+ if (typeof _suite?.allTests === "function") {
27
+ this.ctx.summary.total = _suite.allTests().length;
28
+ }
29
+ }
30
+ onTestEnd(test, result) {
31
+ const status = statusFromResult(result);
32
+ if (status === "passed")
33
+ this.ctx.summary.passed += 1;
34
+ if (status === "failed")
35
+ this.ctx.summary.failed += 1;
36
+ if (status === "skipped")
37
+ this.ctx.summary.skipped += 1;
38
+ const attachments = [];
39
+ for (const attachment of result.attachments || []) {
40
+ if (!attachment.path)
41
+ continue;
42
+ const artifactId = `artifact_${String(++this.artifactSeq).padStart(4, "0")}`;
43
+ const baseName = safeFileName(path.basename(attachment.path));
44
+ const fileName = `${artifactId}_${baseName}`;
45
+ const destDir = path.join(this.ctx.runDir, "artifacts");
46
+ const { destPath, size } = copyArtifact(attachment.path, destDir, fileName);
47
+ const record = {
48
+ artifactId,
49
+ type: attachment.name || "attachment",
50
+ path: path.relative(this.ctx.runDir, destPath),
51
+ mime: attachment.contentType || "application/octet-stream",
52
+ size,
53
+ testCaseId: caseIdFor(test),
54
+ createdAt: new Date().toISOString(),
55
+ };
56
+ this.ctx.addArtifact(record);
57
+ attachments.push(artifactId);
58
+ }
59
+ this.ctx.writeResult({
60
+ schemaVersion: "1.0",
61
+ runId: this.ctx.runId,
62
+ caseId: caseIdFor(test),
63
+ title: test.title,
64
+ file: test.location?.file,
65
+ line: test.location?.line,
66
+ status,
67
+ durationMs: result.duration,
68
+ retry: result.retry,
69
+ startAt: result.startTime ? new Date(result.startTime).toISOString() : undefined,
70
+ endAt: new Date().toISOString(),
71
+ attachments,
72
+ });
73
+ }
74
+ onStdOut(chunk, test) {
75
+ this.tryCaptureWorkflowIds(chunk.toString(), test);
76
+ this.ctx.writeLog({
77
+ schemaVersion: "1.0",
78
+ runId: this.ctx.runId,
79
+ level: "info",
80
+ source: "runner",
81
+ timestamp: new Date().toISOString(),
82
+ message: chunk.toString(),
83
+ testCaseId: test ? caseIdFor(test) : undefined,
84
+ });
85
+ }
86
+ onStdErr(chunk, test) {
87
+ this.tryCaptureWorkflowIds(chunk.toString(), test);
88
+ this.ctx.writeLog({
89
+ schemaVersion: "1.0",
90
+ runId: this.ctx.runId,
91
+ level: "error",
92
+ source: "runner",
93
+ timestamp: new Date().toISOString(),
94
+ message: chunk.toString(),
95
+ testCaseId: test ? caseIdFor(test) : undefined,
96
+ });
97
+ }
98
+ async onEnd() {
99
+ await this.captureWorkflowTraces();
100
+ const status = this.ctx.summary.failed > 0 ? "failed" : "passed";
101
+ this.ctx.finalize(status);
102
+ }
103
+ tryCaptureWorkflowIds(message, test) {
104
+ if (!this.isWorkflowCaptureEnabled())
105
+ return;
106
+ const caseId = test ? caseIdFor(test) : undefined;
107
+ const patterns = [
108
+ /workflowRunId[:=]\\s*([A-Za-z0-9_-]+)/gi,
109
+ /\\bwrun_[A-Za-z0-9_-]+\\b/gi,
110
+ ];
111
+ const found = [];
112
+ for (const pattern of patterns) {
113
+ let match;
114
+ while ((match = pattern.exec(message))) {
115
+ const id = match[1] || match[0];
116
+ if (id && !this.workflowRunIds.has(id)) {
117
+ this.workflowRunIds.add(id);
118
+ found.push(id);
119
+ recordWorkflowRun({ workflowRunId: id, source: "log", caseId });
120
+ }
121
+ }
122
+ }
123
+ if (found.length > 0) {
124
+ this.ctx.writeLog({
125
+ schemaVersion: "1.0",
126
+ runId: this.ctx.runId,
127
+ level: "info",
128
+ source: "runner",
129
+ timestamp: new Date().toISOString(),
130
+ message: `captured workflowRunId(s): ${found.join(", ")}`,
131
+ testCaseId: caseId,
132
+ });
133
+ }
134
+ }
135
+ isWorkflowCaptureEnabled() {
136
+ if (this.options.captureWorkflows === false)
137
+ return false;
138
+ const env = String(process.env.EKAIROS_DISABLE_WORKFLOW_CAPTURE || "").toLowerCase();
139
+ if (env === "1" || env === "true")
140
+ return false;
141
+ return true;
142
+ }
143
+ async captureWorkflowTraces() {
144
+ if (!this.isWorkflowCaptureEnabled())
145
+ return;
146
+ const dataDir = resolveWorkflowDataDir(this.options.workflowDataDir);
147
+ if (!fs.existsSync(dataDir)) {
148
+ this.ctx.writeLog({
149
+ schemaVersion: "1.0",
150
+ runId: this.ctx.runId,
151
+ level: "warn",
152
+ source: "runner",
153
+ timestamp: new Date().toISOString(),
154
+ message: `workflow trace capture skipped: local data dir not found (${dataDir})`,
155
+ });
156
+ return;
157
+ }
158
+ const indexPath = path.join(this.ctx.runDir, "workflows", "index.json");
159
+ const indexRuns = this.loadWorkflowIndex(indexPath);
160
+ const runIds = new Set([...this.workflowRunIds]);
161
+ for (const entry of indexRuns) {
162
+ if (entry.workflowRunId)
163
+ runIds.add(entry.workflowRunId);
164
+ }
165
+ for (const discovered of this.discoverLocalRunIds(dataDir)) {
166
+ runIds.add(discovered);
167
+ }
168
+ if (runIds.size === 0) {
169
+ this.ctx.writeLog({
170
+ schemaVersion: "1.0",
171
+ runId: this.ctx.runId,
172
+ level: "warn",
173
+ source: "runner",
174
+ timestamp: new Date().toISOString(),
175
+ message: "workflow trace capture skipped: no workflow run ids found",
176
+ });
177
+ return;
178
+ }
179
+ for (const workflowRunId of runIds) {
180
+ try {
181
+ captureLocalWorkflowTrace({
182
+ workflowRunId,
183
+ dataDir,
184
+ outputDir: this.ctx.outputDir,
185
+ runId: this.ctx.runId,
186
+ source: "auto",
187
+ });
188
+ }
189
+ catch (err) {
190
+ const msg = err instanceof Error ? err.message : String(err);
191
+ this.ctx.writeLog({
192
+ schemaVersion: "1.0",
193
+ runId: this.ctx.runId,
194
+ level: "warn",
195
+ source: "runner",
196
+ timestamp: new Date().toISOString(),
197
+ message: `workflow trace capture failed for ${workflowRunId}: ${msg}`,
198
+ });
199
+ }
200
+ }
201
+ }
202
+ loadWorkflowIndex(indexPath) {
203
+ try {
204
+ const raw = fs.readFileSync(indexPath, "utf-8");
205
+ const parsed = JSON.parse(raw);
206
+ if (!parsed || !Array.isArray(parsed.runs))
207
+ return [];
208
+ return parsed.runs;
209
+ }
210
+ catch {
211
+ return [];
212
+ }
213
+ }
214
+ discoverLocalRunIds(dataDir) {
215
+ try {
216
+ const runsDir = path.join(dataDir, "runs");
217
+ if (!fs.existsSync(runsDir))
218
+ return [];
219
+ const startAt = Date.parse(this.ctx.startedAt);
220
+ const cutoff = Number.isFinite(startAt) ? startAt - 60000 : undefined;
221
+ const files = fs.readdirSync(runsDir).filter((file) => file.endsWith(".json"));
222
+ const result = [];
223
+ for (const file of files) {
224
+ const raw = fs.readFileSync(path.join(runsDir, file), "utf-8");
225
+ const run = JSON.parse(raw);
226
+ if (!run?.runId)
227
+ continue;
228
+ if (cutoff) {
229
+ const created = Date.parse(run.createdAt || "");
230
+ if (!Number.isNaN(created) && created < cutoff)
231
+ continue;
232
+ }
233
+ result.push(run.runId);
234
+ }
235
+ return result;
236
+ }
237
+ catch {
238
+ return [];
239
+ }
240
+ }
241
+ }
242
+ export const ekairosPlaywrightReporter = EkairosPlaywrightReporter;
243
+ export default EkairosPlaywrightReporter;
244
+ //# sourceMappingURL=playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { EntitiesDef, InstantRules, InstantSchemaDef, LinksDef, RoomsDef } from "@instantdb/core";
2
+ type AnyInstantSchema = InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;
3
+ export type CreateTestAppParams = {
4
+ name: string;
5
+ token: string;
6
+ apiURI?: string;
7
+ orgId?: string;
8
+ schema?: AnyInstantSchema;
9
+ perms?: InstantRules;
10
+ };
11
+ export type CreateTestAppResult = {
12
+ appId: string;
13
+ adminToken: string;
14
+ title: string;
15
+ };
16
+ export declare function createTestApp(params: CreateTestAppParams): Promise<CreateTestAppResult>;
17
+ export type PushTestSchemaParams = {
18
+ appId: string;
19
+ token: string;
20
+ schema: AnyInstantSchema;
21
+ apiURI?: string;
22
+ onProgress?: (status: {
23
+ friendlyDescription: string;
24
+ totalCount: number;
25
+ inProgressCount: number;
26
+ completedCount: number;
27
+ errorCount: number;
28
+ steps: unknown[];
29
+ inProgressSteps: unknown[];
30
+ completedSteps: unknown[];
31
+ erroredSteps: unknown[];
32
+ }) => void;
33
+ };
34
+ export declare function pushTestSchema(params: PushTestSchemaParams): Promise<{
35
+ newSchema: AnyInstantSchema;
36
+ steps: unknown[];
37
+ summary: unknown;
38
+ }>;
39
+ export type PushTestPermsParams = {
40
+ appId: string;
41
+ token: string;
42
+ perms: InstantRules;
43
+ apiURI?: string;
44
+ };
45
+ export declare function pushTestPerms(params: PushTestPermsParams): Promise<{
46
+ perms: InstantRules;
47
+ }>;
48
+ export type DestroyTestAppParams = {
49
+ appId: string;
50
+ token: string;
51
+ apiURI?: string;
52
+ };
53
+ export declare function destroyTestApp(params: DestroyTestAppParams): Promise<{
54
+ app: {
55
+ id: string;
56
+ title: string;
57
+ createdAt: Date;
58
+ orgId: string | null;
59
+ };
60
+ }>;
61
+ export {};
62
+ //# sourceMappingURL=provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACT,MAAM,iBAAiB,CAAC;AAEzB,KAAK,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;AAcvF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAuB9B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,OAAO,EAAE,CAAC;QACjB,eAAe,EAAE,OAAO,EAAE,CAAC;QAC3B,cAAc,EAAE,OAAO,EAAE,CAAC;QAC1B,YAAY,EAAE,OAAO,EAAE,CAAC;KACzB,KAAK,IAAI,CAAC;CACZ,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC;IACT,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC,CAkBD;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CAQlC;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC;IACT,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,IAAI,CAAC;QAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;CACH,CAAC,CAYD"}
@@ -0,0 +1,61 @@
1
+ async function createApi(params) {
2
+ const { PlatformApi } = await import("@instantdb/platform");
3
+ const token = String(params.token ?? "").trim();
4
+ if (!token) {
5
+ throw new Error("Instant platform token is required.");
6
+ }
7
+ return new PlatformApi({
8
+ auth: { token },
9
+ ...(params.apiURI ? { apiURI: params.apiURI } : {}),
10
+ });
11
+ }
12
+ export async function createTestApp(params) {
13
+ const api = await createApi({ token: params.token, apiURI: params.apiURI });
14
+ const name = String(params.name ?? "").trim();
15
+ if (!name) {
16
+ throw new Error("createTestApp requires a non-empty app name.");
17
+ }
18
+ const created = await api.createApp({
19
+ title: name,
20
+ orgId: params.orgId,
21
+ schema: params.schema ?? undefined,
22
+ perms: params.perms ?? undefined,
23
+ });
24
+ const appId = String(created?.app?.id ?? "").trim();
25
+ const adminToken = String(created?.app?.adminToken ?? "").trim();
26
+ const title = String(created?.app?.title ?? name).trim();
27
+ if (!appId || !adminToken) {
28
+ throw new Error("createTestApp did not return appId/adminToken.");
29
+ }
30
+ return { appId, adminToken, title };
31
+ }
32
+ export async function pushTestSchema(params) {
33
+ const api = await createApi({ token: params.token, apiURI: params.apiURI });
34
+ const appId = String(params.appId ?? "").trim();
35
+ if (!appId)
36
+ throw new Error("pushTestSchema requires appId.");
37
+ const push = api.schemaPush(appId, { schema: params.schema });
38
+ if (params.onProgress) {
39
+ push.subscribe({
40
+ next(status) {
41
+ params.onProgress?.(status);
42
+ },
43
+ });
44
+ }
45
+ return (await push);
46
+ }
47
+ export async function pushTestPerms(params) {
48
+ const api = await createApi({ token: params.token, apiURI: params.apiURI });
49
+ const appId = String(params.appId ?? "").trim();
50
+ if (!appId)
51
+ throw new Error("pushTestPerms requires appId.");
52
+ return (await api.pushPerms(appId, { perms: params.perms }));
53
+ }
54
+ export async function destroyTestApp(params) {
55
+ const api = await createApi({ token: params.token, apiURI: params.apiURI });
56
+ const appId = String(params.appId ?? "").trim();
57
+ if (!appId)
58
+ throw new Error("destroyTestApp requires appId.");
59
+ return (await api.deleteApp(appId));
60
+ }
61
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { DomainSchemaResult } from "@ekairos/domain";
2
+ export type ResolveEkairosRuntime<Env extends Record<string, unknown> = Record<string, unknown>, Domain extends DomainSchemaResult = DomainSchemaResult, Runtime = unknown> = (params: {
3
+ env: Env;
4
+ domain: Domain;
5
+ }) => Promise<Runtime> | Runtime;
6
+ export type ComposeTestDomain = (params: {
7
+ appDomain: DomainSchemaResult;
8
+ testDomain: DomainSchemaResult;
9
+ name?: string;
10
+ }) => DomainSchemaResult;
11
+ export type TestRuntimeParams<Env extends Record<string, unknown> = Record<string, unknown>> = {
12
+ testDomain?: DomainSchemaResult;
13
+ composedDomainName?: string;
14
+ resolveRuntime: ResolveEkairosRuntime<Env, DomainSchemaResult, unknown>;
15
+ shouldInject?: (params: {
16
+ env: Env;
17
+ domain: DomainSchemaResult;
18
+ }) => boolean;
19
+ composeDomain?: ComposeTestDomain;
20
+ runtimeDomain?: DomainSchemaResult;
21
+ };
22
+ export declare function getEkairosRuntime<Env extends Record<string, unknown>, Domain extends DomainSchemaResult, Runtime>(params: {
23
+ env: Env;
24
+ domain: Domain;
25
+ resolveRuntime: ResolveEkairosRuntime<Env, Domain, Runtime>;
26
+ }): Promise<Runtime>;
27
+ export declare function getEkairosTestRuntime<Env extends Record<string, unknown>, Runtime>(params: {
28
+ env: Env;
29
+ appDomain: DomainSchemaResult;
30
+ testDomain?: DomainSchemaResult;
31
+ composedDomainName?: string;
32
+ resolveRuntime: ResolveEkairosRuntime<Env, DomainSchemaResult, Runtime>;
33
+ composeDomain?: ComposeTestDomain;
34
+ }): Promise<{
35
+ runtime: Runtime;
36
+ domain: DomainSchemaResult;
37
+ }>;
38
+ export declare function configureTestRuntime<Env extends Record<string, unknown> = Record<string, unknown>>(params: TestRuntimeParams<Env>): void;
39
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAQ1D,MAAM,MAAM,qBAAqB,CAC/B,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,EACtD,OAAO,GAAG,OAAO,IACf,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEzE,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE;IACvC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,KAAK,kBAAkB,CAAC;AAEzB,MAAM,MAAM,iBAAiB,CAC3B,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC3D;IACF,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC;IAC7E,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC,CAAC;AAuBF,wBAAsB,iBAAiB,CACrC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,MAAM,SAAS,kBAAkB,EACjC,OAAO,EACP,MAAM,EAAE;IACR,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7D,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAED,wBAAsB,qBAAqB,CACzC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EACP,MAAM,EAAE;IACR,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACxE,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAe5D;AAED,wBAAgB,oBAAoB,CAClC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,CAsCtC"}
@@ -0,0 +1,72 @@
1
+ import { configureRuntime, getRuntimeConfig, } from "@ekairos/domain/runtime";
2
+ import { createAppTestingDomain, ekairosTestDomain } from "./schema.js";
3
+ function composeTestDomain(params) {
4
+ if (params.composeDomain) {
5
+ return params.composeDomain({
6
+ appDomain: params.appDomain,
7
+ testDomain: params.testDomain,
8
+ name: params.name,
9
+ });
10
+ }
11
+ return createAppTestingDomain({
12
+ appDomain: params.appDomain,
13
+ testDomain: params.testDomain,
14
+ name: params.name,
15
+ });
16
+ }
17
+ export async function getEkairosRuntime(params) {
18
+ if (!params.domain) {
19
+ throw new Error("getEkairosRuntime requires an explicit domain.");
20
+ }
21
+ return await params.resolveRuntime({
22
+ env: params.env,
23
+ domain: params.domain,
24
+ });
25
+ }
26
+ export async function getEkairosTestRuntime(params) {
27
+ const domain = composeTestDomain({
28
+ appDomain: params.appDomain,
29
+ testDomain: params.testDomain ?? ekairosTestDomain,
30
+ name: params.composedDomainName,
31
+ composeDomain: params.composeDomain,
32
+ });
33
+ const runtime = await getEkairosRuntime({
34
+ env: params.env,
35
+ domain,
36
+ resolveRuntime: params.resolveRuntime,
37
+ });
38
+ return { runtime, domain };
39
+ }
40
+ export function configureTestRuntime(params) {
41
+ const testDomain = params.testDomain ?? ekairosTestDomain;
42
+ const runtimeResolver = async (env, domain) => {
43
+ const appDomain = domain;
44
+ if (!appDomain) {
45
+ throw new Error("configureTestRuntime requires runtime(domain, env) calls with an explicit domain.");
46
+ }
47
+ const shouldInject = params.shouldInject
48
+ ? params.shouldInject({ env, domain: appDomain })
49
+ : true;
50
+ const resolvedDomain = shouldInject
51
+ ? composeTestDomain({
52
+ appDomain,
53
+ testDomain,
54
+ name: params.composedDomainName,
55
+ composeDomain: params.composeDomain,
56
+ })
57
+ : appDomain;
58
+ return await params.resolveRuntime({
59
+ env,
60
+ domain: resolvedDomain,
61
+ });
62
+ };
63
+ const existing = getRuntimeConfig();
64
+ configureRuntime({
65
+ runtime: runtimeResolver,
66
+ domain: {
67
+ ...(existing ?? {}),
68
+ domain: params.runtimeDomain ?? existing?.domain,
69
+ },
70
+ });
71
+ }
72
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type DomainSchemaResult } from "@ekairos/domain";
2
+ export declare const ekairosTestDomain: DomainSchemaResult;
3
+ export type EkairosTestDomain = typeof ekairosTestDomain;
4
+ export declare function createAppTestingDomain(params: {
5
+ appDomain: DomainSchemaResult;
6
+ testDomain?: DomainSchemaResult;
7
+ name?: string;
8
+ }): DomainSchemaResult;
9
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAO,MAAM,iBAAiB,EAAE,kBA0E5B,CAAC;AAEL,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC;AAEzD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,kBAAkB,CASrB"}
package/dist/schema.js ADDED
@@ -0,0 +1,88 @@
1
+ import { i } from "@instantdb/core";
2
+ import { domain } from "@ekairos/domain";
3
+ export const ekairosTestDomain = domain("ekairos.testing")
4
+ .schema({
5
+ entities: {
6
+ test_runs: i.entity({
7
+ runId: i.string().unique().indexed(),
8
+ projectId: i.string().optional().indexed(),
9
+ domainName: i.string().optional().indexed(),
10
+ runner: i.string().indexed(),
11
+ status: i.string().indexed(), // running | passed | failed | cancelled
12
+ command: i.string().optional(),
13
+ startedAt: i.date().indexed(),
14
+ finishedAt: i.date().optional().indexed(),
15
+ metadata: i.json().optional(),
16
+ }),
17
+ test_cases: i.entity({
18
+ runId: i.string().indexed(),
19
+ caseId: i.string().indexed(),
20
+ title: i.string().optional(),
21
+ file: i.string().optional().indexed(),
22
+ status: i.string().indexed(), // running | passed | failed | skipped
23
+ startedAt: i.date().optional().indexed(),
24
+ finishedAt: i.date().optional().indexed(),
25
+ durationMs: i.number().optional(),
26
+ metadata: i.json().optional(),
27
+ }),
28
+ test_events: i.entity({
29
+ runId: i.string().indexed(),
30
+ caseId: i.string().optional().indexed(),
31
+ kind: i.string().indexed(), // lifecycle | log | assertion | workflow | thread
32
+ channel: i.string().optional().indexed(),
33
+ createdAt: i.date().indexed(),
34
+ message: i.string().optional(),
35
+ payload: i.json().optional(),
36
+ }),
37
+ test_artifacts: i.entity({
38
+ runId: i.string().indexed(),
39
+ caseId: i.string().optional().indexed(),
40
+ kind: i.string().indexed(), // screenshot | video | trace | html | json
41
+ path: i.string().indexed(),
42
+ mimeType: i.string().optional().indexed(),
43
+ sizeBytes: i.number().optional(),
44
+ createdAt: i.date().indexed(),
45
+ payload: i.json().optional(),
46
+ }),
47
+ test_code_refs: i.entity({
48
+ runId: i.string().indexed(),
49
+ caseId: i.string().optional().indexed(),
50
+ file: i.string().indexed(),
51
+ line: i.number().optional(),
52
+ column: i.number().optional(),
53
+ symbol: i.string().optional().indexed(),
54
+ createdAt: i.date().indexed(),
55
+ payload: i.json().optional(),
56
+ }),
57
+ },
58
+ links: {
59
+ testRunCases: {
60
+ forward: { on: "test_cases", has: "one", label: "run" },
61
+ reverse: { on: "test_runs", has: "many", label: "cases" },
62
+ },
63
+ testRunEvents: {
64
+ forward: { on: "test_events", has: "one", label: "run" },
65
+ reverse: { on: "test_runs", has: "many", label: "events" },
66
+ },
67
+ testRunArtifacts: {
68
+ forward: { on: "test_artifacts", has: "one", label: "run" },
69
+ reverse: { on: "test_runs", has: "many", label: "artifacts" },
70
+ },
71
+ testRunCodeRefs: {
72
+ forward: { on: "test_code_refs", has: "one", label: "run" },
73
+ reverse: { on: "test_runs", has: "many", label: "codeRefs" },
74
+ },
75
+ },
76
+ rooms: {},
77
+ });
78
+ export function createAppTestingDomain(params) {
79
+ return domain(params.name ?? "app.testing")
80
+ .includes(params.appDomain)
81
+ .includes(params.testDomain ?? ekairosTestDomain)
82
+ .schema({
83
+ entities: {},
84
+ links: {},
85
+ rooms: {},
86
+ });
87
+ }
88
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}