blueprint-runtime 0.0.0-stage → 0.3.1
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 +224 -3
- package/dist/src/blueprint/load.js +83 -0
- package/dist/src/blueprint/load.js.map +1 -0
- package/dist/src/blueprint/plan.js +202 -0
- package/dist/src/blueprint/plan.js.map +1 -0
- package/dist/src/cli.js +182 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/expr/dates.js +152 -0
- package/dist/src/expr/dates.js.map +1 -0
- package/dist/src/expr/decimal.js +66 -0
- package/dist/src/expr/decimal.js.map +1 -0
- package/dist/src/expr/errors.js +31 -0
- package/dist/src/expr/errors.js.map +1 -0
- package/dist/src/expr/evaluate.js +250 -0
- package/dist/src/expr/evaluate.js.map +1 -0
- package/dist/src/expr/functions.js +460 -0
- package/dist/src/expr/functions.js.map +1 -0
- package/dist/src/expr/parser.js +228 -0
- package/dist/src/expr/parser.js.map +1 -0
- package/dist/src/expr/scan.js +101 -0
- package/dist/src/expr/scan.js.map +1 -0
- package/dist/src/expr/values.js +118 -0
- package/dist/src/expr/values.js.map +1 -0
- package/dist/src/findings.js +10 -0
- package/dist/src/findings.js.map +1 -0
- package/dist/src/inspect.js +313 -0
- package/dist/src/inspect.js.map +1 -0
- package/dist/src/json/parse.js +225 -0
- package/dist/src/json/parse.js.map +1 -0
- package/dist/src/registry.js +39 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/run/case.js +122 -0
- package/dist/src/run/case.js.map +1 -0
- package/dist/src/run/compare.js +94 -0
- package/dist/src/run/compare.js.map +1 -0
- package/dist/src/run/fixtures.js +122 -0
- package/dist/src/run/fixtures.js.map +1 -0
- package/dist/src/run/modules.js +380 -0
- package/dist/src/run/modules.js.map +1 -0
- package/dist/src/run/operators.js +151 -0
- package/dist/src/run/operators.js.map +1 -0
- package/dist/src/run/scheduler.js +306 -0
- package/dist/src/run/scheduler.js.map +1 -0
- package/dist/src/run/trace.js +2 -0
- package/dist/src/run/trace.js.map +1 -0
- package/package.json +60 -6
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { DataError, UnsupportedError } from '../expr/errors.js';
|
|
2
|
+
import { evaluateMapper } from '../expr/evaluate.js';
|
|
3
|
+
import { fromJson, MISSING } from '../expr/values.js';
|
|
4
|
+
import { isObject } from '../json/parse.js';
|
|
5
|
+
import { basicTriggerBundles, handlerFor, isOpaqueModule, ModuleFailure, textAggregatorResult, textAggregatorRow, textAggregatorSeparator } from './modules.js';
|
|
6
|
+
import { FixtureSet } from './fixtures.js';
|
|
7
|
+
import { OPERATORS } from './operators.js';
|
|
8
|
+
export class LimitExceededError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = 'LimitExceededError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Unwinds the run after a module error, the way Make stops the scenario. */
|
|
15
|
+
class RunStopped extends Error {
|
|
16
|
+
}
|
|
17
|
+
const branchKey = (b) => b.map((s) => `${s.owner}:${s.kind}:${s.index}`).join('/');
|
|
18
|
+
/**
|
|
19
|
+
* Runs a scenario that starts with a Custom webhook: the main flow, router routes in
|
|
20
|
+
* order, and filters. Every route whose filter passes runs; the fallback route runs
|
|
21
|
+
* only when no other route did (corpus B). An iterator sends each bundle through the
|
|
22
|
+
* rest of its flow, or up to the Text aggregator that collects it (corpus C, C2), and
|
|
23
|
+
* so does a trigger that emits several bundles (corpus T).
|
|
24
|
+
*/
|
|
25
|
+
/** The case's input does not fit the scenario's trigger. Bad test data, not a Make behavior: exit 2. */
|
|
26
|
+
export class InvalidInputError extends Error {
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = 'InvalidInputError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The bundles the trigger emits, from the case input ("trigger output from a file", spec 2):
|
|
34
|
+
* - Custom webhook: the input is the payload, one bundle.
|
|
35
|
+
* - Basic trigger: the bundles written in the blueprint; the input is not used (T-01..T-08).
|
|
36
|
+
* - a third-party app trigger (Google Sheets "Watch rows", RSS, Typeform, …): the input is
|
|
37
|
+
* the list of bundles it emitted. The connector itself is not verified, as with module
|
|
38
|
+
* fixtures; how a run processes the bundles was recorded with the Basic trigger.
|
|
39
|
+
*/
|
|
40
|
+
function triggerBundles(trigger, input) {
|
|
41
|
+
if (trigger.module === 'gateway:CustomWebHook')
|
|
42
|
+
return [input];
|
|
43
|
+
if (trigger.module === 'util:BasicTrigger')
|
|
44
|
+
return basicTriggerBundles(trigger);
|
|
45
|
+
if (isOpaqueModule(trigger.module)) {
|
|
46
|
+
if (!Array.isArray(input) || !input.every(isObject)) {
|
|
47
|
+
throw new InvalidInputError(`the scenario starts with ${trigger.module}: the input must be the list of bundles it emitted (a JSON array of objects)`);
|
|
48
|
+
}
|
|
49
|
+
return input;
|
|
50
|
+
}
|
|
51
|
+
throw new UnsupportedError(`the scenario starts with ${trigger.module}; only a Custom webhook, the Basic trigger or a third-party app trigger can start a run yet`);
|
|
52
|
+
}
|
|
53
|
+
export function runScenario(plan, payload, options) {
|
|
54
|
+
const [trigger] = plan.modules;
|
|
55
|
+
if (!trigger)
|
|
56
|
+
throw new UnsupportedError('the scenario has no modules');
|
|
57
|
+
for (const m of plan.modules.slice(1)) {
|
|
58
|
+
if (m.hasErrorHandler)
|
|
59
|
+
throw new UnsupportedError(`module ${m.id} has an error handler; error handlers do not run yet`);
|
|
60
|
+
if (m.module !== 'builtin:BasicRouter' && m.module !== 'util:TextAggregator' && !handlerFor(m.module))
|
|
61
|
+
throw new UnsupportedError(`module ${m.id} (${m.module}) cannot run yet`);
|
|
62
|
+
}
|
|
63
|
+
// The plan is a flat depth-first list; group it back into flows (main flow, each route).
|
|
64
|
+
const flows = new Map();
|
|
65
|
+
for (const m of plan.modules) {
|
|
66
|
+
const key = branchKey(m.branch);
|
|
67
|
+
flows.set(key, [...(flows.get(key) ?? []), m]);
|
|
68
|
+
}
|
|
69
|
+
const budget = options.maxOperations ?? 10_000;
|
|
70
|
+
const fixtures = options.fixtures ?? new FixtureSet();
|
|
71
|
+
const outputs = new Map();
|
|
72
|
+
const operations = new Map();
|
|
73
|
+
/** The module whose mapping is being evaluated: only there has `now` been recorded. */
|
|
74
|
+
let mapping = null;
|
|
75
|
+
const ctx = {
|
|
76
|
+
timezone: options.timezone,
|
|
77
|
+
output: (id) => outputs.get(id) ?? MISSING,
|
|
78
|
+
now: () => {
|
|
79
|
+
if (!mapping)
|
|
80
|
+
throw new UnsupportedError('`now` in a filter or an aggregator has not been observed in Make (only in a module\'s mapping)');
|
|
81
|
+
if (!options.clock)
|
|
82
|
+
throw new UnsupportedError('`now` needs a clock: give the case environment a "now" (Make uses the time each module starts, corpus N-01)');
|
|
83
|
+
return options.clock(mapping.id, mapping.operation);
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
const steps = [];
|
|
87
|
+
const trace = { schemaVersion: 2, source: 'blueprint-runtime', status: 'success', steps };
|
|
88
|
+
let total = 0;
|
|
89
|
+
const nextOperation = (id) => {
|
|
90
|
+
if (++total > budget)
|
|
91
|
+
throw new LimitExceededError(`more than ${budget} operations`);
|
|
92
|
+
const n = (operations.get(id) ?? 0) + 1;
|
|
93
|
+
operations.set(id, n);
|
|
94
|
+
return n;
|
|
95
|
+
};
|
|
96
|
+
const evalFilter = (m, fallback) => {
|
|
97
|
+
const conditions = m.filter?.conditions ?? [];
|
|
98
|
+
if (fallback) {
|
|
99
|
+
if (conditions.some((g) => g.length > 0))
|
|
100
|
+
throw new UnsupportedError(`module ${m.id}: a fallback route with its own conditions has not been observed in Make`);
|
|
101
|
+
steps.push({ kind: 'filter', moduleId: m.id, passed: true, report: [] }); // corpus B-04: fallback logged with an empty report
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
if (conditions.length === 0 || conditions.some((g) => g.length === 0))
|
|
105
|
+
throw new UnsupportedError(`module ${m.id}: a filter with an empty condition group has not been observed in Make`);
|
|
106
|
+
const test = (c) => {
|
|
107
|
+
const op = OPERATORS[c.o];
|
|
108
|
+
if (!op)
|
|
109
|
+
throw new UnsupportedError(`module ${m.id}: filter operator "${c.o}" has not been observed in Make`);
|
|
110
|
+
try {
|
|
111
|
+
return op(evaluateMapper(c.a, ctx), c.b === undefined ? MISSING : evaluateMapper(c.b, ctx), ctx);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
if (e instanceof DataError)
|
|
115
|
+
throw new UnsupportedError(`module ${m.id}: an error inside a filter has not been observed in Make (${e.message})`);
|
|
116
|
+
throw e;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
// OR of ANDs, short-circuited like Make: an AND group stops at its first false
|
|
120
|
+
// condition, and the report only lists conditions that were evaluated
|
|
121
|
+
// (F1 and_tf: [[false]], or_and: [[false], [true]]). Stopping the OR at the first
|
|
122
|
+
// passing group is assumed from the same evaluation style; it has not been observed.
|
|
123
|
+
const report = [];
|
|
124
|
+
let passed = false;
|
|
125
|
+
for (const group of conditions) {
|
|
126
|
+
const results = [];
|
|
127
|
+
for (const c of group) {
|
|
128
|
+
const r = test(c);
|
|
129
|
+
results.push(r);
|
|
130
|
+
if (!r)
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
report.push(results);
|
|
134
|
+
if (results.length === group.length && results.every(Boolean)) {
|
|
135
|
+
passed = true;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const step = { kind: 'filter', moduleId: m.id, passed, report };
|
|
140
|
+
steps.push(step);
|
|
141
|
+
return step.passed;
|
|
142
|
+
};
|
|
143
|
+
const runModule = (m) => {
|
|
144
|
+
const operation = nextOperation(m.id);
|
|
145
|
+
try {
|
|
146
|
+
mapping = { id: m.id, operation };
|
|
147
|
+
let result;
|
|
148
|
+
try {
|
|
149
|
+
result = handlerFor(m.module).run(m, ctx, { operation, fixtures });
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
mapping = null;
|
|
153
|
+
}
|
|
154
|
+
steps.push({ kind: 'module', id: m.id, operation, input: result.input, output: result.output });
|
|
155
|
+
const first = result.output[0];
|
|
156
|
+
outputs.set(m.id, first === undefined ? MISSING : fromJson(first));
|
|
157
|
+
if (result.response && !trace.response)
|
|
158
|
+
trace.response = result.response;
|
|
159
|
+
return result.output;
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
if (e instanceof ModuleFailure) {
|
|
163
|
+
steps.push({ kind: 'module', id: m.id, operation, input: e.input, output: [null] });
|
|
164
|
+
trace.status = 'error';
|
|
165
|
+
trace.error = { moduleId: m.id, name: e.errorName, message: e.message };
|
|
166
|
+
throw new RunStopped();
|
|
167
|
+
}
|
|
168
|
+
if (!(e instanceof DataError))
|
|
169
|
+
throw e;
|
|
170
|
+
// Make records the failing module with no input and one null output, then stops (corpus D-05).
|
|
171
|
+
steps.push({ kind: 'module', id: m.id, operation, input: [], output: [null] });
|
|
172
|
+
trace.status = 'error';
|
|
173
|
+
trace.error = { moduleId: m.id, name: 'DataError', message: e.message };
|
|
174
|
+
throw new RunStopped();
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const runRouter = (router) => {
|
|
178
|
+
const count = router.routeCount ?? 0;
|
|
179
|
+
const fallback = router.elseRoute;
|
|
180
|
+
if (fallback !== undefined && fallback !== count - 1)
|
|
181
|
+
throw new UnsupportedError(`router ${router.id}: a fallback that is not the last route has not been observed in Make`);
|
|
182
|
+
let anyPassed = false;
|
|
183
|
+
for (let r = 0; r < count; r++) {
|
|
184
|
+
if (r === fallback)
|
|
185
|
+
continue;
|
|
186
|
+
if (runFlow(routeFlow(router, r), false))
|
|
187
|
+
anyPassed = true;
|
|
188
|
+
}
|
|
189
|
+
if (fallback !== undefined && !anyPassed)
|
|
190
|
+
runFlow(routeFlow(router, fallback), true);
|
|
191
|
+
};
|
|
192
|
+
const routeFlow = (router, r) => {
|
|
193
|
+
const flow = flows.get(branchKey([...router.branch, { owner: router.id, kind: 'route', index: r }])) ?? [];
|
|
194
|
+
if (flow.length === 0)
|
|
195
|
+
throw new UnsupportedError(`router ${router.id}: an empty route has not been observed in Make`);
|
|
196
|
+
return flow;
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Sends each bundle of a feeder (an iterator, or the trigger) down the modules after
|
|
200
|
+
* it, depth-first: one bundle finishes before the next starts (iterator C2-noagg-01,
|
|
201
|
+
* trigger T-01). They run up to the Text aggregator that collects the feeder, or to the
|
|
202
|
+
* end of the flow if there is none. The aggregator then runs once with the rows that
|
|
203
|
+
* reached it: 1 operation, even with none (C-03, C-04). After it, the feeder and the
|
|
204
|
+
* modules in between read as missing (C2-after, T-04). Returns the index in `rest` of
|
|
205
|
+
* the last module it ran.
|
|
206
|
+
*
|
|
207
|
+
* wholeFlow (the trigger): without an aggregator each bundle runs the rest of the flow
|
|
208
|
+
* as a normal flow, routers included (T-03). Otherwise only Set variable has been
|
|
209
|
+
* observed running per bundle.
|
|
210
|
+
*/
|
|
211
|
+
const fanOut = (feeder, bundles, rest, wholeFlow) => {
|
|
212
|
+
const j = rest.findIndex((m) => m.module === 'util:TextAggregator' && m.parameters['feeder'] === feeder.id);
|
|
213
|
+
const aggregator = j < 0 ? null : rest[j];
|
|
214
|
+
const scope = j < 0 ? rest : rest.slice(0, j);
|
|
215
|
+
const what = wholeFlow ? `bundle of trigger ${feeder.id}` : `bundle of iterator ${feeder.id}`;
|
|
216
|
+
if (!wholeFlow || aggregator) {
|
|
217
|
+
for (const m of scope) {
|
|
218
|
+
if (m.module !== 'util:SetVariable2')
|
|
219
|
+
throw new UnsupportedError(`module ${m.id} (${m.module}) running once per ${what}${aggregator ? ' before its aggregator' : ''} has not been observed in Make`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (aggregator?.filter)
|
|
223
|
+
throw new UnsupportedError(`aggregator ${aggregator.id}: a filter on an aggregator has not been observed in Make`);
|
|
224
|
+
if (aggregator && wholeFlow && bundles.length === 0)
|
|
225
|
+
throw new UnsupportedError(`aggregator ${aggregator.id}: a trigger with no bundles followed by an aggregator has not been observed in Make (with no bundles nothing after the trigger ran, T-05)`);
|
|
226
|
+
const separator = aggregator ? textAggregatorSeparator(aggregator) : '';
|
|
227
|
+
const rows = [];
|
|
228
|
+
for (const bundle of bundles) {
|
|
229
|
+
outputs.set(feeder.id, fromJson(bundle));
|
|
230
|
+
if (wholeFlow && !aggregator) {
|
|
231
|
+
runFlow(scope, false);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const reached = scope.every((m) => {
|
|
235
|
+
if (m.filter && !evalFilter(m, false))
|
|
236
|
+
return false;
|
|
237
|
+
runModule(m);
|
|
238
|
+
return true;
|
|
239
|
+
});
|
|
240
|
+
if (!reached || !aggregator)
|
|
241
|
+
continue;
|
|
242
|
+
try {
|
|
243
|
+
rows.push(textAggregatorRow(aggregator, ctx));
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
if (e instanceof DataError)
|
|
247
|
+
throw new UnsupportedError(`aggregator ${aggregator.id}: a mapping error inside an aggregator has not been observed in Make (${e.message})`);
|
|
248
|
+
throw e;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (!aggregator)
|
|
252
|
+
return rest.length - 1;
|
|
253
|
+
for (const m of [feeder, ...scope])
|
|
254
|
+
outputs.delete(m.id);
|
|
255
|
+
const result = textAggregatorResult(rows, separator);
|
|
256
|
+
steps.push({ kind: 'module', id: aggregator.id, operation: nextOperation(aggregator.id), input: result.input, output: result.output });
|
|
257
|
+
outputs.set(aggregator.id, fromJson(result.output[0]));
|
|
258
|
+
return j;
|
|
259
|
+
};
|
|
260
|
+
const runIteration = (flow, i) => i + 1 + fanOut(flow[i], runModule(flow[i]), flow.slice(i + 1), false);
|
|
261
|
+
/** Runs a flow from its first module. Returns false if the first module's filter stopped the bundle. */
|
|
262
|
+
const runFlow = (flow, isFallback) => {
|
|
263
|
+
for (let i = 0; i < flow.length; i++) {
|
|
264
|
+
const m = flow[i];
|
|
265
|
+
if ((m.filter || (isFallback && i === 0)) && !evalFilter(m, isFallback && i === 0))
|
|
266
|
+
return i > 0;
|
|
267
|
+
if (m.module === 'builtin:BasicRouter') {
|
|
268
|
+
runRouter(m);
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
if (m.module === 'builtin:BasicFeeder') {
|
|
272
|
+
i = runIteration(flow, i);
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (m.module === 'util:TextAggregator')
|
|
276
|
+
throw new UnsupportedError(`aggregator ${m.id} has no iterator before it in the same flow; that has not been observed in Make`);
|
|
277
|
+
runModule(m);
|
|
278
|
+
}
|
|
279
|
+
return true;
|
|
280
|
+
};
|
|
281
|
+
// The trigger is 1 operation and logs all its bundles at once (T-01); with none it logs
|
|
282
|
+
// an empty output and nothing else runs (T-05). Each bundle then runs the main flow.
|
|
283
|
+
const bundles = triggerBundles(trigger, payload);
|
|
284
|
+
steps.push({ kind: 'module', id: trigger.id, operation: nextOperation(trigger.id), input: [], output: bundles });
|
|
285
|
+
try {
|
|
286
|
+
const main = (flows.get('') ?? []).slice(1);
|
|
287
|
+
const last = fanOut(trigger, bundles, main, true);
|
|
288
|
+
// After an aggregator on the trigger, the rest of the flow runs once (T-04).
|
|
289
|
+
if (last < main.length - 1)
|
|
290
|
+
runFlow(main.slice(last + 1), false);
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
// An error stops the whole run: later bundles never start (T-07).
|
|
294
|
+
if (!(e instanceof RunStopped))
|
|
295
|
+
throw e;
|
|
296
|
+
}
|
|
297
|
+
if (fixtures.uses.length)
|
|
298
|
+
trace.fixtures = fixtures.uses;
|
|
299
|
+
// Only a webhook has a caller waiting for an answer.
|
|
300
|
+
if (trigger.module === 'gateway:CustomWebHook' && !trace.response) {
|
|
301
|
+
// What the webhook caller gets when no Webhook response module answered (corpus B, D-05).
|
|
302
|
+
trace.response = trace.status === 'error' ? { status: 500, body: 'Scenario failed to complete.' } : { status: 200, body: 'Accepted' };
|
|
303
|
+
}
|
|
304
|
+
return trace;
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/run/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/run/trace.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,60 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "blueprint-runtime",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "blueprint-runtime",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Test Make.com (Integromat) scenarios offline: run exported blueprints locally, replay real Make runs and catch broken mappings before deploy. CLI test runner and blueprint validator, CI ready.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"make",
|
|
7
|
+
"make.com",
|
|
8
|
+
"makecom",
|
|
9
|
+
"integromat",
|
|
10
|
+
"make-scenario",
|
|
11
|
+
"make-blueprint",
|
|
12
|
+
"blueprint",
|
|
13
|
+
"scenario-testing",
|
|
14
|
+
"no-code",
|
|
15
|
+
"low-code",
|
|
16
|
+
"automation",
|
|
17
|
+
"workflow-automation",
|
|
18
|
+
"testing",
|
|
19
|
+
"test-runner",
|
|
20
|
+
"regression-testing",
|
|
21
|
+
"offline",
|
|
22
|
+
"validator",
|
|
23
|
+
"linter",
|
|
24
|
+
"ci",
|
|
25
|
+
"cli"
|
|
26
|
+
],
|
|
27
|
+
"homepage": "https://github.com/intikhab49/blueprint-runtime#readme",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/intikhab49/blueprint-runtime.git"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/intikhab49/blueprint-runtime/issues"
|
|
34
|
+
},
|
|
35
|
+
"author": "Intikhab Azam",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"type": "module",
|
|
38
|
+
"bin": {
|
|
39
|
+
"bpr": "dist/src/cli.js"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"README.md",
|
|
44
|
+
"LICENSE"
|
|
45
|
+
],
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=24"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
51
|
+
"build": "tsc -p tsconfig.build.json",
|
|
52
|
+
"test": "node --test \"test/**/*.test.ts\"",
|
|
53
|
+
"bpr": "node src/cli.ts",
|
|
54
|
+
"prepare": "tsc -p tsconfig.build.json"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/node": "24.19.2",
|
|
58
|
+
"typescript": "7.0.2"
|
|
59
|
+
}
|
|
60
|
+
}
|