projen
Version:
CDK for software projects
118 lines • 14 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DevContainer = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const component_1 = require("../component");
const json_1 = require("../json");
/**
* Relative path of devcontainer file to generate
*/
const DEVCONTAINER_FILE = ".devcontainer.json";
/**
* A development environment running VSCode in a container; used by GitHub
* codespaces.
*/
class DevContainer extends component_1.Component {
constructor(project, options = {}) {
super(project);
this.postCreateTasks = new Array();
this.ports = new Array();
this.vscodeExtensions = new Array();
this.features = new Array();
this.dockerImage = options?.dockerImage;
if (options?.tasks) {
for (const task of options.tasks) {
this.addTasks(task);
}
}
if (options?.ports) {
this.addPorts(...options.ports);
}
if (options?.vscodeExtensions) {
this.addVscodeExtensions(...options.vscodeExtensions);
}
if (options.features) {
this.addFeatures(...options.features);
}
this.config = {
image: () => this.dockerImage?.image,
build: {
dockerfile: () => this.dockerImage?.dockerFile,
},
postCreateCommand: () => this.renderTasks(),
forwardPorts: this.ports,
extensions: this.vscodeExtensions,
features: () => this.renderFeatures(),
};
new json_1.JsonFile(this.project, DEVCONTAINER_FILE, {
obj: this.config,
omitEmpty: true,
});
}
addDockerImage(image) {
if (this.dockerImage) {
throw new Error("dockerImage cannot be redefined.");
}
this.dockerImage = image;
}
/**
* Adds tasks to run when the container starts. Tasks will be run in sequence.
*
* @param tasks The new tasks
*/
addTasks(...tasks) {
this.postCreateTasks.push(...tasks);
}
/**
* Adds ports that should be exposed (forwarded) from the container.
*
* @param ports The new ports
*/
addPorts(...ports) {
this.ports.push(...ports);
}
/**
* Adds a list of VSCode extensions that should be automatically installed
* in the container.
*
* @param extensions The extension IDs
*/
addVscodeExtensions(...extensions) {
this.vscodeExtensions.push(...extensions);
}
/**
* Adds a list of VSCode features that should be automatically installed
* in the container.
*
* @param features featureName and version(optional default: latest)
*/
addFeatures(...features) {
this.features.push(...features);
}
renderTasks() {
if (this.postCreateTasks.length !== 0) {
return this.postCreateTasks
.map((task) => `( ${this.project.projenCommand} ${task.name} )`)
.join(" && ");
}
else {
return undefined;
}
}
renderFeatures() {
if (this.features.length === 0) {
return undefined;
}
return this.features.reduce((pv, feature) => {
pv[feature.name] = {
version: feature.version ?? "latest",
};
return pv;
}, {});
}
}
exports.DevContainer = DevContainer;
_a = JSII_RTTI_SYMBOL_1;
DevContainer[_a] = { fqn: "projen.vscode.DevContainer", version: "0.99.51" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2Y29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZzY29kZS9kZXZjb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBeUM7QUFNekMsa0NBQW1DO0FBSW5DOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQTBDL0M7OztHQUdHO0FBQ0gsTUFBYSxZQUNYLFNBQVEscUJBQVM7SUFjakIsWUFBWSxPQUFnQixFQUFFLFVBQStCLEVBQUU7UUFDN0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEtBQUssRUFBUSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxFQUF1QixDQUFDO1FBRWpELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxFQUFFLFdBQVcsQ0FBQztRQUV4QyxJQUFJLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNE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IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBEZXZFbnZpcm9ubWVudERvY2tlckltYWdlLFxuICBEZXZFbnZpcm9ubWVudE9wdGlvbnMsXG4gIElEZXZFbnZpcm9ubWVudCxcbn0gZnJvbSBcIi4uL2Rldi1lbnZcIjtcbmltcG9ydCB7IEpzb25GaWxlIH0gZnJvbSBcIi4uL2pzb25cIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tIFwiLi4vdGFza1wiO1xuXG4vKipcbiAqIFJlbGF0aXZlIHBhdGggb2YgZGV2Y29udGFpbmVyIGZpbGUgdG8gZ2VuZXJhdGVcbiAqL1xuY29uc3QgREVWQ09OVEFJTkVSX0ZJTEUgPSBcIi5kZXZjb250YWluZXIuanNvblwiO1xuXG4vKipcbiAqIGRldmNvbnRhaW5lciBmZWF0dXJlcyBvcHRpb25zXG4gKiBAc2VlIGh0dHBzOi8vY29udGFpbmVycy5kZXYvaW1wbGVtZW50b3JzL2ZlYXR1cmVzLyNkZXZjb250YWluZXItanNvbi1wcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV2Q29udGFpbmVyRmVhdHVyZSB7XG4gIC8qKlxuICAgKiBmZWF0dXJlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIGZlYXR1cmUgdmVyc2lvblxuICAgKiBAZGVmYXVsdCBsYXRlc3RcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3Igb3B0aW9ucyBmb3IgdGhlIERldkNvbnRhaW5lciBjb21wb25lbnQuXG4gKlxuICogVGhlIGRlZmF1bHQgZG9ja2VyIGltYWdlIHVzZWQgZm9yIEdpdEh1YiBDb2Rlc3BhY2VzIGlzIGRlZmluZWQgaGVyZTpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC92c2NvZGUtZGV2LWNvbnRhaW5lcnMvdHJlZS9tYXN0ZXIvY29udGFpbmVycy9jb2Rlc3BhY2VzLWxpbnV4XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV2Q29udGFpbmVyT3B0aW9ucyBleHRlbmRzIERldkVudmlyb25tZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBWU0NvZGUgZmVhdHVyZXMgdGhhdCBzcGVjaWZ5IHRoZSBmZWF0dXJlcyB0aGF0IHNob3VsZCBiZVxuICAgKiBpbnN0YWxsZWQgaW5zaWRlIHRoZSBjb250YWluZXIgd2hlbiBpdCBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM/OiBEZXZDb250YWluZXJGZWF0dXJlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURldkNvbnRhaW5lckVudmlyb25tZW50IGV4dGVuZHMgSURldkVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0IG9mIFZTQ29kZSBmZWF0dXJlcyB0aGF0IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZFxuICAgKiBpbiB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZmVhdHVyZXMgZmVhdHVyZU5hbWUgYW5kIHZlcnNpb24ob3B0aW9uYWwgZGVmYXVsdDogbGF0ZXN0KVxuICAgKi9cbiAgYWRkRmVhdHVyZXMoLi4uZmVhdHVyZXM6IERldkNvbnRhaW5lckZlYXR1cmVbXSk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBydW5uaW5nIFZTQ29kZSBpbiBhIGNvbnRhaW5lcjsgdXNlZCBieSBHaXRIdWJcbiAqIGNvZGVzcGFjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZDb250YWluZXJcbiAgZXh0ZW5kcyBDb21wb25lbnRcbiAgaW1wbGVtZW50cyBJRGV2Q29udGFpbmVyRW52aXJvbm1lbnRcbntcbiAgcHJpdmF0ZSBkb2NrZXJJbWFnZTogRGV2RW52aXJvbm1lbnREb2NrZXJJbWFnZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBwb3N0Q3JlYXRlVGFza3M6IFRhc2tbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwb3J0czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdnNjb2RlRXh0ZW5zaW9uczogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZmVhdHVyZXM6IERldkNvbnRhaW5lckZlYXR1cmVbXTtcblxuICAvKipcbiAgICogRGlyZWN0IGFjY2VzcyB0byB0aGUgZGV2Y29udGFpbmVyIGNvbmZpZ3VyYXRpb24gKGVzY2FwZSBoYXRjaClcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBEZXZDb250YWluZXJPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIHRoaXMucG9zdENyZWF0ZVRhc2tzID0gbmV3IEFycmF5PFRhc2s+KCk7XG4gICAgdGhpcy5wb3J0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgdGhpcy52c2NvZGVFeHRlbnNpb25zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICB0aGlzLmZlYXR1cmVzID0gbmV3IEFycmF5PERldkNvbnRhaW5lckZlYXR1cmU+KCk7XG5cbiAgICB0aGlzLmRvY2tlckltYWdlID0gb3B0aW9ucz8uZG9ja2VySW1hZ2U7XG5cbiAgICBpZiAob3B0aW9ucz8udGFza3MpIHtcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBvcHRpb25zLnRhc2tzKSB7XG4gICAgICAgIHRoaXMuYWRkVGFza3ModGFzayk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5wb3J0cykge1xuICAgICAgdGhpcy5hZGRQb3J0cyguLi5vcHRpb25zLnBvcnRzKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/LnZzY29kZUV4dGVuc2lvbnMpIHtcbiAgICAgIHRoaXMuYWRkVnNjb2RlRXh0ZW5zaW9ucyguLi5vcHRpb25zLnZzY29kZUV4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mZWF0dXJlcykge1xuICAgICAgdGhpcy5hZGRGZWF0dXJlcyguLi5vcHRpb25zLmZlYXR1cmVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGltYWdlOiAoKSA9PiB0aGlzLmRvY2tlckltYWdlPy5pbWFnZSxcbiAgICAgIGJ1aWxkOiB7XG4gICAgICAgIGRvY2tlcmZpbGU6ICgpID0+IHRoaXMuZG9ja2VySW1hZ2U/LmRvY2tlckZpbGUsXG4gICAgICB9LFxuICAgICAgcG9zdENyZWF0ZUNvbW1hbmQ6ICgpID0+IHRoaXMucmVuZGVyVGFza3MoKSxcbiAgICAgIGZvcndhcmRQb3J0czogdGhpcy5wb3J0cyxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMudnNjb2RlRXh0ZW5zaW9ucyxcbiAgICAgIGZlYXR1cmVzOiAoKSA9PiB0aGlzLnJlbmRlckZlYXR1cmVzKCksXG4gICAgfTtcblxuICAgIG5ldyBKc29uRmlsZSh0aGlzLnByb2plY3QsIERFVkNPTlRBSU5FUl9GSUxFLCB7XG4gICAgICBvYmo6IHRoaXMuY29uZmlnLFxuICAgICAgb21pdEVtcHR5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZERvY2tlckltYWdlKGltYWdlOiBEZXZFbnZpcm9ubWVudERvY2tlckltYWdlKSB7XG4gICAgaWYgKHRoaXMuZG9ja2VySW1hZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRvY2tlckltYWdlIGNhbm5vdCBiZSByZWRlZmluZWQuXCIpO1xuICAgIH1cbiAgICB0aGlzLmRvY2tlckltYWdlID0gaW1hZ2U7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0YXNrcyB0byBydW4gd2hlbiB0aGUgY29udGFpbmVyIHN0YXJ0cy4gVGFza3Mgd2lsbCBiZSBydW4gaW4gc2VxdWVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB0YXNrcyBUaGUgbmV3IHRhc2tzXG4gICAqL1xuICBwdWJsaWMgYWRkVGFza3MoLi4udGFza3M6IFRhc2tbXSkge1xuICAgIHRoaXMucG9zdENyZWF0ZVRhc2tzLnB1c2goLi4udGFza3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcG9ydHMgdGhhdCBzaG91bGQgYmUgZXhwb3NlZCAoZm9yd2FyZGVkKSBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwb3J0cyBUaGUgbmV3IHBvcnRzXG4gICAqL1xuICBwdWJsaWMgYWRkUG9ydHMoLi4ucG9ydHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5wb3J0cy5wdXNoKC4uLnBvcnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGlzdCBvZiBWU0NvZGUgZXh0ZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZFxuICAgKiBpbiB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXh0ZW5zaW9ucyBUaGUgZXh0ZW5zaW9uIElEc1xuICAgKi9cbiAgcHVibGljIGFkZFZzY29kZUV4dGVuc2lvbnMoLi4uZXh0ZW5zaW9uczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnZzY29kZUV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGlzdCBvZiBWU0NvZGUgZmVhdHVyZXMgdGhhdCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWRcbiAgICogaW4gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmVzIGZlYXR1cmVOYW1lIGFuZCB2ZXJzaW9uKG9wdGlvbmFsIGRlZmF1bHQ6IGxhdGVzdClcbiAgICovXG4gIHB1YmxpYyBhZGRGZWF0dXJlcyguLi5mZWF0dXJlczogRGV2Q29udGFpbmVyRmVhdHVyZVtdKTogdm9pZCB7XG4gICAgdGhpcy5mZWF0dXJlcy5wdXNoKC4uLmZlYXR1cmVzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyVGFza3MoKSB7XG4gICAgaWYgKHRoaXMucG9zdENyZWF0ZVRhc2tzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdENyZWF0ZVRhc2tzXG4gICAgICAgIC5tYXAoKHRhc2spID0+IGAoICR7dGhpcy5wcm9qZWN0LnByb2plbkNvbW1hbmR9ICR7dGFzay5uYW1lfSApYClcbiAgICAgICAgLmpvaW4oXCIgJiYgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRmVhdHVyZXMoKSB7XG4gICAgaWYgKHRoaXMuZmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZlYXR1cmVzLnJlZHVjZTx7XG4gICAgICBba2V5OiBzdHJpbmddOiB7IHZlcnNpb246IHN0cmluZyB9O1xuICAgIH0+KChwdiwgZmVhdHVyZSkgPT4ge1xuICAgICAgcHZbZmVhdHVyZS5uYW1lXSA9IHtcbiAgICAgICAgdmVyc2lvbjogZmVhdHVyZS52ZXJzaW9uID8/IFwibGF0ZXN0XCIsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHB2O1xuICAgIH0sIHt9KTtcbiAgfVxufVxuIl19