projen
Version:
CDK for software projects
38 lines • 3.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.recreate = recreate;
/**
* Re-create an object by re-invoking its own constructor with new arguments.
*
* The returned value is an instance of the *exact same* (sub)class as
* `instance`, because the runtime `constructor` is used rather than a
* statically known type. This makes it the building block for a component's
* typed `copy()` method:
*
* ```ts
* class Runner extends Component {
* constructor(scope: IConstruct, private readonly options: RunnerOptions = {}, id?: string) {
* super(scope, id);
* }
* public copy(overrides: RunnerOptions = {}, id?: string, scope = this.project): Runner {
* return recreate(this, scope, { ...this.options, ...overrides }, id);
* }
* }
* ```
*
* `recreate` is intentionally a free, generic function and an internal helper
* (not part of the public API). jsii cannot express a shared, typed `copy()`
* contract (parameter types are invariant on both interface implementations and
* class overrides), so copyability is modelled as a convention: each component
* declares its own fully-typed `copy()` that calls `recreate`.
*
* @param instance the object to re-create
* @param args the arguments to pass to the constructor
* @returns a new instance of the same class as `instance`
*/
function recreate(instance, ...args) {
const ctor = instance
.constructor;
return new ctor(...args);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjcmVhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9yZWNyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZCQSw0QkFJQztBQWpDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQWdCLFFBQVEsQ0FBbUIsUUFBVyxFQUFFLEdBQUcsSUFBVztJQUNwRSxNQUFNLElBQUksR0FBSSxRQUF1RDtTQUNsRSxXQUFXLENBQUM7SUFDZixPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmUtY3JlYXRlIGFuIG9iamVjdCBieSByZS1pbnZva2luZyBpdHMgb3duIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFyZ3VtZW50cy5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlICpleGFjdCBzYW1lKiAoc3ViKWNsYXNzIGFzXG4gKiBgaW5zdGFuY2VgLCBiZWNhdXNlIHRoZSBydW50aW1lIGBjb25zdHJ1Y3RvcmAgaXMgdXNlZCByYXRoZXIgdGhhbiBhXG4gKiBzdGF0aWNhbGx5IGtub3duIHR5cGUuIFRoaXMgbWFrZXMgaXQgdGhlIGJ1aWxkaW5nIGJsb2NrIGZvciBhIGNvbXBvbmVudCdzXG4gKiB0eXBlZCBgY29weSgpYCBtZXRob2Q6XG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIFJ1bm5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJ1bm5lck9wdGlvbnMgPSB7fSwgaWQ/OiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcihzY29wZSwgaWQpO1xuICogICB9XG4gKiAgIHB1YmxpYyBjb3B5KG92ZXJyaWRlczogUnVubmVyT3B0aW9ucyA9IHt9LCBpZD86IHN0cmluZywgc2NvcGUgPSB0aGlzLnByb2plY3QpOiBSdW5uZXIge1xuICogICAgIHJldHVybiByZWNyZWF0ZSh0aGlzLCBzY29wZSwgeyAuLi50aGlzLm9wdGlvbnMsIC4uLm92ZXJyaWRlcyB9LCBpZCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIGByZWNyZWF0ZWAgaXMgaW50ZW50aW9uYWxseSBhIGZyZWUsIGdlbmVyaWMgZnVuY3Rpb24gYW5kIGFuIGludGVybmFsIGhlbHBlclxuICogKG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJKS4ganNpaSBjYW5ub3QgZXhwcmVzcyBhIHNoYXJlZCwgdHlwZWQgYGNvcHkoKWBcbiAqIGNvbnRyYWN0IChwYXJhbWV0ZXIgdHlwZXMgYXJlIGludmFyaWFudCBvbiBib3RoIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMgYW5kXG4gKiBjbGFzcyBvdmVycmlkZXMpLCBzbyBjb3B5YWJpbGl0eSBpcyBtb2RlbGxlZCBhcyBhIGNvbnZlbnRpb246IGVhY2ggY29tcG9uZW50XG4gKiBkZWNsYXJlcyBpdHMgb3duIGZ1bGx5LXR5cGVkIGBjb3B5KClgIHRoYXQgY2FsbHMgYHJlY3JlYXRlYC5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2UgdGhlIG9iamVjdCB0byByZS1jcmVhdGVcbiAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3JcbiAqIEByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzIGFzIGBpbnN0YW5jZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY3JlYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KGluc3RhbmNlOiBULCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICBjb25zdCBjdG9yID0gKGluc3RhbmNlIGFzIHsgY29uc3RydWN0b3I6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQgfSlcbiAgICAuY29uc3RydWN0b3I7XG4gIHJldHVybiBuZXcgY3RvciguLi5hcmdzKTtcbn1cbiJdfQ==