rampway 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +183 -0
  2. package/build/src/cli.d.ts +3 -0
  3. package/build/src/cli.d.ts.map +1 -0
  4. package/build/src/cli.js +104 -0
  5. package/build/src/cli.js.map +1 -0
  6. package/build/src/commands/context.d.ts +12 -0
  7. package/build/src/commands/context.d.ts.map +1 -0
  8. package/build/src/commands/context.js +16 -0
  9. package/build/src/commands/context.js.map +1 -0
  10. package/build/src/commands/deploy.d.ts +6 -0
  11. package/build/src/commands/deploy.d.ts.map +1 -0
  12. package/build/src/commands/deploy.js +14 -0
  13. package/build/src/commands/deploy.js.map +1 -0
  14. package/build/src/commands/doctor.d.ts +14 -0
  15. package/build/src/commands/doctor.d.ts.map +1 -0
  16. package/build/src/commands/doctor.js +54 -0
  17. package/build/src/commands/doctor.js.map +1 -0
  18. package/build/src/commands/init.d.ts +8 -0
  19. package/build/src/commands/init.d.ts.map +1 -0
  20. package/build/src/commands/init.js +42 -0
  21. package/build/src/commands/init.js.map +1 -0
  22. package/build/src/commands/plan.d.ts +6 -0
  23. package/build/src/commands/plan.d.ts.map +1 -0
  24. package/build/src/commands/plan.js +24 -0
  25. package/build/src/commands/plan.js.map +1 -0
  26. package/build/src/commands/releases.d.ts +27 -0
  27. package/build/src/commands/releases.d.ts.map +1 -0
  28. package/build/src/commands/releases.js +91 -0
  29. package/build/src/commands/releases.js.map +1 -0
  30. package/build/src/commands/rollback.d.ts +6 -0
  31. package/build/src/commands/rollback.d.ts.map +1 -0
  32. package/build/src/commands/rollback.js +12 -0
  33. package/build/src/commands/rollback.js.map +1 -0
  34. package/build/src/commands/rollbridge.d.ts +21 -0
  35. package/build/src/commands/rollbridge.d.ts.map +1 -0
  36. package/build/src/commands/rollbridge.js +69 -0
  37. package/build/src/commands/rollbridge.js.map +1 -0
  38. package/build/src/commands/validate.d.ts +6 -0
  39. package/build/src/commands/validate.d.ts.map +1 -0
  40. package/build/src/commands/validate.js +12 -0
  41. package/build/src/commands/validate.js.map +1 -0
  42. package/build/src/config/load-config.d.ts +10 -0
  43. package/build/src/config/load-config.d.ts.map +1 -0
  44. package/build/src/config/load-config.js +71 -0
  45. package/build/src/config/load-config.js.map +1 -0
  46. package/build/src/config/validate-config.d.ts +7 -0
  47. package/build/src/config/validate-config.d.ts.map +1 -0
  48. package/build/src/config/validate-config.js +117 -0
  49. package/build/src/config/validate-config.js.map +1 -0
  50. package/build/src/core/deploy-runner.d.ts +46 -0
  51. package/build/src/core/deploy-runner.d.ts.map +1 -0
  52. package/build/src/core/deploy-runner.js +221 -0
  53. package/build/src/core/deploy-runner.js.map +1 -0
  54. package/build/src/core/expo-web-artifacts.d.ts +10 -0
  55. package/build/src/core/expo-web-artifacts.d.ts.map +1 -0
  56. package/build/src/core/expo-web-artifacts.js +16 -0
  57. package/build/src/core/expo-web-artifacts.js.map +1 -0
  58. package/build/src/core/git-source.d.ts +22 -0
  59. package/build/src/core/git-source.d.ts.map +1 -0
  60. package/build/src/core/git-source.js +63 -0
  61. package/build/src/core/git-source.js.map +1 -0
  62. package/build/src/core/health-checks.d.ts +8 -0
  63. package/build/src/core/health-checks.d.ts.map +1 -0
  64. package/build/src/core/health-checks.js +19 -0
  65. package/build/src/core/health-checks.js.map +1 -0
  66. package/build/src/core/hooks.d.ts +12 -0
  67. package/build/src/core/hooks.d.ts.map +1 -0
  68. package/build/src/core/hooks.js +26 -0
  69. package/build/src/core/hooks.js.map +1 -0
  70. package/build/src/core/locks.d.ts +16 -0
  71. package/build/src/core/locks.d.ts.map +1 -0
  72. package/build/src/core/locks.js +32 -0
  73. package/build/src/core/locks.js.map +1 -0
  74. package/build/src/core/node-package-tasks.d.ts +26 -0
  75. package/build/src/core/node-package-tasks.d.ts.map +1 -0
  76. package/build/src/core/node-package-tasks.js +143 -0
  77. package/build/src/core/node-package-tasks.js.map +1 -0
  78. package/build/src/core/path-change-gate.d.ts +15 -0
  79. package/build/src/core/path-change-gate.d.ts.map +1 -0
  80. package/build/src/core/path-change-gate.js +95 -0
  81. package/build/src/core/path-change-gate.js.map +1 -0
  82. package/build/src/core/paths.d.ts +7 -0
  83. package/build/src/core/paths.d.ts.map +1 -0
  84. package/build/src/core/paths.js +20 -0
  85. package/build/src/core/paths.js.map +1 -0
  86. package/build/src/core/redaction.d.ts +22 -0
  87. package/build/src/core/redaction.d.ts.map +1 -0
  88. package/build/src/core/redaction.js +39 -0
  89. package/build/src/core/redaction.js.map +1 -0
  90. package/build/src/core/release-id.d.ts +6 -0
  91. package/build/src/core/release-id.d.ts.map +1 -0
  92. package/build/src/core/release-id.js +20 -0
  93. package/build/src/core/release-id.js.map +1 -0
  94. package/build/src/core/release-manager.d.ts +49 -0
  95. package/build/src/core/release-manager.d.ts.map +1 -0
  96. package/build/src/core/release-manager.js +115 -0
  97. package/build/src/core/release-manager.js.map +1 -0
  98. package/build/src/core/task-runner.d.ts +38 -0
  99. package/build/src/core/task-runner.d.ts.map +1 -0
  100. package/build/src/core/task-runner.js +102 -0
  101. package/build/src/core/task-runner.js.map +1 -0
  102. package/build/src/core/velocious-migrate.d.ts +11 -0
  103. package/build/src/core/velocious-migrate.d.ts.map +1 -0
  104. package/build/src/core/velocious-migrate.js +20 -0
  105. package/build/src/core/velocious-migrate.js.map +1 -0
  106. package/build/src/runtimes/index.d.ts +56 -0
  107. package/build/src/runtimes/index.d.ts.map +1 -0
  108. package/build/src/runtimes/index.js +132 -0
  109. package/build/src/runtimes/index.js.map +1 -0
  110. package/build/src/runtimes/none-runtime.d.ts +22 -0
  111. package/build/src/runtimes/none-runtime.d.ts.map +1 -0
  112. package/build/src/runtimes/none-runtime.js +23 -0
  113. package/build/src/runtimes/none-runtime.js.map +1 -0
  114. package/build/src/runtimes/rollbridge-runtime.d.ts +137 -0
  115. package/build/src/runtimes/rollbridge-runtime.d.ts.map +1 -0
  116. package/build/src/runtimes/rollbridge-runtime.js +224 -0
  117. package/build/src/runtimes/rollbridge-runtime.js.map +1 -0
  118. package/build/src/tasks.d.ts +5 -0
  119. package/build/src/tasks.d.ts.map +1 -0
  120. package/build/src/tasks.js +5 -0
  121. package/build/src/tasks.js.map +1 -0
  122. package/build/src/test-helpers.d.ts +25 -0
  123. package/build/src/test-helpers.d.ts.map +1 -0
  124. package/build/src/test-helpers.js +40 -0
  125. package/build/src/test-helpers.js.map +1 -0
  126. package/build/src/transports/local-transport.d.ts +67 -0
  127. package/build/src/transports/local-transport.d.ts.map +1 -0
  128. package/build/src/transports/local-transport.js +121 -0
  129. package/build/src/transports/local-transport.js.map +1 -0
  130. package/build/src/transports/ssh-transport.d.ts +189 -0
  131. package/build/src/transports/ssh-transport.d.ts.map +1 -0
  132. package/build/src/transports/ssh-transport.js +369 -0
  133. package/build/src/transports/ssh-transport.js.map +1 -0
  134. package/build/src/types.d.ts +290 -0
  135. package/build/src/types.d.ts.map +1 -0
  136. package/build/src/types.js +8 -0
  137. package/build/src/types.js.map +1 -0
  138. package/docs/config-reference.md +264 -0
  139. package/docs/migration-from-capistrano.md +167 -0
  140. package/docs/roadmap.md +27 -0
  141. package/examples/local/rampway.config.mjs +20 -0
  142. package/examples/monorepo/rampway.config.mjs +73 -0
  143. package/package.json +92 -0
