koppler 0.0.0-stage → 0.0.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 +101 -2
- package/bin/run-logged +16 -0
- package/bin/secret-list +7 -0
- package/bin/secret-psql +41 -0
- package/bin/secret-set +17 -0
- package/bin/secret-store +82 -0
- package/bin/secret-test +10 -0
- package/bin/with-secrets +25 -0
- package/dist/.built +1 -0
- package/dist/cli/agent.js +144 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/doctor.js +173 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/mcp.js +204 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/output.js +37 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/records.js +121 -0
- package/dist/cli/records.js.map +1 -0
- package/dist/cli/running.js +270 -0
- package/dist/cli/running.js.map +1 -0
- package/dist/cli/shell.js +43 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/wait.js +59 -0
- package/dist/cli/wait.js.map +1 -0
- package/dist/core/addresses.js +55 -0
- package/dist/core/addresses.js.map +1 -0
- package/dist/core/arrange.js +329 -0
- package/dist/core/arrange.js.map +1 -0
- package/dist/core/cables.js +158 -0
- package/dist/core/cables.js.map +1 -0
- package/dist/core/expressions.js +72 -0
- package/dist/core/expressions.js.map +1 -0
- package/dist/core/frameworks.js +13 -0
- package/dist/core/frameworks.js.map +1 -0
- package/dist/core/kinds.js +244 -0
- package/dist/core/kinds.js.map +1 -0
- package/dist/core/launch.js +181 -0
- package/dist/core/launch.js.map +1 -0
- package/dist/core/logfmt.js +144 -0
- package/dist/core/logfmt.js.map +1 -0
- package/dist/core/mock.js +27 -0
- package/dist/core/mock.js.map +1 -0
- package/dist/core/plan.js +147 -0
- package/dist/core/plan.js.map +1 -0
- package/dist/core/ports.js +155 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/presets.js +186 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/secret-types.js +3 -0
- package/dist/core/secret-types.js.map +1 -0
- package/dist/core/sign-in.js +30 -0
- package/dist/core/sign-in.js.map +1 -0
- package/dist/core/stack-path.js +64 -0
- package/dist/core/stack-path.js.map +1 -0
- package/dist/core/stack.js +509 -0
- package/dist/core/stack.js.map +1 -0
- package/dist/core/terraform.js +393 -0
- package/dist/core/terraform.js.map +1 -0
- package/dist/data.js +37 -0
- package/dist/data.js.map +1 -0
- package/dist/engine/actions.js +99 -0
- package/dist/engine/actions.js.map +1 -0
- package/dist/engine/app-commands.js +106 -0
- package/dist/engine/app-commands.js.map +1 -0
- package/dist/engine/app-start.js +167 -0
- package/dist/engine/app-start.js.map +1 -0
- package/dist/engine/app-state.js +43 -0
- package/dist/engine/app-state.js.map +1 -0
- package/dist/engine/boards.js +219 -0
- package/dist/engine/boards.js.map +1 -0
- package/dist/engine/branch.js +194 -0
- package/dist/engine/branch.js.map +1 -0
- package/dist/engine/browser-console.js +45 -0
- package/dist/engine/browser-console.js.map +1 -0
- package/dist/engine/calls.js +97 -0
- package/dist/engine/calls.js.map +1 -0
- package/dist/engine/checks.js +270 -0
- package/dist/engine/checks.js.map +1 -0
- package/dist/engine/clones.js +67 -0
- package/dist/engine/clones.js.map +1 -0
- package/dist/engine/config.js +26 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/deployed.js +488 -0
- package/dist/engine/deployed.js.map +1 -0
- package/dist/engine/devices.js +81 -0
- package/dist/engine/devices.js.map +1 -0
- package/dist/engine/discover.js +236 -0
- package/dist/engine/discover.js.map +1 -0
- package/dist/engine/down.js +253 -0
- package/dist/engine/down.js.map +1 -0
- package/dist/engine/history.js +215 -0
- package/dist/engine/history.js.map +1 -0
- package/dist/engine/investigate.js +278 -0
- package/dist/engine/investigate.js.map +1 -0
- package/dist/engine/libraries.js +129 -0
- package/dist/engine/libraries.js.map +1 -0
- package/dist/engine/linked.js +146 -0
- package/dist/engine/linked.js.map +1 -0
- package/dist/engine/listen.js +223 -0
- package/dist/engine/listen.js.map +1 -0
- package/dist/engine/locks.js +38 -0
- package/dist/engine/locks.js.map +1 -0
- package/dist/engine/messages.js +177 -0
- package/dist/engine/messages.js.map +1 -0
- package/dist/engine/needs.js +363 -0
- package/dist/engine/needs.js.map +1 -0
- package/dist/engine/processes.js +350 -0
- package/dist/engine/processes.js.map +1 -0
- package/dist/engine/query.js +241 -0
- package/dist/engine/query.js.map +1 -0
- package/dist/engine/queues.js +100 -0
- package/dist/engine/queues.js.map +1 -0
- package/dist/engine/recipes.js +248 -0
- package/dist/engine/recipes.js.map +1 -0
- package/dist/engine/reload.js +32 -0
- package/dist/engine/reload.js.map +1 -0
- package/dist/engine/repos.js +214 -0
- package/dist/engine/repos.js.map +1 -0
- package/dist/engine/research.js +134 -0
- package/dist/engine/research.js.map +1 -0
- package/dist/engine/run-logs.js +79 -0
- package/dist/engine/run-logs.js.map +1 -0
- package/dist/engine/run.js +54 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/runs.js +223 -0
- package/dist/engine/runs.js.map +1 -0
- package/dist/engine/session.js +130 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/share.js +124 -0
- package/dist/engine/share.js.map +1 -0
- package/dist/engine/stack-file.js +206 -0
- package/dist/engine/stack-file.js.map +1 -0
- package/dist/engine/stack-share.js +86 -0
- package/dist/engine/stack-share.js.map +1 -0
- package/dist/engine/stacks.js +143 -0
- package/dist/engine/stacks.js.map +1 -0
- package/dist/engine/sync.js +214 -0
- package/dist/engine/sync.js.map +1 -0
- package/dist/engine/traces.js +65 -0
- package/dist/engine/traces.js.map +1 -0
- package/dist/engine/up.js +621 -0
- package/dist/engine/up.js.map +1 -0
- package/dist/engine/watch.js +71 -0
- package/dist/engine/watch.js.map +1 -0
- package/dist/engine/wire.js +120 -0
- package/dist/engine/wire.js.map +1 -0
- package/dist/failure.js +16 -0
- package/dist/failure.js.map +1 -0
- package/dist/github.js +95 -0
- package/dist/github.js.map +1 -0
- package/dist/ids.js +6 -0
- package/dist/ids.js.map +1 -0
- package/dist/json-files.js +36 -0
- package/dist/json-files.js.map +1 -0
- package/dist/koppler.mjs +840 -0
- package/dist/koppler.mjs.map +1 -0
- package/dist/lambda-local.mjs +250 -0
- package/dist/lambda-local.mjs.map +1 -0
- package/dist/lambda-secrets-proxy.go +31 -0
- package/dist/mock-server.mjs +23 -0
- package/dist/mock-server.mjs.map +1 -0
- package/dist/page/assets/JetBrainsMono-cyrillic-D2jMJ_bk.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-greek-D2nYnAec.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-latin-Db4Uuiha.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-latin-ext-Bnd2h4Br.woff2 +0 -0
- package/dist/page/assets/JetBrainsMono-vietnamese-CNlsqbWb.woff2 +0 -0
- package/dist/page/assets/SchibstedGrotesk-latin-DxefFeRw.woff2 +0 -0
- package/dist/page/assets/SchibstedGrotesk-latin-ext-CnpJE18X.woff2 +0 -0
- package/dist/page/assets/index-Bkj_pX35.js +42 -0
- package/dist/page/assets/index-Dq45jswH.css +1 -0
- package/dist/page/index.html +14 -0
- package/dist/page/theme.js +8 -0
- package/dist/paths.js +19 -0
- package/dist/paths.js.map +1 -0
- package/dist/safe-env.js +73 -0
- package/dist/safe-env.js.map +1 -0
- package/dist/sam-local.mjs +135 -0
- package/dist/sam-local.mjs.map +1 -0
- package/dist/scrub.js +87 -0
- package/dist/scrub.js.map +1 -0
- package/dist/secret-check.mjs +262 -0
- package/dist/secret-check.mjs.map +1 -0
- package/dist/server/browser-console.js +117 -0
- package/dist/server/browser-console.js.map +1 -0
- package/dist/server/cable-test.js +365 -0
- package/dist/server/cable-test.js.map +1 -0
- package/dist/server/choices.js +51 -0
- package/dist/server/choices.js.map +1 -0
- package/dist/server/files.js +107 -0
- package/dist/server/files.js.map +1 -0
- package/dist/server/gate.js +128 -0
- package/dist/server/gate.js.map +1 -0
- package/dist/server/logs.js +76 -0
- package/dist/server/logs.js.map +1 -0
- package/dist/server/mobile.js +113 -0
- package/dist/server/mobile.js.map +1 -0
- package/dist/server/routes.js +326 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/runs.js +111 -0
- package/dist/server/runs.js.map +1 -0
- package/dist/server/sanitize.js +242 -0
- package/dist/server/sanitize.js.map +1 -0
- package/dist/server/secrets.js +111 -0
- package/dist/server/secrets.js.map +1 -0
- package/dist/server/status.js +321 -0
- package/dist/server/status.js.map +1 -0
- package/dist/server/token.js +38 -0
- package/dist/server/token.js.map +1 -0
- package/dist/server/waiting.js +79 -0
- package/dist/server/waiting.js.map +1 -0
- package/dist/status-watch.mjs +63 -0
- package/dist/status-watch.mjs.map +1 -0
- package/package.json +73 -4
- package/skills/koppler-run/SKILL.md +169 -0
- package/skills/koppler-run/VERSION +1 -0
- package/skills/koppler-run/references/action-log.md +50 -0
- package/skills/koppler-run/references/permissions.md +25 -0
- package/skills/koppler-run/references/preparing-nodes.md +62 -0
- package/skills/koppler-run/references/reporting-bugs.md +76 -0
- package/skills/koppler-run/references/research.md +40 -0
- package/skills/koppler-run/references/secrets.md +56 -0
- package/skills/koppler-run/references/stack.md +197 -0
- package/skills/koppler-run/references/status.md +92 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// A card set to Mock: the app's canned responses from the stack, answered in place of the app.
|
|
2
|
+
// A web app calls it from the browser, on another port.
|
|
3
|
+
const CORS = { 'access-control-allow-origin': '*' };
|
|
4
|
+
const matches = (response, method, path) => (!response.method || response.method.toUpperCase() === method) &&
|
|
5
|
+
(response.path.endsWith('*') ? path.startsWith(response.path.slice(0, -1)) : response.path === path);
|
|
6
|
+
/** The first response for this method and path; a 404 that lists the ones there are when none fits. */
|
|
7
|
+
export function answerFor(responses, method, path) {
|
|
8
|
+
if (method === 'OPTIONS')
|
|
9
|
+
return {
|
|
10
|
+
status: 204,
|
|
11
|
+
headers: { ...CORS, 'access-control-allow-methods': '*', 'access-control-allow-headers': '*' },
|
|
12
|
+
body: '',
|
|
13
|
+
};
|
|
14
|
+
const json = { ...CORS, 'content-type': 'application/json' };
|
|
15
|
+
const hit = responses.find(response => matches(response, method, path));
|
|
16
|
+
if (!hit) {
|
|
17
|
+
const known = responses.map(response => `${response.method?.toUpperCase() ?? 'ANY'} ${response.path}`);
|
|
18
|
+
return { status: 404, headers: json, body: JSON.stringify({ error: `no mock for ${method} ${path}`, known }) };
|
|
19
|
+
}
|
|
20
|
+
const text = typeof hit.body === 'string';
|
|
21
|
+
return {
|
|
22
|
+
status: hit.status ?? 200,
|
|
23
|
+
headers: { ...(text ? { ...CORS, 'content-type': 'text/plain; charset=utf-8' } : json), ...hit.headers },
|
|
24
|
+
body: hit.body === undefined ? '' : typeof hit.body === 'string' ? hit.body : JSON.stringify(hit.body),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/core/mock.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAe/F,wDAAwD;AACxD,MAAM,IAAI,GAAG,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC;AACpD,MAAM,OAAO,GAAG,CAAC,QAAsB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE,CACvE,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC9D,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAEvG,uGAAuG;AACvG,MAAM,UAAU,SAAS,CAAC,SAAyB,EAAE,MAAc,EAAE,IAAY;IAC/E,IAAI,MAAM,KAAK,SAAS;QACtB,OAAO;YACL,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,8BAA8B,EAAE,GAAG,EAAE,8BAA8B,EAAE,GAAG,EAAE;YAC9F,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACvG,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,MAAM,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACjH,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;IAC1C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG;QACzB,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;QACxG,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;KACvG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// What a Run will do: the board the user wants, compared with the board last applied and with what is really running.
|
|
2
|
+
// Used by the canvas, the server and the command line, so the user is shown exactly what is then done.
|
|
3
|
+
// A note or a list of changes is text; anything else that arrives in its place is dropped.
|
|
4
|
+
const text = (value) => (typeof value === 'string' ? value : '');
|
|
5
|
+
const appNode = (n) => ({
|
|
6
|
+
branch: n?.branch || '',
|
|
7
|
+
run: n?.run || 'cli',
|
|
8
|
+
...(n?.platform && { platform: n.platform }),
|
|
9
|
+
...(text(n?.note) && { note: text(n?.note) }),
|
|
10
|
+
...(n?.tunnels === false && { tunnels: false }),
|
|
11
|
+
...(n?.queues === true && { queues: true }),
|
|
12
|
+
...(text(n?.changes) && { changes: text(n?.changes) }),
|
|
13
|
+
...(Array.isArray(n?.libraries) && n.libraries.length > 0 && { libraries: n.libraries.map(String).sort() }),
|
|
14
|
+
...(n?.restart === true && { restart: true }),
|
|
15
|
+
...(n?.watch === true && { watch: true }),
|
|
16
|
+
});
|
|
17
|
+
// A mock has no clone to switch, tunnels, queues or code of its own.
|
|
18
|
+
const nodeOf = (n) => n?.run === 'mock' ? { branch: '', run: 'mock', ...(n.restart === true && { restart: true }) } : appNode(n);
|
|
19
|
+
export function board(input) {
|
|
20
|
+
const given = input?.nodes ?? {};
|
|
21
|
+
const list = Array.isArray(given) ? given.map(n => [n.id, n]) : Object.entries(given);
|
|
22
|
+
const nodes = Object.fromEntries(list.filter(([id]) => typeof id === 'string').map(([id, n]) => [id, nodeOf(n)]));
|
|
23
|
+
const edges = (Array.isArray(input?.edges) ? input.edges : [])
|
|
24
|
+
.filter((e) => !!e && Object.hasOwn(nodes, e.from) && Object.hasOwn(nodes, e.to))
|
|
25
|
+
.map(e => ({ from: e.from, to: e.to }));
|
|
26
|
+
const queues = Object.fromEntries(Object.entries(input?.queues ?? {}).flatMap(([id, where]) => (where === 'local' ? [[id, 'local']] : [])));
|
|
27
|
+
return { env: input?.env ?? null, nodes, edges, queues };
|
|
28
|
+
}
|
|
29
|
+
const callees = (b, id) => b.edges
|
|
30
|
+
.filter(e => e.from === id)
|
|
31
|
+
.map(e => e.to)
|
|
32
|
+
.sort();
|
|
33
|
+
const upper = (env) => env.toUpperCase();
|
|
34
|
+
const where = (run) => ({ ide: 'your IDE', cli: 'the command line', mock: 'a mock' })[run];
|
|
35
|
+
/** Why an app that runs and stays on the board has to start again; empty when it can keep running. */
|
|
36
|
+
function reasonsToRestart(id, live, want, envChange, o) {
|
|
37
|
+
const now = live.nodes[id];
|
|
38
|
+
const next = want.nodes[id];
|
|
39
|
+
if (!now || !next)
|
|
40
|
+
return [];
|
|
41
|
+
const name = (other) => o.name?.(other) ?? other;
|
|
42
|
+
const why = [];
|
|
43
|
+
if (next.restart)
|
|
44
|
+
why.push('you asked to restart it');
|
|
45
|
+
if (envChange)
|
|
46
|
+
why.push(`the environment changes from ${upper(envChange.from)} to ${upper(envChange.to)}`);
|
|
47
|
+
if (now.branch !== next.branch && now.run !== 'mock' && next.run !== 'mock')
|
|
48
|
+
why.push(`its branch changes from ${now.branch || o.current?.(id) || 'the current one'} to ${next.branch || 'the current one'}`);
|
|
49
|
+
if (now.run !== next.run)
|
|
50
|
+
why.push(`it moves from ${where(now.run)} to ${where(next.run)}`);
|
|
51
|
+
if ((now.platform ?? '') !== (next.platform ?? '') && next.run === 'cli')
|
|
52
|
+
why.push(`its device changes to ${String(next.platform)}`);
|
|
53
|
+
const before = callees(live, id);
|
|
54
|
+
const after = callees(want, id);
|
|
55
|
+
for (const c of after.filter(x => !before.includes(x)))
|
|
56
|
+
why.push(`it starts calling your local ${name(c)}`);
|
|
57
|
+
for (const c of before.filter(x => !after.includes(x)))
|
|
58
|
+
why.push(`it goes back to the deployed ${name(c)}`);
|
|
59
|
+
if ((now.note ?? '') !== (next.note ?? ''))
|
|
60
|
+
why.push('its note changed');
|
|
61
|
+
// Libraries switched to (or away from) the local copy are picked up when it starts again.
|
|
62
|
+
const had = now.libraries ?? [];
|
|
63
|
+
const has = next.libraries ?? [];
|
|
64
|
+
for (const l of has.filter(x => !had.includes(x)))
|
|
65
|
+
why.push(`it uses your local ${l}`);
|
|
66
|
+
for (const l of had.filter(x => !has.includes(x)))
|
|
67
|
+
why.push(`it goes back to the published ${l}`);
|
|
68
|
+
// An app on a queue that moves between local and deployed starts again with the other queue's address. An app
|
|
69
|
+
// that keeps the deployed queues is on the deployed one whatever the board runs locally.
|
|
70
|
+
const onLocal = (side, node, q) => node.queues === true && Object.hasOwn(side.queues, q);
|
|
71
|
+
for (const q of o.queuesOf?.(id) ?? [])
|
|
72
|
+
if (onLocal(live, now, q) !== onLocal(want, next, q))
|
|
73
|
+
why.push(`it moves to the ${onLocal(want, next, q) ? 'local' : 'deployed'} ${q} queue`);
|
|
74
|
+
return why;
|
|
75
|
+
}
|
|
76
|
+
export function plan(liveInput, desiredInput, options = {}) {
|
|
77
|
+
const live = board(liveInput);
|
|
78
|
+
const want = board(desiredInput);
|
|
79
|
+
const strays = options.strays ?? [];
|
|
80
|
+
const envChange = live.env && want.env && live.env !== want.env && Object.keys(live.nodes).length > 0
|
|
81
|
+
? { from: live.env, to: want.env }
|
|
82
|
+
: null;
|
|
83
|
+
const starts = [];
|
|
84
|
+
const restarts = [];
|
|
85
|
+
const stops = [];
|
|
86
|
+
const keeps = [];
|
|
87
|
+
for (const [id, next] of Object.entries(want.nodes)) {
|
|
88
|
+
if (!Object.hasOwn(live.nodes, id)) {
|
|
89
|
+
// Started by id on this environment and calling nothing local: it already is what the board asks for.
|
|
90
|
+
const asAsked = options.startedOn?.(id) === want.env && callees(want, id).length === 0 && !next.note && !next.branch;
|
|
91
|
+
if (!strays.includes(id))
|
|
92
|
+
starts.push({ id, why: [] });
|
|
93
|
+
else if (asAsked)
|
|
94
|
+
keeps.push({ id, why: ['you started it with koppler run'] });
|
|
95
|
+
else
|
|
96
|
+
restarts.push({ id, why: ['it is running, but not from a run Koppler recorded'] });
|
|
97
|
+
}
|
|
98
|
+
else if (options.running?.(id) === false && next.run !== 'ide') {
|
|
99
|
+
starts.push({ id, why: ['it was started before but is not running now'] });
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const why = reasonsToRestart(id, live, want, envChange, options);
|
|
103
|
+
(why.length > 0 ? restarts : keeps).push({ id, why });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const id of [...Object.keys(live.nodes), ...strays])
|
|
107
|
+
if (!Object.hasOwn(want.nodes, id) && !stops.some(s => s.id === id))
|
|
108
|
+
stops.push({ id, why: [] });
|
|
109
|
+
const nothing = starts.length + restarts.length + stops.length === 0;
|
|
110
|
+
return { env: want.env, envChange, starts, restarts, stops, keeps, nothing };
|
|
111
|
+
}
|
|
112
|
+
const KINDS_OF_STEP = [
|
|
113
|
+
['starts', 'START'],
|
|
114
|
+
['restarts', 'RESTART'],
|
|
115
|
+
['stops', 'STOP AND REVERT'],
|
|
116
|
+
['keeps', 'KEEP RUNNING'],
|
|
117
|
+
];
|
|
118
|
+
/** The plan in plain lines, for the review before a Run, the prompt and the terminal. */
|
|
119
|
+
export function describe(p, options = {}) {
|
|
120
|
+
const name = (id) => options.name?.(id) ?? id;
|
|
121
|
+
const line = (step) => name(step.id) + (step.why.length > 0 ? ` (${step.why.join('; ')})` : '');
|
|
122
|
+
const lines = KINDS_OF_STEP.filter(([key]) => p[key].length > 0).map(([key, title]) => `${title}: ${p[key].map(line).join(', ')}`);
|
|
123
|
+
return lines.length > 0 ? lines : ['NOTHING TO CHANGE'];
|
|
124
|
+
}
|
|
125
|
+
const idsOf = (p) => JSON.stringify(KINDS_OF_STEP.map(([key]) => (p?.[key] ?? []).map(step => step.id).sort()));
|
|
126
|
+
/** True when two plans would start, restart, stop and keep the same apps. */
|
|
127
|
+
export const same = (a, b) => idsOf(a) === idsOf(b);
|
|
128
|
+
/** Queue types a stack can name, and the ones Koppler can run on this machine (in an emulator). */
|
|
129
|
+
export const QUEUE_TYPES = ['sqs', 'sns', 'eventbridge', 'kafka', 'other'];
|
|
130
|
+
export const LOCAL_QUEUE_TYPES = ['sqs', 'kafka'];
|
|
131
|
+
/** The queues an app publishes to or reads, from the stack. */
|
|
132
|
+
export function queuesOf(stack, id) {
|
|
133
|
+
const app = stack?.apps?.[id];
|
|
134
|
+
return [...new Set([...Object.keys(app?.publishes ?? {}), ...Object.keys(app?.reads ?? {})])];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The environments where a mistake costs something (production, usually). The stack names them in `protected`;
|
|
138
|
+
* without that, every environment except the first. They get the red frame, a review that blocks on what is missing,
|
|
139
|
+
* and secrets that ask on every read. Never decided by an environment's name.
|
|
140
|
+
*/
|
|
141
|
+
export function protectedEnvs(stack) {
|
|
142
|
+
const envs = stack?.envs ?? [];
|
|
143
|
+
const named = stack?.protected;
|
|
144
|
+
return Array.isArray(named) ? envs.filter(env => named.includes(env)) : envs.slice(1);
|
|
145
|
+
}
|
|
146
|
+
export const isProtected = (stack, env) => protectedEnvs(stack).includes(env);
|
|
147
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/core/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// Plans tunnels so no two want the same local port. A tunnel is one host and port: apps that need the same one share
|
|
2
|
+
// it. When different hosts want the same port, one keeps it; a tunnel whose address is a setting moves to a free
|
|
3
|
+
// port; one that cannot move keeps its port on its own loopback address, which needs a one-time sudo step.
|
|
4
|
+
// What a tunnel reaches: the stack's `what`, else a guess from the host name, else a plain tunnel.
|
|
5
|
+
const ENGINES = [
|
|
6
|
+
['valkey', 'Cache (Valkey)'],
|
|
7
|
+
['redis', 'Cache (Redis)'],
|
|
8
|
+
['aurora', 'Database (Aurora)'],
|
|
9
|
+
['postgres', 'Database (Postgres)'],
|
|
10
|
+
['mysql', 'Database (MySQL)'],
|
|
11
|
+
['mongo', 'Database (MongoDB)'],
|
|
12
|
+
['db', 'Database'],
|
|
13
|
+
['rds', 'Database'],
|
|
14
|
+
];
|
|
15
|
+
export function tunnelKind(need) {
|
|
16
|
+
if (need.what)
|
|
17
|
+
return need.what;
|
|
18
|
+
const host = (need.tunnel ?? '').toLowerCase();
|
|
19
|
+
const parts = host.split(/[.-]/);
|
|
20
|
+
return ENGINES.find(([key]) => parts.includes(key) || (key.length > 3 && host.includes(key)))?.[1] ?? 'Tunnel';
|
|
21
|
+
}
|
|
22
|
+
function gather(needs) {
|
|
23
|
+
const byKey = new Map();
|
|
24
|
+
for (const need of needs) {
|
|
25
|
+
const key = `${need.tunnel}:${String(need.port)}`;
|
|
26
|
+
const tunnel = byKey.get(key) ?? {
|
|
27
|
+
host: need.tunnel,
|
|
28
|
+
port: need.port,
|
|
29
|
+
original: need.port,
|
|
30
|
+
bind: 'localhost',
|
|
31
|
+
apps: [],
|
|
32
|
+
envs: {},
|
|
33
|
+
what: tunnelKind(need),
|
|
34
|
+
connectsAs: need.connectsAs,
|
|
35
|
+
};
|
|
36
|
+
if (!tunnel.apps.includes(need.app))
|
|
37
|
+
tunnel.apps.push(need.app);
|
|
38
|
+
if (need.env)
|
|
39
|
+
tunnel.envs[need.app] = need.env;
|
|
40
|
+
byKey.set(key, tunnel);
|
|
41
|
+
}
|
|
42
|
+
return [...byKey.values()];
|
|
43
|
+
}
|
|
44
|
+
/** The tunnels a set of apps needs. `takenPorts` are ports something else will use, the apps' own among them. */
|
|
45
|
+
export function planTunnels(needs, takenPorts = []) {
|
|
46
|
+
const tunnels = gather(needs);
|
|
47
|
+
const taken = new Set([...takenPorts, ...tunnels.map(t => t.port)]);
|
|
48
|
+
const movable = (t) => t.apps.every(app => t.envs[app]);
|
|
49
|
+
let alias = 2;
|
|
50
|
+
for (const port of new Set(tunnels.map(t => t.original))) {
|
|
51
|
+
const wanting = tunnels.filter(t => t.original === port);
|
|
52
|
+
// The first keeps the port: one that cannot move, when there is one.
|
|
53
|
+
wanting.sort((a, b) => Number(movable(a)) - Number(movable(b)));
|
|
54
|
+
for (const tunnel of wanting.slice(1)) {
|
|
55
|
+
if (movable(tunnel)) {
|
|
56
|
+
let next = port + 2;
|
|
57
|
+
while (taken.has(next))
|
|
58
|
+
next++;
|
|
59
|
+
taken.add(next);
|
|
60
|
+
tunnel.port = next;
|
|
61
|
+
tunnel.settings = tunnel.apps.map(app => ({
|
|
62
|
+
app,
|
|
63
|
+
env: tunnel.envs[app] ?? '',
|
|
64
|
+
value: `localhost:${String(next)}`,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
tunnel.bind = `127.0.0.${String(alias++)}`;
|
|
69
|
+
tunnel.needsAlias = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return tunnels;
|
|
74
|
+
}
|
|
75
|
+
/** One plain sentence per tunnel that does not simply run as declared. */
|
|
76
|
+
export function describePlan(tunnels, name = app => app) {
|
|
77
|
+
const kind = (t) => t.what !== 'Tunnel' ? `${t.what.replace(/ \(.*\)$/, '').toLowerCase()} tunnel` : 'tunnel';
|
|
78
|
+
const whose = (t) => `${t.apps.map(name).join(' and ')}'s ${kind(t)}`;
|
|
79
|
+
return tunnels.flatMap(t => {
|
|
80
|
+
const others = tunnels
|
|
81
|
+
.filter(o => o !== t && o.original === t.original)
|
|
82
|
+
.map(whose)
|
|
83
|
+
.join(' and ');
|
|
84
|
+
const port = String(t.port);
|
|
85
|
+
if (t.settings)
|
|
86
|
+
return [`${whose(t)} moves from port ${String(t.original)} to ${port}, to make room for ${others}.`];
|
|
87
|
+
if (t.needsAlias)
|
|
88
|
+
return [
|
|
89
|
+
`${whose(t)} keeps port ${port} on its own address, ${t.bind}, next to ${others}. Needs a one-time sudo step.`,
|
|
90
|
+
];
|
|
91
|
+
if (t.apps.length > 1)
|
|
92
|
+
return [`${t.apps.map(name).join(' and ')} share one ${kind(t)} on port ${port}.`];
|
|
93
|
+
return [];
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** A value as one shell word, for the commands shown to the user to paste. */
|
|
97
|
+
const shellWord = (value) => (/^[\w.:@/-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`);
|
|
98
|
+
/**
|
|
99
|
+
* The commands and settings that carry one tunnel of a plan out. An address of its own moves the name the app dials
|
|
100
|
+
* to that address: off any hosts line that maps it already, since the first match wins, with a backup to undo.
|
|
101
|
+
*/
|
|
102
|
+
/** A process name Koppler accepts (a-z, 0-9, dashes, at most 64): a longer one keeps a hash of the whole, so it stays unique. */
|
|
103
|
+
function processName(given) {
|
|
104
|
+
const name = given
|
|
105
|
+
.toLowerCase()
|
|
106
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
107
|
+
.replace(/-+/g, '-')
|
|
108
|
+
.replace(/^-|-$/g, '');
|
|
109
|
+
if (name.length <= 64)
|
|
110
|
+
return name;
|
|
111
|
+
let hash = 2166136261;
|
|
112
|
+
for (const char of name)
|
|
113
|
+
hash = Math.imul(hash ^ char.charCodeAt(0), 16777619);
|
|
114
|
+
return `${name.slice(0, 55).replace(/-$/, '')}-${(hash >>> 0).toString(16).padStart(8, '0')}`;
|
|
115
|
+
}
|
|
116
|
+
export function planSteps(t) {
|
|
117
|
+
const url = `${t.bind}:${String(t.port)}`;
|
|
118
|
+
const dialed = t.connectsAs ?? t.host;
|
|
119
|
+
const pattern = dialed.replace(/[^\w-]/g, c => `\\${c}`);
|
|
120
|
+
// The whole host, so QA's and PROD's tunnels never share a name; two tunnels sharing a port, each on its own address,
|
|
121
|
+
// have the address in it too.
|
|
122
|
+
const name = `tunnel-${t.host}-${String(t.port)}${t.needsAlias ? `-on-${t.bind}` : ''}`;
|
|
123
|
+
return {
|
|
124
|
+
name: processName(name),
|
|
125
|
+
sudo: t.needsAlias
|
|
126
|
+
? [
|
|
127
|
+
`sudo ifconfig lo0 alias ${shellWord(t.bind)} up`,
|
|
128
|
+
`sudo sed -i .koppler.bak -E ${shellWord(`s/[[:space:]]+${pattern}([[:space:]]|$)/\\1/`)} /etc/hosts`,
|
|
129
|
+
`echo ${shellWord(`${t.bind} ${dialed}`)} | sudo tee -a /etc/hosts`,
|
|
130
|
+
]
|
|
131
|
+
: [],
|
|
132
|
+
undo: t.needsAlias
|
|
133
|
+
? ['sudo mv /etc/hosts.koppler.bak /etc/hosts', `sudo ifconfig lo0 -alias ${shellWord(t.bind)}`]
|
|
134
|
+
: [],
|
|
135
|
+
tunnelArgs: ['cloudflared', 'access', 'tcp', '--hostname', t.host, '--url', url],
|
|
136
|
+
tunnel: `cloudflared access tcp --hostname ${shellWord(t.host)} --url ${shellWord(url)}`,
|
|
137
|
+
settings: t.settings ?? [],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Whether a tunnel on its own address can start: the name its app dials leads there (the first hosts line that names
|
|
142
|
+
* it wins) and the address exists. `addresses` is the loopback interface as ifconfig prints it, or null where every
|
|
143
|
+
* 127.x.x.x address exists without being added.
|
|
144
|
+
*/
|
|
145
|
+
export function aliasReady(t, hosts, addresses) {
|
|
146
|
+
const dialed = t.connectsAs ?? t.host;
|
|
147
|
+
const words = (line) => line.replace(/#.*/, '').trim().split(/\s+/);
|
|
148
|
+
const first = hosts
|
|
149
|
+
.split('\n')
|
|
150
|
+
.map(words)
|
|
151
|
+
.find(([, ...names]) => names.includes(dialed));
|
|
152
|
+
const exists = addresses === null || addresses.split('\n').some(line => words(line).slice(0, 2).join(' ') === `inet ${t.bind}`);
|
|
153
|
+
return first?.[0] === t.bind && exists;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/core/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
export const VERSION = 1;
|
|
2
|
+
const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
3
|
+
/** One step per format version: MIGRATIONS[n] turns a version n preset into version n + 1. */
|
|
4
|
+
export const MIGRATIONS = {
|
|
5
|
+
// Version 0 had no version field; cables and how an app runs could be left out.
|
|
6
|
+
0: preset => ({
|
|
7
|
+
...preset,
|
|
8
|
+
nodes: Object.fromEntries(Object.entries(preset.nodes).map(([id, node]) => [id, { run: 'cli', ...node }])),
|
|
9
|
+
}),
|
|
10
|
+
};
|
|
11
|
+
/** The preset in the current format, or the reason it cannot be read. */
|
|
12
|
+
export function migrate(input) {
|
|
13
|
+
if (!isObject(input))
|
|
14
|
+
return { error: 'It is not a preset.' };
|
|
15
|
+
const { name, nodes, edges, version } = input;
|
|
16
|
+
if (typeof name !== 'string' || !name.trim())
|
|
17
|
+
return { error: 'It has no name.' };
|
|
18
|
+
if (!isObject(nodes) || Object.keys(nodes).length === 0)
|
|
19
|
+
return { error: 'It has no apps.' };
|
|
20
|
+
const from = typeof version === 'number' && Number.isInteger(version) && version >= 0 ? version : 0;
|
|
21
|
+
if (from > VERSION) {
|
|
22
|
+
const formats = `preset format ${String(from)}, this one reads up to ${String(VERSION)}`;
|
|
23
|
+
return { error: `It was saved by a newer Koppler (${formats}). Update Koppler.` };
|
|
24
|
+
}
|
|
25
|
+
// Whatever wrote it: every app is an object and the cables are a list.
|
|
26
|
+
let preset = {
|
|
27
|
+
...input,
|
|
28
|
+
name,
|
|
29
|
+
nodes: Object.fromEntries(Object.entries(nodes).map(([id, node]) => [id, isObject(node) ? node : {}])),
|
|
30
|
+
edges: Array.isArray(edges) ? edges : [],
|
|
31
|
+
};
|
|
32
|
+
for (let v = from; v < VERSION; v++)
|
|
33
|
+
preset = { ...(MIGRATIONS[v]?.(preset) ?? preset), version: v + 1 };
|
|
34
|
+
return { preset, migratedFrom: from < VERSION ? from : null };
|
|
35
|
+
}
|
|
36
|
+
/** One app of a preset as this stack can run it, with a note for each thing that had to change. */
|
|
37
|
+
function openNode(id, stored, stack, name, notes) {
|
|
38
|
+
const runs = stack.runIn(id);
|
|
39
|
+
const platforms = stack.platforms(id);
|
|
40
|
+
const asked = typeof stored['run'] === 'string' ? stored['run'] : '';
|
|
41
|
+
const run = runs.includes(asked) ? asked : runs.includes('cli') ? 'cli' : (runs[0] ?? 'cli');
|
|
42
|
+
if (asked && run !== asked)
|
|
43
|
+
notes.push(`${name} cannot run in "${asked}", using ${run}`);
|
|
44
|
+
const node = { run };
|
|
45
|
+
const platform = typeof stored['platform'] === 'string' ? stored['platform'] : '';
|
|
46
|
+
const first = platforms[0];
|
|
47
|
+
if (first !== undefined && run === 'cli') {
|
|
48
|
+
node.platform = platforms.includes(platform) ? platform : first;
|
|
49
|
+
if (platform && node.platform !== platform)
|
|
50
|
+
notes.push(`${name} has no "${platform}" platform, using ${node.platform}`);
|
|
51
|
+
}
|
|
52
|
+
const branch = typeof stored['branch'] === 'string' ? stored['branch'].trim() : '';
|
|
53
|
+
if (branch) {
|
|
54
|
+
node.branch = branch;
|
|
55
|
+
const branches = stack.branches(id);
|
|
56
|
+
if (branches && !branches.includes(branch))
|
|
57
|
+
notes.push(`${name} has no branch ${branch} in your clone (fetch it first)`);
|
|
58
|
+
}
|
|
59
|
+
if (typeof stored['note'] === 'string' && stored['note'].trim())
|
|
60
|
+
node.note = stored['note'];
|
|
61
|
+
if (stored['tunnels'] === false)
|
|
62
|
+
node.tunnels = false;
|
|
63
|
+
if (stored['queues'] === true)
|
|
64
|
+
node.queues = true;
|
|
65
|
+
if (stored['watch'] === true)
|
|
66
|
+
node.watch = true;
|
|
67
|
+
return node;
|
|
68
|
+
}
|
|
69
|
+
const isEdge = (value) => isObject(value) && typeof value['from'] === 'string' && typeof value['to'] === 'string';
|
|
70
|
+
/**
|
|
71
|
+
* Checks a preset against the stack. Gives the preset as it will open, with only what the stack can run and a note on
|
|
72
|
+
* everything that changed, or the reason it cannot open.
|
|
73
|
+
*/
|
|
74
|
+
export function check(input, stack) {
|
|
75
|
+
const migrated = migrate(input);
|
|
76
|
+
if (migrated.error !== undefined)
|
|
77
|
+
return { error: migrated.error };
|
|
78
|
+
const preset = migrated.preset;
|
|
79
|
+
const notes = [];
|
|
80
|
+
const name = (id) => stack.name?.(id) ?? id;
|
|
81
|
+
if (!isObject(input) || !Number.isInteger(input['version']))
|
|
82
|
+
notes.push('it had no version, read as the oldest format');
|
|
83
|
+
const all = Object.keys(preset.nodes);
|
|
84
|
+
const unknown = all.filter(id => !stack.known(id));
|
|
85
|
+
const uncloned = all.filter(id => stack.known(id) && !stack.cloned(id));
|
|
86
|
+
const ids = all.filter(id => stack.known(id) && stack.cloned(id));
|
|
87
|
+
if (ids.length === 0)
|
|
88
|
+
return {
|
|
89
|
+
error: unknown.length === all.length
|
|
90
|
+
? `None of its apps are in this stack (${unknown.join(', ')}).`
|
|
91
|
+
: `None of its apps are cloned here (${uncloned.join(', ')}).`,
|
|
92
|
+
};
|
|
93
|
+
if (unknown.length > 0)
|
|
94
|
+
notes.push(`not in this stack: ${unknown.join(', ')}`);
|
|
95
|
+
if (uncloned.length > 0)
|
|
96
|
+
notes.push(`not cloned: ${uncloned.map(name).join(', ')}`);
|
|
97
|
+
const nodes = Object.fromEntries(ids.map(id => [id, openNode(id, preset.nodes[id] ?? {}, stack, name(id), notes)]));
|
|
98
|
+
const edges = [];
|
|
99
|
+
let dropped = 0;
|
|
100
|
+
for (const edge of preset.edges.filter(isEdge)) {
|
|
101
|
+
const { from, to } = edge;
|
|
102
|
+
if (!Object.hasOwn(nodes, from) || !Object.hasOwn(nodes, to)) {
|
|
103
|
+
if (stack.known(from) && stack.known(to))
|
|
104
|
+
dropped++;
|
|
105
|
+
}
|
|
106
|
+
else if (edges.some(e => e.from === from && e.to === to)) {
|
|
107
|
+
// The same cable twice is one cable.
|
|
108
|
+
}
|
|
109
|
+
else if (!stack.canCall(from, to))
|
|
110
|
+
notes.push(`${name(from)} does not call ${name(to)}, cable left out`);
|
|
111
|
+
else
|
|
112
|
+
edges.push({ from, to });
|
|
113
|
+
}
|
|
114
|
+
if (dropped > 0)
|
|
115
|
+
notes.push(`${String(dropped)} ${dropped === 1 ? 'cable' : 'cables'} left out with their apps`);
|
|
116
|
+
// A preset without a version already has its note above.
|
|
117
|
+
if (migrated.migratedFrom !== null && migrated.migratedFrom > 0)
|
|
118
|
+
notes.push(`updated from preset format ${String(migrated.migratedFrom)}`);
|
|
119
|
+
const opened = { name: preset.name.trim().slice(0, 80), version: VERSION, nodes, edges };
|
|
120
|
+
if (preset['source'])
|
|
121
|
+
opened.source = preset['source'];
|
|
122
|
+
return { preset: opened, notes };
|
|
123
|
+
}
|
|
124
|
+
const isPoint = (value) => isObject(value) && typeof value['x'] === 'number' && typeof value['y'] === 'number';
|
|
125
|
+
const same = (a) => (b) => a.from === b.from && a.to === b.to;
|
|
126
|
+
/** The board with the edit made. What it does not touch stays as it was, card places too; new cards go in a column to the right. */
|
|
127
|
+
export function editPreset(preset, edit) {
|
|
128
|
+
const gone = new Set(edit.remove ?? []);
|
|
129
|
+
const kept = (all) => Object.fromEntries(Object.entries(all).filter(([id]) => !gone.has(id)));
|
|
130
|
+
const nodes = kept(preset.nodes);
|
|
131
|
+
const layout = isObject(preset['layout']) ? preset['layout'] : undefined;
|
|
132
|
+
const at = kept(isObject(layout?.['nodes']) ? layout['nodes'] : {});
|
|
133
|
+
const placed = Object.values(at).filter(isPoint);
|
|
134
|
+
let y = Math.min(...placed.map(point => point.y));
|
|
135
|
+
for (const id of edit.add ?? []) {
|
|
136
|
+
if (nodes[id])
|
|
137
|
+
continue;
|
|
138
|
+
nodes[id] = { run: 'cli' };
|
|
139
|
+
if (!placed.length)
|
|
140
|
+
continue;
|
|
141
|
+
at[id] = { x: Math.max(...placed.map(point => point.x)) + 340, y };
|
|
142
|
+
y += 240;
|
|
143
|
+
}
|
|
144
|
+
for (const [id, branch] of Object.entries(edit.branch ?? {}))
|
|
145
|
+
if (nodes[id])
|
|
146
|
+
nodes[id] = { ...nodes[id], branch };
|
|
147
|
+
for (const [id, note] of Object.entries(edit.note ?? {})) {
|
|
148
|
+
const { note: _, ...rest } = nodes[id] ?? {};
|
|
149
|
+
if (nodes[id])
|
|
150
|
+
nodes[id] = note.trim() ? { ...rest, note } : rest;
|
|
151
|
+
}
|
|
152
|
+
const edges = preset.edges
|
|
153
|
+
.filter(isEdge)
|
|
154
|
+
.filter(edge => !gone.has(edge.from) && !gone.has(edge.to) && !(edit.uncable ?? []).some(same(edge)));
|
|
155
|
+
for (const edge of edit.cable ?? [])
|
|
156
|
+
if (!edges.some(same(edge)))
|
|
157
|
+
edges.push({ from: edge.from, to: edge.to });
|
|
158
|
+
if (!layout || edit.arrange) {
|
|
159
|
+
const { layout: _, ...rest } = preset;
|
|
160
|
+
return { ...rest, nodes, edges };
|
|
161
|
+
}
|
|
162
|
+
const wired = new Set(edges.map(edge => `${edge.from}>${edge.to}`));
|
|
163
|
+
const sides = Object.fromEntries(Object.entries(isObject(layout['sides']) ? layout['sides'] : {}).filter(([key]) => wired.has(key)));
|
|
164
|
+
return { ...preset, nodes, edges, layout: { ...layout, nodes: at, sides } };
|
|
165
|
+
}
|
|
166
|
+
/** The edit in words, e.g. "added Orders; cabled Web to Orders". */
|
|
167
|
+
export function describeEdit(edit, name = id => id,
|
|
168
|
+
/** Said of a change not made yet: "add", not "added". */
|
|
169
|
+
proposed = false) {
|
|
170
|
+
const list = (ids = []) => ids.map(name).join(', ');
|
|
171
|
+
const cables = (edges = []) => edges.map(edge => `${name(edge.from)} to ${name(edge.to)}`).join(', ');
|
|
172
|
+
return [
|
|
173
|
+
edit.add?.length && `${proposed ? 'add' : 'added'} ${list(edit.add)}`,
|
|
174
|
+
edit.remove?.length && `${proposed ? 'remove' : 'removed'} ${list(edit.remove)}`,
|
|
175
|
+
edit.cable?.length && `${proposed ? 'cable' : 'cabled'} ${cables(edit.cable)}`,
|
|
176
|
+
edit.uncable?.length && `${proposed ? 'take the cable off' : 'took the cable off'} ${cables(edit.uncable)}`,
|
|
177
|
+
...Object.entries(edit.branch ?? {}).map(([id, branch]) => `${proposed ? 'put ' : ''}${name(id)} on ${branch}`),
|
|
178
|
+
...Object.entries(edit.note ?? {}).map(([id, note]) => note.trim()
|
|
179
|
+
? `${proposed ? 'add ' : ''}a note on ${name(id)}`
|
|
180
|
+
: `${proposed ? 'take the ' : 'no '}note${proposed ? ' off ' : ' on '}${name(id)}`),
|
|
181
|
+
edit.arrange && (proposed ? 'lay it out afresh' : 'arranged'),
|
|
182
|
+
]
|
|
183
|
+
.filter(Boolean)
|
|
184
|
+
.join('; ');
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/core/presets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-types.js","sourceRoot":"","sources":["../../src/core/secret-types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// A sign-in an app needs before it starts. The engine knows one shape: how to tell it holds, what the user runs when
|
|
2
|
+
// it does not, and the settings it gives the app. AWS is built in as the shorthand `sso`; anything else (Azure,
|
|
3
|
+
// Google Cloud, Firebase) is declared by the stack under `signIns`.
|
|
4
|
+
/** The sign-in a need of an app stands for; null when it is not one, or names one the stack does not declare. */
|
|
5
|
+
export function signInOf(stack, need) {
|
|
6
|
+
if (need?.sso)
|
|
7
|
+
return {
|
|
8
|
+
id: `sso:${need.sso}`,
|
|
9
|
+
what: need.account ? `AWS (${need.sso}, account ${need.account})` : `AWS (${need.sso})`,
|
|
10
|
+
check: { argv: ['aws', 'sts', 'get-caller-identity', '--profile', need.sso] },
|
|
11
|
+
login: `aws sso login --profile ${need.sso}`,
|
|
12
|
+
env: { AWS_PROFILE: need.sso },
|
|
13
|
+
tool: 'aws',
|
|
14
|
+
...(need.account && { account: need.account }),
|
|
15
|
+
};
|
|
16
|
+
const declared = need?.signIn ? stack?.signIns?.[need.signIn] : undefined;
|
|
17
|
+
if (!need?.signIn || !declared)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
id: `sign-in:${need.signIn}`,
|
|
21
|
+
what: declared.what ?? need.signIn,
|
|
22
|
+
check: { shell: declared.check },
|
|
23
|
+
login: declared.login,
|
|
24
|
+
env: declared.env ?? {},
|
|
25
|
+
tool: declared.login.trim().split(/\s+/)[0] ?? '',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** Whether a need is a sign-in of either form. */
|
|
29
|
+
export const isSignIn = (need) => !!(need?.sso || need?.signIn);
|
|
30
|
+
//# sourceMappingURL=sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../src/core/sign-in.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,gHAAgH;AAChH,oEAAoE;AAgCpE,iHAAiH;AACjH,MAAM,UAAU,QAAQ,CACtB,KAA8F,EAC9F,IAA6B;IAE7B,IAAI,IAAI,EAAE,GAAG;QACX,OAAO;YACL,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,aAAa,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,GAAG;YACvF,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE;YAC7E,KAAK,EAAE,2BAA2B,IAAI,CAAC,GAAG,EAAE;YAC5C,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,EAAE,KAAK;YACX,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;SAC/C,CAAC;IACJ,MAAM,QAAQ,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO;QACL,EAAE,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM;QAClC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;QAChC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE;QACvB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;KAClD,CAAC;AACJ,CAAC;AACD,kDAAkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAA6B,EAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC"}
|