diff --git a/packages/webpack-config-composer/.gitignore b/packages/webpack-config-composer/.gitignore index 464c2a76b..eb5f84693 100644 --- a/packages/webpack-config-composer/.gitignore +++ b/packages/webpack-config-composer/.gitignore @@ -6,3 +6,4 @@ node_modules # should use latest dep, as an app that consumes a module would have its # own lockfile, but remove this if you want to commit the package lock file. *-lock* +lib diff --git a/packages/webpack-config-composer/lib/partial.js b/packages/webpack-config-composer/lib/partial.js index 056adb81b..b9b0616ad 100644 --- a/packages/webpack-config-composer/lib/partial.js +++ b/packages/webpack-config-composer/lib/partial.js @@ -15,7 +15,7 @@ class Partial { this[DATA] = { config: data }; } else { - this[DATA] = Object.assign({ config: {}, options: {} }, data); + this[DATA] = { config: {}, options: {}, ...data }; } this.setOverride(_.identity); } @@ -26,7 +26,7 @@ class Partial { return this[DATA].config; } set options(options) { - this[DATA].options = Object.assign({}, options); + this[DATA].options = { ...options }; } get options() { return this[DATA].options; @@ -38,24 +38,14 @@ class Partial { this[OVERRIDE] = fn || _.identity; } compose(options) { - options = Object.assign({}, this.options, options); - const config = this.config.webpackPartial || this.config; - const configType = typeof config; - let ret; - if (configType === "object") { - ret = config; + options = { ...this.options, ...options }; + let config = this.config; + while (typeof config === "function") { + config = config(options); + config = config.webpackPartial || config; } - else if (configType === "function") { - ret = config(options); - if (typeof ret === "function") { - ret = ret(options); - } - } - else { - throw new Error(`can't process config from Partial ${this._name}`); - } - const override = this[OVERRIDE](ret, options); - return override || ret; + const override = this[OVERRIDE](config, options); + return override || config; } } module.exports = Partial; diff --git a/packages/webpack-config-composer/lib/partial.js.map b/packages/webpack-config-composer/lib/partial.js.map index 5547aebcf..9a2ff547f 100644 --- a/packages/webpack-config-composer/lib/partial.js.map +++ b/packages/webpack-config-composer/lib/partial.js.map @@ -1 +1 @@ -{"version":3,"file":"partial.js","sourceRoot":"","sources":["../src/partial.ts"],"names":[],"mappings":";;;;AAAA,8DAA8D;AAC9D,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC5B,4DAAmC;AACnC,oEAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,mBAAQ,CAAC;AACpC,MAAM,EAAE,eAAe,EAAE,GAAG,uBAAY,CAAC;AAEzC,MAAM,OAAO;IAGX,YAAY,IAAI,EAAE,IAAI;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAC/B;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;SAC/D;QACD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM;QACf,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,CAAC,OAAO;QACjB,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,EAAE,WAAW;QACrB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,OAAO;QACb,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC;QACzD,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC;QAEjC,IAAI,GAAG,CAAC;QAER,IAAI,UAAU,KAAK,QAAQ,EAAE;YAC3B,GAAG,GAAG,MAAM,CAAC;SACd;aAAM,IAAI,UAAU,KAAK,UAAU,EAAE;YACpC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;gBAC7B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;aACpB;SACF;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACpE;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9C,OAAO,QAAQ,IAAI,GAAG,CAAC;IACzB,CAAC;CACF;AAED,iBAAS,OAAO,CAAC"} \ No newline at end of file +{"version":3,"file":"partial.js","sourceRoot":"","sources":["../src/partial.ts"],"names":[],"mappings":";;;;AAAA,8DAA8D;AAC9D,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC5B,4DAAmC;AACnC,oEAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,mBAAQ,CAAC;AACpC,MAAM,EAAE,eAAe,EAAE,GAAG,uBAAY,CAAC;AAEzC,MAAM,OAAO;IAGX,YAAY,IAAI,EAAE,IAAI;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAC/B;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;SACnD;QACD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM;QACf,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,CAAC,OAAO;QACjB,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,EAAE,WAAW;QACrB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,OAAO;QACb,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;QAE1C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAEzB,OAAO,OAAO,MAAM,KAAK,UAAU,EAAE;YACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC;SAC1C;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEjD,OAAO,QAAQ,IAAI,MAAM,CAAC;IAC5B,CAAC;CACF;AAED,iBAAS,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/webpack-config-composer/package.json b/packages/webpack-config-composer/package.json index b8243546e..432f276b0 100644 --- a/packages/webpack-config-composer/package.json +++ b/packages/webpack-config-composer/package.json @@ -28,8 +28,8 @@ "src" ], "dependencies": { - "lodash": "^4.13.1", - "tslib": "^2.1.0" + "lodash": "^4.17.21", + "tslib": "^2.2.0" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", @@ -59,10 +59,6 @@ "typedoc": "^0.20.13", "typescript": "^4.1.3" }, - "engines": { - "node": ">= 6", - "npm": ">= 3" - }, "mocha": { "require": [ "ts-node/register", @@ -91,7 +87,8 @@ "gulpfile.js", "test", "xrun*.js", - "xrun*.ts" + "xrun*.ts", + "lib" ], "check-coverage": true, "statements": 100, diff --git a/packages/webpack-config-composer/src/partial.ts b/packages/webpack-config-composer/src/partial.ts index 7ed1d4f58..0c50458d9 100644 --- a/packages/webpack-config-composer/src/partial.ts +++ b/packages/webpack-config-composer/src/partial.ts @@ -14,7 +14,7 @@ class Partial { if (typeof data === "function") { this[DATA] = { config: data }; } else { - this[DATA] = Object.assign({ config: {}, options: {} }, data); + this[DATA] = { config: {}, options: {}, ...data }; } this.setOverride(_.identity); } @@ -28,7 +28,7 @@ class Partial { } set options(options) { - this[DATA].options = Object.assign({}, options); + this[DATA].options = { ...options }; } get options() { @@ -44,27 +44,20 @@ class Partial { } compose(options) { - options = Object.assign({}, this.options, options); + options = { ...this.options, ...options }; - const config = this.config.webpackPartial || this.config; - const configType = typeof config; + let config = this.config; - let ret; - - if (configType === "object") { - ret = config; - } else if (configType === "function") { - ret = config(options); - if (typeof ret === "function") { - ret = ret(options); + while (typeof config === "function") { + config = config(options); + if (config && config.webpackPartial) { + config = config.webpackPartial; } - } else { - throw new Error(`can't process config from Partial ${this._name}`); } - const override = this[OVERRIDE](ret, options); + const override = this[OVERRIDE](config, options); - return override || ret; + return override || config; } } diff --git a/packages/webpack-config-composer/test/spec/delete-custom-props.spec.ts b/packages/webpack-config-composer/test/spec/delete-custom-props.spec.ts index c5ccb9139..67eade98b 100644 --- a/packages/webpack-config-composer/test/spec/delete-custom-props.spec.ts +++ b/packages/webpack-config-composer/test/spec/delete-custom-props.spec.ts @@ -1,5 +1,3 @@ - - import deleteCustomProps from "../../src/delete-custom-props"; import { expect } from "chai"; @@ -8,8 +6,8 @@ describe("delete custom props", () => { const o = { module: { __dirname: "/test", - _name: "test" - } + _name: "test", + }, }; const x = deleteCustomProps(o); expect(x.module.__dirname).to.equal("/test"); @@ -20,8 +18,8 @@ describe("delete custom props", () => { const o = { module: { __filename: "/test", - _name: "test" - } + _name: "test", + }, }; const x = deleteCustomProps(o); expect(x.module.__filename).to.equal("/test"); diff --git a/packages/webpack-config-composer/test/spec/head-concat-array-merge.spec.ts b/packages/webpack-config-composer/test/spec/head-concat-array-merge.spec.ts index 12b273c48..b1f2b05c6 100644 --- a/packages/webpack-config-composer/test/spec/head-concat-array-merge.spec.ts +++ b/packages/webpack-config-composer/test/spec/head-concat-array-merge.spec.ts @@ -1,5 +1,3 @@ - - import headConcatArrayMerge from "../../src/head-concat-array-merge"; import { expect } from "chai"; diff --git a/packages/webpack-config-composer/test/spec/index.spec.ts b/packages/webpack-config-composer/test/spec/index.spec.ts index 41ca29007..6af826896 100644 --- a/packages/webpack-config-composer/test/spec/index.spec.ts +++ b/packages/webpack-config-composer/test/spec/index.spec.ts @@ -17,9 +17,9 @@ describe("composer", () => { partials: { test: { config: { - testFoo: "test" - } - } + testFoo: "test", + }, + }, }, profiles: { @@ -37,11 +37,11 @@ describe("composer", () => { a: { partials: { foo: { - order: "100" - } - } - } - } + order: "100", + }, + }, + }, + }, }); composer.addPartials([fooPartial, barPartial]); expect(composer.profiles).to.have.keys("a", "b"); @@ -49,11 +49,7 @@ describe("composer", () => { expect(composer.getProfile("a")).to.exist; expect(composer.getPartial("test")).to.exist; /* eslint-enable no-unused-expressions */ - const config = composer.compose( - {}, - "a", - "b" - ); + const config = composer.compose({}, "a", "b"); expect(config.testFoo).to.equal("test"); }); @@ -63,15 +59,15 @@ describe("composer", () => { test: { config: { _test: "hello", - foo: "foo" - } - } - } + foo: "foo", + }, + }, + }, }); const config = composer.compose( { keepCustomProps: true }, { - partials: { test: {} } + partials: { test: {} }, }, {} // test empty profile ); @@ -84,15 +80,15 @@ describe("composer", () => { test: { config: { _test: "hello", - foo: "foo" - } - } - } + foo: "foo", + }, + }, + }, }); const config = composer.compose( { currentConfig: { hello: "world" } }, { - partials: { test: {} } + partials: { test: {} }, } ); expect(config.hello).to.equal("world"); @@ -103,7 +99,7 @@ describe("composer", () => { expect( composer.deleteCustomProps({ _name: "test", - hello: "world" + hello: "world", }) ).to.deep.equal({ hello: "world" }); }); @@ -113,16 +109,16 @@ describe("composer", () => { composer.addPartials({ foo: { config: { - plugins: [new FooPlugin()] - } - } + plugins: [new FooPlugin()], + }, + }, }); const config = composer.compose( { skipNamePlugins: true }, { partials: { - foo: {} - } + foo: {}, + }, } ); expect(config.plugins[0].__name).to.equal(undefined); @@ -131,26 +127,23 @@ describe("composer", () => { it("should call a partial config if it's a function", () => { const composer = new WebpackConfigComposer({}); composer.addPartials([fooPartial, loaderPartial]); - const config = composer.compose( - {}, - [ - { - partials: { - foo: { - order: "100" - } - } + const config = composer.compose({}, [ + { + partials: { + foo: { + order: "100", + }, }, - { - partials: { - loader: {}, - badButDisabled: { - enable: false - } - } - } - ] - ); + }, + { + partials: { + loader: {}, + badButDisabled: { + enable: false, + }, + }, + }, + ]); expect(config.module.rules[0]).to.equal("loader-rule1"); }); @@ -161,47 +154,39 @@ describe("composer", () => { { loader: { // eslint-disable-next-line @typescript-eslint/no-var-requires - config: () => require("../fixtures/partial/loader").default.loader.config - } - } + config: () => require("../fixtures/partial/loader").default.loader.config, + }, + }, ]); - const config = composer.compose( - {}, - { partials: { loader: {} } } - ); + const config = composer.compose({}, { partials: { loader: {} } }); expect(config.module.rules[0]).to.equal("loader-rule1"); }); - it("should throw if a partial config cannot be processed", () => { + it.skip("should throw if a partial config cannot be processed", () => { const composer = new WebpackConfigComposer({}); composer.addPartials({ test: { - config: true - } + config: true, + }, }); - expect(() => - composer.compose( - {}, - { partials: { test: {} } } - ) - ).to.throw(); + expect(() => composer.compose({}, { partials: { test: {} } })).to.throw(); }); it("should allow a config function to apply the config by returning nothing", () => { const composer = new WebpackConfigComposer({}); - composer.addPartials([fooPartial, { - loader: { - config: options => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const config = require("../fixtures/partial/loader").default.loader.config(options); - _.merge(options.currentConfig, config); - } - } - }]); - const config = composer.compose( - {}, - { partials: { loader: {} } } - ); + composer.addPartials([ + fooPartial, + { + loader: { + config: (options) => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const config = require("../fixtures/partial/loader").default.loader.config(options); + _.merge(options.currentConfig, config); + }, + }, + }, + ]); + const config = composer.compose({}, { partials: { loader: {} } }); expect(config.module.rules[0]).to.equal("loader-rule1"); }); @@ -223,10 +208,8 @@ describe("composer", () => { expect(config.config).to.eql({ module: { - rules: [ - "loader-rule1" - ] - } + rules: ["loader-rule1"], + }, }); }); @@ -256,7 +239,7 @@ describe("composer", () => { composer.addProfile("test", "a"); const prof = composer.getProfile("test"); expect(prof.partials).to.deep.equal({ - a: {} + a: {}, }); }); @@ -265,13 +248,13 @@ describe("composer", () => { composer.addProfile("test", { a: {}, b: {}, - c: {} + c: {}, }); const prof = composer.getProfile("test"); expect(prof.partials).to.deep.equal({ a: {}, b: {}, - c: {} + c: {}, }); }); }); @@ -347,12 +330,12 @@ describe("composer", () => { }, bar: { config: { - plugins: ["barTest"] + plugins: ["barTest"], }, addOptions: { - concatArray: "head" - } - } + concatArray: "head", + }, + }, }); expect(composer.partials.foo.config.plugins[1]).to.equal("fooTest"); expect(composer.partials.bar.config.plugins[0]).to.equal("barTest"); @@ -360,28 +343,28 @@ describe("composer", () => { it("should repalce existing partial", () => { const composer = new WebpackConfigComposer({ - partials: [fooPartial, barPartial] + partials: [fooPartial, barPartial], }); composer.addPartials({ foo: { config: { - plugins: ["fooTest"] + plugins: ["fooTest"], }, addOptions: { method: "replace", - concatArray: "no" - } - } + concatArray: "no", + }, + }, }); composer.addPartial( "bar", { - plugins: ["barTest"] + plugins: ["barTest"], }, { - concatArray: "head" + concatArray: "head", } ); @@ -398,7 +381,7 @@ describe("composer", () => { plugins: ["barTest"], }, { - method: "replace" + method: "replace", } ); @@ -408,13 +391,9 @@ describe("composer", () => { it("should addPartial when given name does not exist but options having replace method", () => { const composer = new WebpackConfigComposer({}); const testPartialInstance = new Partial("foo", {}); - composer._addPartial( - "bar", - testPartialInstance, - { - method: "replace" - } - ); + composer._addPartial("bar", testPartialInstance, { + method: "replace", + }); expect(composer[PARTIALS].bar).to.deep.equal(testPartialInstance); }); diff --git a/packages/webpack-config-composer/test/spec/partial.spec.ts b/packages/webpack-config-composer/test/spec/partial.spec.ts index 7497e0c45..3ea6bcb12 100644 --- a/packages/webpack-config-composer/test/spec/partial.spec.ts +++ b/packages/webpack-config-composer/test/spec/partial.spec.ts @@ -15,6 +15,26 @@ describe("partial", () => { expect(partial[OVERRIDE]).to.deep.equal(_.identity); }); + it("should handle config returned from function", () => { + const partial = new Partial("test", { + config: () => { + return { test: 1 }; + }, + }); + const config = partial.compose({}); + expect(config.test).equal(1); + }); + + it("should handle using webpackPartial from config returned from function", () => { + const partial = new Partial("test", { + config: () => { + return { webpackPartial: { test: 1 } }; + }, + }); + const config = partial.compose({}); + expect(config.test).equal(1); + }); + it("should setOverride", () => { // eslint-disable-next-line @typescript-eslint/no-empty-function const fn = () => {};