indraq_cli 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1191 -0
- package/dist/cli/create-program.d.ts +3 -0
- package/dist/cli/create-program.d.ts.map +1 -0
- package/dist/cli/create-program.js +28 -0
- package/dist/cli/create-program.js.map +1 -0
- package/dist/cli/doctor.command.d.ts +2 -0
- package/dist/cli/doctor.command.d.ts.map +1 -0
- package/dist/cli/doctor.command.js +32 -0
- package/dist/cli/doctor.command.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/deploy/commands/build.command.d.ts +6 -0
- package/dist/modules/deploy/commands/build.command.d.ts.map +1 -0
- package/dist/modules/deploy/commands/build.command.js +127 -0
- package/dist/modules/deploy/commands/build.command.js.map +1 -0
- package/dist/modules/deploy/commands/configure.command.d.ts +2 -0
- package/dist/modules/deploy/commands/configure.command.d.ts.map +1 -0
- package/dist/modules/deploy/commands/configure.command.js +404 -0
- package/dist/modules/deploy/commands/configure.command.js.map +1 -0
- package/dist/modules/deploy/config/deployment-config.d.ts +29 -0
- package/dist/modules/deploy/config/deployment-config.d.ts.map +1 -0
- package/dist/modules/deploy/config/deployment-config.js +164 -0
- package/dist/modules/deploy/config/deployment-config.js.map +1 -0
- package/dist/modules/deploy/index.d.ts +3 -0
- package/dist/modules/deploy/index.d.ts.map +1 -0
- package/dist/modules/deploy/index.js +57 -0
- package/dist/modules/deploy/index.js.map +1 -0
- package/dist/modules/deploy/services/docker.service.d.ts +7 -0
- package/dist/modules/deploy/services/docker.service.d.ts.map +1 -0
- package/dist/modules/deploy/services/docker.service.js +67 -0
- package/dist/modules/deploy/services/docker.service.js.map +1 -0
- package/dist/modules/deploy/services/jenkins.service.d.ts +23 -0
- package/dist/modules/deploy/services/jenkins.service.d.ts.map +1 -0
- package/dist/modules/deploy/services/jenkins.service.js +273 -0
- package/dist/modules/deploy/services/jenkins.service.js.map +1 -0
- package/dist/shared/git/git.service.d.ts +11 -0
- package/dist/shared/git/git.service.d.ts.map +1 -0
- package/dist/shared/git/git.service.js +110 -0
- package/dist/shared/git/git.service.js.map +1 -0
- package/dist/shared/github/github-api.service.d.ts +8 -0
- package/dist/shared/github/github-api.service.d.ts.map +1 -0
- package/dist/shared/github/github-api.service.js +77 -0
- package/dist/shared/github/github-api.service.js.map +1 -0
- package/dist/shared/github/github-auth.service.d.ts +10 -0
- package/dist/shared/github/github-auth.service.d.ts.map +1 -0
- package/dist/shared/github/github-auth.service.js +79 -0
- package/dist/shared/github/github-auth.service.js.map +1 -0
- package/dist/shared/runtime/runtime-doctor.d.ts +8 -0
- package/dist/shared/runtime/runtime-doctor.d.ts.map +1 -0
- package/dist/shared/runtime/runtime-doctor.js +31 -0
- package/dist/shared/runtime/runtime-doctor.js.map +1 -0
- package/docs/assets/indraq-logo.png +0 -0
- package/docs/assets/indraq-mark.png +0 -0
- package/package.json +54 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDeployModule = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const build_command_1 = require("./commands/build.command");
|
|
6
|
+
const configure_command_1 = require("./commands/configure.command");
|
|
7
|
+
const parseEnvironment = (value) => {
|
|
8
|
+
if (value === 'dev' || value === 'development') {
|
|
9
|
+
return 'dev';
|
|
10
|
+
}
|
|
11
|
+
if (value === 'prod' || value === 'production') {
|
|
12
|
+
return 'prod';
|
|
13
|
+
}
|
|
14
|
+
throw new commander_1.InvalidArgumentError('Environment must be dev/development or prod/production.');
|
|
15
|
+
};
|
|
16
|
+
const runConfigure = async () => {
|
|
17
|
+
await (0, configure_command_1.configure)();
|
|
18
|
+
};
|
|
19
|
+
const runBuild = async (environment) => {
|
|
20
|
+
await (0, build_command_1.build)({ env: environment });
|
|
21
|
+
};
|
|
22
|
+
const addDeploymentShortcut = (program, name, description, environment) => {
|
|
23
|
+
program
|
|
24
|
+
.command(name)
|
|
25
|
+
.description(description)
|
|
26
|
+
.action(async () => {
|
|
27
|
+
await runBuild(environment);
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const registerDeployModule = (program) => {
|
|
31
|
+
// Structured command surface retained for discoverability and automation.
|
|
32
|
+
const deploy = program
|
|
33
|
+
.command('deploy')
|
|
34
|
+
.description('Build Docker images, push them to GHCR, and run Jenkins pipelines.');
|
|
35
|
+
deploy
|
|
36
|
+
.command('configure')
|
|
37
|
+
.description('Configure image, GitHub owner, Dockerfile, and Jenkins CLI access.')
|
|
38
|
+
.action(runConfigure);
|
|
39
|
+
deploy
|
|
40
|
+
.command('build')
|
|
41
|
+
.description('Build and push a configured Docker image.')
|
|
42
|
+
.requiredOption('-e, --env <environment>', 'Environment: dev/development or prod/production', parseEnvironment)
|
|
43
|
+
.action(async (options) => {
|
|
44
|
+
await runBuild(options.env);
|
|
45
|
+
});
|
|
46
|
+
// Short, user-facing aliases.
|
|
47
|
+
program
|
|
48
|
+
.command('deploy:configure')
|
|
49
|
+
.description('Alias for `indraq configure`.')
|
|
50
|
+
.action(runConfigure);
|
|
51
|
+
addDeploymentShortcut(program, 'deploy:dev', 'Build, push, and deploy the development image.', 'dev');
|
|
52
|
+
addDeploymentShortcut(program, 'deploy:development', 'Alias for `indraq deploy:dev`.', 'dev');
|
|
53
|
+
addDeploymentShortcut(program, 'deploy:prod', 'Build, push, and deploy the production image.', 'prod');
|
|
54
|
+
addDeploymentShortcut(program, 'deploy:production', 'Alias for `indraq deploy:prod`.', 'prod');
|
|
55
|
+
};
|
|
56
|
+
exports.registerDeployModule = registerDeployModule;
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/deploy/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0D;AAC1D,4DAAiD;AACjD,oEAAyD;AAGzD,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAmB,EAAE;IAC1D,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,gCAAoB,CAC5B,yDAAyD,CAC1D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE;IAC7C,MAAM,IAAA,6BAAS,GAAE,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,WAA4B,EAAiB,EAAE;IACrE,MAAM,IAAA,qBAAK,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC5B,OAAgB,EAChB,IAAY,EACZ,WAAmB,EACnB,WAA4B,EACtB,EAAE;IACR,OAAO;SACJ,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEK,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IAC7D,0EAA0E;IAC1E,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oEAAoE,CAAC,CAAC;IAErF,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,MAAM;SACH,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2CAA2C,CAAC;SACxD,cAAc,CACb,yBAAyB,EACzB,iDAAiD,EACjD,gBAAgB,CACjB;SACA,MAAM,CAAC,KAAK,EAAE,OAAiC,EAAE,EAAE;QAClD,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEL,8BAA8B;IAC9B,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,qBAAqB,CACnB,OAAO,EACP,YAAY,EACZ,gDAAgD,EAChD,KAAK,CACN,CAAC;IAEF,qBAAqB,CACnB,OAAO,EACP,oBAAoB,EACpB,gCAAgC,EAChC,KAAK,CACN,CAAC;IAEF,qBAAqB,CACnB,OAAO,EACP,aAAa,EACb,+CAA+C,EAC/C,MAAM,CACP,CAAC;IAEF,qBAAqB,CACnB,OAAO,EACP,mBAAmB,EACnB,iCAAiC,EACjC,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAxDW,QAAA,oBAAoB,wBAwD/B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GitHubAuthState } from '../../../shared/github/github-auth.service';
|
|
2
|
+
export declare const assertDockerAvailable: () => void;
|
|
3
|
+
export declare const buildDockerImage: (imageName: string, tags: string[], dockerfilePath: string) => void;
|
|
4
|
+
export declare const authenticateGhcr: (auth: GitHubAuthState) => boolean;
|
|
5
|
+
export declare const pushDockerImage: (imageWithTag: string) => void;
|
|
6
|
+
export declare const getDockerImageDigest: (imageWithTag: string) => string;
|
|
7
|
+
//# sourceMappingURL=docker.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/deploy/services/docker.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAElF,eAAO,MAAM,qBAAqB,QAAO,IAMxC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,MAAM,MAAM,EAAE,EACd,gBAAgB,MAAM,KACrB,IAYF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,eAAe,KAAG,OAgBxD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,cAAc,MAAM,KAAG,IAQtD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,KAAG,MAgB3D,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDockerImageDigest = exports.pushDockerImage = exports.authenticateGhcr = exports.buildDockerImage = exports.assertDockerAvailable = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const assertDockerAvailable = () => {
|
|
6
|
+
try {
|
|
7
|
+
(0, node_child_process_1.execFileSync)('docker', ['--version'], { stdio: 'pipe' });
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new Error('Docker is not installed or is not accessible.');
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
exports.assertDockerAvailable = assertDockerAvailable;
|
|
14
|
+
const buildDockerImage = (imageName, tags, dockerfilePath) => {
|
|
15
|
+
const buildArguments = ['build', '-f', dockerfilePath];
|
|
16
|
+
for (const tag of tags) {
|
|
17
|
+
buildArguments.push('-t', `${imageName}:${tag}`);
|
|
18
|
+
}
|
|
19
|
+
buildArguments.push('.');
|
|
20
|
+
try {
|
|
21
|
+
(0, node_child_process_1.execFileSync)('docker', buildArguments, { stdio: 'inherit' });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new Error('Docker build failed. Check the Dockerfile and build output above.');
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
exports.buildDockerImage = buildDockerImage;
|
|
28
|
+
const authenticateGhcr = (auth) => {
|
|
29
|
+
if (!auth.username || !auth.token) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
(0, node_child_process_1.execFileSync)('docker', ['login', 'ghcr.io', '-u', auth.username, '--password-stdin'], {
|
|
34
|
+
input: `${auth.token}\n`,
|
|
35
|
+
stdio: ['pipe', 'inherit', 'inherit']
|
|
36
|
+
});
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new Error('GitHub authentication was found, but GHCR rejected the credential. Make sure it has package write access, or run `docker login ghcr.io` once.');
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.authenticateGhcr = authenticateGhcr;
|
|
44
|
+
const pushDockerImage = (imageWithTag) => {
|
|
45
|
+
try {
|
|
46
|
+
(0, node_child_process_1.execFileSync)('docker', ['push', imageWithTag], { stdio: 'inherit' });
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
throw new Error(`Failed to push ${imageWithTag}. Verify that you have package write permission for the selected GitHub owner and that Docker is authenticated to ghcr.io.`);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.pushDockerImage = pushDockerImage;
|
|
53
|
+
const getDockerImageDigest = (imageWithTag) => {
|
|
54
|
+
try {
|
|
55
|
+
const output = (0, node_child_process_1.execFileSync)('docker', ['image', 'inspect', '--format={{index .RepoDigests 0}}', imageWithTag], {
|
|
56
|
+
encoding: 'utf8',
|
|
57
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
58
|
+
}).trim();
|
|
59
|
+
const separator = output.lastIndexOf('@');
|
|
60
|
+
return separator >= 0 ? output.slice(separator + 1) : '';
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
exports.getDockerImageDigest = getDockerImageDigest;
|
|
67
|
+
//# sourceMappingURL=docker.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.service.js","sourceRoot":"","sources":["../../../../src/modules/deploy/services/docker.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { JenkinsConfig, JenkinsConnectionMode } from '../config/deployment-config';
|
|
2
|
+
interface JenkinsCredentials {
|
|
3
|
+
username: string;
|
|
4
|
+
secret: string;
|
|
5
|
+
}
|
|
6
|
+
interface JenkinsWhoAmIResult {
|
|
7
|
+
connectionMode: JenkinsConnectionMode;
|
|
8
|
+
output: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const normalizeJenkinsUrl: (value: string) => string;
|
|
11
|
+
export declare const createJenkinsServerId: (jenkinsUrl: string, username: string) => string;
|
|
12
|
+
export declare const getJenkinsCliJarPath: (serverId: string) => string;
|
|
13
|
+
export declare const getJenkinsAuthFilePath: (serverId: string) => string;
|
|
14
|
+
export declare const assertJavaAvailable: () => void;
|
|
15
|
+
export declare const saveJenkinsCredentials: (serverId: string, username: string, secret: string) => string;
|
|
16
|
+
export declare const deleteJenkinsCredentials: (serverId: string) => void;
|
|
17
|
+
export declare const readJenkinsCredentials: (serverId: string) => JenkinsCredentials;
|
|
18
|
+
export declare const downloadJenkinsCli: (jenkinsUrl: string, serverId: string, username: string, secret: string) => Promise<string>;
|
|
19
|
+
export declare const validateJenkinsAuthentication: (config: Pick<JenkinsConfig, "url" | "serverId">) => JenkinsWhoAmIResult;
|
|
20
|
+
export declare const assertJenkinsJobExists: (config: JenkinsConfig, jobName: string) => Promise<void>;
|
|
21
|
+
export declare const triggerJenkinsDeployment: (config: JenkinsConfig, jobName: string) => Promise<void>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=jenkins.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jenkins.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/deploy/services/jenkins.service.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAExF,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC3B,cAAc,EAAE,qBAAqB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,MAA2C,CAAC;AAEhG,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,EAAE,UAAU,MAAM,KAAG,MAI5D,CAAC;AAIlB,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,KAAG,MACF,CAAC;AAEvD,eAAO,MAAM,sBAAsB,GAAI,UAAU,MAAM,KAAG,MACP,CAAC;AAQpD,eAAO,MAAM,mBAAmB,QAAO,IAWtC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAChB,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,MAiBF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,UAAU,MAAM,KAAG,IAK3D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,UAAU,MAAM,KAAG,kBAgBzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,OAAO,CAAC,MAAM,CAwChB,CAAC;AAgEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,UAAU,CAAC,KAC9C,mBAuBF,CAAC;AAgBF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,aAAa,EACrB,SAAS,MAAM,KACd,OAAO,CAAC,IAAI,CAqCd,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,aAAa,EACrB,SAAS,MAAM,KACd,OAAO,CAAC,IAAI,CAyDd,CAAC"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.triggerJenkinsDeployment = exports.assertJenkinsJobExists = exports.validateJenkinsAuthentication = exports.downloadJenkinsCli = exports.readJenkinsCredentials = exports.deleteJenkinsCredentials = exports.saveJenkinsCredentials = exports.assertJavaAvailable = exports.getJenkinsAuthFilePath = exports.getJenkinsCliJarPath = exports.createJenkinsServerId = exports.normalizeJenkinsUrl = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const node_child_process_1 = require("node:child_process");
|
|
13
|
+
const JENKINS_CACHE_ROOT = (0, node_path_1.join)((0, node_os_1.homedir)(), '.indraq', 'jenkins');
|
|
14
|
+
const CLI_JAR_FILENAME = 'jenkins-cli.jar';
|
|
15
|
+
const AUTH_FILENAME = 'auth';
|
|
16
|
+
const trimTrailingSlashes = (value) => value.replace(/\/+$/, '');
|
|
17
|
+
const normalizeJenkinsUrl = (value) => trimTrailingSlashes(value.trim());
|
|
18
|
+
exports.normalizeJenkinsUrl = normalizeJenkinsUrl;
|
|
19
|
+
const createJenkinsServerId = (jenkinsUrl, username) => (0, node_crypto_1.createHash)('sha256')
|
|
20
|
+
.update(`${(0, exports.normalizeJenkinsUrl)(jenkinsUrl)}\0${username.trim().toLowerCase()}`)
|
|
21
|
+
.digest('hex')
|
|
22
|
+
.slice(0, 16);
|
|
23
|
+
exports.createJenkinsServerId = createJenkinsServerId;
|
|
24
|
+
const getServerDirectory = (serverId) => (0, node_path_1.join)(JENKINS_CACHE_ROOT, serverId);
|
|
25
|
+
const getJenkinsCliJarPath = (serverId) => (0, node_path_1.join)(getServerDirectory(serverId), CLI_JAR_FILENAME);
|
|
26
|
+
exports.getJenkinsCliJarPath = getJenkinsCliJarPath;
|
|
27
|
+
const getJenkinsAuthFilePath = (serverId) => (0, node_path_1.join)(getServerDirectory(serverId), AUTH_FILENAME);
|
|
28
|
+
exports.getJenkinsAuthFilePath = getJenkinsAuthFilePath;
|
|
29
|
+
const ensureServerDirectory = (serverId) => {
|
|
30
|
+
const directory = getServerDirectory(serverId);
|
|
31
|
+
(0, node_fs_1.mkdirSync)(directory, { recursive: true, mode: 0o700 });
|
|
32
|
+
return directory;
|
|
33
|
+
};
|
|
34
|
+
const assertJavaAvailable = () => {
|
|
35
|
+
const result = (0, node_child_process_1.spawnSync)('java', ['-version'], {
|
|
36
|
+
encoding: 'utf8',
|
|
37
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
38
|
+
});
|
|
39
|
+
if (result.error || result.status !== 0) {
|
|
40
|
+
throw new Error('Java is required for Jenkins CLI but was not found. Install a supported Java runtime and make sure `java` is available in PATH.');
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.assertJavaAvailable = assertJavaAvailable;
|
|
44
|
+
const saveJenkinsCredentials = (serverId, username, secret) => {
|
|
45
|
+
if (username.includes('\n') || username.includes('\r') || secret.includes('\n') || secret.includes('\r')) {
|
|
46
|
+
throw new Error('Jenkins username and token/password cannot contain line breaks.');
|
|
47
|
+
}
|
|
48
|
+
ensureServerDirectory(serverId);
|
|
49
|
+
const authPath = (0, exports.getJenkinsAuthFilePath)(serverId);
|
|
50
|
+
(0, node_fs_1.writeFileSync)(authPath, `${username}:${secret}`, { encoding: 'utf8', mode: 0o600 });
|
|
51
|
+
try {
|
|
52
|
+
(0, node_fs_1.chmodSync)(authPath, 0o600);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Windows does not implement POSIX permissions in the same way. The file is
|
|
56
|
+
// still outside the project and is never committed by the CLI.
|
|
57
|
+
}
|
|
58
|
+
return authPath;
|
|
59
|
+
};
|
|
60
|
+
exports.saveJenkinsCredentials = saveJenkinsCredentials;
|
|
61
|
+
const deleteJenkinsCredentials = (serverId) => {
|
|
62
|
+
const authPath = (0, exports.getJenkinsAuthFilePath)(serverId);
|
|
63
|
+
if ((0, node_fs_1.existsSync)(authPath)) {
|
|
64
|
+
(0, node_fs_1.rmSync)(authPath, { force: true });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
exports.deleteJenkinsCredentials = deleteJenkinsCredentials;
|
|
68
|
+
const readJenkinsCredentials = (serverId) => {
|
|
69
|
+
const authPath = (0, exports.getJenkinsAuthFilePath)(serverId);
|
|
70
|
+
if (!(0, node_fs_1.existsSync)(authPath)) {
|
|
71
|
+
throw new Error('Jenkins credentials are missing. Run `indraq configure` again.');
|
|
72
|
+
}
|
|
73
|
+
const raw = (0, node_fs_1.readFileSync)(authPath, 'utf8');
|
|
74
|
+
const separator = raw.indexOf(':');
|
|
75
|
+
if (separator <= 0) {
|
|
76
|
+
throw new Error('Stored Jenkins credentials are invalid. Run `indraq configure` again.');
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
username: raw.slice(0, separator),
|
|
80
|
+
secret: raw.slice(separator + 1)
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
exports.readJenkinsCredentials = readJenkinsCredentials;
|
|
84
|
+
const downloadJenkinsCli = async (jenkinsUrl, serverId, username, secret) => {
|
|
85
|
+
ensureServerDirectory(serverId);
|
|
86
|
+
const jarPath = (0, exports.getJenkinsCliJarPath)(serverId);
|
|
87
|
+
const url = `${(0, exports.normalizeJenkinsUrl)(jenkinsUrl)}/jnlpJars/jenkins-cli.jar`;
|
|
88
|
+
try {
|
|
89
|
+
const response = await axios_1.default.get(url, {
|
|
90
|
+
responseType: 'arraybuffer',
|
|
91
|
+
timeout: 30_000,
|
|
92
|
+
maxContentLength: 100 * 1024 * 1024,
|
|
93
|
+
maxBodyLength: 100 * 1024 * 1024,
|
|
94
|
+
auth: {
|
|
95
|
+
username,
|
|
96
|
+
password: secret
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
const data = Buffer.from(response.data);
|
|
100
|
+
if (data.length < 1024) {
|
|
101
|
+
throw new Error('Downloaded Jenkins CLI file is unexpectedly small.');
|
|
102
|
+
}
|
|
103
|
+
(0, node_fs_1.writeFileSync)(jarPath, data);
|
|
104
|
+
return jarPath;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
108
|
+
const status = error.response?.status;
|
|
109
|
+
if (status === 401 || status === 403) {
|
|
110
|
+
throw new Error(`Jenkins rejected access to its CLI download (HTTP ${status}). Check the Jenkins URL, username, and API token/password.`);
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`Unable to download Jenkins CLI from ${url}${status ? ` (HTTP ${status})` : ''}. ${error.message}`);
|
|
113
|
+
}
|
|
114
|
+
const message = error instanceof Error ? error.message : 'Unknown Jenkins CLI download error';
|
|
115
|
+
throw new Error(`Unable to download Jenkins CLI from ${url}. ${message}`);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
exports.downloadJenkinsCli = downloadJenkinsCli;
|
|
119
|
+
const runJenkinsCliCapture = (config, connectionMode, commandArguments) => {
|
|
120
|
+
const jarPath = (0, exports.getJenkinsCliJarPath)(config.serverId);
|
|
121
|
+
const authPath = (0, exports.getJenkinsAuthFilePath)(config.serverId);
|
|
122
|
+
if (!(0, node_fs_1.existsSync)(jarPath)) {
|
|
123
|
+
return {
|
|
124
|
+
status: null,
|
|
125
|
+
stdout: '',
|
|
126
|
+
stderr: '',
|
|
127
|
+
error: new Error('Jenkins CLI JAR is missing. Run `indraq configure` again.')
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (!(0, node_fs_1.existsSync)(authPath)) {
|
|
131
|
+
return {
|
|
132
|
+
status: null,
|
|
133
|
+
stdout: '',
|
|
134
|
+
stderr: '',
|
|
135
|
+
error: new Error('Jenkins credentials are missing. Run `indraq configure` again.')
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const result = (0, node_child_process_1.spawnSync)('java', [
|
|
139
|
+
'-jar',
|
|
140
|
+
jarPath,
|
|
141
|
+
'-s',
|
|
142
|
+
(0, exports.normalizeJenkinsUrl)(config.url),
|
|
143
|
+
`-${connectionMode}`,
|
|
144
|
+
'-auth',
|
|
145
|
+
`@${authPath}`,
|
|
146
|
+
...commandArguments
|
|
147
|
+
], {
|
|
148
|
+
encoding: 'utf8',
|
|
149
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
150
|
+
maxBuffer: 20 * 1024 * 1024
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
status: result.status,
|
|
154
|
+
stdout: result.stdout || '',
|
|
155
|
+
stderr: result.stderr || '',
|
|
156
|
+
...(result.error ? { error: result.error } : {})
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
const cleanCliError = (stdout, stderr) => {
|
|
160
|
+
const combined = `${stderr}\n${stdout}`
|
|
161
|
+
.split(/\r?\n/)
|
|
162
|
+
.map((line) => line.trim())
|
|
163
|
+
.filter(Boolean)
|
|
164
|
+
.slice(-8)
|
|
165
|
+
.join('\n');
|
|
166
|
+
return combined || 'Jenkins CLI returned an unknown error.';
|
|
167
|
+
};
|
|
168
|
+
const validateJenkinsAuthentication = (config) => {
|
|
169
|
+
(0, exports.assertJavaAvailable)();
|
|
170
|
+
const modes = ['webSocket', 'http'];
|
|
171
|
+
const failures = [];
|
|
172
|
+
for (const mode of modes) {
|
|
173
|
+
const result = runJenkinsCliCapture(config, mode, ['who-am-i']);
|
|
174
|
+
const output = `${result.stdout}\n${result.stderr}`.trim();
|
|
175
|
+
if (!result.error && result.status === 0 && !/Authenticated as:\s*anonymous/i.test(output)) {
|
|
176
|
+
return {
|
|
177
|
+
connectionMode: mode,
|
|
178
|
+
output: result.stdout.trim() || result.stderr.trim()
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
failures.push(`${mode}: ${result.error?.message || cleanCliError(result.stdout, result.stderr)}`);
|
|
182
|
+
}
|
|
183
|
+
throw new Error(`Jenkins authentication failed. Check the Jenkins URL, username, and API token/password.\n${failures.join('\n')}`);
|
|
184
|
+
};
|
|
185
|
+
exports.validateJenkinsAuthentication = validateJenkinsAuthentication;
|
|
186
|
+
const getJobApiUrl = (jenkinsUrl, jobName) => {
|
|
187
|
+
const segments = jobName
|
|
188
|
+
.split('/')
|
|
189
|
+
.map((segment) => segment.trim())
|
|
190
|
+
.filter(Boolean);
|
|
191
|
+
if (segments.length === 0) {
|
|
192
|
+
throw new Error('Jenkins job name cannot be empty.');
|
|
193
|
+
}
|
|
194
|
+
const jobPath = segments.map((segment) => `job/${encodeURIComponent(segment)}`).join('/');
|
|
195
|
+
return `${(0, exports.normalizeJenkinsUrl)(jenkinsUrl)}/${jobPath}/api/json`;
|
|
196
|
+
};
|
|
197
|
+
const assertJenkinsJobExists = async (config, jobName) => {
|
|
198
|
+
const credentials = (0, exports.readJenkinsCredentials)(config.serverId);
|
|
199
|
+
const url = getJobApiUrl(config.url, jobName);
|
|
200
|
+
try {
|
|
201
|
+
await axios_1.default.get(url, {
|
|
202
|
+
timeout: 15_000,
|
|
203
|
+
params: { tree: 'name,fullName,_class' },
|
|
204
|
+
auth: {
|
|
205
|
+
username: credentials.username,
|
|
206
|
+
password: credentials.secret
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
212
|
+
const status = error.response?.status;
|
|
213
|
+
if (status === 404) {
|
|
214
|
+
throw new Error(`No Jenkins pipeline/job named "${jobName}" was found. The Jenkins job name must match the configured image name for this environment.`);
|
|
215
|
+
}
|
|
216
|
+
if (status === 401) {
|
|
217
|
+
throw new Error('Jenkins credentials are no longer valid. Run `indraq configure` again.');
|
|
218
|
+
}
|
|
219
|
+
if (status === 403) {
|
|
220
|
+
throw new Error(`Jenkins denied access to "${jobName}". The configured user needs permission to read and build this job.`);
|
|
221
|
+
}
|
|
222
|
+
throw new Error(`Unable to verify Jenkins job "${jobName}"${status ? ` (HTTP ${status})` : ''}. ${error.message}`);
|
|
223
|
+
}
|
|
224
|
+
const message = error instanceof Error ? error.message : 'Unknown Jenkins job lookup error';
|
|
225
|
+
throw new Error(`Unable to verify Jenkins job "${jobName}". ${message}`);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
exports.assertJenkinsJobExists = assertJenkinsJobExists;
|
|
229
|
+
const triggerJenkinsDeployment = async (config, jobName) => {
|
|
230
|
+
(0, exports.assertJavaAvailable)();
|
|
231
|
+
const jarPath = (0, exports.getJenkinsCliJarPath)(config.serverId);
|
|
232
|
+
const authPath = (0, exports.getJenkinsAuthFilePath)(config.serverId);
|
|
233
|
+
if (!(0, node_fs_1.existsSync)(jarPath)) {
|
|
234
|
+
throw new Error('Jenkins CLI JAR is missing. Run `indraq configure` again.');
|
|
235
|
+
}
|
|
236
|
+
if (!(0, node_fs_1.existsSync)(authPath)) {
|
|
237
|
+
throw new Error('Jenkins credentials are missing. Run `indraq configure` again.');
|
|
238
|
+
}
|
|
239
|
+
await new Promise((resolve, reject) => {
|
|
240
|
+
const child = (0, node_child_process_1.spawn)('java', [
|
|
241
|
+
'-jar',
|
|
242
|
+
jarPath,
|
|
243
|
+
'-s',
|
|
244
|
+
(0, exports.normalizeJenkinsUrl)(config.url),
|
|
245
|
+
`-${config.connectionMode}`,
|
|
246
|
+
'-auth',
|
|
247
|
+
`@${authPath}`,
|
|
248
|
+
'build',
|
|
249
|
+
jobName,
|
|
250
|
+
'-s',
|
|
251
|
+
'-v'
|
|
252
|
+
], {
|
|
253
|
+
stdio: 'inherit',
|
|
254
|
+
windowsHide: false
|
|
255
|
+
});
|
|
256
|
+
child.once('error', (error) => {
|
|
257
|
+
reject(new Error(`Unable to start Jenkins CLI: ${error.message}`));
|
|
258
|
+
});
|
|
259
|
+
child.once('exit', (code, signal) => {
|
|
260
|
+
if (code === 0) {
|
|
261
|
+
resolve();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (signal) {
|
|
265
|
+
reject(new Error(`Jenkins pipeline was interrupted by signal ${signal}.`));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
reject(new Error(`Jenkins pipeline "${jobName}" failed with exit code ${code ?? 'unknown'}. Review the Jenkins output above.`));
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
exports.triggerJenkinsDeployment = triggerJenkinsDeployment;
|
|
273
|
+
//# sourceMappingURL=jenkins.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jenkins.service.js","sourceRoot":"","sources":["../../../../src/modules/deploy/services/jenkins.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface GitCredential {
|
|
2
|
+
username?: string;
|
|
3
|
+
password?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const assertGitAvailable: () => void;
|
|
6
|
+
export declare const getGitRemoteOwner: () => string | undefined;
|
|
7
|
+
export declare const getGitHubHttpsCredential: () => GitCredential | null;
|
|
8
|
+
export declare const getGitHubSshAuthentication: () => {
|
|
9
|
+
username?: string;
|
|
10
|
+
} | null;
|
|
11
|
+
//# sourceMappingURL=git.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.service.d.ts","sourceRoot":"","sources":["../../../src/shared/git/git.service.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+BD,eAAO,MAAM,kBAAkB,QAAO,IASrC,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,MAAM,GAAG,SAc7C,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAO,aAAa,GAAG,IAe3D,CAAC;AAqBF,eAAO,MAAM,0BAA0B,QAAO;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAiBrE,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGitHubSshAuthentication = exports.getGitHubHttpsCredential = exports.getGitRemoteOwner = exports.assertGitAvailable = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const nonInteractiveGitEnv = () => ({
|
|
6
|
+
...process.env,
|
|
7
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
8
|
+
GCM_INTERACTIVE: 'Never'
|
|
9
|
+
});
|
|
10
|
+
const parseCredentialOutput = (output) => {
|
|
11
|
+
const credential = {};
|
|
12
|
+
for (const line of output.split(/\r?\n/)) {
|
|
13
|
+
const separator = line.indexOf('=');
|
|
14
|
+
if (separator <= 0) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const key = line.slice(0, separator).trim();
|
|
18
|
+
const value = line.slice(separator + 1).trim();
|
|
19
|
+
if (key === 'username' && value) {
|
|
20
|
+
credential.username = value;
|
|
21
|
+
}
|
|
22
|
+
if (key === 'password' && value) {
|
|
23
|
+
credential.password = value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return credential;
|
|
27
|
+
};
|
|
28
|
+
const assertGitAvailable = () => {
|
|
29
|
+
try {
|
|
30
|
+
(0, node_child_process_1.execFileSync)('git', ['--version'], {
|
|
31
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
32
|
+
timeout: 5_000
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new Error('Git is not installed or is not available in PATH. Install Git/Git Bash first.');
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.assertGitAvailable = assertGitAvailable;
|
|
40
|
+
const getGitRemoteOwner = () => {
|
|
41
|
+
try {
|
|
42
|
+
const remote = (0, node_child_process_1.execFileSync)('git', ['remote', 'get-url', 'origin'], {
|
|
43
|
+
encoding: 'utf8',
|
|
44
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
45
|
+
env: nonInteractiveGitEnv(),
|
|
46
|
+
timeout: 5_000
|
|
47
|
+
}).trim();
|
|
48
|
+
const match = remote.match(/github\.com(?::|\/)([^/]+)\/[^/]+?(?:\.git)?$/i);
|
|
49
|
+
return match?.[1]?.trim() || undefined;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.getGitRemoteOwner = getGitRemoteOwner;
|
|
56
|
+
const getGitHubHttpsCredential = () => {
|
|
57
|
+
try {
|
|
58
|
+
const output = (0, node_child_process_1.execFileSync)('git', ['credential', 'fill'], {
|
|
59
|
+
input: 'protocol=https\nhost=github.com\n\n',
|
|
60
|
+
encoding: 'utf8',
|
|
61
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
62
|
+
env: nonInteractiveGitEnv(),
|
|
63
|
+
timeout: 5_000
|
|
64
|
+
});
|
|
65
|
+
const credential = parseCredentialOutput(output);
|
|
66
|
+
return credential.username && credential.password ? credential : null;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
exports.getGitHubHttpsCredential = getGitHubHttpsCredential;
|
|
73
|
+
const getSshAuthenticatedUsername = () => {
|
|
74
|
+
try {
|
|
75
|
+
const result = (0, node_child_process_1.spawnSync)('ssh', ['-T', 'git@github.com'], {
|
|
76
|
+
encoding: 'utf8',
|
|
77
|
+
env: {
|
|
78
|
+
...nonInteractiveGitEnv(),
|
|
79
|
+
GIT_SSH_COMMAND: 'ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new'
|
|
80
|
+
},
|
|
81
|
+
timeout: 10_000
|
|
82
|
+
});
|
|
83
|
+
const combinedOutput = `${result.stdout || ''}\n${result.stderr || ''}`;
|
|
84
|
+
const match = combinedOutput.match(/Hi\s+([^!\s]+)!\s+You've successfully authenticated/i);
|
|
85
|
+
return match?.[1]?.trim() || undefined;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const getGitHubSshAuthentication = () => {
|
|
92
|
+
try {
|
|
93
|
+
(0, node_child_process_1.execFileSync)('git', ['ls-remote', 'git@github.com:github/gitignore.git', 'HEAD'], {
|
|
94
|
+
encoding: 'utf8',
|
|
95
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
96
|
+
env: {
|
|
97
|
+
...nonInteractiveGitEnv(),
|
|
98
|
+
GIT_SSH_COMMAND: 'ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new'
|
|
99
|
+
},
|
|
100
|
+
timeout: 10_000
|
|
101
|
+
});
|
|
102
|
+
const username = getSshAuthenticatedUsername();
|
|
103
|
+
return username ? { username } : {};
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
exports.getGitHubSshAuthentication = getGitHubSshAuthentication;
|
|
110
|
+
//# sourceMappingURL=git.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.service.js","sourceRoot":"","sources":["../../../src/shared/git/git.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GitHubAuthState } from './github-auth.service';
|
|
2
|
+
export interface GitHubIdentity {
|
|
3
|
+
username?: string;
|
|
4
|
+
organizations: string[];
|
|
5
|
+
organizationDiscovery: 'authenticated' | 'public' | 'unavailable';
|
|
6
|
+
}
|
|
7
|
+
export declare const getGitHubIdentity: (auth: GitHubAuthState) => Promise<GitHubIdentity>;
|
|
8
|
+
//# sourceMappingURL=github-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-api.service.d.ts","sourceRoot":"","sources":["../../../src/shared/github/github-api.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAU7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qBAAqB,EAAE,eAAe,GAAG,QAAQ,GAAG,aAAa,CAAC;CACnE;AAwCD,eAAO,MAAM,iBAAiB,GAAU,MAAM,eAAe,KAAG,OAAO,CAAC,cAAc,CAyCrF,CAAC"}
|