node-backpack 0.0.4
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/.gitattributes +23 -0
- package/CODE_OF_CONDUCT.md +4 -0
- package/CONTRIBUTING.md +59 -0
- package/LICENSE +202 -0
- package/NOTICE +1 -0
- package/README.md +160 -0
- package/bin/node-backpack +2 -0
- package/lib/api/_attributions.d.ts +64 -0
- package/lib/api/_attributions.js +161 -0
- package/lib/api/_shell.d.ts +5 -0
- package/lib/api/_shell.js +37 -0
- package/lib/api/bundle.d.ts +163 -0
- package/lib/api/bundle.js +352 -0
- package/lib/api/index.d.ts +2 -0
- package/lib/api/index.js +19 -0
- package/lib/api/violation.d.ts +70 -0
- package/lib/api/violation.js +71 -0
- package/lib/cli.d.ts +1 -0
- package/lib/cli.js +119 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +18 -0
- package/package.json +101 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.Attributions = void 0;
|
|
27
|
+
const path = __importStar(require("path"));
|
|
28
|
+
const fs = __importStar(require("fs-extra"));
|
|
29
|
+
const _shell_1 = require("./_shell");
|
|
30
|
+
const violation_1 = require("./violation");
|
|
31
|
+
const ATTRIBUTION_SEPARATOR = '\n----------------\n';
|
|
32
|
+
/**
|
|
33
|
+
* `Attributions` represents an attributions file containing third-party license information.
|
|
34
|
+
*/
|
|
35
|
+
class Attributions {
|
|
36
|
+
constructor(props) {
|
|
37
|
+
this.packageDir = props.packageDir;
|
|
38
|
+
this.packageName = props.packageName;
|
|
39
|
+
this.filePath = path.join(this.packageDir, props.filePath);
|
|
40
|
+
this.dependencies = props.dependencies.filter(d => !props.exclude || !new RegExp(props.exclude).test(d.name));
|
|
41
|
+
this.allowedLicenses = props.allowedLicenses.map(l => l.toLowerCase());
|
|
42
|
+
this.dependenciesRoot = props.dependenciesRoot;
|
|
43
|
+
// without the generated notice content, this object is pretty much
|
|
44
|
+
// useless, so lets generate those of the bat.
|
|
45
|
+
this.attributions = this.generateAttributions();
|
|
46
|
+
this.content = this.render(this.attributions);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate the current notice file.
|
|
50
|
+
*
|
|
51
|
+
* This method never throws. The Caller is responsible for inspecting the report returned and act accordinagly.
|
|
52
|
+
*/
|
|
53
|
+
validate() {
|
|
54
|
+
const violations = [];
|
|
55
|
+
const relNoticePath = path.relative(this.packageDir, this.filePath);
|
|
56
|
+
const fix = () => this.flush();
|
|
57
|
+
const missing = !fs.existsSync(this.filePath);
|
|
58
|
+
const attributions = missing ? undefined : fs.readFileSync(this.filePath, { encoding: 'utf-8' });
|
|
59
|
+
const outdated = attributions !== undefined && attributions !== this.content;
|
|
60
|
+
if (missing) {
|
|
61
|
+
violations.push({ type: violation_1.ViolationType.MISSING_NOTICE, message: `${relNoticePath} is missing`, fix });
|
|
62
|
+
}
|
|
63
|
+
if (outdated) {
|
|
64
|
+
violations.push({ type: violation_1.ViolationType.OUTDATED_ATTRIBUTIONS, message: `${relNoticePath} is outdated`, fix });
|
|
65
|
+
}
|
|
66
|
+
const invalidLicense = Array.from(this.attributions.values())
|
|
67
|
+
.filter(a => a.licenses.length === 1 && !this.allowedLicenses.includes(a.licenses[0].toLowerCase()))
|
|
68
|
+
.map(a => ({ type: violation_1.ViolationType.INVALID_LICENSE, message: `Dependency ${a.package} has an invalid license: ${a.licenses[0]}` }));
|
|
69
|
+
const noLicense = Array.from(this.attributions.values())
|
|
70
|
+
.filter(a => a.licenses.length === 0)
|
|
71
|
+
.map(a => ({ type: violation_1.ViolationType.NO_LICENSE, message: `Dependency ${a.package} has no license` }));
|
|
72
|
+
const multiLicense = Array.from(this.attributions.values())
|
|
73
|
+
.filter(a => a.licenses.length > 1)
|
|
74
|
+
.map(a => ({ type: violation_1.ViolationType.MULTIPLE_LICENSE, message: `Dependency ${a.package} has multiple licenses: ${a.licenses}` }));
|
|
75
|
+
violations.push(...invalidLicense);
|
|
76
|
+
violations.push(...noLicense);
|
|
77
|
+
violations.push(...multiLicense);
|
|
78
|
+
return new violation_1.ViolationsReport(violations);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Flush the generated notice file to disk.
|
|
82
|
+
*/
|
|
83
|
+
flush() {
|
|
84
|
+
fs.writeFileSync(this.filePath, this.content);
|
|
85
|
+
}
|
|
86
|
+
render(attributions) {
|
|
87
|
+
const content = [];
|
|
88
|
+
if (attributions.size > 0) {
|
|
89
|
+
content.push(`The ${this.packageName} package includes the following third-party software/licensing:`);
|
|
90
|
+
content.push('');
|
|
91
|
+
}
|
|
92
|
+
// sort the attributions so the file doesn't change due to ordering issues
|
|
93
|
+
const ordered = Array.from(attributions.values()).sort((a1, a2) => a1.package.localeCompare(a2.package));
|
|
94
|
+
for (const attr of ordered) {
|
|
95
|
+
content.push(`** ${attr.package} - ${attr.url} | ${attr.licenses[0]}`);
|
|
96
|
+
// prefer notice over license
|
|
97
|
+
if (attr.noticeText) {
|
|
98
|
+
content.push(attr.noticeText);
|
|
99
|
+
}
|
|
100
|
+
else if (attr.licenseText) {
|
|
101
|
+
content.push(attr.licenseText);
|
|
102
|
+
}
|
|
103
|
+
content.push(ATTRIBUTION_SEPARATOR);
|
|
104
|
+
}
|
|
105
|
+
return content
|
|
106
|
+
// since we are embedding external files, those can different line
|
|
107
|
+
// endings, so we standardize to LF.
|
|
108
|
+
.map(l => l.replace(/\r\n/g, '\n'))
|
|
109
|
+
.join('\n');
|
|
110
|
+
}
|
|
111
|
+
generateAttributions() {
|
|
112
|
+
var _a, _b;
|
|
113
|
+
if (this.dependencies.length === 0) {
|
|
114
|
+
return new Map();
|
|
115
|
+
}
|
|
116
|
+
const attributions = new Map();
|
|
117
|
+
const pkg = (d) => `${d.name}@${d.version}`;
|
|
118
|
+
const packages = this.dependencies.map(d => pkg(d));
|
|
119
|
+
function fetchInfos(_cwd, _packages) {
|
|
120
|
+
// we don't use the programmatic API since it only offers an async API.
|
|
121
|
+
// prefer to stay sync for now since its easier to integrate with other tooling.
|
|
122
|
+
// will offer an async API further down the road.
|
|
123
|
+
const command = `${require.resolve('license-checker/bin/license-checker')} --json --packages "${_packages.join(';')}"`;
|
|
124
|
+
const output = (0, _shell_1.shell)(command, { cwd: _cwd, quiet: true });
|
|
125
|
+
return JSON.parse(output);
|
|
126
|
+
}
|
|
127
|
+
// first run a global command to fetch as much information in one shot
|
|
128
|
+
const infos = fetchInfos(this.dependenciesRoot, packages);
|
|
129
|
+
for (const dep of this.dependencies) {
|
|
130
|
+
const key = pkg(dep);
|
|
131
|
+
// sometimes the dependency might not exist from fetching information globally,
|
|
132
|
+
// so we try fetching a concrete package. this can happen for example when
|
|
133
|
+
// two different major versions exist of the same dependency.
|
|
134
|
+
const info = (_a = infos[key]) !== null && _a !== void 0 ? _a : fetchInfos(dep.path, [pkg(dep)])[key];
|
|
135
|
+
if (!info) {
|
|
136
|
+
// make sure all dependencies are accounted for.
|
|
137
|
+
throw new Error(`Unable to locate license information for ${key} (${dep.path})`);
|
|
138
|
+
}
|
|
139
|
+
const noticeText = info.noticeFile ? fs.readFileSync(info.noticeFile, { encoding: 'utf-8' }) : undefined;
|
|
140
|
+
// for some reason, the license-checker package falls back to the README.md file of the package for license
|
|
141
|
+
// text. this seems strange, disabling that for now.
|
|
142
|
+
// see https://github.com/davglass/license-checker/blob/master/lib/license-files.js#L9
|
|
143
|
+
// note that a non existing license file is ok as long as the license type could be extracted.
|
|
144
|
+
const licenseFile = ((_b = info.licenseFile) === null || _b === void 0 ? void 0 : _b.toLowerCase().endsWith('.md')) ? undefined : info.licenseFile;
|
|
145
|
+
const licenseText = licenseFile ? fs.readFileSync(licenseFile, { encoding: 'utf-8' }) : undefined;
|
|
146
|
+
// the licenses key comes in different types but we convert it here
|
|
147
|
+
// to always be an array.
|
|
148
|
+
const licenses = !info.licenses ? undefined : (Array.isArray(info.licenses) ? info.licenses : [info.licenses]);
|
|
149
|
+
attributions.set(key, {
|
|
150
|
+
package: key,
|
|
151
|
+
url: `https://www.npmjs.com/package/${dep.name}/v/${dep.version}`,
|
|
152
|
+
licenses: licenses !== null && licenses !== void 0 ? licenses : [],
|
|
153
|
+
licenseText,
|
|
154
|
+
noticeText,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return attributions;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.Attributions = Attributions;
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2F0dHJpYnV0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvX2F0dHJpYnV0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3Qiw2Q0FBK0I7QUFFL0IscUNBQWlDO0FBRWpDLDJDQUF5RTtBQUd6RSxNQUFNLHFCQUFxQixHQUFHLHNCQUFzQixDQUFDO0FBdUNyRDs7R0FFRztBQUNILE1BQWEsWUFBWTtJQVl2QixZQUFZLEtBQXdCO1FBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBRS9DLG1FQUFtRTtRQUNuRSw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMs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QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNuRyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVsRyxtRUFBbUU7WUFDbkUseUJBQXlCO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRS9HLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNwQixPQUFPLEVBQUUsR0FBRztnQkFDWixHQUFHLEVBQUUsaUNBQWlDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDakUsUUFBUSxFQUFFLFFBQVEsYUFBUixRQUFRLGNBQVIsUUFBUSxHQUFJLEVBQUU7Z0JBQ3hCLFdBQVc7Z0JBQ1gsVUFBVTthQUNYLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztDQUVGO0FBMUtELG9DQTBLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgdHlwZSB7IE1vZHVsZUluZm8gfSBmcm9tICdsaWNlbnNlLWNoZWNrZXInO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuL19zaGVsbCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tICcuL2J1bmRsZSc7XG5pbXBvcnQgeyBWaW9sYXRpb24sIFZpb2xhdGlvblR5cGUsIFZpb2xhdGlvbnNSZXBvcnQgfSBmcm9tICcuL3Zpb2xhdGlvbic7XG5cblxuY29uc3QgQVRUUklCVVRJT05fU0VQQVJBVE9SID0gJ1xcbi0tLS0tLS0tLS0tLS0tLS1cXG4nO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBBdHRyaWJ1dGlvbnNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0aW9uc1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwYWNrYWdlIHJvb3QgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogUGFja2FnZSBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM6IFBhY2thZ2VbXTtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgZGlyZWN0b3J5IHVuZGVyd2hpY2ggYWxsIGRlcGVuZGVuY2llcyBsaXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzUm9vdDogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgbm90aWNlIGZpbGUgdG8gY3JlYXRlZCAvIHZhbGlkYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaXN0IG9mIGFsbG93ZWQgbGljZW5zZXMuXG4gICAqXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGljZW5zZXM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogRGVwZW5kZW5jaWVzIG1hdGNoaW5nIHRoaXMgcGF0dGVybiB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gYXR0cmlidXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXhjbHVzaW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogYEF0dHJpYnV0aW9uc2AgcmVwcmVzZW50cyBhbiBhdHRyaWJ1dGlvbnMgZmlsZSBjb250YWluaW5nIHRoaXJkLXBhcnR5IGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGlvbnMge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFja2FnZURpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBQYWNrYWdlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZExpY2Vuc2VzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXNSb290OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGF0dHJpYnV0aW9uczogTWFwPHN0cmluZywgQXR0cmlidXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXR0cmlidXRpb25zUHJvcHMpIHtcbiAgICB0aGlzLnBhY2thZ2VEaXIgPSBwcm9wcy5wYWNrYWdlRGlyO1xuICAgIHRoaXMucGFja2FnZU5hbWUgPSBwcm9wcy5wYWNrYWdlTmFtZTtcbiAgICB0aGlzLmZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGFja2FnZURpciwgcHJvcHMuZmlsZVBhdGgpO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcHJvcHMuZGVwZW5kZW5jaWVzLmZpbHRlcihkID0+ICFwcm9wcy5leGNsdWRlIHx8ICFuZXcgUmVnRXhwKHByb3BzLmV4Y2x1ZGUpLnRlc3QoZC5uYW1lKSk7XG4gICAgdGhpcy5hbGxvd2VkTGljZW5zZXMgPSBwcm9wcy5hbGxvd2VkTGljZW5zZXMubWFwKGwgPT4gbC50b0xvd2VyQ2FzZSgpKTtcbiAgICB0aGlzLmRlcGVuZGVuY2llc1Jvb3QgPSBwcm9wcy5kZXBlbmRlbmNpZXNSb290O1xuXG4gICAgLy8gd2l0aG91dCB0aGUgZ2VuZXJhdGVkIG5vdGljZSBjb250ZW50LCB0aGlzIG9iamVjdCBpcyBwcmV0dHkgbXVjaFxuICAgIC8vIHVzZWxlc3MsIHNvIGxldHMgZ2VuZXJhdGUgdGhvc2Ugb2YgdGhlIGJhdC5cbiAgICB0aGlzLmF0dHJpYnV0aW9ucyA9IHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGlvbnMoKTtcbiAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLnJlbmRlcih0aGlzLmF0dHJpYnV0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGN1cnJlbnQgbm90aWNlIGZpbGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG5ldmVyIHRocm93cy4gVGhlIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaW5zcGVjdGluZyB0aGUgcmVwb3J0IHJldHVybmVkIGFuZCBhY3QgYWNjb3JkaW5hZ2x5LlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKCk6IFZpb2xhdGlvbnNSZXBvcnQge1xuXG4gICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICBjb25zdCByZWxOb3RpY2VQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnBhY2thZ2VEaXIsIHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZml4ID0gKCkgPT4gdGhpcy5mbHVzaCgpO1xuXG4gICAgY29uc3QgbWlzc2luZyA9ICFmcy5leGlzdHNTeW5jKHRoaXMuZmlsZVBhdGgpO1xuICAgIGNvbnN0IGF0dHJpYnV0aW9ucyA9IG1pc3NpbmcgPyB1bmRlZmluZWQgOiBmcy5yZWFkRmlsZVN5bmModGhpcy5maWxlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICBjb25zdCBvdXRkYXRlZCA9IGF0dHJpYnV0aW9ucyAhPT0gdW5kZWZpbmVkICYmIGF0dHJpYnV0aW9ucyAhPT0gdGhpcy5jb250ZW50O1xuXG4gICAgaWYgKG1pc3NpbmcpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaCh7IHR5cGU6IFZpb2xhdGlvblR5cGUuTUlTU0lOR19OT1RJQ0UsIG1lc3NhZ2U6IGAke3JlbE5vdGljZVBhdGh9IGlzIG1pc3NpbmdgLCBmaXggfSk7XG4gICAgfVxuXG4gICAgaWYgKG91dGRhdGVkKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2goeyB0eXBlOiBWaW9sYXRpb25UeXBlLk9VVERBVEVEX0FUVFJJQlVUSU9OUywgbWVzc2FnZTogYCR7cmVsTm90aWNlUGF0aH0gaXMgb3V0ZGF0ZWRgLCBmaXggfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZExpY2Vuc2U6IFZpb2xhdGlvbltdID0gQXJyYXkuZnJvbSh0aGlzLmF0dHJpYnV0aW9ucy52YWx1ZXMoKSlcbiAgICAgIC5maWx0ZXIoYSA9PiBhLmxpY2Vuc2VzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5hbGxvd2VkTGljZW5zZXMuaW5jbHVkZXMoYS5saWNlbnNlc1swXS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgIC5tYXAoYSA9PiAoeyB0eXBlOiBWaW9sYXRpb25UeXBlLklOVkFMSURfTElDRU5TRSwgbWVzc2FnZTogYERlcGVuZGVuY3kgJHthLnBhY2thZ2V9IGhhcyBhbiBpbnZhbGlkIGxpY2Vuc2U6ICR7YS5saWNlbnNlc1swXX1gIH0pKTtcblxuICAgIGNvbnN0IG5vTGljZW5zZTogVmlvbGF0aW9uW10gPSBBcnJheS5mcm9tKHRoaXMuYXR0cmlidXRpb25zLnZhbHVlcygpKVxuICAgICAgLmZpbHRlcihhID0+IGEubGljZW5zZXMubGVuZ3RoID09PSAwKVxuICAgICAgLm1hcChhID0+ICh7IHR5cGU6IFZpb2xhdGlvblR5cGUuTk9fTElDRU5TRSwgbWVzc2FnZTogYERlcGVuZGVuY3kgJHthLnBhY2thZ2V9IGhhcyBubyBsaWNlbnNlYCB9KSk7XG5cbiAgICBjb25zdCBtdWx0aUxpY2Vuc2U6IFZpb2xhdGlvbltdID0gQXJyYXkuZnJvbSh0aGlzLmF0dHJpYnV0aW9ucy52YWx1ZXMoKSlcbiAgICAgIC5maWx0ZXIoYSA9PiBhLmxpY2Vuc2VzLmxlbmd0aCA+IDEpXG4gICAgICAubWFwKGEgPT4gKHsgdHlwZTogVmlvbGF0aW9uVHlwZS5NVUxUSVBMRV9MSUNFTlNFLCBtZXNzYWdlOiBgRGVwZW5kZW5jeSAke2EucGFja2FnZX0gaGFzIG11bHRpcGxlIGxpY2Vuc2VzOiAke2EubGljZW5zZXN9YCB9KSk7XG5cbiAgICB2aW9sYXRpb25zLnB1c2goLi4uaW52YWxpZExpY2Vuc2UpO1xuICAgIHZpb2xhdGlvbnMucHVzaCguLi5ub0xpY2Vuc2UpO1xuICAgIHZpb2xhdGlvbnMucHVzaCguLi5tdWx0aUxpY2Vuc2UpO1xuXG4gICAgcmV0dXJuIG5ldyBWaW9sYXRpb25zUmVwb3J0KHZpb2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSBnZW5lcmF0ZWQgbm90aWNlIGZpbGUgdG8gZGlzay5cbiAgICovXG4gIHB1YmxpYyBmbHVzaCgpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZmlsZVBhdGgsIHRoaXMuY29udGVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcihhdHRyaWJ1dGlvbnM6IE1hcDxzdHJpbmcsIEF0dHJpYnV0aW9uPik6IHN0cmluZyB7XG5cbiAgICBjb25zdCBjb250ZW50ID0gW107XG5cbiAgICBpZiAoYXR0cmlidXRpb25zLnNpemUgPiAwKSB7XG4gICAgICBjb250ZW50LnB1c2goYFRoZSAke3RoaXMucGFja2FnZU5hbWV9IHBhY2thZ2UgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB0aGlyZC1wYXJ0eSBzb2Z0d2FyZS9saWNlbnNpbmc6YCk7XG4gICAgICBjb250ZW50LnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIHNvcnQgdGhlIGF0dHJpYnV0aW9ucyBzbyB0aGUgZmlsZSBkb2Vzbid0IGNoYW5nZSBkdWUgdG8gb3JkZXJpbmcgaXNzdWVzXG4gICAgY29uc3Qgb3JkZXJlZCA9IEFycmF5LmZyb20oYXR0cmlidXRpb25zLnZhbHVlcygpKS5zb3J0KChhMSwgYTIpID0+IGExLnBhY2thZ2UubG9jYWxlQ29tcGFyZShhMi5wYWNrYWdlKSk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dHIgb2Ygb3JkZXJlZCkge1xuICAgICAgY29udGVudC5wdXNoKGAqKiAke2F0dHIucGFja2FnZX0gLSAke2F0dHIudXJsfSB8ICR7YXR0ci5saWNlbnNlc1swXX1gKTtcblxuICAgICAgLy8gcHJlZmVyIG5vdGljZSBvdmVyIGxpY2Vuc2VcbiAgICAgIGlmIChhdHRyLm5vdGljZVRleHQpIHtcbiAgICAgICAgY29udGVudC5wdXNoKGF0dHIubm90aWNlVGV4dCk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHIubGljZW5zZVRleHQpIHtcbiAgICAgICAgY29udGVudC5wdXNoKGF0dHIubGljZW5zZVRleHQpO1xuICAgICAgfVxuICAgICAgY29udGVudC5wdXNoKEFUVFJJQlVUSU9OX1NFUEFSQVRPUik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSBlbWJlZGRpbmcgZXh0ZXJuYWwgZmlsZXMsIHRob3NlIGNhbiBkaWZmZXJlbnQgbGluZVxuICAgICAgLy8gZW5kaW5ncywgc28gd2Ugc3RhbmRhcmRpemUgdG8gTEYuXG4gICAgICAubWFwKGwgPT4gbC5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQXR0cmlidXRpb25zKCk6IE1hcDxzdHJpbmcsIEF0dHJpYnV0aW9uPiB7XG5cbiAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0aW9uczogTWFwPHN0cmluZywgQXR0cmlidXRpb24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgcGtnID0gKGQ6IFBhY2thZ2UpID0+IGAke2QubmFtZX1AJHtkLnZlcnNpb259YDtcblxuICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5kZXBlbmRlbmNpZXMubWFwKGQgPT4gcGtnKGQpKTtcblxuICAgIGZ1bmN0aW9uIGZldGNoSW5mb3MoX2N3ZDogc3RyaW5nLCBfcGFja2FnZXM6IHN0cmluZ1tdKSB7XG4gICAgICAvLyB3ZSBkb24ndCB1c2UgdGhlIHByb2dyYW1tYXRpYyBBUEkgc2luY2UgaXQgb25seSBvZmZlcnMgYW4gYXN5bmMgQVBJLlxuICAgICAgLy8gcHJlZmVyIHRvIHN0YXkgc3luYyBmb3Igbm93IHNpbmNlIGl0cyBlYXNpZXIgdG8gaW50ZWdyYXRlIHdpdGggb3RoZXIgdG9vbGluZy5cbiAgICAgIC8vIHdpbGwgb2ZmZXIgYW4gYXN5bmMgQVBJIGZ1cnRoZXIgZG93biB0aGUgcm9hZC5cbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBgJHtyZXF1aXJlLnJlc29sdmUoJ2xpY2Vuc2UtY2hlY2tlci9iaW4vbGljZW5zZS1jaGVja2VyJyl9IC0tanNvbiAtLXBhY2thZ2VzIFwiJHtfcGFja2FnZXMuam9pbignOycpfVwiYDtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHNoZWxsKGNvbW1hbmQsIHsgY3dkOiBfY3dkLCBxdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKG91dHB1dCk7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgcnVuIGEgZ2xvYmFsIGNvbW1hbmQgdG8gZmV0Y2ggYXMgbXVjaCBpbmZvcm1hdGlvbiBpbiBvbmUgc2hvdFxuICAgIGNvbnN0IGluZm9zID0gZmV0Y2hJbmZvcyh0aGlzLmRlcGVuZGVuY2llc1Jvb3QsIHBhY2thZ2VzKTtcblxuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBwa2coZGVwKTtcblxuICAgICAgLy8gc29tZXRpbWVzIHRoZSBkZXBlbmRlbmN5IG1pZ2h0IG5vdCBleGlzdCBmcm9tIGZldGNoaW5nIGluZm9ybWF0aW9uIGdsb2JhbGx5LFxuICAgICAgLy8gc28gd2UgdHJ5IGZldGNoaW5nIGEgY29uY3JldGUgcGFja2FnZS4gdGhpcyBjYW4gaGFwcGVuIGZvciBleGFtcGxlIHdoZW5cbiAgICAgIC8vIHR3byBkaWZmZXJlbnQgbWFqb3IgdmVyc2lvbnMgZXhpc3Qgb2YgdGhlIHNhbWUgZGVwZW5kZW5jeS5cbiAgICAgIGNvbnN0IGluZm86IE1vZHVsZUluZm8gPSBpbmZvc1trZXldID8/IGZldGNoSW5mb3MoZGVwLnBhdGgsIFtwa2coZGVwKV0pW2tleV07XG5cbiAgICAgIGlmICghaW5mbykge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIGRlcGVuZGVuY2llcyBhcmUgYWNjb3VudGVkIGZvci5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9jYXRlIGxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yICR7a2V5fSAoJHtkZXAucGF0aH0pYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdGljZVRleHQgPSBpbmZvLm5vdGljZUZpbGUgPyBmcy5yZWFkRmlsZVN5bmMoaW5mby5ub3RpY2VGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBmb3Igc29tZSByZWFzb24sIHRoZSBsaWNlbnNlLWNoZWNrZXIgcGFja2FnZSBmYWxscyBiYWNrIHRvIHRoZSBSRUFETUUubWQgZmlsZSBvZiB0aGUgcGFja2FnZSBmb3IgbGljZW5zZVxuICAgICAgLy8gdGV4dC4gdGhpcyBzZWVtcyBzdHJhbmdlLCBkaXNhYmxpbmcgdGhhdCBmb3Igbm93LlxuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZnbGFzcy9saWNlbnNlLWNoZWNrZXIvYmxvYi9tYXN0ZXIvbGliL2xpY2Vuc2UtZmlsZXMuanMjTDlcbiAgICAgIC8vIG5vdGUgdGhhdCBhIG5vbiBleGlzdGluZyBsaWNlbnNlIGZpbGUgaXMgb2sgYXMgbG9uZyBhcyB0aGUgbGljZW5zZSB0eXBlIGNvdWxkIGJlIGV4dHJhY3RlZC5cbiAgICAgIGNvbnN0IGxpY2Vuc2VGaWxlID0gaW5mby5saWNlbnNlRmlsZT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLm1kJykgPyB1bmRlZmluZWQgOiBpbmZvLmxpY2Vuc2VGaWxlO1xuICAgICAgY29uc3QgbGljZW5zZVRleHQgPSBsaWNlbnNlRmlsZSA/IGZzLnJlYWRGaWxlU3luYyhsaWNlbnNlRmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gdGhlIGxpY2Vuc2VzIGtleSBjb21lcyBpbiBkaWZmZXJlbnQgdHlwZXMgYnV0IHdlIGNvbnZlcnQgaXQgaGVyZVxuICAgICAgLy8gdG8gYWx3YXlzIGJlIGFuIGFycmF5LlxuICAgICAgY29uc3QgbGljZW5zZXMgPSAhaW5mby5saWNlbnNlcyA/IHVuZGVmaW5lZCA6IChBcnJheS5pc0FycmF5KGluZm8ubGljZW5zZXMpID8gaW5mby5saWNlbnNlcyA6IFtpbmZvLmxpY2Vuc2VzXSk7XG5cbiAgICAgIGF0dHJpYnV0aW9ucy5zZXQoa2V5LCB7XG4gICAgICAgIHBhY2thZ2U6IGtleSxcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvJHtkZXAubmFtZX0vdi8ke2RlcC52ZXJzaW9ufWAsXG4gICAgICAgIGxpY2Vuc2VzOiBsaWNlbnNlcyA/PyBbXSxcbiAgICAgICAgbGljZW5zZVRleHQsXG4gICAgICAgIG5vdGljZVRleHQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRpb25zO1xuICB9XG5cbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGlvbiBvZiBhIHNwZWNpZmljIGRlcGVuZGVuY3kuXG4gKi9cbmludGVyZmFjZSBBdHRyaWJ1dGlvbiB7XG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVkIHBhY2thZ2UgKG5hbWUgKyB2ZXJzaW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZTogc3RyaW5nO1xuICAvKipcbiAgICogVVJMIHRvIHRoZSBwYWNrYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYWNrYWdlIGxpY2Vuc2VzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgc29tZSBwYWNrYWdlcyB3aWxsIG1heSBoYXZlIG11bHRpcGxlIGxpY2Vuc2VzLFxuICAgKiB3aGljaCBpcyB3aHkgdGhpcyBpcyBhbiBhcnJheS4gSW4gc3VjaCBjYXNlcywgdGhlIGxpY2Vuc2VcbiAgICogdmFsaWRhdGlvbiB3aWxsIGZhaWwgc2luY2Ugd2UgY3VycmVudGx5IGRpc2FsbG93IHRoaXMuXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBQYWNrYWdlIGxpY2Vuc2UgY29udGVudC5cbiAgICpcbiAgICogSW4gY2FzZSBhIHBhY2thZ2UgaGFzIG11bHRpcGxlIGxpY2Vuc2VzLCB0aGlzIHdpbGxcbiAgICogY29udGFpbi4uLm9uZSBvZiB0aGVtLiBJdCBjdXJyZW50bHkgZG9lc24ndCBtYXR0ZXIgd2hpY2hcbiAgICogb25lIHNpbmNlIGl0IHdpbGwgbm90IHBhc3MgdmFsaWRhdGlvbiBhbnl3YXkuXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlVGV4dD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhY2thZ2Ugbm90aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWNlVGV4dD86IHN0cmluZztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.shell = void 0;
|
|
27
|
+
const child_process = __importStar(require("child_process"));
|
|
28
|
+
function shell(command, options = {}) {
|
|
29
|
+
const stdio = options.quiet ? ['ignore', 'pipe', 'pipe'] : ['ignore', 'inherit', 'inherit'];
|
|
30
|
+
const buffer = child_process.execSync(command, {
|
|
31
|
+
cwd: options.cwd,
|
|
32
|
+
stdio: stdio,
|
|
33
|
+
});
|
|
34
|
+
return buffer ? buffer.toString('utf-8').trim() : '';
|
|
35
|
+
}
|
|
36
|
+
exports.shell = shell;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NoZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9fc2hlbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2REFBK0M7QUFPL0MsU0FBZ0IsS0FBSyxDQUFDLE9BQWUsRUFBRSxVQUF3QixFQUFFO0lBQy9ELE1BQU0sS0FBSyxHQUErQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN4SCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUM3QyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsS0FBSyxFQUFFLEtBQUs7S0FDYixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3ZELENBQUM7QUFQRCxzQkFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hlbGxPcHRpb25zIHtcbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmcsIG9wdGlvbnM6IFNoZWxsT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3Qgc3RkaW86IGNoaWxkX3Byb2Nlc3MuU3RkaW9PcHRpb25zID0gb3B0aW9ucy5xdWlldCA/IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddIDogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J107XG4gIGNvbnN0IGJ1ZmZlciA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwge1xuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgc3RkaW86IHN0ZGlvLFxuICB9KTtcbiAgcmV0dXJuIGJ1ZmZlciA/IGJ1ZmZlci50b1N0cmluZygndXRmLTgnKS50cmltKCkgOiAnJztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { ViolationsReport } from './violation';
|
|
2
|
+
/**
|
|
3
|
+
* Bundling properties.
|
|
4
|
+
*/
|
|
5
|
+
export interface BundleProps {
|
|
6
|
+
/**
|
|
7
|
+
* Directory where the package to bundle is located at.
|
|
8
|
+
*/
|
|
9
|
+
readonly packageDir: string;
|
|
10
|
+
/**
|
|
11
|
+
* List of entry-points to bundle.
|
|
12
|
+
*
|
|
13
|
+
* @default - the 'main' file as specified in package.json.
|
|
14
|
+
*/
|
|
15
|
+
readonly entryPoints?: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Path to attributions file that will be created / validated.
|
|
18
|
+
* This path is relative to the package directory.
|
|
19
|
+
*
|
|
20
|
+
* @default 'THIRD_PARTY_LICENSES'
|
|
21
|
+
*/
|
|
22
|
+
readonly attributionsFile?: string;
|
|
23
|
+
/**
|
|
24
|
+
* External packages that cannot be bundled.
|
|
25
|
+
*
|
|
26
|
+
* @default - no external references.
|
|
27
|
+
*/
|
|
28
|
+
readonly externals?: Externals;
|
|
29
|
+
/**
|
|
30
|
+
* External resources that need to be embedded in the bundle.
|
|
31
|
+
*
|
|
32
|
+
* These will be copied over to the appropriate paths before packaging.
|
|
33
|
+
*/
|
|
34
|
+
readonly resources?: {
|
|
35
|
+
[src: string]: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* A list of licenses that are allowed for bundling.
|
|
39
|
+
* If any dependency contains a license not in this list, bundling will fail.
|
|
40
|
+
*
|
|
41
|
+
* @default - Default list
|
|
42
|
+
*/
|
|
43
|
+
readonly allowedLicenses?: string[];
|
|
44
|
+
/**
|
|
45
|
+
* Packages matching this regular expression will be excluded from attribution.
|
|
46
|
+
*/
|
|
47
|
+
readonly dontAttribute?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Basic sanity check to run against the created bundle.
|
|
50
|
+
*
|
|
51
|
+
* @default - no check.
|
|
52
|
+
*/
|
|
53
|
+
readonly test?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Options for `Bundle.pack`.
|
|
57
|
+
*/
|
|
58
|
+
export interface BundlePackOptions {
|
|
59
|
+
/**
|
|
60
|
+
* The target directory to create the package in.
|
|
61
|
+
*
|
|
62
|
+
* @default - the package directory.
|
|
63
|
+
*/
|
|
64
|
+
readonly target?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface BundleValidateOptions {
|
|
67
|
+
/**
|
|
68
|
+
* Automatically fix any (fixable) violations.
|
|
69
|
+
*
|
|
70
|
+
* @default false
|
|
71
|
+
*/
|
|
72
|
+
readonly fix?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Package on the local file system.
|
|
76
|
+
*/
|
|
77
|
+
export interface Package {
|
|
78
|
+
/**
|
|
79
|
+
* Path of the dependency on the local file system.
|
|
80
|
+
*/
|
|
81
|
+
readonly path: string;
|
|
82
|
+
/**
|
|
83
|
+
* Dependency name.
|
|
84
|
+
*/
|
|
85
|
+
readonly name: string;
|
|
86
|
+
/**
|
|
87
|
+
* Dependency version.
|
|
88
|
+
*/
|
|
89
|
+
readonly version: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* External packages that cannot be bundled.
|
|
93
|
+
*/
|
|
94
|
+
export interface Externals {
|
|
95
|
+
/**
|
|
96
|
+
* External packages that should be listed in the `dependencies` section
|
|
97
|
+
* of the manifest.
|
|
98
|
+
*/
|
|
99
|
+
readonly dependencies?: readonly string[];
|
|
100
|
+
/**
|
|
101
|
+
* External packages that should be listed in the `optionalDependencies` section
|
|
102
|
+
* of the manifest.
|
|
103
|
+
*/
|
|
104
|
+
readonly optionalDependencies?: readonly string[];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Bundle class to validate and pack nodejs bundles.
|
|
108
|
+
*/
|
|
109
|
+
export declare class Bundle {
|
|
110
|
+
private readonly manifest;
|
|
111
|
+
private readonly noticePath;
|
|
112
|
+
private readonly packageDir;
|
|
113
|
+
private readonly entryPoints;
|
|
114
|
+
private readonly externals;
|
|
115
|
+
private readonly resources;
|
|
116
|
+
private readonly allowedLicenses;
|
|
117
|
+
private readonly dontAttribute?;
|
|
118
|
+
private readonly test?;
|
|
119
|
+
private _bundle?;
|
|
120
|
+
private _dependencies?;
|
|
121
|
+
private _dependenciesRoot?;
|
|
122
|
+
private _attributions?;
|
|
123
|
+
constructor(props: BundleProps);
|
|
124
|
+
/**
|
|
125
|
+
* Validate the bundle for violations.
|
|
126
|
+
*
|
|
127
|
+
* If `fix` is set to true, this method will return the remaining
|
|
128
|
+
* violations after the fixes were applied.
|
|
129
|
+
*
|
|
130
|
+
* This method never throws. The Caller is responsible for inspecting the
|
|
131
|
+
* returned report and act accordingly.
|
|
132
|
+
*/
|
|
133
|
+
validate(options?: BundleValidateOptions): ViolationsReport;
|
|
134
|
+
/**
|
|
135
|
+
* Write the bundle version of the project to a temp directory.
|
|
136
|
+
* This directory is what the tool will end up packing.
|
|
137
|
+
*
|
|
138
|
+
* Returns the temp directory location.
|
|
139
|
+
*/
|
|
140
|
+
write(): string;
|
|
141
|
+
/**
|
|
142
|
+
* Write the bundle and create the tarball.
|
|
143
|
+
*
|
|
144
|
+
* Returns the location of the tarball.
|
|
145
|
+
*/
|
|
146
|
+
pack(options?: BundlePackOptions): string;
|
|
147
|
+
private get bundle();
|
|
148
|
+
private get dependencies();
|
|
149
|
+
private get dependenciesRoot();
|
|
150
|
+
private get attributions();
|
|
151
|
+
private findExternalDependencyVersion;
|
|
152
|
+
private closestPackagePath;
|
|
153
|
+
private createPackage;
|
|
154
|
+
private esbuild;
|
|
155
|
+
private validateCircularImports;
|
|
156
|
+
private validateResources;
|
|
157
|
+
private validateAttributions;
|
|
158
|
+
private addExternals;
|
|
159
|
+
private removeDependencies;
|
|
160
|
+
private writeOutputs;
|
|
161
|
+
private writeResources;
|
|
162
|
+
private writeManifest;
|
|
163
|
+
}
|