diff --git a/.prettierignore b/.prettierignore index 85f8ece..e2785cf 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,4 +3,5 @@ /dist /coverage -/.nx/cache \ No newline at end of file +/.nx/cache +examples diff --git a/.verdaccio/.htpasswd b/.verdaccio/.htpasswd new file mode 100644 index 0000000..8391cd4 --- /dev/null +++ b/.verdaccio/.htpasswd @@ -0,0 +1 @@ +test:$6FrCaT/v0dwE:autocreated 2020-03-25T19:10:50.254Z diff --git a/.verdaccio/config.yml b/.verdaccio/config.yml new file mode 100644 index 0000000..1855bd4 --- /dev/null +++ b/.verdaccio/config.yml @@ -0,0 +1,48 @@ +# path to a directory with all packages +storage: ../dist/local-registry/storage + +auth: + htpasswd: + file: ./htpasswd + +# a list of other known repositories we can talk to +uplinks: + npmjs: + url: https://registry.npmjs.org/ + maxage: 60m + max_fails: 20 + fail_timeout: 2m + yarn: + url: https://registry.yarnpkg.com + maxage: 60m + max_fails: 20 + fail_timeout: 2m + +packages: + '@*/*': + # scoped packages + access: $all + publish: $all + unpublish: $all + proxy: npmjs + + '**': + # allow all users (including non-authenticated users) to read and + # publish all packages + access: $all + + # allow all users (including non-authenticated users) to publish/publish packages + publish: $all + unpublish: $all + + # if package is not available locally, proxy requests to 'yarn' registry + proxy: npmjs + +# log settings +logs: + type: stdout + format: pretty + level: warn + +publish: + allow_offline: true # set offline to true to allow publish offline diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 24f31e0..1e2d0f4 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/README.md b/README.md index aee57f6..31aa75e 100644 --- a/README.md +++ b/README.md @@ -104,11 +104,11 @@ Each lab will contain a link to the next one. Start from **"Lab 1"** and move th - 🔍  [Lab 17 - NxCloud GitHub bot](docs/lab17/LAB.md) - 📎  [Lab 18 - Run-Commands and deploying the frontend](docs/lab18/LAB.md) -| Option 1 - NextJS frontends and more custom generators practice | Option 2 - Heroku API deployments with Docker | -| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| 🧭  [Lab 19 - Creating and deploying a 2nd frontend](docs/lab19-alt/LAB.md) | 🧲  [Lab 19 - Deploying the API](docs/lab19/LAB.md) | -| ⛱️  [Lab 20 - Mock Store](docs/lab20-alt/LAB.md) | 🎸  [Lab 20 - Connecting the frontend and backend](docs/lab20/LAB.md) | -| 🪁  [Lab 21 - Setting up CD for automatic deployment](docs/lab21-alt/LAB.md) | 🎈  [Lab 21 - Setting up CD for automatic deployment](docs/lab21/LAB.md) | -| 💈  [Lab 22 - Deploying only what changed](docs/lab22/LAB.md) | 💈  [Lab 22 - Deploying only what changed](docs/lab22/LAB.md) | +| Option 1 - NextJS frontends and more custom generators practice | Option 2 - Fly.io API deployments | +| --------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| 🧭 [Lab 19 - Creating and deploying a 2nd frontend](docs/lab19-alt/LAB.md) | 🚀 [Lab 19 - Deploying the API with custom executor](docs/lab19/LAB.md) | +| ⛱️ [Lab 20 - Mock Store](docs/lab20-alt/LAB.md) | 🪢 [Lab 20 - Connecting the frontend and backend](docs/lab20/LAB.md) | +| 🪁 [Lab 21 - Setting up CD for automatic deployment](docs/lab21-alt/LAB.md) | 🎈 [Lab 21 - Setting up CD for automatic deployment](docs/lab21/LAB.md) | +| 💈 [Lab 22 - Deploying only what changed](docs/lab22/LAB.md) | 💈 [Lab 22 - Deploying only what changed](docs/lab22/LAB.md) | ## Have fun learning! 🎉 diff --git a/apps/nx-workshop-e2e/jest.config.js b/apps/nx-workshop-e2e/jest.config.js index 8b35a8b..e4aefb4 100644 --- a/apps/nx-workshop-e2e/jest.config.js +++ b/apps/nx-workshop-e2e/jest.config.js @@ -11,5 +11,4 @@ module.exports = { ], }, moduleFileExtensions: ['ts', 'js', 'html'], - coverageDirectory: '../../coverage/apps/nx-workshop-e2e', }; diff --git a/apps/nx-workshop-e2e/tests/nx-workshop.spec.ts b/apps/nx-workshop-e2e/tests/nx-workshop.spec.ts index 47ece22..2520518 100644 --- a/apps/nx-workshop-e2e/tests/nx-workshop.spec.ts +++ b/apps/nx-workshop-e2e/tests/nx-workshop.spec.ts @@ -1,24 +1,116 @@ -import { - checkFilesExist, - ensureNxProject, - runNxCommand, -} from '@nx/plugin/testing'; -import { execSync } from 'child_process'; +import { readJsonFile, workspaceRoot, writeJsonFile } from '@nx/devkit'; +import { ExecSyncOptionsWithStringEncoding, execSync } from 'child_process'; +import { ensureDirSync, removeSync, existsSync } from 'fs-extra'; +import { dirname, join } from 'path'; + describe('nx-react-workshop e2e', () => { - describe('migrations', () => { + describe('migrations for alternative option', () => { it('should run the migrations', () => { - ensureNxProject('@nrwl/nx-react-workshop', 'dist/libs/nx-react-workshop'); - expect(() => checkFilesExist(`libs`)).not.toThrow(); + createNewWorkspace(); + expect(() => checkFilesExist(`node_modules/.bin/nx`)).not.toThrow(); }, 120000); - for (let i = 1; i < 22; i++) { + + for (let i = 1; i < 23; i++) { it(`should complete lab ${i}`, () => { runNxCommand( - `generate @nrwl/nx-react-workshop:complete-labs --lab=${i}` + `generate @nrwl/nx-react-workshop:complete-labs --lab=${i} --option=option1` + ); + runNxCommand('migrate --run-migrations=migrations.json --verbose'); + runNxCommand( + 'run-many --target=e2e --parallel=false --exclude=internal-plugin-e2e' + ); + runNxCommand('run-many --target=lint --parallel=false'); + }); + } + }); + + describe('migrations for deployment path', () => { + it('should run the migrations', () => { + createNewWorkspace(); + + expect(() => checkFilesExist(`node_modules/.bin/nx`)).not.toThrow(); + }, 120000); + + for (let i = 1; i < 23; i++) { + it(`should complete lab ${i}`, () => { + runNxCommand( + `generate @nrwl/nx-react-workshop:complete-labs --lab=${i} --option=option2` ); runNxCommand('migrate --run-migrations=migrations.json'); - runNxCommand('run-many --target=e2e --parallel=false'); + runNxCommand( + 'run-many --target=e2e --parallel=false --exclude=internal-plugin-e2e' + ); + runNxCommand('run-many --target=lint --parallel=false'); }); } }); }); + +const scope = `bg-hoard`; + +function tmpProjPath() { + return join(process.cwd(), 'tmp', 'nx-e2e', scope); +} + +function createNewWorkspace() { + const localTmpDir = dirname(tmpProjPath()); + ensureDirSync(localTmpDir); + removeSync(tmpProjPath()); + // create new workspace + execSync( + `node ${require.resolve( + 'nx' + )} new ${scope} --nx-workspace-root=${localTmpDir} --no-interactive --skip-install --collection=@nx/workspace --npmScope=${scope} --preset=apps --packageManager=npm`, + { + cwd: localTmpDir, + } + ); + // patch package.json + const path = join(tmpProjPath(), 'package.json'); + const json = readJsonFile(path); + json.devDependencies[ + '@nrwl/nx-react-workshop' + ] = `file:${workspaceRoot}/dist/libs/nx-react-workshop`; + writeJsonFile(path, json); + // install dependencies + execSync('npm install', { + cwd: tmpProjPath(), + stdio: ['ignore', 'ignore', 'ignore'], + }); +} + +function checkFilesExist(...expectedPaths) { + expectedPaths.forEach((path) => { + const filePath = join(tmpProjPath(), path); + if (!execSync(filePath)) { + throw new Error(`'${filePath}' does not exist`); + } + }); +} + +function runNxCommand(command): string { + function _runNxCommand(c) { + const execSyncOptions: ExecSyncOptionsWithStringEncoding = { + cwd: tmpProjPath(), + env: process.env, + encoding: 'utf-8', + }; + if (existsSync(join(tmpProjPath(), 'package.json'))) { + return execSync(`npx nx ${c}`, execSyncOptions); + } else { + return execSync(`./nx %${c}`, execSyncOptions); + } + } + try { + return _runNxCommand(command) + .toString() + .replace( + /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, + '' + ); + } catch (e) { + console.log(e.stdout.toString(), e.stderr.toString()); + throw e; + } +} diff --git a/docs/lab1/LAB.md b/docs/lab1/LAB.md index 81c8760..2227b96 100644 --- a/docs/lab1/LAB.md +++ b/docs/lab1/LAB.md @@ -16,13 +16,13 @@ ## 🏋️‍♀️ Steps: 1. Generate an empty Nx workspace for a fictional company called "The Board Game Hoard" -
+
2. The workspace name should be `bg-hoard` -
+
3. Make sure you select `None` as Stack (we will create apps manually), an `Integrated` workspace layout and `No to NxCloud` when asked -
+
--- diff --git a/docs/lab11/LAB.md b/docs/lab11/LAB.md index 61077fd..ac8625d 100644 --- a/docs/lab11/LAB.md +++ b/docs/lab11/LAB.md @@ -2,42 +2,49 @@ ###### ⏰  Estimated time: 5 minutes -The storybook generator we invoked earlier also generated some e2e tests. Let's try them out! +The storybook generator we invoked earlier also generated some tests. Let's try them out! ## 📚 Learning outcomes: - **Take advantage of the e2e tests Nx generated earlier to test your app** -
+
## 🏋️‍♀️ Steps: -1. Our previous command generated a new `apps/store-ui-shared-e2e` folder. Let's run them: `nx e2e store-ui-shared-e2e` +1. Our previous command generated tests with stories as well. Let's run them: `nx storybook store-ui-shared` and in another terminal `nx test-storybook store-ui-shared` + - The tests should fail -
+
-2. Open `apps/store-ui-shared-e2e/src/integration/header/header.spec.ts` and **give the title a value**: +2. Open `libs/store/ui-shared/src/lib/header/header.stories.tsx` and **give the title a value**. +
+ 🐳 Hint ```ts - cy.visit( - '/iframe.html?id=header--primary&args=title:BoardGameHoard' - ) + args: { + title: 'Welcome to Board Game Hoard'; + } ``` -
+
+ +
-3. Now **add a test** to check if it contains that value +3. Now **fix the test** to check if it contains that value +
+ 🐳 Hint ```ts - it('should show the title', () => { - cy.get('header').contains('BoardGameHoard'); - }); + expect(canvas.getByText(/Welcome to Board Game Hoard/gi)).toBeTruthy(); ``` -
+
+ +
4. **Re-run the tests** -
+
5. **Inspect what changed** from the last time you committed, then **commit your changes** -
+
--- diff --git a/docs/lab12/LAB.md b/docs/lab12/LAB.md index 14bb0ec..ac25045 100644 --- a/docs/lab12/LAB.md +++ b/docs/lab12/LAB.md @@ -7,73 +7,76 @@ - **Understand how to assign scopes and type tags to your libraries** - **How to specify boundaries around your tags and avoid circular dependencies in your repo** - **How to use linting to trigger warnings or errors when you are not respecting these boundaries** -
+
## 🏋️‍♀️ Steps : -1. Open the `project.json` files for each project and **finish tagging the apps** accordingly: +1. Open the `project.json` files for each project and **finish tagging the apps** accordingly: - ``` - // apps/store/project.json - { - "projectType": "application", - "root": "apps/store", - "sourceRoot": "apps/store/src", - "prefix": "bg-hoard", - "targets": { ... }, - "tags": ["scope:store", "type:app"] - } - ``` -
+ ``` + // apps/store/project.json + { + "projectType": "application", + "root": "apps/store", + "sourceRoot": "apps/store/src", + "prefix": "bg-hoard", + "targets": { ... }, + "tags": ["scope:store", "type:app"] + } + ``` -2. Open the root `.eslintrc.json`, find the `"@nrwl/nx/enforce-module-boundaries"` rule and **set the `depConstraints`**: +
- ``` - "depConstraints": [ - { - "sourceTag": "scope:store", - "onlyDependOnLibsWithTags": ["scope:store", "scope:shared"] - }, - .... <-- finish adding constraints for the tags we defined in the previous step - ] - ``` -
+2. Open the root `.eslintrc.json`, find the `"@nx/enforce-module-boundaries"` rule and **set the `depConstraints`**: -3. **Run `nx run-many --target=lint --all --parallel`** + ``` + "depConstraints": [ + { + "sourceTag": "scope:store", + "onlyDependOnLibsWithTags": ["scope:store", "scope:shared"] + }, + .... <-- finish adding constraints for the tags we defined in the previous step + ] + ``` - 💡 `nx run-many` allows you run a specific target against a specific set of projects - via the `--projects=[..]` option. However, you can also pass it the `--all` option - to run that target against all projects in your workspace. +
- 💡 `--parallel` launches all the `lint` processes in parallel -
+3. **Run `nx run-many --target=lint --all --parallel`** -4. We talked about how importing a **Feature** lib should not be allowed from a - **UI** lib. Let's **test our lint rules** by doing just that: - In `libs/store/ui-shared/src/lib/header/header.tsx` - Try to `import { StoreFeatureGameDetail } from '@bg-hoard/store/feature-game-detail';` -
+ 💡 `nx run-many` allows you run a specific target against a specific set of projects + via the `--projects=[..]` option. However, you can also pass it the `--all` option + to run that target against all projects in your workspace. -5. **Run linting** against all the projects again. -
+ 💡 `--parallel` launches all the `lint` processes in parallel +
-6. You should see the expected error. Great! You can now **delete the import** above. -
+4. We talked about how importing a **Feature** lib should not be allowed from a + **UI** lib. Let's **test our lint rules** by doing just that: - In `libs/store/ui-shared/src/lib/header/header.tsx` - Try to `import { StoreFeatureGameDetail } from '@bg-hoard/store-feature-game-detail';` +
-7. We also talked about the importance of setting boundaries between your workspace scopes. Let's try and **import a `store` lib** from an `api` scope. - In `apps/api/src/main.ts` - Try to `import { formatRating } from '@bg-hoard/store/util-formatters';` -
+5. **Run linting** against all the projects again. +
-8. **Run linting** on all projects - you should see another expected error. -
+6. You should see the expected error. Great! You can now **delete the import** above. +
-9. You can now **delete the import** above. -
+7. We also talked about the importance of setting boundaries between your workspace scopes. Let's try and **import a `store` lib** from an `api` scope. - In `apps/api/src/main.ts` - Try to `import { formatRating } from '@bg-hoard/store-util-formatters';` +
+ +8. **Run linting** on all projects - you should see another expected error. +
+ +9. You can now **delete the import** above. +
10. **Run linting** again and check if all the errors went away. - 💡  Pass the suggested `--only-failed` option, so it doesn't relint everything. -
+ 💡  Pass the suggested `--only-failed` option, so it doesn't relint everything. + +
11. **Commit everything** before moving on to the next lab -
+
--- diff --git a/docs/lab12/SOLUTION.md b/docs/lab12/SOLUTION.md index eee9588..49b39cd 100644 --- a/docs/lab12/SOLUTION.md +++ b/docs/lab12/SOLUTION.md @@ -7,31 +7,30 @@ - store-feature-game-detail: `"tags": ["scope:store", "type:feature"]` - api: `"tags": ["scope:api", "type:app"]` - util-interface: `"tags": ["scope:shared", "type:util"]` -- store-ui-shared-e2e: `"tags": ["scope:store", "type:e2e"]` ##### nx-enforce-module-boundaries rules: ```json "depConstraints": [ - { - "sourceTag": "scope:store", - "onlyDependOnLibsWithTags": ["scope:store", "scope:shared"] - }, - { - "sourceTag": "scope:api", - "onlyDependOnLibsWithTags": ["scope:api", "scope:shared"] - }, - { - "sourceTag": "type:feature", - "onlyDependOnLibsWithTags": ["type:feature", "type:ui", "type:util"] - }, - { - "sourceTag": "type:ui", - "onlyDependOnLibsWithTags": ["type:ui", "type:util"] - }, - { - "sourceTag": "type:util", - "onlyDependOnLibsWithTags": ["type:util"] - } - ] + { + "sourceTag": "scope:store", + "onlyDependOnLibsWithTags": ["scope:store", "scope:shared"] + }, + { + "sourceTag": "scope:api", + "onlyDependOnLibsWithTags": ["scope:api", "scope:shared"] + }, + { + "sourceTag": "type:feature", + "onlyDependOnLibsWithTags": ["type:feature", "type:ui", "type:util"] + }, + { + "sourceTag": "type:ui", + "onlyDependOnLibsWithTags": ["type:ui", "type:util"] + }, + { + "sourceTag": "type:util", + "onlyDependOnLibsWithTags": ["type:util"] + } +] ``` diff --git a/docs/lab13/LAB.md b/docs/lab13/LAB.md index e766ce9..54784c5 100644 --- a/docs/lab13/LAB.md +++ b/docs/lab13/LAB.md @@ -21,12 +21,12 @@ have to maintain them. In this workshop, we'll create an internal plugin called about the folders in our workspace and automatically tags the new project with a correct scope and type tag. -1. Use the `@nrwl/nx-plugin:plugin` generator to generate a new plugin called - `internal-plugin`.
+1. Use the `@nx/plugin:plugin` generator to generate a new plugin called + `internal-plugin`.
Make sure that the `minimal` option is set.

-2. Use the `@nrwl/nx-plugin:generator` generator to generate a new generator called +2. Use the `@nx/plugin:generator` generator to generate a new generator called `util-lib`.

@@ -69,22 +69,23 @@ scope and type tag. ⚠️ The code we generated creates a very bare-bones new library, with only a `project.json` and a `src/index.ts` file; you will see these files created if you run it. - You can use Git to undo those changes (hence why it's recommended to commit before running a generator). + You can use Git to undo those changes (hence why it's recommended to commit before running a generator).

