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.
Files changed (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -2
  3. package/bin/run-logged +16 -0
  4. package/bin/secret-list +7 -0
  5. package/bin/secret-psql +41 -0
  6. package/bin/secret-set +17 -0
  7. package/bin/secret-store +82 -0
  8. package/bin/secret-test +10 -0
  9. package/bin/with-secrets +25 -0
  10. package/dist/.built +1 -0
  11. package/dist/cli/agent.js +144 -0
  12. package/dist/cli/agent.js.map +1 -0
  13. package/dist/cli/doctor.js +173 -0
  14. package/dist/cli/doctor.js.map +1 -0
  15. package/dist/cli/mcp.js +204 -0
  16. package/dist/cli/mcp.js.map +1 -0
  17. package/dist/cli/output.js +37 -0
  18. package/dist/cli/output.js.map +1 -0
  19. package/dist/cli/records.js +121 -0
  20. package/dist/cli/records.js.map +1 -0
  21. package/dist/cli/running.js +270 -0
  22. package/dist/cli/running.js.map +1 -0
  23. package/dist/cli/shell.js +43 -0
  24. package/dist/cli/shell.js.map +1 -0
  25. package/dist/cli/wait.js +59 -0
  26. package/dist/cli/wait.js.map +1 -0
  27. package/dist/core/addresses.js +55 -0
  28. package/dist/core/addresses.js.map +1 -0
  29. package/dist/core/arrange.js +329 -0
  30. package/dist/core/arrange.js.map +1 -0
  31. package/dist/core/cables.js +158 -0
  32. package/dist/core/cables.js.map +1 -0
  33. package/dist/core/expressions.js +72 -0
  34. package/dist/core/expressions.js.map +1 -0
  35. package/dist/core/frameworks.js +13 -0
  36. package/dist/core/frameworks.js.map +1 -0
  37. package/dist/core/kinds.js +244 -0
  38. package/dist/core/kinds.js.map +1 -0
  39. package/dist/core/launch.js +181 -0
  40. package/dist/core/launch.js.map +1 -0
  41. package/dist/core/logfmt.js +144 -0
  42. package/dist/core/logfmt.js.map +1 -0
  43. package/dist/core/mock.js +27 -0
  44. package/dist/core/mock.js.map +1 -0
  45. package/dist/core/plan.js +147 -0
  46. package/dist/core/plan.js.map +1 -0
  47. package/dist/core/ports.js +155 -0
  48. package/dist/core/ports.js.map +1 -0
  49. package/dist/core/presets.js +186 -0
  50. package/dist/core/presets.js.map +1 -0
  51. package/dist/core/secret-types.js +3 -0
  52. package/dist/core/secret-types.js.map +1 -0
  53. package/dist/core/sign-in.js +30 -0
  54. package/dist/core/sign-in.js.map +1 -0
  55. package/dist/core/stack-path.js +64 -0
  56. package/dist/core/stack-path.js.map +1 -0
  57. package/dist/core/stack.js +509 -0
  58. package/dist/core/stack.js.map +1 -0
  59. package/dist/core/terraform.js +393 -0
  60. package/dist/core/terraform.js.map +1 -0
  61. package/dist/data.js +37 -0
  62. package/dist/data.js.map +1 -0
  63. package/dist/engine/actions.js +99 -0
  64. package/dist/engine/actions.js.map +1 -0
  65. package/dist/engine/app-commands.js +106 -0
  66. package/dist/engine/app-commands.js.map +1 -0
  67. package/dist/engine/app-start.js +167 -0
  68. package/dist/engine/app-start.js.map +1 -0
  69. package/dist/engine/app-state.js +43 -0
  70. package/dist/engine/app-state.js.map +1 -0
  71. package/dist/engine/boards.js +219 -0
  72. package/dist/engine/boards.js.map +1 -0
  73. package/dist/engine/branch.js +194 -0
  74. package/dist/engine/branch.js.map +1 -0
  75. package/dist/engine/browser-console.js +45 -0
  76. package/dist/engine/browser-console.js.map +1 -0
  77. package/dist/engine/calls.js +97 -0
  78. package/dist/engine/calls.js.map +1 -0
  79. package/dist/engine/checks.js +270 -0
  80. package/dist/engine/checks.js.map +1 -0
  81. package/dist/engine/clones.js +67 -0
  82. package/dist/engine/clones.js.map +1 -0
  83. package/dist/engine/config.js +26 -0
  84. package/dist/engine/config.js.map +1 -0
  85. package/dist/engine/deployed.js +488 -0
  86. package/dist/engine/deployed.js.map +1 -0
  87. package/dist/engine/devices.js +81 -0
  88. package/dist/engine/devices.js.map +1 -0
  89. package/dist/engine/discover.js +236 -0
  90. package/dist/engine/discover.js.map +1 -0
  91. package/dist/engine/down.js +253 -0
  92. package/dist/engine/down.js.map +1 -0
  93. package/dist/engine/history.js +215 -0
  94. package/dist/engine/history.js.map +1 -0
  95. package/dist/engine/investigate.js +278 -0
  96. package/dist/engine/investigate.js.map +1 -0
  97. package/dist/engine/libraries.js +129 -0
  98. package/dist/engine/libraries.js.map +1 -0
  99. package/dist/engine/linked.js +146 -0
  100. package/dist/engine/linked.js.map +1 -0
  101. package/dist/engine/listen.js +223 -0
  102. package/dist/engine/listen.js.map +1 -0
  103. package/dist/engine/locks.js +38 -0
  104. package/dist/engine/locks.js.map +1 -0
  105. package/dist/engine/messages.js +177 -0
  106. package/dist/engine/messages.js.map +1 -0
  107. package/dist/engine/needs.js +363 -0
  108. package/dist/engine/needs.js.map +1 -0
  109. package/dist/engine/processes.js +350 -0
  110. package/dist/engine/processes.js.map +1 -0
  111. package/dist/engine/query.js +241 -0
  112. package/dist/engine/query.js.map +1 -0
  113. package/dist/engine/queues.js +100 -0
  114. package/dist/engine/queues.js.map +1 -0
  115. package/dist/engine/recipes.js +248 -0
  116. package/dist/engine/recipes.js.map +1 -0
  117. package/dist/engine/reload.js +32 -0
  118. package/dist/engine/reload.js.map +1 -0
  119. package/dist/engine/repos.js +214 -0
  120. package/dist/engine/repos.js.map +1 -0
  121. package/dist/engine/research.js +134 -0
  122. package/dist/engine/research.js.map +1 -0
  123. package/dist/engine/run-logs.js +79 -0
  124. package/dist/engine/run-logs.js.map +1 -0
  125. package/dist/engine/run.js +54 -0
  126. package/dist/engine/run.js.map +1 -0
  127. package/dist/engine/runs.js +223 -0
  128. package/dist/engine/runs.js.map +1 -0
  129. package/dist/engine/session.js +130 -0
  130. package/dist/engine/session.js.map +1 -0
  131. package/dist/engine/share.js +124 -0
  132. package/dist/engine/share.js.map +1 -0
  133. package/dist/engine/stack-file.js +206 -0
  134. package/dist/engine/stack-file.js.map +1 -0
  135. package/dist/engine/stack-share.js +86 -0
  136. package/dist/engine/stack-share.js.map +1 -0
  137. package/dist/engine/stacks.js +143 -0
  138. package/dist/engine/stacks.js.map +1 -0
  139. package/dist/engine/sync.js +214 -0
  140. package/dist/engine/sync.js.map +1 -0
  141. package/dist/engine/traces.js +65 -0
  142. package/dist/engine/traces.js.map +1 -0
  143. package/dist/engine/up.js +621 -0
  144. package/dist/engine/up.js.map +1 -0
  145. package/dist/engine/watch.js +71 -0
  146. package/dist/engine/watch.js.map +1 -0
  147. package/dist/engine/wire.js +120 -0
  148. package/dist/engine/wire.js.map +1 -0
  149. package/dist/failure.js +16 -0
  150. package/dist/failure.js.map +1 -0
  151. package/dist/github.js +95 -0
  152. package/dist/github.js.map +1 -0
  153. package/dist/ids.js +6 -0
  154. package/dist/ids.js.map +1 -0
  155. package/dist/json-files.js +36 -0
  156. package/dist/json-files.js.map +1 -0
  157. package/dist/koppler.mjs +840 -0
  158. package/dist/koppler.mjs.map +1 -0
  159. package/dist/lambda-local.mjs +250 -0
  160. package/dist/lambda-local.mjs.map +1 -0
  161. package/dist/lambda-secrets-proxy.go +31 -0
  162. package/dist/mock-server.mjs +23 -0
  163. package/dist/mock-server.mjs.map +1 -0
  164. package/dist/page/assets/JetBrainsMono-cyrillic-D2jMJ_bk.woff2 +0 -0
  165. package/dist/page/assets/JetBrainsMono-greek-D2nYnAec.woff2 +0 -0
  166. package/dist/page/assets/JetBrainsMono-latin-Db4Uuiha.woff2 +0 -0
  167. package/dist/page/assets/JetBrainsMono-latin-ext-Bnd2h4Br.woff2 +0 -0
  168. package/dist/page/assets/JetBrainsMono-vietnamese-CNlsqbWb.woff2 +0 -0
  169. package/dist/page/assets/SchibstedGrotesk-latin-DxefFeRw.woff2 +0 -0
  170. package/dist/page/assets/SchibstedGrotesk-latin-ext-CnpJE18X.woff2 +0 -0
  171. package/dist/page/assets/index-Bkj_pX35.js +42 -0
  172. package/dist/page/assets/index-Dq45jswH.css +1 -0
  173. package/dist/page/index.html +14 -0
  174. package/dist/page/theme.js +8 -0
  175. package/dist/paths.js +19 -0
  176. package/dist/paths.js.map +1 -0
  177. package/dist/safe-env.js +73 -0
  178. package/dist/safe-env.js.map +1 -0
  179. package/dist/sam-local.mjs +135 -0
  180. package/dist/sam-local.mjs.map +1 -0
  181. package/dist/scrub.js +87 -0
  182. package/dist/scrub.js.map +1 -0
  183. package/dist/secret-check.mjs +262 -0
  184. package/dist/secret-check.mjs.map +1 -0
  185. package/dist/server/browser-console.js +117 -0
  186. package/dist/server/browser-console.js.map +1 -0
  187. package/dist/server/cable-test.js +365 -0
  188. package/dist/server/cable-test.js.map +1 -0
  189. package/dist/server/choices.js +51 -0
  190. package/dist/server/choices.js.map +1 -0
  191. package/dist/server/files.js +107 -0
  192. package/dist/server/files.js.map +1 -0
  193. package/dist/server/gate.js +128 -0
  194. package/dist/server/gate.js.map +1 -0
  195. package/dist/server/logs.js +76 -0
  196. package/dist/server/logs.js.map +1 -0
  197. package/dist/server/mobile.js +113 -0
  198. package/dist/server/mobile.js.map +1 -0
  199. package/dist/server/routes.js +326 -0
  200. package/dist/server/routes.js.map +1 -0
  201. package/dist/server/runs.js +111 -0
  202. package/dist/server/runs.js.map +1 -0
  203. package/dist/server/sanitize.js +242 -0
  204. package/dist/server/sanitize.js.map +1 -0
  205. package/dist/server/secrets.js +111 -0
  206. package/dist/server/secrets.js.map +1 -0
  207. package/dist/server/status.js +321 -0
  208. package/dist/server/status.js.map +1 -0
  209. package/dist/server/token.js +38 -0
  210. package/dist/server/token.js.map +1 -0
  211. package/dist/server/waiting.js +79 -0
  212. package/dist/server/waiting.js.map +1 -0
  213. package/dist/status-watch.mjs +63 -0
  214. package/dist/status-watch.mjs.map +1 -0
  215. package/package.json +73 -4
  216. package/skills/koppler-run/SKILL.md +169 -0
  217. package/skills/koppler-run/VERSION +1 -0
  218. package/skills/koppler-run/references/action-log.md +50 -0
  219. package/skills/koppler-run/references/permissions.md +25 -0
  220. package/skills/koppler-run/references/preparing-nodes.md +62 -0
  221. package/skills/koppler-run/references/reporting-bugs.md +76 -0
  222. package/skills/koppler-run/references/research.md +40 -0
  223. package/skills/koppler-run/references/secrets.md +56 -0
  224. package/skills/koppler-run/references/stack.md +197 -0
  225. package/skills/koppler-run/references/status.md +92 -0
@@ -0,0 +1,64 @@
1
+ // A place in the stack, written as a path: apps.orders.url, apps.orders.prereqs[0].port, queues.events.name.
2
+ // Reading one and changing one, on a copy: the stack itself is never changed in place.
3
+ const KEY = /^[A-Za-z0-9_][\w.-]*$/;
4
+ // What would reach the object's prototype instead of its own fields.
5
+ const UNSAFE = new Set(['__proto__', 'prototype', 'constructor']);
6
+ /** The parts of a path, or why it is not one. A key with a dot in it is written in brackets: envAliases["qa.eu"]. */
7
+ export function parsePath(path) {
8
+ const parts = [];
9
+ const re = /\.?([A-Za-z0-9_][\w-]*)|\[(\d+)\]|\["([^"\]]+)"\]/y;
10
+ let at = 0;
11
+ while (at < path.length) {
12
+ re.lastIndex = at;
13
+ const found = re.exec(path);
14
+ if (!found || (at === 0 && path.startsWith('.')))
15
+ return { error: `${path} is not a path such as apps.orders.url` };
16
+ const [, key, index, quoted] = found;
17
+ if (index !== undefined)
18
+ parts.push(Number(index));
19
+ else
20
+ parts.push((key ?? quoted));
21
+ at = re.lastIndex;
22
+ }
23
+ const bad = parts.find(part => typeof part === 'string' && (UNSAFE.has(part) || !KEY.test(part)));
24
+ if (bad !== undefined)
25
+ return { error: `${String(bad)} cannot be part of a path` };
26
+ return parts.length ? parts : { error: 'give a path, such as apps.orders.url' };
27
+ }
28
+ const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
29
+ /** What is at the path, or undefined when nothing is. */
30
+ export function getAt(root, path) {
31
+ let here = root;
32
+ for (const part of path) {
33
+ if (typeof part === 'number' ? !Array.isArray(here) : !isObject(here) || !Object.hasOwn(here, part))
34
+ return undefined;
35
+ here = here[part];
36
+ }
37
+ return here;
38
+ }
39
+ /**
40
+ * A copy of the root with the value at the path, or without it when the value is undefined (a list closes up). Objects
41
+ * on the way are made as needed; a list takes a new item only at its end.
42
+ */
43
+ export function setAt(root, path, value) {
44
+ const [part, ...rest] = path;
45
+ if (part === undefined)
46
+ return value;
47
+ if (typeof part === 'number') {
48
+ const list = Array.isArray(root) ? [...root] : [];
49
+ if (part > list.length)
50
+ throw new Error(`there is no item ${String(part)} in this list`);
51
+ if (!rest.length && value === undefined)
52
+ list.splice(part, 1);
53
+ else
54
+ list[part] = setAt(list[part], rest, value);
55
+ return list;
56
+ }
57
+ if (Array.isArray(root))
58
+ throw new Error(`${part} is not a place in a list`);
59
+ const object = isObject(root) ? root : {};
60
+ if (!rest.length && value === undefined)
61
+ return Object.fromEntries(Object.entries(object).filter(([key]) => key !== part));
62
+ return { ...object, [part]: setAt(object[part], rest, value) };
63
+ }
64
+ //# sourceMappingURL=stack-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-path.js","sourceRoot":"","sources":["../../src/core/stack-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,509 @@
1
+ // The stack file: its shape, the types the rest of the code reads it by, and the check a stack has to pass before it
2
+ // is used. One definition gives all three.
3
+ import * as z from 'zod';
4
+ import { loadsCode } from "../safe-env.js";
5
+ import { expressionProblems, resolveExpressions } from "./expressions.js";
6
+ import { BUILT_IN_KINDS } from "./kinds.js";
7
+ import { QUEUE_TYPES } from "./plan.js";
8
+ import { VERSION as PRESET_VERSION } from "./presets.js";
9
+ import { SECRET_TYPES } from "./secret-types.js";
10
+ // Values that end up in commands (tunnels, sign-ins, hosts entries, secret steps, clone commands) must look like what
11
+ // they are, so a shared stack file cannot smuggle shell syntax into them.
12
+ const HOST = /^(?=.{1,253}$)[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/;
13
+ const NAME = /^[\w.-]{1,128}$/;
14
+ const SETTING = /^[A-Za-z_][\w.:-]{0,127}$/;
15
+ const SLUG = /^[\w.-]+(?:\/[\w.-]+)+$/;
16
+ const ID = /^[a-z0-9-]+$/;
17
+ const matching = (pattern, what) => z.string({ error: what }).regex(pattern, what);
18
+ const required = z.string({ error: 'required' }).min(1, 'required');
19
+ const host = matching(HOST, 'a host name');
20
+ const setting = matching(SETTING, 'a setting name');
21
+ const queueName = matching(NAME, 'a queue or topic name');
22
+ const START = 'a shell command (up to 2000 characters)';
23
+ const start = z.string({ error: START }).min(1, START).max(2000, START);
24
+ const PORT = 'a port number from 1 to 65535';
25
+ /** Something an app needs before it can run: a tunnel, a sign-in, a hosts entry. */
26
+ const Prereq = z.looseObject({
27
+ tunnel: host.optional().describe('The host the tunnel reaches, such as a database'),
28
+ // A number: it reaches the page, shell commands and the port probe.
29
+ port: z
30
+ .number({ error: PORT })
31
+ .int(PORT)
32
+ .min(1, PORT)
33
+ .max(65535, PORT)
34
+ .optional()
35
+ .describe('The local port it opens'),
36
+ /** The app's setting that holds the tunnel's address. */
37
+ env: setting.optional().describe("The app's setting that holds the tunnel's address"),
38
+ what: z.string().optional().describe('What it is, in words: Database (Postgres)'),
39
+ /** The name the app dials, when that is not the tunnel's host. */
40
+ connectsAs: host.optional().describe('The name the app dials, when that is not the host'),
41
+ hosts: host.optional().describe('A name to point at this Mac in /etc/hosts'),
42
+ sso: matching(NAME, 'an AWS profile name').optional().describe('The AWS profile to be signed in with'),
43
+ /** The AWS account that profile must be signed in to. */
44
+ account: matching(/^\d{12}$/, 'a 12-digit AWS account id')
45
+ .optional()
46
+ .describe('The AWS account that profile must be in'),
47
+ /** A sign-in of the stack's own, by its name under `signIns`. */
48
+ signIn: matching(NAME, 'the name of a sign-in').optional().describe('A sign-in of the stack, by its name'),
49
+ devCerts: z.boolean().optional().describe('It serves https here: the local certificate must be trusted'),
50
+ nuget: z.boolean().optional().describe('It downloads packages from a private feed while it builds'),
51
+ cmd: z.string().optional().describe('How the team opens it by hand; Koppler checks that its program is installed'),
52
+ note: z.string().optional().describe('Anything else worth knowing, in words'),
53
+ }, { error: 'an object: a tunnel, a sign-in or another need' });
54
+ const Secret = z.looseObject({
55
+ /** The setting the stored value is given to the app as. */
56
+ env: setting.optional().describe('The setting the stored value is given to the app as'),
57
+ type: z.string().optional().describe('postgres, mysql or redis, so it can be tested'),
58
+ file: z.string().optional().describe("A file in the app's repo that holds the secret, instead of a setting"),
59
+ when: z.string().optional().describe('When it is needed, if not always'),
60
+ fetch: z
61
+ .looseObject({
62
+ cli: z.string().optional().describe('The command that stores it, run in your own terminal'),
63
+ ui: z.string().optional().describe('Where to find it by hand'),
64
+ })
65
+ .optional()
66
+ .describe('How to get it'),
67
+ note: z.string().optional().describe('Anything else worth knowing, in words'),
68
+ }, { error: 'an object' });
69
+ /** How one app calls another, and so what to change to point it at a local copy. */
70
+ const Call = z.looseObject({
71
+ how: z.string().optional().describe('How it picks the address: a setting, a settings file, an edit'),
72
+ env: z
73
+ .union([z.string(), z.array(z.string())], { error: 'a setting name, or a list of them' })
74
+ .optional()
75
+ .describe('The setting that holds the address'),
76
+ file: z.string().optional().describe('The file that holds the address, inside its repo'),
77
+ key: z.string().optional().describe('The name or line in that file'),
78
+ /** An address to use instead of the worked-out one: one for all, or one per platform (ios, android). */
79
+ value: z
80
+ .union([z.string(), z.record(z.string(), z.string())])
81
+ .optional()
82
+ .describe('An address to use instead of the worked-out one'),
83
+ /** The route the caller's setting holds after the callee's address, kept when the call goes local. */
84
+ path: z
85
+ .string()
86
+ .regex(/^\/[^\s?#]*$/, { error: 'a path that starts with / (no query)' })
87
+ .optional()
88
+ .describe('The route kept after the address, such as /api'),
89
+ deployed: z.string().optional().describe('The deployed address it calls today'),
90
+ found: z.string().optional().describe('Where the call was seen in its code'),
91
+ note: z.string().optional().describe('Anything else worth knowing, in words'),
92
+ ifDown: z
93
+ .enum(['skip', 'start'], { error: 'skip or start' })
94
+ .optional()
95
+ .describe('When the local app it calls does not start: skip this one too (the default), or start it anyway'),
96
+ }, { error: 'an object (how the call is made; {} when not known yet)' });
97
+ const LOCAL_CHANGE = "needs file (a path inside the app's clone, no .. or leading /), find and replace";
98
+ const insideClone = (file) => !file.startsWith('/') && !/^[A-Za-z]:[\\/]/.test(file) && !file.split(/[\\/]/).includes('..');
99
+ /** A code change the stack remembers for local runs: one file inside the app's own clone. */
100
+ const LocalChange = z
101
+ .looseObject({ file: z.string().min(1), find: z.string().min(1), replace: z.string() }, { error: LOCAL_CHANGE })
102
+ .refine(change => insideClone(change.file), LOCAL_CHANGE);
103
+ /** What differs for an app on an environment other than the stack's first. */
104
+ const EnvOverlay = z.looseObject({
105
+ prereqs: z.array(Prereq, { error: 'a list' }).optional(),
106
+ secrets: z.array(Secret, { error: 'a list' }).optional(),
107
+ start: start.optional(),
108
+ }, { error: 'an object' });
109
+ /** The icons a command's button can have on its card. */
110
+ export const COMMAND_ICONS = [
111
+ 'play',
112
+ 'database',
113
+ 'sprout',
114
+ 'refresh',
115
+ 'trash',
116
+ 'terminal',
117
+ 'upload',
118
+ 'download',
119
+ ];
120
+ const AppCommand = z.looseObject({
121
+ label: required.describe('Its button: Seed, Migrate'),
122
+ run: z.string({ error: 'a shell command' }).min(1).describe('The shell command, run in its repo with its secrets'),
123
+ icon: z.enum(COMMAND_ICONS, { error: `one of ${COMMAND_ICONS.join(', ')}` }).optional(),
124
+ confirm: z.string().optional().describe('A question to answer yes to first, for a command that changes data'),
125
+ args: z
126
+ .array(z.looseObject({
127
+ name: z.string().regex(/^[A-Za-z][A-Za-z0-9_]{0,31}$/, { error: 'a name such as COUNT' }),
128
+ label: z.string().optional(),
129
+ type: z.enum(['text', 'number', 'choice'], { error: 'text, number or choice' }).optional(),
130
+ choices: z.array(z.string()).optional(),
131
+ required: z.boolean().optional(),
132
+ }), { error: 'a list' })
133
+ .optional()
134
+ .describe('What it asks for; each value reaches the command as a setting of its name'),
135
+ show: z
136
+ .enum(['canvas', 'cli', 'both'], { error: 'canvas, cli or both' })
137
+ .optional()
138
+ .describe('Where it is offered: a button on the card, koppler do, or both (the default)'),
139
+ timeout: z.number().positive().optional().describe('Seconds it may take, 1800 by default'),
140
+ }, { error: 'an object with a label and a command to run' });
141
+ const MockResponse = z.looseObject({
142
+ method: z
143
+ .enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], { error: 'GET, POST, PUT, PATCH or DELETE' })
144
+ .optional()
145
+ .describe('Its method; any method when left out'),
146
+ path: z
147
+ .string({ error: 'a path such as /orders' })
148
+ .regex(/^\//, 'a path such as /orders')
149
+ .describe('The path it answers; one ending in * answers every path under it'),
150
+ status: z.int().min(100).max(599).optional().describe('Its status, 200 by default'),
151
+ body: z.unknown().optional().describe('What it answers: JSON, or text'),
152
+ headers: z.record(z.string(), z.string(), { error: 'an object' }).optional().describe('Headers it adds'),
153
+ }, { error: 'an object with a path' });
154
+ const App = z.looseObject({
155
+ name: required.describe('Its name on the canvas'),
156
+ kind: required.describe('What it is built with: dotnet, node, web, flutter, lambda, other'),
157
+ /** Its repo: owner/repo, or host/path/to/repo. An outside system has none. */
158
+ slug: matching(SLUG, 'owner/repo, or host/path/to/repo').optional().describe('Its repo: owner/repo'),
159
+ /** Set for a system that is never run locally (a SaaS), to what it is. */
160
+ outside: z
161
+ .union([z.string(), z.boolean()])
162
+ .optional()
163
+ .describe('Set for a system that never runs here, to what it is'),
164
+ pending: z
165
+ .union([z.string(), z.boolean()])
166
+ .optional()
167
+ .describe('Set while its facts are not filled in yet; a run refuses it until this is taken out'),
168
+ /** Where it answers when it runs on this machine. */
169
+ url: z.string().optional().describe('Where it answers when it runs on this Mac'),
170
+ deployedUrl: z.string().optional().describe('Where the deployed one answers'),
171
+ /** The shell command that starts it, run in its clone. */
172
+ start: start.optional().describe('The shell command that starts it, run in its repo'),
173
+ /** When it is ready: a GET of this path on its `url` answers, with this status when one is given. */
174
+ ready: z
175
+ .looseObject({
176
+ path: z.string().regex(/^\/\S*$/, { error: 'a path that starts with /' }),
177
+ status: z.int().min(100).max(599).optional(),
178
+ timeout: z.number().positive().optional(),
179
+ }, { error: 'an object with a path' })
180
+ .optional()
181
+ .describe('When it is ready: this path answers on its url, with this status'),
182
+ /** It runs to completion, such as a migration or seed data, instead of staying up. */
183
+ once: z
184
+ .looseObject({
185
+ exitCode: z.int().min(0).max(255).optional(),
186
+ timeout: z.number().positive().optional(),
187
+ }, { error: 'an object' })
188
+ .optional()
189
+ .describe('It runs to completion, like a migration: the exit code it must end with (0) and the seconds it may take'),
190
+ browserConsole: z
191
+ .looseObject({ file: z.string().min(1) }, { error: 'an object with the HTML file' })
192
+ .refine(value => insideClone(value.file), "needs file: its HTML entry file, inside the app's clone")
193
+ .optional()
194
+ .describe('Web: its browser console on its card; file is its HTML entry file, such as index.html'),
195
+ watch: z
196
+ .looseObject({ ignore: z.array(z.string(), { error: 'a list of paths' }).optional() }, { error: 'an object' })
197
+ .optional()
198
+ .describe('Restart on change: paths in its repo whose changes do not restart it'),
199
+ commands: z
200
+ .record(z.string().regex(/^[a-z0-9][a-z0-9-]{0,31}$/, { error: 'an id such as seed' }), AppCommand, {
201
+ error: 'an object',
202
+ })
203
+ .optional()
204
+ .describe('Buttons such as Seed or Migrate on its card, also run with koppler do'),
205
+ mock: z
206
+ .array(MockResponse, { error: 'a list' })
207
+ .optional()
208
+ .describe('Canned responses answered on its local address in its place, when its card is set to Mock'),
209
+ after: z
210
+ .array(z.string(), { error: 'a list of app ids' })
211
+ .optional()
212
+ .describe('Apps in the same run that must finish (a once app) or start before this one does'),
213
+ prereqs: z
214
+ .array(Prereq, { error: 'a list' })
215
+ .optional()
216
+ .describe('What it needs first: tunnels, sign-ins, hosts entries'),
217
+ secrets: z
218
+ .array(Secret, { error: 'a list' })
219
+ .optional()
220
+ .describe('The secrets it needs, by name; values stay in your keychain'),
221
+ consumes: z
222
+ .record(z.string(), Call, { error: 'an object' })
223
+ .optional()
224
+ .describe('The apps it calls, and how it finds each'),
225
+ publishes: z.record(z.string(), z.unknown(), { error: 'an object' }).optional().describe('The queues it sends to'),
226
+ reads: z.record(z.string(), z.unknown(), { error: 'an object' }).optional().describe('The queues it reads from'),
227
+ envs: z
228
+ .record(z.string(), EnvOverlay, { error: 'an object' })
229
+ .optional()
230
+ .describe('What differs on another environment; a list given here replaces the one above'),
231
+ localChanges: z
232
+ .array(LocalChange, { error: LOCAL_CHANGE })
233
+ .optional()
234
+ .describe('Code changes made for a local run and undone on Stop'),
235
+ /** .NET: the project to run, its launch settings file, and the profile to start from. */
236
+ project: z.string().optional().describe('.NET: the project to run'),
237
+ launchSettings: z.string().optional().describe('.NET: its launch settings file'),
238
+ baseProfile: z.string().optional().describe('.NET: the launch profile to start from'),
239
+ /** Node and web: the package.json script, when it is not `dev` or `start`. */
240
+ script: z.string().optional().describe('Node and web: the package.json script, when not dev or start'),
241
+ flutter: z
242
+ .looseObject({
243
+ fvm: z.boolean().optional(),
244
+ flavor: z.boolean().optional(),
245
+ defineFile: z.string().optional(),
246
+ })
247
+ .optional()
248
+ .describe('Flutter: fvm, flavor, the --dart-define file'),
249
+ mobile: z
250
+ .looseObject({
251
+ iosBundleId: z.string().optional(),
252
+ androidPackage: z.string().optional(),
253
+ })
254
+ .optional()
255
+ .describe('The app ids on iOS and Android'),
256
+ lambda: z
257
+ .looseObject({
258
+ handler: z.string().optional(),
259
+ runtime: z.string().optional(),
260
+ project: z.string().optional().describe('The folder to build, when not the repo itself'),
261
+ timeout: z.number().positive().optional().describe('Seconds a call may take'),
262
+ routes: z.array(z.string()).optional().describe('The paths it answers on'),
263
+ secret: z
264
+ .looseObject({ id: z.string().optional(), from: z.string().optional() })
265
+ .optional()
266
+ .describe('The secret it reads when it starts, and the stored value that holds it'),
267
+ })
268
+ .optional()
269
+ .describe('Lambda: handler and runtime'),
270
+ sam: z
271
+ .looseObject({
272
+ template: z.string().optional(),
273
+ envs: z.record(z.string(), z.union([z.string(), z.array(z.string())])).optional(),
274
+ })
275
+ .optional()
276
+ .describe('SAM: template, and the stack per environment'),
277
+ /** The setting (or settings) that lists the browser origins this API allows. */
278
+ cors: z
279
+ .looseObject({ env: z.union([z.string(), z.array(z.string())]).optional() })
280
+ .optional()
281
+ .describe('The setting that lists the browser origins it allows'),
282
+ }, { error: 'an object' });
283
+ const Kind = z.looseObject({
284
+ label: required,
285
+ start: z.string({ error: 'a shell command' }).optional(),
286
+ detect: z.union([z.string(), z.array(z.string())], { error: 'file names' }).optional(),
287
+ }, { error: 'an object with a label' });
288
+ const Queue = z.looseObject({
289
+ name: required,
290
+ type: z.enum(QUEUE_TYPES, { error: `one of ${QUEUE_TYPES.join(', ')}` }),
291
+ queue: queueName.optional(),
292
+ envs: z.record(z.string(), z.looseObject({ queue: queueName.optional() })).optional(),
293
+ note: z.string().optional(),
294
+ }, { error: 'an object' });
295
+ const CHECK = 'needs a name (up to 80 characters) and a run command (up to 2000)';
296
+ // What gets approved is what runs: a check list or command too long to show in full is refused, never cut short.
297
+ const isCheck = (value) => {
298
+ if (typeof value !== 'object' || value === null)
299
+ return false;
300
+ const { name, run } = value;
301
+ const sized = (text, most) => typeof text === 'string' && text.length > 0 && text.length <= most;
302
+ return sized(name, 80) && sized(run, 2000);
303
+ };
304
+ const Check = z.custom(isCheck, CHECK);
305
+ const CHECKS = 'a list of at most 50 checks';
306
+ const COMMAND = 'a command, as text of at most 2000 characters';
307
+ const command = z.string({ error: COMMAND }).min(1, COMMAND).max(2000, COMMAND);
308
+ /** A sign-in the stack declares: how to tell it holds, how to sign in, and the settings it gives the app. */
309
+ const SignIn = z.looseObject({
310
+ what: z.string().optional(),
311
+ check: command,
312
+ login: command,
313
+ env: z.record(setting, z.string({ error: 'text' }), { error: 'an object of settings' }).optional(),
314
+ }, { error: 'an object with check and login' });
315
+ const PRESET_VERSION_NEEDED = `required (the current preset format is ${String(PRESET_VERSION)})`;
316
+ const Preset = z.looseObject({
317
+ name: required,
318
+ version: z.number({ error: PRESET_VERSION_NEEDED }).int(PRESET_VERSION_NEEDED),
319
+ nodes: z
320
+ .record(z.string(), z.looseObject({}, { error: 'an object ({} for the defaults)' }), {
321
+ error: 'an object keyed by app id',
322
+ })
323
+ .optional(),
324
+ edges: z.array(z.unknown(), { error: 'a list of { from, to }' }).optional(),
325
+ }, { error: 'an object' });
326
+ const ENVS = 'a non-empty list of lowercase names, each once';
327
+ const isEnvList = (value) => Array.isArray(value) &&
328
+ value.length > 0 &&
329
+ value.every(env => typeof env === 'string' && ID.test(env)) &&
330
+ new Set(value).size === value.length;
331
+ const PROTECTED = 'a list of environments from envs (the ones that ask before every secret read and get the careful review)';
332
+ export const StackSchema = z.looseObject({
333
+ name: z.string().optional(),
334
+ /** The environments, the first being the one apps run against by default. */
335
+ envs: z.custom(isEnvList, ENVS),
336
+ /** The environments where a mistake costs something; without this, every one but the first. */
337
+ protected: z.array(z.string(), { error: PROTECTED }).optional(),
338
+ /** Other names an environment goes by in the repos. */
339
+ envAliases: z
340
+ .record(z.string(), z.array(z.string(), { error: 'must be one of envs, with a list of names' }), {
341
+ error: 'an object keyed by environment',
342
+ })
343
+ .optional(),
344
+ apps: z.record(z.string(), App, { error: 'an object keyed by app id' }),
345
+ kinds: z.record(z.string(), Kind, { error: 'an object keyed by kind id' }).optional(),
346
+ queues: z.record(z.string(), Queue, { error: 'an object keyed by queue id' }).optional(),
347
+ checks: z.array(Check, { error: CHECKS }).max(50, CHECKS).optional(),
348
+ signIns: z.record(z.string(), SignIn, { error: 'an object keyed by sign-in name' }).optional(),
349
+ presets: z.array(Preset, { error: 'a list' }).optional(),
350
+ /** How to install a program the stack's apps need, by its name. */
351
+ install: z
352
+ .record(z.string(), z.string(), { error: 'an object of program names and how to install each' })
353
+ .optional(),
354
+ }, { error: 'a stack is an object with envs and apps' });
355
+ const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
356
+ /** Whether the stack has this app, queue or kind as its own: `constructor` is not one. */
357
+ const has = (table, key) => isObject(table) && Object.hasOwn(table, key);
358
+ const entries = (table) => (isObject(table) ? Object.entries(table) : []);
359
+ const list = (value) => (Array.isArray(value) ? value : []);
360
+ /** What one app's parts refer to: apps it calls, queues it uses, environments, and settings it must not be given. */
361
+ function appProblems(id, app, stack, envs) {
362
+ const at = `apps.${id}`;
363
+ const problems = [];
364
+ const kind = app['kind'];
365
+ if (typeof kind === 'string' && kind && !BUILT_IN_KINDS.includes(kind) && !has(stack['kinds'], kind))
366
+ problems.push(`${at}.kind: "${kind}" is not a kind Koppler knows; define it under "kinds", or use "other" with a "start" command`);
367
+ // An outside system may have no repo of its own.
368
+ if (!app['outside'] && app['slug'] === undefined)
369
+ problems.push(`${at}.slug: required`);
370
+ for (const [dep] of entries(app['consumes']))
371
+ if (!has(stack['apps'], dep))
372
+ problems.push(`${at}.consumes.${dep}: no such app`);
373
+ for (const [n, dep] of list(app['after']).entries())
374
+ if (typeof dep !== 'string' || !has(stack['apps'], dep))
375
+ problems.push(`${at}.after[${String(n)}]: no such app`);
376
+ for (const key of ['publishes', 'reads'])
377
+ for (const [queue] of entries(app[key]))
378
+ if (!has(stack['queues'], queue))
379
+ problems.push(`${at}.${key}.${queue}: no such queue under "queues"`);
380
+ for (const [env] of entries(app['envs']))
381
+ if (!envs.includes(env))
382
+ problems.push(`${at}.envs.${env}: not one of envs (${envs.join(', ')})`);
383
+ const overlays = entries(app['envs']).map(([env, overlay]) => [`envs.${env}.secrets`, isObject(overlay) ? overlay['secrets'] : undefined]);
384
+ const secretLists = [['secrets', app['secrets']], ...overlays];
385
+ const secrets = secretLists.flatMap(([where, secrets]) => list(secrets)
386
+ .filter(isObject)
387
+ .map(secret => ({ where, secret })));
388
+ // A secret or a cable's setting named like a variable that makes a runtime load code would run the stack author's
389
+ // code in the app.
390
+ const cableSettings = entries(app['consumes']).flatMap(([, call]) => (isObject(call) ? [call['env']].flat() : []));
391
+ for (const name of [...secrets.map(({ secret }) => secret['env']), ...cableSettings])
392
+ if (typeof name === 'string' && (loadsCode(name) || name === 'PATH'))
393
+ problems.push(`${at}: "${name}" cannot be a secret or a cable setting; it changes what code the app runs`);
394
+ for (const { where, secret } of secrets) {
395
+ const type = secret['type'];
396
+ if (type !== undefined && !SECRET_TYPES.includes(type))
397
+ problems.push(`${at}.${where}: type "${typeof type === 'string' ? type : JSON.stringify(type)}" is not one Koppler tests (${SECRET_TYPES.join(', ')})`);
398
+ }
399
+ return problems;
400
+ }
401
+ function presetProblems(index, preset, stack) {
402
+ const at = `presets[${String(index)}]`;
403
+ const problems = [];
404
+ const version = preset['version'];
405
+ if (typeof version === 'number' && version > PRESET_VERSION)
406
+ problems.push(`${at}.version: ${String(version)} is newer than this Koppler reads (${String(PRESET_VERSION)}); update Koppler`);
407
+ for (const [id] of entries(preset['nodes']))
408
+ if (!has(stack['apps'], id))
409
+ problems.push(`${at}.nodes.${id}: no such app`);
410
+ for (const [n, edge] of list(preset['edges']).entries()) {
411
+ const from = isObject(edge) ? edge['from'] : undefined;
412
+ const to = isObject(edge) ? edge['to'] : undefined;
413
+ if (typeof from !== 'string' || typeof to !== 'string')
414
+ problems.push(`${at}.edges[${String(n)}]: needs from and to`);
415
+ else if (!has(preset['nodes'], from) || !has(preset['nodes'], to))
416
+ problems.push(`${at}.edges: ${from} -> ${to} needs both apps in the preset`);
417
+ }
418
+ return problems;
419
+ }
420
+ /** Every sign-in an app names must be one the stack declares. */
421
+ function signInProblems(stack) {
422
+ const declared = new Set(entries(stack['signIns']).map(([name]) => name));
423
+ const problems = [];
424
+ for (const [id, app] of entries(stack['apps'])) {
425
+ if (!isObject(app))
426
+ continue;
427
+ const lists = [
428
+ [`apps.${id}.prereqs`, app['prereqs']],
429
+ ...entries(app['envs']).map(([env, own]) => [
430
+ `apps.${id}.envs.${env}.prereqs`,
431
+ isObject(own) ? own['prereqs'] : undefined,
432
+ ]),
433
+ ];
434
+ for (const [at, prereqs] of lists)
435
+ for (const [index, prereq] of list(prereqs).entries()) {
436
+ const name = isObject(prereq) ? prereq['signIn'] : undefined;
437
+ if (typeof name === 'string' && !declared.has(name))
438
+ problems.push(`${at}[${String(index)}].signIn: no sign-in called ${name} under signIns`);
439
+ }
440
+ }
441
+ return problems;
442
+ }
443
+ /** What the parts of a stack refer to in each other: the schema checks each part's shape, this checks they fit. */
444
+ function crossProblems(stack) {
445
+ const envs = isEnvList(stack['envs']) ? stack['envs'] : [];
446
+ const problems = [];
447
+ if (Array.isArray(stack['protected']) && !stack['protected'].every(env => envs.includes(env)))
448
+ problems.push(`protected: ${PROTECTED}`);
449
+ for (const [env] of entries(stack['envAliases']))
450
+ if (!envs.includes(env))
451
+ problems.push(`envAliases.${env}: must be one of envs, with a list of names`);
452
+ for (const [id] of entries(stack['kinds'])) {
453
+ if (!/^[a-z0-9-]{1,32}$/.test(id))
454
+ problems.push(`kinds.${id}: id must be lowercase letters, digits and dashes`);
455
+ else if (BUILT_IN_KINDS.includes(id))
456
+ problems.push(`kinds.${id}: Koppler already has a kind with this id`);
457
+ }
458
+ for (const [id] of entries(stack['queues']))
459
+ if (!/^[a-z0-9-]{1,64}$/.test(id))
460
+ problems.push(`queues.${id}: id must be lowercase letters, digits and dashes`);
461
+ for (const [id, app] of entries(stack['apps'])) {
462
+ if (!ID.test(id))
463
+ problems.push(`apps.${id}: id must be lowercase letters, digits and dashes`);
464
+ if (isObject(app))
465
+ problems.push(...appProblems(id, app, stack, envs));
466
+ }
467
+ for (const [index, preset] of list(stack['presets']).entries())
468
+ if (isObject(preset))
469
+ problems.push(...presetProblems(index, preset, stack));
470
+ for (const [name, signIn] of entries(stack['signIns'])) {
471
+ if (!NAME.test(name))
472
+ problems.push(`signIns.${name}: a name of letters, digits, dots, dashes and underscores`);
473
+ // What a sign-in gives an app is set where the app starts: never a variable that makes a runtime load code.
474
+ for (const [setting] of entries(isObject(signIn) ? signIn['env'] : undefined))
475
+ if (loadsCode(setting) || setting === 'PATH')
476
+ problems.push(`signIns.${name}.env: "${setting}" cannot be given to an app; it changes what code the app runs`);
477
+ }
478
+ problems.push(...signInProblems(stack));
479
+ return problems;
480
+ }
481
+ const where = (path) => path.reduce((text, part) => typeof part === 'number' ? `${text}[${String(part)}]` : text ? `${text}.${String(part)}` : String(part), '');
482
+ /**
483
+ * Everything wrong with a stack, one line each, as `where: what`; empty when it can be used. Never throws, whatever it
484
+ * is given.
485
+ */
486
+ export function validateStack(raw) {
487
+ // Checked as it is used: with its expressions filled in.
488
+ const stack = resolveExpressions(raw);
489
+ const parsed = StackSchema.safeParse(stack);
490
+ const expressions = expressionProblems(raw);
491
+ // A value whose expression names nothing is that problem alone.
492
+ const named = new Set(expressions.map(problem => problem.slice(0, problem.indexOf(': '))));
493
+ const shape = parsed.success
494
+ ? []
495
+ : parsed.error.issues
496
+ .filter(issue => !named.has(where(issue.path)))
497
+ .map(issue => (issue.path.length > 0 ? `${where(issue.path)}: ${issue.message}` : issue.message));
498
+ return [...new Set([...expressions, ...shape, ...(isObject(stack) ? crossProblems(stack) : [])])];
499
+ }
500
+ /** An app as an environment has it: that environment's fields replace the app's own, a list whole. */
501
+ export function appOn(stack, id, env) {
502
+ const app = Object.hasOwn(stack.apps, id) ? stack.apps[id] : undefined;
503
+ if (!app || env === stack.envs[0])
504
+ return app;
505
+ return { ...app, ...app.envs?.[env] };
506
+ }
507
+ /** Where an app's secrets for an environment are stored: the first environment's under the app's id alone. */
508
+ export const storeOf = (stack, id, env) => env === stack.envs[0] ? id : `${id}@${env}`;
509
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/core/stack.ts"],"names":[],"mappings":"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"}