@in2grate/testing 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/dist/cassette-clients.d.ts +26 -0
- package/dist/cassette-clients.d.ts.map +1 -0
- package/dist/cassette-clients.js +174 -0
- package/dist/cassette-clients.js.map +1 -0
- package/dist/cassette-store.d.ts +16 -0
- package/dist/cassette-store.d.ts.map +1 -0
- package/dist/cassette-store.js +34 -0
- package/dist/cassette-store.js.map +1 -0
- package/dist/cassette.test.d.ts +2 -0
- package/dist/cassette.test.d.ts.map +1 -0
- package/dist/cassette.test.js +414 -0
- package/dist/cassette.test.js.map +1 -0
- package/dist/error-helpers.test.d.ts +2 -0
- package/dist/error-helpers.test.d.ts.map +1 -0
- package/dist/error-helpers.test.js +66 -0
- package/dist/error-helpers.test.js.map +1 -0
- package/dist/http-mocks.test.d.ts +2 -0
- package/dist/http-mocks.test.d.ts.map +1 -0
- package/dist/http-mocks.test.js +89 -0
- package/dist/http-mocks.test.js.map +1 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.test.d.ts +2 -0
- package/dist/oauth.test.d.ts.map +1 -0
- package/dist/oauth.test.js +53 -0
- package/dist/oauth.test.js.map +1 -0
- package/dist/poll.test.d.ts +2 -0
- package/dist/poll.test.d.ts.map +1 -0
- package/dist/poll.test.js +78 -0
- package/dist/poll.test.js.map +1 -0
- package/dist/redact.d.ts +20 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +83 -0
- package/dist/redact.js.map +1 -0
- package/dist/replay.test.d.ts +2 -0
- package/dist/replay.test.d.ts.map +1 -0
- package/dist/replay.test.js +169 -0
- package/dist/replay.test.js.map +1 -0
- package/dist/secrets.test.d.ts +2 -0
- package/dist/secrets.test.d.ts.map +1 -0
- package/dist/secrets.test.js +30 -0
- package/dist/secrets.test.js.map +1 -0
- package/dist/state.test.d.ts +2 -0
- package/dist/state.test.d.ts.map +1 -0
- package/dist/state.test.js +66 -0
- package/dist/state.test.js.map +1 -0
- package/package.json +32 -0
package/dist/redact.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { redactHeaders } from '@in2grate/sdk';
|
|
2
|
+
export { redactHeaders };
|
|
3
|
+
/**
|
|
4
|
+
* Parse IN2_CASSETTE_REDACT_PATHS env var into an array of dot-paths.
|
|
5
|
+
* e.g. "a.b,token,access_token" → ["a.b", "token", "access_token"]
|
|
6
|
+
*/
|
|
7
|
+
export declare function getRedactPaths(): string[];
|
|
8
|
+
/**
|
|
9
|
+
* Redact fields listed in IN2_CASSETTE_REDACT_PATHS from a response body.
|
|
10
|
+
* Returns a shallow-cloned object (only objects along redaction paths are cloned)
|
|
11
|
+
* with affected fields replaced by "[REDACTED]".
|
|
12
|
+
*/
|
|
13
|
+
export declare function redactBody(body: unknown): unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Compute a SHA-256 hex hash of a request body for content-based cassette matching.
|
|
16
|
+
* Returns empty string for absent bodies.
|
|
17
|
+
* JSON objects use stable (key-sorted) serialisation for reproducible hashes.
|
|
18
|
+
*/
|
|
19
|
+
export declare function hashBody(body: unknown): string;
|
|
20
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAMzC;AA0BD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEjD;AAkBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAW9C"}
|
package/dist/redact.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { redactHeaders } from '@in2grate/sdk';
|
|
3
|
+
export { redactHeaders };
|
|
4
|
+
/**
|
|
5
|
+
* Parse IN2_CASSETTE_REDACT_PATHS env var into an array of dot-paths.
|
|
6
|
+
* e.g. "a.b,token,access_token" → ["a.b", "token", "access_token"]
|
|
7
|
+
*/
|
|
8
|
+
export function getRedactPaths() {
|
|
9
|
+
const raw = process.env['IN2_CASSETTE_REDACT_PATHS'] ?? '';
|
|
10
|
+
return raw
|
|
11
|
+
.split(',')
|
|
12
|
+
.map((s) => s.trim())
|
|
13
|
+
.filter(Boolean);
|
|
14
|
+
}
|
|
15
|
+
function applyRedactPath(obj, parts, idx) {
|
|
16
|
+
const key = parts[idx];
|
|
17
|
+
if (key === undefined || !(key in obj))
|
|
18
|
+
return;
|
|
19
|
+
if (idx === parts.length - 1) {
|
|
20
|
+
obj[key] = '[REDACTED]';
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const child = obj[key];
|
|
24
|
+
if (child !== null && typeof child === 'object' && !Array.isArray(child)) {
|
|
25
|
+
obj[key] = { ...child };
|
|
26
|
+
applyRedactPath(obj[key], parts, idx + 1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function redactFieldPaths(obj, paths) {
|
|
31
|
+
if (paths.length === 0 || obj === null || typeof obj !== 'object')
|
|
32
|
+
return obj;
|
|
33
|
+
if (Array.isArray(obj))
|
|
34
|
+
return obj.map((item) => redactFieldPaths(item, paths));
|
|
35
|
+
const result = { ...obj };
|
|
36
|
+
for (const dotPath of paths) {
|
|
37
|
+
applyRedactPath(result, dotPath.split('.'), 0);
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Redact fields listed in IN2_CASSETTE_REDACT_PATHS from a response body.
|
|
43
|
+
* Returns a shallow-cloned object (only objects along redaction paths are cloned)
|
|
44
|
+
* with affected fields replaced by "[REDACTED]".
|
|
45
|
+
*/
|
|
46
|
+
export function redactBody(body) {
|
|
47
|
+
return redactFieldPaths(body, getRedactPaths());
|
|
48
|
+
}
|
|
49
|
+
// ─── Body hashing ─────────────────────────────────────────────────────────────
|
|
50
|
+
/** Stable JSON stringify (sorted keys) for consistent body hashing */
|
|
51
|
+
function stableStringify(value) {
|
|
52
|
+
if (value === null || typeof value !== 'object')
|
|
53
|
+
return JSON.stringify(value);
|
|
54
|
+
if (Array.isArray(value))
|
|
55
|
+
return '[' + value.map(stableStringify).join(',') + ']';
|
|
56
|
+
const keys = Object.keys(value).sort();
|
|
57
|
+
return ('{' +
|
|
58
|
+
keys
|
|
59
|
+
.map((k) => JSON.stringify(k) + ':' + stableStringify(value[k]))
|
|
60
|
+
.join(',') +
|
|
61
|
+
'}');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Compute a SHA-256 hex hash of a request body for content-based cassette matching.
|
|
65
|
+
* Returns empty string for absent bodies.
|
|
66
|
+
* JSON objects use stable (key-sorted) serialisation for reproducible hashes.
|
|
67
|
+
*/
|
|
68
|
+
export function hashBody(body) {
|
|
69
|
+
if (body === null || body === undefined)
|
|
70
|
+
return '';
|
|
71
|
+
const h = createHash('sha256');
|
|
72
|
+
if (body instanceof Uint8Array) {
|
|
73
|
+
h.update(body);
|
|
74
|
+
}
|
|
75
|
+
else if (typeof body === 'string') {
|
|
76
|
+
h.update(body, 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
h.update(stableStringify(body), 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
return h.digest('hex');
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.test.d.ts","sourceRoot":"","sources":["../src/replay.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import { defineFlow } from '@in2grate/sdk';
|
|
7
|
+
import { runFlowTest } from './index.js';
|
|
8
|
+
// ─── Helper ───────────────────────────────────────────────────────────────────
|
|
9
|
+
function writeTempCassette(entries) {
|
|
10
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'in2-replay-test-'));
|
|
11
|
+
const filePath = path.join(dir, 'cassette.json');
|
|
12
|
+
fs.writeFileSync(filePath, JSON.stringify(entries), 'utf-8');
|
|
13
|
+
return filePath;
|
|
14
|
+
}
|
|
15
|
+
// ─── Tests ────────────────────────────────────────────────────────────────────
|
|
16
|
+
describe('cassette replay', () => {
|
|
17
|
+
it('REP-01: runs handler offline using cassette with no httpMocks', async () => {
|
|
18
|
+
const cassettePath = writeTempCassette([
|
|
19
|
+
{
|
|
20
|
+
url: 'https://api.example.com/data',
|
|
21
|
+
method: 'GET',
|
|
22
|
+
requestHeaders: {},
|
|
23
|
+
requestBody: null,
|
|
24
|
+
responseStatus: 200,
|
|
25
|
+
responseHeaders: {},
|
|
26
|
+
responseBody: { value: 42 },
|
|
27
|
+
},
|
|
28
|
+
]);
|
|
29
|
+
const flow = defineFlow({
|
|
30
|
+
name: 'rep-01',
|
|
31
|
+
trigger: { type: 'webhook' },
|
|
32
|
+
async handler(ctx) {
|
|
33
|
+
const res = await ctx.http.get('https://api.example.com/data');
|
|
34
|
+
return res.data;
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const result = await runFlowTest(flow, {
|
|
38
|
+
input: {},
|
|
39
|
+
cassette: cassettePath,
|
|
40
|
+
});
|
|
41
|
+
assert.equal(result.httpCalls.length, 1);
|
|
42
|
+
assert.equal(result.httpCalls[0]?.url, 'https://api.example.com/data');
|
|
43
|
+
});
|
|
44
|
+
it('REP-02: second ctx.http call returns the second cassette entry (FIFO cursor advances)', async () => {
|
|
45
|
+
const cassettePath = writeTempCassette([
|
|
46
|
+
{
|
|
47
|
+
url: 'https://api.example.com/items',
|
|
48
|
+
method: 'GET',
|
|
49
|
+
requestHeaders: {},
|
|
50
|
+
requestBody: null,
|
|
51
|
+
responseStatus: 200,
|
|
52
|
+
responseHeaders: {},
|
|
53
|
+
responseBody: { item: 'first' },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
url: 'https://api.example.com/items',
|
|
57
|
+
method: 'GET',
|
|
58
|
+
requestHeaders: {},
|
|
59
|
+
requestBody: null,
|
|
60
|
+
responseStatus: 200,
|
|
61
|
+
responseHeaders: {},
|
|
62
|
+
responseBody: { item: 'second' },
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
let secondCallData;
|
|
66
|
+
const flow = defineFlow({
|
|
67
|
+
name: 'rep-02',
|
|
68
|
+
trigger: { type: 'webhook' },
|
|
69
|
+
async handler(ctx) {
|
|
70
|
+
await ctx.http.get('https://api.example.com/items');
|
|
71
|
+
const second = await ctx.http.get('https://api.example.com/items');
|
|
72
|
+
secondCallData = second.data;
|
|
73
|
+
return second.data;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
await runFlowTest(flow, {
|
|
77
|
+
input: {},
|
|
78
|
+
cassette: cassettePath,
|
|
79
|
+
});
|
|
80
|
+
const data = secondCallData;
|
|
81
|
+
assert.equal(data.item, 'second');
|
|
82
|
+
});
|
|
83
|
+
it('REP-03: throws when cassette is exhausted, error includes URL and cassette path', async () => {
|
|
84
|
+
const cassettePath = writeTempCassette([]);
|
|
85
|
+
const flow = defineFlow({
|
|
86
|
+
name: 'rep-03',
|
|
87
|
+
trigger: { type: 'webhook' },
|
|
88
|
+
async handler(ctx) {
|
|
89
|
+
await ctx.http.get('https://api.example.com/data');
|
|
90
|
+
return null;
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
await assert.rejects(() => runFlowTest(flow, { input: {}, cassette: cassettePath }), (err) => {
|
|
94
|
+
assert.ok(err.message.includes('https://api.example.com'), `Expected error to include URL, got: ${err.message}`);
|
|
95
|
+
assert.ok(err.message.includes(cassettePath), `Expected error to include cassette path, got: ${err.message}`);
|
|
96
|
+
return true;
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
it('REP-04: throws immediately when both cassette and httpMocks are provided; handler is NOT called', async () => {
|
|
100
|
+
const cassettePath = writeTempCassette([
|
|
101
|
+
{
|
|
102
|
+
url: 'https://api.example.com/data',
|
|
103
|
+
method: 'GET',
|
|
104
|
+
requestHeaders: {},
|
|
105
|
+
requestBody: null,
|
|
106
|
+
responseStatus: 200,
|
|
107
|
+
responseHeaders: {},
|
|
108
|
+
responseBody: { value: 1 },
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
let handlerCalled = false;
|
|
112
|
+
const flow = defineFlow({
|
|
113
|
+
name: 'rep-04',
|
|
114
|
+
trigger: { type: 'webhook' },
|
|
115
|
+
async handler() {
|
|
116
|
+
handlerCalled = true;
|
|
117
|
+
return null;
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
await assert.rejects(() => runFlowTest(flow, {
|
|
121
|
+
input: {},
|
|
122
|
+
cassette: cassettePath,
|
|
123
|
+
httpMocks: {},
|
|
124
|
+
}), (err) => {
|
|
125
|
+
assert.match(err.message, /cannot use both/i);
|
|
126
|
+
return true;
|
|
127
|
+
});
|
|
128
|
+
assert.equal(handlerCalled, false, 'handler must NOT be called when both cassette and httpMocks are provided');
|
|
129
|
+
});
|
|
130
|
+
it('REP-05: result.httpCalls is populated with correct url and method for each cassette replay call', async () => {
|
|
131
|
+
const cassettePath = writeTempCassette([
|
|
132
|
+
{
|
|
133
|
+
url: 'https://api.example.com/read',
|
|
134
|
+
method: 'GET',
|
|
135
|
+
requestHeaders: {},
|
|
136
|
+
requestBody: null,
|
|
137
|
+
responseStatus: 200,
|
|
138
|
+
responseHeaders: {},
|
|
139
|
+
responseBody: { ok: true },
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
url: 'https://api.example.com/write',
|
|
143
|
+
method: 'POST',
|
|
144
|
+
requestHeaders: {},
|
|
145
|
+
requestBody: { data: 1 },
|
|
146
|
+
responseStatus: 201,
|
|
147
|
+
responseHeaders: {},
|
|
148
|
+
responseBody: { created: true },
|
|
149
|
+
},
|
|
150
|
+
]);
|
|
151
|
+
const flow = defineFlow({
|
|
152
|
+
name: 'rep-05',
|
|
153
|
+
trigger: { type: 'webhook' },
|
|
154
|
+
async handler(ctx) {
|
|
155
|
+
await ctx.http.get('https://api.example.com/read');
|
|
156
|
+
await ctx.http.post('https://api.example.com/write', { data: 1 });
|
|
157
|
+
return null;
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
const result = await runFlowTest(flow, {
|
|
161
|
+
input: {},
|
|
162
|
+
cassette: cassettePath,
|
|
163
|
+
});
|
|
164
|
+
assert.equal(result.httpCalls.length, 2);
|
|
165
|
+
assert.equal(result.httpCalls[0]?.method, 'GET');
|
|
166
|
+
assert.equal(result.httpCalls[1]?.method, 'POST');
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=replay.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.test.js","sourceRoot":"","sources":["../src/replay.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,iFAAiF;AAEjF,SAAS,iBAAiB,CAAC,OAAwB;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,iFAAiF;AAEjF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC;gBACE,GAAG,EAAE,8BAA8B;gBACnC,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,GAAG;gBACnB,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aAC5B;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO,CAAC,GAAG;gBACf,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC/D,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;YACrC,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,8BAA8B,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC;gBACE,GAAG,EAAE,+BAA+B;gBACpC,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,GAAG;gBACnB,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aAChC;YACD;gBACE,GAAG,EAAE,+BAA+B;gBACpC,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,GAAG;gBACnB,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACjC;SACF,CAAC,CAAC;QAEH,IAAI,cAAuB,CAAC;QAC5B,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO,CAAC,GAAG;gBACf,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;gBACnE,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC;gBAC7B,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,CAAC,IAAI,EAAE;YACtB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,cAAkC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAE3C,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO,CAAC,GAAG;gBACf,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAC9D,CAAC,GAAU,EAAE,EAAE;YACb,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC/C,uCAAuC,GAAG,CAAC,OAAO,EAAE,CACrD,CAAC;YACF,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAClC,iDAAiD,GAAG,CAAC,OAAO,EAAE,CAC/D,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;QAC/G,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC;gBACE,GAAG,EAAE,8BAA8B;gBACnC,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,GAAG;gBACnB,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO;gBACX,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CACH,WAAW,CAAC,IAAI,EAAE;YAChB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,EAAE;SACd,CAAC,EACJ,CAAC,GAAU,EAAE,EAAE;YACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,0EAA0E,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;QAC/G,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC;gBACE,GAAG,EAAE,8BAA8B;gBACnC,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,GAAG;gBACnB,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;aAC3B;YACD;gBACE,GAAG,EAAE,+BAA+B;gBACpC,MAAM,EAAE,MAAM;gBACd,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;gBACxB,cAAc,EAAE,GAAG;gBACnB,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAChC;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO,CAAC,GAAG;gBACf,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBACnD,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;YACrC,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.test.d.ts","sourceRoot":"","sources":["../src/secrets.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { runFlowTest } from './index.js';
|
|
4
|
+
const secretFlow = {
|
|
5
|
+
name: 'secret-flow',
|
|
6
|
+
trigger: { type: 'webhook' },
|
|
7
|
+
async handler(ctx, input) {
|
|
8
|
+
return { value: await ctx.secrets.get(input.key) };
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
describe('ctx.secrets in runFlowTest', () => {
|
|
12
|
+
it('initialSecrets pre-populates ctx.secrets', async () => {
|
|
13
|
+
const result = await runFlowTest(secretFlow, {
|
|
14
|
+
input: { key: 'API_KEY' },
|
|
15
|
+
initialSecrets: { API_KEY: 'abc123' },
|
|
16
|
+
});
|
|
17
|
+
assert.deepEqual(result.output, { value: 'abc123' });
|
|
18
|
+
});
|
|
19
|
+
it('secrets are isolated per runFlowTest invocation', async () => {
|
|
20
|
+
await runFlowTest(secretFlow, {
|
|
21
|
+
input: { key: 'API_KEY' },
|
|
22
|
+
initialSecrets: { API_KEY: 'first-secret' },
|
|
23
|
+
});
|
|
24
|
+
const result = await runFlowTest(secretFlow, {
|
|
25
|
+
input: { key: 'API_KEY' },
|
|
26
|
+
});
|
|
27
|
+
assert.deepEqual(result.output, { value: undefined });
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=secrets.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.test.js","sourceRoot":"","sources":["../src/secrets.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,GAAmE;IACjF,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC5B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK;QACtB,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACrD,CAAC;CACF,CAAC;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;YAC3C,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;YACzB,cAAc,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SACtC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,WAAW,CAAC,UAAU,EAAE;YAC5B,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;YACzB,cAAc,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;SAC5C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;YAC3C,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;SAC1B,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { runFlowTest } from './index.js';
|
|
4
|
+
const stateFlow = {
|
|
5
|
+
name: 'state-flow',
|
|
6
|
+
trigger: { type: 'polling', schedule: '0/5 * * * *' },
|
|
7
|
+
async handler(ctx, input) {
|
|
8
|
+
if (input.value !== undefined) {
|
|
9
|
+
await ctx.state.set(input.key, input.value);
|
|
10
|
+
}
|
|
11
|
+
const current = await ctx.state.get(input.key);
|
|
12
|
+
return { key: input.key, value: current };
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
describe('ctx.state in runFlowTest', () => {
|
|
16
|
+
it('returns undefined for a key that was never set', async () => {
|
|
17
|
+
const result = await runFlowTest(stateFlow, { input: { key: 'missing' } });
|
|
18
|
+
assert.deepEqual(result.output, { key: 'missing', value: undefined });
|
|
19
|
+
});
|
|
20
|
+
it('set persists and get retrieves the value', async () => {
|
|
21
|
+
const result = await runFlowTest(stateFlow, {
|
|
22
|
+
input: { key: 'cursor', value: 'abc123' },
|
|
23
|
+
});
|
|
24
|
+
assert.deepEqual(result.output, { key: 'cursor', value: 'abc123' });
|
|
25
|
+
assert.equal(result.stateValues['cursor'], 'abc123');
|
|
26
|
+
});
|
|
27
|
+
it('initialState pre-populates ctx.state', async () => {
|
|
28
|
+
const result = await runFlowTest(stateFlow, {
|
|
29
|
+
input: { key: 'last_id' },
|
|
30
|
+
initialState: { last_id: 42 },
|
|
31
|
+
});
|
|
32
|
+
assert.deepEqual(result.output, { key: 'last_id', value: 42 });
|
|
33
|
+
});
|
|
34
|
+
it('stateValues reflects all keys written during the run', async () => {
|
|
35
|
+
const writeFlow = {
|
|
36
|
+
name: 'write-flow',
|
|
37
|
+
trigger: { type: 'polling', schedule: '0/5 * * * *' },
|
|
38
|
+
async handler(ctx) {
|
|
39
|
+
await ctx.state.set('a', 1);
|
|
40
|
+
await ctx.state.set('b', 2);
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const result = await runFlowTest(writeFlow, { input: {} });
|
|
44
|
+
assert.deepEqual(result.stateValues, { a: 1, b: 2 });
|
|
45
|
+
});
|
|
46
|
+
it('isolation: state is independent per runFlowTest call', async () => {
|
|
47
|
+
await runFlowTest(stateFlow, { input: { key: 'x', value: 'first' } });
|
|
48
|
+
const result = await runFlowTest(stateFlow, { input: { key: 'x' } });
|
|
49
|
+
assert.deepEqual(result.output, { key: 'x', value: undefined });
|
|
50
|
+
});
|
|
51
|
+
it('initialConfig is exposed as readonly ctx.config', async () => {
|
|
52
|
+
const configFlow = {
|
|
53
|
+
name: 'config-flow',
|
|
54
|
+
trigger: { type: 'webhook' },
|
|
55
|
+
async handler(ctx) {
|
|
56
|
+
return ctx.config;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const result = await runFlowTest(configFlow, {
|
|
60
|
+
input: {},
|
|
61
|
+
initialConfig: { region: 'us-east-1', retries: 3 },
|
|
62
|
+
});
|
|
63
|
+
assert.deepEqual(result.output, { region: 'us-east-1', retries: 3 });
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,SAAS,GAA8D;IAC3E,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE;IACrD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK;QACtB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;CACF,CAAC;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE;YAC1C,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE;YAC1C,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;YACzB,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,SAAS,GAAgD;YAC7D,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE;YACrD,KAAK,CAAC,OAAO,CAAC,GAAG;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC5B,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,UAAU,GAAmD;YACjE,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO,CAAC,GAAG;gBACf,OAAO,GAAG,CAAC,MAAM,CAAC;YACpB,CAAC;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;YAC3C,KAAK,EAAE,EAAE;YACT,aAAa,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@in2grate/testing",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@in2grate/sdk": "0.1.0"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^20.17.0",
|
|
24
|
+
"typescript": "^5.7.0"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"test": "tsc && node --test dist/state.test.js dist/replay.test.js dist/cassette.test.js dist/poll.test.js dist/http-mocks.test.js dist/error-helpers.test.js dist/secrets.test.js dist/oauth.test.js",
|
|
29
|
+
"lint": "eslint src",
|
|
30
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
31
|
+
}
|
|
32
|
+
}
|