@redocly/reunite-integration 2.54.0 → 2.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/api-client.d.ts +85 -0
- package/lib/api/api-client.d.ts.map +1 -0
- package/lib/api/api-client.js +254 -0
- package/lib/api/api-client.js.map +1 -0
- package/lib/api/api-keys.d.ts +2 -0
- package/lib/api/api-keys.d.ts.map +1 -0
- package/lib/api/api-keys.js +7 -0
- package/lib/api/api-keys.js.map +1 -0
- package/lib/api/domains.d.ts +12 -0
- package/lib/api/domains.d.ts.map +1 -0
- package/lib/api/domains.js +52 -0
- package/lib/api/domains.js.map +1 -0
- package/lib/api/index.d.ts +4 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/index.js +4 -0
- package/lib/api/index.js.map +1 -0
- package/lib/api/types.d.ts +103 -0
- package/lib/api/types.d.ts.map +1 -0
- package/lib/api/types.js +2 -0
- package/lib/api/types.js.map +1 -0
- package/lib/auth/device-flow.d.ts +29 -0
- package/lib/auth/device-flow.d.ts.map +1 -0
- package/lib/auth/device-flow.js +140 -0
- package/lib/auth/device-flow.js.map +1 -0
- package/lib/auth/oauth-client.d.ts +20 -0
- package/lib/auth/oauth-client.d.ts.map +1 -0
- package/lib/auth/oauth-client.js +118 -0
- package/lib/auth/oauth-client.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -0
- package/lib/push-status.d.ts +22 -0
- package/lib/push-status.d.ts.map +1 -0
- package/lib/push-status.js +44 -0
- package/lib/push-status.js.map +1 -0
- package/lib/push.d.ts +37 -0
- package/lib/push.d.ts.map +1 -0
- package/lib/push.js +68 -0
- package/lib/push.js.map +1 -0
- package/lib/scorecard-classic/remote/fetch-scorecard.d.ts +9 -0
- package/lib/scorecard-classic/remote/fetch-scorecard.d.ts.map +1 -0
- package/lib/scorecard-classic/remote/fetch-scorecard.js +77 -0
- package/lib/scorecard-classic/remote/fetch-scorecard.js.map +1 -0
- package/lib/scorecard-classic/targets-handler/targets-handler.d.ts +13 -0
- package/lib/scorecard-classic/targets-handler/targets-handler.d.ts.map +1 -0
- package/lib/scorecard-classic/targets-handler/targets-handler.js +54 -0
- package/lib/scorecard-classic/targets-handler/targets-handler.js.map +1 -0
- package/lib/scorecard-classic/types.d.ts +19 -0
- package/lib/scorecard-classic/types.d.ts.map +1 -0
- package/lib/scorecard-classic/types.js +2 -0
- package/lib/scorecard-classic/types.js.map +1 -0
- package/lib/scorecard-classic/validation/plugin-evaluator.d.ts +3 -0
- package/lib/scorecard-classic/validation/plugin-evaluator.d.ts.map +1 -0
- package/lib/scorecard-classic/validation/plugin-evaluator.js +12 -0
- package/lib/scorecard-classic/validation/plugin-evaluator.js.map +1 -0
- package/lib/scorecard-classic/validation/project-url.d.ts +2 -0
- package/lib/scorecard-classic/validation/project-url.d.ts.map +1 -0
- package/lib/scorecard-classic/validation/project-url.js +11 -0
- package/lib/scorecard-classic/validation/project-url.js.map +1 -0
- package/lib/scorecard-classic/validation/validate-scorecard.d.ts +21 -0
- package/lib/scorecard-classic/validation/validate-scorecard.d.ts.map +1 -0
- package/lib/scorecard-classic/validation/validate-scorecard.js +55 -0
- package/lib/scorecard-classic/validation/validate-scorecard.js.map +1 -0
- package/lib/utils/constants.d.ts +3 -0
- package/lib/utils/constants.d.ts.map +1 -0
- package/lib/utils/constants.js +5 -0
- package/lib/utils/constants.js.map +1 -0
- package/lib/utils/fetch-with-timeout.d.ts +6 -0
- package/lib/utils/fetch-with-timeout.d.ts.map +1 -0
- package/lib/utils/fetch-with-timeout.js +25 -0
- package/lib/utils/fetch-with-timeout.js.map +1 -0
- package/lib/utils/proxy-env.d.ts +3 -0
- package/lib/utils/proxy-env.d.ts.map +1 -0
- package/lib/utils/proxy-env.js +37 -0
- package/lib/utils/proxy-env.js.map +1 -0
- package/lib/utils/retry-until-condition-met.d.ts +19 -0
- package/lib/utils/retry-until-condition-met.d.ts.map +1 -0
- package/lib/utils/retry-until-condition-met.js +28 -0
- package/lib/utils/retry-until-condition-met.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as childProcess from 'node:child_process';
|
|
2
|
+
import { ReuniteApiClient } from '../api/api-client.js';
|
|
3
|
+
import { DEFAULT_FETCH_TIMEOUT } from '../utils/constants.js';
|
|
4
|
+
export class RedoclyOAuthDeviceFlow {
|
|
5
|
+
baseUrl;
|
|
6
|
+
apiClient;
|
|
7
|
+
clientName = 'redocly-cli';
|
|
8
|
+
constructor(baseUrl, version) {
|
|
9
|
+
this.baseUrl = baseUrl;
|
|
10
|
+
this.apiClient = new ReuniteApiClient('login', version);
|
|
11
|
+
}
|
|
12
|
+
// `onDeviceCode` gets the URL and code to show the user before the browser opens and polling starts.
|
|
13
|
+
async run(onDeviceCode) {
|
|
14
|
+
const code = await this.getDeviceCode();
|
|
15
|
+
onDeviceCode?.({
|
|
16
|
+
verificationUri: code.verificationUri,
|
|
17
|
+
verificationUriComplete: code.verificationUriComplete,
|
|
18
|
+
userCode: code.userCode,
|
|
19
|
+
});
|
|
20
|
+
this.openBrowser(code.verificationUriComplete);
|
|
21
|
+
const accessToken = await this.pollingAccessToken(code.deviceCode, code.interval, code.expiresIn);
|
|
22
|
+
return this.withResidency(accessToken);
|
|
23
|
+
}
|
|
24
|
+
openBrowser(url) {
|
|
25
|
+
if (!/^https?:\/\//.test(url)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// The residency URL is configurable, so the response is untrusted: pass the URL as an argument, never through a shell.
|
|
29
|
+
const [command, args] = process.platform === 'win32'
|
|
30
|
+
? ['rundll32', ['url.dll,FileProtocolHandler', url]]
|
|
31
|
+
: process.platform === 'darwin'
|
|
32
|
+
? ['open', [url]]
|
|
33
|
+
: ['xdg-open', [url]];
|
|
34
|
+
childProcess
|
|
35
|
+
.spawn(command, args, { stdio: 'ignore', detached: true })
|
|
36
|
+
.on('error', () => {
|
|
37
|
+
// silently fail if browser cannot be opened
|
|
38
|
+
})
|
|
39
|
+
.unref();
|
|
40
|
+
}
|
|
41
|
+
async verifyToken(accessToken) {
|
|
42
|
+
try {
|
|
43
|
+
const response = await this.sendRequest('/session', 'GET', undefined, {
|
|
44
|
+
Cookie: `accessToken=${accessToken};`,
|
|
45
|
+
});
|
|
46
|
+
return !!response.user;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async verifyApiKey(apiKey) {
|
|
53
|
+
try {
|
|
54
|
+
const response = await this.sendRequest('/api-keys-verify', 'POST', {
|
|
55
|
+
apiKey,
|
|
56
|
+
});
|
|
57
|
+
return !!response.success;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async refreshToken(refreshToken) {
|
|
64
|
+
const response = await this.sendRequest(`/device-rotate-token`, 'POST', {
|
|
65
|
+
grant_type: 'refresh_token',
|
|
66
|
+
client_name: this.clientName,
|
|
67
|
+
refresh_token: refreshToken,
|
|
68
|
+
});
|
|
69
|
+
if (!response.access_token) {
|
|
70
|
+
throw new Error('Failed to refresh token');
|
|
71
|
+
}
|
|
72
|
+
return this.withResidency({
|
|
73
|
+
access_token: response.access_token,
|
|
74
|
+
refresh_token: response.refresh_token,
|
|
75
|
+
expires_in: response.expires_in,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async pollingAccessToken(deviceCode, interval, expiresIn) {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
const intervalId = setInterval(async () => {
|
|
81
|
+
const response = await this.getAccessToken(deviceCode);
|
|
82
|
+
if (response.access_token) {
|
|
83
|
+
clearInterval(intervalId);
|
|
84
|
+
clearTimeout(timeoutId);
|
|
85
|
+
resolve(response);
|
|
86
|
+
}
|
|
87
|
+
if (response.error && response.error !== 'authorization_pending') {
|
|
88
|
+
clearInterval(intervalId);
|
|
89
|
+
clearTimeout(timeoutId);
|
|
90
|
+
reject(response.error_description);
|
|
91
|
+
}
|
|
92
|
+
}, interval * 1000);
|
|
93
|
+
const timeoutId = setTimeout(async () => {
|
|
94
|
+
clearInterval(intervalId);
|
|
95
|
+
clearTimeout(timeoutId);
|
|
96
|
+
reject('Authorization has expired. Please try again.');
|
|
97
|
+
}, expiresIn * 1000);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async getAccessToken(deviceCode) {
|
|
101
|
+
return await this.sendRequest('/device-token', 'POST', {
|
|
102
|
+
client_name: this.clientName,
|
|
103
|
+
device_code: deviceCode,
|
|
104
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async getDeviceCode() {
|
|
108
|
+
const { device_code: deviceCode, user_code: userCode, verification_uri: verificationUri, verification_uri_complete: verificationUriComplete, interval = 10, expires_in: expiresIn = 300, } = await this.sendRequest('/device-authorize', 'POST', {
|
|
109
|
+
client_name: this.clientName,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
deviceCode,
|
|
113
|
+
userCode,
|
|
114
|
+
verificationUri,
|
|
115
|
+
verificationUriComplete,
|
|
116
|
+
interval,
|
|
117
|
+
expiresIn,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async sendRequest(path, method = 'GET', body = undefined, headers = {}) {
|
|
121
|
+
const url = `${this.baseUrl}/api${path}`;
|
|
122
|
+
const response = await this.apiClient.request(url, {
|
|
123
|
+
body: body ? JSON.stringify(body) : body,
|
|
124
|
+
method,
|
|
125
|
+
headers: { 'Content-Type': 'application/json', ...headers },
|
|
126
|
+
timeout: DEFAULT_FETCH_TIMEOUT,
|
|
127
|
+
});
|
|
128
|
+
if (response.status === 204) {
|
|
129
|
+
return { success: true };
|
|
130
|
+
}
|
|
131
|
+
return await response.json();
|
|
132
|
+
}
|
|
133
|
+
withResidency(credentials) {
|
|
134
|
+
return {
|
|
135
|
+
...credentials,
|
|
136
|
+
residency: this.baseUrl,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=device-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type DeviceCode } from './device-flow.js';
|
|
2
|
+
export declare class RedoclyOAuthClient {
|
|
3
|
+
private readonly version?;
|
|
4
|
+
readonly credentialsFolderPath: string;
|
|
5
|
+
readonly credentialsFilePath: string;
|
|
6
|
+
readonly credentialsFileName: string;
|
|
7
|
+
private readonly key;
|
|
8
|
+
private readonly iv;
|
|
9
|
+
constructor(version?: string | undefined);
|
|
10
|
+
login(baseUrl: string, onDeviceCode?: (code: DeviceCode) => void): Promise<void>;
|
|
11
|
+
logout(): Promise<void>;
|
|
12
|
+
isAuthorized(reuniteUrl: string, apiKey?: string): Promise<boolean>;
|
|
13
|
+
getAccessToken: (reuniteUrl: string) => Promise<string | null>;
|
|
14
|
+
private saveCredentials;
|
|
15
|
+
private readCredentials;
|
|
16
|
+
private removeCredentials;
|
|
17
|
+
private encryptCredentials;
|
|
18
|
+
private decryptCredentials;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=oauth-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-client.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAK7F,qBAAa,kBAAkB;IAQjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAPrC,SAAgB,qBAAqB,EAAE,MAAM,CAAC;IAC9C,SAAgB,mBAAmB,EAAE,MAAM,CAAC;IAC5C,SAAgB,mBAAmB,EAAE,MAAM,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;gBAEC,OAAO,CAAC,EAAE,MAAM,YAAA;IAgBhC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhF,MAAM;IAQN,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWzE,cAAc,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxE;YAEY,eAAe;YASf,eAAe;YAaf,iBAAiB;IAM/B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,kBAAkB;CAS3B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import { mkdirSync, existsSync, writeFileSync, readFileSync, rmSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { isValidReuniteUrl } from '../api/domains.js';
|
|
7
|
+
import { RedoclyOAuthDeviceFlow } from './device-flow.js';
|
|
8
|
+
const CREDENTIALS_SALT = '4618dbc9-8aed-4e27-aaf0-225f4603e5a4';
|
|
9
|
+
const CRYPTO_ALGORITHM = 'aes-256-cbc';
|
|
10
|
+
export class RedoclyOAuthClient {
|
|
11
|
+
version;
|
|
12
|
+
credentialsFolderPath;
|
|
13
|
+
credentialsFilePath;
|
|
14
|
+
credentialsFileName;
|
|
15
|
+
key;
|
|
16
|
+
iv;
|
|
17
|
+
constructor(version) {
|
|
18
|
+
this.version = version;
|
|
19
|
+
const homeDirPath = homedir();
|
|
20
|
+
this.credentialsFolderPath = path.join(homeDirPath, '.redocly');
|
|
21
|
+
this.credentialsFileName = 'credentials';
|
|
22
|
+
this.credentialsFilePath = path.join(this.credentialsFolderPath, this.credentialsFileName);
|
|
23
|
+
this.key = crypto
|
|
24
|
+
.createHash('sha256')
|
|
25
|
+
.update(`${this.credentialsFolderPath}${CREDENTIALS_SALT}`)
|
|
26
|
+
.digest();
|
|
27
|
+
this.iv = crypto.createHash('md5').update(this.credentialsFolderPath).digest();
|
|
28
|
+
mkdirSync(this.credentialsFolderPath, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
async login(baseUrl, onDeviceCode) {
|
|
31
|
+
const deviceFlow = new RedoclyOAuthDeviceFlow(baseUrl, this.version);
|
|
32
|
+
const credentials = await deviceFlow.run(onDeviceCode);
|
|
33
|
+
if (!credentials) {
|
|
34
|
+
throw new Error('Failed to login. No credentials received.');
|
|
35
|
+
}
|
|
36
|
+
await this.saveCredentials(credentials);
|
|
37
|
+
}
|
|
38
|
+
async logout() {
|
|
39
|
+
try {
|
|
40
|
+
this.removeCredentials();
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
// do nothing
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async isAuthorized(reuniteUrl, apiKey) {
|
|
47
|
+
if (apiKey) {
|
|
48
|
+
const deviceFlow = new RedoclyOAuthDeviceFlow(reuniteUrl, this.version);
|
|
49
|
+
return deviceFlow.verifyApiKey(apiKey);
|
|
50
|
+
}
|
|
51
|
+
const accessToken = await this.getAccessToken(reuniteUrl);
|
|
52
|
+
return Boolean(accessToken);
|
|
53
|
+
}
|
|
54
|
+
getAccessToken = async (reuniteUrl) => {
|
|
55
|
+
const deviceFlow = new RedoclyOAuthDeviceFlow(reuniteUrl, this.version);
|
|
56
|
+
const credentials = await this.readCredentials();
|
|
57
|
+
if (!credentials ||
|
|
58
|
+
!isValidReuniteUrl(reuniteUrl) ||
|
|
59
|
+
(credentials.residency && credentials.residency !== reuniteUrl)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const isValid = await deviceFlow.verifyToken(credentials.access_token);
|
|
63
|
+
if (isValid) {
|
|
64
|
+
return credentials.access_token;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const newCredentials = await deviceFlow.refreshToken(credentials.refresh_token);
|
|
68
|
+
await this.saveCredentials(newCredentials);
|
|
69
|
+
return newCredentials.access_token;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
async saveCredentials(credentials) {
|
|
76
|
+
try {
|
|
77
|
+
const encryptedCredentials = this.encryptCredentials(credentials);
|
|
78
|
+
writeFileSync(this.credentialsFilePath, encryptedCredentials, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new Error(`Failed to save credentials: ${error.message}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async readCredentials() {
|
|
85
|
+
if (!existsSync(this.credentialsFilePath)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const encryptedCredentials = readFileSync(this.credentialsFilePath, 'utf8');
|
|
90
|
+
return this.decryptCredentials(encryptedCredentials);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async removeCredentials() {
|
|
97
|
+
if (existsSync(this.credentialsFilePath)) {
|
|
98
|
+
rmSync(this.credentialsFilePath);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
encryptCredentials(credentials) {
|
|
102
|
+
const cipher = crypto.createCipheriv(CRYPTO_ALGORITHM, this.key, this.iv);
|
|
103
|
+
const encrypted = Buffer.concat([
|
|
104
|
+
cipher.update(JSON.stringify(credentials), 'utf8'),
|
|
105
|
+
cipher.final(),
|
|
106
|
+
]);
|
|
107
|
+
return encrypted.toString('hex');
|
|
108
|
+
}
|
|
109
|
+
decryptCredentials(encryptedCredentials) {
|
|
110
|
+
const decipher = crypto.createDecipheriv(CRYPTO_ALGORITHM, this.key, this.iv);
|
|
111
|
+
const decrypted = Buffer.concat([
|
|
112
|
+
decipher.update(Buffer.from(encryptedCredentials, 'hex')),
|
|
113
|
+
decipher.final(),
|
|
114
|
+
]);
|
|
115
|
+
return JSON.parse(decrypted.toString('utf8'));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=oauth-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client.js","sourceRoot":"","sources":["../../src/auth/oauth-client.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { getMostUrgentSunsetWarning, ReuniteApi, ReuniteApiClient, ReuniteApiError, type PushPayload, type SunsetWarning, } from './api/api-client.js';
|
|
2
|
+
export { getApiKeys } from './api/api-keys.js';
|
|
3
|
+
export { getDomain, getReuniteUrl, isValidReuniteUrl, InvalidReuniteUrlError, REUNITE_URLS, } from './api/domains.js';
|
|
4
|
+
export type { DeploymentStatus, DeploymentStatusResponse, ListRemotesResponse, ProjectSourceResponse, PushResponse, PushStatusResponse, Remote, ScorecardItem, UpsertRemoteResponse, } from './api/types.js';
|
|
5
|
+
export { RedoclyOAuthClient } from './auth/oauth-client.js';
|
|
6
|
+
export { RedoclyOAuthDeviceFlow, type Credentials, type DeviceCode } from './auth/device-flow.js';
|
|
7
|
+
export { collectFilesToPush, pushFiles, type FileToUpload, type PushOptions, type PushResult, } from './push.js';
|
|
8
|
+
export { getPushStatus, waitForDeployment, type BuildType, type PushStatusOptions, type WaitForDeploymentOptions, } from './push-status.js';
|
|
9
|
+
export { fetchRemoteScorecardAndPlugins, type FetchRemoteScorecardAndPluginsParams, } from './scorecard-classic/remote/fetch-scorecard.js';
|
|
10
|
+
export { getTarget, resolveConfigForTarget, } from './scorecard-classic/targets-handler/targets-handler.js';
|
|
11
|
+
export type { RemoteScorecardAndPlugins, ScorecardProblem } from './scorecard-classic/types.js';
|
|
12
|
+
export { evaluatePluginsFromCode } from './scorecard-classic/validation/plugin-evaluator.js';
|
|
13
|
+
export { isAllowedScorecardProjectUrl } from './scorecard-classic/validation/project-url.js';
|
|
14
|
+
export { validateScorecard, type ScorecardValidationResult, type ValidateScorecardParams, } from './scorecard-classic/validation/validate-scorecard.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACN,aAAa,EACb,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,EAC9B,KAAK,oCAAoC,GAC1C,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,SAAS,EACT,sBAAsB,GACvB,MAAM,wDAAwD,CAAC;AAChE,YAAY,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,GAC7B,MAAM,sDAAsD,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { getMostUrgentSunsetWarning, ReuniteApi, ReuniteApiClient, ReuniteApiError, } from './api/api-client.js';
|
|
2
|
+
export { getApiKeys } from './api/api-keys.js';
|
|
3
|
+
export { getDomain, getReuniteUrl, isValidReuniteUrl, InvalidReuniteUrlError, REUNITE_URLS, } from './api/domains.js';
|
|
4
|
+
export { RedoclyOAuthClient } from './auth/oauth-client.js';
|
|
5
|
+
export { RedoclyOAuthDeviceFlow } from './auth/device-flow.js';
|
|
6
|
+
export { collectFilesToPush, pushFiles, } from './push.js';
|
|
7
|
+
export { getPushStatus, waitForDeployment, } from './push-status.js';
|
|
8
|
+
export { fetchRemoteScorecardAndPlugins, } from './scorecard-classic/remote/fetch-scorecard.js';
|
|
9
|
+
export { getTarget, resolveConfigForTarget, } from './scorecard-classic/targets-handler/targets-handler.js';
|
|
10
|
+
export { evaluatePluginsFromCode } from './scorecard-classic/validation/plugin-evaluator.js';
|
|
11
|
+
export { isAllowedScorecardProjectUrl } from './scorecard-classic/validation/project-url.js';
|
|
12
|
+
export { validateScorecard, } from './scorecard-classic/validation/validate-scorecard.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,UAAU,EACV,gBAAgB,EAChB,eAAe,GAGhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAY1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAqC,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,kBAAkB,EAClB,SAAS,GAIV,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,aAAa,EACb,iBAAiB,GAIlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,GAE/B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,SAAS,EACT,sBAAsB,GACvB,MAAM,wDAAwD,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EACL,iBAAiB,GAGlB,MAAM,sDAAsD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type SunsetWarning } from './api/index.js';
|
|
2
|
+
import type { PushResponse } from './api/types.js';
|
|
3
|
+
export type BuildType = 'preview' | 'production';
|
|
4
|
+
export type PushStatusOptions = {
|
|
5
|
+
domain: string;
|
|
6
|
+
apiKey: string;
|
|
7
|
+
organization: string;
|
|
8
|
+
project: string;
|
|
9
|
+
pushId: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
onSunsetWarning?: (warning: SunsetWarning) => void;
|
|
12
|
+
};
|
|
13
|
+
export type WaitForDeploymentOptions = PushStatusOptions & {
|
|
14
|
+
buildType: BuildType;
|
|
15
|
+
maxExecutionTime?: number;
|
|
16
|
+
retryIntervalMs?: number;
|
|
17
|
+
startTime?: number;
|
|
18
|
+
onRetry?: (push: PushResponse) => void | Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
export declare function getPushStatus(options: PushStatusOptions): Promise<PushResponse>;
|
|
21
|
+
export declare function waitForDeployment({ buildType, maxExecutionTime, retryIntervalMs, startTime, onRetry, ...options }: WaitForDeploymentOptions): Promise<PushResponse>;
|
|
22
|
+
//# sourceMappingURL=push-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-status.d.ts","sourceRoot":"","sources":["../src/push-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOnD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,GAAG;IACzD,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD,CAAC;AAEF,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAQrF;AAED,wBAAsB,iBAAiB,CAAC,EACtC,SAAS,EACT,gBAA6C,EAC7C,eAA2C,EAC3C,SAAsB,EACtB,OAAO,EACP,GAAG,OAAO,EACX,EAAE,wBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBlD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ReuniteApi } from './api/index.js';
|
|
2
|
+
import { retryUntilConditionMet } from './utils/retry-until-condition-met.js';
|
|
3
|
+
const DEFAULT_MAX_EXECUTION_TIME = 1200; // 20 min
|
|
4
|
+
const DEFAULT_RETRY_INTERVAL_MS = 5000; // 5 sec
|
|
5
|
+
const PENDING_DEPLOYMENT_STATUSES = ['pending', 'running'];
|
|
6
|
+
export async function getPushStatus(options) {
|
|
7
|
+
const client = createClient(options);
|
|
8
|
+
try {
|
|
9
|
+
return await getPush(client, options);
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
reportSunsetWarning(client, options);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function waitForDeployment({ buildType, maxExecutionTime = DEFAULT_MAX_EXECUTION_TIME, retryIntervalMs = DEFAULT_RETRY_INTERVAL_MS, startTime = Date.now(), onRetry, ...options }) {
|
|
16
|
+
const client = createClient(options);
|
|
17
|
+
try {
|
|
18
|
+
return await retryUntilConditionMet({
|
|
19
|
+
operation: () => getPush(client, options),
|
|
20
|
+
condition: (result) => !PENDING_DEPLOYMENT_STATUSES.includes(result.status[buildType].deploy.status),
|
|
21
|
+
onConditionNotMet: onRetry,
|
|
22
|
+
startTime,
|
|
23
|
+
retryTimeoutMs: maxExecutionTime * 1000,
|
|
24
|
+
retryIntervalMs,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
reportSunsetWarning(client, options);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function createClient({ domain, apiKey, version }) {
|
|
32
|
+
return new ReuniteApi({ domain, apiKey, command: 'push-status', version });
|
|
33
|
+
}
|
|
34
|
+
// Runs whether the request succeeded or not: the client keeps the headers of every response it got.
|
|
35
|
+
function reportSunsetWarning(client, { onSunsetWarning }) {
|
|
36
|
+
const sunsetWarning = client.getSunsetWarning();
|
|
37
|
+
if (sunsetWarning) {
|
|
38
|
+
onSunsetWarning?.(sunsetWarning);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getPush(client, { organization, project, pushId }) {
|
|
42
|
+
return client.remotes.getPush({ organizationId: organization, projectId: project, pushId });
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=push-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-status.js","sourceRoot":"","sources":["../src/push-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,0BAA0B,GAAG,IAAI,CAAC,CAAC,SAAS;AAClD,MAAM,yBAAyB,GAAG,IAAI,CAAC,CAAC,QAAQ;AAChD,MAAM,2BAA2B,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAwB3D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B;IAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,SAAS,EACT,gBAAgB,GAAG,0BAA0B,EAC7C,eAAe,GAAG,yBAAyB,EAC3C,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EACtB,OAAO,EACP,GAAG,OAAO,EACe;IACzB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,OAAO,MAAM,sBAAsB,CAAC;YAClC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YACzC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,CAAC,2BAA2B,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YAC/E,iBAAiB,EAAE,OAAO;YAC1B,SAAS;YACT,cAAc,EAAE,gBAAgB,GAAG,IAAI;YACvC,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAqB;IAClE,OAAO,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,oGAAoG;AACpG,SAAS,mBAAmB,CAAC,MAAkB,EAAE,EAAE,eAAe,EAAqB;IACrF,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAEhD,IAAI,aAAa,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAkB,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAqB;IACvF,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9F,CAAC"}
|
package/lib/push.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type SunsetWarning } from './api/index.js';
|
|
2
|
+
import type { UpsertRemoteResponse } from './api/types.js';
|
|
3
|
+
export type FileToUpload = {
|
|
4
|
+
name: string;
|
|
5
|
+
path: string;
|
|
6
|
+
};
|
|
7
|
+
export type PushOptions = {
|
|
8
|
+
domain: string;
|
|
9
|
+
apiKey: string;
|
|
10
|
+
organization: string;
|
|
11
|
+
project: string;
|
|
12
|
+
mountPath: string;
|
|
13
|
+
files: FileToUpload[];
|
|
14
|
+
defaultBranch: string;
|
|
15
|
+
commit: {
|
|
16
|
+
message: string;
|
|
17
|
+
branchName: string;
|
|
18
|
+
author: {
|
|
19
|
+
name: string;
|
|
20
|
+
email: string;
|
|
21
|
+
};
|
|
22
|
+
sha?: string;
|
|
23
|
+
url?: string;
|
|
24
|
+
createdAt?: string;
|
|
25
|
+
namespace?: string;
|
|
26
|
+
repository?: string;
|
|
27
|
+
};
|
|
28
|
+
version?: string;
|
|
29
|
+
onUploadStart?: (remote: UpsertRemoteResponse) => void;
|
|
30
|
+
onSunsetWarning?: (warning: SunsetWarning) => void;
|
|
31
|
+
};
|
|
32
|
+
export type PushResult = {
|
|
33
|
+
pushId: string;
|
|
34
|
+
};
|
|
35
|
+
export declare function pushFiles({ domain, apiKey, organization, project, mountPath, files, defaultBranch, commit, version, onUploadStart, onSunsetWarning, }: PushOptions): Promise<PushResult>;
|
|
36
|
+
export declare function collectFilesToPush(files: string[], onFileOverwritten?: (existingPath: string, replacementPath: string) => void): FileToUpload[];
|
|
37
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACxC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAEvD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,SAAS,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,OAAO,EACP,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,aAAa,EACb,eAAe,GAChB,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAgCnC;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EAEf,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,GAC1E,YAAY,EAAE,CA4BhB"}
|
package/lib/push.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { slash } from '@redocly/openapi-core';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { ReuniteApi } from './api/index.js';
|
|
5
|
+
export async function pushFiles({ domain, apiKey, organization, project, mountPath, files, defaultBranch, commit, version, onUploadStart, onSunsetWarning, }) {
|
|
6
|
+
const client = new ReuniteApi({ domain, apiKey, command: 'push', version });
|
|
7
|
+
try {
|
|
8
|
+
const projectDefaultBranch = await client.remotes.getDefaultBranch(organization, project);
|
|
9
|
+
const remote = await client.remotes.upsert(organization, project, {
|
|
10
|
+
mountBranchName: projectDefaultBranch,
|
|
11
|
+
mountPath,
|
|
12
|
+
});
|
|
13
|
+
onUploadStart?.(remote);
|
|
14
|
+
const { id } = await client.remotes.push(organization, project, {
|
|
15
|
+
remoteId: remote.id,
|
|
16
|
+
commit,
|
|
17
|
+
isMainBranch: defaultBranch === commit.branchName,
|
|
18
|
+
}, files.map((file) => ({ path: slash(file.name), stream: fs.createReadStream(file.path) })));
|
|
19
|
+
return { pushId: id };
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
// Runs whether the push succeeded or not: the client keeps the headers of every response it got.
|
|
23
|
+
const sunsetWarning = client.getSunsetWarning();
|
|
24
|
+
if (sunsetWarning) {
|
|
25
|
+
onSunsetWarning?.(sunsetWarning);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function collectFilesToPush(files,
|
|
30
|
+
// Called when a later path maps to a file name an earlier path already used.
|
|
31
|
+
onFileOverwritten) {
|
|
32
|
+
const collectedFiles = {};
|
|
33
|
+
for (const file of files) {
|
|
34
|
+
if (fs.statSync(file).isDirectory()) {
|
|
35
|
+
const dir = file;
|
|
36
|
+
const fileList = getFilesList(dir, []);
|
|
37
|
+
fileList.forEach((f) => addFile(f, dir));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
addFile(file, path.dirname(file));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function addFile(filePath, fileDir) {
|
|
44
|
+
const fileName = path.relative(fileDir, filePath);
|
|
45
|
+
if (collectedFiles[fileName]) {
|
|
46
|
+
onFileOverwritten?.(collectedFiles[fileName], filePath);
|
|
47
|
+
}
|
|
48
|
+
collectedFiles[fileName] = filePath;
|
|
49
|
+
}
|
|
50
|
+
return Object.entries(collectedFiles).map(([name, filePath]) => ({
|
|
51
|
+
name,
|
|
52
|
+
path: path.resolve(filePath),
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
function getFilesList(dir, files) {
|
|
56
|
+
const filesAndDirs = fs.readdirSync(dir);
|
|
57
|
+
for (const name of filesAndDirs) {
|
|
58
|
+
const currentPath = path.join(dir, name);
|
|
59
|
+
if (fs.statSync(currentPath).isDirectory()) {
|
|
60
|
+
files = getFilesList(currentPath, files);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
files.push(currentPath);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return files;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=push.js.map
|
package/lib/push.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RemoteScorecardAndPlugins } from '../types.js';
|
|
2
|
+
export type FetchRemoteScorecardAndPluginsParams = {
|
|
3
|
+
projectUrl: string;
|
|
4
|
+
auth: string;
|
|
5
|
+
isApiKey?: boolean;
|
|
6
|
+
onDebug?: (message: string) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function fetchRemoteScorecardAndPlugins({ projectUrl, auth, isApiKey, onDebug, }: FetchRemoteScorecardAndPluginsParams): Promise<RemoteScorecardAndPlugins>;
|
|
9
|
+
//# sourceMappingURL=fetch-scorecard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-scorecard.d.ts","sourceRoot":"","sources":["../../../src/scorecard-classic/remote/fetch-scorecard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAW,MAAM,aAAa,CAAC;AAEtE,MAAM,MAAM,oCAAoC,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,wBAAsB,8BAA8B,CAAC,EACnD,UAAU,EACV,IAAI,EACJ,QAAgB,EAChB,OAAO,GACR,EAAE,oCAAoC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA2B3E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { HandledError } from '@redocly/openapi-core';
|
|
2
|
+
export async function fetchRemoteScorecardAndPlugins({ projectUrl, auth, isApiKey = false, onDebug, }) {
|
|
3
|
+
const parsedProjectUrl = parseProjectUrl(projectUrl);
|
|
4
|
+
if (!parsedProjectUrl) {
|
|
5
|
+
throw new HandledError(`Invalid project URL format: ${projectUrl}`);
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const project = await fetchProjectConfigBySlugs({
|
|
9
|
+
...parsedProjectUrl,
|
|
10
|
+
auth,
|
|
11
|
+
isApiKey,
|
|
12
|
+
onDebug,
|
|
13
|
+
});
|
|
14
|
+
const scorecard = project.config.scorecardClassic || project.config.scorecard;
|
|
15
|
+
if (!scorecard) {
|
|
16
|
+
throw new Error('No scorecard configuration found.');
|
|
17
|
+
}
|
|
18
|
+
const pluginsUrl = project.config.pluginsUrl;
|
|
19
|
+
const plugins = pluginsUrl ? await fetchPlugins(pluginsUrl, onDebug) : undefined;
|
|
20
|
+
return { scorecard, plugins, pluginsUrl };
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
throw new HandledError(error instanceof Error ? error.message : String(error));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function parseProjectUrl(projectUrl) {
|
|
27
|
+
const url = new URL(projectUrl);
|
|
28
|
+
const match = url.pathname.match(/\/org\/(?<orgSlug>[^/]+)\/project\/(?<projectSlug>[^/]+)/);
|
|
29
|
+
if (!match?.groups) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const { orgSlug, projectSlug } = match.groups;
|
|
33
|
+
return {
|
|
34
|
+
residency: url.origin,
|
|
35
|
+
orgSlug,
|
|
36
|
+
projectSlug,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function fetchProjectConfigBySlugs({ residency, orgSlug, projectSlug, auth, isApiKey, onDebug, }) {
|
|
40
|
+
const projectUrl = new URL(`${residency}/api/orgs/${orgSlug}/projects/${projectSlug}`);
|
|
41
|
+
const projectResponse = await fetch(projectUrl, { headers: createAuthHeaders(auth, isApiKey) });
|
|
42
|
+
onDebug?.(`Project fetch response status: ${projectResponse.status}`);
|
|
43
|
+
if (projectResponse.status === 401 || projectResponse.status === 403) {
|
|
44
|
+
onDebug?.(`Authentication failed with status ${projectResponse.status}.`);
|
|
45
|
+
onDebug?.('Check that your credentials are valid and have the necessary permissions.');
|
|
46
|
+
throw new Error(`Unauthorized access to project: ${projectSlug}. Please check your credentials.`);
|
|
47
|
+
}
|
|
48
|
+
if (projectResponse.status !== 200) {
|
|
49
|
+
throw new Error(`Failed to fetch project: ${projectSlug}. Status: ${projectResponse.status}`);
|
|
50
|
+
}
|
|
51
|
+
onDebug?.('Successfully received project configuration.');
|
|
52
|
+
return projectResponse.json();
|
|
53
|
+
}
|
|
54
|
+
// A plugins bundle that cannot be fetched is treated as no plugins.
|
|
55
|
+
async function fetchPlugins(pluginsUrl, onDebug) {
|
|
56
|
+
onDebug?.(`Fetching plugins from: ${pluginsUrl}`);
|
|
57
|
+
try {
|
|
58
|
+
const pluginsResponse = await fetch(pluginsUrl);
|
|
59
|
+
onDebug?.(`Plugins fetch response status: ${pluginsResponse.status}`);
|
|
60
|
+
if (pluginsResponse.status !== 200) {
|
|
61
|
+
onDebug?.('Failed to fetch plugins');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
return pluginsResponse.text();
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
onDebug?.(`Error fetching plugins: ${error instanceof Error ? error.message : String(error)}`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function createAuthHeaders(auth, isApiKey) {
|
|
72
|
+
if (isApiKey) {
|
|
73
|
+
return { Authorization: `Bearer ${auth}` };
|
|
74
|
+
}
|
|
75
|
+
return { Cookie: `accessToken=${auth}` };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=fetch-scorecard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-scorecard.js","sourceRoot":"","sources":["../../../src/scorecard-classic/remote/fetch-scorecard.ts"],"names":[],"mappings":"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"}
|