diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 0000000..b7aafa4 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "trendy2022" + } +} diff --git a/.gitignore b/.gitignore index bfc74dc..d151768 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,71 @@ testem.log # System Files .DS_Store Thumbs.db + +# from firebase +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +firebase-debug.log* +firebase-debug.*.log* + +# Firebase cache +.firebase/ + +# Firebase config + +# Uncomment this if you'd like others to create their own Firebase project. +# For a team working on the same Firebase project(s), it is recommended to leave +# it commented so all members can deploy to the same project(s) in .firebaserc. +# .firebaserc + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env diff --git a/README.md b/README.md index a0f8d9a..aefda35 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,12 @@ This is a sample app created following the steps in [Workshop: Enterprise Angula ## Workflow ```txt -npm run server // start the server up nx serve nest-demo // start the nest server +nx run trendy:build --configuration=production +nx serve trendy // trendy frontend +nx run trendy:server --configuration=production +nx run trendy:firebase --cmd deploy // deploy to firebase +npm run server // start the customer portal server nx serve customer-portal // serve the front end Angular app nx test auth // test the auth lib nx test layout // test the layout lib @@ -24,6 +28,11 @@ A trend search for the nest-demo looks like this: http://localhost:3333/api/images/Christina%20Applegate ``` +```url +Project Console: https://console.firebase.google.com/project/trendy2022/overview +Hosting URL: https://trendy2022.web.app +``` + Run the server and then the customer-portal and the app will be served at: http://localhost:4200 You can also go directly to login: http://localhost:4200/auth/login @@ -371,154 +380,6 @@ Right now, the server reports either an "unknown error" if the server is not run That will be updated in the next section, step 9 - Route Guards and Products Lib. -### Step 9 - Route Guards and Products Lib - -Branch: step-9-Route-Guards-and-Products-Lib - -Steps. - -1. Add a lazy loaded lib Products with routing & a products container component to the lib -2. Update the RouterModule.forRoot array in apps\customer-portal\src\app\app.module.ts -3. Add ProductsModule route -4. Generate a guard with the CLI & add the auth guard logic -5. Add auth guard to main routes - -6. Check the route guard is working -7. Cache the user in local storage to save logging in for the rest or the workshop. - -```txt -nx generate @nrwl/angular:lib products --routing --lazy --parent-module=apps/customer-portal/src/app/app.module.ts -... -CREATE libs/products/README.md -CREATE libs/products/tsconfig.lib.json -CREATE libs/products/src/index.ts -CREATE libs/products/src/lib/products.module.ts -CREATE libs/products/tsconfig.json -CREATE libs/products/jest.config.js -CREATE libs/products/src/test-setup.ts -CREATE libs/products/tsconfig.spec.json -CREATE libs/products/.eslintrc.json -UPDATE package.json -UPDATE workspace.json -UPDATE nx.json -UPDATE tsconfig.base.json -UPDATE .vscode/extensions.json -UPDATE jest.config.js -UPDATE apps/customer-portal/src/app/app.module.ts -UPDATE apps/customer-portal/tsconfig.app.json -``` - -```txt -nx g @nrwl/angular:component containers/products --project=products -CREATE libs/products/src/lib/containers/products/products.component.html -CREATE libs/products/src/lib/containers/products/products.component.spec.ts -CREATE libs/products/src/lib/containers/products/products.component.ts -CREATE libs/products/src/lib/containers/products/products.component.scss -UPDATE libs/products/src/lib/products.module.ts -``` - -Error: Cannot find module '@demo-app/products' - at $_lazy_route_resources|lazy|groupOptions: {}|namespace object:5 - -After updating the RouterModule.forRoot array and adding the ProductsModule route in the products.module.ts, it's time to run the app. - -The instructions are: "Login again to check the routing is correctly configured by trying to click the 'products' button in the main menu." - -However, we are getting this runtime error: - -```txt -Error: Uncaught (in promise): Error: Cannot find module '@demo-app/products' -Error: Cannot find module '@demo-app/products' - at $_lazy_route_resources|lazy|groupOptions: {}|namespace object:5 -``` - -Try with new syntax of module imports: - -```js -loadChildren: () => - import('@demo-app/products').then( - (mod) => mod.ProductsModule // added - ), -``` - -This works. Time to update the course which shows source from the end of the section, not the source as it should be in-progress so that the source shown at this point in the section will run. - -When adding the auth guard login, the path to the service needs to be updated to this: - -```js -import { AuthService } from '../../services/auth.service'; -``` - -Had to add an ESLint ignore statement for the debugger line to work: - -```js -// eslint-disable-next-line no-debugger -debugger; -``` - -Update the path to the service in the auth.guard from this: - -```txt -libs/auth/src/lib/services/auth/auth.service.ts -``` - -To this: - -```txt -libs/auth/src/lib/services/auth.service.ts -``` - -You can see from other directories, such as auth guard, that the services actually is wrong. - -```txt -libs\auth\src\lib\guards\auth\auth.guard.spec.ts -``` - -It would become apparent as an error when the user tries to create another service. This actually means that we needed to have a sub-folder in the services directory. Where were those created again? - -In step 5, this command is shown. -That should be correct. Not sure why I excluded the extra auth directory needed. - -```js -nx generate @nrwl/angular:service services/auth/auth -``` - -The cleanup for this is a bit of work, as every branch since then will need to be updated. - -Creating the folder and moving the service there now will cause the following errors: - -```txt -./libs/auth/src/index.ts:2:0-58 - Error: Module not found: Error: Can't resolve './lib/services/auth.service' in 'C:\Users\timof\repos\timofeysie\angular\demo-app\libs\auth\src' - -./libs/auth/src/lib/containers/login/login.component.ts:1:0-58 - Error: Module not found: Error: Can't resolve '../../services/auth.service' in 'C:\Users\timof\repos\timofeysie\angular\demo-app\libs\auth\src\lib\containers\login' - -./libs/auth/src/lib/guards/auth/auth.guard.ts:2:0-58 - Error: Module not found: Error: Can't resolve '../../services/auth.service' in 'C:\Users\timof\repos\timofeysie\angular\demo-app\libs\auth\src\lib\guards\auth' - -./libs/layout/src/lib/containers/layout/layout.component.ts:51:116-130 - Error: export 'AuthService' (imported as 'i1') was not found in '@demo-app/auth' (possible exports: AuthGuard, AuthModule, authRoutes) - -Error: libs/auth/src/index.ts:2:29 - error TS2307: Cannot find module './lib/services/auth.service' or its corresponding type declarations. - -2 export { AuthService } from './lib/services/auth.service'; - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Error: libs/auth/src/lib/containers/login/login.component.ts:2:29 - error TS2307: Cannot find module '../../services/auth.service' or its corresponding type declarations. - -2 import { AuthService } from '../../services/auth.service'; - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Error: libs/auth/src/lib/guards/auth/auth.guard.ts:9:29 - error TS2307: Cannot find module '../../services/auth.service' or its corresponding type declarations. -9 import { AuthService } from '../../services/auth.service'; - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``` - -Have to make the change in these files: - -```txt -libs/auth/src/lib/containers/login/login.component.ts -libs/auth/src/lib/guards/auth/auth.guard.ts -libs/auth/src/index.ts -``` - -As long as the tutorial all have the correct path, I'm not too worried about the branches for now. - ### 11 - Adding NgRx to Nx App Branch: step-11-Adding-NgRx-to-Nx-App diff --git a/apps/trendy/.gitignore b/apps/trendy/.gitignore new file mode 100644 index 0000000..dbb58ff --- /dev/null +++ b/apps/trendy/.gitignore @@ -0,0 +1,66 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +firebase-debug.log* +firebase-debug.*.log* + +# Firebase cache +.firebase/ + +# Firebase config + +# Uncomment this if you'd like others to create their own Firebase project. +# For a team working on the same Firebase project(s), it is recommended to leave +# it commented so all members can deploy to the same project(s) in .firebaserc. +# .firebaserc + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env diff --git a/apps/trendy/dist/apps/trendy/404.html b/apps/trendy/dist/apps/trendy/404.html new file mode 100644 index 0000000..829eda8 --- /dev/null +++ b/apps/trendy/dist/apps/trendy/404.html @@ -0,0 +1,33 @@ + + + + + + Page Not Found + + + + +
+