@@ -0,0 +1,143 @@
1
+ const SUPPORTED_MANAGERS = new Set(["npm", "pnpm", "yarn", "bun"]);
2
+ /**
3
+ * @param {import('#types').NodePackageInstallOptions} [options]
4
+ * @returns {import('#types').TaskEntry}
5
+ */
6
+ export function npmInstall(options = {}) {
7
+ return nodePackageInstall({ packageManager: "npm", ...options });
8
+ }
9
+ /**
10
+ * @param {import('#types').NodePackageInstallOptions} [options]
11
+ * @returns {import('#types').TaskEntry}
12
+ */
13
+ export function pnpmInstall(options = {}) {
14
+ return nodePackageInstall({ packageManager: "pnpm", ...options });
15
+ }
16
+ /**
17
+ * @param {import('#types').NodePackageInstallOptions} [options]
18
+ * @returns {import('#types').TaskEntry}
19
+ */
20
+ export function yarnInstall(options = {}) {
21
+ return nodePackageInstall({ packageManager: "yarn", ...options });
22
+ }
23
+ /**
24
+ * @param {import('#types').NodePackageInstallOptions} [options]
25
+ * @returns {import('#types').TaskEntry}
26
+ */
27
+ export function bunInstall(options = {}) {
28
+ return nodePackageInstall({ packageManager: "bun", ...options });
29
+ }
30
+ /**
31
+ * @param {import('#types').NodePackageInstallOptions} [options]
32
+ * @returns {import('#types').TaskEntry}
33
+ */
34
+ export function nodePackageInstall(options = {}) {
35
+ validateOptions(options);
36
+ const packageManager = options.packageManager ?? "npm";
37
+ if (!SUPPORTED_MANAGERS.has(packageManager))
38
+ throw new Error(`Unsupported Node package manager '${packageManager}'. Supported: ${Array.from(SUPPORTED_MANAGERS).join(", ")}`);
39
+ if (packageManager === "yarn" && options.production === true)
40
+ throw new Error("production installs are not supported for yarnInstall; use npmInstall, pnpmInstall, bunInstall, or a custom task command.");
41
+ return taskEntry({
42
+ command: installCommand(packageManager, options),
43
+ cwd: options.cwd,
44
+ env: options.env,
45
+ optional: options.optional
46
+ });
47
+ }
48
+ /**
49
+ * @param {string} packageManager
50
+ * @param {import('#types').NodePackageInstallOptions} options
51
+ * @returns {string}
52
+ */
53
+ function installCommand(packageManager, options) {
54
+ switch (packageManager) {
55
+ case "npm":
56
+ return npmCommand(options);
57
+ case "pnpm":
58
+ return pnpmCommand(options);
59
+ case "yarn":
60
+ return yarnCommand(options);
61
+ case "bun":
62
+ return bunCommand(options);
63
+ default:
64
+ throw new Error(`Unsupported package manager: ${packageManager}`);
65
+ }
66
+ }
67
+ /**
68
+ * @param {import('#types').NodePackageInstallOptions} options
69
+ * @returns {string}
70
+ */
71
+ function npmCommand(options) {
72
+ const args = [options.clean === false ? "install" : "ci"];
73
+ if (options.production)
74
+ args.push("--omit=dev");
75
+ return ["npm", ...args].join(" ");
76
+ }
77
+ /**
78
+ * @param {import('#types').NodePackageInstallOptions} options
79
+ * @returns {string}
80
+ */
81
+ function pnpmCommand(options) {
82
+ const args = ["install"];
83
+ args.push(options.frozenLockfile === false ? "--no-frozen-lockfile" : "--frozen-lockfile");
84
+ if (options.production)
85
+ args.push("--prod");
86
+ return ["pnpm", ...args].join(" ");
87
+ }
88
+ /**
89
+ * @param {import('#types').NodePackageInstallOptions} options
90
+ * @returns {string}
91
+ */
92
+ function yarnCommand(options) {
93
+ const args = ["install"];
94
+ args.push(options.frozenLockfile === false ? "--no-immutable" : "--immutable");
95
+ return ["yarn", ...args].join(" ");
96
+ }
97
+ /**
98
+ * @param {import('#types').NodePackageInstallOptions} options
99
+ * @returns {string}
100
+ */
101
+ function bunCommand(options) {
102
+ const args = ["install"];
103
+ if (options.frozenLockfile !== false)
104
+ args.push("--frozen-lockfile");
105
+ if (options.production)
106
+ args.push("--production");
107
+ return ["bun", ...args].join(" ");
108
+ }
109
+ /**
110
+ * @param {{command: string, cwd?: string, env?: Record<string, string>, optional?: boolean}} opts
111
+ * @returns {import('#types').TaskEntry}
112
+ */
113
+ function taskEntry({ command, cwd, env, optional }) {
114
+ return {
115
+ command,
116
+ ...(cwd ? { cwd } : {}),
117
+ ...(env ? { env } : {}),
118
+ ...(optional === true ? { optional } : {})
119
+ };
120
+ }
121
+ /**
122
+ * @param {import('#types').NodePackageInstallOptions} options
123
+ * @returns {void}
124
+ */
125
+ function validateOptions(options) {
126
+ if (!options || typeof options !== "object" || Array.isArray(options))
127
+ throw new Error("Node package install options must be an object.");
128
+ if (options.packageManager !== undefined && typeof options.packageManager !== "string")
129
+ throw new Error("packageManager must be a string.");
130
+ if (options.cwd !== undefined && (typeof options.cwd !== "string" || options.cwd.length === 0))
131
+ throw new Error("cwd must be a non-empty string.");
132
+ if (options.env !== undefined && (!options.env || typeof options.env !== "object" || Array.isArray(options.env)))
133
+ throw new Error("env must be an object.");
134
+ if (options.optional !== undefined && typeof options.optional !== "boolean")
135
+ throw new Error("optional must be a boolean.");
136
+ if (options.production !== undefined && typeof options.production !== "boolean")
137
+ throw new Error("production must be a boolean.");
138
+ if (options.clean !== undefined && typeof options.clean !== "boolean")
139
+ throw new Error("clean must be a boolean.");
140
+ if (options.frozenLockfile !== undefined && typeof options.frozenLockfile !== "boolean")
141
+ throw new Error("frozenLockfile must be a boolean.");
142
+ }
143
+ //# sourceMappingURL=node-package-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-package-tasks.js","sourceRoot":"","sources":["../../../src/core/node-package-tasks.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @param {import('#types').Transport} transport
3
+ * @param {string} previousPath
4
+ * @param {string} releasePath
5
+ * @param {string[]} paths
6
+ * @returns {Promise<boolean>}
7
+ */
8
+ export function pathsChanged(transport: import("#types").Transport, previousPath: string, releasePath: string, paths: string[]): Promise<boolean>;
9
+ /**
10
+ * @param {string[]} paths
11
+ * @param {import('#types').TaskEntry} task
12
+ * @returns {import('#types').TaskEntry}
13
+ */
14
+ export function onlyIfChanged(paths: string[], task: import("#types").TaskEntry): import("#types").TaskEntry;
15
+ //# sourceMappingURL=path-change-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-change-gate.d.ts","sourceRoot":"","sources":["../../../src/core/path-change-gate.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wCANW,OAAO,QAAQ,EAAE,SAAS,gBAC1B,MAAM,eACN,MAAM,SACN,MAAM,EAAE,GACN,OAAO,CAAC,OAAO,CAAC,CAqB5B;AAkDD;;;;GAIG;AACH,qCAJW,MAAM,EAAE,QACR,OAAO,QAAQ,EAAE,SAAS,GACxB,OAAO,QAAQ,EAAE,SAAS,CAOtC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @param {import('#types').Transport} transport
3
+ * @param {string} previousPath
4
+ * @param {string} releasePath
5
+ * @param {string[]} paths
6
+ * @returns {Promise<boolean>}
7
+ */
8
+ export async function pathsChanged(transport, previousPath, releasePath, paths) {
9
+ if (!await transport.exists(previousPath))
10
+ return true;
11
+ for (const relPath of paths) {
12
+ const prevDir = `${previousPath}/${relPath}`;
13
+ const newDir = `${releasePath}/${relPath}`;
14
+ const prevExists = await transport.exists(prevDir);
15
+ const newExists = await transport.exists(newDir);
16
+ if (prevExists !== newExists)
17
+ return true;
18
+ if (!prevExists && !newExists)
19
+ continue;
20
+ const prevFiles = await walkDir(transport, prevDir);
21
+ const newFiles = await walkDir(transport, newDir);
22
+ if (prevFiles.size !== newFiles.size)
23
+ return true;
24
+ for (const [relFile, prevContent] of prevFiles) {
25
+ const newContent = newFiles.get(relFile);
26
+ if (newContent === undefined)
27
+ return true;
28
+ if (prevContent !== newContent)
29
+ return true;
30
+ }
31
+ }
32
+ return false;
33
+ }
34
+ /**
35
+ * @param {import('#types').Transport} transport
36
+ * @param {string} dir
37
+ * @returns {Promise<Map<string, string>>}
38
+ */
39
+ async function walkDir(transport, dir) {
40
+ const files = new Map();
41
+ await _walk(transport, dir, "", files);
42
+ return files;
43
+ }
44
+ /**
45
+ * @param {import('#types').Transport} transport
46
+ * @param {string} dir
47
+ * @param {string} prefix
48
+ * @param {Map<string, string>} files
49
+ * @returns {Promise<void>}
50
+ */
51
+ async function _walk(transport, dir, prefix, files) {
52
+ let entries;
53
+ try {
54
+ entries = await transport.list(dir);
55
+ }
56
+ catch {
57
+ return;
58
+ }
59
+ for (const entry of entries) {
60
+ const full = `${dir}/${entry}`;
61
+ const rel = prefix ? `${prefix}/${entry}` : entry;
62
+ try {
63
+ const stat = await transport.stat?.(full);
64
+ if (stat && stat.isDirectory?.()) {
65
+ await _walk(transport, full, rel, files);
66
+ }
67
+ else {
68
+ const content = await transport.readFile(full);
69
+ files.set(rel, content);
70
+ }
71
+ }
72
+ catch {
73
+ // stat not available — treat as file for now
74
+ try {
75
+ const content = await transport.readFile(full);
76
+ files.set(rel, content);
77
+ }
78
+ catch {
79
+ // skip unreadable entries
80
+ }
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * @param {string[]} paths
86
+ * @param {import('#types').TaskEntry} task
87
+ * @returns {import('#types').TaskEntry}
88
+ */
89
+ export function onlyIfChanged(paths, task) {
90
+ if (!Array.isArray(paths) || paths.length === 0 || !paths.every(p => typeof p === "string" && p.length > 0)) {
91
+ throw new Error("paths must be a non-empty array of non-empty strings");
92
+ }
93
+ return { ...task, onlyIfChanged: paths };
94
+ }
95
+ //# sourceMappingURL=path-change-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-change-gate.js","sourceRoot":"","sources":["../../../src/core/path-change-gate.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @param {import('#types').StageConfig} stage
3
+ * @param {string} [releaseId]
4
+ * @returns {import('#types').DeployPaths}
5
+ */
6
+ export function deployPaths(stage: import("#types").StageConfig, releaseId?: string): import("#types").DeployPaths;
7
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/core/paths.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,mCAJW,OAAO,QAAQ,EAAE,WAAW,cAC5B,MAAM,GACJ,OAAO,QAAQ,EAAE,WAAW,CAcxC"}
@@ -0,0 +1,20 @@
1
+ import path from "node:path";
2
+ /**
3
+ * @param {import('#types').StageConfig} stage
4
+ * @param {string} [releaseId]
5
+ * @returns {import('#types').DeployPaths}
6
+ */
7
+ export function deployPaths(stage, releaseId) {
8
+ const deployTo = stage.deployTo;
9
+ return {
10
+ deployTo,
11
+ releasesPath: path.join(deployTo, "releases"),
12
+ sharedPath: path.join(deployTo, "shared"),
13
+ currentPath: path.join(deployTo, "current"),
14
+ lockPath: path.join(deployTo, "shared", "rampway", "deploy.lock"),
15
+ statePath: path.join(deployTo, "shared", "rampway", "state.json"),
16
+ reportPath: path.join(deployTo, "shared", "log", "rampway-deployments.jsonl"),
17
+ releasePath: releaseId ? path.join(deployTo, "releases", releaseId) : undefined
18
+ };
19
+ }
20
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/paths.js"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAK,EAAE,SAAS;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;IAC/B,OAAO;QACL,QAAQ;QACR,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC7C,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACzC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC3C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;QACjE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC;QACjE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,CAAC;QAC7E,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;KAChF,CAAA;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @param {unknown} key
3
+ * @returns {boolean}
4
+ */
5
+ export function isSecretKey(key: unknown): boolean;
6
+ /**
7
+ * @param {unknown} key
8
+ * @param {unknown} value
9
+ * @returns {string}
10
+ */
11
+ export function redactValue(key: unknown, value: unknown): string;
12
+ /**
13
+ * @param {Record<string, string>} [env]
14
+ * @returns {Record<string, string>}
15
+ */
16
+ export function redactEnv(env?: Record<string, string>): Record<string, string>;
17
+ /**
18
+ * @param {string} text
19
+ * @returns {string}
20
+ */
21
+ export function redactText(text: string): string;
22
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../../src/core/redaction.js"],"names":[],"mappings":"AAIA;;;GAGG;AACH,iCAHW,OAAO,GACL,OAAO,CAInB;AAED;;;;GAIG;AACH,iCAJW,OAAO,SACP,OAAO,GACL,MAAM,CAKlB;AAED;;;GAGG;AACH,gCAHW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOlC;AAED;;;GAGG;AACH,iCAHW,MAAM,GACJ,MAAM,CAIlB"}
@@ -0,0 +1,39 @@
1
+ const SECRET_KEY_PATTERN = /(token|password|secret|key|cookie|authorization)/iu;
2
+ const SECRET_ASSIGNMENT_PATTERN = /((?:token|password|secret|key|cookie|authorization)[A-Z0-9_\-]*\s*=\s*)([^\s]+)/giu;
3
+ const HTTPS_USERINFO_PATTERN = /(https?:\/\/)[^/@\s]+@/giu;
4
+ /**
5
+ * @param {unknown} key
6
+ * @returns {boolean}
7
+ */
8
+ export function isSecretKey(key) {
9
+ return SECRET_KEY_PATTERN.test(String(key));
10
+ }
11
+ /**
12
+ * @param {unknown} key
13
+ * @param {unknown} value
14
+ * @returns {string}
15
+ */
16
+ export function redactValue(key, value) {
17
+ if (isSecretKey(key))
18
+ return "[REDACTED]";
19
+ return String(value);
20
+ }
21
+ /**
22
+ * @param {Record<string, string>} [env]
23
+ * @returns {Record<string, string>}
24
+ */
25
+ export function redactEnv(env = {}) {
26
+ /** @type {Record<string, string>} */
27
+ const redacted = {};
28
+ for (const [key, value] of Object.entries(env))
29
+ redacted[key] = redactValue(key, value);
30
+ return redacted;
31
+ }
32
+ /**
33
+ * @param {string} text
34
+ * @returns {string}
35
+ */
36
+ export function redactText(text) {
37
+ return String(text).replace(SECRET_ASSIGNMENT_PATTERN, "$1[REDACTED]").replace(HTTPS_USERINFO_PATTERN, "$1[REDACTED]@");
38
+ }
39
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../../src/core/redaction.js"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,oDAAoD,CAAA;AAC/E,MAAM,yBAAyB,GAAG,oFAAoF,CAAA;AACtH,MAAM,sBAAsB,GAAG,2BAA2B,CAAA;AAE1D;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG;IAC7B,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,EAAE,KAAK;IACpC,IAAI,WAAW,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAA;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAG,GAAG,EAAE;IAChC,qCAAqC;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACvF,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAI;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAA;AACzH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @param {Date} [date]
3
+ * @returns {string}
4
+ */
5
+ export function releaseIdFromDate(date?: Date): string;
6
+ //# sourceMappingURL=release-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-id.d.ts","sourceRoot":"","sources":["../../../src/core/release-id.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH,yCAHW,IAAI,GACF,MAAM,CAgBlB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @param {Date} [date]
3
+ * @returns {string}
4
+ */
5
+ export function releaseIdFromDate(date = new Date()) {
6
+ /**
7
+ * @param {number} value
8
+ * @returns {string}
9
+ */
10
+ const pad = value => String(value).padStart(2, "0");
11
+ return [
12
+ date.getUTCFullYear(),
13
+ pad(date.getUTCMonth() + 1),
14
+ pad(date.getUTCDate()),
15
+ pad(date.getUTCHours()),
16
+ pad(date.getUTCMinutes()),
17
+ pad(date.getUTCSeconds())
18
+ ].join("");
19
+ }
20
+ //# sourceMappingURL=release-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-id.js","sourceRoot":"","sources":["../../../src/core/release-id.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE;IACjD;;;OAGG;IACH,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACnD,OAAO;QACL,IAAI,CAAC,cAAc,EAAE;QACrB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;KAC1B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACZ,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @param {import('#types').Transport} transport
3
+ * @param {import('#types').StageConfig} stage
4
+ * @returns {Promise<void>}
5
+ */
6
+ export function ensureBaseDirs(transport: import("#types").Transport, stage: import("#types").StageConfig): Promise<void>;
7
+ /**
8
+ * @param {import('#types').Transport} transport
9
+ * @param {import('#types').StageConfig} stage
10
+ * @param {string} releasePath
11
+ * @returns {Promise<void>}
12
+ */
13
+ export function prepareSharedLinks(transport: import("#types").Transport, stage: import("#types").StageConfig, releasePath: string): Promise<void>;
14
+ /**
15
+ * @param {import('#types').Transport} transport
16
+ * @param {import('#types').StageConfig} stage
17
+ * @param {string} releasePath
18
+ * @returns {Promise<void>}
19
+ */
20
+ export function publishCurrent(transport: import("#types").Transport, stage: import("#types").StageConfig, releasePath: string): Promise<void>;
21
+ /**
22
+ * @param {import('#types').Transport} transport
23
+ * @param {import('#types').StageConfig} stage
24
+ * @returns {Promise<string[]>}
25
+ */
26
+ export function listReleases(transport: import("#types").Transport, stage: import("#types").StageConfig): Promise<string[]>;
27
+ /**
28
+ * @param {import('#types').Transport} transport
29
+ * @param {import('#types').StageConfig} stage
30
+ * @param {{keep?: number}} [opts]
31
+ * @returns {Promise<string[]>}
32
+ */
33
+ export function cleanupReleases(transport: import("#types").Transport, stage: import("#types").StageConfig, { keep }?: {
34
+ keep?: number;
35
+ }): Promise<string[]>;
36
+ /**
37
+ * @param {import('#types').Transport} transport
38
+ * @param {import('#types').StageConfig} stage
39
+ * @param {string|null} [currentRelease]
40
+ * @returns {Promise<string|undefined>}
41
+ */
42
+ export function previousRelease(transport: import("#types").Transport, stage: import("#types").StageConfig, currentRelease?: string | null): Promise<string | undefined>;
43
+ /**
44
+ * @param {import('#types').Transport} transport
45
+ * @param {import('#types').StageConfig} stage
46
+ * @returns {Promise<string|null>}
47
+ */
48
+ export function currentReleaseId(transport: import("#types").Transport, stage: import("#types").StageConfig): Promise<string | null>;
49
+ //# sourceMappingURL=release-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-manager.d.ts","sourceRoot":"","sources":["../../../src/core/release-manager.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,0CAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQzB;AAED;;;;;GAKG;AACH,8CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAwBzB;AAWD;;;;;GAKG;AACH,0CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAOzB;AAED;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAK7B;AAED;;;;;GAKG;AACH,2CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,aAC5B;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAU7B;AAED;;;;;GAKG;AACH,2CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,mBAC5B,MAAM,GAAC,IAAI,GACT,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CAOrC;AAED;;;;GAIG;AACH,4CAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC,CAMhC"}
@@ -0,0 +1,115 @@
1
+ import path from "node:path";
2
+ import { deployPaths } from "./paths.js";
3
+ /**
4
+ * @param {import('#types').Transport} transport
5
+ * @param {import('#types').StageConfig} stage
6
+ * @returns {Promise<void>}
7
+ */
8
+ export async function ensureBaseDirs(transport, stage) {
9
+ const paths = deployPaths(stage);
10
+ await transport.mkdirp(paths.releasesPath);
11
+ await transport.mkdirp(paths.sharedPath);
12
+ await transport.mkdirp(path.dirname(paths.reportPath));
13
+ await transport.mkdirp(path.dirname(paths.statePath));
14
+ }
15
+ /**
16
+ * @param {import('#types').Transport} transport
17
+ * @param {import('#types').StageConfig} stage
18
+ * @param {string} releasePath
19
+ * @returns {Promise<void>}
20
+ */
21
+ export async function prepareSharedLinks(transport, stage, releasePath) {
22
+ for (const entry of stage.linkedDirs) {
23
+ const dir = linkedEntry(entry);
24
+ const sharedTarget = path.join(deployPaths(stage).sharedPath, dir.path);
25
+ await transport.mkdirp(sharedTarget);
26
+ const releaseTarget = path.join(releasePath, dir.path);
27
+ await transport.rm(releaseTarget);
28
+ await transport.mkdirp(path.dirname(releaseTarget));
29
+ await transport.symlink(sharedTarget, releaseTarget, "dir");
30
+ }
31
+ for (const entry of stage.linkedFiles) {
32
+ const file = linkedEntry(entry);
33
+ const sharedTarget = path.join(deployPaths(stage).sharedPath, file.path);
34
+ if (!await transport.exists(sharedTarget)) {
35
+ if (file.required)
36
+ throw new Error(`Required shared file is missing: ${sharedTarget}`);
37
+ continue;
38
+ }
39
+ const releaseTarget = path.join(releasePath, file.path);
40
+ await transport.rm(releaseTarget);
41
+ await transport.mkdirp(path.dirname(releaseTarget));
42
+ await transport.symlink(sharedTarget, releaseTarget);
43
+ }
44
+ }
45
+ /**
46
+ * @param {string|import('#types').LinkedEntry} entry
47
+ * @returns {import('#types').LinkedEntry}
48
+ */
49
+ function linkedEntry(entry) {
50
+ if (typeof entry === "string")
51
+ return { path: entry, required: true };
52
+ return { path: entry.path, required: entry.required ?? true };
53
+ }
54
+ /**
55
+ * @param {import('#types').Transport} transport
56
+ * @param {import('#types').StageConfig} stage
57
+ * @param {string} releasePath
58
+ * @returns {Promise<void>}
59
+ */
60
+ export async function publishCurrent(transport, stage, releasePath) {
61
+ const paths = deployPaths(stage);
62
+ const pending = path.join(paths.deployTo, `.current-${Date.now()}`);
63
+ await transport.symlink(releasePath, pending, "dir");
64
+ await transport.rename(pending, paths.currentPath);
65
+ }
66
+ /**
67
+ * @param {import('#types').Transport} transport
68
+ * @param {import('#types').StageConfig} stage
69
+ * @returns {Promise<string[]>}
70
+ */
71
+ export async function listReleases(transport, stage) {
72
+ const releases = await transport.list(deployPaths(stage).releasesPath);
73
+ return releases.filter(release => /^\d{14}$/.test(release)).sort();
74
+ }
75
+ /**
76
+ * @param {import('#types').Transport} transport
77
+ * @param {import('#types').StageConfig} stage
78
+ * @param {{keep?: number}} [opts]
79
+ * @returns {Promise<string[]>}
80
+ */
81
+ export async function cleanupReleases(transport, stage, { keep = stage.keepReleases } = {}) {
82
+ const paths = deployPaths(stage);
83
+ const releases = await listReleases(transport, stage);
84
+ let currentRelease = null;
85
+ if (await transport.exists(paths.currentPath))
86
+ currentRelease = path.basename(await transport.readlink(paths.currentPath));
87
+ const removable = releases.slice(0, Math.max(0, releases.length - keep)).filter(release => release !== currentRelease);
88
+ for (const release of removable)
89
+ await transport.rm(path.join(paths.releasesPath, release));
90
+ return removable;
91
+ }
92
+ /**
93
+ * @param {import('#types').Transport} transport
94
+ * @param {import('#types').StageConfig} stage
95
+ * @param {string|null} [currentRelease]
96
+ * @returns {Promise<string|undefined>}
97
+ */
98
+ export async function previousRelease(transport, stage, currentRelease = null) {
99
+ const releases = await listReleases(transport, stage);
100
+ const current = currentRelease ?? await currentReleaseId(transport, stage);
101
+ const candidates = releases.filter(release => release !== current);
102
+ return candidates.at(-1);
103
+ }
104
+ /**
105
+ * @param {import('#types').Transport} transport
106
+ * @param {import('#types').StageConfig} stage
107
+ * @returns {Promise<string|null>}
108
+ */
109
+ export async function currentReleaseId(transport, stage) {
110
+ const currentPath = deployPaths(stage).currentPath;
111
+ if (!await transport.exists(currentPath))
112
+ return null;
113
+ return path.basename(await transport.readlink(currentPath));
114
+ }
115
+ //# sourceMappingURL=release-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-manager.js","sourceRoot":"","sources":["../../../src/core/release-manager.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @param {import('#types').StageConfig} stage
3
+ * @returns {import('#types').TaskEntry[]}
4
+ */
5
+ export function taskCommands(stage: import("#types").StageConfig): import("#types").TaskEntry[];
6
+ /**
7
+ * @param {import('#types').Transport} transport
8
+ * @param {import('#types').StageConfig} stage
9
+ * @param {string} releasePath
10
+ * @param {{previousReleasePath?: string|null}} [opts]
11
+ * @returns {Promise<import('#types').TaskResult[]>}
12
+ */
13
+ export function runTasks(transport: import("#types").Transport, stage: import("#types").StageConfig, releasePath: string, { previousReleasePath }?: {
14
+ previousReleasePath?: string | null;
15
+ }): Promise<import("#types").TaskResult[]>;
16
+ /**
17
+ * @param {string} name
18
+ * @param {string|import('#types').TaskEntry|Array<string|import('#types').TaskEntry>} entries
19
+ * @returns {import('#types').TaskEntry[]}
20
+ */
21
+ export function commandsForEntries(name: string, entries: string | import("#types").TaskEntry | Array<string | import("#types").TaskEntry>): import("#types").TaskEntry[];
22
+ /**
23
+ * @param {string} name
24
+ * @param {string|import('#types').TaskEntry} entry
25
+ * @returns {import('#types').TaskEntry}
26
+ */
27
+ export function normalizeTask(name: string, entry: string | import("#types").TaskEntry): import("#types").TaskEntry;
28
+ /**
29
+ * @param {import('#types').Transport} transport
30
+ * @param {import('#types').TaskEntry} task
31
+ * @param {string} cwd
32
+ * @param {{previousReleasePath?: string|null}} [opts]
33
+ * @returns {Promise<import('#types').TaskResult>}
34
+ */
35
+ export function runTask(transport: import("#types").Transport, task: import("#types").TaskEntry, cwd: string, { previousReleasePath }?: {
36
+ previousReleasePath?: string | null;
37
+ }): Promise<import("#types").TaskResult>;
38
+ //# sourceMappingURL=task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../../../src/core/task-runner.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,QAAQ,EAAE,SAAS,EAAE,CAQxC;AAED;;;;;;GAMG;AACH,oCANW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,4BACN;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAC,IAAI,CAAA;CAAC,GACjC,OAAO,CAAC,OAAO,QAAQ,EAAE,UAAU,EAAE,CAAC,CAQlD;AAED;;;;GAIG;AACH,yCAJW,MAAM,WACN,MAAM,GAAC,OAAO,QAAQ,EAAE,SAAS,GAAC,KAAK,CAAC,MAAM,GAAC,OAAO,QAAQ,EAAE,SAAS,CAAC,GACxE,OAAO,QAAQ,EAAE,SAAS,EAAE,CASxC;AAED;;;;GAIG;AACH,oCAJW,MAAM,SACN,MAAM,GAAC,OAAO,QAAQ,EAAE,SAAS,GAC/B,OAAO,QAAQ,EAAE,SAAS,CAOtC;AAED;;;;;;GAMG;AACH,mCANW,OAAO,QAAQ,EAAE,SAAS,QAC1B,OAAO,QAAQ,EAAE,SAAS,OAC1B,MAAM,4BACN;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAC,IAAI,CAAA;CAAC,GACjC,OAAO,CAAC,OAAO,QAAQ,EAAE,UAAU,CAAC,CAqBhD"}