redkite 0.1.6

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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +819 -0
  3. package/bin/redkite.mjs +12 -0
  4. package/dist/build.d.ts +27 -0
  5. package/dist/build.d.ts.map +1 -0
  6. package/dist/build.js +132 -0
  7. package/dist/build.js.map +1 -0
  8. package/dist/checks.d.ts +4 -0
  9. package/dist/checks.d.ts.map +1 -0
  10. package/dist/checks.js +49 -0
  11. package/dist/checks.js.map +1 -0
  12. package/dist/cli/agent.d.ts +2 -0
  13. package/dist/cli/agent.d.ts.map +1 -0
  14. package/dist/cli/agent.js +24 -0
  15. package/dist/cli/agent.js.map +1 -0
  16. package/dist/cli/config.d.ts +5 -0
  17. package/dist/cli/config.d.ts.map +1 -0
  18. package/dist/cli/config.js +217 -0
  19. package/dist/cli/config.js.map +1 -0
  20. package/dist/cli/index.d.ts +11 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +438 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/log.d.ts +9 -0
  25. package/dist/cli/log.d.ts.map +1 -0
  26. package/dist/cli/log.js +128 -0
  27. package/dist/cli/log.js.map +1 -0
  28. package/dist/cli/screen.d.ts +34 -0
  29. package/dist/cli/screen.d.ts.map +1 -0
  30. package/dist/cli/screen.js +298 -0
  31. package/dist/cli/screen.js.map +1 -0
  32. package/dist/cli/viewer.d.ts +9 -0
  33. package/dist/cli/viewer.d.ts.map +1 -0
  34. package/dist/cli/viewer.js +139 -0
  35. package/dist/cli/viewer.js.map +1 -0
  36. package/dist/config.d.ts +7 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +79 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/deploy.d.ts +19 -0
  41. package/dist/deploy.d.ts.map +1 -0
  42. package/dist/deploy.js +275 -0
  43. package/dist/deploy.js.map +1 -0
  44. package/dist/docker.d.ts +96 -0
  45. package/dist/docker.d.ts.map +1 -0
  46. package/dist/docker.js +325 -0
  47. package/dist/docker.js.map +1 -0
  48. package/dist/dockerfile.d.ts +14 -0
  49. package/dist/dockerfile.d.ts.map +1 -0
  50. package/dist/dockerfile.js +160 -0
  51. package/dist/dockerfile.js.map +1 -0
  52. package/dist/health.d.ts +13 -0
  53. package/dist/health.d.ts.map +1 -0
  54. package/dist/health.js +54 -0
  55. package/dist/health.js.map +1 -0
  56. package/dist/host.d.ts +21 -0
  57. package/dist/host.d.ts.map +1 -0
  58. package/dist/host.js +27 -0
  59. package/dist/host.js.map +1 -0
  60. package/dist/index.d.ts +26 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +26 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/layout.d.ts +5 -0
  65. package/dist/layout.d.ts.map +1 -0
  66. package/dist/layout.js +45 -0
  67. package/dist/layout.js.map +1 -0
  68. package/dist/localHost.d.ts +7 -0
  69. package/dist/localHost.d.ts.map +1 -0
  70. package/dist/localHost.js +32 -0
  71. package/dist/localHost.js.map +1 -0
  72. package/dist/log.d.ts +14 -0
  73. package/dist/log.d.ts.map +1 -0
  74. package/dist/log.js +15 -0
  75. package/dist/log.js.map +1 -0
  76. package/dist/nginx.d.ts +4 -0
  77. package/dist/nginx.d.ts.map +1 -0
  78. package/dist/nginx.js +53 -0
  79. package/dist/nginx.js.map +1 -0
  80. package/dist/pipeline.d.ts +103 -0
  81. package/dist/pipeline.d.ts.map +1 -0
  82. package/dist/pipeline.js +142 -0
  83. package/dist/pipeline.js.map +1 -0
  84. package/dist/presets/index.d.ts +3 -0
  85. package/dist/presets/index.d.ts.map +1 -0
  86. package/dist/presets/index.js +3 -0
  87. package/dist/presets/index.js.map +1 -0
  88. package/dist/presets/nextApp.d.ts +15 -0
  89. package/dist/presets/nextApp.d.ts.map +1 -0
  90. package/dist/presets/nextApp.js +53 -0
  91. package/dist/presets/nextApp.js.map +1 -0
  92. package/dist/presets/nodeApp.d.ts +19 -0
  93. package/dist/presets/nodeApp.d.ts.map +1 -0
  94. package/dist/presets/nodeApp.js +29 -0
  95. package/dist/presets/nodeApp.js.map +1 -0
  96. package/dist/secrets/bitwarden.d.ts +3 -0
  97. package/dist/secrets/bitwarden.d.ts.map +1 -0
  98. package/dist/secrets/bitwarden.js +6 -0
  99. package/dist/secrets/bitwarden.js.map +1 -0
  100. package/dist/secrets/refs.d.ts +9 -0
  101. package/dist/secrets/refs.d.ts.map +1 -0
  102. package/dist/secrets/refs.js +20 -0
  103. package/dist/secrets/refs.js.map +1 -0
  104. package/dist/secrets/store.d.ts +9 -0
  105. package/dist/secrets/store.d.ts.map +1 -0
  106. package/dist/secrets/store.js +104 -0
  107. package/dist/secrets/store.js.map +1 -0
  108. package/dist/services/ensure.d.ts +18 -0
  109. package/dist/services/ensure.d.ts.map +1 -0
  110. package/dist/services/ensure.js +93 -0
  111. package/dist/services/ensure.js.map +1 -0
  112. package/dist/services/index.d.ts +19 -0
  113. package/dist/services/index.d.ts.map +1 -0
  114. package/dist/services/index.js +27 -0
  115. package/dist/services/index.js.map +1 -0
  116. package/dist/services/planned.d.ts +20 -0
  117. package/dist/services/planned.d.ts.map +1 -0
  118. package/dist/services/planned.js +77 -0
  119. package/dist/services/planned.js.map +1 -0
  120. package/dist/shell.d.ts +11 -0
  121. package/dist/shell.d.ts.map +1 -0
  122. package/dist/shell.js +65 -0
  123. package/dist/shell.js.map +1 -0
  124. package/dist/source.d.ts +16 -0
  125. package/dist/source.d.ts.map +1 -0
  126. package/dist/source.js +108 -0
  127. package/dist/source.js.map +1 -0
  128. package/dist/sshHost.d.ts +15 -0
  129. package/dist/sshHost.d.ts.map +1 -0
  130. package/dist/sshHost.js +91 -0
  131. package/dist/sshHost.js.map +1 -0
  132. package/dist/steps.d.ts +27 -0
  133. package/dist/steps.d.ts.map +1 -0
  134. package/dist/steps.js +69 -0
  135. package/dist/steps.js.map +1 -0
  136. package/dist/topology.d.ts +40 -0
  137. package/dist/topology.d.ts.map +1 -0
  138. package/dist/topology.js +113 -0
  139. package/dist/topology.js.map +1 -0
  140. package/dist/types.d.ts +100 -0
  141. package/dist/types.d.ts.map +1 -0
  142. package/dist/types.js +2 -0
  143. package/dist/types.js.map +1 -0
  144. package/package.json +64 -0
  145. package/src/build.ts +236 -0
  146. package/src/checks.ts +65 -0
  147. package/src/cli/agent.ts +28 -0
  148. package/src/cli/config.ts +275 -0
  149. package/src/cli/index.ts +559 -0
  150. package/src/cli/log.ts +168 -0
  151. package/src/cli/screen.ts +409 -0
  152. package/src/cli/viewer.ts +192 -0
  153. package/src/config.ts +90 -0
  154. package/src/deploy.ts +409 -0
  155. package/src/docker.ts +433 -0
  156. package/src/dockerfile.ts +228 -0
  157. package/src/health.ts +83 -0
  158. package/src/host.ts +54 -0
  159. package/src/index.ts +25 -0
  160. package/src/layout.ts +41 -0
  161. package/src/localHost.ts +50 -0
  162. package/src/log.ts +38 -0
  163. package/src/nginx.ts +63 -0
  164. package/src/pipeline.ts +335 -0
  165. package/src/presets/index.ts +2 -0
  166. package/src/presets/nextApp.ts +70 -0
  167. package/src/presets/nodeApp.ts +46 -0
  168. package/src/secrets/bitwarden.ts +7 -0
  169. package/src/secrets/refs.ts +32 -0
  170. package/src/secrets/store.ts +147 -0
  171. package/src/services/ensure.ts +160 -0
  172. package/src/services/index.ts +48 -0
  173. package/src/services/planned.ts +119 -0
  174. package/src/shell.ts +95 -0
  175. package/src/source.ts +171 -0
  176. package/src/sshHost.ts +145 -0
  177. package/src/steps.ts +101 -0
  178. package/src/topology.ts +199 -0
  179. package/src/types.ts +243 -0