-5. We can call other generators inside of our custom generator. Import the `@nrwl/js:library` generator and call it inside of the default exported function of `libs/internal-plugin/src/generators/util-lib/generator.ts` +5. We can call other generators inside of our custom generator. Import the `@nx/js:library` generator and call it inside of the default exported function of `libs/internal-plugin/src/generators/util-lib/generator.ts`
🐳 Hint ```typescript - import { libraryGenerator } from '@nrwl/js/generators'; + import { libraryGenerator } from '@nx/js/generators'; export default async function (tree: Tree, schema: UtilLibGeneratorSchema) { await libraryGenerator(tree, schema); // ... } ``` +
6. In `libs/internal-plugin/src/generators/util-lib/generator.ts` try to make it `console.log()` the value of the `--name` property you passed to it (can use `--dry-run` again to test it) @@ -107,7 +108,7 @@ scope and type tag. 9. Add a new property to its schema called `directory`. It should have only 3 possible values: `"store", "api", "shared"`. If you do not pass `--directory` as an option when invoking the schema it should prompt the user to select from the 3 different values (similar to when you got - asked about which CSS framework to use when creating Angular libs). + asked about which CSS framework to use when creating React libs).
🐳 Hint @@ -125,7 +126,7 @@ scope and type tag.
🐳 Hint - Consult the `@nrwl/js:lib` [docs](https://nx.dev/packages/js/generators/library) + Consult the `@nx/js:lib` [docs](https://nx.dev/packages/js/generators/library) for possible options you can pass to it.
diff --git a/docs/lab13/SOLUTION.md b/docs/lab13/SOLUTION.md index bee0a17..e6364c2 100644 --- a/docs/lab13/SOLUTION.md +++ b/docs/lab13/SOLUTION.md @@ -1,13 +1,13 @@ ##### Generate a `internal-plugin` plugin: ```shell script -nx generate @nx/plugin:plugin internal-plugin --minimal +nx generate @nx/plugin:plugin internal-plugin --directory=libs/internal-plugin --minimal ``` #### Generate a `util-lib` generator: ```shell -nx generate @nx/plugin:generator util-lib --project=internal-plugin +nx generate @nx/plugin:generator util-lib --directory libs/internal-plugin/src/generators/util-lib ``` ##### Running the generator in dry mode diff --git a/docs/lab14/LAB.md b/docs/lab14/LAB.md index 2705ab7..f64ea1d 100644 --- a/docs/lab14/LAB.md +++ b/docs/lab14/LAB.md @@ -18,11 +18,11 @@
🐳   Hint -- Refer to the [docs](https://nx.dev/latest/angular/nx-devkit/index#updatejson) -- Use this utility: - - `import { updateJson } from '@nx/devkit';` -- As always, the answer is in the [the solution](SOLUTION.md). Try a few different approaches on your own first. -
+ - Refer to the [docs](https://nx.dev/nx-api/devkit/documents/updateJson) + - Use this utility: + - `import { updateJson } from '@nx/devkit';` + - As always, the answer is in the [the solution](SOLUTION.md). Try a few different approaches on your own first. +
⚠️  When you run the above, it might complain that you haven't supplied a `name`. Since we don't need this property in the generate, you can remove it from the schema. @@ -33,7 +33,7 @@ we don't need this property in the generate, you can remove it from the schema. - When large teams work in the same workspace, they will occasionally be adding new projects and hence, **new scope tags** - We want to make sure that scope tags specified in our `util-lib` generator are up to date and take into account all these new scopes that teams have been adding - We want to check if there is a new scope tag in any of our `project.json` files and update our generator schema -- We can use the [`getProjects`](https://nx.dev/l/a/nx-devkit/index#getprojects) util to read all the projects at once. +- We can use the [`getProjects`](https://nx.dev/nx-api/devkit/documents/getProjects) util to read all the projects at once. - **BONUS:** Modify your generator so it fetches list of scopes from all the `project.json` files and updates the schema in util-lib with any new ones ⚠️ You can use the function provided in the Hint to extract the `scopes` @@ -99,7 +99,7 @@ we don't need this property in the generate, you can remove it from the schema. 🐳 Hint ```shell - nx generate app vide-games --tags=scope:vide-games + nx generate app video-games --tags=scope:video-games ``` @@ -116,6 +116,8 @@ we don't need this property in the generate, you can remove it from the schema. their scope files.

+10. **BONUS BONUS BONUS** - create a test to automate verification of this generator in `libs/internal-plugin/src/generators/update-scope-schema/generator.spec.ts`. This will be particularly difficult, as you'll need to create a project with the actual source code of your `util-lib` generator as part of the setup for this test. (Check [the solution](SOLUTION.md) if you get stuck!) + --- 🎓If you get stuck, check out [the solution](SOLUTION.md) diff --git a/docs/lab14/SOLUTION.md b/docs/lab14/SOLUTION.md index 00ba4ac..44dc4fa 100644 --- a/docs/lab14/SOLUTION.md +++ b/docs/lab14/SOLUTION.md @@ -1,7 +1,7 @@ ##### Generate a `update-scope-schema` generator: ```shell script -nx generate @nx/plugin:generator update-scope-schema --project=internal-plugin +nx generate @nx/plugin:generator update-scope-schema --directory libs/internal-plugin/src/generators/update-scope-schema ``` ##### Change default project @@ -138,7 +138,7 @@ function addScopeIfMissing(host: Tree) { { "scripts": { "postinstall": "husky install", - "pre-commit": "npx nx workspace-generator update-scope-schema" + "pre-commit": "npx nx g @bg-hoard/internal-plugin:update-scope-schema" } } ``` @@ -196,6 +196,7 @@ describe('update-scope-schema generator', () => { async function addUtilLibProject(tree: Tree) { await pluginGenerator(tree, { name: 'internal-plugin', + directory: 'libs/internal-plugin' skipTsConfig: false, unitTestRunner: 'jest', linter: Linter.EsLint, @@ -206,7 +207,7 @@ async function addUtilLibProject(tree: Tree) { }); await generatorGenerator(tree, { name: 'util-lib', - project: 'internal-plugin', + directory: 'libs/internal-plugin/src/generators/util-lib', unitTestRunner: 'jest', }); const filesToCopy = [ diff --git a/docs/lab15/LAB.md b/docs/lab15/LAB.md index 896d740..9be5d75 100644 --- a/docs/lab15/LAB.md +++ b/docs/lab15/LAB.md @@ -13,62 +13,65 @@ Before starting on this lab, it's important that you have a version of your local workshop pushed to your GitHub repo. -1. Let's make sure the master branch is up to date (it's important your latest changes are on `master` for the follow-up steps): - If you already are on `master` - commit everything: +1. Let's make sure the master branch is up to date (it's important your latest changes are on `main` for the follow-up steps): - If you already are on `main` - commit everything: `git add . && git commit -m "finished lab 14" git push origin master` - > If you are on a different branch, commit everything, switch to master + > If you are on a different branch, commit everything, switch to master - and bring it up to date: + and bring it up to date: - ```shell - git add . && git commit "finish lab 14" - git checkout master - git merge previous-branch-you-were-on - git push origin master - ``` -
- -2. Create a new file `.github/workflows/ci.yml` - - ```yml - name: Run CI checks # The name will show up on the GitHub Actions dashboard - - on: [pull_request] # This workflow will run only on Pull Requests - - jobs: - test-store: # give our job an ID - runs-on: ubuntu-latest # the image our job will run on - name: Test Store # the name that will appear on the Actions UI - steps: # what steps it will perform - - uses: actions/checkout@v1 # checkout whatever branch the PR is using - - uses: bahmutov/npm-install@v1 # trigger an `npm install` - - run: npm run nx test store # test the "store" project - test-api: - runs-on: ubuntu-latest - name: Test API - steps: - - uses: actions/checkout@v1 - - uses: bahmutov/npm-install@v1 - - run: npm run nx test api - ``` -
+ ```shell + git add . && git commit "finish lab 14" + git checkout master + git merge previous-branch-you-were-on + git push origin master + ``` -3. Commit and then switch to a new branch: +
- ``` - git add . && git commit -m "add ci" - git push origin master - git checkout -b dynamic-title - ``` +2. Create a new file `.github/workflows/ci.yml` + + ```yml + name: Run CI checks # The name will show up on the GitHub Actions dashboard + + on: [pull_request] # This workflow will run only on Pull Requests + + jobs: + test-store: # give our job an ID + runs-on: ubuntu-latest # the image our job will run on + name: Test Store # the name that will appear on the Actions UI + steps: # what steps it will perform + - uses: actions/checkout@v4 # checkout whatever branch the PR is using + - uses: bahmutov/npm-install@v1.4.5 # trigger an `npm install` + - run: npm run nx test store # test the "store" project + test-api: + runs-on: ubuntu-latest + name: Test API + steps: + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1.4.5 + - run: npm run nx test api + ``` + +
+ +3. Commit and then switch to a new branch: + + ``` + git add . && git commit -m "add ci" + git push origin master + git checkout -b dynamic-title + ``` + + ⚠️  I know we **just** switched to master above. But it was important we bring it + up to date. Now we need to switch to a new branch so we can submit our PR. - ⚠️  I know we **just** switched to master above. But it was important we bring it - up to date. Now we need to switch to a new branch so we can submit our PR. -
+
-4. Open `apps/store/src/app/app.tsx` -
+4. Open `apps/store/src/app/app.tsx` +
-5. And make *any change at all to the component* (the title of the header dynamic): +5. And make _any change at all to the component_ (the title of the header dynamic): ``` const title = "Board Game Hoard"; @@ -85,12 +88,10 @@ pushed to your GitHub repo. } export const Header = ({ title }: HeaderProps) => { - const classes = useStyles(); - return ( - + {title} @@ -101,23 +102,23 @@ pushed to your GitHub repo.
-6. Commit all your changes and push your new branch. -
+6. Commit all your changes and push your new branch. +
-7. Go to GitHub and make a Pull Request to `master` -
+7. Go to GitHub and make a Pull Request to `main` +
-8. After a few moments you'll see something like this: +8. After a few moments you'll see something like this: ![GitHub Actions example](./github_actions.png) -
+
-9. The unit tests will be failing - that's expected. -
+9. The unit tests will be failing - that's expected. +
--- We are starting to set-up our CI, that will verify our Pull Requests to ensure bad code -doesn't go into `master`. +doesn't go into `main`. But now we're testing both projects - even though we only changed the store. @@ -127,72 +128,74 @@ But now we're testing both projects - even though we only changed the store. 10. Let's use `nx affected` to only test the changed projects: - Instead of running two `nx` commands in your CI, run a single `nx affected` command - that tests all affected projects. + Instead of running two `nx` commands in your CI, run a single `nx affected` command + that tests all affected projects. -
- 🐳   Hint 1 +
+ 🐳   Hint 1 - Check-out this [handy tutorial](https://nx.dev/latest/angular/tutorial/11-test-affected-projects#step-11-test-affected-projects) - Refer to the [docs](https://nx.dev/latest/angular/cli/affected#affected) -
+ Refer to the [docs](https://nx.dev/nx-api/nx/documents/affected) +
-
- 🐳   Hint 2 +
+ 🐳   Hint 2 - Since it's a Pull Request, your base commit will always be `--base=origin/master` -
+ Since it's a Pull Request, your base commit will always be `--base=origin/main` +
-
- 🐳   Hint 3 - - You should only need 1 job now: - - ```yaml - jobs: - test: - runs-on: ubuntu-latest - name: Testing affected apps - steps: - - uses: actions/checkout@v1 - - uses: bahmutov/npm-install@v1.4.5 - - run: ..... - ``` +
+ 🐳   Hint 3 + + You should only need 1 job now: -
+ ```yaml + jobs: + test: + runs-on: ubuntu-latest + name: Testing affected apps + steps: + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1.4.5 + - run: ..... + ``` - ⚠️  It's okay to work on this on your new branch. We'll merge everything to `master` - eventually. -
+
+ + ⚠️  It's okay to work on this on your new branch. We'll merge everything to `main` + eventually. + +
11. Commit and push. On your Github Actions log you should see only the `store` tests running: Only store tests are running
-12. Our tests are now being ran sequentially for each project. See if you can run them in parallel (consult the Nx Affected [docs](https://nx.dev/latest/angular/cli/affected#affected) if unsure) -
+12. Our tests are now being ran sequentially for each project. See if you can run them in parallel (consult the Nx Affected [docs](https://nx.dev/nx-api/nx/documents/affected) if unsure) +
13. Our CI only does testing now. But we also have targets for `lint`, `e2e` and `build`. Would really be handy if CI also told us if any of those failed. - **Add more jobs under your CI workflow that run affected for each of the above targets** -
+ **Add more jobs under your CI workflow that run affected for each of the above targets** + +
14. Commit and push your `ci.yml` changes. -
+
15. You'll notice some new steps in the GitHub Actions UI. Some of them are failing. That is okay. We can fix them later. -
+
-16. For now, you can merge your PR into `master ` -
+16. For now, you can merge your PR into `main ` +
-17. Switch to `master` locally and pull latest so all your new CI changes are up to date. +17. Switch to `main` locally and pull latest so all your new CI changes are up to date. - ```shell - git checkout master - git pull origin master - ``` -
+ ```shell + git checkout master + git pull origin master + ``` + +
18. **BONUS:** Currently, if we create a PR with a change **only** to our `ci.yml` file, our `nx affected` commands won't run at all: as they'll think no project has been affected: @@ -204,7 +207,7 @@ But now we're testing both projects - even though we only changed the store.
🐳   Hint - [Configuring implicit dependencies](https://nx.dev/latest/angular/core-concepts/configuration#implicit-dependencies) + [Setting named inputs](https://nx.dev/reference/nx-json#inputs-namedinputs)

--- diff --git a/docs/lab15/SOLUTION.md b/docs/lab15/SOLUTION.md index 7120fb3..c78eb65 100644 --- a/docs/lab15/SOLUTION.md +++ b/docs/lab15/SOLUTION.md @@ -10,35 +10,39 @@ jobs: runs-on: ubuntu-latest name: Building affected apps steps: - - uses: actions/checkout@v1 - - uses: bahmutov/npm-install@v1.4.5 + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1 - run: npm run nx affected -- --target=build --base=origin/master --parallel test: runs-on: ubuntu-latest name: Testing affected apps steps: - - uses: actions/checkout@v1 - - uses: bahmutov/npm-install@v1.4.5 + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1 - run: npm run nx affected -- --target=test --base=origin/master --parallel lint: runs-on: ubuntu-latest name: Linting affected apps steps: - - uses: actions/checkout@v1 - - uses: bahmutov/npm-install@v1.4.5 + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1 - run: npm run nx affected -- --target=lint --base=origin/master --parallel e2e: runs-on: ubuntu-latest name: E2E testing affected apps steps: - - uses: actions/checkout@v1 - - uses: bahmutov/npm-install@v1.4.5 + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1 - run: npm run nx affected -- --target=e2e --base=origin/master --parallel ``` ##### Marking all projects as affected -```json - "implicitDependencies": { - ".github/workflows/ci.yml": "*", +```jsonc +{ + "namedInputs": { + // ... + "sharedGlobals": [, /*..*/ "{workspaceRoot}/.github/workflows/ci.yml"] + } +} ``` diff --git a/docs/lab16/LAB.md b/docs/lab16/LAB.md index db07c01..eebb52a 100644 --- a/docs/lab16/LAB.md +++ b/docs/lab16/LAB.md @@ -6,94 +6,98 @@ - **Understand the difference between local and distributed caching** - **Learn how to add NxCloud and enable distributed on an existing Nx workspace** -
+
## 🏋️‍♀️ Steps : -1. Earlier in the workshop, we discussed about Nx's [local caching](https://nx.dev/latest/angular/workspace/computation-caching#computation-caching) - capabilities. Let's enable distributed caching. +1. Earlier in the workshop, we discussed about Nx's [local caching](https://nx.dev/concepts/mental-model#computation-hashing-and-caching) + capabilities. Let's enable distributed caching. - ``` - nx connect-to-nx-cloud - ``` + ``` + nx connect + ``` - ![Nx Cloud Confirmation](./nx_cloud_enabled.png) -
+ ![Nx Cloud Confirmation](./nx_cloud_enabled.png) +
-2. Inspect the changes added in `nx.json` - especially the access token. We'll explain that more in a bit! -
+2. Inspect the changes added in `nx.json` - especially the access token. We'll explain that more in a bit! +
-3. **Very important:** Make sure, at this stage, you commit and push your changes: +3. **Very important:** Make sure, at this stage, you commit and push your changes: - ``` - # make sure you're on master - git checkout master - git add . && git commit -m "add nx cloud" - git push origin master - ``` -
+ ``` + # make sure you're on master + git checkout master + git add . && git commit -m "add nx cloud" + git push origin master + ``` -4. Run a build: `nx run-many --target=build --all` +
- 🕑 Watch the process in the terminal - it might take a few seconds... -
+4. Run a build: `nx run-many --target=build --all` -5. You'll see a link at the end, let's see what's there: + 🕑 Watch the process in the terminal - it might take a few seconds... +
- ![Run Details Link](./run_details.png) +5. You'll see a link at the end, let's see what's there: - We'll talk more about these links later! -
+ ![Run Details Link](./run_details.png) -6. Try to build all projects again: `nx run-many --target=build --all` + We'll talk more about these links later! +
- ⚡ It should finish **much quicker** this time - because it just pulled from the local cache! -
+6. Try to build all projects again: `nx run-many --target=build --all` -7. Let's try something different now - in a different folder on your machine, let's try and do a **fresh** of your repository: + ⚡ It should finish **much quicker** this time - because it just pulled from the local cache! +
+ +7. Let's try something different now - in a different folder on your machine, let's try and do a **fresh** of your repository: + + ``` + # go into a new folder + cd .. + # clone your repo again + git clone git@github.com:/.git test-distributed-caching + cd test-distributed-caching + # install dependencies + yarn + ``` - ``` - # go into a new folder - cd .. - # clone your repo again - git clone git@github.com:/.git test-distributed-caching - cd test-distributed-caching - # install dependencies - yarn - ``` -
+
-8. In your new instance, let's try and build again: `nx run-many --target=build --all` +8. In your new instance, let's try and build again: `nx run-many --target=build --all` - ⚡ It should be almost instant... -
+ ⚡ It should be almost instant... +
-9. **But how?** You have no local cache: we just did a fresh pull of the repository. +9. **But how?** You have no local cache: we just did a fresh pull of the repository. - Check your terminal output - you should see this message: + Check your terminal output - you should see this message: - ![NxCloud cache pull](./distrib_caching_confirmation.png) + ![NxCloud cache pull](./distrib_caching_confirmation.png) - That means that instead of rebuilding locally again, we just pulled from the distributed cache. -
+ That means that instead of rebuilding locally again, we just pulled from the distributed cache. +
10. Let's try a different command - in the same folder you are in, try to run: - ``` - nx run-many --target=lint --all - ``` + ``` + nx run-many --target=lint --all + ``` + + 🕑 It should start the linting work, and take a few seconds... - 🕑 It should start the linting work, and take a few seconds... -
+
11. Now let's go back to our main workshop repository and run: - ``` - nx run-many --target=lint --all - ``` + ``` + nx run-many --target=lint --all + ``` + + ⚡ It should pull again from the NxCloud cache...This is even works across laptops! CI will use it as well! - ⚡ It should pull again from the NxCloud cache...This is even works across laptops! CI will use it as well! -
+
--- diff --git a/docs/lab18/LAB.md b/docs/lab18/LAB.md index 83442df..15037ca 100644 --- a/docs/lab18/LAB.md +++ b/docs/lab18/LAB.md @@ -11,33 +11,30 @@ ## 🏋️‍♀️ Steps : -1. Make sure you are on the `master` branch +1. Make sure you are on the `main` branch
2. We'll use a CLI tool called [Surge](https://surge.sh/) to statically deploy the frontend: - ```bash - yarn add surge - # or - npm i -S surge - ``` + ```bash + npm i -S surge + ```
- 3. Get the surge token (you'll need to create an account with an email and password): - ``` - npx surge token - ``` + ``` + npx surge token + ``` - ☝️ Copy the token you get + ☝️ Copy the token you get
4. Let's use the Surge CLI to deploy our project: - ```bash + ```bash # make sure the project is built first - and we have something in dist @@ -45,18 +42,20 @@ # use surge to deploy whatever assets are in dist/apps/store - npx surge dist/apps/store https://.surge.sh --token + surge dist/apps/store https://.surge.sh --token ``` - ⚠️  Make sure you chose a **unique value** for your domain above, otherwise - it will fail as you won't have permission to deploy to an existing one. + ⚠️  Make sure you chose a **unique value** for your domain above, otherwise + it will fail as you won't have permission to deploy to an existing one. - ⚠️  You should see surge deploying to your URL - if you click you'll see just the header though, because it doesn't have a server yet to get the games from. + ⚠️  You should see surge deploying to your URL - if you click you'll see just the header though, because it doesn't have a server yet to get the games from.
``` + ``` + 5. Let's now abstract away the above command into an Nx target. Generate a new **"deploy"** target using the `@nx/workspace:run-commands` generator: - under the `store` project @@ -65,7 +64,7 @@
🐳   Hint - Consult the run-commands generator docs [here](https://nx.dev/latest/angular/workspace/run-commands-executor#run-commands) + Consult the run-commands generator docs [here](https://nx.dev/nx-api/workspace/generators/run-commands)

6. Use Git to inspect the changes in `project.json` and try to deploy the store using Nx! @@ -92,15 +91,15 @@
8. Now invoke the deploy target again, and check if it all still works. - ⚠️  Note for Windows users: the command might fail, as we're trying to access env variables the Linux-way. - To make it pass, you can generate a separate `windows-deploy` executor (make sure you keep the existing `deploy` target intact - it will be used by GitHub Actions): + ⚠️  Note for Windows users: the command might fail, as we're trying to access env variables the Linux-way. + To make it pass, you can generate a separate `windows-deploy` executor (make sure you keep the existing `deploy` target intact - it will be used by GitHub Actions): ```bash nx generate run-commands windows-deploy --project=store --command="surge dist/apps/store %SURGE_DOMAIN_STORE% --token %SURGE_TOKEN%" nx windows-deploy store ``` -
+
--- diff --git a/docs/lab19-alt/SOLUTION.md b/docs/lab19-alt/SOLUTION.md index af7509c..3d10c84 100644 --- a/docs/lab19-alt/SOLUTION.md +++ b/docs/lab19-alt/SOLUTION.md @@ -1,8 +1,8 @@ ##### Generate a React app ```shell -yarn add @nrwl/next # or "npm i -S @nrwl/next" -nx g @nrwl/next:app admin-ui +yarn add @nx/next # or "npm i -S @nx/next" +nx g @nx/next:app admin-ui nx serve admin-ui ``` @@ -21,7 +21,7 @@ nx generate run-commands deploy --project=admin-ui --command="surge dist/apps/ad ##### Bonus ```shell -nx g workspace-generator add-deploy-target +nx generate @nx/plugin:generator add-deploy-target --directory libs/internal-plugin/src/generators/add-deploy-target ``` ![Folder structure](./solution-structure.png) diff --git a/docs/lab19/LAB.md b/docs/lab19/LAB.md index 4b15e0f..80e1ac4 100644 --- a/docs/lab19/LAB.md +++ b/docs/lab19/LAB.md @@ -1,81 +1,103 @@ -# 🧲 Lab 19 - Deploying the API +# 🧲 Lab 19 - Deploying the API with custom executor ###### ⏰  Estimated time: 30 minutes ## 📚 Learning outcomes: -- **Explore more advanced usages of the "run-commands" executor** -- **Go through an example of how to deploy an API to Heroku through Nx** +- **Explore creating a custom executor** +- **Go through an example of how to deploy an API to Fly.io through Nx**
## 🏋️‍♀️ Steps : 1. For this workshop you'll need two CLI tools installed: - - [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install) - - Verify installation via: `heroku --version` - - [Docker](https://www.docker.com/get-started) - Verify via `docker --version` + - [Fly CLI](https://fly.io/terminal) + - Verify installation via: `fly version` + - [Docker](https://www.docker.com/get-started) - Verify via `docker --version` +

-
- -2. Let's prepare Heroku to deploy our API: - - ```shell - # login first - heroku login - # create a new Heroku app where we'll deploy the API - heroku create - # Get an authorization token so we don't have to login everytime - heroku authorizations:create - ``` - - ⚠️  Make sure you remember and keep track of these values, as we'll use them later: - - - The authorization "Token" - - The exact app name you used - 👉 This will determine the address where the API will - be deployed to: `https://.herokuapp.com` +2. Let's prepare Fly to deploy our API: -
+ ```shell + # login first + fly auth login + # Get an authorization token so we don't have to login everytime + fly auth token + ``` 3. Let's setup our ENV variables from the beginning now - `apps/api/.local.env` + `apps/api/.local.env` - ``` - HEROKU_API_KEY= - ``` + ``` + FLY_API_TOKEN= + ```
-4. Create a new file `apps/api/Dockerfile` - - ```dockerfile - # use a Node v12 based image - FROM node:12-alpine - # switch to the /app folder in the image - WORKDIR /app - # copy all files from the folder its in into the /app folder we switched to - COPY ./ ./ - # launch the main.js file - CMD node main.js +4. Create a new file `apps/api/src/fly.toml` + + Pick a unique app name to include in the `fly.toml` file. + + 👉 This will determine the address where the API will be deployed to: `https://.fly.dev` + + ```toml + app = "" + kill_signal = "SIGINT" + kill_timeout = 5 + processes = [] + + [build] + builder = "paketobuildpacks/builder:base" + buildpacks = ["gcr.io/paketo-buildpacks/nodejs"] + + [env] + PORT = "8080" + + [experimental] + cmd = ["PORT=8080 node main.js"] + + [[services]] + http_checks = [] + internal_port = 8080 + processes = ["app"] + protocol = "tcp" + script_checks = [] + [services.concurrency] + hard_limit = 25 + soft_limit = 20 + type = "connections" + + [[services.ports]] + force_https = true + handlers = ["http"] + port = 80 + + [[services.ports]] + handlers = ["tls", "http"] + port = 443 + + [[services.tcp_checks]] + grace_period = "1s" + interval = "15s" + restart_limit = 0 + timeout = "2s" ```
❓ What's our plan here? - Heroku allows you to do container deployments. - You define a Docker image that will run your server code. - You then point the Heroku CLI to your image, and it will build it, deploy it, and run it at the remote address. + Fly will launch a pre-build node Docker image (or you could provide your own) and then run the command you specify to launch the server. So the plan is: - - define a Docker image and have it sit idly in our app's source folder + - define a `fly.toml` with instructions for fly to deploy the server - when we want to deploy, we'll build our app to `dist/apps/api` - - we'll then copy this image over to `dist/apps/api` - - because it will be in the same folder as our built assets, it will copy all of them into the container via the `COPY ./ ./` instruction - - and then run the server via `CMD node main.js` -

+ - as part of the build, we need to make sure that our `fly.toml` file makes it into `dist/apps/api` + - Fly will copy the bundled code to the remote server and run the node server via `cmd = ["PORT=8080 node main.js"]` + +
5. If you `nx build api` right now @@ -84,101 +106,134 @@ - 👎 If you copy your built sources to some other folder on your file system. And then try to `node main.js` in that folder that doesn't hace access to `node_modules` - it will fail - 💡 By default, dependencies of server projects are not bundled together, as opposed to your Angular apps. - If curious why, you can [read more here](https://github.com/nestjs/nest/issues/1706#issuecomment-579248915). + 💡 By default, dependencies of server projects are not bundled together, as opposed to your React apps.
-6. Let's fix the above - In `project.json`, under the **production** build options for the API (`projects -> api -> targets -> build -> configurations -> production`) - add this as an option: - - ```json - "externalDependencies": [ - "@nestjs/microservices", - "@nestjs/microservices/microservices-module", - "@nestjs/websockets/socket-module", - "class-transformer", - "class-validator", - "cache-manager" - ], - ``` - -
- ❓ What does this do? - - The above option tells webpack to bundle ALL the dependencies our API requires inside `main.js`, except the ones above (which fail the build if we tell webpack to include, because they're lazily loaded). - Normally, it's not recommended to bundle any dependencies with your server bundles, - but in this case it simplifies the deployment process. -

- -7. Use the `@nx/workspace:run-commands` generator to generate another "deploy" target: - - - This time for the `api` project - - Use the [`--cwd` option](https://nx.dev/latest/angular/workspace/run-commands-executor#cwd) - to ensure all commands execute in the `dist/apps/api` folder - - Leave the "command" blank for now +6. Currently the `fly.toml` that we added to our `api` project is not present if we inspect the `dist/apps/api` directory after running a prod build. We'll need this to be present for our fly deployment. -
+ Update the the `assets` option in the production build options for the API (`targets -> build -> configurations -> production`) -8. Let's customise the generated "deploy" config a bit - - Go to `project.json` and add the commands that we'll need to run: - - ```json - "deploy": { - "executor": "nx:run-commands", - "outputs": [], - "options": { - "commands": [ <--- ADD THESE COMMANDS - "cp ../../../apps/api/Dockerfile .", - "heroku container:login", - "heroku container:push web -a ", - "heroku container:release web -a " - ], - "cwd": "dist/apps/api" - } - }, - ``` + ```json + "assets": [ + "apps/api/src/assets", + "apps/api/src/fly.toml" + ], + ``` -
+7. Use the `@nx/plugin:executor` generator to generate a `fly-deploy` executor: -9. By default, if you give a list of commands to `run-commands`, it will run them in parallel. - In our case, we want them to run one after another. - **See if you can add a configuration option to make them run sequentially** -
+ - The executor should have options for: + - the target `dist` location + - the `name` of your fly app + - When running, your executor should perform the following tasks, using the `fly` cli: + - list the current fly apps: `fly apps list` + - if the app doesn't exist, launch it: `fly launch --now --name= --region=lax` + - if the app does exist, deploy it again: `fly deploy` -10. Let's enable CORS on the server so our API can make requests to it (since they'll be deployed in separate places): - `yarn add cors` or `npm i -S cors` - In `apps/api/src/main.ts` - Enable CORS: - `ts import * as cors from 'cors'; app.use(cors()); ` + Fly launch and deploy commands need to be run in the `dist` location of your app. - ⚠️  Normally, you want to restrict this to just a few origins. But to keep things simple in this workshop we'll enable it for all origins. + Use the `@nx/plugin:executor` to generator an executor in our `internal-plugin` project for this: -
+ ```shell + npx nx generate @nx/plugin:executor fly-deploy --project=internal-plugin + ``` -11. Heroku exposes a `PORT` env variable (capital letters), so we'll need to change our API to support this +8. Adjust the generated `schema.json` and `schema.d.ts` file to match the required options: + + ```json + { + "$schema": "http://json-schema.org/schema", + "cli": "nx", + "title": "FlyDeploy executor", + "description": "", + "type": "object", + "properties": { + "distLocation": { + "type": "string" + }, + "flyAppName": { + "type": "string" + } + }, + "required": ["distLocation", "flyAppName"] + } + ``` - ```typescript - // in apps/api/src/main.ts, capitalize "port" - const port = process.env.PORT || 3000; - ``` + ```typescript + export interface FlyDeployExecutorSchema { + distLocation: string; + flyAppName: string; + } + ``` -
+9. Implement the required fly steps using `execSync` to call the `fly` cli inside your `executor.ts` file: + + ```typescript + import { FlyDeployExecutorSchema } from './schema'; + import { execSync } from 'child_process'; + + export default async function runExecutor( + options: FlyDeployExecutorSchema + ) { + const cwd = options.distLocation; + const results = execSync(`fly apps list`); + if (results.toString().includes(options.flyAppName)) { + execSync(`fly deploy`, { cwd }); + } else { + // consult https://fly.io/docs/reference/regions/ to get best region for you + execSync(`fly launch --now --name=${options.flyAppName} --region=lax`, { + cwd, + }); + } + return { + success: true, + }; + } + ``` + +10. Next we'll need to add a `deploy` target to our `apps/api/project.json` file (don't forget to put your apps name in `flayAppName` field): + + ```json + { + "deploy": { + "executor": "@bg-hoard/internal-plugin:fly-deploy", + "outputs": [], + "options": { + "distLocation": "dist/apps/api", + "flyAppName": "my-unique-app-name" + }, + "dependsOn": [ + { "target": "build", "projects": "self", "params": "forward" } + ] + } + } + ``` -12. Use Nx to build the API for production, and then deploy it! +11. Let's enable CORS on the server so our API can make requests to it (since they'll be deployed in separate places): - `yarn add cors` or `npm i -S cors` - In `apps/api/src/main.ts` - Enable CORS: - ⚠️  Note: On Windows, the deploy will fail. Create a separate `deploy-windows` target, as we did in the previous lab, but use this for the copy command: + ```typescript + import * as cors from 'cors'; + app.use(cors()); + ``` - ```json - "commands": [ - "xcopy \"..\\..\\..\\apps\\api\\Dockerfile\" .", - .... - ``` + ⚠️ Normally, you want to restrict this to just a few origins. But to keep things simple in this workshop we'll enable it for all origins. +

- ⚠️  Note: On Apple M1 commputers the deployement will succeed, but running Docker image on heroku app will fail due to unsupported ARM architecture. Don't worry you will still deploy your api via `GitHub` in the [Lab 21](../lab21/LAB.md). You can head over there and then come back to lab 20. +12. Now run the command to deploy your api!! -
+ ```shell + npx nx deploy api --prod + ``` -13. Go to `https://.herokuapp.com/api/games` - it should return you a list of games. -
+ Because of how we set up our `dependsOn` for the `deploy` target, Nx will know that it needs to run (or pull from the cache if you already ran it) the production build of the api before then running the deploy! + +13. Go to `https://.fly.dev/api/games` - it should return you a list of games. + + ⚠️ Since we are on a free tier, it might take some time for application to become available +

+ +14. **BONUS** - What would a meaningful test be for your new executor? Add it to `libs/internal-plugin/src/executors/fly-deploy/executors.spec.ts` --- diff --git a/docs/lab19/SOLUTION.md b/docs/lab19/SOLUTION.md index 2ffcb17..b8b2807 100644 --- a/docs/lab19/SOLUTION.md +++ b/docs/lab19/SOLUTION.md @@ -1,24 +1,40 @@ ##### Creating an API builder ```shell -nx generate run-commands deploy --project=api --cwd="dist/apps/api" +npx nx g @nx/plugin:executor --name=fly-deploy --project=internal-plugin ``` -##### The full deploy config for the API +##### BONUS: Executor test -``` -"deploy": { - "executor": "nx:run-commands", - "outputs": [], - "options": { - "commands": [ - "cp ../../../apps/api/Dockerfile .", - "heroku container:login", - "heroku container:push web -a ", - "heroku container:release web -a " - ], - "cwd": "dist/apps/api", - "parallel": false - } -}, +```typescript +import { FlyDeployExecutorSchema } from './schema'; +import executor from './executor'; +jest.mock('child_process', () => ({ + execSync: jest.fn(), +})); +import { execSync } from 'child_process'; + +describe('FlyDeploy Executor', () => { + beforeEach(() => { + (execSync as any) = jest.fn(); + }); + + it('runs the correct fly cli commands', async () => { + const options: FlyDeployExecutorSchema = { + distLocation: 'dist/apps/foo', + flyAppName: 'foo', + }; + const output = await executor(options); + expect(output.success).toBe(true); + expect(execSync).toHaveBeenCalledWith(`fly apps list`, { + cwd: 'dist/apps/foo', + }); + expect(execSync).toHaveBeenCalledWith( + `fly launch --now --name=foo --region=lax`, + { + cwd: 'dist/apps/foo', + } + ); + }); +}); ``` diff --git a/docs/lab2/LAB.md b/docs/lab2/LAB.md index 1587588..3cc8a5a 100644 --- a/docs/lab2/LAB.md +++ b/docs/lab2/LAB.md @@ -32,7 +32,7 @@ In this lab we'll generate our first React application within the new monorepo. 3. Add the React plugin: `npm i -S @nx/react` (or `yarn add @nx/react` or `pnpm add @nx/react`)
-4. Let's also add Material UI so we can use some of their components: `npm i -S @material-ui/core` (or `yarn add @material-ui/core` or `pnpm add @material-ui/core`) +4. Let's also add Material UI so we can use some of their components: `npm i -S @mui/material @emotion/react @emotion/styled` (or `yarn add ...` or `pnpm add ...`)
5. Use the [`@nx/react` plugin](https://nx.dev/nx-api/react/generators/application) to generate an React app called `store` in your new workspace diff --git a/docs/lab2/SOLUTION.md b/docs/lab2/SOLUTION.md index 295c978..00fae07 100644 --- a/docs/lab2/SOLUTION.md +++ b/docs/lab2/SOLUTION.md @@ -1,3 +1,5 @@ ##### To generate a new React application: -`nx generate @nx/react:application store` (or `nx g app store`) +```shell +nx generate @nx/react:application store --directory=apps/store # or `nx g app store --directory=apps/store` +``` diff --git a/docs/lab20/LAB.md b/docs/lab20/LAB.md index f4ae96e..250af9f 100644 --- a/docs/lab20/LAB.md +++ b/docs/lab20/LAB.md @@ -4,8 +4,8 @@ ## 📚 Learning outcomes: -- **Configure the Angular app for production** -
+- **Configure the React app for production** +
## 🏋️‍♀️ Steps: @@ -22,27 +22,28 @@ a production URL for the API. ``` ⚠️  Nx automatically replaces any env var prefixed with `NX_` in your code. We are allowing devs to override the API URL above via an env variable. -
+
2. Do the same in `libs/store/feature-game-detail/src/lib/game-detail/game-detail.tsx`: ```typescript fetch((process.env.NX_API_URL ?? '') + `/api/games/${gameId}`); ``` -
-3. Point your local apps to your Heroku API. +
+ +3. Point your local apps to your Fly.io API. 1. Make sure your API is not running locally - 2. Serve your app with `NX_API_URL=https://.herokuapp.com nx serve store` - 3. You should see the games being loaded from Heroku -
+ 2. Serve your app with `NX_API_URL=https://.fly.dev nx serve store` + 3. You should see the games being loaded from Fly.io +
4. Build the Store for production (make sure to make the `NX_API_URL` env var available when building) and trigger a deployment -
+
5. Go to your Surge deployment URL - you should now see the full app with all the games. -
+
--- diff --git a/docs/lab21-alt/LAB.md b/docs/lab21-alt/LAB.md index 15528ec..c5e5098 100644 --- a/docs/lab21-alt/LAB.md +++ b/docs/lab21-alt/LAB.md @@ -6,71 +6,68 @@ - **Understand how to configure a simple Continuous Deployment system using Nx and GitHub actions** - **Learn how to expose custom secrets on GitHub to your CD processes** -
+
## 🏋️‍♀️ Steps : -In this lab we'll be setting up GitHub actions to build and deploy our projects whenever changes go into the `master` branch. - -1. Add a `.github/workflows/deploy.yml` file -
- -2. Using your `ci.yml` config as an example, see if you can configure automated deployments from the `master` branch: - - Anytime we push or merge something to the `master` branch it should: - - build the `store` and `admin-ui` for production - - deploy the `store` and `admin-ui` - - We'll start you off: - - ```yml - name: Deploy Website - - on: - push: - branches: - - master <-- workflow will run everytime we push or merge something to master - jobs: - build: - runs-on: ubuntu-latest - name: Deploying apps - steps: - .... <-- ADD THE STEPS HERE - ``` -
- -3. Our "deploy" targets are using some secret ENV variables though. We'll need to make these available on GitHub: - 1. Go to your GitHub workshop repo - 2. Click on **"Settings"** at the top - 3. Then **"Secrets"** on the left menu bar - 4. Add values for all the variables we've been keeping in `.local.env` files - - ![GitHub secrets](./github_secrets.png) -
- -4. Then back in our `deploy.yml` file, let's expose these secrets to the processes (use `ci.yml` as an example of where to put these): +In this lab we'll be setting up GitHub actions to build and deploy our projects whenever changes go into the `main` branch. + +1. Add a `.github/workflows/deploy.yml` file +
+ +2. Using your `ci.yml` config as an example, see if you can configure automated deployments from the `main` branch: + + Anytime we push or merge something to the `main` branch it should: + + - build the `store` and `admin-ui` for production + - deploy the `store` and `admin-ui` + + We'll start you off: ```yml - env: - SURGE_DOMAIN_STORE: ${{ secrets.SURGE_DOMAIN_STORE }} - SURGE_DOMAIN_ADMIN_UI: ${{ secrets.SURGE_DOMAIN_ADMIN_UI }} - SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} + name: Deploy Website + + on: + push: + branches: + - main <-- workflow will run everytime we push or merge something to main + jobs: + build: + runs-on: ubuntu-latest + name: Deploying apps + steps: .... <-- ADD THE STEPS HERE ``` -
-5. Since we'll be re-deploying, we want to test if we're looking at a new version of our code: - - Make a change to your AdminUI (maybe change the text in the header) - - Make a change to your Store (maybe change the title in the header) -
+
+ +3. Our "deploy" targets are using some secret ENV variables though. We'll need to make these available on GitHub: 1. Go to your GitHub workshop repo 2. Click on **"Settings"** at the top 3. Then **"Secrets"** on the left menu bar 4. Add values for all the variables we've been keeping in `.local.env` files + + ![GitHub secrets](./github_secrets.png) + +
+ +4. Then back in our `deploy.yml` file, let's expose these secrets to the processes (use `ci.yml` as an example of where to put these): + + ```yml + env: + SURGE_DOMAIN_STORE: ${{ secrets.SURGE_DOMAIN_STORE }} + SURGE_DOMAIN_ADMIN_UI: ${{ secrets.SURGE_DOMAIN_ADMIN_UI }} + SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} + ``` + +
+ +5. Since we'll be re-deploying, we want to test if we're looking at a new version of our code: - Make a change to your AdminUI (maybe change the text in the header) - Make a change to your Store (maybe change the title in the header) +
-6. Commit everything locally on `master` and then push (it's important we push to the `master` branch as that's where our workflow runs) -
+6. Commit everything locally on `main` and then push (it's important we push to the `main` branch as that's where our workflow runs) +
-7. You should see your new workflow start up under the "Actions" tab on your GitHub repo -
+7. You should see your new workflow start up under the "Actions" tab on your GitHub repo +
-8. Once it's done, navigate to your frontend Surge deployment URLs and test if you notice the new changes -
+8. Once it's done, navigate to your frontend Surge deployment URLs and test if you notice the new changes +
--- diff --git a/docs/lab21-alt/SOLUTION.md b/docs/lab21-alt/SOLUTION.md index 4d8a944..7d6add8 100644 --- a/docs/lab21-alt/SOLUTION.md +++ b/docs/lab21-alt/SOLUTION.md @@ -1,6 +1,6 @@ ##### GitHub CD setup -``` +```yaml name: Deploy Website on: @@ -18,9 +18,9 @@ jobs: runs-on: ubuntu-latest name: Deploying apps steps: - - uses: actions/checkout@v2.3.4 - - uses: bahmutov/npm-install@v1.4.5 - - run: npm run nx build store -- --configuration=production + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1 + - run: npm run nx build store - run: npm run nx build admin-ui -- --configuration=production - run: npm run nx deploy store - run: npm run nx deploy admin-ui diff --git a/docs/lab21/LAB.md b/docs/lab21/LAB.md index 8d7ab4e..e9b163e 100644 --- a/docs/lab21/LAB.md +++ b/docs/lab21/LAB.md @@ -10,11 +10,11 @@ ## 🏋️‍♀️ Steps : 1. Add a `.github/workflows/deploy.yml` file -
+
-2. Using your `ci.yml` config as an example, see if you can configure automated deployments from the `master` branch: +2. Using your `ci.yml` config as an example, see if you can configure automated deployments from the `main` branch: - Anytime we push or merge something to the `master` branch it: + Anytime we push or merge something to the `main` branch it: - builds the `store` and `api` for production - deploys the `store` and `api` @@ -27,14 +27,15 @@ on: push: branches: - - master <-- workflow will run everytime we push or merge something to master + - main <-- workflow will run everytime we push or merge something to main jobs: build: runs-on: ubuntu-latest name: Deploying apps steps: .... <-- ADD THE STEPS HERE ``` -
+ +
3. Our "deploy" targets are using some secret ENV variables though. We'll need to make these available on GitHub: @@ -44,7 +45,7 @@ 4. Add values for all the variables we've been keeping in `.local.env` files ![GitHub secrets](./github_secrets.png) -
+
4. Then back in our `deploy.yml` file, let's expose these secrets to the processes (use `ci.yml` as an example of where to put these): @@ -52,24 +53,26 @@ env: SURGE_DOMAIN_STORE: ${{ secrets.SURGE_DOMAIN_STORE }} SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} - HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} - NX_API_URL: https://.herokuapp.com + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + NX_API_URL: https://.fly.dev ``` -
+ +
5. Since we'll be re-deploying, we want to test if we're looking at a new version of our code: + - Make a change to your API (maybe change the name of one of the games) - Make a change to your Store (maybe change the title in the header) -
+
-6. Commit everything locally on `master` and then push (it's important we push to the `master` branch as that's where our workflow runs) -
+6. Commit everything locally on `main` and then push (it's important we push to the `main` branch as that's where our workflow runs) +
7. You should see your new workflow start up under the "Actions" tab on your GitHub repo -
+
8. Once it's done, navigate to your frontend Surge deployment URL and test if you notice the new changes (the ones you made to the Store and also to the API) -
+
--- diff --git a/docs/lab21/SOLUTION.md b/docs/lab21/SOLUTION.md index 8a3f760..c705955 100644 --- a/docs/lab21/SOLUTION.md +++ b/docs/lab21/SOLUTION.md @@ -1,6 +1,6 @@ ##### GitHub CD setup -``` +```yaml name: Deploy Website on: @@ -11,17 +11,17 @@ on: env: SURGE_DOMAIN_STORE: ${{ secrets.SURGE_DOMAIN_STORE }} SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} - HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} - NX_API_URL: https://.herokuapp.com + FLY_API_TOKEN: \${{ secrets.FLY_API_TOKEN }} + NX_API_URL: https://.fly.dev jobs: build: runs-on: ubuntu-latest name: Deploying apps steps: - - uses: actions/checkout@v2.3.4 - - uses: bahmutov/npm-install@v1.4.5 - - run: npm run nx build store -- --configuration=production + - uses: actions/checkout@v4 + - uses: bahmutov/npm-install@v1 + - run: npm run nx build store - run: npm run nx build api -- --configuration=production - run: npm run nx deploy store - run: npm run nx deploy api diff --git a/docs/lab22/LAB.md b/docs/lab22/LAB.md index a70a93f..09524f0 100644 --- a/docs/lab22/LAB.md +++ b/docs/lab22/LAB.md @@ -6,93 +6,96 @@ - **Explore an advanced example of `nx affected` by deploying only the affected apps on the master branch** - **Understand how to configure the `base` commit for `nx affected` in a CD scenario** -
+
## 🏋️‍♀️ Steps : In the previous labs we set up automatic deployments. But everytime we push to master, we're always building and running the deployment scripts for ALL the apps in our workspace. As our repo grows, this is not scalable. We only want to build and deploy the apps that have actually changed, and need re-deploying. -1. Update your `deploy.yml` file so that it builds only the affected apps, and it deploys only the affected apps - - ⚠️  You can compare against the previous commit for now: `--base=HEAD~1` -
+1. Update your `deploy.yml` file so that it builds only the affected apps, and it deploys only the affected apps -2. If you haven't already, ensure you run your "affected" commands in parallel -
+ ⚠️  You can compare against the previous commit for now: `--base=HEAD~1` -3. Commit everything -
+
-4. Now make a change just to the `store`. Maybe update the title again - - Commit and push - - Inspect your workflow on the GitHub actions tab - it should only be building and deploying +2. If you haven't already, ensure you run your "affected" commands in parallel +
+ +3. Commit everything +
+ +4. Now make a change just to the `store`. Maybe update the title again - Commit and push - Inspect your workflow on the GitHub actions tab - it should only be building and deploying whatever changed **in the last commit**: only the Store. -
+
--- ⛔ The problem now is that it's always comparing against the last commit: -- Let's say I make some changes to the API (or AdminUI) over a few commits - and I don't push them. -- Then I make one small change to the Store, commit it, and push to master. +- Let's say I make some changes to the API (or AdminUI) over a few commits - and I don't push them. +- Then I make one small change to the Store, commit it, and push to master. - Even though **I've pushed lots of commits with changes to both the Store and the API** (or AdminUI), because our CD Workflow is only looking at the last commit, **it will only deploy the Store.** 👎
There is also the problem of potential failures 🧨 - Now our setup is simple: it just builds. - But let's say we wanted to run the E2E tests again before deploying - just to be extra safe! - In that case, if I change the API (or AdminUI) and push, the E2E tests might fail. So API (or AdminUI) will not get deployed. - I then fix the E2E tests, but because the API (or AdminUI) does not depend on its E2E tests, `nx affected` will not mark it for deployment. - So even though we changed the API (or AdminUI), it did not get deployed. + Now our setup is simple: it just builds. + But let's say we wanted to run the E2E tests again before deploying - just to be extra safe! + In that case, if I change the API (or AdminUI) and push, the E2E tests might fail. So API (or AdminUI) will not get deployed. + I then fix the E2E tests, but because the API (or AdminUI) does not depend on its E2E tests, `nx affected` will not mark it for deployment. + So even though we changed the API (or AdminUI), it did not get deployed.
💡 Solution: **last successful commit!** -- If we constantly compare against **the last commit where all the affected apps got succesfully deployed** - we -will never miss a deployment + +- If we constantly compare against **the last commit where all the affected apps got succesfully deployed** - we + will never miss a deployment - In our case, "successfully deployed" means when our `deploy.yml` workflow completes without errors. That's a succesful commit! - Getting the last successful commit is different on each platform: - - [Netlify has the `CACHED_COMMIT_REF`](https://docs.netlify.com/configure-builds/environment-variables/#git-metadata) - - On CircleCI, we can use the `<< pipeline.git.base_revision >>` - - For GitHub actions, we can use the `nrwl/nx-set-shas` action + - [Netlify has the `CACHED_COMMIT_REF`](https://docs.netlify.com/configure-builds/environment-variables/#git-metadata) + - On CircleCI, we can use the `<< pipeline.git.base_revision >>` + - For GitHub actions, we can use the `nrwl/nx-set-shas` action --- -5. Right after the `npm-install` step, let's trigger the action to get the last successful commit: - - ```yml - - uses: bahmutov/npm-install@v1 - - uses: nrwl/nx-set-shas@v2 - with: - main-branch-name: 'main' # remember to set this correctly - ``` -
- -6. You can now use the output from the above action in your affected commands: - - ```bash - --base=${{ env.NX_BASE }} - ``` -
- -7. By default, the `actions/checkout@v2` action only fetches the last commit (for efficiency). But since we now might want to compare against a larger range of commits, we need to tell it to fetch more: - - ```yaml - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - ``` -
- -8. Commit everything and push. Let it build. It should compare against the immediately previous commit (because your workflow ran against it, and it passed) -
- -9. Try to go through one of the problematic scenarios described above. It should now work, and it should build both the API (or AdminUI) and the Store (instead of just the Store) - - > Let's say I make some changes to the API (or AdminUI) over a few commits - and I don't push them. Then I make one small change to the Store, commit it, and push to master. - Even though I've pushed lots of commits with changes to both the Store and the API (or AdminUI), because our CD Workflow is only looking at the last commit, it will only deploy the Store. -
+5. Right after the `npm-install` step, let's trigger the action to get the last successful commit: + + ```yml + - uses: bahmutov/npm-install@v1 + - uses: nrwl/nx-set-shas@v4 + with: + main-branch-name: 'main' # remember to set this correctly + ``` + +
+ +6. You can now use the output from the above action in your affected commands: + + ```bash + --base=${{ env.NX_BASE }} + ``` + +
+ +7. By default, the `actions/checkout` action only fetches the last commit (for efficiency). But since we now might want to compare against a larger range of commits, we need to tell it to fetch more: + + ```yaml + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ``` + +
+ +8. Commit everything and push. Let it build. It should compare against the immediately previous commit (because your workflow ran against it, and it passed) +
+ +9. Try to go through one of the problematic scenarios described above. It should now work, and it should build both the API (or AdminUI) and the Store (instead of just the Store) + +> Let's say I make some changes to the API (or AdminUI) over a few commits - and I don't push them. Then I make one small change to the Store, commit it, and push to master. +> Even though I've pushed lots of commits with changes to both the Store and the API (or AdminUI), because our CD Workflow is only looking at the last commit, it will only deploy the Store. +>
--- diff --git a/docs/lab22/SOLUTION.md b/docs/lab22/SOLUTION.md index 57d68ed..99575ab 100644 --- a/docs/lab22/SOLUTION.md +++ b/docs/lab22/SOLUTION.md @@ -1,6 +1,6 @@ ##### The full deploy script -``` +```yaml name: Deploy Website on: @@ -11,18 +11,19 @@ on: env: SURGE_DOMAIN_STORE: ${{ secrets.SURGE_DOMAIN_STORE }} SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} - HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} + FLY_API_TOKEN: \${{ secrets.FLY_API_TOKEN }} + NX_API_URL: https://.fly.dev jobs: build: runs-on: ubuntu-latest name: Deploying apps steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: bahmutov/npm-install@v1 - - uses: nrwl/nx-set-shas@v2 + - uses: nrwl/nx-set-shas@v4 with: main-branch-name: 'main' # remember to set this correctly - run: npm run nx affected -- --target=build --base=${{ env.NX_BASE }} --parallel --configuration=production diff --git a/docs/lab3/SOLUTION.md b/docs/lab3/SOLUTION.md index b220c41..8fc07b2 100644 --- a/docs/lab3/SOLUTION.md +++ b/docs/lab3/SOLUTION.md @@ -1,7 +1,7 @@ -##### To build the app for development: +##### To build the app for production: `nx build store` -##### To build the app for production: +##### To build the app for development: -`nx build store --configuration=production` +`nx build store --configuration=development` diff --git a/docs/lab4/LAB.md b/docs/lab4/LAB.md index 13f1622..053174a 100644 --- a/docs/lab4/LAB.md +++ b/docs/lab4/LAB.md @@ -17,72 +17,71 @@ Let's add a header to our app! Because headers can be shared with other componen ## 🏋️‍♀️ Steps: -1. Stop the `nx serve` -
+1. Stop the `nx serve` +
-2. Generate a new empty React library called `store-ui-shared` in the `libs/store/ui-shared` folder. When asked, choose `jest` as test runner, the `rollup` as a bundler and `as-provided` naming convention. +2. Generate a new empty React library called `store-ui-shared` in the `libs/store/ui-shared` folder. When asked, choose `jest` as test runner, the `rollup` as a bundler and `as-provided` naming convention. -
- 🐳   Hint - - - it's a generator! you've used it before in the second lab, but instead of an `app`, we now want to generate a `lib` - - use the `--help` command to figure out how to generate it in a **directory** and that it doesn’t create default component +
+ 🐳   Hint -

+ - it's a generator! you've used it before in the second lab, but instead of an `app`, we now want to generate a `lib` + - use the `--help` command to figure out how to generate it in a **directory** and that it doesn’t create default component -3. Generate a new React component, called `header`, inside the `src/lib` folder of the library you just created +

- ⚠️  Play around with the generator options so that the generated component is automatically **exported** from the lib's module +3. Generate a new React component, called `header`, inside the `src/lib` folder of the library you just created -
🐳   Hint + ⚠️  Play around with the generator options so that the generated component is automatically **exported** from the lib's module - use `--help` to figure out how to specify under which **project** you want to generate the new component and how to automatically have it **exported** and skip the component generation +
🐳   Hint -

+ use `--help` to figure out how to specify under which **project** you want to generate the new component and how to automatically have it **exported** and skip the component generation -4. Replace the `header` component's [code](../../examples/lab4/libs/store/ui-shared/src/lib/header/header.tsx) -
+

-5. Let's use the new shared header component we created +4. Replace the `header` component's [code](../../examples/lab4/libs/store/ui-shared/src/lib/header/header.tsx) +
- - Add your new component to `apps/store/src/app/app.tsx` +5. Let's use the new shared header component we created -
- 🐳   Hint + - Add your new component to `apps/store/src/app/app.tsx` - ```typescript - import { Header } from '@bg-hoard/store/ui-shared'; - ``` +
+ 🐳   Hint - ```html -
- -
- ``` + ```typescript + import { Header } from '@bg-hoard/store-ui-shared'; + ``` - Wrap the App component in a fragment (`<>` and ``) + ```html +
+ +
+ ``` -
+ Wrap the App component in a fragment (`<>` and ``) - ⚠️  You might need to restart the TS compiler in your editor (`CTRL+SHIFT+P` in VSCode and search for `Restart Typescript`) -
+
-6. Serve the project and test the changes -
+ ⚠️  You might need to restart the TS compiler in your editor (`CTRL+SHIFT+P` in VSCode and search for `Restart Typescript`) +
-7. Run the command to inspect the dependency graph - What do you see? (Remember to "Select all" in the top left corner) -
- 🐳   Hint +6. Serve the project and test the changes +
- ```bash - nx graph - ``` +7. Run the command to inspect the dependency graph - What do you see? (Remember to "Select all" in the top left corner) +
+ 🐳   Hint -

+ ```bash + nx graph + ``` -8. Inspect what changed from the last time you committed, then commit your changes -
+

+8. Inspect what changed from the last time you committed, then commit your changes +
--- diff --git a/docs/lab5/LAB.md b/docs/lab5/LAB.md index 615f98b..00c7e51 100644 --- a/docs/lab5/LAB.md +++ b/docs/lab5/LAB.md @@ -36,7 +36,7 @@ We will create a shared utility lib where we'll add our formatters and see how t `app.tsx`: ```ts - import { formatRating } from '@bg-hoard/store/util-formatters'; + import { formatRating } from '@bg-hoard/store-util-formatters'; ``` ```html diff --git a/docs/lab6/SOLUTION.md b/docs/lab6/SOLUTION.md index 1d93072..53e5681 100644 --- a/docs/lab6/SOLUTION.md +++ b/docs/lab6/SOLUTION.md @@ -1,5 +1,5 @@ ##### Generate a route lib in a specific directory that is pre-configured with a certain parent app ```bash -nx generate @nx/react:library feature-game-detail --directory=store --appProject=store +nx generate @nx/react:library store-feature-game-detail --directory=libs/store/feature-game-detail --appProject=store ``` diff --git a/docs/lab7/SOLUTION.md b/docs/lab7/SOLUTION.md index acf9252..4800441 100644 --- a/docs/lab7/SOLUTION.md +++ b/docs/lab7/SOLUTION.md @@ -1,3 +1,3 @@ ##### Generate a new Express API app, and configure the proxy to the `store` project -`nx generate @nx/express:application api --frontendProject=store` +`nx generate @nx/express:application api --directory=apps/store --frontendProject=store` diff --git a/docs/lab9/SOLUTION.md b/docs/lab9/SOLUTION.md index bb87feb..b61e416 100644 --- a/docs/lab9/SOLUTION.md +++ b/docs/lab9/SOLUTION.md @@ -1,7 +1,7 @@ ##### Generate a new type lib for the API ```shell -nx generate @nx/js:lib util-interface --directory=api +nx generate @nx/js:lib api-util-interface --directory=libs/api/util-interface ``` ##### Use the `move` generator to move a nested lib to root diff --git a/examples/lab2/apps/store/src/app/app.tsx b/examples/lab2/apps/store/src/app/app.tsx index f26f0f6..f80338c 100644 --- a/examples/lab2/apps/store/src/app/app.tsx +++ b/examples/lab2/apps/store/src/app/app.tsx @@ -1,11 +1,11 @@ import styles from './app.module.scss'; import { getAllGames } from '../fake-api'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Typography from '@mui/material/Typography'; export const App = () => { return ( diff --git a/examples/lab4/libs/store/ui-shared/src/lib/header/header.tsx b/examples/lab4/libs/store/ui-shared/src/lib/header/header.tsx index 5786758..e789af0 100644 --- a/examples/lab4/libs/store/ui-shared/src/lib/header/header.tsx +++ b/examples/lab4/libs/store/ui-shared/src/lib/header/header.tsx @@ -1,31 +1,16 @@ -import { makeStyles } from '@material-ui/core/styles'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import Typography from '@material-ui/core/Typography'; - -const useStyles = makeStyles((theme) => ({ - root: { - flexGrow: 1, - }, - menuButton: { - marginRight: theme.spacing(2), - }, - title: { - flexGrow: 1, - }, -})); +import AppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import Typography from '@mui/material/Typography'; export interface HeaderProps { - title: string + title: string; } export const Header = ({ title }: HeaderProps) => { - const classes = useStyles(); - return ( - + {title} diff --git a/examples/lab6/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx b/examples/lab6/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx index d9d4fa1..acf1174 100644 --- a/examples/lab6/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx +++ b/examples/lab6/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx @@ -1,10 +1,10 @@ import { useParams } from 'react-router-dom'; import styles from './store-feature-game-detail.module.scss'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import Typography from '@material-ui/core/Typography'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import Typography from '@mui/material/Typography'; /* eslint-disable-next-line */ export interface StoreFeatureGameDetailProps {} diff --git a/examples/lab8/apps/store/src/app/app.tsx b/examples/lab8/apps/store/src/app/app.tsx index 8cd2bee..4fdcb1c 100644 --- a/examples/lab8/apps/store/src/app/app.tsx +++ b/examples/lab8/apps/store/src/app/app.tsx @@ -1,20 +1,16 @@ import { useEffect, useState } from 'react'; - -import styles from './app.module.scss'; - -import { Header } from '@bg-hoard/store/ui-shared'; - -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; - -import { formatRating } from '@bg-hoard/store/util-formatters'; - import { Routes, Route, Link } from 'react-router-dom'; -import { StoreFeatureGameDetail } from '@bg-hoard/store/feature-game-detail'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Typography from '@mui/material/Typography'; + +import styles from './app.module.scss'; +import { Header } from '@bg-hoard/store-ui-shared'; +import { formatRating } from '@bg-hoard/store-util-formatters'; +import { StoreFeatureGameDetail } from '@bg-hoard/store-feature-game-detail'; export const App = () => { const [state, setState] = useState<{ diff --git a/examples/lab8/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx b/examples/lab8/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx index ed9819f..e60c934 100644 --- a/examples/lab8/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx +++ b/examples/lab8/libs/store/feature-game-detail/src/lib/store-feature-game-detail/store-feature-game-detail.tsx @@ -2,14 +2,14 @@ import { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import styles from './game-detail.module.scss'; -import Button from '@material-ui/core/Button'; -import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; -import CardHeader from '@material-ui/core/CardHeader'; -import CardContent from '@material-ui/core/CardContent'; -import Typography from '@material-ui/core/Typography'; -import CardMedia from '@material-ui/core/CardMedia'; -import { formatRating } from '@bg-hoard/store/util-formatters'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardActions from '@mui/material/CardActions'; +import CardHeader from '@mui/material/CardHeader'; +import CardContent from '@mui/material/CardContent'; +import Typography from '@mui/material/Typography'; +import CardMedia from '@mui/material/CardMedia'; +import { formatRating } from '@bg-hoard/store-util-formatters'; /* eslint-disable-next-line */ export interface StoreFeatureGameDetailProps {} @@ -88,6 +88,6 @@ export function StoreFeatureGameDetail(props: StoreFeatureGameDetailProps) { )} ); -}; +} export default StoreFeatureGameDetail; diff --git a/jest.config.ts b/jest.config.ts index b1390d2..a293995 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,4 +1,4 @@ -const { getJestProjects } = require('@nx/jest'); +import { getJestProjects } from '@nx/jest'; export default { projects: [...getJestProjects(), '/apps/nx-workshop-e2e'], diff --git a/libs/nx-react-workshop/README.md b/libs/nx-react-workshop/README.md index 57ab5ab..c50692b 100644 --- a/libs/nx-react-workshop/README.md +++ b/libs/nx-react-workshop/README.md @@ -1,7 +1,20 @@ -# nx-react-workshop +# Nx React Workshop utility -This library was generated with [Nx](https://nx.dev). +This utility is used to provide automatic lab completion during the [**Nx React Workshop**](https://github.com/nrwl/nx-react-workshop). + +## Catching up with missed labs + +If you fall behind or join late, we provide migrations that would bring your repository up to date with desired lab. To use the migrarions follow the next steps: -## Running unit tests +1. Install `@nrwl/nx-react-workshop` package as dev dependency (e.g. `yarn add -D @nrwl/nx-react-workshop`). If you finished [Lab 3.1 - Migrations](docs/lab3.1/LAB.md) then you should already have it installed. +2. Run the generator with one of the following options: + - Provide `lab` you want to complete: `nx g @nrwl/nx-react-workshop:complete-labs --lab=5` or + - Use `from` range to finish until end: `nx g @nrwl/nx-react-workshop:complete-labs --from=2` + - Use `to` range to catch up with given lab: `nx g @nrwl/nx-react-workshop:complete-labs --to=5` + - Use `from/to` range to catch up with several labs in between: `nx g @nrwl/nx-react-workshop:complete-labs --from=2 --from=7` + - Use `option` to specify if you want **track 1** or **track 2**: `nx g @nrwl/nx-react-workshop:complete-labs --from=19 --option=option2` (default option is track 2) +3. Finnally, run the the migrations `npx nx migrate --run-migrations` to have that code generated. -Run `nx test nx-react-workshop` to execute the unit tests via [Jest](https://jestjs.io). +--- + +This library was generated with [Nx](https://nx.dev). diff --git a/libs/nx-react-workshop/package.json b/libs/nx-react-workshop/package.json index 69ef4f5..1efa574 100644 --- a/libs/nx-react-workshop/package.json +++ b/libs/nx-react-workshop/package.json @@ -1,6 +1,6 @@ { "name": "@nrwl/nx-react-workshop", - "version": "0.1.26", + "version": "0.2.1", "main": "src/index.js", "generators": "./generators.json", "executors": "./executors.json", @@ -12,11 +12,12 @@ "cors": "*", "node-fetch": "^2.x", "surge": "*", - "@nx/workspace": "16.1.4", - "@nx/storybook": "16.1.4", - "@nx/plugin": "16.1.4", - "@nx/express": "16.1.4", - "@nx/react": "16.1.4", - "@nx/nest": "16.1.4" + "@nx/workspace": "17.0.2", + "@nx/storybook": "17.0.2", + "@nx/plugin": "17.0.2", + "@nx/express": "17.0.2", + "@nx/react": "17.0.2", + "@nx/nest": "17.0.2", + "@nx/next": "17.0.2" } } diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-1/complete-lab-1.ts b/libs/nx-react-workshop/src/migrations/complete-lab-1/complete-lab-1.ts index e1a80ac..6326611 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-1/complete-lab-1.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-1/complete-lab-1.ts @@ -4,7 +4,6 @@ import { Tree, updateJson, getProjects, - addDependenciesToPackageJson, installPackagesTask, readJson, } from '@nx/devkit'; diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-10/complete-lab-10.ts b/libs/nx-react-workshop/src/migrations/complete-lab-10/complete-lab-10.ts index 6bfaaa5..4b7fbf0 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-10/complete-lab-10.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-10/complete-lab-10.ts @@ -16,22 +16,8 @@ export default async function update(host: Tree) { // nx generate @nx/react:storybook-configuration store-ui-shared await storybookConfigurationGenerator(host, { name: 'store-ui-shared', - configureCypress: true, + configureCypress: false, generateStories: true, - generateCypressSpecs: true, + interactionTests: true, }); - host.write( - 'apps/store-ui-shared-e2e/src/e2e/header/header.cy.ts', - ` - describe('store-ui-shared: Header component', () => { - beforeEach(() => - cy.visit('/iframe.html?id=header--primary&args=title:BoardGameHoard') - ); - - it('should show the title', () => { - cy.get('h6').contains('Board Game Hoard'); - }); - }); - ` - ); } diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-11/complete-lab-11.ts b/libs/nx-react-workshop/src/migrations/complete-lab-11/complete-lab-11.ts index a0ebe68..b70e47d 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-11/complete-lab-11.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-11/complete-lab-11.ts @@ -3,17 +3,33 @@ import { Tree } from '@nx/devkit'; export default function update(host: Tree) { host.write( - 'apps/store-ui-shared-e2e/src/e2e/header/header.cy.ts', - ` - describe('store-ui-shared: Header component', () => { - beforeEach(() => - cy.visit('/iframe.html?id=header--primary&args=title:BoardGameHoard') - ); + 'libs/store/ui-shared/src/lib/header/header.stories.tsx', + `import type { Meta, StoryObj } from '@storybook/react'; + import { Header } from './header'; + + import { within } from '@storybook/testing-library'; + import { expect } from '@storybook/jest'; + + const meta: Meta = { + component: Header, + title: 'Header', + }; + export default meta; + type Story = StoryObj; + + export const Primary = { + args: {}, + }; - it('should show the title', () => { - cy.get('h6').contains('Board Game Hoard'); - }); - }); + export const Heading: Story = { + args: { + title: 'Welcome to Board Game Hoard', + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + expect(canvas.getByText(/Welcome to Board Game Hoard/gi)).toBeTruthy(); + }, + }; ` ); } diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-12/complete-lab-12.ts b/libs/nx-react-workshop/src/migrations/complete-lab-12/complete-lab-12.ts index 4eaf41e..c52a4b7 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-12/complete-lab-12.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-12/complete-lab-12.ts @@ -30,10 +30,6 @@ export default function update(host: Tree) { 'util-interface': { tags: ['scope:shared', 'type:util'], }, - 'store-ui-shared-e2e': { - tags: ['scope:store', 'type:e2e'], - implicitDependencies: ['store-ui-shared'], - }, }; process.env.NX_PROJECT_GLOB_CACHE = 'false'; Object.keys(projectUpdates).forEach((projectName) => { @@ -82,7 +78,7 @@ describe('Dependencies', () => { it('should fail linting when tag rules are applied', async () => { writeFileSync( 'libs/util-interface/src/index.ts', - \`import {} from '@bg-hoard/store/ui-shared'; + \`import {} from '@bg-hoard/store-ui-shared'; export * from './lib/api-util-interface'; \` diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-13/complete-lab-13a.ts b/libs/nx-react-workshop/src/migrations/complete-lab-13/complete-lab-13a.ts index b864b24..dbe9de9 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-13/complete-lab-13a.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-13/complete-lab-13a.ts @@ -8,6 +8,8 @@ export default async function update(host: Tree) { process.env.NX_PROJECT_GLOB_CACHE = 'false'; await pluginGenerator(host, { name: 'internal-plugin', + directory: 'libs/internal-plugin', + projectNameAndRootFormat: 'as-provided', skipTsConfig: false, unitTestRunner: 'jest', linter: Linter.EsLint, @@ -19,10 +21,17 @@ export default async function update(host: Tree) { await generatorGenerator(host, { name: 'util-lib', - project: 'internal-plugin', + nameAndDirectoryFormat: 'as-provided', + directory: 'libs/internal-plugin/src/generators/util-lib', unitTestRunner: 'jest', }); + // add js package for dependency checks + updateJson(host, 'libs/internal-plugin/package.json', (json) => { + json.dependencies['@nx/js'] = json.dependencies['@nx/devkit']; + return json; + }); + host.write( 'libs/internal-plugin/src/generators/util-lib/generator.ts', `import { formatFiles, installPackagesTask, Tree } from '@nx/devkit'; diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-14/complete-lab-14.ts b/libs/nx-react-workshop/src/migrations/complete-lab-14/complete-lab-14.ts index ad53212..f624c4c 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-14/complete-lab-14.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-14/complete-lab-14.ts @@ -1,12 +1,13 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { formatFiles, Tree } from '@nrwl/devkit'; -import { generatorGenerator } from '@nrwl/nx-plugin/generators'; +import { formatFiles, Tree } from '@nx/devkit'; +import { generatorGenerator } from '@nx/plugin/generators'; export default async function update(host: Tree) { process.env.NX_PROJECT_GLOB_CACHE = 'false'; await generatorGenerator(host, { name: 'update-scope-schema', - project: 'internal-plugin', + directory: 'libs/internal-plugin/src/generators/update-scope-schema', + nameAndDirectoryFormat: 'as-provided', unitTestRunner: 'jest', }); process.env.NX_PROJECT_GLOB_CACHE = 'true'; @@ -20,7 +21,7 @@ export default async function update(host: Tree) { ProjectConfiguration, getProjects, updateProjectConfiguration, -} from '@nrwl/devkit'; +} from '@nx/devkit'; export default async function (tree: Tree) { addScopeIfMissing(tree); diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-15/complete-lab-15.ts b/libs/nx-react-workshop/src/migrations/complete-lab-15/complete-lab-15.ts index fe619c4..4f1b196 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-15/complete-lab-15.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-15/complete-lab-15.ts @@ -14,37 +14,36 @@ jobs: runs-on: ubuntu-latest name: Building affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=build --base=origin/master --parallel test: runs-on: ubuntu-latest name: Testing affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=test --base=origin/master --parallel lint: runs-on: ubuntu-latest name: Linting affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=lint --base=origin/master --parallel e2e: runs-on: ubuntu-latest name: E2E testing affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=e2e --base=origin/master --parallel ` ); updateJson(host, 'nx.json', (json) => { - json['namedInputs'] = { - sharedGlobals: ['{workspaceRoot}/.github/workflows/ci.yml'], - default: ['{projectRoot}/**/*', 'sharedGlobals'], - }; + const sharedGlobalsSet = new Set(json['namedInputs'].sharedGlobals || []); + sharedGlobalsSet.add('{workspaceRoot}/.github/workflows/ci.yml'); + json['namedInputs'].sharedGlobals = Array.from(sharedGlobalsSet); return json; }); } diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-16/complete-lab-16.ts b/libs/nx-react-workshop/src/migrations/complete-lab-16/complete-lab-16.ts index 8abe305..69848b0 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-16/complete-lab-16.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-16/complete-lab-16.ts @@ -1,18 +1,9 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { addDependenciesToPackageJson, Tree } from '@nx/devkit'; +import { Tree } from '@nx/devkit'; import { execSync } from 'child_process'; -import { dependencies } from '../../../package.json'; export default async function update(host: Tree) { - // yarn add nx-cloud - await addDependenciesToPackageJson( - host, - {}, - { - 'nx-cloud': dependencies['nx-cloud'], - } - ); - execSync(`npx nx g nx-cloud:init`, { + execSync(`npx nx connect`, { stdio: [0, 1, 2], }); } diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-17/complete-lab-17.ts b/libs/nx-react-workshop/src/migrations/complete-lab-17/complete-lab-17.ts index 9dcbac5..6977888 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-17/complete-lab-17.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-17/complete-lab-17.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Tree, updateJson } from '@nx/devkit'; +import { Tree } from '@nx/devkit'; export default function update(host: Tree) { host.write( @@ -18,28 +18,28 @@ jobs: runs-on: ubuntu-latest name: Building affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=build --base=origin/master --parallel test: runs-on: ubuntu-latest name: Testing affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=test --base=origin/master --parallel lint: runs-on: ubuntu-latest name: Linting affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=lint --base=origin/master --parallel e2e: runs-on: ubuntu-latest name: E2E testing affected apps steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx affected -- --target=e2e --base=origin/master --parallel ` diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-19-alt/complete-lab-19-alt.ts b/libs/nx-react-workshop/src/migrations/complete-lab-19-alt/complete-lab-19-alt.ts index 16811df..0fcc3c0 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-19-alt/complete-lab-19-alt.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-19-alt/complete-lab-19-alt.ts @@ -4,24 +4,33 @@ import { formatFiles, installPackagesTask, Tree, + updateJson, } from '@nx/devkit'; -import { applicationGenerator } from '@nx/nest'; +import { Linter } from '@nx/eslint'; +import { applicationGenerator } from '@nx/next'; import { runCommandsGenerator } from '@nx/workspace'; -import { generatorGenerator } from '@nrwl/nx-plugin/generators'; +import { generatorGenerator } from '@nx/plugin/generators'; import { dependencies } from '../../../package.json'; export default async function update(host: Tree) { - // yarn add @nx/nest # or "npm i -S @nx/nest" + // yarn add @nx/next # or "npm i -S @nx/next" addDependenciesToPackageJson( host, {}, { - '@nx/nest': dependencies['@nx/nest'], + '@nx/next': dependencies['@nx/next'], } ); - // nx g @nx/nest:app admin-ui + // nx g @nx/next:app admin-ui await applicationGenerator(host, { name: 'admin-ui', + style: 'scss', + directory: 'apps/admin-ui', + e2eTestRunner: 'cypress', + projectNameAndRootFormat: 'as-provided', + skipFormat: true, + linter: Linter.EsLint, + unitTestRunner: 'jest', }); // nx generate run-commands deploy --project=admin-ui --command="surge dist/apps/admin-ui/exported \${SURGE_DOMAIN_ADMIN_UI} --token \${SURGE_TOKEN}" runCommandsGenerator(host, { @@ -33,7 +42,8 @@ export default async function update(host: Tree) { // nx g @nx/plugin/generator add-deploy-target generatorGenerator(host, { - project: 'internal-plugin', + directory: 'libs/internal-plugin/src/generators/add-deploy-target', + nameAndDirectoryFormat: 'as-provided', unitTestRunner: 'jest', name: 'add-deploy-target', skipFormat: true, @@ -46,6 +56,12 @@ SURGE_DOMAIN_<%= undercaps(project) %>=https://<%= subdomain %>.surge.sh ` ); + // add js package for dependency checks + updateJson(host, 'libs/internal-plugin/package.json', (json) => { + json.dependencies['@nx/workspace'] = json.dependencies['@nx/devkit']; + return json; + }); + host.write( `libs/internal-plugin/src/generators/add-deploy-target/index.ts`, ` diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-19/complete-lab-19.ts b/libs/nx-react-workshop/src/migrations/complete-lab-19/complete-lab-19.ts index a028cf2..a055ffc 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-19/complete-lab-19.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-19/complete-lab-19.ts @@ -6,8 +6,8 @@ import { Tree, updateJson, updateProjectConfiguration, -} from '@nrwl/devkit'; -import { uniq } from '@nrwl/nx-plugin/testing'; +} from '@nx/devkit'; +import { uniq } from '@nx/plugin/testing'; import { execSync } from 'child_process'; import { replaceInFile } from '../utils'; import executorGenerator from '@nx/plugin/src/generators/executor/executor'; diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-2/complete-lab-2.ts b/libs/nx-react-workshop/src/migrations/complete-lab-2/complete-lab-2.ts index c7a3e2c..b43c116 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-2/complete-lab-2.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-2/complete-lab-2.ts @@ -14,7 +14,9 @@ export default async function update(tree: Tree) { await addDependenciesToPackageJson( tree, { - '@material-ui/core': 'latest', + '@mui/material': 'latest', + '@emotion/react': 'latest', + '@emotion/styled': 'latest', }, { '@nx/react': dependencies['@nx/react'], @@ -23,8 +25,9 @@ export default async function update(tree: Tree) { process.env.NX_PROJECT_GLOB_CACHE = 'false'; await applicationGenerator(tree, { name: 'store', - babelJest: true, e2eTestRunner: 'cypress', + directory: 'apps/store', + projectNameAndRootFormat: 'as-provided', skipFormat: true, linter: Linter.EsLint, style: 'scss', @@ -111,11 +114,11 @@ export default async function update(tree: Tree) { `import styles from './app.module.scss'; import { getAllGames } from '../fake-api'; - import Card from '@material-ui/core/Card'; - import CardActionArea from '@material-ui/core/CardActionArea'; - import CardContent from '@material-ui/core/CardContent'; - import CardMedia from '@material-ui/core/CardMedia'; - import Typography from '@material-ui/core/Typography'; + import Card from '@mui/material/Card'; + import CardActionArea from '@mui/material/CardActionArea'; + import CardContent from '@mui/material/CardContent'; + import CardMedia from '@mui/material/CardMedia'; + import Typography from '@mui/material/Typography'; export const App = () => { return ( @@ -160,7 +163,7 @@ export default async function update(tree: Tree) { 'apps/store-e2e/src/e2e/app.cy.ts', `describe('store', () => { beforeEach(() => cy.visit('/')); - + it('should have 3 games', () => { cy.contains('Settlers in the Can'); cy.contains('Chess Pie'); diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-21-alt/complete-lab-21-alt.ts b/libs/nx-react-workshop/src/migrations/complete-lab-21-alt/complete-lab-21-alt.ts index 5e37bab..4c52d7d 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-21-alt/complete-lab-21-alt.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-21-alt/complete-lab-21-alt.ts @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest name: Deploying apps steps: - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx build store -- --configuration=production - run: npm run nx build admin-ui -- --configuration=production diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-21/complete-lab-21.ts b/libs/nx-react-workshop/src/migrations/complete-lab-21/complete-lab-21.ts index 0fa1592..ef831d4 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-21/complete-lab-21.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-21/complete-lab-21.ts @@ -1,7 +1,7 @@ import { readJsonFile, Tree } from '@nx/devkit'; export default function update(host: Tree) { - const { herokuName } = readJsonFile('.nx-workshop.json'); + const { flyName } = readJsonFile('.nx-workshop.json'); host.write( '.github/workflows/deploy.yml', @@ -16,15 +16,15 @@ on: env: SURGE_DOMAIN: \${{ secrets.SURGE_DOMAIN }} SURGE_TOKEN: \${{ secrets.SURGE_TOKEN }} - HEROKU_API_KEY: \${{ secrets.HEROKU_API_KEY }} - NX_API_URL: https://${herokuName}.herokuapp.com + FLY_API_TOKEN: \${{ secrets.FLY_API_TOKEN }} + NX_API_URL: https://${flyName}.fly.dev jobs: build: runs-on: ubuntu-latest name: Deploying apps steps: - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v4 - uses: bahmutov/npm-install@v1.4.5 - run: npm run nx build store -- --configuration=production - run: npm run nx build api -- --configuration=production diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-22/complete-lab-22.ts b/libs/nx-react-workshop/src/migrations/complete-lab-22/complete-lab-22.ts index 8aa0fd4..6d8062b 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-22/complete-lab-22.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-22/complete-lab-22.ts @@ -1,7 +1,9 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Tree } from '@nx/devkit'; +import { Tree, readJsonFile } from '@nx/devkit'; export default function update(host: Tree) { + const { flyName } = readJsonFile('.nx-workshop.json'); + host.write( '.github/workflows/deploy.yml', ` @@ -15,18 +17,19 @@ on: env: SURGE_DOMAIN: \${{ secrets.SURGE_DOMAIN }} SURGE_TOKEN: \${{ secrets.SURGE_TOKEN }} - HEROKU_API_KEY: \${{ secrets.HEROKU_API_KEY }} + FLY_API_TOKEN: \${{ secrets.FLY_API_TOKEN }} + NX_API_URL: https://${flyName}.fly.dev jobs: build: runs-on: ubuntu-latest name: Deploying apps steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: bahmutov/npm-install@v1 - - uses: nrwl/nx-set-shas@v2 + - uses: nrwl/nx-set-shas@v4 - run: npm run nx affected -- --target=build --base=\${{ env.NX_BASE }} --parallel --configuration=production - run: npm run nx affected -- --target=deploy --base=\${{ env.NX_BASE }} --parallel ` diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-4/complete-lab-4.ts b/libs/nx-react-workshop/src/migrations/complete-lab-4/complete-lab-4.ts index 85a304b..1035053 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-4/complete-lab-4.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-4/complete-lab-4.ts @@ -6,8 +6,9 @@ import { componentGenerator, libraryGenerator } from '@nx/react'; export default async function update(tree: Tree) { // nx generate @nx/react:lib ui-shared --directory=store --no-component await libraryGenerator(tree, { - name: 'ui-shared', - directory: 'store', + name: 'store-ui-shared', + directory: 'libs/store/ui-shared', + projectNameAndRootFormat: 'as-provided', component: false, style: 'css', skipTsConfig: false, @@ -15,44 +16,31 @@ export default async function update(tree: Tree) { unitTestRunner: 'jest', linter: Linter.EsLint, }); - // nx generate @nx/react:component header --export --project=store-ui-shared + // nx generate @nx/react:component libs/store/ui-shared/src/lib/header --export await componentGenerator(tree, { name: 'header', - project: 'store-ui-shared', + directory: 'libs/store/ui-shared/src/lib/header', + nameAndDirectoryFormat: 'as-provided', style: 'css', export: true, }); tree.write( 'libs/store/ui-shared/src/lib/header/header.tsx', - `import { makeStyles } from '@material-ui/core/styles'; - import AppBar from '@material-ui/core/AppBar'; - import Toolbar from '@material-ui/core/Toolbar'; - import Typography from '@material-ui/core/Typography'; + `import AppBar from '@mui/material/AppBar'; + import Toolbar from '@mui/material/Toolbar'; + import Typography from '@mui/material/Typography'; - const useStyles = makeStyles((theme) => ({ - root: { - flexGrow: 1, - }, - menuButton: { - marginRight: theme.spacing(2), - }, - title: { - flexGrow: 1, - }, - })); - - /* eslint-disable-next-line */ - export interface HeaderProps {} - - export const Header = (props: HeaderProps) => { - const classes = useStyles(); + export interface HeaderProps { + title: string; + } + export const Header = ({ title }: HeaderProps) => { return ( - - Board Game Hoard + + {title} @@ -67,17 +55,17 @@ export default async function update(tree: Tree) { `import styles from './app.module.scss'; import { getAllGames } from '../fake-api'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; -import { Header } from '@bg-hoard/store/ui-shared'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Typography from '@mui/material/Typography'; +import { Header } from '@bg-hoard/store-ui-shared'; export const App = () => { return ( <> -
+
{getAllGames().map((x) => ( @@ -124,7 +112,7 @@ export default App; 'apps/store-e2e/src/e2e/app.cy.ts', `describe('store', () => { beforeEach(() => cy.visit('/')); - + it('should have 3 games', () => { cy.contains('Settlers in the Can'); cy.contains('Chess Pie'); diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-5/complete-lab-5.ts b/libs/nx-react-workshop/src/migrations/complete-lab-5/complete-lab-5.ts index eeeb308..86d683b 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-5/complete-lab-5.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-5/complete-lab-5.ts @@ -5,8 +5,9 @@ import { libraryGenerator } from '@nx/js'; export default async function update(host: Tree) { // nx generate @nx/js:lib util-formatters --directory=store await libraryGenerator(host, { - name: 'util-formatters', - directory: 'store', + name: 'store-util-formatters', + directory: 'libs/store/util-formatters', + projectNameAndRootFormat: 'as-provided', }); host.write( @@ -22,18 +23,18 @@ export default async function update(host: Tree) { `import styles from './app.module.scss'; import { getAllGames } from '../fake-api'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; -import { Header } from '@bg-hoard/store/ui-shared'; -import { formatRating } from '@bg-hoard/store/util-formatters'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Typography from '@mui/material/Typography'; +import { Header } from '@bg-hoard/store-ui-shared'; +import { formatRating } from '@bg-hoard/store-util-formatters'; export const App = () => { return ( <> -
+
{getAllGames().map((x) => ( @@ -99,7 +100,7 @@ export default defineConfig({ 'apps/store-e2e/src/e2e/app.cy.ts', `describe('store', () => { beforeEach(() => cy.visit('/')); - + it('should have 3 games', () => { cy.contains('Settlers in the Can'); cy.contains('Chess Pie'); diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-6/complete-lab-6.ts b/libs/nx-react-workshop/src/migrations/complete-lab-6/complete-lab-6.ts index e720079..c4e96e2 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-6/complete-lab-6.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-6/complete-lab-6.ts @@ -7,8 +7,9 @@ export default async function update(host: Tree) { // nx generate @nx/react:library feature-game-detail --directory=store --appProject=store --no-component process.env.NX_PROJECT_GLOB_CACHE = 'false'; await libraryGenerator(host, { - name: 'feature-game-detail', - directory: 'store', + name: 'store-feature-game-detail', + directory: 'libs/store/feature-game-detail', + projectNameAndRootFormat: 'as-provided', component: false, appProject: 'store', style: 'css', @@ -22,23 +23,23 @@ export default async function update(host: Tree) { `import styles from './app.module.scss'; import { getAllGames } from '../fake-api'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; -import { Header } from '@bg-hoard/store/ui-shared'; -import { formatRating } from '@bg-hoard/store/util-formatters'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Typography from '@mui/material/Typography'; +import { Header } from '@bg-hoard/store-ui-shared'; +import { formatRating } from '@bg-hoard/store-util-formatters'; import { Routes, Route, useNavigate } from 'react-router-dom'; -import { StoreFeatureGameDetail } from '@bg-hoard/store/feature-game-detail'; +import { StoreFeatureGameDetail } from '@bg-hoard/store-feature-game-detail'; export const App = () => { const navigate = useNavigate(); return ( <> -
+
{getAllGames().map((x) => ( @@ -100,10 +101,10 @@ export default App; `import { useParams } from 'react-router-dom'; import styles from './store-feature-game-detail.module.scss'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import Typography from '@material-ui/core/Typography'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import Typography from '@mui/material/Typography'; /* eslint-disable-next-line */ export interface StoreFeatureGameDetailProps {} diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-7/complete-lab-7.ts b/libs/nx-react-workshop/src/migrations/complete-lab-7/complete-lab-7.ts index 7751ac6..f03f75f 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-7/complete-lab-7.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-7/complete-lab-7.ts @@ -16,6 +16,8 @@ export default async function update(host: Tree) { // nx generate @nx/express:application api --frontendProject=store await applicationGenerator(host, { name: 'api', + directory: 'apps/api', + projectNameAndRootFormat: 'as-provided', frontendProject: 'store', skipFormat: true, skipPackageJson: false, @@ -89,12 +91,12 @@ server.on('error', console.error); 'apps/api-e2e/src/api/api.spec.ts', `import axios from 'axios'; import { exec } from 'child_process'; - + describe('GET /api/games', () => { it('should return a list of games', async () => { exec('nx serve api'); const res = await axios.get(\`/api/games\`); - + expect(res.status).toBe(200); expect(res.data).toMatchObject([ { diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-8/complete-lab-8.ts b/libs/nx-react-workshop/src/migrations/complete-lab-8/complete-lab-8.ts index b3edf2f..17ffd7b 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-8/complete-lab-8.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-8/complete-lab-8.ts @@ -1,9 +1,4 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { - Tree, - readProjectConfiguration, - updateProjectConfiguration, -} from '@nx/devkit'; +import { Tree } from '@nx/devkit'; export default function update(host: Tree) { host.delete('apps/store/src/fake-api.ts'); @@ -14,19 +9,19 @@ export default function update(host: Tree) { import styles from './app.module.scss'; -import { Header } from '@bg-hoard/store/ui-shared'; +import { Header } from '@bg-hoard/store-ui-shared'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardContent from '@material-ui/core/CardContent'; -import CardMedia from '@material-ui/core/CardMedia'; -import Typography from '@material-ui/core/Typography'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Typography from '@mui/material/Typography'; -import { formatRating } from '@bg-hoard/store/util-formatters'; +import { formatRating } from '@bg-hoard/store-util-formatters'; import { Routes, Route, useNavigate } from 'react-router-dom'; -import { StoreFeatureGameDetail } from '@bg-hoard/store/feature-game-detail'; +import { StoreFeatureGameDetail } from '@bg-hoard/store-feature-game-detail'; export const App = () => { const navigate = useNavigate(); @@ -62,7 +57,7 @@ export const App = () => { return ( <> -
+
{state.loadingState === 'loading' @@ -122,15 +117,15 @@ export default App; import { useParams } from 'react-router-dom'; import styles from './game-detail.module.css'; -import Button from '@material-ui/core/Button'; -import Card from '@material-ui/core/Card'; -import CardActionArea from '@material-ui/core/CardActionArea'; -import CardActions from '@material-ui/core/CardActions'; -import CardHeader from '@material-ui/core/CardHeader'; -import CardContent from '@material-ui/core/CardContent'; -import Typography from '@material-ui/core/Typography'; -import CardMedia from '@material-ui/core/CardMedia'; -import { formatRating } from '@bg-hoard/store/util-formatters'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardActionArea from '@mui/material/CardActionArea'; +import CardActions from '@mui/material/CardActions'; +import CardHeader from '@mui/material/CardHeader'; +import CardContent from '@mui/material/CardContent'; +import Typography from '@mui/material/Typography'; +import CardMedia from '@mui/material/CardMedia'; +import { formatRating } from '@bg-hoard/store-util-formatters'; /* eslint-disable-next-line */ export interface StoreFeatureGameDetailProps {} diff --git a/libs/nx-react-workshop/src/migrations/complete-lab-9/complete-lab-9.ts b/libs/nx-react-workshop/src/migrations/complete-lab-9/complete-lab-9.ts index 8aa6916..2206995 100644 --- a/libs/nx-react-workshop/src/migrations/complete-lab-9/complete-lab-9.ts +++ b/libs/nx-react-workshop/src/migrations/complete-lab-9/complete-lab-9.ts @@ -6,8 +6,9 @@ import { libraryGenerator } from '@nx/js'; export default async function update(host: Tree) { // nx generate @nx/js:lib util-interface --directory=api await libraryGenerator(host, { - name: 'util-interface', - directory: 'api', + name: 'api-util-interface', + directory: 'libs/api/util-interface', + projectNameAndRootFormat: 'as-provided', }); host.write( 'libs/api/util-interface/src/lib/api-util-interface.ts', @@ -72,19 +73,19 @@ export const getGame = (id: string) => games.find((game) => game.id === id); import styles from './app.module.scss'; - import { Header } from '@bg-hoard/store/ui-shared'; + import { Header } from '@bg-hoard/store-ui-shared'; - import Card from '@material-ui/core/Card'; - import CardActionArea from '@material-ui/core/CardActionArea'; - import CardContent from '@material-ui/core/CardContent'; - import CardMedia from '@material-ui/core/CardMedia'; - import Typography from '@material-ui/core/Typography'; + import Card from '@mui/material/Card'; + import CardActionArea from '@mui/material/CardActionArea'; + import CardContent from '@mui/material/CardContent'; + import CardMedia from '@mui/material/CardMedia'; + import Typography from '@mui/material/Typography'; - import { formatRating } from '@bg-hoard/store/util-formatters'; + import { formatRating } from '@bg-hoard/store-util-formatters'; import { Routes, Route, useNavigate } from 'react-router-dom'; - import { StoreFeatureGameDetail } from '@bg-hoard/store/feature-game-detail'; + import { StoreFeatureGameDetail } from '@bg-hoard/store-feature-game-detail'; import { Game } from '@bg-hoard/util-interface'; export const App = () => { @@ -121,7 +122,7 @@ export const getGame = (id: string) => games.find((game) => game.id === id); return ( <> -
+
{state.loadingState === 'loading' @@ -182,14 +183,14 @@ export const getGame = (id: string) => games.find((game) => game.id === id); import { useParams } from 'react-router-dom'; import styles from './game-detail.module.css'; - import Button from '@material-ui/core/Button'; - import Card from '@material-ui/core/Card'; - import CardActions from '@material-ui/core/CardActions'; - import CardHeader from '@material-ui/core/CardHeader'; - import CardContent from '@material-ui/core/CardContent'; - import Typography from '@material-ui/core/Typography'; - import CardMedia from '@material-ui/core/CardMedia'; - import { formatRating } from '@bg-hoard/store/util-formatters'; + import Button from '@mui/material/Button'; + import Card from '@mui/material/Card'; + import CardActions from '@mui/material/CardActions'; + import CardHeader from '@mui/material/CardHeader'; + import CardContent from '@mui/material/CardContent'; + import Typography from '@mui/material/Typography'; + import CardMedia from '@mui/material/CardMedia'; + import { formatRating } from '@bg-hoard/store-util-formatters'; import { Game } from '@bg-hoard/util-interface'; /* eslint-disable-next-line */ @@ -278,7 +279,7 @@ export const getGame = (id: string) => games.find((game) => game.id === id); 'apps/api-e2e/src/api/graph.spec.ts', `import { execSync } from 'child_process'; import { readFileSync } from 'node:fs'; - + describe('Dependencies', () => { it('should have three dependencies on util-interface', async () => { execSync('nx graph --file=graph.json'); diff --git a/libs/nx-react-workshop/src/migrations/utils.ts b/libs/nx-react-workshop/src/migrations/utils.ts index 744ed7a..eae14fd 100644 --- a/libs/nx-react-workshop/src/migrations/utils.ts +++ b/libs/nx-react-workshop/src/migrations/utils.ts @@ -1,4 +1,4 @@ -import { Tree } from '@nrwl/devkit'; +import { Tree } from '@nx/devkit'; import * as ts from 'typescript'; import { insertImport as astInsertImport } from '@nx/js'; diff --git a/package.json b/package.json index e2b9b8a..779804c 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,10 @@ { - "name": "nx-react-workshop", + "name": "@nrwl/nx-react-workshop", "version": "0.0.0", "license": "MIT", "scripts": { "nx": "nx", - "start": "nx serve", - "build": "nx build", - "test": "nx test", - "lint": "nx workspace-lint && nx lint", - "e2e": "nx e2e", - "affected:apps": "nx affected:apps", - "affected:libs": "nx affected:libs", - "affected:build": "nx affected:build", - "affected:e2e": "nx affected:e2e", - "affected:test": "nx affected:test", - "affected:lint": "nx affected:lint", - "affected:dep-graph": "nx affected:dep-graph", - "affected": "nx affected", - "format": "nx format:write", - "format:write": "nx format:write", - "format:check": "nx format:check", - "update": "nx migrate latest", - "workspace-generator": "nx workspace-generator", - "dep-graph": "nx dep-graph", - "help": "nx help", - "cherry-pick-all": "./tools/cherry-pick-all.sh", - "migrate-all": "./tools/migrate-all.sh" + "local-release": "ts-node -P ./scripts/tsconfig.release.json ./scripts/local-release" }, "private": true, "dependencies": { @@ -35,7 +14,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "react-is": "18.2.0", - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "devDependencies": { "@nx/devkit": "17.0.2", @@ -45,6 +24,7 @@ "@nx/jest": "17.0.2", "@nx/js": "17.0.2", "@nx/nest": "17.0.2", + "@nx/next": "17.0.2", "@nx/node": "17.0.2", "@nx/plugin": "17.0.2", "@nx/react": "17.0.2", @@ -60,6 +40,7 @@ "dotenv": "10.0.0", "eslint": "8.46.0", "eslint-config-prettier": "9.0.0", + "fs-extra": "^11.1.1", "jest": "29.4.3", "jest-environment-jsdom": "29.4.3", "node-fetch": "^2.6.1", @@ -67,8 +48,8 @@ "prettier": "2.6.2", "ts-jest": "29.1.0", "ts-node": "10.9.1", - "tslib": "^2.0.0", - "typescript": "5.1.6" + "typescript": "5.1.6", + "verdaccio": "^5.27.0" }, "packageManager": "yarn@4.0.1" } diff --git a/project.json b/project.json new file mode 100644 index 0000000..d890dae --- /dev/null +++ b/project.json @@ -0,0 +1,14 @@ +{ + "name": "@nrwl/nx-react-workshop", + "$schema": "node_modules/nx/schemas/project-schema.json", + "targets": { + "local-registry": { + "executor": "@nx/js:verdaccio", + "options": { + "port": 4873, + "config": ".verdaccio/config.yml", + "storage": "dist/local-registry/storage" + } + } + } +} diff --git a/scripts/local-release.ts b/scripts/local-release.ts new file mode 100644 index 0000000..799e6e5 --- /dev/null +++ b/scripts/local-release.ts @@ -0,0 +1,15 @@ +#!/usr/bin/env node +import { execSync } from 'child_process'; + +const LARGE_BUFFER = 1024 * 1000000; + +(async () => { + execSync(`yarn nx build nx-react-workshop`, { + stdio: [0, 1, 2], + maxBuffer: LARGE_BUFFER, + }); +})(); + +function getRegistry() { + return new URL(execSync('npm config get registry').toString().trim()); +} diff --git a/scripts/tsconfig.release.json b/scripts/tsconfig.release.json new file mode 100644 index 0000000..522adc8 --- /dev/null +++ b/scripts/tsconfig.release.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "../scripts/tools-out", + "module": "commonjs", + "types": ["node"] + }, + "include": ["**/*.ts"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 1d1d23b..cf8577d 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -3,20 +3,20 @@ "compilerOptions": { "rootDir": ".", "sourceMap": true, - "declaration": false, + "declaration": true, "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, - "target": "es2015", - "module": "esnext", - "lib": ["es2017", "dom"], + "target": "ES2021", + "module": "commonjs", + "lib": ["ES2021", "dom"], "skipLibCheck": true, "skipDefaultLibCheck": true, "baseUrl": ".", + "types": ["node", "jest"], "paths": { "@nrwl/nx-react-workshop": ["libs/nx-react-workshop/src/index.ts"] } - }, - "exclude": ["node_modules", "tmp"] + } } diff --git a/yarn.lock b/yarn.lock index 91093f9..2b3b31d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3324,7 +3324,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.22.6": +"@babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.22.6": version: 7.23.2 resolution: "@babel/runtime@npm:7.23.2" dependencies: @@ -4475,6 +4475,15 @@ __metadata: languageName: node linkType: hard +"@nrwl/next@npm:17.0.2": + version: 17.0.2 + resolution: "@nrwl/next@npm:17.0.2" + dependencies: + "@nx/next": "npm:17.0.2" + checksum: 8c2a0b50506c0f31a70ffc6d8fe8a0fb7e4881dc3da0d38337ed5b51b2d878871f1e14a7afaf471de5331f2a8c073ab745fe438bcc6aa74640783d23c26246b7 + languageName: node + linkType: hard + "@nrwl/node@npm:17.0.2": version: 17.0.2 resolution: "@nrwl/node@npm:17.0.2" @@ -4493,6 +4502,53 @@ __metadata: languageName: node linkType: hard +"@nrwl/nx-react-workshop@workspace:.": + version: 0.0.0-use.local + resolution: "@nrwl/nx-react-workshop@workspace:." + dependencies: + "@nx/devkit": "npm:17.0.2" + "@nx/eslint": "npm:17.0.2" + "@nx/eslint-plugin": "npm:17.0.2" + "@nx/express": "npm:17.0.2" + "@nx/jest": "npm:17.0.2" + "@nx/js": "npm:17.0.2" + "@nx/nest": "npm:17.0.2" + "@nx/next": "npm:17.0.2" + "@nx/node": "npm:17.0.2" + "@nx/plugin": "npm:17.0.2" + "@nx/react": "npm:17.0.2" + "@nx/storybook": "npm:17.0.2" + "@nx/workspace": "npm:17.0.2" + "@phenomnomnominal/tsquery": "npm:^4.1.1" + "@storybook/builder-webpack5": "npm:7.0.9" + "@storybook/core-server": "npm:7.5.2" + "@storybook/manager-webpack5": "npm:6.5.16" + "@swc-node/register": "npm:1.6.8" + "@swc/core": "npm:1.3.95" + "@types/jest": "npm:29.4.4" + "@types/node": "npm:18.11.9" + "@typescript-eslint/eslint-plugin": "npm:5.62.0" + "@typescript-eslint/parser": "npm:5.62.0" + dotenv: "npm:10.0.0" + eslint: "npm:8.46.0" + eslint-config-prettier: "npm:9.0.0" + fs-extra: "npm:^11.1.1" + jest: "npm:29.4.3" + jest-environment-jsdom: "npm:29.4.3" + node-fetch: "npm:^2.6.1" + nx: "npm:17.0.2" + prettier: "npm:2.6.2" + react: "npm:18.2.0" + react-dom: "npm:18.2.0" + react-is: "npm:18.2.0" + ts-jest: "npm:29.1.0" + ts-node: "npm:10.9.1" + tslib: "npm:^2.3.0" + typescript: "npm:5.1.6" + verdaccio: "npm:^5.27.0" + languageName: unknown + linkType: soft + "@nrwl/react@npm:17.0.2": version: 17.0.2 resolution: "@nrwl/react@npm:17.0.2" @@ -4726,6 +4782,33 @@ __metadata: languageName: node linkType: hard +"@nx/next@npm:17.0.2": + version: 17.0.2 + resolution: "@nx/next@npm:17.0.2" + dependencies: + "@babel/plugin-proposal-decorators": "npm:^7.22.7" + "@nrwl/next": "npm:17.0.2" + "@nx/devkit": "npm:17.0.2" + "@nx/eslint": "npm:17.0.2" + "@nx/js": "npm:17.0.2" + "@nx/react": "npm:17.0.2" + "@nx/web": "npm:17.0.2" + "@nx/workspace": "npm:17.0.2" + "@svgr/webpack": "npm:^8.0.1" + chalk: "npm:^4.1.0" + copy-webpack-plugin: "npm:^10.2.4" + fs-extra: "npm:^11.1.0" + ignore: "npm:^5.0.4" + semver: "npm:7.5.3" + tslib: "npm:^2.3.0" + url-loader: "npm:^4.1.1" + webpack-merge: "npm:^5.8.0" + peerDependencies: + next: ">=13.0.0" + checksum: 6a0365c7da38cd19e72faa6b681c2a2f2b8c4a45ad0d3a6ceae1072b39c2e41318bc5f9673e0eb281fe0150c745e3756b174740540bdfebfa2466ddc217b0cb9 + languageName: node + linkType: hard + "@nx/node@npm:17.0.2": version: 17.0.2 resolution: "@nx/node@npm:17.0.2" @@ -6580,6 +6663,13 @@ __metadata: languageName: node linkType: hard +"@types/lodash@npm:^4.14.175": + version: 4.14.200 + resolution: "@types/lodash@npm:4.14.200" + checksum: 7a8dac6dc866f10d1888846d6189d1faeb4f65adb139f0837a005fd1adcde62e60d7e7abb1a2733d13fc57bebb337d74182d8ad3dbd1d211dcd0c310c47e81bc + languageName: node + linkType: hard + "@types/mime@npm:^1": version: 1.3.2 resolution: "@types/mime@npm:1.3.2" @@ -6875,6 +6965,201 @@ __metadata: languageName: node linkType: hard +"@verdaccio/commons-api@npm:10.2.0": + version: 10.2.0 + resolution: "@verdaccio/commons-api@npm:10.2.0" + dependencies: + http-errors: "npm:2.0.0" + http-status-codes: "npm:2.2.0" + checksum: 7a156f6eddd2ca3ea2977613480eb5c62511db62ce76eef08bbc5cde8552f318dbe4cbc1c9523e710c89b367610b8ebd50cccff9e6f4ab0373e5f54a89a70689 + languageName: node + linkType: hard + +"@verdaccio/config@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/config@npm:7.0.0-next.3" + dependencies: + "@verdaccio/core": "npm:7.0.0-next.3" + "@verdaccio/utils": "npm:7.0.0-next.3" + debug: "npm:4.3.4" + js-yaml: "npm:4.1.0" + lodash: "npm:4.17.21" + minimatch: "npm:7.4.6" + yup: "npm:0.32.11" + checksum: 935e7a504007e34c414e503f047c9d7f5a0cb1023e099385a0848baf53de202066aa72bf6e32488c44387c6869283db231f6a270ab59cd4b37c254ddbc3bf9ad + languageName: node + linkType: hard + +"@verdaccio/core@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/core@npm:7.0.0-next.3" + dependencies: + ajv: "npm:8.12.0" + core-js: "npm:3.30.2" + http-errors: "npm:2.0.0" + http-status-codes: "npm:2.2.0" + process-warning: "npm:1.0.0" + semver: "npm:7.5.4" + checksum: ebf901912ad035fbf2b2aae304224191dc26f1991f52cd64d454ba39128406ff025518058c42e64a322c580eed3dfcf5f013becb45c6be367b49f7e6f0f109f8 + languageName: node + linkType: hard + +"@verdaccio/file-locking@npm:10.3.1": + version: 10.3.1 + resolution: "@verdaccio/file-locking@npm:10.3.1" + dependencies: + lockfile: "npm:1.0.4" + checksum: c70a8f889dc9998b32691cb5dc232df2757eb4380da7a38bc0c386e0f0c2079a8aa13b6998d0c497f137953dd4dd58d2ecd08f00d4e98c9d5b266e928fa71200 + languageName: node + linkType: hard + +"@verdaccio/file-locking@npm:12.0.0-next.1": + version: 12.0.0-next.1 + resolution: "@verdaccio/file-locking@npm:12.0.0-next.1" + dependencies: + lockfile: "npm:1.0.4" + checksum: dfa2576c650264f236c45e8edeb7185014c59dd7747c36c40bbf38149b503915983a9813923cef5f93b5e0841b9ae73e5f50a7a4339916b2aab30d0553cb1694 + languageName: node + linkType: hard + +"@verdaccio/local-storage@npm:10.3.3": + version: 10.3.3 + resolution: "@verdaccio/local-storage@npm:10.3.3" + dependencies: + "@verdaccio/commons-api": "npm:10.2.0" + "@verdaccio/file-locking": "npm:10.3.1" + "@verdaccio/streams": "npm:10.2.1" + async: "npm:3.2.4" + debug: "npm:4.3.4" + lodash: "npm:4.17.21" + lowdb: "npm:1.0.0" + mkdirp: "npm:1.0.4" + checksum: 6c0a9cb6850160664fa7220ac33e70543bc20197eb7b7c8a5ca2456bbdaeb23eade319bf392fc58eda2b193dbd23196692855d5c261329bca1c058536b148fb4 + languageName: node + linkType: hard + +"@verdaccio/logger-7@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/logger-7@npm:7.0.0-next.3" + dependencies: + "@verdaccio/logger-commons": "npm:7.0.0-next.3" + pino: "npm:7.11.0" + checksum: 3fc8479f907083a4f684818aa11f005ef1de9d3c08096fa5dfc45f3e7a73a5eae2c74ed82b7c9c5d390a29b5489427a7ce645ceb66c0ffcccb6fe10fe15216c9 + languageName: node + linkType: hard + +"@verdaccio/logger-commons@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/logger-commons@npm:7.0.0-next.3" + dependencies: + "@verdaccio/core": "npm:7.0.0-next.3" + "@verdaccio/logger-prettify": "npm:7.0.0-next.1" + colorette: "npm:2.0.20" + debug: "npm:4.3.4" + checksum: b5f21c77f374ad5cdbd28479e8353f9401809ce24b166adee6f53724607a76d75de92957a6b426ad0b81173ab999c4b31de54e8b9ba1b92b42c1cd480e820d41 + languageName: node + linkType: hard + +"@verdaccio/logger-prettify@npm:7.0.0-next.1": + version: 7.0.0-next.1 + resolution: "@verdaccio/logger-prettify@npm:7.0.0-next.1" + dependencies: + colorette: "npm:2.0.20" + dayjs: "npm:1.11.7" + lodash: "npm:4.17.21" + pino-abstract-transport: "npm:1.0.0" + sonic-boom: "npm:3.3.0" + checksum: 34d6c8b32e059df68040fa71969523b5119850bc73d46536e69074a654ad6d04d2b55f19850074016562d773e4a283a8b7fd0f8d19d9494c25d9ac2fdc0a7703 + languageName: node + linkType: hard + +"@verdaccio/middleware@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/middleware@npm:7.0.0-next.3" + dependencies: + "@verdaccio/config": "npm:7.0.0-next.3" + "@verdaccio/core": "npm:7.0.0-next.3" + "@verdaccio/url": "npm:12.0.0-next.3" + "@verdaccio/utils": "npm:7.0.0-next.3" + debug: "npm:4.3.4" + express: "npm:4.18.2" + express-rate-limit: "npm:5.5.1" + lodash: "npm:4.17.21" + lru-cache: "npm:7.18.3" + mime: "npm:2.6.0" + checksum: d4a3f3ff06bff7d8e9fecd5ec3ec0b13d59d450055639dbb82548dd5e13d29d44d7ea4cad864cf275632f267a23ea69776c871aa539e81ff47686073b8b84901 + languageName: node + linkType: hard + +"@verdaccio/search@npm:7.0.0-next.2": + version: 7.0.0-next.2 + resolution: "@verdaccio/search@npm:7.0.0-next.2" + checksum: 753ff520a84a8418b83a64988407371e2009663024522d3efde6c4dbb529157d1204b25f2ae58c47e71970a984894322d9c4d66bef57ed85d62f05de31e33e7a + languageName: node + linkType: hard + +"@verdaccio/signature@npm:7.0.0-next.1": + version: 7.0.0-next.1 + resolution: "@verdaccio/signature@npm:7.0.0-next.1" + dependencies: + debug: "npm:4.3.4" + jsonwebtoken: "npm:9.0.2" + lodash: "npm:4.17.21" + checksum: 6cf1629e7b69a84244175f4b7a89a98c84e1c8565f3dfbe871d24bf8d643a761e6e22823a3ce223f8f5ae06b0117d7236e5c3ba6cfc273c2fc857b8fe44a3679 + languageName: node + linkType: hard + +"@verdaccio/streams@npm:10.2.1": + version: 10.2.1 + resolution: "@verdaccio/streams@npm:10.2.1" + checksum: 0f1ab96b5c92fa1839dbb602ae1e90cb5ee2d8b6b01945ce0ccdccd6828111c8457b2b70926c880bc425b778b9892036ee263b9496c68cbd3a3b23fe8d083c42 + languageName: node + linkType: hard + +"@verdaccio/tarball@npm:12.0.0-next.3": + version: 12.0.0-next.3 + resolution: "@verdaccio/tarball@npm:12.0.0-next.3" + dependencies: + "@verdaccio/core": "npm:7.0.0-next.3" + "@verdaccio/url": "npm:12.0.0-next.3" + "@verdaccio/utils": "npm:7.0.0-next.3" + debug: "npm:4.3.4" + lodash: "npm:4.17.21" + checksum: 4351cd2e6037158a03f6dad0fa874d306571e531981bbe3f43b4101ee19d4fd395291706dae6e8ce6fcea6ef452cf5cfb82b2da40444e214bb00fda52adab39c + languageName: node + linkType: hard + +"@verdaccio/ui-theme@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/ui-theme@npm:7.0.0-next.3" + checksum: c593e72cff099d22fc3f69d0befa279f6c5477e3ad724c365d46a2eea7dc64675cb613791e909378e43fce1927e3cf2b2b567e9ef880d16eb015c422b0b6a81a + languageName: node + linkType: hard + +"@verdaccio/url@npm:12.0.0-next.3": + version: 12.0.0-next.3 + resolution: "@verdaccio/url@npm:12.0.0-next.3" + dependencies: + "@verdaccio/core": "npm:7.0.0-next.3" + debug: "npm:4.3.4" + lodash: "npm:4.17.21" + validator: "npm:13.9.0" + checksum: af226f14ab34cf71ec64ea6ec8d3fc1bb1b437819864184f655fb4b1e77d4159c7012aeacd32a26b3b86db201ec263d43e9f04b9464eeedd9f6ca8926298a2f8 + languageName: node + linkType: hard + +"@verdaccio/utils@npm:7.0.0-next.3": + version: 7.0.0-next.3 + resolution: "@verdaccio/utils@npm:7.0.0-next.3" + dependencies: + "@verdaccio/core": "npm:7.0.0-next.3" + lodash: "npm:4.17.21" + minimatch: "npm:7.4.6" + semver: "npm:7.5.4" + checksum: 377f635722801515e2f86db91691a0ed86fd618b70b33d638a736a4a1d0a1e242b6e24f03ad4bc0f005a138d519b2dcbdb6c6946d40553130749dcc8788abc11 + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.11.1": version: 1.11.1 resolution: "@webassemblyjs/ast@npm:1.11.1" @@ -7411,6 +7696,18 @@ __metadata: languageName: node linkType: hard +"JSONStream@npm:1.3.5": + version: 1.3.5 + resolution: "JSONStream@npm:1.3.5" + dependencies: + jsonparse: "npm:^1.2.0" + through: "npm:>=2.2.7 <3" + bin: + JSONStream: ./bin.js + checksum: 0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 + languageName: node + linkType: hard + "abab@npm:^2.0.6": version: 2.0.6 resolution: "abab@npm:2.0.6" @@ -7425,6 +7722,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 + languageName: node + linkType: hard + "accepts@npm:~1.3.5, accepts@npm:~1.3.7": version: 1.3.7 resolution: "accepts@npm:1.3.7" @@ -7631,7 +7937,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.1.0, ajv@npm:^6.10.2, ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.1.0, ajv@npm:^6.10.2, ajv@npm:^6.12.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -7757,6 +8063,13 @@ __metadata: languageName: node linkType: hard +"apache-md5@npm:1.1.8": + version: 1.1.8 + resolution: "apache-md5@npm:1.1.8" + checksum: 423aa1baddcedc42e2fdf52efcf7fae2e7de9535e6ca7dd4a049f49fb5ec9b6a4469f327e02268088ed3dacdbec6f1ea4132941e2d75899c4e412421e6ffcbfc + languageName: node + linkType: hard + "app-root-dir@npm:^1.0.2": version: 1.0.2 resolution: "app-root-dir@npm:1.0.2" @@ -7859,6 +8172,13 @@ __metadata: languageName: node linkType: hard +"array-union@npm:^3.0.1": + version: 3.0.1 + resolution: "array-union@npm:3.0.1" + checksum: b5271d7e5688d2d1932928b271796dbbddc422448557ab05ef6f34a9f84fb645eb855384feec6234bf59c226053a0e21b8a00b0e6cd588874b90a5c13dbeb64e + languageName: node + linkType: hard + "array-unique@npm:^0.3.2": version: 0.3.2 resolution: "array-unique@npm:0.3.2" @@ -7928,6 +8248,22 @@ __metadata: languageName: node linkType: hard +"asn1@npm:~0.2.3": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: b194b9d50c3a8f872ee85ab110784911e696a4d49f7ee6fc5fb63216dedbefd2c55999c70cb2eaeb4cf4a0e0338b44e9ace3627117b5bf0d42460e9132f21b91 + languageName: node + linkType: hard + "assert@npm:^1.1.1": version: 1.5.0 resolution: "assert@npm:1.5.0" @@ -7973,6 +8309,13 @@ __metadata: languageName: node linkType: hard +"async@npm:3.2.4, async@npm:^3.2.3": + version: 3.2.4 + resolution: "async@npm:3.2.4" + checksum: b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9 + languageName: node + linkType: hard + "async@npm:^2.6.4": version: 2.6.4 resolution: "async@npm:2.6.4" @@ -7982,13 +8325,6 @@ __metadata: languageName: node linkType: hard -"async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -8012,6 +8348,13 @@ __metadata: languageName: node linkType: hard +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: e329a6665512736a9bbb073e1761b4ec102f7926cce35037753146a9db9c8104f5044c1662e4a863576ce544fb8be27cd2be6bc8c1a40147d03f31eb1cfb6e8a + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -8019,6 +8362,20 @@ __metadata: languageName: node linkType: hard +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 021d2cc5547d4d9ef1633e0332e746a6f447997758b8b68d6fb33f290986872d2bff5f0c37d5832f41a7229361f093cd81c40898d96ed153493c0fb5cd8575d2 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.12.0 + resolution: "aws4@npm:1.12.0" + checksum: 1e39c266f53b04daf88e112de93a6006375b386a1b7ab6197260886e39abd012aa90bdd87949c3bf9c30754846031f6d5d8ac4f8676628097c11065b5d39847a + languageName: node + linkType: hard + "axios@npm:^1.5.1": version: 1.6.0 resolution: "axios@npm:1.6.0" @@ -8316,6 +8673,22 @@ __metadata: languageName: node linkType: hard +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 + languageName: node + linkType: hard + +"bcryptjs@npm:2.4.3": + version: 2.4.3 + resolution: "bcryptjs@npm:2.4.3" + checksum: b969467087ed7a01ff905a1c6a0c45014ec586248a448ea08370c8ed8bb314bda16a870ca23e0961d7d23bdce1a04c76fa70a9d680be814fa9ac7d8fc61870a3 + languageName: node + linkType: hard + "better-opn@npm:^3.0.2": version: 3.0.2 resolution: "better-opn@npm:3.0.2" @@ -8432,6 +8805,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.1": + version: 1.20.1 + resolution: "body-parser@npm:1.20.1" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.4" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.1" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: a202d493e2c10a33fb7413dac7d2f713be579c4b88343cd814b6df7a38e5af1901fc31044e04de176db56b16d9772aa25a7723f64478c20f4d91b1ac223bf3b8 + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -8657,6 +9050,13 @@ __metadata: languageName: node linkType: hard +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -8692,6 +9092,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + "builtin-status-codes@npm:^3.0.0": version: 3.0.0 resolution: "builtin-status-codes@npm:3.0.0" @@ -8865,6 +9275,13 @@ __metadata: languageName: node linkType: hard +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: ccf64bcb6c0232cdc5b7bd91ddd06e23a4b541f138336d4725233ac538041fb2f29c2e86c3c4a7a61ef990b665348db23a047060b9414c3a6603e9fa61ad4626 + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -9063,6 +9480,17 @@ __metadata: languageName: node linkType: hard +"clipanion@npm:3.2.1": + version: 3.2.1 + resolution: "clipanion@npm:3.2.1" + dependencies: + typanion: "npm:^3.8.0" + peerDependencies: + typanion: "*" + checksum: 6c148bd01ae645031aeb6e9a1a16f3ce07eb754cd9981c91edcab82b09e063b805ac41e4f36039d07602334b6dbba036b030d1807c12acd7f90778a696b7ac6e + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -9157,6 +9585,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:2.0.20, colorette@npm:^2.0.10, colorette@npm:^2.0.19": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + "colorette@npm:^1.2.2": version: 1.4.0 resolution: "colorette@npm:1.4.0" @@ -9164,13 +9599,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10, colorette@npm:^2.0.19": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 - languageName: node - linkType: hard - "columnify@npm:^1.6.0": version: 1.6.0 resolution: "columnify@npm:1.6.0" @@ -9181,7 +9609,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -9234,7 +9662,7 @@ __metadata: languageName: node linkType: hard -"compression@npm:^1.7.4": +"compression@npm:1.7.4, compression@npm:^1.7.4": version: 1.7.4 resolution: "compression@npm:1.7.4" dependencies: @@ -9358,6 +9786,16 @@ __metadata: languageName: node linkType: hard +"cookies@npm:0.8.0": + version: 0.8.0 + resolution: "cookies@npm:0.8.0" + dependencies: + depd: "npm:~2.0.0" + keygrip: "npm:~1.1.0" + checksum: 0af32f30d1ece0596efc05782c66b9d61659e20c6cc5b695452abf5ceb51883ef43c5c73d86badd7d028a0da7d39f864c95f33640aef04f97fad70f35986bea3 + languageName: node + linkType: hard + "copy-concurrently@npm:^1.0.0": version: 1.0.5 resolution: "copy-concurrently@npm:1.0.5" @@ -9379,14 +9817,30 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.21.0, core-js-compat@npm:^3.22.1, core-js-compat@npm:^3.8.1": - version: 3.22.8 - resolution: "core-js-compat@npm:3.22.8" +"copy-webpack-plugin@npm:^10.2.4": + version: 10.2.4 + resolution: "copy-webpack-plugin@npm:10.2.4" dependencies: - browserslist: "npm:^4.20.3" - semver: "npm:7.0.0" - checksum: a569000114822f20827d41c63f7f59a095656087d82103a9c677c286f09899278b7b8f27cee96402b1d622af111d7158f09c8ab5920432a0bdd91af6d9a5662a - languageName: node + fast-glob: "npm:^3.2.7" + glob-parent: "npm:^6.0.1" + globby: "npm:^12.0.2" + normalize-path: "npm:^3.0.0" + schema-utils: "npm:^4.0.0" + serialize-javascript: "npm:^6.0.0" + peerDependencies: + webpack: ^5.1.0 + checksum: d4501aa2d813eadc906318ed301707240fc7bfeb250813e2e4d93e95bc9896822c136e49de01dfe612ea5334a1f04cb8fbed4412b91117666a92607c0deba624 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.21.0, core-js-compat@npm:^3.22.1, core-js-compat@npm:^3.8.1": + version: 3.22.8 + resolution: "core-js-compat@npm:3.22.8" + dependencies: + browserslist: "npm:^4.20.3" + semver: "npm:7.0.0" + checksum: a569000114822f20827d41c63f7f59a095656087d82103a9c677c286f09899278b7b8f27cee96402b1d622af111d7158f09c8ab5920432a0bdd91af6d9a5662a + languageName: node linkType: hard "core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": @@ -9398,6 +9852,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:3.30.2": + version: 3.30.2 + resolution: "core-js@npm:3.30.2" + checksum: 864d7dc908d4ece507d27e6c6d2830300dcb775d88cfefeec31e34ab95be5016bb23abb29c8b1c4a930bada01318af009276199d75dcab1a230c3cebdf8d3a70 + languageName: node + linkType: hard + "core-js@npm:^3.0.4, core-js@npm:^3.8.2": version: 3.22.8 resolution: "core-js@npm:3.22.8" @@ -9412,6 +9873,13 @@ __metadata: languageName: node linkType: hard +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -9419,6 +9887,16 @@ __metadata: languageName: node linkType: hard +"cors@npm:2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: "npm:^4" + vary: "npm:^1" + checksum: 373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 + languageName: node + linkType: hard + "corser@npm:^2.0.1": version: 2.0.1 resolution: "corser@npm:2.0.1" @@ -9689,6 +10167,15 @@ __metadata: languageName: node linkType: hard +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 64589a15c5bd01fa41ff7007e0f2c6552c5ef2028075daa16b188a3721f4ba001841bf306dfc2eee6e2e6e7f76b38f5f17fb21fa847504192290ffa9e150118a + languageName: node + linkType: hard + "data-urls@npm:^3.0.2": version: 3.0.2 resolution: "data-urls@npm:3.0.2" @@ -9700,6 +10187,13 @@ __metadata: languageName: node linkType: hard +"dayjs@npm:1.11.7": + version: 1.11.7 + resolution: "dayjs@npm:1.11.7" + checksum: 41a54853c8b8bf0fa94a5559eec98b3e4d11b31af81a9558a159d40adeaafb1f3414e8c41a4e3277281d97687d8252f400015e1f715b47f8c24d88a9ebd43626 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.0": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -9721,16 +10215,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"debug@npm:^4.3.2, debug@npm:^4.3.4": +"debug@npm:4.3.4, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -9742,6 +10227,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + "decimal.js@npm:^10.4.2": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" @@ -9871,7 +10365,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c @@ -10196,6 +10690,18 @@ __metadata: languageName: node linkType: hard +"duplexify@npm:^4.1.2": + version: 4.1.2 + resolution: "duplexify@npm:4.1.2" + dependencies: + end-of-stream: "npm:^1.4.1" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + stream-shift: "npm:^1.0.0" + checksum: cacd09d8f1c58f92f83e17dffc14ece50415b32753446ed92046236a27a9e73cb914cda495d955ea12e0e615381082a511f20e219f48a06e84675c9d6950675b + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -10203,6 +10709,25 @@ __metadata: languageName: node linkType: hard +"ecc-jsbn@npm:~0.1.1": + version: 0.1.2 + resolution: "ecc-jsbn@npm:0.1.2" + dependencies: + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.1.0" + checksum: 6cf168bae1e2dad2e46561d9af9cbabfbf5ff592176ad4e9f0f41eaaf5fe5e10bb58147fe0a804de62b1ee9dad42c28810c88d652b21b6013c47ba8efa274ca1 + languageName: node + linkType: hard + +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -10389,6 +10914,15 @@ __metadata: languageName: node linkType: hard +"envinfo@npm:7.10.0": + version: 7.10.0 + resolution: "envinfo@npm:7.10.0" + bin: + envinfo: dist/cli.js + checksum: ebc7792fbedca72bc829913abe0c2a3384b883903012f97b56085afd4e83d26f7dd0652403fedd99cd3e1c93d4fb0706f5d2c3dc06ac6a1eda348280a06a9dcf + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -10968,6 +11502,13 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.0": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -10975,7 +11516,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.0.0, events@npm:^3.2.0": +"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 @@ -11052,6 +11593,52 @@ __metadata: languageName: node linkType: hard +"express-rate-limit@npm:5.5.1": + version: 5.5.1 + resolution: "express-rate-limit@npm:5.5.1" + checksum: 0391cdb518acaabdae0517ab1fba32dce5b0813199be5b89e0ebb62399753b2ec7882571a8da1fd6a061354992aa8e00c947c2e03f850820bb47668195e2c8d6 + languageName: node + linkType: hard + +"express@npm:4.18.2": + version: 4.18.2 + resolution: "express@npm:4.18.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.1" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.5.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 75af556306b9241bc1d7bdd40c9744b516c38ce50ae3210658efcbf96e3aed4ab83b3432f06215eae5610c123bc4136957dc06e50dfc50b7d4d775af56c4c59c + languageName: node + linkType: hard + "express@npm:^4.17.1": version: 4.17.1 resolution: "express@npm:4.17.1" @@ -11148,6 +11735,13 @@ __metadata: languageName: node linkType: hard +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + "extglob@npm:^2.0.4": version: 2.0.4 resolution: "extglob@npm:2.0.4" @@ -11164,6 +11758,20 @@ __metadata: languageName: node linkType: hard +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: f75114a8388f0cbce68e277b6495dc3930db4dde1611072e4a140c24e204affd77320d004b947a132e9a3b97b8253017b2b62dce661975fb0adced707abf1ab5 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: e10e2769985d0e9b6c7199b053a9957589d02e84de42832c295798cb422a025e6d4a92e0259c1fb4d07090f5bfde6b55fd9f880ac5855bd61d775f8ab75a7ab0 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -11184,6 +11792,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.2.7": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + "fast-glob@npm:^3.2.9": version: 3.2.11 resolution: "fast-glob@npm:3.2.11" @@ -11211,6 +11832,20 @@ __metadata: languageName: node linkType: hard +"fast-redact@npm:^3.0.0": + version: 3.3.0 + resolution: "fast-redact@npm:3.3.0" + checksum: d81562510681e9ba6404ee5d3838ff5257a44d2f80937f5024c099049ff805437d0fae0124458a7e87535cc9dcf4de305bb075cab8f08d6c720bbc3447861b4e + languageName: node + linkType: hard + +"fast-safe-stringify@npm:2.1.1": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -11503,6 +12138,13 @@ __metadata: languageName: node linkType: hard +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: 364f7f5f7d93ab661455351ce116a67877b66f59aca199559a999bd39e3cfadbfbfacc10415a915255e2210b30c23febe9aec3ca16bf2d1ff11c935a1000e24c + languageName: node + linkType: hard + "fork-ts-checker-webpack-plugin@npm:^6.0.4": version: 6.5.2 resolution: "fork-ts-checker-webpack-plugin@npm:6.5.2" @@ -11572,6 +12214,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:~2.3.2": + version: 2.3.3 + resolution: "form-data@npm:2.3.3" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.6" + mime-types: "npm:^2.1.12" + checksum: 706ef1e5649286b6a61e5bb87993a9842807fd8f149cd2548ee807ea4fb882247bdf7f6e64ac4720029c0cd5c80343de0e22eee1dc9e9882e12db9cc7bc016a4 + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -11612,7 +12265,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:11.1.1": +"fs-extra@npm:11.1.1, fs-extra@npm:^11.1.1": version: 11.1.1 resolution: "fs-extra@npm:11.1.1" dependencies: @@ -11851,6 +12504,15 @@ __metadata: languageName: node linkType: hard +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: c13f8530ecf16fc509f3fa5cd8dd2129ffa5d0c7ccdf5728b6022d52954c2d24be3706b4cdf15333eec52f1fbb43feb70a01dabc639d1d10071e371da8aaa52f + languageName: node + linkType: hard + "glob-parent@npm:^3.1.0": version: 3.1.0 resolution: "glob-parent@npm:3.1.0" @@ -11870,7 +12532,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.2": +"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -11926,6 +12588,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:^6.0.1": + version: 6.0.4 + resolution: "glob@npm:6.0.4" + dependencies: + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:2 || 3" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 520146ebce0f4594b8357338f86281b38ee14214debce398a2902176a28f18e0f98911ea48516d85022de64fbbaa57f074aa13715d1daa5d70e21b82cea22183 + languageName: node + linkType: hard + "glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": version: 7.2.0 resolution: "glob@npm:7.2.0" @@ -12002,6 +12677,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:^12.0.2": + version: 12.2.0 + resolution: "globby@npm:12.2.0" + dependencies: + array-union: "npm:^3.0.1" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.7" + ignore: "npm:^5.1.9" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 121fee62bb9a43a35a32731cda9540241003ef578f9cee5ad87b27d3020b94857ff62f8d82cb99dbeedf6f26981c9fa62509d873392642ceb37674f3d6ec4e52 + languageName: node + linkType: hard + "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -12018,7 +12707,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -12039,6 +12728,24 @@ __metadata: languageName: node linkType: hard +"handlebars@npm:4.7.8": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d + languageName: node + linkType: hard + "handlebars@npm:^4.7.7": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -12057,6 +12764,23 @@ __metadata: languageName: node linkType: hard +"har-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "har-schema@npm:2.0.0" + checksum: 3856cb76152658e0002b9c2b45b4360bb26b3e832c823caed8fcf39a01096030bf09fa5685c0f7b0f2cb3ecba6e9dce17edaf28b64a423d6201092e6be56e592 + languageName: node + linkType: hard + +"har-validator@npm:~5.1.3": + version: 5.1.5 + resolution: "har-validator@npm:5.1.5" + dependencies: + ajv: "npm:^6.12.3" + har-schema: "npm:^2.0.0" + checksum: f1d606eb1021839e3a905be5ef7cca81c2256a6be0748efb8fefc14312214f9e6c15d7f2eaf37514104071207d84f627b68bb9f6178703da4e06fbd1a0649a5e + languageName: node + linkType: hard + "harmony-reflect@npm:^1.4.6": version: 1.6.2 resolution: "harmony-reflect@npm:1.6.2" @@ -12419,6 +13143,24 @@ __metadata: languageName: node linkType: hard +"http-signature@npm:~1.2.0": + version: 1.2.0 + resolution: "http-signature@npm:1.2.0" + dependencies: + assert-plus: "npm:^1.0.0" + jsprim: "npm:^1.2.2" + sshpk: "npm:^1.7.0" + checksum: 582f7af7f354429e1fb19b3bbb9d35520843c69bb30a25b88ca3c5c2c10715f20ae7924e20cffbed220b1d3a726ef4fe8ccc48568d5744db87be9a79887d6733 + languageName: node + linkType: hard + +"http-status-codes@npm:2.2.0": + version: 2.2.0 + resolution: "http-status-codes@npm:2.2.0" + checksum: 774b45a13af9920c915f91878c74056886fee0e4342771c0db68015475e990552b968db999a6f5bbb87db8acddd65f1f28a13a3bb45f9998e9b11c47e119b5b4 + languageName: node + linkType: hard + "https-browserify@npm:^1.0.0": version: 1.0.0 resolution: "https-browserify@npm:1.0.0" @@ -12426,7 +13168,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.1": +"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -12489,7 +13231,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4": +"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb @@ -12510,6 +13252,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^5.1.9": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 + languageName: node + linkType: hard + "ignore@npm:^5.2.0": version: 5.2.0 resolution: "ignore@npm:5.2.0" @@ -12947,6 +13696,13 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^2.1.0": + version: 2.2.2 + resolution: "is-promise@npm:2.2.2" + checksum: 2dba959812380e45b3df0fb12e7cb4d4528c989c7abb03ececb1d1fd6ab1cbfee956ca9daa587b9db1d8ac3c1e5738cf217bdb3dfd99df8c691be4c00ae09069 + languageName: node + linkType: hard + "is-regex@npm:^1.1.2, is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -13018,6 +13774,13 @@ __metadata: languageName: node linkType: hard +"is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -13117,6 +13880,13 @@ __metadata: languageName: node linkType: hard +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.0 resolution: "istanbul-lib-coverage@npm:3.2.0" @@ -13749,6 +14519,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: e046e05c59ff880ee4ef68902dbdcb6d2f3c5d60c357d4d68647dc23add556c31c0e5f41bdb7e69e793dd63468bd9e085da3636341048ef577b18f5b713877c0 + languageName: node + linkType: hard + "jsdom@npm:^20.0.0": version: 20.0.3 resolution: "jsdom@npm:20.0.3" @@ -13834,6 +14611,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -13841,6 +14625,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + "json5@npm:^1.0.1": version: 1.0.1 resolution: "json5@npm:1.0.1" @@ -13913,38 +14704,112 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": - version: 3.2.2 - resolution: "kind-of@npm:3.2.2" - dependencies: - is-buffer: "npm:^1.1.5" - checksum: 7e34bc29d4b02c997f92f080de34ebb92033a96736bbb0bb2410e033a7e5ae6571f1fa37b2d7710018f95361473b816c604234197f4f203f9cf149d8ef1574d9 +"jsonparse@npm:^1.2.0": + version: 1.3.1 + resolution: "jsonparse@npm:1.3.1" + checksum: 89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 languageName: node linkType: hard -"kind-of@npm:^4.0.0": - version: 4.0.0 - resolution: "kind-of@npm:4.0.0" +"jsonwebtoken@npm:9.0.2": + version: 9.0.2 + resolution: "jsonwebtoken@npm:9.0.2" dependencies: - is-buffer: "npm:^1.1.5" - checksum: d6c44c75ee36898142dfc7106afbd50593216c37f96acb81a7ab33ca1a6938ce97d5692b8fc8fccd035f83811a9d97749d68771116441a48eedd0b68e2973165 + jws: "npm:^3.2.2" + lodash.includes: "npm:^4.3.0" + lodash.isboolean: "npm:^3.0.3" + lodash.isinteger: "npm:^4.0.4" + lodash.isnumber: "npm:^3.0.3" + lodash.isplainobject: "npm:^4.0.6" + lodash.isstring: "npm:^4.0.1" + lodash.once: "npm:^4.0.0" + ms: "npm:^2.1.1" + semver: "npm:^7.5.4" + checksum: d287a29814895e866db2e5a0209ce730cbc158441a0e5a70d5e940eb0d28ab7498c6bf45029cc8b479639bca94056e9a7f254e2cdb92a2f5750c7f358657a131 languageName: node linkType: hard -"kind-of@npm:^5.0.0": - version: 5.1.0 - resolution: "kind-of@npm:5.1.0" - checksum: fe85b7a2ed4b4d5a12e16e01d00d5c336e1760842fe0da38283605b9880c984288935e87b13138909e4d23d2d197a1d492f7393c6638d2c0fab8a900c4fb0392 +"jsprim@npm:^1.2.2": + version: 1.4.2 + resolution: "jsprim@npm:1.4.2" + dependencies: + assert-plus: "npm:1.0.0" + extsprintf: "npm:1.3.0" + json-schema: "npm:0.4.0" + verror: "npm:1.10.0" + checksum: 5e4bca99e90727c2040eb4c2190d0ef1fe51798ed5714e87b841d304526190d960f9772acc7108fa1416b61e1122bcd60e4460c91793dce0835df5852aab55af languageName: node linkType: hard -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" + dependencies: + buffer-equal-constant-time: "npm:1.0.1" + ecdsa-sig-formatter: "npm:1.0.11" + safe-buffer: "npm:^5.0.1" + checksum: 5c533540bf38702e73cf14765805a94027c66a0aa8b16bc3e89d8d905e61a4ce2791e87e21be97d1293a5ee9d4f3e5e47737e671768265ca4f25706db551d5e9 + languageName: node + linkType: hard + +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: "npm:^1.4.1" + safe-buffer: "npm:^5.0.1" + checksum: e770704533d92df358adad7d1261fdecad4d7b66fa153ba80d047e03ca0f1f73007ce5ed3fbc04d2eba09ba6e7e6e645f351e08e5ab51614df1b0aa4f384dfff + languageName: node + linkType: hard + +"keygrip@npm:~1.1.0": + version: 1.1.0 + resolution: "keygrip@npm:1.1.0" + dependencies: + tsscmp: "npm:1.0.6" + checksum: 2aceec1a1e642a0caf938044056ed67b1909cfe67a93a59b32aae2863e0f35a1a53782ecc8f9cd0e3bdb60863fa0f401ccbd257cd7dfae61915f78445139edea + languageName: node + linkType: hard + +"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" + dependencies: + is-buffer: "npm:^1.1.5" + checksum: 7e34bc29d4b02c997f92f080de34ebb92033a96736bbb0bb2410e033a7e5ae6571f1fa37b2d7710018f95361473b816c604234197f4f203f9cf149d8ef1574d9 + languageName: node + linkType: hard + +"kind-of@npm:^4.0.0": + version: 4.0.0 + resolution: "kind-of@npm:4.0.0" + dependencies: + is-buffer: "npm:^1.1.5" + checksum: d6c44c75ee36898142dfc7106afbd50593216c37f96acb81a7ab33ca1a6938ce97d5692b8fc8fccd035f83811a9d97749d68771116441a48eedd0b68e2973165 + languageName: node + linkType: hard + +"kind-of@npm:^5.0.0": + version: 5.1.0 + resolution: "kind-of@npm:5.1.0" + checksum: fe85b7a2ed4b4d5a12e16e01d00d5c336e1760842fe0da38283605b9880c984288935e87b13138909e4d23d2d197a1d492f7393c6638d2c0fab8a900c4fb0392 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 languageName: node linkType: hard +"kleur@npm:4.1.5": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -14081,6 +14946,22 @@ __metadata: languageName: node linkType: hard +"lockfile@npm:1.0.4": + version: 1.0.4 + resolution: "lockfile@npm:1.0.4" + dependencies: + signal-exit: "npm:^3.0.2" + checksum: 80b7777ceb43105d9e588733c3efc2514653a5e3a0dae3e61347a1f5381da34dcaa2caaa60c39ed5d4ad31c1735a4831e5639a0ba1c508bfea8dbc9c89777b37 + languageName: node + linkType: hard + +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 + languageName: node + linkType: hard + "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -14088,6 +14969,48 @@ __metadata: languageName: node linkType: hard +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b + languageName: node + linkType: hard + +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: 0aac604c1ef7e72f9a6b798e5b676606042401dd58e49f051df3cc1e3adb497b3d7695635a5cbec4ae5f66456b951fdabe7d6b387055f13267cde521f10ec7f7 + languageName: node + linkType: hard + +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 4c3e023a2373bf65bf366d3b8605b97ec830bca702a926939bcaa53f8e02789b6a176e7f166b082f9365bfec4121bfeb52e86e9040cb8d450e64c858583f61b7 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 2d01530513a1ee4f72dd79528444db4e6360588adcb0e2ff663db2b3f642d4bb3d687051ae1115751ca9082db4fdef675160071226ca6bbf5f0c123dbf0aa12d + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: 09eaf980a283f9eef58ef95b30ec7fee61df4d6bf4aba3b5f096869cc58f24c9da17900febc8ffd67819b4e29de29793190e88dc96983db92d84c95fa85d1c92 + languageName: node + linkType: hard + "lodash.memoize@npm:4.x": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -14102,7 +15025,14 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash.once@npm:^4.0.0": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: 46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 + languageName: node + linkType: hard + +"lodash@npm:4, lodash@npm:4.17.21, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -14130,6 +15060,19 @@ __metadata: languageName: node linkType: hard +"lowdb@npm:1.0.0": + version: 1.0.0 + resolution: "lowdb@npm:1.0.0" + dependencies: + graceful-fs: "npm:^4.1.3" + is-promise: "npm:^2.1.0" + lodash: "npm:4" + pify: "npm:^3.0.0" + steno: "npm:^0.4.1" + checksum: a6b9184bec92a8f02718a6bf5941d87ba17e54cd4906cb8fcd00cf7ee52def678d36be5f5f11a26599e450911107fdc9b3e672b3e2838541aa58a649a88a40af + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -14139,6 +15082,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:7.18.3": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.0.1 resolution: "lru-cache@npm:10.0.1" @@ -14451,7 +15401,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.30, mime-types@npm:^2.1.31, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:^2.1.30, mime-types@npm:^2.1.31, mime-types@npm:~2.1.19, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -14469,6 +15419,24 @@ __metadata: languageName: node linkType: hard +"mime@npm:2.6.0": + version: 2.6.0 + resolution: "mime@npm:2.6.0" + bin: + mime: cli.js + checksum: a7f2589900d9c16e3bdf7672d16a6274df903da958c1643c9c45771f0478f3846dcb1097f31eb9178452570271361e2149310931ec705c037210fc69639c8e6c + languageName: node + linkType: hard + +"mime@npm:3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: 402e792a8df1b2cc41cb77f0dcc46472b7944b7ec29cb5bbcd398624b6b97096728f1239766d3fdeb20551dd8d94738344c195a6ea10c4f906eb0356323b0531 + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -14506,6 +15474,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:2 || 3, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + "minimatch@npm:3.0.5": version: 3.0.5 resolution: "minimatch@npm:3.0.5" @@ -14515,21 +15492,21 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4": - version: 3.0.4 - resolution: "minimatch@npm:3.0.4" +"minimatch@npm:7.4.6": + version: 7.4.6 + resolution: "minimatch@npm:7.4.6" dependencies: - brace-expansion: "npm:^1.1.7" - checksum: d0a2bcd93ebec08a9eef3ca83ba33c9fb6feb93932e0b4dc6aa46c5f37a9404bea7ad9ff7cafe23ce6634f1fe3b206f5315ecbb05812da6e692c21d8ecfd3dae + brace-expansion: "npm:^2.0.1" + checksum: e587bf3d90542555a3d58aca94c549b72d58b0a66545dd00eef808d0d66e5d9a163d3084da7f874e83ca8cc47e91c670e6c6f6593a3e7bb27fcc0e6512e87c67 languageName: node linkType: hard -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" +"minimatch@npm:^3.0.4": + version: 3.0.4 + resolution: "minimatch@npm:3.0.4" dependencies: brace-expansion: "npm:^1.1.7" - checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + checksum: d0a2bcd93ebec08a9eef3ca83ba33c9fb6feb93932e0b4dc6aa46c5f37a9404bea7ad9ff7cafe23ce6634f1fe3b206f5315ecbb05812da6e692c21d8ecfd3dae languageName: node linkType: hard @@ -14677,6 +15654,15 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:1.0.4, mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + "mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3": version: 0.5.5 resolution: "mkdirp@npm:0.5.5" @@ -14688,7 +15674,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.6": +"mkdirp@npm:^0.5.6, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -14699,15 +15685,6 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf - languageName: node - linkType: hard - "move-concurrently@npm:^1.0.1": version: 1.0.1 resolution: "move-concurrently@npm:1.0.1" @@ -14750,6 +15727,17 @@ __metadata: languageName: node linkType: hard +"mv@npm:2.1.1": + version: 2.1.1 + resolution: "mv@npm:2.1.1" + dependencies: + mkdirp: "npm:~0.5.1" + ncp: "npm:~2.0.0" + rimraf: "npm:~2.4.0" + checksum: 5da59a9f4ec16da0867289b5018c81c25c59b06bb9da717bc7bd0b40363d6653dc88d6da32a9434fd7416bfc3f67184c306ea44d3856ff97f3214cc96960efcd + languageName: node + linkType: hard + "nan@npm:^2.12.1": version: 2.15.0 resolution: "nan@npm:2.15.0" @@ -14759,6 +15747,13 @@ __metadata: languageName: node linkType: hard +"nanoclone@npm:^0.2.1": + version: 0.2.1 + resolution: "nanoclone@npm:0.2.1" + checksum: 760b569ea841c9678fdf8d763c6d7bb093f0889150087f82d86c536a318b302939c82ce35cdaec999d0f687789d0d79d0f3f75a272d7a98dfac7a067c0b47053 + languageName: node + linkType: hard + "nanoid@npm:^3.3.4": version: 3.3.4 resolution: "nanoid@npm:3.3.4" @@ -14810,6 +15805,15 @@ __metadata: languageName: node linkType: hard +"ncp@npm:~2.0.0": + version: 2.0.0 + resolution: "ncp@npm:2.0.0" + bin: + ncp: ./bin/ncp + checksum: d515babf9d3205ab9252e7d640af7c3e1a880317016d41f2fce2e6b9c8f60eb8bb6afde30e8c4f8e1e3fa551465f094433c3f364b25a85d6a28ec52c1ad6e067 + languageName: node + linkType: hard + "negotiator@npm:0.6.2": version: 0.6.2 resolution: "negotiator@npm:0.6.2" @@ -14885,6 +15889,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:cjs": + version: 2.6.7 + resolution: "node-fetch@npm:2.6.7" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: fcae80f5ac52fbf5012f5e19df2bd3915e67d3b3ad51cb5942943df2238d32ba15890fecabd0e166876a9f98a581ab50f3f10eb942b09405c49ef8da36b826c7 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.0.1 resolution: "node-gyp@npm:10.0.1" @@ -15075,50 +16093,6 @@ __metadata: languageName: node linkType: hard -"nx-react-workshop@workspace:.": - version: 0.0.0-use.local - resolution: "nx-react-workshop@workspace:." - dependencies: - "@nx/devkit": "npm:17.0.2" - "@nx/eslint": "npm:17.0.2" - "@nx/eslint-plugin": "npm:17.0.2" - "@nx/express": "npm:17.0.2" - "@nx/jest": "npm:17.0.2" - "@nx/js": "npm:17.0.2" - "@nx/nest": "npm:17.0.2" - "@nx/node": "npm:17.0.2" - "@nx/plugin": "npm:17.0.2" - "@nx/react": "npm:17.0.2" - "@nx/storybook": "npm:17.0.2" - "@nx/workspace": "npm:17.0.2" - "@phenomnomnominal/tsquery": "npm:^4.1.1" - "@storybook/builder-webpack5": "npm:7.0.9" - "@storybook/core-server": "npm:7.5.2" - "@storybook/manager-webpack5": "npm:6.5.16" - "@swc-node/register": "npm:1.6.8" - "@swc/core": "npm:1.3.95" - "@types/jest": "npm:29.4.4" - "@types/node": "npm:18.11.9" - "@typescript-eslint/eslint-plugin": "npm:5.62.0" - "@typescript-eslint/parser": "npm:5.62.0" - dotenv: "npm:10.0.0" - eslint: "npm:8.46.0" - eslint-config-prettier: "npm:9.0.0" - jest: "npm:29.4.3" - jest-environment-jsdom: "npm:29.4.3" - node-fetch: "npm:^2.6.1" - nx: "npm:17.0.2" - prettier: "npm:2.6.2" - react: "npm:18.2.0" - react-dom: "npm:18.2.0" - react-is: "npm:18.2.0" - ts-jest: "npm:29.1.0" - ts-node: "npm:10.9.1" - tslib: "npm:^2.0.0" - typescript: "npm:5.1.6" - languageName: unknown - linkType: soft - "nx@npm:17.0.2": version: 17.0.2 resolution: "nx@npm:17.0.2" @@ -15204,7 +16178,14 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.1.1": +"oauth-sign@npm:~0.9.0": + version: 0.9.0 + resolution: "oauth-sign@npm:0.9.0" + checksum: fc92a516f6ddbb2699089a2748b04f55c47b6ead55a77cd3a2cbbce5f7af86164cb9425f9ae19acfd066f1ad7d3a96a67b8928c6ea946426f6d6c29e448497c2 + languageName: node + linkType: hard + +"object-assign@npm:^4, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -15328,6 +16309,13 @@ __metadata: languageName: node linkType: hard +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: d4e1f0bea59f39aa435baaee7d76955527e245538cffc1d7bb0c165ae85e37f67690aa9272247ced17bad76052afdb45faf5ea304a2248e070202d4554c4e30c + languageName: node + linkType: hard + "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -15726,6 +16714,13 @@ __metadata: languageName: node linkType: hard +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 22c54de06f269e29f640e0e075207af57de5052a3d15e360c09b9a8663f393f6f45902006c1e71aa8a5a1cdfb1a47fe268826f8496d6425c362f00f5bc3e85d9 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -15747,6 +16742,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + "pify@npm:^4.0.1": version: 4.0.1 resolution: "pify@npm:4.0.1" @@ -15754,6 +16756,54 @@ __metadata: languageName: node linkType: hard +"pino-abstract-transport@npm:1.0.0": + version: 1.0.0 + resolution: "pino-abstract-transport@npm:1.0.0" + dependencies: + readable-stream: "npm:^4.0.0" + split2: "npm:^4.0.0" + checksum: c7a68e4f77f47565d39fdc33ba23f388ad2594b26a12ccce3060fef833cd7803db73a0c6e4fa7129616f22eb762119ed6107450e0f8ca1e3745d4993017725f7 + languageName: node + linkType: hard + +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: "npm:^4.1.2" + split2: "npm:^4.0.0" + checksum: 0d0e30399028ec156642b4cdfe1a040b9022befdc38e8f85935d1837c3da6050691888038433f88190d1a1eff5d90abe17ff7e6edffc09baa2f96e51b6808183 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 9e8ccac9ce04a27ccc7aa26481d431b9e037d866b101b89d895c60b925baffb82685e84d5c29b05d8e3d7c146d766a9b08949cb24ab1ec526a16134c9962d649 + languageName: node + linkType: hard + +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + fast-redact: "npm:^3.0.0" + on-exit-leak-free: "npm:^0.2.0" + pino-abstract-transport: "npm:v0.5.0" + pino-std-serializers: "npm:^4.0.0" + process-warning: "npm:^1.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.1.0" + safe-stable-stringify: "npm:^2.1.0" + sonic-boom: "npm:^2.2.1" + thread-stream: "npm:^0.15.1" + bin: + pino: bin.js + checksum: 4cc1ed9d25a4bc5d61c836a861279fa0039159b8f2f37ec337e50b0a61f3980dab5d2b1393daec26f68a19c423262649f0818654c9ad102c35310544a202c62c + languageName: node + linkType: hard + "pirates@npm:^4.0.4, pirates@npm:^4.0.5": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -15788,6 +16838,13 @@ __metadata: languageName: node linkType: hard +"pkginfo@npm:0.4.1": + version: 0.4.1 + resolution: "pkginfo@npm:0.4.1" + checksum: 487ace8df0dc7d5669cc2cb61af5c418cc4082bd246dc7fa4008b52d693dca4adc3563e427794c532ac70c9c287e6bb5fe5393465a0927765e6d85a12ddd6539 + languageName: node + linkType: hard + "pluralize@npm:8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -15979,6 +17036,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:1.0.0, process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: 43ec4229d64eb5c58340c8aacade49eb5f6fd513eae54140abf365929ca20987f0a35c5868125e2b583cad4de8cd257beb5667d9cc539d9190a7a4c3014adf22 + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -16038,6 +17102,13 @@ __metadata: languageName: node linkType: hard +"property-expr@npm:^2.0.4": + version: 2.0.6 + resolution: "property-expr@npm:2.0.6" + checksum: 69b7da15038a1146d6447c69c445306f66a33c425271235bb20507f1846dbf9577a8f9dfafe8acbfcb66f924b270157f155248308f026a68758f35fc72265b3c + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.5, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -16062,6 +17133,13 @@ __metadata: languageName: node linkType: hard +"psl@npm:^1.1.28": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 6a3f805fdab9442f44de4ba23880c4eba26b20c8e8e0830eff1cb31007f6825dace61d17203c58bfe36946842140c97a1ba7f67bc63ca2d88a7ee052b65d97ab + languageName: node + linkType: hard + "psl@npm:^1.1.33": version: 1.8.0 resolution: "psl@npm:1.8.0" @@ -16151,6 +17229,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.11.0": + version: 6.11.0 + resolution: "qs@npm:6.11.0" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f + languageName: node + linkType: hard + "qs@npm:6.7.0": version: 6.7.0 resolution: "qs@npm:6.7.0" @@ -16176,6 +17263,13 @@ __metadata: languageName: node linkType: hard +"qs@npm:~6.5.2": + version: 6.5.3 + resolution: "qs@npm:6.5.3" + checksum: 6631d4f2fa9d315e480662646745a4aa3a708817fbffe2cbdacec8ab9be130f92740c66191770fe9b704bc5fa9c1cc1f6596f55ad132fef7bd3ad1582f199eb0 + languageName: node + linkType: hard + "querystring-es3@npm:^0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" @@ -16211,6 +17305,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: fe5acc6f775b172ca5b4373df26f7e4fd347975578199e7d74b2ae4077f0af05baa27d231de1e80e8f72d88275ccc6028568a7a8c9ee5e7368ace0e18eff93a4 + languageName: node + linkType: hard + "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -16359,6 +17460,19 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^4.0.0": + version: 4.4.2 + resolution: "readable-stream@npm:4.4.2" + dependencies: + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: cf7cc8daa2b57872d120945a20a1458c13dcb6c6f352505421115827b18ac4df0e483ac1fe195cb1f5cd226e1073fc55b92b569269d8299e8530840bcdbba40c + languageName: node + linkType: hard + "readdirp@npm:^2.2.1": version: 2.2.1 resolution: "readdirp@npm:2.2.1" @@ -16379,6 +17493,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: c0f8ae531d1f51fe6343d47a2a1e5756e19b65a81b4a9642b9ebb4874e0d8b5f3799bc600bf4592838242477edc6f57778593f21b71d90f8ad0d8a317bbfae1c + languageName: node + linkType: hard + "recast@npm:^0.23.1": version: 0.23.1 resolution: "recast@npm:0.23.1" @@ -16609,6 +17730,34 @@ __metadata: languageName: node linkType: hard +"request@npm:2.88.2": + version: 2.88.2 + resolution: "request@npm:2.88.2" + dependencies: + aws-sign2: "npm:~0.7.0" + aws4: "npm:^1.8.0" + caseless: "npm:~0.12.0" + combined-stream: "npm:~1.0.6" + extend: "npm:~3.0.2" + forever-agent: "npm:~0.6.1" + form-data: "npm:~2.3.2" + har-validator: "npm:~5.1.3" + http-signature: "npm:~1.2.0" + is-typedarray: "npm:~1.0.0" + isstream: "npm:~0.1.2" + json-stringify-safe: "npm:~5.0.1" + mime-types: "npm:~2.1.19" + oauth-sign: "npm:~0.9.0" + performance-now: "npm:^2.1.0" + qs: "npm:~6.5.2" + safe-buffer: "npm:^5.1.2" + tough-cookie: "npm:~2.5.0" + tunnel-agent: "npm:^0.6.0" + uuid: "npm:^3.3.2" + checksum: 0ec66e7af1391e51ad231de3b1c6c6aef3ebd0a238aa50d4191c7a792dcdb14920eea8d570c702dc5682f276fe569d176f9b8ebc6031a3cf4a630a691a431a63 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -16747,6 +17896,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:~2.4.0": + version: 2.4.5 + resolution: "rimraf@npm:2.4.5" + dependencies: + glob: "npm:^6.0.1" + bin: + rimraf: ./bin.js + checksum: 5251a36053165d23248efec5077f9addc13ad7f742a02dcd9ac7adda9e208cbf7523901e96a9ca6c33059bd0b573b97eab3334cf1d9976cc5ddc8b3c24d9ddd7 + languageName: node + linkType: hard + "ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": version: 2.0.2 resolution: "ripemd160@npm:2.0.2" @@ -16807,7 +17967,14 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": +"safe-stable-stringify@npm:^2.1.0": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -16935,6 +18102,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.5.4, semver@npm:^7.0.0, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + languageName: node + linkType: hard + "semver@npm:7.x, semver@npm:^7.3.2, semver@npm:^7.3.5": version: 7.3.5 resolution: "semver@npm:7.3.5" @@ -16964,17 +18142,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e - languageName: node - linkType: hard - "semver@npm:^7.3.7": version: 7.3.7 resolution: "semver@npm:7.3.7" @@ -17213,6 +18380,13 @@ __metadata: languageName: node linkType: hard +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -17287,6 +18461,24 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:3.3.0": + version: 3.3.0 + resolution: "sonic-boom@npm:3.3.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + checksum: c5d387d9e35726a60afe5b5c54317db2428158ecaf3769fb16418e50d2a47176cbd800bf664a410dc0aab0792b421d394ce6edaf63b796ac3c7986f01933cddd + languageName: node + linkType: hard + +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + checksum: 6b40f2e91a999819b1dc24018a5d1c8b74e66e5d019eabad17d5b43fc309b32255b7c405ed6ec885693c8f2b969099ce96aeefde027180928bc58c034234a86d + languageName: node + linkType: hard + "source-list-map@npm:^2.0.0": version: 2.0.1 resolution: "source-list-map@npm:2.0.1" @@ -17425,6 +18617,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -17432,6 +18631,27 @@ __metadata: languageName: node linkType: hard +"sshpk@npm:^1.7.0": + version: 1.18.0 + resolution: "sshpk@npm:1.18.0" + dependencies: + asn1: "npm:~0.2.3" + assert-plus: "npm:^1.0.0" + bcrypt-pbkdf: "npm:^1.0.0" + dashdash: "npm:^1.12.0" + ecc-jsbn: "npm:~0.1.1" + getpass: "npm:^0.1.1" + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.0.2" + tweetnacl: "npm:~0.14.0" + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: e516e34fa981cfceef45fd2e947772cc70dbd57523e5c608e2cd73752ba7f8a99a04df7c3ed751588e8d91956b6f16531590b35d3489980d1c54c38bebcd41b1 + languageName: node + linkType: hard + "ssri@npm:^10.0.0": version: 10.0.5 resolution: "ssri@npm:10.0.5" @@ -17490,6 +18710,15 @@ __metadata: languageName: node linkType: hard +"steno@npm:^0.4.1": + version: 0.4.4 + resolution: "steno@npm:0.4.4" + dependencies: + graceful-fs: "npm:^4.1.3" + checksum: 026d42455aad66f0ab1ac8468dc75484a1df4ad7d8d62763a132afe009d087bb0730e57f628127c2f09dbfdc15e542d7fe9c7ca93e98202739621f8d251a8853 + languageName: node + linkType: hard + "store2@npm:^2.12.0": version: 2.13.2 resolution: "store2@npm:2.13.2" @@ -17656,7 +18885,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -18027,6 +19256,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: "npm:^0.1.0" + checksum: f92f1b5a9f3f35a72c374e3fecbde6f14d69d5325ad9ce88930af6ed9c7c1ec814367716b712205fa4f06242ae5dd97321ae2c00b43586590ed4fa861f3c29ae + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -18037,7 +19275,7 @@ __metadata: languageName: node linkType: hard -"through@npm:^2.3.4": +"through@npm:>=2.2.7 <3, through@npm:^2.3.4": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc @@ -18144,6 +19382,13 @@ __metadata: languageName: node linkType: hard +"toposort@npm:^2.0.2": + version: 2.0.2 + resolution: "toposort@npm:2.0.2" + checksum: ab9ca91fce4b972ccae9e2f539d755bf799a0c7eb60da07fd985fce0f14c159ed1e92305ff55697693b5bc13e300f5417db90e2593b127d421c9f6c440950222 + languageName: node + linkType: hard + "tough-cookie@npm:^4.1.2": version: 4.1.2 resolution: "tough-cookie@npm:4.1.2" @@ -18156,6 +19401,16 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:~2.5.0": + version: 2.5.0 + resolution: "tough-cookie@npm:2.5.0" + dependencies: + psl: "npm:^1.1.28" + punycode: "npm:^2.1.1" + checksum: e1cadfb24d40d64ca16de05fa8192bc097b66aeeb2704199b055ff12f450e4f30c927ce250f53d01f39baad18e1c11d66f65e545c5c6269de4c366fafa4c0543 + languageName: node + linkType: hard + "tr46@npm:^3.0.0": version: 3.0.0 resolution: "tr46@npm:3.0.0" @@ -18268,13 +19523,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0": - version: 2.3.1 - resolution: "tslib@npm:2.3.1" - checksum: 4efd888895bdb3b987086b2b7793ad1013566f882b0eb7a328384e5ecc0d71cafb16bbeab3196200cbf7f01a73ccc25acc2f131d4ea6ee959be7436a8a306482 - languageName: node - linkType: hard - "tslib@npm:^2.0.1": version: 2.5.0 resolution: "tslib@npm:2.5.0" @@ -18296,6 +19544,13 @@ __metadata: languageName: node linkType: hard +"tsscmp@npm:1.0.6": + version: 1.0.6 + resolution: "tsscmp@npm:1.0.6" + checksum: 2f79a9455e7e3e8071995f98cdf3487ccfc91b760bec21a9abb4d90519557eafaa37246e87c92fa8bf3fef8fd30cfd0cc3c4212bb929baa9fb62494bfa4d24b2 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -18314,6 +19569,29 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 + languageName: node + linkType: hard + +"typanion@npm:^3.8.0": + version: 3.14.0 + resolution: "typanion@npm:3.14.0" + checksum: 8b03b19844e6955bfd906c31dc781bae6d7f1fb3ce4fe24b7501557013d4889ae5cefe671dafe98d87ead0adceb8afcb8bc16df7dc0bd2b7331bac96f3a7cae2 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -18567,6 +19845,13 @@ __metadata: languageName: node linkType: hard +"unix-crypt-td-js@npm:1.1.4": + version: 1.1.4 + resolution: "unix-crypt-td-js@npm:1.1.4" + checksum: c4e3abd0d7ebcf39df7faff8be2cd137f477add743a2793c551682e04ec4e4f466e806a67e391d5a097229e4465b7cae4cb459990b9eb61dfe0b37d2388c6266 + languageName: node + linkType: hard + "unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -18649,6 +19934,23 @@ __metadata: languageName: node linkType: hard +"url-loader@npm:^4.1.1": + version: 4.1.1 + resolution: "url-loader@npm:4.1.1" + dependencies: + loader-utils: "npm:^2.0.0" + mime-types: "npm:^2.1.27" + schema-utils: "npm:^3.0.0" + peerDependencies: + file-loader: "*" + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + checksum: 71b6300e02ce26c70625eae1a2297c0737635038c62691bb3007ac33e85c0130efc74bfb444baf5c6b3bad5953491159d31d66498967d1417865d0c7e7cd1a64 + languageName: node + linkType: hard + "url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" @@ -18740,6 +20042,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^3.3.2": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: 1c13950df865c4f506ebfe0a24023571fa80edf2e62364297a537c80af09c618299797bbf2dbac6b1f8ae5ad182ba474b89db61e0e85839683991f7e08795347 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -18784,13 +20095,115 @@ __metadata: languageName: node linkType: hard -"vary@npm:~1.1.2": +"validator@npm:13.11.0": + version: 13.11.0 + resolution: "validator@npm:13.11.0" + checksum: 0107da3add5a4ebc6391dac103c55f6d8ed055bbcc29a4c9cbf89eacfc39ba102a5618c470bdc33c6487d30847771a892134a8c791f06ef0962dd4b7a60ae0f5 + languageName: node + linkType: hard + +"validator@npm:13.9.0": + version: 13.9.0 + resolution: "validator@npm:13.9.0" + checksum: 0a0af4b37779671b53ef790aa9d36f71a605c9d41c6daf198d2a1051ce549bcdca3313fa3b52c8fa24577e1a4968ec9404ad8a928d3607d51bccef6d6e33bee7 + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f languageName: node linkType: hard +"verdaccio-audit@npm:12.0.0-next.3": + version: 12.0.0-next.3 + resolution: "verdaccio-audit@npm:12.0.0-next.3" + dependencies: + "@verdaccio/config": "npm:7.0.0-next.3" + "@verdaccio/core": "npm:7.0.0-next.3" + express: "npm:4.18.2" + https-proxy-agent: "npm:5.0.1" + node-fetch: "npm:cjs" + checksum: 1fe3a12433ad072a854d23960829916e53eccd15dc5870f32e7ae0fcb1933afec13c32f90c96ed7a15a779f85d0796028eb6b2867671ee84bff2aff4a5c1195b + languageName: node + linkType: hard + +"verdaccio-htpasswd@npm:12.0.0-next.3": + version: 12.0.0-next.3 + resolution: "verdaccio-htpasswd@npm:12.0.0-next.3" + dependencies: + "@verdaccio/core": "npm:7.0.0-next.3" + "@verdaccio/file-locking": "npm:12.0.0-next.1" + apache-md5: "npm:1.1.8" + bcryptjs: "npm:2.4.3" + core-js: "npm:3.30.2" + debug: "npm:4.3.4" + http-errors: "npm:2.0.0" + unix-crypt-td-js: "npm:1.1.4" + checksum: 8c6886412abd4368e22dd536c7090a5f298b5cf50d2c853baf3732399fbd7134e9cfbb9bfe4efccae19fcafbe26af4388a10845a7c34d84f6f6bb9a9abd47eb3 + languageName: node + linkType: hard + +"verdaccio@npm:^5.27.0": + version: 5.27.0 + resolution: "verdaccio@npm:5.27.0" + dependencies: + "@verdaccio/config": "npm:7.0.0-next.3" + "@verdaccio/core": "npm:7.0.0-next.3" + "@verdaccio/local-storage": "npm:10.3.3" + "@verdaccio/logger-7": "npm:7.0.0-next.3" + "@verdaccio/middleware": "npm:7.0.0-next.3" + "@verdaccio/search": "npm:7.0.0-next.2" + "@verdaccio/signature": "npm:7.0.0-next.1" + "@verdaccio/streams": "npm:10.2.1" + "@verdaccio/tarball": "npm:12.0.0-next.3" + "@verdaccio/ui-theme": "npm:7.0.0-next.3" + "@verdaccio/url": "npm:12.0.0-next.3" + "@verdaccio/utils": "npm:7.0.0-next.3" + JSONStream: "npm:1.3.5" + async: "npm:3.2.4" + clipanion: "npm:3.2.1" + compression: "npm:1.7.4" + cookies: "npm:0.8.0" + cors: "npm:2.8.5" + debug: "npm:^4.3.4" + envinfo: "npm:7.10.0" + express: "npm:4.18.2" + express-rate-limit: "npm:5.5.1" + fast-safe-stringify: "npm:2.1.1" + handlebars: "npm:4.7.8" + js-yaml: "npm:4.1.0" + jsonwebtoken: "npm:9.0.2" + kleur: "npm:4.1.5" + lodash: "npm:4.17.21" + lru-cache: "npm:7.18.3" + mime: "npm:3.0.0" + mkdirp: "npm:1.0.4" + mv: "npm:2.1.1" + pkginfo: "npm:0.4.1" + request: "npm:2.88.2" + semver: "npm:7.5.4" + validator: "npm:13.11.0" + verdaccio-audit: "npm:12.0.0-next.3" + verdaccio-htpasswd: "npm:12.0.0-next.3" + bin: + verdaccio: bin/verdaccio + checksum: e6d867b84f280aa2a5a11a28054c4a885a6d308dc9f2492044431b3db02e3d7351a559fd0ab7d59bf413212a5d284353f208529e975ec978f82c61fc2961a730 + languageName: node + linkType: hard + +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: 37ccdf8542b5863c525128908ac80f2b476eed36a32cb944de930ca1e2e78584cc435c4b9b4c68d0fc13a47b45ff364b4be43aa74f8804f9050140f660fb660d + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -18918,6 +20331,17 @@ __metadata: languageName: node linkType: hard +"webpack-merge@npm:^5.8.0": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.0" + checksum: b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b + languageName: node + linkType: hard + "webpack-sources@npm:^1.4.0, webpack-sources@npm:^1.4.1": version: 1.4.3 resolution: "webpack-sources@npm:1.4.3" @@ -19155,6 +20579,13 @@ __metadata: languageName: node linkType: hard +"wildcard@npm:^2.0.0": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 + languageName: node + linkType: hard + "word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" @@ -19338,3 +20769,18 @@ __metadata: checksum: dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard + +"yup@npm:0.32.11": + version: 0.32.11 + resolution: "yup@npm:0.32.11" + dependencies: + "@babel/runtime": "npm:^7.15.4" + "@types/lodash": "npm:^4.14.175" + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + nanoclone: "npm:^0.2.1" + property-expr: "npm:^2.0.4" + toposort: "npm:^2.0.2" + checksum: f0802798dc64b49f313886b983a9bea5f283e2094ee2aa1197587b84f50ac5b5d03af99857c313139e63dc02558fac3aaa343503bdbffa96f70006b39d1f59c9 + languageName: node + linkType: hard