@catapultjs/deploy 0.0.1 → 0.0.3

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 (99) hide show
  1. package/README.md +2 -3
  2. package/build/bin/run.js +14 -0
  3. package/build/bin/run.js.map +1 -1
  4. package/build/bin/test.d.ts +1 -0
  5. package/build/bin/test.js +9 -0
  6. package/build/bin/test.js.map +1 -0
  7. package/build/commands/deploy.d.ts +2 -0
  8. package/build/commands/deploy.js +9 -4
  9. package/build/commands/deploy.js.map +1 -1
  10. package/build/commands/init.js +3 -2
  11. package/build/commands/init.js.map +1 -1
  12. package/build/commands/list_pipeline.js +1 -1
  13. package/build/commands/list_pipeline.js.map +1 -1
  14. package/build/commands/list_releases.js +3 -3
  15. package/build/commands/list_releases.js.map +1 -1
  16. package/build/commands/list_tasks.js +2 -1
  17. package/build/commands/list_tasks.js.map +1 -1
  18. package/build/commands/rollback.js +3 -3
  19. package/build/commands/rollback.js.map +1 -1
  20. package/build/commands/run_task.js +3 -3
  21. package/build/commands/run_task.js.map +1 -1
  22. package/build/commands/setup.js +5 -5
  23. package/build/commands/setup.js.map +1 -1
  24. package/build/commands/ssh.d.ts +1 -1
  25. package/build/commands/ssh.js +2 -2
  26. package/build/commands/ssh.js.map +1 -1
  27. package/build/commands/status.js +12 -9
  28. package/build/commands/status.js.map +1 -1
  29. package/build/index.d.ts +3 -2
  30. package/build/index.js +3 -2
  31. package/build/index.js.map +1 -1
  32. package/build/recipes/git.js +4 -24
  33. package/build/recipes/git.js.map +1 -1
  34. package/build/recipes/pm2.d.ts +1 -0
  35. package/build/recipes/pm2.js +19 -26
  36. package/build/recipes/pm2.js.map +1 -1
  37. package/build/recipes/rsync.js +3 -4
  38. package/build/recipes/rsync.js.map +1 -1
  39. package/build/src/base_command.d.ts +1 -1
  40. package/build/src/base_command.js +2 -2
  41. package/build/src/base_command.js.map +1 -1
  42. package/build/src/context.d.ts +6 -0
  43. package/build/src/context.js +12 -0
  44. package/build/src/context.js.map +1 -0
  45. package/build/src/defaults.d.ts +14 -0
  46. package/build/src/defaults.js +101 -0
  47. package/build/src/defaults.js.map +1 -0
  48. package/build/src/define_config.d.ts +1 -0
  49. package/build/src/define_config.js +8 -2
  50. package/build/src/define_config.js.map +1 -1
  51. package/build/src/deployer.d.ts +5 -0
  52. package/build/src/{host.js → deployer.js} +8 -100
  53. package/build/src/deployer.js.map +1 -0
  54. package/build/src/package_manager.d.ts +3 -0
  55. package/build/src/package_manager.js +22 -0
  56. package/build/src/package_manager.js.map +1 -0
  57. package/build/src/pipeline/hooks.d.ts +10 -0
  58. package/build/src/pipeline/hooks.js +18 -0
  59. package/build/src/pipeline/hooks.js.map +1 -0
  60. package/build/src/pipeline/store.d.ts +9 -0
  61. package/build/src/pipeline/store.js +38 -0
  62. package/build/src/pipeline/store.js.map +1 -0
  63. package/build/src/pipeline.d.ts +10 -0
  64. package/build/src/pipeline.js +25 -0
  65. package/build/src/pipeline.js.map +1 -0
  66. package/build/src/store.d.ts +2 -0
  67. package/build/src/store.js +8 -0
  68. package/build/src/store.js.map +1 -0
  69. package/build/src/task/runner.d.ts +18 -0
  70. package/build/src/task/runner.js +54 -0
  71. package/build/src/task/runner.js.map +1 -0
  72. package/build/src/task/store.d.ts +10 -0
  73. package/build/src/task/store.js +35 -0
  74. package/build/src/task/store.js.map +1 -0
  75. package/build/src/task.d.ts +7 -29
  76. package/build/src/task.js +17 -136
  77. package/build/src/task.js.map +1 -1
  78. package/build/src/types.d.ts +1 -1
  79. package/build/src/utils.d.ts +4 -2
  80. package/build/src/utils.js +29 -5
  81. package/build/src/utils.js.map +1 -1
  82. package/build/tests/package_manager.spec.d.ts +1 -0
  83. package/build/tests/package_manager.spec.js +43 -0
  84. package/build/tests/package_manager.spec.js.map +1 -0
  85. package/build/tests/pipeline.spec.d.ts +1 -0
  86. package/build/tests/pipeline.spec.js +69 -0
  87. package/build/tests/pipeline.spec.js.map +1 -0
  88. package/build/tests/store.spec.d.ts +1 -0
  89. package/build/tests/store.spec.js +40 -0
  90. package/build/tests/store.spec.js.map +1 -0
  91. package/build/tests/task.spec.d.ts +1 -0
  92. package/build/tests/task.spec.js +97 -0
  93. package/build/tests/task.spec.js.map +1 -0
  94. package/package.json +12 -5
  95. package/build/src/ctx.d.ts +0 -3
  96. package/build/src/ctx.js +0 -10
  97. package/build/src/ctx.js.map +0 -1
  98. package/build/src/host.d.ts +0 -20
  99. package/build/src/host.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ import { ssh, yellow } from "../utils.js";
