From bc57cfeed1bcce6e106d04ccbb8bdfd7e85a39dd Mon Sep 17 00:00:00 2001 From: denStrigo Date: Thu, 7 Nov 2019 18:36:05 +0300 Subject: [PATCH 1/5] fix(ssr): fix angular universal support. Update intersection-observer, eva-icons packages. Add ssr in package-smoke for check --- .gitignore | 1 + DEV_DOCS.md | 4 - package-lock.json | 12 +- package.json | 5 +- packages-smoke/README.md | 13 + packages-smoke/angular.json | 25 +- packages-smoke/package-lock.json | 474 +++++++++++++----- packages-smoke/package.json | 28 +- packages-smoke/server.ts | 58 +++ packages-smoke/src/app/app.server.module.ts | 16 + packages-smoke/src/main.server.ts | 12 + packages-smoke/src/main.ts | 4 +- packages-smoke/src/tsconfig.server.json | 9 + packages-smoke/webpack.server.config.js | 51 ++ scripts/ci/packages-smoke.sh | 9 +- scripts/update-packages-smoke-lock.sh | 18 - src/framework/eva-icons/package.json | 2 +- .../components/button/button.component.ts | 2 +- .../cdk/adapter/scroll-dispatcher-adapter.ts | 2 +- .../cdk/adapter/viewport-ruler-adapter.ts | 2 +- .../theme/components/cdk/overlay/mapping.ts | 6 - .../cdk/overlay/overlay-position.ts | 2 +- .../cdk/platform/platform-service.ts | 5 + .../cdk/platform/platform.module.ts | 10 - .../components/cdk/table/table.module.ts | 5 +- .../components/layout/layout.component.ts | 12 +- .../components/radio/radio-group.component.ts | 7 +- .../components/select/option.component.ts | 2 +- .../tree-grid/tree-grid-cell.component.ts | 7 +- .../tree-grid-row-toggle.component.ts | 2 +- .../tree-grid-row-toggle.directive.ts | 2 +- .../tree-grid/tree-grid.component.ts | 2 +- src/framework/theme/package.json | 2 +- src/framework/theme/public_api.ts | 1 - .../theme/services/native-window.service.ts | 62 +++ src/framework/theme/theme.module.ts | 8 +- 36 files changed, 662 insertions(+), 220 deletions(-) create mode 100644 packages-smoke/server.ts create mode 100644 packages-smoke/src/app/app.server.module.ts create mode 100644 packages-smoke/src/main.server.ts create mode 100644 packages-smoke/src/tsconfig.server.json create mode 100644 packages-smoke/webpack.server.config.js delete mode 100755 scripts/update-packages-smoke-lock.sh delete mode 100644 src/framework/theme/components/cdk/platform/platform.module.ts create mode 100644 src/framework/theme/services/native-window.service.ts diff --git a/.gitignore b/.gitignore index 61ba4926d6..7d27bb5f06 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ testem.log /docs/output.json /docs/assets/examples /docs/dist +/packages-smoke/dist # e2e /e2e/*.js diff --git a/DEV_DOCS.md b/DEV_DOCS.md index 1b369277c8..efb2f27003 100644 --- a/DEV_DOCS.md +++ b/DEV_DOCS.md @@ -45,9 +45,6 @@ - add the package into packages-smoke application dependencies to verify it works properly in isolation. - add the package into change-prefix.ts which builds our packages with custom prefix. -# New Package Dependency Checklist -- run `npm run update-packages-smoke-lock` to update packages-smoke/package-lock.json and commit updated package lock - # Objectives The aim of the project is to create a set of useful Angular modules which help to bootstrap the development. @@ -393,7 +390,6 @@ To start a new release (publish the framework packages on NPM) you need: 2. `npm run release:validate` - this will create ready for publishing packages in src/.lib then build prod & AOT builds of the playground app using prepared packages and then run e2e tests again it. 3. MANUALLY update a version in main ./package.json to a new one 4. - * `npm run update-packages-smoke-lock` to update `packages-smoke/package-lock.json` * `npm run version:bump` * update version in `package-lock.json` and `packages-smoke/package-lock.json` * when releasing current version (PR to master) also update [docs/versions.json](#docs-deploy): diff --git a/package-lock.json b/package-lock.json index 718662737b..a71c7b3ef0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6146,9 +6146,9 @@ "dev": true }, "eva-icons": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eva-icons/-/eva-icons-1.1.1.tgz", - "integrity": "sha512-Uf7JQMA1lWQLLtHuk1lbMlwP4i3W0jjTy5SCYBGeR6DLPub5Ls2QiJlVT59llphVObXSVwaMuofevwgUZWf1CQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eva-icons/-/eva-icons-1.1.2.tgz", + "integrity": "sha512-R5iD6nYcQS/qQOfC1ooP1hs8Xg+VKYfO95SXDzVWFUwYdxXrJYc7+ZnbE7tsl1amFjbRMm+c/vnH4NVaB2zrUQ==" }, "event-emitter": { "version": "0.3.5", @@ -10178,9 +10178,9 @@ "dev": true }, "intersection-observer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.5.0.tgz", - "integrity": "sha512-8Zgt4ijlyvIrQVTA7MPb2W9+KhoetrAbxlh0RmTGxpx0+ZsAXvy7IsbNnZIrqZ6TddAdWeQj49x7Ph7Ir6KRkA==" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", + "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==" }, "into-stream": { "version": "3.1.0", diff --git a/package.json b/package.json index e2d99c1d46..4b8846143c 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,6 @@ "release:dev": "npm-run-all release:prepare:dev publish", "release": "npm-run-all release:validate publish", "publish": "./scripts/publish.sh", - "update-packages-smoke-lock": "./scripts/update-packages-smoke-lock.sh", "cli:firefox-fix": "rimraf node_modules/@angular-devkit/build-angular/node_modules/uglify-es && rimraf node_modules/@angular-devkit/build-angular/node_modules/uglifyjs-webpack-plugin", "postinstall": "npm-run-all -p cli:firefox-fix build:dev-schematics", "gen:playground": "ng g .:playground", @@ -99,10 +98,10 @@ "core-js": "2.5.7", "date-fns": ">=2.0.0-alpha.16 <=2.0.0-alpha.27", "docsearch.js": "^2.5.2", - "eva-icons": "^1.1.1", + "eva-icons": "^1.1.2", "gulp-bump": "2.7.0", "highlight.js": "9.12.0", - "intersection-observer": "0.5.0", + "intersection-observer": "0.7.0", "ionicons": "2.0.1", "jasmine-fail-fast": "2.0.0", "leaflet": "1.0.3", diff --git a/packages-smoke/README.md b/packages-smoke/README.md index 1fdcdcfd8e..9087e5a6b1 100644 --- a/packages-smoke/README.md +++ b/packages-smoke/README.md @@ -2,3 +2,16 @@ This project is used to verify all nebular packages were built properly. We just install newly build packages in this app and build it in production mode. + +# For local running +1. Run `npm run release:prepare` - in root. +2. Copy folder .lib from `src/.lib` to `packages-smoke/.lib` +3. Go to folder packages-smoke run `npm install` +4. Verifying application build: + - `npm run build -- --prod` + - `npm run build -- --configuration=production-2015` + - `npm run e2e` + - `npm run e2e -- --configuration=production-2015` +5. Run with ssr: + - `npm run build:ssr` + - `npm run serve:ssr` diff --git a/packages-smoke/angular.json b/packages-smoke/angular.json index 72f53952f0..cf450ee75a 100644 --- a/packages-smoke/angular.json +++ b/packages-smoke/angular.json @@ -37,7 +37,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/packages-smoke", + "outputPath": "dist/browser", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", @@ -137,6 +137,29 @@ "**/node_modules/**" ] } + }, + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist/server", + "main": "src/main.server.ts", + "tsConfig": "src/tsconfig.server.json" + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "sourceMap": false, + "optimization": { + "scripts": false, + "styles": true + } + } + } } } }, diff --git a/packages-smoke/package-lock.json b/packages-smoke/package-lock.json index 2ad4cbc99a..917d8bd604 100644 --- a/packages-smoke/package-lock.json +++ b/packages-smoke/package-lock.json @@ -1076,6 +1076,16 @@ "tslib": "^1.9.0" } }, + "@angular/platform-server": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.0.0.tgz", + "integrity": "sha512-pA6m1okOfyy2qH5A6jUxrhx6z7eAG+ne7IM+j/6JUBDjp4KO9BC84aa/xfpZq5dsskl8E8II9c4hUKocMyeRjA==", + "requires": { + "domino": "^2.1.2", + "tslib": "^1.9.0", + "xhr2": "^0.1.4" + } + }, "@angular/router": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.0.0.tgz", @@ -1239,36 +1249,31 @@ } }, "@nebular/auth": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@nebular/auth/-/auth-4.1.3.tgz", - "integrity": "sha512-Nlkdv4ByI5Afp5R4gWkBWswgLvu5lQjjorK8yK2izloSTsgse4/22Qqq5ATpj3zOKakiDuU/vqa4qAirFDQw/g==" + "version": "file:.lib/auth" }, "@nebular/date-fns": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@nebular/date-fns/-/date-fns-4.1.3.tgz", - "integrity": "sha512-kM8LS3FC94EI4hWImM1G8aLqQSp0upeSW/Ajihg2UXrlyNx4E9kQ37cghZoTuZdM4sNRxuFj53fOip/iIh8AVQ==" + "version": "file:.lib/date-fns" }, "@nebular/eva-icons": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@nebular/eva-icons/-/eva-icons-4.1.3.tgz", - "integrity": "sha512-aAAasZ6Cj6nM44rR9p32682c+OMp1ZpwUmW969/1+Cwz4sypVvC5O2hOcSmo/1MLUXJejKXSOr4VCKYQc3MXgg==" + "version": "file:.lib/eva-icons" }, "@nebular/moment": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@nebular/moment/-/moment-4.1.3.tgz", - "integrity": "sha512-4colYPKxldjzpb2RevebVBUTE/omfcSQaMePC9uWbc/Gk5K0+9k0BbuITCC8IvqznzodYC1SJgKS5e1w+LOskg==" + "version": "file:.lib/moment" }, "@nebular/security": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@nebular/security/-/security-4.1.3.tgz", - "integrity": "sha512-K+9rUaYNoL7587kYceA0vYTG6eWjDCgtmlY8u4dK4xHyGYXQdKDyjdyS3uI+l4IDEX0ublf6LHSCBHPpyWa39A==" + "version": "file:.lib/security" }, "@nebular/theme": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@nebular/theme/-/theme-4.1.3.tgz", - "integrity": "sha512-sJrLEf72sFbY5RxOYvpJxGB4LbDD+jTJgRRxYrK4GbqwHP+6/5J3W+79D1wvGzTIesZsJ21+mcFCQG5WsAfFFA==", + "version": "file:.lib/theme", "requires": { - "intersection-observer": "0.5.0" + "intersection-observer": "0.7.0" + }, + "dependencies": { + "intersection-observer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", + "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==" + } } }, "@ngtools/webpack": { @@ -1295,6 +1300,16 @@ } } }, + "@nguniversal/express-engine": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-8.1.1.tgz", + "integrity": "sha512-LKfNnKb1BU1IyI/U7LcDgU744ptrn7fTYb3QqHAlGaozHUNRjXpNuBdkrcAS5+8UAhRlTllpSt1c+TmY2/tomA==" + }, + "@nguniversal/module-map-ngfactory-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-8.1.1.tgz", + "integrity": "sha512-vXFydMTPFRfGjmtdwtbNhl4Pmfg580Yit0vzlTeb3ZC1v+TJKR2GzaWYUileWxS60FrgNF4/tkOEL5ouDDx6Bw==" + }, "@schematics/angular": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.0.0.tgz", @@ -3147,7 +3162,6 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, "requires": { "safe-buffer": "5.1.2" } @@ -3155,8 +3169,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "version": "1.6.0", @@ -3176,8 +3189,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-concurrently": { "version": "1.0.5", @@ -3410,7 +3422,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -3602,8 +3613,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "dependency-graph": { "version": "0.7.2", @@ -3624,7 +3634,12 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "detect-indent": { @@ -3727,6 +3742,11 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "domino": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.3.tgz", + "integrity": "sha512-EwjTbUv1Q/RLQOdn9k7ClHutrQcWGsfXaRQNOnM/KgK4xDBoLFEcIRFuBSxAx13Vfa63X029gXYrNFrSy+DOSg==" + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -3759,8 +3779,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { "version": "1.3.225", @@ -3798,8 +3817,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -3975,8 +3993,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -4024,13 +4041,12 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eva-icons": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eva-icons/-/eva-icons-1.1.1.tgz", - "integrity": "sha512-Uf7JQMA1lWQLLtHuk1lbMlwP4i3W0jjTy5SCYBGeR6DLPub5Ls2QiJlVT59llphVObXSVwaMuofevwgUZWf1CQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eva-icons/-/eva-icons-1.1.2.tgz", + "integrity": "sha512-R5iD6nYcQS/qQOfC1ooP1hs8Xg+VKYfO95SXDzVWFUwYdxXrJYc7+ZnbE7tsl1amFjbRMm+c/vnH4NVaB2zrUQ==" }, "event-stream": { "version": "3.3.4", @@ -4184,11 +4200,19 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", @@ -4226,7 +4250,6 @@ "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" @@ -4235,14 +4258,12 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, "requires": { "bytes": "3.1.0", "content-type": "~1.0.4", @@ -4259,20 +4280,17 @@ "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -4285,7 +4303,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -4293,14 +4310,12 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, "requires": { "mime-db": "1.40.0" } @@ -4308,32 +4323,27 @@ "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, "requires": { "bytes": "3.1.0", "http-errors": "1.7.2", @@ -4344,20 +4354,17 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -4574,7 +4581,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -4588,14 +4594,12 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, @@ -4643,6 +4647,18 @@ "locate-path": "^3.0.0" } }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -4728,8 +4744,7 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fragment-cache": { "version": "0.2.1", @@ -4743,8 +4758,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from": { "version": "0.1.7", @@ -5423,6 +5437,41 @@ } } }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -5630,6 +5679,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", @@ -5890,8 +5948,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -5964,11 +6021,6 @@ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "intersection-observer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.5.0.tgz", - "integrity": "sha512-8Zgt4ijlyvIrQVTA7MPb2W9+KhoetrAbxlh0RmTGxpx0+ZsAXvy7IsbNnZIrqZ6TddAdWeQj49x7Ph7Ir6KRkA==" - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -5999,8 +6051,7 @@ "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -7014,8 +7065,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { "version": "4.3.0", @@ -7041,14 +7091,12 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "3.1.10", @@ -7084,8 +7132,7 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.36.0", @@ -7254,8 +7301,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -7605,7 +7651,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -7864,6 +7909,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -7945,8 +7996,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "3.0.0", @@ -8306,7 +8356,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.0" @@ -8749,6 +8798,29 @@ "resolve-from": "^3.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -8837,8 +8909,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -8852,8 +8923,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "samsam": { "version": "1.1.2", @@ -8976,7 +9046,6 @@ "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -8997,7 +9066,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -9009,32 +9077,27 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, @@ -9063,7 +9126,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -9074,8 +9136,7 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" } } }, @@ -10175,8 +10236,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "tough-cookie": { "version": "2.4.3", @@ -10208,6 +10268,19 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "ts-loader": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", + "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + } + }, "ts-node": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", @@ -10419,8 +10492,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "version": "1.0.0", @@ -10563,8 +10635,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.3.2", @@ -10572,6 +10643,12 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -10594,8 +10671,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "verror": { "version": "1.10.0", @@ -10682,6 +10758,147 @@ "webpack-sources": "^1.3.0" } }, + "webpack-cli": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", + "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "webpack-core": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", @@ -11537,6 +11754,11 @@ "ultron": "~1.1.0" } }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, "xml2js": { "version": "0.4.22", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", diff --git a/packages-smoke/package.json b/packages-smoke/package.json index c9da8b7109..6b80d81cd3 100644 --- a/packages-smoke/package.json +++ b/packages-smoke/package.json @@ -7,7 +7,11 @@ "build": "ng build", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e" + "e2e": "ng e2e", + "compile:server": "webpack --config webpack.server.config.js --progress --colors", + "serve:ssr": "node dist/server", + "build:ssr": "npm run build:client-and-server-bundles && npm run compile:server", + "build:client-and-server-bundles": "ng build --prod && ng run packages-smoke:server:production --bundleDependencies all" }, "private": true, "dependencies": { @@ -19,16 +23,20 @@ "@angular/forms": "8.0.0", "@angular/platform-browser": "8.0.0", "@angular/platform-browser-dynamic": "8.0.0", + "@angular/platform-server": "8.0.0", "@angular/router": "8.0.0", - "@nebular/auth": "4.1.3", - "@nebular/date-fns": "4.1.3", - "@nebular/eva-icons": "4.1.3", - "@nebular/moment": "4.1.3", - "@nebular/security": "4.1.3", - "@nebular/theme": "4.1.3", + "@nebular/auth": "file:.lib/auth", + "@nebular/date-fns": "file:.lib/date-fns", + "@nebular/eva-icons": "file:.lib/eva-icons", + "@nebular/moment": "file:.lib/moment", + "@nebular/security": "file:.lib/security", + "@nebular/theme": "file:.lib/theme", + "@nguniversal/express-engine": "^8.1.1", + "@nguniversal/module-map-ngfactory-loader": "8.1.1", "core-js": "^2.5.7", "date-fns": "^2.0.0-alpha.27", - "eva-icons": "1.1.1", + "eva-icons": "1.1.2", + "express": "^4.15.2", "moment": "^2.22.2", "rxjs": "6.5.2", "zone.js": "~0.9.1" @@ -52,8 +60,10 @@ "karma-jasmine": "~1.1.2", "karma-jasmine-html-reporter": "^0.2.2", "protractor": "^5.4.2", + "ts-loader": "^5.2.0", "ts-node": "8.1.0", "tslint": "5.8.0", - "typescript": "3.4.5" + "typescript": "3.4.5", + "webpack-cli": "^3.1.0" } } diff --git a/packages-smoke/server.ts b/packages-smoke/server.ts new file mode 100644 index 0000000000..4552d59951 --- /dev/null +++ b/packages-smoke/server.ts @@ -0,0 +1,58 @@ +/** + * *** NOTE ON IMPORTING FROM ANGULAR AND NGUNIVERSAL IN THIS FILE *** + * + * If your application uses third-party dependencies, you'll need to + * either use Webpack or the Angular CLI's `bundleDependencies` feature + * in order to adequately package them for use on the server without a + * node_modules directory. + * + * However, due to the nature of the CLI's `bundleDependencies`, importing + * Angular in this file will create a different instance of Angular than + * the version in the compiled application code. This leads to unavoidable + * conflicts. Therefore, please do not explicitly import from @angular or + * @nguniversal in this file. You can export any needed resources + * from your application's main.server.ts file, as seen below with the + * import for `ngExpressEngine`. + */ + +import 'zone.js/dist/zone-node'; + +import * as express from 'express'; +import { join } from 'path'; + +// Express server +const app = express(); + +const PORT = process.env.PORT || 4000; +const DIST_FOLDER = join(process.cwd(), 'dist/browser'); + +// * NOTE :: leave this as require() since this file is built Dynamically from webpack +const {AppServerModuleNgFactory, LAZY_MODULE_MAP, ngExpressEngine, provideModuleMap} = require('./dist/server/main'); + +// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine) +app.engine('html', ngExpressEngine({ + bootstrap: AppServerModuleNgFactory, + providers: [ + provideModuleMap(LAZY_MODULE_MAP) + ] +})); + +app.set('view engine', 'html'); +app.set('views', DIST_FOLDER); + +// Example Express Rest API endpoints +// app.get('/api/**', (req, res) => { }); +// Serve static files from /browser +app.get('*.*', express.static(DIST_FOLDER, { + maxAge: '1y' +})); + +// All regular routes use the Universal engine +app.get('*', (req, res) => { + res.render('index', { req }); +}); + +// Start up the Node server +const server = app.listen(PORT); + +server.close(); diff --git a/packages-smoke/src/app/app.server.module.ts b/packages-smoke/src/app/app.server.module.ts new file mode 100644 index 0000000000..877e2eebd4 --- /dev/null +++ b/packages-smoke/src/app/app.server.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; + +import { AppModule } from './app.module'; +import { AppComponent } from './app.component'; +import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; + +@NgModule({ + imports: [ + AppModule, + ServerModule, + ModuleMapLoaderModule, + ], + bootstrap: [AppComponent], +}) +export class AppServerModule {} diff --git a/packages-smoke/src/main.server.ts b/packages-smoke/src/main.server.ts new file mode 100644 index 0000000000..9a3bad766e --- /dev/null +++ b/packages-smoke/src/main.server.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; + +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +export { AppServerModule } from './app/app.server.module'; +export { ngExpressEngine } from "@nguniversal/express-engine"; +export { provideModuleMap } from "@nguniversal/module-map-ngfactory-loader"; + diff --git a/packages-smoke/src/main.ts b/packages-smoke/src/main.ts index 28bfa9e1fe..e080d2f649 100644 --- a/packages-smoke/src/main.ts +++ b/packages-smoke/src/main.ts @@ -8,6 +8,8 @@ if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule) +document.addEventListener('DOMContentLoaded', () => { + platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err)); + }); diff --git a/packages-smoke/src/tsconfig.server.json b/packages-smoke/src/tsconfig.server.json new file mode 100644 index 0000000000..ceb0df6619 --- /dev/null +++ b/packages-smoke/src/tsconfig.server.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "outDir": "../out-tsc/app-server" + }, + "angularCompilerOptions": { + "entryModule": "./app/app.server.module#AppServerModule" + } +} diff --git a/packages-smoke/webpack.server.config.js b/packages-smoke/webpack.server.config.js new file mode 100644 index 0000000000..c57bad02a3 --- /dev/null +++ b/packages-smoke/webpack.server.config.js @@ -0,0 +1,51 @@ +// Work around for https://github.com/angular/angular-cli/issues/7200 + +const path = require('path'); +const webpack = require('webpack'); + +module.exports = { + mode: 'none', + entry: { + // This is our Express server for Dynamic universal + server: './server.ts' + }, + externals: { + './dist/server/main': 'require("./server/main")' + }, + target: 'node', + resolve: { extensions: ['.ts', '.js'] }, + optimization: { + minimize: false + }, + output: { + // Puts the output at the root of the dist folder + path: path.join(__dirname, 'dist'), + filename: '[name].js' + }, + module: { + noParse: /polyfills-.*\.js/, + rules: [ + { test: /\.ts$/, loader: 'ts-loader' }, + { + // Mark files inside `@angular/core` as using SystemJS style dynamic imports. + // Removing this will cause deprecation warnings to appear. + test: /(\\|\/)@angular(\\|\/)core(\\|\/).+\.js$/, + parser: { system: true }, + }, + ] + }, + plugins: [ + new webpack.ContextReplacementPlugin( + // fixes WARNING Critical dependency: the request of a dependency is an expression + /(.+)?angular(\\|\/)core(.+)?/, + path.join(__dirname, 'src'), // location of your src + {} // a map of your routes + ), + new webpack.ContextReplacementPlugin( + // fixes WARNING Critical dependency: the request of a dependency is an expression + /(.+)?express(\\|\/)(.+)?/, + path.join(__dirname, 'src'), + {} + ) + ] +}; diff --git a/scripts/ci/packages-smoke.sh b/scripts/ci/packages-smoke.sh index 64f44e6122..57d627615a 100755 --- a/scripts/ci/packages-smoke.sh +++ b/scripts/ci/packages-smoke.sh @@ -11,10 +11,11 @@ packages_smoke() { rm -rf ../${PROJECT} cp -r ./${PROJECT} ../${PROJECT} cd ../${PROJECT} - npm install + mkdir -p .lib + cp -r ../nebular/src/.lib/* ./.lib echo "Installing built packages" - cp -r ../nebular/src/.lib/* node_modules/@nebular + npm install echo "Verifying application build" npm run build -- --prod @@ -22,6 +23,10 @@ packages_smoke() { npm run e2e npm run e2e -- --configuration=production-2015 + echo "Run with ssr" + npm run build:ssr + npm run serve:ssr + echo "Clean" cd ..; rm -rf -- ${PROJECT} } diff --git a/scripts/update-packages-smoke-lock.sh b/scripts/update-packages-smoke-lock.sh deleted file mode 100755 index adbc1ddae7..0000000000 --- a/scripts/update-packages-smoke-lock.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# Updates packages-smoke/package-lock.json with dependencies from built Nebular packages - -PROJECT="packages-smoke" - -echo "Building packages" -npm run release:prepare - -echo "Setting up playground application for testing" -cd ./${PROJECT} -npm install - -echo "Installing built packages" -cp -r ../nebular/src/.lib/* node_modules/@nebular - -echo "Updating package-lock.json" -npm install diff --git a/src/framework/eva-icons/package.json b/src/framework/eva-icons/package.json index 2227569e85..7c28a1b053 100644 --- a/src/framework/eva-icons/package.json +++ b/src/framework/eva-icons/package.json @@ -24,7 +24,7 @@ ], "peerDependencies": { "@nebular/theme": "4.5.0", - "eva-icons": "^1.1.1" + "eva-icons": "^1.1.2" }, "sideEffects": false } diff --git a/src/framework/theme/components/button/button.component.ts b/src/framework/theme/components/button/button.component.ts index 316f0a5bd4..e888025122 100644 --- a/src/framework/theme/components/button/button.component.ts +++ b/src/framework/theme/components/button/button.component.ts @@ -739,7 +739,7 @@ export class NbButtonComponent implements AfterViewInit { * such handlers call. */ @HostListener('click', ['$event']) - onClick(event: Event) { + onClick(event) { if (this.disabled) { event.preventDefault(); event.stopImmediatePropagation(); diff --git a/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts b/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts index 6a0a3cc655..91c3bf7e99 100644 --- a/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts +++ b/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts @@ -2,8 +2,8 @@ import { Injectable, NgZone } from '@angular/core'; import { CdkScrollable, ScrollDispatcher } from '@angular/cdk/overlay'; import { Observable } from 'rxjs'; -import { NbPlatform } from '../overlay/mapping'; import { NbLayoutScrollService } from '../../../services/scroll.service'; +import { NbPlatform } from '../platform/platform-service'; @Injectable() export class NbScrollDispatcherAdapter extends ScrollDispatcher { diff --git a/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts b/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts index 4298dda350..b959b7ade0 100644 --- a/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts +++ b/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts @@ -2,9 +2,9 @@ import { Injectable, NgZone } from '@angular/core'; import { ViewportRuler } from '@angular/cdk/overlay'; import { map } from 'rxjs/operators'; -import { NbPlatform } from '../overlay/mapping'; import { NbLayoutRulerService } from '../../../services/ruler.service'; import { NbLayoutScrollService, NbScrollPosition } from '../../../services/scroll.service'; +import { NbPlatform } from '../platform/platform-service'; @Injectable() diff --git a/src/framework/theme/components/cdk/overlay/mapping.ts b/src/framework/theme/components/cdk/overlay/mapping.ts index 8c09af628f..6483f81ee9 100644 --- a/src/framework/theme/components/cdk/overlay/mapping.ts +++ b/src/framework/theme/components/cdk/overlay/mapping.ts @@ -31,7 +31,6 @@ import { ScrollStrategy, ScrollStrategyOptions, } from '@angular/cdk/overlay'; -import { Platform } from '@angular/cdk/platform'; @Directive({ selector: '[nbPortal]' }) @@ -49,10 +48,6 @@ export class NbComponentPortal extends ComponentPortal { export class NbOverlay extends Overlay { } -@Injectable() -export class NbPlatform extends Platform { -} - @Injectable() export class NbOverlayPositionBuilder extends OverlayPositionBuilder { } @@ -104,7 +99,6 @@ export class NbCdkMappingModule { ngModule: NbCdkMappingModule, providers: [ NbOverlay, - NbPlatform, NbOverlayPositionBuilder, ], }; diff --git a/src/framework/theme/components/cdk/overlay/overlay-position.ts b/src/framework/theme/components/cdk/overlay/overlay-position.ts index 6a6921ce1f..71e12c56db 100644 --- a/src/framework/theme/components/cdk/overlay/overlay-position.ts +++ b/src/framework/theme/components/cdk/overlay/overlay-position.ts @@ -11,13 +11,13 @@ import { NbFlexibleConnectedPositionStrategy, NbOverlayPositionBuilder, NbOverlayRef, - NbPlatform, NbPositionStrategy, } from './mapping'; import { NbOverlayContainerAdapter } from '../adapter/overlay-container-adapter'; import { NbViewportRulerAdapter } from '../adapter/viewport-ruler-adapter'; import { NbGlobalLogicalPosition } from './position-helper'; import { GlobalPositionStrategy } from '@angular/cdk/overlay'; +import { NbPlatform } from '../platform/platform-service'; export enum NbAdjustment { diff --git a/src/framework/theme/components/cdk/platform/platform-service.ts b/src/framework/theme/components/cdk/platform/platform-service.ts index 58a49a73bd..f1f5850a74 100644 --- a/src/framework/theme/components/cdk/platform/platform-service.ts +++ b/src/framework/theme/components/cdk/platform/platform-service.ts @@ -1,3 +1,8 @@ import { Platform } from '@angular/cdk/platform'; +import { Injectable } from '@angular/core'; +@Injectable({ + providedIn: 'root', + useClass: Platform, +}) export class NbPlatform extends Platform {} diff --git a/src/framework/theme/components/cdk/platform/platform.module.ts b/src/framework/theme/components/cdk/platform/platform.module.ts deleted file mode 100644 index 4b327cc641..0000000000 --- a/src/framework/theme/components/cdk/platform/platform.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Platform, PlatformModule } from '@angular/cdk/platform'; -import { NbPlatform } from './platform-service'; - -@NgModule({ - providers: [ - { provide: NbPlatform, useExisting: Platform }, - ], -}) -export class NbPlatformModule extends PlatformModule {} diff --git a/src/framework/theme/components/cdk/table/table.module.ts b/src/framework/theme/components/cdk/table/table.module.ts index 675c06aaa0..9c5c346c8f 100644 --- a/src/framework/theme/components/cdk/table/table.module.ts +++ b/src/framework/theme/components/cdk/table/table.module.ts @@ -2,8 +2,6 @@ import { Attribute, ChangeDetectorRef, ElementRef, Inject, IterableDiffers, NgMo import { CdkTable, CdkTableModule } from '@angular/cdk/table'; import { NbBidiModule } from '../bidi/bidi.module'; import { NbDirectionality } from '../bidi/bidi-service'; -import { NbPlatformModule } from '../platform/platform.module'; -import { NbPlatform } from '../platform/platform-service'; import { NB_DOCUMENT } from '../../../theme.options'; import { NbCellDefDirective, @@ -26,6 +24,7 @@ import { NbRowComponent, NbRowDefDirective, } from './row'; +import { NbPlatform } from '../platform/platform-service'; export const NB_TABLE_TEMPLATE = ` @@ -76,7 +75,7 @@ const COMPONENTS = [ ]; @NgModule({ - imports: [ NbBidiModule, NbPlatformModule ], + imports: [ NbBidiModule ], declarations: [ ...COMPONENTS ], exports: [ ...COMPONENTS ], }) diff --git a/src/framework/theme/components/layout/layout.component.ts b/src/framework/theme/components/layout/layout.component.ts index f7e1aa7d4a..0ce6a2a7ab 100644 --- a/src/framework/theme/components/layout/layout.component.ts +++ b/src/framework/theme/components/layout/layout.component.ts @@ -6,9 +6,8 @@ import { AfterViewInit, Component, ElementRef, HostBinding, HostListener, Input, OnDestroy, - Renderer2, ViewChild, ViewContainerRef, Inject, PLATFORM_ID, + Renderer2, ViewChild, ViewContainerRef, Inject, } from '@angular/core'; -import { isPlatformBrowser } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; import { filter, takeWhile } from 'rxjs/operators'; @@ -21,6 +20,7 @@ import { NbScrollPosition, NbLayoutScrollService } from '../../services/scroll.s import { NbLayoutDimensions, NbLayoutRulerService } from '../../services/ruler.service'; import { NB_WINDOW, NB_DOCUMENT } from '../../theme.options'; import { NbOverlayContainerAdapter } from '../cdk/adapter/overlay-container-adapter'; +import { NbPlatform } from '../cdk/platform/platform-service'; /** * Layout container component. @@ -219,7 +219,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { protected renderer: Renderer2, @Inject(NB_WINDOW) protected window, @Inject(NB_DOCUMENT) protected document, - @Inject(PLATFORM_ID) protected platformId: Object, + protected platform: NbPlatform, protected layoutDirectionService: NbLayoutDirectionService, protected scrollService: NbLayoutScrollService, protected rulerService: NbLayoutRulerService, @@ -311,7 +311,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { } }); - if (isPlatformBrowser(this.platformId)) { + if (this.platform.isBrowser) { // trigger first time so that after the change we have the initial value this.themeService.changeWindowWidth(this.window.innerWidth); } @@ -384,7 +384,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { * @returns {NbScrollPosition} */ getScrollPosition(): NbScrollPosition { - if (!isPlatformBrowser(this.platformId)) { + if (!this.platform.isBrowser) { return { x: 0, y: 0 }; } @@ -422,7 +422,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { x = x == null ? currentX : x; y = y == null ? currentY : y; - if (!isPlatformBrowser(this.platformId)) { + if (!this.platform.isBrowser) { return; } if (this.withScrollValue) { diff --git a/src/framework/theme/components/radio/radio-group.component.ts b/src/framework/theme/components/radio/radio-group.component.ts index c6e21cadf9..7ddc3598f8 100644 --- a/src/framework/theme/components/radio/radio-group.component.ts +++ b/src/framework/theme/components/radio/radio-group.component.ts @@ -15,11 +15,9 @@ import { OnDestroy, Output, QueryList, - PLATFORM_ID, Inject, ElementRef, } from '@angular/core'; -import { isPlatformBrowser } from '@angular/common'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { fromEvent, merge } from 'rxjs'; import { filter, switchMap, takeUntil, takeWhile } from 'rxjs/operators'; @@ -27,6 +25,7 @@ import { convertToBoolProperty, emptyStatusWarning } from '../helpers'; import { NB_DOCUMENT } from '../../theme.options'; import { NbRadioComponent } from './radio.component'; import { NbComponentStatus } from '../component-status'; +import { NbPlatform } from '../cdk/platform/platform-service'; /** * The `NbRadioGroupComponent` is the wrapper for `nb-radio` button. @@ -141,7 +140,7 @@ export class NbRadioGroupComponent implements AfterContentInit, OnDestroy, Contr constructor( protected hostElement: ElementRef, - @Inject(PLATFORM_ID) protected platformId, + protected platform: NbPlatform, @Inject(NB_DOCUMENT) protected document, ) {} @@ -236,7 +235,7 @@ export class NbRadioGroupComponent implements AfterContentInit, OnDestroy, Contr protected subscribeOnRadiosBlur() { const hasNoRadios = !this.radios || !this.radios.length; - if (!isPlatformBrowser(this.platformId) || hasNoRadios) { + if (!this.platform.isBrowser || hasNoRadios) { return; } diff --git a/src/framework/theme/components/select/option.component.ts b/src/framework/theme/components/select/option.component.ts index 4701559d0d..20057bb160 100644 --- a/src/framework/theme/components/select/option.component.ts +++ b/src/framework/theme/components/select/option.component.ts @@ -115,7 +115,7 @@ export class NbOptionComponent implements OnDestroy, NbFocusableOption { @HostListener('click', ['$event']) @HostListener('keydown.space', ['$event']) @HostListener('keydown.enter', ['$event']) - onClick(event: Event) { + onClick(event) { this.click$.next(this); // Prevent scroll on space click, etc. diff --git a/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts b/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts index bd6d10baab..15d6920cf1 100644 --- a/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts +++ b/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts @@ -12,9 +12,7 @@ import { Inject, OnInit, OnDestroy, - PLATFORM_ID, } from '@angular/core'; -import { isPlatformBrowser } from '@angular/common'; import { DomSanitizer, SafeStyle } from '@angular/platform-browser'; import { filter, takeWhile } from 'rxjs/operators'; @@ -27,6 +25,7 @@ import { NbTreeGridComponent } from './tree-grid.component'; import { NbTreeGridColumnDefDirective } from './tree-grid-column-def.directive'; import { NB_DEFAULT_ROW_LEVEL } from './data-source/tree-grid.model'; import { NbColumnsService } from './tree-grid-columns.service'; +import { NbPlatform } from '../cdk/platform/platform-service'; @Directive({ selector: 'td[nbTreeGridCell]', @@ -71,8 +70,8 @@ export class NbTreeGridCellDirective extends NbCellDirective implements OnInit, columnDef: NbTreeGridColumnDefDirective, elementRef: ElementRef, @Inject(NB_TREE_GRID) tree, - @Inject(PLATFORM_ID) private platformId, @Inject(NB_WINDOW) private window, + private platform: NbPlatform, private sanitizer: DomSanitizer, private directionService: NbLayoutDirectionService, private columnService: NbColumnsService, @@ -85,7 +84,7 @@ export class NbTreeGridCellDirective extends NbCellDirective implements OnInit, } ngOnInit() { - if (isPlatformBrowser(this.platformId)) { + if (this.platform.isBrowser) { const style = this.window.getComputedStyle(this.elementRef.nativeElement); this.initialLeftPadding = style.paddingLeft; this.initialRightPadding = style.paddingRight; diff --git a/src/framework/theme/components/tree-grid/tree-grid-row-toggle.component.ts b/src/framework/theme/components/tree-grid/tree-grid-row-toggle.component.ts index c524d0c021..38c45cee43 100644 --- a/src/framework/theme/components/tree-grid/tree-grid-row-toggle.component.ts +++ b/src/framework/theme/components/tree-grid/tree-grid-row-toggle.component.ts @@ -39,7 +39,7 @@ export class NbTreeGridRowToggleComponent { } @HostListener('click', ['$event']) - toggleRow($event: Event) { + toggleRow($event) { this.cell.toggleRow(); $event.stopPropagation(); } diff --git a/src/framework/theme/components/tree-grid/tree-grid-row-toggle.directive.ts b/src/framework/theme/components/tree-grid/tree-grid-row-toggle.directive.ts index 02a55b3162..f8ba47581c 100644 --- a/src/framework/theme/components/tree-grid/tree-grid-row-toggle.directive.ts +++ b/src/framework/theme/components/tree-grid/tree-grid-row-toggle.directive.ts @@ -15,7 +15,7 @@ import { NbTreeGridCellDirective } from './tree-grid-cell.component'; }) export class NbTreeGridRowToggleDirective { @HostListener('click', ['$event']) - toggleRow($event: Event) { + toggleRow($event) { this.cell.toggleRow(); $event.stopPropagation(); } diff --git a/src/framework/theme/components/tree-grid/tree-grid.component.ts b/src/framework/theme/components/tree-grid/tree-grid.component.ts index 170781b93b..af0abe4092 100644 --- a/src/framework/theme/components/tree-grid/tree-grid.component.ts +++ b/src/framework/theme/components/tree-grid/tree-grid.component.ts @@ -23,7 +23,6 @@ import { fromEvent, merge } from 'rxjs'; import { debounceTime, takeWhile } from 'rxjs/operators'; import { NB_DOCUMENT, NB_WINDOW } from '../../theme.options'; -import { NbPlatform } from '../cdk/platform/platform-service'; import { NbDirectionality } from '../cdk/bidi/bidi-service'; import { NB_TABLE_TEMPLATE, NbTable } from '../cdk/table/table.module'; import { NbTreeGridDataSource, NbTreeGridDataSourceBuilder } from './data-source/tree-grid-data-source'; @@ -40,6 +39,7 @@ import { NbTreeGridRowDefDirective, } from './tree-grid-def.component'; import { NbColumnsService } from './tree-grid-columns.service'; +import { NbPlatform } from '../cdk/platform/platform-service'; /** * Tree grid component that can be used to display nested rows of data. diff --git a/src/framework/theme/package.json b/src/framework/theme/package.json index 4d13f14b98..c804f35f47 100644 --- a/src/framework/theme/package.json +++ b/src/framework/theme/package.json @@ -29,7 +29,7 @@ "rxjs": "^6.5.1" }, "dependencies": { - "intersection-observer": "0.5.0" + "intersection-observer": "0.7.0" }, "schematics": "./schematics/collection.json", "sideEffects": false diff --git a/src/framework/theme/public_api.ts b/src/framework/theme/public_api.ts index 59f3da2f89..af06da24aa 100644 --- a/src/framework/theme/public_api.ts +++ b/src/framework/theme/public_api.ts @@ -144,7 +144,6 @@ export * from './components/cdk/adapter/scroll-dispatcher-adapter'; export * from './components/cdk/adapter/viewport-ruler-adapter'; export * from './components/cdk/bidi/bidi-service'; export * from './components/cdk/bidi/bidi.module'; -export * from './components/cdk/platform/platform.module'; export * from './components/cdk/table/cell'; export * from './components/cdk/table/data-source'; export * from './components/cdk/table/row'; diff --git a/src/framework/theme/services/native-window.service.ts b/src/framework/theme/services/native-window.service.ts new file mode 100644 index 0000000000..2bd2b47804 --- /dev/null +++ b/src/framework/theme/services/native-window.service.ts @@ -0,0 +1,62 @@ +/** + * @license + * Copyright Akveo. All Rights Reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { isPlatformBrowser } from '@angular/common'; +import { + ClassProvider, + FactoryProvider, + PLATFORM_ID, +} from '@angular/core'; + +import { NB_WINDOW } from '../theme.options'; + +/* Define abstract class for obtaining reference to the global window object. */ +export abstract class NativeWindowRef { + get nativeWindow(): Window | Object { + throw new Error('Not implemented.'); + } +} + +/* Define class that implements the abstract class and returns the native window object. */ +export class BrowserWindowRef extends NativeWindowRef { + + constructor() { + super(); + } + + get nativeWindow(): Window | Object { + return window; + } + +} + +/* Create an factory function that returns the native window object. */ +export function windowFactory(browserWindowRef: BrowserWindowRef, platformId: Object): Window | Object { + if (isPlatformBrowser(platformId)) { + return browserWindowRef.nativeWindow; + } + + return {}; +} + +/* Create a injectable provider for the WindowRef token that uses the BrowserWindowRef class. */ +const browserWindowProvider: ClassProvider = { + provide: NativeWindowRef, + useClass: BrowserWindowRef, +}; + +/* Create an injectable provider that uses the windowFactory function for returning the native window object. */ +const windowProvider: FactoryProvider = { + provide: NB_WINDOW, + useFactory: windowFactory, + deps: [ NativeWindowRef, PLATFORM_ID ], +}; + +/* Create an array of providers. */ +export const WINDOW_PROVIDERS = [ + browserWindowProvider, + windowProvider, +]; diff --git a/src/framework/theme/theme.module.ts b/src/framework/theme/theme.module.ts index 16d7333435..2b18e56768 100644 --- a/src/framework/theme/theme.module.ts +++ b/src/framework/theme/theme.module.ts @@ -14,7 +14,6 @@ import { NB_THEME_OPTIONS, NB_JS_THEMES, NB_DOCUMENT, - NB_WINDOW, } from './theme.options'; import { NbThemeService } from './services/theme.service'; import { NbSpinnerService } from './services/spinner.service'; @@ -29,10 +28,7 @@ import { NbLayoutDirectionService, NbLayoutDirection, NB_LAYOUT_DIRECTION } from import { NbLayoutScrollService } from './services/scroll.service'; import { NbLayoutRulerService } from './services/ruler.service'; import { NbOverlayModule } from './components/cdk/overlay/overlay.module'; - -export function nbWindowFactory() { - return window; -} +import { WINDOW_PROVIDERS } from './services/native-window.service'; @NgModule({ imports: [ @@ -66,8 +62,8 @@ export class NbThemeModule { { provide: NB_BUILT_IN_JS_THEMES, useValue: BUILT_IN_THEMES }, { provide: NB_JS_THEMES, useValue: nbJSThemes || [] }, { provide: NB_MEDIA_BREAKPOINTS, useValue: nbMediaBreakpoints || DEFAULT_MEDIA_BREAKPOINTS }, - { provide: NB_WINDOW, useFactory: nbWindowFactory }, { provide: NB_DOCUMENT, useExisting: DOCUMENT }, + ...WINDOW_PROVIDERS, NbJSThemesRegistry, NbThemeService, NbMediaBreakpointsService, From dd39a1de6ffdc93ff87bee9baa8f55612bd49867 Mon Sep 17 00:00:00 2001 From: Sergey Andrievskiy Date: Thu, 14 Nov 2019 17:17:39 +0300 Subject: [PATCH 2/5] docs: change phrasing --- packages-smoke/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages-smoke/README.md b/packages-smoke/README.md index 9087e5a6b1..bf0d25860c 100644 --- a/packages-smoke/README.md +++ b/packages-smoke/README.md @@ -3,8 +3,8 @@ This project is used to verify all nebular packages were built properly. We just install newly build packages in this app and build it in production mode. -# For local running -1. Run `npm run release:prepare` - in root. +# To run locally +1. Run `npm run release:prepare` in the project root. 2. Copy folder .lib from `src/.lib` to `packages-smoke/.lib` 3. Go to folder packages-smoke run `npm install` 4. Verifying application build: From c82e1e79750d5ddb3a75fba0cdbb64ff7e29e545 Mon Sep 17 00:00:00 2001 From: Sergey Andrievskiy Date: Thu, 14 Nov 2019 18:17:33 +0300 Subject: [PATCH 3/5] revert: platform changes Goes into separate PR to not introduce breaking changes and include into upcoming release. --- .../cdk/adapter/scroll-dispatcher-adapter.ts | 2 +- .../components/cdk/adapter/viewport-ruler-adapter.ts | 2 +- .../theme/components/cdk/overlay/mapping.ts | 6 ++++++ .../theme/components/cdk/overlay/overlay-position.ts | 2 +- .../components/cdk/platform/platform-service.ts | 5 ----- .../theme/components/cdk/platform/platform.module.ts | 10 ++++++++++ .../theme/components/cdk/table/table.module.ts | 5 +++-- .../theme/components/layout/layout.component.ts | 12 ++++++------ .../theme/components/radio/radio-group.component.ts | 7 ++++--- .../components/tree-grid/tree-grid-cell.component.ts | 7 ++++--- .../components/tree-grid/tree-grid.component.ts | 2 +- src/framework/theme/public_api.ts | 1 + 12 files changed, 38 insertions(+), 23 deletions(-) create mode 100644 src/framework/theme/components/cdk/platform/platform.module.ts diff --git a/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts b/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts index 91c3bf7e99..6a0a3cc655 100644 --- a/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts +++ b/src/framework/theme/components/cdk/adapter/scroll-dispatcher-adapter.ts @@ -2,8 +2,8 @@ import { Injectable, NgZone } from '@angular/core'; import { CdkScrollable, ScrollDispatcher } from '@angular/cdk/overlay'; import { Observable } from 'rxjs'; +import { NbPlatform } from '../overlay/mapping'; import { NbLayoutScrollService } from '../../../services/scroll.service'; -import { NbPlatform } from '../platform/platform-service'; @Injectable() export class NbScrollDispatcherAdapter extends ScrollDispatcher { diff --git a/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts b/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts index b959b7ade0..4298dda350 100644 --- a/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts +++ b/src/framework/theme/components/cdk/adapter/viewport-ruler-adapter.ts @@ -2,9 +2,9 @@ import { Injectable, NgZone } from '@angular/core'; import { ViewportRuler } from '@angular/cdk/overlay'; import { map } from 'rxjs/operators'; +import { NbPlatform } from '../overlay/mapping'; import { NbLayoutRulerService } from '../../../services/ruler.service'; import { NbLayoutScrollService, NbScrollPosition } from '../../../services/scroll.service'; -import { NbPlatform } from '../platform/platform-service'; @Injectable() diff --git a/src/framework/theme/components/cdk/overlay/mapping.ts b/src/framework/theme/components/cdk/overlay/mapping.ts index 6483f81ee9..8c09af628f 100644 --- a/src/framework/theme/components/cdk/overlay/mapping.ts +++ b/src/framework/theme/components/cdk/overlay/mapping.ts @@ -31,6 +31,7 @@ import { ScrollStrategy, ScrollStrategyOptions, } from '@angular/cdk/overlay'; +import { Platform } from '@angular/cdk/platform'; @Directive({ selector: '[nbPortal]' }) @@ -48,6 +49,10 @@ export class NbComponentPortal extends ComponentPortal { export class NbOverlay extends Overlay { } +@Injectable() +export class NbPlatform extends Platform { +} + @Injectable() export class NbOverlayPositionBuilder extends OverlayPositionBuilder { } @@ -99,6 +104,7 @@ export class NbCdkMappingModule { ngModule: NbCdkMappingModule, providers: [ NbOverlay, + NbPlatform, NbOverlayPositionBuilder, ], }; diff --git a/src/framework/theme/components/cdk/overlay/overlay-position.ts b/src/framework/theme/components/cdk/overlay/overlay-position.ts index 71e12c56db..6a6921ce1f 100644 --- a/src/framework/theme/components/cdk/overlay/overlay-position.ts +++ b/src/framework/theme/components/cdk/overlay/overlay-position.ts @@ -11,13 +11,13 @@ import { NbFlexibleConnectedPositionStrategy, NbOverlayPositionBuilder, NbOverlayRef, + NbPlatform, NbPositionStrategy, } from './mapping'; import { NbOverlayContainerAdapter } from '../adapter/overlay-container-adapter'; import { NbViewportRulerAdapter } from '../adapter/viewport-ruler-adapter'; import { NbGlobalLogicalPosition } from './position-helper'; import { GlobalPositionStrategy } from '@angular/cdk/overlay'; -import { NbPlatform } from '../platform/platform-service'; export enum NbAdjustment { diff --git a/src/framework/theme/components/cdk/platform/platform-service.ts b/src/framework/theme/components/cdk/platform/platform-service.ts index f1f5850a74..58a49a73bd 100644 --- a/src/framework/theme/components/cdk/platform/platform-service.ts +++ b/src/framework/theme/components/cdk/platform/platform-service.ts @@ -1,8 +1,3 @@ import { Platform } from '@angular/cdk/platform'; -import { Injectable } from '@angular/core'; -@Injectable({ - providedIn: 'root', - useClass: Platform, -}) export class NbPlatform extends Platform {} diff --git a/src/framework/theme/components/cdk/platform/platform.module.ts b/src/framework/theme/components/cdk/platform/platform.module.ts new file mode 100644 index 0000000000..4b327cc641 --- /dev/null +++ b/src/framework/theme/components/cdk/platform/platform.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { Platform, PlatformModule } from '@angular/cdk/platform'; +import { NbPlatform } from './platform-service'; + +@NgModule({ + providers: [ + { provide: NbPlatform, useExisting: Platform }, + ], +}) +export class NbPlatformModule extends PlatformModule {} diff --git a/src/framework/theme/components/cdk/table/table.module.ts b/src/framework/theme/components/cdk/table/table.module.ts index 9c5c346c8f..675c06aaa0 100644 --- a/src/framework/theme/components/cdk/table/table.module.ts +++ b/src/framework/theme/components/cdk/table/table.module.ts @@ -2,6 +2,8 @@ import { Attribute, ChangeDetectorRef, ElementRef, Inject, IterableDiffers, NgMo import { CdkTable, CdkTableModule } from '@angular/cdk/table'; import { NbBidiModule } from '../bidi/bidi.module'; import { NbDirectionality } from '../bidi/bidi-service'; +import { NbPlatformModule } from '../platform/platform.module'; +import { NbPlatform } from '../platform/platform-service'; import { NB_DOCUMENT } from '../../../theme.options'; import { NbCellDefDirective, @@ -24,7 +26,6 @@ import { NbRowComponent, NbRowDefDirective, } from './row'; -import { NbPlatform } from '../platform/platform-service'; export const NB_TABLE_TEMPLATE = ` @@ -75,7 +76,7 @@ const COMPONENTS = [ ]; @NgModule({ - imports: [ NbBidiModule ], + imports: [ NbBidiModule, NbPlatformModule ], declarations: [ ...COMPONENTS ], exports: [ ...COMPONENTS ], }) diff --git a/src/framework/theme/components/layout/layout.component.ts b/src/framework/theme/components/layout/layout.component.ts index 0ce6a2a7ab..f7e1aa7d4a 100644 --- a/src/framework/theme/components/layout/layout.component.ts +++ b/src/framework/theme/components/layout/layout.component.ts @@ -6,8 +6,9 @@ import { AfterViewInit, Component, ElementRef, HostBinding, HostListener, Input, OnDestroy, - Renderer2, ViewChild, ViewContainerRef, Inject, + Renderer2, ViewChild, ViewContainerRef, Inject, PLATFORM_ID, } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; import { filter, takeWhile } from 'rxjs/operators'; @@ -20,7 +21,6 @@ import { NbScrollPosition, NbLayoutScrollService } from '../../services/scroll.s import { NbLayoutDimensions, NbLayoutRulerService } from '../../services/ruler.service'; import { NB_WINDOW, NB_DOCUMENT } from '../../theme.options'; import { NbOverlayContainerAdapter } from '../cdk/adapter/overlay-container-adapter'; -import { NbPlatform } from '../cdk/platform/platform-service'; /** * Layout container component. @@ -219,7 +219,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { protected renderer: Renderer2, @Inject(NB_WINDOW) protected window, @Inject(NB_DOCUMENT) protected document, - protected platform: NbPlatform, + @Inject(PLATFORM_ID) protected platformId: Object, protected layoutDirectionService: NbLayoutDirectionService, protected scrollService: NbLayoutScrollService, protected rulerService: NbLayoutRulerService, @@ -311,7 +311,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { } }); - if (this.platform.isBrowser) { + if (isPlatformBrowser(this.platformId)) { // trigger first time so that after the change we have the initial value this.themeService.changeWindowWidth(this.window.innerWidth); } @@ -384,7 +384,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { * @returns {NbScrollPosition} */ getScrollPosition(): NbScrollPosition { - if (!this.platform.isBrowser) { + if (!isPlatformBrowser(this.platformId)) { return { x: 0, y: 0 }; } @@ -422,7 +422,7 @@ export class NbLayoutComponent implements AfterViewInit, OnDestroy { x = x == null ? currentX : x; y = y == null ? currentY : y; - if (!this.platform.isBrowser) { + if (!isPlatformBrowser(this.platformId)) { return; } if (this.withScrollValue) { diff --git a/src/framework/theme/components/radio/radio-group.component.ts b/src/framework/theme/components/radio/radio-group.component.ts index 7ddc3598f8..c6e21cadf9 100644 --- a/src/framework/theme/components/radio/radio-group.component.ts +++ b/src/framework/theme/components/radio/radio-group.component.ts @@ -15,9 +15,11 @@ import { OnDestroy, Output, QueryList, + PLATFORM_ID, Inject, ElementRef, } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { fromEvent, merge } from 'rxjs'; import { filter, switchMap, takeUntil, takeWhile } from 'rxjs/operators'; @@ -25,7 +27,6 @@ import { convertToBoolProperty, emptyStatusWarning } from '../helpers'; import { NB_DOCUMENT } from '../../theme.options'; import { NbRadioComponent } from './radio.component'; import { NbComponentStatus } from '../component-status'; -import { NbPlatform } from '../cdk/platform/platform-service'; /** * The `NbRadioGroupComponent` is the wrapper for `nb-radio` button. @@ -140,7 +141,7 @@ export class NbRadioGroupComponent implements AfterContentInit, OnDestroy, Contr constructor( protected hostElement: ElementRef, - protected platform: NbPlatform, + @Inject(PLATFORM_ID) protected platformId, @Inject(NB_DOCUMENT) protected document, ) {} @@ -235,7 +236,7 @@ export class NbRadioGroupComponent implements AfterContentInit, OnDestroy, Contr protected subscribeOnRadiosBlur() { const hasNoRadios = !this.radios || !this.radios.length; - if (!this.platform.isBrowser || hasNoRadios) { + if (!isPlatformBrowser(this.platformId) || hasNoRadios) { return; } diff --git a/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts b/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts index 15d6920cf1..bd6d10baab 100644 --- a/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts +++ b/src/framework/theme/components/tree-grid/tree-grid-cell.component.ts @@ -12,7 +12,9 @@ import { Inject, OnInit, OnDestroy, + PLATFORM_ID, } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; import { DomSanitizer, SafeStyle } from '@angular/platform-browser'; import { filter, takeWhile } from 'rxjs/operators'; @@ -25,7 +27,6 @@ import { NbTreeGridComponent } from './tree-grid.component'; import { NbTreeGridColumnDefDirective } from './tree-grid-column-def.directive'; import { NB_DEFAULT_ROW_LEVEL } from './data-source/tree-grid.model'; import { NbColumnsService } from './tree-grid-columns.service'; -import { NbPlatform } from '../cdk/platform/platform-service'; @Directive({ selector: 'td[nbTreeGridCell]', @@ -70,8 +71,8 @@ export class NbTreeGridCellDirective extends NbCellDirective implements OnInit, columnDef: NbTreeGridColumnDefDirective, elementRef: ElementRef, @Inject(NB_TREE_GRID) tree, + @Inject(PLATFORM_ID) private platformId, @Inject(NB_WINDOW) private window, - private platform: NbPlatform, private sanitizer: DomSanitizer, private directionService: NbLayoutDirectionService, private columnService: NbColumnsService, @@ -84,7 +85,7 @@ export class NbTreeGridCellDirective extends NbCellDirective implements OnInit, } ngOnInit() { - if (this.platform.isBrowser) { + if (isPlatformBrowser(this.platformId)) { const style = this.window.getComputedStyle(this.elementRef.nativeElement); this.initialLeftPadding = style.paddingLeft; this.initialRightPadding = style.paddingRight; diff --git a/src/framework/theme/components/tree-grid/tree-grid.component.ts b/src/framework/theme/components/tree-grid/tree-grid.component.ts index af0abe4092..170781b93b 100644 --- a/src/framework/theme/components/tree-grid/tree-grid.component.ts +++ b/src/framework/theme/components/tree-grid/tree-grid.component.ts @@ -23,6 +23,7 @@ import { fromEvent, merge } from 'rxjs'; import { debounceTime, takeWhile } from 'rxjs/operators'; import { NB_DOCUMENT, NB_WINDOW } from '../../theme.options'; +import { NbPlatform } from '../cdk/platform/platform-service'; import { NbDirectionality } from '../cdk/bidi/bidi-service'; import { NB_TABLE_TEMPLATE, NbTable } from '../cdk/table/table.module'; import { NbTreeGridDataSource, NbTreeGridDataSourceBuilder } from './data-source/tree-grid-data-source'; @@ -39,7 +40,6 @@ import { NbTreeGridRowDefDirective, } from './tree-grid-def.component'; import { NbColumnsService } from './tree-grid-columns.service'; -import { NbPlatform } from '../cdk/platform/platform-service'; /** * Tree grid component that can be used to display nested rows of data. diff --git a/src/framework/theme/public_api.ts b/src/framework/theme/public_api.ts index af06da24aa..59f3da2f89 100644 --- a/src/framework/theme/public_api.ts +++ b/src/framework/theme/public_api.ts @@ -144,6 +144,7 @@ export * from './components/cdk/adapter/scroll-dispatcher-adapter'; export * from './components/cdk/adapter/viewport-ruler-adapter'; export * from './components/cdk/bidi/bidi-service'; export * from './components/cdk/bidi/bidi.module'; +export * from './components/cdk/platform/platform.module'; export * from './components/cdk/table/cell'; export * from './components/cdk/table/data-source'; export * from './components/cdk/table/row'; From 9d394699f289680e444550be04cc593bafef0c2c Mon Sep 17 00:00:00 2001 From: Sergey Andrievskiy Date: Thu, 14 Nov 2019 18:38:59 +0300 Subject: [PATCH 4/5] fix(menu): prevent accessing window outside of browser --- src/framework/theme/components/menu/menu.component.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/framework/theme/components/menu/menu.component.ts b/src/framework/theme/components/menu/menu.component.ts index c13bf65f52..e1a8364df0 100644 --- a/src/framework/theme/components/menu/menu.component.ts +++ b/src/framework/theme/components/menu/menu.component.ts @@ -14,7 +14,9 @@ import { AfterViewInit, Inject, DoCheck, + PLATFORM_ID, } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; import { Router, NavigationEnd } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { takeWhile, filter, map } from 'rxjs/operators'; @@ -252,6 +254,7 @@ export class NbMenuComponent implements OnInit, AfterViewInit, OnDestroy { protected alive: boolean = true; constructor(@Inject(NB_WINDOW) protected window, + @Inject(PLATFORM_ID) protected platformId, protected menuInternalService: NbMenuInternalService, protected router: Router) { } @@ -347,7 +350,7 @@ export class NbMenuComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate([homeItem.link], { queryParams: homeItem.queryParams, fragment: homeItem.fragment }); } - if (homeItem.url) { + if (homeItem.url && isPlatformBrowser(this.platformId)) { this.window.location.href = homeItem.url; } } From cb3b4f31ac4ab1aadf0f1f25b0fed330be49e864 Mon Sep 17 00:00:00 2001 From: Sergey Andrievskiy Date: Thu, 14 Nov 2019 19:20:18 +0300 Subject: [PATCH 5/5] refactor: provide window directly for browser environments --- .../theme/services/native-window.service.ts | 62 ------------------- src/framework/theme/theme.module.ts | 20 ++++-- 2 files changed, 16 insertions(+), 66 deletions(-) delete mode 100644 src/framework/theme/services/native-window.service.ts diff --git a/src/framework/theme/services/native-window.service.ts b/src/framework/theme/services/native-window.service.ts deleted file mode 100644 index 2bd2b47804..0000000000 --- a/src/framework/theme/services/native-window.service.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Copyright Akveo. All Rights Reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - */ - -import { isPlatformBrowser } from '@angular/common'; -import { - ClassProvider, - FactoryProvider, - PLATFORM_ID, -} from '@angular/core'; - -import { NB_WINDOW } from '../theme.options'; - -/* Define abstract class for obtaining reference to the global window object. */ -export abstract class NativeWindowRef { - get nativeWindow(): Window | Object { - throw new Error('Not implemented.'); - } -} - -/* Define class that implements the abstract class and returns the native window object. */ -export class BrowserWindowRef extends NativeWindowRef { - - constructor() { - super(); - } - - get nativeWindow(): Window | Object { - return window; - } - -} - -/* Create an factory function that returns the native window object. */ -export function windowFactory(browserWindowRef: BrowserWindowRef, platformId: Object): Window | Object { - if (isPlatformBrowser(platformId)) { - return browserWindowRef.nativeWindow; - } - - return {}; -} - -/* Create a injectable provider for the WindowRef token that uses the BrowserWindowRef class. */ -const browserWindowProvider: ClassProvider = { - provide: NativeWindowRef, - useClass: BrowserWindowRef, -}; - -/* Create an injectable provider that uses the windowFactory function for returning the native window object. */ -const windowProvider: FactoryProvider = { - provide: NB_WINDOW, - useFactory: windowFactory, - deps: [ NativeWindowRef, PLATFORM_ID ], -}; - -/* Create an array of providers. */ -export const WINDOW_PROVIDERS = [ - browserWindowProvider, - windowProvider, -]; diff --git a/src/framework/theme/theme.module.ts b/src/framework/theme/theme.module.ts index 2b18e56768..b47bc2e61c 100644 --- a/src/framework/theme/theme.module.ts +++ b/src/framework/theme/theme.module.ts @@ -4,8 +4,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. */ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule, DOCUMENT } from '@angular/common'; +import { NgModule, ModuleWithProviders, PLATFORM_ID } from '@angular/core'; +import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common'; import { NB_BUILT_IN_JS_THEMES, @@ -14,6 +14,7 @@ import { NB_THEME_OPTIONS, NB_JS_THEMES, NB_DOCUMENT, + NB_WINDOW, } from './theme.options'; import { NbThemeService } from './services/theme.service'; import { NbSpinnerService } from './services/spinner.service'; @@ -28,7 +29,18 @@ import { NbLayoutDirectionService, NbLayoutDirection, NB_LAYOUT_DIRECTION } from import { NbLayoutScrollService } from './services/scroll.service'; import { NbLayoutRulerService } from './services/ruler.service'; import { NbOverlayModule } from './components/cdk/overlay/overlay.module'; -import { WINDOW_PROVIDERS } from './services/native-window.service'; + +export function windowFactory(platformId: Object): Window | undefined { + if (isPlatformBrowser(platformId)) { + return window; + } + + // Provide undefined to get the error when trying to access the window as it + // shouldn't be used outside the browser. Those who need to provide something + // instead of window (e.g. domino window when running in node) could override + // NB_WINDOW token. + return undefined; +} @NgModule({ imports: [ @@ -63,7 +75,7 @@ export class NbThemeModule { { provide: NB_JS_THEMES, useValue: nbJSThemes || [] }, { provide: NB_MEDIA_BREAKPOINTS, useValue: nbMediaBreakpoints || DEFAULT_MEDIA_BREAKPOINTS }, { provide: NB_DOCUMENT, useExisting: DOCUMENT }, - ...WINDOW_PROVIDERS, + { provide: NB_WINDOW, useFactory: windowFactory, deps: [ PLATFORM_ID ] }, NbJSThemesRegistry, NbThemeService, NbMediaBreakpointsService,