@git.zone/tsdeploy 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,12 @@
1
1
  import * as plugins from './plugins.js';
2
2
  const schemaVersion = 1;
3
3
  const profileNameRegex = /^[a-zA-Z0-9._-]+$/;
4
+ const defaultPlatform = 'linux/amd64';
5
+ const defaultCloudlyRequestTimeoutMs = 30000;
6
+ const defaultCommandTimeoutMs = 30 * 60 * 1000;
7
+ const dockerCommandTimeoutMs = 60 * 60 * 1000;
8
+ const defaultMaxCommandOutputBytes = 1024 * 1024;
9
+ const defaultVerifyUrlTimeoutMs = 15000;
4
10
  const normalizeProfileName = (profileArg) => {
5
11
  const profile = profileArg.trim();
6
12
  if (!profile || !profileNameRegex.test(profile)) {
@@ -29,9 +35,15 @@ export const redactProfile = (profileArg) => {
29
35
  export class TsDeploy {
30
36
  projectDir;
31
37
  profileStore;
38
+ env;
39
+ commandRunner;
40
+ cloudlyRequest;
32
41
  constructor(optionsArg = {}) {
33
42
  this.projectDir = plugins.path.resolve(optionsArg.projectDir ?? process.cwd());
34
43
  this.profileStore = this.createProfileStore(optionsArg);
44
+ this.env = optionsArg.env ?? process.env;
45
+ this.commandRunner = optionsArg.commandRunner ?? this.defaultCommandRunner;
46
+ this.cloudlyRequest = optionsArg.cloudlyRequest ?? this.defaultCloudlyRequest;
35
47
  }
36
48
  get projectLinkPath() {
37
49
  return plugins.path.join(this.projectDir, '.nogit', 'tsdeploy.json');
@@ -145,7 +157,7 @@ export class TsDeploy {
145
157
  warnings.push(`Profile "${activeProfile}" is not configured. Run tsdeploy login --profile ${activeProfile}.`);
146
158
  }
147
159
  if (profile && !profile.token) {
148
- warnings.push(`Profile "${profile.name}" has no token. Remote deploy mutations remain unavailable.`);
160
+ warnings.push(`Profile "${profile.name}" has no token. Cloudly deploy requires a token or username/password at deploy time.`);
149
161
  }
150
162
  return {
151
163
  projectDir: this.projectDir,
@@ -159,11 +171,19 @@ export class TsDeploy {
159
171
  async buildPlan() {
160
172
  const status = await this.getStatus();
161
173
  const actions = [];
174
+ const canDeployCloudly = Boolean(status.projectLink?.serviceId && status.profile?.target === 'cloudly');
162
175
  if (status.projectLink && status.profile) {
163
176
  actions.push({
164
177
  type: 'inspect',
165
178
  title: 'Inspect linked deployment',
166
- description: 'Resolve the linked Cloudly/Onebox deployment and compare desired app metadata once typed deployment APIs are verified.',
179
+ description: 'Resolve the linked Cloudly service and registry target before deploying.',
180
+ });
181
+ actions.push({
182
+ type: canDeployCloudly ? 'deploy' : 'noop',
183
+ title: canDeployCloudly ? 'Deploy Cloudly workload image' : 'Deployment link incomplete or unsupported',
184
+ description: canDeployCloudly
185
+ ? 'Run project checks, build and push the linked OCI image, and let Cloudly deployOnPush reconcile the service.'
186
+ : 'Cloudly workload deploy requires a serviceId; Onebox deployment mutations are not implemented yet.',
167
187
  });
168
188
  }
169
189
  else {
@@ -173,16 +193,13 @@ export class TsDeploy {
173
193
  description: 'Create a profile and project link before a deployment plan can inspect remote state.',
174
194
  });
175
195
  }
176
- actions.push({
177
- type: 'noop',
178
- title: 'Deployment mutation disabled',
179
- description: 'tsdeploy MVP does not install, update, or upgrade apps until Cloudly/Onebox deployment contracts are verified upstream.',
180
- });
181
196
  return {
182
197
  schemaVersion,
183
198
  projectDir: this.projectDir,
184
- mutationAllowed: false,
185
- summary: 'Safe planning only: no remote deployment mutations will be executed.',
199
+ mutationAllowed: canDeployCloudly,
200
+ summary: canDeployCloudly
201
+ ? 'Cloudly workload deploy is available through registry push and deployOnPush reconciliation.'
202
+ : 'Safe planning only: no remote deployment mutations will be executed.',
186
203
  profile: status.activeProfile,
187
204
  deploymentId: status.projectLink?.deploymentId,
188
205
  serviceId: status.projectLink?.serviceId,
@@ -206,7 +223,9 @@ export class TsDeploy {
206
223
  {
207
224
  name: 'remote-mutations',
208
225
  ok: true,
209
- message: 'Remote deployment mutations are intentionally disabled in this MVP.',
226
+ message: status.profile?.target === 'cloudly'
227
+ ? 'Cloudly workload deployment is available with deploy-time Cloudly credentials.'
228
+ : 'Only Cloudly workload deployment is implemented currently.',
210
229
  },
211
230
  ];
212
231
  return {
@@ -215,5 +234,515 @@ export class TsDeploy {
215
234
  warnings: status.warnings,
216
235
  };
217
236
  }
237
+ async deploy(optionsArg = {}) {
238
+ const status = await this.getStatus();
239
+ const projectLink = status.projectLink;
240
+ const profile = await this.getProfile(projectLink?.profile ?? status.activeProfile);
241
+ const steps = [];
242
+ const warnings = [];
243
+ const tag = optionsArg.tag || 'latest';
244
+ const platform = optionsArg.platform || defaultPlatform;
245
+ const waitSeconds = optionsArg.waitSeconds ?? 0;
246
+ if (!projectLink) {
247
+ throw new Error('No .nogit/tsdeploy.json project link found. Run tsdeploy link first.');
248
+ }
249
+ if (!projectLink.serviceId) {
250
+ throw new Error('Project link has no serviceId. Run tsdeploy link --serviceId <id>.');
251
+ }
252
+ if (!profile) {
253
+ throw new Error(`Profile "${projectLink.profile}" is not configured. Run tsdeploy login --profile ${projectLink.profile}.`);
254
+ }
255
+ if (profile.target !== 'cloudly') {
256
+ throw new Error(`Deploy target "${profile.target}" is not implemented. Only Cloudly workload deployment is supported.`);
257
+ }
258
+ const deploySecretValues = this.collectSecretValues(undefined, [
259
+ profile.token,
260
+ optionsArg.token,
261
+ optionsArg.password,
262
+ this.env.TSDEPLOY_TOKEN,
263
+ this.env.TSDEPLOY_CLOUDLY_PASSWORD,
264
+ this.env.CLOUDLY_PASSWORD,
265
+ ]);
266
+ const localConfig = await this.readProjectSmartconfig();
267
+ const localImage = this.resolveLocalDockerImage(localConfig, tag);
268
+ let image = optionsArg.image || localImage;
269
+ if (optionsArg.dryRun) {
270
+ if (!image) {
271
+ image = '<resolved-from-cloudly-service-registry-target>';
272
+ warnings.push('Dry run did not contact Cloudly, so the final image URL was not resolved.');
273
+ }
274
+ steps.push({ name: 'cloudly-preflight', status: 'skipped', message: 'Dry run skipped Cloudly service validation.' });
275
+ steps.push({ name: 'checks', status: 'skipped', message: 'Dry run skipped project checks.' });
276
+ steps.push({ name: 'docker-buildx-push', status: 'skipped', message: `Dry run would push ${image}.` });
277
+ return {
278
+ schemaVersion,
279
+ projectDir: this.projectDir,
280
+ profile: profile.name,
281
+ serviceId: projectLink.serviceId,
282
+ deploymentId: projectLink.deploymentId,
283
+ dryRun: true,
284
+ image,
285
+ tag,
286
+ platform,
287
+ pushed: false,
288
+ triggered: false,
289
+ verified: false,
290
+ deployments: [],
291
+ steps,
292
+ warnings,
293
+ };
294
+ }
295
+ const identity = await this.resolveCloudlyIdentity(profile, optionsArg);
296
+ steps.push({ name: 'cloudly-auth', status: 'passed', message: 'Cloudly identity resolved.' });
297
+ const service = await this.fireCloudlyRequest(profile.origin, 'getServiceById', { identity, serviceId: projectLink.serviceId }).then(response => response.service);
298
+ if (service.data.deployOnPush === false) {
299
+ throw new Error(`Service "${service.data.name}" has deployOnPush disabled; refusing to push an image that Cloudly will not deploy.`);
300
+ }
301
+ const registryTarget = await this.fireCloudlyRequest(profile.origin, 'getServiceRegistryTarget', { identity, serviceId: projectLink.serviceId, tag }).then(response => response.registryTarget);
302
+ if (!registryTarget.imageUrl) {
303
+ throw new Error('Cloudly did not return a registry target image URL for the linked service.');
304
+ }
305
+ if (optionsArg.image && optionsArg.image !== registryTarget.imageUrl) {
306
+ throw new Error(`Requested image "${optionsArg.image}" does not match Cloudly registry target "${registryTarget.imageUrl}".`);
307
+ }
308
+ image = registryTarget.imageUrl;
309
+ if (localImage && localImage !== image) {
310
+ warnings.push(`Local .smartconfig Docker image "${localImage}" differs from Cloudly registry target "${image}". Using Cloudly target.`);
311
+ }
312
+ steps.push({ name: 'cloudly-preflight', status: 'passed', message: `Validated service "${service.data.name}" and registry target.` });
313
+ if (!optionsArg.skipPush) {
314
+ await this.ensureCleanGitWorktree(steps, Boolean(optionsArg.allowDirty));
315
+ }
316
+ if (optionsArg.skipChecks) {
317
+ steps.push({ name: 'checks', status: 'skipped', message: 'Project checks skipped by option.' });
318
+ }
319
+ else {
320
+ const checkCommand = await this.resolveProjectCheckCommand();
321
+ if (checkCommand) {
322
+ await this.runCheckedCommand({
323
+ command: checkCommand.command,
324
+ args: checkCommand.args,
325
+ cwd: this.projectDir,
326
+ env: this.env,
327
+ timeoutMs: defaultCommandTimeoutMs,
328
+ maxOutputBytes: defaultMaxCommandOutputBytes,
329
+ }, 'checks', steps, deploySecretValues);
330
+ }
331
+ else {
332
+ steps.push({ name: 'checks', status: 'skipped', message: 'No test or build script found in package.json.' });
333
+ }
334
+ }
335
+ let digest;
336
+ if (optionsArg.skipPush) {
337
+ steps.push({ name: 'docker-buildx-push', status: 'skipped', message: 'Docker push skipped by option.' });
338
+ }
339
+ else {
340
+ const buildEnv = await this.resolveDockerBuildEnv(localConfig);
341
+ const buildArgs = Object.keys(buildEnv.buildArgValues);
342
+ const dockerArgs = [
343
+ 'buildx',
344
+ 'build',
345
+ ...(optionsArg.builder ? ['--builder', optionsArg.builder] : []),
346
+ '--platform',
347
+ platform,
348
+ '--provenance=false',
349
+ '--sbom=false',
350
+ ...buildArgs.flatMap(buildArg => ['--build-arg', buildArg]),
351
+ '-t',
352
+ image,
353
+ '--push',
354
+ '.',
355
+ ];
356
+ const commandResult = await this.runCheckedCommand({
357
+ command: 'docker',
358
+ args: dockerArgs,
359
+ cwd: this.projectDir,
360
+ env: {
361
+ ...this.env,
362
+ ...buildEnv.buildArgValues,
363
+ },
364
+ timeoutMs: dockerCommandTimeoutMs,
365
+ maxOutputBytes: defaultMaxCommandOutputBytes,
366
+ }, 'docker-buildx-push', steps, [...deploySecretValues, ...buildEnv.secretValues]);
367
+ digest = this.extractDigest(`${commandResult.stdout}\n${commandResult.stderr}`);
368
+ }
369
+ let deployments = await this.getCloudlyDeployments(profile.origin, identity, projectLink.serviceId);
370
+ if (waitSeconds > 0) {
371
+ deployments = await this.waitForHealthyDeployment(profile.origin, identity, projectLink.serviceId, waitSeconds);
372
+ }
373
+ let verifyStatus;
374
+ if (optionsArg.verifyUrl) {
375
+ verifyStatus = await this.verifyUrl(optionsArg.verifyUrl);
376
+ steps.push({
377
+ name: 'verify-url',
378
+ status: verifyStatus >= 200 && verifyStatus < 400 ? 'passed' : 'failed',
379
+ message: `${optionsArg.verifyUrl} returned HTTP ${verifyStatus}.`,
380
+ });
381
+ if (verifyStatus < 200 || verifyStatus >= 400) {
382
+ throw new Error(`Verification URL returned HTTP ${verifyStatus}: ${optionsArg.verifyUrl}`);
383
+ }
384
+ }
385
+ return {
386
+ schemaVersion,
387
+ projectDir: this.projectDir,
388
+ profile: profile.name,
389
+ serviceId: projectLink.serviceId,
390
+ deploymentId: projectLink.deploymentId,
391
+ dryRun: false,
392
+ image,
393
+ tag,
394
+ platform,
395
+ pushed: !optionsArg.skipPush,
396
+ triggered: !optionsArg.skipPush,
397
+ verified: Boolean(optionsArg.verifyUrl && verifyStatus && verifyStatus >= 200 && verifyStatus < 400),
398
+ digest,
399
+ verifyStatus,
400
+ service: {
401
+ serviceId: service.id,
402
+ serviceName: service.data.name,
403
+ deployOnPush: true,
404
+ registryTarget: {
405
+ registryHost: registryTarget.registryHost,
406
+ repository: registryTarget.repository,
407
+ tag: registryTarget.tag,
408
+ imageUrl: registryTarget.imageUrl,
409
+ },
410
+ },
411
+ deployments,
412
+ steps,
413
+ warnings,
414
+ };
415
+ }
416
+ defaultCommandRunner = async (optionsArg) => {
417
+ return await new Promise((resolve, reject) => {
418
+ const timeoutMs = optionsArg.timeoutMs ?? defaultCommandTimeoutMs;
419
+ const maxOutputBytes = optionsArg.maxOutputBytes ?? defaultMaxCommandOutputBytes;
420
+ const child = plugins.childProcess.spawn(optionsArg.command, optionsArg.args, {
421
+ cwd: optionsArg.cwd,
422
+ env: {
423
+ ...process.env,
424
+ ...optionsArg.env,
425
+ },
426
+ detached: process.platform !== 'win32',
427
+ stdio: ['ignore', 'pipe', 'pipe'],
428
+ });
429
+ const stdoutChunks = [];
430
+ const stderrChunks = [];
431
+ let stdoutBytes = 0;
432
+ let stderrBytes = 0;
433
+ let stdoutTruncated = false;
434
+ let stderrTruncated = false;
435
+ let timedOut = false;
436
+ let timeoutRef;
437
+ let killTimeoutRef;
438
+ const appendOutput = (chunksArg, chunkArg, bytesArg) => {
439
+ const bytes = bytesArg + chunkArg.length;
440
+ const remainingBytes = maxOutputBytes - bytesArg;
441
+ if (remainingBytes > 0) {
442
+ chunksArg.push(chunkArg.subarray(0, remainingBytes));
443
+ }
444
+ return { bytes, truncated: bytes > maxOutputBytes };
445
+ };
446
+ child.stdout?.on('data', chunkArg => {
447
+ const result = appendOutput(stdoutChunks, Buffer.from(chunkArg), stdoutBytes);
448
+ stdoutBytes = result.bytes;
449
+ stdoutTruncated ||= result.truncated;
450
+ });
451
+ child.stderr?.on('data', chunkArg => {
452
+ const result = appendOutput(stderrChunks, Buffer.from(chunkArg), stderrBytes);
453
+ stderrBytes = result.bytes;
454
+ stderrTruncated ||= result.truncated;
455
+ });
456
+ const clearTimers = (clearKillTimerArg = true) => {
457
+ if (timeoutRef)
458
+ clearTimeout(timeoutRef);
459
+ if (clearKillTimerArg && killTimeoutRef)
460
+ clearTimeout(killTimeoutRef);
461
+ };
462
+ const killProcess = (signalArg) => {
463
+ if (process.platform !== 'win32' && child.pid) {
464
+ try {
465
+ process.kill(-child.pid, signalArg);
466
+ return;
467
+ }
468
+ catch {
469
+ // Fall back to direct child termination below.
470
+ }
471
+ }
472
+ child.kill(signalArg);
473
+ };
474
+ timeoutRef = setTimeout(() => {
475
+ timedOut = true;
476
+ killProcess('SIGTERM');
477
+ killTimeoutRef = setTimeout(() => {
478
+ killProcess('SIGKILL');
479
+ }, 10000);
480
+ killTimeoutRef.unref?.();
481
+ }, timeoutMs);
482
+ timeoutRef.unref?.();
483
+ child.on('error', errorArg => {
484
+ clearTimers(!timedOut);
485
+ reject(errorArg);
486
+ });
487
+ child.on('close', exitCode => {
488
+ clearTimers(!timedOut);
489
+ if (stdoutTruncated) {
490
+ stdoutChunks.push(Buffer.from('\n[tsdeploy: stdout truncated]\n'));
491
+ }
492
+ if (stderrTruncated) {
493
+ stderrChunks.push(Buffer.from('\n[tsdeploy: stderr truncated]\n'));
494
+ }
495
+ if (timedOut) {
496
+ stderrChunks.push(Buffer.from(`\n[tsdeploy: command timed out after ${timeoutMs}ms]\n`));
497
+ }
498
+ resolve({
499
+ command: optionsArg.command,
500
+ args: optionsArg.args,
501
+ exitCode: timedOut ? 124 : exitCode ?? 1,
502
+ stdout: Buffer.concat(stdoutChunks).toString('utf8'),
503
+ stderr: Buffer.concat(stderrChunks).toString('utf8'),
504
+ });
505
+ });
506
+ });
507
+ };
508
+ defaultCloudlyRequest = async (originArg, methodArg, requestArg) => {
509
+ const controller = new AbortController();
510
+ const timeoutRef = setTimeout(() => controller.abort(), defaultCloudlyRequestTimeoutMs);
511
+ timeoutRef.unref?.();
512
+ try {
513
+ const response = await fetch(`${originArg.replace(/\/+$/, '')}/typedrequest`, {
514
+ method: 'POST',
515
+ headers: {
516
+ 'content-type': 'application/json',
517
+ },
518
+ body: JSON.stringify({
519
+ method: methodArg,
520
+ request: requestArg,
521
+ response: {},
522
+ correlation: {
523
+ id: plugins.crypto.randomUUID(),
524
+ phase: 'request',
525
+ },
526
+ }),
527
+ signal: controller.signal,
528
+ });
529
+ if (!response.ok) {
530
+ await response.body?.cancel().catch(() => undefined);
531
+ throw new Error(`Cloudly request "${methodArg}" failed with HTTP ${response.status}.`);
532
+ }
533
+ const payload = await response.json();
534
+ if (payload.error) {
535
+ throw new plugins.typedrequest.TypedResponseError(payload.error.text, payload.error.data);
536
+ }
537
+ if (payload.retry) {
538
+ throw new Error(`Cloudly request "${methodArg}" requested retry after ${payload.retry.waitForMs}ms: ${payload.retry.reason}`);
539
+ }
540
+ return payload.response;
541
+ }
542
+ catch (error) {
543
+ if (error.name === 'AbortError') {
544
+ throw new Error(`Cloudly request "${methodArg}" timed out after ${defaultCloudlyRequestTimeoutMs}ms.`);
545
+ }
546
+ throw error;
547
+ }
548
+ finally {
549
+ clearTimeout(timeoutRef);
550
+ }
551
+ };
552
+ async fireCloudlyRequest(originArg, methodArg, requestArg) {
553
+ return await this.cloudlyRequest(originArg, methodArg, requestArg);
554
+ }
555
+ async resolveCloudlyIdentity(profileArg, optionsArg) {
556
+ const username = optionsArg.username || this.env.TSDEPLOY_CLOUDLY_USERNAME || this.env.CLOUDLY_USERNAME;
557
+ const password = optionsArg.password || this.env.TSDEPLOY_CLOUDLY_PASSWORD || this.env.CLOUDLY_PASSWORD;
558
+ if (username && password) {
559
+ const response = await this.fireCloudlyRequest(profileArg.origin, 'adminLoginWithUsernameAndPassword', { username, password });
560
+ return response.identity;
561
+ }
562
+ const token = optionsArg.token || this.env.TSDEPLOY_TOKEN || profileArg.token;
563
+ if (token) {
564
+ const response = await this.fireCloudlyRequest(profileArg.origin, 'getIdentityByToken', { token });
565
+ return response.identity;
566
+ }
567
+ throw new Error('Cloudly credentials are required for deploy. Provide --token, TSDEPLOY_TOKEN, profile token, or TSDEPLOY_CLOUDLY_USERNAME/TSDEPLOY_CLOUDLY_PASSWORD.');
568
+ }
569
+ async readProjectSmartconfig() {
570
+ try {
571
+ const raw = await plugins.fs.readFile(plugins.path.join(this.projectDir, '.smartconfig.json'), 'utf8');
572
+ return JSON.parse(raw);
573
+ }
574
+ catch (error) {
575
+ if (error.code === 'ENOENT')
576
+ return {};
577
+ throw error;
578
+ }
579
+ }
580
+ async readProjectPackageJson() {
581
+ try {
582
+ const raw = await plugins.fs.readFile(plugins.path.join(this.projectDir, 'package.json'), 'utf8');
583
+ return JSON.parse(raw);
584
+ }
585
+ catch (error) {
586
+ if (error.code === 'ENOENT')
587
+ return {};
588
+ throw error;
589
+ }
590
+ }
591
+ resolveLocalDockerImage(configArg, tagArg) {
592
+ const dockerConfig = configArg['@git.zone/tsdocker'];
593
+ const registries = Array.isArray(dockerConfig?.registries) ? dockerConfig.registries : [];
594
+ const registryRepoMap = dockerConfig?.registryRepoMap ?? {};
595
+ const registryHost = registries[0] ?? Object.keys(registryRepoMap)[0];
596
+ const repository = registryHost ? registryRepoMap[registryHost] : undefined;
597
+ if (!registryHost || !repository)
598
+ return undefined;
599
+ return `${registryHost}/${repository}:${tagArg}`;
600
+ }
601
+ async resolveProjectCheckCommand() {
602
+ const packageJson = await this.readProjectPackageJson();
603
+ if (packageJson.scripts?.test) {
604
+ return { command: 'pnpm', args: ['test'] };
605
+ }
606
+ if (packageJson.scripts?.build) {
607
+ return { command: 'pnpm', args: ['run', 'build'] };
608
+ }
609
+ return undefined;
610
+ }
611
+ async ensureCleanGitWorktree(stepsArg, allowDirtyArg) {
612
+ if (allowDirtyArg) {
613
+ stepsArg.push({ name: 'git-worktree', status: 'skipped', message: 'Dirty worktree check skipped by option.' });
614
+ return;
615
+ }
616
+ const result = await this.commandRunner({
617
+ command: 'git',
618
+ args: ['status', '--porcelain'],
619
+ cwd: this.projectDir,
620
+ env: this.env,
621
+ timeoutMs: 30000,
622
+ maxOutputBytes: 128 * 1024,
623
+ });
624
+ if (result.exitCode !== 0) {
625
+ stepsArg.push({ name: 'git-worktree', status: 'failed', message: 'Git status check failed.' });
626
+ throw new Error('Refusing to deploy because the project is not a readable git working tree. Commit the project first or pass --allowDirty.');
627
+ }
628
+ const dirtyOutput = result.stdout.trim();
629
+ if (dirtyOutput) {
630
+ stepsArg.push({ name: 'git-worktree', status: 'failed', message: 'Uncommitted changes are present.' });
631
+ throw new Error(`Refusing to deploy with uncommitted changes:\n${dirtyOutput}\nCommit the project first or pass --allowDirty.`);
632
+ }
633
+ stepsArg.push({ name: 'git-worktree', status: 'passed', message: 'Git working tree is clean.' });
634
+ }
635
+ async resolveDockerBuildEnv(configArg) {
636
+ const dockerConfig = configArg['@git.zone/tsdocker'] ?? {};
637
+ const szciConfig = configArg['@ship.zone/szci'] ?? {};
638
+ const buildArgEnvMap = {
639
+ ...(dockerConfig.buildArgEnvMap ?? {}),
640
+ ...(szciConfig.dockerBuildargEnvMap ?? {}),
641
+ };
642
+ const buildArgValues = {};
643
+ const secretValues = [];
644
+ for (const [buildArg, envName] of Object.entries(buildArgEnvMap)) {
645
+ const value = this.env[envName];
646
+ if (!value) {
647
+ throw new Error(`Missing required Docker build arg environment value: ${envName}`);
648
+ }
649
+ buildArgValues[buildArg] = value;
650
+ secretValues.push(value);
651
+ }
652
+ return { buildArgValues, secretValues };
653
+ }
654
+ async runCheckedCommand(commandArg, stepNameArg, stepsArg, secretValuesArg) {
655
+ const result = await this.commandRunner(commandArg);
656
+ if (result.exitCode !== 0) {
657
+ stepsArg.push({ name: stepNameArg, status: 'failed', message: `${commandArg.command} exited with code ${result.exitCode}.` });
658
+ const output = this.redactText(`${result.stdout}\n${result.stderr}`, this.collectSecretValues(commandArg.env, secretValuesArg));
659
+ throw new Error(`${commandArg.command} failed with exit code ${result.exitCode}:\n${output}`.trim());
660
+ }
661
+ stepsArg.push({ name: stepNameArg, status: 'passed', message: `${commandArg.command} completed successfully.` });
662
+ return result;
663
+ }
664
+ collectSecretValues(envArg, additionalValuesArg = []) {
665
+ const values = new Set();
666
+ const addValue = (valueArg) => {
667
+ if (valueArg && valueArg.length >= 4)
668
+ values.add(valueArg);
669
+ };
670
+ for (const value of additionalValuesArg)
671
+ addValue(value);
672
+ if (envArg) {
673
+ for (const [key, value] of Object.entries(envArg)) {
674
+ if (/(token|password|secret|credential|private|auth|key)/i.test(key)) {
675
+ addValue(value);
676
+ }
677
+ }
678
+ }
679
+ return [...values];
680
+ }
681
+ redactText(textArg, secretValuesArg) {
682
+ let result = textArg;
683
+ for (const secret of secretValuesArg.filter(Boolean)) {
684
+ result = result.split(secret).join('[redacted]');
685
+ }
686
+ return result;
687
+ }
688
+ extractDigest(outputArg) {
689
+ const preferredPatterns = [
690
+ /pushing manifest for .+@(sha256:[a-f0-9]{64})/gi,
691
+ /exporting manifest list (sha256:[a-f0-9]{64})/gi,
692
+ /exporting manifest (sha256:[a-f0-9]{64})/gi,
693
+ ];
694
+ for (const pattern of preferredPatterns) {
695
+ const matches = [...outputArg.matchAll(pattern)];
696
+ const digest = matches.at(-1)?.[1];
697
+ if (digest)
698
+ return digest;
699
+ }
700
+ return [...outputArg.matchAll(/sha256:[a-f0-9]{64}/gi)].at(-1)?.[0];
701
+ }
702
+ async getCloudlyDeployments(originArg, identityArg, serviceIdArg) {
703
+ const response = await this.fireCloudlyRequest(originArg, 'getDeploymentsByService', { identity: identityArg, serviceId: serviceIdArg });
704
+ return response.deployments.map(deployment => ({
705
+ deploymentId: deployment.id,
706
+ serviceId: deployment.serviceId,
707
+ serviceName: deployment.serviceName,
708
+ status: deployment.status,
709
+ healthStatus: deployment.healthStatus,
710
+ nodeName: deployment.nodeName,
711
+ version: deployment.version,
712
+ containerId: deployment.containerId,
713
+ deployedAt: deployment.deployedAt,
714
+ updatedAt: deployment.updatedAt,
715
+ }));
716
+ }
717
+ async waitForHealthyDeployment(originArg, identityArg, serviceIdArg, waitSecondsArg) {
718
+ const deadline = Date.now() + waitSecondsArg * 1000;
719
+ let deployments = [];
720
+ while (Date.now() <= deadline) {
721
+ deployments = await this.getCloudlyDeployments(originArg, identityArg, serviceIdArg);
722
+ if (deployments.some(deployment => deployment.status === 'running' && deployment.healthStatus === 'healthy')) {
723
+ return deployments;
724
+ }
725
+ await new Promise(resolve => setTimeout(resolve, 5000));
726
+ }
727
+ throw new Error(`No healthy running deployment observed for service ${serviceIdArg} within ${waitSecondsArg}s.`);
728
+ }
729
+ async verifyUrl(urlArg) {
730
+ const controller = new AbortController();
731
+ const timeoutRef = setTimeout(() => controller.abort(), defaultVerifyUrlTimeoutMs);
732
+ timeoutRef.unref?.();
733
+ try {
734
+ const response = await fetch(urlArg, { method: 'HEAD', signal: controller.signal });
735
+ return response.status;
736
+ }
737
+ catch (error) {
738
+ if (error.name === 'AbortError') {
739
+ throw new Error(`Verification URL timed out after ${defaultVerifyUrlTimeoutMs}ms: ${urlArg}`);
740
+ }
741
+ throw error;
742
+ }
743
+ finally {
744
+ clearTimeout(timeoutRef);
745
+ }
746
+ }
218
747
  }
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c2RlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudHNkZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFvQnhDLE1BQU0sYUFBYSxHQUFHLENBQVUsQ0FBQztBQUNqQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBRTdDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxVQUFrQixFQUFVLEVBQUU7SUFDMUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsU0FBaUIsRUFBbUIsRUFBRTtJQUM3RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFDbEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUU7SUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxVQUE0QixFQUEwQixFQUFFO0lBQ3BGLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxhQUFhLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFDL0MsT0FBTztRQUNMLEdBQUcsYUFBYTtRQUNoQixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUN6QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLFFBQVE7SUFDSCxVQUFVLENBQVM7SUFDbEIsWUFBWSxDQUF3RDtJQUVyRixZQUFZLGFBQStCLEVBQUU7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU8sa0JBQWtCLENBQUMsVUFBNEI7UUFDckQsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQXFCO2dCQUMvRCxPQUFPLEVBQUUsUUFBUTtnQkFDakIsV0FBVyxFQUFFLG9CQUFvQjtnQkFDakMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7YUFDeEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFxQjtnQkFDL0QsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLFdBQVcsRUFBRSxvQkFBb0I7YUFDbEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFILE9BQU8sSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBcUI7WUFDL0QsT0FBTyxFQUFFLGFBQWE7WUFDdEIsV0FBVyxFQUFFLG9CQUFvQjtTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWE7UUFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hELE9BQU87WUFDTCxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRTtTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBdUM7UUFDOUQsTUFBTSxJQUFJLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBcUI7WUFDaEMsSUFBSTtZQUNKLE1BQU07WUFDTixNQUFNO1lBQ04sS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLElBQUksZUFBZSxFQUFFLEtBQUs7WUFDakQsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLElBQUksR0FBRztZQUM1QyxTQUFTLEVBQUUsR0FBRztTQUNmLENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQy9CLGFBQWEsRUFBRSxJQUFJO1lBQ25CLFFBQVEsRUFBRTtnQkFDUixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTzthQUNoQjtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQW1CO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDeEYsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQXlCLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFLLEtBQTJCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNuRCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFnQztRQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDNUMsYUFBYTtZQUNiLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztZQUMzQixZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7WUFDckMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1NBQ2hDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEYsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEcsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVPLG9CQUFvQixDQUFDLGNBQW9DO1FBQy9ELElBQUksY0FBYyxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQXlCO1lBQ3hDLGFBQWE7WUFDYixPQUFPLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztTQUN0RCxDQUFDO1FBQ0YsSUFBSSxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEMsV0FBVyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3QixXQUFXLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGFBQWEsR0FBRyxXQUFXLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDbEUsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM1RSxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUZBQWlGLENBQUMsQ0FBQztRQUNuRyxDQUFDO1FBQ0QsSUFBSSxhQUFhLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksYUFBYSxxREFBcUQsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUNoSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxJQUFJLDZEQUE2RCxDQUFDLENBQUM7UUFDdkcsQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsY0FBYyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDcEMsV0FBVztZQUNYLGFBQWE7WUFDYixPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDckQsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVM7UUFDcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQTZCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFLDJCQUEyQjtnQkFDbEMsV0FBVyxFQUFFLHdIQUF3SDthQUN0SSxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsSUFBSSxFQUFFLE1BQU07Z0JBQ1osS0FBSyxFQUFFLHNCQUFzQjtnQkFDN0IsV0FBVyxFQUFFLHNGQUFzRjthQUNwRyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLDhCQUE4QjtZQUNyQyxXQUFXLEVBQUUseUhBQXlIO1NBQ3ZJLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxhQUFhO1lBQ2IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxzRUFBc0U7WUFDL0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLFlBQVk7WUFDOUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUztZQUN4QyxPQUFPO1lBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU07UUFDakIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUc7WUFDYjtnQkFDRSxJQUFJLEVBQUUsY0FBYztnQkFDcEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxjQUFjO2dCQUN6QixPQUFPLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsOENBQThDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjthQUMvRztZQUNEO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDM0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLGFBQWEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO2FBQ3RJO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsRUFBRSxFQUFFLElBQUk7Z0JBQ1IsT0FBTyxFQUFFLHFFQUFxRTthQUMvRTtTQUNGLENBQUM7UUFDRixPQUFPO1lBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU07WUFDTixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7U0FDMUIsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
748
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c2RlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudHNkZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUEwQ3hDLE1BQU0sYUFBYSxHQUFHLENBQVUsQ0FBQztBQUNqQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLDhCQUE4QixHQUFHLEtBQUssQ0FBQztBQUM3QyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pELE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRXhDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxVQUFrQixFQUFVLEVBQUU7SUFDMUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsU0FBaUIsRUFBbUIsRUFBRTtJQUM3RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFDbEUs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