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,244 @@
1
+ // App kinds: what each kind of app is called, where it can be started, and how a clone is recognised as one.
2
+ // Kinds with a program of their own to start them are listed first; the rest are recipes, which say how a repo is
3
+ // recognised and how it is usually started. A stack can add kinds of its own.
4
+ import { frameworkOf } from "./frameworks.js";
5
+ // Who starts the app: Koppler from the terminal, or the user from their IDE.
6
+ const RUN_IN = [
7
+ ['cli', 'Koppler'],
8
+ ['ide', 'Your IDE'],
9
+ ];
10
+ const DOCKER = { tool: 'docker', fix: 'Install a Docker runtime (Docker Desktop or Colima)' };
11
+ const NPM = { tool: 'npm', fix: 'Comes with Node' };
12
+ /** Koppler's own kinds. */
13
+ export const KINDS = {
14
+ dotnet: {
15
+ label: '.NET',
16
+ runIn: RUN_IN,
17
+ serves: true,
18
+ needs: [{ tool: 'dotnet', fix: 'Install the .NET SDK the repo targets' }],
19
+ },
20
+ flutter: {
21
+ label: 'Flutter',
22
+ runIn: RUN_IN,
23
+ serves: false,
24
+ platforms: [
25
+ ['ios', 'iOS simulator'],
26
+ ['android', 'Android emulator'],
27
+ ['phone', 'Phone'],
28
+ ],
29
+ needs: [{ tool: 'fvm', fix: 'brew tap leoafarias/fvm && brew install fvm' }],
30
+ },
31
+ node: { label: 'Node', runIn: RUN_IN, serves: true, needs: [NPM] },
32
+ web: { label: 'Web', runIn: RUN_IN, serves: false, browser: true, needs: [NPM] },
33
+ // A queue-triggered AWS Lambda, run in an emulator in Docker; callers post to its local address.
34
+ lambda: {
35
+ label: 'Lambda',
36
+ runIn: RUN_IN,
37
+ serves: true,
38
+ needs: [DOCKER, { tool: 'aws', fix: 'brew install awscli' }],
39
+ },
40
+ // An AWS SAM app (template.yaml): its API runs with `sam local start-api`, whatever its runtime.
41
+ sam: {
42
+ label: 'AWS SAM',
43
+ runIn: RUN_IN,
44
+ serves: true,
45
+ needs: [DOCKER, { tool: 'sam', fix: 'brew install aws-sam-cli (or: uv tool install aws-sam-cli)' }],
46
+ },
47
+ // Anything else: started by the command in its `start` field.
48
+ other: { label: 'Other', runIn: RUN_IN, serves: true },
49
+ };
50
+ const read = (repo, file) => repo.read(file) ?? '';
51
+ const textOf = (repo, files) => files
52
+ .map(file => read(repo, file))
53
+ .join('\n')
54
+ .toLowerCase();
55
+ const flag = (name, port) => (port ? ` ${name}${String(port)}` : '');
56
+ const pythonDeps = (repo) => textOf(repo, ['pyproject.toml', 'requirements.txt', 'Pipfile']);
57
+ // How the repo runs its Python: through its package manager, or its own virtual environment.
58
+ function pythonRunner(repo) {
59
+ if (repo.has('uv.lock'))
60
+ return 'uv run ';
61
+ if (repo.has('poetry.lock'))
62
+ return 'poetry run ';
63
+ if (repo.has('Pipfile'))
64
+ return 'pipenv run ';
65
+ return repo.has('.venv/bin/python') ? '.venv/bin/' : '';
66
+ }
67
+ const isSpring = (repo) => /spring-boot|springframework\.boot/.test(textOf(repo, ['pom.xml', 'build.gradle', 'build.gradle.kts']));
68
+ const composeFile = (repo) => ['compose.yaml', 'compose.yml', 'docker-compose.yml', 'docker-compose.yaml'].find(file => repo.has(file));
69
+ const BUILT_IN_RECIPES = {
70
+ reactnative: {
71
+ label: 'React Native',
72
+ color: ['#087EA4', '#58C4DC'],
73
+ serves: false,
74
+ platforms: [
75
+ ['ios', 'iOS simulator'],
76
+ ['android', 'Android emulator'],
77
+ ],
78
+ detect: repo => /"(expo|react-native)"\s*:/.test(read(repo, 'package.json')),
79
+ start: (repo, { platform = 'ios' }) => /"expo"\s*:/.test(read(repo, 'package.json'))
80
+ ? `npx expo start --${platform}`
81
+ : `npx react-native run-${platform}`,
82
+ },
83
+ go: {
84
+ label: 'Go',
85
+ color: ['#00758D', '#5AD1E6'],
86
+ detect: repo => repo.has('go.mod'),
87
+ start: repo => {
88
+ if (repo.has('main.go'))
89
+ return 'go run .';
90
+ const commands = repo.list('cmd');
91
+ return commands.length === 1 ? `go run ./cmd/${commands[0] ?? ''}` : null;
92
+ },
93
+ },
94
+ rust: {
95
+ label: 'Rust',
96
+ color: ['#A0522D', '#E8A27C'],
97
+ detect: repo => repo.has('Cargo.toml'),
98
+ start: () => 'cargo run',
99
+ },
100
+ java: {
101
+ label: 'Java / Kotlin',
102
+ color: ['#B0562B', '#F0975F'],
103
+ detect: repo => repo.has('pom.xml') || repo.has('build.gradle') || repo.has('build.gradle.kts'),
104
+ port: repo => (isSpring(repo) ? 8080 : null),
105
+ start: repo => {
106
+ if (repo.has('pom.xml'))
107
+ return isSpring(repo) ? `${repo.has('mvnw') ? './mvnw' : 'mvn'} spring-boot:run` : null;
108
+ return `${repo.has('gradlew') ? './gradlew' : 'gradle'} ${isSpring(repo) ? 'bootRun' : 'run'}`;
109
+ },
110
+ },
111
+ python: {
112
+ label: 'Python',
113
+ color: ['#2F6F9F', '#7FB8E6'],
114
+ detect: repo => ['manage.py', 'pyproject.toml', 'requirements.txt', 'Pipfile'].some(file => repo.has(file)),
115
+ port: repo => {
116
+ const deps = pythonDeps(repo);
117
+ if (repo.has('manage.py') || /fastapi|uvicorn/.test(deps))
118
+ return 8000;
119
+ return deps.includes('flask') ? 5000 : null;
120
+ },
121
+ start: (repo, { port }) => {
122
+ const run = pythonRunner(repo);
123
+ const deps = pythonDeps(repo);
124
+ if (repo.has('manage.py'))
125
+ return `${run}python manage.py runserver${flag('', port)}`;
126
+ if (/fastapi|uvicorn/.test(deps)) {
127
+ const main = ['main.py', 'app/main.py', 'src/main.py'].find(file => repo.has(file));
128
+ const module = main?.replace(/\.py$/, '').replace(/\//g, '.');
129
+ return module ? `${run}uvicorn ${module}:app --reload${flag('--port ', port)}` : null;
130
+ }
131
+ return deps.includes('flask') ? `${run}flask run${flag('--port ', port)}` : null;
132
+ },
133
+ },
134
+ ruby: {
135
+ label: 'Ruby',
136
+ color: ['#B3261E', '#F28B82'],
137
+ detect: repo => repo.has('Gemfile'),
138
+ port: repo => (repo.has('config/application.rb') ? 3000 : null),
139
+ start: (repo, { port }) => (repo.has('config/application.rb') ? `bin/rails server${flag('-p ', port)}` : null),
140
+ },
141
+ php: {
142
+ label: 'PHP',
143
+ color: ['#6C5FC7', '#A99FF5'],
144
+ detect: repo => repo.has('artisan') || repo.has('composer.json'),
145
+ port: repo => (repo.has('artisan') ? 8000 : null),
146
+ start: (repo, { port }) => (repo.has('artisan') ? `php artisan serve${flag('--port=', port)}` : null),
147
+ },
148
+ // Last: many repos carry a compose file only for their database.
149
+ compose: {
150
+ label: 'Docker Compose',
151
+ color: ['#1D63ED', '#7AA7FF'],
152
+ detect: repo => !!composeFile(repo),
153
+ port: repo => Number(/["'\s-](\d{2,5}):\d{2,5}["'\s]/.exec(read(repo, composeFile(repo) ?? ''))?.[1]) || null,
154
+ start: () => 'docker compose up',
155
+ stop: 'docker compose down',
156
+ },
157
+ };
158
+ for (const [id, recipe] of Object.entries(BUILT_IN_RECIPES))
159
+ KINDS[id] = {
160
+ label: recipe.label,
161
+ runIn: RUN_IN,
162
+ serves: recipe.serves !== false,
163
+ ...(recipe.platforms && { platforms: recipe.platforms }),
164
+ ...(recipe.color && { color: recipe.color }),
165
+ };
166
+ /** The kinds Koppler has itself: a stack cannot define one under the same id. */
167
+ export const BUILT_IN_KINDS = Object.keys(KINDS);
168
+ const BUILT_IN = { kinds: KINDS, recipes: BUILT_IN_RECIPES, custom: [] };
169
+ const tables = new WeakMap();
170
+ /** A malformed kind, or one named like a kind Koppler has, is left out. */
171
+ function tableOf(stack) {
172
+ const given = stack?.kinds;
173
+ if (typeof given !== 'object' || given === null)
174
+ return BUILT_IN;
175
+ const cached = tables.get(given);
176
+ if (cached)
177
+ return cached;
178
+ const table = { kinds: { ...KINDS }, recipes: { ...BUILT_IN_RECIPES }, custom: [] };
179
+ for (const [id, one] of Object.entries(given)) {
180
+ if (!/^[a-z0-9-]{1,32}$/.test(id) || Object.hasOwn(KINDS, id) || typeof one !== 'object' || one === null)
181
+ continue;
182
+ const kind = one;
183
+ const files = [kind.detect ?? []].flat().filter((file) => typeof file === 'string');
184
+ const label = typeof kind.label === 'string' && kind.label ? kind.label : id;
185
+ table.recipes[id] = {
186
+ label,
187
+ detect: repo => files.length > 0 && files.every(file => repo.has(file)),
188
+ port: () => Number(kind.port) || null,
189
+ start: () => (typeof kind.start === 'string' && kind.start ? kind.start : null),
190
+ };
191
+ table.kinds[id] = { label, runIn: RUN_IN, serves: kind.serves !== false, custom: true };
192
+ table.custom.push(id);
193
+ }
194
+ tables.set(given, table);
195
+ return table;
196
+ }
197
+ /** Every kind a stack can use, by id. */
198
+ export const kindsFor = (stack) => tableOf(stack).kinds;
199
+ export const recipeOf = (kind, stack) => {
200
+ const { recipes } = tableOf(stack);
201
+ return kind !== undefined && Object.hasOwn(recipes, kind) ? recipes[kind] : undefined;
202
+ };
203
+ const packageJson = (repo) => {
204
+ try {
205
+ return JSON.parse(read(repo, 'package.json') || 'null');
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ };
211
+ const isSam = (repo) => ['template.yaml', 'template.yml'].some(file => repo.has(file) && read(repo, file).includes('AWS::Serverless'));
212
+ /** Which kind a clone looks like, or null. A stack's own kinds are asked first, then the specific, then the general. */
213
+ export function detect(repo, stack) {
214
+ const { custom, recipes } = tableOf(stack);
215
+ for (const id of custom)
216
+ if (recipes[id]?.detect(repo))
217
+ return id;
218
+ if (repo.has('pubspec.yaml'))
219
+ return 'flutter';
220
+ if (BUILT_IN_RECIPES['reactnative']?.detect(repo))
221
+ return 'reactnative';
222
+ if (repo.find?.('.csproj'))
223
+ return 'dotnet';
224
+ const pkg = packageJson(repo);
225
+ // A SAM app, unless it has its own dev server (then it runs as the Node app it also is).
226
+ if (isSam(repo) && !pkg?.scripts?.['dev'] && !pkg?.scripts?.['start'])
227
+ return 'sam';
228
+ if (repo.has('package.json'))
229
+ return frameworkOf(pkg) ? 'web' : 'node';
230
+ return Object.keys(BUILT_IN_RECIPES).find(id => BUILT_IN_RECIPES[id]?.detect(repo)) ?? null;
231
+ }
232
+ /** The port a clone of this kind usually answers on, when its files say. */
233
+ export const defaultPort = (kind, repo, stack) => recipeOf(kind, stack)?.port?.(repo) ?? null;
234
+ /** What is known about an app's kind; a kind nobody defined still gets a label and the usual choices. */
235
+ export function of(app, stack) {
236
+ const kind = app?.kind;
237
+ const kinds = kindsFor(stack);
238
+ return ((kind !== undefined && Object.hasOwn(kinds, kind) && kinds[kind]) || {
239
+ label: kind ?? 'App',
240
+ runIn: RUN_IN,
241
+ serves: true,
242
+ });
243
+ }
244
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../src/core/kinds.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,kHAAkH;AAClH,8EAA8E;AAC9E,OAAO,EAAE,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAIhE,6EAA6E;AAC7E,MAAM,MAAM,GAAsB;IAChC,CAAC,KAAK,EAAE,SAAS,CAAC;IAClB,CAAC,KAAK,EAAE,UAAU,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,qDAAqD,EAAE,CAAC;AAC9F,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;AAkBpD,2BAA2B;AAC3B,MAAM,CAAC,MAAM,KAAK,GAAyB;IACzC,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,uCAAuC,EAAE,CAAC;KAC1E;IACD,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,KAAK;QACb,SAAS,EAAE;YACT,CAAC,KAAK,EAAE,eAAe,CAAC;YACxB,CAAC,SAAS,EAAE,kBAAkB,CAAC;YAC/B,CAAC,OAAO,EAAE,OAAO,CAAC;SACnB;QACD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,6CAA6C,EAAE,CAAC;KAC7E;IACD,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAClE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAChF,iGAAiG;IACjG,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC;KAC7D;IACD,iGAAiG;IACjG,GAAG,EAAE;QACH,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,4DAA4D,EAAE,CAAC;KACpG;IACD,8DAA8D;IAC9D,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;CACvD,CAAC;AAwBF,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrE,MAAM,MAAM,GAAG,CAAC,IAAc,EAAE,KAAe,EAAE,EAAE,CACjD,KAAK;KACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC7B,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,EAAE,CAAC;AACnB,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAwB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACjG,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC;AACvG,6FAA6F;AAC7F,SAAS,YAAY,CAAC,IAAc;IAClC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAC;IAClD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,aAAa,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,EAAE,CAClC,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC1G,MAAM,WAAW,GAAG,CAAC,IAAc,EAAE,EAAE,CACrC,CAAC,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5G,MAAM,gBAAgB,GAA2B;IAC/C,WAAW,EAAE;QACX,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,KAAK;QACb,SAAS,EAAE;YACT,CAAC,KAAK,EAAE,eAAe,CAAC;YACxB,CAAC,SAAS,EAAE,kBAAkB,CAAC;SAChC;QACD,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5E,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,EAAE,EAAE,CACpC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC3C,CAAC,CAAC,oBAAoB,QAAQ,EAAE;YAChC,CAAC,CAAC,wBAAwB,QAAQ,EAAE;KACzC;IACD,EAAE,EAAE;QACF,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClC,KAAK,EAAE,IAAI,CAAC,EAAE;YACZ,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,UAAU,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,CAAC;KACF;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW;KACzB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC/F,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,KAAK,EAAE,IAAI,CAAC,EAAE;YACZ,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;YACjH,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACjG,CAAC;KACF;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3G,IAAI,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACvE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;QACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;gBAAE,OAAO,GAAG,GAAG,6BAA6B,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACtF,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpF,MAAM,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC9D,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,MAAM,gBAAgB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACxF,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,CAAC;KACF;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KAC/G;IACD,GAAG,EAAE;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;QAChE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KACtG;IACD,iEAAiE;IACjE,OAAO,EAAE;QACP,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;QAC7G,KAAK,EAAE,GAAG,EAAE,CAAC,mBAAmB;QAChC,IAAI,EAAE,qBAAqB;KAC5B;CACF,CAAC;AACF,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACzD,KAAK,CAAC,EAAE,CAAC,GAAG;QACV,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,KAAK;QAC/B,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QACxD,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;KAC7C,CAAC;AAEJ,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAsB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AASpE,MAAM,QAAQ,GAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAChF,MAAM,MAAM,GAAG,IAAI,OAAO,EAAiB,CAAC;AAE5C,2EAA2E;AAC3E,SAAS,OAAO,CAAC,KAAgB;IAC/B,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAU,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC3F,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QACnH,MAAM,IAAI,GAAG,GAA+F,CAAC;QAC7G,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;YAClB,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI;YACrC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;SAChF,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACxF,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAkC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAEnG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAwB,EAAE,KAAiB,EAAsB,EAAE;IAC1F,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAc,EAAsB,EAAE;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAuB,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,IAAc,EAAE,EAAE,CAC/B,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAEjH,wHAAwH;AACxH,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,KAAiB;IACtD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,MAAM;QAAE,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;IAClE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,gBAAgB,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,yFAAyF;IACzF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9F,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,IAAc,EAAE,KAAiB,EAAiB,EAAE,CAC5F,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAE9C,yGAAyG;AACzG,MAAM,UAAU,EAAE,CAAC,GAAqD,EAAE,KAAiB;IACzF,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CACL,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI;QACnE,KAAK,EAAE,IAAI,IAAI,KAAK;QACpB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,IAAI;KACb,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,181 @@
1
+ import { frameworkOf } from "./frameworks.js";
2
+ import { recipeOf } from "./kinds.js";
3
+ const portOf = (url) => url && URL.canParse(url) ? Number(new URL(url).port) || undefined : undefined;
4
+ const quote = (word) => (/^[\w@%+=:,./-]+$/.test(word) ? word : `'${word.replace(/'/g, `'\\''`)}'`);
5
+ /**
6
+ * A .NET app's launch profile for an environment: one named after it (PROD for prod) before the stack's baseProfile,
7
+ * and its -LOCAL copy when there is one.
8
+ */
9
+ export function launchProfile(app, profiles, env) {
10
+ const all = profiles ?? {};
11
+ const own = env ? Object.keys(all).find(name => name.toLowerCase() === env.toLowerCase()) : undefined;
12
+ const base = own ?? app.baseProfile ?? '';
13
+ const local = `${base}-LOCAL`;
14
+ return { base, local, name: Object.hasOwn(all, local) ? local : base };
15
+ }
16
+ function startDotnet(app, ctx) {
17
+ if (!app.project || !app.launchSettings || !app.baseProfile)
18
+ return {
19
+ error: 'needs project, launchSettings and baseProfile; set each with koppler stack set apps.<app>.<field> <value>',
20
+ };
21
+ const profiles = ctx.profiles ?? {};
22
+ const { local, name } = launchProfile(app, profiles, ctx.env);
23
+ const profile = Object.hasOwn(profiles, name) ? profiles[name] : undefined;
24
+ if (!profile)
25
+ return { error: `launch profile ${name} not found in ${app.launchSettings}` };
26
+ const vars = profile.environmentVariables ?? {};
27
+ const sets = (setting) => !!setting && Object.hasOwn(vars, setting);
28
+ // A launch profile's own value wins over the environment, so it would silently hide a stored secret of the same name.
29
+ const hiddenSecrets = (app.secrets ?? []).map(secret => secret.env).filter(sets);
30
+ if (hiddenSecrets.length > 0 && name === local) {
31
+ const names = hiddenSecrets.join(', ');
32
+ return {
33
+ error: `launch profile ${local} sets ${names}, which hides the stored secret of that name; remove it from ${local}`,
34
+ };
35
+ }
36
+ // A setting given for this start is hidden the same way.
37
+ const hidden = [...hiddenSecrets, ...(ctx.override ?? []).filter(sets)];
38
+ if (ctx.lan && !ctx.httpPort)
39
+ return { error: 'no http address in its launch profile to open to the network' };
40
+ const lan = ctx.lan ? ['--urls', `http://0.0.0.0:${String(ctx.httpPort)}`] : [];
41
+ const port = ctx.lan ? ctx.httpPort : portOf(app.url);
42
+ const run = ['dotnet', 'run', '--project', app.project];
43
+ // The repo's AWS_PROFILE names a profile on someone else's machine: the environment's own sign-in replaces it.
44
+ // A -LOCAL profile is the user's own, and kept as it is.
45
+ const sso = (app.prereqs ?? []).find(prereq => prereq.sso)?.sso;
46
+ const otherSignIn = !!sso && name !== local && sets('AWS_PROFILE') && vars['AWS_PROFILE'] !== sso;
47
+ if (hidden.length === 0 && !otherSignIn)
48
+ return { cwd: ctx.repo, port, secrets: true, command: [...run, '--launch-profile', name, ...lan] };
49
+ // Otherwise the profile's settings are passed, minus the hidden ones, so the repo stays untouched.
50
+ const settings = {
51
+ ...vars,
52
+ ...(sso && { AWS_PROFILE: sso }),
53
+ ...(profile.applicationUrl && { ASPNETCORE_URLS: profile.applicationUrl }),
54
+ };
55
+ const passed = Object.entries(settings)
56
+ .filter(([setting]) => !hidden.includes(setting))
57
+ .map(([setting, value]) => `${setting}=${value}`);
58
+ return { cwd: ctx.repo, port, secrets: true, command: ['env', ...passed, ...run, '--no-launch-profile', ...lan] };
59
+ }
60
+ function startFlutter(app, ctx) {
61
+ const { device, env = '' } = ctx;
62
+ if (!device)
63
+ return { error: 'needs a device: --device ios, --device android or a device id (fvm flutter devices)' };
64
+ const flutter = app.flutter?.fvm ? ['fvm', 'flutter'] : ['flutter'];
65
+ const defines = app.flutter?.defineFile?.replace('{env}', env);
66
+ const run = [
67
+ ...flutter,
68
+ 'run',
69
+ ...(ctx.flutterPid ? ['--pid-file', ctx.flutterPid] : []),
70
+ ...(app.flutter?.flavor ? ['--flavor', env] : []),
71
+ ...(defines ? [`--dart-define-from-file=${defines}`] : []),
72
+ '-d',
73
+ device.id,
74
+ ];
75
+ // `flutter run` stays, its output the app's log, for hot reload: its input is held open, or it would end at once.
76
+ const script = `tail -f /dev/null | ${run.map(quote).join(' ')}`;
77
+ const { iosBundleId, androidPackage } = app.mobile ?? {};
78
+ // The app outlives the process that started it: stopping closes it on the device.
79
+ const onStop = device.platform === 'ios' && iosBundleId
80
+ ? [['xcrun', 'simctl', 'terminate', device.id, iosBundleId]]
81
+ : device.platform === 'android' && androidPackage
82
+ ? [['adb', '-s', device.id, 'shell', 'am', 'force-stop', androidPackage]]
83
+ : [];
84
+ return { cwd: ctx.repo, command: ['sh', '-c', script], onStop };
85
+ }
86
+ function startNode(app, ctx) {
87
+ const scripts = ctx.scripts ?? {};
88
+ const script = app.script ?? ['dev', 'start'].find(name => Object.hasOwn(scripts, name));
89
+ if (!script || !Object.hasOwn(scripts, script))
90
+ return {
91
+ error: `no ${app.script ?? 'dev or start'} script in package.json; set it with koppler stack set apps.<app>.script <name>`,
92
+ };
93
+ const framework = app.kind === 'web' ? frameworkOf(ctx.pkg) : null;
94
+ const port = portOf(app.url) ?? framework?.port;
95
+ const run = ['npm', 'run', script];
96
+ if (!ctx.lan)
97
+ return { cwd: ctx.repo, port, command: run };
98
+ // Opened to the network: the framework's own host flag, else HOST=0.0.0.0, which most Node servers read.
99
+ if (framework?.lanArgs)
100
+ return { cwd: ctx.repo, port, command: [...run, '--', ...framework.lanArgs] };
101
+ const note = framework ? undefined : 'HOST=0.0.0.0 is set; check the app reads it';
102
+ return { cwd: ctx.repo, port, command: ['env', framework?.lanEnv ?? 'HOST=0.0.0.0', ...run], note };
103
+ }
104
+ function startLambda(app, ctx) {
105
+ const port = portOf(app.url);
106
+ if (!app.lambda?.handler || !app.lambda.runtime || !port)
107
+ return { error: 'needs url and lambda { handler, runtime } in stack.json' };
108
+ const engine = ctx.engine ?? '';
109
+ const overrides = ctx.lambdaOverrides ?? `${engine}/temp/lambda-${ctx.id ?? ''}.json`;
110
+ return {
111
+ cwd: ctx.repo,
112
+ port,
113
+ command: ['node', `${engine}/lambda-local.mjs`, JSON.stringify(app.lambda), String(port), overrides],
114
+ onStop: [['docker', 'rm', '-f', `koppler-lambda-${String(port)}`]],
115
+ };
116
+ }
117
+ function startSam(app, ctx) {
118
+ const port = portOf(app.url) ?? 3000;
119
+ const named = ctx.env ? app.sam?.envs?.[ctx.env] : undefined;
120
+ const config = {
121
+ ...(app.sam?.template && { template: app.sam.template }),
122
+ envs: named ? [named].flat() : (ctx.envNames ?? [ctx.env]),
123
+ };
124
+ const runner = `${ctx.engine ?? ''}/sam-local.mjs`;
125
+ return { cwd: ctx.repo, port, command: ['node', runner, String(port), JSON.stringify(config)] };
126
+ }
127
+ function startOther(app, ctx) {
128
+ if (!app.start)
129
+ return {
130
+ error: 'needs "start", the shell command that starts it, run in its repo: koppler stack set apps.<app>.start "<command>"',
131
+ };
132
+ return { cwd: ctx.repo, port: portOf(app.url), command: ['sh', '-c', app.start] };
133
+ }
134
+ /** A card set to Mock: the stack's canned responses, answered on the app's own local address. */
135
+ export function mockCommand(app, engine = '') {
136
+ if (!app.mock?.length)
137
+ return { error: 'has no mock responses yet: add them in its settings, under Mock responses' };
138
+ const port = portOf(app.url);
139
+ if (!app.url || !port)
140
+ return { error: 'needs url, its local address, for the mock to answer on' };
141
+ if (new URL(app.url).protocol !== 'http:')
142
+ return { error: `the mock answers over http only, and its url is ${app.url}` };
143
+ return {
144
+ cwd: undefined,
145
+ port,
146
+ command: ['node', `${engine}/mock-server.mjs`, String(port), JSON.stringify(app.mock)],
147
+ };
148
+ }
149
+ const NO_FILES = { has: () => false, read: () => null, list: () => [] };
150
+ function startFromRecipe(app, ctx) {
151
+ const recipe = recipeOf(app.kind, ctx.stack);
152
+ if (!recipe)
153
+ return { error: `kind ${app.kind ?? ''} cannot start by id yet` };
154
+ const files = ctx.files ?? NO_FILES;
155
+ const port = portOf(app.url) ?? recipe.port?.(files) ?? undefined;
156
+ // The stack's own `start` wins; else the recipe works one out from what is in the repo.
157
+ const command = app.start ?? recipe.start(files, { port, platform: ctx.platform });
158
+ if (!command) {
159
+ const what = `cannot tell how this ${recipe.label} app starts`;
160
+ return {
161
+ error: `${what}; set it with koppler stack set apps.<app>.start "<command>": the shell command, run in its repo`,
162
+ };
163
+ }
164
+ const stop = recipe.stop && [['sh', '-c', `cd ${quote(ctx.repo ?? '.')} && ${recipe.stop}`]];
165
+ return { cwd: ctx.repo, port, command: ['sh', '-c', command], ...(stop && { onStop: stop }) };
166
+ }
167
+ const BY_KIND = {
168
+ dotnet: startDotnet,
169
+ flutter: startFlutter,
170
+ node: startNode,
171
+ web: startNode,
172
+ lambda: startLambda,
173
+ sam: startSam,
174
+ other: startOther,
175
+ };
176
+ /** The command that starts the app, with its folder, port and what to do on stop; or the reason it cannot start. */
177
+ export function startCommand(app, ctx = {}) {
178
+ const start = app.kind !== undefined && Object.hasOwn(BY_KIND, app.kind) ? BY_KIND[app.kind] : undefined;
179
+ return (start ?? startFromRecipe)(app, ctx);
180
+ }
181
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/core/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ // Turns raw log lines into readable rows: time, level and message. Understands the JSON logs .NET apps write (Serilog
2
+ // compact and Microsoft's JSON console), cloudflared's "TIME LVL msg", Flutter's "flutter:" lines and build output.
3
+ const LEVELS = {
4
+ verbose: 'debug',
5
+ trace: 'debug',
6
+ debug: 'debug',
7
+ dbg: 'debug',
8
+ information: 'info',
9
+ info: 'info',
10
+ inf: 'info',
11
+ warning: 'warn',
12
+ warn: 'warn',
13
+ wrn: 'warn',
14
+ error: 'error',
15
+ err: 'error',
16
+ fatal: 'error',
17
+ critical: 'error',
18
+ crit: 'error',
19
+ };
20
+ const text = (value) => value == null ? '' : typeof value === 'string' ? value : JSON.stringify(value);
21
+ const level = (value) => LEVELS[text(value).toLowerCase()] ?? 'info';
22
+ function time(value) {
23
+ const clock = /T?(\d{2}:\d{2}:\d{2})/.exec(text(value))?.[1];
24
+ if (!clock)
25
+ return '';
26
+ const date = new Date(text(value));
27
+ return Number.isNaN(date.getTime()) ? clock : date.toTimeString().slice(0, 8);
28
+ }
29
+ // "{Name}", "{Name:l}" or "{@Name}" filled from the event's properties.
30
+ const fill = (template, props) => text(template).replace(/\{[@$]?([\w.]+)(?:[,:][^}]*)?\}/g, (all, name) => name in props ? text(props[name]) : all);
31
+ /** A line that is one JSON object, as the structured loggers write it; null for anything else. */
32
+ function parseJsonLine(line) {
33
+ if (!line.startsWith('{') || !line.endsWith('}'))
34
+ return null;
35
+ let event;
36
+ try {
37
+ event = JSON.parse(line);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ if (typeof event !== 'object' || event === null)
43
+ return null;
44
+ const o = event;
45
+ if ('@t' in o || '@m' in o || '@mt' in o)
46
+ return {
47
+ time: time(o['@t']),
48
+ level: level(o['@l'] ?? 'Information'),
49
+ text: text(o['@m'] ?? fill(o['@mt'], o)),
50
+ detail: text(o['@x']),
51
+ };
52
+ if ('Timestamp' in o || 'MessageTemplate' in o || 'RenderedMessage' in o) {
53
+ const props = (o['Properties'] ?? {});
54
+ return {
55
+ time: time(o['Timestamp']),
56
+ level: level(o['Level']),
57
+ text: text(o['RenderedMessage'] ?? fill(o['MessageTemplate'], props)),
58
+ detail: text(o['Exception']),
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+ const TERMINAL_COLOURS = /\\?\^?\[\[?\d+m|\x1b\[[0-9;]*m/g;
64
+ // Each known shape of a text line, tried in order: the pattern, and the row its match makes.
65
+ const SHAPES = [
66
+ [
67
+ /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?)\s+(INF|ERR|WRN|DBG)\s+(.*)$/,
68
+ m => ({ time: time(m[1]), level: level(m[2]), text: m[3] ?? '', detail: '' }),
69
+ ],
70
+ [
71
+ /^\[(\d{2}:\d{2}:\d{2})\s+(\w+)\]\s*(.*)$/,
72
+ m => ({ time: m[1] ?? '', level: level(m[2]), text: m[3] ?? '', detail: '' }),
73
+ ],
74
+ // The line Koppler writes when it starts an app: the command.
75
+ [
76
+ /^\d{4}-\d{2}-\d{2} (\d{2}:\d{2}:\d{2}) \$ (.*)$/,
77
+ m => ({ time: m[1] ?? '', level: 'start', text: m[2] ?? '', detail: '' }),
78
+ ],
79
+ [
80
+ /^flutter: (.*)$/s,
81
+ m => ({
82
+ time: '',
83
+ level: /(^|\s)(Exception|Error)\b|\[31m/.test(m[1] ?? '') ? 'error' : 'info',
84
+ text: (m[1] ?? '').replace(TERMINAL_COLOURS, ''),
85
+ detail: '',
86
+ }),
87
+ ],
88
+ [
89
+ /^(.*?\.cs)\((\d+),\d+\): (warning|error) (\w+): (.*?)(?: \[[^\]]+\])?$/,
90
+ m => ({
91
+ time: '',
92
+ level: m[3] === 'error' ? 'error' : 'warn',
93
+ build: true,
94
+ text: `${m[4] ?? ''} ${(m[1] ?? '').split('/').slice(-2).join('/')}:${m[2] ?? ''} ${m[5] ?? ''}`,
95
+ detail: '',
96
+ }),
97
+ ],
98
+ [/^koppler: (.*)$/s, m => ({ time: '', level: 'koppler', text: m[1] ?? '', detail: '' })],
99
+ ];
100
+ export function parseLine(line) {
101
+ const trimmed = line.trim();
102
+ const fromJson = parseJsonLine(trimmed);
103
+ if (fromJson)
104
+ return fromJson;
105
+ for (const [pattern, row] of SHAPES) {
106
+ const match = pattern.exec(trimmed);
107
+ if (match)
108
+ return row(match);
109
+ }
110
+ const guessed = /\b(error|exception|fail(ed|ure)?|unhandled)\b/i.test(trimmed)
111
+ ? 'error'
112
+ : /\bwarn(ing)?\b/i.test(trimmed)
113
+ ? 'warn'
114
+ : 'info';
115
+ return { time: '', level: guessed, text: trimmed, detail: '' };
116
+ }
117
+ const FLUTTER_TRACE = /^flutter: (#\d+\s|<asynchronous suspension>|\s*-- \S)/;
118
+ // Stack trace lines (" at ...") and other indented lines belong to the row above.
119
+ const continues = (line, last) => (FLUTTER_TRACE.test(line) && last.level === 'error') || /^\s+(at |---|\.\.\.)/.test(line) || /^\s{2,}\S/.test(line);
120
+ export function parseLog(log) {
121
+ const rows = [];
122
+ for (const line of (log ?? '').split('\n')) {
123
+ if (!line.trim())
124
+ continue;
125
+ const last = rows.at(-1);
126
+ if (last && continues(line, last)) {
127
+ last.detail += (last.detail ? '\n' : '') + line.replace(/^flutter: /, '').trim();
128
+ continue;
129
+ }
130
+ const row = parseLine(line);
131
+ // A run of compiler warnings is one row that says how many; the list stays one click away.
132
+ if (row.build && row.level === 'warn' && last?.group === 'build' && last.items) {
133
+ last.items.push(row.text);
134
+ last.text = `${String(last.items.length)} build warnings`;
135
+ }
136
+ else if (row.build && row.level === 'warn') {
137
+ rows.push({ time: '', level: 'warn', group: 'build', items: [row.text], text: '1 build warning', detail: '' });
138
+ }
139
+ else
140
+ rows.push(row);
141
+ }
142
+ return rows;
143
+ }
144
+ //# sourceMappingURL=logfmt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logfmt.js","sourceRoot":"","sources":["../../src/core/logfmt.ts"],"names":[],"mappings":"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"}