@factiii/stack 0.1.46 → 0.1.48
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.
- package/dist/cli/deploy.d.ts +3 -3
- package/dist/cli/deploy.d.ts.map +1 -1
- package/dist/cli/deploy.js +30 -3
- package/dist/cli/deploy.js.map +1 -1
- package/dist/cli/fix.d.ts +2 -2
- package/dist/cli/fix.js +2 -2
- package/dist/cli/scan.d.ts +6 -7
- package/dist/cli/scan.d.ts.map +1 -1
- package/dist/cli/scan.js +6 -7
- package/dist/cli/scan.js.map +1 -1
- package/dist/plugins/frameworks/prisma-trpc/index.d.ts.map +1 -1
- package/dist/plugins/frameworks/prisma-trpc/index.js +2 -1
- package/dist/plugins/frameworks/prisma-trpc/index.js.map +1 -1
- package/dist/plugins/pipelines/factiii/index.d.ts +0 -4
- package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/index.js +0 -6
- package/dist/plugins/pipelines/factiii/index.js.map +1 -1
- package/dist/plugins/pipelines/factiii/staging.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/staging.js +2 -1
- package/dist/plugins/pipelines/factiii/staging.js.map +1 -1
- package/dist/plugins/pipelines/factiii/utils/workflows.d.ts +0 -4
- package/dist/plugins/pipelines/factiii/utils/workflows.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/utils/workflows.js +0 -36
- package/dist/plugins/pipelines/factiii/utils/workflows.js.map +1 -1
- package/dist/plugins/servers/mac/scanfix/config.d.ts.map +1 -1
- package/dist/plugins/servers/mac/scanfix/config.js +2 -1
- package/dist/plugins/servers/mac/scanfix/config.js.map +1 -1
- package/dist/plugins/servers/mac/scanfix/containers.d.ts.map +1 -1
- package/dist/plugins/servers/mac/scanfix/containers.js +3 -2
- package/dist/plugins/servers/mac/scanfix/containers.js.map +1 -1
- package/dist/utils/git-repo-info.d.ts +15 -0
- package/dist/utils/git-repo-info.d.ts.map +1 -0
- package/dist/utils/git-repo-info.js +34 -0
- package/dist/utils/git-repo-info.js.map +1 -0
- package/dist/utils/github-status.d.ts +3 -6
- package/dist/utils/github-status.d.ts.map +1 -1
- package/dist/utils/github-status.js +3 -3
- package/dist/utils/github-status.js.map +1 -1
- package/dist/utils/secret-prompts.d.ts.map +1 -1
- package/dist/utils/secret-prompts.js +17 -26
- package/dist/utils/secret-prompts.js.map +1 -1
- package/dist/utils/ssh-deploy.d.ts.map +1 -1
- package/dist/utils/ssh-deploy.js +16 -26
- package/dist/utils/ssh-deploy.js.map +1 -1
- package/package.json +1 -1
- package/dist/plugins/pipelines/factiii/github-secrets-store.d.ts +0 -65
- package/dist/plugins/pipelines/factiii/github-secrets-store.d.ts.map +0 -1
- package/dist/plugins/pipelines/factiii/github-secrets-store.js +0 -221
- package/dist/plugins/pipelines/factiii/github-secrets-store.js.map +0 -1
package/dist/utils/ssh-deploy.js
CHANGED
|
@@ -93,27 +93,22 @@ class SSHDeploy {
|
|
|
93
93
|
*/
|
|
94
94
|
sshExec(command) {
|
|
95
95
|
const keyPath = this.keyPath ?? this.setupSSHKey();
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
'ssh',
|
|
99
|
-
'-i', `"${keyPath}"`,
|
|
96
|
+
const result = (0, child_process_1.spawnSync)('ssh', [
|
|
97
|
+
'-i', keyPath,
|
|
100
98
|
'-o', 'StrictHostKeyChecking=no',
|
|
101
99
|
'-o', 'UserKnownHostsFile=/dev/null',
|
|
102
100
|
'-o', 'BatchMode=yes',
|
|
103
101
|
'-o', 'ConnectTimeout=30',
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
]
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
catch (e) {
|
|
114
|
-
const error = e;
|
|
115
|
-
throw new Error(`SSH command failed: ${error.stderr || error.message}`);
|
|
102
|
+
this.user + '@' + this.host,
|
|
103
|
+
command,
|
|
104
|
+
], {
|
|
105
|
+
encoding: 'utf8',
|
|
106
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
107
|
+
});
|
|
108
|
+
if (result.status !== 0) {
|
|
109
|
+
throw new Error('SSH command failed: ' + (result.stderr || 'exit code ' + result.status));
|
|
116
110
|
}
|
|
111
|
+
return result.stdout ?? '';
|
|
117
112
|
}
|
|
118
113
|
/**
|
|
119
114
|
* Test SSH connection to server
|
|
@@ -164,16 +159,11 @@ class SSHDeploy {
|
|
|
164
159
|
this.setupSSHKey();
|
|
165
160
|
const envContent = this.envToFileContent(envVars);
|
|
166
161
|
const envFileName = `.env.${stage}`;
|
|
167
|
-
const factiiiDir =
|
|
162
|
+
const factiiiDir = `$HOME/.factiii/${this.repoName}`;
|
|
168
163
|
const envFilePath = `${factiiiDir}/${envFileName}`;
|
|
169
164
|
// Create directory if it doesn't exist, then write the file
|
|
170
|
-
//
|
|
171
|
-
const
|
|
172
|
-
.replace(/\\/g, '\\\\')
|
|
173
|
-
.replace(/'/g, "'\\''");
|
|
174
|
-
const command = `mkdir -p ${factiiiDir} && cat > ${envFilePath} << 'FACTIII_ENV_EOF'
|
|
175
|
-
${envContent}FACTIII_ENV_EOF
|
|
176
|
-
chmod 600 ${envFilePath}`;
|
|
165
|
+
// Quoted heredoc delimiter ('FACTIII_ENV_EOF') prevents shell expansion
|
|
166
|
+
const command = 'mkdir -p ' + factiiiDir + ' && cat > ' + envFilePath + " << 'FACTIII_ENV_EOF'\n" + envContent + 'FACTIII_ENV_EOF\nchmod 600 ' + envFilePath;
|
|
177
167
|
this.sshExec(command);
|
|
178
168
|
const keyCount = Object.keys(envVars).length;
|
|
179
169
|
return {
|
|
@@ -221,7 +211,7 @@ chmod 600 ${envFilePath}`;
|
|
|
221
211
|
try {
|
|
222
212
|
this.setupSSHKey();
|
|
223
213
|
const envFileName = `.env.${stage}`;
|
|
224
|
-
const factiiiDir =
|
|
214
|
+
const factiiiDir = `$HOME/.factiii/${this.repoName}`;
|
|
225
215
|
const envFilePath = `${factiiiDir}/${envFileName}`;
|
|
226
216
|
const command = `test -f ${envFilePath} && echo "exists" || echo "missing"`;
|
|
227
217
|
const result = this.sshExec(command).trim();
|
|
@@ -241,7 +231,7 @@ chmod 600 ${envFilePath}`;
|
|
|
241
231
|
try {
|
|
242
232
|
this.setupSSHKey();
|
|
243
233
|
const envFileName = `.env.${stage}`;
|
|
244
|
-
const factiiiDir =
|
|
234
|
+
const factiiiDir = `$HOME/.factiii/${this.repoName}`;
|
|
245
235
|
const envFilePath = `${factiiiDir}/${envFileName}`;
|
|
246
236
|
// Cross-platform: macOS uses `stat -f %m`, Linux uses `stat -c %Y`
|
|
247
237
|
const command = `stat -f %m ${envFilePath} 2>/dev/null || stat -c %Y ${envFilePath} 2>/dev/null || echo "missing"`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-deploy.js","sourceRoot":"","sources":["../../src/utils/ssh-deploy.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,
|
|
1
|
+
{"version":3,"file":"ssh-deploy.js","sourceRoot":"","sources":["../../src/utils/ssh-deploy.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,iDAAoD;AACpD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAezB;;GAEG;AACH,MAAa,SAAS;IACV,IAAI,CAAS;IACb,IAAI,CAAS;IACb,UAAU,CAAS;IACnB,QAAQ,CAAS;IACjB,OAAO,GAAkB,IAAI,CAAC;IAEtC,YAAY,MAAuB;QAC/B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,WAAW;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3E,iDAAiD;QACjD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,GAAG,IAAI,IAAI,CAAC;QAChB,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa;QACjB,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACL,wBAAwB;YAC5B,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,OAAe;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnD,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE;YAC5B,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,mBAAmB;YACzB,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI;YAC3B,OAAO;SACV,EAAE;YACC,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAChB,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAA+B;QACpD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,qEAAqE;YACrE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrE,IAAI,WAAW,EAAE,CAAC;gBACd,mEAAmE;gBACnE,MAAM,OAAO,GAAG,KAAK;qBAChB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;qBACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;qBACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;YAClC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CACd,KAAyB,EACzB,OAA+B;QAE/B,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,QAAQ,KAAK,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;YAEnD,4DAA4D;YAC5D,wEAAwE;YACxE,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,yBAAyB,GAAG,UAAU,GAAG,6BAA6B,GAAG,WAAW,CAAC;YAE7J,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEtB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAC7C,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS,QAAQ,6BAA6B,WAAW,OAAO,IAAI,CAAC,IAAI,EAAE;aACvF,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aACpD,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,aAAqB;QACxC,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,MAAM,OAAO,GAAG,kBAAkB,aAAa,EAAE,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEtB,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,uBAAuB,aAAa,EAAE;aAClD,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aACpD,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAyB;QAC9C,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,MAAM,WAAW,GAAG,QAAQ,KAAK,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;YAEnD,MAAM,OAAO,GAAG,WAAW,WAAW,qCAAqC,CAAC;YAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAE5C,OAAO,MAAM,KAAK,QAAQ,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,KAAyB;QAC1C,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,MAAM,WAAW,GAAG,QAAQ,KAAK,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;YAEnD,mEAAmE;YACnE,MAAM,OAAO,GAAG,cAAc,WAAW,8BAA8B,WAAW,gCAAgC,CAAC;YACnH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAE5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC7B,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,OAAO;gBACH,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;aACvC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;CACJ;AAjOD,8BAiOC;AAED,kBAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub Secrets Store
|
|
3
|
-
*
|
|
4
|
-
* Utility for managing GitHub repository secrets via the GitHub API.
|
|
5
|
-
* Used by the pipeline plugin and secrets CLI command.
|
|
6
|
-
*/
|
|
7
|
-
interface RepoInfo {
|
|
8
|
-
owner: string;
|
|
9
|
-
repo: string;
|
|
10
|
-
}
|
|
11
|
-
interface SetSecretResult {
|
|
12
|
-
success: boolean;
|
|
13
|
-
error?: string;
|
|
14
|
-
}
|
|
15
|
-
interface CheckSecretsResult {
|
|
16
|
-
existing?: string[];
|
|
17
|
-
status?: Record<string, boolean>;
|
|
18
|
-
missing?: string[];
|
|
19
|
-
error?: string;
|
|
20
|
-
}
|
|
21
|
-
interface PublicKeyResponse {
|
|
22
|
-
key: string;
|
|
23
|
-
key_id: string;
|
|
24
|
-
}
|
|
25
|
-
interface GitHubSecretsStoreConfig {
|
|
26
|
-
token?: string;
|
|
27
|
-
owner?: string;
|
|
28
|
-
repo?: string;
|
|
29
|
-
}
|
|
30
|
-
export declare class GitHubSecretsStore {
|
|
31
|
-
private token?;
|
|
32
|
-
private owner?;
|
|
33
|
-
private repo?;
|
|
34
|
-
constructor(config?: GitHubSecretsStoreConfig);
|
|
35
|
-
/**
|
|
36
|
-
* Get repository info from git remote
|
|
37
|
-
*/
|
|
38
|
-
static getRepoInfo(): RepoInfo | null;
|
|
39
|
-
/**
|
|
40
|
-
* Make GitHub API request
|
|
41
|
-
*/
|
|
42
|
-
private request;
|
|
43
|
-
/**
|
|
44
|
-
* Get repository public key for encrypting secrets
|
|
45
|
-
*/
|
|
46
|
-
getPublicKey(): Promise<PublicKeyResponse>;
|
|
47
|
-
/**
|
|
48
|
-
* Encrypt a secret value using the repository's public key
|
|
49
|
-
*/
|
|
50
|
-
encryptSecret(value: string, _publicKey: string): string;
|
|
51
|
-
/**
|
|
52
|
-
* Set a secret in the repository
|
|
53
|
-
*/
|
|
54
|
-
setSecret(name: string, value: string): Promise<SetSecretResult>;
|
|
55
|
-
/**
|
|
56
|
-
* Check which secrets exist
|
|
57
|
-
*/
|
|
58
|
-
checkSecrets(secretNames: string[]): Promise<CheckSecretsResult>;
|
|
59
|
-
/**
|
|
60
|
-
* Delete a secret
|
|
61
|
-
*/
|
|
62
|
-
deleteSecret(name: string): Promise<SetSecretResult>;
|
|
63
|
-
}
|
|
64
|
-
export {};
|
|
65
|
-
//# sourceMappingURL=github-secrets-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-secrets-store.d.ts","sourceRoot":"","sources":["../../../../src/plugins/pipelines/factiii/github-secrets-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,UAAU,wBAAwB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,IAAI,CAAC,CAAS;gBAEV,MAAM,GAAE,wBAA6B;IAejD;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,QAAQ,GAAG,IAAI;IAuBrC;;OAEG;YACW,OAAO;IAwDrB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAKhD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQxD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAwBtE;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6BtE;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAY3D"}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* GitHub Secrets Store
|
|
4
|
-
*
|
|
5
|
-
* Utility for managing GitHub repository secrets via the GitHub API.
|
|
6
|
-
* Used by the pipeline plugin and secrets CLI command.
|
|
7
|
-
*/
|
|
8
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
-
if (k2 === undefined) k2 = k;
|
|
10
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
-
}
|
|
14
|
-
Object.defineProperty(o, k2, desc);
|
|
15
|
-
}) : (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
o[k2] = m[k];
|
|
18
|
-
}));
|
|
19
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
-
}) : function(o, v) {
|
|
22
|
-
o["default"] = v;
|
|
23
|
-
});
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.GitHubSecretsStore = void 0;
|
|
43
|
-
const child_process_1 = require("child_process");
|
|
44
|
-
const https = __importStar(require("https"));
|
|
45
|
-
class GitHubSecretsStore {
|
|
46
|
-
token;
|
|
47
|
-
owner;
|
|
48
|
-
repo;
|
|
49
|
-
constructor(config = {}) {
|
|
50
|
-
this.token = config.token ?? process.env.GITHUB_TOKEN;
|
|
51
|
-
this.owner = config.owner;
|
|
52
|
-
this.repo = config.repo;
|
|
53
|
-
// Auto-detect from git if not provided
|
|
54
|
-
if (!this.owner || !this.repo) {
|
|
55
|
-
const repoInfo = GitHubSecretsStore.getRepoInfo();
|
|
56
|
-
if (repoInfo) {
|
|
57
|
-
this.owner = this.owner ?? repoInfo.owner;
|
|
58
|
-
this.repo = this.repo ?? repoInfo.repo;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get repository info from git remote
|
|
64
|
-
*/
|
|
65
|
-
static getRepoInfo() {
|
|
66
|
-
try {
|
|
67
|
-
const remote = (0, child_process_1.execSync)('git config --get remote.origin.url', {
|
|
68
|
-
encoding: 'utf8',
|
|
69
|
-
stdio: ['pipe', 'pipe', 'ignore'],
|
|
70
|
-
}).trim();
|
|
71
|
-
// Parse GitHub URL (supports both HTTPS and SSH)
|
|
72
|
-
const match = remote.match(/github\.com[:/]([^/]+)\/(.+?)(\.git)?$/);
|
|
73
|
-
if (match && match[1] && match[2]) {
|
|
74
|
-
return {
|
|
75
|
-
owner: match[1],
|
|
76
|
-
repo: match[2],
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Make GitHub API request
|
|
87
|
-
*/
|
|
88
|
-
async request(method, urlPath, body = null) {
|
|
89
|
-
return new Promise((resolve, reject) => {
|
|
90
|
-
const options = {
|
|
91
|
-
hostname: 'api.github.com',
|
|
92
|
-
port: 443,
|
|
93
|
-
path: urlPath,
|
|
94
|
-
method: method,
|
|
95
|
-
headers: {
|
|
96
|
-
Authorization: `Bearer ${this.token}`,
|
|
97
|
-
'User-Agent': 'factiii-stack',
|
|
98
|
-
Accept: 'application/vnd.github+json',
|
|
99
|
-
'X-GitHub-Api-Version': '2022-11-28',
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
if (body) {
|
|
103
|
-
const bodyStr = JSON.stringify(body);
|
|
104
|
-
options.headers['Content-Type'] = 'application/json';
|
|
105
|
-
options.headers['Content-Length'] =
|
|
106
|
-
Buffer.byteLength(bodyStr).toString();
|
|
107
|
-
}
|
|
108
|
-
const req = https.request(options, (res) => {
|
|
109
|
-
let data = '';
|
|
110
|
-
res.on('data', (chunk) => {
|
|
111
|
-
data += chunk.toString();
|
|
112
|
-
});
|
|
113
|
-
res.on('end', () => {
|
|
114
|
-
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
115
|
-
try {
|
|
116
|
-
resolve(data ? JSON.parse(data) : {});
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
resolve({ raw: data });
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
reject(new Error(`GitHub API error: ${res.statusCode} ${data}`));
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
req.on('error', reject);
|
|
128
|
-
if (body) {
|
|
129
|
-
req.write(JSON.stringify(body));
|
|
130
|
-
}
|
|
131
|
-
req.end();
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Get repository public key for encrypting secrets
|
|
136
|
-
*/
|
|
137
|
-
async getPublicKey() {
|
|
138
|
-
const urlPath = `/repos/${this.owner}/${this.repo}/actions/secrets/public-key`;
|
|
139
|
-
return await this.request('GET', urlPath);
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Encrypt a secret value using the repository's public key
|
|
143
|
-
*/
|
|
144
|
-
encryptSecret(value, _publicKey) {
|
|
145
|
-
// Convert the public key from base64
|
|
146
|
-
// Note: This uses Node's crypto which may not be 100% compatible with libsodium
|
|
147
|
-
// For production, consider using the @octokit/core library with proper libsodium
|
|
148
|
-
// For now, return base64 encoded value (GitHub API will handle encryption)
|
|
149
|
-
return Buffer.from(value).toString('base64');
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Set a secret in the repository
|
|
153
|
-
*/
|
|
154
|
-
async setSecret(name, value) {
|
|
155
|
-
try {
|
|
156
|
-
// Get public key
|
|
157
|
-
const { key, key_id } = await this.getPublicKey();
|
|
158
|
-
// Encrypt the value
|
|
159
|
-
const encrypted = this.encryptSecret(value, key);
|
|
160
|
-
// Set the secret
|
|
161
|
-
const urlPath = `/repos/${this.owner}/${this.repo}/actions/secrets/${name}`;
|
|
162
|
-
await this.request('PUT', urlPath, {
|
|
163
|
-
encrypted_value: encrypted,
|
|
164
|
-
key_id: key_id,
|
|
165
|
-
});
|
|
166
|
-
return { success: true };
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
return {
|
|
170
|
-
success: false,
|
|
171
|
-
error: error instanceof Error ? error.message : String(error),
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Check which secrets exist
|
|
177
|
-
*/
|
|
178
|
-
async checkSecrets(secretNames) {
|
|
179
|
-
try {
|
|
180
|
-
const urlPath = `/repos/${this.owner}/${this.repo}/actions/secrets`;
|
|
181
|
-
const response = await this.request('GET', urlPath);
|
|
182
|
-
const existing = new Set(response.secrets?.map((s) => s.name) ?? []);
|
|
183
|
-
const status = {};
|
|
184
|
-
const missing = [];
|
|
185
|
-
for (const name of secretNames) {
|
|
186
|
-
status[name] = existing.has(name);
|
|
187
|
-
if (!existing.has(name)) {
|
|
188
|
-
missing.push(name);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return {
|
|
192
|
-
existing: Array.from(existing),
|
|
193
|
-
status,
|
|
194
|
-
missing,
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
return {
|
|
199
|
-
error: error instanceof Error ? error.message : String(error),
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Delete a secret
|
|
205
|
-
*/
|
|
206
|
-
async deleteSecret(name) {
|
|
207
|
-
try {
|
|
208
|
-
const urlPath = `/repos/${this.owner}/${this.repo}/actions/secrets/${name}`;
|
|
209
|
-
await this.request('DELETE', urlPath);
|
|
210
|
-
return { success: true };
|
|
211
|
-
}
|
|
212
|
-
catch (error) {
|
|
213
|
-
return {
|
|
214
|
-
success: false,
|
|
215
|
-
error: error instanceof Error ? error.message : String(error),
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
exports.GitHubSecretsStore = GitHubSecretsStore;
|
|
221
|
-
//# sourceMappingURL=github-secrets-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-secrets-store.js","sourceRoot":"","sources":["../../../../src/plugins/pipelines/factiii/github-secrets-store.ts"],"names":[],"mappings":"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"}
|