package/dist/deploy.js ADDED
@@ -0,0 +1,275 @@
1
+ import { build } from "./build.js";
2
+ import { assertCheckable, runChecks } from "./checks.js";
3
+ import { environmentOf } from "./config.js";
4
+ import { Docker } from "./docker.js";
5
+ import { healthcheck } from "./health.js";
6
+ import { localHost } from "./localHost.js";
7
+ import { silent } from "./log.js";
8
+ import { defineStep, merge, runPipeline, } from "./pipeline.js";
9
+ import { readEnv, readRef } from "./secrets/refs.js";
10
+ import { ensureService } from "./services/ensure.js";
11
+ import { plannedServices } from "./services/planned.js";
12
+ import { topologyFor } from "./topology.js";
13
+ export async function deploy(options) {
14
+ return await start("deploy", options);
15
+ }
16
+ // The same host, the same services and the same images, stopping where a deploy
17
+ // would start moving addresses. What runs instead is what each app declares
18
+ export async function verify(options) {
19
+ return await start("verify", options);
20
+ }
21
+ async function start(run, options) {
22
+ const log = options.log ?? silent;
23
+ const setting = {
24
+ config: options.config,
25
+ environment: options.environment,
26
+ topology: topologyFor(options.config, options.environment),
27
+ host: options.host,
28
+ docker: new Docker(options.host),
29
+ secrets: options.secrets,
30
+ log,
31
+ run,
32
+ };
33
+ const steps = merge(supplied(options), options.config.steps ?? []);
34
+ return await runPipeline(run, steps, setting, options.signal);
35
+ }
36
+ // Every step redkite supplies, in the order the phases name. A run walks the
37
+ // phases it has, so the ones it does not are never ordered in
38
+ function supplied(options) {
39
+ return [
40
+ defineStep("setup", prepare),
41
+ defineStep("build", (input, context) => compile(input, context, options.verbose ?? false, options.signal)),
42
+ defineStep("verify", runChecks, assertCheckable),
43
+ defineStep("swap", (input, context) => release(input, context, options.health ?? { sleep: wait }), assertPublishable),
44
+ defineStep("cleanup", finish),
45
+ ];
46
+ }
47
+ const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
48
+ // A deploy publishes the proxy on a port, and an environment written for verify
49
+ // alone has no reason to name one. Checked before the run so the mistake lands
50
+ // before a build rather than on a proxy nobody outside can reach
51
+ function assertPublishable(plan) {
52
+ if (environmentOf(plan.config, plan.environment)?.publicPort)
53
+ return;
54
+ throw new Error(`${plan.environment} names no publicPort, so a deploy has nothing to publish ` +
55
+ "the proxy on. Only a verify run goes without one");
56
+ }
57
+ // The network and the services, which outlive a run and are only built when
58
+ // they are missing. This used to overlap the builds, and now costs the round
59
+ // trips it takes rather than nothing, which is what buys a setup step a host
60
+ // it can rely on
61
+ async function prepare(input, context) {
62
+ const { docker, topology } = context;
63
+ await docker.network.create(topology.network, topology.cidr);
64
+ const services = await ensureServices(context);
65
+ return { ...input, network: topology.network, services };
66
+ }
67
+ // Every image is built before anything is disturbed. A build failure has to
68
+ // leave the running deployment exactly as it was, which is why this is a step
69
+ // of its own rather than the first half of the swap
70
+ async function compile(input, context, verbose, signal) {
71
+ // One checkout directory for every app, opened here so the build step owns
72
+ // its lifetime rather than the process
73
+ const here = buildsHere(context) ? await localHost({ signal }) : undefined;
74
+ try {
75
+ return { ...input, apps: (await buildAll(context, verbose, here)).map(describe) };
76
+ }
77
+ finally {
78
+ await here?.close?.();
79
+ }
80
+ }
81
+ // Building here and deploying here are the same daemon, so shipping would be a
82
+ // save and a load of an image that never moved. An app built from a path on
83
+ // this machine has no say in it: the source is here, so the build is too
84
+ function buildsHere(context) {
85
+ const environment = environmentOf(context.config, context.environment);
86
+ if (!environment?.host?.bastion)
87
+ return false;
88
+ return environment.buildOn === "local" || context.config.apps.some((app) => app.path);
89
+ }
90
+ async function release(input, context, health) {
91
+ const { docker, task, topology } = context;
92
+ const apps = context.config.apps.map((app) => appOf(topology, app.name));
93
+ // Keyed by name rather than by index: appOf resolves the topology, and two
94
+ // lists walked in step is a bug waiting for someone to reorder one
95
+ const environments = new Map(context.config.apps.map((app) => [app.name, app.environment ?? {}]));
96
+ task.detail("retiring the running containers");
97
+ await Promise.all(apps.map((app) => retire(docker, topology, app)));
98
+ task.detail("creating the new ones");
99
+ await Promise.all(apps.map((app) => create(docker, topology, app, environments.get(app.name))));
100
+ task.detail("starting them");
101
+ await Promise.all(apps.map((app) => docker.container.start(app.container)));
102
+ // One unhealthy app reverts all of them. A half-swapped deployment is the
103
+ // one state nothing downstream knows how to reason about
104
+ if (!(await checkAll(context, health))) {
105
+ context.log.fail("Health checks failed, reverting");
106
+ await Promise.all(apps.map((app) => revert(docker, topology, app)));
107
+ return {
108
+ ...input,
109
+ ok: false,
110
+ released: [],
111
+ reverted: apps.map((app) => app.container),
112
+ checked: [],
113
+ };
114
+ }
115
+ return {
116
+ ...input,
117
+ ok: true,
118
+ released: apps.map((app) => app.container),
119
+ reverted: [],
120
+ checked: [],
121
+ };
122
+ }
123
+ // A build leaves its image on the host rather than sending one, so without this
124
+ // every run adds a runtime image and a builder to a disk nobody is watching
125
+ async function finish(input, context) {
126
+ // What would be removed is what is serving, and the images are what a retry
127
+ // would be built from
128
+ if (!input.ok)
129
+ return { ...input, removed: [], reclaimed: [] };
130
+ const { docker, topology } = context;
131
+ const apps = context.config.apps.map((app) => appOf(topology, app.name));
132
+ const removed = await Promise.all(apps.map((app) => cleanup(docker, app)));
133
+ const reclaimed = await Promise.all(input.apps.map((app) => reclaim(docker, app)));
134
+ return { ...input, removed: removed.flat(), reclaimed: reclaimed.flat() };
135
+ }
136
+ function describe({ app, result }) {
137
+ return {
138
+ name: app.name,
139
+ container: result.tag.split(":")[0] ?? app.name,
140
+ release: result.release,
141
+ fingerprint: result.fingerprint,
142
+ cached: result.cached,
143
+ builderTag: result.builderTag,
144
+ };
145
+ }
146
+ async function checkAll(context, health) {
147
+ const { docker, log, topology } = context;
148
+ const results = await Promise.all(context.config.apps.map(async (app) => {
149
+ const target = appOf(topology, app.name);
150
+ const deps = {
151
+ ...health,
152
+ probe: async (container, url) => {
153
+ const result = await docker.run(`exec ${container} curl -s ${url}`);
154
+ return { code: result.code, output: result.stdout };
155
+ },
156
+ log,
157
+ };
158
+ return await healthcheck(target.container, target.port, app.health, deps);
159
+ }));
160
+ return !results.includes(false);
161
+ }
162
+ // The proxy is one of these, derived rather than listed. What each should be
163
+ // is worked out in one place, so a plan reports drift against the same shape a
164
+ // deploy converges to
165
+ async function ensureServices(context) {
166
+ const planned = plannedServices(context.config, context.topology, context.run);
167
+ return await Promise.all(planned.map(async (item) => {
168
+ await ensureService(item.spec, item.service, {
169
+ ...context,
170
+ files: item.files,
171
+ publish: item.publish,
172
+ });
173
+ return item.service.container;
174
+ }));
175
+ }
176
+ async function buildAll(context, verbose, here) {
177
+ const { config, log, topology } = context;
178
+ const environment = environmentOf(config, context.environment);
179
+ if (!environment)
180
+ throw new Error(`Unknown environment ${context.environment}`);
181
+ return await Promise.all(config.apps.map(async (app) => {
182
+ const task = log.step(`Building ${app.name}`);
183
+ try {
184
+ const buildContext = {
185
+ host: here ?? context.host,
186
+ docker: here ? new Docker(here) : context.docker,
187
+ deliver: here && { host: context.host, docker: context.docker },
188
+ env: await readEnv(app.secrets, context.secrets),
189
+ files: await resolveFiles(app, context.secrets),
190
+ branch: environment.branch,
191
+ environment: context.environment,
192
+ detail: task.detail,
193
+ output: task.line,
194
+ };
195
+ const result = await build(app, appOf(topology, app.name), buildContext);
196
+ task.done(`${result.release.slice(0, 7)}${result.cached ? " (held)" : ""}`);
197
+ return { app, result };
198
+ }
199
+ catch (error) {
200
+ task.fail(`${app.name} failed to build`);
201
+ throw error;
202
+ }
203
+ }));
204
+ }
205
+ async function resolveFiles(app, stores) {
206
+ const entries = await Promise.all(Object.entries(app.files ?? {}).map(async ([path, ref]) => [path, await readRef(ref, stores)]));
207
+ return Object.fromEntries(entries);
208
+ }
209
+ // Move the running container out of the way without stopping it, so it keeps
210
+ // answering on the retired address while the new one starts
211
+ async function retire(docker, topology, app) {
212
+ await docker.container.stop(app.retired);
213
+ await docker.container.remove(app.retired);
214
+ await docker.network.reconnect(topology.network, app.container, app.retiredAddress);
215
+ await docker.container.rename(app.container, app.retired);
216
+ }
217
+ async function create(docker, topology, app, environment = {}) {
218
+ const builder = docker.container
219
+ .builder()
220
+ .name(app.container)
221
+ .image(app.container)
222
+ .network(topology.network)
223
+ .ip(app.currentAddress)
224
+ .restart("unless-stopped");
225
+ for (const [host, ip] of Object.entries(topology.extraHosts)) {
226
+ // An app resolving its own name to the live address would loop
227
+ if (host === app.container || host === app.retired)
228
+ continue;
229
+ builder.extraHost(host, ip);
230
+ }
231
+ for (const volume of app.volumes)
232
+ builder.volume(volume.volume, volume.mountPath);
233
+ for (const [name, value] of Object.entries(environment))
234
+ builder.env(name, value);
235
+ await builder.create();
236
+ }
237
+ // Put the retired container back on the live address and its original name
238
+ async function revert(docker, topology, app) {
239
+ await docker.container.stop(app.container);
240
+ await docker.container.rename(app.container, app.failed);
241
+ await docker.network.reconnect(topology.network, app.retired, app.currentAddress);
242
+ await docker.container.rename(app.retired, app.container);
243
+ await docker.container.start(app.container);
244
+ }
245
+ async function cleanup(docker, app) {
246
+ const removed = [];
247
+ for (const name of [app.retired, app.failed]) {
248
+ await docker.container.stop(name);
249
+ if (await docker.container.remove(name))
250
+ removed.push(name);
251
+ }
252
+ return removed;
253
+ }
254
+ // Every version of this app's images except the one that was just released,
255
+ // including the builder a step before the swap ran in
256
+ async function reclaim(docker, app) {
257
+ const version = `${app.release}-${app.fingerprint}`;
258
+ const reclaimed = [];
259
+ for (const repository of [app.container, `${app.container}-builder`]) {
260
+ for (const held of await docker.image.versionsOf(repository)) {
261
+ if (held === `${repository}:${version}`)
262
+ continue;
263
+ await docker.image.remove(held);
264
+ reclaimed.push(held);
265
+ }
266
+ }
267
+ return reclaimed;
268
+ }
269
+ function appOf(topology, name) {
270
+ const app = topology.apps.find((item) => item.name === name);
271
+ if (app)
272
+ return app;
273
+ throw new Error(`No topology for app ${name}`);
274
+ }
275
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAuC,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAC5C,OAAO,EACL,UAAU,EACV,KAAK,EACL,WAAW,GAWZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAqB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAmC,MAAM,eAAe,CAAC;AA8B7E,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,OAAO,MAAM,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,OAAO,MAAM,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,GAAQ,EAAE,OAAsB;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;IAElC,MAAM,OAAO,GAA0B;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC;QAC1D,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG;QACH,GAAG;KACJ,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,6EAA6E;AAC7E,8DAA8D;AAC9D,SAAS,QAAQ,CAAC,OAAsB;IACtC,OAAO;QACL,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;QAC5B,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CACrC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAClE;QACD,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC;QAChD,UAAU,CACR,MAAM,EACN,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC9E,iBAAiB,CAClB;QACD,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAErF,gFAAgF;AAChF,+EAA+E;AAC/E,iEAAiE;AACjE,SAAS,iBAAiB,CAAC,IAAU;IACnC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU;QAAE,OAAO;IAErE,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,WAAW,2DAA2D;QAC5E,kDAAkD,CACrD,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,iBAAiB;AACjB,KAAK,UAAU,OAAO,CAAC,KAAY,EAAE,OAAgB;IACnD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAErC,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC3D,CAAC;AAED,4EAA4E;AAC5E,8EAA8E;AAC9E,oDAAoD;AACpD,KAAK,UAAU,OAAO,CACpB,KAAe,EACf,OAAgB,EAChB,OAAgB,EAChB,MAAoB;IAEpB,2EAA2E;IAC3E,uCAAuC;IACvC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpF,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,yEAAyE;AACzE,SAAS,UAAU,CAAC,OAAgB;IAClC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IAE9C,OAAO,WAAW,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,KAAY,EACZ,OAAgB,EAChB,MAAiC;IAEjC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzE,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CACpE,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;IAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAErC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC1D,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAE5E,0EAA0E;IAC1E,yDAAyD;IACzD,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACpD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAEpE,OAAO;YACL,GAAG,KAAK;YACR,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;YAC1C,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;QAC1C,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;KACZ,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,4EAA4E;AAC5E,KAAK,UAAU,MAAM,CAAC,KAAe,EAAE,OAAgB;IACrD,4EAA4E;IAC5E,sBAAsB;IACtB,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE/D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnF,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAU;IACvC,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI;QAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,MAAiC;IACzE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAe;YACvB,GAAG,MAAM;YACT,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,SAAS,YAAY,GAAG,EAAE,CAAC,CAAC;gBACpE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACtD,CAAC;YACD,GAAG;SACJ,CAAC;QAEF,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,sBAAsB;AACtB,KAAK,UAAU,cAAc,CAAC,OAAgB;IAC5C,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE/E,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YAC3C,GAAG,OAAO;YACV,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAID,KAAK,UAAU,QAAQ,CACrB,OAAgB,EAChB,OAAgB,EAChB,IAAW;IAEX,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/D,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhF,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI;gBAC1B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;gBAChD,OAAO,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;gBAC/D,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;gBAChD,KAAK,EAAE,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC/C,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,IAAI;aAClB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;YACzE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE5E,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,kBAAkB,CAAC,CAAC;YACzC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,MAAoB;IAC5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CACjC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAU,CACnE,CACF,CAAC;IAEF,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,6EAA6E;AAC7E,4DAA4D;AAC5D,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,QAAkB,EAAE,GAAgB;IACxE,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACpF,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,MAAc,EACd,QAAkB,EAClB,GAAgB,EAChB,cAAsC,EAAE;IAExC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS;SAC7B,OAAO,EAAE;SACT,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;SACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;SACzB,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC;SACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,+DAA+D;QAC/D,IAAI,IAAI,KAAK,GAAG,CAAC,SAAS,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO;YAAE,SAAS;QAC7D,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAClF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAElF,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;AACzB,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,QAAkB,EAAE,GAAgB;IACxE,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAClF,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,GAAgB;IACrD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,sDAAsD;AACtD,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,GAAa;IAClD,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,SAAS,UAAU,CAAC,EAAE,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,IAAI,IAAI,KAAK,GAAG,UAAU,IAAI,OAAO,EAAE;gBAAE,SAAS;YAElD,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,QAAkB,EAAE,IAAY;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7D,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,96 @@
1
+ import type { Host, OnLine } from "./host.js";
2
+ export type BuildInvocation = {
3
+ context: string;
4
+ dockerfile: string;
5
+ tags: string[];
6
+ secrets?: Record<string, string>;
7
+ target?: string;
8
+ };
9
+ export declare const SPEC_LABEL = "redkite.spec";
10
+ type ContainerState = {
11
+ state: string;
12
+ spec?: string;
13
+ };
14
+ type HostState = {
15
+ containers: Map<string, ContainerState>;
16
+ images: Set<string>;
17
+ networks: Set<string>;
18
+ };
19
+ export declare class Docker {
20
+ private readonly host;
21
+ readonly network: DockerNetwork;
22
+ readonly image: DockerImage;
23
+ readonly container: DockerContainer;
24
+ private state?;
25
+ constructor(host: Host);
26
+ snapshot(): Promise<HostState>;
27
+ private read;
28
+ run(command: string, onLine?: OnLine): Promise<import("./host.js").Result>;
29
+ track(change: (state: HostState) => void): Promise<void>;
30
+ runOrThrow(command: string, message: string, onLine?: OnLine): Promise<import("./host.js").Result>;
31
+ }
32
+ declare class DockerNetwork {
33
+ private readonly docker;
34
+ constructor(docker: Docker);
35
+ exists(name: string): Promise<boolean>;
36
+ create(name: string, subnet?: string): Promise<boolean>;
37
+ remove(name: string): Promise<boolean>;
38
+ reconnect(network: string, container: string, ip: string): Promise<boolean>;
39
+ }
40
+ declare class DockerImage {
41
+ private readonly docker;
42
+ constructor(docker: Docker);
43
+ exists(name: string): Promise<boolean>;
44
+ versionsOf(repository: string): Promise<string[]>;
45
+ build(spec: BuildInvocation, onLine?: OnLine): Promise<boolean>;
46
+ retag(from: string, to: string): Promise<boolean>;
47
+ remove(name: string): Promise<boolean>;
48
+ }
49
+ declare class DockerContainer {
50
+ private readonly docker;
51
+ constructor(docker: Docker);
52
+ exists(name: string): Promise<boolean>;
53
+ status(name: string): Promise<string>;
54
+ specOf(name: string): Promise<string | undefined>;
55
+ isRunning(name: string): Promise<boolean>;
56
+ start(name: string): Promise<boolean>;
57
+ stop(name: string): Promise<boolean>;
58
+ rename(from: string, to: string): Promise<boolean>;
59
+ remove(name: string): Promise<boolean>;
60
+ create(builder: DockerBuilder): Promise<boolean>;
61
+ builder(): DockerBuilder;
62
+ }
63
+ export declare class DockerBuilder {
64
+ private readonly container;
65
+ private _name;
66
+ private _image;
67
+ private _hostname?;
68
+ private _ip?;
69
+ private _restart?;
70
+ private readonly _networks;
71
+ private readonly _volumes;
72
+ private readonly _hosts;
73
+ private readonly _ports;
74
+ private readonly _env;
75
+ private readonly _labels;
76
+ private _envFile?;
77
+ constructor(container: DockerContainer);
78
+ name(value: string): this;
79
+ image(value: string): this;
80
+ hostname(value: string): this;
81
+ network(value: string): this;
82
+ volume(from: string, to: string): this;
83
+ extraHost(name: string, ip: string): this;
84
+ restart(value: string): this;
85
+ ip(value: string): this;
86
+ env(name: string, value: string): this;
87
+ envFile(path: string): this;
88
+ label(name: string, value: string): this;
89
+ labelled(name: string): string | undefined;
90
+ port(from: number, to: number): this;
91
+ named(): string;
92
+ parse(): string;
93
+ create(): Promise<boolean>;
94
+ }
95
+ export {};
96
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}