@ethlete/cli 2.0.1-next.2 → 2.1.0-next.11
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/CHANGELOG.md +109 -0
- package/README.md +178 -6
- package/design/define-call.ts +92 -0
- package/design/web/env.d.ts +11 -0
- package/design/web/frame.html +17 -0
- package/design/web/frame.ts +38 -0
- package/design/web/host.css +494 -0
- package/design/web/host.ts +445 -0
- package/design/web/index.html +11 -0
- package/package.json +12 -1
- package/src/index.d.ts +2 -1
- package/src/index.js +97 -10
- package/src/index.js.map +1 -1
- package/src/lib/api/api-command.d.ts +5 -0
- package/src/lib/api/api-command.js +27 -0
- package/src/lib/api/api-command.js.map +1 -0
- package/src/lib/api/auth-hint.d.ts +16 -0
- package/src/lib/api/auth-hint.js +59 -0
- package/src/lib/api/auth-hint.js.map +1 -0
- package/src/lib/api/clear.d.ts +36 -0
- package/src/lib/api/clear.js +121 -0
- package/src/lib/api/clear.js.map +1 -0
- package/src/lib/api/clone.d.ts +12 -0
- package/src/lib/api/clone.js +24 -0
- package/src/lib/api/clone.js.map +1 -0
- package/src/lib/api/compose.d.ts +46 -0
- package/src/lib/api/compose.js +101 -0
- package/src/lib/api/compose.js.map +1 -0
- package/src/lib/api/definition.d.ts +37 -0
- package/src/lib/api/definition.js +33 -0
- package/src/lib/api/definition.js.map +1 -0
- package/src/lib/api/git.d.ts +27 -0
- package/src/lib/api/git.js +79 -0
- package/src/lib/api/git.js.map +1 -0
- package/src/lib/api/help.d.ts +11 -0
- package/src/lib/api/help.js +72 -0
- package/src/lib/api/help.js.map +1 -0
- package/src/lib/api/index.d.ts +15 -0
- package/src/lib/api/index.js +19 -0
- package/src/lib/api/index.js.map +1 -0
- package/src/lib/api/load-definitions.d.ts +16 -0
- package/src/lib/api/load-definitions.js +22 -0
- package/src/lib/api/load-definitions.js.map +1 -0
- package/src/lib/api/ports.d.ts +13 -0
- package/src/lib/api/ports.js +98 -0
- package/src/lib/api/ports.js.map +1 -0
- package/src/lib/api/resolve-checkout.d.ts +45 -0
- package/src/lib/api/resolve-checkout.js +91 -0
- package/src/lib/api/resolve-checkout.js.map +1 -0
- package/src/lib/api/run.d.ts +10 -0
- package/src/lib/api/run.js +332 -0
- package/src/lib/api/run.js.map +1 -0
- package/src/lib/api/setup.d.ts +15 -0
- package/src/lib/api/setup.js +41 -0
- package/src/lib/api/setup.js.map +1 -0
- package/src/lib/api/state.d.ts +20 -0
- package/src/lib/api/state.js +33 -0
- package/src/lib/api/state.js.map +1 -0
- package/src/lib/api/suggest.d.ts +7 -0
- package/src/lib/api/suggest.js +35 -0
- package/src/lib/api/suggest.js.map +1 -0
- package/src/lib/auth/auth-command.d.ts +11 -0
- package/src/lib/auth/auth-command.js +165 -0
- package/src/lib/auth/auth-command.js.map +1 -0
- package/src/lib/auth/composer-auth.d.ts +30 -0
- package/src/lib/auth/composer-auth.js +70 -0
- package/src/lib/auth/composer-auth.js.map +1 -0
- package/src/lib/auth/composer-repositories.d.ts +5 -0
- package/src/lib/auth/composer-repositories.js +33 -0
- package/src/lib/auth/composer-repositories.js.map +1 -0
- package/src/lib/auth/gitlab-token.d.ts +43 -0
- package/src/lib/auth/gitlab-token.js +72 -0
- package/src/lib/auth/gitlab-token.js.map +1 -0
- package/src/lib/auth/index.d.ts +4 -0
- package/src/lib/auth/index.js +8 -0
- package/src/lib/auth/index.js.map +1 -0
- package/src/lib/config/diagnose.d.ts +7 -0
- package/src/lib/config/diagnose.js +112 -0
- package/src/lib/config/diagnose.js.map +1 -0
- package/src/lib/config/index.d.ts +2 -0
- package/src/lib/config/index.js +6 -0
- package/src/lib/config/index.js.map +1 -0
- package/src/lib/config/local-config.d.ts +46 -0
- package/src/lib/config/local-config.js +57 -0
- package/src/lib/config/local-config.js.map +1 -0
- package/src/lib/design/calls-tsconfig.d.ts +6 -0
- package/src/lib/design/calls-tsconfig.js +37 -0
- package/src/lib/design/calls-tsconfig.js.map +1 -0
- package/src/lib/design/check.d.ts +11 -0
- package/src/lib/design/check.js +192 -0
- package/src/lib/design/check.js.map +1 -0
- package/src/lib/design/design-command.d.ts +10 -0
- package/src/lib/design/design-command.js +32 -0
- package/src/lib/design/design-command.js.map +1 -0
- package/src/lib/design/index.d.ts +5 -0
- package/src/lib/design/index.js +9 -0
- package/src/lib/design/index.js.map +1 -0
- package/src/lib/design/paths.d.ts +24 -0
- package/src/lib/design/paths.js +31 -0
- package/src/lib/design/paths.js.map +1 -0
- package/src/lib/design/serve.d.ts +7 -0
- package/src/lib/design/serve.js +144 -0
- package/src/lib/design/serve.js.map +1 -0
- package/src/lib/doctor/doctor-command.d.ts +7 -0
- package/src/lib/doctor/doctor-command.js +62 -0
- package/src/lib/doctor/doctor-command.js.map +1 -0
- package/src/lib/doctor/index.d.ts +1 -0
- package/src/lib/doctor/index.js +5 -0
- package/src/lib/doctor/index.js.map +1 -0
- package/src/lib/index.d.ts +7 -0
- package/src/lib/index.js +7 -0
- package/src/lib/index.js.map +1 -1
- package/src/lib/invocation.d.ts +9 -0
- package/src/lib/invocation.js +47 -0
- package/src/lib/invocation.js.map +1 -0
- package/src/lib/release.js +21 -3
- package/src/lib/release.js.map +1 -1
- package/src/lib/update/agent-rules-sync.d.ts +37 -0
- package/src/lib/update/agent-rules-sync.js +40 -0
- package/src/lib/update/agent-rules-sync.js.map +1 -0
- package/src/lib/update/ai.d.ts +37 -0
- package/src/lib/update/ai.js +71 -0
- package/src/lib/update/ai.js.map +1 -0
- package/src/lib/update/args.d.ts +21 -0
- package/src/lib/update/args.js +89 -0
- package/src/lib/update/args.js.map +1 -0
- package/src/lib/update/gitignore.d.ts +2 -0
- package/src/lib/update/gitignore.js +18 -0
- package/src/lib/update/gitignore.js.map +1 -0
- package/src/lib/update/index.d.ts +13 -0
- package/src/lib/update/index.js +17 -0
- package/src/lib/update/index.js.map +1 -0
- package/src/lib/update/migration-manifest.d.ts +40 -0
- package/src/lib/update/migration-manifest.js +137 -0
- package/src/lib/update/migration-manifest.js.map +1 -0
- package/src/lib/update/package-manager.d.ts +30 -0
- package/src/lib/update/package-manager.js +60 -0
- package/src/lib/update/package-manager.js.map +1 -0
- package/src/lib/update/packages.d.ts +65 -0
- package/src/lib/update/packages.js +147 -0
- package/src/lib/update/packages.js.map +1 -0
- package/src/lib/update/pending.d.ts +34 -0
- package/src/lib/update/pending.js +46 -0
- package/src/lib/update/pending.js.map +1 -0
- package/src/lib/update/plan.d.ts +51 -0
- package/src/lib/update/plan.js +101 -0
- package/src/lib/update/plan.js.map +1 -0
- package/src/lib/update/registry.d.ts +40 -0
- package/src/lib/update/registry.js +140 -0
- package/src/lib/update/registry.js.map +1 -0
- package/src/lib/update/run-migrations.d.ts +45 -0
- package/src/lib/update/run-migrations.js +73 -0
- package/src/lib/update/run-migrations.js.map +1 -0
- package/src/lib/update/semver.d.ts +19 -0
- package/src/lib/update/semver.js +79 -0
- package/src/lib/update/semver.js.map +1 -0
- package/src/lib/update/tasks.d.ts +75 -0
- package/src/lib/update/tasks.js +241 -0
- package/src/lib/update/tasks.js.map +1 -0
- package/src/lib/update/update-command.d.ts +12 -0
- package/src/lib/update/update-command.js +411 -0
- package/src/lib/update/update-command.js.map +1 -0
- package/src/lib/utils.d.ts +14 -0
- package/src/lib/utils.js +14 -1
- package/src/lib/utils.js.map +1 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authCommand = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const auth_hint_1 = require("../api/auth-hint");
|
|
6
|
+
const load_definitions_1 = require("../api/load-definitions");
|
|
7
|
+
const resolve_checkout_1 = require("../api/resolve-checkout");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const composer_auth_1 = require("./composer-auth");
|
|
10
|
+
const composer_repositories_1 = require("./composer-repositories");
|
|
11
|
+
const gitlab_token_1 = require("./gitlab-token");
|
|
12
|
+
const usage = (invocation) => [
|
|
13
|
+
`Usage: ${invocation} [host] <token>`,
|
|
14
|
+
'',
|
|
15
|
+
"Writes a GitLab token into composer's auth.json, which the API containers mount, so a",
|
|
16
|
+
'private dependency can be downloaded. The token is checked against the host first.',
|
|
17
|
+
'',
|
|
18
|
+
'The host is optional when every API in ethlete.apis.js sits on the same one.',
|
|
19
|
+
'',
|
|
20
|
+
'A host may be written as a url. Only its host name is used.',
|
|
21
|
+
'',
|
|
22
|
+
'Flags',
|
|
23
|
+
' --force Write the token even when the check says it cannot fetch code, and replace',
|
|
24
|
+
' a token the file already holds for that host without asking',
|
|
25
|
+
].join('\n');
|
|
26
|
+
/**
|
|
27
|
+
* Every host in play, and the projects on each one that a token is needed for. The projects come from
|
|
28
|
+
* the `repositories` of each checkout's composer.json, never from the API's own repoUrl: a developer
|
|
29
|
+
* fetches that one with their own credential, while the token is for its private dependencies.
|
|
30
|
+
*/
|
|
31
|
+
const surveyHosts = (root) => {
|
|
32
|
+
var _a;
|
|
33
|
+
const loaded = (0, load_definitions_1.loadApiDefinitions)(root);
|
|
34
|
+
const hosts = new Set();
|
|
35
|
+
const projects = new Map();
|
|
36
|
+
if (!loaded.found)
|
|
37
|
+
return { hosts: [...hosts], projects };
|
|
38
|
+
for (const [name, api] of Object.entries(loaded.apis)) {
|
|
39
|
+
const apiHost = api.repoUrl ? (0, auth_hint_1.gitUrlHost)(api.repoUrl) : undefined;
|
|
40
|
+
if (apiHost)
|
|
41
|
+
hosts.add(apiHost);
|
|
42
|
+
const checkout = (0, resolve_checkout_1.resolveApiCheckout)({ root, name, api, needs: 'repo' });
|
|
43
|
+
if (!checkout.ok)
|
|
44
|
+
continue;
|
|
45
|
+
for (const url of (0, composer_repositories_1.composerGitRepositories)(checkout.checkout.repoPath)) {
|
|
46
|
+
const host = (0, auth_hint_1.gitUrlHost)(url);
|
|
47
|
+
const projectPath = (0, auth_hint_1.gitUrlProjectPath)(url);
|
|
48
|
+
if (!host || !projectPath)
|
|
49
|
+
continue;
|
|
50
|
+
hosts.add(host);
|
|
51
|
+
projects.set(host, ((_a = projects.get(host)) !== null && _a !== void 0 ? _a : new Set()).add(projectPath));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { hosts: [...hosts], projects };
|
|
55
|
+
};
|
|
56
|
+
const describeClone = (check) => {
|
|
57
|
+
switch (check.state) {
|
|
58
|
+
case 'clonable':
|
|
59
|
+
return { line: 'can be fetched', ok: true };
|
|
60
|
+
case 'forbidden':
|
|
61
|
+
return { line: '403: this token cannot fetch it', ok: false };
|
|
62
|
+
case 'unauthorized':
|
|
63
|
+
return { line: '401: the token was rejected', ok: false };
|
|
64
|
+
case 'missing':
|
|
65
|
+
return { line: '404: this token cannot see it', ok: false };
|
|
66
|
+
case 'unreachable':
|
|
67
|
+
return { line: `not checked: ${check.reason}`, ok: true };
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const printTokenLine = (host, token) => (0, gitlab_token_1.describeGitlabToken)({ host, token }).then((check) => {
|
|
71
|
+
if (check.state === 'unauthorized')
|
|
72
|
+
return false;
|
|
73
|
+
if (check.state === 'unreachable')
|
|
74
|
+
console.log(` token not checked: ${check.reason}`);
|
|
75
|
+
else if (check.state === 'undisclosed')
|
|
76
|
+
console.log(' token accepted, and keeps its own details private');
|
|
77
|
+
else {
|
|
78
|
+
const named = check.name ? `"${check.name}", ` : '';
|
|
79
|
+
const expires = check.expiresAt ? `, expires ${check.expiresAt}` : '';
|
|
80
|
+
console.log(` token ${named}scopes: ${check.scopes.join(', ') || 'none'}${expires}`);
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
});
|
|
84
|
+
/** Writes a GitLab token into composer's auth.json, after asking the host whether it can fetch code. */
|
|
85
|
+
const authCommand = (_a) => tslib_1.__awaiter(void 0, [_a], void 0, function* ({ argv, root = process.cwd(), invocation = 'et auth', home = (0, composer_auth_1.defaultComposerHome)(), }) {
|
|
86
|
+
var _b, _c, _d;
|
|
87
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
88
|
+
console.log(usage(invocation));
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
const positional = argv.filter((arg) => !arg.startsWith('--'));
|
|
92
|
+
if (positional.length === 0 || positional.length > 2) {
|
|
93
|
+
console.error(usage(invocation));
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
const force = argv.includes('--force');
|
|
97
|
+
const survey = surveyHosts(root);
|
|
98
|
+
const named = positional.length === 2;
|
|
99
|
+
const host = named ? (0, auth_hint_1.gitHostFromInput)((_b = positional[0]) !== null && _b !== void 0 ? _b : '') : survey.hosts[0];
|
|
100
|
+
const token = (_c = positional[named ? 1 : 0]) !== null && _c !== void 0 ? _c : '';
|
|
101
|
+
if (named && host === undefined) {
|
|
102
|
+
console.error(`"${positional[0]}" holds no host name. Name the host itself:\n\n ${invocation} gitlab.example.com <token>`);
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
if (host === undefined) {
|
|
106
|
+
console.error(`No host to write a token for. ethlete.apis.js declares no repoUrl, so name the host:\n\n` +
|
|
107
|
+
` ${invocation} gitlab.example.com <token>`);
|
|
108
|
+
return 1;
|
|
109
|
+
}
|
|
110
|
+
if (!named && survey.hosts.length > 1) {
|
|
111
|
+
console.error(`${survey.hosts.length} hosts are in use, so name the one this token is for:\n\n` +
|
|
112
|
+
survey.hosts.map((known) => ` ${invocation} ${known} <token>`).join('\n'));
|
|
113
|
+
return 1;
|
|
114
|
+
}
|
|
115
|
+
console.log(`\n${host}`);
|
|
116
|
+
if (!(yield printTokenLine(host, token))) {
|
|
117
|
+
console.error(' token rejected with 401. It is wrong, expired or revoked.\n\nNothing was written.');
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
const projectPaths = [...((_d = survey.projects.get(host)) !== null && _d !== void 0 ? _d : [])];
|
|
121
|
+
let fetchable = projectPaths.length === 0;
|
|
122
|
+
if (projectPaths.length === 0) {
|
|
123
|
+
console.log(' fetch no private dependency on that host to try');
|
|
124
|
+
}
|
|
125
|
+
for (const projectPath of projectPaths) {
|
|
126
|
+
const described = describeClone(yield (0, gitlab_token_1.checkGitCloneAccess)({ host, projectPath, token }));
|
|
127
|
+
fetchable = fetchable || described.ok;
|
|
128
|
+
console.log(` fetch ${projectPath} ${described.line}`);
|
|
129
|
+
}
|
|
130
|
+
if (!fetchable && !force) {
|
|
131
|
+
console.error(`\nNothing was written. A token that cannot fetch those repositories cannot install them.\n` +
|
|
132
|
+
`Give it read access to the code, or re-run with --force to write it anyway.`);
|
|
133
|
+
return 1;
|
|
134
|
+
}
|
|
135
|
+
const stored = (0, composer_auth_1.storedGitlabToken)({ home, host });
|
|
136
|
+
if (stored !== undefined && stored !== token && !force) {
|
|
137
|
+
const accepted = yield (0, utils_1.confirm)({
|
|
138
|
+
problem: `\n${(0, composer_auth_1.composerAuthPath)(home)} already holds a different token for ${host}.`,
|
|
139
|
+
question: 'Replace it?',
|
|
140
|
+
hint: 'Re-run in a terminal to answer the question, or re-run with --force to replace it.',
|
|
141
|
+
defaultsToYes: false,
|
|
142
|
+
});
|
|
143
|
+
if (!accepted) {
|
|
144
|
+
console.error('\nNothing was written. The token already in the file was kept.');
|
|
145
|
+
return 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const written = (0, composer_auth_1.writeGitlabToken)({ home, host, token });
|
|
149
|
+
if (!written.ok) {
|
|
150
|
+
console.error(`\n${written.problem}`);
|
|
151
|
+
return 1;
|
|
152
|
+
}
|
|
153
|
+
const strays = (0, composer_auth_1.gitlabTokenHosts)(home).filter((key) => key !== host && (0, auth_hint_1.gitHostFromInput)(key) === host);
|
|
154
|
+
const single = strays.length === 1;
|
|
155
|
+
const unused = single ? 'that entry is' : 'those entries are';
|
|
156
|
+
console.log(`\n${written.replaced ? 'Replaced' : 'Wrote'} the ${host} token in ${(0, composer_auth_1.composerAuthPath)(home)}.\n` +
|
|
157
|
+
`The API containers mount that directory, so composer inside them reads it.` +
|
|
158
|
+
(strays.length === 0
|
|
159
|
+
? ''
|
|
160
|
+
: `\n\nThe file also holds ${strays.map((key) => `"${key}"`).join(', ')} for the same host. Composer ` +
|
|
161
|
+
`matches a gitlab-token by host name, so ${unused} never used. You can remove ${single ? 'it' : 'them'}.`));
|
|
162
|
+
return 0;
|
|
163
|
+
});
|
|
164
|
+
exports.authCommand = authCommand;
|
|
165
|
+
//# sourceMappingURL=auth-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-command.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/auth/auth-command.ts"],"names":[],"mappings":";;;;AAAA,gDAAmF;AACnF,8DAA6D;AAC7D,8DAA6D;AAC7D,oCAAmC;AACnC,mDAMyB;AACzB,mEAAkE;AAClE,iDAAsF;AAYtF,MAAM,KAAK,GAAG,CAAC,UAAkB,EAAE,EAAE,CACnC;IACE,UAAU,UAAU,iBAAiB;IACrC,EAAE;IACF,uFAAuF;IACvF,oFAAoF;IACpF,EAAE;IACF,8EAA8E;IAC9E,EAAE;IACF,6DAA6D;IAC7D,EAAE;IACF,OAAO;IACP,uFAAuF;IACvF,wEAAwE;CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEf;;;;GAIG;AACH,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;;IACnC,MAAM,MAAM,GAAG,IAAA,qCAAkB,EAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IAE1D,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,sBAAU,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAElE,IAAI,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,IAAA,qCAAkB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAExE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,SAAS;QAE3B,KAAK,MAAM,GAAG,IAAI,IAAA,+CAAuB,EAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,IAAA,sBAAU,EAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,WAAW,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW;gBAAE,SAAS;YAEpC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAE,EAAE;IAC1C,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC9C,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAChE,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC5D,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,+BAA+B,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC9D,KAAK,aAAa;YAChB,OAAO,EAAE,IAAI,EAAE,gBAAgB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CACrD,IAAA,kCAAmB,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;IAClD,IAAI,KAAK,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC;IAEjD,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;SACtF,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;SAC1G,CAAC;QACJ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAEL,wGAAwG;AACjG,MAAM,WAAW,GAAG,KAKa,EAAE,oDALR,EAChC,IAAI,EACJ,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,EACpB,UAAU,GAAG,SAAS,EACtB,IAAI,GAAG,IAAA,mCAAmB,GAAE,GACT;;IACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAE/B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,4BAAgB,EAAC,MAAA,UAAU,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC;IAE9C,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CACX,IAAI,UAAU,CAAC,CAAC,CAAC,oDAAoD,UAAU,6BAA6B,CAC7G,CAAC;QAEF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CACX,0FAA0F;YACxF,KAAK,UAAU,6BAA6B,CAC/C,CAAC;QAEF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CACX,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,2DAA2D;YAC/E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,IAAI,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7E,CAAC;QAEF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEzB,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;QAEzG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,IAAI,SAAS,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC;IAE1C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,IAAA,kCAAmB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEzF,SAAS,GAAG,SAAS,IAAI,SAAS,CAAC,EAAE,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,4FAA4F;YAC1F,6EAA6E,CAChF,CAAC;QAEF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,iCAAiB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAO,EAAC;YAC7B,OAAO,EAAE,KAAK,IAAA,gCAAgB,EAAC,IAAI,CAAC,wCAAwC,IAAI,GAAG;YACnF,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,oFAAoF;YAC1F,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAEhF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,gCAAgB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAExD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEtC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,gCAAgB,EAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,IAAA,4BAAgB,EAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;IACtG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAE9D,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,aAAa,IAAA,gCAAgB,EAAC,IAAI,CAAC,KAAK;QAC9F,4EAA4E;QAC5E,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,2BAA2B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B;gBACpG,2CAA2C,MAAM,+BAA+B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CACjH,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC,CAAA,CAAC;AA3HW,QAAA,WAAW,eA2HtB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The compose file of every API here mounts `$HOME/.composer` into its container, so this is the
|
|
3
|
+
* directory the container's composer reads, whatever `COMPOSER_HOME` says on the host.
|
|
4
|
+
*/
|
|
5
|
+
export declare const defaultComposerHome: () => string;
|
|
6
|
+
export declare const composerAuthPath: (home: string) => string;
|
|
7
|
+
export type WriteTokenResult = {
|
|
8
|
+
ok: true;
|
|
9
|
+
path: string;
|
|
10
|
+
replaced: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
problem: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Adds one host's GitLab token to composer's auth.json, keeping every other credential in the file.
|
|
17
|
+
* A file that cannot be parsed is reported rather than replaced, so nothing already in it is lost.
|
|
18
|
+
*/
|
|
19
|
+
export declare const writeGitlabToken: (options: {
|
|
20
|
+
home: string;
|
|
21
|
+
host: string;
|
|
22
|
+
token: string;
|
|
23
|
+
}) => WriteTokenResult;
|
|
24
|
+
/** The token composer already holds for one host, or undefined when it holds none. */
|
|
25
|
+
export declare const storedGitlabToken: (options: {
|
|
26
|
+
home: string;
|
|
27
|
+
host: string;
|
|
28
|
+
}) => string | undefined;
|
|
29
|
+
/** The hosts composer already holds a GitLab token for. */
|
|
30
|
+
export declare const gitlabTokenHosts: (home: string) => string[];
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gitlabTokenHosts = exports.storedGitlabToken = exports.writeGitlabToken = exports.composerAuthPath = exports.defaultComposerHome = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
/**
|
|
8
|
+
* The compose file of every API here mounts `$HOME/.composer` into its container, so this is the
|
|
9
|
+
* directory the container's composer reads, whatever `COMPOSER_HOME` says on the host.
|
|
10
|
+
*/
|
|
11
|
+
const defaultComposerHome = () => (0, path_1.join)((0, os_1.homedir)(), '.composer');
|
|
12
|
+
exports.defaultComposerHome = defaultComposerHome;
|
|
13
|
+
const composerAuthPath = (home) => (0, path_1.join)(home, 'auth.json');
|
|
14
|
+
exports.composerAuthPath = composerAuthPath;
|
|
15
|
+
const GITLAB_TOKENS = 'gitlab-token';
|
|
16
|
+
const storedTokens = (auth) => auth[GITLAB_TOKENS];
|
|
17
|
+
const readAuth = (path) => {
|
|
18
|
+
if (!(0, fs_1.existsSync)(path))
|
|
19
|
+
return { auth: {} };
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return { unreadable: `${path} is not valid JSON: ${error instanceof Error ? error.message : String(error)}` };
|
|
26
|
+
}
|
|
27
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
28
|
+
return { unreadable: `${path} does not hold a JSON object.` };
|
|
29
|
+
}
|
|
30
|
+
return { auth: parsed };
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Adds one host's GitLab token to composer's auth.json, keeping every other credential in the file.
|
|
34
|
+
* A file that cannot be parsed is reported rather than replaced, so nothing already in it is lost.
|
|
35
|
+
*/
|
|
36
|
+
const writeGitlabToken = (options) => {
|
|
37
|
+
const { home, host, token } = options;
|
|
38
|
+
const path = (0, exports.composerAuthPath)(home);
|
|
39
|
+
const read = readAuth(path);
|
|
40
|
+
if ('unreadable' in read) {
|
|
41
|
+
return { ok: false, problem: `${read.unreadable}\nFix it or move it aside, so no other credential in it is lost.` };
|
|
42
|
+
}
|
|
43
|
+
const tokens = Object.assign({}, storedTokens(read.auth));
|
|
44
|
+
const replaced = tokens[host] !== undefined && tokens[host] !== token;
|
|
45
|
+
tokens[host] = token;
|
|
46
|
+
(0, fs_1.mkdirSync)(home, { recursive: true });
|
|
47
|
+
(0, fs_1.writeFileSync)(path, `${JSON.stringify(Object.assign(Object.assign({}, read.auth), { [GITLAB_TOKENS]: tokens }), null, 4)}\n`, {
|
|
48
|
+
encoding: 'utf8',
|
|
49
|
+
mode: 0o600,
|
|
50
|
+
});
|
|
51
|
+
// writeFileSync only applies mode when it creates the file, and this one usually already exists.
|
|
52
|
+
(0, fs_1.chmodSync)(path, 0o600);
|
|
53
|
+
return { ok: true, path, replaced };
|
|
54
|
+
};
|
|
55
|
+
exports.writeGitlabToken = writeGitlabToken;
|
|
56
|
+
/** The token composer already holds for one host, or undefined when it holds none. */
|
|
57
|
+
const storedGitlabToken = (options) => {
|
|
58
|
+
var _a;
|
|
59
|
+
const read = readAuth((0, exports.composerAuthPath)(options.home));
|
|
60
|
+
return 'unreadable' in read ? undefined : (_a = storedTokens(read.auth)) === null || _a === void 0 ? void 0 : _a[options.host];
|
|
61
|
+
};
|
|
62
|
+
exports.storedGitlabToken = storedGitlabToken;
|
|
63
|
+
/** The hosts composer already holds a GitLab token for. */
|
|
64
|
+
const gitlabTokenHosts = (home) => {
|
|
65
|
+
var _a;
|
|
66
|
+
const read = readAuth((0, exports.composerAuthPath)(home));
|
|
67
|
+
return 'unreadable' in read ? [] : Object.keys((_a = storedTokens(read.auth)) !== null && _a !== void 0 ? _a : {});
|
|
68
|
+
};
|
|
69
|
+
exports.gitlabTokenHosts = gitlabTokenHosts;
|
|
70
|
+
//# sourceMappingURL=composer-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-auth.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/auth/composer-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The git urls a checkout's composer.json pulls packages from. These are the repositories a token is
|
|
3
|
+
* needed for; the API's own repository is not one of them, because the developer already has it.
|
|
4
|
+
*/
|
|
5
|
+
export declare const composerGitRepositories: (repoPath: string) => string[];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.composerGitRepositories = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const urlOf = (entry) => typeof entry === 'object' && entry !== null ? entry['url'] : undefined;
|
|
7
|
+
/**
|
|
8
|
+
* The git urls a checkout's composer.json pulls packages from. These are the repositories a token is
|
|
9
|
+
* needed for; the API's own repository is not one of them, because the developer already has it.
|
|
10
|
+
*/
|
|
11
|
+
const composerGitRepositories = (repoPath) => {
|
|
12
|
+
const path = (0, path_1.join)(repoPath, 'composer.json');
|
|
13
|
+
if (!(0, fs_1.existsSync)(path))
|
|
14
|
+
return [];
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
|
|
18
|
+
}
|
|
19
|
+
catch (_a) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
const declared = typeof parsed === 'object' && parsed !== null ? parsed : {};
|
|
23
|
+
const repositories = declared['repositories'];
|
|
24
|
+
// composer accepts both a list and a name-keyed map here.
|
|
25
|
+
const entries = Array.isArray(repositories)
|
|
26
|
+
? repositories
|
|
27
|
+
: typeof repositories === 'object' && repositories !== null
|
|
28
|
+
? Object.values(repositories)
|
|
29
|
+
: [];
|
|
30
|
+
return entries.map(urlOf).filter((url) => typeof url === 'string');
|
|
31
|
+
};
|
|
32
|
+
exports.composerGitRepositories = composerGitRepositories;
|
|
33
|
+
//# sourceMappingURL=composer-repositories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-repositories.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/auth/composer-repositories.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA4B;AAE5B,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,EAAE,CAC/B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEtG;;;GAGG;AACI,MAAM,uBAAuB,GAAG,CAAC,QAAgB,EAAY,EAAE;IACpE,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAE7C,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1G,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9C,0DAA0D;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QACzC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI;YACzD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7B,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC;AACpF,CAAC,CAAC;AAvBW,QAAA,uBAAuB,2BAuBlC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type TokenCheck = {
|
|
2
|
+
state: 'valid';
|
|
3
|
+
name?: string;
|
|
4
|
+
scopes: string[];
|
|
5
|
+
expiresAt?: string;
|
|
6
|
+
} | {
|
|
7
|
+
state: 'undisclosed';
|
|
8
|
+
} | {
|
|
9
|
+
state: 'unauthorized';
|
|
10
|
+
} | {
|
|
11
|
+
state: 'unreachable';
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Asks GitLab what the token is. A project or group access token answers 403 here, and so does a
|
|
16
|
+
* token without an api scope, so only 401 proves the token itself is wrong.
|
|
17
|
+
*/
|
|
18
|
+
export declare const describeGitlabToken: (options: {
|
|
19
|
+
host: string;
|
|
20
|
+
token: string;
|
|
21
|
+
}) => Promise<TokenCheck>;
|
|
22
|
+
export type CloneCheck = {
|
|
23
|
+
state: 'clonable';
|
|
24
|
+
} | {
|
|
25
|
+
state: 'forbidden';
|
|
26
|
+
} | {
|
|
27
|
+
state: 'unauthorized';
|
|
28
|
+
} | {
|
|
29
|
+
state: 'missing';
|
|
30
|
+
} | {
|
|
31
|
+
state: 'unreachable';
|
|
32
|
+
reason: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Asks the host for a repository's refs with the token as a basic credential. This is the first
|
|
36
|
+
* request `git clone` over https makes, so it proves the token can fetch code and needs no api scope,
|
|
37
|
+
* which a project access token does not have.
|
|
38
|
+
*/
|
|
39
|
+
export declare const checkGitCloneAccess: (options: {
|
|
40
|
+
host: string;
|
|
41
|
+
projectPath: string;
|
|
42
|
+
token: string;
|
|
43
|
+
}) => Promise<CloneCheck>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkGitCloneAccess = exports.describeGitlabToken = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const TIMEOUT_MS = 10000;
|
|
6
|
+
const request = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
7
|
+
const { url, headers } = options;
|
|
8
|
+
try {
|
|
9
|
+
const response = yield fetch(url, { headers, signal: AbortSignal.timeout(TIMEOUT_MS) });
|
|
10
|
+
return { response };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return { reason: error instanceof Error ? error.message : String(error) };
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Asks GitLab what the token is. A project or group access token answers 403 here, and so does a
|
|
18
|
+
* token without an api scope, so only 401 proves the token itself is wrong.
|
|
19
|
+
*/
|
|
20
|
+
const describeGitlabToken = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
const { host, token } = options;
|
|
22
|
+
const result = yield request({
|
|
23
|
+
url: `https://${host}/api/v4/personal_access_tokens/self`,
|
|
24
|
+
headers: { 'PRIVATE-TOKEN': token },
|
|
25
|
+
});
|
|
26
|
+
if ('reason' in result)
|
|
27
|
+
return { state: 'unreachable', reason: result.reason };
|
|
28
|
+
if (result.response.status === 401)
|
|
29
|
+
return { state: 'unauthorized' };
|
|
30
|
+
if (result.response.status === 403)
|
|
31
|
+
return { state: 'undisclosed' };
|
|
32
|
+
if (!result.response.ok) {
|
|
33
|
+
return { state: 'unreachable', reason: `${host} answered ${result.response.status} for the token itself.` };
|
|
34
|
+
}
|
|
35
|
+
const body = yield result.response.json().catch(() => undefined);
|
|
36
|
+
const record = typeof body === 'object' && body !== null ? body : {};
|
|
37
|
+
return {
|
|
38
|
+
state: 'valid',
|
|
39
|
+
name: typeof record['name'] === 'string' ? record['name'] : undefined,
|
|
40
|
+
scopes: Array.isArray(record['scopes']) ? record['scopes'].map(String) : [],
|
|
41
|
+
expiresAt: typeof record['expires_at'] === 'string' ? record['expires_at'] : undefined,
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
exports.describeGitlabToken = describeGitlabToken;
|
|
45
|
+
/**
|
|
46
|
+
* Asks the host for a repository's refs with the token as a basic credential. This is the first
|
|
47
|
+
* request `git clone` over https makes, so it proves the token can fetch code and needs no api scope,
|
|
48
|
+
* which a project access token does not have.
|
|
49
|
+
*/
|
|
50
|
+
const checkGitCloneAccess = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
51
|
+
var _a;
|
|
52
|
+
const { host, projectPath, token } = options;
|
|
53
|
+
const result = yield request({
|
|
54
|
+
url: `https://${host}/${projectPath}.git/info/refs?service=git-upload-pack`,
|
|
55
|
+
headers: { Authorization: `Basic ${Buffer.from(`oauth2:${token}`).toString('base64')}` },
|
|
56
|
+
});
|
|
57
|
+
if ('reason' in result)
|
|
58
|
+
return { state: 'unreachable', reason: result.reason };
|
|
59
|
+
const { status } = result.response;
|
|
60
|
+
yield ((_a = result.response.body) === null || _a === void 0 ? void 0 : _a.cancel());
|
|
61
|
+
if (status === 200)
|
|
62
|
+
return { state: 'clonable' };
|
|
63
|
+
if (status === 401)
|
|
64
|
+
return { state: 'unauthorized' };
|
|
65
|
+
if (status === 403)
|
|
66
|
+
return { state: 'forbidden' };
|
|
67
|
+
if (status === 404)
|
|
68
|
+
return { state: 'missing' };
|
|
69
|
+
return { state: 'unreachable', reason: `${host} answered ${status} for ${projectPath}.` };
|
|
70
|
+
});
|
|
71
|
+
exports.checkGitCloneAccess = checkGitCloneAccess;
|
|
72
|
+
//# sourceMappingURL=gitlab-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-token.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/auth/gitlab-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./auth-command"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./composer-auth"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./composer-repositories"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./gitlab-token"), exports);
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/auth/index.ts"],"names":[],"mappings":";;;AAAA,yDAA+B;AAC/B,0DAAgC;AAChC,kEAAwC;AACxC,yDAA+B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every problem with the repo topology config: a file that cannot be parsed, a key nothing reads, a
|
|
3
|
+
* checkout that is not there, and values still sitting in the file they moved out of.
|
|
4
|
+
*/
|
|
5
|
+
export declare const diagnoseLocalConfig: ({ root }: {
|
|
6
|
+
root: string;
|
|
7
|
+
}) => string[];
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diagnoseLocalConfig = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const local_config_1 = require("./local-config");
|
|
7
|
+
/** Marks a directory as an `ethlete-sdk` checkout rather than some other folder. */
|
|
8
|
+
const SDK_CHECKOUT_MARKERS = ['libs/components', 'libs/core', 'libs/agent-rules'];
|
|
9
|
+
const quoted = (keys) => keys.map((key) => `"${key}"`).join(', ');
|
|
10
|
+
const describeSdkSourcePath = (options) => {
|
|
11
|
+
const { root, value, fileName } = options;
|
|
12
|
+
if (value === undefined)
|
|
13
|
+
return [];
|
|
14
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
15
|
+
return [`${fileName} has an invalid "sdkSourcePath" — use a path to an ethlete-sdk checkout.`];
|
|
16
|
+
}
|
|
17
|
+
const absolute = (0, local_config_1.resolveConfiguredPath)(root, value);
|
|
18
|
+
if (!(0, fs_1.existsSync)(absolute)) {
|
|
19
|
+
return [`${fileName} points "sdkSourcePath" at ${absolute}, which does not exist.`];
|
|
20
|
+
}
|
|
21
|
+
if (SDK_CHECKOUT_MARKERS.some((marker) => !(0, fs_1.existsSync)((0, path_1.join)(absolute, marker)))) {
|
|
22
|
+
return [`${fileName} points "sdkSourcePath" at ${absolute}, which is not an ethlete-sdk checkout.`];
|
|
23
|
+
}
|
|
24
|
+
return [];
|
|
25
|
+
};
|
|
26
|
+
const describeApiRepoPaths = (options) => {
|
|
27
|
+
const { root, value, fileName } = options;
|
|
28
|
+
if (value === undefined)
|
|
29
|
+
return [];
|
|
30
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
31
|
+
return [
|
|
32
|
+
`${fileName} has an invalid "apiRepoPaths" value — use an object mapping an app name to its API repo path.`,
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
return Object.entries(value).flatMap(([app, path]) => {
|
|
36
|
+
if (typeof path !== 'string' || path.trim().length === 0) {
|
|
37
|
+
return [`${fileName} has an invalid "apiRepoPaths.${app}" value — use a path to the API repo.`];
|
|
38
|
+
}
|
|
39
|
+
const absolute = (0, local_config_1.resolveConfiguredPath)(root, path);
|
|
40
|
+
if (!(0, fs_1.existsSync)(absolute)) {
|
|
41
|
+
return [`${fileName} points "apiRepoPaths.${app}" at ${absolute}, which does not exist.`];
|
|
42
|
+
}
|
|
43
|
+
if (!(0, fs_1.statSync)(absolute).isDirectory()) {
|
|
44
|
+
return [`${fileName} points "apiRepoPaths.${app}" at ${absolute}, which is not a directory.`];
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
const describeApiRepoBranches = (options) => {
|
|
50
|
+
const { value, fileName } = options;
|
|
51
|
+
if (value === undefined)
|
|
52
|
+
return [];
|
|
53
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
54
|
+
return [
|
|
55
|
+
`${fileName} has an invalid "apiRepoBranches" value — use an object mapping an app name to its expected API branch.`,
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
return Object.entries(value).flatMap(([app, branch]) => typeof branch === 'string' && branch.trim().length > 0
|
|
59
|
+
? []
|
|
60
|
+
: [`${fileName} has an invalid "apiRepoBranches.${app}" value — use a non-empty branch name.`]);
|
|
61
|
+
};
|
|
62
|
+
const describeUpdateAgentCommand = (options) => {
|
|
63
|
+
const { value, fileName } = options;
|
|
64
|
+
if (value === undefined)
|
|
65
|
+
return [];
|
|
66
|
+
return typeof value === 'string' && value.trim().length > 0
|
|
67
|
+
? []
|
|
68
|
+
: [`${fileName} has an invalid "updateAgentCommand" value — use the command that hands a prompt to an agent.`];
|
|
69
|
+
};
|
|
70
|
+
const describeValues = (options) => {
|
|
71
|
+
const { root, config, fileName } = options;
|
|
72
|
+
return [
|
|
73
|
+
...describeSdkSourcePath({ root, value: config.sdkSourcePath, fileName }),
|
|
74
|
+
...describeApiRepoPaths({ root, value: config.apiRepoPaths, fileName }),
|
|
75
|
+
...describeApiRepoBranches({ value: config.apiRepoBranches, fileName }),
|
|
76
|
+
...describeUpdateAgentCommand({ value: config.updateAgentCommand, fileName }),
|
|
77
|
+
];
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Every problem with the repo topology config: a file that cannot be parsed, a key nothing reads, a
|
|
81
|
+
* checkout that is not there, and values still sitting in the file they moved out of.
|
|
82
|
+
*/
|
|
83
|
+
const diagnoseLocalConfig = ({ root }) => {
|
|
84
|
+
const primary = (0, local_config_1.readLocalConfigFile)((0, path_1.join)(root, local_config_1.LOCAL_CONFIG_FILE_NAME));
|
|
85
|
+
if (primary.status === 'unreadable')
|
|
86
|
+
return [`${local_config_1.LOCAL_CONFIG_FILE_NAME} is not valid JSON.`];
|
|
87
|
+
if (primary.status === 'not-an-object')
|
|
88
|
+
return [`${local_config_1.LOCAL_CONFIG_FILE_NAME} is not a JSON object.`];
|
|
89
|
+
if (primary.status === 'ok') {
|
|
90
|
+
const unknownKeys = Object.keys(primary.config).filter((key) => !local_config_1.LOCAL_CONFIG_KEYS.includes(key));
|
|
91
|
+
return [
|
|
92
|
+
...(unknownKeys.length > 0
|
|
93
|
+
? [
|
|
94
|
+
`${local_config_1.LOCAL_CONFIG_FILE_NAME} contains key(s) nothing reads: ${quoted(unknownKeys)} — it supports ${quoted(local_config_1.LOCAL_CONFIG_KEYS)}.`,
|
|
95
|
+
]
|
|
96
|
+
: []),
|
|
97
|
+
...describeValues({ root, config: primary.config, fileName: local_config_1.LOCAL_CONFIG_FILE_NAME }),
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
const legacy = (0, local_config_1.readLocalConfigFile)((0, path_1.join)(root, local_config_1.LEGACY_LOCAL_CONFIG_FILE_NAME));
|
|
101
|
+
if (legacy.status !== 'ok')
|
|
102
|
+
return [];
|
|
103
|
+
const held = local_config_1.LOCAL_CONFIG_KEYS.filter((key) => legacy.config[key] !== undefined);
|
|
104
|
+
if (held.length === 0)
|
|
105
|
+
return [];
|
|
106
|
+
return [
|
|
107
|
+
`${local_config_1.LEGACY_LOCAL_CONFIG_FILE_NAME} still holds ${quoted(held)} — move ${held.length === 1 ? 'it' : 'them'} to ${local_config_1.LOCAL_CONFIG_FILE_NAME}.`,
|
|
108
|
+
...describeValues({ root, config: legacy.config, fileName: local_config_1.LEGACY_LOCAL_CONFIG_FILE_NAME }),
|
|
109
|
+
];
|
|
110
|
+
};
|
|
111
|
+
exports.diagnoseLocalConfig = diagnoseLocalConfig;
|
|
112
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/config/diagnose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/config/index.ts"],"names":[],"mappings":";;;AAAA,qDAA2B;AAC3B,yDAA+B"}
|