jsii-release
Version:
Release jsii modules to multiple package managers
170 lines • 17.9 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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtZGlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvZGVhcnRpZmFjdC91c2FnZS1kaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLDZDQUErQjtBQUMvQixtQ0FBeUc7QUFFNUYsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUEsZUFBTyxHQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUUxRTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFhLFFBQVE7SUFDWixNQUFNLENBQUMsT0FBTztRQUNuQixPQUFPLElBQUksUUFBUSxDQUFDLHlCQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUtELFlBQW9DLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLElBQUksTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxT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QUM7WUFDaEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDckUsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRjtBQXBJRCw0QkFvSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgY29weURpcmVjdG9yeUNvbnRlbnRzLCBob21lRGlyLCBsb2FkTGluZXMsIHVwZGF0ZUluaUtleSwgd3JpdGVGaWxlLCB3cml0ZUxpbmVzIH0gZnJvbSAnLi9maWxlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1VTQUdFX0RJUiA9IHBhdGguam9pbihob21lRGlyKCksICcucHVibGliLWNhL3VzYWdlJyk7XG5cbi8qKlxuICogVGhlIHVzYWdlIGRpcmVjdG9yeSBpcyB3aGVyZSB3ZSB3cml0ZSBwZXItc2Vzc2lvbiBjb25maWcgZmlsZXMgdG8gYWNjZXNzIHRoZSBDb2RlQXJ0aWZhY3QgcmVwb3NpdG9yeS5cbiAqXG4gKiBTb21lIGNvbmZpZyBmaWxlcyBtYXkgYmUgd3JpdHRlbiBpbiBhIHN5c3RlbS1nbG9iYWwgbG9jYXRpb24sIGJ1dCB0aGV5IHdpbGwgbm90IGJlIGFjdGl2ZSB1bmxlc3MgdGhlXG4gKiBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSBoYXZlIGJlZW4gc291cmNlZC9jb3BpZWQgaW50byB0aGUgY3VycmVudCB0ZXJtaW5hbC5cbiAqXG4gKiBDT05UUkFDVFxuICpcbiAqIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBlbnRyaWVzOlxuICpcbiAqIC0gYGVudmAsIGEgZmlsZSB3aXRoIGBrZXk9dmFsdWVgIGVudHJpZXMgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byAgc2V0LlxuICogLSBgY3dkL2AsIGEgZGlyZWN0b3J5IHdpdGggZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgZWFjaCBjb21tYW5kLlxuICpcbiAqIE90aGVyIHRoYW4gdGhlc2UsIGNvZGUgbWF5IHdyaXRlIHRlbXBmaWxlcyB0byB0aGlzIGRpcmVjdG9yeSBpZiBpdCB3YW50cywgYnV0IHRoZXJlIGlzIG5vIG1lYW5pbmdcbiAqIGltcGxpZWQgZm9yIG90aGVyIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgVXNhZ2VEaXIge1xuICBwdWJsaWMgc3RhdGljIGRlZmF1bHQoKSB7XG4gICAgcmV0dXJuIG5ldyBVc2FnZURpcihERUZBVUxUX1VTQUdFX0RJUik7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW52RmlsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3dkRGlyOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudkZpbGUgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdlbnYnKTtcbiAgICB0aGlzLmN3ZERpciA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2N3ZCcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZSgpIHtcbiAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyh0aGlzLmRpcmVjdG9yeSkpIHtcbiAgICAgIGF3YWl0IGZzLnJlbW92ZSh0aGlzLmRpcmVjdG9yeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZyZXNoIGVtcHR5IGRpcmVjdG9yeSwgd2l0aCBoZWxwZXIgc2NyaXB0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlKCk7XG4gICAgYXdhaXQgZnMubWtkaXJwKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2N3ZCcpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnZW52JyksICcnLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hZGRUb0Vudih7XG4gICAgICBDV0RfRklMRVNfRElSOiBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdjd2QnKSxcbiAgICB9KTtcblxuICAgIC8vIFdyaXRlIGEgYmFzaCBoZWxwZXIgdG8gbG9hZCB0aGVzZSBzZXR0aW5nc1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdhY3RpdmF0ZS5iYXNoJyksIFtcbiAgICAgIGB3aGlsZSByZWFkIC11MTAgbGluZTsgZG8gW1sgLXogJGxpbmUgXV0gfHwgZXhwb3J0IFwiJGxpbmVcIjsgZG9uZSAxMDwke3RoaXMuZGlyZWN0b3J5fS9lbnZgLFxuICAgICAgJ2NwIC1SICRDV0RfRklMRVNfRElSLyAuJywgLy8gQ29weSBmaWxlcyBmcm9tIGRpcmVjdG9yeSBldmVuIGlmIGl0IGlzIGVtcHR5XG4gICAgXS5qb2luKCdcXG4nKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGV4cGlyYXRpb24gdGltZSBvZiB0aGUgY3VycmVudCBzZXR0aW5nc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldEV4cGlyYXRpb25UaW1lTXModGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICBhd2FpdCB0aGlzLmFkZFRvRW52KHtcbiAgICAgIEVYUElSQVRJT05fVElNRV9NUzogYCR7dGltZXN0YW1wfWAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHNldHRpbmdzIHRvIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRUb0VudihzZXR0aW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgbG9hZExpbmVzKHRoaXMuZW52RmlsZSk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICB1cGRhdGVJbmlLZXkobGluZXMsIGssIHYpO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZUxpbmVzKHRoaXMuZW52RmlsZSwgbGluZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjdXJyZW50RW52KCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgbG9hZExpbmVzKHRoaXMuZW52RmlsZSk7XG5cbiAgICBjb25zdCBzcGxpdHRlciA9IC9eKFthLXpBLVowLTlfLV0rKVxccyo9XFxzKiguKikkLztcblxuICAgIGNvbnN0IHJldDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgbSA9IGxpbmUubWF0Y2goc3BsaXR0ZXIpO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgcmV0W21bMV1dID0gbVsyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBjd2RGaWxlKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuY3dkRGlyLCBmaWxlbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcyAodXBkYXRlIHByb2Nlc3MuZW52KSwgY29weSB0aGUgY3dkLyBkaXJlY3RvcnkgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGVJbkN1cnJlbnRQcm9jZXNzKCkge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGF3YWl0IHRoaXMuY3VycmVudEVudigpKSkge1xuICAgICAgcHJvY2Vzcy5lbnZba10gPSB2O1xuICAgIH1cblxuICAgIGF3YWl0IGNvcHlEaXJlY3RvcnlDb250ZW50cyh0aGlzLmN3ZERpciwgJy4nKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb3B5U2VsZWN0Q3dkRmlsZUhlcmUoLi4uZmlsZW5hbWVzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlbmFtZXMpIHtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHBhdGguam9pbih0aGlzLmN3ZERpciwgZmlsZSksIGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwdXRGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgZmlsZW5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlTmFtZSwgY29udGVudHMpO1xuICAgIHJldHVybiBmaWxlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwdXRDd2RGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKHRoaXMuY3dkRGlyLCBmaWxlbmFtZSksIGNvbnRlbnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwdXRKc29uKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBrZXkgKyAnLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkoZGF0YSwgdW5kZWZpbmVkLCAyKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEpzb248QT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPEEgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRKc29uKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwga2V5ICsgJy5qc29uJykpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJpbnQgdG8gdGhlIGNvbnNvbGUgb24gaG93IHRvIGFjdGl2YXRlIHRoZXNlIHNldHRpbmdzXG4gICAqL1xuICBwdWJsaWMgYWR2ZXJ0aXNlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ1RvIGFjdGl2YXRlIHRoZXNlIHNldHRpbmdzIGluIHRoZSBjdXJyZW50IGJhc2ggc2hlbGw6Jyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhgICAgIHNvdXJjZSAke3RoaXMuZGlyZWN0b3J5fS9hY3RpdmF0ZS5iYXNoYCk7XG4gIH1cbn0iXX0=