2
+ export class TaskRunner {
3
+ #ctx = null;
4
+ #commands = [];
5
+ get() {
6
+ return this.#ctx;
7
+ }
8
+ set(ctx) {
9
+ this.#ctx = ctx;
10
+ this.#commands = [];
11
+ }
12
+ clear() {
13
+ this.#ctx = null;
14
+ this.#commands = [];
15
+ }
16
+ push(command) {
17
+ if (!this.#ctx)
18
+ throw new Error('cd() or run() must be called inside a task');
19
+ this.#commands.push(command);
20
+ }
21
+ bin(name) {
22
+ return this.#ctx?.host.bin?.[name] ?? name;
23
+ }
24
+ isVerbose() {
25
+ return this.#ctx?.deployCtx.config.verbose ?? 0;
26
+ }
27
+ resolve(str) {
28
+ if (!this.#ctx)
29
+ return str;
30
+ const p = this.#ctx.paths;
31
+ return str
32
+ .replace(/\{\{release_path\}\}/g, p.release)
33
+ .replace(/\{\{current_path\}\}/g, p.current)
34
+ .replace(/\{\{shared_path\}\}/g, p.shared)
35
+ .replace(/\{\{releases_path\}\}/g, p.releases)
36
+ .replace(/\{\{base_path\}\}/g, p.base)
37
+ .replace(/\{\{release\}\}/g, this.#ctx.deployCtx.release);
38
+ }
39
+ async flush() {
40
+ if (!this.#ctx || this.#commands.length === 0)
41
+ return;
42
+ const cmds = this.#commands.splice(0);
43
+ const verbose = this.#ctx.deployCtx.config.verbose ?? 0;
44
+ if (verbose >= 1) {
45
+ for (const cmd of cmds)
46
+ console.log(yellow(` $ ${cmd}`));
47
+ }
48
+ const subprocess = ssh(this.#ctx.host, ['set -e', ...cmds].join('\n'));
49
+ if (verbose >= 2)
50
+ subprocess.stdout?.pipe(process.stdout);
51
+ await subprocess;
52
+ }
53
+ }
54
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/task/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAUzC,MAAM,OAAO,UAAU;IACrB,IAAI,GAAuB,IAAI,CAAA;IAC/B,SAAS,GAAa,EAAE,CAAA;IAExB,GAAG;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,GAAG,CAAC,GAAgB;QAClB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC7E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;IAC5C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAA;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,OAAO,GAAG;aACP,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC;aAC3C,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC;aAC3C,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC;aACzC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC;aAC7C,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC;aACrC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;QACvD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtE,IAAI,OAAO,IAAI,CAAC;YAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACzD,MAAM,UAAU,CAAA;IAClB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { Host, DeployContext, TaskName } from '../types.ts';
2
+ import { type TaskFn, TaskRunner } from './runner.ts';
3
+ export declare class TaskStore {
4
+ #private;
5
+ constructor(runner: TaskRunner);
6
+ register(name: TaskName, fn: TaskFn): void;
7
+ has(name: TaskName): boolean;
8
+ list(): string[];
9
+ run(name: TaskName, deployCtx: DeployContext, host: Host): Promise<void>;
10
+ }
@@ -0,0 +1,35 @@
1
+ import { getPaths } from "../utils.js";
2
+ export class TaskStore {
3
+ #registry = new Map();
4
+ #runner;
5
+ constructor(runner) {
6
+ this.#runner = runner;
7
+ }
8
+ register(name, fn) {
9
+ this.#registry.set(name, fn);
10
+ }
11
+ has(name) {
12
+ return this.#registry.has(name);
13
+ }
14
+ list() {
15
+ return [...this.#registry.keys()];
16
+ }
17
+ async run(name, deployCtx, host) {
18
+ const fn = this.#registry.get(name);
19
+ if (!fn)
20
+ throw new Error(`Task not found: "${name}"`);
21
+ const paths = getPaths(host.deployPath, deployCtx.release);
22
+ const ctx = { host, paths, deployCtx };
23
+ this.#runner.set(ctx);
24
+ try {
25
+ const result = fn(ctx);
26
+ if (result instanceof Promise)
27
+ await result;
28
+ await this.#runner.flush();
29
+ }
30
+ finally {
31
+ this.#runner.clear();
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/task/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,MAAM,OAAO,SAAS;IACpB,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IACrC,OAAO,CAAY;IAEnB,YAAY,MAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,QAAQ,CAAC,IAAc,EAAE,EAAU;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,GAAG,CAAC,IAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAc,EAAE,SAAwB,EAAE,IAAU;QAC5D,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,GAAG,CAAC,CAAA;QAErD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;QAC1D,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,MAAM,YAAY,OAAO;gBAAE,MAAM,MAAM,CAAA;YAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;CACF"}
@@ -1,33 +1,11 @@
1
- import type { Host, DeployContext, Paths, TaskName } from './types.ts';
2
- import { yellow, blue, gray } from './utils.ts';
3
- export { yellow, blue, gray };
4
- export type TaskFn = () => void | Promise<void>;
5
- export interface TaskContext {
6
- host: Host;
7
- paths: Paths;
8
- deployCtx: DeployContext;
9
- }
10
- export declare function getContext(): TaskContext;
1
+ import type { Host, DeployContext, TaskName } from './types.ts';
2
+ import { type TaskFn } from './task/runner.ts';
3
+ export type { TaskContext } from './task/runner.ts';
11
4
  export declare function task(name: TaskName, fn: TaskFn): void;
12
- export declare function cd(path: string): void;
13
- export declare function run(command: string): void;
14
- export declare function runTask(name: TaskName, deployCtx: DeployContext, host: Host): Promise<void>;
15
- export declare function before(existing: TaskName, newTask: TaskName): void;
16
- export declare function after(existing: TaskName, newTask: TaskName): void;
17
- export declare function getPipeline(): string[];
18
5
  export declare function hasTask(name: TaskName): boolean;
19
6
  export declare function getTasks(): string[];
20
- export declare function set(key: string, value: unknown): void;
21
- export declare function get<T>(key: string, defaultValue?: T): T;
7
+ export declare function runTask(name: TaskName, deployCtx: DeployContext, host: Host): Promise<void>;
8
+ export declare function cd(path: string): void;
9
+ export declare function run(command: string): void;
22
10
  export declare function bin(name: string): string;
23
- export declare function pm(): string;
24
- export declare function pmInstall(): string;
25
- export declare function pmInstallProd(): string;
26
- export declare function remove(name: TaskName): void;
27
- export declare function setPipeline(tasks: TaskName[]): void;
28
- type LifecycleHook = (ctx: DeployContext, host: Host) => Promise<void> | void;
29
- export declare function onSetup(fn: LifecycleHook): void;
30
- export declare function getSetupHooks(): LifecycleHook[];
31
- export declare function onStatus(fn: LifecycleHook): void;
32
- export declare function getStatusHooks(): LifecycleHook[];
33
- export declare function isVerbose(): boolean;
11
+ export declare function isVerbose(): 0 | 1 | 2;
package/build/src/task.js CHANGED
@@ -1,149 +1,30 @@
1
- import { q, getPaths, ssh, yellow, blue, gray } from "./utils.js";
2
- export { yellow, blue, gray };
3
- const _registry = new Map();
4
- let _pipeline = [
5
- 'deploy:lock',
6
- 'deploy:release',
7
- 'deploy:update_code',
8
- 'deploy:shared',
9
- 'deploy:publish',
10
- 'deploy:log_revision',
11
- 'deploy:healthcheck',
12
- 'deploy:unlock',
13
- 'deploy:cleanup',
14
- ];
15
- let _execCtx = null;
16
- export function getContext() {
17
- if (!_execCtx)
18
- throw new Error('getContext() must be called inside a task');
19
- return _execCtx;
20
- }
1
+ import { TaskRunner } from "./task/runner.js";
2
+ import { TaskStore } from "./task/store.js";
3
+ import { q } from "./utils.js";
4
+ const runner = new TaskRunner();
5
+ const store = new TaskStore(runner);
21
6
  export function task(name, fn) {
22
- _registry.set(name, fn);
23
- }
24
- export function cd(path) {
25
- if (!_execCtx)
26
- throw new Error('cd() must be called inside a task');
27
- _execCtx.commands.push(`cd ${q(_resolve(path))}`);
28
- }
29
- export function run(command) {
30
- if (!_execCtx)
31
- throw new Error('run() must be called inside a task');
32
- _execCtx.commands.push(_resolve(command));
33
- }
34
- export async function runTask(name, deployCtx, host) {
35
- const fn = _registry.get(name);
36
- if (!fn)
37
- throw new Error(`Task not found: "${name}"`);
38
- const paths = getPaths(host.deployPath, deployCtx.release);
39
- _execCtx = { host, paths, deployCtx, commands: [] };
40
- try {
41
- const result = fn();
42
- if (result instanceof Promise)
43
- await result;
44
- await _flush();
45
- }
46
- finally {
47
- _execCtx = null;
48
- }
49
- }
50
- export function before(existing, newTask) {
51
- const idx = _pipeline.indexOf(existing);
52
- if (idx === -1)
53
- throw new Error(`Task "${existing}" not found in pipeline`);
54
- _pipeline.splice(idx, 0, newTask);
55
- }
56
- export function after(existing, newTask) {
57
- const idx = _pipeline.indexOf(existing);
58
- if (idx === -1)
59
- throw new Error(`Task "${existing}" not found in pipeline`);
60
- _pipeline.splice(idx + 1, 0, newTask);
61
- }
62
- export function getPipeline() {
63
- return [..._pipeline];
7
+ store.register(name, fn);
64
8
  }
65
9
  export function hasTask(name) {
66
- return _registry.has(name);
10
+ return store.has(name);
67
11
  }
68
12
  export function getTasks() {
69
- return [..._registry.keys()];
13
+ return store.list();
70
14
  }
71
- const _vars = new Map();
72
- export function set(key, value) {
73
- _vars.set(key, value);
74
- }
75
- export function get(key, defaultValue) {
76
- return (_vars.has(key) ? _vars.get(key) : defaultValue);
77
- }
78
- export function bin(name) {
79
- return _execCtx?.host.bin?.[name] ?? name;
80
- }
81
- export function pm() {
82
- return bin(get('package_manager', 'npm'));
83
- }
84
- export function pmInstall() {
85
- const manager = get('package_manager', 'npm');
86
- if (manager === 'pnpm')
87
- return `${pm()} install --frozen-lockfile`;
88
- if (manager === 'yarn')
89
- return `${pm()} install --frozen-lockfile`;
90
- return `${pm()} ci`;
91
- }
92
- export function pmInstallProd() {
93
- const manager = get('package_manager', 'npm');
94
- if (manager === 'pnpm')
95
- return `${pm()} install --prod`;
96
- if (manager === 'yarn')
97
- return `${pm()} install --production`;
98
- return `${pm()} install --omit=dev`;
99
- }
100
- export function remove(name) {
101
- const idx = _pipeline.indexOf(name);
102
- if (idx === -1)
103
- throw new Error(`Task "${name}" not found in pipeline`);
104
- _pipeline.splice(idx, 1);
105
- }
106
- export function setPipeline(tasks) {
107
- _pipeline = [...tasks];
108
- }
109
- const _setupHooks = [];
110
- export function onSetup(fn) {
111
- _setupHooks.push(fn);
112
- }
113
- export function getSetupHooks() {
114
- return [..._setupHooks];
15
+ export async function runTask(name, deployCtx, host) {
16
+ return store.run(name, deployCtx, host);
115
17
  }
116
- const _statusHooks = [];
117
- export function onStatus(fn) {
118
- _statusHooks.push(fn);
18
+ export function cd(path) {
19
+ runner.push(`cd ${q(runner.resolve(path))}`);
119
20
  }
120
- export function getStatusHooks() {
121
- return [..._statusHooks];
21
+ export function run(command) {
22
+ runner.push(runner.resolve(command));
122
23
  }
123
- function _resolve(str) {
124
- if (!_execCtx)
125
- return str;
126
- const p = _execCtx.paths;
127
- return str
128
- .replace(/\{\{release_path\}\}/g, p.release)
129
- .replace(/\{\{current_path\}\}/g, p.current)
130
- .replace(/\{\{shared_path\}\}/g, p.shared)
131
- .replace(/\{\{releases_path\}\}/g, p.releases)
132
- .replace(/\{\{base_path\}\}/g, p.base)
133
- .replace(/\{\{release\}\}/g, _execCtx.deployCtx.release);
24
+ export function bin(name) {
25
+ return runner.bin(name);
134
26
  }
135
27
  export function isVerbose() {
136
- return _execCtx?.deployCtx.config.verbose ?? false;
137
- }
138
- async function _flush() {
139
- if (!_execCtx || _execCtx.commands.length === 0)
140
- return;
141
- const cmds = _execCtx.commands.splice(0);
142
- const verbose = _execCtx.deployCtx.config.verbose;
143
- if (verbose) {
144
- for (const cmd of cmds)
145
- console.log(yellow(` $ ${cmd}`));
146
- }
147
- await ssh(_execCtx.host, ['set -e', ...cmds].join('\n'));
28
+ return runner.isVerbose();
148
29
  }
149
30
  //# sourceMappingURL=task.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAI9B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;AAC/B,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;AAEnC,MAAM,UAAU,IAAI,CAAC,IAAc,EAAE,EAAU;IAC7C,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAA;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,SAAwB,EAAE,IAAU;IAChF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;AACzC,CAAC;AAMD,MAAM,UAAU,EAAE,CAAC,IAAY;IAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,SAAS,EAAE,CAAA;AAC3B,CAAC"}
@@ -44,7 +44,7 @@ export interface Config {
44
44
  healthcheckDelayMs?: number;
45
45
  hosts: Host[];
46
46
  hooks?: Hooks;
47
- verbose?: boolean;
47
+ verbose?: 0 | 1 | 2;
48
48
  }
49
49
  export interface DeployContext {
50
50
  config: Config;
@@ -1,8 +1,9 @@
1
1
  import type { Host, Paths } from './types.ts';
2
- export declare function findDeployFile(cwd?: string): Promise<string | null>;
3
2
  export declare const yellow: (s: string) => string;
4
3
  export declare const blue: (s: string) => string;
5
4
  export declare const gray: (s: string) => string;
5
+ export declare function detectPackageManager(cwd?: string): Promise<string>;
6
+ export declare function findDeployFile(cwd?: string): Promise<string | null>;
6
7
  export declare function q(value: unknown): string;
7
8
  export declare function getPaths(baseDir: string, releaseName: string): Paths;
8
9
  export declare function resolveSshArgs(host: Host): string[];
@@ -11,5 +12,6 @@ export declare function rsyncSshFlag(host: Host): string;
11
12
  export declare function ssh(host: Host, command: string, opts?: {
12
13
  quiet?: boolean;
13
14
  verbose?: boolean;
14
- }): Promise<import("execa").Result<{}>>;
15
+ }): import("execa").ResultPromise<{}>;
15
16
  export declare function sleep(ms: number): Promise<void>;
17
+ export declare function elapsed(ms: number): string;
@@ -5,6 +5,25 @@ import { createHash } from 'node:crypto';
5
5
  import { access } from 'node:fs/promises';
6
6
  import { colors } from '@poppinss/cliui';
7
7
  const DEPLOY_CANDIDATES = ['deploy.ts', 'deploy.js', 'bin/deploy.ts', 'bin/deploy.js'];
8
+ const PM_LOCK_FILES = [
9
+ ['bun.lockb', 'bun'],
10
+ ['pnpm-lock.yaml', 'pnpm'],
11
+ ['yarn.lock', 'yarn'],
12
+ ['package-lock.json', 'npm'],
13
+ ];
14
+ export const yellow = (s) => colors.ansi().yellow(s);
15
+ export const blue = (s) => colors.ansi().blue(s);
16
+ export const gray = (s) => colors.ansi().dim(s);
17
+ export async function detectPackageManager(cwd = process.cwd()) {
18
+ for (const [lockFile, manager] of PM_LOCK_FILES) {
19
+ try {
20
+ await access(resolve(cwd, lockFile));
21
+ return manager;
22
+ }
23
+ catch { }
24
+ }
25
+ return 'npm';
26
+ }
8
27
  export async function findDeployFile(cwd = process.cwd()) {
9
28
  for (const candidate of DEPLOY_CANDIDATES) {
10
29
  const full = resolve(cwd, candidate);
@@ -16,9 +35,6 @@ export async function findDeployFile(cwd = process.cwd()) {
16
35
  }
17
36
  return null;
18
37
  }
19
- export const yellow = (s) => colors.ansi().yellow(s);
20
- export const blue = (s) => colors.ansi().blue(s);
21
- export const gray = (s) => colors.ansi().dim(s);
22
38
  export function q(value) {
23
39
  return `'${String(value).replace(/'/g, `'\\''`)}'`;
24
40
  }
@@ -42,14 +58,14 @@ export function sshControlArgs(host) {
42
58
  const target = typeof host.ssh === 'string' ? host.ssh : `${host.ssh.user}@${host.ssh.host}`;
43
59
  const hash = createHash('sha1').update(target).digest('hex').slice(0, 8);
44
60
  const socket = join(tmpdir(), `cata-${hash}.sock`);
45
- return ['-o', 'ControlMaster=auto', '-o', `ControlPath=${socket}`, '-o', 'ControlPersist=60'];
61
+ return ['-o', 'ControlMaster=auto', '-o', `ControlPath=${socket}`, '-o', 'ControlPersist=300'];
46
62
  }
47
63
  export function rsyncSshFlag(host) {
48
64
  const controlOpts = sshControlArgs(host).join(' ');
49
65
  const port = typeof host.ssh === 'object' && host.ssh.port ? ` -p ${host.ssh.port}` : '';
50
66
  return `ssh${port} ${controlOpts}`;
51
67
  }
52
- export async function ssh(host, command, opts) {
68
+ export function ssh(host, command, opts) {
53
69
  if (opts?.verbose && !opts?.quiet)
54
70
  console.log(yellow(` $ ${command}`));
55
71
  const b64 = Buffer.from(command).toString('base64');
@@ -59,4 +75,12 @@ export async function ssh(host, command, opts) {
59
75
  export async function sleep(ms) {
60
76
  return new Promise((resolve) => setTimeout(resolve, ms));
61
77
  }
78
+ export function elapsed(ms) {
79
+ const total = Math.round(ms / 1000);
80
+ const m = Math.floor(total / 60)
81
+ .toString()
82
+ .padStart(2, '0');
83
+ const s = (total % 60).toString().padStart(2, '0');
84
+ return `${m}:${s}`;
85
+ }
62
86
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ import { test } from '@japa/runner';
2
+ import { set } from "../src/store.js";
3
+ import { pm, pmInstall, pmInstallProd } from "../src/package_manager.js";
4
+ test.group('package_manager', (group) => {
5
+ group.each.teardown(() => set('package_manager', 'npm'));
6
+ test('pm() returns npm by default', ({ assert }) => {
7
+ set('package_manager', 'npm');
8
+ assert.equal(pm(), 'npm');
9
+ });
10
+ test('pm() returns pnpm when set', ({ assert }) => {
11
+ set('package_manager', 'pnpm');
12
+ assert.equal(pm(), 'pnpm');
13
+ });
14
+ test('pm() returns yarn when set', ({ assert }) => {
15
+ set('package_manager', 'yarn');
16
+ assert.equal(pm(), 'yarn');
17
+ });
18
+ test('pmInstall() returns npm ci for npm', ({ assert }) => {
19
+ set('package_manager', 'npm');
20
+ assert.equal(pmInstall(), 'npm ci');
21
+ });
22
+ test('pmInstall() returns frozen lockfile command for pnpm', ({ assert }) => {
23
+ set('package_manager', 'pnpm');
24
+ assert.equal(pmInstall(), 'pnpm install --frozen-lockfile');
25
+ });
26
+ test('pmInstall() returns frozen lockfile command for yarn', ({ assert }) => {
27
+ set('package_manager', 'yarn');
28
+ assert.equal(pmInstall(), 'yarn install --frozen-lockfile');
29
+ });
30
+ test('pmInstallProd() returns npm install --omit=dev for npm', ({ assert }) => {
31
+ set('package_manager', 'npm');
32
+ assert.equal(pmInstallProd(), 'npm install --omit=dev');
33
+ });
34
+ test('pmInstallProd() returns pnpm install --prod for pnpm', ({ assert }) => {
35
+ set('package_manager', 'pnpm');
36
+ assert.equal(pmInstallProd(), 'pnpm install --prod');
37
+ });
38
+ test('pmInstallProd() returns yarn install --production for yarn', ({ assert }) => {
39
+ set('package_manager', 'yarn');
40
+ assert.equal(pmInstallProd(), 'yarn install --production');
41
+ });
42
+ });
43
+ //# sourceMappingURL=package_manager.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package_manager.spec.js","sourceRoot":"","sources":["../../tests/package_manager.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AACrC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAExE,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;IACtC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAA;IAExD,IAAI,CAAC,6BAA6B,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACjD,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAChD,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAChD,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oCAAoC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACxD,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sDAAsD,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1E,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,gCAAgC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sDAAsD,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1E,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,gCAAgC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wDAAwD,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5E,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,wBAAwB,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sDAAsD,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1E,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,qBAAqB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4DAA4D,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAChF,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,2BAA2B,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,69 @@
1
+ import { test } from '@japa/runner';
2
+ import { getPipeline, setPipeline, before, after, remove, onSetup, onStatus } from "../src/pipeline.js";
3
+ import { hooks } from "../src/pipeline/hooks.js";
4
+ const DEFAULT_PIPELINE = [
5
+ 'deploy:lock',
6
+ 'deploy:release',
7
+ 'deploy:update_code',
8
+ 'deploy:shared',
9
+ 'deploy:publish',
10
+ 'deploy:log_revision',
11
+ 'deploy:healthcheck',
12
+ 'deploy:unlock',
13
+ 'deploy:cleanup',
14
+ ];
15
+ test.group('pipeline', (group) => {
16
+ group.each.setup(() => setPipeline(DEFAULT_PIPELINE));
17
+ test('getPipeline returns the default pipeline', ({ assert }) => {
18
+ assert.deepEqual(getPipeline(), DEFAULT_PIPELINE);
19
+ });
20
+ test('getPipeline returns a copy, not a reference', ({ assert }) => {
21
+ const a = getPipeline();
22
+ const b = getPipeline();
23
+ assert.notStrictEqual(a, b);
24
+ });
25
+ test('setPipeline replaces the entire pipeline', ({ assert }) => {
26
+ setPipeline(['deploy:release', 'deploy:publish']);
27
+ assert.deepEqual(getPipeline(), ['deploy:release', 'deploy:publish']);
28
+ });
29
+ test('before inserts a task before an existing one', ({ assert }) => {
30
+ before('deploy:publish', 'my:task');
31
+ const pipeline = getPipeline();
32
+ const idx = pipeline.indexOf('my:task');
33
+ assert.isAbove(idx, -1);
34
+ assert.equal(pipeline[idx + 1], 'deploy:publish');
35
+ });
36
+ test('before throws when the reference task does not exist', ({ assert }) => {
37
+ assert.throws(() => before('nonexistent:task', 'my:task'), /not found in pipeline/);
38
+ });
39
+ test('after inserts a task after an existing one', ({ assert }) => {
40
+ after('deploy:publish', 'my:task');
41
+ const pipeline = getPipeline();
42
+ const idx = pipeline.indexOf('my:task');
43
+ assert.isAbove(idx, -1);
44
+ assert.equal(pipeline[idx - 1], 'deploy:publish');
45
+ });
46
+ test('after throws when the reference task does not exist', ({ assert }) => {
47
+ assert.throws(() => after('nonexistent:task', 'my:task'), /not found in pipeline/);
48
+ });
49
+ test('remove removes a task from the pipeline', ({ assert }) => {
50
+ remove('deploy:healthcheck');
51
+ assert.notInclude(getPipeline(), 'deploy:healthcheck');
52
+ });
53
+ test('remove throws when the task does not exist', ({ assert }) => {
54
+ assert.throws(() => remove('nonexistent:task'), /not found in pipeline/);
55
+ });
56
+ });
57
+ test.group('pipeline — hooks', () => {
58
+ test('onSetup registers a setup hook', ({ assert }) => {
59
+ const before = hooks.getSetup().length;
60
+ onSetup(async () => { });
61
+ assert.equal(hooks.getSetup().length, before + 1);
62
+ });
63
+ test('onStatus registers a status hook', ({ assert }) => {
64
+ const before = hooks.getStatus().length;
65
+ onStatus(async () => { });
66
+ assert.equal(hooks.getStatus().length, before + 1);
67
+ });
68
+ });
69
+ //# sourceMappingURL=pipeline.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.spec.js","sourceRoot":"","sources":["../../tests/pipeline.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { test } from '@japa/runner';
2
+ import { set, get } from "../src/store.js";
3
+ test.group('store', () => {
4
+ test('get returns undefined when key is not set', ({ assert }) => {
5
+ assert.isUndefined(get('store__unset_key'));
6
+ });
7
+ test('get returns default value when key is not set', ({ assert }) => {
8
+ assert.equal(get('store__missing', 'fallback'), 'fallback');
9
+ });
10
+ test('set and get a string value', ({ assert }) => {
11
+ set('store__str', 'hello');
12
+ assert.equal(get('store__str'), 'hello');
13
+ });
14
+ test('set overwrites existing value', ({ assert }) => {
15
+ set('store__overwrite', 'first');
16
+ set('store__overwrite', 'second');
17
+ assert.equal(get('store__overwrite'), 'second');
18
+ });
19
+ test('set value takes priority over default', ({ assert }) => {
20
+ set('store__priority', 'actual');
21
+ assert.equal(get('store__priority', 'fallback'), 'actual');
22
+ });
23
+ test('set and get a number', ({ assert }) => {
24
+ set('store__num', 42);
25
+ assert.equal(get('store__num'), 42);
26
+ });
27
+ test('set and get a boolean', ({ assert }) => {
28
+ set('store__bool', true);
29
+ assert.isTrue(get('store__bool'));
30
+ });
31
+ test('set and get an array', ({ assert }) => {
32
+ set('store__arr', [1, 2, 3]);
33
+ assert.deepEqual(get('store__arr'), [1, 2, 3]);
34
+ });
35
+ test('set and get an object', ({ assert }) => {
36
+ set('store__obj', { a: 1, b: 'x' });
37
+ assert.deepEqual(get('store__obj'), { a: 1, b: 'x' });
38
+ });
39
+ });
40
+ //# sourceMappingURL=store.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.spec.js","sourceRoot":"","sources":["../../tests/store.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAE1C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,2CAA2C,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/D,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+CAA+C,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACnE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAChD,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACnD,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;QAChC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAA;QACjC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3D,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1C,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QACrB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAS,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uBAAuB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3C,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QACxB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAU,aAAa,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1C,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAW,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uBAAuB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3C,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAS,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}