gateproof 0.1.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/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/act.d.ts +31 -0
- package/dist/act.d.ts.map +1 -0
- package/dist/act.js +25 -0
- package/dist/act.js.map +1 -0
- package/dist/action-executors.d.ts +12 -0
- package/dist/action-executors.d.ts.map +1 -0
- package/dist/action-executors.js +124 -0
- package/dist/action-executors.js.map +1 -0
- package/dist/assert.d.ts +39 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +88 -0
- package/dist/assert.js.map +1 -0
- package/dist/cloudflare/analytics.d.ts +9 -0
- package/dist/cloudflare/analytics.d.ts.map +1 -0
- package/dist/cloudflare/analytics.js +98 -0
- package/dist/cloudflare/analytics.js.map +1 -0
- package/dist/cloudflare/cli-stream.d.ts +7 -0
- package/dist/cloudflare/cli-stream.d.ts.map +1 -0
- package/dist/cloudflare/cli-stream.js +81 -0
- package/dist/cloudflare/cli-stream.js.map +1 -0
- package/dist/cloudflare/index.d.ts +7 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +44 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/polling-backend.d.ts +18 -0
- package/dist/cloudflare/polling-backend.d.ts.map +1 -0
- package/dist/cloudflare/polling-backend.js +53 -0
- package/dist/cloudflare/polling-backend.js.map +1 -0
- package/dist/cloudflare/workers-logs.d.ts +9 -0
- package/dist/cloudflare/workers-logs.d.ts.map +1 -0
- package/dist/cloudflare/workers-logs.js +51 -0
- package/dist/cloudflare/workers-logs.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +168 -0
- package/dist/index.js.map +1 -0
- package/dist/observe.d.ts +26 -0
- package/dist/observe.d.ts.map +1 -0
- package/dist/observe.js +83 -0
- package/dist/observe.js.map +1 -0
- package/dist/provider.d.ts +6 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -0
- package/dist/test-helpers.d.ts +12 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +33 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +22 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +48 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +6 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +34 -0
- package/dist/validation.js.map +1 -0
- package/package.json +74 -0
package/dist/observe.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Effect, Queue, Runtime, Stream } from "effect";
|
|
2
|
+
import { Schema } from "@effect/schema";
|
|
3
|
+
export class ObservabilityError extends Schema.TaggedError()("ObservabilityError", {
|
|
4
|
+
cause: Schema.Unknown,
|
|
5
|
+
message: Schema.optional(Schema.String),
|
|
6
|
+
stack: Schema.optional(Schema.String)
|
|
7
|
+
}) {
|
|
8
|
+
}
|
|
9
|
+
export function createObservabilityError(cause) {
|
|
10
|
+
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
11
|
+
return new ObservabilityError({
|
|
12
|
+
cause,
|
|
13
|
+
message: error.message,
|
|
14
|
+
stack: error.stack
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function createObserveResource(backend) {
|
|
18
|
+
return {
|
|
19
|
+
start() {
|
|
20
|
+
return backend.start();
|
|
21
|
+
},
|
|
22
|
+
stop() {
|
|
23
|
+
return backend.stop();
|
|
24
|
+
},
|
|
25
|
+
query(filter) {
|
|
26
|
+
return Effect.acquireUseRelease(backend.start(), (stream) => Stream.fromAsyncIterable(stream, () => Effect.void).pipe(Stream.filter((log) => matchesFilter(log, filter)), Stream.runCollect, Effect.map((chunk) => Array.from(chunk)), Effect.catchAll((e) => Effect.fail(createObservabilityError(e)))), () => backend.stop().pipe(Effect.catchAll(() => Effect.void)));
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function matchesFilter(log, filter) {
|
|
31
|
+
if (filter.requestId && log.requestId !== filter.requestId)
|
|
32
|
+
return false;
|
|
33
|
+
if (filter.stage && log.stage !== filter.stage)
|
|
34
|
+
return false;
|
|
35
|
+
if (filter.action && log.action !== filter.action)
|
|
36
|
+
return false;
|
|
37
|
+
if (filter.status && log.status !== filter.status)
|
|
38
|
+
return false;
|
|
39
|
+
if (filter.since && log.timestamp) {
|
|
40
|
+
const logTime = new Date(log.timestamp).getTime();
|
|
41
|
+
if (logTime < filter.since.getTime())
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (filter.until && log.timestamp) {
|
|
45
|
+
const logTime = new Date(log.timestamp).getTime();
|
|
46
|
+
if (logTime > filter.until.getTime())
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
export function createLogStreamFromQueue(queue) {
|
|
52
|
+
const runtime = Runtime.defaultRuntime;
|
|
53
|
+
return {
|
|
54
|
+
async *[Symbol.asyncIterator]() {
|
|
55
|
+
try {
|
|
56
|
+
while (true) {
|
|
57
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout("100 millis"), Effect.catchAll(() => Effect.succeed(null))));
|
|
58
|
+
if (log === null)
|
|
59
|
+
break;
|
|
60
|
+
yield log;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
const remaining = [];
|
|
65
|
+
try {
|
|
66
|
+
for (let i = 0; i < 100; i++) {
|
|
67
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout("10 millis"), Effect.catchAll(() => Effect.succeed(null))));
|
|
68
|
+
if (log === null)
|
|
69
|
+
break;
|
|
70
|
+
remaining.push(log);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Ignore
|
|
75
|
+
}
|
|
76
|
+
for (const log of remaining) {
|
|
77
|
+
yield log;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAAC;CACjD"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test utilities for gateproof
|
|
3
|
+
* Shared helpers used across test files
|
|
4
|
+
*/
|
|
5
|
+
import { Queue } from "effect";
|
|
6
|
+
import type { Log } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* Creates a test observe resource from a queue
|
|
9
|
+
* Used in test files to simulate log streams
|
|
10
|
+
*/
|
|
11
|
+
export declare function createTestObserveResource(queue: Queue.Queue<Log>): import("./observe").ObserveResource;
|
|
12
|
+
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,KAAK,EAAW,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAGnC;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uCAwBhE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test utilities for gateproof
|
|
3
|
+
* Shared helpers used across test files
|
|
4
|
+
*/
|
|
5
|
+
import { Effect, Queue, Runtime } from "effect";
|
|
6
|
+
import { createObserveResource } from "./observe";
|
|
7
|
+
/**
|
|
8
|
+
* Creates a test observe resource from a queue
|
|
9
|
+
* Used in test files to simulate log streams
|
|
10
|
+
*/
|
|
11
|
+
export function createTestObserveResource(queue) {
|
|
12
|
+
const backend = {
|
|
13
|
+
start: () => Effect.succeed({
|
|
14
|
+
async *[Symbol.asyncIterator]() {
|
|
15
|
+
const runtime = Runtime.defaultRuntime;
|
|
16
|
+
while (true) {
|
|
17
|
+
try {
|
|
18
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout("100 millis"), Effect.catchAll(() => Effect.succeed(null))));
|
|
19
|
+
if (log === null)
|
|
20
|
+
break;
|
|
21
|
+
yield log;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}),
|
|
29
|
+
stop: () => Effect.void
|
|
30
|
+
};
|
|
31
|
+
return createObserveResource(backend);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAgB,MAAM,WAAW,CAAC;AAEhE;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAuB;IAC/D,MAAM,OAAO,GAAY;QACvB,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC9C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;gBACvC,OAAO,IAAI,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CACpB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAkB,CAAC,CAAC,CAC1D,CACF,CAAC;wBACF,IAAI,GAAG,KAAK,IAAI;4BAAE,MAAM;wBACxB,MAAM,GAAG,CAAC;oBACZ,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;QACF,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;KACxB,CAAC;IACF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface Log {
|
|
2
|
+
requestId?: string;
|
|
3
|
+
timestamp?: string;
|
|
4
|
+
stage?: string;
|
|
5
|
+
action?: string;
|
|
6
|
+
status?: "start" | "success" | "error" | "info";
|
|
7
|
+
error?: {
|
|
8
|
+
tag: string;
|
|
9
|
+
message: string;
|
|
10
|
+
stack?: string;
|
|
11
|
+
};
|
|
12
|
+
data?: Record<string, unknown>;
|
|
13
|
+
durationMs?: number;
|
|
14
|
+
[k: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface LogFilter {
|
|
17
|
+
requestId?: string;
|
|
18
|
+
stage?: string;
|
|
19
|
+
action?: string;
|
|
20
|
+
status?: "start" | "success" | "error" | "info";
|
|
21
|
+
since?: Date;
|
|
22
|
+
until?: Date;
|
|
23
|
+
}
|
|
24
|
+
export type LogStream = AsyncIterable<Log>;
|
|
25
|
+
export interface GateResult {
|
|
26
|
+
status: "success" | "failed" | "timeout";
|
|
27
|
+
durationMs: number;
|
|
28
|
+
logs: Log[];
|
|
29
|
+
evidence: {
|
|
30
|
+
requestIds: string[];
|
|
31
|
+
stagesSeen: string[];
|
|
32
|
+
actionsSeen: string[];
|
|
33
|
+
errorTags: string[];
|
|
34
|
+
};
|
|
35
|
+
error?: Error;
|
|
36
|
+
}
|
|
37
|
+
export interface ObserveConfig {
|
|
38
|
+
backend: string;
|
|
39
|
+
[k: string]: unknown;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for gateproof gates
|
|
3
|
+
* These utilities reduce boilerplate and standardize common patterns
|
|
4
|
+
*/
|
|
5
|
+
import { type GateSpec, type GateResult } from "./index";
|
|
6
|
+
import { type Backend } from "./observe";
|
|
7
|
+
/**
|
|
8
|
+
* Creates an empty backend that yields no logs
|
|
9
|
+
* Useful for gates that validate HTTP endpoints without log observation
|
|
10
|
+
*/
|
|
11
|
+
export declare function createEmptyBackend(): Backend;
|
|
12
|
+
/**
|
|
13
|
+
* Creates an observe resource from an empty backend
|
|
14
|
+
* Convenience wrapper for the common pattern
|
|
15
|
+
*/
|
|
16
|
+
export declare function createEmptyObserveResource(): import("./observe").ObserveResource;
|
|
17
|
+
/**
|
|
18
|
+
* Runs a gate with standardized error handling
|
|
19
|
+
* Returns a result object with consistent structure even on errors
|
|
20
|
+
*/
|
|
21
|
+
export declare function runGateWithErrorHandling(gate: GateSpec, name: string): Promise<GateResult>;
|
|
22
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAS5C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,wCAEzC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAarB"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for gateproof gates
|
|
3
|
+
* These utilities reduce boilerplate and standardize common patterns
|
|
4
|
+
*/
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import { Gate } from "./index";
|
|
7
|
+
import { createObserveResource } from "./observe";
|
|
8
|
+
/**
|
|
9
|
+
* Creates an empty backend that yields no logs
|
|
10
|
+
* Useful for gates that validate HTTP endpoints without log observation
|
|
11
|
+
*/
|
|
12
|
+
export function createEmptyBackend() {
|
|
13
|
+
return {
|
|
14
|
+
start: () => Effect.succeed({
|
|
15
|
+
async *[Symbol.asyncIterator]() {
|
|
16
|
+
return;
|
|
17
|
+
},
|
|
18
|
+
}),
|
|
19
|
+
stop: () => Effect.void,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates an observe resource from an empty backend
|
|
24
|
+
* Convenience wrapper for the common pattern
|
|
25
|
+
*/
|
|
26
|
+
export function createEmptyObserveResource() {
|
|
27
|
+
return createObserveResource(createEmptyBackend());
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Runs a gate with standardized error handling
|
|
31
|
+
* Returns a result object with consistent structure even on errors
|
|
32
|
+
*/
|
|
33
|
+
export async function runGateWithErrorHandling(gate, name) {
|
|
34
|
+
try {
|
|
35
|
+
return await Gate.run(gate);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error(` ❌ Error: ${error.message || error}`);
|
|
39
|
+
return {
|
|
40
|
+
status: "failed",
|
|
41
|
+
durationMs: 0,
|
|
42
|
+
logs: [],
|
|
43
|
+
evidence: { actionsSeen: [], errorTags: [], requestIds: [], stagesSeen: [] },
|
|
44
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,IAAI,EAAkC,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAgB,MAAM,WAAW,CAAC;AAEhE;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC9C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3B,OAAO;YACT,CAAC;SACF,CAAC;QACF,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;KACxB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,qBAAqB,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAc,EACd,IAAY;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO;YACL,MAAM,EAAE,QAAiB;YACzB,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;YAC5E,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACjE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { GateError } from "./index";
|
|
3
|
+
export declare function validateWorkerName(name: string): Effect.Effect<string, GateError>;
|
|
4
|
+
export declare function validateUrl(url: string): Effect.Effect<string, GateError>;
|
|
5
|
+
export declare function validateCommand(command: string): Effect.Effect<string, GateError>;
|
|
6
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAQjF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAUzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CASjF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { GateError } from "./index";
|
|
3
|
+
export function validateWorkerName(name) {
|
|
4
|
+
if (!name || typeof name !== "string") {
|
|
5
|
+
return Effect.fail(new GateError({ cause: new Error("Worker name must be a non-empty string") }));
|
|
6
|
+
}
|
|
7
|
+
if (!/^[a-z0-9_-]+$/i.test(name)) {
|
|
8
|
+
return Effect.fail(new GateError({ cause: new Error("Worker name contains invalid characters") }));
|
|
9
|
+
}
|
|
10
|
+
return Effect.succeed(name);
|
|
11
|
+
}
|
|
12
|
+
export function validateUrl(url) {
|
|
13
|
+
try {
|
|
14
|
+
const parsed = new URL(url);
|
|
15
|
+
if (!["http:", "https:"].includes(parsed.protocol)) {
|
|
16
|
+
return Effect.fail(new GateError({ cause: new Error("URL must use http or https protocol") }));
|
|
17
|
+
}
|
|
18
|
+
return Effect.succeed(url);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return Effect.fail(new GateError({ cause: new Error("Invalid URL format") }));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function validateCommand(command) {
|
|
25
|
+
if (!command || typeof command !== "string") {
|
|
26
|
+
return Effect.fail(new GateError({ cause: new Error("Command must be a non-empty string") }));
|
|
27
|
+
}
|
|
28
|
+
const dangerous = /[;&|`$(){}[\]<>]/;
|
|
29
|
+
if (dangerous.test(command)) {
|
|
30
|
+
return Effect.fail(new GateError({ cause: new Error("Command contains dangerous characters") }));
|
|
31
|
+
}
|
|
32
|
+
return Effect.succeed(command);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,SAAS,GAAG,kBAAkB,CAAC;IACrC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,uCAAuC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gateproof",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "E2E testing harness. Observe logs, run actions, assert results.",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./cloudflare": {
|
|
14
|
+
"types": "./dist/cloudflare/index.d.ts",
|
|
15
|
+
"import": "./dist/cloudflare/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "bun run build:tsc",
|
|
25
|
+
"build:tsc": "tsc -p tsconfig.build.json",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "bun test",
|
|
28
|
+
"test:demo": "bun test test/demo.test.ts",
|
|
29
|
+
"test:production": "bun test test/demo.production.test.ts",
|
|
30
|
+
"example": "bun run patterns/basic/simple-gate.ts",
|
|
31
|
+
"pattern:basic": "bun run patterns/basic/*.ts",
|
|
32
|
+
"pattern:cloudflare": "bun run patterns/cloudflare/*.ts",
|
|
33
|
+
"gate:production": "bun run gates/production/smoke.gate.ts",
|
|
34
|
+
"gate:local": "bun run gates/local/demo.gate.ts",
|
|
35
|
+
"gate:all": "bun run gates/production/smoke.gate.ts && bun run gates/local/demo.gate.ts",
|
|
36
|
+
"demo:gate": "bun run gate:production",
|
|
37
|
+
"prepush": "bun run typecheck && bun test --exclude test/demo.production.test.ts",
|
|
38
|
+
"prepublishOnly": "bun run build && bun test"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"e2e",
|
|
42
|
+
"testing",
|
|
43
|
+
"observability",
|
|
44
|
+
"effect"
|
|
45
|
+
],
|
|
46
|
+
"author": "Jordan Coeyman <jordan@coey.dev>",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/acoyfellow/gateproof.git"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/acoyfellow/gateproof#readme",
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/acoyfellow/gateproof/issues"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"@effect/schema": "^0.75.5",
|
|
58
|
+
"alchemy": "^0.83.1",
|
|
59
|
+
"effect": "^3.19.14"
|
|
60
|
+
},
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"playwright": ""
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"playwright": {
|
|
66
|
+
"optional": true
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@types/node": "^24.10.8",
|
|
71
|
+
"bun-types": "^1.3.6",
|
|
72
|
+
"typescript": "^5.9.3"
|
|
73
|
+
}
|
|
74
|
+
}
|