404

+

Page Not Found

+

The specified file was not found on this website. Please check the URL for mistakes and try again.

+

Why am I seeing this?

+

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

+
+ + diff --git a/apps/trendy/dist/apps/trendy/index.html b/apps/trendy/dist/apps/trendy/index.html new file mode 100644 index 0000000..75ab48b --- /dev/null +++ b/apps/trendy/dist/apps/trendy/index.html @@ -0,0 +1,89 @@ + + + + + + Welcome to Firebase Hosting + + + + + + + + + + + + + + + + + + + +
+

Welcome

+

Firebase Hosting Setup Complete

+

You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!

+ Open Hosting Documentation +
+

Firebase SDK Loading…

+ + + + diff --git a/apps/trendy/src/app/app.module.ts b/apps/trendy/src/app/app.module.ts index 95da4ef..24e1bc0 100644 --- a/apps/trendy/src/app/app.module.ts +++ b/apps/trendy/src/app/app.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; - +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { LayoutModule } from '@demo-app/layout'; import { AppComponent } from './app.component'; import { RouterModule } from '@angular/router'; @@ -9,6 +10,8 @@ import { RouterModule } from '@angular/router'; imports: [ BrowserModule.withServerTransition({ appId: 'serverApp' }), RouterModule.forRoot([], { initialNavigation: 'enabled' }), + BrowserAnimationsModule, + LayoutModule, ], providers: [], bootstrap: [AppComponent], diff --git a/docs/9 - Route Guards and Products Lib.md b/docs/9 - Route Guards and Products Lib.md new file mode 100644 index 0000000..a5288b4 --- /dev/null +++ b/docs/9 - Route Guards and Products Lib.md @@ -0,0 +1,147 @@ +# Step 9 - Route Guards and Products Lib + +Branch: step-9-Route-Guards-and-Products-Lib + +Steps. + +1. Add a lazy loaded lib Products with routing & a products container component to the lib +2. Update the RouterModule.forRoot array in apps\customer-portal\src\app\app.module.ts +3. Add ProductsModule route +4. Generate a guard with the CLI & add the auth guard logic +5. Add auth guard to main routes + +6. Check the route guard is working +7. Cache the user in local storage to save logging in for the rest or the workshop. + +```txt +nx generate @nrwl/angular:lib products --routing --lazy --parent-module=apps/customer-portal/src/app/app.module.ts +... +CREATE libs/products/README.md +CREATE libs/products/tsconfig.lib.json +CREATE libs/products/src/index.ts +CREATE libs/products/src/lib/products.module.ts +CREATE libs/products/tsconfig.json +CREATE libs/products/jest.config.js +CREATE libs/products/src/test-setup.ts +CREATE libs/products/tsconfig.spec.json +CREATE libs/products/.eslintrc.json +UPDATE package.json +UPDATE workspace.json +UPDATE nx.json +UPDATE tsconfig.base.json +UPDATE .vscode/extensions.json +UPDATE jest.config.js +UPDATE apps/customer-portal/src/app/app.module.ts +UPDATE apps/customer-portal/tsconfig.app.json +``` + +```txt +nx g @nrwl/angular:component containers/products --project=products +CREATE libs/products/src/lib/containers/products/products.component.html +CREATE libs/products/src/lib/containers/products/products.component.spec.ts +CREATE libs/products/src/lib/containers/products/products.component.ts +CREATE libs/products/src/lib/containers/products/products.component.scss +UPDATE libs/products/src/lib/products.module.ts +``` + +Error: Cannot find module '@demo-app/products' + at $_lazy_route_resources|lazy|groupOptions: {}|namespace object:5 + +After updating the RouterModule.forRoot array and adding the ProductsModule route in the products.module.ts, it's time to run the app. + +The instructions are: "Login again to check the routing is correctly configured by trying to click the 'products' button in the main menu." + +However, we are getting this runtime error: + +```txt +Error: Uncaught (in promise): Error: Cannot find module '@demo-app/products' +Error: Cannot find module '@demo-app/products' + at $_lazy_route_resources|lazy|groupOptions: {}|namespace object:5 +``` + +Try with new syntax of module imports: + +```js +loadChildren: () => + import('@demo-app/products').then( + (mod) => mod.ProductsModule // added + ), +``` + +This works. Time to update the course which shows source from the end of the section, not the source as it should be in-progress so that the source shown at this point in the section will run. + +When adding the auth guard login, the path to the service needs to be updated to this: + +```js +import { AuthService } from '../../services/auth.service'; +``` + +Had to add an ESLint ignore statement for the debugger line to work: + +```js +// eslint-disable-next-line no-debugger +debugger; +``` + +Update the path to the service in the auth.guard from this: + +```txt +libs/auth/src/lib/services/auth/auth.service.ts +``` + +To this: + +```txt +libs/auth/src/lib/services/auth.service.ts +``` + +You can see from other directories, such as auth guard, that the services actually is wrong. + +```txt +libs\auth\src\lib\guards\auth\auth.guard.spec.ts +``` + +It would become apparent as an error when the user tries to create another service. This actually means that we needed to have a sub-folder in the services directory. Where were those created again? + +In step 5, this command is shown. +That should be correct. Not sure why I excluded the extra auth directory needed. + +```js +nx generate @nrwl/angular:service services/auth/auth +``` + +The cleanup for this is a bit of work, as every branch since then will need to be updated. + +Creating the folder and moving the service there now will cause the following errors: + +```txt +./libs/auth/src/index.ts:2:0-58 - Error: Module not found: Error: Can't resolve './lib/services/auth.service' in 'C:\Users\timof\repos\timofeysie\angular\demo-app\libs\auth\src' + +./libs/auth/src/lib/containers/login/login.component.ts:1:0-58 - Error: Module not found: Error: Can't resolve '../../services/auth.service' in 'C:\Users\timof\repos\timofeysie\angular\demo-app\libs\auth\src\lib\containers\login' + +./libs/auth/src/lib/guards/auth/auth.guard.ts:2:0-58 - Error: Module not found: Error: Can't resolve '../../services/auth.service' in 'C:\Users\timof\repos\timofeysie\angular\demo-app\libs\auth\src\lib\guards\auth' + +./libs/layout/src/lib/containers/layout/layout.component.ts:51:116-130 - Error: export 'AuthService' (imported as 'i1') was not found in '@demo-app/auth' (possible exports: AuthGuard, AuthModule, authRoutes) + +Error: libs/auth/src/index.ts:2:29 - error TS2307: Cannot find module './lib/services/auth.service' or its corresponding type declarations. + +2 export { AuthService } from './lib/services/auth.service'; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Error: libs/auth/src/lib/containers/login/login.component.ts:2:29 - error TS2307: Cannot find module '../../services/auth.service' or its corresponding type declarations. + +2 import { AuthService } from '../../services/auth.service'; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Error: libs/auth/src/lib/guards/auth/auth.guard.ts:9:29 - error TS2307: Cannot find module '../../services/auth.service' or its corresponding type declarations. +9 import { AuthService } from '../../services/auth.service'; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``` + +Have to make the change in these files: + +```txt +libs/auth/src/lib/containers/login/login.component.ts +libs/auth/src/lib/guards/auth/auth.guard.ts +libs/auth/src/index.ts +``` + +As long as the tutorial all have the correct path, I'm not too worried about the branches for now. diff --git a/docs/trendy-client.md b/docs/trendy-client.md index 0fed097..a67c018 100644 --- a/docs/trendy-client.md +++ b/docs/trendy-client.md @@ -185,9 +185,11 @@ import { AppServerModuleNgFactory, LAZY_MODULE_MAP } from '../../../dist/trendy/ Then the workflow: +```sh nx run trendy:build --configuration=production nx run trendy:server --configuration=production -nx run trendy-ssr:serve +nx run trendy-ssr:serve // doesn't work +``` ```txt ERROR in ./apps/trendy-ssr/src/main.ts @@ -226,9 +228,52 @@ What is domino? And we have no server.options. The first idea was to deploy to Heroku with [this guide](https://www.thisdot.co/blog/deploying-nx-workspace-based-angular-and-nestjs-apps-to-heroku). But then realizing that Google might like it more if we used Firebase (still free hopefully) then [this Nxtend doc page is the guide for that](https://nxtend.dev/docs/firebase/getting-started/) +Outside the project, run this: + +npm install -g firebase-tools + +firebase projects:list + +```sh +npm install --save-dev --exact @nxtend/firebase +nx generate @nxtend/firebase:init +Unable to resolve @nxtend/firebase:init. +Cannot find generator 'init' in C:\Users\timof\repos\satisfactory\node_modules\@nxtend\firebase\collection.json. +nx generate @nxtend/firebase:firebase-project --project trendy +``` + +Workflow: + +```txt +nx run trendy:firebase --cmd init +? Please select an option: Create a new project +i If you want to create a project in a Google Cloud organization or folder, please use "firebase projects:create" instead, and return to this command when you've created the project. +? Please specify a unique project id (warning: cannot be modified afterward) [6-30 characters]: + trendy2022 +? What would you like to call your project? (defaults to your project ID) trendy +√ Creating Google Cloud Platform project +nx run trendy:firebase --cmd deploy +``` + +```txt +=== Hosting Setup + +Your public directory is the folder (relative to your project directory) that +will contain Hosting assets to be uploaded with firebase deploy. If you +have a build process for your assets, use your build's output directory. + +? What do you want to use as your public directory? dist\apps\trendy +? Configure as a single-page app (rewrite all urls to /index.html)? No +? Set up automatic builds and deploys with GitHub? No ++ Wrote dist\apps\trendy/index.html + +Project Console: https://console.firebase.google.com/project/trendy2022/overview +Hosting URL: https://trendy2022.web.app +``` +I had to move the firebase.json, .firebase/, and .firebaserc artifacts outside to the root directory to get the hosting to work. Now we are in action, but had to add /index.html to that hosting url above. -### AsSense +### AdSense 1. Ni1. Create space for a leaderboard top banner. 2. Have a sidebar for a rectangular or skyscraper banner. diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..05099e7 --- /dev/null +++ b/firebase.json @@ -0,0 +1,10 @@ +{ + "hosting": { + "public": "dist/apps/trendy/browser", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] + } +} diff --git a/package-lock.json b/package-lock.json index 8a68713..1060fb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1955,6 +1955,343 @@ } } }, + "@firebase/analytics": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.6.18.tgz", + "integrity": "sha512-FXNtYDxbs9ynPbzUVuG94BjFPOPpgJ7156660uvCBuKgoBCIVcNqKkJQQ7TH8384fqvGjbjdcgARY9jgAHbtog==", + "requires": { + "@firebase/analytics-types": "0.6.0", + "@firebase/component": "0.5.6", + "@firebase/installations": "0.4.32", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.3.0", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.6.0.tgz", + "integrity": "sha512-kbMawY0WRPyL/lbknBkme4CNLl+Gw+E9G4OpNeXAauqoQiNkBgpIvZYy7BRT4sNGhZbxdxXxXbruqUwDzLmvTw==" + }, + "@firebase/app": { + "version": "0.6.30", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.30.tgz", + "integrity": "sha512-uAYEDXyK0mmpZ8hWQj5TNd7WVvfsU8PgsqKpGljbFBG/HhsH8KbcykWAAA+c1PqL7dt/dbt0Reh1y9zEdYzMhg==", + "requires": { + "@firebase/app-types": "0.6.3", + "@firebase/component": "0.5.6", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.3.0", + "dom-storage": "2.1.0", + "tslib": "^2.1.0", + "xmlhttprequest": "1.8.0" + } + }, + "@firebase/app-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.3.2.tgz", + "integrity": "sha512-YjpsnV1xVTO1B836IKijRcDeceLgHQNJ/DWa+Vky9UHkm1Mi4qosddX8LZzldaWRTWKX7BN1MbZOLY8r7M/MZQ==", + "requires": { + "@firebase/app-check-interop-types": "0.1.0", + "@firebase/app-check-types": "0.3.1", + "@firebase/component": "0.5.6", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.3.0", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-interop-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", + "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" + }, + "@firebase/app-check-types": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.3.1.tgz", + "integrity": "sha512-KJ+BqJbdNsx4QT/JIT1yDj5p6D+QN97iJs3GuHnORrqL+DU3RWc9nSYQsrY6Tv9jVWcOkMENXAgDT484vzsm2w==" + }, + "@firebase/app-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", + "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==" + }, + "@firebase/auth": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.16.8.tgz", + "integrity": "sha512-mR0UXG4LirWIfOiCWxVmvz1o23BuKGxeItQ2cCUgXLTjNtWJXdcky/356iTUsd7ZV5A78s2NHeN5tIDDG6H4rg==", + "requires": { + "@firebase/auth-types": "0.10.3" + } + }, + "@firebase/auth-interop-types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", + "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" + }, + "@firebase/auth-types": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.3.tgz", + "integrity": "sha512-zExrThRqyqGUbXOFrH/sowuh2rRtfKHp9SBVY2vOqKWdCX1Ztn682n9WLtlUDsiYVIbBcwautYWk2HyCGFv0OA==" + }, + "@firebase/component": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.6.tgz", + "integrity": "sha512-GyQJ+2lrhsDqeGgd1VdS7W+Y6gNYyI0B51ovNTxeZVG/W8I7t9MwEiCWsCvfm5wQgfsKp9dkzOcJrL5k8oVO/Q==", + "requires": { + "@firebase/util": "1.3.0", + "tslib": "^2.1.0" + } + }, + "@firebase/database": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.11.0.tgz", + "integrity": "sha512-b/kwvCubr6G9coPlo48PbieBDln7ViFBHOGeVt/bt82yuv5jYZBEYAac/mtOVSxpf14aMo/tAN+Edl6SWqXApw==", + "requires": { + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.6", + "@firebase/database-types": "0.8.0", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.3.0", + "faye-websocket": "0.11.3", + "tslib": "^2.1.0" + } + }, + "@firebase/database-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.8.0.tgz", + "integrity": "sha512-7IdjAFRfPWyG3b4wcXyghb3Y1CLCSJFZIg1xl5GbTVMttSQFT4B5NYdhsfA34JwAsv5pMzPpjOaS3/K9XJ2KiA==", + "requires": { + "@firebase/app-types": "0.6.3", + "@firebase/util": "1.3.0" + } + }, + "@firebase/firestore": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-2.4.0.tgz", + "integrity": "sha512-PQ6+lWNrvh74GvFTHT4gCutFipDmtu8D1tNNawKe+/SyL6XFgeuMYgZIpKQgkTSezVDogC7EGQTJBFnewF9pOg==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/firestore-types": "2.4.0", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.3.0", + "@firebase/webchannel-wrapper": "0.5.1", + "@grpc/grpc-js": "^1.3.2", + "@grpc/proto-loader": "^0.6.0", + "node-fetch": "2.6.1", + "tslib": "^2.1.0" + } + }, + "@firebase/firestore-types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.4.0.tgz", + "integrity": "sha512-0dgwfuNP7EN6/OlK2HSNSQiQNGLGaRBH0gvgr1ngtKKJuJFuq0Z48RBMeJX9CGjV4TP9h2KaB+KrUKJ5kh1hMg==" + }, + "@firebase/functions": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.6.15.tgz", + "integrity": "sha512-b7RpLwFXi0N+HgkfK8cmkarSOoBeSrc1jNdadkCacQt+vIePkKM3E9EJXF4roWSa8GwTruodpBsvH+lK9iCAKQ==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/functions-types": "0.4.0", + "@firebase/messaging-types": "0.5.0", + "node-fetch": "2.6.1", + "tslib": "^2.1.0" + } + }, + "@firebase/functions-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.4.0.tgz", + "integrity": "sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ==" + }, + "@firebase/installations": { + "version": "0.4.32", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.32.tgz", + "integrity": "sha512-K4UlED1Vrhd2rFQQJih+OgEj8OTtrtH4+Izkx7ip2bhXSc+unk8ZhnF69D0kmh7zjXAqEDJrmHs9O5fI3rV6Tw==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/installations-types": "0.3.4", + "@firebase/util": "1.3.0", + "idb": "3.0.2", + "tslib": "^2.1.0" + } + }, + "@firebase/installations-types": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz", + "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==" + }, + "@firebase/logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", + "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" + }, + "@firebase/messaging": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.8.0.tgz", + "integrity": "sha512-hkFHDyVe1kMcY9KEG+prjCbvS6MtLUgVFUbbQqq7JQfiv58E07YCzRUcMrJolbNi/1QHH6Jv16DxNWjJB9+/qA==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/installations": "0.4.32", + "@firebase/messaging-types": "0.5.0", + "@firebase/util": "1.3.0", + "idb": "3.0.2", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz", + "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==" + }, + "@firebase/performance": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.18.tgz", + "integrity": "sha512-lvZW/TVDne2TyOpWbv++zjRn277HZpbjxbIPfwtnmKjVY1gJ+H77Qi1c2avVIc9hg80uGX/5tNf4pOApNDJLVg==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/installations": "0.4.32", + "@firebase/logger": "0.2.6", + "@firebase/performance-types": "0.0.13", + "@firebase/util": "1.3.0", + "tslib": "^2.1.0" + } + }, + "@firebase/performance-types": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz", + "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA==" + }, + "@firebase/polyfill": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", + "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", + "requires": { + "core-js": "3.6.5", + "promise-polyfill": "8.1.3", + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + } + } + }, + "@firebase/remote-config": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.43.tgz", + "integrity": "sha512-laNM4MN0CfeSp7XCVNjYOC4DdV6mj0l2rzUh42x4v2wLTweCoJ/kc1i4oWMX9TI7Jw8Am5Wl71Awn1J2pVe5xA==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/installations": "0.4.32", + "@firebase/logger": "0.2.6", + "@firebase/remote-config-types": "0.1.9", + "@firebase/util": "1.3.0", + "tslib": "^2.1.0" + } + }, + "@firebase/remote-config-types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz", + "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA==" + }, + "@firebase/storage": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.7.0.tgz", + "integrity": "sha512-ebDFKJbM5HOxVtZV+RhVEBVtlWHK+Z5L3kA5uDBA2jMYcn+8NV/crozJnEE+iRsGEco6dLK5JS+Er4qtKLpH5A==", + "requires": { + "@firebase/component": "0.5.6", + "@firebase/storage-types": "0.5.0", + "@firebase/util": "1.3.0", + "node-fetch": "2.6.1", + "tslib": "^2.1.0" + } + }, + "@firebase/storage-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.5.0.tgz", + "integrity": "sha512-6Wv3Lu7s18hsgW7HG4BFwycTquZ3m/C8bjBoOsmPu0TD6M1GKwCzOC7qBdN7L6tRYPh8ipTj5+rPFrmhGfUVKA==" + }, + "@firebase/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.3.0.tgz", + "integrity": "sha512-SESvmYwuKOVCZ1ZxLbberbx+9cnbxpCa4CG2FUSQYqN6Ab8KyltegMDIsqMw5KyIBZ4n1phfHoOa22xo5NzAlQ==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.5.1.tgz", + "integrity": "sha512-dZMzN0uAjwJXWYYAcnxIwXqRTZw3o14hGe7O6uhwjD1ZQWPVYA5lASgnNskEBra0knVBsOXB4KXg+HnlKewN/A==" + }, + "@grpc/grpc-js": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.7.tgz", + "integrity": "sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==", + "requires": { + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.4.tgz", + "integrity": "sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3640,12 +3977,187 @@ "node-fetch": "^2.6.1" } }, + "@nxtend/firebase": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@nxtend/firebase/-/firebase-11.1.2.tgz", + "integrity": "sha512-VXWTyEnRwf3s9WQELxlJB6SOyfooGz1xdG1lhW3z9rByHJ9ZF5XjZeZMNNpgefY2s4ufaeQCizWFSvXTCdr6SA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "~0.1100.1", + "@angular-devkit/core": "~11.0.1", + "@angular-devkit/schematics": "~11.0.1" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1100.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.7.tgz", + "integrity": "sha512-b2zv2yiRbdhJ7hJfZsAvGYcqgh2DVtc7gRIPo1eDPvOAKrenmZ4zo/v0PRYScrTsPzqmoCokNA5nIwufwUEnuA==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.7", + "rxjs": "6.6.3" + } + }, + "@angular-devkit/core": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.7.tgz", + "integrity": "sha512-1GKnIT++YSUHpzzRx9QC0+8yOw4wy+ZpiJVDlroPSeK4FGrTCJqJKenkfRjVFRFOSrzTiJds+IU6kI4+bFbw9g==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.7.tgz", + "integrity": "sha512-mKkXWmSTlZYjQO4i7xUX+bG1E9h9Ke3GgGQQouA+kth06IPO+VcywLQNsui4qcyLDUjyo8CaX+44aoSXoX3Tgg==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.7", + "ora": "5.1.0", + "rxjs": "6.6.3" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "@polka/url": { "version": "1.0.0-next.15", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz", "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==", "dev": true }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, "@samverschueren/stream-to-observable": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", @@ -3836,6 +4348,11 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "@types/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", @@ -7491,6 +8008,11 @@ "entities": "^2.0.0" } }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -8580,7 +9102,6 @@ "version": "0.11.3", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, "requires": { "websocket-driver": ">=0.5.1" } @@ -8692,6 +9213,28 @@ "path-exists": "^4.0.0" } }, + "firebase": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-8.10.0.tgz", + "integrity": "sha512-GCABTbJdo88QgzX5OH/vsfKBWvTRbLUylGlYXtO7uYo1VErfGd2BWW9ATlJP5Gxx+ClDfyvVTvcs2rcNWn3uUA==", + "requires": { + "@firebase/analytics": "0.6.18", + "@firebase/app": "0.6.30", + "@firebase/app-check": "0.3.2", + "@firebase/app-types": "0.6.3", + "@firebase/auth": "0.16.8", + "@firebase/database": "0.11.0", + "@firebase/firestore": "2.4.0", + "@firebase/functions": "0.6.15", + "@firebase/installations": "0.4.32", + "@firebase/messaging": "0.8.0", + "@firebase/performance": "0.4.18", + "@firebase/polyfill": "0.3.36", + "@firebase/remote-config": "0.1.43", + "@firebase/storage": "0.7.0", + "@firebase/util": "1.3.0" + } + }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -9463,8 +10006,7 @@ "http-parser-js": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", - "dev": true + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" }, "http-proxy": { "version": "1.18.1", @@ -9655,6 +10197,11 @@ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true }, + "idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -11691,6 +12238,11 @@ "integrity": "sha1-uvSJNOVDobXWNG+MhGmLGoyAOJY=", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -11829,6 +12381,11 @@ "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "dev": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lowdb": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", @@ -16404,6 +16961,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" + }, "prompts": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", @@ -16414,6 +16976,26 @@ "sisteransi": "^1.0.5" } }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -20713,7 +21295,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, "requires": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -20723,8 +21304,7 @@ "websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "1.0.5", @@ -20734,6 +21314,11 @@ "iconv-lite": "0.4.24" } }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", @@ -20864,6 +21449,11 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 0ce100a..1b0b364 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "@nguniversal/module-map-ngfactory-loader": "^8.2.6", "@nrwl/angular": "^12.3.3", "@nrwl/nx": "^7.8.7", + "firebase": "^8.2.2", "fs": "0.0.1-security", "google-search-results-nodejs": "^2.0.1", "google-trends-api": "^4.9.2", @@ -84,6 +85,7 @@ "@nrwl/node": "12.5.8", "@nrwl/tao": "12.3.3", "@nrwl/workspace": "12.3.3", + "@nxtend/firebase": "^11.1.2", "@types/jest": "26.0.8", "@types/node": "14.14.33", "@typescript-eslint/eslint-plugin": "4.19.0", diff --git a/workspace.json b/workspace.json index 5fd4146..d79f7ac 100644 --- a/workspace.json +++ b/workspace.json @@ -9,7 +9,9 @@ "targets": { "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/libs/auth"], + "outputs": [ + "coverage/libs/auth" + ], "options": { "jestConfig": "libs/auth/jest.config.js", "passWithNoTests": true @@ -45,7 +47,9 @@ "apps/customer-portal/src/favicon.ico", "apps/customer-portal/src/assets" ], - "styles": ["apps/customer-portal/src/styles.scss"], + "styles": [ + "apps/customer-portal/src/styles.scss" + ], "scripts": [] }, "configurations": { @@ -113,7 +117,9 @@ }, "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/apps/customer-portal"], + "outputs": [ + "coverage/apps/customer-portal" + ], "options": { "jestConfig": "apps/customer-portal/jest.config.js", "passWithNoTests": true @@ -142,7 +148,9 @@ "lint": { "executor": "@nrwl/linter:eslint", "options": { - "lintFilePatterns": ["apps/customer-portal-e2e/**/*.{js,ts}"] + "lintFilePatterns": [ + "apps/customer-portal-e2e/**/*.{js,ts}" + ] } } } @@ -155,7 +163,9 @@ "targets": { "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/libs/data-models"], + "outputs": [ + "coverage/libs/data-models" + ], "options": { "jestConfig": "libs/data-models/jest.config.js", "passWithNoTests": true @@ -180,7 +190,9 @@ "targets": { "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/libs/layout"], + "outputs": [ + "coverage/libs/layout" + ], "options": { "jestConfig": "libs/layout/jest.config.js", "passWithNoTests": true @@ -205,7 +217,9 @@ "targets": { "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/libs/material"], + "outputs": [ + "coverage/libs/material" + ], "options": { "jestConfig": "libs/material/jest.config.js", "passWithNoTests": true @@ -229,12 +243,16 @@ "targets": { "build": { "executor": "@nrwl/node:build", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], "options": { "outputPath": "dist/apps/nest-demo", "main": "apps/nest-demo/src/main.ts", "tsConfig": "apps/nest-demo/tsconfig.app.json", - "assets": ["apps/nest-demo/src/assets"] + "assets": [ + "apps/nest-demo/src/assets" + ] }, "configurations": { "production": { @@ -259,12 +277,16 @@ "lint": { "executor": "@nrwl/linter:eslint", "options": { - "lintFilePatterns": ["apps/nest-demo/**/*.ts"] + "lintFilePatterns": [ + "apps/nest-demo/**/*.ts" + ] } }, "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/apps/nest-demo"], + "outputs": [ + "coverage/apps/nest-demo" + ], "options": { "jestConfig": "apps/nest-demo/jest.config.js", "passWithNoTests": true @@ -280,7 +302,9 @@ "targets": { "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/libs/products"], + "outputs": [ + "coverage/libs/products" + ], "options": { "jestConfig": "libs/products/jest.config.js", "passWithNoTests": true @@ -305,7 +329,9 @@ "targets": { "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/libs/trends"], + "outputs": [ + "coverage/libs/trends" + ], "options": { "jestConfig": "libs/trends/jest.config.js", "passWithNoTests": true @@ -337,8 +363,13 @@ "polyfills": "apps/trendy/src/polyfills.ts", "tsConfig": "apps/trendy/tsconfig.app.json", "inlineStyleLanguage": "scss", - "assets": ["apps/trendy/src/favicon.ico", "apps/trendy/src/assets"], - "styles": ["apps/trendy/src/styles.scss"], + "assets": [ + "apps/trendy/src/favicon.ico", + "apps/trendy/src/assets" + ], + "styles": [ + "apps/trendy/src/styles.scss" + ], "scripts": [] }, "configurations": { @@ -403,7 +434,9 @@ }, "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/apps/trendy"], + "outputs": [ + "coverage/apps/trendy" + ], "options": { "jestConfig": "apps/trendy/jest.config.js", "passWithNoTests": true @@ -434,6 +467,12 @@ } }, "defaultConfiguration": "production" + }, + "firebase": { + "executor": "@nxtend/firebase:firebase", + "options": { + "cmd": "--help" + } } } }, @@ -458,7 +497,9 @@ "lint": { "executor": "@nrwl/linter:eslint", "options": { - "lintFilePatterns": ["apps/trendy-e2e/**/*.{js,ts}"] + "lintFilePatterns": [ + "apps/trendy-e2e/**/*.{js,ts}" + ] } } } @@ -470,12 +511,16 @@ "targets": { "build": { "executor": "@nrwl/node:build", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], "options": { "outputPath": "dist/apps/trendy-ssr", "main": "apps/trendy-ssr/src/main.ts", "tsConfig": "apps/trendy-ssr/tsconfig.app.json", - "assets": ["apps/trendy-ssr/src/assets"] + "assets": [ + "apps/trendy-ssr/src/assets" + ] }, "configurations": { "production": { @@ -500,12 +545,16 @@ "lint": { "executor": "@nrwl/linter:eslint", "options": { - "lintFilePatterns": ["apps/trendy-ssr/**/*.ts"] + "lintFilePatterns": [ + "apps/trendy-ssr/**/*.ts" + ] } }, "test": { "executor": "@nrwl/jest:jest", - "outputs": ["coverage/apps/trendy-ssr"], + "outputs": [ + "coverage/apps/trendy-ssr" + ], "options": { "jestConfig": "apps/trendy-ssr/jest.config.js", "passWithNoTests": true @@ -534,4 +583,4 @@ } }, "defaultProject": "customer-portal" -} +} \ No newline at end of file