jsii-release
Version:
Release jsii modules to multiple package managers
160 lines • 17.5 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UsageDir = exports.DEFAULT_USAGE_DIR = void 0;
const path = __importStar(require("path"));
const fs = __importStar(require("fs-extra"));
const files_1 = require("./files");
exports.DEFAULT_USAGE_DIR = path.join((0, files_1.homeDir)(), '.publib-ca/usage');
/**
* The usage directory is where we write per-session config files to access the CodeArtifact repository.
*
* Some config files may be written in a system-global location, but they will not be active unless the
* contents of this directory have been sourced/copied into the current terminal.
*
* CONTRACT
*
* There are two special entries:
*
* - `env`, a file with `key=value` entries for environment variables to set.
* - `cwd/`, a directory with files that need to be copied into the current directory before each command.
*
* Other than these, code may write tempfiles to this directory if it wants, but there is no meaning
* implied for other files.
*/
class UsageDir {
static default() {
return new UsageDir(exports.DEFAULT_USAGE_DIR);
}
constructor(directory) {
this.directory = directory;
this.envFile = path.join(this.directory, 'env');
this.cwdDir = path.join(this.directory, 'cwd');
}
async delete() {
if (await fs.pathExists(this.directory)) {
await fs.remove(this.directory);
}
}
/**
* Create a fresh empty directory, with helper scripts
*/
async reset() {
await this.delete();
await fs.mkdirp(path.join(this.directory, 'cwd'));
await fs.writeFile(path.join(this.directory, 'env'), '', { encoding: 'utf-8' });
await this.addToEnv({
CWD_FILES_DIR: path.join(this.directory, 'cwd'),
});
// Write a bash helper to load these settings
await fs.writeFile(path.join(this.directory, 'activate.bash'), [
`while read -u10 line; do [[ -z $line ]] || export "$line"; done 10<${this.directory}/env`,
'cp -R $CWD_FILES_DIR/ .', // Copy files from directory even if it is empty
].join('\n'), { encoding: 'utf-8' });
}
/**
* Set the expiration time of the current settings
*/
async setExpirationTimeMs(timestamp) {
await this.addToEnv({
EXPIRATION_TIME_MS: `${timestamp}`,
});
}
/**
* Add settings to the environment variables
*/
async addToEnv(settings) {
const lines = await (0, files_1.loadLines)(this.envFile);
for (const [k, v] of Object.entries(settings)) {
(0, files_1.updateIniKey)(lines, k, v);
}
await (0, files_1.writeLines)(this.envFile, lines);
}
/**
* Return the current environment variables
*/
async currentEnv() {
const lines = await (0, files_1.loadLines)(this.envFile);
const splitter = /^([a-zA-Z0-9_-]+)\s*=\s*(.*)$/;
const ret = {};
for (const line of lines) {
const m = line.match(splitter);
if (m) {
ret[m[1]] = m[2];
}
}
return ret;
}
cwdFile(filename) {
return path.join(this.cwdDir, filename);
}
/**
* Activate in the current process (update process.env), copy the cwd/ directory to the current directory
*/
async activateInCurrentProcess() {
for (const [k, v] of Object.entries(await this.currentEnv())) {
process.env[k] = v;
}
await (0, files_1.copyDirectoryContents)(this.cwdDir, '.');
}
async copySelectCwdFileHere(...filenames) {
for (const file of filenames) {
await fs.copyFile(path.join(this.cwdDir, file), file);
}
}
async putFile(filename, contents) {
const fileName = path.join(this.directory, filename);
await (0, files_1.writeFile)(fileName, contents);
return fileName;
}
async putCwdFile(filename, contents) {
await (0, files_1.writeFile)(path.join(this.cwdDir, filename), contents);
}
async putJson(key, data) {
await (0, files_1.writeFile)(path.join(this.directory, key + '.json'), JSON.stringify(data, undefined, 2));
}
async readJson(key) {
try {
return await fs.readJson(path.join(this.directory, key + '.json'));
}
catch (e) {
if (e.code === 'ENOENT') {
return undefined;
}
throw e;
}
}
/**
* Print to the console on how to activate these settings
*/
advertise() {
// eslint-disable-next-line no-console
console.log('To activate these settings in the current bash shell:');
// eslint-disable-next-line no-console
console.log(` source ${this.directory}/activate.bash`);
}
}
exports.UsageDir = UsageDir;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtZGlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvZGVhcnRpZmFjdC91c2FnZS1kaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsNkNBQStCO0FBQy9CLG1DQUF5RztBQUU1RixRQUFBLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxlQUFPLEdBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTFFOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQWEsUUFBUTtJQUNaLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sSUFBSSxRQUFRLENBQUMseUJBQWlCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBS0QsWUFBb0MsU0FBaUI7UUFBakIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNuRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU07UUFDakIsSUFBSSxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxD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LENBQUM7U0FDVDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQ3JFLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUFwSUQsNEJBb0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGNvcHlEaXJlY3RvcnlDb250ZW50cywgaG9tZURpciwgbG9hZExpbmVzLCB1cGRhdGVJbmlLZXksIHdyaXRlRmlsZSwgd3JpdGVMaW5lcyB9IGZyb20gJy4vZmlsZXMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9VU0FHRV9ESVIgPSBwYXRoLmpvaW4oaG9tZURpcigpLCAnLnB1YmxpYi1jYS91c2FnZScpO1xuXG4vKipcbiAqIFRoZSB1c2FnZSBkaXJlY3RvcnkgaXMgd2hlcmUgd2Ugd3JpdGUgcGVyLXNlc3Npb24gY29uZmlnIGZpbGVzIHRvIGFjY2VzcyB0aGUgQ29kZUFydGlmYWN0IHJlcG9zaXRvcnkuXG4gKlxuICogU29tZSBjb25maWcgZmlsZXMgbWF5IGJlIHdyaXR0ZW4gaW4gYSBzeXN0ZW0tZ2xvYmFsIGxvY2F0aW9uLCBidXQgdGhleSB3aWxsIG5vdCBiZSBhY3RpdmUgdW5sZXNzIHRoZVxuICogY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkgaGF2ZSBiZWVuIHNvdXJjZWQvY29waWVkIGludG8gdGhlIGN1cnJlbnQgdGVybWluYWwuXG4gKlxuICogQ09OVFJBQ1RcbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHNwZWNpYWwgZW50cmllczpcbiAqXG4gKiAtIGBlbnZgLCBhIGZpbGUgd2l0aCBga2V5PXZhbHVlYCBlbnRyaWVzIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gIHNldC5cbiAqIC0gYGN3ZC9gLCBhIGRpcmVjdG9yeSB3aXRoIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBjb3BpZWQgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGVhY2ggY29tbWFuZC5cbiAqXG4gKiBPdGhlciB0aGFuIHRoZXNlLCBjb2RlIG1heSB3cml0ZSB0ZW1wZmlsZXMgdG8gdGhpcyBkaXJlY3RvcnkgaWYgaXQgd2FudHMsIGJ1dCB0aGVyZSBpcyBubyBtZWFuaW5nXG4gKiBpbXBsaWVkIGZvciBvdGhlciBmaWxlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVzYWdlRGlyIHtcbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0KCkge1xuICAgIHJldHVybiBuZXcgVXNhZ2VEaXIoREVGQVVMVF9VU0FHRV9ESVIpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGVudkZpbGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGN3ZERpcjogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnZGaWxlID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnZW52Jyk7XG4gICAgdGhpcy5jd2REaXIgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdjd2QnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoKSB7XG4gICAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHModGhpcy5kaXJlY3RvcnkpKSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUodGhpcy5kaXJlY3RvcnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmcmVzaCBlbXB0eSBkaXJlY3RvcnksIHdpdGggaGVscGVyIHNjcmlwdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNldCgpIHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZSgpO1xuICAgIGF3YWl0IGZzLm1rZGlycChwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdjd2QnKSk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2VudicpLCAnJywgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWRkVG9FbnYoe1xuICAgICAgQ1dEX0ZJTEVTX0RJUjogcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnY3dkJyksXG4gICAgfSk7XG5cbiAgICAvLyBXcml0ZSBhIGJhc2ggaGVscGVyIHRvIGxvYWQgdGhlc2Ugc2V0dGluZ3NcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnYWN0aXZhdGUuYmFzaCcpLCBbXG4gICAgICBgd2hpbGUgcmVhZCAtdTEwIGxpbmU7IGRvIFtbIC16ICRsaW5lIF1dIHx8IGV4cG9ydCBcIiRsaW5lXCI7IGRvbmUgMTA8JHt0aGlzLmRpcmVjdG9yeX0vZW52YCxcbiAgICAgICdjcCAtUiAkQ1dEX0ZJTEVTX0RJUi8gLicsIC8vIENvcHkgZmlsZXMgZnJvbSBkaXJlY3RvcnkgZXZlbiBpZiBpdCBpcyBlbXB0eVxuICAgIF0uam9pbignXFxuJyksIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBleHBpcmF0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgc2V0dGluZ3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRFeHBpcmF0aW9uVGltZU1zKHRpbWVzdGFtcDogbnVtYmVyKSB7XG4gICAgYXdhaXQgdGhpcy5hZGRUb0Vudih7XG4gICAgICBFWFBJUkFUSU9OX1RJTUVfTVM6IGAke3RpbWVzdGFtcH1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzZXR0aW5ncyB0byB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWRkVG9FbnYoc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICBjb25zdCBsaW5lcyA9IGF3YWl0IGxvYWRMaW5lcyh0aGlzLmVudkZpbGUpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzKSkge1xuICAgICAgdXBkYXRlSW5pS2V5KGxpbmVzLCBrLCB2KTtcbiAgICB9XG4gICAgYXdhaXQgd3JpdGVMaW5lcyh0aGlzLmVudkZpbGUsIGxpbmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3VycmVudEVudigpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCBsaW5lcyA9IGF3YWl0IGxvYWRMaW5lcyh0aGlzLmVudkZpbGUpO1xuXG4gICAgY29uc3Qgc3BsaXR0ZXIgPSAvXihbYS16QS1aMC05Xy1dKylcXHMqPVxccyooLiopJC87XG5cbiAgICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IG0gPSBsaW5lLm1hdGNoKHNwbGl0dGVyKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIHJldFttWzFdXSA9IG1bMl07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgY3dkRmlsZShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmN3ZERpciwgZmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGluIHRoZSBjdXJyZW50IHByb2Nlc3MgKHVwZGF0ZSBwcm9jZXNzLmVudiksIGNvcHkgdGhlIGN3ZC8gZGlyZWN0b3J5IHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdGl2YXRlSW5DdXJyZW50UHJvY2VzcygpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCB0aGlzLmN1cnJlbnRFbnYoKSkpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tdID0gdjtcbiAgICB9XG5cbiAgICBhd2FpdCBjb3B5RGlyZWN0b3J5Q29udGVudHModGhpcy5jd2REaXIsICcuJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29weVNlbGVjdEN3ZEZpbGVIZXJlKC4uLmZpbGVuYW1lczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZW5hbWVzKSB7XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShwYXRoLmpvaW4odGhpcy5jd2REaXIsIGZpbGUpLCBmaWxlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHV0RmlsZShmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGZpbGVuYW1lKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZU5hbWUsIGNvbnRlbnRzKTtcbiAgICByZXR1cm4gZmlsZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHV0Q3dkRmlsZShmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbih0aGlzLmN3ZERpciwgZmlsZW5hbWUpLCBjb250ZW50cyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHV0SnNvbihrZXk6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwga2V5ICsgJy5qc29uJyksIEpTT04uc3RyaW5naWZ5KGRhdGEsIHVuZGVmaW5lZCwgMikpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRKc29uPEE+KGtleTogc3RyaW5nKTogUHJvbWlzZTxBIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5yZWFkSnNvbihwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGtleSArICcuanNvbicpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IHRvIHRoZSBjb25zb2xlIG9uIGhvdyB0byBhY3RpdmF0ZSB0aGVzZSBzZXR0aW5nc1xuICAgKi9cbiAgcHVibGljIGFkdmVydGlzZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdUbyBhY3RpdmF0ZSB0aGVzZSBzZXR0aW5ncyBpbiB0aGUgY3VycmVudCBiYXNoIHNoZWxsOicpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coYCAgICBzb3VyY2UgJHt0aGlzLmRpcmVjdG9yeX0vYWN0aXZhdGUuYmFzaGApO1xuICB9XG59Il19
;