@flow-as-code/cli 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 +202 -0
- package/README.md +446 -0
- package/dist/aws.d.ts +28 -0
- package/dist/aws.d.ts.map +1 -0
- package/dist/aws.js +104 -0
- package/dist/aws.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +132 -0
- package/dist/bin.js.map +1 -0
- package/dist/bridge/exportFiles.d.ts +16 -0
- package/dist/bridge/exportFiles.d.ts.map +1 -0
- package/dist/bridge/exportFiles.js +95 -0
- package/dist/bridge/exportFiles.js.map +1 -0
- package/dist/bridge/pair.d.ts +103 -0
- package/dist/bridge/pair.d.ts.map +1 -0
- package/dist/bridge/pair.js +219 -0
- package/dist/bridge/pair.js.map +1 -0
- package/dist/bridge/protocol.d.ts +187 -0
- package/dist/bridge/protocol.d.ts.map +1 -0
- package/dist/bridge/protocol.js +132 -0
- package/dist/bridge/protocol.js.map +1 -0
- package/dist/bridge/server.d.ts +95 -0
- package/dist/bridge/server.d.ts.map +1 -0
- package/dist/bridge/server.js +669 -0
- package/dist/bridge/server.js.map +1 -0
- package/dist/cdk-scaffold.d.ts +16 -0
- package/dist/cdk-scaffold.d.ts.map +1 -0
- package/dist/cdk-scaffold.js +28 -0
- package/dist/cdk-scaffold.js.map +1 -0
- package/dist/codegen.d.ts +5 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +27 -0
- package/dist/codegen.js.map +1 -0
- package/dist/diff.d.ts +33 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +225 -0
- package/dist/diff.js.map +1 -0
- package/dist/docs.d.ts +46 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +223 -0
- package/dist/docs.js.map +1 -0
- package/dist/emit.d.ts +8 -0
- package/dist/emit.d.ts.map +1 -0
- package/dist/emit.js +55 -0
- package/dist/emit.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/export.d.ts +27 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +126 -0
- package/dist/export.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/lint.d.ts +6 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +31 -0
- package/dist/lint.js.map +1 -0
- package/dist/render.d.ts +6 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +49 -0
- package/dist/render.js.map +1 -0
- package/dist/run.d.ts +13 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +38 -0
- package/dist/run.js.map +1 -0
- package/dist/simulate.d.ts +35 -0
- package/dist/simulate.d.ts.map +1 -0
- package/dist/simulate.js +194 -0
- package/dist/simulate.js.map +1 -0
- package/dist/studio.d.ts +23 -0
- package/dist/studio.d.ts.map +1 -0
- package/dist/studio.js +120 -0
- package/dist/studio.js.map +1 -0
- package/dist/synth-resolve-hook.d.ts +19 -0
- package/dist/synth-resolve-hook.d.ts.map +1 -0
- package/dist/synth-resolve-hook.js +127 -0
- package/dist/synth-resolve-hook.js.map +1 -0
- package/dist/synth-runner.d.ts +12 -0
- package/dist/synth-runner.d.ts.map +1 -0
- package/dist/synth-runner.js +145 -0
- package/dist/synth-runner.js.map +1 -0
- package/dist/synth.d.ts +55 -0
- package/dist/synth.d.ts.map +1 -0
- package/dist/synth.js +327 -0
- package/dist/synth.js.map +1 -0
- package/dist/watch.d.ts +66 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +293 -0
- package/dist/watch.js.map +1 -0
- package/package.json +85 -0
- package/schema/flowdoc-0.1.schema.json +669 -0
- package/schema/scenario-0.1.schema.json +318 -0
- package/src/aws.ts +149 -0
- package/src/bin.ts +179 -0
- package/src/bridge/exportFiles.ts +116 -0
- package/src/bridge/pair.ts +312 -0
- package/src/bridge/protocol.ts +289 -0
- package/src/bridge/server.ts +827 -0
- package/src/cdk-scaffold.ts +41 -0
- package/src/codegen.ts +36 -0
- package/src/diff.ts +279 -0
- package/src/docs.ts +249 -0
- package/src/emit.ts +69 -0
- package/src/errors.ts +27 -0
- package/src/export.ts +167 -0
- package/src/index.ts +27 -0
- package/src/lint.ts +42 -0
- package/src/render.ts +58 -0
- package/src/run.ts +42 -0
- package/src/simulate.ts +244 -0
- package/src/studio.ts +143 -0
- package/src/synth-resolve-hook.ts +152 -0
- package/src/synth-runner.ts +157 -0
- package/src/synth.ts +380 -0
- package/src/watch.ts +388 -0
package/dist/watch.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 The flow-as-code Authors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
// Watch engine: keeps <name>.flow.ts and <name>.flowdoc.json pairs in sync
|
|
6
|
+
// inside one directory. A library, not a command: the studio server (A11)
|
|
7
|
+
// consumes these events, and `flow-cli studio` will sit on top.
|
|
8
|
+
//
|
|
9
|
+
// Sync direction here is ts -> doc only. On a ts change the file is re-synthed
|
|
10
|
+
// in the same sandboxed child process `flow-cli synth` uses, and the FlowDoc
|
|
11
|
+
// is rewritten UNLESS the doc on disk was edited by someone else since this
|
|
12
|
+
// watcher last wrote or observed it AND that edit does not carry the
|
|
13
|
+
// sourceHash of the previous ts content. That state is dirty-both: the
|
|
14
|
+
// watcher emits "conflict" and writes nothing. Never silently overwrite
|
|
15
|
+
// (docs/01-flowdoc-spec.md, invariants 3 and the sourceHash dirty guard).
|
|
16
|
+
//
|
|
17
|
+
// One event is emitted for a change that alters nothing: a builder file edited
|
|
18
|
+
// back to the exact bytes of the last successful sync, after a failed one.
|
|
19
|
+
// Consumers latch "error" (the studio keeps a badge up until the document syncs
|
|
20
|
+
// again), so a state that ends by being undone has to end with a "synced" or
|
|
21
|
+
// the badge outlives the condition it reports.
|
|
22
|
+
import { createHash } from "node:crypto";
|
|
23
|
+
import { readFile } from "node:fs/promises";
|
|
24
|
+
import { writeFile } from "node:fs/promises";
|
|
25
|
+
import { basename, join, resolve } from "node:path";
|
|
26
|
+
import { watch as chokidarWatch } from "chokidar";
|
|
27
|
+
import { serializeWithMeta, synthFile } from "./synth.js";
|
|
28
|
+
const TS_SUFFIX = ".flow.ts";
|
|
29
|
+
const DOC_SUFFIX = ".flowdoc.json";
|
|
30
|
+
function hashHex(bytes) {
|
|
31
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
32
|
+
}
|
|
33
|
+
class Watcher {
|
|
34
|
+
listeners = new Map();
|
|
35
|
+
ledger = new Map();
|
|
36
|
+
/** Per-pair task chain so two changes to one pair never synth concurrently. */
|
|
37
|
+
chains = new Map();
|
|
38
|
+
fsWatcher;
|
|
39
|
+
dir;
|
|
40
|
+
closed = false;
|
|
41
|
+
constructor(dir) {
|
|
42
|
+
this.dir = resolve(dir);
|
|
43
|
+
// chokidar v5 takes no globs: watch the directory, filter paths here.
|
|
44
|
+
// awaitWriteFinish debounces editors' partial/atomic writes; the
|
|
45
|
+
// thresholds are far below the 1 second sync budget.
|
|
46
|
+
this.fsWatcher = chokidarWatch(this.dir, {
|
|
47
|
+
ignoreInitial: false,
|
|
48
|
+
depth: 0,
|
|
49
|
+
awaitWriteFinish: { stabilityThreshold: 50, pollInterval: 10 },
|
|
50
|
+
});
|
|
51
|
+
this.fsWatcher.on("add", (path) => this.route(path));
|
|
52
|
+
this.fsWatcher.on("change", (path) => this.route(path));
|
|
53
|
+
this.fsWatcher.on("error", (err) => {
|
|
54
|
+
this.emit("error", {
|
|
55
|
+
path: this.dir,
|
|
56
|
+
message: err instanceof Error ? err.message : String(err),
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
this.fsWatcher.on("ready", () => {
|
|
60
|
+
// Let the initial adds settle before declaring readiness.
|
|
61
|
+
void this.settled().then(() => {
|
|
62
|
+
if (!this.closed)
|
|
63
|
+
this.emit("ready", {});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
on(event, listener) {
|
|
68
|
+
let set = this.listeners.get(event);
|
|
69
|
+
if (set === undefined) {
|
|
70
|
+
set = new Set();
|
|
71
|
+
this.listeners.set(event, set);
|
|
72
|
+
}
|
|
73
|
+
set.add(listener);
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
off(event, listener) {
|
|
77
|
+
this.listeners.get(event)?.delete(listener);
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
once(event, listener) {
|
|
81
|
+
const wrapped = (payload) => {
|
|
82
|
+
this.off(event, wrapped);
|
|
83
|
+
listener(payload);
|
|
84
|
+
};
|
|
85
|
+
return this.on(event, wrapped);
|
|
86
|
+
}
|
|
87
|
+
noteWrite(name, contents) {
|
|
88
|
+
const entry = this.entry(name);
|
|
89
|
+
if (contents.tsContent !== undefined)
|
|
90
|
+
entry.lastTsHash = hashHex(contents.tsContent);
|
|
91
|
+
if (contents.docContent !== undefined)
|
|
92
|
+
entry.lastDocHash = hashHex(contents.docContent);
|
|
93
|
+
}
|
|
94
|
+
async close() {
|
|
95
|
+
this.closed = true;
|
|
96
|
+
await this.fsWatcher.close();
|
|
97
|
+
await this.settled();
|
|
98
|
+
}
|
|
99
|
+
emit(event, payload) {
|
|
100
|
+
for (const listener of [...(this.listeners.get(event) ?? [])]) {
|
|
101
|
+
listener(payload);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
settled() {
|
|
105
|
+
return Promise.all([...this.chains.values()]).then(() => undefined);
|
|
106
|
+
}
|
|
107
|
+
route(path) {
|
|
108
|
+
const file = basename(path);
|
|
109
|
+
let name;
|
|
110
|
+
if (file.endsWith(TS_SUFFIX))
|
|
111
|
+
name = file.slice(0, -TS_SUFFIX.length);
|
|
112
|
+
else if (file.endsWith(DOC_SUFFIX))
|
|
113
|
+
name = file.slice(0, -DOC_SUFFIX.length);
|
|
114
|
+
if (name === undefined || name === "")
|
|
115
|
+
return;
|
|
116
|
+
this.enqueue(name, file.endsWith(TS_SUFFIX));
|
|
117
|
+
}
|
|
118
|
+
enqueue(name, tsChanged) {
|
|
119
|
+
const prev = this.chains.get(name) ?? Promise.resolve();
|
|
120
|
+
const next = prev.then(() => tsChanged ? this.handleTsChange(name) : this.handleDocChange(name));
|
|
121
|
+
// Keep the chain alive even if a handler slips an exception through.
|
|
122
|
+
this.chains.set(name, next.catch((e) => {
|
|
123
|
+
this.emit("error", {
|
|
124
|
+
path: join(this.dir, name + TS_SUFFIX),
|
|
125
|
+
message: e instanceof Error ? e.message : String(e),
|
|
126
|
+
});
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
entry(name) {
|
|
130
|
+
let e = this.ledger.get(name);
|
|
131
|
+
if (e === undefined) {
|
|
132
|
+
e = {};
|
|
133
|
+
this.ledger.set(name, e);
|
|
134
|
+
}
|
|
135
|
+
return e;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A doc file appeared or changed. Our own writes echo back here and are
|
|
139
|
+
* recognized by hash; anything else is an external edit. The ledger keeps
|
|
140
|
+
* the last CLEAN state, so an external edit deliberately does not update
|
|
141
|
+
* it: the divergence is detected on the next ts change.
|
|
142
|
+
*/
|
|
143
|
+
async handleDocChange(name) {
|
|
144
|
+
const entry = this.entry(name);
|
|
145
|
+
const docPath = join(this.dir, name + DOC_SUFFIX);
|
|
146
|
+
let bytes;
|
|
147
|
+
try {
|
|
148
|
+
bytes = await readFile(docPath);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return; // deleted between event and read; the next ts change re-creates it
|
|
152
|
+
}
|
|
153
|
+
const docHash = hashHex(bytes);
|
|
154
|
+
if (entry.lastDocHash === undefined) {
|
|
155
|
+
// First observation of this doc (startup scan or a doc that appeared
|
|
156
|
+
// before its ts): record it as the observed baseline.
|
|
157
|
+
entry.lastDocHash = docHash;
|
|
158
|
+
}
|
|
159
|
+
// Otherwise: external edit (or our own echo, which matches lastDocHash
|
|
160
|
+
// and needs nothing). Leave the ledger pointing at the clean state.
|
|
161
|
+
}
|
|
162
|
+
async handleTsChange(name) {
|
|
163
|
+
if (this.closed)
|
|
164
|
+
return;
|
|
165
|
+
const entry = this.entry(name);
|
|
166
|
+
const tsPath = join(this.dir, name + TS_SUFFIX);
|
|
167
|
+
const docPath = join(this.dir, name + DOC_SUFFIX);
|
|
168
|
+
let tsBytes;
|
|
169
|
+
try {
|
|
170
|
+
tsBytes = await readFile(tsPath);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return; // deleted between event and read
|
|
174
|
+
}
|
|
175
|
+
const tsHash = hashHex(tsBytes);
|
|
176
|
+
if (tsHash === entry.lastTsHash) {
|
|
177
|
+
// Normally an echo of our own write, or a touch: nothing to say. But it
|
|
178
|
+
// is also how a broken edit gets undone. Ctrl+Z back to the bytes we last
|
|
179
|
+
// synced from produces no synth and no event, so a consumer that latched
|
|
180
|
+
// the preceding `error` (the studio's "Code out of sync" badge) kept
|
|
181
|
+
// showing it until some unrelated edit happened. The doc on disk is still
|
|
182
|
+
// the one these bytes produced, so the pair IS in sync: say so.
|
|
183
|
+
if (entry.errored === true) {
|
|
184
|
+
entry.errored = false;
|
|
185
|
+
this.emit("synced", { tsPath, docPath, name });
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Read the doc side to run the dirty guard.
|
|
190
|
+
let docBytes;
|
|
191
|
+
try {
|
|
192
|
+
docBytes = await readFile(docPath);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
docBytes = undefined;
|
|
196
|
+
}
|
|
197
|
+
if (docBytes !== undefined) {
|
|
198
|
+
const docHash = hashHex(docBytes);
|
|
199
|
+
const docSourceHash = readSourceHash(docBytes);
|
|
200
|
+
if (entry.lastTsHash === undefined) {
|
|
201
|
+
// First look at this ts while a doc already exists (startup scan, or
|
|
202
|
+
// a pair dirty since startup). If the doc carries this ts content's
|
|
203
|
+
// hash the pair is in sync: baseline it without a synth. Anything
|
|
204
|
+
// else is dirty in an unknowable direction, so surface it instead of
|
|
205
|
+
// overwriting. Deliberately independent of lastDocHash: chokidar's
|
|
206
|
+
// initial add order (ts before doc or doc before ts) must not change
|
|
207
|
+
// the outcome.
|
|
208
|
+
if (docSourceHash === `sha256:${tsHash}`) {
|
|
209
|
+
entry.lastDocHash = docHash;
|
|
210
|
+
entry.lastTsHash = tsHash;
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.emit("conflict", {
|
|
214
|
+
tsPath,
|
|
215
|
+
docPath,
|
|
216
|
+
name,
|
|
217
|
+
reason: "doc exists but its meta.sourceHash does not match the ts content, and this " +
|
|
218
|
+
"watcher has not seen the pair in sync; run `flow-cli synth` explicitly or " +
|
|
219
|
+
"remove the stale side",
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const docChangedExternally = entry.lastDocHash !== undefined && docHash !== entry.lastDocHash;
|
|
224
|
+
if (docChangedExternally && docSourceHash !== `sha256:${entry.lastTsHash}`) {
|
|
225
|
+
// Dirty-both: the doc was edited externally (studio or hand edit)
|
|
226
|
+
// AND the ts changed. Never silently overwrite either side.
|
|
227
|
+
this.emit("conflict", {
|
|
228
|
+
tsPath,
|
|
229
|
+
docPath,
|
|
230
|
+
name,
|
|
231
|
+
reason: "both sides changed: the flowdoc was edited since the last sync " +
|
|
232
|
+
"and the ts file changed too; resolve manually and re-save one side",
|
|
233
|
+
});
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Clean (or doc missing): re-synth in the sandboxed child and write.
|
|
238
|
+
try {
|
|
239
|
+
const { flows, sourceHash } = await synthFile(tsPath);
|
|
240
|
+
const doc = pickDoc(flows, name);
|
|
241
|
+
if (doc === undefined) {
|
|
242
|
+
entry.errored = true;
|
|
243
|
+
this.emit("error", {
|
|
244
|
+
path: tsPath,
|
|
245
|
+
message: `${basename(tsPath)} exports ${flows.length} flows and none is named "${name}"; ` +
|
|
246
|
+
`the watcher pairs ${name}${TS_SUFFIX} with ${name}${DOC_SUFFIX} by name`,
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const outBytes = serializeWithMeta(doc, sourceHash);
|
|
251
|
+
await writeFile(docPath, outBytes, "utf8");
|
|
252
|
+
entry.lastDocHash = hashHex(outBytes);
|
|
253
|
+
entry.lastTsHash = tsHash;
|
|
254
|
+
entry.errored = false;
|
|
255
|
+
this.emit("synced", { tsPath, docPath, name });
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
entry.errored = true;
|
|
259
|
+
this.emit("error", { path: tsPath, message: e instanceof Error ? e.message : String(e) });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* The flow whose name matches the file base name, else a lone export. Exported
|
|
265
|
+
* so the studio bridge pairs a builder file with its FlowDoc by exactly the
|
|
266
|
+
* rule the watcher uses, rather than a second one that could disagree.
|
|
267
|
+
*/
|
|
268
|
+
export function pickDoc(flows, name) {
|
|
269
|
+
const named = flows.find((f) => f.name === name);
|
|
270
|
+
if (named !== undefined)
|
|
271
|
+
return named.doc;
|
|
272
|
+
const only = flows.length === 1 ? flows[0] : undefined;
|
|
273
|
+
return only?.doc;
|
|
274
|
+
}
|
|
275
|
+
function readSourceHash(docBytes) {
|
|
276
|
+
try {
|
|
277
|
+
const doc = JSON.parse(docBytes.toString("utf8"));
|
|
278
|
+
const hash = doc.meta?.sourceHash;
|
|
279
|
+
return typeof hash === "string" ? hash : undefined;
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return undefined; // unparseable doc counts as an external edit with no provenance
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Watches `dir` (non-recursive) and keeps every <name>.flow.ts /
|
|
287
|
+
* <name>.flowdoc.json pair in sync, ts -> doc, with the sourceHash dirty
|
|
288
|
+
* guard described at the top of this file.
|
|
289
|
+
*/
|
|
290
|
+
export function createWatcher(dir) {
|
|
291
|
+
return new Watcher(dir);
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flow-as-code/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI over @flow-as-code/core: lint, codegen, synth, render, emit, the local studio server, and export, simulate, and diff against a live Amazon Connect instance.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./synth": {
|
|
15
|
+
"types": "./dist/synth.d.ts",
|
|
16
|
+
"import": "./dist/synth.js"
|
|
17
|
+
},
|
|
18
|
+
"./watch": {
|
|
19
|
+
"types": "./dist/watch.d.ts",
|
|
20
|
+
"import": "./dist/watch.js"
|
|
21
|
+
},
|
|
22
|
+
"./bridge": {
|
|
23
|
+
"types": "./dist/bridge/server.d.ts",
|
|
24
|
+
"import": "./dist/bridge/server.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"bin": {
|
|
28
|
+
"flow-cli": "dist/bin.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"src",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"schema",
|
|
36
|
+
"!**/*.test.ts",
|
|
37
|
+
"!**/*.test.tsx",
|
|
38
|
+
"!**/__fixtures__",
|
|
39
|
+
"!**/__generated__",
|
|
40
|
+
"!**/*.tsbuildinfo",
|
|
41
|
+
"!**/__snapshots__",
|
|
42
|
+
"!**/*.snap",
|
|
43
|
+
"!**/test-helpers.ts",
|
|
44
|
+
"!**/test-helpers.tsx"
|
|
45
|
+
],
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=22.12"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc -p tsconfig.json",
|
|
54
|
+
"prepack": "node ../../scripts/chmod-bins.mjs",
|
|
55
|
+
"test": "vitest run"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@flow-as-code/cdk": "0.1.0",
|
|
59
|
+
"@flow-as-code/core": "0.1.0",
|
|
60
|
+
"@flow-as-code/studio": "0.1.0",
|
|
61
|
+
"@flow-as-code/tf": "0.1.0",
|
|
62
|
+
"ajv": "^8.20.0",
|
|
63
|
+
"chokidar": "^5.0.0",
|
|
64
|
+
"commander": "^14.0.3",
|
|
65
|
+
"tsx": "^4.23.13",
|
|
66
|
+
"yaml": "^2.9.0"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"@aws-sdk/client-connect": "^3.600.0"
|
|
70
|
+
},
|
|
71
|
+
"peerDependenciesMeta": {
|
|
72
|
+
"@aws-sdk/client-connect": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"repository": {
|
|
77
|
+
"type": "git",
|
|
78
|
+
"url": "git+https://github.com/flow-as-code/flow-as-code.git",
|
|
79
|
+
"directory": "packages/cli"
|
|
80
|
+
},
|
|
81
|
+
"homepage": "https://github.com/flow-as-code/flow-as-code/tree/main/packages/cli#readme",
|
|
82
|
+
"bugs": {
|
|
83
|
+
"url": "https://github.com/flow-as-code/flow-as-code/issues"
|
|
84
|
+
}
|
|
85
|
+
}
|