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 @@ + + +
+ + +The specified file was not found on this website. Please check the URL for mistakes and try again.
+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.
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