From 3b53f4c8835ff7dfbed16c641f6f78e32c0a3acd Mon Sep 17 00:00:00 2001 From: joostdecock Date: Sun, 25 Sep 2022 16:40:09 +0200 Subject: [PATCH] fix(core): Put getId into a closure --- packages/core/src/part.mjs | 30 +++++++++++++++++------------- packages/core/tests/part.test.mjs | 20 ++++++++++++++++---- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/packages/core/src/part.mjs b/packages/core/src/part.mjs index bd07037515c..fd8c6bf99bc 100644 --- a/packages/core/src/part.mjs +++ b/packages/core/src/part.mjs @@ -77,18 +77,6 @@ Part.prototype.attr = function (name, value, overwrite = false) { return this } -/** - * Returns on unused ID (unused in this part) - * - * @param {string} prefix - An optional prefix to apply to the ID - * @return {string} id - The id - */ -Part.prototype.getId = function (prefix = '') { - this.freeId += 1 - - return prefix + this.freeId -} - /** * Hide the part * @@ -125,7 +113,7 @@ Part.prototype.shorthand = function () { const shorthand = { complete, context: this.context, - getId: this.getId, + getId: this.__getIdClosure(), hide: this.hide, log: this.context.store.log, paperless, @@ -289,6 +277,22 @@ Part.prototype.__boundary = function () { return this } +/** + * Returns a closure holding a getId method (returns an ID unused in this part) + * + * @return {function} getId - The getId function + */ +Part.prototype.__getIdClosure = function () { + const self = this + const method = function (prefix = '') { + self.freeId += 1 + + return prefix + self.freeId + } + + return method +} + /** * Copies point/path/snippet data from part orig into this * diff --git a/packages/core/tests/part.test.mjs b/packages/core/tests/part.test.mjs index 3e5a7859a64..56848de68b2 100644 --- a/packages/core/tests/part.test.mjs +++ b/packages/core/tests/part.test.mjs @@ -58,10 +58,22 @@ describe('Part', () => { expect(pattern.parts[0].test.points.macro.y).to.equal(456) }) - it('Should return a free ID', () => { - const part = new Part() - const free = part.getId() - expect(part.getId()).to.equal('' + (parseInt(free) + 1)) + it('Should return a free ID in draft method', () => { + let id = null + const part = { + name: 'test', + draft: ({ getId, part }) => { + console.log(getId) + id = getId() + id = getId() + id = getId() + + return part + }, + } + const design = new Design({ parts: [part] }) + new design().draft() + expect(id).to.equal('3') }) it('Should return a function from __unitsClosure', () => {