diff --git a/README.md b/README.md index 5261fac5d..296d4141c 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,44 @@ Valid values: `none` or `inline`. } ``` +#### Third-party dependencies: external and embedded dependencies + +By default, dependencies of a library are treated as external dependencies and thus are not embedded in the final bundle. +In most cases, you should expect that third-party dependencies will be part of the [`peerDependencies` of your distributables](https://nodejs.org/uk/blog/npm/peer-dependencies/). + +However, if you want to embed a dependency into the distributable bundle you are able to do so by adding the dependency in the `embedded` section like so: + +***HEADS UP***: embedding a dependency will result in you shipping the dependency's source code to your users! + +```json +{ + "$schema": "../../../src/ng-package.schema.json", + "lib": { + "embedded": [ + "lodash", + "date-fns" + ] + } +} +``` + +By default, ng-packagr will treat dependencies as external dependencies. +When writing the [UMD bundle](https://github.com/umdjs/umd), ng-packagr does its best to provide common default values for the UMD module identifiers and `rollup` will also do its best to guess the module ID of an external dependency. +Even then, you should make sure that the UMD module identifiers of the external dependencies are correct. +In case ng-packagr doesn't provide a default and rollup is unable to guess the correct identifier, you should explicitly provide the module identifier by using `umdModuleIds` in the library's package file section like so: + +```json +{ + "$schema": "../../../src/ng-package.schema.json", + "lib": { + "umdModuleIds": { + "lodash" : "_", + "date-fns" : "DateFns", + } + } +} +``` + #### React loves Angular, Angular loves React What if I want to use React Components in Angular? @@ -211,7 +249,7 @@ construct them, you can set the `jsx` flag for your library through `ng-package. "$schema": "../../../src/ng-package.schema.json", "lib": { "entryFile": "public_api.ts", - "externals": { + "umdModuleIds": { "react": "React", "react-dom": "ReactDOM" }, @@ -222,7 +260,7 @@ construct them, you can set the `jsx` flag for your library through `ng-package. The `jsx` flag will accept what the corresponding `tsconfig` accepts, more information [in the TypeScript Handbook chaper on JSX](https://www.typescriptlang.org/docs/handbook/jsx.html). -Note: Don't forget to include `react` and `react-dom` in your `externals` so that you're not bundling those dependencies! +Note: Don't forget to include `react` and `react-dom` in your `umdModuleIds` so that you're not bundling those dependencies! ## Further documentation diff --git a/integration/consumers/ng-cli/yarn.lock b/integration/consumers/ng-cli/yarn.lock index 99a683e64..0bdc41346 100644 --- a/integration/consumers/ng-cli/yarn.lock +++ b/integration/consumers/ng-cli/yarn.lock @@ -318,7 +318,7 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5: +ajv@^5.0.0, ajv@^5.1.5: version "5.5.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2" dependencies: @@ -521,11 +521,7 @@ aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.2.1, aws4@^1.6.0: +aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" @@ -708,18 +704,6 @@ boom@2.x.x: dependencies: hoek "2.x.x" -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -922,17 +906,17 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" +chalk@^2.0.0, chalk@^2.1.0, chalk@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.2.2.tgz#4403f5cf18f35c05f51fbdf152bf588f956cf7cb" dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" supports-color "^4.0.0" -chalk@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.2.2.tgz#4403f5cf18f35c05f51fbdf152bf588f956cf7cb" +chalk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: ansi-styles "^3.1.0" escape-string-regexp "^1.0.5" @@ -1301,12 +1285,6 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1459,13 +1437,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@*, debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8: +debug@*, debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -1483,6 +1455,12 @@ debug@2.3.3: dependencies: ms "0.7.2" +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2018,7 +1996,7 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" -extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: +extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -2037,14 +2015,10 @@ extract-text-webpack-plugin@^3.0.2: schema-utils "^0.3.0" webpack-sources "^1.0.1" -extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2189,14 +2163,6 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -2414,10 +2380,6 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - har-validator@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" @@ -2434,13 +2396,6 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2504,15 +2459,6 @@ hawk@3.1.3, hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -2529,10 +2475,6 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" @@ -2634,14 +2576,6 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -3539,11 +3473,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.30.0 < 2": - version "1.32.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" - -mime-db@~1.30.0: +"mime-db@>= 1.30.0 < 2", mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -3841,7 +3771,7 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -3933,7 +3863,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4093,10 +4023,6 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -4525,19 +4451,15 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@1.4.1: +q@1.4.1, q@^1.1.2, q@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -q@^1.1.2, q@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" -qs@6.5.1, qs@~6.5.1: +qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -4782,34 +4704,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@^2.78.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@2.81.0: +request@2, request@2.81.0, request@^2.78.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5130,12 +5025,6 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - dependencies: - hoek "4.x.x" - socket.io-adapter@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" @@ -5317,11 +5206,7 @@ ssri@^5.0.0: dependencies: safe-buffer "^5.1.0" -"statuses@>= 1.3.1 < 2": - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -statuses@~1.3.1: +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -5388,7 +5273,7 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -5545,18 +5430,12 @@ tmp@0.0.30: dependencies: os-tmpdir "~1.0.1" -tmp@0.0.31: +tmp@0.0.31, tmp@0.0.x: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" dependencies: os-tmpdir "~1.0.1" -tmp@0.0.x: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -5573,7 +5452,7 @@ toposort@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: @@ -5856,7 +5735,7 @@ uuid@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0, uuid@^3.1.0: +uuid@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -6111,20 +5990,13 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -ws@1.1.2: +ws@1.1.2, ws@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" dependencies: options ">=0.0.5" ultron "1.0.x" -ws@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" diff --git a/integration/samples/core/ng-package.json b/integration/samples/core/ng-package.json index 5ca231a50..eb4b08fda 100644 --- a/integration/samples/core/ng-package.json +++ b/integration/samples/core/ng-package.json @@ -1,9 +1,6 @@ { "$schema": "../../../src/ng-package.schema.json", "lib": { - "entryFile": "public_api.ts", - "externals": { - "rxjs/operator/map": "Rx.Observable.prototype" - } + "entryFile": "public_api.ts" } } diff --git a/integration/samples/embed-assets/ng-package.json b/integration/samples/embed-assets/ng-package.json index 94a12dbb3..01f8c6b9f 100644 --- a/integration/samples/embed-assets/ng-package.json +++ b/integration/samples/embed-assets/ng-package.json @@ -2,9 +2,6 @@ "$schema": "../../../src/ng-package.schema.json", "lib": { "entryFile": "public_api.ts", - "cssUrl": "inline", - "externals": { - "rxjs/operator/map": "Rx.Observable.prototype" - } + "cssUrl": "inline" } } diff --git a/integration/samples/externals/ng-package.json b/integration/samples/externals/ng-package.json index eb4b08fda..b6ce087c1 100644 --- a/integration/samples/externals/ng-package.json +++ b/integration/samples/externals/ng-package.json @@ -1,6 +1,9 @@ { "$schema": "../../../src/ng-package.schema.json", "lib": { + "embedded": [ + "trim-newlines" + ], "entryFile": "public_api.ts" } } diff --git a/integration/samples/externals/public_api.ts b/integration/samples/externals/public_api.ts index 22b3bac69..f547c2543 100644 --- a/integration/samples/externals/public_api.ts +++ b/integration/samples/externals/public_api.ts @@ -1,3 +1,4 @@ export * from './src/cdk'; export * from './src/rxjs-lettable-operators'; export * from './src/rxjs-operators'; +export * from './src/embedded'; diff --git a/integration/samples/externals/specs/rxjs-lettables.ts b/integration/samples/externals/specs/umd.ts similarity index 65% rename from integration/samples/externals/specs/rxjs-lettables.ts rename to integration/samples/externals/specs/umd.ts index cc0ff2beb..bcf6327ac 100644 --- a/integration/samples/externals/specs/rxjs-lettables.ts +++ b/integration/samples/externals/specs/umd.ts @@ -7,7 +7,9 @@ describe(`@sample/externals`, () => { describe(`UMD Bundle`, () => { let API; + let BUNDLE; before(() => { + BUNDLE = fs.readFileSync(path.resolve(__dirname, '../dist/bundles/sample-externals.umd.js'), { encoding: 'utf-8' }); API = require('../dist/bundles/sample-externals.umd.min.js'); }); @@ -34,6 +36,18 @@ describe(`@sample/externals`, () => { it(`should export RxJsOperators`, () => { expect(API.RxJsOperators).to.be.ok; }); + + it(`should import '@angular/core'`, () => { + expect(BUNDLE).to.contain("require('@angular/core')") + }); + + it(`should embed 'createCommonjsModule' method`, () => { + expect(BUNDLE).to.contain("function createCommonjsModule") + }); + + it(`should embed 'fn.start' method`, () => { + expect(BUNDLE).to.contain("n.start = function") + }); }); }); diff --git a/integration/samples/externals/src/embedded.ts b/integration/samples/externals/src/embedded.ts new file mode 100644 index 000000000..20d17e02c --- /dev/null +++ b/integration/samples/externals/src/embedded.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from "@angular/core" +import trimLines from "trim-newlines"; + +export const trim = trimLines.start("hello "); +export const inject = new InjectionToken("token"); diff --git a/integration/samples/jsx/ng-package.json b/integration/samples/jsx/ng-package.json index 542c522af..6475c85c7 100644 --- a/integration/samples/jsx/ng-package.json +++ b/integration/samples/jsx/ng-package.json @@ -2,7 +2,7 @@ "$schema": "../../../src/ng-package.schema.json", "lib": { "entryFile": "public_api.ts", - "externals": { + "umdModuleIds": { "react": "React", "react-dom": "ReactDOM" }, diff --git a/integration/samples/same-name/ng-package.json b/integration/samples/same-name/ng-package.json index 5ca231a50..eb4b08fda 100644 --- a/integration/samples/same-name/ng-package.json +++ b/integration/samples/same-name/ng-package.json @@ -1,9 +1,6 @@ { "$schema": "../../../src/ng-package.schema.json", "lib": { - "entryFile": "public_api.ts", - "externals": { - "rxjs/operator/map": "Rx.Observable.prototype" - } + "entryFile": "public_api.ts" } } diff --git a/integration/samples/same-name/testing/ng-package.json b/integration/samples/same-name/testing/ng-package.json index 5a58bad9a..14e2dce6e 100644 --- a/integration/samples/same-name/testing/ng-package.json +++ b/integration/samples/same-name/testing/ng-package.json @@ -1,9 +1,6 @@ { "$schema": "../../../../src/ng-package.schema.json", "lib": { - "entryFile": "public_api.ts", - "externals": { - "rxjs/operator/map": "Rx.Observable.prototype" - } + "entryFile": "public_api.ts" } } diff --git a/package.json b/package.json index 8bb0c8fa2..c54f045db 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@types/node": "^8.0.0", "@types/react": "^16.0.19", "@types/react-dom": "^16.0.2", - "@types/rollup": "^0.51.1", + "@types/rollup": "^0.51.2", "@types/sinon": "^4.0.0", "chai": "^4.0.1", "copyfiles": "^1.2.0", diff --git a/src/lib/conf/rollup.globals.ts b/src/lib/conf/rollup.globals.ts deleted file mode 100644 index 34706db61..000000000 --- a/src/lib/conf/rollup.globals.ts +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Set of rollup globals that are added by default. - * - * You can overwrite or add to these w/ `lib.externals` property in `ng-package.json`. - */ -export const ROLLUP_GLOBALS = { - // Angular dependencies - '@angular/animations': 'ng.animations', - '@angular/core': 'ng.core', - '@angular/common': 'ng.common', - '@angular/common/http': 'ng.common.http', - '@angular/cdk': 'ng.cdk', - '@angular/cdk/a11y': 'ng.cdk.a11y', - '@angular/cdk/accordion': 'ng.cdk.accordion', - '@angular/cdk/bidi': 'ng.cdk.bidi', - '@angular/cdk/coercion': 'ng.cdk.coercion', - '@angular/cdk/collections': 'ng.cdk.collections', - '@angular/cdk/keycodes': 'ng.cdk.keycodes', - '@angular/cdk/layout': 'ng.cdk.layout', - '@angular/cdk/observers': 'ng.cdk.observers', - '@angular/cdk/overlay': 'ng.cdk.overlay', - '@angular/cdk/platform': 'ng.cdk.platform', - '@angular/cdk/portal': 'ng.cdk.portal', - '@angular/cdk/rxjs': 'ng.cdk.rxjs', - '@angular/cdk/scrolling': 'ng.cdk.scrolling', - '@angular/cdk/stepper': 'ng.cdk.stepper', - '@angular/cdk/table': 'ng.cdk.table', - '@angular/forms': 'ng.forms', - '@angular/http': 'ng.http', - '@angular/router': 'ng.router', - // XX: it could also be discussed to exclude the platform libraries here - // Why? Library authors should try to not use the platform-specific code directly - // Instead, libraries should depend on CommonModule from @angular/common - '@angular/platform-browser': 'ng.platformBrowser', - '@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic', - '@angular/platform-browser/animations': 'ng.platformBrowser.animations', - // RxJS dependencies - 'rxjs/AnonymousSubject': 'Rx', - 'rxjs/AsyncSubject': 'Rx', - 'rxjs/BehaviorSubject': 'Rx', - 'rxjs/Notifiction': 'Rx', - 'rxjs/ObservableInput': 'Rx', - 'rxjs/Observable': 'Rx', - 'rxjs/Observer': 'Rx', - 'rxjs/ReplaySubject': 'Rx', - 'rxjs/Scheduler': 'Rx', - 'rxjs/Subject': 'Rx', - 'rxjs/SubjectSubscriber': 'Rx', - 'rxjs/SubscribableOrPromise': 'Rx', - 'rxjs/Subscriber': 'Rx', - 'rxjs/Subscription': 'Rx', - 'rxjs/TeardownLogic': 'Rx', - 'rxjs/add/observable/bindCallback': 'Rx.Observable', - 'rxjs/add/observable/bindNodeCallback': 'Rx.Observable', - 'rxjs/add/observable/combineLatest': 'Rx.Observable', - 'rxjs/add/observable/concat': 'Rx.Observable', - 'rxjs/add/observable/create': 'Rx.Observable', - 'rxjs/add/observable/defer': 'Rx.Observable', - 'rxjs/add/observable/empty': 'Rx.Observable', - 'rxjs/add/observable/forkJoin': 'Rx.Observable', - 'rxjs/add/observable/from': 'Rx.Observable', - 'rxjs/add/observable/fromEvent': 'Rx.Observable', - 'rxjs/add/observable/fromEventPattern': 'Rx.Observable', - 'rxjs/add/observable/fromPromise': 'Rx.Observable', - 'rxjs/add/observable/interval': 'Rx.Observable', - 'rxjs/add/observable/merge': 'Rx.Observable', - 'rxjs/add/observable/never': 'Rx.Observable', - 'rxjs/add/observable/of': 'Rx.Observable', - 'rxjs/add/observable/range': 'Rx.Observable', - 'rxjs/add/observable/throw': 'Rx.Observable', - 'rxjs/add/observable/timer': 'Rx.Observable', - 'rxjs/add/observable/webSocket': 'Rx.Observable', - 'rxjs/add/observable/zip': 'Rx.Observable', - 'rxjs/add/observable': 'Rx.Observable', - 'rxjs/add/operator/audit': 'Rx.Observable.prototype', - 'rxjs/add/operator/auditTime': 'Rx.Observable.prototype', - 'rxjs/add/operator/buffer': 'Rx.Observable.prototype', - 'rxjs/add/operator/bufferCount': 'Rx.Observable.prototype', - 'rxjs/add/operator/bufferTime': 'Rx.Observable.prototype', - 'rxjs/add/operator/bufferToggle': 'Rx.Observable.prototype', - 'rxjs/add/operator/bufferWhen': 'Rx.Observable.prototype', - 'rxjs/add/operator/catch': 'Rx.Observable.prototype', - 'rxjs/add/operator/combineAll': 'Rx.Observable.prototype', - 'rxjs/add/operator/combineLatest': 'Rx.Observable.prototype', - 'rxjs/add/operator/concat': 'Rx.Observable.prototype', - 'rxjs/add/operator/concatAll': 'Rx.Observable.prototype', - 'rxjs/add/operator/concatMap': 'Rx.Observable.prototype', - 'rxjs/add/operator/concatMapTo': 'Rx.Observable.prototype', - 'rxjs/add/operator/count': 'Rx.Observable.prototype', - 'rxjs/add/operator/debounce': 'Rx.Observable.prototype', - 'rxjs/add/operator/debounceTime': 'Rx.Observable.prototype', - 'rxjs/add/operator/defaultIfEmpty': 'Rx.Observable.prototype', - 'rxjs/add/operator/delay': 'Rx.Observable.prototype', - 'rxjs/add/operator/delayWhen': 'Rx.Observable.prototype', - 'rxjs/add/operator/dematerialize': 'Rx.Observable.prototype', - 'rxjs/add/operator/distinct': 'Rx.Observable.prototype', - 'rxjs/add/operator/distinctUntilChanged': 'Rx.Observable.prototype', - 'rxjs/add/operator/distinctUntilKeyChanged': 'Rx.Observable.prototype', - 'rxjs/add/operator/do': 'Rx.Observable.prototype', - 'rxjs/add/operator/elementAt': 'Rx.Observable.prototype', - 'rxjs/add/operator/every': 'Rx.Observable.prototype', - 'rxjs/add/operator/exhaust': 'Rx.Observable.prototype', - 'rxjs/add/operator/exhaustMap': 'Rx.Observable.prototype', - 'rxjs/add/operator/expand': 'Rx.Observable.prototype', - 'rxjs/add/operator/filter': 'Rx.Observable.prototype', - 'rxjs/add/operator/finally': 'Rx.Observable.prototype', - 'rxjs/add/operator/find': 'Rx.Observable.prototype', - 'rxjs/add/operator/findIndex': 'Rx.Observable.prototype', - 'rxjs/add/operator/first': 'Rx.Observable.prototype', - 'rxjs/add/operator/forEach': 'Rx.Observable.prototype', - 'rxjs/add/operator/groupBy': 'Rx.Observable.prototype', - 'rxjs/add/operator/ignoreElements': 'Rx.Observable.prototype', - 'rxjs/add/operator/isEmpty': 'Rx.Observable.prototype', - 'rxjs/add/operator/last': 'Rx.Observable.prototype', - 'rxjs/add/operator/let': 'Rx.Observable.prototype', - 'rxjs/add/operator/letProto': 'Rx.Observable.prototype', - 'rxjs/add/operator/lift': 'Rx.Observable.prototype', - 'rxjs/add/operator/map': 'Rx.Observable.prototype', - 'rxjs/add/operator/mapTo': 'Rx.Observable.prototype', - 'rxjs/add/operator/materialize': 'Rx.Observable.prototype', - 'rxjs/add/operator/max': 'Rx.Observable.prototype', - 'rxjs/add/operator/merge': 'Rx.Observable.prototype', - 'rxjs/add/operator/mergeAll': 'Rx.Observable.prototype', - 'rxjs/add/operator/mergeMap': 'Rx.Observable.prototype', - 'rxjs/add/operator/mergeMapTo': 'Rx.Observable.prototype', - 'rxjs/add/operator/mergeScan': 'Rx.Observable.prototype', - 'rxjs/add/operator/min': 'Rx.Observable.prototype', - 'rxjs/add/operator/multicast': 'Rx.Observable.prototype', - 'rxjs/add/operator/observeOn': 'Rx.Observable.prototype', - 'rxjs/add/operator/pairwise': 'Rx.Observable.prototype', - 'rxjs/add/operator/partition': 'Rx.Observable.prototype', - 'rxjs/add/operator/pluck': 'Rx.Observable.prototype', - 'rxjs/add/operator/publish': 'Rx.Observable.prototype', - 'rxjs/add/operator/publishBehavior':'Rx.Observable.prototype', - 'rxjs/add/operator/publishLast': 'Rx.Observable.prototype', - 'rxjs/add/operator/publishReplay': 'Rx.Observable.prototype', - 'rxjs/add/operator/race': 'Rx.Observable.prototype', - 'rxjs/add/operator/reduce': 'Rx.Observable.prototype', - 'rxjs/add/operator/repeat': 'Rx.Observable.prototype', - 'rxjs/add/operator/repeatWhen': 'Rx.Observable.prototype', - 'rxjs/add/operator/retry': 'Rx.Observable.prototype', - 'rxjs/add/operator/retryWhen': 'Rx.Observable.prototype', - 'rxjs/add/operator/sample': 'Rx.Observable.prototype', - 'rxjs/add/operator/sampleTime': 'Rx.Observable.prototype', - 'rxjs/add/operator/scan': 'Rx.Observable.prototype', - 'rxjs/add/operator/sequenceEqual': 'Rx.Observable.prototype', - 'rxjs/add/operator/share': 'Rx.Observable.prototype', - 'rxjs/add/operator/single': 'Rx.Observable.prototype', - 'rxjs/add/operator/skip': 'Rx.Observable.prototype', - 'rxjs/add/operator/skipUntil': 'Rx.Observable.prototype', - 'rxjs/add/operator/skipWhile': 'Rx.Observable.prototype', - 'rxjs/add/operator/startWith': 'Rx.Observable.prototype', - 'rxjs/add/operator/subscribeOn': 'Rx.Observable.prototype', - 'rxjs/add/operator/switch': 'Rx.Observable.prototype', - 'rxjs/add/operator/switchMap': 'Rx.Observable.prototype', - 'rxjs/add/operator/switchMapTo': 'Rx.Observable.prototype', - 'rxjs/add/operator/take': 'Rx.Observable.prototype', - 'rxjs/add/operator/takeLast': 'Rx.Observable.prototype', - 'rxjs/add/operator/takeUntil': 'Rx.Observable.prototype', - 'rxjs/add/operator/takeWhile': 'Rx.Observable.prototype', - 'rxjs/add/operator/throttle': 'Rx.Observable.prototype', - 'rxjs/add/operator/throttleTime': 'Rx.Observable.prototype', - 'rxjs/add/operator/timeInterval': 'Rx.Observable.prototype', - 'rxjs/add/operator/timeout': 'Rx.Observable.prototype', - 'rxjs/add/operator/timeoutWith': 'Rx.Observable.prototype', - 'rxjs/add/operator/timestamp': 'Rx.Observable.prototype', - 'rxjs/add/operator/toArray': 'Rx.Observable.prototype', - 'rxjs/add/operator/toPromise': 'Rx.Observable.prototype', - 'rxjs/add/operator/window': 'Rx.Observable.prototype', - 'rxjs/add/operator/windowCount': 'Rx.Observable.prototype', - 'rxjs/add/operator/windowToggle': 'Rx.Observable.prototype', - 'rxjs/add/operator/windowWhen': 'Rx.Observable.prototype', - 'rxjs/add/operator/withLatestFrom': 'Rx.Observable.prototype', - 'rxjs/add/operator/zipAll': 'Rx.Observable.prototype', - 'rxjs/add/operator/zipProto': 'Rx.Observable.prototype', - 'rxjs/add/operator': 'Rx.Observable.prototype', - 'rxjs/observable/bindCallback': 'Rx.Observable', - 'rxjs/observable/bindNodeCallback': 'Rx.Observable', - 'rxjs/observable/combineLatest': 'Rx.Observable', - 'rxjs/observable/concat': 'Rx.Observable', - 'rxjs/observable/defer': 'Rx.Observable', - 'rxjs/observable/empty': 'Rx.Observable', - 'rxjs/observable/forkJoin': 'Rx.Observable', - 'rxjs/observable/from': 'Rx.Observable', - 'rxjs/observable/fromEvent': 'Rx.Observable', - 'rxjs/observable/fromEventPattern': 'Rx.Observable', - 'rxjs/observable/fromPromise': 'Rx.Observable', - 'rxjs/observable/if': 'Rx.Observable', - 'rxjs/observable/interval': 'Rx.Observable', - 'rxjs/observable/merge': 'Rx.Observable', - 'rxjs/observable/never': 'Rx.Observable', - 'rxjs/observable/of': 'Rx.Observable', - 'rxjs/observable/pairs': 'Rx.Observable', - 'rxjs/observable/range': 'Rx.Observable', - 'rxjs/observable/throw': 'Rx.Observable', - 'rxjs/observable/timer': 'Rx.Observable', - 'rxjs/observable/using': 'Rx.Observable', - 'rxjs/observable/zip': 'Rx.Observable', - 'rxjs/observable': 'Rx.Observable', - 'rxjs/operator/audit': 'Rx.Observable.prototype', - 'rxjs/operator/auditTime': 'Rx.Observable.prototype', - 'rxjs/operator/buffer': 'Rx.Observable.prototype', - 'rxjs/operator/bufferCount': 'Rx.Observable.prototype', - 'rxjs/operator/bufferTime': 'Rx.Observable.prototype', - 'rxjs/operator/bufferToggle': 'Rx.Observable.prototype', - 'rxjs/operator/bufferWhen': 'Rx.Observable.prototype', - 'rxjs/operator/catch': 'Rx.Observable.prototype', - 'rxjs/operator/combineAll': 'Rx.Observable.prototype', - 'rxjs/operator/combineLatest': 'Rx.Observable.prototype', - 'rxjs/operator/concat': 'Rx.Observable.prototype', - 'rxjs/operator/concatAll': 'Rx.Observable.prototype', - 'rxjs/operator/concatMap': 'Rx.Observable.prototype', - 'rxjs/operator/concatMapTo': 'Rx.Observable.prototype', - 'rxjs/operator/count': 'Rx.Observable.prototype', - 'rxjs/operator/debounce': 'Rx.Observable.prototype', - 'rxjs/operator/debounceTime': 'Rx.Observable.prototype', - 'rxjs/operator/defaultIfEmpty': 'Rx.Observable.prototype', - 'rxjs/operator/delay': 'Rx.Observable.prototype', - 'rxjs/operator/delayWhen': 'Rx.Observable.prototype', - 'rxjs/operator/dematerialize': 'Rx.Observable.prototype', - 'rxjs/operator/distinct': 'Rx.Observable.prototype', - 'rxjs/operator/distinctUntilChanged': 'Rx.Observable.prototype', - 'rxjs/operator/distinctUntilKeyChanged': 'Rx.Observable.prototype', - 'rxjs/operator/do': 'Rx.Observable.prototype', - 'rxjs/operator/elementAt': 'Rx.Observable.prototype', - 'rxjs/operator/every': 'Rx.Observable.prototype', - 'rxjs/operator/exhaust': 'Rx.Observable.prototype', - 'rxjs/operator/exhaustMap': 'Rx.Observable.prototype', - 'rxjs/operator/expand': 'Rx.Observable.prototype', - 'rxjs/operator/filter': 'Rx.Observable.prototype', - 'rxjs/operator/finally': 'Rx.Observable.prototype', - 'rxjs/operator/find': 'Rx.Observable.prototype', - 'rxjs/operator/findIndex': 'Rx.Observable.prototype', - 'rxjs/operator/first': 'Rx.Observable.prototype', - 'rxjs/operator/forEach': 'Rx.Observable.prototype', - 'rxjs/operator/groupBy': 'Rx.Observable.prototype', - 'rxjs/operator/ignoreElements': 'Rx.Observable.prototype', - 'rxjs/operator/isEmpty': 'Rx.Observable.prototype', - 'rxjs/operator/last': 'Rx.Observable.prototype', - 'rxjs/operator/let': 'Rx.Observable.prototype', - 'rxjs/operator/letProto': 'Rx.Observable.prototype', - 'rxjs/operator/lift': 'Rx.Observable.prototype', - 'rxjs/operator/map': 'Rx.Observable.prototype', - 'rxjs/operator/mapTo': 'Rx.Observable.prototype', - 'rxjs/operator/materialize': 'Rx.Observable.prototype', - 'rxjs/operator/max': 'Rx.Observable.prototype', - 'rxjs/operator/merge': 'Rx.Observable.prototype', - 'rxjs/operator/mergeAll': 'Rx.Observable.prototype', - 'rxjs/operator/mergeMap': 'Rx.Observable.prototype', - 'rxjs/operator/mergeMapTo': 'Rx.Observable.prototype', - 'rxjs/operator/mergeScan': 'Rx.Observable.prototype', - 'rxjs/operator/min': 'Rx.Observable.prototype', - 'rxjs/operator/multicast': 'Rx.Observable.prototype', - 'rxjs/operator/observeOn': 'Rx.Observable.prototype', - 'rxjs/operator/pairwise': 'Rx.Observable.prototype', - 'rxjs/operator/partition': 'Rx.Observable.prototype', - 'rxjs/operator/pluck': 'Rx.Observable.prototype', - 'rxjs/operator/publish': 'Rx.Observable.prototype', - 'rxjs/operator/publishBehavior':'Rx.Observable.prototype', - 'rxjs/operator/publishLast': 'Rx.Observable.prototype', - 'rxjs/operator/publishReplay': 'Rx.Observable.prototype', - 'rxjs/operator/race': 'Rx.Observable.prototype', - 'rxjs/operator/reduce': 'Rx.Observable.prototype', - 'rxjs/operator/repeat': 'Rx.Observable.prototype', - 'rxjs/operator/repeatWhen': 'Rx.Observable.prototype', - 'rxjs/operator/retry': 'Rx.Observable.prototype', - 'rxjs/operator/retryWhen': 'Rx.Observable.prototype', - 'rxjs/operator/sample': 'Rx.Observable.prototype', - 'rxjs/operator/sampleTime': 'Rx.Observable.prototype', - 'rxjs/operator/scan': 'Rx.Observable.prototype', - 'rxjs/operator/sequenceEqual': 'Rx.Observable.prototype', - 'rxjs/operator/share': 'Rx.Observable.prototype', - 'rxjs/operator/single': 'Rx.Observable.prototype', - 'rxjs/operator/skip': 'Rx.Observable.prototype', - 'rxjs/operator/skipUntil': 'Rx.Observable.prototype', - 'rxjs/operator/skipWhile': 'Rx.Observable.prototype', - 'rxjs/operator/startWith': 'Rx.Observable.prototype', - 'rxjs/operator/subscribeOn': 'Rx.Observable.prototype', - 'rxjs/operator/switch': 'Rx.Observable.prototype', - 'rxjs/operator/switchMap': 'Rx.Observable.prototype', - 'rxjs/operator/switchMapTo': 'Rx.Observable.prototype', - 'rxjs/operator/take': 'Rx.Observable.prototype', - 'rxjs/operator/takeLast': 'Rx.Observable.prototype', - 'rxjs/operator/takeUntil': 'Rx.Observable.prototype', - 'rxjs/operator/takeWhile': 'Rx.Observable.prototype', - 'rxjs/operator/throttle': 'Rx.Observable.prototype', - 'rxjs/operator/throttleTime': 'Rx.Observable.prototype', - 'rxjs/operator/timeInterval': 'Rx.Observable.prototype', - 'rxjs/operator/timeout': 'Rx.Observable.prototype', - 'rxjs/operator/timeoutWith': 'Rx.Observable.prototype', - 'rxjs/operator/timestamp': 'Rx.Observable.prototype', - 'rxjs/operator/toArray': 'Rx.Observable.prototype', - 'rxjs/operator/toPromise': 'Rx.Observable.prototype', - 'rxjs/operator/window': 'Rx.Observable.prototype', - 'rxjs/operator/windowCount': 'Rx.Observable.prototype', - 'rxjs/operator/windowToggle': 'Rx.Observable.prototype', - 'rxjs/operator/windowWhen': 'Rx.Observable.prototype', - 'rxjs/operator/withLatestFrom': 'Rx.Observable.prototype', - 'rxjs/operator/zipAll': 'Rx.Observable.prototype', - 'rxjs/operator/zipProto': 'Rx.Observable.prototype', - 'rxjs/operator': 'Rx.Observable.prototype', - 'rxjs/operators/audit': 'Rx.Observable.prototype', - 'rxjs/operators/auditTime': 'Rx.Observable.prototype', - 'rxjs/operators/buffer': 'Rx.Observable.prototype', - 'rxjs/operators/bufferCount': 'Rx.Observable.prototype', - 'rxjs/operators/bufferTime': 'Rx.Observable.prototype', - 'rxjs/operators/bufferToggle': 'Rx.Observable.prototype', - 'rxjs/operators/bufferWhen': 'Rx.Observable.prototype', - 'rxjs/operators/catch': 'Rx.Observable.prototype', - 'rxjs/operators/combineAll': 'Rx.Observable.prototype', - 'rxjs/operators/combineLatest': 'Rx.Observable.prototype', - 'rxjs/operators/concat': 'Rx.Observable.prototype', - 'rxjs/operators/concatAll': 'Rx.Observable.prototype', - 'rxjs/operators/concatMap': 'Rx.Observable.prototype', - 'rxjs/operators/concatMapTo': 'Rx.Observable.prototype', - 'rxjs/operators/count': 'Rx.Observable.prototype', - 'rxjs/operators/debounce': 'Rx.Observable.prototype', - 'rxjs/operators/debounceTime': 'Rx.Observable.prototype', - 'rxjs/operators/defaultIfEmpty': 'Rx.Observable.prototype', - 'rxjs/operators/delay': 'Rx.Observable.prototype', - 'rxjs/operators/delayWhen': 'Rx.Observable.prototype', - 'rxjs/operators/dematerialize': 'Rx.Observable.prototype', - 'rxjs/operators/distinct': 'Rx.Observable.prototype', - 'rxjs/operators/distinctUntilChanged': 'Rx.Observable.prototype', - 'rxjs/operators/distinctUntilKeyChanged': 'Rx.Observable.prototype', - 'rxjs/operators/do': 'Rx.Observable.prototype', - 'rxjs/operators/elementAt': 'Rx.Observable.prototype', - 'rxjs/operators/every': 'Rx.Observable.prototype', - 'rxjs/operators/exhaust': 'Rx.Observable.prototype', - 'rxjs/operators/exhaustMap': 'Rx.Observable.prototype', - 'rxjs/operators/expand': 'Rx.Observable.prototype', - 'rxjs/operators/filter': 'Rx.Observable.prototype', - 'rxjs/operators/finally': 'Rx.Observable.prototype', - 'rxjs/operators/find': 'Rx.Observable.prototype', - 'rxjs/operators/findIndex': 'Rx.Observable.prototype', - 'rxjs/operators/first': 'Rx.Observable.prototype', - 'rxjs/operators/forEach': 'Rx.Observable.prototype', - 'rxjs/operators/groupBy': 'Rx.Observable.prototype', - 'rxjs/operators/ignoreElements': 'Rx.Observable.prototype', - 'rxjs/operators/isEmpty': 'Rx.Observable.prototype', - 'rxjs/operators/last': 'Rx.Observable.prototype', - 'rxjs/operators/let': 'Rx.Observable.prototype', - 'rxjs/operators/letProto': 'Rx.Observable.prototype', - 'rxjs/operators/lift': 'Rx.Observable.prototype', - 'rxjs/operators/map': 'Rx.Observable.prototype', - 'rxjs/operators/mapTo': 'Rx.Observable.prototype', - 'rxjs/operators/materialize': 'Rx.Observable.prototype', - 'rxjs/operators/max': 'Rx.Observable.prototype', - 'rxjs/operators/merge': 'Rx.Observable.prototype', - 'rxjs/operators/mergeAll': 'Rx.Observable.prototype', - 'rxjs/operators/mergeMap': 'Rx.Observable.prototype', - 'rxjs/operators/mergeMapTo': 'Rx.Observable.prototype', - 'rxjs/operators/mergeScan': 'Rx.Observable.prototype', - 'rxjs/operators/min': 'Rx.Observable.prototype', - 'rxjs/operators/multicast': 'Rx.Observable.prototype', - 'rxjs/operators/observeOn': 'Rx.Observable.prototype', - 'rxjs/operators/pairwise': 'Rx.Observable.prototype', - 'rxjs/operators/partition': 'Rx.Observable.prototype', - 'rxjs/operators/pluck': 'Rx.Observable.prototype', - 'rxjs/operators/publish': 'Rx.Observable.prototype', - 'rxjs/operators/publishBehavior':'Rx.Observable.prototype', - 'rxjs/operators/publishLast': 'Rx.Observable.prototype', - 'rxjs/operators/publishReplay': 'Rx.Observable.prototype', - 'rxjs/operators/race': 'Rx.Observable.prototype', - 'rxjs/operators/reduce': 'Rx.Observable.prototype', - 'rxjs/operators/repeat': 'Rx.Observable.prototype', - 'rxjs/operators/repeatWhen': 'Rx.Observable.prototype', - 'rxjs/operators/retry': 'Rx.Observable.prototype', - 'rxjs/operators/retryWhen': 'Rx.Observable.prototype', - 'rxjs/operators/sample': 'Rx.Observable.prototype', - 'rxjs/operators/sampleTime': 'Rx.Observable.prototype', - 'rxjs/operators/scan': 'Rx.Observable.prototype', - 'rxjs/operators/sequenceEqual': 'Rx.Observable.prototype', - 'rxjs/operators/share': 'Rx.Observable.prototype', - 'rxjs/operators/single': 'Rx.Observable.prototype', - 'rxjs/operators/skip': 'Rx.Observable.prototype', - 'rxjs/operators/skipUntil': 'Rx.Observable.prototype', - 'rxjs/operators/skipWhile': 'Rx.Observable.prototype', - 'rxjs/operators/startWith': 'Rx.Observable.prototype', - 'rxjs/operators/subscribeOn': 'Rx.Observable.prototype', - 'rxjs/operators/switch': 'Rx.Observable.prototype', - 'rxjs/operators/switchMap': 'Rx.Observable.prototype', - 'rxjs/operators/switchMapTo': 'Rx.Observable.prototype', - 'rxjs/operators/take': 'Rx.Observable.prototype', - 'rxjs/operators/takeLast': 'Rx.Observable.prototype', - 'rxjs/operators/takeUntil': 'Rx.Observable.prototype', - 'rxjs/operators/takeWhile': 'Rx.Observable.prototype', - 'rxjs/operators/throttle': 'Rx.Observable.prototype', - 'rxjs/operators/throttleTime': 'Rx.Observable.prototype', - 'rxjs/operators/timeInterval': 'Rx.Observable.prototype', - 'rxjs/operators/timeout': 'Rx.Observable.prototype', - 'rxjs/operators/timeoutWith': 'Rx.Observable.prototype', - 'rxjs/operators/timestamp': 'Rx.Observable.prototype', - 'rxjs/operators/toArray': 'Rx.Observable.prototype', - 'rxjs/operators/toPromise': 'Rx.Observable.prototype', - 'rxjs/operators/window': 'Rx.Observable.prototype', - 'rxjs/operators/windowCount': 'Rx.Observable.prototype', - 'rxjs/operators/windowToggle': 'Rx.Observable.prototype', - 'rxjs/operators/windowWhen': 'Rx.Observable.prototype', - 'rxjs/operators/withLatestFrom': 'Rx.Observable.prototype', - 'rxjs/operators/zipAll': 'Rx.Observable.prototype', - 'rxjs/operators/zipProto': 'Rx.Observable.prototype', - 'rxjs/operators': 'Rx.Observable.prototype', - 'rxjs/symbol/iterator': 'Rx.Symbol', - 'rxjs/symbol/observable': 'Rx.Symbol', - 'rxjs/symbol/rxSubscriber': 'Rx.Symbol', - 'rxjs/symbol': 'Rx.Symbol', - 'rxjs/scheduler/Action': 'Rx.Scheduler', - 'rxjs/scheduler/animationFrame': 'Rx.Scheduler', - 'rxjs/scheduler/AnimationFrameAction': 'Rx.Scheduler', - 'rxjs/scheduler/asap': 'Rx.Scheduler', - 'rxjs/scheduler/AsapAction': 'Rx.Scheduler', - 'rxjs/scheduler/async': 'Rx.Scheduler', - 'rxjs/scheduler/AsyncAction': 'Rx.Scheduler', - 'rxjs/scheduler/AsyncScheduler': 'Rx.Scheduler', - 'rxjs/scheduler/queue': 'Rx.Scheduler', - 'rxjs/scheduler/QueueAction': 'Rx.Scheduler', - 'rxjs/scheduler/QueueScheduler': 'Rx.Scheduler', - 'rxjs/scheduler/VirtualTimeScheduler': 'Rx.Scheduler', - 'rxjs/scheduler': 'Rx.Scheduler' -}; diff --git a/src/lib/domain/ng-package-format.ts b/src/lib/domain/ng-package-format.ts index 251672a95..7b1229288 100644 --- a/src/lib/domain/ng-package-format.ts +++ b/src/lib/domain/ng-package-format.ts @@ -118,10 +118,13 @@ export class NgEntryPoint { return this.$get('lib.cssUrl'); } - public get externals(): { [key: string]: string } { - return this.$get('lib.externals'); + public get umdModuleIds(): { [key: string]: string } { + return this.$get('lib.umdModuleIds'); } + public get embedded(): string[] { + return this.$get('lib.embedded'); + } public get jsxConfig(): string { return this.$get('lib.jsx'); } diff --git a/src/lib/entry-point-transforms.ts b/src/lib/entry-point-transforms.ts index adaaa406d..fa1859eda 100644 --- a/src/lib/entry-point-transforms.ts +++ b/src/lib/entry-point-transforms.ts @@ -60,7 +60,8 @@ export const transformSources: BuildStep = entry: tsOutput.js, format: 'es', dest: fesm15File, - externals: entryPoint.externals + umdModuleIds: entryPoint.umdModuleIds, + embedded: entryPoint.embedded }); await remapSourceMap(fesm15File); @@ -78,7 +79,8 @@ export const transformSources: BuildStep = entry: fesm5File, format: 'umd', dest: umdFile, - externals: entryPoint.externals + umdModuleIds: entryPoint.umdModuleIds, + embedded: entryPoint.embedded }); await remapSourceMap(umdFile); diff --git a/src/lib/steps/rollup.spec.ts b/src/lib/steps/rollup.spec.ts new file mode 100644 index 000000000..9668836e7 --- /dev/null +++ b/src/lib/steps/rollup.spec.ts @@ -0,0 +1,115 @@ +import { expect } from 'chai'; +import { externalModuleIdStrategy, umdModuleIdStrategy } from './rollup'; + +describe('rollup', () => { + + describe(externalModuleIdStrategy.name, () => { + it(`should return 'false' paths starting with '.'`, () => { + expect(externalModuleIdStrategy('./foo/bar')).to.be.false; + }); + + it(`should return 'false' for paths starting with '/'`, () => { + expect(externalModuleIdStrategy('/foo/bar')).to.be.false; + }); + + it(`should return 'false' for absolute paths`, () => { + expect(externalModuleIdStrategy(__filename)).to.be.false; + }); + + it(`should return 'false' for embedded modules`, () => { + expect(externalModuleIdStrategy('lodash', ['lodash'])).to.be.false; + }); + + it(`should return 'false' for 'commonjsHelpers'`, () => { + expect(externalModuleIdStrategy('commonjsHelpers')).to.be.false; + }); + + it(`should return 'true' for external modules like '@angular/core'`, () => { + expect(externalModuleIdStrategy('@angular/core')).to.be.true; + }); + + it(`should return 'true' for modules with '.' like 'ui.core'`, () => { + expect(externalModuleIdStrategy('ui.core')).to.be.true; + }); + + }); + + describe(umdModuleIdStrategy.name, () => { + it(`should map 'rxjs/add/observable/bindCallback' to 'Rx.Observable'`, () => { + expect(umdModuleIdStrategy('rxjs/add/observable/bindCallback')).to.equal('Rx.Observable'); + }); + + it(`should map 'rxjs/TeardownLogic' to 'Rx'`, () => { + expect(umdModuleIdStrategy('rxjs/TeardownLogic')).to.equal('Rx'); + }); + + it(`should map 'rxjs/add/operator/audit' to 'Rx.Observable.prototype'`, () => { + expect(umdModuleIdStrategy('rxjs/add/operator/audit')).to.equal('Rx.Observable.prototype'); + }); + + it(`should map 'rxjs/observable' to 'Rx.Observable'`, () => { + expect(umdModuleIdStrategy('rxjs/observable')).to.equal('Rx.Observable'); + }); + + it(`should map 'rxjs/observable/bindCallback' to 'Rx.Observable'`, () => { + expect(umdModuleIdStrategy('rxjs/observable/bindCallback')).to.equal('Rx.Observable'); + }); + + it(`should map 'rxjs/operators' to 'Rx.Observable.prototype'`, () => { + expect(umdModuleIdStrategy('rxjs/operators')).to.equal('Rx.Observable.prototype'); + }); + + it(`should map 'rxjs/operator/audit' to 'Rx.Observable.prototype'`, () => { + expect(umdModuleIdStrategy('rxjs/operator/audit')).to.equal('Rx.Observable.prototype'); + }); + + it(`should map 'rxjs/operators/audit' to 'Rx.Observable.prototype'`, () => { + expect(umdModuleIdStrategy('rxjs/operator/audit')).to.equal('Rx.Observable.prototype'); + }); + + it(`should map 'rxjs/symbol' to 'Rx.Symbol'`, () => { + expect(umdModuleIdStrategy('rxjs/symbol')).to.equal('Rx.Symbol'); + }); + + it(`should map 'rxjs/symbol/iterator' to 'Rx.Symbol'`, () => { + expect(umdModuleIdStrategy('rxjs/symbol/iterator')).to.equal('Rx.Symbol'); + }); + + it(`should map 'rxjs/scheduler' to 'Rx.Scheduler'`, () => { + expect(umdModuleIdStrategy('rxjs/scheduler')).to.equal('Rx.Scheduler'); + }); + + it(`should map 'rxjs/scheduler/queue' to 'Rx.Scheduler'`, () => { + expect(umdModuleIdStrategy('rxjs/scheduler/queue')).to.equal('Rx.Scheduler'); + }); + + it(`should map '@angular/core' to 'ng.core'`, () => { + expect(umdModuleIdStrategy('@angular/core')).to.equal('ng.core'); + }); + + it(`should map '@angular/common/http' to 'ng.common.http'`, () => { + expect(umdModuleIdStrategy('@angular/common/http')).to.equal('ng.common.http'); + }); + + it(`should map '@angular/platform-browser' to 'ng.platformBrowser'`, () => { + expect(umdModuleIdStrategy('@angular/platform-browser')).to.equal('ng.platformBrowser'); + }); + + it(`should map '@angular/platform-browser/animations' to 'ng.platformBrowser.animations'`, () => { + expect(umdModuleIdStrategy('@angular/platform-browser/animations')).to.equal('ng.platformBrowser.animations'); + }); + + it(`should map '@angular/platform-browser-dynamic' to 'ng.platformBrowserDynamic'`, () => { + expect(umdModuleIdStrategy('@angular/platform-browser-dynamic')).to.equal('ng.platformBrowserDynamic'); + }); + + const FOO_MODULE = 'FooModule'; + it(`should map 'foo' to '${FOO_MODULE}' when 'umdModuleIds' is provided`, () => { + expect(umdModuleIdStrategy('foo', { 'foo': FOO_MODULE})).to.equal(FOO_MODULE); + }); + + it(`should map 'foo' to '' when no 'umdModuleIds' is provided`, () => { + expect(umdModuleIdStrategy('foo')).to.empty; + }); + }); +}); diff --git a/src/lib/steps/rollup.ts b/src/lib/steps/rollup.ts index 27fcc178f..2671336b0 100644 --- a/src/lib/steps/rollup.ts +++ b/src/lib/steps/rollup.ts @@ -3,8 +3,6 @@ import * as nodeResolve from 'rollup-plugin-node-resolve'; import * as commonJs from 'rollup-plugin-commonjs'; import * as path from 'path'; import * as log from '../util/log'; -import { ROLLUP_GLOBALS } from '../conf/rollup.globals'; -const ROLLUP_VERSION = (__rollup as any).VERSION; export type BundleFormat = __rollup.Format; @@ -13,7 +11,67 @@ export interface RollupOptions { entry: string, format: BundleFormat, dest: string, - externals: {[key: string]: string}, + umdModuleIds?: { [key: string]: string }, + embedded?: string[] +} + +export const externalModuleIdStrategy = (moduleId: string, embedded: string[] = []): boolean => { + // more information about why we don't check for 'node_modules' path + // https://github.com/rollup/rollup-plugin-node-resolve/issues/110#issuecomment-350353632 + if ( + path.isAbsolute(moduleId) || + moduleId.startsWith(".") || + moduleId.startsWith("/") || + moduleId.indexOf("commonjsHelpers") >= 0 || // in case we are embedding a commonjs module we need to include it's helpers also + embedded.some(x => x === moduleId) + ) { + // if it's either 'absolute', marked to embed, starts with a '.' or '/' it's not external + return false; + } + + return true; +} + +export const umdModuleIdStrategy = (moduleId: string, umdModuleIds: { [key: string]: string } = {}): string => { + let nameProvided: string | undefined; + if (nameProvided = umdModuleIds[moduleId]) { + return nameProvided; + } + + let regMatch; + if (regMatch = /^\@angular\/platform-browser-dynamic(\/?.*)/.exec(moduleId)) { + return `ng.platformBrowserDynamic${regMatch[1]}`.replace("/", ".") + } + + if (regMatch = /^\@angular\/platform-browser(\/?.*)/.exec(moduleId)) { + return `ng.platformBrowser${regMatch[1]}`.replace("/", ".") + } + + if (regMatch = /^\@angular\/(.+)/.exec(moduleId)) { + return `ng.${regMatch[1]}`.replace("/", ".") + } + + if (/^rxjs\/(add\/)?observable/.test(moduleId)) { + return "Rx.Observable"; + } + + if (/^rxjs\/scheduler/.test(moduleId)) { + return "Rx.Scheduler"; + } + + if (/^rxjs\/symbol/.test(moduleId)) { + return "Rx.Symbol"; + } + + if (/^rxjs\/(add\/)?operator/.test(moduleId)) { + return "Rx.Observable.prototype"; + } + + if (/^rxjs\/[^\/]+$/.test(moduleId)) { + return "Rx"; + } + + return ''; // leave it up to rollup to guess the global name } /** @@ -22,39 +80,12 @@ export interface RollupOptions { * @param opts */ export async function rollup(opts: RollupOptions): Promise { - log.debug(`rollup (v${ROLLUP_VERSION}) ${opts.entry} to ${opts.dest} (${opts.format})`); - - const globals = { - // default externals for '@angular/*' and 'rxjs' - ...ROLLUP_GLOBALS, - // external symbols passed from the user's ng-package.json - ...opts.externals, - }; - const globalsKeys = Object.keys(globals); + log.debug(`rollup (v${__rollup.VERSION}) ${opts.entry} to ${opts.dest} (${opts.format})`); // Create the bundle const bundle: __rollup.Bundle = await __rollup.rollup({ context: 'this', - external: (moduleId) => { - const isExplicitExternal = globalsKeys.some((global) => global === moduleId); - if (isExplicitExternal === true) { - return true; - } - - // Determine from the path - if (moduleId.startsWith('/')) { - const moduleIdPath = path.parse(moduleId); - const entryPath = path.parse(opts.entry); - - // `moduleId` is a file in the sub-tree of `opts.entry` -> inline to bundle - if (moduleIdPath.dir.startsWith(entryPath.dir)) { - return false; - } - } - - // XX: by default, the referenced module is inlined - return false; - }, + external: moduleId => externalModuleIdStrategy(moduleId, opts.embedded), input: opts.entry, plugins: [ nodeResolve({ jsnext: true, module: true }), @@ -77,7 +108,7 @@ export async function rollup(opts: RollupOptions): Promise { file: opts.dest, format: opts.format, banner: '', - globals: globals, + globals: moduleId => umdModuleIdStrategy(moduleId, opts.umdModuleIds), sourcemap: true }); } diff --git a/src/ng-package.schema.json b/src/ng-package.schema.json index dc61ca138..27dbb7441 100644 --- a/src/ng-package.schema.json +++ b/src/ng-package.schema.json @@ -37,21 +37,36 @@ "type": "string", "default": "" }, - "externals": { - "description": "A symbol map of external dependencies. The purpose of this map is to correctly bundle a flat module file (with `rollup`). By default, `rxjs` and `@angular/*` dependency symbols are supported.", + "embedded": { + "description": "A array of external dependencies to be embedded in the final bundle.", + "type": "array", + "items": { + "type": "string" + } + }, + "umdModuleIds": { + "description": "A symbol map of external dependencies. The purpose of this map is to correctly bundle a flat module file (with `rollup`). By default, `rxjs`, `tslib` and `@angular/*` dependency symbols are supported.", "type": "object", "additionalProperties": true }, "jsx": { "description": "A property to indicate whether your library is going to be bundling jsx/tsx files. This passes through to tsconfig - see https://www.typescriptlang.org/docs/handbook/jsx.html", "type": "string", - "enum": ["preserve", "react", "react-native", ""], + "enum": [ + "preserve", + "react", + "react-native", + "" + ], "default": "" }, "cssUrl": { "description": "Embed assets in css file using data URIs - see https://css-tricks.com/data-uris", "type": "string", - "enum": ["none", "inline"], + "enum": [ + "none", + "inline" + ], "default": "none" } } @@ -59,4 +74,4 @@ }, "required": [], "additionalProperties": false -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 06bd9695e..a0850398a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -194,9 +194,9 @@ version "16.0.28" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.28.tgz#eb0b31272528da8f20477ec27569c4f767315b33" -"@types/rollup@^0.51.1": - version "0.51.1" - resolved "https://registry.yarnpkg.com/@types/rollup/-/rollup-0.51.1.tgz#d7d8992ef15c2d1531f193cd82002d68b300d330" +"@types/rollup@^0.51.2": + version "0.51.2" + resolved "https://registry.yarnpkg.com/@types/rollup/-/rollup-0.51.2.tgz#1b1b868e6f79be444916a7611914c0049914d547" dependencies: "@types/acorn" "*" "@types/source-map" "*"