diff --git a/.github/actions/actionsLib.mjs b/.github/actions/actionsLib.mjs index 686beb1dc88d..8aaf223dcfff 100644 --- a/.github/actions/actionsLib.mjs +++ b/.github/actions/actionsLib.mjs @@ -62,9 +62,9 @@ export function projectCopy(redwoodProjectCwd) { } /** - * @param {{ baseKeyPrefix: string, distKeyPrefix: string }} options + * @param {{ baseKeyPrefix: string, distKeyPrefix: string, canary: boolean }} options */ -export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix }) { +export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix, canary }) { const baseKey = [ baseKeyPrefix, process.env.RUNNER_OS, @@ -76,7 +76,7 @@ export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix }) { baseKey, 'dependencies', await hashFiles(['yarn.lock', '.yarnrc.yml'].join('\n')), - ].join('-') + ].join('-') + (canary ? '-canary' : '') const distKey = [ dependenciesKey, @@ -91,7 +91,7 @@ export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix }) { 'lerna.json', 'packages', ].join('\n')) - ].join('-') + ].join('-') + (canary ? '-canary' : '') return { baseKey, @@ -151,17 +151,13 @@ export async function setUpRscTestProject( console.log(`Installing node_modules in ${testProjectPath}`) await execInProject('yarn install') - console.log(`Building project in ${testProjectPath}`) - await execInProject(`node ${rwBinPath} build -v`) - console.log() - console.log(`Copying over framework files to ${testProjectPath}`) await execInProject(`node ${rwfwBinPath} project:copy`, { env: { RWFW_PATH: REDWOOD_FRAMEWORK_PATH }, }) console.log() - // await cache.saveCache([testProjectPath], dependenciesKey) - // console.log(`Cache saved with key: ${dependenciesKey}`) + console.log(`Building project in ${testProjectPath}`) + await execInProject(`node ${rwBinPath} build -v`) + console.log() } - diff --git a/.github/actions/check_create_redwood_app/package.json b/.github/actions/check_create_redwood_app/package.json index a60e9828b2d4..11a229c6dafa 100644 --- a/.github/actions/check_create_redwood_app/package.json +++ b/.github/actions/check_create_redwood_app/package.json @@ -2,7 +2,7 @@ "name": "check_test_project_fixture", "private": true, "dependencies": { - "@actions/core": "1.10.0", + "@actions/core": "1.10.1", "@actions/exec": "1.1.1" }, "packageManager": "yarn@3.6.3" diff --git a/.github/actions/check_create_redwood_app/yarn.lock b/.github/actions/check_create_redwood_app/yarn.lock index 56729d47cb3f..e3ef1e202170 100644 --- a/.github/actions/check_create_redwood_app/yarn.lock +++ b/.github/actions/check_create_redwood_app/yarn.lock @@ -5,13 +5,13 @@ __metadata: version: 6 cacheKey: 8c0 -"@actions/core@npm:1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" +"@actions/core@npm:1.10.1": + version: 1.10.1 + resolution: "@actions/core@npm:1.10.1" dependencies: "@actions/http-client": ^2.0.1 uuid: ^8.3.2 - checksum: 9214d1e0cf5cf2a5d48b8f3b12488c6be9f6722ea60f2397409226e8410b5a3e12e558d9b66c93469d180399865ec20180119408a1770f026bd9ecac6965fcda + checksum: 7a61446697a23dcad3545cf0634dedbdedf20ae9a0ee6ee977554589a15deb4a93593ee48a41258933d58ce0778f446b0d2c162b60750956fb75e0b9560fb832 languageName: node linkType: hard @@ -44,7 +44,7 @@ __metadata: version: 0.0.0-use.local resolution: "check_test_project_fixture@workspace:." dependencies: - "@actions/core": 1.10.0 + "@actions/core": 1.10.1 "@actions/exec": 1.1.1 languageName: unknown linkType: soft diff --git a/.github/actions/check_test_project_fixture/package.json b/.github/actions/check_test_project_fixture/package.json index a60e9828b2d4..11a229c6dafa 100644 --- a/.github/actions/check_test_project_fixture/package.json +++ b/.github/actions/check_test_project_fixture/package.json @@ -2,7 +2,7 @@ "name": "check_test_project_fixture", "private": true, "dependencies": { - "@actions/core": "1.10.0", + "@actions/core": "1.10.1", "@actions/exec": "1.1.1" }, "packageManager": "yarn@3.6.3" diff --git a/.github/actions/check_test_project_fixture/yarn.lock b/.github/actions/check_test_project_fixture/yarn.lock index 56729d47cb3f..e3ef1e202170 100644 --- a/.github/actions/check_test_project_fixture/yarn.lock +++ b/.github/actions/check_test_project_fixture/yarn.lock @@ -5,13 +5,13 @@ __metadata: version: 6 cacheKey: 8c0 -"@actions/core@npm:1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" +"@actions/core@npm:1.10.1": + version: 1.10.1 + resolution: "@actions/core@npm:1.10.1" dependencies: "@actions/http-client": ^2.0.1 uuid: ^8.3.2 - checksum: 9214d1e0cf5cf2a5d48b8f3b12488c6be9f6722ea60f2397409226e8410b5a3e12e558d9b66c93469d180399865ec20180119408a1770f026bd9ecac6965fcda + checksum: 7a61446697a23dcad3545cf0634dedbdedf20ae9a0ee6ee977554589a15deb4a93593ee48a41258933d58ce0778f446b0d2c162b60750956fb75e0b9560fb832 languageName: node linkType: hard @@ -44,7 +44,7 @@ __metadata: version: 0.0.0-use.local resolution: "check_test_project_fixture@workspace:." dependencies: - "@actions/core": 1.10.0 + "@actions/core": 1.10.1 "@actions/exec": 1.1.1 languageName: unknown linkType: soft diff --git a/.github/actions/detect-changes/action.yml b/.github/actions/detect-changes/action.yml new file mode 100644 index 000000000000..dc581c9253c4 --- /dev/null +++ b/.github/actions/detect-changes/action.yml @@ -0,0 +1,14 @@ +name: Detect Changes +description: Determines what areas of the framework have been changed + +outputs: + docs: + description: If *only* docs have changed + rsc: + description: If RSC-related changes have been made + ssr: + description: If SSR-related changes have been made + +runs: + using: node20 + main: detectChanges.mjs diff --git a/.github/actions/detect-changes/cases/onlydocs.mjs b/.github/actions/detect-changes/cases/onlydocs.mjs new file mode 100644 index 000000000000..39e66ac7d381 --- /dev/null +++ b/.github/actions/detect-changes/cases/onlydocs.mjs @@ -0,0 +1,33 @@ +/** + * Detects if there are only changes to the documentation + * + * @param {string[]} changedFiles The list of files which git has listed as changed + * @returns {boolean} True if there are changes, false if not + */ +export function onlyDocsChanged(changedFiles){ + for (const changedFile of changedFiles) { + if (changedFile.startsWith('docs')) { + continue + } + + for (const fileToIgnore of [ + 'CHANGELOG.md', + 'CODE_OF_CONDUCT.md', + 'CONTRIBUTING.md', + 'CONTRIBUTORS.md', + 'LICENSE', + 'README.md', + 'SECURITY.md', + ]) { + if (changedFile === fileToIgnore) { + continue + } + } + + console.log('Non-docs change detected:', changedFile) + return false + } + + console.log('Only docs changes') + return true +} diff --git a/.github/actions/rsc_related_changes/rsc_related_changes.mjs b/.github/actions/detect-changes/cases/rsc.mjs similarity index 56% rename from .github/actions/rsc_related_changes/rsc_related_changes.mjs rename to .github/actions/detect-changes/cases/rsc.mjs index 42ff60c26495..eefd7294b184 100644 --- a/.github/actions/rsc_related_changes/rsc_related_changes.mjs +++ b/.github/actions/detect-changes/cases/rsc.mjs @@ -1,26 +1,11 @@ -import core from '@actions/core' -import { exec, getExecOutput } from '@actions/exec' - -async function main() { - const branch = process.env.GITHUB_BASE_REF - - // If there is no branch, we're not in a pull request - if (!branch) { - core.setOutput('rsc-related-changes', false) - return - } - - await exec(`git fetch origin ${branch}`) - - const { stdout } = await getExecOutput( - `git diff origin/${branch} --name-only` - ) - - const changedFiles = stdout.toString().trim().split('\n').filter(Boolean) - +/** + * Detects if there are RSC changes + * + * @param {string[]} changedFiles The list of files which git has listed as changed + * @returns {boolean} True if there are changes, false if not + */ +export function rscChanged(changedFiles){ for (const changedFile of changedFiles) { - console.log('changedFile', changedFile) - // As the RSC implementation changes, this list will need to be updated. // Also, I could be much more specific here, but then I'd also have to // update this list much more often. So this'll serve as a good enough @@ -32,18 +17,16 @@ async function main() { changedFile.startsWith('.github/actions/set-up-rsa-project/') || changedFile.startsWith('.github/actions/set-up-rsc-external-packages-project/') || changedFile.startsWith('.github/actions/set-up-rsc-project/') || - changedFile.startsWith('github/actions/rsc_related_changes/') || changedFile.startsWith('packages/internal/') || changedFile.startsWith('packages/project-config/') || changedFile.startsWith('packages/web/') || changedFile.startsWith('packages/vite/') ) { - core.setOutput('rsc-related-changes', true) - return + console.log('RSC change detected:', changedFile) + return true } } - core.setOutput('rsc-related-changes', false) + console.log('No RSC changes') + return false } - -main() diff --git a/.github/actions/detect-changes/cases/ssr.mjs b/.github/actions/detect-changes/cases/ssr.mjs new file mode 100644 index 000000000000..7f83bc9b9a02 --- /dev/null +++ b/.github/actions/detect-changes/cases/ssr.mjs @@ -0,0 +1,26 @@ +/** + * Detects if there are SSR changes + * + * @param {string[]} changedFiles The list of files which git has listed as changed + * @returns {boolean} True if there are changes, false if not + */ +export function ssrChanged(changedFiles){ + for (const changedFile of changedFiles) { + if ( + changedFile.startsWith('tasks/smoke-tests/streaming-ssr') || + changedFile.startsWith('tasks/smoke-tests/basePlaywright.config.ts') || + changedFile.startsWith('packages/internal/') || + changedFile.startsWith('packages/project-config/') || + changedFile.startsWith('packages/web/') || + changedFile.startsWith('packages/router/') || + changedFile.startsWith('packages/web-server/') || + changedFile.startsWith('packages/vite/') + ) { + console.log('SSR change detected:', changedFile) + return true + } + } + + console.log('No SSR changes') + return false +} diff --git a/.github/actions/detect-changes/detectChanges.mjs b/.github/actions/detect-changes/detectChanges.mjs new file mode 100644 index 000000000000..64eff77b6cad --- /dev/null +++ b/.github/actions/detect-changes/detectChanges.mjs @@ -0,0 +1,37 @@ +import core from '@actions/core' +import { exec, getExecOutput } from '@actions/exec' +import { onlyDocsChanged } from './cases/onlydocs.mjs' +import { rscChanged } from './cases/rsc.mjs' +import { ssrChanged } from './cases/ssr.mjs' + +async function main() { + const branch = process.env.GITHUB_BASE_REF + + // If there's no branch, we're not in a pull request. + if (!branch) { + core.setOutput('onlydocs', false) + core.setOutput('rsc', false) + core.setOutput('ssr', false) + return + } + + await exec(`git fetch origin ${branch}`) + + const { stdout } = await getExecOutput(`git diff origin/${branch} --name-only`) + const changedFiles = stdout.toString().trim().split('\n').filter(Boolean) + console.log(`${changedFiles.length} changed files`) + + const onlyDocs = onlyDocsChanged(changedFiles) + if(onlyDocs){ + core.setOutput('onlydocs', true) + core.setOutput('rsc', false) + core.setOutput('ssr', false) + return + } + + core.setOutput('onlydocs', false) + core.setOutput('rsc', rscChanged(changedFiles)) + core.setOutput('ssr', ssrChanged(changedFiles)) +} + +main() diff --git a/.github/actions/rsc_related_changes/package.json b/.github/actions/detect-changes/package.json similarity index 64% rename from .github/actions/rsc_related_changes/package.json rename to .github/actions/detect-changes/package.json index 84293a6a3295..40f7015b5bc6 100644 --- a/.github/actions/rsc_related_changes/package.json +++ b/.github/actions/detect-changes/package.json @@ -1,8 +1,8 @@ { - "name": "only_doc_changes", + "name": "detect-changes", "private": true, "dependencies": { - "@actions/core": "1.10.0", + "@actions/core": "1.10.1", "@actions/exec": "1.1.1" }, "packageManager": "yarn@3.6.3" diff --git a/.github/actions/rsc_related_changes/yarn.lock b/.github/actions/detect-changes/yarn.lock similarity index 84% rename from .github/actions/rsc_related_changes/yarn.lock rename to .github/actions/detect-changes/yarn.lock index 527838bbdcb8..fb228a60ac7c 100644 --- a/.github/actions/rsc_related_changes/yarn.lock +++ b/.github/actions/detect-changes/yarn.lock @@ -5,13 +5,13 @@ __metadata: version: 6 cacheKey: 8c0 -"@actions/core@npm:1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" +"@actions/core@npm:1.10.1": + version: 1.10.1 + resolution: "@actions/core@npm:1.10.1" dependencies: "@actions/http-client": ^2.0.1 uuid: ^8.3.2 - checksum: 9214d1e0cf5cf2a5d48b8f3b12488c6be9f6722ea60f2397409226e8410b5a3e12e558d9b66c93469d180399865ec20180119408a1770f026bd9ecac6965fcda + checksum: 7a61446697a23dcad3545cf0634dedbdedf20ae9a0ee6ee977554589a15deb4a93593ee48a41258933d58ce0778f446b0d2c162b60750956fb75e0b9560fb832 languageName: node linkType: hard @@ -40,11 +40,11 @@ __metadata: languageName: node linkType: hard -"only_doc_changes@workspace:.": +"detect-changes@workspace:.": version: 0.0.0-use.local - resolution: "only_doc_changes@workspace:." + resolution: "detect-changes@workspace:." dependencies: - "@actions/core": 1.10.0 + "@actions/core": 1.10.1 "@actions/exec": 1.1.1 languageName: unknown linkType: soft diff --git a/.github/actions/only_doc_changes/action.yml b/.github/actions/only_doc_changes/action.yml deleted file mode 100644 index d1c683f50219..000000000000 --- a/.github/actions/only_doc_changes/action.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: Docs -description: Determines if the PR only changes docs -outputs: - only-doc-changes: - description: If the PR only changes docs -runs: - using: node20 - main: only_doc_changes.mjs diff --git a/.github/actions/only_doc_changes/only_doc_changes.mjs b/.github/actions/only_doc_changes/only_doc_changes.mjs deleted file mode 100644 index 4f0cf40bf4f2..000000000000 --- a/.github/actions/only_doc_changes/only_doc_changes.mjs +++ /dev/null @@ -1,45 +0,0 @@ -import core from '@actions/core' -import { exec, getExecOutput } from '@actions/exec' - -async function main() { - const branch = process.env.GITHUB_BASE_REF - - // If there is no branch, we're not in a pull request - if (!branch) { - core.setOutput('only-doc-changes', false) - return - } - - await exec(`git fetch origin ${branch}`) - - const { stdout } = await getExecOutput(`git diff origin/${branch} --name-only`) - - const changedFiles = stdout.toString().trim().split('\n').filter(Boolean) - - for (const changedFile of changedFiles) { - if (changedFile.startsWith('docs')) { - continue - } - - for (const fileToIgnore of [ - 'CHANGELOG.md', - 'CODE_OF_CONDUCT.md', - 'CONTRIBUTING.md', - 'CONTRIBUTORS.md', - 'LICENSE', - 'README.md', - 'SECURITY.md', - ]) { - if (changedFile === fileToIgnore) { - continue - } - } - - core.setOutput('only-doc-changes', false) - return - } - - core.setOutput('only-doc-changes', true) -} - -main() diff --git a/.github/actions/only_doc_changes/package.json b/.github/actions/only_doc_changes/package.json deleted file mode 100644 index 84293a6a3295..000000000000 --- a/.github/actions/only_doc_changes/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "only_doc_changes", - "private": true, - "dependencies": { - "@actions/core": "1.10.0", - "@actions/exec": "1.1.1" - }, - "packageManager": "yarn@3.6.3" -} diff --git a/.github/actions/only_doc_changes/yarn.lock b/.github/actions/only_doc_changes/yarn.lock deleted file mode 100644 index 527838bbdcb8..000000000000 --- a/.github/actions/only_doc_changes/yarn.lock +++ /dev/null @@ -1,66 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8c0 - -"@actions/core@npm:1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" - dependencies: - "@actions/http-client": ^2.0.1 - uuid: ^8.3.2 - checksum: 9214d1e0cf5cf2a5d48b8f3b12488c6be9f6722ea60f2397409226e8410b5a3e12e558d9b66c93469d180399865ec20180119408a1770f026bd9ecac6965fcda - languageName: node - linkType: hard - -"@actions/exec@npm:1.1.1": - version: 1.1.1 - resolution: "@actions/exec@npm:1.1.1" - dependencies: - "@actions/io": ^1.0.1 - checksum: 4a09f6bdbe50ce68b5cf8a7254d176230d6a74bccf6ecc3857feee209a8c950ba9adec87cc5ecceb04110182d1c17117234e45557d72fde6229b7fd3a395322a - languageName: node - linkType: hard - -"@actions/http-client@npm:^2.0.1": - version: 2.0.1 - resolution: "@actions/http-client@npm:2.0.1" - dependencies: - tunnel: ^0.0.6 - checksum: b58987ba2f53d7988f612ede7ff834573a3360c21f8fdea9fea92f26ada0fd0efafb22aa7d83f49c18965a5b765775d5253e2edb8d9476d924c4b304ef726b67 - languageName: node - linkType: hard - -"@actions/io@npm:^1.0.1": - version: 1.1.2 - resolution: "@actions/io@npm:1.1.2" - checksum: 61c871bbee1cf58f57917d9bb2cf6bb7ea4dc40de3f65c7fb4ec619ceff57fc98f56be9cca2d476b09e7a96e1cba0d88cd125c4f690d384b9483935186f256c1 - languageName: node - linkType: hard - -"only_doc_changes@workspace:.": - version: 0.0.0-use.local - resolution: "only_doc_changes@workspace:." - dependencies: - "@actions/core": 1.10.0 - "@actions/exec": 1.1.1 - languageName: unknown - linkType: soft - -"tunnel@npm:^0.0.6": - version: 0.0.6 - resolution: "tunnel@npm:0.0.6" - checksum: e27e7e896f2426c1c747325b5f54efebc1a004647d853fad892b46d64e37591ccd0b97439470795e5262b5c0748d22beb4489a04a0a448029636670bfd801b75 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard diff --git a/.github/actions/rsc_related_changes/action.yml b/.github/actions/rsc_related_changes/action.yml deleted file mode 100644 index 6c1a8e1c293c..000000000000 --- a/.github/actions/rsc_related_changes/action.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: RSC Related Changes -description: Determines if the PR makes any changes related to RSCs -outputs: - rsc-related-changes: - description: If the PR makes any RSC related changes -runs: - using: node20 - main: rsc_related_changes.mjs diff --git a/.github/actions/set-up-rsc-project/setUpRscProject.mjs b/.github/actions/set-up-rsc-project/setUpRscProject.mjs index adf51d038123..928926f38355 100644 --- a/.github/actions/set-up-rsc-project/setUpRscProject.mjs +++ b/.github/actions/set-up-rsc-project/setUpRscProject.mjs @@ -93,13 +93,17 @@ async function setUpRscProject( await execInProject(`node ${rwBinPath} experimental setup-rsc`) console.log() - console.log(`Building project in ${rscProjectPath}`) - await execInProject(`node ${rwBinPath} build -v`) - console.log() - console.log(`Copying over framework files to ${rscProjectPath}`) await execInProject(`node ${rwfwBinPath} project:copy`, { env: { RWFW_PATH: REDWOOD_FRAMEWORK_PATH }, }) console.log() + + console.log('Installing dependencies') + await execInProject('yarn install') + console.log() + + console.log(`Building project in ${rscProjectPath}`) + await execInProject(`node ${rwBinPath} build -v`) + console.log() } diff --git a/.github/actions/set-up-test-project/action.yaml b/.github/actions/set-up-test-project/action.yaml index 9866507ab1db..0c0e623056a5 100644 --- a/.github/actions/set-up-test-project/action.yaml +++ b/.github/actions/set-up-test-project/action.yaml @@ -9,6 +9,9 @@ inputs: bundler: description: The bundler to use (vite or webpack) default: vite + canary: + description: Upgrade the project to canary? + default: "false" outputs: test-project-path: diff --git a/.github/actions/set-up-test-project/setUpTestProject.mjs b/.github/actions/set-up-test-project/setUpTestProject.mjs index a06c43f3c393..e8eb2da6a80b 100644 --- a/.github/actions/set-up-test-project/setUpTestProject.mjs +++ b/.github/actions/set-up-test-project/setUpTestProject.mjs @@ -25,8 +25,12 @@ core.setOutput('test-project-path', TEST_PROJECT_PATH) const bundler = core.getInput('bundler') +const canary = core.getInput('canary') === 'true' + + console.log({ bundler, + canary }) console.log() @@ -34,7 +38,7 @@ console.log() const { dependenciesKey, distKey -} = await createCacheKeys({ baseKeyPrefix: 'test-project', distKeyPrefix: bundler }) +} = await createCacheKeys({ baseKeyPrefix: 'test-project', distKeyPrefix: bundler, canary }) /** * @returns {Promise} @@ -54,7 +58,9 @@ async function main() { await sharedTasks() } else { console.log(`Cache not found for input keys: ${distKey}, ${dependenciesKey}`) - await setUpTestProject() + await setUpTestProject({ + canary: true + }) } await cache.saveCache([TEST_PROJECT_PATH], distKey) @@ -62,9 +68,10 @@ async function main() { } /** + * *@param {{canary: boolean}} options * @returns {Promise} */ -async function setUpTestProject() { +async function setUpTestProject({ canary }) { const TEST_PROJECT_FIXTURE_PATH = path.join( REDWOOD_FRAMEWORK_PATH, '__fixtures__', @@ -83,6 +90,12 @@ async function setUpTestProject() { await execInProject('yarn install') console.log() + if (canary) { + console.log(`Upgrading project to canary`) + await execInProject('yarn rw upgrade -t canary') + console.log() + } + await cache.saveCache([TEST_PROJECT_PATH], dependenciesKey) console.log(`Cache saved with key: ${dependenciesKey}`) diff --git a/.github/workflows/check-create-redwood-app.yml b/.github/workflows/check-create-redwood-app.yml index 9cbf9147df01..cd1f964a9714 100644 --- a/.github/workflows/check-create-redwood-app.yml +++ b/.github/workflows/check-create-redwood-app.yml @@ -15,8 +15,8 @@ jobs: name: Check create redwood app runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: yarn install diff --git a/.github/workflows/check-test-project-fixture.yml b/.github/workflows/check-test-project-fixture.yml index 09606ca82424..6a60ad3ce0c1 100644 --- a/.github/workflows/check-test-project-fixture.yml +++ b/.github/workflows/check-test-project-fixture.yml @@ -15,8 +15,8 @@ jobs: name: Check test project fixture runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - run: yarn install diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e809bd381b3c..e5644306161b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,65 +15,46 @@ env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} jobs: - only-doc-changes: + detect-changes: if: github.repository == 'redwoodjs/redwood' - name: πŸ“– Only doc changes? + name: πŸ” Detect changes runs-on: ubuntu-latest - outputs: - only-doc-changes: ${{ steps.only-doc-changes.outputs.only-doc-changes }} - steps: - - uses: actions/checkout@v3 - - - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: 🐈 Yarn install - working-directory: ./.github/actions/only_doc_changes - run: yarn install --inline-builds - env: - GITHUB_TOKEN: ${{ github.token }} - - name: πŸ“– Only doc changes? - id: only-doc-changes - uses: ./.github/actions/only_doc_changes - - rsc-related-changes: - needs: check - if: github.repository == 'redwoodjs/redwood' - name: 🐘 RSC related changes? - runs-on: ubuntu-latest outputs: - rsc-related-changes: ${{ steps.rsc-related-changes.outputs.rsc-related-changes }} + onlydocs: ${{ steps.detect-changes.outputs.onlydocs }} + rsc: ${{ steps.detect-changes.outputs.rsc }} + ssr: ${{ steps.detect-changes.outputs.ssr }} + steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 - name: 🐈 Yarn install - working-directory: ./.github/actions/rsc_related_changes + working-directory: ./.github/actions/detect-changes run: yarn install --inline-builds env: GITHUB_TOKEN: ${{ github.token }} - - name: 🐘 RSC related changes? - id: rsc-related-changes - uses: ./.github/actions/rsc_related_changes + - name: πŸ” Detect changes + id: detect-changes + uses: ./.github/actions/detect-changes check: - needs: only-doc-changes - if: needs.only-doc-changes.outputs.only-doc-changes == 'false' + needs: detect-changes + if: needs.detect-changes.outputs.onlydocs == 'false' + name: βœ… Check constraints, dependencies, and package.json's runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -86,31 +67,35 @@ jobs: - name: βœ… Check constraints, dependencies, and package.json's uses: ./tasks/check - check-docs: - needs: only-doc-changes - if: needs.only-doc-changes.outputs.only-doc-changes == 'true' + check-skip: + needs: detect-changes + if: needs.detect-changes.outputs.onlydocs == 'true' + name: βœ… Check constraints, dependencies, and package.json's runs-on: ubuntu-latest + steps: - - run: echo "Only doc changes" + - run: echo "Skipped" build-lint-test: needs: check + strategy: matrix: os: [ubuntu-latest, windows-latest] - fail-fast: true + name: πŸ— Build, lint, test / ${{ matrix.os }} / node 18 latest runs-on: ${{ matrix.os }} + steps: - name: Remove the tsc problem matcher if not ubuntu-latest if: matrix.os != 'ubuntu-latest' run: echo "echo "::remove-matcher owner=tsc::"" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -128,6 +113,9 @@ jobs: - name: πŸ”Ž Lint run: yarn lint + - name: 🌑 Test Types + run: yarn test:types + - name: Get number of CPU cores if: always() id: cpu-cores @@ -136,16 +124,19 @@ jobs: - name: πŸ§ͺ Test run: yarn test-ci ${{ steps.cpu-cores.outputs.count }} - build-lint-test-docs: - needs: only-doc-changes - if: needs.only-doc-changes.outputs.only-doc-changes == 'true' + build-lint-test-skip: + needs: detect-changes + if: needs.detect-changes.outputs.onlydocs == 'true' + strategy: matrix: os: [ubuntu-latest, windows-latest] + name: πŸ— Build, lint, test / ${{ matrix.os }} / node 18 latest runs-on: ${{ matrix.os }} + steps: - - run: echo "Only doc changes" + - run: echo "Skipped" tutorial-e2e: needs: check @@ -158,10 +149,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -221,16 +212,19 @@ jobs: cypress/e2e/01-tutorial/*.cy.js cypress/e2e/04-logger/*.cy.js - tutorial-e2e-docs: - needs: only-doc-changes - if: needs.only-doc-changes.outputs.only-doc-changes == 'true' + tutorial-e2e-skip: + needs: detect-changes + if: needs.detect-changes.outputs.onlydocs == 'true' + strategy: matrix: - os: [ubuntu-latest] - name: 🌲 Tutorial E2E / ${{ matrix.os }} / node 18 latest - runs-on: ${{ matrix.os }} + bundler: [vite, webpack] + + name: 🌲 Tutorial E2E / ${{ matrix.bundler }} / node 18 latest + runs-on: ubuntu-latest + steps: - - run: echo "Only doc changes" + - run: echo "Skipped" smoke-tests: needs: check @@ -248,10 +242,10 @@ jobs: REDWOOD_VERBOSE_TELEMETRY: 1 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -422,32 +416,39 @@ jobs: # with: # api-key: rwk_cZn4WLe8106j6tC5ygNQxDpxAwCLpFo5oLQftiRN7OP - smoke-tests-docs: - needs: only-doc-changes - if: needs.only-doc-changes.outputs.only-doc-changes == 'true' + smoke-tests-skip: + needs: detect-changes + if: needs.detect-changes.outputs.onlydocs == 'true' + strategy: matrix: os: [ubuntu-latest, windows-latest] - name: πŸ”„ Smoke test / ${{ matrix.os }} / node 18 latest + bundler: [vite, webpack] + + name: πŸ”„ Smoke tests / ${{ matrix.os }} / ${{ matrix.bundler }} / node 18 latest runs-on: ${{ matrix.os }} + steps: - - run: echo "Only doc changes" + - run: echo "Skipped" telemetry-check: needs: check + strategy: matrix: os: [ubuntu-latest, windows-latest] - fail-fast: true + name: πŸ”­ Telemetry check / ${{ matrix.os }} / node 18 latest runs-on: ${{ matrix.os }} + env: REDWOOD_REDIRECT_TELEMETRY: "http://127.0.0.1:48619" # Random port + steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -470,20 +471,23 @@ jobs: env: YARN_ENABLE_IMMUTABLE_INSTALLS: false - telemetry-check-docs: - needs: only-doc-changes - if: needs.only-doc-changes.outputs.only-doc-changes == 'true' + telemetry-check-skip: + needs: detect-changes + if: needs.detect-changes.outputs.onlydocs == 'true' + strategy: matrix: os: [ubuntu-latest, windows-latest] + name: πŸ”­ Telemetry check / ${{ matrix.os }} / node 18 latest runs-on: ${{ matrix.os }} + steps: - - run: echo "Only doc changes" + - run: echo "Skipped" rsc-smoke-tests: - needs: rsc-related-changes - if: needs.rsc-related-changes.outputs.rsc-related-changes == 'true' + needs: [check, detect-changes] + if: needs.detect-changes.outputs.rsc == 'true' strategy: matrix: @@ -497,10 +501,10 @@ jobs: REDWOOD_VERBOSE_TELEMETRY: 1 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -560,9 +564,9 @@ jobs: REDWOOD_TEST_PROJECT_PATH: ${{ steps.set-up-rsc-external-packages-project.outputs.test-project-path }} REDWOOD_DISABLE_TELEMETRY: 1 - rsc-smoke-tests-mock: - needs: rsc-related-changes - if: needs.rsc-related-changes.outputs.rsc-related-changes != 'true' + rsc-smoke-tests-skip: + needs: detect-changes + if: needs.detect-changes.outputs.rsc == 'false' strategy: matrix: @@ -572,4 +576,92 @@ jobs: runs-on: ${{ matrix.os }} steps: - - run: echo "RSC smoke tests mock" + - run: echo "Skipped" + + ssr-smoke-tests: + needs: [check, detect-changes] + if: needs.detect-changes.outputs.ssr == 'true' + + strategy: + matrix: + # TODO: add `windows-latest`. + os: [ubuntu-latest] + + name: πŸ” SSR Smoke tests / ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + env: + REDWOOD_CI: 1 + REDWOOD_VERBOSE_TELEMETRY: 1 + + steps: + - uses: actions/checkout@v4 + + - name: β¬’ Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: 🐈 Set up yarn cache + uses: ./.github/actions/set-up-yarn-cache + + - name: 🐈 Yarn install + run: yarn install --inline-builds + env: + GITHUB_TOKEN: ${{ github.token }} + + - name: πŸ”¨ Build + run: yarn build + + - name: 🌲 Set up test project + id: set-up-test-project + uses: ./.github/actions/set-up-test-project + with: + bundler: vite + canary: true + env: + REDWOOD_DISABLE_TELEMETRY: 1 + YARN_ENABLE_IMMUTABLE_INSTALLS: false + + - name: Run SSR codemods on test project + run: ./tasks/test-project/convert-to-ssr-fixture ${{ steps.set-up-test-project.outputs.test-project-path }} + env: + REDWOOD_DISABLE_TELEMETRY: 1 + + - name: 🎭 Install playwright dependencies + run: npx playwright install --with-deps chromium + + - name: Run SSR [DEV] smoke tests + working-directory: ./tasks/smoke-tests/streaming-ssr-dev + run: npx playwright test + env: + REDWOOD_TEST_PROJECT_PATH: '${{ steps.set-up-test-project.outputs.test-project-path }}' + REDWOOD_DISABLE_TELEMETRY: 1 + + - name: Build for production + working-directory: ${{ steps.set-up-test-project.outputs.test-project-path }} + run: yarn rw build --no-prerender + env: + REDWOOD_DISABLE_TELEMETRY: 1 + + - name: Run SSR [PROD] smoke tests + working-directory: ./tasks/smoke-tests/streaming-ssr-prod + run: npx playwright test + env: + REDWOOD_TEST_PROJECT_PATH: '${{ steps.set-up-test-project.outputs.test-project-path }}' + REDWOOD_DISABLE_TELEMETRY: 1 + + ssr-smoke-tests-skip: + needs: detect-changes + if: needs.detect-changes.outputs.ssr == 'false' + + strategy: + matrix: + # TODO: add `windows-latest`. + os: [ubuntu-latest] + + name: πŸ” SSR Smoke tests / ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + steps: + - run: echo "Skipped" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 09e7c1b9b231..1c3a1e263bbc 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/monthly_issue_metrics.yml b/.github/workflows/monthly_issue_metrics.yml new file mode 100644 index 000000000000..f3b7d5fa45d8 --- /dev/null +++ b/.github/workflows/monthly_issue_metrics.yml @@ -0,0 +1,41 @@ +name: Monthly issue metrics +on: + workflow_dispatch: + schedule: + # 2:03 AM on the 1st day of every month + - cron: '3 2 1 * *' + +permissions: + issues: write + pull-requests: read + +jobs: + build: + name: monthly issue metrics + runs-on: ubuntu-latest + steps: + - name: Get dates for last month + shell: bash + run: | + # Calculate the first day of the previous month + first_day=$(date -d "last month" +%Y-%m-01) + + # Calculate the last day of the previous month + last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d) + + #Set an environment variable with the date range + echo "$first_day..$last_day" + echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV" + + - name: Run issue-metrics tool + uses: github/issue-metrics@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SEARCH_QUERY: 'repo:redwoodjs/redwood is:issue created:${{ env.last_month }} -reason:"not planned"' + + - name: Create issue + uses: peter-evans/create-issue-from-file@v4 + with: + title: Monthly issue metrics report + token: ${{ secrets.GITHUB_TOKEN }} + content-filepath: ./issue_metrics.md diff --git a/.github/workflows/monthly_issue_metrics_json.yml b/.github/workflows/monthly_issue_metrics_json.yml new file mode 100644 index 000000000000..cfd3be71eacd --- /dev/null +++ b/.github/workflows/monthly_issue_metrics_json.yml @@ -0,0 +1,39 @@ +name: Monthly issue metrics with JSON output +on: + workflow_dispatch: + schedule: + # 3:04 AM on the 1st day of every month + - cron: '4 3 1 * *' + +permissions: + issues: write + pull-requests: read + +jobs: + build: + name: monthly issue metrics (json) + runs-on: ubuntu-latest + + steps: + - name: Get dates for last month + shell: bash + run: | + # Calculate the first day of the previous month + first_day=$(date -d "last month" +%Y-%m-01) + + # Calculate the last day of the previous month + last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d) + + #Set an environment variable with the date range + echo "$first_day..$last_day" + echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV" + + - name: Run issue-metrics tool + id: issue-metrics + uses: github/issue-metrics@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SEARCH_QUERY: 'repo:redwoodjs/redwood is:issue created:${{ env.last_month }} -reason:"not planned"' + + - name: Print output of issue metrics tool + run: echo "${{ steps.issue-metrics.outputs.metrics }}" diff --git a/.github/workflows/publish-canary.yml b/.github/workflows/publish-canary.yml index 44afbf5f5a72..fffb55c15a43 100644 --- a/.github/workflows/publish-canary.yml +++ b/.github/workflows/publish-canary.yml @@ -22,14 +22,14 @@ jobs: outputs: version: ${{ steps.get-version.outputs.value }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # `fetch-depth`β€”number of commits to fetch. `0` fetches all history for all branches and tags. # This is required because lerna uses tags to determine the version. with: fetch-depth: 0 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -71,7 +71,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: πŸ’¬ Message Slack uses: ./.github/actions/message_slack_publishing with: diff --git a/.github/workflows/publish-release-candidate.yml b/.github/workflows/publish-release-candidate.yml index 0cceff6881a4..4269d9f838d6 100644 --- a/.github/workflows/publish-release-candidate.yml +++ b/.github/workflows/publish-release-candidate.yml @@ -20,13 +20,13 @@ jobs: if: github.repository == 'redwoodjs/redwood' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Required because lerna uses tags to determine the version. with: fetch-depth: 0 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -56,14 +56,14 @@ jobs: outputs: version: ${{ steps.get-version.outputs.value }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: # `fetch-depth`β€”number of commits to fetch. `0` fetches all history for all branches and tags. # This is required because lerna uses tags to determine the version. fetch-depth: 0 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -116,7 +116,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: πŸ’¬ Message Slack uses: ./.github/actions/message_slack_publishing with: diff --git a/.github/workflows/require-milestone.yml b/.github/workflows/require-milestone.yml index 2b8e505454de..c77c0d35eb19 100644 --- a/.github/workflows/require-milestone.yml +++ b/.github/workflows/require-milestone.yml @@ -16,10 +16,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: β¬’ Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/update-all-contributors.yml b/.github/workflows/update-all-contributors.yml index 61ea21cac91b..b6b86d99faf6 100644 --- a/.github/workflows/update-all-contributors.yml +++ b/.github/workflows/update-all-contributors.yml @@ -18,11 +18,11 @@ jobs: name: Update all contributors runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{ secrets.JTOAR_TOKEN }} - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/weekly_issue_metrics.yml b/.github/workflows/weekly_issue_metrics.yml new file mode 100644 index 000000000000..7bb630b4d7d7 --- /dev/null +++ b/.github/workflows/weekly_issue_metrics.yml @@ -0,0 +1,42 @@ +name: Weekly issue metrics +on: + workflow_dispatch: + schedule: + # 2:33 AM every Monday + - cron: '33 2 * * 1' + +permissions: + issues: write + pull-requests: read + +jobs: + build: + name: weekly issue metrics + runs-on: ubuntu-latest + steps: + - name: Get dates for last week + shell: bash + run: | + # Calculate the first day of the previous week (and as we all know + # weeks start on Mondays ;)) + first_day=$(date -d "last Sunday - 6 days" +%Y-%m-%d) + + # Calculate the last day of the previous week + last_day=$(date -d "last Sunday" +%Y-%m-%d) + + #Set an environment variable with the date range + echo "$first_day..$last_day" + echo "last_week=$first_day..$last_day" >> "$GITHUB_ENV" + + - name: Run issue-metrics tool + uses: github/issue-metrics@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SEARCH_QUERY: 'repo:redwoodjs/redwood is:issue created:${{ env.last_week }} -reason:"not planned"' + + - name: Create issue + uses: peter-evans/create-issue-from-file@v4 + with: + title: Weekly issue metrics report + token: ${{ secrets.GITHUB_TOKEN }} + content-filepath: ./issue_metrics.md diff --git a/.github/workflows/weekly_issue_metrics_json.yml b/.github/workflows/weekly_issue_metrics_json.yml new file mode 100644 index 000000000000..da0a8bd6fc27 --- /dev/null +++ b/.github/workflows/weekly_issue_metrics_json.yml @@ -0,0 +1,41 @@ +name: Weekly issue metrics with JSON output +on: + workflow_dispatch: + schedule: + # 2:33 AM every Monday + - cron: '33 2 * * 1' + +permissions: + issues: write + pull-requests: read + +jobs: + build: + name: weekly issue metrics json + runs-on: ubuntu-latest + steps: + - name: Get dates for last week + shell: bash + run: | + # Calculate the first day of the previous week (and as we all know + # weeks start on Mondays ;)) + first_day=$(date -d "last Sunday - 6 days" +%Y-%m-%d) + + # Calculate the last day of the previous week + last_day=$(date -d "last Sunday" +%Y-%m-%d) + + #Set an environment variable with the date range + echo "$first_day..$last_day" + echo "last_week=$first_day..$last_day" >> "$GITHUB_ENV" + + - name: Run issue-metrics tool + uses: github/issue-metrics@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SEARCH_QUERY: 'repo:redwoodjs/redwood is:issue created:${{ env.last_week }} -reason:"not planned"' + + - name: Print output of issue metrics tool + run: | + cat ./issue_metrics.json + cat ./issue_metrics.json | jq .total_item_count + cat ./issue_metrics.json | jq .average_time_to_first_response diff --git a/.yarnrc.yml b/.yarnrc.yml index a46601216899..e57c81ecfa7a 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -17,3 +17,4 @@ plugins: preferInteractive: true yarnPath: .yarn/releases/yarn-3.6.3.cjs + diff --git a/README.md b/README.md index a7a22904a337..f7e4dae195e2 100644 --- a/README.md +++ b/README.md @@ -166,36 +166,45 @@ And there you have it. ## Contributors *A gigantic "Thank YOU!" to everyone below who has contributed to one or more Redwood projects: [Framework](https://github.com/redwoodjs/redwood), [Website](https://github.com/redwoodjs/sprout), [Docs](https://github.com/redwoodjs/redwood/tree/main/docs), and [Create-Redwood Template](https://github.com/redwoodjs/redwood/tree/main/packages/create-redwood-app/template). πŸš€* -### Co-founders +### Core Team: Leadership - - - - + + + +

Tom Preston-Werner

founder, leadership

Peter Pistorius

founder

Rob Cameron

founder

David Price

founder, leadership

Amy Haywood Dutton

David Price

Tobbe Lundberg

Tom Preston-Werner
-### Core Team: Lead Maintainers and Community Leads +### Core Team: Maintainer and Community Leads - + - -

Dominic Saadi

maintainer

David Thyresson

maintainer

Daniel Choudhury

maintainer

Tobbe Lundberg

maintainer

Kris Coulson

maintainer

Keith T Elliot

community

Keith T Elliot

community

Barrett Burnworth

community

Josh Walker

maintainer

Amy Haywood Dutton

maintainer
+### Founders + + + + + + + + +

Tom Preston-Werner

Peter Pistorius

Rob Cameron

David Price
+ ### Core Team: Alumni diff --git a/__fixtures__/test-project-rsc-external-packages/.yarn/patches/vite-npm-4.4.9-e845c1bbf8.patch b/__fixtures__/test-project-rsc-external-packages/.yarn/patches/vite-npm-4.4.9-e845c1bbf8.patch deleted file mode 100644 index eb67d7906284..000000000000 --- a/__fixtures__/test-project-rsc-external-packages/.yarn/patches/vite-npm-4.4.9-e845c1bbf8.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/dist/node/chunks/dep-df561101.js b/dist/node/chunks/dep-df561101.js -index 1bc8674177fe73120171b22436e6104713c5d764..f0fee7b385868cb01c6d47b80d7f64a7368c0412 100644 ---- a/dist/node/chunks/dep-df561101.js -+++ b/dist/node/chunks/dep-df561101.js -@@ -55890,12 +55890,12 @@ async function instantiateModule(url, server, context = { global }, urlStack = [ - }; - urlStack = urlStack.concat(url); - const isCircular = (url) => urlStack.includes(url); -- const { isProduction, resolve: { dedupe, preserveSymlinks }, root, } = server.config; -+ const { isProduction, resolve: { dedupe, preserveSymlinks, conditions }, root, } = server.config; - const resolveOptions = { - mainFields: ['main'], - browserField: true, - conditions: [], -- overrideConditions: ['production', 'development'], -+ overrideConditions: [...conditions, 'production', 'development'], - extensions: ['.js', '.cjs', '.json'], - dedupe, - preserveSymlinks, diff --git a/__fixtures__/test-project-rsc-external-packages/package.json b/__fixtures__/test-project-rsc-external-packages/package.json index 4e999c418059..1828eadf13ab 100644 --- a/__fixtures__/test-project-rsc-external-packages/package.json +++ b/__fixtures__/test-project-rsc-external-packages/package.json @@ -20,13 +20,5 @@ "prisma": { "seed": "yarn rw exec seed" }, - "packageManager": "yarn@3.6.3", - "resolutions": { - "vite@4.4.9": "patch:vite@npm%3A4.4.9#./.yarn/patches/vite-npm-4.4.9-e845c1bbf8.patch" - }, - "dependencies": { - "@tobbe.dev/rsc-test": "^0.0.1", - "client-only": "^0.0.1", - "server-only": "^0.0.1" - } + "packageManager": "yarn@3.6.3" } diff --git a/__fixtures__/test-project-rsc-external-packages/web/package.json b/__fixtures__/test-project-rsc-external-packages/web/package.json index 5af204c17b2d..0029b866c529 100644 --- a/__fixtures__/test-project-rsc-external-packages/web/package.json +++ b/__fixtures__/test-project-rsc-external-packages/web/package.json @@ -14,8 +14,11 @@ "@redwoodjs/forms": "7.0.0-canary.413", "@redwoodjs/router": "7.0.0-canary.413", "@redwoodjs/web": "7.0.0-canary.413", + "@tobbe.dev/rsc-test": "0.0.3", + "client-only": "0.0.1", "react": "0.0.0-experimental-e5205658f-20230913", - "react-dom": "0.0.0-experimental-e5205658f-20230913" + "react-dom": "0.0.0-experimental-e5205658f-20230913", + "server-only": "0.0.1" }, "devDependencies": { "@redwoodjs/vite": "7.0.0-canary.413", diff --git a/__fixtures__/test-project-rsc-external-packages/web/src/App.tsx b/__fixtures__/test-project-rsc-external-packages/web/src/App.tsx index c04ede827331..01a382fb66eb 100644 --- a/__fixtures__/test-project-rsc-external-packages/web/src/App.tsx +++ b/__fixtures__/test-project-rsc-external-packages/web/src/App.tsx @@ -1,14 +1,12 @@ -// import { RscForm } from '@tobbe.dev/rsc-test' +import { RscForm } from '@tobbe.dev/rsc-test' import { Assets } from '@redwoodjs/vite/assets' import { ProdRwRscServerGlobal } from '@redwoodjs/vite/rwRscGlobal' // @ts-expect-error no types import styles from './App.module.css' -import { onSend } from './chat' +import { onSend } from './actions' import { Counter } from './Counter' -// TODO (RSC): Switch to RscForm from @tobbe.dev as commented above -import { Form as RscForm } from './Form' import './App.css' diff --git a/__fixtures__/test-project-rsc-external-packages/web/src/Counter.tsx b/__fixtures__/test-project-rsc-external-packages/web/src/Counter.tsx index c28c06cf1165..5f21e7cdac2d 100644 --- a/__fixtures__/test-project-rsc-external-packages/web/src/Counter.tsx +++ b/__fixtures__/test-project-rsc-external-packages/web/src/Counter.tsx @@ -2,8 +2,7 @@ import React from 'react' -// TODO (RSC): Enable this -// import 'client-only' +import 'client-only' // @ts-expect-error no types import styles from './Counter.module.css' diff --git a/__fixtures__/test-project-rsc-external-packages/web/src/Form.tsx b/__fixtures__/test-project-rsc-external-packages/web/src/Form.tsx deleted file mode 100644 index d1ef804e0e9b..000000000000 --- a/__fixtures__/test-project-rsc-external-packages/web/src/Form.tsx +++ /dev/null @@ -1,49 +0,0 @@ -'use client' - -import React from 'react' - -/** The current status of the form */ -export type ChatStatus = 'idle' | 'pending' | 'streaming' - -interface Props { - onSend: (data: FormData) => Promise<{ messages: Array }> -} - -export const Form = ({ onSend }: Props) => { - // `key` is used to clear the form after each send. - const [key, setKey] = React.useState(0) - const [status, setStatus] = React.useState('idle') - const [conversation, setConversation] = React.useState>([]) - const [submitCount, setSubmitCount] = React.useState(0) - - async function action(formData: FormData) { - if (status !== 'idle') { - return - } - - setStatus('pending') - - const { messages } = await onSend(formData) - - setConversation((existing) => existing.concat(messages)) - setKey((k) => k + 1) - setSubmitCount((count) => count + 1) - - setStatus('idle') - } - - return ( - <> - The form has been submitted {submitCount} times. -
- {conversation.map((message, i) => ( -

{message}

- ))} - - - - - ) -} diff --git a/__fixtures__/test-project-rsc-external-packages/web/src/actions.ts b/__fixtures__/test-project-rsc-external-packages/web/src/actions.ts new file mode 100644 index 000000000000..3c8cb98dd189 --- /dev/null +++ b/__fixtures__/test-project-rsc-external-packages/web/src/actions.ts @@ -0,0 +1,16 @@ +'use server' + +import { randomWords } from './words' + +export async function onSend(formData: FormData) { + console.log('formData entries:') + formData.forEach((value, key) => console.log(key, value)) + + await new Promise((resolve) => setTimeout(resolve, 50 + Math.random() * 50)) + + // Want to keep something like this in the codebase to test + // importing files that use the `server-only` package + const words = await randomWords(5) + + return formData.get('message') + ': ' + words.join(' ') +} diff --git a/__fixtures__/test-project-rsc-external-packages/web/src/chat.ts b/__fixtures__/test-project-rsc-external-packages/web/src/chat.ts deleted file mode 100644 index 500d0434349f..000000000000 --- a/__fixtures__/test-project-rsc-external-packages/web/src/chat.ts +++ /dev/null @@ -1,17 +0,0 @@ -'use server' - -import { randomWords } from './words' - -export async function onSend(formData: FormData) { - const message = formData.get('message') - - console.log('message', message) - - if (typeof message !== 'string') { - throw new Error('message has to be a string') - } - - const words = await randomWords(5) - - return { messages: [message, words.join(' ')] } -} diff --git a/__fixtures__/test-project/web/package.json b/__fixtures__/test-project/web/package.json index 02a6dc8b0fb2..57f543c33bfd 100644 --- a/__fixtures__/test-project/web/package.json +++ b/__fixtures__/test-project/web/package.json @@ -27,6 +27,6 @@ "postcss": "^8.4.31", "postcss-loader": "^7.3.3", "prettier-plugin-tailwindcss": "0.4.1", - "tailwindcss": "^3.3.3" + "tailwindcss": "^3.3.5" } } diff --git a/docs/.node-version b/docs/.node-version new file mode 100644 index 000000000000..3c032078a4a2 --- /dev/null +++ b/docs/.node-version @@ -0,0 +1 @@ +18 diff --git a/docs/docs/app-configuration-redwood-toml.md b/docs/docs/app-configuration-redwood-toml.md index c009b12d1ac1..fee88a7b9cdc 100644 --- a/docs/docs/app-configuration-redwood-toml.md +++ b/docs/docs/app-configuration-redwood-toml.md @@ -290,7 +290,7 @@ api | πŸ—’ Custom api | "--------------------------e66d9a27b7c2b271\r\nContent-Disposition: attachment; name=\"image\"; filename=\"favicon.png\"\r\nContent-Type: image/png\r\n\r\nοΏ½PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000 \u0000\u0000\u0000`οΏ½\r\n--------------------------e66d9a27b7c2b271--\r\n" ``` -:::caution File uploads only work in a serverful deploy +:::warning File uploads only work in a serverful deploy Serverless functions on Netlify or Vercel do not use this Fastify configuration. They also have memory and execution time limits that don't lend themselves to handling file uploads of any practical size. diff --git a/docs/docs/auth/clerk.md b/docs/docs/auth/clerk.md index ed71df136f8e..560e0f1af65f 100644 --- a/docs/docs/auth/clerk.md +++ b/docs/docs/auth/clerk.md @@ -4,7 +4,7 @@ sidebar_label: Clerk # Clerk Authentication -:::caution Did you set up Clerk a while ago? +:::warning Did you set up Clerk a while ago? If you set up Clerk a while ago, you may be using a deprecated `authDecoder` that's subject to rate limiting. This decoder will be removed in the next major. diff --git a/docs/docs/auth/dbauth.md b/docs/docs/auth/dbauth.md index 29836984cc3e..2da40f91d378 100644 --- a/docs/docs/auth/dbauth.md +++ b/docs/docs/auth/dbauth.md @@ -52,41 +52,42 @@ You can also add WebAuthn to an existing dbAuth install. [Read more about WebAut Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases (these do not include the additional WebAuthn required options, make sure you get those from the output of the `setup` command): > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> -> yarn rw generate dbAuth +> ``` +> yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. @@ -227,13 +228,13 @@ forgotPassword: { ### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` > Note that although the user table contains a hash of `resetToken`, only for the handler, `user.resetToken` will contain the raw `resetToken` to use for generating a password reset link. ### resetPassword.enabled @@ -318,7 +319,7 @@ By default, the session cookie will not have the `Domain` property set, which a To do this, set the `cookie.Domain` property in your `api/src/functions/auth.js` configuration, set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: -```json title=api/src/functions/auth.js +```json title="api/src/functions/auth.js" cookie: { HttpOnly: true, Path: '/', @@ -331,12 +332,12 @@ cookie: { ### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. -:::caution .env and Version Control +:::warning .env and Version Control The `.env` file is set to be ignored by git and not committed to version control. There is another file, `.env.defaults`, which is meant to be safe to commit and contain simple ENV vars that your dev team can share. The encryption key for the session cookie is NOT one of these shareable vars! @@ -436,7 +437,7 @@ If you didn't setup WebAuthn at first, but decided you now want WebAuthn, you co You'll need to add two fields to your `User` model, and a new `UserCredential` model to store the devices that are used and associate them with a user: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" datasource db { provider = "sqlite" url = env("DATABASE_URL") @@ -474,7 +475,7 @@ model UserCredential { Run `yarn rw prisma migrate dev` to apply the changes to your database. -:::caution Do Not Allow GraphQL Access to `UserCredential` +:::warning Do Not Allow GraphQL Access to `UserCredential` As you can probably tell by the name, this new model contains secret credential info for the user. You **should not** make this data publicly available by adding an SDL file to `api/src/graphql`. @@ -492,7 +493,7 @@ credentials: [UserCredential]! Next we need to let dbAuth know about the new field and model names, as well as how you want WebAuthn to behave (see the highlighted section) -```javascript title=api/src/functions/auth.js +```javascript title="api/src/functions/auth.js" import { db } from 'src/lib/db' import { DbAuthHandler } from '@redwoodjs/api' diff --git a/docs/docs/cli-commands.md b/docs/docs/cli-commands.md index 5f2d73d0a386..0215aaa8b2ea 100644 --- a/docs/docs/cli-commands.md +++ b/docs/docs/cli-commands.md @@ -290,7 +290,7 @@ The following command will build, apply Prisma DB migrations, and skip data migr yarn redwood deploy netlify --no-data-migrate ``` -:::caution +:::warning While you may be tempted to use the [Netlify CLI](https://cli.netlify.com) commands to [build](https://cli.netlify.com/commands/build) and [deploy](https://cli.netlify.com/commands/deploy) your project directly from you local project directory, doing so **will lead to errors when deploying and/or when running functions**. I.e. errors in the function needed for the GraphQL server, but also other serverless functions. The main reason for this is that these Netlify CLI commands simply build and deploy -- they build your project locally and then push the dist folder. That means that when building a RedwoodJS project, the [Prisma client is generated with binaries matching the operating system at build time](https://cli.netlify.com/commands/link) -- and not the [OS compatible](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#binarytargets-options) with running functions on Netlify. Your Prisma client engine may be `darwin` for OSX or `windows` for Windows, but it needs to be `debian-openssl-1.1.x` or `rhel-openssl-1.1.x`. If the client is incompatible, your functions will fail. @@ -1780,7 +1780,7 @@ yarn redwood setup cache ### setup custom-web-index -:::caution This command only applies to projects using Webpack +:::warning This command only applies to projects using Webpack As of v6, all Redwood projects use Vite by default. When switching projects to Vite, we made the decision to add the the entry file, `web/src/entry.client.{jsx,tsx}`, back to projects. diff --git a/docs/docs/custom-web-index.md b/docs/docs/custom-web-index.md index 775fa2c891a8..8fd30f548856 100644 --- a/docs/docs/custom-web-index.md +++ b/docs/docs/custom-web-index.md @@ -4,7 +4,7 @@ description: Change how App mounts to the DOM # Custom Web Index -:::caution This doc only applies to projects using Webpack +:::warning This doc only applies to projects using Webpack As of v6, all Redwood projects use Vite by default. When switching projects to Vite, we made the decision to add the the entry file, `web/src/entry.client.{jsx,tsx}`, back to projects. diff --git a/docs/docs/data-migrations.md b/docs/docs/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/docs/data-migrations.md +++ b/docs/docs/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/docs/deploy/baremetal.md b/docs/docs/deploy/baremetal.md index 21a78d9ddda1..aec882f28381 100644 --- a/docs/docs/deploy/baremetal.md +++ b/docs/docs/deploy/baremetal.md @@ -22,7 +22,7 @@ Subsequent deploys: yarn rw deploy baremetal production ``` -:::caution Deploying to baremetal is an advanced topic +:::warning Deploying to baremetal is an advanced topic If you haven't done any kind of remote server work before, you may be in a little over your head to start with. But don't worry: until relatively recently (cloud computing, serverless, lambda functions) this is how all websites were deployed, so we've got a good 30 years of experience getting this working! @@ -274,7 +274,7 @@ sudo chown deploy:deploy /var/www/myapp You'll want to create an `.env` file in this directory containing any environment variables that are needed by your app (like `DATABASE_URL` at a minimum). This will be symlinked to each release directory so that it's available as the app expects (in the root directory of the codebase). -:::caution SSH and Non-interactive Sessions +:::warning SSH and Non-interactive Sessions The deployment process uses a '[non-interactive](https://tldp.org/LDP/abs/html/intandnonint.html)' SSH session to run commands on the remote server. A non-interactive session will often load a minimal amount of settings for better compatibility and speed. In some versions of Linux `.bashrc` by default does not load (by design) from a non-interactive session. This can lead to `yarn` (or other commands) not being found by the deployment script, even though they are in your path, because additional ENV vars are set in `~/.bashrc` which provide things like NPM paths and setup. @@ -418,7 +418,7 @@ pm2 startup You will see some output similar to the output below. We care about the output after "copy/paste the following command:" You'll need to do just that: copy the command starting with `sudo` and then paste and execute it. *Note* this command uses `sudo` so you'll need the root password to the machine in order for it to complete successfully. -:::caution +:::warning The below text is *example* output, yours will be different, don't copy and paste ours! @@ -467,7 +467,7 @@ You can define your before/after commands in three different places: * Environment specific - runs for only a single environment * Server specific - runs for only a single server in a single environment -:::caution +:::warning Custom commands are run in the new **deploy** directory, not the root of your application directory. During a deploy the `current` symlink will point to the previous directory while your code is executed in the new one, before the `current` symlink location is updated. @@ -654,7 +654,7 @@ If nginx will be serving our web side, what about api-side? Redwood's internal A This doc isn't going to go through installing and getting nginx running, there are plenty of resources for that available. What we will show is a successful nginx configuration file used by several Redwood apps currently in production. -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } @@ -701,7 +701,7 @@ yarn rw serve api When using `pm2` to start/monitor your processes, you can simplify your `deploy.toml` and `ecosystem.config.js` files to only worry about the api side: -```toml title=deploy.toml +```toml title="deploy.toml" [[production.servers]] host = "myserver.com" username = "ubuntu" @@ -717,7 +717,7 @@ packageManagerCommand = "yarn" monitorCommand = "pm2" ``` -```js title=ecosystem.config.js +```js title="ecosystem.config.js" module.exports = { apps: [ { @@ -742,7 +742,7 @@ If you don't love the path of `/.redwood/functions` for your API calls, this is For example, to simplify the path to just `/api` you'll need to make a change to `redwood.toml` and your new nginx config file: -```toml title=redwood.toml +```toml title="redwood.toml" [web] title = "My App" port = 8910 @@ -755,7 +755,7 @@ For example, to simplify the path to just `/api` you'll need to make a change to open = true ``` -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } diff --git a/docs/docs/deploy/coherence.md b/docs/docs/deploy/coherence.md index 970eaa98fa31..a2b9ec845d2a 100644 --- a/docs/docs/deploy/coherence.md +++ b/docs/docs/deploy/coherence.md @@ -17,7 +17,7 @@ To deploy to Coherence, your Redwood project needs to be hosted on GitHub and yo ## Coherence Deploy -:::caution Prerender doesn't work with Coherence yet +:::warning Prerender doesn't work with Coherence yet You can see its current status and follow updates here on GitHub: https://github.com/redwoodjs/redwood/issues/8333. diff --git a/docs/docs/deploy/netlify.md b/docs/docs/deploy/netlify.md index 4f5c87e217bd..ad62b9b5d8f5 100644 --- a/docs/docs/deploy/netlify.md +++ b/docs/docs/deploy/netlify.md @@ -13,7 +13,7 @@ If you simply want to experience the Netlify deployment process without a databa 3. run the command `yarn rw setup deploy netlify` and commit and push changes 4. use the Netlify [Quick Start](https://app.netlify.com/signup) to deploy -:::caution +:::warning While you may be tempted to use the [Netlify CLI](https://cli.netlify.com) commands to [build](https://cli.netlify.com/commands/build) and [deploy](https://cli.netlify.com/commands/deploy) your project directly from you local project directory, doing so **will lead to errors when deploying and/or when running functions**. I.e. errors in the function needed for the GraphQL server, but also other serverless functions. The main reason for this is that these Netlify CLI commands simply build and deploy -- they build your project locally and then push the dist folder. That means that when building a RedwoodJS project, the [Prisma client is generated with binaries matching the operating system at build time](https://cli.netlify.com/commands/link) -- and not the [OS compatible](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#binarytargets-options) with running functions on Netlify. Your Prisma client engine may be `darwin` for OSX or `windows` for Windows, but it needs to be `debian-openssl-1.1.x` or `rhel-openssl-1.1.x`. If the client is incompatible, your functions will fail. diff --git a/docs/docs/deploy/vercel.md b/docs/docs/deploy/vercel.md index 38beee72ec6d..5f4e6e33fe04 100644 --- a/docs/docs/deploy/vercel.md +++ b/docs/docs/deploy/vercel.md @@ -73,3 +73,18 @@ Go ahead, click that "Visit" button. You’ve earned it πŸŽ‰ From the Vercel Dashboard you can access the full settings and information for your Redwood App. The default settings seem to work just fine for most Redwood projects. Do take a look around, but be sure check out the [docs as well](https://vercel.com/docs). From now on, each time you push code to your git repo, Vercel will automatically trigger a deploy of the new code. You can also manually redeploy if you select "Deployments", then the specific deployment from the list, and finally the "Redeploy" option from the vertical dots menu next to "Visit". + +## vercel.json configuration + +By default, API requests in Vercel have a timeout limit of 15 seconds. To extend this duration, you can modify the vercel.json file by inserting the code snippet provided below. Please be aware that the ability to increase the timeout limit is exclusive to Pro plan subscribers. Additionally, it is important to note that the timeout can be increased up to a maximum of 300 seconds, which is equivalent to 5 minutes. + +``` +{ + "functions": { + "api/src/functions/graphql.*": { + "maxDuration": 120, + "runtime": "@vercel/redwood@2.0.5" + } + } +} +``` diff --git a/docs/docs/graphql.md b/docs/docs/graphql.md index 99f295db9e12..c20896d5b4a9 100644 --- a/docs/docs/graphql.md +++ b/docs/docs/graphql.md @@ -1879,7 +1879,7 @@ type Query { Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **, by default, only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. @@ -1903,7 +1903,7 @@ export const handler = createGraphQLHandler({ }) ``` -:::caution +:::warning Enabling introspection in production may pose a security risk, as it allows users to access information about your schema, queries, and mutations. Use this option with caution and make sure to secure your GraphQL API properly. diff --git a/docs/docs/how-to/dbauth-passwordless.md b/docs/docs/how-to/dbauth-passwordless.md index d938e62e20cb..e07e0bcd4c05 100644 --- a/docs/docs/how-to/dbauth-passwordless.md +++ b/docs/docs/how-to/dbauth-passwordless.md @@ -637,4 +637,4 @@ const Routes = () => { ``` ## You did it! -Now that you did you can rest easy. You're authentication relies on just your database but also, if some bad actor got access to it the only user data you have is really the email address. +Now that you did you can rest easy. Your authentication relies on just your database but also, if some bad actor got access to it the only user data you have is really the email address. diff --git a/docs/docs/how-to/oauth.md b/docs/docs/how-to/oauth.md index b3f00cc39e04..4d85e35e3408 100644 --- a/docs/docs/how-to/oauth.md +++ b/docs/docs/how-to/oauth.md @@ -61,14 +61,14 @@ You may be asked to use your 2FA code to verify that you're who you say you are, Add those to your app's `.env` file (or wherever you're managing your secrets). Note that it's best to have a different OAuth app on GitHub for each environment you deploy to. Consider this one the **dev** app, and you'll create a separate one with a different client ID and secret when you're ready to deploy to production: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 ``` We also need to denote what data we want permission to read from GitHub once someone authorizes our app. We'll want the user's public info, and probably their email address. That's only two scopes, and we can add those as another ENV var: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 # highlight-next-line @@ -79,7 +79,7 @@ If you wanted access to more GitHub data, you can specify [additional scopes](ht One more ENV var, this is the same callback URL we told GitHub about. This is used in the link in the **Login with GitHub** button and gives GitHub another chance to verify that you're who you say you are: you're proving that you know where you're supposed to redirect back to: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 GITHUB_OAUTH_SCOPES="read:user user:email" @@ -91,7 +91,7 @@ GITHUB_OAUTH_REDIRECT_URI="http://localhost:8910/.redwood/functions/oauth/callba This part is pretty easy, we're just going to add a link/button to go directly to GitHub to begin the OAuth process: -```jsx title=/web/src/pages/LoginPage/LoginPage.jsx +```jsx title="/web/src/pages/LoginPage/LoginPage.jsx" { switch (event.path) { case '/oauth/callback': @@ -189,7 +189,7 @@ The `callback()` function is where we'll actually define the rest of our flow. W Now we need to make a request to GitHub to trade the `code` for an `access_token`. This is handled by a `fetch`: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { // highlight-start const { code } = event.queryStringParameters @@ -241,7 +241,7 @@ To keep things straight in our heads, let's call our local user `user` and the G Let's make the API call to GitHub's user info endpoint and dump the result to the browser: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { const { code } = event.queryStringParameters @@ -330,7 +330,7 @@ For now `provider` will always be `github` and the `uid` will be the GitHub's un Here's the `Identity` model definition: -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model Identity { id Int @id @default(autoincrement()) provider String @@ -358,7 +358,7 @@ There's no GraphQL SDL tied to the Identity table, so it is not accessible via o We'll need to add an `identities` relation to the `User` model, and make the previously required `hashedPassword` and `salt` fields optional (since users may want to *only* authenticate via GitHub, they'll never get to enter a password): -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model User { id Int @id @default(autoincrement()) email String @unique @@ -389,7 +389,7 @@ Let's add some code that returns the user if found, otherwise it creates the use Be sure to import `db` at the top of the file if you haven't already! ::: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import { db } from 'src/lib/db' @@ -575,7 +575,7 @@ Setting a cookie in the browser is a matter of returning a `Set-Cookie` header i Don't forget the new `CryptoJS` import at the top! -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import CryptoJS from 'crypto-js' @@ -659,7 +659,7 @@ Try it out, and as long as you have an indication on your site that a user is lo Here's the `oauth` function in its entirety: -```jsx title=/api/src/functions/oauth/oauth.js +```jsx title="/api/src/functions/oauth/oauth.js" import CryptoJS from 'crypto-js' import { db } from 'src/lib/db' diff --git a/docs/docs/how-to/self-hosting-redwood.md b/docs/docs/how-to/self-hosting-redwood.md index 63a01b75e95e..870b61ef84a9 100644 --- a/docs/docs/how-to/self-hosting-redwood.md +++ b/docs/docs/how-to/self-hosting-redwood.md @@ -1,5 +1,5 @@ # Self-hosting Redwood (Serverful) -:::caution +:::warning This doc has been deprecated in favor of the [Baremetal](../deploy/baremetal.md) docs. diff --git a/docs/docs/how-to/test-in-github-actions.md b/docs/docs/how-to/test-in-github-actions.md index dc41fbecff2f..8064e49b681f 100644 --- a/docs/docs/how-to/test-in-github-actions.md +++ b/docs/docs/how-to/test-in-github-actions.md @@ -93,7 +93,7 @@ model UserExample { Then add your connection strings to your `.env` file: -:::caution +:::warning Make sure you don't commit this file to your repo since it contains sensitive information. diff --git a/docs/docs/how-to/using-nvm.md b/docs/docs/how-to/using-nvm.md index b7fb82ac43c7..05ed1f716bca 100644 --- a/docs/docs/how-to/using-nvm.md +++ b/docs/docs/how-to/using-nvm.md @@ -6,7 +6,7 @@ ## Installing nvm -:::caution +:::warning If you've already installed Node.js on your machine, uninstall Node.js before installing nvm. This will prevent any conflicts between the Node.js and nvm. ### If you're on a Mac @@ -77,7 +77,7 @@ To see all the versions of Node that you can install, run the following command: nvm ls-remote ``` -:::caution +:::warning You'll need to [install yarn](https://yarnpkg.com/getting-started/install) **for each version of Node that you install.** [Corepack](https://nodejs.org/dist/latest/docs/api/corepack.html) is included with all Node.js >=16.10 installs, but you must opt-in. To enable it, run the following command: diff --git a/docs/docs/intro-to-servers.md b/docs/docs/intro-to-servers.md index b3d05cbfb941..121097e67e6f 100644 --- a/docs/docs/intro-to-servers.md +++ b/docs/docs/intro-to-servers.md @@ -63,7 +63,7 @@ If you're connecting to cloud-based servers, turning them on and off, and potent Once you're past that prompt you'll then either be prompted for your password, or logged in automatically (when using a private or public key). Let's look at each one in detail. -:::caution Baremetal First Deploy Woes? +:::warning Baremetal First Deploy Woes? If you're having trouble deploying to your server with Baremetal, and you've never connected to your server manually via SSH, this could be why: Baremetal provides no interactive prompt to accept this server fingerprint. You need to connect manually at least once before Baremetal can connect. diff --git a/docs/docs/mailer.md b/docs/docs/mailer.md new file mode 100644 index 000000000000..0707e9b5bc85 --- /dev/null +++ b/docs/docs/mailer.md @@ -0,0 +1,289 @@ +# Mailer + +RedwoodJS offers a convenient Mailer for sending emails to your users. It's not just about sending an email; delivery matters too. The way you deliver the feature requiring email is as significant as how you prepare the mail to be delivered by the infrastructure that sends emails over the internet. + +When designing the Mailer, it was crucial that mail could be: + +* sent by popular third-party services like [Resend](), [SendGrid](), [Postmark](), [Amazon SES](), and others. +* sent by [Nodemailer]() as a self-hosted OSS solution. +* use different providers depending on the use case. For instance, some transactional emails might be sent via Resend and some digest emails sent by SES. You should be able to choose the method for a specific email. +* send safely in both development and test environments in a "sandbox" without worrying that emails might accidentally leak. +* be sent as text and/or html and composed using templates by popular tools like [React Email]() or [MJML](), with support for more methods in the future. +* unit tested to set the proper to, from, cc, subject, body, and more. +* integrated with RedwoodJS Studio to help design and preview templates. + +The RedwoodJS Mailer does more than "just send an email". It is a complete end-to-end design, development, and testing package for emails. + +## Overview + +The RedwoodJS Mailer consists of [handlers](#handlers) and [renderers](#renderers), which carry out the core functionality of sending (handling) your emails and composing (rendering) your emails, respectively. This is combined with a few required files which define the necessary configuration. + +A high-level overview of the Mailer Flow is shown in the diagram below, and each case is covered in more detail below the diagram. +mailer-flow + +### Renderers + +A **renderer** transforms your React components into strings of text or HTML that can be sent as an email. + +Mailer currently offers the following renderers: +* [@redwoodjs/mailer-renderer-react-email]() based on [React Email]() +* [@redwoodjs/mailer-renderer-mjml-react]() based on [MJML]() + +You can find community-maintained renderers by searching across npm, our forums, and other community spaces. + +:::important + +Email clients are notoriously inconsistent in how they render HTML into the visual email content. Consider using a robust react library to help you write components that produce attractive emails, rendered consistently across email clients. + +::: + +### Handlers + +A **handler** is responsible for taking your rendered content and passing it on to a service that can send your email to the intended recipients, e.g., Nodemailer or Amazon SES. + +Mailer currently offers the following handlers: +* [@redwoodjs/mailer-handler-in-memory](), a simple in-memory handler typically used for testing. +* [@redwoodjs/mailer-handler-nodemailer](), which uses [Nodemailer](). +* [@redwoodjs/mailer-handler-studio](), which sends emails to the RedwoodJS Studio using nodemailer internally. +* [@redwoodjs/mailer-handler-resend](), which uses [Resend](). + +You can find community-maintained handlers by searching across npm, our forums, and other community spaces. + +### Files & Directories + +The core file for the Mailer functions is `api/src/lib/mailer.ts`. This file contains configuration defining which handlers and renderers to use and when. It starts out looking like this: +```ts title=api/src/lib/mailer.ts +import { Mailer } from '@redwoodjs/mailer-core' +import { NodemailerMailHandler } from '@redwoodjs/mailer-handler-nodemailer' +import { ReactEmailRenderer } from '@redwoodjs/mailer-renderer-react-email' + +import { logger } from 'src/lib/logger' + +export const mailer = new Mailer({ + handling: { + handlers: { + // TODO: Update this handler config or switch it out for a different handler completely + nodemailer: new NodemailerMailHandler({ + transport: { + host: 'localhost', + port: 4319, + secure: false, + }, + }), + }, + default: 'nodemailer', + }, + + rendering: { + renderers: { + reactEmail: new ReactEmailRenderer(), + }, + default: 'reactEmail', + }, + + logger, +}) +``` + +In the above, you can see how handlers and renderers are defined. Handlers are defined in the `handling` object where the keys are any name you wish to give, and the values are instances of the handler you want to use. Similarly for renderers, which are defined in the `rendering` object. Each must have a `default` provided, specifying which option to use by default in production. + +Mailer also expects you to put your mail react components inside the `api/src/mail` directory. For example, if you had a welcome email, it should be found in `api/src/mail/Welcome/Welcome.tsx`. + +## Setup + +The Mailer is not set up by default when you create a new RedwoodJS app, but it is easy to do so. Simply run the following CLI command: + +```bash title="RedwoodJS CLI" +yarn rw setup mailer +``` + +This command sets up the necessary files and dependencies. You can find more information on this command at [this](https://redwoodjs.com/docs/cli-commands#setup-mailer) specific section of our docs. + +## Usage + +### Example + +The best way to understand using the Mailer is with an example. + +In the tutorial, we built out a blog site. Let's say we have added a contact us functionality and the contact us form takes a name, email, and message and stores it in the database. + +For this example, suppose we want to also send an email to some internal inbox with this contact us submission. + +The service would be updated like so: + +```ts title=api/src/services/contacts.ts +import { mailer } from 'src/lib/mailer' +import { ContactUsEmail } from 'src/mail/Example/Example' + +// ... + +export const createContact: MutationResolvers['createContact'] = async ({ + input, +}) => { + const contact = await db.contact.create({ + data: input, + }) + + // Send email + await mailer.send( + ContactUsEmail({ + name: input.name, + email: input.email, + // Note the date is hardcoded here for the sake of test snapshot consistency + when: new Date(0).toLocaleString(), + }), + { + to: 'inbox@example.com', + subject: 'New Contact Us Submission', + replyTo: input.email, + from: 'contact-us@example.com', + } + ) + + return contact +} +``` + +In the code above, we do the following: + +- Import the Mailer and our mail template. +- Call the `mailer.send` function with: + - Our template, which we pass props into based on the user input. + - A set of send options to specify to, from, etc. + +In the example above, we specified a `replyTo` because that suited our business logic. However, we probably don't want to write `replyTo: 'no-reply@example.com'` in all our other emails where we might want that to be set. + +In that case, we can use the `defaults` property in our `api/src/lib/mailer.ts` config: + +```ts title=api/src/lib/mailer.ts +defaults: { + replyTo: 'no-reply@example.com', +}, +``` + +Now that we implemented our example, we might start to think about testing or how to try this out ourselves during development. + +The Mailer behaves slightly differently based on which environment you are running in. + +This helps improve your experience as you don't have to worry about sending real emails during testing or development. + +### Testing + +When your `NODE_ENV` is set to `test`, then the Mailer will start in test mode. In this mode, all mail will be sent using a test handler rather than the default production one or any specific one set when calling `send` or `sendWithoutRendering`. + +By default, when the Mailer is created, it will check if the `@redwoodjs/mailer-handler-in-memory` package is available. If it is, this will become the test handler; otherwise, the test handler will be a no-op that does nothing. The `yarn rw setup mailer` command adds this `@redwoodjs/mailer-handler-in-memory` package as a `devDependency` automatically for you. + +If you want control over this test mode behavior, you can include the following configuration in the `mailer.ts` file: + +```ts title=api/src/lib/mailer.ts +test: { + when: process.env.NODE_ENV === 'test', + handler: 'someOtherHandler', +} +``` + +The `when` property can either be a boolean or a function that returns a boolean. This decides if the Mailer starts in test mode when it is created. The `handler` property can specify a different handler to use in test mode. + +As an example of how this helps with testing, let's work off the example we created above. Let's now test our email functionality in the corresponding test file: + +```ts title=api/src/services/contacts/contacts.test.ts +describe('contacts', () => { + scenario('creates a contact', async () => { + const result = await createContact({ + input: { name: 'String', email: 'String', message: 'String' }, + }) + + expect(result.name).toEqual('String') + expect(result.email).toEqual('String') + expect(result.message).toEqual('String') + + // Mail + const testHandler = mailer.getTestHandler() as InMemoryMailHandler + expect(testHandler.inbox.length).toBe(1) + const sentMail = testHandler.inbox[0] + expect({ + ...sentMail, + htmlContent: undefined, + textContent: undefined, + }).toMatchInlineSnapshot(` + { + "attachments": [], + "bcc": [], + "cc": [], + "from": "contact-us@example.com", + "handler": "nodemailer", + "handlerOptions": undefined, + "headers": {}, + "htmlContent": undefined, + "renderer": "reactEmail", + "rendererOptions": {}, + "replyTo": "String", + "subject": "New Contact Us Submission", + "textContent": undefined, + "to": [ + "inbox@example.com", + ], + } + `) + expect(sentMail.htmlContent).toMatchSnapshot() + expect(sentMail.textContent).toMatchSnapshot() + }) +}) +``` + +Above we tested that our service did the following: + +- Sent one email. +- All the send options (such as to, from, what handler, etc.) match a set of expected values (the inline snapshot). +- The rendered text and HTML content match the expected value (the snapshots). + +### Development + +Similar to the test mode, the Mailer also has a development mode. This mode is selected automatically when the Mailer is created if `NODE_ENV` is **not** set to `production`. This mode behaves similarly to the test mode and by default will attempt to use the `@redwoodjs/mailer-handler-studio` package if it is available. + +You can control the development mode behavior with the following configuration in the `mailer.ts` file: + +```ts title=api/src/lib/mailer.ts +development: { + when: process.env.NODE_ENV !== 'production', + handler: 'someOtherHandler', +}, +``` + +:::tip + +The Mailer studio has some helpful features when it comes to using the Mailer during development. It can provide a mail inbox so that you can send mail to your local machine and see the results. It can also provide live previews of your rendered mail templates as a guide to what they will likely look like when sent to your end users. + +::: + +### Production + +If neither the test nor development mode conditions are met, the Mailer will start in production mode. In this mode, there is no rerouting of your mail to different handlers. Instead, your mail will go directly to your default handler unless you specifically state a different one in your send options. + +### Studio + +Redwood Studio is tightly integrated with the mailer. The goal is to provide you with not just the ability to send mail but also the development tools to make your experience easier and more enjoyable. + +#### Template Previews +mailer-template-preview + +You can have a preview of what your mail templates will look like. These will rerender live as you update your template code and you can even provide a JSON payload which will be used as the props to your template component. These previews are approximate but should easily get you 90% of the way there. + +#### Local Inbox +mailer-local-inbox + +When running in development mode, using the default `@redwoodjs/mailer-handler-studio` development handler, your mail will be sent to a local SMTP inbox running inside of Studio. This allows you to use your app and have full emails sent without worrying about setting up a local inbox yourself or using some other online temporary inbox service. + +:::warning + +Redwood Studio is an experimental feature and is still in development. Some of the UI shown above might look slightly different and the functionality may be tweaked over time to provide you with a better experience. + +::: + +## Need a Renderer or Handler? + +If the Mailer does not currenly provide a [handler](notion://www.notion.so/redwoodjs/133467eb46b744fd8ae60df2d493d7d0#handlers) or [renderer](notion://www.notion.so/redwoodjs/133467eb46b744fd8ae60df2d493d7d0#renderers) for the service or technology you wish to use, this doesn't prevent you from using the Mailer. Instead, you can create your own handler or renderer which you can then open source to the wider RedwoodJS community. + +To do this, read over the existing implementations for handlers [here](https://github.com/redwoodjs/redwood/tree/main/packages/mailer/handlers) and renderers [here](https://github.com/redwoodjs/redwood/tree/main/packages/mailer/renderers). You can also find the interfaces that a handler or mailer must satisfy [here](https://github.com/redwoodjs/redwood/tree/main/packages/mailer/core) in the `@redwoodjs/mailer-core` package. + +Be sure to check out the community forum for people working on similar work, to document your own creations, or to get help on anything. diff --git a/docs/docs/prerender.md b/docs/docs/prerender.md index ae40a091b8c6..e0cb23e0887f 100644 --- a/docs/docs/prerender.md +++ b/docs/docs/prerender.md @@ -291,7 +291,7 @@ b) There was an error when trying to import your GraphQL handler - maybe due to If you've moved this GraphQL function, or we encounter an error executing it, it won't break your builds. All your Cells will be prerendered in their `Loading` state, and will update once the JavaScript loads on the browser. This is effectively skipping prerendering your Cells, but they'll still work! -#### Cannot prerender the query {queryName} as it requires auth. +#### Cannot prerender the query \{queryName\} as it requires auth. This error happens during builds when you have a Cell on a page you're prerendering that makes a query marked with `@requireAuth` in your SDL. During prerender you are not logged in ([see point 1](#1-prerendering-always-happens-as-an-unauthenticated-user)), so you'll have to conditionally render the Cell - for example: @@ -342,8 +342,7 @@ Depending on what pages you're prerendering, you may want to change your redirec Using Netlify as an example:
-If you prerender your `notFoundPage`, and all your other routes - +If you prerender your `notFoundPage`, and all your other routes You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -360,6 +359,7 @@ This makes your app behave much more like a traditional website, where all the p
If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/docs/redwoodrecord.md b/docs/docs/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/docs/redwoodrecord.md +++ b/docs/docs/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/docs/seo-head.md b/docs/docs/seo-head.md index 3c9756f35f6d..4b50350c6cdd 100644 --- a/docs/docs/seo-head.md +++ b/docs/docs/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' diff --git a/docs/docs/services.md b/docs/docs/services.md index e7b87b3ce88c..52bb916f0a8a 100644 --- a/docs/docs/services.md +++ b/docs/docs/services.md @@ -900,7 +900,7 @@ This leads to your product cache being rebuilt every hour, even though you haven Just like the `v1` we added to the `product` cache key above, you can globally prefix a string to *all* of your cache keys: -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" export const { cache, cacheFindMany } = createCache(client, { logger, timeout: 500, @@ -938,7 +938,7 @@ yarn rw setup cache redis This generates the following (memcached example shown): -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" import { createCache, MemcachedClient } from '@redwoodjs/api/cache' import { logger } from './logger' @@ -1114,7 +1114,7 @@ const updateUser = async ({ id, input }) => { }) ``` -:::caution +:::warning When explicitly deleting cache keys like this you could find yourself going down a rabbit hole. What if there is another service somewhere that also updates user? Or another service that updates an organization, as well as all of its underlying child users at the same time? You'll need to be sure to call `deleteCacheKey()` in these places as well. As a general guideline, it's better to come up with a cache key that encapsulates any triggers for when the data has changed (like the `updatedAt` timestamp, which will change no matter who updates the user, anywhere in your codebase). diff --git a/docs/docs/testing.md b/docs/docs/testing.md index 71d894936e86..901c8476c47e 100644 --- a/docs/docs/testing.md +++ b/docs/docs/testing.md @@ -1261,13 +1261,13 @@ Does anyone else find it confusing that the software itself is called a "databas When you start your test suite you may notice some output from Prisma talking about migrating the database. Redwood will automatically run `yarn rw prisma db push` against your test database to make sure it's up-to-date. -:::caution What if I have custom migration SQL? +:::warning What if I have custom migration SQL? The `prisma db push` command only restores a snapshot of the current database schema (so that it runs as fast as possible). **It does not actually run migrations in sequence.** This can cause a [problem](https://github.com/redwoodjs/redwood/issues/5818) if you have certain database configuration that *must* occur as a result of the SQL statements inside the migration files. In order to preserve those statements in your test database, you can set an additional ENV var which will use the command `yarn rw prisma migrate reset` instead. This will run each migration in sequence against your test database. The tradeoff is that starting your test suite will take a little longer depending on how many migrations you have: -```.env title=/.env +```.env title="/.env" TEST_DATABASE_STRATEGY=reset ``` diff --git a/docs/docs/tutorial/chapter2/getting-dynamic.md b/docs/docs/tutorial/chapter2/getting-dynamic.md index 627de868701e..c67b0712b314 100644 --- a/docs/docs/tutorial/chapter2/getting-dynamic.md +++ b/docs/docs/tutorial/chapter2/getting-dynamic.md @@ -135,7 +135,7 @@ Okay but what if we click "Delete"? So, Redwood just created all the pages, components and services necessary to perform all CRUD actions on our posts table. No need to even open Prisma Studio or login through a terminal window and write SQL from scratch. Redwood calls these _scaffolds_. -:::caution +:::warning If you head back to VSCode at some point and get a notice in one of the generated Post cells about `Cannot query "posts" on type "Query"` don't worry: we've seen this from time to time on some systems. There are two easy fixes: diff --git a/docs/docs/tutorial/chapter2/routing-params.md b/docs/docs/tutorial/chapter2/routing-params.md index dbeb77632382..ff502bb040ac 100644 --- a/docs/docs/tutorial/chapter2/routing-params.md +++ b/docs/docs/tutorial/chapter2/routing-params.md @@ -349,7 +349,7 @@ export const Success = ({ article }) => { ```tsx title="web/src/components/ArticleCell/ArticleCell.tsx" -import type { FindArticleQuery } from 'types/graphql' +import type { FindArticleQuery, FindArticleQueryVariables } from 'types/graphql' import type { CellSuccessProps, CellFailureProps } from '@redwoodjs/web' export const QUERY = gql` @@ -775,7 +775,7 @@ export const Success = ({ article }) => { // highlight-next-line import Article from 'src/components/Article' -import type { FindArticleQuery } from 'types/graphql' +import type { FindArticleQuery, FindArticleQueryVariables } from 'types/graphql' import type { CellSuccessProps, CellFailureProps } from '@redwoodjs/web' export const QUERY = gql` diff --git a/docs/docs/tutorial/chapter3/saving-data.md b/docs/docs/tutorial/chapter3/saving-data.md index 67b8c1f8de47..7b4732c5c14a 100644 --- a/docs/docs/tutorial/chapter3/saving-data.md +++ b/docs/docs/tutorial/chapter3/saving-data.md @@ -1795,7 +1795,7 @@ const [create, { loading, error }] = useMutation< -:::caution +:::warning You can put the email validation back into the `` now, but you should leave the server validation in place, just in case. diff --git a/docs/docs/tutorial/chapter4/deployment.md b/docs/docs/tutorial/chapter4/deployment.md index fd273091f468..bf7376195eb3 100644 --- a/docs/docs/tutorial/chapter4/deployment.md +++ b/docs/docs/tutorial/chapter4/deployment.md @@ -87,7 +87,7 @@ This adds a `netlify.toml` config file in the root of the project that is good t And with that, we're ready to setup Netlify itself. -:::caution +:::warning While you may be tempted to use the [Netlify CLI](https://cli.netlify.com) commands to [build](https://cli.netlify.com/commands/build) and [deploy](https://cli.netlify.com/commands/deploy) your project directly from you local project directory, doing so **will lead to errors when deploying and/or when running functions**. I.e. errors in the function needed for the GraphQL server, but also other serverless functions. The main reason for this is that these Netlify CLI commands simply build and deploy -- they build your project locally and then push the dist folder. That means that when building a RedwoodJS project, the [Prisma client is generated with binaries matching the operating system at build time](https://cli.netlify.com/commands/link) -- and not the [OS compatible](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#binarytargets-options) with running functions on Netlify. Your Prisma client engine may be `darwin` for OSX or `windows` for Windows, but it needs to be `debian-openssl-1.1.x` or `rhel-openssl-1.1.x`. If the client is incompatible, your functions will fail. diff --git a/docs/docs/tutorial/chapter5/first-test.md b/docs/docs/tutorial/chapter5/first-test.md index d7c4707956a1..f5d13ed06fe4 100644 --- a/docs/docs/tutorial/chapter5/first-test.md +++ b/docs/docs/tutorial/chapter5/first-test.md @@ -320,7 +320,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.jsx +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.jsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -335,7 +335,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -355,7 +355,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.jsx +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.jsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -370,7 +370,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/docs/tutorial/chapter7/api-side-currentuser.md b/docs/docs/tutorial/chapter7/api-side-currentuser.md index 142f997c2df8..5fc79f25bcb0 100644 --- a/docs/docs/tutorial/chapter7/api-side-currentuser.md +++ b/docs/docs/tutorial/chapter7/api-side-currentuser.md @@ -30,7 +30,7 @@ Making data changes like this will start becoming second nature soon: First we'll add the new `userId` field to `Post` and the relation to `User`: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" model Post { id Int @id @default(autoincrement()) title String @@ -112,7 +112,7 @@ Whoops! Similar to what happened when we added `roles` to `User`, We made `userId` a required field, but we already have several posts in our development database. Since we don't have a default value for `userId` defined, it's impossible to add this column to the database. -:::caution Why don't we just set `@default(1)` in the schema? +:::warning Why don't we just set `@default(1)` in the schema? This would get us past this problem, but could cause hard-to-track-down bugs in the future: if you ever forget to assign a `post` to a `user`, rather than fail it'll happily just set `userId` to `1`, which may or may not even exist some day! It's best to take the extra time to do things The Right Way and avoid the quick hacks to get past an annoyance like this. Your future self will thank you! @@ -128,7 +128,7 @@ yarn rw prisma migrate reset If you started the second half the tutorial from the [Redwood Tutorial repo](https://github.com/redwoodjs/redwood-tutorial) you'll get an error after resetting the databaseβ€”Prisma attempts to seed the database with a user and some posts to get you started, but the posts in that seed do not have the new required `userId` field! Open up `scripts/seed.js` and edit each post to add `userId: 1` to each: -```javascript title=scripts/seed.js +```javascript title="scripts/seed.js" { id: 1, name: 'John Doe', @@ -187,7 +187,7 @@ To enable this we'll need to make two modifications on the api side: #### Add User to Posts SDL -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" type Post { id: Int! title: String! @@ -210,7 +210,7 @@ Here we're using `User!` with an exclamation point because we know that every `P This one is a little tricker: we need to add a "lookup" in the `posts` service, so that it knows how to get the associated user. When we generated the `comments` SDL and service we got this **relation resolver** created for us. We could re-run the service generator for `Post` but that could blow away changes we made to this file. Our only option would be to include the `--force` flag since the file already exists, which will write over everything. In this case we'll just add the resolver manually: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -328,7 +328,7 @@ There are two places where we publicly present a post: Let's update their respective Cells to include the name of the user that created the post: -```jsx title=web/src/components/ArticlesCell/ArticlesCell.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.js" export const QUERY = gql` query ArticlesQuery { articles: posts { @@ -346,7 +346,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/ArticleCell/ArticleCell.js +```jsx title="web/src/components/ArticleCell/ArticleCell.js" export const QUERY = gql` query ArticleQuery($id: Int!) { article: post(id: $id) { @@ -366,7 +366,7 @@ export const QUERY = gql` And then update the display component that shows an Article: -```jsx title=web/src/components/Article/Article.js +```jsx title="web/src/components/Article/Article.js" import { Link, routes } from '@redwoodjs/router' const Article = ({ article }) => { @@ -397,7 +397,7 @@ Depending on whether you started from the Redwood Tutorial repo or not, you may There's a magical variable named `context` that's available within any of your service functions. It contains the context in which the service function is being called. One property available on this context is the user that's logged in (*if* someone is logged in). It's the same `currentUser` that is available on the web side: -```javascript title=api/src/service/posts/posts.js +```javascript title="api/src/service/posts/posts.js" export const createPost = ({ input }) => { return db.post.create({ // highlight-next-line @@ -422,7 +422,7 @@ Right now any admin that visits `/admin/posts` can still see all posts, not only Since we know we have access to `context.currentUser` we can sprinkle it throughout our posts service to limit what's returned to only those posts that the currently logged in user owns: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -493,7 +493,7 @@ There are several steps we'll need to complete: Let's keep the existing `posts.sdl.js` and make that the "public" interface. Duplicate that SDL, naming it `adminPosts.sdl.js`, and modify it like so: -```javascript title=api/src/graphql/adminPosts.sdl.js +```javascript title="api/src/graphql/adminPosts.sdl.js" export const schema = gql` type Query { adminPosts: [Post!]! @requireAuth(roles: ["admin"]) @@ -518,7 +518,7 @@ export const schema = gql` ` ``` -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" export const schema = gql` type Post { id: Int! @@ -543,7 +543,7 @@ In `adminPosts` we've updated the queries to use `@requireAuth` instead of `@ski Next let's create an `adminPosts` service. We'll need to move our create/update/delete mutations to it, as the name of the SDL needs to match the name of the service: -```javascript title=api/src/services/adminPosts/adminPosts.js +```javascript title="api/src/services/adminPosts/adminPosts.js" import { db } from 'src/lib/db' export const adminPosts = () => { @@ -578,7 +578,7 @@ export const deletePost = ({ id }) => { (Again, don't forget the change from `findUnique()` to `findFirst()`.) And update `posts` to remove some of the functions that live in `adminPosts` now: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -603,7 +603,7 @@ Note that we kept the relation resolver here `Post.user`, and there's none in `a Finally, we'll need to update several of the scaffold components to use the new `adminPosts` and `adminPost` queries (we'll limit the code snippets below to just the changes to save some room, this page is getting long enough!): -```javascript title=web/src/components/Post/EditPostCell/EditPostCell.js +```javascript title="web/src/components/Post/EditPostCell/EditPostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -617,7 +617,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostCell/PostCell.js +```jsx title="web/src/components/Post/PostCell/PostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -631,7 +631,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostsCell/PostsCell.js +```jsx title="web/src/components/Post/PostsCell/PostsCell.js" export const QUERY = gql` query POSTS { // highlight-next-line diff --git a/docs/docs/tutorial/chapter7/rbac.md b/docs/docs/tutorial/chapter7/rbac.md index c7603aec30c6..605409e86f0c 100644 --- a/docs/docs/tutorial/chapter7/rbac.md +++ b/docs/docs/tutorial/chapter7/rbac.md @@ -228,7 +228,7 @@ Which should return the new content of the user: } ``` -:::caution +:::warning If you re-used the same console session from the previous section, you'll need to quit it and start it again for it to know about the new Prisma data structure. If you still can't get the update to work, maybe your user doesn't have an `id` of `1`! Run `db.user.findMany()` first and then get the `id` of the user you want to update. @@ -895,7 +895,7 @@ describe('Comment', () => { We moved the default `comment` object to a constant `COMMENT` and then used that in all tests. We also needed to add `waitFor()` since the `hasRole()` check in the Comment itself actually executes some GraphQL calls behind the scenes to figure out who the user is. The test suite makes mocked GraphQL calls, but they're still asynchronous and need to be waited for. If you don't wait, then `currentUser` will be `null` when the test starts, and Jest will be happy with that result. But we won'tβ€”we need to wait for the actual value from the GraphQL call. -:::caution Seeing errors in your test suite? +:::warning Seeing errors in your test suite? We added fields to the database and sometimes the test runner doesn't realize this. You may need to restart it to get the test database migrated to match what's in `schema.prisma`. Press `q` or `Ctrl-C` in your test runner if it's still running, then: diff --git a/docs/docs/tutorial/foreword.md b/docs/docs/tutorial/foreword.md index f6b44e65c5de..ec1f1810ed40 100644 --- a/docs/docs/tutorial/foreword.md +++ b/docs/docs/tutorial/foreword.md @@ -24,7 +24,7 @@ They might look like this... ::: -:::caution +:::warning or sometimes like this... diff --git a/docs/docs/tutorial/intermission.md b/docs/docs/tutorial/intermission.md index 0416b563de5b..793730157af2 100644 --- a/docs/docs/tutorial/intermission.md +++ b/docs/docs/tutorial/intermission.md @@ -34,9 +34,9 @@ yarn rw dev If you haven't been through the first tutorial, or maybe you went through it on an older version of Redwood (anything pre-0.41) you can clone [this repo](https://github.com/redwoodjs/redwood-tutorial) which contains everything built so far and also adds a little styling so it isn't quite so...tough to look at. The example repo includes [TailwindCSS](https://tailwindcss.com) to style things up and adds a `
` or two to give us some additional hooks to hang styling on. -:::caution The TypeScript version of the Example Repo is currently in progress +:::warning The TypeScript version of the Example Repo is currently in progress -If you want to complete the tutorial in TypeScript, continue with your own repo, making any necessary edits. Don't worry, the remainder of the tutorial continues to offer both TypeScript and JavaScript example code changes. +If you want to complete the tutorial in TypeScript, continue with your own repo, making any necessary edits. Don't worry, the remainder of the tutorial continues to offer both TypeScript and JavaScript example code changes. ::: diff --git a/docs/docs/typescript/strict-mode.md b/docs/docs/typescript/strict-mode.md index 43a01d8839fd..221d7e6fe98b 100644 --- a/docs/docs/typescript/strict-mode.md +++ b/docs/docs/typescript/strict-mode.md @@ -47,7 +47,7 @@ But the gist of it is that, for Prisma's create and update operations, you may h For most cases however, you probably want to convert nulls to undefined - one way to do this is to use the `removeNulls` utility function from `@redwoodjs/api`: -```ts title=api/src/services/users.ts +```ts title="api/src/services/users.ts" // highlight-next-line import { removeNulls } from "@redwoodjs/api" diff --git a/docs/docs/typescript/utility-types.md b/docs/docs/typescript/utility-types.md index d4fe3a5dba82..a01895f1adfd 100644 --- a/docs/docs/typescript/utility-types.md +++ b/docs/docs/typescript/utility-types.md @@ -48,7 +48,7 @@ export const Success = ({ This gives you the types of the props in your Cell's `Failure` component. It takes `TVariables` as an optional generic parameter, which is useful if you want to print error messages like `"Couldn't load data for ${variables.searchTerm}"`: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -69,7 +69,7 @@ export const Failure = ({ Similar to `CellFailureProps`, but for the props of your Cell's `Loading` component: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -103,7 +103,7 @@ defineScenario An example: -```ts title=posts.scenarios.ts +```ts title="posts.scenarios.ts" import type { Prisma, Post } from '@prisma/client' export const standard = defineScenario({ @@ -137,7 +137,7 @@ It takes three generic parameters: We know this is a lot of generics, but that's so you get to choose how specific you want to be with the types! -```ts title=api/src/services/posts/posts.scenario.ts +```ts title="api/src/services/posts/posts.scenario.ts" import type { Post } from '@prisma/client' //... @@ -145,7 +145,7 @@ import type { Post } from '@prisma/client' export type StandardScenario = ScenarioData ``` -```ts title=api/src/services/posts/posts.test.ts +```ts title="api/src/services/posts/posts.test.ts" import type { StandardScenario } from './posts.scenarios' scenario('returns a single post', async (scenario: StandardScenario) => { diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js deleted file mode 100644 index 3a55b2a5d416..000000000000 --- a/docs/docusaurus.config.js +++ /dev/null @@ -1,148 +0,0 @@ -const autoImportTabs = require('./src/remark/auto-import-tabs') -const fileExtSwitcher = require('./src/remark/file-ext-switcher') - -/** @type {import('@docusaurus/types').Config} */ -const config = { - customFields: { - defaultDocsLandingPage: 'index', // redirects here when hitting /docs/ - defaultSectionLandingPages: { - // map of what is considered the first article in each section - // section: id - tutorial: 'forward', - }, - }, - // ? - title: 'RedwoodJS Docs', - // ? - tagline: - 'Built on React, GraphQL, and Prisma, Redwood works with the components and development workflow you love, but with simple conventions and helpers to make your experience even better.', - // ? - url: 'https://redwoodjs.com', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'https://redwoodjs.com/favicon.png', - organizationName: 'redwoodjs', // Usually your GitHub org/user name. - // ? - projectName: 'redwood', // Usually your repo name., - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - algolia: { - appId: '37B3LHULK0', - apiKey: '1d7f2f299d9a38c157501c301425f090', - indexName: 'learn-redwood', - contextualSearch: true, - searchParameters: {}, - externalUrlRegex: 'https://learn-redwood.netlify.app', - }, - navbar: { - title: 'RedwoodJS', - logo: { - alt: 'RedwoodJS pinecone logo', - src: 'https://d33wubrfki0l68.cloudfront.net/72b0d56596a981835c18946d6c4f8a968b08e694/82254/images/logo.svg', - href: 'https://redwoodjs.com/', - target: '_self', - }, - items: [ - { - type: 'docsVersionDropdown', - position: 'left', - }, - { - href: 'https://github.com/redwoodjs/redwood', - position: 'right', - className: 'github-logo', - 'aria-label': 'GitHub repository', - }, - ], - }, - prism: { - additionalLanguages: ['toml'], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { - label: 'Tutorial', - to: 'docs/tutorial/foreword', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'Discord', - href: 'https://discord.com/invite/redwoodjs', - }, - { - label: 'Discourse', - href: 'https://community.redwoodjs.com/', - }, - { - label: 'Twitter', - href: 'https://twitter.com/redwoodjs', - }, - ], - }, - { - title: 'More', - items: [ - { - label: 'redwoodjs.com', - to: 'https://redwoodjs.com/', - }, - { - label: 'GitHub', - href: 'https://github.com/redwoodjs/redwood', - }, - ], - }, - ], - copyright: `Copyright Β© ${new Date().getFullYear()} RedwoodJS. Built with Docusaurus.`, - }, - }), - presets: [ - [ - '@docusaurus/preset-classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: require.resolve('./sidebars.js'), - // ? β€” blob? tree? - editUrl: 'https://github.com/redwoodjs/redwood/blob/main/docs', // base path for repo edit pages - editCurrentVersion: true, - remarkPlugins: [autoImportTabs, fileExtSwitcher], - versions: { - current: { - label: 'Canary', - path: 'canary', - banner: 'unreleased', - }, - }, - }, - theme: { - customCss: require.resolve('./src/css/custom.css'), - }, - }), - ], - ], - // ? - scripts: [ - { - src: 'https://plausible.io/js/plausible.js', - defer: true, - 'data-domain': 'redwoodjs.com', - }, - ], - stylesheets: [ - 'https://fonts.googleapis.com/css?family=Open+Sans:400,600,700&display=swap', - 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;900&display=swap', - ], -} - -module.exports = config diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts new file mode 100644 index 000000000000..7f6a739d00ef --- /dev/null +++ b/docs/docusaurus.config.ts @@ -0,0 +1,147 @@ +import type * as PresetClassic from '@docusaurus/preset-classic' +import type { Config } from '@docusaurus/types' + +import autoImportTabs from './src/remark/auto-import-tabs' +import fileExtSwitcher from './src/remark/file-ext-switcher' + +const config: Config = { + customFields: { + defaultDocsLandingPage: 'index', // redirects here when hitting /docs/ + defaultSectionLandingPages: { + // map of what is considered the first article in each section + // section: id + tutorial: 'forward', + }, + }, + // ? + title: 'RedwoodJS Docs', + // ? + tagline: + 'Built on React, GraphQL, and Prisma, Redwood works with the components and development workflow you love, but with simple conventions and helpers to make your experience even better.', + // ? + url: 'https://redwoodjs.com', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'https://redwoodjs.com/favicon.png', + organizationName: 'redwoodjs', // Usually your GitHub org/user name. + // ? + projectName: 'redwood', // Usually your repo name., + themeConfig: { + algolia: { + appId: '37B3LHULK0', + apiKey: '1d7f2f299d9a38c157501c301425f090', + indexName: 'learn-redwood', + contextualSearch: true, + searchParameters: {}, + externalUrlRegex: 'https://learn-redwood.netlify.app', + }, + navbar: { + title: 'RedwoodJS', + logo: { + alt: 'RedwoodJS pinecone logo', + src: 'https://d33wubrfki0l68.cloudfront.net/72b0d56596a981835c18946d6c4f8a968b08e694/82254/images/logo.svg', + href: 'https://redwoodjs.com/', + target: '_self', + }, + items: [ + { + type: 'docsVersionDropdown', + position: 'left', + }, + { + href: 'https://github.com/redwoodjs/redwood', + position: 'right', + className: 'github-logo', + 'aria-label': 'GitHub repository', + }, + ], + }, + prism: { + additionalLanguages: ['toml', 'diff', 'bash', 'json'], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Tutorial', + to: 'docs/tutorial/foreword', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Discord', + href: 'https://discord.com/invite/redwoodjs', + }, + { + label: 'Discourse', + href: 'https://community.redwoodjs.com/', + }, + { + label: 'Twitter', + href: 'https://twitter.com/redwoodjs', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'redwoodjs.com', + to: 'https://redwoodjs.com/', + }, + { + label: 'GitHub', + href: 'https://github.com/redwoodjs/redwood', + }, + ], + }, + ], + copyright: `Copyright Β© ${new Date().getFullYear()} RedwoodJS. Built with Docusaurus.`, + }, + } satisfies PresetClassic.ThemeConfig, + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + sidebarPath: require.resolve('./sidebars.js'), + // ? β€” blob? tree? + editUrl: 'https://github.com/redwoodjs/redwood/blob/main/docs', // base path for repo edit pages + editCurrentVersion: true, + remarkPlugins: [autoImportTabs, fileExtSwitcher], + versions: { + current: { + label: 'Canary', + path: 'canary', + banner: 'unreleased', + }, + }, + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + } satisfies PresetClassic.Options, + ], + ], + // ? + scripts: [ + { + src: 'https://plausible.io/js/plausible.js', + defer: true, + 'data-domain': 'redwoodjs.com', + }, + ], + stylesheets: [ + 'https://fonts.googleapis.com/css?family=Open+Sans:400,600,700&display=swap', + 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;900&display=swap', + ], +} + +export default config diff --git a/docs/package.json b/docs/package.json index 601faeb758e9..fe61e0435795 100644 --- a/docs/package.json +++ b/docs/package.json @@ -24,19 +24,20 @@ ] }, "dependencies": { - "@docusaurus/core": "2.4.3", - "@docusaurus/plugin-content-docs": "2.4.3", - "@docusaurus/preset-classic": "2.4.3", - "@docusaurus/theme-common": "2.4.3", - "@mdx-js/react": "1.6.22", + "@docusaurus/core": "3.0.0", + "@docusaurus/plugin-content-docs": "3.0.0", + "@docusaurus/preset-classic": "3.0.0", + "@docusaurus/theme-common": "3.0.0", + "@mdx-js/react": "3.0.0", "clsx": "1.2.1", - "react": "17.0.2", - "react-dom": "17.0.2", + "prism-react-renderer": "2.1.0", + "react": "18.2.0", + "react-dom": "18.2.0", "react-player": "2.13.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.4.3", - "@tsconfig/docusaurus": "2.0.2", + "@docusaurus/module-type-aliases": "3.0.0", + "@docusaurus/tsconfig": "3.0.0", "typescript": "5.2.2" } } diff --git a/docs/sidebars.js b/docs/sidebars.js index 5d1b22eacc49..eab1817d21ec 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -146,6 +146,7 @@ module.exports = { 'graphql', 'local-postgres-setup', 'logger', + 'mailer', 'mocking-graphql-requests', 'prerender', 'project-configuration-dev-test-build', diff --git a/docs/src/remark/auto-import-tabs.js b/docs/src/remark/auto-import-tabs.js deleted file mode 100644 index 4f9a693f644a..000000000000 --- a/docs/src/remark/auto-import-tabs.js +++ /dev/null @@ -1,23 +0,0 @@ -// Inspired by code in -// https://github.com/facebook/docusaurus/blob/main/packages/docusaurus-remark-plugin-npm2yarn/src/index.ts - -const needImports = (tree) => - tree.children.some( - (child) => child.type === 'jsx' && /^ (tree, _file) => { - if (needImports(tree)) { - // Add `import` nodes to the top of the parsed file - tree.children.unshift({ - type: 'import', - value: "import Tabs from '@theme/Tabs'", - }) - tree.children.unshift({ - type: 'import', - value: "import TabItem from '@theme/TabItem'", - }) - } -} - -module.exports = plugin diff --git a/docs/src/remark/auto-import-tabs.mjs b/docs/src/remark/auto-import-tabs.mjs new file mode 100644 index 000000000000..ec117320af75 --- /dev/null +++ b/docs/src/remark/auto-import-tabs.mjs @@ -0,0 +1,71 @@ +// Inspired by code in +// https://github.com/facebook/docusaurus/blob/main/packages/docusaurus-remark-plugin-npm2yarn/src/index.ts + +// Searching only the root node was insufficient when Tabs had been combined with admonition blocks. +// Doing a deep search for the Tabs element is a bit more expensive, but this is build-time code, so +// it's not a big deal. A false positive is also not really a big deal. +const containsTabsJSXElement = (node) => { + if (node.type === 'mdxJsxFlowElement' && node.name === 'Tabs') { + return true + } + if (!node.children || !Array.isArray(node.children)) { + return false + } + return node.children.some(containsTabsJSXElement) +} + +const plugin = () => (tree, _file) => { + if (containsTabsJSXElement(tree)) { + // Add `import` nodes to the top of the parsed file + tree.children.unshift({ + type: 'mdxjsEsm', + value: + "import Tabs from '@theme/Tabs'\nimport TabItem from '@theme/TabItem'", + data: { + estree: { + type: 'Program', + body: [ + { + type: 'ImportDeclaration', + specifiers: [ + { + type: 'ImportDefaultSpecifier', + local: { + type: 'Identifier', + name: 'Tabs', + }, + }, + ], + source: { + type: 'Literal', + value: '@theme/Tabs', + raw: "'@theme/Tabs'", + }, + }, + { + type: 'ImportDeclaration', + specifiers: [ + { + type: 'ImportDefaultSpecifier', + local: { + type: 'Identifier', + name: 'TabItem', + }, + }, + ], + source: { + type: 'Literal', + value: '@theme/TabItem', + raw: "'@theme/TabItem'", + }, + }, + ], + sourceType: 'module', + comments: [], + }, + }, + }) + } +} + +export default plugin diff --git a/docs/src/remark/file-ext-switcher.js b/docs/src/remark/file-ext-switcher.js deleted file mode 100644 index 4f47f260c329..000000000000 --- a/docs/src/remark/file-ext-switcher.js +++ /dev/null @@ -1,25 +0,0 @@ -const visit = require('unist-util-visit') - -const plugin = () => { - let needImport = false - - return (tree, _file) => { - visit(tree, (node) => { - if (node.type === 'inlineCode' && /\w\.\{js,tsx?}$/.test(node.value)) { - needImport = true - node.type = 'jsx' - node.value = `` - } - }) - - if (needImport) { - tree.children.unshift({ - type: 'import', - value: - "import FileExtSwitcher from '@site/src/components/FileExtSwitcher'", - }) - } - } -} - -module.exports = plugin diff --git a/docs/src/remark/file-ext-switcher.mjs b/docs/src/remark/file-ext-switcher.mjs new file mode 100644 index 000000000000..19e9118776a9 --- /dev/null +++ b/docs/src/remark/file-ext-switcher.mjs @@ -0,0 +1,67 @@ +import { visit } from 'unist-util-visit' + +const plugin = () => { + let needImport = false + + return (tree, _file) => { + visit(tree, (node, _index, parent) => { + if (node.type === 'inlineCode' && /\w\.\{js,tsx?}$/.test(node.value)) { + needImport = true + const pathValue = `${node.value}` + + node.type = + parent.type === 'paragraph' + ? 'mdxJsxTextElement' + : 'mdxJsxFlowElement' + node.name = 'FileExtSwitcher' + node.attributes = [ + { + type: 'mdxJsxAttribute', + name: 'path', + value: pathValue, + }, + ] + node.children = [] + node.data = { + _mdxExplicitJsx: true, + } + } + }) + + if (needImport) { + tree.children.unshift({ + type: 'mdxjsEsm', + value: + "import FileExtSwitcher from '@site/src/components/FileExtSwitcher'", + data: { + estree: { + type: 'Program', + body: [ + { + type: 'ImportDeclaration', + specifiers: [ + { + type: 'ImportDefaultSpecifier', + local: { + type: 'Identifier', + name: 'FileExtSwitcher', + }, + }, + ], + source: { + type: 'Literal', + value: '@site/src/components/FileExtSwitcher', + raw: "'@site/src/components/FileExtSwitcher'", + }, + }, + ], + sourceType: 'module', + comments: [], + }, + }, + }) + } + } +} + +export default plugin diff --git a/docs/static/img/mailer/flow.svg b/docs/static/img/mailer/flow.svg new file mode 100644 index 000000000000..59829a69564d --- /dev/null +++ b/docs/static/img/mailer/flow.svg @@ -0,0 +1,17 @@ + + + + + + + + SendSpecifiedRendererDefault RendererSpecific RendererYesNoSendWithout RenderingEnvironmentTest HandlerDevelopment HandlerSpecified HandlerSpecific HandlerDefault HandlerTestDevProductionYesNoMailer Flow \ No newline at end of file diff --git a/docs/static/img/mailer/local_inbox.png b/docs/static/img/mailer/local_inbox.png new file mode 100644 index 000000000000..fa7dd4ab00de Binary files /dev/null and b/docs/static/img/mailer/local_inbox.png differ diff --git a/docs/static/img/mailer/template_preview.png b/docs/static/img/mailer/template_preview.png new file mode 100644 index 000000000000..d82b1007f5d1 Binary files /dev/null and b/docs/static/img/mailer/template_preview.png differ diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 6f4756980d4d..314eab8a418b 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -1,6 +1,6 @@ { // This file is not used in compilation. It is here just for a nice editor experience. - "extends": "@tsconfig/docusaurus/tsconfig.json", + "extends": "@docusaurus/tsconfig", "compilerOptions": { "baseUrl": "." } diff --git a/docs/versioned_docs/version-1.x/authentication.md b/docs/versioned_docs/version-1.x/authentication.md index 64b97bc5c40c..e1a3a47bdbf0 100644 --- a/docs/versioned_docs/version-1.x/authentication.md +++ b/docs/versioned_docs/version-1.x/authentication.md @@ -60,56 +60,57 @@ If there are any shenanigans detected (the cookie can't be decrypted properly, o ### Setup A single CLI command will get you everything you need to get dbAuth working, minus the actual login/signup pages: - - yarn rw setup auth dbAuth - +``` +yarn rw setup auth dbAuth +``` Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases: > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> +> ``` > yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. ### Scaffolding Login/Signup/Forgot Password Pages If you don't want to create your own login, signup and forgot password pages from scratch we've got a generator for that: - - yarn rw g dbAuth - +``` +yarn rw g dbAuth +``` The default routes will make them available at `/login`, `/signup`, `/forgot-password`, and `/reset-password` but that's easy enough to change. Again, check the post-install instructions for one change you need to make to those pages: where to redirect the user to once their login/signup is successful. If you'd rather create your own, you might want to start from the generated pages anyway as they'll contain the other code you need to actually submit the login credentials or signup fields to the server for processing. @@ -181,13 +182,13 @@ const onSubmit = async (data) => { #### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` #### resetPassword.handler() This handler is invoked after the password has been successfully changed in the database. Returning something truthy (like `return user`) will automatically log the user in after their password is changed. If you'd like to return them to the login page and make them log in manually, `return false` and redirect the user in the Reset Password page. @@ -227,15 +228,15 @@ We've got some default error messages that sound nice, but may not fit the tone By default, the session cookie will not have the `Domain` property set, which a browser will default to be the [current domain only](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent). If your site is spread across multiple domains (for example, your site is at `example.com` but your api-side is deployed to `api.example.com`) you'll need to explicitly set a Domain so that the cookie is accessible to both. To do this, create an environment variable named `DBAUTH_COOKIE_DOMAIN` set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: - - DBAUTH_COOKIE_DOMAIN=example.com - +``` +DBAUTH_COOKIE_DOMAIN=example.com +``` #### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. > The `.env` file is set to be ignored by git and not committed to version control. There is another file, `.env.defaults`, which is meant to be safe to commit and contain simple ENV vars that your dev team can share. The encryption key for the session cookie is NOT one of these shareable vars! @@ -849,7 +850,7 @@ Update your .env file with the following settings supplied when you created your You can find these values in your project's dashboard under Settings -> API. -For full Supabase documentation, see: +For full Supabase documentation, see: [https://supabase.io/docs](https://supabase.io/docs) #### Usage @@ -884,7 +885,7 @@ Depending on the credentials provided: - Note: You must enable and configure the OAuth provider appropriately. To configure these providers, you can go to Authentication -> Settings on `app.supabase.io` for your project. - Note: To authenticate using SMS based OTP (One-Time Password) you will need a [Twilio](https://www.twilio.com/try-twilio) account -For Supabase Authentication documentation, see: +For Supabase Authentication documentation, see: [https://supabase.io/docs/guides/auth](https://supabase.io/docs/guides/auth) +++ @@ -940,7 +941,7 @@ Depending on the credentials provided: - A user can sign up via email and password. For OAuth simply sign in and the user account will be created if it does not exist. - Note: You must enable and configure the OAuth provider appropriately. To enable and configure a provider, please navigate to Users -> Login settings, from your app's dashboard. -For the docs on Authentication, see: +For the docs on Authentication, see: [https://docs.nhost.io/platform/authentication](https://docs.nhost.io/platform/authentication) If you are also **using Nhost as your GraphQL API server**, you will need to pass `skipFetchCurrentUser` as a prop to `AuthProvider` , as follows: @@ -1294,7 +1295,7 @@ Email/password authentication is supported by calling `login({ email, password } In Firebase Console, you must enable "Email link (passwordless sign-in)" with the configuration toggle for the email provider. The authentication sequence for passwordless email links has two steps: 1. First, an email with the link must be generated and sent to the user. Either using using firebase client sdk (web side) [sendSignInLinkToEmail()](https://firebase.google.com/docs/reference/js/auth.emailauthprovider#example_2_2), which generates the link and sends the email to the user on behalf of your application or alternatively, generate the link using backend admin sdk (api side), see ["Generate email link for sign-in](https://firebase.google.com/docs/auth/admin/email-action-links#generate_email_link_for_sign-in) but it is then your responsibility to send an email to the user containing the link. -2. Second, authentication is completed when the user is redirected back to the application and the AuthProvider's logIn({emailLink, email, providerId: 'emailLink'}) method is called. +2. Second, authentication is completed when the user is redirected back to the application and the AuthProvider's logIn(\{emailLink, email, providerId: 'emailLink'\}) method is called. For example, users could be redirected to a dedicated route/page to complete authentication: diff --git a/docs/versioned_docs/version-1.x/data-migrations.md b/docs/versioned_docs/version-1.x/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/versioned_docs/version-1.x/data-migrations.md +++ b/docs/versioned_docs/version-1.x/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/versioned_docs/version-1.x/graphql.md b/docs/versioned_docs/version-1.x/graphql.md index 16e1881998fb..03793ef23ca5 100644 --- a/docs/versioned_docs/version-1.x/graphql.md +++ b/docs/versioned_docs/version-1.x/graphql.md @@ -925,7 +925,7 @@ Some of the biggest security improvements we'll be making revolve around Service Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://github.com/graphql/graphql-playground) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://github.com/graphql/graphql-playground) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. diff --git a/docs/versioned_docs/version-1.x/prerender.md b/docs/versioned_docs/version-1.x/prerender.md index 2633b49aac4c..a78cc2934791 100644 --- a/docs/versioned_docs/version-1.x/prerender.md +++ b/docs/versioned_docs/version-1.x/prerender.md @@ -195,8 +195,7 @@ export default LogoComponent Depending on what pages you're prerendering, you may want to change your redirect settings. Using Netlify as an example:
-If you prerender your `notFoundPage` - +If you prerender your `notFoundPage` You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -210,8 +209,8 @@ You can remove the default redirect to index in your `netlify.toml`. This means
- If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/versioned_docs/version-1.x/quick-start.md b/docs/versioned_docs/version-1.x/quick-start.md index 79036bddcc53..8ce3e8669f64 100644 --- a/docs/versioned_docs/version-1.x/quick-start.md +++ b/docs/versioned_docs/version-1.x/quick-start.md @@ -6,7 +6,7 @@ description: Redwood quick start > **Prerequisites** > -> - Redwood requires [Node.js](https://nodejs.org/en/) (>=14.19.x <=16.x) and [Yarn](https://yarnpkg.com/) (>=1.15) +> - Redwood requires [Node.js](https://nodejs.org/en/) (>=14.19.x \<=16.x) and [Yarn](https://yarnpkg.com/) (>=1.15) > - Are you on Windows? For best results, follow our [Windows development setup](how-to/windows-development-setup.md) guide Create a Redwood project with `yarn create redwood-app`: diff --git a/docs/versioned_docs/version-1.x/redwoodrecord.md b/docs/versioned_docs/version-1.x/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/versioned_docs/version-1.x/redwoodrecord.md +++ b/docs/versioned_docs/version-1.x/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/versioned_docs/version-1.x/seo-head.md b/docs/versioned_docs/version-1.x/seo-head.md index e6474c3faf53..3ce2c6725e07 100644 --- a/docs/versioned_docs/version-1.x/seo-head.md +++ b/docs/versioned_docs/version-1.x/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' @@ -114,7 +114,7 @@ Great - so far we can see the changes, and bots will pick up our tags if we've p _Just keep in mind, that Cells are currently not prerendered_ - so it'll be visible to your users, but not to link scrapers and bots. -> **s up**
+> **\s up**
> For dynamic tags to appear to bots and link scrapers you have to setup an external prerendering service. If you're on Netlify you can use their [built-in one](https://docs.netlify.com/site-deploys/post-processing/prerendering/). Otherwise you can follow [this great how to](https://community.redwoodjs.com/t/cookbook-getting-og-and-meta-tags-working-with-nginx-pre-render-io-and-docker/2014) from the Redwood community diff --git a/docs/versioned_docs/version-1.x/tutorial/chapter1/prerequisites.md b/docs/versioned_docs/version-1.x/tutorial/chapter1/prerequisites.md index 69e0528308ac..e2b374ce1c91 100644 --- a/docs/versioned_docs/version-1.x/tutorial/chapter1/prerequisites.md +++ b/docs/versioned_docs/version-1.x/tutorial/chapter1/prerequisites.md @@ -30,7 +30,7 @@ If you have an existing site created with a prior version, you'll need to upgrad During installation, RedwoodJS checks if your system meets version requirements for Node and Yarn: -- node: ">=14.19 <=16.x" +- node: ">=14.19 \<=16.x" - yarn: ">=1.15" If your system versions do not meet both requirements, _the installation bootstrap will result in an ERROR._ To check, please run the following from your terminal command line: diff --git a/docs/versioned_docs/version-1.x/tutorial/chapter5/first-test.md b/docs/versioned_docs/version-1.x/tutorial/chapter5/first-test.md index efb11175973b..e47b70704baf 100644 --- a/docs/versioned_docs/version-1.x/tutorial/chapter5/first-test.md +++ b/docs/versioned_docs/version-1.x/tutorial/chapter5/first-test.md @@ -318,7 +318,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -333,7 +333,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -353,7 +353,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -368,7 +368,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/versioned_docs/version-2.x/auth/azure.md b/docs/versioned_docs/version-2.x/auth/azure.md index 576b450af902..1c268b412f57 100644 --- a/docs/versioned_docs/version-2.x/auth/azure.md +++ b/docs/versioned_docs/version-2.x/auth/azure.md @@ -125,7 +125,7 @@ AZURE_ACTIVE_DIRECTORY_KNOWN_AUTHORITY=https://{{ms_tenant_name}}.b2clogin.com #### Update const activeDirectoryClient instance This lets the MSAL (Microsoft Authentication Library) web side client know about our new B2C allowed authority that we defined in the .env file -``` jsx title="./web/App.jsx|.tsx +``` jsx title="./web/App.jsx|.tsx" const azureActiveDirectoryClient = new PublicClientApplication({ auth: { diff --git a/docs/versioned_docs/version-2.x/auth/dbauth.md b/docs/versioned_docs/version-2.x/auth/dbauth.md index 3061b08062ea..8ed24279d916 100644 --- a/docs/versioned_docs/version-2.x/auth/dbauth.md +++ b/docs/versioned_docs/version-2.x/auth/dbauth.md @@ -39,56 +39,57 @@ If there are any shenanigans detected (the cookie can't be decrypted properly, o ## Setup A single CLI command will get you everything you need to get dbAuth working, minus the actual login/signup pages: - - yarn rw setup auth dbAuth - +``` +yarn rw setup auth dbAuth +``` Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases: > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> -> yarn rw generate dbAuth +> ``` +> yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. ## Scaffolding Login/Signup/Forgot Password Pages If you don't want to create your own login, signup and forgot password pages from scratch we've got a generator for that: - - yarn rw g dbAuth - +``` +yarn rw g dbAuth +``` The default routes will make them available at `/login`, `/signup`, `/forgot-password`, and `/reset-password` but that's easy enough to change. Again, check the post-install instructions for one change you need to make to those pages: where to redirect the user to once their login/signup is successful. If you'd rather create your own, you might want to start from the generated pages anyway as they'll contain the other code you need to actually submit the login credentials or signup fields to the server for processing. @@ -160,13 +161,13 @@ const onSubmit = async (data) => { ### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` ### resetPassword.handler() This handler is invoked after the password has been successfully changed in the database. Returning something truthy (like `return user`) will automatically log the user in after their password is changed. If you'd like to return them to the login page and make them log in manually, `return false` and redirect the user in the Reset Password page. @@ -206,15 +207,15 @@ We've got some default error messages that sound nice, but may not fit the tone By default, the session cookie will not have the `Domain` property set, which a browser will default to be the [current domain only](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent). If your site is spread across multiple domains (for example, your site is at `example.com` but your api-side is deployed to `api.example.com`) you'll need to explicitly set a Domain so that the cookie is accessible to both. To do this, create an environment variable named `DBAUTH_COOKIE_DOMAIN` set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: - - DBAUTH_COOKIE_DOMAIN=example.com - +``` +DBAUTH_COOKIE_DOMAIN=example.com +``` ### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. > The `.env` file is set to be ignored by git and not committed to version control. There is another file, `.env.defaults`, which is meant to be safe to commit and contain simple ENV vars that your dev team can share. The encryption key for the session cookie is NOT one of these shareable vars! diff --git a/docs/versioned_docs/version-2.x/auth/firebase.md b/docs/versioned_docs/version-2.x/auth/firebase.md index bdcc07b0280e..24441838cb59 100644 --- a/docs/versioned_docs/version-2.x/auth/firebase.md +++ b/docs/versioned_docs/version-2.x/auth/firebase.md @@ -99,7 +99,7 @@ See the Firebase information within this doc's [Auth Provider Specific Integrati You must follow the ["Before you begin"](https://firebase.google.com/docs/auth/web/google-signin) part of the "Authenticate Using Google Sign-In with JavaScript" guide. -### Role-Based Access Control (RBAC) +### Role-Based Access Control (RBAC) Requires a custom implementation. @@ -133,7 +133,7 @@ Email/password authentication is supported by calling `login({ email, password } In Firebase Console, you must enable "Email link (passwordless sign-in)" with the configuration toggle for the email provider. The authentication sequence for passwordless email links has two steps: 1. First, an email with the link must be generated and sent to the user. Either using using firebase client sdk (web side) [sendSignInLinkToEmail()](https://firebase.google.com/docs/reference/js/auth.emailauthprovider#example_2_2), which generates the link and sends the email to the user on behalf of your application or alternatively, generate the link using backend admin sdk (api side), see ["Generate email link for sign-in](https://firebase.google.com/docs/auth/admin/email-action-links#generate_email_link_for_sign-in) but it is then your responsibility to send an email to the user containing the link. -2. Second, authentication is completed when the user is redirected back to the application and the AuthProvider's logIn({emailLink, email, providerId: 'emailLink'}) method is called. +2. Second, authentication is completed when the user is redirected back to the application and the AuthProvider's logIn(\{emailLink, email, providerId: 'emailLink'\}) method is called. For example, users could be redirected to a dedicated route/page to complete authentication: diff --git a/docs/versioned_docs/version-2.x/auth/nhost.md b/docs/versioned_docs/version-2.x/auth/nhost.md index 0c11eb529d2b..ea1c7b194e1f 100644 --- a/docs/versioned_docs/version-2.x/auth/nhost.md +++ b/docs/versioned_docs/version-2.x/auth/nhost.md @@ -34,7 +34,7 @@ Depending on the credentials provided: - A user can sign up via email and password. For OAuth simply sign in and the user account will be created if it does not exist. - Note: You must enable and configure the OAuth provider appropriately. To enable and configure a provider, please navigate to Users -> Login settings, from your app's dashboard. -For the docs on Authentication, see: +For the docs on Authentication, see: [https://docs.nhost.io/platform/authentication](https://docs.nhost.io/platform/authentication) If you are also **using Nhost as your GraphQL API server**, you will need to pass `skipFetchCurrentUser` as a prop to `AuthProvider` , as follows: diff --git a/docs/versioned_docs/version-2.x/auth/supabase.md b/docs/versioned_docs/version-2.x/auth/supabase.md index d6a687110559..57daaa0493b5 100644 --- a/docs/versioned_docs/version-2.x/auth/supabase.md +++ b/docs/versioned_docs/version-2.x/auth/supabase.md @@ -22,7 +22,7 @@ Update your .env file with the following settings supplied when you created your You can find these values in your project's dashboard under Settings -> API. -For full Supabase documentation, see: +For full Supabase documentation, see: [https://supabase.io/docs](https://supabase.io/docs) ## Usage @@ -57,4 +57,4 @@ Depending on the credentials provided: - Note: You must enable and configure the OAuth provider appropriately. To configure these providers, you can go to Authentication -> Settings on `app.supabase.io` for your project. - Note: To authenticate using SMS based OTP (One-Time Password) you will need a [Twilio](https://www.twilio.com/try-twilio) account -For Supabase Authentication documentation, see: +For Supabase Authentication documentation, see: [https://supabase.io/docs/guides/auth](https://supabase.io/docs/guides/auth) diff --git a/docs/versioned_docs/version-2.x/data-migrations.md b/docs/versioned_docs/version-2.x/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/versioned_docs/version-2.x/data-migrations.md +++ b/docs/versioned_docs/version-2.x/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/versioned_docs/version-2.x/deploy/baremetal.md b/docs/versioned_docs/version-2.x/deploy/baremetal.md index ba09f6c59c3d..aed3d83db976 100644 --- a/docs/versioned_docs/version-2.x/deploy/baremetal.md +++ b/docs/versioned_docs/version-2.x/deploy/baremetal.md @@ -648,7 +648,7 @@ If nginx will be serving our web side, what about api-side? Redwood's internal A This doc isn't going to go through installing and getting nginx running, there are plenty of resources for that available. What we will show is a successful nginx configuration file used by several Redwood apps currently in production. -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } @@ -695,7 +695,7 @@ yarn rw serve api When using `pm2` to start/monitor your processes, you can simplify your `deploy.toml` and `ecosystem.config.js` files to only worry about the api side: -```toml title=deploy.toml +```toml title="deploy.toml" [[production.servers]] host = "myserver.com" username = "ubuntu" @@ -711,7 +711,7 @@ packageManagerCommand = "yarn" monitorCommand = "pm2" ``` -```js title=ecosystem.config.js +```js title="ecosystem.config.js" module.exports = { apps: [ { @@ -736,7 +736,7 @@ If you don't love the path of `/.redwood/functions` for your API calls, this is For example, to simplify the path to just `/api` you'll need to make a change to `redwood.toml` and your new nginx config file: -```toml title=redwood.toml +```toml title="redwood.toml" [web] title = "My App" port = 8910 @@ -749,7 +749,7 @@ For example, to simplify the path to just `/api` you'll need to make a change to open = true ``` -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } diff --git a/docs/versioned_docs/version-2.x/graphql.md b/docs/versioned_docs/version-2.x/graphql.md index 7de11f50ed09..0d936a60977a 100644 --- a/docs/versioned_docs/version-2.x/graphql.md +++ b/docs/versioned_docs/version-2.x/graphql.md @@ -925,7 +925,7 @@ Some of the biggest security improvements we'll be making revolve around Service Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://github.com/graphql/graphql-playground) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://github.com/graphql/graphql-playground) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. diff --git a/docs/versioned_docs/version-2.x/prerender.md b/docs/versioned_docs/version-2.x/prerender.md index 2633b49aac4c..def36fa5acdb 100644 --- a/docs/versioned_docs/version-2.x/prerender.md +++ b/docs/versioned_docs/version-2.x/prerender.md @@ -195,8 +195,7 @@ export default LogoComponent Depending on what pages you're prerendering, you may want to change your redirect settings. Using Netlify as an example:
-If you prerender your `notFoundPage` - +If you prerender your `notFoundPage` You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -212,6 +211,7 @@ You can remove the default redirect to index in your `netlify.toml`. This means
If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/versioned_docs/version-2.x/quick-start.md b/docs/versioned_docs/version-2.x/quick-start.md index 1a85c07142f0..bc057b69c324 100644 --- a/docs/versioned_docs/version-2.x/quick-start.md +++ b/docs/versioned_docs/version-2.x/quick-start.md @@ -6,7 +6,7 @@ description: Redwood quick start > **Prerequisites** > -> - Redwood requires [Node.js](https://nodejs.org/en/) (>=14.19.x <=16.x) and [Yarn](https://yarnpkg.com/) (>=1.15) +> - Redwood requires [Node.js](https://nodejs.org/en/) (>=14.19.x \<=16.x) and [Yarn](https://yarnpkg.com/) (>=1.15) > - Are you on Windows? For best results, follow our [Windows development setup](how-to/windows-development-setup.md) guide Create a Redwood project with `yarn create redwood-app`: diff --git a/docs/versioned_docs/version-2.x/redwoodrecord.md b/docs/versioned_docs/version-2.x/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/versioned_docs/version-2.x/redwoodrecord.md +++ b/docs/versioned_docs/version-2.x/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/versioned_docs/version-2.x/seo-head.md b/docs/versioned_docs/version-2.x/seo-head.md index e6474c3faf53..3ce2c6725e07 100644 --- a/docs/versioned_docs/version-2.x/seo-head.md +++ b/docs/versioned_docs/version-2.x/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' @@ -114,7 +114,7 @@ Great - so far we can see the changes, and bots will pick up our tags if we've p _Just keep in mind, that Cells are currently not prerendered_ - so it'll be visible to your users, but not to link scrapers and bots. -> **s up**
+> **\s up**
> For dynamic tags to appear to bots and link scrapers you have to setup an external prerendering service. If you're on Netlify you can use their [built-in one](https://docs.netlify.com/site-deploys/post-processing/prerendering/). Otherwise you can follow [this great how to](https://community.redwoodjs.com/t/cookbook-getting-og-and-meta-tags-working-with-nginx-pre-render-io-and-docker/2014) from the Redwood community diff --git a/docs/versioned_docs/version-2.x/testing.md b/docs/versioned_docs/version-2.x/testing.md index e2d8efc09f0e..a6527e3c550f 100644 --- a/docs/versioned_docs/version-2.x/testing.md +++ b/docs/versioned_docs/version-2.x/testing.md @@ -1253,7 +1253,7 @@ The `prisma db push` command only restores a snapshot of the current database sc In order to preserve those statements in your test database, you can set an additional ENV var which will use the command `yarn rw prisma migrate reset` instead. This will run each migration in sequence against your test database. The tradeoff is that starting your test suite will take a little longer depending on how many migrations you have: -```.env title=/.env +```.env title="/.env" TEST_DATABASE_STRATEGY=reset ``` diff --git a/docs/versioned_docs/version-2.x/tutorial/chapter1/prerequisites.md b/docs/versioned_docs/version-2.x/tutorial/chapter1/prerequisites.md index efa608d12d26..63fcd20263e5 100644 --- a/docs/versioned_docs/version-2.x/tutorial/chapter1/prerequisites.md +++ b/docs/versioned_docs/version-2.x/tutorial/chapter1/prerequisites.md @@ -30,7 +30,7 @@ If you have an existing site created with a prior version, you'll need to upgrad During installation, RedwoodJS checks if your system meets version requirements for Node and Yarn: -- node: ">=14.19 <=16.x" +- node: ">=14.19 \<=16.x" - yarn: ">=1.15" If your system versions do not meet both requirements, _the installation bootstrap will result in an ERROR._ To check, please run the following from your terminal command line: diff --git a/docs/versioned_docs/version-2.x/tutorial/chapter5/first-test.md b/docs/versioned_docs/version-2.x/tutorial/chapter5/first-test.md index 07f44e6a1218..418bbd72de4c 100644 --- a/docs/versioned_docs/version-2.x/tutorial/chapter5/first-test.md +++ b/docs/versioned_docs/version-2.x/tutorial/chapter5/first-test.md @@ -318,7 +318,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -333,7 +333,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -353,7 +353,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -368,7 +368,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/versioned_docs/version-3.x/auth/azure.md b/docs/versioned_docs/version-3.x/auth/azure.md index df52b360408b..565b0150bd29 100644 --- a/docs/versioned_docs/version-3.x/auth/azure.md +++ b/docs/versioned_docs/version-3.x/auth/azure.md @@ -125,7 +125,7 @@ AZURE_ACTIVE_DIRECTORY_KNOWN_AUTHORITY=https://rwauthtestb2c.b2clogin.com #### Update const activeDirectoryClient instance This lets the MSAL (Microsoft Authentication Library) web side client know about our new B2C allowed authority that we defined in the .env file -```jsx title="./web/App.{js,tsx} +```jsx title="./web/App.{js,tsx}" const azureActiveDirectoryClient = new PublicClientApplication({ auth: { diff --git a/docs/versioned_docs/version-3.x/auth/dbauth.md b/docs/versioned_docs/version-3.x/auth/dbauth.md index a655b7a2ba7f..6e5ab8c8e0ac 100644 --- a/docs/versioned_docs/version-3.x/auth/dbauth.md +++ b/docs/versioned_docs/version-3.x/auth/dbauth.md @@ -51,41 +51,42 @@ You can also add WebAuthn to an existing dbAuth install. [Read more about WebAut Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases (these do not include the additional WebAuthn required options, make sure you get those from the output of the `setup` command): > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> -> yarn rw generate dbAuth +> ``` +> yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. @@ -226,13 +227,13 @@ forgotPassword: { ### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` ### resetPassword.enabled Allow users to reset their password via a code from a call to `forgotPassword`. Defaults to true. Needs to be explicitly set to false to disable the flow. @@ -288,7 +289,7 @@ By default, the session cookie will not have the `Domain` property set, which a To do this, set the `cookie.Domain` property in your `api/src/functions/auth.js` configuration, set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: -```json title=api/src/functions/auth.js +```json title="api/src/functions/auth.js" cookie: { HttpOnly: true, Path: '/', @@ -301,9 +302,9 @@ cookie: { ### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. :::caution .env and Version Control @@ -406,7 +407,7 @@ If you didn't setup WebAuthn at first, but decided you now want WebAuthn, you co You'll need to add two fields to your `User` model, and a new `UserCredential` model to store the devices that are used and associate them with a user: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" datasource db { provider = "sqlite" url = env("DATABASE_URL") @@ -462,7 +463,7 @@ credentials: [UserCredential]! Next we need to let dbAuth know about the new field and model names, as well as how you want WebAuthn to behave (see the highlighted section) -```javascript title=api/src/functions/auth.js +```javascript title="api/src/functions/auth.js" import { db } from 'src/lib/db' import { DbAuthHandler } from '@redwoodjs/api' diff --git a/docs/versioned_docs/version-3.x/auth/firebase.md b/docs/versioned_docs/version-3.x/auth/firebase.md index bdcc07b0280e..24441838cb59 100644 --- a/docs/versioned_docs/version-3.x/auth/firebase.md +++ b/docs/versioned_docs/version-3.x/auth/firebase.md @@ -99,7 +99,7 @@ See the Firebase information within this doc's [Auth Provider Specific Integrati You must follow the ["Before you begin"](https://firebase.google.com/docs/auth/web/google-signin) part of the "Authenticate Using Google Sign-In with JavaScript" guide. -### Role-Based Access Control (RBAC) +### Role-Based Access Control (RBAC) Requires a custom implementation. @@ -133,7 +133,7 @@ Email/password authentication is supported by calling `login({ email, password } In Firebase Console, you must enable "Email link (passwordless sign-in)" with the configuration toggle for the email provider. The authentication sequence for passwordless email links has two steps: 1. First, an email with the link must be generated and sent to the user. Either using using firebase client sdk (web side) [sendSignInLinkToEmail()](https://firebase.google.com/docs/reference/js/auth.emailauthprovider#example_2_2), which generates the link and sends the email to the user on behalf of your application or alternatively, generate the link using backend admin sdk (api side), see ["Generate email link for sign-in](https://firebase.google.com/docs/auth/admin/email-action-links#generate_email_link_for_sign-in) but it is then your responsibility to send an email to the user containing the link. -2. Second, authentication is completed when the user is redirected back to the application and the AuthProvider's logIn({emailLink, email, providerId: 'emailLink'}) method is called. +2. Second, authentication is completed when the user is redirected back to the application and the AuthProvider's logIn(\{emailLink, email, providerId: 'emailLink'\}) method is called. For example, users could be redirected to a dedicated route/page to complete authentication: diff --git a/docs/versioned_docs/version-3.x/auth/nhost.md b/docs/versioned_docs/version-3.x/auth/nhost.md index 0c11eb529d2b..ea1c7b194e1f 100644 --- a/docs/versioned_docs/version-3.x/auth/nhost.md +++ b/docs/versioned_docs/version-3.x/auth/nhost.md @@ -34,7 +34,7 @@ Depending on the credentials provided: - A user can sign up via email and password. For OAuth simply sign in and the user account will be created if it does not exist. - Note: You must enable and configure the OAuth provider appropriately. To enable and configure a provider, please navigate to Users -> Login settings, from your app's dashboard. -For the docs on Authentication, see: +For the docs on Authentication, see: [https://docs.nhost.io/platform/authentication](https://docs.nhost.io/platform/authentication) If you are also **using Nhost as your GraphQL API server**, you will need to pass `skipFetchCurrentUser` as a prop to `AuthProvider` , as follows: diff --git a/docs/versioned_docs/version-3.x/auth/supabase.md b/docs/versioned_docs/version-3.x/auth/supabase.md index d6a687110559..57daaa0493b5 100644 --- a/docs/versioned_docs/version-3.x/auth/supabase.md +++ b/docs/versioned_docs/version-3.x/auth/supabase.md @@ -22,7 +22,7 @@ Update your .env file with the following settings supplied when you created your You can find these values in your project's dashboard under Settings -> API. -For full Supabase documentation, see: +For full Supabase documentation, see: [https://supabase.io/docs](https://supabase.io/docs) ## Usage @@ -57,4 +57,4 @@ Depending on the credentials provided: - Note: You must enable and configure the OAuth provider appropriately. To configure these providers, you can go to Authentication -> Settings on `app.supabase.io` for your project. - Note: To authenticate using SMS based OTP (One-Time Password) you will need a [Twilio](https://www.twilio.com/try-twilio) account -For Supabase Authentication documentation, see: +For Supabase Authentication documentation, see: [https://supabase.io/docs/guides/auth](https://supabase.io/docs/guides/auth) diff --git a/docs/versioned_docs/version-3.x/data-migrations.md b/docs/versioned_docs/version-3.x/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/versioned_docs/version-3.x/data-migrations.md +++ b/docs/versioned_docs/version-3.x/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/versioned_docs/version-3.x/deploy/baremetal.md b/docs/versioned_docs/version-3.x/deploy/baremetal.md index 790ef4f80066..821be2e8f4a4 100644 --- a/docs/versioned_docs/version-3.x/deploy/baremetal.md +++ b/docs/versioned_docs/version-3.x/deploy/baremetal.md @@ -650,7 +650,7 @@ If nginx will be serving our web side, what about api-side? Redwood's internal A This doc isn't going to go through installing and getting nginx running, there are plenty of resources for that available. What we will show is a successful nginx configuration file used by several Redwood apps currently in production. -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } @@ -697,7 +697,7 @@ yarn rw serve api When using `pm2` to start/monitor your processes, you can simplify your `deploy.toml` and `ecosystem.config.js` files to only worry about the api side: -```toml title=deploy.toml +```toml title="deploy.toml" [[production.servers]] host = "myserver.com" username = "ubuntu" @@ -713,7 +713,7 @@ packageManagerCommand = "yarn" monitorCommand = "pm2" ``` -```js title=ecosystem.config.js +```js title="ecosystem.config.js" module.exports = { apps: [ { @@ -738,7 +738,7 @@ If you don't love the path of `/.redwood/functions` for your API calls, this is For example, to simplify the path to just `/api` you'll need to make a change to `redwood.toml` and your new nginx config file: -```toml title=redwood.toml +```toml title="redwood.toml" [web] title = "My App" port = 8910 @@ -751,7 +751,7 @@ For example, to simplify the path to just `/api` you'll need to make a change to open = true ``` -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } diff --git a/docs/versioned_docs/version-3.x/graphql.md b/docs/versioned_docs/version-3.x/graphql.md index ebfb1790f128..dae3ae1ddcc9 100644 --- a/docs/versioned_docs/version-3.x/graphql.md +++ b/docs/versioned_docs/version-3.x/graphql.md @@ -1140,7 +1140,7 @@ Some of the biggest security improvements we'll be making revolve around Service Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. diff --git a/docs/versioned_docs/version-3.x/how-to/oauth.md b/docs/versioned_docs/version-3.x/how-to/oauth.md index b3f00cc39e04..fe80d8f5cbf5 100644 --- a/docs/versioned_docs/version-3.x/how-to/oauth.md +++ b/docs/versioned_docs/version-3.x/how-to/oauth.md @@ -61,14 +61,14 @@ You may be asked to use your 2FA code to verify that you're who you say you are, Add those to your app's `.env` file (or wherever you're managing your secrets). Note that it's best to have a different OAuth app on GitHub for each environment you deploy to. Consider this one the **dev** app, and you'll create a separate one with a different client ID and secret when you're ready to deploy to production: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 ``` We also need to denote what data we want permission to read from GitHub once someone authorizes our app. We'll want the user's public info, and probably their email address. That's only two scopes, and we can add those as another ENV var: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 # highlight-next-line @@ -79,7 +79,7 @@ If you wanted access to more GitHub data, you can specify [additional scopes](ht One more ENV var, this is the same callback URL we told GitHub about. This is used in the link in the **Login with GitHub** button and gives GitHub another chance to verify that you're who you say you are: you're proving that you know where you're supposed to redirect back to: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 GITHUB_OAUTH_SCOPES="read:user user:email" @@ -91,7 +91,7 @@ GITHUB_OAUTH_REDIRECT_URI="http://localhost:8910/.redwood/functions/oauth/callba This part is pretty easy, we're just going to add a link/button to go directly to GitHub to begin the OAuth process: -```jsx title=/web/src/pages/LoginPage/LoginPage.jsx +```jsx title="/web/src/pages/LoginPage/LoginPage.jsx"
{ switch (event.path) { case '/oauth/callback': @@ -189,7 +189,7 @@ The `callback()` function is where we'll actually define the rest of our flow. W Now we need to make a request to GitHub to trade the `code` for an `access_token`. This is handled by a `fetch`: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { // highlight-start const { code } = event.queryStringParameters @@ -241,7 +241,7 @@ To keep things straight in our heads, let's call our local user `user` and the G Let's make the API call to GitHub's user info endpoint and dump the result to the browser: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { const { code } = event.queryStringParameters @@ -330,7 +330,7 @@ For now `provider` will always be `github` and the `uid` will be the GitHub's un Here's the `Identity` model definition: -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model Identity { id Int @id @default(autoincrement()) provider String @@ -358,7 +358,7 @@ There's no GraphQL SDL tied to the Identity table, so it is not accessible via o We'll need to add an `identities` relation to the `User` model, and make the previously required `hashedPassword` and `salt` fields optional (since users may want to *only* authenticate via GitHub, they'll never get to enter a password): -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model User { id Int @id @default(autoincrement()) email String @unique @@ -389,7 +389,7 @@ Let's add some code that returns the user if found, otherwise it creates the use Be sure to import `db` at the top of the file if you haven't already! ::: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import { db } from 'src/lib/db' @@ -575,7 +575,7 @@ Setting a cookie in the browser is a matter of returning a `Set-Cookie` header i Don't forget the new `CryptoJS` import at the top! -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import CryptoJS from 'crypto-js' @@ -659,7 +659,7 @@ Try it out, and as long as you have an indication on your site that a user is lo Here's the `oauth` function in its entirety: -```jsx title=/api/src/functions/oauth/oauth.js +```jsx title="/api/src/functions/oauth/oauth.js" import CryptoJS from 'crypto-js' import { db } from 'src/lib/db' diff --git a/docs/versioned_docs/version-3.x/prerender.md b/docs/versioned_docs/version-3.x/prerender.md index 71852091a6b5..210e01358341 100644 --- a/docs/versioned_docs/version-3.x/prerender.md +++ b/docs/versioned_docs/version-3.x/prerender.md @@ -291,7 +291,7 @@ b) There was an error when trying to import your GraphQL handler - maybe due to If you've moved this GraphQL function, or we encounter an error executing it, it won't break your builds. All your Cells will be prerendered in their `Loading` state, and will update once the JavaScript loads on the browser. This is effectively skipping prerendering your Cells, but they'll still work! -#### Cannot prerender the query {queryName} as it requires auth. +#### Cannot prerender the query \{queryName\} as it requires auth. This error happens during builds when you have a Cell on a page you're prerendering that makes a query marked with `@requireAuth` in your SDL. During prerender you are not logged in ([see point 1](#1-prerendering-always-happens-as-an-unauthenticated-user)), so you'll have to conditionally render the Cell - for example: @@ -342,8 +342,7 @@ Depending on what pages you're prerendering, you may want to change your redirec Using Netlify as an example:
-If you prerender your `notFoundPage`, and all your other routes - +If you prerender your `notFoundPage`, and all your other routes You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -360,6 +359,7 @@ This makes your app behave much more like a traditional website, where all the p
If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/versioned_docs/version-3.x/quick-start.md b/docs/versioned_docs/version-3.x/quick-start.md index 1a85c07142f0..bc057b69c324 100644 --- a/docs/versioned_docs/version-3.x/quick-start.md +++ b/docs/versioned_docs/version-3.x/quick-start.md @@ -6,7 +6,7 @@ description: Redwood quick start > **Prerequisites** > -> - Redwood requires [Node.js](https://nodejs.org/en/) (>=14.19.x <=16.x) and [Yarn](https://yarnpkg.com/) (>=1.15) +> - Redwood requires [Node.js](https://nodejs.org/en/) (>=14.19.x \<=16.x) and [Yarn](https://yarnpkg.com/) (>=1.15) > - Are you on Windows? For best results, follow our [Windows development setup](how-to/windows-development-setup.md) guide Create a Redwood project with `yarn create redwood-app`: diff --git a/docs/versioned_docs/version-3.x/redwoodrecord.md b/docs/versioned_docs/version-3.x/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/versioned_docs/version-3.x/redwoodrecord.md +++ b/docs/versioned_docs/version-3.x/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/versioned_docs/version-3.x/seo-head.md b/docs/versioned_docs/version-3.x/seo-head.md index 3c9756f35f6d..4b50350c6cdd 100644 --- a/docs/versioned_docs/version-3.x/seo-head.md +++ b/docs/versioned_docs/version-3.x/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' diff --git a/docs/versioned_docs/version-3.x/services.md b/docs/versioned_docs/version-3.x/services.md index df71f3950593..ff5f7335cb67 100644 --- a/docs/versioned_docs/version-3.x/services.md +++ b/docs/versioned_docs/version-3.x/services.md @@ -900,7 +900,7 @@ This leads to your product cache being rebuilt every hour, even though you haven Just like the `v1` we added to the `product` cache key above, you can globally prefix a string to *all* of your cache keys: -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" export const { cache, cacheFindMany } = createCache(client, { logger, timeout: 500, @@ -938,7 +938,7 @@ yarn rw setup cache redis This generates the following (memcached example shown): -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" import { createCache, MemcachedClient } from '@redwoodjs/api/cache' import { logger } from './logger' diff --git a/docs/versioned_docs/version-3.x/testing.md b/docs/versioned_docs/version-3.x/testing.md index 4ef02ebe3c82..426038a6b85a 100644 --- a/docs/versioned_docs/version-3.x/testing.md +++ b/docs/versioned_docs/version-3.x/testing.md @@ -1267,7 +1267,7 @@ The `prisma db push` command only restores a snapshot of the current database sc In order to preserve those statements in your test database, you can set an additional ENV var which will use the command `yarn rw prisma migrate reset` instead. This will run each migration in sequence against your test database. The tradeoff is that starting your test suite will take a little longer depending on how many migrations you have: -```.env title=/.env +```.env title="/.env" TEST_DATABASE_STRATEGY=reset ``` diff --git a/docs/versioned_docs/version-3.x/tutorial/chapter1/prerequisites.md b/docs/versioned_docs/version-3.x/tutorial/chapter1/prerequisites.md index efa608d12d26..63fcd20263e5 100644 --- a/docs/versioned_docs/version-3.x/tutorial/chapter1/prerequisites.md +++ b/docs/versioned_docs/version-3.x/tutorial/chapter1/prerequisites.md @@ -30,7 +30,7 @@ If you have an existing site created with a prior version, you'll need to upgrad During installation, RedwoodJS checks if your system meets version requirements for Node and Yarn: -- node: ">=14.19 <=16.x" +- node: ">=14.19 \<=16.x" - yarn: ">=1.15" If your system versions do not meet both requirements, _the installation bootstrap will result in an ERROR._ To check, please run the following from your terminal command line: diff --git a/docs/versioned_docs/version-3.x/tutorial/chapter5/first-test.md b/docs/versioned_docs/version-3.x/tutorial/chapter5/first-test.md index 2ad443d32c10..10933faa06df 100644 --- a/docs/versioned_docs/version-3.x/tutorial/chapter5/first-test.md +++ b/docs/versioned_docs/version-3.x/tutorial/chapter5/first-test.md @@ -320,7 +320,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -335,7 +335,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -355,7 +355,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -370,7 +370,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/versioned_docs/version-3.x/tutorial/chapter7/api-side-currentuser.md b/docs/versioned_docs/version-3.x/tutorial/chapter7/api-side-currentuser.md index 0ed488a6693c..4a01d985cdc5 100644 --- a/docs/versioned_docs/version-3.x/tutorial/chapter7/api-side-currentuser.md +++ b/docs/versioned_docs/version-3.x/tutorial/chapter7/api-side-currentuser.md @@ -30,7 +30,7 @@ Making data changes like this will start becoming second nature soon: First we'll add the new `userId` field to `Post` and the relation to `User`: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" model Post { id Int @id @default(autoincrement()) title String @@ -87,7 +87,7 @@ yarn rw prisma migrate reset If you started the second half the tutorial from the [Redwood Tutorial repo](https://github.com/redwoodjs/redwood-tutorial) you'll get an error after resetting the databaseβ€”Prisma attempts to seed the database with a user and some posts to get you started, but the posts in that seed do not have the new required `userId` field! Open up `scripts/seed.js` and edit each post to add `userId: 1` to each: -```javascript title=scripts/seed.js +```javascript title="scripts/seed.js" { id: 1, name: 'John Doe', @@ -146,7 +146,7 @@ To enable this we'll need to make two modifications on the api side: #### Add User to Posts SDL -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" type Post { id: Int! title: String! @@ -169,7 +169,7 @@ Here we're using `User!` with an exclamation point because we know that every `P This one is a little tricker: we need to add a "lookup" in the `posts` service, so that it knows how to get the associated user. When we generated the `comments` SDL and service we got this **relation resolver** created for us. We could re-run the service generator for `Post` but that could blow away changes we made to this file. Our only option would be to include the `--force` flag since the file already exists, which will write over everything. In this case we'll just add the resolver manually: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -287,7 +287,7 @@ There are two places where we publicly present a post: Let's update their respective Cells to include the name of the user that created the post: -```jsx title=web/src/components/ArticlesCell/ArticlesCell.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.js" export const QUERY = gql` query ArticlesQuery { articles: posts { @@ -305,7 +305,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/ArticleCell/ArticleCell.js +```jsx title="web/src/components/ArticleCell/ArticleCell.js" export const QUERY = gql` query ArticleQuery($id: Int!) { article: post(id: $id) { @@ -325,7 +325,7 @@ export const QUERY = gql` And then update the display component that shows an Article: -```jsx title=web/src/components/Article/Article.js +```jsx title="web/src/components/Article/Article.js" import { Link, routes } from '@redwoodjs/router' const Article = ({ article }) => { @@ -356,7 +356,7 @@ Depending on whether you started from the Redwood Tutorial repo or not, you may There's a magical variable named `context` that's available within any of your service functions. It contains the context in which the service function is being called. One property available on this context is the user that's logged in (*if* someone is logged in). It's the same `currentUser` that is available on the web side: -```javascript title=api/src/service/posts/posts.js +```javascript title="api/src/service/posts/posts.js" export const createPost = ({ input }) => { return db.post.create({ // highlight-next-line @@ -381,7 +381,7 @@ Right now any admin that visits `/admin/posts` can still see all posts, not only Since we know we have access to `context.currentUser` we can sprinkle it throughout our posts service to limit what's returned to only those posts that the currently logged in user owns: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -452,7 +452,7 @@ There are several steps we'll need to complete: Let's keep the existing `posts.sdl.js` and make that the "public" interface. Duplicate that SDL, naming it `adminPosts.sdl.js`, and modify it like so: -```javascript title=api/src/graphql/adminPosts.sdl.js +```javascript title="api/src/graphql/adminPosts.sdl.js" export const schema = gql` type Query { adminPosts: [Post!]! @requireAuth(roles: ["admin"]) @@ -477,7 +477,7 @@ export const schema = gql` ` ``` -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" export const schema = gql` type Post { id: Int! @@ -502,7 +502,7 @@ In `adminPosts` we've updated the queries to use `@requireAuth` instead of `@ski Next let's create an `adminPosts` service. We'll need to move our create/update/delete mutations to it, as the name of the SDL needs to match the name of the service: -```javascript title=api/src/services/adminPosts/adminPosts.js +```javascript title="api/src/services/adminPosts/adminPosts.js" import { db } from 'src/lib/db' export const adminPosts = () => { @@ -537,7 +537,7 @@ export const deletePost = ({ id }) => { (Again, don't forget the change from `findUnique()` to `findFirst()`.) And update `posts` to remove some of the functions that live in `adminPosts` now: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -562,7 +562,7 @@ Note that we kept the relation resolver here `Post.user`, and there's none in `a Finally, we'll need to update several of the scaffold components to use the new `adminPosts` and `adminPost` queries (we'll limit the code snippets below to just the changes to save some room, this page is getting long enough!): -```javascript title=web/src/components/Post/EditPostCell/EditPostCell.js +```javascript title="web/src/components/Post/EditPostCell/EditPostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -576,7 +576,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostCell/PostCell.js +```jsx title="web/src/components/Post/PostCell/PostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -590,7 +590,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostsCell/PostsCell.js +```jsx title="web/src/components/Post/PostsCell/PostsCell.js" export const QUERY = gql` query POSTS { // highlight-next-line diff --git a/docs/versioned_docs/version-3.x/typescript/strict-mode.md b/docs/versioned_docs/version-3.x/typescript/strict-mode.md index 43a01d8839fd..221d7e6fe98b 100644 --- a/docs/versioned_docs/version-3.x/typescript/strict-mode.md +++ b/docs/versioned_docs/version-3.x/typescript/strict-mode.md @@ -47,7 +47,7 @@ But the gist of it is that, for Prisma's create and update operations, you may h For most cases however, you probably want to convert nulls to undefined - one way to do this is to use the `removeNulls` utility function from `@redwoodjs/api`: -```ts title=api/src/services/users.ts +```ts title="api/src/services/users.ts" // highlight-next-line import { removeNulls } from "@redwoodjs/api" diff --git a/docs/versioned_docs/version-3.x/typescript/utility-types.md b/docs/versioned_docs/version-3.x/typescript/utility-types.md index 20ec957151a6..9eb65457c30c 100644 --- a/docs/versioned_docs/version-3.x/typescript/utility-types.md +++ b/docs/versioned_docs/version-3.x/typescript/utility-types.md @@ -49,7 +49,7 @@ export const Success = ({ This gives you the types of the props in your Cell's `Failure` component. It takes `TVariables` as an optional generic parameter, which is useful if you want to print error messages like `"Couldn't load data for ${variables.searchTerm}"`: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -70,7 +70,7 @@ export const Failure = ({ Similar to `CellFailureProps`, but for the props of your Cell's `Loading` component: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -104,7 +104,7 @@ defineScenario An example: -```ts title=posts.scenarios.ts +```ts title="posts.scenarios.ts" import type { Prisma, Post } from '@prisma/client' export const standard = defineScenario({ @@ -138,7 +138,7 @@ It takes three generic parameters: We know this is a lot of generics, but that's so you get to choose how specific you want to be with the types! -```ts title=api/src/services/posts/posts.scenario.ts +```ts title="api/src/services/posts/posts.scenario.ts" import type { Post } from '@prisma/client' //... @@ -146,7 +146,7 @@ import type { Post } from '@prisma/client' export type StandardScenario = ScenarioData ``` -```ts title=api/src/services/posts/posts.test.ts +```ts title="api/src/services/posts/posts.test.ts" import type { StandardScenario } from './posts.scenarios' scenario('returns a single post', async (scenario: StandardScenario) => { diff --git a/docs/versioned_docs/version-4.x/auth/dbauth.md b/docs/versioned_docs/version-4.x/auth/dbauth.md index a655b7a2ba7f..6e5ab8c8e0ac 100644 --- a/docs/versioned_docs/version-4.x/auth/dbauth.md +++ b/docs/versioned_docs/version-4.x/auth/dbauth.md @@ -51,41 +51,42 @@ You can also add WebAuthn to an existing dbAuth install. [Read more about WebAut Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases (these do not include the additional WebAuthn required options, make sure you get those from the output of the `setup` command): > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> -> yarn rw generate dbAuth +> ``` +> yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. @@ -226,13 +227,13 @@ forgotPassword: { ### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` ### resetPassword.enabled Allow users to reset their password via a code from a call to `forgotPassword`. Defaults to true. Needs to be explicitly set to false to disable the flow. @@ -288,7 +289,7 @@ By default, the session cookie will not have the `Domain` property set, which a To do this, set the `cookie.Domain` property in your `api/src/functions/auth.js` configuration, set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: -```json title=api/src/functions/auth.js +```json title="api/src/functions/auth.js" cookie: { HttpOnly: true, Path: '/', @@ -301,9 +302,9 @@ cookie: { ### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. :::caution .env and Version Control @@ -406,7 +407,7 @@ If you didn't setup WebAuthn at first, but decided you now want WebAuthn, you co You'll need to add two fields to your `User` model, and a new `UserCredential` model to store the devices that are used and associate them with a user: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" datasource db { provider = "sqlite" url = env("DATABASE_URL") @@ -462,7 +463,7 @@ credentials: [UserCredential]! Next we need to let dbAuth know about the new field and model names, as well as how you want WebAuthn to behave (see the highlighted section) -```javascript title=api/src/functions/auth.js +```javascript title="api/src/functions/auth.js" import { db } from 'src/lib/db' import { DbAuthHandler } from '@redwoodjs/api' diff --git a/docs/versioned_docs/version-4.x/data-migrations.md b/docs/versioned_docs/version-4.x/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/versioned_docs/version-4.x/data-migrations.md +++ b/docs/versioned_docs/version-4.x/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/versioned_docs/version-4.x/deploy/baremetal.md b/docs/versioned_docs/version-4.x/deploy/baremetal.md index 790ef4f80066..821be2e8f4a4 100644 --- a/docs/versioned_docs/version-4.x/deploy/baremetal.md +++ b/docs/versioned_docs/version-4.x/deploy/baremetal.md @@ -650,7 +650,7 @@ If nginx will be serving our web side, what about api-side? Redwood's internal A This doc isn't going to go through installing and getting nginx running, there are plenty of resources for that available. What we will show is a successful nginx configuration file used by several Redwood apps currently in production. -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } @@ -697,7 +697,7 @@ yarn rw serve api When using `pm2` to start/monitor your processes, you can simplify your `deploy.toml` and `ecosystem.config.js` files to only worry about the api side: -```toml title=deploy.toml +```toml title="deploy.toml" [[production.servers]] host = "myserver.com" username = "ubuntu" @@ -713,7 +713,7 @@ packageManagerCommand = "yarn" monitorCommand = "pm2" ``` -```js title=ecosystem.config.js +```js title="ecosystem.config.js" module.exports = { apps: [ { @@ -738,7 +738,7 @@ If you don't love the path of `/.redwood/functions` for your API calls, this is For example, to simplify the path to just `/api` you'll need to make a change to `redwood.toml` and your new nginx config file: -```toml title=redwood.toml +```toml title="redwood.toml" [web] title = "My App" port = 8910 @@ -751,7 +751,7 @@ For example, to simplify the path to just `/api` you'll need to make a change to open = true ``` -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } diff --git a/docs/versioned_docs/version-4.x/graphql.md b/docs/versioned_docs/version-4.x/graphql.md index e162cb3ba82d..fa0dcfb9f866 100644 --- a/docs/versioned_docs/version-4.x/graphql.md +++ b/docs/versioned_docs/version-4.x/graphql.md @@ -1448,7 +1448,7 @@ type Query { Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. diff --git a/docs/versioned_docs/version-4.x/how-to/oauth.md b/docs/versioned_docs/version-4.x/how-to/oauth.md index b3f00cc39e04..fe80d8f5cbf5 100644 --- a/docs/versioned_docs/version-4.x/how-to/oauth.md +++ b/docs/versioned_docs/version-4.x/how-to/oauth.md @@ -61,14 +61,14 @@ You may be asked to use your 2FA code to verify that you're who you say you are, Add those to your app's `.env` file (or wherever you're managing your secrets). Note that it's best to have a different OAuth app on GitHub for each environment you deploy to. Consider this one the **dev** app, and you'll create a separate one with a different client ID and secret when you're ready to deploy to production: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 ``` We also need to denote what data we want permission to read from GitHub once someone authorizes our app. We'll want the user's public info, and probably their email address. That's only two scopes, and we can add those as another ENV var: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 # highlight-next-line @@ -79,7 +79,7 @@ If you wanted access to more GitHub data, you can specify [additional scopes](ht One more ENV var, this is the same callback URL we told GitHub about. This is used in the link in the **Login with GitHub** button and gives GitHub another chance to verify that you're who you say you are: you're proving that you know where you're supposed to redirect back to: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 GITHUB_OAUTH_SCOPES="read:user user:email" @@ -91,7 +91,7 @@ GITHUB_OAUTH_REDIRECT_URI="http://localhost:8910/.redwood/functions/oauth/callba This part is pretty easy, we're just going to add a link/button to go directly to GitHub to begin the OAuth process: -```jsx title=/web/src/pages/LoginPage/LoginPage.jsx +```jsx title="/web/src/pages/LoginPage/LoginPage.jsx" { switch (event.path) { case '/oauth/callback': @@ -189,7 +189,7 @@ The `callback()` function is where we'll actually define the rest of our flow. W Now we need to make a request to GitHub to trade the `code` for an `access_token`. This is handled by a `fetch`: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { // highlight-start const { code } = event.queryStringParameters @@ -241,7 +241,7 @@ To keep things straight in our heads, let's call our local user `user` and the G Let's make the API call to GitHub's user info endpoint and dump the result to the browser: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { const { code } = event.queryStringParameters @@ -330,7 +330,7 @@ For now `provider` will always be `github` and the `uid` will be the GitHub's un Here's the `Identity` model definition: -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model Identity { id Int @id @default(autoincrement()) provider String @@ -358,7 +358,7 @@ There's no GraphQL SDL tied to the Identity table, so it is not accessible via o We'll need to add an `identities` relation to the `User` model, and make the previously required `hashedPassword` and `salt` fields optional (since users may want to *only* authenticate via GitHub, they'll never get to enter a password): -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model User { id Int @id @default(autoincrement()) email String @unique @@ -389,7 +389,7 @@ Let's add some code that returns the user if found, otherwise it creates the use Be sure to import `db` at the top of the file if you haven't already! ::: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import { db } from 'src/lib/db' @@ -575,7 +575,7 @@ Setting a cookie in the browser is a matter of returning a `Set-Cookie` header i Don't forget the new `CryptoJS` import at the top! -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import CryptoJS from 'crypto-js' @@ -659,7 +659,7 @@ Try it out, and as long as you have an indication on your site that a user is lo Here's the `oauth` function in its entirety: -```jsx title=/api/src/functions/oauth/oauth.js +```jsx title="/api/src/functions/oauth/oauth.js" import CryptoJS from 'crypto-js' import { db } from 'src/lib/db' diff --git a/docs/versioned_docs/version-4.x/prerender.md b/docs/versioned_docs/version-4.x/prerender.md index 71852091a6b5..210e01358341 100644 --- a/docs/versioned_docs/version-4.x/prerender.md +++ b/docs/versioned_docs/version-4.x/prerender.md @@ -291,7 +291,7 @@ b) There was an error when trying to import your GraphQL handler - maybe due to If you've moved this GraphQL function, or we encounter an error executing it, it won't break your builds. All your Cells will be prerendered in their `Loading` state, and will update once the JavaScript loads on the browser. This is effectively skipping prerendering your Cells, but they'll still work! -#### Cannot prerender the query {queryName} as it requires auth. +#### Cannot prerender the query \{queryName\} as it requires auth. This error happens during builds when you have a Cell on a page you're prerendering that makes a query marked with `@requireAuth` in your SDL. During prerender you are not logged in ([see point 1](#1-prerendering-always-happens-as-an-unauthenticated-user)), so you'll have to conditionally render the Cell - for example: @@ -342,8 +342,7 @@ Depending on what pages you're prerendering, you may want to change your redirec Using Netlify as an example:
-If you prerender your `notFoundPage`, and all your other routes - +If you prerender your `notFoundPage`, and all your other routes You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -360,6 +359,7 @@ This makes your app behave much more like a traditional website, where all the p
If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/versioned_docs/version-4.x/quick-start.md b/docs/versioned_docs/version-4.x/quick-start.md index cc96f541c967..4fa62fbee562 100644 --- a/docs/versioned_docs/version-4.x/quick-start.md +++ b/docs/versioned_docs/version-4.x/quick-start.md @@ -6,7 +6,7 @@ description: Redwood quick start > **Prerequisites** > -> - Redwood requires [Node.js](https://nodejs.org/en/) (>=16.19 <=18.x) and [Yarn](https://yarnpkg.com/) (>=1.15) +> - Redwood requires [Node.js](https://nodejs.org/en/) (>=16.19 \<=18.x) and [Yarn](https://yarnpkg.com/) (>=1.15) > - Are you on Windows? For best results, follow our [Windows development setup](how-to/windows-development-setup.md) guide Create a Redwood project with `yarn create redwood-app`: diff --git a/docs/versioned_docs/version-4.x/redwoodrecord.md b/docs/versioned_docs/version-4.x/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/versioned_docs/version-4.x/redwoodrecord.md +++ b/docs/versioned_docs/version-4.x/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/versioned_docs/version-4.x/seo-head.md b/docs/versioned_docs/version-4.x/seo-head.md index 3c9756f35f6d..4b50350c6cdd 100644 --- a/docs/versioned_docs/version-4.x/seo-head.md +++ b/docs/versioned_docs/version-4.x/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' diff --git a/docs/versioned_docs/version-4.x/services.md b/docs/versioned_docs/version-4.x/services.md index 4637c540c691..8c79ea963be6 100644 --- a/docs/versioned_docs/version-4.x/services.md +++ b/docs/versioned_docs/version-4.x/services.md @@ -883,7 +883,7 @@ This leads to your product cache being rebuilt every hour, even though you haven Just like the `v1` we added to the `product` cache key above, you can globally prefix a string to *all* of your cache keys: -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" export const { cache, cacheFindMany } = createCache(client, { logger, timeout: 500, @@ -921,7 +921,7 @@ yarn rw setup cache redis This generates the following (memcached example shown): -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" import { createCache, MemcachedClient } from '@redwoodjs/api/cache' import { logger } from './logger' diff --git a/docs/versioned_docs/version-4.x/testing.md b/docs/versioned_docs/version-4.x/testing.md index 4ef02ebe3c82..426038a6b85a 100644 --- a/docs/versioned_docs/version-4.x/testing.md +++ b/docs/versioned_docs/version-4.x/testing.md @@ -1267,7 +1267,7 @@ The `prisma db push` command only restores a snapshot of the current database sc In order to preserve those statements in your test database, you can set an additional ENV var which will use the command `yarn rw prisma migrate reset` instead. This will run each migration in sequence against your test database. The tradeoff is that starting your test suite will take a little longer depending on how many migrations you have: -```.env title=/.env +```.env title="/.env" TEST_DATABASE_STRATEGY=reset ``` diff --git a/docs/versioned_docs/version-4.x/tutorial/chapter1/prerequisites.md b/docs/versioned_docs/version-4.x/tutorial/chapter1/prerequisites.md index bdce2623fc36..691375959fbc 100644 --- a/docs/versioned_docs/version-4.x/tutorial/chapter1/prerequisites.md +++ b/docs/versioned_docs/version-4.x/tutorial/chapter1/prerequisites.md @@ -30,7 +30,7 @@ If you have an existing site created with a prior version, you'll need to upgrad During installation, RedwoodJS checks if your system meets version requirements for Node and Yarn: -- node: ">=16.19 <=18.x" +- node: ">=16.19 \<=18.x" - yarn: ">=1.15" If your system versions do not meet both requirements, _the installation bootstrap will result in an ERROR._ To check, please run the following from your terminal command line: diff --git a/docs/versioned_docs/version-4.x/tutorial/chapter5/first-test.md b/docs/versioned_docs/version-4.x/tutorial/chapter5/first-test.md index 2ad443d32c10..10933faa06df 100644 --- a/docs/versioned_docs/version-4.x/tutorial/chapter5/first-test.md +++ b/docs/versioned_docs/version-4.x/tutorial/chapter5/first-test.md @@ -320,7 +320,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -335,7 +335,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -355,7 +355,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -370,7 +370,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/versioned_docs/version-4.x/tutorial/chapter7/api-side-currentuser.md b/docs/versioned_docs/version-4.x/tutorial/chapter7/api-side-currentuser.md index 9ba4f08d658c..b13841fb6f67 100644 --- a/docs/versioned_docs/version-4.x/tutorial/chapter7/api-side-currentuser.md +++ b/docs/versioned_docs/version-4.x/tutorial/chapter7/api-side-currentuser.md @@ -30,7 +30,7 @@ Making data changes like this will start becoming second nature soon: First we'll add the new `userId` field to `Post` and the relation to `User`: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" model Post { id Int @id @default(autoincrement()) title String @@ -128,7 +128,7 @@ yarn rw prisma migrate reset If you started the second half the tutorial from the [Redwood Tutorial repo](https://github.com/redwoodjs/redwood-tutorial) you'll get an error after resetting the databaseβ€”Prisma attempts to seed the database with a user and some posts to get you started, but the posts in that seed do not have the new required `userId` field! Open up `scripts/seed.js` and edit each post to add `userId: 1` to each: -```javascript title=scripts/seed.js +```javascript title="scripts/seed.js" { id: 1, name: 'John Doe', @@ -187,7 +187,7 @@ To enable this we'll need to make two modifications on the api side: #### Add User to Posts SDL -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" type Post { id: Int! title: String! @@ -210,7 +210,7 @@ Here we're using `User!` with an exclamation point because we know that every `P This one is a little tricker: we need to add a "lookup" in the `posts` service, so that it knows how to get the associated user. When we generated the `comments` SDL and service we got this **relation resolver** created for us. We could re-run the service generator for `Post` but that could blow away changes we made to this file. Our only option would be to include the `--force` flag since the file already exists, which will write over everything. In this case we'll just add the resolver manually: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -328,7 +328,7 @@ There are two places where we publicly present a post: Let's update their respective Cells to include the name of the user that created the post: -```jsx title=web/src/components/ArticlesCell/ArticlesCell.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.js" export const QUERY = gql` query ArticlesQuery { articles: posts { @@ -346,7 +346,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/ArticleCell/ArticleCell.js +```jsx title="web/src/components/ArticleCell/ArticleCell.js" export const QUERY = gql` query ArticleQuery($id: Int!) { article: post(id: $id) { @@ -366,7 +366,7 @@ export const QUERY = gql` And then update the display component that shows an Article: -```jsx title=web/src/components/Article/Article.js +```jsx title="web/src/components/Article/Article.js" import { Link, routes } from '@redwoodjs/router' const Article = ({ article }) => { @@ -397,7 +397,7 @@ Depending on whether you started from the Redwood Tutorial repo or not, you may There's a magical variable named `context` that's available within any of your service functions. It contains the context in which the service function is being called. One property available on this context is the user that's logged in (*if* someone is logged in). It's the same `currentUser` that is available on the web side: -```javascript title=api/src/service/posts/posts.js +```javascript title="api/src/service/posts/posts.js" export const createPost = ({ input }) => { return db.post.create({ // highlight-next-line @@ -422,7 +422,7 @@ Right now any admin that visits `/admin/posts` can still see all posts, not only Since we know we have access to `context.currentUser` we can sprinkle it throughout our posts service to limit what's returned to only those posts that the currently logged in user owns: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -493,7 +493,7 @@ There are several steps we'll need to complete: Let's keep the existing `posts.sdl.js` and make that the "public" interface. Duplicate that SDL, naming it `adminPosts.sdl.js`, and modify it like so: -```javascript title=api/src/graphql/adminPosts.sdl.js +```javascript title="api/src/graphql/adminPosts.sdl.js" export const schema = gql` type Query { adminPosts: [Post!]! @requireAuth(roles: ["admin"]) @@ -518,7 +518,7 @@ export const schema = gql` ` ``` -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" export const schema = gql` type Post { id: Int! @@ -543,7 +543,7 @@ In `adminPosts` we've updated the queries to use `@requireAuth` instead of `@ski Next let's create an `adminPosts` service. We'll need to move our create/update/delete mutations to it, as the name of the SDL needs to match the name of the service: -```javascript title=api/src/services/adminPosts/adminPosts.js +```javascript title="api/src/services/adminPosts/adminPosts.js" import { db } from 'src/lib/db' export const adminPosts = () => { @@ -578,7 +578,7 @@ export const deletePost = ({ id }) => { (Again, don't forget the change from `findUnique()` to `findFirst()`.) And update `posts` to remove some of the functions that live in `adminPosts` now: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -603,7 +603,7 @@ Note that we kept the relation resolver here `Post.user`, and there's none in `a Finally, we'll need to update several of the scaffold components to use the new `adminPosts` and `adminPost` queries (we'll limit the code snippets below to just the changes to save some room, this page is getting long enough!): -```javascript title=web/src/components/Post/EditPostCell/EditPostCell.js +```javascript title="web/src/components/Post/EditPostCell/EditPostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -617,7 +617,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostCell/PostCell.js +```jsx title="web/src/components/Post/PostCell/PostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -631,7 +631,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostsCell/PostsCell.js +```jsx title="web/src/components/Post/PostsCell/PostsCell.js" export const QUERY = gql` query POSTS { // highlight-next-line diff --git a/docs/versioned_docs/version-4.x/typescript/strict-mode.md b/docs/versioned_docs/version-4.x/typescript/strict-mode.md index 43a01d8839fd..221d7e6fe98b 100644 --- a/docs/versioned_docs/version-4.x/typescript/strict-mode.md +++ b/docs/versioned_docs/version-4.x/typescript/strict-mode.md @@ -47,7 +47,7 @@ But the gist of it is that, for Prisma's create and update operations, you may h For most cases however, you probably want to convert nulls to undefined - one way to do this is to use the `removeNulls` utility function from `@redwoodjs/api`: -```ts title=api/src/services/users.ts +```ts title="api/src/services/users.ts" // highlight-next-line import { removeNulls } from "@redwoodjs/api" diff --git a/docs/versioned_docs/version-4.x/typescript/utility-types.md b/docs/versioned_docs/version-4.x/typescript/utility-types.md index 867ff9932569..0e925cb06b46 100644 --- a/docs/versioned_docs/version-4.x/typescript/utility-types.md +++ b/docs/versioned_docs/version-4.x/typescript/utility-types.md @@ -49,7 +49,7 @@ export const Success = ({ This gives you the types of the props in your Cell's `Failure` component. It takes `TVariables` as an optional generic parameter, which is useful if you want to print error messages like `"Couldn't load data for ${variables.searchTerm}"`: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -70,7 +70,7 @@ export const Failure = ({ Similar to `CellFailureProps`, but for the props of your Cell's `Loading` component: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -104,7 +104,7 @@ defineScenario An example: -```ts title=posts.scenarios.ts +```ts title="posts.scenarios.ts" import type { Prisma, Post } from '@prisma/client' export const standard = defineScenario({ @@ -138,7 +138,7 @@ It takes three generic parameters: We know this is a lot of generics, but that's so you get to choose how specific you want to be with the types! -```ts title=api/src/services/posts/posts.scenario.ts +```ts title="api/src/services/posts/posts.scenario.ts" import type { Post } from '@prisma/client' //... @@ -146,7 +146,7 @@ import type { Post } from '@prisma/client' export type StandardScenario = ScenarioData ``` -```ts title=api/src/services/posts/posts.test.ts +```ts title="api/src/services/posts/posts.test.ts" import type { StandardScenario } from './posts.scenarios' scenario('returns a single post', async (scenario: StandardScenario) => { diff --git a/docs/versioned_docs/version-5.x/auth/dbauth.md b/docs/versioned_docs/version-5.x/auth/dbauth.md index 4e80f0176f88..d19c78fb979e 100644 --- a/docs/versioned_docs/version-5.x/auth/dbauth.md +++ b/docs/versioned_docs/version-5.x/auth/dbauth.md @@ -52,41 +52,42 @@ You can also add WebAuthn to an existing dbAuth install. [Read more about WebAut Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases (these do not include the additional WebAuthn required options, make sure you get those from the output of the `setup` command): > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> -> yarn rw generate dbAuth +> ``` +> yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. @@ -227,13 +228,13 @@ forgotPassword: { ### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` > Note that although the user table contains a hash of `resetToken`, only for the handler, `user.resetToken` will contain the raw `resetToken` to use for generating a password reset link. ### resetPassword.enabled @@ -312,7 +313,7 @@ By default, the session cookie will not have the `Domain` property set, which a To do this, set the `cookie.Domain` property in your `api/src/functions/auth.js` configuration, set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: -```json title=api/src/functions/auth.js +```json title="api/src/functions/auth.js" cookie: { HttpOnly: true, Path: '/', @@ -325,9 +326,9 @@ cookie: { ### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. :::caution .env and Version Control @@ -430,7 +431,7 @@ If you didn't setup WebAuthn at first, but decided you now want WebAuthn, you co You'll need to add two fields to your `User` model, and a new `UserCredential` model to store the devices that are used and associate them with a user: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" datasource db { provider = "sqlite" url = env("DATABASE_URL") @@ -486,7 +487,7 @@ credentials: [UserCredential]! Next we need to let dbAuth know about the new field and model names, as well as how you want WebAuthn to behave (see the highlighted section) -```javascript title=api/src/functions/auth.js +```javascript title="api/src/functions/auth.js" import { db } from 'src/lib/db' import { DbAuthHandler } from '@redwoodjs/api' diff --git a/docs/versioned_docs/version-5.x/data-migrations.md b/docs/versioned_docs/version-5.x/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/versioned_docs/version-5.x/data-migrations.md +++ b/docs/versioned_docs/version-5.x/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/versioned_docs/version-5.x/deploy/baremetal.md b/docs/versioned_docs/version-5.x/deploy/baremetal.md index 8a44a44f5ab5..4703a7910a37 100644 --- a/docs/versioned_docs/version-5.x/deploy/baremetal.md +++ b/docs/versioned_docs/version-5.x/deploy/baremetal.md @@ -654,7 +654,7 @@ If nginx will be serving our web side, what about api-side? Redwood's internal A This doc isn't going to go through installing and getting nginx running, there are plenty of resources for that available. What we will show is a successful nginx configuration file used by several Redwood apps currently in production. -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } @@ -701,7 +701,7 @@ yarn rw serve api When using `pm2` to start/monitor your processes, you can simplify your `deploy.toml` and `ecosystem.config.js` files to only worry about the api side: -```toml title=deploy.toml +```toml title="deploy.toml" [[production.servers]] host = "myserver.com" username = "ubuntu" @@ -717,7 +717,7 @@ packageManagerCommand = "yarn" monitorCommand = "pm2" ``` -```js title=ecosystem.config.js +```js title="ecosystem.config.js" module.exports = { apps: [ { @@ -742,7 +742,7 @@ If you don't love the path of `/.redwood/functions` for your API calls, this is For example, to simplify the path to just `/api` you'll need to make a change to `redwood.toml` and your new nginx config file: -```toml title=redwood.toml +```toml title="redwood.toml" [web] title = "My App" port = 8910 @@ -755,7 +755,7 @@ For example, to simplify the path to just `/api` you'll need to make a change to open = true ``` -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } diff --git a/docs/versioned_docs/version-5.x/graphql.md b/docs/versioned_docs/version-5.x/graphql.md index f1b83de0e34e..65b2377ba732 100644 --- a/docs/versioned_docs/version-5.x/graphql.md +++ b/docs/versioned_docs/version-5.x/graphql.md @@ -1448,7 +1448,7 @@ type Query { Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **, by default, only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. diff --git a/docs/versioned_docs/version-5.x/how-to/oauth.md b/docs/versioned_docs/version-5.x/how-to/oauth.md index 986653edc756..2c4c0a9c0781 100644 --- a/docs/versioned_docs/version-5.x/how-to/oauth.md +++ b/docs/versioned_docs/version-5.x/how-to/oauth.md @@ -61,7 +61,7 @@ You may be asked to use your 2FA code to verify that you're who you say you are, Add those to your app's `.env` file (or wherever you're managing your secrets). Note that it's best to have a different OAuth app on GitHub for each environment you deploy to. Consider this one the **dev** app, and you'll create a separate one with a different client ID and secret when you're ready to deploy to production: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 ``` @@ -69,7 +69,7 @@ GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 We also need to denote what data we want permission to read from GitHub once someone authorizes our app. We'll want the user's public info, and probably their email address. That's only two scopes, and we can add those as another ENV var: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 # highlight-next-line @@ -80,7 +80,7 @@ If you wanted access to more GitHub data, you can specify additional scopes here One more ENV var, this is the same callback URL we told GitHub about. This is used in the link in the **Login with GitHub** button and gives GitHub another chance to verify that you're who you say you are: you're proving that you know where you're supposed to redirect back to: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 GITHUB_OAUTH_SCOPES="read:user user:email" @@ -92,7 +92,7 @@ GITHUB_OAUTH_REDIRECT_URI="http://localhost:8910/.redwood/functions/oauth/callba This part is pretty easy, we're just going to add a link/button to go directly to GitHub to begin the OAuth process: -```jsx title=/web/src/pages/LoginPage/LoginPage.jsx +```jsx title="/web/src/pages/LoginPage/LoginPage.jsx" { switch (event.path) { case '/oauth/callback': @@ -190,7 +190,7 @@ The `callback()` function is where we'll actually define the rest of our flow. W Now we need to make a request to GitHub to trade the `code` for an `access_token`. This is handled by a `fetch`: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { // highlight-start const { code } = event.queryStringParameters @@ -242,7 +242,7 @@ To keep things straight in our heads, let's call our local user `user` and the G Let's make the API call to GitHub's user info endpoint and dump the result to the browser: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { const { code } = event.queryStringParameters @@ -331,7 +331,7 @@ For now `provider` will always be `github` and the `uid` will be the GitHub's un Here's the `Identity` model definition: -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model Identity { id Int @id @default(autoincrement()) provider String @@ -354,7 +354,7 @@ We're also storing the `accessToken` and `scope` that we got back from the last We'll also need to add an `identities` relation to the `User` model, and make the previously required `hashedPassword` and `salt` fields optional (since users may want to *only* authenticate via GitHub, they'll never get to enter a password): -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model User { id Int @id @default(autoincrement()) email String @unique @@ -386,7 +386,7 @@ Be to import `db` at the top of the file if you haven't already! ::: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import { db } from 'src/lib/db' @@ -573,7 +573,7 @@ Setting a cookie in the browser is a matter of returning a `Set-Cookie` header i Don't forget the new `CryptoJS` import at the top! -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import CryptoJS from 'crypto-js' @@ -657,7 +657,7 @@ Try it out, and as long as you have an indication on your site that a user is lo Here's the `oauth` function in its entirety: -```jsx title=/api/src/functions/oauth/oauth.js +```jsx title="/api/src/functions/oauth/oauth.js" import CryptoJS from 'crypto-js' import { db } from 'src/lib/db' diff --git a/docs/versioned_docs/version-5.x/prerender.md b/docs/versioned_docs/version-5.x/prerender.md index 71852091a6b5..210e01358341 100644 --- a/docs/versioned_docs/version-5.x/prerender.md +++ b/docs/versioned_docs/version-5.x/prerender.md @@ -291,7 +291,7 @@ b) There was an error when trying to import your GraphQL handler - maybe due to If you've moved this GraphQL function, or we encounter an error executing it, it won't break your builds. All your Cells will be prerendered in their `Loading` state, and will update once the JavaScript loads on the browser. This is effectively skipping prerendering your Cells, but they'll still work! -#### Cannot prerender the query {queryName} as it requires auth. +#### Cannot prerender the query \{queryName\} as it requires auth. This error happens during builds when you have a Cell on a page you're prerendering that makes a query marked with `@requireAuth` in your SDL. During prerender you are not logged in ([see point 1](#1-prerendering-always-happens-as-an-unauthenticated-user)), so you'll have to conditionally render the Cell - for example: @@ -342,8 +342,7 @@ Depending on what pages you're prerendering, you may want to change your redirec Using Netlify as an example:
-If you prerender your `notFoundPage`, and all your other routes - +If you prerender your `notFoundPage`, and all your other routes You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -360,6 +359,7 @@ This makes your app behave much more like a traditional website, where all the p
If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/versioned_docs/version-5.x/redwoodrecord.md b/docs/versioned_docs/version-5.x/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/versioned_docs/version-5.x/redwoodrecord.md +++ b/docs/versioned_docs/version-5.x/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/versioned_docs/version-5.x/seo-head.md b/docs/versioned_docs/version-5.x/seo-head.md index 3c9756f35f6d..4b50350c6cdd 100644 --- a/docs/versioned_docs/version-5.x/seo-head.md +++ b/docs/versioned_docs/version-5.x/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' diff --git a/docs/versioned_docs/version-5.x/services.md b/docs/versioned_docs/version-5.x/services.md index 74e72ac2d140..26915ed7aa3f 100644 --- a/docs/versioned_docs/version-5.x/services.md +++ b/docs/versioned_docs/version-5.x/services.md @@ -900,7 +900,7 @@ This leads to your product cache being rebuilt every hour, even though you haven Just like the `v1` we added to the `product` cache key above, you can globally prefix a string to *all* of your cache keys: -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" export const { cache, cacheFindMany } = createCache(client, { logger, timeout: 500, @@ -938,7 +938,7 @@ yarn rw setup cache redis This generates the following (memcached example shown): -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" import { createCache, MemcachedClient } from '@redwoodjs/api/cache' import { logger } from './logger' diff --git a/docs/versioned_docs/version-5.x/testing.md b/docs/versioned_docs/version-5.x/testing.md index 4ef02ebe3c82..426038a6b85a 100644 --- a/docs/versioned_docs/version-5.x/testing.md +++ b/docs/versioned_docs/version-5.x/testing.md @@ -1267,7 +1267,7 @@ The `prisma db push` command only restores a snapshot of the current database sc In order to preserve those statements in your test database, you can set an additional ENV var which will use the command `yarn rw prisma migrate reset` instead. This will run each migration in sequence against your test database. The tradeoff is that starting your test suite will take a little longer depending on how many migrations you have: -```.env title=/.env +```.env title="/.env" TEST_DATABASE_STRATEGY=reset ``` diff --git a/docs/versioned_docs/version-5.x/tutorial/chapter5/first-test.md b/docs/versioned_docs/version-5.x/tutorial/chapter5/first-test.md index 82dec7e49722..2b9a019aad45 100644 --- a/docs/versioned_docs/version-5.x/tutorial/chapter5/first-test.md +++ b/docs/versioned_docs/version-5.x/tutorial/chapter5/first-test.md @@ -320,7 +320,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -335,7 +335,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -355,7 +355,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.js" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -370,7 +370,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/versioned_docs/version-5.x/tutorial/chapter7/api-side-currentuser.md b/docs/versioned_docs/version-5.x/tutorial/chapter7/api-side-currentuser.md index 6c1432052689..f245813233ac 100644 --- a/docs/versioned_docs/version-5.x/tutorial/chapter7/api-side-currentuser.md +++ b/docs/versioned_docs/version-5.x/tutorial/chapter7/api-side-currentuser.md @@ -30,7 +30,7 @@ Making data changes like this will start becoming second nature soon: First we'll add the new `userId` field to `Post` and the relation to `User`: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" model Post { id Int @id @default(autoincrement()) title String @@ -128,7 +128,7 @@ yarn rw prisma migrate reset If you started the second half the tutorial from the [Redwood Tutorial repo](https://github.com/redwoodjs/redwood-tutorial) you'll get an error after resetting the databaseβ€”Prisma attempts to seed the database with a user and some posts to get you started, but the posts in that seed do not have the new required `userId` field! Open up `scripts/seed.js` and edit each post to add `userId: 1` to each: -```javascript title=scripts/seed.js +```javascript title="scripts/seed.js" { id: 1, name: 'John Doe', @@ -187,7 +187,7 @@ To enable this we'll need to make two modifications on the api side: #### Add User to Posts SDL -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" type Post { id: Int! title: String! @@ -210,7 +210,7 @@ Here we're using `User!` with an exclamation point because we know that every `P This one is a little tricker: we need to add a "lookup" in the `posts` service, so that it knows how to get the associated user. When we generated the `comments` SDL and service we got this **relation resolver** created for us. We could re-run the service generator for `Post` but that could blow away changes we made to this file. Our only option would be to include the `--force` flag since the file already exists, which will write over everything. In this case we'll just add the resolver manually: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -328,7 +328,7 @@ There are two places where we publicly present a post: Let's update their respective Cells to include the name of the user that created the post: -```jsx title=web/src/components/ArticlesCell/ArticlesCell.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.js" export const QUERY = gql` query ArticlesQuery { articles: posts { @@ -346,7 +346,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/ArticleCell/ArticleCell.js +```jsx title="web/src/components/ArticleCell/ArticleCell.js" export const QUERY = gql` query ArticleQuery($id: Int!) { article: post(id: $id) { @@ -366,7 +366,7 @@ export const QUERY = gql` And then update the display component that shows an Article: -```jsx title=web/src/components/Article/Article.js +```jsx title="web/src/components/Article/Article.js" import { Link, routes } from '@redwoodjs/router' const Article = ({ article }) => { @@ -397,7 +397,7 @@ Depending on whether you started from the Redwood Tutorial repo or not, you may There's a magical variable named `context` that's available within any of your service functions. It contains the context in which the service function is being called. One property available on this context is the user that's logged in (*if* someone is logged in). It's the same `currentUser` that is available on the web side: -```javascript title=api/src/service/posts/posts.js +```javascript title="api/src/service/posts/posts.js" export const createPost = ({ input }) => { return db.post.create({ // highlight-next-line @@ -422,7 +422,7 @@ Right now any admin that visits `/admin/posts` can still see all posts, not only Since we know we have access to `context.currentUser` we can sprinkle it throughout our posts service to limit what's returned to only those posts that the currently logged in user owns: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -493,7 +493,7 @@ There are several steps we'll need to complete: Let's keep the existing `posts.sdl.js` and make that the "public" interface. Duplicate that SDL, naming it `adminPosts.sdl.js`, and modify it like so: -```javascript title=api/src/graphql/adminPosts.sdl.js +```javascript title="api/src/graphql/adminPosts.sdl.js" export const schema = gql` type Query { adminPosts: [Post!]! @requireAuth(roles: ["admin"]) @@ -518,7 +518,7 @@ export const schema = gql` ` ``` -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" export const schema = gql` type Post { id: Int! @@ -543,7 +543,7 @@ In `adminPosts` we've updated the queries to use `@requireAuth` instead of `@ski Next let's create an `adminPosts` service. We'll need to move our create/update/delete mutations to it, as the name of the SDL needs to match the name of the service: -```javascript title=api/src/services/adminPosts/adminPosts.js +```javascript title="api/src/services/adminPosts/adminPosts.js" import { db } from 'src/lib/db' export const adminPosts = () => { @@ -578,7 +578,7 @@ export const deletePost = ({ id }) => { (Again, don't forget the change from `findUnique()` to `findFirst()`.) And update `posts` to remove some of the functions that live in `adminPosts` now: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -603,7 +603,7 @@ Note that we kept the relation resolver here `Post.user`, and there's none in `a Finally, we'll need to update several of the scaffold components to use the new `adminPosts` and `adminPost` queries (we'll limit the code snippets below to just the changes to save some room, this page is getting long enough!): -```javascript title=web/src/components/Post/EditPostCell/EditPostCell.js +```javascript title="web/src/components/Post/EditPostCell/EditPostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -617,7 +617,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostCell/PostCell.js +```jsx title="web/src/components/Post/PostCell/PostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -631,7 +631,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostsCell/PostsCell.js +```jsx title="web/src/components/Post/PostsCell/PostsCell.js" export const QUERY = gql` query POSTS { // highlight-next-line diff --git a/docs/versioned_docs/version-5.x/typescript/strict-mode.md b/docs/versioned_docs/version-5.x/typescript/strict-mode.md index 43a01d8839fd..221d7e6fe98b 100644 --- a/docs/versioned_docs/version-5.x/typescript/strict-mode.md +++ b/docs/versioned_docs/version-5.x/typescript/strict-mode.md @@ -47,7 +47,7 @@ But the gist of it is that, for Prisma's create and update operations, you may h For most cases however, you probably want to convert nulls to undefined - one way to do this is to use the `removeNulls` utility function from `@redwoodjs/api`: -```ts title=api/src/services/users.ts +```ts title="api/src/services/users.ts" // highlight-next-line import { removeNulls } from "@redwoodjs/api" diff --git a/docs/versioned_docs/version-5.x/typescript/utility-types.md b/docs/versioned_docs/version-5.x/typescript/utility-types.md index d4fe3a5dba82..a01895f1adfd 100644 --- a/docs/versioned_docs/version-5.x/typescript/utility-types.md +++ b/docs/versioned_docs/version-5.x/typescript/utility-types.md @@ -48,7 +48,7 @@ export const Success = ({ This gives you the types of the props in your Cell's `Failure` component. It takes `TVariables` as an optional generic parameter, which is useful if you want to print error messages like `"Couldn't load data for ${variables.searchTerm}"`: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -69,7 +69,7 @@ export const Failure = ({ Similar to `CellFailureProps`, but for the props of your Cell's `Loading` component: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -103,7 +103,7 @@ defineScenario An example: -```ts title=posts.scenarios.ts +```ts title="posts.scenarios.ts" import type { Prisma, Post } from '@prisma/client' export const standard = defineScenario({ @@ -137,7 +137,7 @@ It takes three generic parameters: We know this is a lot of generics, but that's so you get to choose how specific you want to be with the types! -```ts title=api/src/services/posts/posts.scenario.ts +```ts title="api/src/services/posts/posts.scenario.ts" import type { Post } from '@prisma/client' //... @@ -145,7 +145,7 @@ import type { Post } from '@prisma/client' export type StandardScenario = ScenarioData ``` -```ts title=api/src/services/posts/posts.test.ts +```ts title="api/src/services/posts/posts.test.ts" import type { StandardScenario } from './posts.scenarios' scenario('returns a single post', async (scenario: StandardScenario) => { diff --git a/docs/versioned_docs/version-6.0/auth/dbauth.md b/docs/versioned_docs/version-6.0/auth/dbauth.md index 29836984cc3e..0ce10d4da357 100644 --- a/docs/versioned_docs/version-6.0/auth/dbauth.md +++ b/docs/versioned_docs/version-6.0/auth/dbauth.md @@ -52,41 +52,42 @@ You can also add WebAuthn to an existing dbAuth install. [Read more about WebAut Read the post-install instructions carefully as they contain instructions for adding database fields for the hashed password and salt, as well as how to configure the auth serverless function based on the name of the table that stores your user data. Here they are, but could change in future releases (these do not include the additional WebAuthn required options, make sure you get those from the output of the `setup` command): > You will need to add a couple of fields to your User table in order to store a hashed password and salt: -> -> model User { -> id Int @id @default(autoincrement()) -> email String @unique -> hashedPassword String // <─┐ -> salt String // <─┼─ add these lines -> resetToken String? // <── -> resetTokenExpiresAt DateTime? // <β”€β”˜ -> } -> +> ``` +> model User { +> id Int @id @default(autoincrement()) +> email String @unique +> hashedPassword String // <─┐ +> salt String // <─┼─ add these lines +> resetToken String? // <── +> resetTokenExpiresAt DateTime? // <β”€β”˜ +> } +> ``` > If you already have existing user records you will need to provide a default value or Prisma complains, so change those to: -> -> hashedPassword String @default("") -> salt String @default("") -> +> ``` +> hashedPassword String @default("") +> salt String @default("") +> ``` > You'll need to let Redwood know what field you're using for your users' `id` and `username` fields In this case we're using `id` and `email`, so update those in the `authFields` config in `/api/src/functions/auth.js` (this is also the place to tell Redwood if you used a different name for the `hashedPassword` or `salt` fields): -> -> authFields: { -> id: 'id', -> username: 'email', -> hashedPassword: 'hashedPassword', -> salt: 'salt', -> resetToken: 'resetToken', -> resetTokenExpiresAt: 'resetTokenExpiresAt', -> }, -> +> ``` +> authFields: { +> id: 'id', +> username: 'email', +> hashedPassword: 'hashedPassword', +> salt: 'salt', +> resetToken: 'resetToken', +> resetTokenExpiresAt: 'resetTokenExpiresAt', +> }, +> ``` > To get the actual user that's logged in, take a look at `getCurrentUser()` in `/api/src/lib/auth.js`. We default it to something simple, but you may use different names for your model or unique ID fields, in which case you need to update those calls (instructions are in the comment above the code). > > Finally, we created a `SESSION_SECRET` environment variable for you in `.env`. This value should NOT be checked into version control and should be unique for each environment you deploy to. If you ever need to log everyone out of your app at once change this secret to a new value. To create a new secret, run: -> -> yarn rw g secret -> +> ``` +> yarn rw g secret +> ``` > Need simple Login, Signup and Forgot Password pages? Of course we have a generator for those: -> -> yarn rw generate dbAuth +> ``` +> yarn rw generate dbAuth +> ``` Note that if you change the fields named `hashedPassword` and `salt`, and you have some verbose logging in your app, you'll want to scrub those fields from appearing in your logs. See the [Redaction](logger.md#redaction) docs for info. @@ -227,13 +228,13 @@ forgotPassword: { ### forgotPassword.handler() This handler is invoked if a user is found with the username/email that they submitted on the Forgot Password page, and that user will be passed as an argument. Inside this function is where you'll send the user a link to reset their passwordβ€”via an email is most common. The link will, by default, look like: - - https://example.com/reset-password?resetToken=${user.resetToken} - +``` +https://example.com/reset-password?resetToken=${user.resetToken} +``` If you changed the path to the Reset Password page in your routes you'll need to change it here. If you used another name for the `resetToken` database field, you'll need to change that here as well: - - https://example.com/reset-password?resetKey=${user.resetKey} - +``` +https://example.com/reset-password?resetKey=${user.resetKey} +``` > Note that although the user table contains a hash of `resetToken`, only for the handler, `user.resetToken` will contain the raw `resetToken` to use for generating a password reset link. ### resetPassword.enabled @@ -318,7 +319,7 @@ By default, the session cookie will not have the `Domain` property set, which a To do this, set the `cookie.Domain` property in your `api/src/functions/auth.js` configuration, set to the root domain of your site, which will allow it to be read by all subdomains as well. For example: -```json title=api/src/functions/auth.js +```json title="api/src/functions/auth.js" cookie: { HttpOnly: true, Path: '/', @@ -331,9 +332,9 @@ cookie: { ### Session Secret Key If you need to change the secret key that's used to encrypt the session cookie, or deploy to a new target (each deploy environment should have its own unique secret key) we've got a CLI tool for creating a new one: - - yarn rw g secret - +``` +yarn rw g secret +``` Note that the secret that's output is _not_ appended to your `.env` file or anything else, it's merely output to the screen. You'll need to put it in the right place after that. :::caution .env and Version Control @@ -436,7 +437,7 @@ If you didn't setup WebAuthn at first, but decided you now want WebAuthn, you co You'll need to add two fields to your `User` model, and a new `UserCredential` model to store the devices that are used and associate them with a user: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" datasource db { provider = "sqlite" url = env("DATABASE_URL") @@ -492,7 +493,7 @@ credentials: [UserCredential]! Next we need to let dbAuth know about the new field and model names, as well as how you want WebAuthn to behave (see the highlighted section) -```javascript title=api/src/functions/auth.js +```javascript title="api/src/functions/auth.js" import { db } from 'src/lib/db' import { DbAuthHandler } from '@redwoodjs/api' diff --git a/docs/versioned_docs/version-6.0/data-migrations.md b/docs/versioned_docs/version-6.0/data-migrations.md index c120629eb95c..3f7d32d389fd 100644 --- a/docs/versioned_docs/version-6.0/data-migrations.md +++ b/docs/versioned_docs/version-6.0/data-migrations.md @@ -22,9 +22,9 @@ Imagine a `User` model that contains several columns for user preferences. Over Just like Prisma, we will store which data migrations have run in the database itself. We'll create a new database table `DataMigration` to keep track of which ones have run already. Rather than create this model by hand, Redwood includes a CLI tool to add the model to `schema.prisma` and create the DB migration that adds the table to the database: - - yarn rw data-migrate install - +``` +yarn rw data-migrate install +``` You'll see a new directory created at `api/db/dataMigrations` which will store our individual migration tasks. Take a look at `schema.prisma` to see the new model definition: @@ -39,21 +39,21 @@ model RW_DataMigration { ``` The install script also ran `yarn rw prisma migrate dev --create-only` automatically so you have a DB migration ready to go. You just need to run the `prisma migrate dev` command to apply it: - - yarn rw prisma migrate dev - +``` +yarn rw prisma migrate dev +``` ## Creating a New Data Migration Data migrations are just plain Typescript or Javascript files which export a single anonymous function that is given a single argumentβ€”an instance of `PrismaClient` called `db` that you can use to access your database. The files have a simple naming convention: - - {version}-{name}.js - +``` +{version}-{name}.js +``` Where `version` is a timestamp, like `20200721123456` (an ISO8601 datetime without any special characters or zone identifier), and `name` is a param-case human readable name for the migration, like `copy-preferences`. To create a data migration we have a generator: - - yarn rw generate dataMigration copyPreferences - +``` +yarn rw generate dataMigration copyPreferences +``` This will create `api/db/dataMigrations/20200721123456-copy-preferences.js`: ```jsx title="api/db/dataMigrations/20200721123456-copy-preferences.js" @@ -107,9 +107,9 @@ This loops through each existing `User` and creates a new `Preference` record co ## Running a Data Migration When you're ready, you can execute your data migration with `data-migrate`'s `up` command: - - yarn rw data-migrate up - +``` +yarn rw data-migrate up +``` This goes through each file in `api/db/dataMigrations`, compares it against the list of migrations that have already run according to the `DataMigration` table in the database, and executes any that aren't present in that table, sorted oldest to newest based on the timestamp in the filename. Any logging statements (like `console.info()`) you include in your data migration script will be output to the console as the script is running. @@ -148,11 +148,12 @@ export default async ({ db }) => { ## Lifecycle Summary Run once: - - yarn rw data-migrate install - yarn rw prisma migrate dev - +``` +yarn rw data-migrate install +yarn rw prisma migrate dev +``` Run every time you need a new data migration: - - yarn rw generate dataMigration migrationName - yarn rw data-migrate up +``` +yarn rw generate dataMigration migrationName +yarn rw data-migrate up +``` diff --git a/docs/versioned_docs/version-6.0/deploy/baremetal.md b/docs/versioned_docs/version-6.0/deploy/baremetal.md index 8a44a44f5ab5..4703a7910a37 100644 --- a/docs/versioned_docs/version-6.0/deploy/baremetal.md +++ b/docs/versioned_docs/version-6.0/deploy/baremetal.md @@ -654,7 +654,7 @@ If nginx will be serving our web side, what about api-side? Redwood's internal A This doc isn't going to go through installing and getting nginx running, there are plenty of resources for that available. What we will show is a successful nginx configuration file used by several Redwood apps currently in production. -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } @@ -701,7 +701,7 @@ yarn rw serve api When using `pm2` to start/monitor your processes, you can simplify your `deploy.toml` and `ecosystem.config.js` files to only worry about the api side: -```toml title=deploy.toml +```toml title="deploy.toml" [[production.servers]] host = "myserver.com" username = "ubuntu" @@ -717,7 +717,7 @@ packageManagerCommand = "yarn" monitorCommand = "pm2" ``` -```js title=ecosystem.config.js +```js title="ecosystem.config.js" module.exports = { apps: [ { @@ -742,7 +742,7 @@ If you don't love the path of `/.redwood/functions` for your API calls, this is For example, to simplify the path to just `/api` you'll need to make a change to `redwood.toml` and your new nginx config file: -```toml title=redwood.toml +```toml title="redwood.toml" [web] title = "My App" port = 8910 @@ -755,7 +755,7 @@ For example, to simplify the path to just `/api` you'll need to make a change to open = true ``` -```text title=nginx.conf +```text title="nginx.conf" upstream redwood_server { server 127.0.0.1:8911 fail_timeout=0; } diff --git a/docs/versioned_docs/version-6.0/graphql.md b/docs/versioned_docs/version-6.0/graphql.md index 7d1b0629d742..ff6e55044f86 100644 --- a/docs/versioned_docs/version-6.0/graphql.md +++ b/docs/versioned_docs/version-6.0/graphql.md @@ -1448,7 +1448,7 @@ type Query { Because it is often useful to ask a GraphQL schema for information about what queries it supports, GraphQL allows us to do so using the [introspection](https://graphql.org/learn/introspection/) system. -The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at http://localhost:8911/graphql when your dev server is running. +The [GraphQL Playground](https://www.graphql-yoga.com/docs/features/graphiql) is a way for you to interact with your schema and try out queries and mutations. It can show you the schema by inspecting it. You can find the GraphQL Playground at [http://localhost:8911/graphql](http://localhost:8911/graphql) when your dev server is running. > Because both introspection and the playground share possibly sensitive information about your data model, your data, your queries and mutations, best practices for deploying a GraphQL Server call to disable these in production, RedwoodJS **, by default, only enables introspection and the playground when running in development**. That is when `process.env.NODE_ENV === 'development'`. diff --git a/docs/versioned_docs/version-6.0/how-to/oauth.md b/docs/versioned_docs/version-6.0/how-to/oauth.md index b3f00cc39e04..fe80d8f5cbf5 100644 --- a/docs/versioned_docs/version-6.0/how-to/oauth.md +++ b/docs/versioned_docs/version-6.0/how-to/oauth.md @@ -61,14 +61,14 @@ You may be asked to use your 2FA code to verify that you're who you say you are, Add those to your app's `.env` file (or wherever you're managing your secrets). Note that it's best to have a different OAuth app on GitHub for each environment you deploy to. Consider this one the **dev** app, and you'll create a separate one with a different client ID and secret when you're ready to deploy to production: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 ``` We also need to denote what data we want permission to read from GitHub once someone authorizes our app. We'll want the user's public info, and probably their email address. That's only two scopes, and we can add those as another ENV var: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 # highlight-next-line @@ -79,7 +79,7 @@ If you wanted access to more GitHub data, you can specify [additional scopes](ht One more ENV var, this is the same callback URL we told GitHub about. This is used in the link in the **Login with GitHub** button and gives GitHub another chance to verify that you're who you say you are: you're proving that you know where you're supposed to redirect back to: -```bash title=/.env +```bash title="/.env" GITHUB_OAUTH_CLIENT_ID=41a08ae238b5aee4121d GITHUB_OAUTH_CLIENT_SECRET=92e8662e9c562aca8356d45562911542d89450e1 GITHUB_OAUTH_SCOPES="read:user user:email" @@ -91,7 +91,7 @@ GITHUB_OAUTH_REDIRECT_URI="http://localhost:8910/.redwood/functions/oauth/callba This part is pretty easy, we're just going to add a link/button to go directly to GitHub to begin the OAuth process: -```jsx title=/web/src/pages/LoginPage/LoginPage.jsx +```jsx title="/web/src/pages/LoginPage/LoginPage.jsx" { switch (event.path) { case '/oauth/callback': @@ -189,7 +189,7 @@ The `callback()` function is where we'll actually define the rest of our flow. W Now we need to make a request to GitHub to trade the `code` for an `access_token`. This is handled by a `fetch`: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { // highlight-start const { code } = event.queryStringParameters @@ -241,7 +241,7 @@ To keep things straight in our heads, let's call our local user `user` and the G Let's make the API call to GitHub's user info endpoint and dump the result to the browser: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" const callback = async (event) => { const { code } = event.queryStringParameters @@ -330,7 +330,7 @@ For now `provider` will always be `github` and the `uid` will be the GitHub's un Here's the `Identity` model definition: -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model Identity { id Int @id @default(autoincrement()) provider String @@ -358,7 +358,7 @@ There's no GraphQL SDL tied to the Identity table, so it is not accessible via o We'll need to add an `identities` relation to the `User` model, and make the previously required `hashedPassword` and `salt` fields optional (since users may want to *only* authenticate via GitHub, they'll never get to enter a password): -```prisma title=/api/db/schema.prisma +```prisma title="/api/db/schema.prisma" model User { id Int @id @default(autoincrement()) email String @unique @@ -389,7 +389,7 @@ Let's add some code that returns the user if found, otherwise it creates the use Be sure to import `db` at the top of the file if you haven't already! ::: -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import { db } from 'src/lib/db' @@ -575,7 +575,7 @@ Setting a cookie in the browser is a matter of returning a `Set-Cookie` header i Don't forget the new `CryptoJS` import at the top! -```js title=/api/src/functions/oauth/oauth.js +```js title="/api/src/functions/oauth/oauth.js" // highlight-next-line import CryptoJS from 'crypto-js' @@ -659,7 +659,7 @@ Try it out, and as long as you have an indication on your site that a user is lo Here's the `oauth` function in its entirety: -```jsx title=/api/src/functions/oauth/oauth.js +```jsx title="/api/src/functions/oauth/oauth.js" import CryptoJS from 'crypto-js' import { db } from 'src/lib/db' diff --git a/docs/versioned_docs/version-6.0/prerender.md b/docs/versioned_docs/version-6.0/prerender.md index 71852091a6b5..210e01358341 100644 --- a/docs/versioned_docs/version-6.0/prerender.md +++ b/docs/versioned_docs/version-6.0/prerender.md @@ -291,7 +291,7 @@ b) There was an error when trying to import your GraphQL handler - maybe due to If you've moved this GraphQL function, or we encounter an error executing it, it won't break your builds. All your Cells will be prerendered in their `Loading` state, and will update once the JavaScript loads on the browser. This is effectively skipping prerendering your Cells, but they'll still work! -#### Cannot prerender the query {queryName} as it requires auth. +#### Cannot prerender the query \{queryName\} as it requires auth. This error happens during builds when you have a Cell on a page you're prerendering that makes a query marked with `@requireAuth` in your SDL. During prerender you are not logged in ([see point 1](#1-prerendering-always-happens-as-an-unauthenticated-user)), so you'll have to conditionally render the Cell - for example: @@ -342,8 +342,7 @@ Depending on what pages you're prerendering, you may want to change your redirec Using Netlify as an example:
-If you prerender your `notFoundPage`, and all your other routes - +If you prerender your `notFoundPage`, and all your other routes You can remove the default redirect to index in your `netlify.toml`. This means the browser will accurately receive 404 statuses when navigating to a route that doesn't exist: @@ -360,6 +359,7 @@ This makes your app behave much more like a traditional website, where all the p
If you don't prerender your 404s, but prerender all your other pages + You can add a 404 redirect if you want: ```diff diff --git a/docs/versioned_docs/version-6.0/redwoodrecord.md b/docs/versioned_docs/version-6.0/redwoodrecord.md index d9474235ac77..827428f47767 100644 --- a/docs/versioned_docs/version-6.0/redwoodrecord.md +++ b/docs/versioned_docs/version-6.0/redwoodrecord.md @@ -58,15 +58,16 @@ Now we're back to one-to-many relationships. In Prisma this join table is create If you want to create the join table yourself and potentially store additional data there (like a timestamp of when the product was categorized) then this is simply a one-to-many relationship on both sides: a Product has many ProductCategories and a Category has many ProductCategories. Prisma refers to this as an [explicitly many-to-many](https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations) relationship. > TODO: We'll be adding logic soon that will let you get to the categories from a product record (and vice versa) in explicit many-to-manys without having to manually go through ProductCategory. From this: -> -> const product = await Product.find(1) -> const productCategories = await product.productCategories.all() -> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() -> +> ``` +> const product = await Product.find(1) +> const productCategories = await product.productCategories.all() +> const categories = productCategories.map(async (pc) => await pc.categories.all()).flat() +> ``` > To this: -> -> const product = await Product.find(1) -> const categories = await product.categories.all() +> ``` +> const product = await Product.find(1) +> const categories = await product.categories.all() +> ``` The only other terminology to keep in mind are the terms *model* and *record*. A *model* is the name for the class that represents one database table. The example above has three models: User, Post and Comment. Prisma also calls each database-table declaration in their `schema.prisma` declaration file a "model", but when we refer to a "model" in this doc it will mean the class that extends `RedwoodRecord`. A *record* is a single instance of our model that now represents a single row of data in the database. diff --git a/docs/versioned_docs/version-6.0/seo-head.md b/docs/versioned_docs/version-6.0/seo-head.md index 3c9756f35f6d..4b50350c6cdd 100644 --- a/docs/versioned_docs/version-6.0/seo-head.md +++ b/docs/versioned_docs/version-6.0/seo-head.md @@ -22,7 +22,7 @@ Now that you have the app title set, you probably want some consistence with the Add `titleTemplate` as a prop for `RedwoodProvider` to have a title template for every pages -In _web/src/App.{tsx,js}_ +In _web/src/App.\{tsx,js\}_ ```diff - + @@ -51,7 +51,7 @@ Let's say you want to change the title of your About page, Redwood provides a built in `` component, which you can use like this -In _AboutPage/AboutPage.{tsx,js}_ +In _AboutPage/AboutPage.\{tsx,js\}_ ```diff +import { Head } from '@redwoodjs/web' diff --git a/docs/versioned_docs/version-6.0/services.md b/docs/versioned_docs/version-6.0/services.md index e94170a73751..eecf04215ded 100644 --- a/docs/versioned_docs/version-6.0/services.md +++ b/docs/versioned_docs/version-6.0/services.md @@ -900,7 +900,7 @@ This leads to your product cache being rebuilt every hour, even though you haven Just like the `v1` we added to the `product` cache key above, you can globally prefix a string to *all* of your cache keys: -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" export const { cache, cacheFindMany } = createCache(client, { logger, timeout: 500, @@ -938,7 +938,7 @@ yarn rw setup cache redis This generates the following (memcached example shown): -```js title=api/src/lib/cache.js +```js title="api/src/lib/cache.js" import { createCache, MemcachedClient } from '@redwoodjs/api/cache' import { logger } from './logger' diff --git a/docs/versioned_docs/version-6.0/testing.md b/docs/versioned_docs/version-6.0/testing.md index 4ef02ebe3c82..426038a6b85a 100644 --- a/docs/versioned_docs/version-6.0/testing.md +++ b/docs/versioned_docs/version-6.0/testing.md @@ -1267,7 +1267,7 @@ The `prisma db push` command only restores a snapshot of the current database sc In order to preserve those statements in your test database, you can set an additional ENV var which will use the command `yarn rw prisma migrate reset` instead. This will run each migration in sequence against your test database. The tradeoff is that starting your test suite will take a little longer depending on how many migrations you have: -```.env title=/.env +```.env title="/.env" TEST_DATABASE_STRATEGY=reset ``` diff --git a/docs/versioned_docs/version-6.0/tutorial/chapter5/first-test.md b/docs/versioned_docs/version-6.0/tutorial/chapter5/first-test.md index d7c4707956a1..f5d13ed06fe4 100644 --- a/docs/versioned_docs/version-6.0/tutorial/chapter5/first-test.md +++ b/docs/versioned_docs/version-6.0/tutorial/chapter5/first-test.md @@ -320,7 +320,7 @@ So we can just spread the result of `standard()` in a story or test when using t -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.jsx +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.jsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -335,7 +335,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -355,7 +355,7 @@ Some folks find this syntax a little *too* succinct and would rather see the ` -```jsx title=web/src/components/ArticlesCell/ArticlesCell.stories.jsx +```jsx title="web/src/components/ArticlesCell/ArticlesCell.stories.jsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' @@ -370,7 +370,7 @@ export default { title: 'Cells/ArticlesCell' } -```tsx title=web/src/components/ArticlesCell/ArticlesCell.stories.tsx +```tsx title="web/src/components/ArticlesCell/ArticlesCell.stories.tsx" import { Success } from './ArticlesCell' import { standard } from './ArticlesCell.mock' diff --git a/docs/versioned_docs/version-6.0/tutorial/chapter7/api-side-currentuser.md b/docs/versioned_docs/version-6.0/tutorial/chapter7/api-side-currentuser.md index 142f997c2df8..105cc05349ce 100644 --- a/docs/versioned_docs/version-6.0/tutorial/chapter7/api-side-currentuser.md +++ b/docs/versioned_docs/version-6.0/tutorial/chapter7/api-side-currentuser.md @@ -30,7 +30,7 @@ Making data changes like this will start becoming second nature soon: First we'll add the new `userId` field to `Post` and the relation to `User`: -```javascript title=api/db/schema.prisma +```javascript title="api/db/schema.prisma" model Post { id Int @id @default(autoincrement()) title String @@ -128,7 +128,7 @@ yarn rw prisma migrate reset If you started the second half the tutorial from the [Redwood Tutorial repo](https://github.com/redwoodjs/redwood-tutorial) you'll get an error after resetting the databaseβ€”Prisma attempts to seed the database with a user and some posts to get you started, but the posts in that seed do not have the new required `userId` field! Open up `scripts/seed.js` and edit each post to add `userId: 1` to each: -```javascript title=scripts/seed.js +```javascript title="scripts/seed.js" { id: 1, name: 'John Doe', @@ -187,7 +187,7 @@ To enable this we'll need to make two modifications on the api side: #### Add User to Posts SDL -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" type Post { id: Int! title: String! @@ -210,7 +210,7 @@ Here we're using `User!` with an exclamation point because we know that every `P This one is a little tricker: we need to add a "lookup" in the `posts` service, so that it knows how to get the associated user. When we generated the `comments` SDL and service we got this **relation resolver** created for us. We could re-run the service generator for `Post` but that could blow away changes we made to this file. Our only option would be to include the `--force` flag since the file already exists, which will write over everything. In this case we'll just add the resolver manually: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -328,7 +328,7 @@ There are two places where we publicly present a post: Let's update their respective Cells to include the name of the user that created the post: -```jsx title=web/src/components/ArticlesCell/ArticlesCell.js +```jsx title="web/src/components/ArticlesCell/ArticlesCell.js" export const QUERY = gql` query ArticlesQuery { articles: posts { @@ -346,7 +346,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/ArticleCell/ArticleCell.js +```jsx title="web/src/components/ArticleCell/ArticleCell.js" export const QUERY = gql` query ArticleQuery($id: Int!) { article: post(id: $id) { @@ -366,7 +366,7 @@ export const QUERY = gql` And then update the display component that shows an Article: -```jsx title=web/src/components/Article/Article.js +```jsx title="web/src/components/Article/Article.js" import { Link, routes } from '@redwoodjs/router' const Article = ({ article }) => { @@ -397,7 +397,7 @@ Depending on whether you started from the Redwood Tutorial repo or not, you may There's a magical variable named `context` that's available within any of your service functions. It contains the context in which the service function is being called. One property available on this context is the user that's logged in (*if* someone is logged in). It's the same `currentUser` that is available on the web side: -```javascript title=api/src/service/posts/posts.js +```javascript title="api/src/service/posts/posts.js" export const createPost = ({ input }) => { return db.post.create({ // highlight-next-line @@ -422,7 +422,7 @@ Right now any admin that visits `/admin/posts` can still see all posts, not only Since we know we have access to `context.currentUser` we can sprinkle it throughout our posts service to limit what's returned to only those posts that the currently logged in user owns: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -493,7 +493,7 @@ There are several steps we'll need to complete: Let's keep the existing `posts.sdl.js` and make that the "public" interface. Duplicate that SDL, naming it `adminPosts.sdl.js`, and modify it like so: -```javascript title=api/src/graphql/adminPosts.sdl.js +```javascript title="api/src/graphql/adminPosts.sdl.js" export const schema = gql` type Query { adminPosts: [Post!]! @requireAuth(roles: ["admin"]) @@ -518,7 +518,7 @@ export const schema = gql` ` ``` -```javascript title=api/src/graphql/posts.sdl.js +```javascript title="api/src/graphql/posts.sdl.js" export const schema = gql` type Post { id: Int! @@ -543,7 +543,7 @@ In `adminPosts` we've updated the queries to use `@requireAuth` instead of `@ski Next let's create an `adminPosts` service. We'll need to move our create/update/delete mutations to it, as the name of the SDL needs to match the name of the service: -```javascript title=api/src/services/adminPosts/adminPosts.js +```javascript title="api/src/services/adminPosts/adminPosts.js" import { db } from 'src/lib/db' export const adminPosts = () => { @@ -578,7 +578,7 @@ export const deletePost = ({ id }) => { (Again, don't forget the change from `findUnique()` to `findFirst()`.) And update `posts` to remove some of the functions that live in `adminPosts` now: -```javascript title=api/src/services/posts/posts.js +```javascript title="api/src/services/posts/posts.js" import { db } from 'src/lib/db' export const posts = () => { @@ -603,7 +603,7 @@ Note that we kept the relation resolver here `Post.user`, and there's none in `a Finally, we'll need to update several of the scaffold components to use the new `adminPosts` and `adminPost` queries (we'll limit the code snippets below to just the changes to save some room, this page is getting long enough!): -```javascript title=web/src/components/Post/EditPostCell/EditPostCell.js +```javascript title="web/src/components/Post/EditPostCell/EditPostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -617,7 +617,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostCell/PostCell.js +```jsx title="web/src/components/Post/PostCell/PostCell.js" export const QUERY = gql` query FindPostById($id: Int!) { // highlight-next-line @@ -631,7 +631,7 @@ export const QUERY = gql` ` ``` -```jsx title=web/src/components/Post/PostsCell/PostsCell.js +```jsx title="web/src/components/Post/PostsCell/PostsCell.js" export const QUERY = gql` query POSTS { // highlight-next-line diff --git a/docs/versioned_docs/version-6.0/typescript/strict-mode.md b/docs/versioned_docs/version-6.0/typescript/strict-mode.md index 43a01d8839fd..221d7e6fe98b 100644 --- a/docs/versioned_docs/version-6.0/typescript/strict-mode.md +++ b/docs/versioned_docs/version-6.0/typescript/strict-mode.md @@ -47,7 +47,7 @@ But the gist of it is that, for Prisma's create and update operations, you may h For most cases however, you probably want to convert nulls to undefined - one way to do this is to use the `removeNulls` utility function from `@redwoodjs/api`: -```ts title=api/src/services/users.ts +```ts title="api/src/services/users.ts" // highlight-next-line import { removeNulls } from "@redwoodjs/api" diff --git a/docs/versioned_docs/version-6.0/typescript/utility-types.md b/docs/versioned_docs/version-6.0/typescript/utility-types.md index d4fe3a5dba82..a01895f1adfd 100644 --- a/docs/versioned_docs/version-6.0/typescript/utility-types.md +++ b/docs/versioned_docs/version-6.0/typescript/utility-types.md @@ -48,7 +48,7 @@ export const Success = ({ This gives you the types of the props in your Cell's `Failure` component. It takes `TVariables` as an optional generic parameter, which is useful if you want to print error messages like `"Couldn't load data for ${variables.searchTerm}"`: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -69,7 +69,7 @@ export const Failure = ({ Similar to `CellFailureProps`, but for the props of your Cell's `Loading` component: -```ts title=web/src/components/BlogPostCell.tsx +```ts title="web/src/components/BlogPostCell.tsx" import type { FindBlogPostQuery, FindBlogPostQueryVariables } from 'types/graphql' // highlight-next-line @@ -103,7 +103,7 @@ defineScenario An example: -```ts title=posts.scenarios.ts +```ts title="posts.scenarios.ts" import type { Prisma, Post } from '@prisma/client' export const standard = defineScenario({ @@ -137,7 +137,7 @@ It takes three generic parameters: We know this is a lot of generics, but that's so you get to choose how specific you want to be with the types! -```ts title=api/src/services/posts/posts.scenario.ts +```ts title="api/src/services/posts/posts.scenario.ts" import type { Post } from '@prisma/client' //... @@ -145,7 +145,7 @@ import type { Post } from '@prisma/client' export type StandardScenario = ScenarioData ``` -```ts title=api/src/services/posts/posts.test.ts +```ts title="api/src/services/posts/posts.test.ts" import type { StandardScenario } from './posts.scenarios' scenario('returns a single post', async (scenario: StandardScenario) => { diff --git a/docs/yarn.lock b/docs/yarn.lock index c8fc820c8027..f5e4c89a5435 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -5,111 +5,126 @@ __metadata: version: 6 cacheKey: 8c0 -"@algolia/autocomplete-core@npm:1.7.1": - version: 1.7.1 - resolution: "@algolia/autocomplete-core@npm:1.7.1" +"@algolia/autocomplete-core@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-core@npm:1.9.3" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": 1.9.3 + "@algolia/autocomplete-shared": 1.9.3 + checksum: a751b20f15c9a30b8b2d5a4f1f62fb4dbd012fb7ffec1b12308d6e7388b5a4dc83af52176634f17facb57a7727204843c5aa2f6e80efafaaf244275f44af11d9 + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" dependencies: - "@algolia/autocomplete-shared": 1.7.1 - checksum: d94680f85436cd76734cdf29c74841c9f3af02479c0d5f1a5d172acaac146dbdd9bdb724968adda013018cf56b0b36dc5c1caef5ce3b4a73c36aab001a2cf074 + "@algolia/autocomplete-shared": 1.9.3 + peerDependencies: + search-insights: ">= 1 < 3" + checksum: 574196f66fe828be1029439032376685020524d6c729dea99caef336cc7be244d2539fa91b3fe80db80efe3420c2c05063cab3534514be6c637bf1914b17a6f6 languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.7.1": - version: 1.7.1 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.7.1" +"@algolia/autocomplete-preset-algolia@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" dependencies: - "@algolia/autocomplete-shared": 1.7.1 + "@algolia/autocomplete-shared": 1.9.3 peerDependencies: - "@algolia/client-search": ^4.9.1 - algoliasearch: ^4.9.1 - checksum: 7eb422bf8f8b0e7c796c922f463472de00dae37713702ff9ca163a395944450443b52536a5ba3b5f745c1d05f1f43e7eccc67a563c175c17d68579bc2667f2d7 + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 38c1872db4dae69b4eec622db940c7a992d8530e33fbac7df593473ef404312076d9933b4a7ea25c2d401ea5b62ebd64b56aa25b5cdd8e8ba3fd309a39d9d816 languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.7.1": - version: 1.7.1 - resolution: "@algolia/autocomplete-shared@npm:1.7.1" - checksum: 0dd6f362203df1475d56c4b2b16e50549aa2f6740d929be424b1446f8104513c2608e17c9473bf3e016fedba3726b06cd023b1758f07c54fc6bdeeaf5919b322 +"@algolia/autocomplete-shared@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-shared@npm:1.9.3" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 1aa926532c32be6bb5384c8c0ae51a312c9d79ed7486371218dfcb61c8ea1ed46171bdc9f9b596a266aece104a0ef76d6aac2f9a378a5a6eb4460e638d59f6ae languageName: node linkType: hard -"@algolia/cache-browser-local-storage@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/cache-browser-local-storage@npm:4.13.1" +"@algolia/cache-browser-local-storage@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/cache-browser-local-storage@npm:4.20.0" dependencies: - "@algolia/cache-common": 4.13.1 - checksum: 31455c519fbd2712be80caa657c389a617742f8f08d3809cf0e01063f27c2c2a81dc92c0fdd415b5efaae65fbf7c174e6b30877bb15bc13d1674fde80daa6743 + "@algolia/cache-common": 4.20.0 + checksum: efab9b8535d9cf2fc9d1e382541e87797946da0953dc02809aab181161b40ce419b4fa71bc35883e02eb34176185200e0ce1e887109a24233c0e9e6ef5f2a340 languageName: node linkType: hard -"@algolia/cache-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/cache-common@npm:4.13.1" - checksum: 842d21ebb21dfa96e59622a34dbc108e5430a918f061c1bd44c656c3adfde04e0ba23a1b7998639b045e2cc7d97683792effb0b49b8ba80cf4e34f3d554ec9e6 +"@algolia/cache-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/cache-common@npm:4.20.0" + checksum: e2e55945dc9d3cafaace828afe28cb944a14efa645d588968e8bf88360efd7dc35f95f2b2392fc84dc697d115ada2a253b34f384ec5d82a191df77eb2125e43e languageName: node linkType: hard -"@algolia/cache-in-memory@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/cache-in-memory@npm:4.13.1" +"@algolia/cache-in-memory@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/cache-in-memory@npm:4.20.0" dependencies: - "@algolia/cache-common": 4.13.1 - checksum: b06022981dd827fdc60e417a596f2d07310a391e2b3677741f1afa27b205e4818f954cde2232780331463b10926bf1fbfd705eee55632e8adc384316b742f2cc + "@algolia/cache-common": 4.20.0 + checksum: 9dd67c93fb97d0055ec6d487bae922a5ccbf2adcdf2692c737b85d50b5aa2b57f3fb21ead0202a570e7feb1096fb48ea56a2309259998c17d7c82bc8ae170818 languageName: node linkType: hard -"@algolia/client-account@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-account@npm:4.13.1" +"@algolia/client-account@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-account@npm:4.20.0" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/client-search": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 76ed49c094bf0911af3f80d1fff90e337214054d883f16136277ce3684ff7d09931557667f373320e0844c0634dceabc194bdacd3ad38bbca9faa41f06490411 + "@algolia/client-common": 4.20.0 + "@algolia/client-search": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 6ff0cd7834d48988ec748ed504a28e4de8842526881c7d0f875f9702e037f51c9ec70195489e5d189995d0901212f844b0555d6df0b423d0b846b300a321b6a2 languageName: node linkType: hard -"@algolia/client-analytics@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-analytics@npm:4.13.1" +"@algolia/client-analytics@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-analytics@npm:4.20.0" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/client-search": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: af45e1da8a16fbabbf1feee24290b047752fcf0d29359190dcddc56a21b0ad672ad50a1ff999ce9c538cfde41035fcbd6b6d8f77431cd555449807922ec558f6 + "@algolia/client-common": 4.20.0 + "@algolia/client-search": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: ebc20c90461a05c1bfbdf152953904afde749d70fe7008857c4f5a96510f0bb1895420a400decfcb3dce3137be880b4360e8ac09a8249b4fe8426dd0a3042a09 languageName: node linkType: hard -"@algolia/client-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-common@npm:4.13.1" +"@algolia/client-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-common@npm:4.20.0" dependencies: - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: a8048df2cbe5d9c0fdbc469eca213d1c04bfca912b1c13b652d4a6111f2ee3c770d101570c7a47ef8ac656d9f7c6bd8d4cac2a961d36bd5894d112ff71d80189 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: b0cf4d127dd5712867e3e7dbb10465d960d5ad2ca491321c0d1908c3b4d2f485bc54926c1b3de2b9d5b5f3438a1e91d50f02318fc164770d4e78bd7828a3e2f6 languageName: node linkType: hard -"@algolia/client-personalization@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-personalization@npm:4.13.1" +"@algolia/client-personalization@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-personalization@npm:4.20.0" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 5db1f33e60b54216294116f98c74daa57bf88c28434696c89a3a5ec73f1da9fc82f5f7effb1fe132f78c7b3d7cce7102c3a9a3b0d0d654961e339164da1f6fde + "@algolia/client-common": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: a4ffff168daee0495192c7aa1b155827d10ba408d352d01e112552e048a18244a2a446df47706639dc67a6b4061bdc084f35e47b5a75b0f1a722427abe131fe8 languageName: node linkType: hard -"@algolia/client-search@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-search@npm:4.13.1" +"@algolia/client-search@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-search@npm:4.20.0" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: c2693c69abf89cb7312d55501f143561c5110dd76f554e1d4dc928663312ad962438b4bb30bb7de4d00c6b8a2fc9e75bd7b877a48f1015aed64587a87260f8e9 + "@algolia/client-common": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 79b75fbfddf41bd65d1d028236b249e81672a5a5aea9e84fa5586ee5d1f0d78966dacdc464109e14a46f6c78c8d68d5a8a50ad7b571247ac64fc2d1399072332 languageName: node linkType: hard @@ -120,68 +135,69 @@ __metadata: languageName: node linkType: hard -"@algolia/logger-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/logger-common@npm:4.13.1" - checksum: 3d51fa2dc7679e1b1f1595f50933a20c85e24db05131e9fc5c08317064e80a368ad11cab3018c58390d12ec3048c979e7b1ea7afa0ec63d1c7014c6e8e90ff52 +"@algolia/logger-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/logger-common@npm:4.20.0" + checksum: 03fffc0e021097836d4588f130fc22b3fd6ca55e286e8fc59f0525330754bc49edcf7c5d2f0016fd1c4aa3ad3432005ba3a17b5c41880c16258e98bcf4746b4d languageName: node linkType: hard -"@algolia/logger-console@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/logger-console@npm:4.13.1" +"@algolia/logger-console@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/logger-console@npm:4.20.0" dependencies: - "@algolia/logger-common": 4.13.1 - checksum: 0473c8cd3cc5e5de65d12399d5a6ca854ea2f5db21d382c79d989b9f6f07d4d0b26968d491e86477aaaeef8e974a496f355c572aae89a5327dfb2fff0ab89527 + "@algolia/logger-common": 4.20.0 + checksum: 2b1f32f3344613de3ae949df57ef5b794ec247572dfbdd04b2c5d1b250b224fef2ce7292c9ce56f45ef491afe90a7505ec21ad3b00f645ef07516c8cbe200fae languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/requester-browser-xhr@npm:4.13.1" +"@algolia/requester-browser-xhr@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/requester-browser-xhr@npm:4.20.0" dependencies: - "@algolia/requester-common": 4.13.1 - checksum: 9c96ae778fc3e57c8289a00c38aac04703b8ff4434cdf70f275ce65e02c6dc447c52e7100c084bcc7e9152b00c973b51ab8bd5abf79e44fad269da433ab5bec9 + "@algolia/requester-common": 4.20.0 + checksum: 0e3fba53b05805bb9801b3b0e8cc4c95b8f55c6e23f43f4c5f1cd01ce277aa71fb08d935be97f921af0d60d83d23b83e2bbdd35f79bd2657c9aaa8604a838d62 languageName: node linkType: hard -"@algolia/requester-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/requester-common@npm:4.13.1" - checksum: 0a0e7874619808c759aa24e5cafc461bd14a233638e59ee22db1288388bafb8abf00565665ca95c8a19cea6823688ead9d0810ca035b0f1e0c5b1bee4e869b0c +"@algolia/requester-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/requester-common@npm:4.20.0" + checksum: 3d69d781549a58784fdf34d79c46e15a9010185757112953e58f987a814e9645b47a2d7202148fb644edfacc73df783041b274eac58de06936dfc9c6f1ac88e5 languageName: node linkType: hard -"@algolia/requester-node-http@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/requester-node-http@npm:4.13.1" +"@algolia/requester-node-http@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/requester-node-http@npm:4.20.0" dependencies: - "@algolia/requester-common": 4.13.1 - checksum: 16855f43bd010d6a5883f52624a8a93ce7246753649d48877ff80c76fe337dfcc48c7b23d6a3b9ac7c9914c8c72771a87159fd8f34fd061445dd821bad3a92b5 + "@algolia/requester-common": 4.20.0 + checksum: b774593ad9a4f04215481ed3e18a4870275c0586a9106280137e53fd6278a6e4eea9fed15fb086e5989c436097552b4884c35a2f2ec49999105ab697b20831a2 languageName: node linkType: hard -"@algolia/transporter@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/transporter@npm:4.13.1" +"@algolia/transporter@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/transporter@npm:4.20.0" dependencies: - "@algolia/cache-common": 4.13.1 - "@algolia/logger-common": 4.13.1 - "@algolia/requester-common": 4.13.1 - checksum: 056ed1ff2c1eead51fa8623513a17fa4a282ff24334cc86ff89efd2b24ae2c38feadd4c40a0d2acbf9d5b2784c940883465c1afc71efab5f19a4e7669906495a + "@algolia/cache-common": 4.20.0 + "@algolia/logger-common": 4.20.0 + "@algolia/requester-common": 4.20.0 + checksum: 769c5d61a280283e2dc4c4a49fcd92e6489bc0267a290438f56311dacc213c0ff4979d063fb8dd5b7bcc888d819ec00eef5d24eb2768946696f4297b757ff527 languageName: node linkType: hard -"@ampproject/remapping@npm:^2.1.0": - version: 2.1.2 - resolution: "@ampproject/remapping@npm:2.1.2" +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" dependencies: - "@jridgewell/trace-mapping": ^0.3.0 - checksum: e02581d109eab8d0b64f50a1289ed5079cfeceb273ea1e982e42fc0163e9c3f5471c558389de49fa5b9f6eee1e292f539133d27c9831f04689cf091077136f3c + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 92ce5915f8901d8c7cd4f4e6e2fe7b9fd335a29955b400caa52e0e5b12ca3796ada7c2f10e78c9c5b0f9c2539dff0ffea7b19850a56e1487aa083531e1e46d43 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.8.3": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" dependencies: @@ -200,72 +216,37 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/compat-data@npm:7.18.8" - checksum: b82a9f61e194bd6e5267899a2697902a9bb965a042a7b3986fe30ea234d3217b702c6a6aa4ddb2d1bfad337208170b5b1f816881a46d4eece6c1806bdbba3978 - languageName: node - linkType: hard - -"@babel/core@npm:7.12.9": - version: 7.12.9 - resolution: "@babel/core@npm:7.12.9" - dependencies: - "@babel/code-frame": ^7.10.4 - "@babel/generator": ^7.12.5 - "@babel/helper-module-transforms": ^7.12.1 - "@babel/helpers": ^7.12.5 - "@babel/parser": ^7.12.7 - "@babel/template": ^7.12.7 - "@babel/traverse": ^7.12.9 - "@babel/types": ^7.12.7 - convert-source-map: ^1.7.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.1 - json5: ^2.1.2 - lodash: ^4.17.19 - resolve: ^1.3.2 - semver: ^5.4.1 - source-map: ^0.5.0 - checksum: c11d26f5a33a29c94fdd1c492dfd723f48926c51e975448dda57c081c0d74c7b03298642b2651559e0d330ec868b5757b60f9648c71cf7f89fddf79a17cf006f +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/compat-data@npm:7.23.2" + checksum: 0397a08c3e491696cc1b12cf0879bf95fc550bfc6ef524d5a9452981aa0e192a958b2246debfb230fa22718fac473cc5a36616f89b1ad6e7e52055732cd374a1 languageName: node linkType: hard -"@babel/core@npm:^7.15.5, @babel/core@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/core@npm:7.18.9" +"@babel/core@npm:^7.19.6, @babel/core@npm:^7.22.9": + version: 7.23.2 + resolution: "@babel/core@npm:7.23.2" dependencies: - "@ampproject/remapping": ^2.1.0 - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.9 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helpers": ^7.18.9 - "@babel/parser": ^7.18.9 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - convert-source-map: ^1.7.0 + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.23.0 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-module-transforms": ^7.23.0 + "@babel/helpers": ^7.23.2 + "@babel/parser": ^7.23.0 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.2 + "@babel/types": ^7.23.0 + convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.1 - semver: ^6.3.0 - checksum: fc0f9d56798987a1422ce3f074cc3bed2bb7b0cce73aa861783c7487394dc29812db5db9e299c9efa1cda31ba630aabd7921defc61a358e2a07afa85b0c4f919 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.18.7, @babel/generator@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/generator@npm:7.18.9" - dependencies: - "@babel/types": ^7.18.9 - "@jridgewell/gen-mapping": ^0.3.2 - jsesc: ^2.5.1 - checksum: 8fb777551ad13fd6e2b6b96487c3a4b6e903b77664e96435add5a348a85f99dda21efb709b0eaad0fc2acf4769799fea59426d3b6b9ec383a50d2e686b8fe525 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 14ad6e0a3ac0085dc008e7fb0c8513f0a3e39f2ab883a964a89ef1311338d49cf085c94cb6165c07fdec0fdcc6e865ce4811253c479f9f45ac375226dfe3ad3b languageName: node linkType: hard -"@babel/generator@npm:^7.23.0": +"@babel/generator@npm:^7.22.9, @babel/generator@npm:^7.23.0": version: 7.23.0 resolution: "@babel/generator@npm:7.23.0" dependencies: @@ -286,27 +267,34 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.18.9" +"@babel/helper-annotate-as-pure@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" dependencies: - "@babel/helper-explode-assignable-expression": ^7.18.6 - "@babel/types": ^7.18.9 - checksum: 8571b3cebdd3b80349aaa04e0c1595d8fc283aea7f3d7153dfba0d5fcb090e53f3fe98ca4c19ffa185e642a14ea2b97f11eccefc9be9185acca8916e68612c3f + "@babel/types": ^7.22.5 + checksum: 5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-compilation-targets@npm:7.18.9" +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.20.2 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: f4c851a7301288028bec5650bf3fa4e60c467015cd07a2ce2cde4df4bdbf97537c787727dbfd142fa24222bf214cdd0106408543af6ec73639064b886bc0b381 + "@babel/types": ^7.22.15 + checksum: 2535e3824ca6337f65786bbac98e562f71699f25532cecd196f027d7698b4967a96953d64e36567956658ad1a05ccbdc62d1ba79ee751c79f4f1d2d3ecc2e01c + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": + version: 7.22.15 + resolution: "@babel/helper-compilation-targets@npm:7.22.15" + dependencies: + "@babel/compat-data": ^7.22.9 + "@babel/helper-validator-option": ^7.22.15 + browserslist: ^4.21.9 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: 45b9286861296e890f674a3abb199efea14a962a27d9b8adeb44970a9fd5c54e73a9e342e8414d2851cf4f98d5994537352fbce7b05ade32e9849bbd327f9ff1 languageName: node linkType: hard @@ -327,6 +315,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-member-expression-to-functions": ^7.22.15 + "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 2ae5759fe8845fda99b34f2ba6cd0794fc860213d14c93a87aa9180960252bce621157a79c373b7fbb423b25a55fb0e20eae0d5f8e4ad5ef22dc70e7c2af3805 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.18.6" @@ -339,45 +346,48 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.3.1, @babel/helper-define-polyfill-provider@npm:^0.3.2": - version: 0.3.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.3.2" +"@babel/helper-create-regexp-features-plugin@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + regexpu-core: ^5.3.1 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 8eba4c1b7b94a83e7a82df5c3e504584ff0ba6ab8710a67ecc2c434a7fb841a29c2f5c94d2de51f25446119a1df538fa90b37bd570db22ddd5e7147fe98277c6 + languageName: node + linkType: hard + +"@babel/helper-define-polyfill-provider@npm:^0.4.3": + version: 0.4.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" dependencies: - "@babel/helper-compilation-targets": ^7.17.7 - "@babel/helper-plugin-utils": ^7.16.7 + "@babel/helper-compilation-targets": ^7.22.6 + "@babel/helper-plugin-utils": ^7.22.5 debug: ^4.1.1 lodash.debounce: ^4.0.8 resolve: ^1.14.2 - semver: ^6.1.2 peerDependencies: - "@babel/core": ^7.4.0-0 - checksum: b4cfce62a1e847d3d3d5a5a5e5f315a53b1665fb57bca59b1f34a4baaeda2639a0304fc26032c414f977a028002289123334cf9b99305e69026a6026c0105c94 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 0007035157e0d32ee9cb4ca319b89d6f3705523383efe52a59eb3d4dfa2ed08c5147e49c10a6e6d69c15221d89c76c8e5875475d6710fb44a5c37b8e69388e40 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.6, @babel/helper-environment-visitor@npm:^7.18.9": +"@babel/helper-environment-visitor@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-environment-visitor@npm:7.18.9" checksum: a69dd50ea91d8143b899a40ca7a387fa84dbaa02e606d8692188c7c59bd4007bcd632c189f7b7dab72cb7a016e159557a6fccf7093ab9b584d87cf2ea8cf36b7 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20": +"@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-environment-visitor@npm:7.22.20" checksum: e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 languageName: node linkType: hard -"@babel/helper-explode-assignable-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: 6e2fc5841fd849c840634e55b3a3f373167179bddb3d1c5fa2d7f63c3959425b8f87cd5c5ce5dcbb96e877a5033687840431b84a8e922c323f8e6aac9645db0b - languageName: node - linkType: hard - "@babel/helper-function-name@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-function-name@npm:7.18.9" @@ -388,7 +398,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.23.0": +"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-function-name@npm:7.23.0" dependencies: @@ -398,15 +408,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-hoist-variables@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: 830aa7ca663b0d2a025513ab50a9a10adb2a37d8cf3ba40bb74b8ac14d45fbc3d08c37b1889b10d36558edfbd34ff914909118ae156c2f0915f2057901b90eff - languageName: node - linkType: hard - "@babel/helper-hoist-variables@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-hoist-variables@npm:7.22.5" @@ -425,6 +426,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.22.15": + version: 7.23.0 + resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" + dependencies: + "@babel/types": ^7.23.0 + checksum: b810daddf093ffd0802f1429052349ed9ea08ef7d0c56da34ffbcdecbdafac86f95bdea2fe30e0e0e629febc7dd41b56cb5eacc10d1a44336d37b755dac31fa4 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-module-imports@npm:7.18.6" @@ -434,19 +444,27 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-module-transforms@npm:7.18.9" +"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" dependencies: - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/helper-validator-identifier": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: 68cf02fc0848c5fc991ac0e77b1b10152696b18b02a17cc09cabd78df7575644a5198ba633023ea85e7a5149c6d3f211b86ffe7f7367ca2a1c197f4b77e97d2c + "@babel/types": ^7.22.15 + checksum: 4e0d7fc36d02c1b8c8b3006dfbfeedf7a367d3334a04934255de5128115ea0bafdeb3e5736a2559917f0653e4e437400d54542da0468e08d3cbc86d3bbfa8f30 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-module-transforms@npm:7.23.0" + dependencies: + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-validator-identifier": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 15a52e401bd17fe44ba9be51cca693a3e182dc93264dc28ede732081c43211741df81ce8eb15e82e81c8ad51beb8893301ecc31d5c77add0f7be78dff6815318 languageName: node linkType: hard @@ -459,35 +477,43 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:7.10.4": - version: 7.10.4 - resolution: "@babel/helper-plugin-utils@npm:7.10.4" - checksum: 113d0405281f5490658f7c1c3a81b4a37927375e1ebcccd2fd90be538a102da0c2d6024561aaf26bd1c71ef7688b5a8b96a87d938db8d9774454ab635011fc7f +"@babel/helper-optimise-call-expression@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 31b41a764fc3c585196cf5b776b70cf4705c132e4ce9723f39871f215f2ddbfb2e28a62f9917610f67c8216c1080482b9b05f65dd195dae2a52cef461f2ac7b8 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.18.9 resolution: "@babel/helper-plugin-utils@npm:7.18.9" checksum: cefb9032c901abc536a34a4b741ea440e46b3251ddc1abf3ef8b3a673ef1b343f856b1faa5c78ad73fc44c97b143d6531a63c0420e4c3c8959571ea2eabeba62 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.18.9" +"@babel/helper-plugin-utils@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-plugin-utils@npm:7.22.5" + checksum: d2c4bfe2fa91058bcdee4f4e57a3f4933aed7af843acfd169cd6179fab8d13c1d636474ecabb2af107dc77462c7e893199aa26632bac1c6d7e025a17cbb9d20d + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5": + version: 7.22.20 + resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-wrap-function": ^7.18.9 - "@babel/types": ^7.18.9 + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-wrap-function": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: e6b2a906bdb3ec40d9cee7b7f8d02a561334603a0c57406a37c77d301ca77412ff33f2cef9d89421d7c3b1359604d613c596621a2ff22129612213198c5d1527 + checksum: aa93aa74250b636d477e8d863fbe59d4071f8c2654841b7ac608909e480c1cf3ff7d7af5a4038568829ad09d810bb681668cbe497d9c89ba5c352793dc9edf1e languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.18.9": +"@babel/helper-replace-supers@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-replace-supers@npm:7.18.9" dependencies: @@ -500,21 +526,34 @@ __metadata: languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-simple-access@npm:7.18.6" +"@babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": + version: 7.22.20 + resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: - "@babel/types": ^7.18.6 - checksum: 5da522f4cec805389cc2710a33c87638dc8afce59f36af302f75827a834b7ad67b0f118e0417604a5a42817914ab161bee9dd7fdc7dbac8963b8a6afb0398152 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-member-expression-to-functions": ^7.22.15 + "@babel/helper-optimise-call-expression": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 6b0858811ad46873817c90c805015d63300e003c5a85c147a17d9845fa2558a02047c3cc1f07767af59014b2dd0fa75b503e5bc36e917f360e9b67bb6f1e79f4 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.18.9" +"@babel/helper-simple-access@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-simple-access@npm:7.22.5" dependencies: - "@babel/types": ^7.18.9 - checksum: 243996398085f93ccde0174beffae3fd1c0d2a762df61713b32f1bd01b16e6eaccb47f38437706b2239e2b26673412e500e380c4b1f2413f801df4c7a6805e78 + "@babel/types": ^7.22.5 + checksum: f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: ab7fa2aa709ab49bb8cd86515a1e715a3108c4bb9a616965ba76b43dc346dee66d1004ccf4d222b596b6224e43e04cbc5c3a34459501b388451f8c589fbc3691 languageName: node linkType: hard @@ -564,26 +603,32 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-wrap-function@npm:7.18.9" +"@babel/helper-validator-option@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-validator-option@npm:7.22.15" + checksum: e9661bf80ba18e2dd978217b350fb07298e57ac417f4f1ab9fa011505e20e4857f2c3b4b538473516a9dc03af5ce3a831e5ed973311c28326f4c330b6be981c2 + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-wrap-function@npm:7.22.20" dependencies: - "@babel/helper-function-name": ^7.18.9 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: 347533c5cb9641a4a9c622b208e31401fe2575854518314558dbe17d4d3b962c9101447a7009fc2297996fd6531abc153425c22aabf52695b0f3a3e12656eeb9 + "@babel/helper-function-name": ^7.22.5 + "@babel/template": ^7.22.15 + "@babel/types": ^7.22.19 + checksum: 97b5f42ff4d305318ff2f99a5f59d3e97feff478333b2d893c4f85456d3c66372070f71d7bf9141f598c8cf2741c49a15918193633c427a88d170d98eb8c46eb languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helpers@npm:7.18.9" +"@babel/helpers@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/helpers@npm:7.23.2" dependencies: - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: 9008e38a476d7ea45647a33e547fda424b766a59d295d9321a0179d60d1c5aa71f22a0e5420cead42ef6107d0f4e1cf509cfef2f94b7650e74dffb36f1b04578 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.2 + "@babel/types": ^7.23.0 + checksum: 3a6a939c5277a27486e7c626812f0643b35d1c053ac2eb66911f5ae6c0a4e4bcdd40750eba36b766b0ee8a753484287f50ae56232a5f8f2947116723e44b9e35 languageName: node linkType: hard @@ -609,7 +654,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.12.7, @babel/parser@npm:^7.18.6, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.18.9": +"@babel/parser@npm:^7.18.6": version: 7.18.9 resolution: "@babel/parser@npm:7.18.9" bin: @@ -618,7 +663,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": +"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.7, @babel/parser@npm:^7.23.0": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" bin: @@ -627,716 +672,744 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: be2cccfc101824428a860f8c71d2cd118a691a9ace5525197f3f0cba19a522006dc4f870405beece836452353076ac687aefda20d9d1491ea72ce51179057988 + checksum: fb2288ac168e6670a77f73b92e835f7a579468435e81c9261729e9ba9c601ff22622bacd3e71eb190b135016a6fbab5d824501c7b91733dd379022a75163806c languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.18.9" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/plugin-transform-optional-chaining": ^7.22.15 peerDependencies: "@babel/core": ^7.13.0 - checksum: 09258c9cf1d1303663d9152ca693bc4ff2ef2f9c6c71ce130b32b96c1a199a73da75e38a3b75ff156b9f070aaab2b816891570a8292ce40ff8edf33b567d631d + checksum: 46fb46af40446918d64530f544ea0104e274ccd8a16b8a8f6fa2e51a198af6ac2b620aaf8875f3427671f09717949a584c79fe20f521245214f50b8de56cd116 languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.18.6" - dependencies: - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 - "@babel/plugin-syntax-async-generators": ^7.8.4 +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": + version: 7.21.0-placeholder-for-preset-env.2 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f5ffade285a50fedf0f7e8ada16aac9b4992e43ee1977aa28f871bd514fb0c023f45b07374dd53c880968b5e736afe60de8705f203ec28532cb105d2c66b35a2 + checksum: e605e0070da087f6c35579499e65801179a521b6842c15181a1e305c04fded2393f11c1efd09b087be7f8b083d1b75e8f3efcbc1292b4f60d3369e14812cff63 languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d5172ac6c9948cdfc387e94f3493ad86cb04035cf7433f86b5d358270b1b9752dc25e176db0c5d65892a246aca7bdb4636672e15626d7a7de4bc0bd0040168d9 - languageName: node - linkType: hard - -"@babel/plugin-proposal-class-static-block@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-static-block@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 129c6e53d20229a32924fc45fe72597f2c25131fa8c7da51a07d2c8971c7c815703e2a68a645da7872e17a90bb365e63fa813e47f51b62cb61f9e59fefdd71b6 + checksum: d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 languageName: node linkType: hard -"@babel/plugin-proposal-dynamic-import@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-dynamic-import@npm:7.18.6" +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 + "@babel/helper-plugin-utils": ^7.12.13 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 99be9865edfd65a46afb97d877ea247a8e881b4d0246a1ea0adf6db04c92f4f0959bd2f6f706d73248a2a7167c34f2464c4863137ddb94deadc5c7cc8bfc3e72 + checksum: 95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 languageName: node linkType: hard -"@babel/plugin-proposal-export-namespace-from@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.18.9" +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b90346bd3628ebd44138d0628a5aba1e6b11748893fb48e87008cac30f3bc7cd3161362e49433156737350318174164436357a66fbbfdbe952606b460bd8a0e4 + checksum: 4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 languageName: node linkType: hard -"@babel/plugin-proposal-json-strings@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-json-strings@npm:7.18.6" +"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 83f2ce41262a538ee43450044b9b0de320002473e4849421a7318c0500f9b0385c03d228f1be777ad71fd358aef13392e3551f0be52b5c423b0c34f7c9e5a06d + checksum: 9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.18.9" +"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + "@babel/helper-plugin-utils": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d7abdc1fa4c2aa1fec2cd7cd649adab313e7837043d9ca166e043d3e1b4ece3b4c2a59b0c1dca2ed5a774b16ab688a407f85ad1d8256af3b2cd040678fc0a4dd + checksum: 5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" +"@babel/plugin-syntax-import-assertions@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f6629158196ee9f16295d16db75825092ef543f8b98f4dfdd516e642a0430c7b1d69319ee676d35485d9b86a53ade6de0b883490d44de6d4336d38cdeccbe0bf + checksum: b297d7c757c746ed0ef3496ad749ae2ce648ec73dae5184120b191c280e62da7dc104ee126bc0053dfece3ce198a5ee7dc1cbf4768860f666afef5dee84a7146 languageName: node linkType: hard -"@babel/plugin-proposal-numeric-separator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.18.6" +"@babel/plugin-syntax-import-attributes@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a83a65c6ec0d2293d830e9db61406d246f22d8ea03583d68460cb1b6330c6699320acce1b45f66ba3c357830720e49267e3d99f95088be457c66e6450fbfe3fa + checksum: de0b104a82cb8ffdc29472177210936609b973665a2ad8ef26c078251d7c728fbd521119de4c417285408a8bae345b5da09cd4a4a3311619f71b9b2c64cce3fa languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:7.12.1": - version: 7.12.1 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.12.1" +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: "@babel/helper-plugin-utils": ^7.10.4 - "@babel/plugin-syntax-object-rest-spread": ^7.8.0 - "@babel/plugin-transform-parameters": ^7.12.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f773d59ead8b056b646d585e95d610cca2f0aeaa2eeaad74b3eb9e25821b06f27e361dd0aac9a088a10c22fee1ead8863f82a2be073e28eb04ca9a330a00941e + checksum: 0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.18.9" +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.18.8 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8e58aa40511897256f98dc558003ce3dd41073e30a9a63045eae1d5f4d9a599f5931670e19f3be62099b92be9381ccfa698c261101180dab2c257f23bde89e48 + checksum: e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e languageName: node linkType: hard -"@babel/plugin-proposal-optional-catch-binding@npm:^7.18.6": +"@babel/plugin-syntax-jsx@npm:^7.18.6": version: 7.18.6 - resolution: "@babel/plugin-proposal-optional-catch-binding@npm:7.18.6" + resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" dependencies: "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ab20153d9e95e0b73004fdf86b6a2d219be2a0ace9ca76cd9eccddb680c913fec173bca54d761b1bc6044edde0a53811f3e515908c3b16d2d81cfec1e2e17391 + checksum: d6d88b16e727bfe75c6ad6674bf7171bd5b2007ebab3f785eff96a98889cc2dd9d9b05a9ad8a265e04e67eddee81d63fcade27db033bb5aa5cc73f45cc450d6d languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.18.9" +"@babel/plugin-syntax-jsx@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d28eadd292d615c8c97616b2ccef24ac0eb1fde7264dbd41a46df537b75f0038fd474e52409c5ee0e951e8d619020650c0e1cb47d2f856dae6f93bc1795f7611 + checksum: b56ceaa9c6adc17fadfb48e1c801d07797195df2a581489e33c8034950e12e7778de6e1e70d6bcf7c5c7ada6222fe6bad5746187ab280df435f5a2799c8dd0d8 languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1c273d0ec3d49d0fe80bd754ec0191016e5b3ab4fb1e162ac0c014e9d3c1517a5d973afbf8b6dc9f9c98a8605c79e5f9e8b5ee158a4313fa68d1ff7b02084b6a + checksum: 2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.18.6" +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 173496cb8b16879cf3dd09d91bd246c6db3dc2b4320950a5a4dc4d4395e7c9d7407e5e5313242bbafcb9466540ddcb36f7b07f279dd471c6585592a141ddae51 + checksum: 2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce languageName: node linkType: hard -"@babel/plugin-proposal-unicode-property-regex@npm:^7.18.6, @babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.18.6" +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c68feae57d9b1f4d98ecc2da63bda1993980deb509ccb08f6eace712ece8081032eb6532c304524b544c2dd577e2f9c2fe5c5bfd73d1955c946300def6fc7493 + checksum: c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + checksum: ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.12.13 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + checksum: 27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af languageName: node linkType: hard -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + languageName: node + linkType: hard + +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" dependencies: "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + checksum: 69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 languageName: node linkType: hard -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 + checksum: 14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f languageName: node linkType: hard -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" +"@babel/plugin-syntax-typescript@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.18.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.3 + "@babel/helper-plugin-utils": ^7.18.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 + checksum: b0acbed3a038c47142e5301d11b40aeedc05b55738d00204964f38608ee46135a7fa36439eeeaeba1ae3608a529a1660d61eb7d1d70978130ca940bd7ca645a3 + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 523a76627f17e67dc1999f4d7c7a71ed79e9f77f55a61cf05051101967ac23ec378ff0c93787b2cbd5d53720ad799658d796a649fa351682b2bf636f63b665a1 languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.18.6": +"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.18.6" + resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.18.6 "@babel/helper-plugin-utils": ^7.18.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b2673462593bac392d09679b3f6273784d2c5b8424d5c9c37cc9318e66d190b585789f0ec8aea76a4eeb945210f3193757461e34f4ffec3a0011d338512f384d + "@babel/core": ^7.0.0 + checksum: 9144e5b02a211a4fb9a0ce91063f94fbe1004e80bde3485a0910c9f14897cf83fabd8c21267907cff25db8e224858178df0517f14333cfcf3380ad9a4139cb50 languageName: node linkType: hard -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" +"@babel/plugin-transform-arrow-functions@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + checksum: 1b24d47ddac6ae2fe8c7fab9a020fdb6a556d17d8c5f189bb470ff2958a5437fe6441521fd3d850f4283a1131d7a0acf3e8ebe789f9077f54bab4e2e8c6df176 languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:7.12.1": - version: 7.12.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.12.1" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-remap-async-to-generator": ^7.22.20 + "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 11d435f9e4e71c0f00e5bc295b40747c2c42341b7f38ddc5f8ac41d49ddfa247514dbe91932fa3dabd65581b4c7a9fe5b3d1c2b285e5ca32f4e5296cc185d40c + checksum: 16d7bd5dbd67991ab320a46ada19a9a0c8364725603c731f152afc98ee8764dc738c93f081a7560906d265b78c376bccabf3e31b9f99071c8982a6f9c8e2ac45 languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" +"@babel/plugin-transform-async-to-generator@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-remap-async-to-generator": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d6d88b16e727bfe75c6ad6674bf7171bd5b2007ebab3f785eff96a98889cc2dd9d9b05a9ad8a265e04e67eddee81d63fcade27db033bb5aa5cc73f45cc450d6d + checksum: 2972f22c3a5a56a8b225f4fa1bbdbcf6e989e0da460d5f4e2280652b1433d7c68b6ddc0cc2affc4b59905835133a253a31c24c7ca1bebe1a2f28377d27b4ca1c languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" +"@babel/plugin-transform-block-scoped-functions@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + checksum: 21878d4f0040f5001c4a14e17759e80bf699cb883a497552fa882dbc05230b100e8572345654b091021d5c4227555ed2bf40c8d6ba16a54d81145abfe0022cf8 languageName: node linkType: hard -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" +"@babel/plugin-transform-block-scoping@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + checksum: f5d0822a4e2bb3a0b5172f01f8c107999b880f0e538a9c1bae3c7720e85d8d117a67167f5e8eba909e0ec3db67be3b30e7f5c83211dd4be5c7096222071571be languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" +"@babel/plugin-transform-class-properties@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-class-properties@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + checksum: 707f976d3aea2b52dad36a5695a71af8956f9b1d5dec02c2b8cce7ff3b5e60df4cbe059c71ae0b7983034dc639de654a2c928b97e4e01ebf436d58ea43639e7d languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:7.8.3, @babel/plugin-syntax-object-rest-spread@npm:^7.8.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" +"@babel/plugin-transform-class-static-block@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-class-static-block@npm:7.22.11" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-create-class-features-plugin": ^7.22.11 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 74c06f315dbeb101784682f89d6e40a46b243132b63f430ac9ee5781d3fedff57fc6bf7390aa2b19d44a9d7e49a1e70e572bdde1907480881204ef33163b9630 + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-classes@npm:7.22.15" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.9 + "@babel/helper-split-export-declaration": ^7.22.6 + globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + checksum: c9342bcf41e0253d83d9f73c4f9d2c9f885c0412f58ebfe462d57579c8247b949cbb023f15383d18c89fe5d12b537633e2ca4ba906ce47238615bc679beafb55 languageName: node linkType: hard -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" +"@babel/plugin-transform-computed-properties@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/template": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + checksum: 22ecea23c1635083f5473092c5fbca62cbf7a85764bcf3e704c850446d68fe946097f6001c4cbfc92b4aee27ed30b375773ee479f749293e41fdb8f1fb8fcb67 languageName: node linkType: hard -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" +"@babel/plugin-transform-destructuring@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.0" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + checksum: 038505eabdde2e1bb3bb904e50292b263d61d35e18660f751e7753b5723e2a5a5903a493290d772c8598da98c2c904b7cf45552ad1c11636fcb78f60754abd53 languageName: node linkType: hard -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" +"@babel/plugin-transform-dotall-regex@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + checksum: e0d7b95380483ef563c13f7c0a2122f575c58708cfb56494d6265ebb31753cf46ee0b3f5126fa6bbea5af392b3a2da05bf1e028d0b2b4d1dc279edd67cf3c3d9 languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" +"@babel/plugin-transform-duplicate-keys@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + checksum: 82772fdcc1301358bc722c1316bea071ad0cd5893ca95b08e183748e044277a93ee90f9c641ac7873a00e4b31a8df7cf8c0981ca98d01becb4864a11b22c09d1 languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-typescript@npm:7.18.6" +"@babel/plugin-transform-dynamic-import@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.11" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b0acbed3a038c47142e5301d11b40aeedc05b55738d00204964f38608ee46135a7fa36439eeeaeba1ae3608a529a1660d61eb7d1d70978130ca940bd7ca645a3 + checksum: cf0dd2d3da42ae18ccfa54bef7c80bf26b3bcc48751fc38dd41ad47bc14cc76ca8ec692f39f8b1ef54b3f48eff8db79e6397e4653033bb3a64e433f3c3a43edf languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.18.6" +"@babel/plugin-transform-exponentiation-operator@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0686ca62e04b8500f0b9238563ed133f796bd6e0f3d38d00e4c7ce1756b51aa13c3f1ee66123d881d3ac4057259325aed104d4db11ded4551ea776af36e4e45b + checksum: e8832460cfc9e087561fa42a796bb4eb181e6983d6db85c6dcec15f98af4ae3d13fcab18a262252a43b075d79ac93aaa38d33022bc5a870d2760c6888ba5d211 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.18.6" +"@babel/plugin-transform-export-namespace-from@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.11" dependencies: - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 988bac0c376b412c3ca1dd24323219d7d2a1145aa58fe38325afb305ead46af65bf9d2145d24545175ddd54235ac94485c90f3fb9778b2088d16a87800f6fe65 + checksum: 2b65ddf9ab4cfa8ffc72983c689b99d9ce0fe74846c2e518a1955f703e1fe073d0865810959164800613c3235a29cf9cae3567a46bf9cb53a2384469d3913e85 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.18.6" +"@babel/plugin-transform-for-of@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-for-of@npm:7.22.15" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 22e81b52320e6f3929110241d91499a7535d6834b86e8871470f9946b42e093fafc79e1eae4ede376e7c5fe84c5dc5e9fdbe55ff4039b323b5958167202f02e0 + checksum: 64182292f4be8cdf1fff06fe62ba110bf5e5dbb5d966d5e8871ef40a673cd934217da51b9f4a4ba303ca936be787f30e3d13a91fe410339de79e0fe9f0807e15 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-block-scoping@npm:7.18.9" +"@babel/plugin-transform-function-name@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-function-name@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-compilation-targets": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1645188b7bd97ee10832607c9072af5184823cfd67cd319b7fb90544d27d45b222e85118dc07581913d14b1c6b36ba100c321ecdd311b107a2fb48427bff762e + checksum: 206bdef2ff91c29a7d94c77778ad79f18bdb2cd6a30179449f2b95af04637cb68d96625dc673d9a0961b6b7088bd325bbed7540caf9aa8f69e5b003d6ba20456 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-classes@npm:7.18.9" +"@babel/plugin-transform-json-strings@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-json-strings@npm:7.22.11" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-replace-supers": ^7.18.9 - "@babel/helper-split-export-declaration": ^7.18.6 - globals: ^11.1.0 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-json-strings": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 792a8dae7dacb3e50021a40c3bb1a928dc9a2c37b3e766c64e7f8e0ab9995c83a74c3e3924f729dc8090185d556851399b99426908f5480f35e43d1ae4b452c2 + checksum: 90f46a99c4136187d16f30f1f5f51e479c919edb6f6b4ce43fe81fdae2c89a556a0a6f6f2ec7ea3de7014a504f6df2220e3bc19dd7011f76bd275c195842f886 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.18.9" +"@babel/plugin-transform-literals@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-literals@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: badf6d709a32716d90c2042a1999ef008e283d0491a79edb8396d15ebb3261c3a657368dcdc3182fd2060d73ce4a4e5241c0c04bdc1d64a6c101b71ba0a8efc0 + checksum: 1003d0cf98e9ae432889bcf5f3d5f7d463f777fc2c74b0d4a1a93b51e83606c263a16146e34f0a06b291300aa5f2001d6e8bf65ed1bf478ab071b714bf158aa5 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.18.9" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d894fa122d71e77117957be0fac3d2a7099d2abfae8768f09c0513123ccbf701881f9546204569473b846374b2e72eac0e9bbe7d442e6871bc25e6d20a8b6669 + checksum: 9810f7918514bd59579ccc0950b4f352569abb40959569d38931e57f11e6b9aa920bdef403ffd8cd5d4e0243e0bbf7a1ebb445f3428c8b7a2421568ff2f681be languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.18.6, @babel/plugin-transform-dotall-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.18.6" +"@babel/plugin-transform-member-expression-literals@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cf4c3751e603996f3da0b2060c3aab3c95e267cfc702a95d025b2e9684b66ed73a318949524fad5048515f4a5142629f2c0bd3dbb83558bdbab4008486b8d9a0 + checksum: 731a341b17511809ae435b64822d4d093e86fd928b572028e6742bdfba271c57070860b0f3da080a76c5574d58c4f369fac3f7bf0f450b37920c0fc6fe27bb4e languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.18.9" +"@babel/plugin-transform-modules-amd@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-module-transforms": ^7.23.0 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: dfb7f7e66c0c862d205fe8f8b87f7ac174549c56937a5186b6e6cf85358ce257115fec0aa55e78fde53e5132d5aae9383e81aba8a4b70faa0e9fb64e3a66ca96 + checksum: dda02864029ff66955e21d19c3d245aad69792b75e748de1391403bc86c8e9720b4f320b0db8413a29c11ba63b168146cf849180b5677bc6a74bfd085d20376d languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.18.6" +"@babel/plugin-transform-modules-commonjs@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-module-transforms": ^7.23.0 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-simple-access": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 96d300ca3e55dbc98609df2d70c2b343202faca307b3152a04eab77600f6b1dc00b5b90fc3999cb9592922583c83ecbb92217e317d7c08602ca0db87a26eeed3 + checksum: 1f015764c2e63445d46660e7a2eb9002c20def04daf98fa93c9dadb5bd55adbefefd1ccdc11bcafa5e2f04275939d2414482703bc35bc60d6ca2bf1f67b720e3 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-for-of@npm:7.18.8" +"@babel/plugin-transform-modules-systemjs@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.0 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 37708653d9ac69af31f0f5d0abebd726d6b92ba630beed8fea8e1538f035b2877abc0013f26f400ebc23af459fb8e629c83847818614d9fcca086fb5bcd35c4d + checksum: 04c5cef7d6921bb9c9073cea389289099124e78cd1e3b7e020e3c085d486b48efadd9a42c0c0d963a9b1c3d5465c3151229092ea719997e53427f36935c84178 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-function-name@npm:7.18.9" +"@babel/plugin-transform-modules-umd@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" dependencies: - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 95100707fe00b3e388c059700fbdccf83c2cdf3b7fec8035cdd6c01dd80a1d9efb2821fec1357a62533ebbcbb3f6c361666866a3818486f1172e62f2b692de64 + checksum: f4a40e18986182a2b1be6af949aaff67a7d112af3d26bbd4319d05b50f323a62a10b32b5584148e4630bdffbd4d85b31c0d571fe4f601354898b837b87afca4c languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-literals@npm:7.18.9" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: b0b072bef303670b5a98307bc37d1ac326cb7ad40ea162b89a03c2ffc465451be7ef05be95cb81ed28bfeb29670dc98fe911f793a67bceab18b4cb4c81ef48f3 + languageName: node + linkType: hard + +"@babel/plugin-transform-new-target@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-new-target@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7b0d59920dd5a1679a2214dde0d785ce7c0ed75cb6d46b618e7822dcd11fb347be2abb99444019262b6561369b85b95ab96603357773a75126b3d1c4c289b822 + checksum: 22ead0668bfd8db9166a4a47579d9f44726b59f21104561a6dd851156336741abdc5c576558e042c58c4b4fd577d3e29e4bd836021007f3381c33fe3c88dca19 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.18.6" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.11" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 346e5ac45b77f1e58a9b1686eb16c75cca40cbc1de9836b814fbe8ae0767f7d4a0fec5b88fcf26a5e3455af9e33fd3c6424e4f2661d04e38123d80e022ce6e6f + checksum: 328c0ebfbbc82256af00252fb795996b093f57b528a57afcb30843ca52d24a6d824029ad6d22f042f3af336bb4dc1963b4841c2ad774424b02d14ae7cfff2701 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-amd@npm:7.18.6" +"@babel/plugin-transform-numeric-separator@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.11" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1391af0dd70959c1a1acb61cd830e18603c06dcc47af811ce06fc321da504993ff72c582e26facef8b55524215ae5ee766ea330498361adc5ad5236835a47bfc + checksum: fcde065002948c9c39f853be99c38b02aa1a1eb453e70ab1a164feb250c1fcbf1edd38071e28ed8bde6840b8a394af8b291b2ab2d793f283872ba43f89cf6dd2 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.18.6" +"@babel/plugin-transform-object-rest-spread@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.15" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/compat-data": ^7.22.9 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-transform-parameters": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: de3850b3e6a6b6ab206414897f451de332ca29713e8083d1d58ae0072516428fb138f418cae806546aef7c5e130a5cecd4bd1d938c93f20fe8c6312ef6546327 + checksum: c485084360607a4392227d8af461e0f313953a6088221826668f90e92df6e16da04e2b3424e283c2980586095430d1068ae6e549b828dfa3891e2d1a397bd034 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.18.9" +"@babel/plugin-transform-object-super@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-object-super@npm:7.22.5" dependencies: - "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-validator-identifier": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ab1e10be15a96c9cdaa05f954d5983523c627e9f701c0989fedf9bff8ff5873461f3035a73e87e4546a31b163897c6f36c5c567d4c1c3edc24ec395d56462715 + checksum: 062a78ff897c095a71f0db577bd4e4654659d542cb9ef79ec0fda7873ee6fefe31a0cb8a6c2e307e16dacaae1f50d48572184a59e1235b8d9d9cb2f38c4259ce languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-umd@npm:7.18.6" +"@babel/plugin-transform-optional-catch-binding@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.11" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e3e99aef95a3faa15bc2398a919475c9130b783ee0f2439e1622fe73466c9821a5f74f72a46bb25e84906b650b467d73b43269c8b8c13372e97d3f2d96d109c7 + checksum: 6a731f4fee93397634b088ef7de990c150ea1c29e2cf681b2520d9196888d79a4252cbcc497d9b0db0453160ea2267043036fee4ccea8964864ef1b55a40d76f languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.18.6" +"@babel/plugin-transform-optional-chaining@npm:^7.22.15, @babel/plugin-transform-optional-chaining@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: - "@babel/core": ^7.0.0 - checksum: 6695fc0469fa2dbe8133e36f8f5a281fc67a2b565481a13f5f50b95f86f4967d36c2ef8244d2ade09c0adbcd5dc98fddf8d61dd4bb56d6953c0523d11d9e0e5a + "@babel/core": ^7.0.0-0 + checksum: 2bf605b908c75f8d7616e8be52e4656983f2b027032260fbf5279f28297a67a1a28ec3ed60cd5760537dbd08a021246b8092ce06fb2418884390230b807142b3 languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-new-target@npm:7.18.6" +"@babel/plugin-transform-parameters@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-parameters@npm:7.22.15" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ea9186087b72d0adff0b9e7ef5769cb7806bc4755ce7b75c323d65053d453fd801a64f97b65c033d89370866e76e8d526dd186acede2fdcd2667fa056b11149b + checksum: 9b9faf55b20aea4755a66db75e1195f7a203b4cfeef0ed5ceb25d6364bbb7a5bd0b5c587489c37ab339c4e4e7275406d0db0c05c25aa731a3cf6b4cc51e97c8d languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-object-super@npm:7.18.6" +"@babel/plugin-transform-private-methods@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-private-methods@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 44a1f5a62c6821a4653e23a38a61bed494138a0f12945a1d8b55ff7b83904e7c5615f4ebda8268c6ea877d1ec6b00f7c92a08cf93f4f77dc777e71145342aaf5 + checksum: a62f2e47ca30f6b8043201483c5a505e3d54416e6ddfbe7cb696a1db853a4281b1fffee9f883fe26ac72ba02bba0db5832d69e02f2eb4746e9811b8779287cc1 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-parameters@npm:7.18.8" +"@babel/plugin-transform-private-property-in-object@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.11" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.11 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ca12c2cdb67012fc7d886941bf194225054cb11a117dd2b6a065ca5433f38368e8cf1e23f0fb81ccfc026991e95c7444a4cb594f4fd27b9e292304c0f96724ca + checksum: ec1ed8cc5483b8661e2cf7c020ffefe2a85e793a353d580c4174686923e465cdfaf13fc344ebb2eead4a1dbecd49baba93e342a9de400a29abedb79dcc6745a2 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-property-literals@npm:7.18.6" +"@babel/plugin-transform-property-literals@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b76239098127ee39031db54e4eb9e55cb8a616abc0fc6abba4b22d00e443ec00d7aaa58c7cdef45b224b5e017905fc39a5e1802577a82396acabb32fe9cff7dd + checksum: 8d25b7b01b5f487cfc1a296555273c1ddad45276f01039130f57eb9ab0fafa0560d10d972323071042e73ac3b8bab596543c9d1a877229624a52e6535084ea51 languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.14.5": - version: 7.17.6 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.17.6" +"@babel/plugin-transform-react-constant-elements@npm:^7.18.12": + version: 7.22.5 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.16.7 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7a7858c61aaef45b0b437d3448a35e07b9ddc19cfa54d0c6e29f1dbe5a880296bfd49ed7d24419346b60c426382d4536cfb09c2e5b5d4beb0f7d1598394de1f8 + checksum: 3a54802058ed3eef9c98efcc9ec4888763dce552f117db9a62fc2cdca30d9de0218cf7722a748d4b715a8bd833b9725d7ee018d01a18209b44434d15f719b173 languageName: node linkType: hard @@ -1351,6 +1424,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-react-display-name@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 41e0167ecd8e5281e427556146b1d3bee8652bcd0664be013f16ffeeb4d61b7ab0b1e59bcc2c923774f0d265f78012628d5277880f758f3675893226f9be012e + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-development@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.18.6" @@ -1362,6 +1446,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" + dependencies: + "@babel/plugin-transform-react-jsx": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4d2e9e68383238feb873f6111df972df4a2ebf6256d6f787a8772241867efa975b3980f7d75ab7d750e7eaad4bd454e8cc6e106301fd7572dd389e553f5f69d2 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-react-jsx@npm:7.18.6" @@ -1377,9 +1472,24 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.18.6" +"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-jsx": ^7.22.5 + "@babel/types": ^7.22.15 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: db37491e3eea5530521e177380312f308f01f806866fa0ce08d48fc5a8c9eaf9a954f778fa1ff477248afb72e916eb66ab3d35254bb6a8979f8b8e74a0fd8873 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-pure-annotations@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.18.6" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 "@babel/helper-plugin-utils": ^7.18.6 @@ -1389,98 +1499,110 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-regenerator@npm:7.18.6" +"@babel/plugin-transform-react-pure-annotations@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - regenerator-transform: ^0.15.0 + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 74eaaeebd830656c37b11d058c0cae5e93645acdea457e62ea0cc9efb135c4b080df9bb8b453f2b1e0f12c0b38d74628f2807d2de5ca0b9aab0b3ea1c04f9c93 + checksum: 18db2e2346d79ebe4a3f85f51fa7757a63a09bc6da7f339e6ce9e7534de68b5165fe7d49ac363dee6ba3f81eb904d44bf9c13653331805f9b236a1d9fec7e018 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-reserved-words@npm:7.18.6" +"@babel/plugin-transform-regenerator@npm:^7.22.10": + version: 7.22.10 + resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + regenerator-transform: ^0.15.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cbd6a86743c270a1e2a7caa19f6da22112c9dfa28fe08aea46ec9cb79fc1bc48df6b5b12819ae0e53227d4ca4adaee13f80216c03fff3082d3a88c55b4cddeba + checksum: b903bfc1e849ca956a981a199b4913c0998877b6ba759f6d64530c5106610f89a818d61471a9c1bdabb6d94ba4ba150febeb4d196f6a8e67fcdc44207bb8fef6 languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/plugin-transform-runtime@npm:7.18.9" +"@babel/plugin-transform-reserved-words@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" dependencies: - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.9 - babel-plugin-polyfill-corejs2: ^0.3.1 - babel-plugin-polyfill-corejs3: ^0.5.2 - babel-plugin-polyfill-regenerator: ^0.3.1 - semver: ^6.3.0 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4583d800f715d14bf71b5ee3db29e23fddda31c80c27160dda7ecb7e77d859ed337b1c47242380d1f3a8acf37dc360bd6ffd4dd29744749c1181a8d8c3ad6a25 + checksum: 3ee861941b1d3f9e50f1bb97a2067f33c868b8cd5fd3419a610b2ad5f3afef5f9e4b3740d26a617dc1a9e169a33477821d96b6917c774ea87cac6790d341abbd languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.18.6" +"@babel/plugin-transform-runtime@npm:^7.22.9": + version: 7.23.2 + resolution: "@babel/plugin-transform-runtime@npm:7.23.2" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + babel-plugin-polyfill-corejs2: ^0.4.6 + babel-plugin-polyfill-corejs3: ^0.8.5 + babel-plugin-polyfill-regenerator: ^0.5.3 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e60e02dca182d6ec0e7b571d7e99a0528743692fb911826600374b77832922bf7c4b154194d4fe4a0e8a15c2acad3ea44dbaff5189aaeab59124e4c7ee0b8c30 + checksum: 440291cd42e51c3f8789a0bd45cebbf597cf5d4ee4185050f1151f579465db016902054c50684e288342a03c9f1af8cec365fc02d85d14dc2b2a30ad5eb07c42 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-spread@npm:7.18.9" +"@babel/plugin-transform-shorthand-properties@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b208ba03d2e0f4e49d0e634f31ded67cd4a76fafc53838e674b535eb993b2a03a4a87717a241ff5c44d41164b74493d197378811a757965cf9bbc95f32aaab2a + checksum: d2dd6b7033f536dd74569d7343bf3ca88c4bc12575e572a2c5446f42a1ebc8e69cec5e38fc0e63ac7c4a48b944a3225e4317d5db94287b9a5b381a5045c0cdb2 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.18.6" +"@babel/plugin-transform-spread@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-spread@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: efbcf8f0acdac5757cce8d79c0259e3e5142cf3c782d71675802e97709dfb3cbc3dc08202c3ea950ddc23c8f74cae7c334aa05ec095e3cc6d642fa8b30d8e31c + checksum: f8896b00d69557a4aafb3f48b7db6fbaa8462588e733afc4eabfdf79b12a6aed7d20341d160d704205591f0a43d04971d391fa80328f61240d1edc918079a1b0 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-template-literals@npm:7.18.9" +"@babel/plugin-transform-sticky-regex@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d1a5e55ed8c3b1186fbba2a7b3e9d880cb3987b846376f51a73216a8894b9c9d6f6c6e2d3cadb17d76f2477552db5383d817169d5b92fcf08ee0fa5b88213c15 + checksum: 42d9295d357415b55c04967ff1cd124cdcbabf2635614f9ad4f8b372d9ae35f6c02bf7473a5418b91e75235960cb1e61493e2c0581cb55bf9719b0986bcd22a5 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.18.9" +"@babel/plugin-transform-template-literals@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1fc597716edf9f5c7bc74e2fead4d7751467500486dd17092af90ccbd65c5fc4a1db2e9c86e9ed1a9f206f6a3403bbc07eab50b0c2b8e50f819b4118f2cf71ef + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c42e00635aa9d1c597d339c9023e0f9bfa3cd7af55c00cb8a6461036102b0facdcd3059456d4fee0a63675aeecca62fc84ee01f28b23139c6ae03e6d61c86906 + checksum: 277084dd3e873d62541f683173c7cf33b8317f7714335b7e861cc5b4b76f09acbf532a4c9dfbcf7756d29bc07b94b48bd9356af478f424865a86c7d5798be7c0 languageName: node linkType: hard @@ -1497,60 +1619,86 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.18.6" +"@babel/plugin-transform-typescript@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-typescript@npm:7.22.15" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-typescript": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d28fdde094209002d2a0bc6242abd7e768802f809acac89ea2aa88b61ab5103548e4822740f00cf0fc76f2e12fadc0a06a01661fa1805e0338d3350b18b5f7ce + checksum: e6a110f5b70334c6a503c90855dde5660f479e48262c8338261aeb30c70eedcfe885265b788c89f5bef757d99ab6704ee22bb0d23579597bc9415cfa86607458 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.18.6" +"@babel/plugin-transform-unicode-escapes@npm:^7.22.10": + version: 7.22.10 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.10" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2f71b5b79df7f8de81c52011d64203b7021f7d23af2470782aef8e8a3be6ca3a208679de8078a12e707342dde1175e5ab44abf8f63c219c997e147118d356dea + checksum: 68425d56698650087faa33fe40adf8bde32efc1d05ce564f02b62526e7f5b2f4633278b0a10ee2e7e36fb89c79c3330c730d96b8a872acea4702c5645cee98f8 languageName: node linkType: hard -"@babel/preset-env@npm:^7.15.6, @babel/preset-env@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/preset-env@npm:7.18.9" +"@babel/plugin-transform-unicode-property-regex@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.22.5" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-async-generator-functions": ^7.18.6 - "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-class-static-block": ^7.18.6 - "@babel/plugin-proposal-dynamic-import": ^7.18.6 - "@babel/plugin-proposal-export-namespace-from": ^7.18.9 - "@babel/plugin-proposal-json-strings": ^7.18.6 - "@babel/plugin-proposal-logical-assignment-operators": ^7.18.9 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 - "@babel/plugin-proposal-numeric-separator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.18.9 - "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-private-methods": ^7.18.6 - "@babel/plugin-proposal-private-property-in-object": ^7.18.6 - "@babel/plugin-proposal-unicode-property-regex": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: da424c1e99af0e920d21f7f121fb9503d0771597a4bd14130fb5f116407be29e9340c049d04733b3d8a132effe4f4585fe3cc9630ae3294a2df9199c8dfd7075 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-regex@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4cfaf4bb724a5c55a6fb5b0ee6ebbeba78dc700b9bc0043715d4b37409d90b43c888735c613690a1ec0d8d8e41a500b9d3f0395aa9f55b174449c8407663684b + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: af37b468332db051f0aaa144adbfab39574e570f613e121b58a551e3cbb7083c9f8c32a83ba2641172a4065128052643468438c19ad098cd62b2d97140dc483e + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.22.9": + version: 7.23.2 + resolution: "@babel/preset-env@npm:7.23.2" + dependencies: + "@babel/compat-data": ^7.23.2 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.15 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.22.15 + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-class-properties": ^7.12.13 "@babel/plugin-syntax-class-static-block": ^7.14.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.18.6 + "@babel/plugin-syntax-import-assertions": ^7.22.5 + "@babel/plugin-syntax-import-attributes": ^7.22.5 + "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/plugin-syntax-json-strings": ^7.8.3 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 @@ -1560,67 +1708,82 @@ __metadata: "@babel/plugin-syntax-optional-chaining": ^7.8.3 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-transform-arrow-functions": ^7.18.6 - "@babel/plugin-transform-async-to-generator": ^7.18.6 - "@babel/plugin-transform-block-scoped-functions": ^7.18.6 - "@babel/plugin-transform-block-scoping": ^7.18.9 - "@babel/plugin-transform-classes": ^7.18.9 - "@babel/plugin-transform-computed-properties": ^7.18.9 - "@babel/plugin-transform-destructuring": ^7.18.9 - "@babel/plugin-transform-dotall-regex": ^7.18.6 - "@babel/plugin-transform-duplicate-keys": ^7.18.9 - "@babel/plugin-transform-exponentiation-operator": ^7.18.6 - "@babel/plugin-transform-for-of": ^7.18.8 - "@babel/plugin-transform-function-name": ^7.18.9 - "@babel/plugin-transform-literals": ^7.18.9 - "@babel/plugin-transform-member-expression-literals": ^7.18.6 - "@babel/plugin-transform-modules-amd": ^7.18.6 - "@babel/plugin-transform-modules-commonjs": ^7.18.6 - "@babel/plugin-transform-modules-systemjs": ^7.18.9 - "@babel/plugin-transform-modules-umd": ^7.18.6 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.18.6 - "@babel/plugin-transform-new-target": ^7.18.6 - "@babel/plugin-transform-object-super": ^7.18.6 - "@babel/plugin-transform-parameters": ^7.18.8 - "@babel/plugin-transform-property-literals": ^7.18.6 - "@babel/plugin-transform-regenerator": ^7.18.6 - "@babel/plugin-transform-reserved-words": ^7.18.6 - "@babel/plugin-transform-shorthand-properties": ^7.18.6 - "@babel/plugin-transform-spread": ^7.18.9 - "@babel/plugin-transform-sticky-regex": ^7.18.6 - "@babel/plugin-transform-template-literals": ^7.18.9 - "@babel/plugin-transform-typeof-symbol": ^7.18.9 - "@babel/plugin-transform-unicode-escapes": ^7.18.6 - "@babel/plugin-transform-unicode-regex": ^7.18.6 - "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.18.9 - babel-plugin-polyfill-corejs2: ^0.3.1 - babel-plugin-polyfill-corejs3: ^0.5.2 - babel-plugin-polyfill-regenerator: ^0.3.1 - core-js-compat: ^3.22.1 - semver: ^6.3.0 + "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.22.5 + "@babel/plugin-transform-async-generator-functions": ^7.23.2 + "@babel/plugin-transform-async-to-generator": ^7.22.5 + "@babel/plugin-transform-block-scoped-functions": ^7.22.5 + "@babel/plugin-transform-block-scoping": ^7.23.0 + "@babel/plugin-transform-class-properties": ^7.22.5 + "@babel/plugin-transform-class-static-block": ^7.22.11 + "@babel/plugin-transform-classes": ^7.22.15 + "@babel/plugin-transform-computed-properties": ^7.22.5 + "@babel/plugin-transform-destructuring": ^7.23.0 + "@babel/plugin-transform-dotall-regex": ^7.22.5 + "@babel/plugin-transform-duplicate-keys": ^7.22.5 + "@babel/plugin-transform-dynamic-import": ^7.22.11 + "@babel/plugin-transform-exponentiation-operator": ^7.22.5 + "@babel/plugin-transform-export-namespace-from": ^7.22.11 + "@babel/plugin-transform-for-of": ^7.22.15 + "@babel/plugin-transform-function-name": ^7.22.5 + "@babel/plugin-transform-json-strings": ^7.22.11 + "@babel/plugin-transform-literals": ^7.22.5 + "@babel/plugin-transform-logical-assignment-operators": ^7.22.11 + "@babel/plugin-transform-member-expression-literals": ^7.22.5 + "@babel/plugin-transform-modules-amd": ^7.23.0 + "@babel/plugin-transform-modules-commonjs": ^7.23.0 + "@babel/plugin-transform-modules-systemjs": ^7.23.0 + "@babel/plugin-transform-modules-umd": ^7.22.5 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.22.5 + "@babel/plugin-transform-new-target": ^7.22.5 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.22.11 + "@babel/plugin-transform-numeric-separator": ^7.22.11 + "@babel/plugin-transform-object-rest-spread": ^7.22.15 + "@babel/plugin-transform-object-super": ^7.22.5 + "@babel/plugin-transform-optional-catch-binding": ^7.22.11 + "@babel/plugin-transform-optional-chaining": ^7.23.0 + "@babel/plugin-transform-parameters": ^7.22.15 + "@babel/plugin-transform-private-methods": ^7.22.5 + "@babel/plugin-transform-private-property-in-object": ^7.22.11 + "@babel/plugin-transform-property-literals": ^7.22.5 + "@babel/plugin-transform-regenerator": ^7.22.10 + "@babel/plugin-transform-reserved-words": ^7.22.5 + "@babel/plugin-transform-shorthand-properties": ^7.22.5 + "@babel/plugin-transform-spread": ^7.22.5 + "@babel/plugin-transform-sticky-regex": ^7.22.5 + "@babel/plugin-transform-template-literals": ^7.22.5 + "@babel/plugin-transform-typeof-symbol": ^7.22.5 + "@babel/plugin-transform-unicode-escapes": ^7.22.10 + "@babel/plugin-transform-unicode-property-regex": ^7.22.5 + "@babel/plugin-transform-unicode-regex": ^7.22.5 + "@babel/plugin-transform-unicode-sets-regex": ^7.22.5 + "@babel/preset-modules": 0.1.6-no-external-plugins + "@babel/types": ^7.23.0 + babel-plugin-polyfill-corejs2: ^0.4.6 + babel-plugin-polyfill-corejs3: ^0.8.5 + babel-plugin-polyfill-regenerator: ^0.5.3 + core-js-compat: ^3.31.0 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 536c6e2c44fabc98434de2014477220b6284d3fa1f1edf615b092e5e213544fc42c97b2fbac4ccb282875d5587cc5dac3438e62999c03031859688bb6c063a38 + checksum: b5912f09dc92a8f6b93420f3274499e30255af6dbe5673075a30a5bfead1a651e5eb362c6b95e3ba48c6e6bd4e38b7a5aceebba99997ec7c83833e2e6af9abde languageName: node linkType: hard -"@babel/preset-modules@npm:^0.1.5": - version: 0.1.5 - resolution: "@babel/preset-modules@npm:0.1.5" +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" dependencies: "@babel/helper-plugin-utils": ^7.0.0 - "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 - "@babel/plugin-transform-dotall-regex": ^7.4.4 "@babel/types": ^7.4.4 esutils: ^2.0.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bd90081d96b746c1940dc1ce056dee06ed3a128d20936aee1d1795199f789f9a61293ef738343ae10c6d53970c17285d5e147a945dded35423aacb75083b8a89 + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 9d02f70d7052446c5f3a4fb39e6b632695fb6801e46d31d7f7c5001f7c18d31d1ea8369212331ca7ad4e7877b73231f470b0d559162624128f1b80fe591409e6 languageName: node linkType: hard -"@babel/preset-react@npm:^7.14.5, @babel/preset-react@npm:^7.18.6": +"@babel/preset-react@npm:^7.18.6": version: 7.18.6 resolution: "@babel/preset-react@npm:7.18.6" dependencies: @@ -1636,7 +1799,23 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.15.0, @babel/preset-typescript@npm:^7.18.6": +"@babel/preset-react@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/preset-react@npm:7.22.15" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 + "@babel/plugin-transform-react-display-name": ^7.22.5 + "@babel/plugin-transform-react-jsx": ^7.22.15 + "@babel/plugin-transform-react-jsx-development": ^7.22.5 + "@babel/plugin-transform-react-pure-annotations": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 80940aa494292b7f689d902b76828cb3ab4eaf4e6421107f23388b6ea7316ab25ccd817b766fde5c40787fd92f1cba1f660190bfd71965c902e49b42c9e290c2 + languageName: node + linkType: hard + +"@babel/preset-typescript@npm:^7.18.6": version: 7.18.6 resolution: "@babel/preset-typescript@npm:7.18.6" dependencies: @@ -1649,17 +1828,39 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/runtime-corejs3@npm:7.18.9" +"@babel/preset-typescript@npm:^7.22.5": + version: 7.23.2 + resolution: "@babel/preset-typescript@npm:7.23.2" dependencies: - core-js-pure: ^3.20.2 - regenerator-runtime: ^0.13.4 - checksum: 5218e4df9b52b60231afa1e3f5c0e54d6c2167a466d1ecbc1603b19c7a6f73fb755d4bd021f87f3706d704029f7cd2e20a13445dd3b0a62886bb3b041fc6623d + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 + "@babel/plugin-syntax-jsx": ^7.22.5 + "@babel/plugin-transform-modules-commonjs": ^7.23.0 + "@babel/plugin-transform-typescript": ^7.22.15 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 40eb71e9959d97a0c2e89fe5cf4c9db7edea5b103618d4c4b5cc7a41dd8c66ab1b1922c443607427000d7bb63e135e8c5f268f35426b2ba00ce53f75bf3b0f8b + languageName: node + linkType: hard + +"@babel/regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "@babel/regjsgen@npm:0.8.0" + checksum: 4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a + languageName: node + linkType: hard + +"@babel/runtime-corejs3@npm:^7.22.6": + version: 7.23.2 + resolution: "@babel/runtime-corejs3@npm:7.23.2" + dependencies: + core-js-pure: ^3.30.2 + regenerator-runtime: ^0.14.0 + checksum: 1362f04cae16d99175961e4113618e5ae210e17053605d4cd2c7b93b3a0334fcfe6a689601d20c12f8946cd8a472430e25f0bf09b7dcd851f63fd82749fd7503 languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.8.4": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.8.4": version: 7.18.9 resolution: "@babel/runtime@npm:7.18.9" dependencies: @@ -1668,7 +1869,16 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.18.6": +"@babel/runtime@npm:^7.22.6": + version: 7.23.2 + resolution: "@babel/runtime@npm:7.23.2" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 271fcfad8574269d9967b8a1c03f2e1eab108a52ad7c96ed136eee0b11f46156f1186637bd5e79a4207163db9a00413cd70a6428e137b982d0ee8ab85eb9f438 + languageName: node + linkType: hard + +"@babel/template@npm:^7.18.6": version: 7.18.6 resolution: "@babel/template@npm:7.18.6" dependencies: @@ -1679,7 +1889,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15": +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" dependencies: @@ -1690,7 +1900,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.18.9": +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" dependencies: @@ -1708,7 +1918,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.12.7, @babel/types@npm:^7.15.6, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.18.9 resolution: "@babel/types@npm:7.18.9" dependencies: @@ -1718,7 +1928,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0": +"@babel/types@npm:^7.20.0, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0": version: 7.23.0 resolution: "@babel/types@npm:7.23.0" dependencies: @@ -1736,169 +1946,194 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.1.1": - version: 3.1.1 - resolution: "@docsearch/css@npm:3.1.1" - checksum: f14aed849bb249152649d8f33c0f96906d35c73a78463d20ff69144f0328d4ef1006c67c47f1499ee2d22e9e9d1165a5765f6573fa76e8ebe77094735e947a40 +"@discoveryjs/json-ext@npm:0.5.7": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c languageName: node linkType: hard -"@docsearch/react@npm:^3.1.1": - version: 3.1.1 - resolution: "@docsearch/react@npm:3.1.1" +"@docsearch/css@npm:3.5.2": + version: 3.5.2 + resolution: "@docsearch/css@npm:3.5.2" + checksum: 736e029b65dba3b2fafb98b4bc4e6f7f411863fed4ef2798c82be8dcdcbdcb9dea6a75376b19d013e9d2f8607b2e3f8d8353938343b08b382894d8b16883ccb3 + languageName: node + linkType: hard + +"@docsearch/react@npm:^3.5.2": + version: 3.5.2 + resolution: "@docsearch/react@npm:3.5.2" dependencies: - "@algolia/autocomplete-core": 1.7.1 - "@algolia/autocomplete-preset-algolia": 1.7.1 - "@docsearch/css": 3.1.1 - algoliasearch: ^4.0.0 + "@algolia/autocomplete-core": 1.9.3 + "@algolia/autocomplete-preset-algolia": 1.9.3 + "@docsearch/css": 3.5.2 + algoliasearch: ^4.19.1 peerDependencies: "@types/react": ">= 16.8.0 < 19.0.0" react: ">= 16.8.0 < 19.0.0" react-dom: ">= 16.8.0 < 19.0.0" - checksum: 3451957ccbe0358abf4ffa9181f3f88c2c81f4ea2ba8fdc8388c90a25eb7f50d51694a6fcc8510f88cb91c746f4a8d0bc910d39600c0e21d309c7ca5dc27b09a + search-insights: ">= 1 < 3" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + checksum: 1dc22a4364be89bc4139bbcc4c90ea240a701961eb698101f53067fd6e0ca014fc12bb6577b67dc108e0ef5e8484866df8e08eb681f9bcafc898a822ce2f42d8 languageName: node linkType: hard -"@docusaurus/core@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/core@npm:2.4.3" +"@docusaurus/core@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/core@npm:3.0.0" dependencies: - "@babel/core": ^7.18.6 - "@babel/generator": ^7.18.7 + "@babel/core": ^7.22.9 + "@babel/generator": ^7.22.9 "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-transform-runtime": ^7.18.6 - "@babel/preset-env": ^7.18.6 - "@babel/preset-react": ^7.18.6 - "@babel/preset-typescript": ^7.18.6 - "@babel/runtime": ^7.18.6 - "@babel/runtime-corejs3": ^7.18.6 - "@babel/traverse": ^7.18.8 - "@docusaurus/cssnano-preset": 2.4.3 - "@docusaurus/logger": 2.4.3 - "@docusaurus/mdx-loader": 2.4.3 + "@babel/plugin-transform-runtime": ^7.22.9 + "@babel/preset-env": ^7.22.9 + "@babel/preset-react": ^7.22.5 + "@babel/preset-typescript": ^7.22.5 + "@babel/runtime": ^7.22.6 + "@babel/runtime-corejs3": ^7.22.6 + "@babel/traverse": ^7.22.8 + "@docusaurus/cssnano-preset": 3.0.0 + "@docusaurus/logger": 3.0.0 + "@docusaurus/mdx-loader": 3.0.0 "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-common": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-common": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 "@slorber/static-site-generator-webpack-plugin": ^4.0.7 - "@svgr/webpack": ^6.2.1 - autoprefixer: ^10.4.7 - babel-loader: ^8.2.5 + "@svgr/webpack": ^6.5.1 + autoprefixer: ^10.4.14 + babel-loader: ^9.1.3 babel-plugin-dynamic-import-node: ^2.3.3 boxen: ^6.2.1 chalk: ^4.1.2 chokidar: ^3.5.3 - clean-css: ^5.3.0 - cli-table3: ^0.6.2 + clean-css: ^5.3.2 + cli-table3: ^0.6.3 combine-promises: ^1.1.0 commander: ^5.1.0 copy-webpack-plugin: ^11.0.0 - core-js: ^3.23.3 - css-loader: ^6.7.1 - css-minimizer-webpack-plugin: ^4.0.0 - cssnano: ^5.1.12 + core-js: ^3.31.1 + css-loader: ^6.8.1 + css-minimizer-webpack-plugin: ^4.2.2 + cssnano: ^5.1.15 del: ^6.1.1 - detect-port: ^1.3.0 + detect-port: ^1.5.1 escape-html: ^1.0.3 - eta: ^2.0.0 + eta: ^2.2.0 file-loader: ^6.2.0 - fs-extra: ^10.1.0 - html-minifier-terser: ^6.1.0 - html-tags: ^3.2.0 - html-webpack-plugin: ^5.5.0 - import-fresh: ^3.3.0 + fs-extra: ^11.1.1 + html-minifier-terser: ^7.2.0 + html-tags: ^3.3.1 + html-webpack-plugin: ^5.5.3 leven: ^3.1.0 lodash: ^4.17.21 - mini-css-extract-plugin: ^2.6.1 - postcss: ^8.4.14 - postcss-loader: ^7.0.0 + mini-css-extract-plugin: ^2.7.6 + postcss: ^8.4.26 + postcss-loader: ^7.3.3 prompts: ^2.4.2 react-dev-utils: ^12.0.1 react-helmet-async: ^1.3.0 react-loadable: "npm:@docusaurus/react-loadable@5.5.2" react-loadable-ssr-addon-v5-slorber: ^1.0.1 - react-router: ^5.3.3 + react-router: ^5.3.4 react-router-config: ^5.1.1 - react-router-dom: ^5.3.3 + react-router-dom: ^5.3.4 rtl-detect: ^1.0.4 - semver: ^7.3.7 - serve-handler: ^6.1.3 + semver: ^7.5.4 + serve-handler: ^6.1.5 shelljs: ^0.8.5 - terser-webpack-plugin: ^5.3.3 - tslib: ^2.4.0 - update-notifier: ^5.1.0 + terser-webpack-plugin: ^5.3.9 + tslib: ^2.6.0 + update-notifier: ^6.0.2 url-loader: ^4.1.1 - wait-on: ^6.0.1 - webpack: ^5.73.0 - webpack-bundle-analyzer: ^4.5.0 - webpack-dev-server: ^4.9.3 - webpack-merge: ^5.8.0 + wait-on: ^7.0.1 + webpack: ^5.88.1 + webpack-bundle-analyzer: ^4.9.0 + webpack-dev-server: ^4.15.1 + webpack-merge: ^5.9.0 webpackbar: ^5.0.2 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: afa7e504e537499d110cbf1aad58873864b3ddce8ee6891ad951bb43c8a5bbab39e46519c3b92506bd12476e25abfaa8330fbb261e2cc90ef18386e8e8e3e9e3 + checksum: f9d538d8aa49d37a3167a12f17cc89ba64d5b96d5c034c7af36f028a9aa9f926a5372e52c7ce7ef9e2a33ddc96a54d53d45d93f76d86a4f10717b06eef783c4c languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/cssnano-preset@npm:2.4.3" +"@docusaurus/cssnano-preset@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/cssnano-preset@npm:3.0.0" dependencies: - cssnano-preset-advanced: ^5.3.8 - postcss: ^8.4.14 - postcss-sort-media-queries: ^4.2.1 - tslib: ^2.4.0 - checksum: f069913f17d8ccacecb7ed9f471f3f7bfce9f98872de796e0751066546378f6dcfe74bf2c1cd11764c372c7ae4b1538f8564971d982c3209160b24d39fc7f383 + cssnano-preset-advanced: ^5.3.10 + postcss: ^8.4.26 + postcss-sort-media-queries: ^4.4.1 + tslib: ^2.6.0 + checksum: 60670013de7f504d6c1722a800f72b2cd6aa30a8a2119f0d36b003b65eeee4e5e52bcbbc57d0cd49ef7f4813dc042848f700676f99fae7ef049f6e97cd2b0652 languageName: node linkType: hard -"@docusaurus/logger@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/logger@npm:2.4.3" +"@docusaurus/logger@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/logger@npm:3.0.0" dependencies: chalk: ^4.1.2 - tslib: ^2.4.0 - checksum: a94de20b5c3742fb273878db497e16c14f130b7a245579f6eb293dab59b13833085317e864876e0e87f145a92cdf522bcb0ea2c98ae7dd7af00b8d6aa0da9229 + tslib: ^2.6.0 + checksum: 493732d2e2f03824728bdd1dba5c5515dbad81be12864f4570aff999f782d2f9fa1b47155d105e309f88a93334977dd70d964a336cc4ffb26d76d13a18ef7362 languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/mdx-loader@npm:2.4.3" - dependencies: - "@babel/parser": ^7.18.8 - "@babel/traverse": ^7.18.8 - "@docusaurus/logger": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@mdx-js/mdx": ^1.6.22 +"@docusaurus/mdx-loader@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/mdx-loader@npm:3.0.0" + dependencies: + "@babel/parser": ^7.22.7 + "@babel/traverse": ^7.22.8 + "@docusaurus/logger": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + "@mdx-js/mdx": ^3.0.0 + "@slorber/remark-comment": ^1.0.0 escape-html: ^1.0.3 + estree-util-value-to-estree: ^3.0.1 file-loader: ^6.2.0 - fs-extra: ^10.1.0 - image-size: ^1.0.1 - mdast-util-to-string: ^2.0.0 - remark-emoji: ^2.2.0 + fs-extra: ^11.1.1 + image-size: ^1.0.2 + mdast-util-mdx: ^3.0.0 + mdast-util-to-string: ^4.0.0 + rehype-raw: ^7.0.0 + remark-directive: ^3.0.0 + remark-emoji: ^4.0.0 + remark-frontmatter: ^5.0.0 + remark-gfm: ^4.0.0 stringify-object: ^3.3.0 - tslib: ^2.4.0 - unified: ^9.2.2 - unist-util-visit: ^2.0.3 + tslib: ^2.6.0 + unified: ^11.0.3 + unist-util-visit: ^5.0.0 url-loader: ^4.1.1 - webpack: ^5.73.0 + vfile: ^6.0.1 + webpack: ^5.88.1 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 3daf13e28ecd152003977ec428cba3a06db347968e6a26d83b3191d35f036a852f536bf66dd2e8928086ad6c9d5496695bac6a75935cf4722234481f608b9cfa + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 35d62c4128b639880b3037027348f98adc10dcd837300e9876a5a03711ffcf969cd626d5ef1fe10cf139d14e26c0f7b3bfb5e00d83992b4559b0eebc05e4e8c7 languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/module-type-aliases@npm:2.4.3" +"@docusaurus/module-type-aliases@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/module-type-aliases@npm:3.0.0" dependencies: "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/types": 2.4.3 + "@docusaurus/types": 3.0.0 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -1908,186 +2143,187 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 9141a6d6162e4b5a610152a8323830696484e98484c1687661098103936b1ac8137c8131b55bff9e270975dcdba1b59426e561451d56fe1b2424c1485ec31906 + checksum: 84ab728b34be8551ec3f915388bc059e918d542ff397058d2e9174f223f5497e647815bfc921098baab87aff402a1fa8fbe1bbe77cf49a7770161e3def2df07a languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-content-blog@npm:2.4.3" - dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/logger": 2.4.3 - "@docusaurus/mdx-loader": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-common": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 +"@docusaurus/plugin-content-blog@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-content-blog@npm:3.0.0" + dependencies: + "@docusaurus/core": 3.0.0 + "@docusaurus/logger": 3.0.0 + "@docusaurus/mdx-loader": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-common": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 cheerio: ^1.0.0-rc.12 feed: ^4.2.2 - fs-extra: ^10.1.0 + fs-extra: ^11.1.1 lodash: ^4.17.21 reading-time: ^1.5.0 - tslib: ^2.4.0 - unist-util-visit: ^2.0.3 + srcset: ^4.0.0 + tslib: ^2.6.0 + unist-util-visit: ^5.0.0 utility-types: ^3.10.0 - webpack: ^5.73.0 + webpack: ^5.88.1 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 23869d0533bd9693ea9d32d7a638e9adb51a9a9dbbc189533f1f0c62092c613538448d10c9b9fc24b2e1fd4832d8f969574768191a2850bdb40fdd8e7b0470b6 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 2e2b19cfae6d5739f1499c37f15c36307e9eea82317ad557656058a1e6d4df59d7c6e882ef8b382ef60d64762709d0d7e9454487b5a9ab980b9cf05222d78b3a languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-content-docs@npm:2.4.3" - dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/logger": 2.4.3 - "@docusaurus/mdx-loader": 2.4.3 - "@docusaurus/module-type-aliases": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - "@types/react-router-config": ^5.0.6 +"@docusaurus/plugin-content-docs@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-content-docs@npm:3.0.0" + dependencies: + "@docusaurus/core": 3.0.0 + "@docusaurus/logger": 3.0.0 + "@docusaurus/mdx-loader": 3.0.0 + "@docusaurus/module-type-aliases": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + "@types/react-router-config": ^5.0.7 combine-promises: ^1.1.0 - fs-extra: ^10.1.0 - import-fresh: ^3.3.0 + fs-extra: ^11.1.1 js-yaml: ^4.1.0 lodash: ^4.17.21 - tslib: ^2.4.0 + tslib: ^2.6.0 utility-types: ^3.10.0 - webpack: ^5.73.0 + webpack: ^5.88.1 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: ad22c773a875c96e82b1ecb770d19d34edbf9acc23464ce2e5098049d2b1f6220493f94d77c3670668572a3e70dbd2e52dc1015137bcf0944d4cc8867dbc8cef + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: e22a6e6f0a7647c47538dd89ef21749f5adece6a3f64a335bd0bd622e3669fa6e3b6d47ea5da45cb9a1ac885754dd4f1b75eb4a2c9ddb69a027eda7f19c22509 languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-content-pages@npm:2.4.3" +"@docusaurus/plugin-content-pages@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-content-pages@npm:3.0.0" dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/mdx-loader": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - fs-extra: ^10.1.0 - tslib: ^2.4.0 - webpack: ^5.73.0 + "@docusaurus/core": 3.0.0 + "@docusaurus/mdx-loader": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + fs-extra: ^11.1.1 + tslib: ^2.6.0 + webpack: ^5.88.1 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: c488027a1f119e207f264a96fdb5fba33bb3ec02b01d1ecbe0beaddc66773e446aca58e8ae2f62b705e9ace0789d02f9731902a150d3c1b60a3e9b75ca9c9839 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 297778d86562c5e3d30793fccf78bc283a2b92f0b87b18b8183fa7618beeb8eeeaf50eb46155467b96a27aa3e7c9e5650c26add6f9b48da6a483a220ce79a4fe languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-debug@npm:2.4.3" +"@docusaurus/plugin-debug@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-debug@npm:3.0.0" dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils": 2.4.3 - fs-extra: ^10.1.0 - react-json-view: ^1.21.3 - tslib: ^2.4.0 + "@docusaurus/core": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@microlink/react-json-view": ^1.22.2 + fs-extra: ^11.1.1 + tslib: ^2.6.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 64cd8c0c9868f4da2b1a19525c1af3a5e8ee8284a29053243afbbb888542c506f6a0c30711042dca31d170ff6fada5b2f5736603c4b2ea0017155ec9659aa77f + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: f1a97c5f07b7316ee85fc93c18b4d519fc76c5dbaaa8ab609feddffec647b52fe7b8f176bb2b552186dc39c8dd920702d0353437a48cb0d023907d0736722e87 languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-google-analytics@npm:2.4.3" +"@docusaurus/plugin-google-analytics@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-google-analytics@npm:3.0.0" dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - tslib: ^2.4.0 + "@docusaurus/core": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + tslib: ^2.6.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 2998a4ed28d046baa6c443a57b9420fb3f4d78d318c076308b4c1890fc8d05b3f4f7236eba271c1ed88cc80621314eb176f06f29f7ee23274c62d916916a7dee + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 17e7196724854e963010c75bb6dd4aa03b15c3491a90ade7d6cbd308b1ed02e630c114c5d89cdd30e3c230bddfbbb16cbf4ec7405cf99363778dcef6372f1d8f languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-google-gtag@npm:2.4.3" +"@docusaurus/plugin-google-gtag@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-google-gtag@npm:3.0.0" dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - tslib: ^2.4.0 + "@docusaurus/core": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + "@types/gtag.js": ^0.0.12 + tslib: ^2.6.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: e978622437b19fe6873c301cb2da5ff64e6d464bb10cac509b07eef01622f5518f4b41c3c91fb8a384017b0414e32439970dbacef61cddba8279615eb59a011c + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: f92e0537532bb9e5f3fd942920763ff5cbc8d29cff18adfeccd08cf91f370823badc439244ad9305f19256845df6b10fc393d82e3793e6dc4cdefce085d1c890 languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.3" +"@docusaurus/plugin-google-tag-manager@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.0.0" dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - tslib: ^2.4.0 + "@docusaurus/core": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + tslib: ^2.6.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: d17e82aa6bbaa6f25752677dc50f3343212e112035ab5c2dfc065126d287f93354adfe655c726708be59de3e66c0cecdf6feb12fd5eb36b8939ed26ad4338a10 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: ef4bdde396ca738c7becd5f1904cd75fe4cbdf7c82d84ee3af260b7b47b4faabfef6f3b3a044d6c8b8011a4bd2ee8639cb99211041ba7181017638a194bbb7e8 languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/plugin-sitemap@npm:2.4.3" - dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/logger": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-common": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - fs-extra: ^10.1.0 +"@docusaurus/plugin-sitemap@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/plugin-sitemap@npm:3.0.0" + dependencies: + "@docusaurus/core": 3.0.0 + "@docusaurus/logger": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-common": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + fs-extra: ^11.1.1 sitemap: ^7.1.1 - tslib: ^2.4.0 + tslib: ^2.6.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: da268caa3ef80c6581c66bcc141ab4ead9256be45c92acfbb9fa1ddf1288f1eaeae482bf5957193efdfa8b1723696f3d7d4f2cc256d0db009fcc3cea7f53b9e7 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: bb29c677e213df381c5484420bfd5738ae77c51a1bf91e2c46b90a00264257672da4b5a26fb7e2d8818b515edd5d3261a341b0403cf7e3dbffac532a1c5a70ff languageName: node linkType: hard -"@docusaurus/preset-classic@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/preset-classic@npm:2.4.3" +"@docusaurus/preset-classic@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/preset-classic@npm:3.0.0" dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/plugin-content-blog": 2.4.3 - "@docusaurus/plugin-content-docs": 2.4.3 - "@docusaurus/plugin-content-pages": 2.4.3 - "@docusaurus/plugin-debug": 2.4.3 - "@docusaurus/plugin-google-analytics": 2.4.3 - "@docusaurus/plugin-google-gtag": 2.4.3 - "@docusaurus/plugin-google-tag-manager": 2.4.3 - "@docusaurus/plugin-sitemap": 2.4.3 - "@docusaurus/theme-classic": 2.4.3 - "@docusaurus/theme-common": 2.4.3 - "@docusaurus/theme-search-algolia": 2.4.3 - "@docusaurus/types": 2.4.3 + "@docusaurus/core": 3.0.0 + "@docusaurus/plugin-content-blog": 3.0.0 + "@docusaurus/plugin-content-docs": 3.0.0 + "@docusaurus/plugin-content-pages": 3.0.0 + "@docusaurus/plugin-debug": 3.0.0 + "@docusaurus/plugin-google-analytics": 3.0.0 + "@docusaurus/plugin-google-gtag": 3.0.0 + "@docusaurus/plugin-google-tag-manager": 3.0.0 + "@docusaurus/plugin-sitemap": 3.0.0 + "@docusaurus/theme-classic": 3.0.0 + "@docusaurus/theme-common": 3.0.0 + "@docusaurus/theme-search-algolia": 3.0.0 + "@docusaurus/types": 3.0.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 2ab1e2a8f4e3b80edf1b6e8900d0c49976ff1e05b74ee5cc1d9c41b805f1dbc5948f1ad01189278682f2cbb4269dfa1d0ea0e73e3defc7406522ff047bc06321 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 5630380413afbf57c3acbf2fb481ad9d54b0ed599fb7c778ac0f005203c7ceb98e231e5a83918dbe16942608b863f3ff2bc13ffbb0b251003fad986869dbc05a languageName: node linkType: hard @@ -2103,178 +2339,185 @@ __metadata: languageName: node linkType: hard -"@docusaurus/theme-classic@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/theme-classic@npm:2.4.3" - dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/mdx-loader": 2.4.3 - "@docusaurus/module-type-aliases": 2.4.3 - "@docusaurus/plugin-content-blog": 2.4.3 - "@docusaurus/plugin-content-docs": 2.4.3 - "@docusaurus/plugin-content-pages": 2.4.3 - "@docusaurus/theme-common": 2.4.3 - "@docusaurus/theme-translations": 2.4.3 - "@docusaurus/types": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-common": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - "@mdx-js/react": ^1.6.22 +"@docusaurus/theme-classic@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/theme-classic@npm:3.0.0" + dependencies: + "@docusaurus/core": 3.0.0 + "@docusaurus/mdx-loader": 3.0.0 + "@docusaurus/module-type-aliases": 3.0.0 + "@docusaurus/plugin-content-blog": 3.0.0 + "@docusaurus/plugin-content-docs": 3.0.0 + "@docusaurus/plugin-content-pages": 3.0.0 + "@docusaurus/theme-common": 3.0.0 + "@docusaurus/theme-translations": 3.0.0 + "@docusaurus/types": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-common": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + "@mdx-js/react": ^3.0.0 clsx: ^1.2.1 - copy-text-to-clipboard: ^3.0.1 + copy-text-to-clipboard: ^3.2.0 infima: 0.2.0-alpha.43 lodash: ^4.17.21 nprogress: ^0.2.0 - postcss: ^8.4.14 - prism-react-renderer: ^1.3.5 - prismjs: ^1.28.0 - react-router-dom: ^5.3.3 - rtlcss: ^3.5.0 - tslib: ^2.4.0 + postcss: ^8.4.26 + prism-react-renderer: ^2.1.0 + prismjs: ^1.29.0 + react-router-dom: ^5.3.4 + rtlcss: ^4.1.0 + tslib: ^2.6.0 utility-types: ^3.10.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 18d2c997e416f8f933781db522f48ed2ee5d89ea80822f33ab0b4056d3866f9890cf19fdbd8e90839625aad858dcc7c63c1cf52c737a1d4ac8272606e505ec88 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 226859b735d1aad7649c9bd3c0a1e12524f367643cf653497945e5e99b2bd97a57c1b95a285ee631ad1464e092186aede5e84ac8f3c6fa500ccaae922d6d9e3a languageName: node linkType: hard -"@docusaurus/theme-common@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/theme-common@npm:2.4.3" - dependencies: - "@docusaurus/mdx-loader": 2.4.3 - "@docusaurus/module-type-aliases": 2.4.3 - "@docusaurus/plugin-content-blog": 2.4.3 - "@docusaurus/plugin-content-docs": 2.4.3 - "@docusaurus/plugin-content-pages": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-common": 2.4.3 +"@docusaurus/theme-common@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/theme-common@npm:3.0.0" + dependencies: + "@docusaurus/mdx-loader": 3.0.0 + "@docusaurus/module-type-aliases": 3.0.0 + "@docusaurus/plugin-content-blog": 3.0.0 + "@docusaurus/plugin-content-docs": 3.0.0 + "@docusaurus/plugin-content-pages": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-common": 3.0.0 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" clsx: ^1.2.1 parse-numeric-range: ^1.3.0 - prism-react-renderer: ^1.3.5 - tslib: ^2.4.0 - use-sync-external-store: ^1.2.0 + prism-react-renderer: ^2.1.0 + tslib: ^2.6.0 utility-types: ^3.10.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: bb0c6e253a77a033d8041b7e042e67d28feb3fbc99a3c753fb45e1b4ffa38ce9f24d21b3363ff971d1d63bc34025ec5baf09a476a7c8eba372c94c5db24e8b34 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 89da7885651bf38667df6cb0e140581030a1af20e21c7ea5f9da7b2cdd5293619a14a0d73e12d841836c37ec95173b9fce45c17025fb59ec1cd9a30a7a9a9a3d languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/theme-search-algolia@npm:2.4.3" - dependencies: - "@docsearch/react": ^3.1.1 - "@docusaurus/core": 2.4.3 - "@docusaurus/logger": 2.4.3 - "@docusaurus/plugin-content-docs": 2.4.3 - "@docusaurus/theme-common": 2.4.3 - "@docusaurus/theme-translations": 2.4.3 - "@docusaurus/utils": 2.4.3 - "@docusaurus/utils-validation": 2.4.3 - algoliasearch: ^4.13.1 - algoliasearch-helper: ^3.10.0 +"@docusaurus/theme-search-algolia@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/theme-search-algolia@npm:3.0.0" + dependencies: + "@docsearch/react": ^3.5.2 + "@docusaurus/core": 3.0.0 + "@docusaurus/logger": 3.0.0 + "@docusaurus/plugin-content-docs": 3.0.0 + "@docusaurus/theme-common": 3.0.0 + "@docusaurus/theme-translations": 3.0.0 + "@docusaurus/utils": 3.0.0 + "@docusaurus/utils-validation": 3.0.0 + algoliasearch: ^4.18.0 + algoliasearch-helper: ^3.13.3 clsx: ^1.2.1 - eta: ^2.0.0 - fs-extra: ^10.1.0 + eta: ^2.2.0 + fs-extra: ^11.1.1 lodash: ^4.17.21 - tslib: ^2.4.0 + tslib: ^2.6.0 utility-types: ^3.10.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 657974a334ecaf96e8901af1c56c716b2d18e188420c828740dea12e04f49897108c621fb49319ce2b6ed82fc09ceb6931deb242ac35d0a42b96e9fad4275567 + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: d90b846e9dce18a530cb9c0be9fb885667ebe5947d2ef92d8f385870fc6de837e627ef9ad6373444b4974e0dc6d093ca5d91f5eafbf024da180bb520fc57fea1 languageName: node linkType: hard -"@docusaurus/theme-translations@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/theme-translations@npm:2.4.3" +"@docusaurus/theme-translations@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/theme-translations@npm:3.0.0" dependencies: - fs-extra: ^10.1.0 - tslib: ^2.4.0 - checksum: 6b3765b73453e05e2d4b4f90a30373d1e8511ede04a6f0134157a7d79ef0f27d7a8990b30e932c769fc51058942943b01b82d73c3acae7d2573a7075e00d97dd + fs-extra: ^11.1.1 + tslib: ^2.6.0 + checksum: b47d3e5068850c895d9826303992e6e8381f861027b3e761510d6ae47a5498d8534b47c19d9aea212cc2707ea4b62b455700dd7bc2c1fa9a271e11e0ef823503 + languageName: node + linkType: hard + +"@docusaurus/tsconfig@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/tsconfig@npm:3.0.0" + checksum: 429db512db045cd3708d794eca3c51b97cf756e36bc16ebcc92144bdbcf2bf5e960600871121a8c177a0520c548e60bdfed5eba551c7ae13aafa409d493855ae languageName: node linkType: hard -"@docusaurus/types@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/types@npm:2.4.3" +"@docusaurus/types@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/types@npm:3.0.0" dependencies: "@types/history": ^4.7.11 "@types/react": "*" commander: ^5.1.0 - joi: ^17.6.0 + joi: ^17.9.2 react-helmet-async: ^1.3.0 utility-types: ^3.10.0 - webpack: ^5.73.0 - webpack-merge: ^5.8.0 + webpack: ^5.88.1 + webpack-merge: ^5.9.0 peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 71ae109849862629033cc2f275b1064c1e2dde7f39b065793320fc1a442c40353fcc8730a7274da9814c577a059f0ddb956429228ad407ada6c0f5b5816d0aee + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 3fdb6ccd795924cfa3fc33f37cd3224f1b41337927e068444c82c70059c4f2182d9d60bd9955d8215a4b5f0b6b619b8afbedbb5e90092c40acf3db53e092fd2b languageName: node linkType: hard -"@docusaurus/utils-common@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/utils-common@npm:2.4.3" +"@docusaurus/utils-common@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/utils-common@npm:3.0.0" dependencies: - tslib: ^2.4.0 + tslib: ^2.6.0 peerDependencies: "@docusaurus/types": "*" peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: 6810da88b7b2df0031ec40e9f73f34eef6c8457a40a5719eef8c8e351f880a0666570a0ed77aea9b3d85c17fedc77b9a8b58ac4426fb4f11e34bc6994601ced3 + checksum: 072edfd6a2722ee4b3988f107362e17bb9f05024851d033b201f468a2d363539f962772ec8b5f1399faa38586c5decf080a0ffb2fd981ed5a18ddeb7a982e9a7 languageName: node linkType: hard -"@docusaurus/utils-validation@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/utils-validation@npm:2.4.3" +"@docusaurus/utils-validation@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/utils-validation@npm:3.0.0" dependencies: - "@docusaurus/logger": 2.4.3 - "@docusaurus/utils": 2.4.3 - joi: ^17.6.0 + "@docusaurus/logger": 3.0.0 + "@docusaurus/utils": 3.0.0 + joi: ^17.9.2 js-yaml: ^4.1.0 - tslib: ^2.4.0 - checksum: cb8e2dc5201870ef7c42e89389ab9f0d43c2ff5be26793aa1be9432d9d3510f1696a41108e99aac439308606d8496d5b038776c4037f3925aadedeae1d56148f + tslib: ^2.6.0 + checksum: 80cd186db7d2deb46580200045b8c411e66980fa7e10b347a15d81e5f99e2a91099a34a629beda69536c6182e1f29c0ca9102bcf240a2684ec0fe7517e0e61ce languageName: node linkType: hard -"@docusaurus/utils@npm:2.4.3": - version: 2.4.3 - resolution: "@docusaurus/utils@npm:2.4.3" +"@docusaurus/utils@npm:3.0.0": + version: 3.0.0 + resolution: "@docusaurus/utils@npm:3.0.0" dependencies: - "@docusaurus/logger": 2.4.3 - "@svgr/webpack": ^6.2.1 + "@docusaurus/logger": 3.0.0 + "@svgr/webpack": ^6.5.1 escape-string-regexp: ^4.0.0 file-loader: ^6.2.0 - fs-extra: ^10.1.0 - github-slugger: ^1.4.0 + fs-extra: ^11.1.1 + github-slugger: ^1.5.0 globby: ^11.1.0 gray-matter: ^4.0.3 + jiti: ^1.20.0 js-yaml: ^4.1.0 lodash: ^4.17.21 micromatch: ^4.0.5 resolve-pathname: ^3.0.0 shelljs: ^0.8.5 - tslib: ^2.4.0 + tslib: ^2.6.0 url-loader: ^4.1.1 - webpack: ^5.73.0 + webpack: ^5.88.1 peerDependencies: "@docusaurus/types": "*" peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: 84e11e0245b11f7c611297ede2deb4598dbfb62e14a7146199f6bfb0306c35d015336a2c220fb902e4d35ba432ffe86bc48a03125c4fd1f295570965f58065d2 + checksum: 74095238c5704cb29de0b700981ea237018788de1340049dc9f03d5d15b0894ec3edf040da8faffc5ccf4a8cd5f6f3d974287b3cc1ab4818d3894c787bbccd5a languageName: node linkType: hard @@ -2301,6 +2544,29 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": ^0.27.8 + checksum: b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": ^29.6.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": version: 0.3.2 resolution: "@jridgewell/gen-mapping@npm:0.3.2" @@ -2343,6 +2609,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.5 + resolution: "@jridgewell/source-map@npm:0.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: b985d9ebd833a21a6e9ace820c8a76f60345a34d9e28d98497c16b6e93ce1f131bff0abd45f8585f14aa382cce678ed680d628c631b40a9616a19cfbc2049b68 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.11 resolution: "@jridgewell/sourcemap-codec@npm:1.4.11" @@ -2357,16 +2633,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.0, @jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.14 - resolution: "@jridgewell/trace-mapping@npm:0.3.14" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: 54824bf17cc25b741c434f24ded7bcc5a2fd1f67da009829266eb2eb04152883f5f13e0e6ca0392e59a2bb7db4fe2930e105c9488827a2b78c78eb6253c3c9d1 - languageName: node - linkType: hard - "@jridgewell/trace-mapping@npm:^0.3.17": version: 0.3.20 resolution: "@jridgewell/trace-mapping@npm:0.3.20" @@ -2377,6 +2643,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.14 + resolution: "@jridgewell/trace-mapping@npm:0.3.14" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 54824bf17cc25b741c434f24ded7bcc5a2fd1f67da009829266eb2eb04152883f5f13e0e6ca0392e59a2bb7db4fe2930e105c9488827a2b78c78eb6253c3c9d1 + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.3 resolution: "@leichtgewicht/ip-codec@npm:2.0.3" @@ -2384,46 +2660,61 @@ __metadata: languageName: node linkType: hard -"@mdx-js/mdx@npm:^1.6.22": - version: 1.6.22 - resolution: "@mdx-js/mdx@npm:1.6.22" +"@mdx-js/mdx@npm:^3.0.0": + version: 3.0.0 + resolution: "@mdx-js/mdx@npm:3.0.0" + dependencies: + "@types/estree": ^1.0.0 + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdx": ^2.0.0 + collapse-white-space: ^2.0.0 + devlop: ^1.0.0 + estree-util-build-jsx: ^3.0.0 + estree-util-is-identifier-name: ^3.0.0 + estree-util-to-js: ^2.0.0 + estree-walker: ^3.0.0 + hast-util-to-estree: ^3.0.0 + hast-util-to-jsx-runtime: ^2.0.0 + markdown-extensions: ^2.0.0 + periscopic: ^3.0.0 + remark-mdx: ^3.0.0 + remark-parse: ^11.0.0 + remark-rehype: ^11.0.0 + source-map: ^0.7.0 + unified: ^11.0.0 + unist-util-position-from-estree: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + checksum: 42e631bc12f5dda528f00833f9592d05f4728fc673209f4cb08948c45751c479724f890379810baf60dfa32857793644c8ceb868f162f3798d81caa775b89aac + languageName: node + linkType: hard + +"@mdx-js/react@npm:3.0.0, @mdx-js/react@npm:^3.0.0": + version: 3.0.0 + resolution: "@mdx-js/react@npm:3.0.0" dependencies: - "@babel/core": 7.12.9 - "@babel/plugin-syntax-jsx": 7.12.1 - "@babel/plugin-syntax-object-rest-spread": 7.8.3 - "@mdx-js/util": 1.6.22 - babel-plugin-apply-mdx-type-prop: 1.6.22 - babel-plugin-extract-import-names: 1.6.22 - camelcase-css: 2.0.1 - detab: 2.0.4 - hast-util-raw: 6.0.1 - lodash.uniq: 4.5.0 - mdast-util-to-hast: 10.0.1 - remark-footnotes: 2.0.0 - remark-mdx: 1.6.22 - remark-parse: 8.0.3 - remark-squeeze-paragraphs: 4.0.0 - style-to-object: 0.3.0 - unified: 9.2.0 - unist-builder: 2.0.3 - unist-util-visit: 2.0.3 - checksum: 7f4c38911fc269159834240d3cc9279839145022a992bd61657530750c7ab5d0f674e8d6319b6e2e426d0e1adc6cc5ab1876e57548208783d8a3d1b8ef73ebca - languageName: node - linkType: hard - -"@mdx-js/react@npm:1.6.22, @mdx-js/react@npm:^1.6.22": - version: 1.6.22 - resolution: "@mdx-js/react@npm:1.6.22" + "@types/mdx": ^2.0.0 peerDependencies: - react: ^16.13.1 || ^17.0.0 - checksum: ed896671ffab04c1f11cdba45bfb2786acff58cd0b749b0a13d9b7a7022ac75cc036bec067ca946e6540e2934727e0ba8bf174e4ae10c916f30cda6aecac8992 + "@types/react": ">=16" + react: ">=16" + checksum: 865f6ebc7ae83c6cb9f7e92db4eddd3f85cd1664391643b4736887ddc32b0ddb5aec012db6fbc9b486b552e08e6d5ad800450fcd9d51c20665667ff0f174d966 languageName: node linkType: hard -"@mdx-js/util@npm:1.6.22": - version: 1.6.22 - resolution: "@mdx-js/util@npm:1.6.22" - checksum: 2ee8da6afea0f42297ea31f52b1d50d228744d2895cce7cc9571b7d5ce97c7c96037c80b6dbcded9caa8099c9a994eda62980099eabe1c000aaa792816c66f10 +"@microlink/react-json-view@npm:^1.22.2": + version: 1.23.0 + resolution: "@microlink/react-json-view@npm:1.23.0" + dependencies: + flux: ~4.0.1 + react-base16-styling: ~0.6.0 + react-lifecycles-compat: ~3.0.4 + react-textarea-autosize: ~8.3.2 + peerDependencies: + react: ">= 15" + react-dom: ">= 15" + checksum: 6728719c49bb2c38280e1fb521a8fae676915d9724b56854430114c78da0491633758b3e146eb87ddc5ae4d881dd3afa10a66f39f15b97887604944c2d1c6360 languageName: node linkType: hard @@ -2474,6 +2765,33 @@ __metadata: languageName: node linkType: hard +"@pnpm/config.env-replace@npm:^1.1.0": + version: 1.1.0 + resolution: "@pnpm/config.env-replace@npm:1.1.0" + checksum: 4cfc4a5c49ab3d0c6a1f196cfd4146374768b0243d441c7de8fa7bd28eaab6290f514b98490472cc65dbd080d34369447b3e9302585e1d5c099befd7c8b5e55f + languageName: node + linkType: hard + +"@pnpm/network.ca-file@npm:^1.0.1": + version: 1.0.2 + resolution: "@pnpm/network.ca-file@npm:1.0.2" + dependencies: + graceful-fs: 4.2.10 + checksum: 95f6e0e38d047aca3283550719155ce7304ac00d98911e4ab026daedaf640a63bd83e3d13e17c623fa41ac72f3801382ba21260bcce431c14fbbc06430ecb776 + languageName: node + linkType: hard + +"@pnpm/npm-conf@npm:^2.1.0": + version: 2.2.2 + resolution: "@pnpm/npm-conf@npm:2.2.2" + dependencies: + "@pnpm/config.env-replace": ^1.1.0 + "@pnpm/network.ca-file": ^1.0.1 + config-chain: ^1.1.11 + checksum: 71393dcfce85603fddd8484b486767163000afab03918303253ae97992615b91d25942f83751366cb40ad2ee32b0ae0a033561de9d878199a024286ff98b0296 + languageName: node + linkType: hard + "@polka/url@npm:^1.0.0-next.20": version: 1.0.0-next.21 resolution: "@polka/url@npm:1.0.0-next.21" @@ -2490,7 +2808,7 @@ __metadata: languageName: node linkType: hard -"@sideway/formula@npm:^3.0.0": +"@sideway/formula@npm:^3.0.1": version: 3.0.1 resolution: "@sideway/formula@npm:3.0.1" checksum: 3fe81fa9662efc076bf41612b060eb9b02e846ea4bea5bd114f1662b7f1541e9dedcf98aff0d24400bcb92f113964a50e0290b86e284edbdf6346fa9b7e2bf2c @@ -2504,10 +2822,35 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^0.14.0": - version: 0.14.0 - resolution: "@sindresorhus/is@npm:0.14.0" - checksum: 7247aa9314d4fc3df9b3f63d8b5b962a89c7600a5db1f268546882bfc4d31a975a899f5f42a09dd41a11e58636e6402f7c40f92df853aee417247bb11faee9a0 +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^3.1.2": + version: 3.1.2 + resolution: "@sindresorhus/is@npm:3.1.2" + checksum: d83b11a6f2bd41aaf87255bf1c5e83ee59bd13b46f5632cb94c80d077194c68de1060efaa9e624179bef96f51a016c9e3942deaf162f5c939fa396e0be630754 + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^5.2.0": + version: 5.6.0 + resolution: "@sindresorhus/is@npm:5.6.0" + checksum: 66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52 + languageName: node + linkType: hard + +"@slorber/remark-comment@npm:^1.0.0": + version: 1.0.0 + resolution: "@slorber/remark-comment@npm:1.0.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.1.0 + micromark-util-symbol: ^1.0.1 + checksum: b8da9d8f560740959c421d3ce5be43952eace1c95cb65402d9473a15e66463346a37fb5f121a6b22a83af51e8845b0b4ff3c321f14ce31bd58fb126acf6c8ed9 languageName: node linkType: hard @@ -2522,166 +2865,168 @@ __metadata: languageName: node linkType: hard -"@svgr/babel-plugin-add-jsx-attribute@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.0.0" +"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f6ed59a63c9c339192627108e51a2aacbe44176a96d45a9b32f3334aabbcba1ac5c76b0a3e5f3823fb5a74b5effa5094490e9100134435bf7a9bc2ce6a94333b + checksum: a13ed0797189d5497890530449029bec388310e260a96459e304e2729e7a2cf4d20d34f882d9a77ccce73dd3d36065afbb6987258fdff618d7d57955065a8ad4 languageName: node linkType: hard -"@svgr/babel-plugin-remove-jsx-attribute@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:6.0.0" +"@svgr/babel-plugin-remove-jsx-attribute@npm:*": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1c70254159cccbf586a0f4101751c3df43a010e679bd580613ca9bd9ed314477081aeeb85c9fe4e63b0911345586e5b1272ca7fd0ee2c2efef162f6bb35406a4 + checksum: 8a98e59bd9971e066815b4129409932f7a4db4866834fe75677ea6d517972fb40b380a69a4413189f20e7947411f9ab1b0f029dd5e8068686a5a0188d3ccd4c7 languageName: node linkType: hard -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:6.0.0" +"@svgr/babel-plugin-remove-jsx-empty-expression@npm:*": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0754a56e3c97e887716002f30ac78e0cf8020d9915252e2b52d87b013dab7c4ef3f1edf59830f0f543e6c86584c4706458cd61d2849daf8fe541a773a3c6b51d + checksum: 517dcca75223bd05d3f056a8514dbba3031278bea4eadf0842c576d84f4651e7a4e0e7082d3ee4ef42456de0f9c4531d8a1917c04876ca64b014b859ca8f1bde languageName: node linkType: hard -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:6.0.0" +"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:6.5.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cde14efa3fda183c499b40da7a45e296a84e9001b60ac91c728285801dbefae2d363c4f930d10afe09b6f283137eb5a5cc7c0b7c4a9b9ecd3fff6f401607201c + checksum: 318786787c9a217c33a7340c8856436858e1fffa5a6df635fedc6b9a371f3afea080ea074b9e3cfbbd9dd962ead924fde8bc9855a394c38dd60e391883a58c81 languageName: node linkType: hard -"@svgr/babel-plugin-svg-dynamic-title@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:6.0.0" +"@svgr/babel-plugin-svg-dynamic-title@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:6.5.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7ba7f32da5e6e7d4a3f876791201f58294d2fecc058eedace6af8d4f35466f60602956b7c38693cb92692680ad3dbf5774843779e3ed46110584fcc12e97e174 + checksum: 16ef228c793b909fec47dd7dc05c1c3c2d77a824f42055df37e141e0534081b1bc4aec6dcc51be50c221df9f262f59270fc1c379923bfd4f5db302abafabfd8d languageName: node linkType: hard -"@svgr/babel-plugin-svg-em-dimensions@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:6.0.0" +"@svgr/babel-plugin-svg-em-dimensions@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:6.5.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e776f3425e25b3f6d37ccf66da8f08610c86096f61d01d9fb865b797a03795ff8c1892c370cf0eaced4b740548a0714af4d2db0888efb9df6793612d82e8f514 + checksum: dfdd5cbe6ae543505eaa0da69df0735b7407294c4b0504b3e74c0e7e371f1acb914eb99fd21ff39ef5bd626b3474f064a4cccc50f41b7c556ee834f9a6d6610a languageName: node linkType: hard -"@svgr/babel-plugin-transform-react-native-svg@npm:^6.0.0": - version: 6.0.0 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:6.0.0" +"@svgr/babel-plugin-transform-react-native-svg@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:6.5.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 61389f7ba8bb550aad2dbe7c5383f72c7080081194820fc3a32ed52dd79eb82099365d9807cdf817732f01ee37796a59fd17628a410924343d8e8dd380f76710 + checksum: 332fbf3bbc19d938b744440dbab9c8acd8f7a2ed6bf9c4e23f40e3f2c25615a60b3bf00902a4f1f6c20b5f382a1547b3acc6f2b2d70d80e532b5d45945f1b979 languageName: node linkType: hard -"@svgr/babel-plugin-transform-svg-component@npm:^6.2.0": - version: 6.2.0 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:6.2.0" +"@svgr/babel-plugin-transform-svg-component@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-plugin-transform-svg-component@npm:6.5.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 36e18245151fe146f4b00adad278e931171824c134f1db80891604d9b06182d06e236cd4eacfe618571300b6050fea2e9f9ab64e1746e7411a519a21ac70e202 + checksum: 8d9e1c7c62abce23837e53cdacc6d09bc1f1f2b0ad7322105001c097995e9aa8dca4fa41acf39148af69f342e40081c438106949fb083e997ca497cb0448f27d languageName: node linkType: hard -"@svgr/babel-preset@npm:^6.2.0": - version: 6.2.0 - resolution: "@svgr/babel-preset@npm:6.2.0" +"@svgr/babel-preset@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/babel-preset@npm:6.5.1" dependencies: - "@svgr/babel-plugin-add-jsx-attribute": ^6.0.0 - "@svgr/babel-plugin-remove-jsx-attribute": ^6.0.0 - "@svgr/babel-plugin-remove-jsx-empty-expression": ^6.0.0 - "@svgr/babel-plugin-replace-jsx-attribute-value": ^6.0.0 - "@svgr/babel-plugin-svg-dynamic-title": ^6.0.0 - "@svgr/babel-plugin-svg-em-dimensions": ^6.0.0 - "@svgr/babel-plugin-transform-react-native-svg": ^6.0.0 - "@svgr/babel-plugin-transform-svg-component": ^6.2.0 + "@svgr/babel-plugin-add-jsx-attribute": ^6.5.1 + "@svgr/babel-plugin-remove-jsx-attribute": "*" + "@svgr/babel-plugin-remove-jsx-empty-expression": "*" + "@svgr/babel-plugin-replace-jsx-attribute-value": ^6.5.1 + "@svgr/babel-plugin-svg-dynamic-title": ^6.5.1 + "@svgr/babel-plugin-svg-em-dimensions": ^6.5.1 + "@svgr/babel-plugin-transform-react-native-svg": ^6.5.1 + "@svgr/babel-plugin-transform-svg-component": ^6.5.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4c25eecc1d30f5386f14bd6db18591436d95a59adf88fbaae16027e767bfdc480714ca3cd8241dd04e2fe04e73835182ae610261c4216c226fadc345359feab6 + checksum: 8e8d7a0049279152f9ac308fbfd4ce74063d8a376154718cba6309bae4316318804a32201c75c5839c629f8e1e5d641a87822764000998161d0fc1de24b0374a languageName: node linkType: hard -"@svgr/core@npm:^6.2.1": - version: 6.2.1 - resolution: "@svgr/core@npm:6.2.1" +"@svgr/core@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/core@npm:6.5.1" dependencies: - "@svgr/plugin-jsx": ^6.2.1 + "@babel/core": ^7.19.6 + "@svgr/babel-preset": ^6.5.1 + "@svgr/plugin-jsx": ^6.5.1 camelcase: ^6.2.0 cosmiconfig: ^7.0.1 - checksum: fde92ae9bdff368f58d2cc9ec163d1da53ab790f5c06a09e505d4030337b4ad4288087e5864a83640031ed4ecdafae1ff8e5f2a38393d152264496bbd18e36bf + checksum: 60cce11e13391171132115dcc8da592d23e51f155ebadf9b819bd1836b8c13d40aa5c30a03a7d429f65e70a71c50669b2e10c94e4922de4e58bc898275f46c05 languageName: node linkType: hard -"@svgr/hast-util-to-babel-ast@npm:^6.2.1": - version: 6.2.1 - resolution: "@svgr/hast-util-to-babel-ast@npm:6.2.1" +"@svgr/hast-util-to-babel-ast@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/hast-util-to-babel-ast@npm:6.5.1" dependencies: - "@babel/types": ^7.15.6 - entities: ^3.0.1 - checksum: 44b22a926004044807ca6b2bfa69bd492864bdd41c971912cde236111f740c503a50fa2bb120497980d3fecc8a56d247e0646de11db32399d1ac08a7b7b77039 + "@babel/types": ^7.20.0 + entities: ^4.4.0 + checksum: 18fa37b36581ba1678f5cc5a05ce0411e08df4db267f3cd900af7ffdf5bd90522f3a46465f315cd5d7345264949479133930aafdd27ce05c474e63756196256f languageName: node linkType: hard -"@svgr/plugin-jsx@npm:^6.2.1": - version: 6.2.1 - resolution: "@svgr/plugin-jsx@npm:6.2.1" +"@svgr/plugin-jsx@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/plugin-jsx@npm:6.5.1" dependencies: - "@babel/core": ^7.15.5 - "@svgr/babel-preset": ^6.2.0 - "@svgr/hast-util-to-babel-ast": ^6.2.1 - svg-parser: ^2.0.2 + "@babel/core": ^7.19.6 + "@svgr/babel-preset": ^6.5.1 + "@svgr/hast-util-to-babel-ast": ^6.5.1 + svg-parser: ^2.0.4 peerDependencies: "@svgr/core": ^6.0.0 - checksum: 6de4229a888902fb8b8026232b87e0b4bce7c50c0ecb24c78779f4c6702dbaf7879da278871ab6c95eac0d9b27e0993d22e8ca65868033f0eba3a08c0a18d87d + checksum: 365da6e43ceeff6b49258fa2fbb3c880210300e4a85ba74831e92d2dc9c53e6ab8dda422dc33fb6a339803227cf8d9a0024ce769401c46fd87209abe36d5ae43 languageName: node linkType: hard -"@svgr/plugin-svgo@npm:^6.2.0": - version: 6.2.0 - resolution: "@svgr/plugin-svgo@npm:6.2.0" +"@svgr/plugin-svgo@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/plugin-svgo@npm:6.5.1" dependencies: cosmiconfig: ^7.0.1 deepmerge: ^4.2.2 - svgo: ^2.5.0 + svgo: ^2.8.0 peerDependencies: - "@svgr/core": ^6.0.0 - checksum: 29a95f7481df2bcba190caef25407df91538c143990c1701770957788d0048648e12efb8f9ad4ddf9d69463b58602d3bf9cfff434cc91d312d26fdfb986d6593 + "@svgr/core": "*" + checksum: da40e461145af1a92fd2ec50ea64626681fa73786f218497a4b4fb85393a58812999ca2744ee33bb7ab771aa5ce9ab1dbd08a189cb3d7a89fb58fd96913ddf91 languageName: node linkType: hard -"@svgr/webpack@npm:^6.2.1": - version: 6.2.1 - resolution: "@svgr/webpack@npm:6.2.1" +"@svgr/webpack@npm:^6.5.1": + version: 6.5.1 + resolution: "@svgr/webpack@npm:6.5.1" dependencies: - "@babel/core": ^7.15.5 - "@babel/plugin-transform-react-constant-elements": ^7.14.5 - "@babel/preset-env": ^7.15.6 - "@babel/preset-react": ^7.14.5 - "@babel/preset-typescript": ^7.15.0 - "@svgr/core": ^6.2.1 - "@svgr/plugin-jsx": ^6.2.1 - "@svgr/plugin-svgo": ^6.2.0 - checksum: 01d729b770340a0cde69e8924945e0a93494eeb717fe5ebf1d8624075748314d4c7a0fa44159d53b85915bdf2efbfc3f9f7b5b084074a2892f6286a36c95ff5d + "@babel/core": ^7.19.6 + "@babel/plugin-transform-react-constant-elements": ^7.18.12 + "@babel/preset-env": ^7.19.4 + "@babel/preset-react": ^7.18.6 + "@babel/preset-typescript": ^7.18.6 + "@svgr/core": ^6.5.1 + "@svgr/plugin-jsx": ^6.5.1 + "@svgr/plugin-svgo": ^6.5.1 + checksum: 3e9edfbc2ef3dc07b5f50c9c5ff5c951048511dff9dffb0407e6d15343849dfb36099fc7e1e3911429382cab81f7735a86ba1d6f77d21bb8f9ca33a5dec4824a languageName: node linkType: hard -"@szmarczak/http-timer@npm:^1.1.2": - version: 1.1.2 - resolution: "@szmarczak/http-timer@npm:1.1.2" +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" dependencies: - defer-to-connect: ^1.0.1 - checksum: 0594140e027ce4e98970c6d176457fcbff80900b1b3101ac0d08628ca6d21d70e0b94c6aaada94d4f76c1423fcc7195af83da145ce0fd556fc0595ca74a17b8b + defer-to-connect: ^2.0.1 + checksum: 4629d2fbb2ea67c2e9dc03af235c0991c79ebdddcbc19aed5d5732fb29ce01c13331e9b1a491584b9069bd6ecde6581dcbf871f11b7eefdebbab34de6cf2197e languageName: node linkType: hard @@ -2699,10 +3044,12 @@ __metadata: languageName: node linkType: hard -"@tsconfig/docusaurus@npm:2.0.2": - version: 2.0.2 - resolution: "@tsconfig/docusaurus@npm:2.0.2" - checksum: af39e4c07f8d74c53162bc8cf756efb5ce1112e776e0c7ab6e85e156a1209179ed3d284378f85ab1d9259f081d89d9d883090021460bcfacf3ae54d908fbd2b1 +"@types/acorn@npm:^4.0.0": + version: 4.0.6 + resolution: "@types/acorn@npm:4.0.6" + dependencies: + "@types/estree": "*" + checksum: 5a65a1d7e91fc95703f0a717897be60fa7ccd34b17f5462056274a246e6690259fe0a1baabc86fd3260354f87245cb3dc483346d7faad2b78fc199763978ede9 languageName: node linkType: hard @@ -2744,6 +3091,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.0.0": + version: 4.1.10 + resolution: "@types/debug@npm:4.1.10" + dependencies: + "@types/ms": "*" + checksum: b3479ffdfd141809b165944d3b3bf3b6a70f95064228a4fa0ff470a25c8ab3f3db7b9f5be0a7460dc9d6fe3595bdb4cbc088c9102bd7afa596dba754f0585ead + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.3": version: 3.7.3 resolution: "@types/eslint-scope@npm:3.7.3" @@ -2764,13 +3120,29 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^0.0.51": +"@types/estree-jsx@npm:^1.0.0": + version: 1.0.2 + resolution: "@types/estree-jsx@npm:1.0.2" + dependencies: + "@types/estree": "*" + checksum: 12ae4b0c2de8bd3b4fc303a2888af1e497db279b8a08c4170d25cc91394d61bb39b5476d5afd792099f6f1bebc8a5f59c3cf5a2716acf8ae7d3889e71cdb262e + languageName: node + linkType: hard + +"@types/estree@npm:*": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" checksum: a70c60d5e634e752fcd45b58c9c046ef22ad59ede4bc93ad5193c7e3b736ebd6bcd788ade59d9c3b7da6eeb0939235f011d4c59bb4fc04d8c346b76035099dd1 languageName: node linkType: hard +"@types/estree@npm:^1.0.0": + version: 1.0.4 + resolution: "@types/estree@npm:1.0.4" + checksum: de2abd990fb9b36583ab25d6a5898938eac076cf3e47f11ffc8cf9e3fdca1245807e0f166b6bf0924c7dab0676cc314ca8f749679ee5ea8a45771466ded25dd1 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18": version: 4.17.28 resolution: "@types/express-serve-static-core@npm:4.17.28" @@ -2794,12 +3166,19 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^2.0.0": - version: 2.3.4 - resolution: "@types/hast@npm:2.3.4" +"@types/gtag.js@npm:^0.0.12": + version: 0.0.12 + resolution: "@types/gtag.js@npm:0.0.12" + checksum: fee8f4c6e627301b89ab616c9e219bd53fa6ea1ffd1d0a8021e21363f0bdb2cf7eb1a5bcda0c6f1502186379bc7784ec29c932e21634f4e07f9e7a8c56887400 + languageName: node + linkType: hard + +"@types/hast@npm:^3.0.0": + version: 3.0.2 + resolution: "@types/hast@npm:3.0.2" dependencies: "@types/unist": "*" - checksum: 635cfe9a8e91f6b3c15c9929455d0136ac4d75c5b7f596ce21b453cecdfda785e89b10eb2b2d9da9d43e548b1d65ba3e20c741bbaf83823575c9c45001ade4bb + checksum: d1801cb01b5c8004f1825c2ea7c5e63d48eacdbf176b3d5b69b4af931fc07d2f525f4321662b5e25c1a5ab637a98f56b3fdb65b2f35fb890fc3145ab9bdedf0e languageName: node linkType: hard @@ -2817,7 +3196,14 @@ __metadata: languageName: node linkType: hard -"@types/http-proxy@npm:^1.17.8": +"@types/http-cache-semantics@npm:^4.0.2": + version: 4.0.3 + resolution: "@types/http-cache-semantics@npm:4.0.3" + checksum: 46e8e4d9ff8d032f0a12d08fb7250fc67ede0d566f9a5b3d92384098fb46a3892d3ec377600a1d73ea8a67a979b882f7b9ff5e29524fb76b8e1c44a0dbe04ecf + languageName: node + linkType: hard + +"@types/http-proxy@npm:^1.17.8": version: 1.17.8 resolution: "@types/http-proxy@npm:1.17.8" dependencies: @@ -2826,6 +3212,31 @@ __metadata: languageName: node linkType: hard +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": + version: 2.0.5 + resolution: "@types/istanbul-lib-coverage@npm:2.0.5" + checksum: e15cfc01a7ac60062f771314c959011bae7de7ceaef8e294f13427a11f21741cbfac98ad8cd9ecbf0e3d72ab7ddc327bacb3fab32c6b26ab19dbbbc1a69a9d3b + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.2 + resolution: "@types/istanbul-lib-report@npm:3.0.2" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: c168e425c95c167d83c7cbd65ff6b620cc53c5ef199a58428758586bbc28faf5c51291667e4455777b47ada12381e53fce7b92e32f431f85d8ac8025074d1908 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/istanbul-reports@npm:3.0.3" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: dcd8291370d9192aa980bf849309a7ca27e1d030ccc5e7edeef47d6612c2d57d611855543b9ffeb982d162a5ab2a44d8b40baa4dc93c1d7aa6fbcaeb16e69e78 + languageName: node + linkType: hard + "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.9 resolution: "@types/json-schema@npm:7.0.9" @@ -2833,21 +3244,19 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:^3.1.1": - version: 3.1.3 - resolution: "@types/keyv@npm:3.1.3" +"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": + version: 4.0.2 + resolution: "@types/mdast@npm:4.0.2" dependencies: - "@types/node": "*" - checksum: 094c40f06b45a4d20d9d679bdecb2119d81ff45c124e5b394889aa99f0e82ec1f346266a98e7b61e5f37df339bed7166813cc83da56f6e0804ebada1f00ba6ab + "@types/unist": "*" + checksum: f0191b0bec0908fbbfb21b268bffa652f79b2d32195e05328eed62a69e6b8c3e8f726b1ef7835d80dc348f8058103c74cf0a1de2eb0ce11842c6686088d02bb4 languageName: node linkType: hard -"@types/mdast@npm:^3.0.0": - version: 3.0.10 - resolution: "@types/mdast@npm:3.0.10" - dependencies: - "@types/unist": "*" - checksum: 375f08b3910505291b2815d9edf55dca63c6c4ec58dd33c866521e68905fd4e8fe83b397e167af2cdd3799b851a7e02817d58610cfb814aee20bf3c52d87be9b +"@types/mdx@npm:^2.0.0": + version: 2.0.9 + resolution: "@types/mdx@npm:2.0.9" + checksum: b6afd7adf039d64aaacd49f445dee4e5eba70a6199cc29df5d798c6704347bcd7c87868e59ec2614dd64127f74fad572c01d4e72ea08e7d23aa8f909fefafb87 languageName: node linkType: hard @@ -2858,6 +3267,22 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 0.7.33 + resolution: "@types/ms@npm:0.7.33" + checksum: ef610d94ebee838243af37800cb5d1a52b2ae0fb6880675fbb9276c0c4afcefda755f16889fa597ee4e5b377998a7e67b453614aae68d3225e5f7219984284df + languageName: node + linkType: hard + +"@types/node-forge@npm:^1.3.0": + version: 1.3.8 + resolution: "@types/node-forge@npm:1.3.8" + dependencies: + "@types/node": "*" + checksum: e02ba73e0a40b157ad31f798a3f0c8560524c75e8613a9761cb1ee640f7b7ea51ebebf6fce0224ef3713d6838643e81fa037ef1a1b2061cdeb2d142fb69d1955 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:^17.0.5": version: 17.0.21 resolution: "@types/node@npm:17.0.21" @@ -2872,10 +3297,10 @@ __metadata: languageName: node linkType: hard -"@types/parse5@npm:^5.0.0": - version: 5.0.3 - resolution: "@types/parse5@npm:5.0.3" - checksum: 7d7ebbcb704a0ef438aa0de43ea1fd9723dfa802b8fa459628ceaf063f092bd19791b2a2580265244898dcc9d40f7345588a76cf752847d29540539f802711ed +"@types/prismjs@npm:^1.26.0": + version: 1.26.2 + resolution: "@types/prismjs@npm:1.26.2" + checksum: b3f8b09d965ea5f580603ca9f5ffef22461374366fcc03a709ce777e4f214b085f74486252d917193e7c7559933cd042156a50e7d11fe1d032bcdf286d04bb0d languageName: node linkType: hard @@ -2900,7 +3325,7 @@ __metadata: languageName: node linkType: hard -"@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.6": +"@types/react-router-config@npm:*": version: 5.0.6 resolution: "@types/react-router-config@npm:5.0.6" dependencies: @@ -2911,6 +3336,17 @@ __metadata: languageName: node linkType: hard +"@types/react-router-config@npm:^5.0.7": + version: 5.0.9 + resolution: "@types/react-router-config@npm:5.0.9" + dependencies: + "@types/history": ^4.7.11 + "@types/react": "*" + "@types/react-router": ^5.1.0 + checksum: 6de88d94eb324d68a126d453438086bffc5f000acbbc60103a105ea12badbb177ded44d5359f86768f340ebdb1a46e26afa7c32db2c323ffb64b83c42086e5ad + languageName: node + linkType: hard + "@types/react-router-dom@npm:*": version: 5.3.3 resolution: "@types/react-router-dom@npm:5.3.3" @@ -2932,6 +3368,16 @@ __metadata: languageName: node linkType: hard +"@types/react-router@npm:^5.1.0": + version: 5.1.20 + resolution: "@types/react-router@npm:5.1.20" + dependencies: + "@types/history": ^4.7.11 + "@types/react": "*" + checksum: 1f7eee61981d2f807fa01a34a0ef98ebc0774023832b6611a69c7f28fdff01de5a38cabf399f32e376bf8099dcb7afaf724775bea9d38870224492bea4cb5737 + languageName: node + linkType: hard + "@types/react@npm:*": version: 17.0.39 resolution: "@types/react@npm:17.0.39" @@ -2943,15 +3389,6 @@ __metadata: languageName: node linkType: hard -"@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" - dependencies: - "@types/node": "*" - checksum: 474ac2402e6d43c007eee25f50d01eb1f67255ca83dd8e036877292bbe8dd5d2d1e50b54b408e233b50a8c38e681ff3ebeaf22f18b478056eddb65536abb003a - languageName: node - linkType: hard - "@types/retry@npm:^0.12.0": version: 0.12.1 resolution: "@types/retry@npm:0.12.1" @@ -3003,170 +3440,200 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:*, @types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2, @types/unist@npm:^2.0.3": +"@types/unist@npm:*, @types/unist@npm:^2.0.0": version: 2.0.6 resolution: "@types/unist@npm:2.0.6" checksum: 8690789328e8e10c487334341fcf879fd49f8987c98ce49849f9871052f95d87477735171bb661e6f551bdb95235e015dfdad1867ca1d9b5b88a053f72ac40eb languageName: node linkType: hard -"@types/ws@npm:^8.5.1": - version: 8.5.3 - resolution: "@types/ws@npm:8.5.3" +"@types/unist@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/unist@npm:3.0.1" + checksum: d57bfc86d8aa437451987b5ff7704cb37a7513ba1e58c080bbda0fbd6bd352ae3018fa229ad07ed3fabb969e9b9911984621f02479fe805e7d918682d24e9b45 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.5": + version: 8.5.8 + resolution: "@types/ws@npm:8.5.8" dependencies: "@types/node": "*" - checksum: af36857b804e6df615b401bacf34e9312f073ed9dbeda35be16ee3352d18a4449f27066169893166a6ec17ae51557c3adf8d232ac4a4a0226aafb3267e1f1b39 + checksum: a5b4a2b95acf1f3790add5fe1b72388628bf0e7643f29f265483b3dec506ab7d9decae74174fbaa0d43984f32c697ca8797959a1a560e8c9d54204295b1f7ff5 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.2 + resolution: "@types/yargs-parser@npm:21.0.2" + checksum: 422b8c59e21d9594e5a94afa45a3692d96c14f8fc7554bb1c1c390276815f09996ce0f8ed11893b6f8b2efc4ced686231dca5be6d76a4c4ceb56534474e95aca + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.30 + resolution: "@types/yargs@npm:17.0.30" + dependencies: + "@types/yargs-parser": "*" + checksum: 7e3b4de5aa406a408d93e8a282314c7b28160185322044eea6373c5a7625a47743dc17044fff1a6cde7d0c022ecfd8e78a4f9df9c01afc07b1df6b0e0e6275af + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.0.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ast@npm:1.11.1" +"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/ast@npm:1.11.6" dependencies: - "@webassemblyjs/helper-numbers": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - checksum: 6f75b09f17a29e704d2343967c53128cda7c84af2d192a3146de1b53cafaedfe568eca0804bd6c1acc72e1269477ae22d772de1dcf605cdb0adf9768f31d88d7 + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + checksum: e28476a183c8a1787adcf0e5df1d36ec4589467ab712c674fe4f6769c7fb19d1217bfb5856b3edd0f3e0a148ebae9e4bbb84110cee96664966dfef204d9c31fb languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" - checksum: 9644d9f7163d25aa301cf3be246e35cca9c472b70feda0593b1a43f30525c68d70bfb4b7f24624cd8e259579f1dee32ef28670adaeb3ab1314ffb52a25b831d5 +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" - checksum: 23e6f24100eb21779cd4dcc7c4231fd511622545a7638b195098bcfee79decb54a7e2b3295a12056c3042af7a5d8d62d4023a9194c9cba0311acb304ea20a292 +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" - checksum: ab662fc94a017538c538836387492567ed9f23fe4485a86de1834d61834e4327c24659830e1ecd2eea7690ce031a148b59c4724873dc5d3c0bdb71605c7d01af +"@webassemblyjs/helper-buffer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" + checksum: 55b5d67db95369cdb2a505ae7ebdf47194d49dfc1aecb0f5403277dcc899c7d3e1f07e8d279646adf8eafd89959272db62ca66fbe803321661ab184176ddfd3a languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 "@xtuc/long": 4.2.2 - checksum: 8cc7ced66dad8f968a68fbad551ba50562993cefa1add67b31ca6462bb986f7b21b5d7c6444c05dd39312126e10ac48def025dec6277ce0734665191e05acde7 + checksum: c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" - checksum: f14e2bd836fed1420fe7507919767de16346a013bbac97b6b6794993594f37b5f0591d824866a7b32f47524cef8a4a300e5f914952ff2b0ff28659714400c793 +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" +"@webassemblyjs/helper-wasm-section@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - checksum: e2da4192a843e96c8bf5156cea23193c9dbe12a1440c9c109d3393828f46753faab75fac78ecfe965aa7988723ad9b0b12f3ca0b9e4de75294980e67515460af + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + checksum: b79b19a63181f32e5ee0e786fa8264535ea5360276033911fae597d2de15e1776f028091d08c5a813a3901fd2228e74cd8c7e958fded064df734f00546bef8ce languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ieee754@npm:1.11.1" +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" dependencies: "@xtuc/ieee754": ^1.2.0 - checksum: 13d6a6ca2e9f35265f10b549cb8354f31a307a7480bbf76c0f4bc8b02e13d5556fb29456cef3815db490effc602c59f98cb0505090ca9e29d7dc61539762a065 + checksum: 59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/leb128@npm:1.11.1" +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" dependencies: "@xtuc/long": 4.2.2 - checksum: e505edb5de61f13c6c66c57380ae16e95db9d7c43a41ac132e298426bcead9c90622e3d3035fb63df09d0eeabafd471be35ba583fca72ac2e776ab537dda6883 + checksum: cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/utf8@npm:1.11.1" - checksum: a7c13c7c82d525fe774f51a4fc1da058b0e2c73345eed9e2d6fbeb96ba50c1942daf97e0ff394e7a4d0f26b705f9587cb14681870086d51f02abc78ff6ce3703 +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/helper-wasm-section": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-opt": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - "@webassemblyjs/wast-printer": 1.11.1 - checksum: 10bef22579f96f8c0934aa9fbf6f0d9110563f9c1a510100a84fdfa3dbd9126fdc10bfc12e7ce3ace0ba081e6789eac533c81698faab75859b3a41e97b5ab3bc + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-opt": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + "@webassemblyjs/wast-printer": 1.11.6 + checksum: 9a56b6bf635cf7aa5d6e926eaddf44c12fba050170e452a8e17ab4e1b937708678c03f5817120fb9de1e27167667ce693d16ce718d41e5a16393996a6017ab73 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" +"@webassemblyjs/wasm-gen@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 4e49a19e302e19a2a2438e87ae85805acf39a7d93f9ac0ab65620ae395894937ceb762fa328acbe259d2e60d252cbb87a40ec2b4c088f3149be23fa69ddbf855 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: ce9a39d3dab2eb4a5df991bc9f3609960daa4671d25d700f4617152f9f79da768547359f817bee10cd88532c3e0a8a1714d383438e0a54217eba53cb822bd5ad languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" +"@webassemblyjs/wasm-opt@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - checksum: af7fd6bcb942baafda3b8cc1e574062d01c582aaa12d4f0ea62ff8e83ce1317f06a79c16313a3bc98625e1226d0fc49ba90edac18c21a64c75e9cd114306f07a + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + checksum: 82788408054171688e9f12883b693777219366d6867003e34dccc21b4a0950ef53edc9d2b4d54cabdb6ee869cf37c8718401b4baa4f70a7f7dd3867c75637298 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" +"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 5a7e8ad36176347f3bc9aee15860a7002b608c181012128ea3e5a1199649d6722e05e029fdf2a73485f2ab3e2f7386b3e0dce46ff9cfd1918417a4ee1151f21e + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: 7a97a5f34f98bdcfd812157845a06d53f3d3f67dbd4ae5d6bf66e234e17dc4a76b2b5e74e5dd70b4cab9778fc130194d50bbd6f9a1d23e15ed1ed666233d6f5f languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wast-printer@npm:1.11.1" +"@webassemblyjs/wast-printer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wast-printer@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/ast": 1.11.6 "@xtuc/long": 4.2.2 - checksum: cede13c53a176198f949e7f0edf921047c524472b2e4c99edfe829d20e168b4037395479325635b4a3662ea7b4b59be4555ea3bb6050c61b823c68abdb435c74 + checksum: 916b90fa3a8aadd95ca41c21d4316d0a7582cf6d0dcf6d9db86ab0de823914df513919fba60ac1edd227ff00e93a66b927b15cbddd36b69d8a34c8815752633c languageName: node linkType: hard @@ -3201,12 +3668,21 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.7.6": - version: 1.8.0 - resolution: "acorn-import-assertions@npm:1.8.0" +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" peerDependencies: acorn: ^8 - checksum: ad8e177a177dcda35a91cca2dc54a7cf6958211c14af2b48e4685a5e752d4782779d367e1d5e275700ad5767834d0063edf2ba85aeafb98d7398f8ebf957e7f5 + checksum: 3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.0.0": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 languageName: node linkType: hard @@ -3217,6 +3693,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.0.0, acorn@npm:^8.8.2": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" + bin: + acorn: bin/acorn + checksum: a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 + languageName: node + linkType: hard + "acorn@npm:^8.0.4, acorn@npm:^8.5.0, acorn@npm:^8.7.1": version: 8.8.2 resolution: "acorn@npm:8.8.2" @@ -3297,7 +3782,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.2, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3321,40 +3806,40 @@ __metadata: languageName: node linkType: hard -"algoliasearch-helper@npm:^3.10.0": - version: 3.10.0 - resolution: "algoliasearch-helper@npm:3.10.0" +"algoliasearch-helper@npm:^3.13.3": + version: 3.15.0 + resolution: "algoliasearch-helper@npm:3.15.0" dependencies: "@algolia/events": ^4.0.1 peerDependencies: algoliasearch: ">= 3.1 < 6" - checksum: 2e770cb590da47ef431de47b6515e8eba203062642aba60c507e7dd4c17126f4afc439a4602df045667d7c510772059c4a7377a6573140359280636ce9703b12 + checksum: a277f6d9d98184ea94c166995990f0b12e25d5af69fad50f1014658382408985afd31bd3d6d1ae1b68afe0af7c0e6b7e397172c08d1cd5f82af5b312cd515f15 languageName: node linkType: hard -"algoliasearch@npm:^4.0.0, algoliasearch@npm:^4.13.1": - version: 4.13.1 - resolution: "algoliasearch@npm:4.13.1" +"algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1": + version: 4.20.0 + resolution: "algoliasearch@npm:4.20.0" dependencies: - "@algolia/cache-browser-local-storage": 4.13.1 - "@algolia/cache-common": 4.13.1 - "@algolia/cache-in-memory": 4.13.1 - "@algolia/client-account": 4.13.1 - "@algolia/client-analytics": 4.13.1 - "@algolia/client-common": 4.13.1 - "@algolia/client-personalization": 4.13.1 - "@algolia/client-search": 4.13.1 - "@algolia/logger-common": 4.13.1 - "@algolia/logger-console": 4.13.1 - "@algolia/requester-browser-xhr": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/requester-node-http": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 533838dd10fcc495b15c33e9c50c4ff43541e420a7e8f4f291d2a939f0cb991b26dcebbba7f964ae65a7b6426b2817bf99d36c8982e449ec9b576e2a833373dc + "@algolia/cache-browser-local-storage": 4.20.0 + "@algolia/cache-common": 4.20.0 + "@algolia/cache-in-memory": 4.20.0 + "@algolia/client-account": 4.20.0 + "@algolia/client-analytics": 4.20.0 + "@algolia/client-common": 4.20.0 + "@algolia/client-personalization": 4.20.0 + "@algolia/client-search": 4.20.0 + "@algolia/logger-common": 4.20.0 + "@algolia/logger-console": 4.20.0 + "@algolia/requester-browser-xhr": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/requester-node-http": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 39c1e5391560ba019a845440c00f770e41b3462860214f45b678f976e3de61108eb7abafab610f26adde7d3057df1f8f65d465bcd114612546b935880e43f1dd languageName: node linkType: hard -"ansi-align@npm:^3.0.0, ansi-align@npm:^3.0.1": +"ansi-align@npm:^3.0.1": version: 3.0.1 resolution: "ansi-align@npm:3.0.1" dependencies: @@ -3395,7 +3880,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": +"ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -3489,6 +3974,22 @@ __metadata: languageName: node linkType: hard +"astring@npm:^1.8.0": + version: 1.8.6 + resolution: "astring@npm:1.8.6" + bin: + astring: bin/astring + checksum: 31f09144597048c11072417959a412f208f8f95ba8dce408dfbc3367acb929f31fbcc00ed5eb61ccbf7c2f1173b9ac8bfcaaa37134a9455050c669b2b036ed88 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + "at-least-node@npm:^1.0.0": version: 1.0.0 resolution: "at-least-node@npm:1.0.0" @@ -3496,13 +3997,13 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.3.7, autoprefixer@npm:^10.4.7": - version: 10.4.7 - resolution: "autoprefixer@npm:10.4.7" +"autoprefixer@npm:^10.4.12, autoprefixer@npm:^10.4.14": + version: 10.4.16 + resolution: "autoprefixer@npm:10.4.16" dependencies: - browserslist: ^4.20.3 - caniuse-lite: ^1.0.30001335 - fraction.js: ^4.2.0 + browserslist: ^4.21.10 + caniuse-lite: ^1.0.30001538 + fraction.js: ^4.3.6 normalize-range: ^0.1.2 picocolors: ^1.0.0 postcss-value-parser: ^4.2.0 @@ -3510,43 +4011,30 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 80efba20a1884598098eb718c625020f3d234a285e562997c17a5f78560b307b0494051b8851b03862e58a78bafc9e4c9c0d1828293e438a22c935834b6d629e - languageName: node - linkType: hard - -"axios@npm:^0.25.0": - version: 0.25.0 - resolution: "axios@npm:0.25.0" - dependencies: - follow-redirects: ^1.14.7 - checksum: 33475dc847e8494341db5ff5d3ce3a830e511d9698eda1e2507618a0a875ca774e7c59b9194c70664e886699b5917416175da2ea5ccb67a2945f7cdc939d7c56 + checksum: e00256e754d481a026d928bca729b25954074dd142dbec022f0a7db0d3bbc0dc2e2dc7542e94fec22eff81e21fe140e6856448e2d9a002660cb1e2ad434daee0 languageName: node linkType: hard -"babel-loader@npm:^8.2.5": - version: 8.2.5 - resolution: "babel-loader@npm:8.2.5" +"axios@npm:^0.27.2": + version: 0.27.2 + resolution: "axios@npm:0.27.2" dependencies: - find-cache-dir: ^3.3.1 - loader-utils: ^2.0.0 - make-dir: ^3.1.0 - schema-utils: ^2.6.5 - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: 6d11d59f0d8e94f230b7529ef805d03e42df5130849cbc21b0954c081bef5325390bbedf378b00355f4b447aee014012d37565777ba6fc17ffbb2352f5736601 + follow-redirects: ^1.14.9 + form-data: ^4.0.0 + checksum: 76d673d2a90629944b44d6f345f01e58e9174690f635115d5ffd4aca495d99bcd8f95c590d5ccb473513f5ebc1d1a6e8934580d0c57cdd0498c3a101313ef771 languageName: node linkType: hard -"babel-plugin-apply-mdx-type-prop@npm:1.6.22": - version: 1.6.22 - resolution: "babel-plugin-apply-mdx-type-prop@npm:1.6.22" +"babel-loader@npm:^9.1.3": + version: 9.1.3 + resolution: "babel-loader@npm:9.1.3" dependencies: - "@babel/helper-plugin-utils": 7.10.4 - "@mdx-js/util": 1.6.22 + find-cache-dir: ^4.0.0 + schema-utils: ^4.0.0 peerDependencies: - "@babel/core": ^7.11.6 - checksum: d1fd88f2eee87f3d709373cfac5165f8407793b123e1c7061308311f7e6b0778e093a4a93e7130b47c5a742f2515d0c1d4f3da5097ff195ef91011688ec17ddc + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: e3fc3c9e02bd908b37e8e8cd4f3d7280cf6ac45e33fc203aedbb615135a0fecc33bf92573b71a166a827af029d302c0b060354985cd91d510320bd70a2f949eb languageName: node linkType: hard @@ -3559,55 +4047,46 @@ __metadata: languageName: node linkType: hard -"babel-plugin-extract-import-names@npm:1.6.22": - version: 1.6.22 - resolution: "babel-plugin-extract-import-names@npm:1.6.22" - dependencies: - "@babel/helper-plugin-utils": 7.10.4 - checksum: c7b7206222f7b70f2c9852caa621cc3742b5d9f7dd4229a6e3c560d7683b82f835a8ea46db632df5dab5ad91b1439ead3771a8576a7a14e418248c16fd1f0cc4 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs2@npm:^0.3.1": - version: 0.3.2 - resolution: "babel-plugin-polyfill-corejs2@npm:0.3.2" +"babel-plugin-polyfill-corejs2@npm:^0.4.6": + version: 0.4.6 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" dependencies: - "@babel/compat-data": ^7.17.7 - "@babel/helper-define-polyfill-provider": ^0.3.2 - semver: ^6.1.1 + "@babel/compat-data": ^7.22.6 + "@babel/helper-define-polyfill-provider": ^0.4.3 + semver: ^6.3.1 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 704c9cefc0c447a8bc6376a51ba81829429cc1a92459ed089b8832829063ccabd64df81e9c10dd369353e345f75a342343ffac0db43a546ad48c2f9751d2916e + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 64a98811f343492aa6970ab253760194e389c0417e5b830522f944009c1f0c78e1251975fd1b9869cd48cc4623111b20a3389cf6732a1d10ba0d19de6fa5114f languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.5.2": - version: 0.5.3 - resolution: "babel-plugin-polyfill-corejs3@npm:0.5.3" +"babel-plugin-polyfill-corejs3@npm:^0.8.5": + version: 0.8.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.6" dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.2 - core-js-compat: ^3.21.0 + "@babel/helper-define-polyfill-provider": ^0.4.3 + core-js-compat: ^3.33.1 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87f9eb8be5e8e115b930624c8e3e91b5396eca8d563120b0cd03853960addf587fd4cab8776ecf3a59ec94a774f214f2321a96c354a667a62fa2dc5eb122eaa0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 97d974c1dfbefdf27866e21a1ac757f6ab1626379b544d6f8ddb05f7bfa02173f8347b6140295b0f770394549f9321775d3048e466a9a02b99b88ad5f0346858 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.3.1": - version: 0.3.1 - resolution: "babel-plugin-polyfill-regenerator@npm:0.3.1" +"babel-plugin-polyfill-regenerator@npm:^0.5.3": + version: 0.5.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.1 + "@babel/helper-define-polyfill-provider": ^0.4.3 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 88f7b488bbb29636370954c048f08bdf61c5f1ffbee0b627817bf80e99a46b06660f54266cff93affb8ab5831d8edcaab271f9a80b8a090d4fd409a13023a61d + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: cc32313b9ebbf1d7bedc33524a861136b9e5d3b6e9be317ac360a1c2a59ae5ed1b465a6c68b2715cdefb089780ddfb0c11f4a148e49827a947beee76e43da598 languageName: node linkType: hard -"bail@npm:^1.0.0": - version: 1.0.5 - resolution: "bail@npm:1.0.5" - checksum: 4cf7d0b5c82fdc69590b3fe85c17c4ec37647681b20875551fd6187a85c122b20178dc118001d3ebd5d0ab3dc0e95637c71f889f481882ee761db43c6b16fa05 +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: 25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b languageName: node linkType: hard @@ -3685,22 +4164,6 @@ __metadata: languageName: node linkType: hard -"boxen@npm:^5.0.0": - version: 5.1.2 - resolution: "boxen@npm:5.1.2" - dependencies: - ansi-align: ^3.0.0 - camelcase: ^6.2.0 - chalk: ^4.1.0 - cli-boxes: ^2.2.1 - string-width: ^4.2.2 - type-fest: ^0.20.2 - widest-line: ^3.1.0 - wrap-ansi: ^7.0.0 - checksum: 71f31c2eb3dcacd5fce524ae509e0cc90421752e0bfbd0281fd3352871d106c462a0f810c85f2fdb02f3a9fab2d7a84e9718b4999384d651b76104ebe5d2c024 - languageName: node - linkType: hard - "boxen@npm:^6.2.1": version: 6.2.1 resolution: "boxen@npm:6.2.1" @@ -3717,6 +4180,22 @@ __metadata: languageName: node linkType: hard +"boxen@npm:^7.0.0": + version: 7.1.1 + resolution: "boxen@npm:7.1.1" + dependencies: + ansi-align: ^3.0.1 + camelcase: ^7.0.1 + chalk: ^5.2.0 + cli-boxes: ^3.0.0 + string-width: ^5.1.2 + type-fest: ^2.13.0 + widest-line: ^4.0.1 + wrap-ansi: ^8.1.0 + checksum: 3a9891dc98ac40d582c9879e8165628258e2c70420c919e70fff0a53ccc7b42825e73cda6298199b2fbc1f41f5d5b93b492490ad2ae27623bed3897ddb4267f8 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -3736,7 +4215,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.16.6, browserslist@npm:^4.18.1, browserslist@npm:^4.20.2, browserslist@npm:^4.20.3": +"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.16.6, browserslist@npm:^4.18.1, browserslist@npm:^4.20.3": version: 4.20.3 resolution: "browserslist@npm:4.20.3" dependencies: @@ -3751,6 +4230,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": + version: 4.22.1 + resolution: "browserslist@npm:4.22.1" + dependencies: + caniuse-lite: ^1.0.30001541 + electron-to-chromium: ^1.4.535 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.13 + bin: + browserslist: cli.js + checksum: 6810f2d63f171d0b7b8d38cf091708e00cb31525501810a507839607839320d66e657293b0aa3d7f051ecbc025cb07390a90c037682c1d05d12604991e41050b + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -3798,18 +4291,25 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^6.0.0": - version: 6.1.0 - resolution: "cacheable-request@npm:6.1.0" +"cacheable-lookup@npm:^7.0.0": + version: 7.0.0 + resolution: "cacheable-lookup@npm:7.0.0" + checksum: 63a9c144c5b45cb5549251e3ea774c04d63063b29e469f7584171d059d3a88f650f47869a974e2d07de62116463d742c287a81a625e791539d987115cb081635 + languageName: node + linkType: hard + +"cacheable-request@npm:^10.2.8": + version: 10.2.14 + resolution: "cacheable-request@npm:10.2.14" dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^3.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^4.1.0 - responselike: ^1.0.2 - checksum: e92f2b2078c014ba097647ab4ff6a6149dc2974a65670ee97ec593ec9f4148ecc988e86b9fcd8ebf7fe255774a53d5dc3db6b01065d44f09a7452c7a7d8e4844 + "@types/http-cache-semantics": ^4.0.2 + get-stream: ^6.0.1 + http-cache-semantics: ^4.1.1 + keyv: ^4.5.3 + mimic-response: ^4.0.0 + normalize-url: ^8.0.0 + responselike: ^3.0.0 + checksum: 41b6658db369f20c03128227ecd219ca7ac52a9d24fc0f499cc9aa5d40c097b48b73553504cebd137024d957c0ddb5b67cf3ac1439b136667f3586257763f88d languageName: node linkType: hard @@ -3840,13 +4340,6 @@ __metadata: languageName: node linkType: hard -"camelcase-css@npm:2.0.1": - version: 2.0.1 - resolution: "camelcase-css@npm:2.0.1" - checksum: 1a1a3137e8a781e6cbeaeab75634c60ffd8e27850de410c162cce222ea331cd1ba5364e8fb21c95e5ca76f52ac34b81a090925ca00a87221355746d049c6e273 - languageName: node - linkType: hard - "camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" @@ -3854,6 +4347,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^7.0.1": + version: 7.0.1 + resolution: "camelcase@npm:7.0.1" + checksum: 3adfc9a0e96d51b3a2f4efe90a84dad3e206aaa81dfc664f1bd568270e1bf3b010aad31f01db16345b4ffe1910e16ab411c7273a19a859addd1b98ef7cf4cfbd + languageName: node + linkType: hard + "caniuse-api@npm:^3.0.0": version: 3.0.0 resolution: "caniuse-api@npm:3.0.0" @@ -3866,17 +4366,24 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001332, caniuse-lite@npm:^1.0.30001335": +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001332": version: 1.0.30001335 resolution: "caniuse-lite@npm:1.0.30001335" checksum: d2756ac773e32eee977f71e82ffcfe3b23bb683eda7dc4800531a72f3c2e3155828a4618c08eaf96260a0314fb898ab128abbbfbbce48875ec4943661cfa7cfb languageName: node linkType: hard -"ccount@npm:^1.0.0": - version: 1.1.0 - resolution: "ccount@npm:1.1.0" - checksum: 9ccfddfa45c8d6d01411b8e30d2ce03c55c33f32a69bdb84ee44d743427cdb01b03159954917023d0dac960c34973ba42626bb9fa883491ebb663a53a6713d43 +"caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541": + version: 1.0.30001561 + resolution: "caniuse-lite@npm:1.0.30001561" + checksum: 6e84c84026fee53edbdbb5aded7a04a036aae4c2e367cf6bdc90c6783a591e2fdcfcdebcc4e774aca61092e542a61200c8c16b06659396492426033c4dbcc618 + languageName: node + linkType: hard + +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 languageName: node linkType: hard @@ -3891,7 +4398,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -3901,24 +4408,45 @@ __metadata: languageName: node linkType: hard -"character-entities-legacy@npm:^1.0.0": - version: 1.1.4 - resolution: "character-entities-legacy@npm:1.1.4" - checksum: ea4ca9c29887335eed86d78fc67a640168342b1274da84c097abb0575a253d1265281a5052f9a863979e952bcc267b4ecaaf4fe233a7e1e0d8a47806c65b96c7 +"chalk@npm:^5.0.1, chalk@npm:^5.2.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 languageName: node linkType: hard -"character-entities@npm:^1.0.0": - version: 1.2.4 - resolution: "character-entities@npm:1.2.4" - checksum: ad015c3d7163563b8a0ee1f587fb0ef305ef344e9fd937f79ca51cccc233786a01d591d989d5bf7b2e66b528ac9efba47f3b1897358324e69932f6d4b25adfe1 +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e languageName: node linkType: hard -"character-reference-invalid@npm:^1.0.0": - version: 1.1.4 - resolution: "character-reference-invalid@npm:1.1.4" - checksum: 29f05081c5817bd1e975b0bf61e77b60a40f62ad371d0f0ce0fdb48ab922278bc744d1fbe33771dced751887a8403f265ff634542675c8d7375f6ff4811efd0e +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 + languageName: node + linkType: hard + +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 + languageName: node + linkType: hard + +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 + languageName: node + linkType: hard + +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1 languageName: node linkType: hard @@ -3984,14 +4512,14 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^2.0.0": - version: 2.0.0 - resolution: "ci-info@npm:2.0.0" - checksum: 8c5fa3830a2bcee2b53c2e5018226f0141db9ec9f7b1e27a5c57db5512332cde8a0beb769bcbaf0d8775a78afbf2bb841928feca4ea6219638a5b088f9884b46 +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a languageName: node linkType: hard -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.0": +"clean-css@npm:^5.2.2": version: 5.3.0 resolution: "clean-css@npm:5.3.0" dependencies: @@ -4000,6 +4528,15 @@ __metadata: languageName: node linkType: hard +"clean-css@npm:^5.3.2, clean-css@npm:~5.3.2": + version: 5.3.2 + resolution: "clean-css@npm:5.3.2" + dependencies: + source-map: ~0.6.0 + checksum: 315e0e81306524bd2c1905fa6823bf7658be40799b78f446e5e6922808718d2b80266fb3e96842a06176fa683bc2c1a0d2827b08d154e2f9cf136d7bda909d33 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -4007,13 +4544,6 @@ __metadata: languageName: node linkType: hard -"cli-boxes@npm:^2.2.1": - version: 2.2.1 - resolution: "cli-boxes@npm:2.2.1" - checksum: 6111352edbb2f62dbc7bfd58f2d534de507afed7f189f13fa894ce5a48badd94b2aa502fda28f1d7dd5f1eb456e7d4033d09a76660013ef50c7f66e7a034f050 - languageName: node - linkType: hard - "cli-boxes@npm:^3.0.0": version: 3.0.0 resolution: "cli-boxes@npm:3.0.0" @@ -4021,16 +4551,16 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:^0.6.2": - version: 0.6.2 - resolution: "cli-table3@npm:0.6.2" +"cli-table3@npm:^0.6.3": + version: 0.6.3 + resolution: "cli-table3@npm:0.6.3" dependencies: "@colors/colors": 1.5.0 string-width: ^4.2.0 dependenciesMeta: "@colors/colors": optional: true - checksum: aaa87929d86ba36e651e0280ab34cc28660e13da9dd2b6f8aa36e800c40e331c32bff53597cb9126e8a2e88e7a9025aff9c240350fe69876207d51ba452ef5e0 + checksum: 39e580cb346c2eaf1bd8f4ff055ae644e902b8303c164a1b8894c0dc95941f92e001db51f49649011be987e708d9fa3183ccc2289a4d376a057769664048cc0c languageName: node linkType: hard @@ -4045,15 +4575,6 @@ __metadata: languageName: node linkType: hard -"clone-response@npm:^1.0.2": - version: 1.0.2 - resolution: "clone-response@npm:1.0.2" - dependencies: - mimic-response: ^1.0.0 - checksum: 96f3527ef86d0c322e0a5188d929ab78ddbc3238d47ccbb00f8abb02b02e4ef70339646ec73d657383ffbdb1f0cfef6a937062d4f701ca6f84cee7a37114007f - languageName: node - linkType: hard - "clsx@npm:1.2.1, clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" @@ -4061,10 +4582,10 @@ __metadata: languageName: node linkType: hard -"collapse-white-space@npm:^1.0.2": - version: 1.0.6 - resolution: "collapse-white-space@npm:1.0.6" - checksum: 7fd27a883eee1ddd5e39c53fbcd4a42dfe2a65dfac70e2c442d20827f5258202b360a12e99b4f0128c3addd2d64796bb2eb1bb8a3b75d5a2e9c061adb549c36b +"collapse-white-space@npm:^2.0.0": + version: 2.1.0 + resolution: "collapse-white-space@npm:2.1.0" + checksum: b2e2800f4ab261e62eb27a1fbe853378296e3a726d6695117ed033e82d61fb6abeae4ffc1465d5454499e237005de9cfc52c9562dc7ca4ac759b9a222ef14453 languageName: node linkType: hard @@ -4130,10 +4651,26 @@ __metadata: languageName: node linkType: hard -"comma-separated-tokens@npm:^1.0.0": +"combined-stream@npm:^1.0.8": version: 1.0.8 - resolution: "comma-separated-tokens@npm:1.0.8" - checksum: c3bcfeaa6d50313528a006a40bcc0f9576086665c9b48d4b3a76ddd63e7d6174734386c98be1881cbf6ecfc25e1db61cd775a7b896d2ea7a65de28f83a0f9b17 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: 91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 languageName: node linkType: hard @@ -4165,10 +4702,10 @@ __metadata: languageName: node linkType: hard -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb languageName: node linkType: hard @@ -4203,17 +4740,26 @@ __metadata: languageName: node linkType: hard -"configstore@npm:^5.0.1": - version: 5.0.1 - resolution: "configstore@npm:5.0.1" +"config-chain@npm:^1.1.11": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" dependencies: - dot-prop: ^5.2.0 - graceful-fs: ^4.1.2 - make-dir: ^3.0.0 - unique-string: ^2.0.0 - write-file-atomic: ^3.0.0 - xdg-basedir: ^4.0.0 - checksum: 5af23830e78bdc56cbe92a2f81e87f1d3a39e96e51a0ab2a8bc79bbbc5d4440a48d92833b3fd9c6d34b4a9c4c5853c8487b8e6e68593e7ecbc7434822f7aced3 + ini: ^1.3.4 + proto-list: ~1.2.1 + checksum: 39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e + languageName: node + linkType: hard + +"configstore@npm:^6.0.0": + version: 6.0.0 + resolution: "configstore@npm:6.0.0" + dependencies: + dot-prop: ^6.0.1 + graceful-fs: ^4.2.6 + unique-string: ^3.0.0 + write-file-atomic: ^3.0.3 + xdg-basedir: ^5.0.1 + checksum: 6681a96038ab3e0397cbdf55e6e1624ac3dfa3afe955e219f683df060188a418bda043c9114a59a337e7aec9562b0a0c838ed7db24289e6d0c266bc8313b9580 languageName: node linkType: hard @@ -4261,12 +4807,10 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.7.0": - version: 1.8.0 - resolution: "convert-source-map@npm:1.8.0" - dependencies: - safe-buffer: ~5.1.1 - checksum: da4649990b633c070c0dab1680b89a67b9315dd2b1168d143536f667214c97e4eb4a49e5b7ff912f0196fe303e31fc16a529457436d25b2b5a89613eaf4f27fa +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b languageName: node linkType: hard @@ -4284,10 +4828,10 @@ __metadata: languageName: node linkType: hard -"copy-text-to-clipboard@npm:^3.0.1": - version: 3.0.1 - resolution: "copy-text-to-clipboard@npm:3.0.1" - checksum: 65b2d2518f23ba0ec8f82eecd66c7edd38fbd22b0242ac31a7cf020fcaf6aae74e7a07339993bd275c4ebfbf01dd7686303ea2b7afb1f11b7f4221e860a33b54 +"copy-text-to-clipboard@npm:^3.2.0": + version: 3.2.0 + resolution: "copy-text-to-clipboard@npm:3.2.0" + checksum: d60fdadc59d526e19d56ad23cec2b292d33c771a5091621bd322d138804edd3c10eb2367d46ec71b39f5f7f7116a2910b332281aeb36a5b679199d746a8a5381 languageName: node linkType: hard @@ -4307,27 +4851,26 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.21.0, core-js-compat@npm:^3.22.1": - version: 3.22.4 - resolution: "core-js-compat@npm:3.22.4" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": + version: 3.33.2 + resolution: "core-js-compat@npm:3.33.2" dependencies: - browserslist: ^4.20.3 - semver: 7.0.0 - checksum: eb77796eb9243121e41d28d354e2a89089b0e4a32fd72b055f68055b0d5f3a3554d9d96ac07ab2948927660ff5589e5e3def296dd7d01e1024dd4f0c876fec2b + browserslist: ^4.22.1 + checksum: bcf6f0badffbbf4a127449f64720c33e9c960f204f072d9644954b30d7742e18de733e9f446c7093f1ccf5d9e101205a7c64747a5aeec7d3925f336322f85a03 languageName: node linkType: hard -"core-js-pure@npm:^3.20.2": - version: 3.21.1 - resolution: "core-js-pure@npm:3.21.1" - checksum: 49903104b8d61b2a223342d723d7719dc4eee8331d774cc2eb6869e4eb9aab6fcab003e0fce8a79046a53ec807c834df9ab0042d54e00b8e50447ce4da202dc0 +"core-js-pure@npm:^3.30.2": + version: 3.33.2 + resolution: "core-js-pure@npm:3.33.2" + checksum: 9de1cc6e64371c1b48d547a75840472a2c39277dbe3dd74adc4c172f05f078218ce69e42e30f663d26a94a181e761325141028c2c0a1d452c8e4a383befa2e25 languageName: node linkType: hard -"core-js@npm:^3.23.3": - version: 3.24.0 - resolution: "core-js@npm:3.24.0" - checksum: f10ed95215a0761608caa794f41fe7a599c00fd8cfe3197b6cc472bb5001b6c94c98699c03623551c38f7e44171cf95934d495cc293ef5ca8bc655db6fcd53f9 +"core-js@npm:^3.31.1": + version: 3.33.2 + resolution: "core-js@npm:3.33.2" + checksum: d6a56ad3e134846c805ce936788dd58cb51e861f173ed1f830979735d7865ea6f6a5a437076c36c8d8b842ba0384d052998f160774a8da7712f0f51df60167fe languageName: node linkType: hard @@ -4351,7 +4894,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^7.0.0, cosmiconfig@npm:^7.0.1": +"cosmiconfig@npm:^7.0.1": version: 7.0.1 resolution: "cosmiconfig@npm:7.0.1" dependencies: @@ -4364,6 +4907,23 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^8.2.0": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a + languageName: node + linkType: hard + "cross-fetch@npm:^3.1.5": version: 3.1.5 resolution: "cross-fetch@npm:3.1.5" @@ -4384,10 +4944,12 @@ __metadata: languageName: node linkType: hard -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 +"crypto-random-string@npm:^4.0.0": + version: 4.0.0 + resolution: "crypto-random-string@npm:4.0.0" + dependencies: + type-fest: ^1.0.1 + checksum: 16e11a3c8140398f5408b7fded35a961b9423c5dac39a60cbbd08bd3f0e07d7de130e87262adea7db03ec1a7a4b7551054e0db07ee5408b012bac5400cfc07a5 languageName: node linkType: hard @@ -4400,31 +4962,40 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.7.1": - version: 6.7.1 - resolution: "css-loader@npm:6.7.1" +"css-declaration-sorter@npm:^6.3.1": + version: 6.4.1 + resolution: "css-declaration-sorter@npm:6.4.1" + peerDependencies: + postcss: ^8.0.9 + checksum: b8b664338dac528266a1ed9b27927ac51a907fb16bc1954fa9038b5286c442603bd494cc920c6a3616111309d18ee6b5a85b6d9927938efc942af452a5145160 + languageName: node + linkType: hard + +"css-loader@npm:^6.8.1": + version: 6.8.1 + resolution: "css-loader@npm:6.8.1" dependencies: icss-utils: ^5.1.0 - postcss: ^8.4.7 + postcss: ^8.4.21 postcss-modules-extract-imports: ^3.0.0 - postcss-modules-local-by-default: ^4.0.0 + postcss-modules-local-by-default: ^4.0.3 postcss-modules-scope: ^3.0.0 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 - semver: ^7.3.5 + semver: ^7.3.8 peerDependencies: webpack: ^5.0.0 - checksum: c9e900e2a6012a988ab36cf87598fa1e74cd570ab25dbcc8a5d7f10a91a0f9549ff3656b9bbb2bf26b9f5a39f76b9b4b148513c4085c23b73c9c1d5cc2f7de12 + checksum: a6e23de4ec1d2832f10b8ca3cfec6b6097a97ca3c73f64338ae5cd110ac270f1b218ff0273d39f677a7a561f1a9d9b0d332274664d0991bcfafaae162c2669c4 languageName: node linkType: hard -"css-minimizer-webpack-plugin@npm:^4.0.0": - version: 4.0.0 - resolution: "css-minimizer-webpack-plugin@npm:4.0.0" +"css-minimizer-webpack-plugin@npm:^4.2.2": + version: 4.2.2 + resolution: "css-minimizer-webpack-plugin@npm:4.2.2" dependencies: cssnano: ^5.1.8 - jest-worker: ^27.5.1 - postcss: ^8.4.13 + jest-worker: ^29.1.2 + postcss: ^8.4.17 schema-utils: ^4.0.0 serialize-javascript: ^6.0.0 source-map: ^0.6.1 @@ -4433,13 +5004,17 @@ __metadata: peerDependenciesMeta: "@parcel/css": optional: true + "@swc/css": + optional: true clean-css: optional: true csso: optional: true esbuild: optional: true - checksum: 2a9f54decc654798707cb2fa25cfbeba27f190beab2cc38bb29a0e86b13be032de694ba069f63f22c2968628c49bdfae63146535252b6dbd2c16c8373aac7afb + lightningcss: + optional: true + checksum: 05cd1460b83d9a5f8878fd63d3a80fd100cbb10f48e295a6ad52519761f3390e1e1bc0e269ff28d15b062a1b11379e04608d50ee30424e177c281bd845fef9fb languageName: node linkType: hard @@ -4502,19 +5077,19 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-advanced@npm:^5.3.8": - version: 5.3.8 - resolution: "cssnano-preset-advanced@npm:5.3.8" +"cssnano-preset-advanced@npm:^5.3.10": + version: 5.3.10 + resolution: "cssnano-preset-advanced@npm:5.3.10" dependencies: - autoprefixer: ^10.3.7 - cssnano-preset-default: ^5.2.12 + autoprefixer: ^10.4.12 + cssnano-preset-default: ^5.2.14 postcss-discard-unused: ^5.1.0 postcss-merge-idents: ^5.1.1 postcss-reduce-idents: ^5.2.0 postcss-zindex: ^5.1.0 peerDependencies: postcss: ^8.2.15 - checksum: e2159c1107b8687a5b7816c1769cdf46f0ad65b79bb265e861eec569f44afc235cf7219d7c4dd318c5dd83633f4ff37a764721a30764761ac043a8325d2c423f + checksum: abfa870a6e3ab52cddfea7cac83f49b510efb941c7f2960ca9d41ae11fabbe03e9453cad7f81fd1b35cf6080c94094cd7bb1b58c07fad4cf0453f6e4bb9a07ae languageName: node linkType: hard @@ -4557,28 +5132,80 @@ __metadata: languageName: node linkType: hard -"cssnano-utils@npm:^3.1.0": - version: 3.1.0 - resolution: "cssnano-utils@npm:3.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 057508645a3e7584decede1045daa5b362dbfa2f5df96c3527c7d52e41e787a3442a56a8ea0c0af6a757f518e79a459ee580a35c323ad0d0eec912afd67d7630 - languageName: node - linkType: hard - -"cssnano@npm:^5.1.12, cssnano@npm:^5.1.8": - version: 5.1.12 - resolution: "cssnano@npm:5.1.12" +"cssnano-preset-default@npm:^5.2.14": + version: 5.2.14 + resolution: "cssnano-preset-default@npm:5.2.14" dependencies: - cssnano-preset-default: ^5.2.12 - lilconfig: ^2.0.3 - yaml: ^1.10.2 - peerDependencies: - postcss: ^8.2.15 - checksum: fb1acb2b914d2d5f02fe1f79e3d13cea9424e4409490e402a113775fe42ec0f8d75f69bcd51340633801dc2688173663ccafa0f2e9dafbb65d3ac350da962c75 - languageName: node - linkType: hard - + css-declaration-sorter: ^6.3.1 + cssnano-utils: ^3.1.0 + postcss-calc: ^8.2.3 + postcss-colormin: ^5.3.1 + postcss-convert-values: ^5.1.3 + postcss-discard-comments: ^5.1.2 + postcss-discard-duplicates: ^5.1.0 + postcss-discard-empty: ^5.1.1 + postcss-discard-overridden: ^5.1.0 + postcss-merge-longhand: ^5.1.7 + postcss-merge-rules: ^5.1.4 + postcss-minify-font-values: ^5.1.0 + postcss-minify-gradients: ^5.1.1 + postcss-minify-params: ^5.1.4 + postcss-minify-selectors: ^5.2.1 + postcss-normalize-charset: ^5.1.0 + postcss-normalize-display-values: ^5.1.0 + postcss-normalize-positions: ^5.1.1 + postcss-normalize-repeat-style: ^5.1.1 + postcss-normalize-string: ^5.1.0 + postcss-normalize-timing-functions: ^5.1.0 + postcss-normalize-unicode: ^5.1.1 + postcss-normalize-url: ^5.1.0 + postcss-normalize-whitespace: ^5.1.1 + postcss-ordered-values: ^5.1.3 + postcss-reduce-initial: ^5.1.2 + postcss-reduce-transforms: ^5.1.0 + postcss-svgo: ^5.1.0 + postcss-unique-selectors: ^5.1.1 + peerDependencies: + postcss: ^8.2.15 + checksum: d125bdb9ac007f97f920e30be953c550a8e7de0cb9298f67e0bc9744f4b920039046b5a6b817e345872836b08689af747f82fbf2189c8bd48da3e6f0c1087b89 + languageName: node + linkType: hard + +"cssnano-utils@npm:^3.1.0": + version: 3.1.0 + resolution: "cssnano-utils@npm:3.1.0" + peerDependencies: + postcss: ^8.2.15 + checksum: 057508645a3e7584decede1045daa5b362dbfa2f5df96c3527c7d52e41e787a3442a56a8ea0c0af6a757f518e79a459ee580a35c323ad0d0eec912afd67d7630 + languageName: node + linkType: hard + +"cssnano@npm:^5.1.15": + version: 5.1.15 + resolution: "cssnano@npm:5.1.15" + dependencies: + cssnano-preset-default: ^5.2.14 + lilconfig: ^2.0.3 + yaml: ^1.10.2 + peerDependencies: + postcss: ^8.2.15 + checksum: 4252e4f4edd7a0fbdd4017825c0f8632b7a12ecbfdd432d2ff7ec268d48eb956a0a10bbf209602181f9f84ceeecea4a864719ecde03aa2cc48f5d9636fcf5f9a + languageName: node + linkType: hard + +"cssnano@npm:^5.1.8": + version: 5.1.12 + resolution: "cssnano@npm:5.1.12" + dependencies: + cssnano-preset-default: ^5.2.12 + lilconfig: ^2.0.3 + yaml: ^1.10.2 + peerDependencies: + postcss: ^8.2.15 + checksum: fb1acb2b914d2d5f02fe1f79e3d13cea9424e4409490e402a113775fe42ec0f8d75f69bcd51340633801dc2688173663ccafa0f2e9dafbb65d3ac350da962c75 + languageName: node + linkType: hard + "csso@npm:^4.2.0": version: 4.2.0 resolution: "csso@npm:4.2.0" @@ -4616,12 +5243,33 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^3.3.0": - version: 3.3.0 - resolution: "decompress-response@npm:3.3.0" +"debug@npm:^4.0.0": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"decode-named-character-reference@npm:^1.0.0": + version: 1.0.2 + resolution: "decode-named-character-reference@npm:1.0.2" + dependencies: + character-entities: ^2.0.0 + checksum: 66a9fc5d9b5385a2b3675c69ba0d8e893393d64057f7dbbb585265bb4fc05ec513d76943b8e5aac7d8016d20eea4499322cbf4cd6d54b466976b78f3a7587a4c + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" dependencies: - mimic-response: ^1.0.0 - checksum: 5ffaf1d744277fd51c68c94ddc3081cd011b10b7de06637cccc6ecba137d45304a09ba1a776dee1c47fccc60b4a056c4bc74468eeea798ff1f1fca0024b45c9d + mimic-response: ^3.1.0 + checksum: bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e languageName: node linkType: hard @@ -4648,10 +5296,10 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^1.0.1": - version: 1.1.3 - resolution: "defer-to-connect@npm:1.1.3" - checksum: 9feb161bd7d21836fdff31eba79c2b11b7aaf844be58faf727121f8b0d9c2e82b494560df0903f41b52dd75027dc7c9455c11b3739f3202b28ca92b56c8f960e +"defer-to-connect@npm:^2.0.1": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 languageName: node linkType: hard @@ -4687,6 +5335,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -4708,6 +5363,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.0": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -4715,15 +5377,6 @@ __metadata: languageName: node linkType: hard -"detab@npm:2.0.4": - version: 2.0.4 - resolution: "detab@npm:2.0.4" - dependencies: - repeat-string: ^1.5.4 - checksum: 969c7f5a04fc3f8c52eb3b9db2fd4ba20b9b9ce56c5659ebf4cf93ba6c1be68b651665d053affbe99e76733cf7d134546cdd6be038af368f8365f42a646d5fb8 - languageName: node - linkType: hard - "detect-node@npm:^2.0.4": version: 2.1.0 resolution: "detect-node@npm:2.1.0" @@ -4744,16 +5397,25 @@ __metadata: languageName: node linkType: hard -"detect-port@npm:^1.3.0": - version: 1.3.0 - resolution: "detect-port@npm:1.3.0" +"detect-port@npm:^1.5.1": + version: 1.5.1 + resolution: "detect-port@npm:1.5.1" dependencies: address: ^1.0.1 - debug: ^2.6.0 + debug: 4 bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 6cafbd72d4f20860ea580b2f06e4c3350452ecb9acdfc1051c49b8a3dfa6f3d6bb252a69c0e97b3c5e13a2fa31a368aca2f7102e996e2caa7c938f3053b72b62 + detect: bin/detect-port.js + detect-port: bin/detect-port.js + checksum: f2b204ad3a9f8e8b53fea35fcc97469f31a8e3e786a2f59fbc886397e33b5f130c5f964bf001b9a64d990047c3824f6a439308461ff19801df04ab48a754639e + languageName: node + linkType: hard + +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: ^2.0.0 + checksum: e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e languageName: node linkType: hard @@ -4786,16 +5448,17 @@ __metadata: version: 0.0.0-use.local resolution: "docs@workspace:." dependencies: - "@docusaurus/core": 2.4.3 - "@docusaurus/module-type-aliases": 2.4.3 - "@docusaurus/plugin-content-docs": 2.4.3 - "@docusaurus/preset-classic": 2.4.3 - "@docusaurus/theme-common": 2.4.3 - "@mdx-js/react": 1.6.22 - "@tsconfig/docusaurus": 2.0.2 + "@docusaurus/core": 3.0.0 + "@docusaurus/module-type-aliases": 3.0.0 + "@docusaurus/plugin-content-docs": 3.0.0 + "@docusaurus/preset-classic": 3.0.0 + "@docusaurus/theme-common": 3.0.0 + "@docusaurus/tsconfig": 3.0.0 + "@mdx-js/react": 3.0.0 clsx: 1.2.1 - react: 17.0.2 - react-dom: 17.0.2 + prism-react-renderer: 2.1.0 + react: 18.2.0 + react-dom: 18.2.0 react-player: 2.13.0 typescript: 5.2.2 languageName: unknown @@ -4889,19 +5552,12 @@ __metadata: languageName: node linkType: hard -"dot-prop@npm:^5.2.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" dependencies: is-obj: ^2.0.0 - checksum: 93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 - languageName: node - linkType: hard - -"duplexer3@npm:^0.1.4": - version: 0.1.4 - resolution: "duplexer3@npm:0.1.4" - checksum: 734e10ac7c3053b81374fa00153e884e257db27759bd63a774cb1551e1873189cdce79a8829659964d8b5113c49e45d517592ecbbb5e5201a4181b88f8ce8b0c + checksum: 30e51ec6408978a6951b21e7bc4938aad01a86f2fdf779efe52330205c6bb8a8ea12f35925c2029d6dc9d1df22f916f32f828ce1e9b259b1371c580541c22b5a languageName: node linkType: hard @@ -4933,6 +5589,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.535": + version: 1.4.576 + resolution: "electron-to-chromium@npm:1.4.576" + checksum: b0b9e7ba803bf93ffac9cb830ed2b0e0eb07f20066127065f9ab9e08e4e6a5812040e03d76f6ee9bc59e03fb938fd414e83d4883b29111303e9e88633cf2dce4 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -4947,6 +5610,13 @@ __metadata: languageName: node linkType: hard +"emojilib@npm:^2.4.0": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: 6e66ba8921175842193f974e18af448bb6adb0cf7aeea75e08b9d4ea8e9baba0e4a5347b46ed901491dcaba277485891c33a8d70b0560ca5cc9672a94c21ab8f + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -4954,10 +5624,10 @@ __metadata: languageName: node linkType: hard -"emoticon@npm:^3.2.0": - version: 3.2.0 - resolution: "emoticon@npm:3.2.0" - checksum: ee0078d81f64fd1b5ce928ea88cbc3f7a1b3c4d731de1cabb53e2411eba412ad3b152b0982a184c7d0818b01d704ac5a238f3b9aaf8c187ddc51d8c17a9881b8 +"emoticon@npm:^4.0.1": + version: 4.0.1 + resolution: "emoticon@npm:4.0.1" + checksum: 2f13c01e1f9892a6826e017d172a95b8e93c9f3dbf9e140e76163d981cb91ae4a848e49c0d4b6904121873541af07575793d222a6ecbdc491ebb3f9d123a4c73 languageName: node linkType: hard @@ -4977,22 +5647,13 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.10.0": - version: 5.12.0 - resolution: "enhanced-resolve@npm:5.12.0" +"enhanced-resolve@npm:^5.15.0": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 5738924cfe3641d04b89c2856fee3d109d7bd71bbe234fb7f54843dda65f293e5f3eee6d5970ced70dbb09016085b961e60d1eb26cac72a21044479954b6cdfd + checksum: 69984a7990913948b4150855aed26a84afb4cb1c5a94fb8e3a65bd00729a73fc2eaff6871fb8e345377f294831afe349615c93560f2f54d61b43cdfdf668f19a languageName: node linkType: hard @@ -5003,13 +5664,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^3.0.1": - version: 3.0.1 - resolution: "entities@npm:3.0.1" - checksum: 2d93f48fd86de0b0ed8ee34456aa47b4e74a916a5e663cfcc7048302e2c7e932002926daf5a00ad6d5691e3c90673a15d413704d86d7e1b9532f9bc00d975590 - languageName: node - linkType: hard - "entities@npm:^4.2.0, entities@npm:^4.3.0": version: 4.3.0 resolution: "entities@npm:4.3.0" @@ -5017,6 +5671,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -5040,10 +5701,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^0.9.0": - version: 0.9.3 - resolution: "es-module-lexer@npm:0.9.3" - checksum: be77d73aee709fdc68d22b9938da81dfee3bc45e8d601629258643fe5bfdab253d6e2540035e035cfa8cf52a96366c1c19b46bcc23b4507b1d44e5907d2e7f6c +"es-module-lexer@npm:^1.2.1": + version: 1.3.1 + resolution: "es-module-lexer@npm:1.3.1" + checksum: 4c40e30a07c62bb6b265d4db27fb5157aec33edc9f75be06449da65e92870264fa087b6d00066a6823ad2e9d135d0f663c16b87c96b5bd30caf2878afc39f7bf languageName: node linkType: hard @@ -5054,10 +5715,10 @@ __metadata: languageName: node linkType: hard -"escape-goat@npm:^2.0.0": - version: 2.1.1 - resolution: "escape-goat@npm:2.1.1" - checksum: fc0ad656f89c05e86a9641a21bdc5ea37b258714c057430b68a834854fa3e5770cda7d41756108863fc68b1e36a0946463017b7553ac39eaaf64815be07816fc +"escape-goat@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-goat@npm:4.0.0" + checksum: 9d2a8314e2370f2dd9436d177f6b3b1773525df8f895c8f3e1acb716f5fd6b10b336cb1cd9862d4709b36eb207dbe33664838deca9c6d55b8371be4eebb972f6 languageName: node linkType: hard @@ -5082,6 +5743,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + "eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -5125,6 +5793,74 @@ __metadata: languageName: node linkType: hard +"estree-util-attach-comments@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-attach-comments@npm:3.0.0" + dependencies: + "@types/estree": ^1.0.0 + checksum: ee69bb5c45e2ad074725b90ed181c1c934b29d81bce4b0c7761431e83c4c6ab1b223a6a3d6a4fbeb92128bc5d5ee201d5dd36cf1770aa5e16a40b0cf36e8a1f1 + languageName: node + linkType: hard + +"estree-util-build-jsx@npm:^3.0.0": + version: 3.0.1 + resolution: "estree-util-build-jsx@npm:3.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + estree-walker: ^3.0.0 + checksum: 274c119817b8e7caa14a9778f1e497fea56cdd2b01df1a1ed037f843178992d3afe85e0d364d485e1e2e239255763553d1b647b15e4a7ba50851bcb43dc6bf80 + languageName: node + linkType: hard + +"estree-util-is-identifier-name@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-is-identifier-name@npm:3.0.0" + checksum: d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b + languageName: node + linkType: hard + +"estree-util-to-js@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-to-js@npm:2.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + astring: ^1.8.0 + source-map: ^0.7.0 + checksum: ac88cb831401ef99e365f92f4af903755d56ae1ce0e0f0fb8ff66e678141f3d529194f0fb15f6c78cd7554c16fda36854df851d58f9e05cfab15bddf7a97cea0 + languageName: node + linkType: hard + +"estree-util-value-to-estree@npm:^3.0.1": + version: 3.0.1 + resolution: "estree-util-value-to-estree@npm:3.0.1" + dependencies: + "@types/estree": ^1.0.0 + is-plain-obj: ^4.0.0 + checksum: 3b32154b783fb18582d41147793f4f8262cc00846c2264cddec8b5e2a2653218dd863fe55d1832daed2fb1d1b33ba2cfeeb880a2f50b59f8b86b45692038ff09 + languageName: node + linkType: hard + +"estree-util-visit@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-visit@npm:2.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/unist": ^3.0.0 + checksum: acda8b03cc8f890d79c7c7361f6c95331ba84b7ccc0c32b49f447fc30206b20002b37ffdfc97b6ad16e6fe065c63ecbae1622492e2b6b4775c15966606217f39 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.0": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -5132,10 +5868,10 @@ __metadata: languageName: node linkType: hard -"eta@npm:^2.0.0": - version: 2.0.0 - resolution: "eta@npm:2.0.0" - checksum: 21cecb358af121025966bcb23093f8d3e58607be8f5c92120bb4bd46893bf375e5f0d7850a8111bdd16009bb18d1585b1026edc1b008a813e98e1c6935b664b0 +"eta@npm:^2.2.0": + version: 2.2.0 + resolution: "eta@npm:2.2.0" + checksum: 643b54d9539d2761bf6c5f4f48df1a5ea2d46c7f5a5fdc47a7d4802a8aa2b6262d4d61f724452e226c18cf82db02d48e65293fcc548f26a3f9d75a5ba7c3b859 languageName: node linkType: hard @@ -5287,6 +6023,15 @@ __metadata: languageName: node linkType: hard +"fault@npm:^2.0.0": + version: 2.0.1 + resolution: "fault@npm:2.0.1" + dependencies: + format: ^0.2.0 + checksum: b80fbf1019b9ce8b08ee09ce86e02b028563e13a32ac3be34e42bfac00a97b96d8dee6d31e26578ffc16224eb6729e01ff1f97ddfeee00494f4f56c0aeed4bdd + languageName: node + linkType: hard + "faye-websocket@npm:^0.11.3": version: 0.11.4 resolution: "faye-websocket@npm:0.11.4" @@ -5379,14 +6124,13 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.3.1": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" dependencies: - commondir: ^1.0.1 - make-dir: ^3.0.2 - pkg-dir: ^4.1.0 - checksum: 92747cda42bff47a0266b06014610981cfbb71f55d60f2c8216bc3108c83d9745507fb0b14ecf6ab71112bed29cd6fb1a137ee7436179ea36e11287e3159e587 + common-path-prefix: ^3.0.0 + pkg-dir: ^7.0.0 + checksum: 0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff languageName: node linkType: hard @@ -5399,16 +6143,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.0.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 - languageName: node - linkType: hard - "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -5419,19 +6153,38 @@ __metadata: languageName: node linkType: hard -"flux@npm:^4.0.1": - version: 4.0.3 - resolution: "flux@npm:4.0.3" +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: ^7.1.0 + path-exists: ^5.0.0 + checksum: 07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + +"flux@npm:~4.0.1": + version: 4.0.4 + resolution: "flux@npm:4.0.4" dependencies: fbemitter: ^3.0.0 fbjs: ^3.0.1 peerDependencies: react: ^15.0.2 || ^16.0.0 || ^17.0.0 - checksum: a0b8d9dd5c6fdafc0b4418c506d90e68aea47017bc75df7dc05e1f593c263c8b02a0db986c1f6c6b80643105505b8ee21de95a730ac106791d95cbc2e0b6ba66 + checksum: 948bc01b97ff21babc8bfe5c40543d643ca126b71edd447a9ac051b05d20fd549a6bcc4afe043bcde56201782e688a5eaeda1bd8e3e58915641abdd5b3ea21e0 languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7": +"follow-redirects@npm:^1.0.0": version: 1.14.9 resolution: "follow-redirects@npm:1.14.9" peerDependenciesMeta: @@ -5441,6 +6194,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.14.9": + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" + peerDependenciesMeta: + debug: + optional: true + checksum: 915a2cf22e667bdf47b1a43cc6b7dce14d95039e9bbf9a24d0e739abfbdfa00077dd43c86d4a7a19efefcc7a99af144920a175eedc3888d268af5df67c272ee5 + languageName: node + linkType: hard + "fork-ts-checker-webpack-plugin@npm:^6.5.0": version: 6.5.0 resolution: "fork-ts-checker-webpack-plugin@npm:6.5.0" @@ -5472,6 +6235,31 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:^2.1.2": + version: 2.1.4 + resolution: "form-data-encoder@npm:2.1.4" + checksum: 4c06ae2b79ad693a59938dc49ebd020ecb58e4584860a90a230f80a68b026483b022ba5e4143cff06ae5ac8fd446a0b500fabc87bbac3d1f62f2757f8dabcaf7 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + languageName: node + linkType: hard + +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 6032ba747541a43abf3e37b402b2f72ee08ebcb58bf84d816443dd228959837f1cddf1e8775b29fa27ff133f4bd146d041bfca5f9cf27f048edf3d493cf8fee6 + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -5479,10 +6267,10 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: b16c0a6a7f045b3416c1afbb174b7afca73bd7eb0c62598a0c734a8b1f888cb375684174daf170abfba314da9f366b7d6445e396359d5fae640883bdb2ed18cb +"fraction.js@npm:^4.3.6": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 languageName: node linkType: hard @@ -5493,14 +6281,14 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^10.1.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" +"fs-extra@npm:^11.1.1": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: 5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e + checksum: a2480243d7dcfa7d723c5f5b24cf4eba02a6ccece208f1524a2fbde1c629492cfb9a59e4b6d04faff6fbdf71db9fdc8ef7f396417a02884195a625f5d8dc9427 languageName: node linkType: hard @@ -5582,7 +6370,7 @@ __metadata: languageName: node linkType: hard -"gensync@npm:^1.0.0-beta.1, gensync@npm:^1.0.0-beta.2": +"gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" checksum: 782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 @@ -5607,35 +6395,17 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^4.1.0": - version: 4.1.0 - resolution: "get-stream@npm:4.1.0" - dependencies: - pump: ^3.0.0 - checksum: 294d876f667694a5ca23f0ca2156de67da950433b6fb53024833733975d32582896dbc7f257842d331809979efccf04d5e0b6b75ad4d45744c45f193fd497539 - languageName: node - linkType: hard - -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: 49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 languageName: node linkType: hard -"github-slugger@npm:^1.4.0": - version: 1.4.0 - resolution: "github-slugger@npm:1.4.0" - checksum: 849d0aa198c05e774de18bc877e42fb4589a7e68baed974480fed3a5063e4279b6dcb78881b87f7a1c6f73c592271f067d835bac6f6361c796ccbf377f4b5d1e +"github-slugger@npm:^1.5.0": + version: 1.5.0 + resolution: "github-slugger@npm:1.5.0" + checksum: 116f99732925f939cbfd6f2e57db1aa7e111a460db0d103e3b3f2fce6909d44311663d4542350706cad806345b9892358cc3b153674f88eeae77f43380b3bfca languageName: node linkType: hard @@ -5741,22 +6511,29 @@ __metadata: languageName: node linkType: hard -"got@npm:^9.6.0": - version: 9.6.0 - resolution: "got@npm:9.6.0" +"got@npm:^12.1.0": + version: 12.6.1 + resolution: "got@npm:12.6.1" dependencies: - "@sindresorhus/is": ^0.14.0 - "@szmarczak/http-timer": ^1.1.2 - cacheable-request: ^6.0.0 - decompress-response: ^3.3.0 - duplexer3: ^0.1.4 - get-stream: ^4.1.0 - lowercase-keys: ^1.0.1 - mimic-response: ^1.0.1 - p-cancelable: ^1.0.0 - to-readable-stream: ^1.0.0 - url-parse-lax: ^3.0.0 - checksum: 5cb3111e14b48bf4fb8b414627be481ebfb14151ec867e80a74b6d1472489965b9c4f4ac5cf4f3b1f9b90c60a2ce63584d9072b16efd9a3171553e00afc5abc8 + "@sindresorhus/is": ^5.2.0 + "@szmarczak/http-timer": ^5.0.1 + cacheable-lookup: ^7.0.0 + cacheable-request: ^10.2.8 + decompress-response: ^6.0.0 + form-data-encoder: ^2.1.2 + get-stream: ^6.0.1 + http2-wrapper: ^2.1.10 + lowercase-keys: ^3.0.0 + p-cancelable: ^3.0.0 + responselike: ^3.0.0 + checksum: 2fe97fcbd7a9ffc7c2d0ecf59aca0a0562e73a7749cadada9770eeb18efbdca3086262625fb65590594edc220a1eca58fab0d26b0c93c2f9a008234da71ca66b + languageName: node + linkType: hard + +"graceful-fs@npm:4.2.10": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 languageName: node linkType: hard @@ -5823,10 +6600,10 @@ __metadata: languageName: node linkType: hard -"has-yarn@npm:^2.1.0": - version: 2.1.0 - resolution: "has-yarn@npm:2.1.0" - checksum: b5cab61b4129c2fc0474045b59705371b7f5ddf2aab8ba8725011e52269f017e06f75059a2c8a1d8011e9779c2885ad987263cfc6d1280f611c396b45fd5d74a +"has-yarn@npm:^3.0.0": + version: 3.0.0 + resolution: "has-yarn@npm:3.0.0" + checksum: 38c76618cb764e4a98ea114a3938e0bed6ceafb6bacab2ffb32e7c7d1e18b5e09cd03387d507ee87072388e1f20b1f80947fee62c41fc450edfbbdc02a665787 languageName: node linkType: hard @@ -5839,83 +6616,127 @@ __metadata: languageName: node linkType: hard -"hast-to-hyperscript@npm:^9.0.0": - version: 9.0.1 - resolution: "hast-to-hyperscript@npm:9.0.1" +"hast-util-from-parse5@npm:^8.0.0": + version: 8.0.1 + resolution: "hast-util-from-parse5@npm:8.0.1" dependencies: - "@types/unist": ^2.0.3 - comma-separated-tokens: ^1.0.0 - property-information: ^5.3.0 - space-separated-tokens: ^1.0.0 - style-to-object: ^0.3.0 - unist-util-is: ^4.0.0 - web-namespaces: ^1.0.0 - checksum: 630f0db8e1c78d8d6e4f8bd19dec4b6ff6c3048ba0b07b8e34bb812dfbbdc96f4c16abca16c3bfc64e7757921f42790a7bd4a693d6ce99375f99dead65a19a12 + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + devlop: ^1.0.0 + hastscript: ^8.0.0 + property-information: ^6.0.0 + vfile: ^6.0.0 + vfile-location: ^5.0.0 + web-namespaces: ^2.0.0 + checksum: 4a30bb885cff1f0e023c429ae3ece73fe4b03386f07234bf23f5555ca087c2573ff4e551035b417ed7615bde559f394cdaf1db2b91c3b7f0575f3563cd238969 languageName: node linkType: hard -"hast-util-from-parse5@npm:^6.0.0": - version: 6.0.1 - resolution: "hast-util-from-parse5@npm:6.0.1" +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" dependencies: - "@types/parse5": ^5.0.0 - hastscript: ^6.0.0 - property-information: ^5.0.0 - vfile: ^4.0.0 - vfile-location: ^3.2.0 - web-namespaces: ^1.0.0 - checksum: c5e7ee40347c3850ece717e37c3e277ca233848ebca341f68c2afbefdb912da415a2fd06940edc3ea4882ad520e1cac7bf3fcf66c31ae97e1bcf953fcb6a7db5 + "@types/hast": ^3.0.0 + checksum: 5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f languageName: node linkType: hard -"hast-util-parse-selector@npm:^2.0.0": - version: 2.2.5 - resolution: "hast-util-parse-selector@npm:2.2.5" - checksum: 29b7ee77960ded6a99d30c287d922243071cc07b39f2006f203bd08ee54eb8f66bdaa86ef6527477c766e2382d520b60ee4e4087f189888c35d8bcc020173648 +"hast-util-raw@npm:^9.0.0": + version: 9.0.1 + resolution: "hast-util-raw@npm:9.0.1" + dependencies: + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + "@ungap/structured-clone": ^1.0.0 + hast-util-from-parse5: ^8.0.0 + hast-util-to-parse5: ^8.0.0 + html-void-elements: ^3.0.0 + mdast-util-to-hast: ^13.0.0 + parse5: ^7.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: 60ee6495681f020930380649af58b2a6ca081bec1abd1089f58b0ee892eac2c87dc2077fb30370e51848734b58d2d539e3cde5148c18aa70a89f2c7285e57c91 languageName: node linkType: hard -"hast-util-raw@npm:6.0.1": - version: 6.0.1 - resolution: "hast-util-raw@npm:6.0.1" +"hast-util-to-estree@npm:^3.0.0": + version: 3.1.0 + resolution: "hast-util-to-estree@npm:3.1.0" + dependencies: + "@types/estree": ^1.0.0 + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + estree-util-attach-comments: ^3.0.0 + estree-util-is-identifier-name: ^3.0.0 + hast-util-whitespace: ^3.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + style-to-object: ^0.4.0 + unist-util-position: ^5.0.0 + zwitch: ^2.0.0 + checksum: 9003a8bac26a4580d5fc9f2a271d17330dd653266425e9f5539feecd2f7538868d6630a18f70698b8b804bf14c306418a3f4ab3119bb4692aca78b0c08b1291e + languageName: node + linkType: hard + +"hast-util-to-jsx-runtime@npm:^2.0.0": + version: 2.2.0 + resolution: "hast-util-to-jsx-runtime@npm:2.2.0" dependencies: - "@types/hast": ^2.0.0 - hast-util-from-parse5: ^6.0.0 - hast-util-to-parse5: ^6.0.0 - html-void-elements: ^1.0.0 - parse5: ^6.0.0 - unist-util-position: ^3.0.0 - vfile: ^4.0.0 - web-namespaces: ^1.0.0 - xtend: ^4.0.0 - zwitch: ^1.0.0 - checksum: 0ed0a2731251a4853710eda38e0bb79ee1ad8ccea69b391c16eb20895895818bced1c2c9eaf8853280f0aa6dc71d22b9eb6c9aab770dd1a225bb44d522eef1ef + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-whitespace: ^3.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + style-to-object: ^0.4.0 + unist-util-position: ^5.0.0 + vfile-message: ^4.0.0 + checksum: 30c6cf594e83bfef9748d8b15b56bb861281bb2c1e74cb7c30c0c7ca1679e88a2db0accf990a65e5262d4a98cef6f41ea8404042f9a40f97df7b0d915fb4776a languageName: node linkType: hard -"hast-util-to-parse5@npm:^6.0.0": - version: 6.0.0 - resolution: "hast-util-to-parse5@npm:6.0.0" +"hast-util-to-parse5@npm:^8.0.0": + version: 8.0.0 + resolution: "hast-util-to-parse5@npm:8.0.0" dependencies: - hast-to-hyperscript: ^9.0.0 - property-information: ^5.0.0 - web-namespaces: ^1.0.0 - xtend: ^4.0.0 - zwitch: ^1.0.0 - checksum: 49d6c2389fd3170741cdb0483666bccd7e9e436fe386bcbd3931b019e4c006b5bb48022e07967e1021336e744e901082d6479cfa4bc2082efa3b1e5bdab2a36f + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: 3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd languageName: node linkType: hard -"hastscript@npm:^6.0.0": - version: 6.0.0 - resolution: "hastscript@npm:6.0.0" +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 + languageName: node + linkType: hard + +"hastscript@npm:^8.0.0": + version: 8.0.0 + resolution: "hastscript@npm:8.0.0" dependencies: - "@types/hast": ^2.0.0 - comma-separated-tokens: ^1.0.0 - hast-util-parse-selector: ^2.0.0 - property-information: ^5.0.0 - space-separated-tokens: ^1.0.0 - checksum: f76d9cf373cb075c8523c8ad52709f09f7e02b7c9d3152b8d35c65c265b9f1878bed6023f215a7d16523921036d40a7da292cb6f4399af9b5eccac2a5a5eb330 + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-parse-selector: ^4.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + checksum: f0b54bbdd710854b71c0f044612db0fe1b5e4d74fa2001633dc8c535c26033269f04f536f9fd5b03f234de1111808f9e230e9d19493bf919432bb24d541719e0 languageName: node linkType: hard @@ -5970,7 +6791,7 @@ __metadata: languageName: node linkType: hard -"html-minifier-terser@npm:^6.0.2, html-minifier-terser@npm:^6.1.0": +"html-minifier-terser@npm:^6.0.2": version: 6.1.0 resolution: "html-minifier-terser@npm:6.1.0" dependencies: @@ -5987,23 +6808,40 @@ __metadata: languageName: node linkType: hard -"html-tags@npm:^3.2.0": - version: 3.2.0 - resolution: "html-tags@npm:3.2.0" - checksum: fc8ac525e193354bf51b64f0e32a729a2e222b6c0f34cedab0259a35ddc5b7e31ddb556b516ea1a5725339a1085098a5f47ff385a3fa50291523d426b54012da +"html-minifier-terser@npm:^7.2.0": + version: 7.2.0 + resolution: "html-minifier-terser@npm:7.2.0" + dependencies: + camel-case: ^4.1.2 + clean-css: ~5.3.2 + commander: ^10.0.0 + entities: ^4.4.0 + param-case: ^3.0.4 + relateurl: ^0.2.7 + terser: ^5.15.1 + bin: + html-minifier-terser: cli.js + checksum: ffc97c17299d9ec30e17269781b816ea2fc411a9206fc9e768be8f2decb1ea1470892809babb23bb4e3ab1f64d606d97e1803bf526ae3af71edc0fd3070b94b9 languageName: node linkType: hard -"html-void-elements@npm:^1.0.0": - version: 1.0.5 - resolution: "html-void-elements@npm:1.0.5" - checksum: 97b6c108d7d6b31a45deddf95a65eb074bd0f358b55a61f3a031e055812eec368076ca23f0181674c5212166168988f35312756a3b376490e31e73d9a51f5549 +"html-tags@npm:^3.3.1": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: 680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 languageName: node linkType: hard -"html-webpack-plugin@npm:^5.5.0": - version: 5.5.0 - resolution: "html-webpack-plugin@npm:5.5.0" +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.5.3": + version: 5.5.3 + resolution: "html-webpack-plugin@npm:5.5.3" dependencies: "@types/html-minifier-terser": ^6.0.0 html-minifier-terser: ^6.0.2 @@ -6012,7 +6850,7 @@ __metadata: tapable: ^2.0.0 peerDependencies: webpack: ^5.20.0 - checksum: d10fa5888db9ee2afe1d8544107d3d8eb0f30fd88a3304842725e91f9b86cd70fae9954342e6d513bdf9bb13f345c5f51c09421dbd96285593ea7ee8444b188e + checksum: 7ba0d0f87d08f5c4c51f821842d736ec1762940bc39798932528adaec1e9cca8f52944987b88789007f5706d15110edbdfa30df445d61c6628b02ebe163c4f42 languageName: node linkType: hard @@ -6040,7 +6878,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc @@ -6126,6 +6964,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^2.1.10": + version: 2.2.0 + resolution: "http2-wrapper@npm:2.2.0" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.2.0 + checksum: cb4a41a9b4948a607bb27b4e745af5396e01a5e074da4c7ea0d3ce41acd9cef69de373a67d321728bb651fd9701a23c80e8991c9ad5128dab10e9da28a8b6c72 + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "https-proxy-agent@npm:5.0.0" @@ -6186,14 +7034,14 @@ __metadata: languageName: node linkType: hard -"image-size@npm:^1.0.1": - version: 1.0.1 - resolution: "image-size@npm:1.0.1" +"image-size@npm:^1.0.2": + version: 1.0.2 + resolution: "image-size@npm:1.0.2" dependencies: queue: 6.0.2 bin: image-size: bin/image-size.js - checksum: 15d6bea57286e0cdd3c805f345e01d5a9787a147d0176701439812333283d389c1f793b5f15499bcaa03e83f99207d7e9b0c87349da165067c3d9aad1694ec14 + checksum: df518606c75d0ee12a6d7e822a64ef50d9eabbb303dcee8c9df06bad94e49b4d4680b9003968203f239ff39a9cc51d4ff1781cd331cc0a4b3b858d9fc9836c68 languageName: node linkType: hard @@ -6214,10 +7062,10 @@ __metadata: languageName: node linkType: hard -"import-lazy@npm:^2.1.0": - version: 2.1.0 - resolution: "import-lazy@npm:2.1.0" - checksum: c5e5f507d26ee23c5b2ed64577155810361ac37863b322cae0c17f16b6a8cdd15adf370288384ddd95ef9de05602fb8d87bf76ff835190eb037333c84db8062c +"import-lazy@npm:^4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca languageName: node linkType: hard @@ -6259,7 +7107,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.0, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -6280,7 +7128,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.5, ini@npm:~1.3.0": +"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a @@ -6331,20 +7179,20 @@ __metadata: languageName: node linkType: hard -"is-alphabetical@npm:1.0.4, is-alphabetical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphabetical@npm:1.0.4" - checksum: 1505b1de5a1fd74022c05fb21b0e683a8f5229366bac8dc4d34cf6935bcfd104d1125a5e6b083fb778847629f76e5bdac538de5367bdf2b927a1356164e23985 +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7 languageName: node linkType: hard -"is-alphanumerical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphanumerical@npm:1.0.4" +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" dependencies: - is-alphabetical: ^1.0.0 - is-decimal: ^1.0.0 - checksum: d623abae7130a7015c6bf33d99151d4e7005572fd170b86568ff4de5ae86ac7096608b87dd4a1d4dbbd497e392b6396930ba76c9297a69455909cebb68005905 + is-alphabetical: ^2.0.0 + is-decimal: ^2.0.0 + checksum: 4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2 languageName: node linkType: hard @@ -6364,21 +7212,14 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^2.0.0": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: e603f6fced83cf94c53399cff3bda1a9f08e391b872b64a73793b0928be3e5f047f2bcece230edb7632eaea2acdbfcb56c23b33d8a20c820023b230f1485679a - languageName: node - linkType: hard - -"is-ci@npm:^2.0.0": - version: 2.0.0 - resolution: "is-ci@npm:2.0.0" +"is-ci@npm:^3.0.1": + version: 3.0.1 + resolution: "is-ci@npm:3.0.1" dependencies: - ci-info: ^2.0.0 + ci-info: ^3.2.0 bin: is-ci: bin.js - checksum: 17de4e2cd8f993c56c86472dd53dd9e2c7f126d0ee55afe610557046cdd64de0e8feadbad476edc9eeff63b060523b8673d9094ed2ab294b59efb5a66dd05a9a + checksum: 0e81caa62f4520d4088a5bef6d6337d773828a88610346c4b1119fb50c842587ed8bef1e5d9a656835a599e7209405b5761ddf2339668f2d0f4e889a92fe6051 languageName: node linkType: hard @@ -6391,10 +7232,10 @@ __metadata: languageName: node linkType: hard -"is-decimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-decimal@npm:1.0.4" - checksum: a4ad53c4c5c4f5a12214e7053b10326711f6a71f0c63ba1314a77bd71df566b778e4ebd29f9fb6815f07a4dc50c3767fb19bd6fc9fa05e601410f1d64ffeac48 +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334 languageName: node linkType: hard @@ -6437,10 +7278,10 @@ __metadata: languageName: node linkType: hard -"is-hexadecimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-hexadecimal@npm:1.0.4" - checksum: ec4c64e5624c0f240922324bc697e166554f09d3ddc7633fc526084502626445d0a871fbd8cae52a9844e83bd0bb414193cc5a66806d7b2867907003fc70c5ea +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626 languageName: node linkType: hard @@ -6461,10 +7302,10 @@ __metadata: languageName: node linkType: hard -"is-npm@npm:^5.0.0": - version: 5.0.0 - resolution: "is-npm@npm:5.0.0" - checksum: 8ded3ae1119bbbda22395fe1c64d2d79d3b3baeb2635c90f9a9dca4b8ce19a67b55fda178269b63421b257b361892fd545807fb5ac212f06776f544d9fcc3ab0 +"is-npm@npm:^6.0.0": + version: 6.0.0 + resolution: "is-npm@npm:6.0.0" + checksum: 1f064c66325cba6e494783bee4e635caa2655aad7f853a0e045d086e0bb7d83d2d6cdf1745dc9a7c7c93dacbf816fbee1f8d9179b02d5d01674d4f92541dc0d9 languageName: node linkType: hard @@ -6503,13 +7344,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^2.0.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: e5c9814cdaa627a9ad0a0964ded0e0491bfd9ace405c49a5d63c88b30a162f1512c069d5b80997893c4d0181eadc3fed02b4ab4b81059aba5620bfcdfdeb9c53 - languageName: node - linkType: hard - "is-plain-obj@npm:^3.0.0": version: 3.0.0 resolution: "is-plain-obj@npm:3.0.0" @@ -6517,6 +7351,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + "is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -6526,6 +7367,22 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-reference@npm:^3.0.0": + version: 3.0.2 + resolution: "is-reference@npm:3.0.2" + dependencies: + "@types/estree": "*" + checksum: 652d31b405e8e8269071cee78fe874b072745012eba202c6dc86880fd603a65ae043e3160990ab4a0a4b33567cbf662eecf3bc6b3c2c1550e6c2b6cf885ce5aa + languageName: node + linkType: hard + "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" @@ -6554,20 +7411,6 @@ __metadata: languageName: node linkType: hard -"is-whitespace-character@npm:^1.0.0": - version: 1.0.4 - resolution: "is-whitespace-character@npm:1.0.4" - checksum: 20f02cf42eafb44ff1706a04338dc45095cd691ae6984adb9a211b6b6df8d01e91722129ce55555e4c7c7b0b7d48e217553767f22eb7ec019b9f8dd3bc12cdfb - languageName: node - linkType: hard - -"is-word-character@npm:^1.0.0": - version: 1.0.4 - resolution: "is-word-character@npm:1.0.4" - checksum: 2247844064532986dc70869d961dccd1366932a147b52d4ec7f567f87edf7f9855a27b75f66b781db3b3175bbe05a76acbc6392a1a5c64c4c99fe3459dae33bd - languageName: node - linkType: hard - "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -6577,10 +7420,10 @@ __metadata: languageName: node linkType: hard -"is-yarn-global@npm:^0.3.0": - version: 0.3.0 - resolution: "is-yarn-global@npm:0.3.0" - checksum: 9f1ab6f28e6e7961c4b97e564791d1decf2886a0dbe9b92b2176d76156adbb42b4c06c0f33d7107b270c207cbcfe0b2293b7cc4a0ec6774ac6d37af9503d51e1 +"is-yarn-global@npm:^0.4.0": + version: 0.4.1 + resolution: "is-yarn-global@npm:0.4.1" + checksum: 8ff66f33454614f8e913ad91cc4de0d88d519a46c1ed41b3f589da79504ed0fcfa304064fe3096dda9360c5f35aa210cb8e978fd36798f3118cb66a4de64d365 languageName: node linkType: hard @@ -6612,7 +7455,21 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^27.4.5, jest-worker@npm:^27.5.1": +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": version: 27.5.1 resolution: "jest-worker@npm:27.5.1" dependencies: @@ -6623,16 +7480,37 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.6.0": - version: 17.6.0 - resolution: "joi@npm:17.6.0" +"jest-worker@npm:^29.1.2": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "*" + jest-util: ^29.7.0 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 + languageName: node + linkType: hard + +"jiti@npm:^1.18.2, jiti@npm:^1.20.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: 7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f + languageName: node + linkType: hard + +"joi@npm:^17.11.0, joi@npm:^17.9.2": + version: 17.11.0 + resolution: "joi@npm:17.11.0" dependencies: "@hapi/hoek": ^9.0.0 "@hapi/topo": ^5.0.0 "@sideway/address": ^4.1.3 - "@sideway/formula": ^3.0.0 + "@sideway/formula": ^3.0.1 "@sideway/pinpoint": ^2.0.0 - checksum: dee09b8475df3c51b92ea10e429a7e6ae5935349f96e04b4600182e04451dfd7238bb1a7953eaeb0b83c2d00c1138377869b32bbd337612f4471d35309f5f13b + checksum: c41c86fe772828b88fbdbcaef2e41235ccbb107c22523a377f9a2fd39829f203213f37a352589f49d9a9b38bf1c645846defede8b81d8c1f3123117c1a600010 languageName: node linkType: hard @@ -6684,10 +7562,10 @@ __metadata: languageName: node linkType: hard -"json-buffer@npm:3.0.0": - version: 3.0.0 - resolution: "json-buffer@npm:3.0.0" - checksum: 118c060d84430a8ad8376d0c60250830f350a6381bd56541a1ef257ce7ba82d109d1f71a4c4e92e0be0e7ab7da568fad8f7bf02905910a76e8e0aa338621b944 +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 languageName: node linkType: hard @@ -6712,7 +7590,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.1": +"json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -6734,12 +7612,12 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^3.0.0": - version: 3.1.0 - resolution: "keyv@npm:3.1.0" +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: - json-buffer: 3.0.0 - checksum: 6ad784361b4c0213333a8c5bc0bcc59cf46cb7cbbe21fb2f1539ffcc8fe18b8f1562ff913b40552278fdea5f152a15996dfa61ce24ce1a22222560c650be4a1b + json-buffer: 3.0.1 + checksum: aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e languageName: node linkType: hard @@ -6757,19 +7635,22 @@ __metadata: languageName: node linkType: hard -"klona@npm:^2.0.5": - version: 2.0.5 - resolution: "klona@npm:2.0.5" - checksum: 5b752c11ca8e2996612386699f52cc5aed802aa4116663d26239ac0b054fae25191dacb95587ecf1a167b039daa9fc3fa2da17dfd5d0821f3037de3821d9a9e5 +"latest-version@npm:^7.0.0": + version: 7.0.0 + resolution: "latest-version@npm:7.0.0" + dependencies: + package-json: ^8.1.0 + checksum: 68045f5e419e005c12e595ae19687dd88317dd0108b83a8773197876622c7e9d164fe43aacca4f434b2cba105c92848b89277f658eabc5d50e81fb743bbcddb1 languageName: node linkType: hard -"latest-version@npm:^5.1.0": - version: 5.1.0 - resolution: "latest-version@npm:5.1.0" +"launch-editor@npm:^2.6.0": + version: 2.6.1 + resolution: "launch-editor@npm:2.6.1" dependencies: - package-json: ^6.3.0 - checksum: 6219631d8651467c54c58ef1b5d5c5c53e146f5ae2b0ecbb78b202da3eaad55b05b043db2d2d6f1d4230ee071b2ae8c2f85089e01377e4338bad97fa76a963b7 + picocolors: ^1.0.0 + shell-quote: ^1.8.1 + checksum: 82d0bd9a44e7a972157719e63dac1b8196db6ec7066c1ec57a495f6c3d6e734f3c4da89549e7b33eb3b0356668ad02a9e7782b6733f5ebd7a61b7c5f635a3ee9 languageName: node linkType: hard @@ -6836,15 +7717,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 - languageName: node - linkType: hard - "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -6854,6 +7726,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: ^6.0.0 + checksum: 139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + "lodash.curry@npm:^4.0.1": version: 4.1.1 resolution: "lodash.curry@npm:4.1.1" @@ -6868,6 +7749,20 @@ __metadata: languageName: node linkType: hard +"lodash.escape@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.escape@npm:4.0.1" + checksum: 90ade409cec05b6869090476952fdfb84d4d87b1ff4a0e03ebd590f980d9a1248d93ba14579f10d80c6429e4d6af13ba137c28db64cae6dadb71442e54a3ad2b + languageName: node + linkType: hard + +"lodash.flatten@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.flatten@npm:4.4.0" + checksum: 97e8f0d6b61fe4723c02ad0c6e67e51784c4a2c48f56ef283483e556ad01594cf9cec9c773e177bbbdbdb5d19e99b09d2487cb6b6e5dc405c2693e93b125bd3a + languageName: node + linkType: hard + "lodash.flow@npm:^3.3.0": version: 3.5.0 resolution: "lodash.flow@npm:3.5.0" @@ -6875,6 +7770,13 @@ __metadata: languageName: node linkType: hard +"lodash.invokemap@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.invokemap@npm:4.6.0" + checksum: 2bcc5f4b8782a316d55ff139215eb797f576f0f6d3db2755ebba7b35fd6061f8cbe81702a72a30bc6d70073a5dcc461f7570eaddcc9184c2e42ec3023645c6a1 + languageName: node + linkType: hard + "lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -6882,20 +7784,41 @@ __metadata: languageName: node linkType: hard -"lodash.uniq@npm:4.5.0, lodash.uniq@npm:^4.5.0": +"lodash.pullall@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.pullall@npm:4.2.0" + checksum: b129e8d879258c7db04a7dc1c23dd9e37c52f63a04e105faa8d2ab55e97b5a170d5e15cffbb732a36e7f48c4345c07b6fbddfe50e1f5ec301492b6f64a92040c + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" checksum: 262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e languageName: node linkType: hard -"lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash.uniqby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.uniqby@npm:4.7.0" + checksum: c505c0de20ca759599a2ba38710e8fb95ff2d2028e24d86c901ef2c74be8056518571b9b754bfb75053b2818d30dd02243e4a4621a6940c206bbb3f7626db656 + languageName: node + linkType: hard + +"lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: 7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -6916,17 +7839,19 @@ __metadata: languageName: node linkType: hard -"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1": - version: 1.0.1 - resolution: "lowercase-keys@npm:1.0.1" - checksum: 56776a8e1ef1aca98ecf6c19b30352ae1cf257b65b8ac858b7d8a0e8b348774d12a9b41aa7f59bfea51bff44bc7a198ab63ba4406bfba60dba008799618bef66 +"lowercase-keys@npm:^3.0.0": + version: 3.0.0 + resolution: "lowercase-keys@npm:3.0.0" + checksum: ef62b9fa5690ab0a6e4ef40c94efce68e3ed124f583cc3be38b26ff871da0178a28b9a84ce0c209653bb25ca135520ab87fea7cd411a54ac4899cb2f30501430 languageName: node linkType: hard -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: ^3.0.2 + checksum: 89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 languageName: node linkType: hard @@ -6946,15 +7871,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: ^6.0.0 - checksum: 56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa - languageName: node - linkType: hard - "make-fetch-happen@npm:^10.0.3": version: 10.0.4 resolution: "make-fetch-happen@npm:10.0.4" @@ -6979,51 +7895,269 @@ __metadata: languageName: node linkType: hard -"markdown-escapes@npm:^1.0.0": - version: 1.0.4 - resolution: "markdown-escapes@npm:1.0.4" - checksum: cf3f2231191d9df61cd1d02a50a55a5c89ab9cebfe75572950f4844b93a41d561eed2d82e42732d55f2c55fa0d426b51df3a7f378b4068ae1e2923bb758a9cc8 +"markdown-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-extensions@npm:2.0.0" + checksum: 406139da2aa0d5ebad86195c8e8c02412f873c452b4c087ae7bc767af37956141be449998223bb379eea179b5fd38dfa610602b6f29c22ddab5d51e627a7e41d languageName: node linkType: hard -"mdast-squeeze-paragraphs@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-squeeze-paragraphs@npm:4.0.0" +"markdown-table@npm:^3.0.0": + version: 3.0.3 + resolution: "markdown-table@npm:3.0.3" + checksum: 47433a3f31e4637a184e38e873ab1d2fadfb0106a683d466fec329e99a2d8dfa09f091fa42202c6f13ec94aef0199f449a684b28042c636f2edbc1b7e1811dcd + languageName: node + linkType: hard + +"mdast-util-directive@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-directive@npm:3.0.0" dependencies: - unist-util-remove: ^2.0.0 - checksum: 0b44a85d7e6d98772b1dbb28a46a35c74c2791c6cf057bfd2e590a4e011d626627e5bf82d4497706f0dae03da02a63a9279aca17c4c23a9c7173792adba8e6fc + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 4a71b27f5f0c4ead5293a12d4118d4d832951ac0efdeba4af2dd78f5679f9cabee80feb3619f219a33674c12df3780def1bd3150d7298aaf0ef734f0dfbab999 languageName: node linkType: hard -"mdast-util-definitions@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-definitions@npm:4.0.0" +"mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": + version: 3.0.1 + resolution: "mdast-util-find-and-replace@npm:3.0.1" dependencies: - unist-util-visit: ^2.0.0 - checksum: d81bb0b702f99878c8e8e4f66dd7f6f673ab341f061b3d9487ba47dad28b584e02f16b4c42df23714eaac8a7dd8544ba7d77308fad8d4a9fd0ac92e2a7f56be9 + "@types/mdast": ^4.0.0 + escape-string-regexp: ^5.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 1faca98c4ee10a919f23b8cc6d818e5bb6953216a71dfd35f51066ed5d51ef86e5063b43dcfdc6061cd946e016a9f0d44a1dccadd58452cf4ed14e39377f00cb languageName: node linkType: hard -"mdast-util-to-hast@npm:10.0.1": - version: 10.0.1 - resolution: "mdast-util-to-hast@npm:10.0.1" +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-from-markdown@npm:2.0.0" dependencies: - "@types/mdast": ^3.0.0 - "@types/unist": ^2.0.0 - mdast-util-definitions: ^4.0.0 - mdurl: ^1.0.0 - unist-builder: ^2.0.0 - unist-util-generated: ^1.0.0 - unist-util-position: ^3.0.0 - unist-util-visit: ^2.0.0 - checksum: 08d0977c60ee951cb5e2e84bc821a842da463c37f7bbb79abf0be0894120ed5e2fc1d003d072d3bb968d8e813a916e132a094166d5562deb424acc45e1c661f4 + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + mdast-util-to-string: ^4.0.0 + micromark: ^4.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: fb66e917f66e33fc60d6964264c4abd519fd8829a4a58ff9c61b2ba5c337554fb954b9ec31ca1c34e83c1163a73f310c39072d656f9a2d3184fe39c87cbba65a + languageName: node + linkType: hard + +"mdast-util-frontmatter@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-frontmatter@npm:2.0.1" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + escape-string-regexp: ^5.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + micromark-extension-frontmatter: ^2.0.0 + checksum: d9b0b70dd9c574cc0220d4e05dd8e9d86ac972a6a5af9e0c49c839b31cb750d4313445cfbbdf9264a7fbe3f8c8d920b45358b8500f4286e6b9dc830095b25b9a + languageName: node + linkType: hard + +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + ccount: ^2.0.0 + devlop: ^1.0.0 + mdast-util-find-and-replace: ^3.0.0 + micromark-util-character: ^2.0.0 + checksum: 821ef91db108f05b321c54fdf4436df9d6badb33e18f714d8d52c0e70f988f5b6b118cdd4d607b4cb3bef1718304ce7e9fb25fa580622c3d20d68c1489c64875 + languageName: node + linkType: hard + +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-footnote@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + checksum: c673b22bea24740235e74cfd66765b41a2fa540334f7043fa934b94938b06b7d3c93f2d3b33671910c5492b922c0cc98be833be3b04cfed540e0679650a6d2de + languageName: node + linkType: hard + +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 + languageName: node + linkType: hard + +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + markdown-table: ^3.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e + languageName: node + linkType: hard + +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 + languageName: node + linkType: hard + +"mdast-util-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-gfm@npm:3.0.0" + dependencies: + mdast-util-from-markdown: ^2.0.0 + mdast-util-gfm-autolink-literal: ^2.0.0 + mdast-util-gfm-footnote: ^2.0.0 + mdast-util-gfm-strikethrough: ^2.0.0 + mdast-util-gfm-table: ^2.0.0 + mdast-util-gfm-task-list-item: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 91596fe9bf3e4a0c546d0c57f88106c17956d9afbe88ceb08308e4da2388aff64489d649ddad599caecfdf755fc3ae4c9b82c219b85281bc0586b67599881fca languageName: node linkType: hard -"mdast-util-to-string@npm:^2.0.0": +"mdast-util-mdx-expression@npm:^2.0.0": version: 2.0.0 - resolution: "mdast-util-to-string@npm:2.0.0" - checksum: a4231085133cdfec24644b694c13661e5a01d26716be0105b6792889faa04b8030e4abbf72d4be3363098b2b38b2b98f1f1f1f0858eb6580dc04e2aca1436a37 + resolution: "mdast-util-mdx-expression@npm:2.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 512848cbc44b9dc7cffc1bb3f95f7e67f0d6562870e56a67d25647f475d411e136b915ba417c8069fb36eac1839d0209fb05fb323d377f35626a82fcb0879363 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-mdx-jsx@npm:3.0.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-remove-position: ^5.0.0 + unist-util-stringify-position: ^4.0.0 + vfile-message: ^4.0.0 + checksum: c14fc72587acd482086be56bb809a142b4d732833593c9a14c1ebb863e549aafbc9391507b177eac8788b2a9de624b8665a2092c75243bbe80f808728ffa421a + languageName: node + linkType: hard + +"mdast-util-mdx@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-mdx@npm:3.0.0" + dependencies: + mdast-util-from-markdown: ^2.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 4faea13f77d6bc9aa64ee41a5e4779110b73444a17fda363df6ebe880ecfa58b321155b71f8801c3faa6d70d6222a32a00cbd6dbf5fad8db417f4688bc9c74e1 + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdxjs-esm@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-phrasing@npm:4.0.0" + dependencies: + "@types/mdast": ^4.0.0 + unist-util-is: ^6.0.0 + checksum: bf281d159d1a9a9705ed8fdbadb70c9633d1c25716ff2c282b6c2ecbc1f05cff10f73e5280d754ed833b09d42b00260c4b8d0a5fed4ce3236d4cffb5230b50cf + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^13.0.0": + version: 13.0.2 + resolution: "mdast-util-to-hast@npm:13.0.2" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@ungap/structured-clone": ^1.0.0 + devlop: ^1.0.0 + micromark-util-sanitize-uri: ^2.0.0 + trim-lines: ^3.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + checksum: f6e9a5b1ab94483ce1cf2ef229578fde4fe7d085f8b9d88a048823da5f93f9469adc98839e8db73f7475e8128a6df30eccad9cd0f9ee0a1d410e74db19b82d8c + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-to-markdown@npm:2.1.0" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^4.0.0 + mdast-util-to-string: ^4.0.0 + micromark-util-decode-string: ^2.0.0 + unist-util-visit: ^5.0.0 + zwitch: ^2.0.0 + checksum: 8bd37a9627a438ef6418d6642661904d0cc03c5c732b8b018a8e238ef5cc82fe8aef1940b19c6f563245e58b9659f35e527209bd3fe145f3c723ba14d18fc3e6 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": ^4.0.0 + checksum: 2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 languageName: node linkType: hard @@ -7034,61 +8168,552 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.0": +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"memfs@npm:^3.1.2, memfs@npm:^3.4.1": + version: 3.4.1 + resolution: "memfs@npm:3.4.1" + dependencies: + fs-monkey: 1.0.3 + checksum: d8f73f0903c7802027fea07b5cc39fc984f0fdff528214a0ef2937001fec88e11d755675a725e83a2b14a7c96c054c903bf7d1774d5133116597f201c37f6a5e + languageName: node + linkType: hard + +"memoize-one@npm:^5.1.1": + version: 5.2.1 + resolution: "memoize-one@npm:5.2.1" + checksum: fd22dbe9a978a2b4f30d6a491fc02fb90792432ad0dab840dc96c1734d2bd7c9cdeb6a26130ec60507eb43230559523615873168bcbe8fafab221c30b11d54c1 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.1": version: 1.0.1 - resolution: "mdurl@npm:1.0.1" - checksum: ea8534341eb002aaa532a722daef6074cd8ca66202e10a2b4cda46722c1ebdb1da92197ac300bc953d3ef1bf41cd6561ef2cc69d82d5d0237dae00d4a61a4eee + resolution: "merge-descriptors@npm:1.0.1" + checksum: b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-core-commonmark@npm:2.0.0" + dependencies: + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-factory-destination: ^2.0.0 + micromark-factory-label: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-factory-title: ^2.0.0 + micromark-factory-whitespace: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-html-tag-name: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e087824b98d1f1d0db34791ac53945b0d68fb5e541c6c9da6700cc3db54d6b697d8110d3120d5d30e2fb39443aabddccd3e2bbf684795359f38b5a696fdc5913 + languageName: node + linkType: hard + +"micromark-extension-directive@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-directive@npm:3.0.0" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-factory-whitespace: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + parse-entities: ^4.0.0 + checksum: ee84ecb445fb9f94bf36bf8f0dfd2c81b3fb5f46c275b9ac4445b9a0030a1ccbc3174707321b5512116f482e3a1fc8f0541ccaf57f924999f48141818f05595e + languageName: node + linkType: hard + +"micromark-extension-frontmatter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-frontmatter@npm:2.0.0" + dependencies: + fault: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 7d0d876e598917a67146d29f536d6fbbf9d1b2401a77e2f64a3f80f934a63ff26fa94b01759c9185c24b2a91e4e6abf908fa7aa246f00a7778a6b37a17464300 + languageName: node + linkType: hard + +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 9349b8a4c45ad6375d85f196ef6ffc7472311bf0e7493dc387cb6e37498c2fa56f0b670f54ae54f0c6bbbed3b22997643f05057ffcc58457ca56368f7a636319 + languageName: node + linkType: hard + +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-footnote@npm:2.0.0" + dependencies: + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 59958d8a6e28a16470937de69a01476cd9766f310a892655cb6bcd32b0833ffaa8accddb77e031b1c710c856fc943174e1b0f8f2c60dfa542743f4ba7cff6f15 + languageName: node + linkType: hard + +"micromark-extension-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.0.0" + dependencies: + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b1c4f0e12935e1ffa3981a256de38c5c347f91a015cc1002c0bcdbab476fa97a5992f0d5a9788b2437a96bc94fe4c32d5f539d84b2d699a36dafe31b81b41eb1 + languageName: node + linkType: hard + +"micromark-extension-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-table@npm:2.0.0" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 3777b5074054d97888ffdcb8e383399adc9066a755ad7197423fda16e09769a18d7e713d969c204228d9abf1e18fef19c7b04790698afc973418ea5f75015f72 + languageName: node + linkType: hard + +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: 995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d + languageName: node + linkType: hard + +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-extension-gfm-task-list-item@npm:2.0.1" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 16a55040a1697339eeeeebaabbbe28dc9e8281979cdeec343a58dc97f7b447365d3e37329f394455c5d17902639b786c7669dbbc4ea558cf8680eb7808330598 + languageName: node + linkType: hard + +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" + dependencies: + micromark-extension-gfm-autolink-literal: ^2.0.0 + micromark-extension-gfm-footnote: ^2.0.0 + micromark-extension-gfm-strikethrough: ^2.0.0 + micromark-extension-gfm-table: ^2.0.0 + micromark-extension-gfm-tagfilter: ^2.0.0 + micromark-extension-gfm-task-list-item: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 + languageName: node + linkType: hard + +"micromark-extension-mdx-expression@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdx-expression@npm:3.0.0" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + micromark-factory-mdx-expression: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: fa799c594d8ff9ecbbd28e226959c4928590cfcddb60a926d9d859d00fc7acd25684b6f78dbe6a7f0830879a402b4a3628efd40bb9df1f5846e6d2b7332715f7 + languageName: node + linkType: hard + +"micromark-extension-mdx-jsx@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdx-jsx@npm:3.0.0" + dependencies: + "@types/acorn": ^4.0.0 + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + micromark-factory-mdx-expression: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + vfile-message: ^4.0.0 + checksum: 18a81c8def7f3a2088dc435bba19e649c19f679464b1a01e2c680f9518820e70fb0974b8403c790aee8f44205833a280b56ba157fe5a5b2903b476c5de5ba353 + languageName: node + linkType: hard + +"micromark-extension-mdx-md@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-mdx-md@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: bae91c61273de0e5ba80a980c03470e6cd9d7924aa936f46fbda15d780704d9386e945b99eda200e087b96254fbb4271a9545d5ce02676cd6ae67886a8bf82df + languageName: node + linkType: hard + +"micromark-extension-mdxjs-esm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-position-from-estree: ^2.0.0 + vfile-message: ^4.0.0 + checksum: 13e3f726495a960650cdedcba39198ace5bdc953ccb12c14d71fc9ed9bb88e40cc3ba9231e973f6984da3b3573e7ddb23ce409f7c16f52a8d57b608bf46c748d + languageName: node + linkType: hard + +"micromark-extension-mdxjs@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs@npm:3.0.0" + dependencies: + acorn: ^8.0.0 + acorn-jsx: ^5.0.0 + micromark-extension-mdx-expression: ^3.0.0 + micromark-extension-mdx-jsx: ^3.0.0 + micromark-extension-mdx-md: ^2.0.0 + micromark-extension-mdxjs-esm: ^3.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: fd84f036ddad0aabbc12e7f1b3e9dcfe31573bbc413c5ae903779ef0366d7a4c08193547e7ba75718c9f45654e45f52e575cfc2f23a5f89205a8a70d9a506aea + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-destination@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b73492f687d41a6a379159c2f3acbf813042346bcea523d9041d0cc6124e6715f0779dbb2a0b3422719e9764c3b09f9707880aa159557e3cb4aeb03b9d274915 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-label@npm:2.0.0" + dependencies: + devlop: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 8ffad00487a7891941b1d1f51d53a33c7a659dcf48617edb7a4008dad7aff67ec316baa16d55ca98ae3d75ce1d81628dbf72fedc7c6f108f740dec0d5d21c8ee + languageName: node + linkType: hard + +"micromark-factory-mdx-expression@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-mdx-expression@npm:2.0.1" + dependencies: + "@types/estree": ^1.0.0 + devlop: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-events-to-acorn: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-position-from-estree: ^2.0.0 + vfile-message: ^4.0.0 + checksum: d9cf475a73a7fbfa09aba0d057e033d57e45b7adff78692be9efb4405c4a1717ece4594a632f92a4302e4f8f2ae96355785b616e3f5b2fe8599ec24cfdeee12d + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 3da81187ce003dd4178c7adc4674052fb8befc8f1a700ae4c8227755f38581a4ae963866dc4857488d62d1dc9837606c9f2f435fa1332f62a0f1c49b83c6a822 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-space@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 103ca954dade963d4ff1d2f27d397833fe855ddc72590205022832ef68b775acdea67949000cee221708e376530b1de78c745267b0bf8366740840783eb37122 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-title@npm:2.0.0" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 2b2188e7a011b1b001faf8c860286d246d5c3485ef8819270c60a5808f4c7613e49d4e481dbdff62600ef7acdba0f5100be2d125cbd2a15e236c26b3668a8ebd + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-whitespace@npm:2.0.0" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 4e91baab0cc71873095134bd0e225d01d9786cde352701402d71b72d317973954754e8f9f1849901f165530e6421202209f4d97c460a27bb0808ec5a3fc3148c + languageName: node + linkType: hard + +"micromark-util-character@npm:^1.0.0, micromark-util-character@npm:^1.1.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 3390a675a50731b58a8e5493cd802e190427f10fa782079b455b00f6b54e406e36882df7d4a3bd32b709f7a2c3735b4912597ebc1c0a99566a8d8d0b816e2cd4 + languageName: node + linkType: hard + +"micromark-util-character@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-character@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 5b91c90f29c8873a9f2f2385bbeb70f481b0e56c26092451d1796cd323257927a69eccca19b079d83d5751ec6fc92964214a3c868114555f87631426631df6b9 + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-chunked@npm:2.0.0" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 043b5f2abc8c13a1e2e4c378ead191d1a47ed9e0cd6d0fa5a0a430b2df9e17ada9d5de5a20688a000bbc5932507e746144acec60a9589d9a79fa60918e029203 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-classify-character@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 2bf5fa5050faa9b69f6c7e51dbaaf02329ab70fabad8229984381b356afbbf69db90f4617bec36d814a7d285fb7cad8e3c4e38d1daf4387dc9e240aa7f9a292a + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-combine-extensions@npm:2.0.0" + dependencies: + micromark-util-chunked: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: cd4c8d1a85255527facb419ff3b3cc3d7b7f27005c5ef5fa7ef2c4d0e57a9129534fc292a188ec2d467c2c458642d369c5f894bc8a9e142aed6696cc7989d3ea + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 3f6d684ee8f317c67806e19b3e761956256cb936a2e0533aad6d49ac5604c6536b2041769c6febdd387ab7175b7b7e551851bf2c1f78da943e7a3671ca7635ac + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-decode-string@npm:2.0.0" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: f5413bebb21bdb686cfa1bcfa7e9c93093a523d1b42443ead303b062d2d680a94e5e8424549f57b8ba9d786a758e5a26a97f56068991bbdbca5d1885b3aa7227 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-encode@npm:2.0.0" + checksum: ebdaafff23100bbf4c74e63b4b1612a9ddf94cd7211d6a076bc6fb0bc32c1b48d6fb615aa0953e607c62c97d849f97f1042260d3eb135259d63d372f401bbbb2 + languageName: node + linkType: hard + +"micromark-util-events-to-acorn@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-events-to-acorn@npm:2.0.2" + dependencies: + "@types/acorn": ^4.0.0 + "@types/estree": ^1.0.0 + "@types/unist": ^3.0.0 + devlop: ^1.0.0 + estree-util-visit: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + vfile-message: ^4.0.0 + checksum: 2bd2660a49efddb625e6adcabdc3384ae4c50c7a04270737270f4aab53d09e8253e6d2607cd947c4c77f8a9900278915babb240e61fd143dc5bab51d9fd50709 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-html-tag-name@npm:2.0.0" + checksum: 988aa26367449bd345b627ae32cf605076daabe2dc1db71b578a8a511a47123e14af466bcd6dcbdacec60142f07bc2723ec5f7a0eed0f5319ce83b5e04825429 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-normalize-identifier@npm:2.0.0" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 93bf8789b8449538f22cf82ac9b196363a5f3b2f26efd98aef87c4c1b1f8c05be3ef6391ff38316ff9b03c1a6fd077342567598019ddd12b9bd923dacc556333 + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-resolve-all@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: 3b912e88453dcefe728a9080c8934a75ac4732056d6576ceecbcaf97f42c5d6fa2df66db8abdc8427eb167c5ffddefe26713728cfe500bc0e314ed260d6e2746 languageName: node linkType: hard -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-sanitize-uri@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: 74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 languageName: node linkType: hard -"memfs@npm:^3.1.2, memfs@npm:^3.4.1": - version: 3.4.1 - resolution: "memfs@npm:3.4.1" +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-subtokenize@npm:2.0.0" dependencies: - fs-monkey: 1.0.3 - checksum: d8f73f0903c7802027fea07b5cc39fc984f0fdff528214a0ef2937001fec88e11d755675a725e83a2b14a7c96c054c903bf7d1774d5133116597f201c37f6a5e + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 1907c56c4974d430b984c50b3eb0930241112d931e611f178dee17d58f2976614950631b70f4e9c7e49dbccf21f91654ee61f250e028bf2f2b0f3d3aeb168da8 languageName: node linkType: hard -"memoize-one@npm:^5.1.1": - version: 5.2.1 - resolution: "memoize-one@npm:5.2.1" - checksum: fd22dbe9a978a2b4f30d6a491fc02fb90792432ad0dab840dc96c1734d2bd7c9cdeb6a26130ec60507eb43230559523615873168bcbe8fafab221c30b11d54c1 +"micromark-util-symbol@npm:^1.0.0, micromark-util-symbol@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 10ceaed33a90e6bfd3a5d57053dbb53f437d4809cc11430b5a09479c0ba601577059be9286df4a7eae6e350a60a2575dc9fa9d9872b5b8d058c875e075c33803 languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-symbol@npm:2.0.0" + checksum: 4e76186c185ce4cefb9cea8584213d9ffacd77099d1da30c0beb09fa21f46f66f6de4c84c781d7e34ff763fe3a06b530e132fa9004882afab9e825238d0aa8b3 languageName: node linkType: hard -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 +"micromark-util-types@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: a9749cb0a12a252ff536baabcb7012421b6fad4d91a5fdd80d7b33dc7b4c22e2d0c4637dfe5b902d00247fe6c9b01f4a24fce6b572b16ccaa4da90e6ce2a11e4 languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb +"micromark-util-types@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-types@npm:2.0.0" + checksum: d74e913b9b61268e0d6939f4209e3abe9dada640d1ee782419b04fd153711112cfaaa3c4d5f37225c9aee1e23c3bb91a1f5223e1e33ba92d33e83956a53e61de languageName: node linkType: hard -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 +"micromark@npm:^4.0.0": + version: 4.0.0 + resolution: "micromark@npm:4.0.0" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 7e91c8d19ff27bc52964100853f1b3b32bb5b2ece57470a34ba1b2f09f4e2a183d90106c4ae585c9f2046969ee088576fed79b2f7061cba60d16652ccc2c64fd languageName: node linkType: hard @@ -7109,7 +8734,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa @@ -7132,6 +8757,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + "mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.34 resolution: "mime-types@npm:2.1.34" @@ -7157,34 +8791,28 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 languageName: node linkType: hard -"mini-create-react-context@npm:^0.4.0": - version: 0.4.1 - resolution: "mini-create-react-context@npm:0.4.1" - dependencies: - "@babel/runtime": ^7.12.1 - tiny-warning: ^1.0.3 - peerDependencies: - prop-types: ^15.0.0 - react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 80b8daa8fa6092293547984537c8193093e32d0025d387d8d21b6a2807bbf6f209bceef97eb61c518be9c4f7dfcd077584d1c8dbcd828a0e96b80273a5bad148 +"mimic-response@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-response@npm:4.0.0" + checksum: 761d788d2668ae9292c489605ffd4fad220f442fbae6832adce5ebad086d691e906a6d5240c290293c7a11e99fbdbbef04abbbed498bf8699a4ee0f31315e3fb languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.6.1": - version: 2.6.1 - resolution: "mini-css-extract-plugin@npm:2.6.1" +"mini-css-extract-plugin@npm:^2.7.6": + version: 2.7.6 + resolution: "mini-css-extract-plugin@npm:2.7.6" dependencies: schema-utils: ^4.0.0 peerDependencies: webpack: ^5.0.0 - checksum: 4de5c1163fcb4ea9a7cb96c97141c41a8d46940677931db5a60c2bafc5389ada56fa29533d79ea7d4aec8462e9d39db0cb43c31d9d1d5402bdfa3acb9dea896b + checksum: 4862da928f52c18b37daa52d548c9f2a1ac65c900a48b63f7faa3354d8cfcd21618c049696559e73e2e27fc12d46748e6a490e0b885e54276429607d0d08c156 languageName: node linkType: hard @@ -7204,7 +8832,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4": +"minimatch@npm:3.1.2, minimatch@npm:^3.0.4": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7213,13 +8841,20 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5": +"minimist@npm:^1.2.0": version: 1.2.7 resolution: "minimist@npm:1.2.7" checksum: 8808da67ca50ee19ab2d69051d77ee78572e67297fd8a1635ecc757a15106ccdfb5b8c4d11d84750120142f1684e5329a141295728c755e5d149eedd73cc6572 languageName: node linkType: hard +"minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + "minipass-collect@npm:^1.0.2": version: 1.0.2 resolution: "minipass-collect@npm:1.0.2" @@ -7372,12 +9007,15 @@ __metadata: languageName: node linkType: hard -"node-emoji@npm:^1.10.0": - version: 1.11.0 - resolution: "node-emoji@npm:1.11.0" +"node-emoji@npm:^2.1.0": + version: 2.1.0 + resolution: "node-emoji@npm:2.1.0" dependencies: - lodash: ^4.17.21 - checksum: 5dac6502dbef087092d041fcc2686d8be61168593b3a9baf964d62652f55a3a9c2277f171b81cccb851ccef33f2d070f45e633fab1fda3264f8e1ae9041c673f + "@sindresorhus/is": ^3.1.2 + char-regex: ^1.0.2 + emojilib: ^2.4.0 + skin-tone: ^2.0.0 + checksum: 98b030c82a2e282aa48cc13741d79ec48efd0ae856a4d1b41e551053bc322573166f9233c742857a7e20ed902b647de9c02a4a92b774f3e6257332ff44de3636 languageName: node linkType: hard @@ -7422,6 +9060,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.13": + version: 2.0.13 + resolution: "node-releases@npm:2.0.13" + checksum: 2fb44bf70fc949d27f3a48a7fd1a9d1d603ddad4ccd091f26b3fb8b1da976605d919330d7388ccd55ca2ade0dc8b2e12841ba19ef249c8bb29bf82532d401af7 + languageName: node + linkType: hard + "node-releases@npm:^2.0.3": version: 2.0.4 resolution: "node-releases@npm:2.0.4" @@ -7454,13 +9099,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^4.1.0": - version: 4.5.1 - resolution: "normalize-url@npm:4.5.1" - checksum: 6362e9274fdcc310f8b17e20de29754c94e1820d864114f03d3bfd6286a0028fc51705fb3fd4e475013357b5cd7421fc17f3aba93f2289056779a9bb23bccf59 - languageName: node - linkType: hard - "normalize-url@npm:^6.0.1": version: 6.1.0 resolution: "normalize-url@npm:6.1.0" @@ -7468,6 +9106,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^8.0.0": + version: 8.0.0 + resolution: "normalize-url@npm:8.0.0" + checksum: 09582d56acd562d89849d9239852c2aff225c72be726556d6883ff36de50006803d32a023c10e917bcc1c55f73f3bb16434f67992fe9b61906a3db882192753c + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -7561,7 +9206,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -7599,14 +9244,14 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^1.0.0": - version: 1.1.0 - resolution: "p-cancelable@npm:1.1.0" - checksum: 9f16d7d58897edb07b1a9234b2bfce3665c747f0f13886e25e2144ecab4595412017cc8cc3b0042f89864b997d6dba76c130724e1c0923fc41ff3c9399b87449 +"p-cancelable@npm:^3.0.0": + version: 3.0.0 + resolution: "p-cancelable@npm:3.0.0" + checksum: 948fd4f8e87b956d9afc2c6c7392de9113dac817cb1cecf4143f7a3d4c57ab5673614a80be3aba91ceec5e4b69fd8c869852d7e8048bc3d9273c4c36ce14b9aa languageName: node linkType: hard -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": +"p-limit@npm:^2.0.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -7624,6 +9269,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: ^1.0.0 + checksum: a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -7633,15 +9287,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 - languageName: node - linkType: hard - "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -7651,6 +9296,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: ^4.0.0 + checksum: d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -7677,15 +9331,15 @@ __metadata: languageName: node linkType: hard -"package-json@npm:^6.3.0": - version: 6.5.0 - resolution: "package-json@npm:6.5.0" +"package-json@npm:^8.1.0": + version: 8.1.1 + resolution: "package-json@npm:8.1.1" dependencies: - got: ^9.6.0 - registry-auth-token: ^4.0.0 - registry-url: ^5.0.0 - semver: ^6.2.0 - checksum: 60c29fe357af43f96c92c334aa0160cebde44e8e65c1e5f9b065efb3f501af812f268ec967a07757b56447834ef7f71458ebbab94425a9f09c271f348f9b764f + got: ^12.1.0 + registry-auth-token: ^5.0.1 + registry-url: ^6.0.0 + semver: ^7.3.7 + checksum: 83b057878bca229033aefad4ef51569b484e63a65831ddf164dc31f0486817e17ffcb58c819c7af3ef3396042297096b3ffc04e107fd66f8f48756f6d2071c8f languageName: node linkType: hard @@ -7708,21 +9362,23 @@ __metadata: languageName: node linkType: hard -"parse-entities@npm:^2.0.0": - version: 2.0.0 - resolution: "parse-entities@npm:2.0.0" +"parse-entities@npm:^4.0.0": + version: 4.0.1 + resolution: "parse-entities@npm:4.0.1" dependencies: - character-entities: ^1.0.0 - character-entities-legacy: ^1.0.0 - character-reference-invalid: ^1.0.0 - is-alphanumerical: ^1.0.0 - is-decimal: ^1.0.0 - is-hexadecimal: ^1.0.0 - checksum: f85a22c0ea406ff26b53fdc28641f01cc36fa49eb2e3135f02693286c89ef0bcefc2262d99b3688e20aac2a14fd10b75c518583e875c1b9fe3d1f937795e0854 + "@types/unist": ^2.0.0 + character-entities: ^2.0.0 + character-entities-legacy: ^3.0.0 + character-reference-invalid: ^2.0.0 + decode-named-character-reference: ^1.0.0 + is-alphanumerical: ^2.0.0 + is-decimal: ^2.0.0 + is-hexadecimal: ^2.0.0 + checksum: 9dfa3b0dc43a913c2558c4bd625b1abcc2d6c6b38aa5724b141ed988471977248f7ad234eed57e1bc70b694dd15b0d710a04f66c2f7c096e35abd91962b7d926 languageName: node linkType: hard -"parse-json@npm:^5.0.0": +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -7751,13 +9407,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.0": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: 595821edc094ecbcfb9ddcb46a3e1fe3a718540f8320eff08b8cf6742a5114cce2d46d45f95c26191c11b184dcaf4e2960abcd9c5ed9eb9393ac9a37efcfdecb - languageName: node - linkType: hard - "parse5@npm:^7.0.0": version: 7.0.0 resolution: "parse5@npm:7.0.0" @@ -7798,6 +9447,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -7856,6 +9512,17 @@ __metadata: languageName: node linkType: hard +"periscopic@npm:^3.0.0": + version: 3.1.0 + resolution: "periscopic@npm:3.1.0" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^3.0.0 + is-reference: ^3.0.0 + checksum: fb5ce7cd810c49254cdf1cd3892811e6dd1a1dfbdf5f10a0a33fb7141baac36443c4cad4f0e2b30abd4eac613f6ab845c2bc1b7ce66ae9694c7321e6ada5bd96 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -7863,19 +9530,19 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be languageName: node linkType: hard -"pkg-dir@npm:^4.1.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" dependencies: - find-up: ^4.0.0 - checksum: c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + find-up: ^6.3.0 + checksum: 1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 languageName: node linkType: hard @@ -7914,6 +9581,20 @@ __metadata: languageName: node linkType: hard +"postcss-colormin@npm:^5.3.1": + version: 5.3.1 + resolution: "postcss-colormin@npm:5.3.1" + dependencies: + browserslist: ^4.21.4 + caniuse-api: ^3.0.0 + colord: ^2.9.1 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.2.15 + checksum: c4ca6f335dd992dc8e3df24bffc3495c4e504eba8489c81cb6836fdce3203f423cf4c0b640c4b63c586f588c59d82adb5313c3c5d1a68113896d18ed71caa462 + languageName: node + linkType: hard + "postcss-convert-values@npm:^5.1.2": version: 5.1.2 resolution: "postcss-convert-values@npm:5.1.2" @@ -7926,6 +9607,18 @@ __metadata: languageName: node linkType: hard +"postcss-convert-values@npm:^5.1.3": + version: 5.1.3 + resolution: "postcss-convert-values@npm:5.1.3" + dependencies: + browserslist: ^4.21.4 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.2.15 + checksum: cd10a81781a12487b2921ff84a1a068e948a1956b9539a284c202abecf4cacdd3e106eb026026b22dbf70933f4315c824c111f6b71f56c355e47b842ca9b1dec + languageName: node + linkType: hard + "postcss-discard-comments@npm:^5.1.2": version: 5.1.2 resolution: "postcss-discard-comments@npm:5.1.2" @@ -7973,17 +9666,17 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-loader@npm:7.0.0" +"postcss-loader@npm:^7.3.3": + version: 7.3.3 + resolution: "postcss-loader@npm:7.3.3" dependencies: - cosmiconfig: ^7.0.0 - klona: ^2.0.5 - semver: ^7.3.7 + cosmiconfig: ^8.2.0 + jiti: ^1.18.2 + semver: ^7.3.8 peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 - checksum: d3cba8c1e9c273b57b72e5ec9ee8ef8786f0682b7a952d1bce5383b9c17c6d5085d7e82da8a6b02bd2548cf1f5219f6823e116e438c529782a2738ba95ae793c + checksum: d039654273f858be1f75dfdf8b550869d88905b73a7684b3e48a2937a6087619e84fd1a3551cdef78685a965a2573e985b29a532c3878d834071ecd2da0eb304 languageName: node linkType: hard @@ -8011,6 +9704,18 @@ __metadata: languageName: node linkType: hard +"postcss-merge-longhand@npm:^5.1.7": + version: 5.1.7 + resolution: "postcss-merge-longhand@npm:5.1.7" + dependencies: + postcss-value-parser: ^4.2.0 + stylehacks: ^5.1.1 + peerDependencies: + postcss: ^8.2.15 + checksum: 4d9f44b03f19522cc81ae4f5b1f2a9ef2db918dbd8b3042d4f1b2461b2230b8ec1269334db6a67a863ba68f64cabd712e6e45340ddb22a3fc03cd34df69d2bf0 + languageName: node + linkType: hard + "postcss-merge-rules@npm:^5.1.2": version: 5.1.2 resolution: "postcss-merge-rules@npm:5.1.2" @@ -8025,6 +9730,20 @@ __metadata: languageName: node linkType: hard +"postcss-merge-rules@npm:^5.1.4": + version: 5.1.4 + resolution: "postcss-merge-rules@npm:5.1.4" + dependencies: + browserslist: ^4.21.4 + caniuse-api: ^3.0.0 + cssnano-utils: ^3.1.0 + postcss-selector-parser: ^6.0.5 + peerDependencies: + postcss: ^8.2.15 + checksum: e7686cdda052071bf98810ad381e26145c43a2286f9540f04f97ef93101604b78d478dd555db91e5f73751bb353c283ba75c2fcb16a3751ac7d93dc6a0130c41 + languageName: node + linkType: hard + "postcss-minify-font-values@npm:^5.1.0": version: 5.1.0 resolution: "postcss-minify-font-values@npm:5.1.0" @@ -8062,6 +9781,19 @@ __metadata: languageName: node linkType: hard +"postcss-minify-params@npm:^5.1.4": + version: 5.1.4 + resolution: "postcss-minify-params@npm:5.1.4" + dependencies: + browserslist: ^4.21.4 + cssnano-utils: ^3.1.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.2.15 + checksum: debce6f0f7dd9af69b4bb9e467ea1ccccff2d849b6020461a2b9741c0c137340e6076c245dc2e83880180eb2e82936280fa31dfe8608e5a2e3618f3d864314c5 + languageName: node + linkType: hard + "postcss-minify-selectors@npm:^5.2.1": version: 5.2.1 resolution: "postcss-minify-selectors@npm:5.2.1" @@ -8082,16 +9814,16 @@ __metadata: languageName: node linkType: hard -"postcss-modules-local-by-default@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-modules-local-by-default@npm:4.0.0" +"postcss-modules-local-by-default@npm:^4.0.3": + version: 4.0.3 + resolution: "postcss-modules-local-by-default@npm:4.0.3" dependencies: icss-utils: ^5.0.0 postcss-selector-parser: ^6.0.2 postcss-value-parser: ^4.1.0 peerDependencies: postcss: ^8.1.0 - checksum: 8ee9c0d9918fd838854d434731371874b25c412dde135df981cc28d37d0660496389b0f8653dbcdbb6ee81f2bec90cb5b14668f6208f6f517400ac064e234c5a + checksum: be49b86efbfb921f42287e227584aac91af9826fc1083db04958ae283dfe215ca539421bfba71f9da0f0b10651f28e95a64b5faca7166f578a1933b8646051f7 languageName: node linkType: hard @@ -8193,6 +9925,18 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-unicode@npm:^5.1.1": + version: 5.1.1 + resolution: "postcss-normalize-unicode@npm:5.1.1" + dependencies: + browserslist: ^4.21.4 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.2.15 + checksum: c102888d488d05c53ab10ffcd4e0efb892ef0cc2f9b0abe9c9b175a2d7a9c226981ca6806ed9e5c1b82a8190f2b3a8342a6de800f019b417130661b0787ff6d7 + languageName: node + linkType: hard + "postcss-normalize-url@npm:^5.1.0": version: 5.1.0 resolution: "postcss-normalize-url@npm:5.1.0" @@ -8251,6 +9995,18 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-initial@npm:^5.1.2": + version: 5.1.2 + resolution: "postcss-reduce-initial@npm:5.1.2" + dependencies: + browserslist: ^4.21.4 + caniuse-api: ^3.0.0 + peerDependencies: + postcss: ^8.2.15 + checksum: ddb2ce61c8d0997184f08200eafdf32b3c67e88228fee960f5e2010c32da0c1d8ea07712585bf2b3aaa15f583066401d45db2c1131527c5116ca6794ebebd865 + languageName: node + linkType: hard + "postcss-reduce-transforms@npm:^5.1.0": version: 5.1.0 resolution: "postcss-reduce-transforms@npm:5.1.0" @@ -8272,14 +10028,14 @@ __metadata: languageName: node linkType: hard -"postcss-sort-media-queries@npm:^4.2.1": - version: 4.2.1 - resolution: "postcss-sort-media-queries@npm:4.2.1" +"postcss-sort-media-queries@npm:^4.4.1": + version: 4.4.1 + resolution: "postcss-sort-media-queries@npm:4.4.1" dependencies: - sort-css-media-queries: 2.0.4 + sort-css-media-queries: 2.1.0 peerDependencies: - postcss: ^8.4.4 - checksum: b929361e7083a5541fd3b7ef6739481d0c9b06811e3695caad5f7b610abbabe8c5fd0900bf5a7e5e95b68cd8c384185b81de4b93cf51e119f659f33f1efdf134 + postcss: ^8.4.16 + checksum: 8bbc604daee29dc3e1f5090df972599c3c0eb08b37650e16c134a040cc1357484a48bbe03dac2977d616be1d490cde2934226fa1e6f7e52f4f5e7bf8f57e98d6 languageName: node linkType: hard @@ -8322,7 +10078,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.3.11, postcss@npm:^8.4.13, postcss@npm:^8.4.14, postcss@npm:^8.4.7": +"postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.26": version: 8.4.31 resolution: "postcss@npm:8.4.31" dependencies: @@ -8333,13 +10089,6 @@ __metadata: languageName: node linkType: hard -"prepend-http@npm:^2.0.0": - version: 2.0.0 - resolution: "prepend-http@npm:2.0.0" - checksum: b023721ffd967728e3a25e3a80dd73827e9444e586800ab90a21b3a8e67f362d28023085406ad53a36db1e4d98cb10e43eb37d45c6b733140a9165ead18a0987 - languageName: node - linkType: hard - "pretty-error@npm:^4.0.0": version: 4.0.0 resolution: "pretty-error@npm:4.0.0" @@ -8357,19 +10106,22 @@ __metadata: languageName: node linkType: hard -"prism-react-renderer@npm:^1.3.5": - version: 1.3.5 - resolution: "prism-react-renderer@npm:1.3.5" +"prism-react-renderer@npm:2.1.0, prism-react-renderer@npm:^2.1.0": + version: 2.1.0 + resolution: "prism-react-renderer@npm:2.1.0" + dependencies: + "@types/prismjs": ^1.26.0 + clsx: ^1.2.1 peerDependencies: - react: ">=0.14.9" - checksum: 9caada97fa7325fc99484cff409a84ed947a061615851bd0aedf4fcfd4b3496e2eff4b252dbfd4465dd6ea7310134ed67d737cabf0c78b192969c3c7da383237 + react: ">=16.0.0" + checksum: 3785026a9399b6e178f097d856159d2305af094dea3ac221dd07aee1553cd0110c41414a75778f48512e87599f03500aacb74d26a70e07e5b71335389e713c56 languageName: node linkType: hard -"prismjs@npm:^1.28.0": - version: 1.28.0 - resolution: "prismjs@npm:1.28.0" - checksum: bf879309e74188b424cf8bb3962f9df9e7004a71f44f82a3cfbd26f884c9a0bb91f529db79503c1bc0b570ed7b94a10c3303153642da533c1e10f51779c0617f +"prismjs@npm:^1.29.0": + version: 1.29.0 + resolution: "prismjs@npm:1.29.0" + checksum: d906c4c4d01b446db549b4f57f72d5d7e6ccaca04ecc670fb85cea4d4b1acc1283e945a9cbc3d81819084a699b382f970e02f9d1378e14af9808d366d9ed7ec6 languageName: node linkType: hard @@ -8427,12 +10179,17 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^5.0.0, property-information@npm:^5.3.0": - version: 5.6.0 - resolution: "property-information@npm:5.6.0" - dependencies: - xtend: ^4.0.0 - checksum: d54b77c31dc13bb6819559080b2c67d37d94be7dc271f404f139a16a57aa96fcc0b3ad806d4a5baef9e031744853e4afe3df2e37275aacb1f78079bbb652c5af +"property-information@npm:^6.0.0": + version: 6.4.0 + resolution: "property-information@npm:6.4.0" + checksum: 48ba202f12c6abc82d37135452377dd528fae90a151bcffb28582d58d9db6e42ce835c91e2fcb12e875200b32bcaed90de4807dfb37c687f7cccf2597ccb55e1 + languageName: node + linkType: hard + +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 languageName: node linkType: hard @@ -8446,16 +10203,6 @@ __metadata: languageName: node linkType: hard -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 - languageName: node - linkType: hard - "punycode@npm:^1.3.2": version: 1.4.1 resolution: "punycode@npm:1.4.1" @@ -8470,12 +10217,12 @@ __metadata: languageName: node linkType: hard -"pupa@npm:^2.1.1": - version: 2.1.1 - resolution: "pupa@npm:2.1.1" +"pupa@npm:^3.1.0": + version: 3.1.0 + resolution: "pupa@npm:3.1.0" dependencies: - escape-goat: ^2.0.0 - checksum: d2346324780ebae4be847cad052b830e004d816851dd4750fc73faa6cd360f443e358f6b1c83641fd4c904c6055dcb545807f55259a20a52ad86d9477746c724 + escape-goat: ^4.0.0 + checksum: 02afa6e4547a733484206aaa8f8eb3fbfb12d3dd17d7ca4fa1ea390a7da2cb8f381e38868bbf68009c4d372f8f6059f553171b6a712d8f2802c7cd43d513f06c languageName: node linkType: hard @@ -8511,6 +10258,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -8546,7 +10300,7 @@ __metadata: languageName: node linkType: hard -"rc@npm:^1.2.8": +"rc@npm:1.2.8": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -8560,7 +10314,7 @@ __metadata: languageName: node linkType: hard -"react-base16-styling@npm:^0.6.0": +"react-base16-styling@npm:~0.6.0": version: 0.6.0 resolution: "react-base16-styling@npm:0.6.0" dependencies: @@ -8604,16 +10358,15 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:17.0.2": - version: 17.0.2 - resolution: "react-dom@npm:17.0.2" +"react-dom@npm:18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" dependencies: loose-envify: ^1.1.0 - object-assign: ^4.1.1 - scheduler: ^0.20.2 + scheduler: ^0.23.0 peerDependencies: - react: 17.0.2 - checksum: 51abbcb72450fe527ebf978c3bc989ba266630faaa53f47a2fae5392369729e8de62b2e4683598cbe651ea7873cd34ec7d5127e2f50bf4bfe6bd0c3ad9bddcb0 + react: ^18.2.0 + checksum: 66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a languageName: node linkType: hard @@ -8654,22 +10407,7 @@ __metadata: languageName: node linkType: hard -"react-json-view@npm:^1.21.3": - version: 1.21.3 - resolution: "react-json-view@npm:1.21.3" - dependencies: - flux: ^4.0.1 - react-base16-styling: ^0.6.0 - react-lifecycles-compat: ^3.0.4 - react-textarea-autosize: ^8.3.2 - peerDependencies: - react: ^17.0.0 || ^16.3.0 || ^15.5.4 - react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 - checksum: f41b38e599f148cf922f60390e56bb821f17a091373b08310fd82ebc526428683011751aa023687041481a46b20aeb1c47f660979d43db77674486aec9dc1d3f - languageName: node - linkType: hard - -"react-lifecycles-compat@npm:^3.0.4": +"react-lifecycles-compat@npm:~3.0.4": version: 3.0.4 resolution: "react-lifecycles-compat@npm:3.0.4" checksum: 1d0df3c85af79df720524780f00c064d53a9dd1899d785eddb7264b378026979acbddb58a4b7e06e7d0d12aa1494fd5754562ee55d32907b15601068dae82c27 @@ -8715,32 +10453,31 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:^5.3.3": - version: 5.3.3 - resolution: "react-router-dom@npm:5.3.3" +"react-router-dom@npm:^5.3.4": + version: 5.3.4 + resolution: "react-router-dom@npm:5.3.4" dependencies: "@babel/runtime": ^7.12.13 history: ^4.9.0 loose-envify: ^1.3.1 prop-types: ^15.6.2 - react-router: 5.3.3 + react-router: 5.3.4 tiny-invariant: ^1.0.2 tiny-warning: ^1.0.0 peerDependencies: react: ">=15" - checksum: a6d863650bd41184856ff3c230f0813f26a6ae904058416a2dca87d0f5dc9063c68c7e461e5772a43d1a25815059e863de04c90fa96e36ec81f481caa51a2f3d + checksum: f04f727e2ed2e9d1d3830af02cc61690ff67b1524c0d18690582bfba0f4d14142ccc88fb6da6befad644fddf086f5ae4c2eb7048c67da8a0b0929c19426421b0 languageName: node linkType: hard -"react-router@npm:5.3.3, react-router@npm:^5.3.3": - version: 5.3.3 - resolution: "react-router@npm:5.3.3" +"react-router@npm:5.3.4, react-router@npm:^5.3.4": + version: 5.3.4 + resolution: "react-router@npm:5.3.4" dependencies: "@babel/runtime": ^7.12.13 history: ^4.9.0 hoist-non-react-statics: ^3.1.0 loose-envify: ^1.3.1 - mini-create-react-context: ^0.4.0 path-to-regexp: ^1.7.0 prop-types: ^15.6.2 react-is: ^16.6.0 @@ -8748,30 +10485,29 @@ __metadata: tiny-warning: ^1.0.0 peerDependencies: react: ">=15" - checksum: f08f38231161f977095a162c68e6a49d8b3add43162cc730ff57522b4f8f6d2fd29b488248b38f9d902060176f6e20a79b14f5478f2e0388f7e6ee3588c879d2 + checksum: e15c00dfef199249b4c6e6d98e5e76cc352ce66f3270f13df37cc069ddf7c05e43281e8c308fc407e4435d72924373baef1d2890e0f6b0b1eb423cf47315a053 languageName: node linkType: hard -"react-textarea-autosize@npm:^8.3.2": - version: 8.3.3 - resolution: "react-textarea-autosize@npm:8.3.3" +"react-textarea-autosize@npm:~8.3.2": + version: 8.3.4 + resolution: "react-textarea-autosize@npm:8.3.4" dependencies: "@babel/runtime": ^7.10.2 - use-composed-ref: ^1.0.0 - use-latest: ^1.0.0 + use-composed-ref: ^1.3.0 + use-latest: ^1.2.1 peerDependencies: - react: ^16.8.0 || ^17.0.0 - checksum: d72340a058da1ce6552281abf87bc1869b1635b298bda0e2e8c50e1ed90c3b6b40df45abe8d22ca2a495f24371ea7fe40420cd5ce7ba9fd41e62b959058ca548 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 02dd38f6c40c4dd88b6c35370eaddc385c0a417c614b5ecb50d1121e99905da26fea9d5c05b580404b7f8a7d9a4964a8613654882be03963c36005779b96cca5 languageName: node linkType: hard -"react@npm:17.0.2": - version: 17.0.2 - resolution: "react@npm:17.0.2" +"react@npm:18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" dependencies: loose-envify: ^1.1.0 - object-assign: ^4.1.1 - checksum: 07ae8959acf1596f0550685102fd6097d461a54a4fd46a50f88a0cd7daaa97fdd6415de1dcb4bfe0da6aa43221a6746ce380410fa848acc60f8ac41f6649c148 + checksum: b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 languageName: node linkType: hard @@ -8844,6 +10580,15 @@ __metadata: languageName: node linkType: hard +"regenerate-unicode-properties@npm:^10.1.0": + version: 10.1.1 + resolution: "regenerate-unicode-properties@npm:10.1.1" + dependencies: + regenerate: ^1.4.2 + checksum: 89adb5ee5ba081380c78f9057c02e156a8181969f6fcca72451efc45612e0c3df767b4333f8d8479c274d9c6fe52ec4854f0d8a22ef95dccbe87da8e5f2ac77d + languageName: node + linkType: hard + "regenerate@npm:^1.4.2": version: 1.4.2 resolution: "regenerate@npm:1.4.2" @@ -8858,12 +10603,19 @@ __metadata: languageName: node linkType: hard -"regenerator-transform@npm:^0.15.0": - version: 0.15.0 - resolution: "regenerator-transform@npm:0.15.0" +"regenerator-runtime@npm:^0.14.0": + version: 0.14.0 + resolution: "regenerator-runtime@npm:0.14.0" + checksum: e25f062c1a183f81c99681691a342760e65c55e8d3a4d4fe347ebe72433b123754b942b70b622959894e11f8a9131dc549bd3c9a5234677db06a4af42add8d12 + languageName: node + linkType: hard + +"regenerator-transform@npm:^0.15.2": + version: 0.15.2 + resolution: "regenerator-transform@npm:0.15.2" dependencies: "@babel/runtime": ^7.8.4 - checksum: c825d84f580441a3c592ea25668c491e0a1bd3ad55a992ce6b83b34bfc6e811d0b676af4e70f12e2c93834835d6c9181f75f13c8be181844b01e397a7d9df06b + checksum: 7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 languageName: node linkType: hard @@ -8881,21 +10633,35 @@ __metadata: languageName: node linkType: hard -"registry-auth-token@npm:^4.0.0": - version: 4.2.1 - resolution: "registry-auth-token@npm:4.2.1" +"regexpu-core@npm:^5.3.1": + version: 5.3.2 + resolution: "regexpu-core@npm:5.3.2" dependencies: - rc: ^1.2.8 - checksum: ae23c68b8cd9d3afc99e160791f83a1e74aae9e3229a2a602b849c91164567fc6a3c31b7f2c1ac0e1e622be0d6671773439a55923e3bc1062d55a5c8dd843b65 + "@babel/regjsgen": ^0.8.0 + regenerate: ^1.4.2 + regenerate-unicode-properties: ^10.1.0 + regjsparser: ^0.9.1 + unicode-match-property-ecmascript: ^2.0.0 + unicode-match-property-value-ecmascript: ^2.1.0 + checksum: 7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 languageName: node linkType: hard -"registry-url@npm:^5.0.0": - version: 5.1.0 - resolution: "registry-url@npm:5.1.0" +"registry-auth-token@npm:^5.0.1": + version: 5.0.2 + resolution: "registry-auth-token@npm:5.0.2" + dependencies: + "@pnpm/npm-conf": ^2.1.0 + checksum: 20fc2225681cc54ae7304b31ebad5a708063b1949593f02dfe5fb402bc1fc28890cecec6497ea396ba86d6cca8a8480715926dfef8cf1f2f11e6f6cc0a1b4bde + languageName: node + linkType: hard + +"registry-url@npm:^6.0.0": + version: 6.0.1 + resolution: "registry-url@npm:6.0.1" dependencies: - rc: ^1.2.8 - checksum: c2c455342b5836cbed5162092eba075c7a02c087d9ce0fde8aeb4dc87a8f4a34a542e58bf4d8ec2d4cb73f04408cb3148ceb1f76647f76b978cfec22047dc6d6 + rc: 1.2.8 + checksum: 66e2221c8113fc35ee9d23fe58cb516fc8d556a189fb8d6f1011a02efccc846c4c9b5075b4027b99a5d5c9ad1345ac37f297bea3c0ca30d607ec8084bf561b90 languageName: node linkType: hard @@ -8917,6 +10683,28 @@ __metadata: languageName: node linkType: hard +"regjsparser@npm:^0.9.1": + version: 0.9.1 + resolution: "regjsparser@npm:0.9.1" + dependencies: + jsesc: ~0.5.0 + bin: + regjsparser: bin/parser + checksum: fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 + languageName: node + linkType: hard + +"rehype-raw@npm:^7.0.0": + version: 7.0.0 + resolution: "rehype-raw@npm:7.0.0" + dependencies: + "@types/hast": ^3.0.0 + hast-util-raw: ^9.0.0 + vfile: ^6.0.0 + checksum: 1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -8924,70 +10712,100 @@ __metadata: languageName: node linkType: hard -"remark-emoji@npm:^2.2.0": - version: 2.2.0 - resolution: "remark-emoji@npm:2.2.0" +"remark-directive@npm:^3.0.0": + version: 3.0.0 + resolution: "remark-directive@npm:3.0.0" dependencies: - emoticon: ^3.2.0 - node-emoji: ^1.10.0 - unist-util-visit: ^2.0.3 - checksum: f7b98c7879ebf289e277e8a2a5f6c75da6a0447efde56a347ad6bb67084da6de8605b3ae9eb9244f02ef0c47755e2c5288222ef12a93c2ba1dec3ba02b0342f5 + "@types/mdast": ^4.0.0 + mdast-util-directive: ^3.0.0 + micromark-extension-directive: ^3.0.0 + unified: ^11.0.0 + checksum: eeec4d70501c5bce55b2528fa0c8f1e2a5c713c9f72a7d4678dd3868c425620ec409a719bb2656663296bc476c63f5d7bcacd5a9059146bfc89d40e4ce13a7f6 languageName: node linkType: hard -"remark-footnotes@npm:2.0.0": - version: 2.0.0 - resolution: "remark-footnotes@npm:2.0.0" - checksum: 45b55b3440b74bfeed11fba5ed6b31f2fd35ab4e9ba169061b76a19f5ff4d16d851c9f3c423c7fa54eb0fa5e6043b89098cb9478e9b5b417cf4bdef5571b0236 +"remark-emoji@npm:^4.0.0": + version: 4.0.1 + resolution: "remark-emoji@npm:4.0.1" + dependencies: + "@types/mdast": ^4.0.2 + emoticon: ^4.0.1 + mdast-util-find-and-replace: ^3.0.1 + node-emoji: ^2.1.0 + unified: ^11.0.4 + checksum: 27f88892215f3efe8f25c43f226a82d70144a1ae5906d36f6e09390b893b2d5524d5949bd8ca6a02be0e3cb5cba908b35c4221f4e07f34e93d13d6ff9347dbb8 languageName: node linkType: hard -"remark-mdx@npm:1.6.22": - version: 1.6.22 - resolution: "remark-mdx@npm:1.6.22" +"remark-frontmatter@npm:^5.0.0": + version: 5.0.0 + resolution: "remark-frontmatter@npm:5.0.0" dependencies: - "@babel/core": 7.12.9 - "@babel/helper-plugin-utils": 7.10.4 - "@babel/plugin-proposal-object-rest-spread": 7.12.1 - "@babel/plugin-syntax-jsx": 7.12.1 - "@mdx-js/util": 1.6.22 - is-alphabetical: 1.0.4 - remark-parse: 8.0.3 - unified: 9.2.0 - checksum: 3a964048e58cba7848d59fc920baa330a9b7f619fedb44d4d7985d84875eba8d92e0d0dd0617e28326c6086e21ef441664748526a2517a42555d44c648453b0a + "@types/mdast": ^4.0.0 + mdast-util-frontmatter: ^2.0.0 + micromark-extension-frontmatter: ^2.0.0 + unified: ^11.0.0 + checksum: 102325d5edbcf30eaf74de8a0a6e03096cc2370dfef19080fd2dd208f368fbb2323388751ac9931a1aa38a4f2828fa4bad6c52dc5249dcadcd34861693b52bf9 languageName: node linkType: hard -"remark-parse@npm:8.0.3": - version: 8.0.3 - resolution: "remark-parse@npm:8.0.3" +"remark-gfm@npm:^4.0.0": + version: 4.0.0 + resolution: "remark-gfm@npm:4.0.0" dependencies: - ccount: ^1.0.0 - collapse-white-space: ^1.0.2 - is-alphabetical: ^1.0.0 - is-decimal: ^1.0.0 - is-whitespace-character: ^1.0.0 - is-word-character: ^1.0.0 - markdown-escapes: ^1.0.0 - parse-entities: ^2.0.0 - repeat-string: ^1.5.4 - state-toggle: ^1.0.0 - trim: 0.0.1 - trim-trailing-lines: ^1.0.0 - unherit: ^1.0.4 - unist-util-remove-position: ^2.0.0 - vfile-location: ^3.0.0 - xtend: ^4.0.1 - checksum: cbb859e2585864942823ce4d23a1b1514168a066ba91d47ca09ff45a5563b81bf17160c182ac7efed718712291c35a117db89b6ce603d04a845497ae7041c185 + "@types/mdast": ^4.0.0 + mdast-util-gfm: ^3.0.0 + micromark-extension-gfm: ^3.0.0 + remark-parse: ^11.0.0 + remark-stringify: ^11.0.0 + unified: ^11.0.0 + checksum: db0aa85ab718d475c2596e27c95be9255d3b0fc730a4eda9af076b919f7dd812f7be3ac020611a8dbe5253fd29671d7b12750b56e529fdc32dfebad6dbf77403 languageName: node linkType: hard -"remark-squeeze-paragraphs@npm:4.0.0": - version: 4.0.0 - resolution: "remark-squeeze-paragraphs@npm:4.0.0" +"remark-mdx@npm:^3.0.0": + version: 3.0.0 + resolution: "remark-mdx@npm:3.0.0" + dependencies: + mdast-util-mdx: ^3.0.0 + micromark-extension-mdxjs: ^3.0.0 + checksum: e7a59428c55753f89f1bd299bc92cfd96fb3289285384b631f8af253d8df6473ebdba085e6d1a846b55b46700aafc76f35810a3268733e6a7c676bc2a8648f17 + languageName: node + linkType: hard + +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + micromark-util-types: ^2.0.0 + unified: ^11.0.0 + checksum: 6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 + languageName: node + linkType: hard + +"remark-rehype@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-rehype@npm:11.0.0" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + mdast-util-to-hast: ^13.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: d88180819f6695bc4f257cffcbe201973fc946144cc0101da589f25f3238932e384e98a8897b6060948ad2b5679eb2de5a720866b8b6f36b74e9f20e3e0b1d5d + languageName: node + linkType: hard + +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" dependencies: - mdast-squeeze-paragraphs: ^4.0.0 - checksum: 61b39acfde3bebb1e9364a6991957f83ab0d878c0fd1de0e86e9bf9e060574cefb7a76057d64e7422e2a2bcf6e3c54635a4ae43f00b3dda38812ae4b6f4342f4 + "@types/mdast": ^4.0.0 + mdast-util-to-markdown: ^2.0.0 + unified: ^11.0.0 + checksum: 0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f languageName: node linkType: hard @@ -9004,13 +10822,6 @@ __metadata: languageName: node linkType: hard -"repeat-string@npm:^1.5.4": - version: 1.6.1 - resolution: "repeat-string@npm:1.6.1" - checksum: 87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d - languageName: node - linkType: hard - "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" @@ -9032,6 +10843,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.2.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -9046,7 +10864,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2, resolve@npm:^1.3.2": +"resolve@npm:^1.1.6, resolve@npm:^1.14.2": version: 1.22.0 resolution: "resolve@npm:1.22.0" dependencies: @@ -9059,7 +10877,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.3.2#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin": version: 1.22.0 resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin::version=1.22.0&hash=c3c19d" dependencies: @@ -9072,12 +10890,12 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^1.0.2": - version: 1.0.2 - resolution: "responselike@npm:1.0.2" +"responselike@npm:^3.0.0": + version: 3.0.0 + resolution: "responselike@npm:3.0.0" dependencies: - lowercase-keys: ^1.0.0 - checksum: 1c2861d1950790da96159ca490eda645130eaf9ccc4d76db20f685ba944feaf30f45714b4318f550b8cd72990710ad68355ff15c41da43ed9a93c102c0ffa403 + lowercase-keys: ^3.0.0 + checksum: 8af27153f7e47aa2c07a5f2d538cb1e5872995f0e9ff77def858ecce5c3fe677d42b824a62cde502e56d275ab832b0a8bd350d5cd6b467ac0425214ac12ae658 languageName: node linkType: hard @@ -9120,17 +10938,17 @@ __metadata: languageName: node linkType: hard -"rtlcss@npm:^3.5.0": - version: 3.5.0 - resolution: "rtlcss@npm:3.5.0" +"rtlcss@npm:^4.1.0": + version: 4.1.1 + resolution: "rtlcss@npm:4.1.1" dependencies: - find-up: ^5.0.0 + escalade: ^3.1.1 picocolors: ^1.0.0 - postcss: ^8.3.11 + postcss: ^8.4.21 strip-json-comments: ^3.1.1 bin: rtlcss: bin/rtlcss.js - checksum: c50f61bf7315be5677a75464e7457661687e321f714cae51be8b6f7b7ab89c4203b25fae15951eceb79f6d551eae65e42eabde55087fd5aa07ad1e05698793d0 + checksum: 8667f09f683139abf1d5a58e284fa57c903f1f502a86cd1a7fa867777378f7f93a3c156ba27852b826299156451fbf8c6413710ab1cce8e6da87dd31a266c669 languageName: node linkType: hard @@ -9143,12 +10961,12 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.4": - version: 7.5.4 - resolution: "rxjs@npm:7.5.4" +"rxjs@npm:^7.8.1": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" dependencies: tslib: ^2.1.0 - checksum: 7d40fcfac255e9aa9eaf4175910f27954a4b5cbd53f2031f8babb6e12f09431d8a9147b2d7461b0d0f263e68d68a7160d6c55af26e68d738c05eeb421ee5b2d3 + checksum: 3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 languageName: node linkType: hard @@ -9180,13 +10998,12 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.20.2": - version: 0.20.2 - resolution: "scheduler@npm:0.20.2" +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" dependencies: loose-envify: ^1.1.0 - object-assign: ^4.1.1 - checksum: b0982e4b0f34f4ffa4f2f486161c0fd9ce9b88680b045dccbf250eb1aa4fd27413570645455187a83535e2370f5c667a251045547765408492bd883cbe95fcdb + checksum: b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd languageName: node linkType: hard @@ -9201,25 +11018,25 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^2.6.5": - version: 2.7.1 - resolution: "schema-utils@npm:2.7.1" +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1": + version: 3.1.1 + resolution: "schema-utils@npm:3.1.1" dependencies: - "@types/json-schema": ^7.0.5 - ajv: ^6.12.4 + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 ajv-keywords: ^3.5.2 - checksum: f484f34464edd8758712d5d3ba25a306e367dac988aecaf4ce112e99baae73f33a807b5cf869240bb6648c80720b36af2d7d72be3a27faa49a2d4fc63fa3f85f + checksum: 55a8da802a5f8f0ce6f68b6a139f3261cb423bd23795766da866a0f5738fc40303370fbe0c3eeba60b2a91c569ad7ce5318fea455f8fe866098c5a3a6b9050b0 languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": - version: 3.1.1 - resolution: "schema-utils@npm:3.1.1" +"schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" dependencies: "@types/json-schema": ^7.0.8 ajv: ^6.12.5 ajv-keywords: ^3.5.2 - checksum: 55a8da802a5f8f0ce6f68b6a139f3261cb423bd23795766da866a0f5738fc40303370fbe0c3eeba60b2a91c569ad7ce5318fea455f8fe866098c5a3a6b9050b0 + checksum: fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 languageName: node linkType: hard @@ -9252,59 +11069,53 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.0.1": - version: 2.0.1 - resolution: "selfsigned@npm:2.0.1" +"selfsigned@npm:^2.1.1": + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" dependencies: + "@types/node-forge": ^1.3.0 node-forge: ^1 - checksum: 3f5d5b88f072db51d1c8184db571a466c5a60d46f888dee62b7396c9c27a10cc98c151fde5441140da29abc493a82530666911468d3a57bd8c6d81b8e6a8f830 + checksum: 521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 languageName: node linkType: hard -"semver-diff@npm:^3.1.1": - version: 3.1.1 - resolution: "semver-diff@npm:3.1.1" +"semver-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "semver-diff@npm:4.0.0" dependencies: - semver: ^6.3.0 - checksum: 7d350f1450b9577d538ef866a9bc4cd97bfbf1f1d92070291495a31d0ec3aa808e826c223e5454ea9877cc06eaa886ffd71bb3a1f331b44bc210f9ff525c68d2 + semver: ^7.3.5 + checksum: 3ed1bb22f39b4b6e98785bb066e821eabb9445d3b23e092866c50e7df8b9bd3eda617b242f81db4159586e0e39b0deb908dd160a24f783bd6f52095b22cd68ea languageName: node linkType: hard -"semver@npm:7.0.0": - version: 7.0.0 - resolution: "semver@npm:7.0.0" +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: semver: bin/semver.js - checksum: 7fd341680a967a0abfd66f3a7d36ba44e52ff5d3e799e9a6cdb01a68160b64ef09be82b4af05459effeecdd836f002c2462555d2821cd890dfdfe36a0d9f56a5 - languageName: node - linkType: hard - -"semver@npm:^5.4.1": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: d4884f2aeca28bff35d0bd40ff0a9b2dfc4b36a883bf0ea5dc15d10d9a01bdc9041035b05f825d4b5ac8a56e490703dbf0d986d054de82cc5e9bad3f02ca6e00 + checksum: e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.2.0, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7": + version: 7.3.7 + resolution: "semver@npm:7.3.7" + dependencies: + lru-cache: ^6.0.0 bin: - semver: ./bin/semver.js - checksum: 1f4959e15bcfbaf727e964a4920f9260141bb8805b399793160da4e7de128e42a7d1f79c1b7d5cd21a6073fba0d55feb9966f5fef3e5ccb8e1d7ead3d7527458 + semver: bin/semver.js + checksum: cffd30102de68a9f8cac9ef57b43c2173dc999da4fc5189872b421f9c9e2660f70243b8e964781ac6dc48ba2542647bb672beeb4d756c89c4a9e05e1144fa40a languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": - version: 7.3.7 - resolution: "semver@npm:7.3.7" +"semver@npm:^7.3.8, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: cffd30102de68a9f8cac9ef57b43c2173dc999da4fc5189872b421f9c9e2660f70243b8e964781ac6dc48ba2542647bb672beeb4d756c89c4a9e05e1144fa40a + checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e languageName: node linkType: hard @@ -9338,19 +11149,28 @@ __metadata: languageName: node linkType: hard -"serve-handler@npm:^6.1.3": - version: 6.1.3 - resolution: "serve-handler@npm:6.1.3" +"serialize-javascript@npm:^6.0.1": + version: 6.0.1 + resolution: "serialize-javascript@npm:6.0.1" + dependencies: + randombytes: ^2.1.0 + checksum: 1af427f4fee3fee051f54ffe15f77068cff78a3c96d20f5c1178d20630d3ab122d8350e639d5e13cde8111ef9db9439b871305ffb185e24be0a2149cec230988 + languageName: node + linkType: hard + +"serve-handler@npm:^6.1.5": + version: 6.1.5 + resolution: "serve-handler@npm:6.1.5" dependencies: bytes: 3.0.0 content-disposition: 0.5.2 fast-url-parser: 1.1.3 mime-types: 2.1.18 - minimatch: 3.0.4 + minimatch: 3.1.2 path-is-inside: 1.0.2 path-to-regexp: 2.2.1 range-parser: 1.2.0 - checksum: ad9a98f50eceda4d16269361a0a7b4167cb4bd8636e22f3ef1a214bb4206d8b3abf2b44ece5ba9d1a6b719e00b78321d5b1777cff178559a24778db9a3998da9 + checksum: 6fd393ae37a0305107e634ca545322b00605322189fe70d8f1a4a90a101c4e354768c610efe5a7ef1af3820cec5c33d97467c88151f35a3cb41d8ff2075ef802 languageName: node linkType: hard @@ -9448,6 +11268,13 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.8.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a + languageName: node + linkType: hard + "shelljs@npm:^0.8.5": version: 0.8.5 resolution: "shelljs@npm:0.8.5" @@ -9479,14 +11306,14 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^1.0.7": - version: 1.0.19 - resolution: "sirv@npm:1.0.19" +"sirv@npm:^2.0.3": + version: 2.0.3 + resolution: "sirv@npm:2.0.3" dependencies: "@polka/url": ^1.0.0-next.20 mrmime: ^1.0.0 - totalist: ^1.0.0 - checksum: 393cc0471e82d3e754a8c1b2b348a86249db1f686aeb11c17e4217326a8b1a96029d9f1b58362ebb3e511b7b98c47cd43c4305dde98322bb1259d07dec2d4908 + totalist: ^3.0.0 + checksum: 333bd665ee5ac3805047ea47757e04e2b18ca562749b9a07f5bbbee6dabd99ff00011604689b1ada3d22e46a4198c61e05e2d1abd5454d94da483ce3a3813205 languageName: node linkType: hard @@ -9511,6 +11338,15 @@ __metadata: languageName: node linkType: hard +"skin-tone@npm:^2.0.0": + version: 2.0.0 + resolution: "skin-tone@npm:2.0.0" + dependencies: + unicode-emoji-modifier-base: ^1.0.0 + checksum: 82d4c2527864f9cbd6cb7f3c4abb31e2224752234d5013b881d3e34e9ab543545b05206df5a17d14b515459fcb265ce409f9cfe443903176b0360cd20e4e4ba5 + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -9564,10 +11400,10 @@ __metadata: languageName: node linkType: hard -"sort-css-media-queries@npm:2.0.4": - version: 2.0.4 - resolution: "sort-css-media-queries@npm:2.0.4" - checksum: f1ecd79f73f5f59b873f7afda5b3c020aa5bf9fc5873a881985f0a748f18aec2bc4bd9f12faba83614df67ce95bb40c8dc9e502f75a948718aeb185a8cdba90b +"sort-css-media-queries@npm:2.1.0": + version: 2.1.0 + resolution: "sort-css-media-queries@npm:2.1.0" + checksum: 6b39dd2503d8279688fee837c63bdf3b49eea14d10d5ae09d9e99e4a0b3da1b702c3931e8f793b702b9ea8929a9389ba8d6345b58b5d1f0ec3e84920685a724a languageName: node linkType: hard @@ -9588,13 +11424,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.0": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 - languageName: node - linkType: hard - "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0": version: 0.6.1 resolution: "source-map@npm:0.6.1" @@ -9602,10 +11431,17 @@ __metadata: languageName: node linkType: hard -"space-separated-tokens@npm:^1.0.0": - version: 1.1.5 - resolution: "space-separated-tokens@npm:1.1.5" - checksum: 3ee0a6905f89e1ffdfe474124b1ade9fe97276a377a0b01350bc079b6ec566eb5b219e26064cc5b7f3899c05bde51ffbc9154290b96eaf82916a1e2c2c13ead9 +"source-map@npm:^0.7.0": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc + languageName: node + linkType: hard + +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 languageName: node linkType: hard @@ -9643,6 +11479,13 @@ __metadata: languageName: node linkType: hard +"srcset@npm:^4.0.0": + version: 4.0.0 + resolution: "srcset@npm:4.0.0" + checksum: 0685c3bd2423b33831734fb71560cd8784f024895e70ee2ac2c392e30047c27ffd9481e001950fb0503f4906bc3fe963145935604edad77944d09c9800990660 + languageName: node + linkType: hard + "ssri@npm:^8.0.1": version: 8.0.1 resolution: "ssri@npm:8.0.1" @@ -9659,13 +11502,6 @@ __metadata: languageName: node linkType: hard -"state-toggle@npm:^1.0.0": - version: 1.0.3 - resolution: "state-toggle@npm:1.0.3" - checksum: 6051ee5654b39b0006911ae3130fa7f47675e07db16a711d8cd23d43b63f383e98f3bd9fa80e118a3f5964a11284d8eee180baef27a556146e628f8da74aba12 - languageName: node - linkType: hard - "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -9687,7 +11523,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2, string-width@npm:^4.2.3": +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -9698,7 +11534,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.1": +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: @@ -9727,6 +11563,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.3 + resolution: "stringify-entities@npm:4.0.3" + dependencies: + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: e4582cd40b082e95bc2075bed656dcbc24e83538830f15cb5a025f1ba8d341adbdb3c66efb6a5bfd6860a3ea426322135aa666cf128bf03c961553e2f9f2d4ed + languageName: node + linkType: hard + "stringify-object@npm:^3.3.0": version: 3.3.0 resolution: "stringify-object@npm:3.3.0" @@ -9738,7 +11584,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": +"strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -9784,12 +11630,12 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:0.3.0, style-to-object@npm:^0.3.0": - version: 0.3.0 - resolution: "style-to-object@npm:0.3.0" +"style-to-object@npm:^0.4.0": + version: 0.4.4 + resolution: "style-to-object@npm:0.4.4" dependencies: inline-style-parser: 0.1.1 - checksum: afe9b96ba077a9068baf8887091870f50298157c0ebf5378151792cf2a2ce084fec9b34fc544da0d9f8e6c22ca0c9e23aa6f075bb8eb051aa1d64363e9987600 + checksum: 3a733080da66952881175b17d65f92985cf94c1ca358a92cf21b114b1260d49b94a404ed79476047fb95698d64c7e366ca7443f0225939e2fb34c38bbc9c7639 languageName: node linkType: hard @@ -9805,6 +11651,18 @@ __metadata: languageName: node linkType: hard +"stylehacks@npm:^5.1.1": + version: 5.1.1 + resolution: "stylehacks@npm:5.1.1" + dependencies: + browserslist: ^4.21.4 + postcss-selector-parser: ^6.0.4 + peerDependencies: + postcss: ^8.2.15 + checksum: 402c2b545eeda0e972f125779adddc88df11bcf3a89de60c92026bd98cd49c1abffcd5bfe41766398835e0a1c7e5e72bdb6905809ecbb60716cd8d3a32ea7cd3 + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -9839,14 +11697,14 @@ __metadata: languageName: node linkType: hard -"svg-parser@npm:^2.0.2": +"svg-parser@npm:^2.0.4": version: 2.0.4 resolution: "svg-parser@npm:2.0.4" checksum: 02f6cb155dd7b63ebc2f44f36365bc294543bebb81b614b7628f1af3c54ab64f7e1cec20f06e252bf95bdde78441ae295a412c68ad1678f16a6907d924512b7a languageName: node linkType: hard -"svgo@npm:^2.5.0, svgo@npm:^2.7.0": +"svgo@npm:^2.7.0, svgo@npm:^2.8.0": version: 2.8.0 resolution: "svgo@npm:2.8.0" dependencies: @@ -9891,15 +11749,15 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.3": - version: 5.3.3 - resolution: "terser-webpack-plugin@npm:5.3.3" +"terser-webpack-plugin@npm:^5.3.7, terser-webpack-plugin@npm:^5.3.9": + version: 5.3.9 + resolution: "terser-webpack-plugin@npm:5.3.9" dependencies: - "@jridgewell/trace-mapping": ^0.3.7 + "@jridgewell/trace-mapping": ^0.3.17 jest-worker: ^27.4.5 schema-utils: ^3.1.1 - serialize-javascript: ^6.0.0 - terser: ^5.7.2 + serialize-javascript: ^6.0.1 + terser: ^5.16.8 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -9909,11 +11767,11 @@ __metadata: optional: true uglify-js: optional: true - checksum: deb1e4ebc7dd832acfb63b4c9e81e4120493464f6178c8539337f6a7b5d4c25171e8ce20397b35b5f95b6b39d183991e87733e7f73cd77656da81ec22afbbd66 + checksum: 8a757106101ea1504e5dc549c722506506e7d3f0d38e72d6c8108ad814c994ca0d67ac5d0825ba59704a4b2b04548201b2137f198bfce897b09fe9e36727a1e9 languageName: node linkType: hard -"terser@npm:^5.10.0, terser@npm:^5.7.2": +"terser@npm:^5.10.0": version: 5.16.1 resolution: "terser@npm:5.16.1" dependencies: @@ -9927,6 +11785,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.15.1, terser@npm:^5.16.8": + version: 5.24.0 + resolution: "terser@npm:5.24.0" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.8.2 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: 9a73ae528210242593d8bbc46af8a235fb0a7607707910a7c5cb85a7d2692d0780019dcbf34734b3cb2591111cc41628f1dce1608dccd3201b6843458ebe9e00 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -9948,7 +11820,7 @@ __metadata: languageName: node linkType: hard -"tiny-warning@npm:^1.0.0, tiny-warning@npm:^1.0.3": +"tiny-warning@npm:^1.0.0": version: 1.0.3 resolution: "tiny-warning@npm:1.0.3" checksum: ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa @@ -9962,13 +11834,6 @@ __metadata: languageName: node linkType: hard -"to-readable-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "to-readable-stream@npm:1.0.0" - checksum: 79cb836e2fb4f2885745a8c212eab7ebc52e93758ff0737feceaed96df98e4d04b8903fe8c27f2e9f3f856a5068ac332918b235c5d801b3efe02a51a3fa0eb36 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -9985,10 +11850,10 @@ __metadata: languageName: node linkType: hard -"totalist@npm:^1.0.0": - version: 1.1.0 - resolution: "totalist@npm:1.1.0" - checksum: 2adbd4501c8290c2a96617a83dc67dfdd02bcbd360032017e27ccf27bbb09649bbe8dad1c45d97be6874281178aca5b3f62ed059d1eeda77c479cfb8eb3a9266 +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 languageName: node linkType: hard @@ -9999,38 +11864,45 @@ __metadata: languageName: node linkType: hard -"trim-trailing-lines@npm:^1.0.0": - version: 1.1.4 - resolution: "trim-trailing-lines@npm:1.1.4" - checksum: 95c35ece5fc806e626e7a93a2135c52932d1dee584963138dbefb1df6cb7adcb7a7c68e2c63f05c536f0681c9260e1d5262cb2e234242d23b9a31617b2c1d53c - languageName: node - linkType: hard - -"trim@npm:0.0.1": - version: 0.0.1 - resolution: "trim@npm:0.0.1" - checksum: d974971fc8b8629d13286f20ec6ccc48f480494ca9df358d452beb1fd7eea1b802be41cc7ee157be4abbdf1b3ca79cc6d04c34b14a7026037d437e8de9dacecb +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: 3a1611fa9e52aa56a94c69951a9ea15b8aaad760eaa26c56a65330dc8adf99cb282fc07cc9d94968b7d4d88003beba220a7278bbe2063328eb23fb56f9509e94 languageName: node linkType: hard -"trough@npm:^1.0.0": - version: 1.0.5 - resolution: "trough@npm:1.0.5" - checksum: f036d0d7f9bc7cfe5ee650d70b57bb1f048f3292adf6c81bb9b228e546b2b2e5b74ea04a060d21472108a8cda05ec4814bbe86f87ee35c182c50cb41b5c1810a +"trough@npm:^2.0.0": + version: 2.1.0 + resolution: "trough@npm:2.1.0" + checksum: 9a973f0745fa69b9d34f29fe8123599abb6915350a5f4e9e9c9026156219f8774af062d916f4ec327b796149188719170ad87f0d120f1e94271a1843366efcc3 languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0": +"tslib@npm:^2.0.3, tslib@npm:^2.1.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" checksum: eb19bda3ae545b03caea6a244b34593468e23d53b26bf8649fbc20fce43e9b21a71127fd6d2b9662c0fe48ee6ff668ead48fd00d3b88b2b716b1c12edae25b5d languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 +"tslib@npm:^2.6.0": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb + languageName: node + linkType: hard + +"type-fest@npm:^1.0.1": + version: 1.4.0 + resolution: "type-fest@npm:1.4.0" + checksum: a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 + languageName: node + linkType: hard + +"type-fest@npm:^2.13.0": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb languageName: node linkType: hard @@ -10087,16 +11959,6 @@ __metadata: languageName: node linkType: hard -"unherit@npm:^1.0.4": - version: 1.1.3 - resolution: "unherit@npm:1.1.3" - dependencies: - inherits: ^2.0.0 - xtend: ^4.0.0 - checksum: f953b548e56ef347b14c0897484ff22187acfeeb599afe2994cfdbfaddffe8731b999029e243fd40966b597bdffd541f3b5a54254797b98aebb760bb39dd8456 - languageName: node - linkType: hard - "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -10104,6 +11966,13 @@ __metadata: languageName: node linkType: hard +"unicode-emoji-modifier-base@npm:^1.0.0": + version: 1.0.0 + resolution: "unicode-emoji-modifier-base@npm:1.0.0" + checksum: b37623fcf0162186debd20f116483e035a2d5b905b932a2c472459d9143d446ebcbefb2a494e2fe4fa7434355396e2a95ec3fc1f0c29a3bc8f2c827220e79c66 + languageName: node + linkType: hard + "unicode-match-property-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-match-property-ecmascript@npm:2.0.0" @@ -10121,6 +11990,13 @@ __metadata: languageName: node linkType: hard +"unicode-match-property-value-ecmascript@npm:^2.1.0": + version: 2.1.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" + checksum: f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 + languageName: node + linkType: hard + "unicode-property-aliases-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-property-aliases-ecmascript@npm:2.0.0" @@ -10128,31 +12004,18 @@ __metadata: languageName: node linkType: hard -"unified@npm:9.2.0": - version: 9.2.0 - resolution: "unified@npm:9.2.0" - dependencies: - bail: ^1.0.0 - extend: ^3.0.0 - is-buffer: ^2.0.0 - is-plain-obj: ^2.0.0 - trough: ^1.0.0 - vfile: ^4.0.0 - checksum: 53aedb794b0ada002b72593d74633f45742e3dfe771a8091c0f51b59119f74f3f1bba0a24c5d72a35629793f992cf9e1debf21aa4689dc718482ffec3a633623 - languageName: node - linkType: hard - -"unified@npm:^9.2.2": - version: 9.2.2 - resolution: "unified@npm:9.2.2" +"unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": + version: 11.0.4 + resolution: "unified@npm:11.0.4" dependencies: - bail: ^1.0.0 + "@types/unist": ^3.0.0 + bail: ^2.0.0 + devlop: ^1.0.0 extend: ^3.0.0 - is-buffer: ^2.0.0 - is-plain-obj: ^2.0.0 - trough: ^1.0.0 - vfile: ^4.0.0 - checksum: a66d71b039c24626802a4664a1f3210f29ab1f75b89fd41933e6ab00561e1ec43a5bec6de32c7ebc86544e5f00ef5836e8fe79a823e81e35825de4e35823eda9 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^6.0.0 + checksum: b550cdc994d54c84e2e098eb02cfa53535cbc140c148aa3296f235cb43082b499d239110f342fa65eb37ad919472a93cc62f062a83541485a69498084cc87ba1 languageName: node linkType: hard @@ -10174,88 +12037,79 @@ __metadata: languageName: node linkType: hard -"unique-string@npm:^2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" +"unique-string@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-string@npm:3.0.0" dependencies: - crypto-random-string: ^2.0.0 - checksum: 11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b - languageName: node - linkType: hard - -"unist-builder@npm:2.0.3, unist-builder@npm:^2.0.0": - version: 2.0.3 - resolution: "unist-builder@npm:2.0.3" - checksum: d8b13ffd774bfe6175ca988d63cbaf6d85882a0701d6158597134ce1c3acf665a09421461a4036704f77edb8a6a2792d09eb55382428c2a9a60488b44909eeae - languageName: node - linkType: hard - -"unist-util-generated@npm:^1.0.0": - version: 1.1.6 - resolution: "unist-util-generated@npm:1.1.6" - checksum: ee04a58a6711145ec5c8c6f10dfd3335ac93d9039dc35e7410ffc1299d6f3671b27d9b7aa486f826bd66ec15807ad6d0bf9348b34a1046440e1617abcf42903f + crypto-random-string: ^4.0.0 + checksum: b35ea034b161b2a573666ec16c93076b4b6106b8b16c2415808d747ab3a0566b5db0c4be231d4b11cfbc16d7fd915c9d8a45884bff0e2db11b799775b2e1e017 languageName: node linkType: hard -"unist-util-is@npm:^4.0.0": - version: 4.1.0 - resolution: "unist-util-is@npm:4.1.0" - checksum: 21ca3d7bacc88853b880b19cb1b133a056c501617d7f9b8cce969cd8b430ed7e1bc416a3a11b02540d5de6fb86807e169d00596108a459d034cf5faec97c055e +"unist-util-is@npm:^6.0.0": + version: 6.0.0 + resolution: "unist-util-is@npm:6.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: 9419352181eaa1da35eca9490634a6df70d2217815bb5938a04af3a662c12c5607a2f1014197ec9c426fbef18834f6371bfdb6f033040fa8aa3e965300d70e7e languageName: node linkType: hard -"unist-util-position@npm:^3.0.0": - version: 3.1.0 - resolution: "unist-util-position@npm:3.1.0" - checksum: a89d4095560f01e0ddfdab3deae6abd250ee6b91c3b23922de05297227a4aede076d96cb0e22e9962d0e85f54d11f719d1e11388233d0936631b8527485a02a8 +"unist-util-position-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "unist-util-position-from-estree@npm:2.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: 39127bf5f0594e0a76d9241dec4f7aa26323517120ce1edd5ed91c8c1b9df7d6fb18af556e4b6250f1c7368825720ed892e2b6923be5cdc08a9bb16536dc37b3 languageName: node linkType: hard -"unist-util-remove-position@npm:^2.0.0": - version: 2.0.1 - resolution: "unist-util-remove-position@npm:2.0.1" +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" dependencies: - unist-util-visit: ^2.0.0 - checksum: 9aadc8e9fafc4eeb04462454ab084184b84b397a367cab3787c59411b16c8f03d13e80e9ffd6bdae68bf8e5175f42008f410288a041a6ee53bcac8ced45a12ed + "@types/unist": ^3.0.0 + checksum: dde3b31e314c98f12b4dc6402f9722b2bf35e96a4f2d463233dd90d7cde2d4928074a7a11eff0a5eb1f4e200f27fc1557e0a64a7e8e4da6558542f251b1b7400 languageName: node linkType: hard -"unist-util-remove@npm:^2.0.0": - version: 2.1.0 - resolution: "unist-util-remove@npm:2.1.0" +"unist-util-remove-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-remove-position@npm:5.0.0" dependencies: - unist-util-is: ^4.0.0 - checksum: f7dea56fb720ddab5e406af12ce37453b028273e23a7cc3e4c9f3f1ec85e1f72c6943a1ebb907120c9be0b1d08b209d7b8c7d2191a5012e16081056edf638df9 + "@types/unist": ^3.0.0 + unist-util-visit: ^5.0.0 + checksum: e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 languageName: node linkType: hard -"unist-util-stringify-position@npm:^2.0.0": - version: 2.0.3 - resolution: "unist-util-stringify-position@npm:2.0.3" +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" dependencies: - "@types/unist": ^2.0.2 - checksum: 46fa03f840df173b7f032cbfffdb502fb05b79b3fb5451681c796cf4985d9087a537833f5afb75d55e79b46bbbe4b3d81dd75a1062f9289091c526aebe201d5d + "@types/unist": ^3.0.0 + checksum: dfe1dbe79ba31f589108cb35e523f14029b6675d741a79dea7e5f3d098785045d556d5650ec6a8338af11e9e78d2a30df12b1ee86529cded1098da3f17ee999e languageName: node linkType: hard -"unist-util-visit-parents@npm:^3.0.0": - version: 3.1.1 - resolution: "unist-util-visit-parents@npm:3.1.1" +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-visit-parents@npm:6.0.1" dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^4.0.0 - checksum: 231c80c5ba8e79263956fcaa25ed2a11ad7fe77ac5ba0d322e9d51bbc4238501e3bb52f405e518bcdc5471e27b33eff520db0aa4a3b1feb9fb6e2de6ae385d49 + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + checksum: 51b1a5b0aa23c97d3e03e7288f0cdf136974df2217d0999d3de573c05001ef04cccd246f51d2ebdfb9e8b0ed2704451ad90ba85ae3f3177cf9772cef67f56206 languageName: node linkType: hard -"unist-util-visit@npm:2.0.3, unist-util-visit@npm:^2.0.0, unist-util-visit@npm:^2.0.3": - version: 2.0.3 - resolution: "unist-util-visit@npm:2.0.3" +"unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^4.0.0 - unist-util-visit-parents: ^3.0.0 - checksum: 7b11303d82271ca53a2ced2d56c87a689dd518596c99ff4a11cdff750f5cc5c0e4b64b146bd2363557cb29443c98713bfd1e8dc6d1c3f9d474b9eb1f23a60888 + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 51434a1d80252c1540cce6271a90fd1a106dbe624997c09ed8879279667fb0b2d3a685e02e92bf66598dcbe6cdffa7a5f5fb363af8fdf90dda6c855449ae39a5 languageName: node linkType: hard @@ -10273,25 +12127,39 @@ __metadata: languageName: node linkType: hard -"update-notifier@npm:^5.1.0": - version: 5.1.0 - resolution: "update-notifier@npm:5.1.0" +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" dependencies: - boxen: ^5.0.0 - chalk: ^4.1.0 - configstore: ^5.0.1 - has-yarn: ^2.1.0 - import-lazy: ^2.1.0 - is-ci: ^2.0.0 + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + languageName: node + linkType: hard + +"update-notifier@npm:^6.0.2": + version: 6.0.2 + resolution: "update-notifier@npm:6.0.2" + dependencies: + boxen: ^7.0.0 + chalk: ^5.0.1 + configstore: ^6.0.0 + has-yarn: ^3.0.0 + import-lazy: ^4.0.0 + is-ci: ^3.0.1 is-installed-globally: ^0.4.0 - is-npm: ^5.0.0 - is-yarn-global: ^0.3.0 - latest-version: ^5.1.0 - pupa: ^2.1.1 - semver: ^7.3.4 - semver-diff: ^3.1.1 - xdg-basedir: ^4.0.0 - checksum: 0dde6db5ac1e5244e1f8bf5b26895a0d53c00797ea2bdbc1302623dd1aecab5cfb88b4f324d482cbd4c8b089464383d8c83db64dec5798ec0136820e22478e47 + is-npm: ^6.0.0 + is-yarn-global: ^0.4.0 + latest-version: ^7.0.0 + pupa: ^3.1.0 + semver: ^7.3.7 + semver-diff: ^4.0.0 + xdg-basedir: ^5.1.0 + checksum: ad3980073312df904133a6e6c554a7f9d0832ed6275e55f5a546313fe77a0f20f23a7b1b4aeb409e20a78afb06f4d3b2b28b332d9cfb55745b5d1ea155810bcc languageName: node linkType: hard @@ -10321,56 +12189,38 @@ __metadata: languageName: node linkType: hard -"url-parse-lax@npm:^3.0.0": - version: 3.0.0 - resolution: "url-parse-lax@npm:3.0.0" - dependencies: - prepend-http: ^2.0.0 - checksum: 16f918634d41a4fab9e03c5f9702968c9930f7c29aa1a8c19a6dc01f97d02d9b700ab9f47f8da0b9ace6e0c0e99c27848994de1465b494bced6940c653481e55 - languageName: node - linkType: hard - -"use-composed-ref@npm:^1.0.0": - version: 1.2.1 - resolution: "use-composed-ref@npm:1.2.1" +"use-composed-ref@npm:^1.3.0": + version: 1.3.0 + resolution: "use-composed-ref@npm:1.3.0" peerDependencies: - react: ^16.8.0 || ^17.0.0 - checksum: 18486146ace8d89313e4d815bf900b0a12a651c9a24e1c43d1e9188a5f317578e61aca02ac297e7d5f09f968862d3c664251decbd4b4e0fb734853ac1cccc688 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: e64ce52f4b18c020407636784192726807404a2552609acf7497b66a2b7070674fb5d2b950d426c4aa85f353e2bbecb02ebf9c5b865cd06797938c70bcbf5d26 languageName: node linkType: hard -"use-isomorphic-layout-effect@npm:^1.0.0": - version: 1.1.1 - resolution: "use-isomorphic-layout-effect@npm:1.1.1" +"use-isomorphic-layout-effect@npm:^1.1.1": + version: 1.1.2 + resolution: "use-isomorphic-layout-effect@npm:1.1.2" peerDependencies: - react: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: eaf2766a10b837f5d6bc5b34906349217bf612eb9623624edead75d436169d625d34eec131d15adf40a22180c17d6c3374dcdb82097bc7105710143aa69e12a4 + checksum: d8deea8b85e55ac6daba237a889630bfdbf0ebf60e9e22b6a78a78c26fabe6025e04ada7abef1e444e6786227d921e648b2707db8b3564daf757264a148a6e23 languageName: node linkType: hard -"use-latest@npm:^1.0.0": - version: 1.2.0 - resolution: "use-latest@npm:1.2.0" +"use-latest@npm:^1.2.1": + version: 1.2.1 + resolution: "use-latest@npm:1.2.1" dependencies: - use-isomorphic-layout-effect: ^1.0.0 + use-isomorphic-layout-effect: ^1.1.1 peerDependencies: - react: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: c2e60f8efa4ea90972b7879e3d6acebef23695f7eeb0d7ca82c1e44f142d701d8b71580f742555ddde2af1b90d071c407c02cc7175529beed137cc138b6e793c - languageName: node - linkType: hard - -"use-sync-external-store@npm:^1.2.0": - version: 1.2.0 - resolution: "use-sync-external-store@npm:1.2.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: ac4814e5592524f242921157e791b022efe36e451fe0d4fd4d204322d5433a4fc300d63b0ade5185f8e0735ded044c70bcf6d2352db0f74d097a238cebd2da02 + checksum: 1958886fc35262d973f5cd4ce16acd6ce3a66707a72761c93abd1b5ae64e1a11efa83f68e6c8c9bf1647628037980ce59df64cba50adb36bd4071851e70527d2 languageName: node linkType: hard @@ -10425,47 +12275,49 @@ __metadata: languageName: node linkType: hard -"vfile-location@npm:^3.0.0, vfile-location@npm:^3.2.0": - version: 3.2.0 - resolution: "vfile-location@npm:3.2.0" - checksum: d9513c738fcac26388f4ee04337663514434df718201309088377b53be3fdcfdb01a4a8f02f5a21ebf33690a670f31229e4c7c3991fb7af63f549fda3ec36836 +"vfile-location@npm:^5.0.0": + version: 5.0.2 + resolution: "vfile-location@npm:5.0.2" + dependencies: + "@types/unist": ^3.0.0 + vfile: ^6.0.0 + checksum: cfc7e49de93ac5be6f3c9a9fe77676756e00d33a6c69d9c1ce279b06eedafa67fe5d0da2334b40e97963c43b014501bca2f829dfd6622a3290fb6f7dd2b9339e languageName: node linkType: hard -"vfile-message@npm:^2.0.0": - version: 2.0.4 - resolution: "vfile-message@npm:2.0.4" +"vfile-message@npm:^4.0.0": + version: 4.0.2 + resolution: "vfile-message@npm:4.0.2" dependencies: - "@types/unist": ^2.0.0 - unist-util-stringify-position: ^2.0.0 - checksum: ce50d90e0e5dc8f995f39602dd2404f1756388a54209c983d259b17c15e6f262a53546977a638065bc487d0657799fa96f4c1ba6b2915d9724a4968e9c7ff1c8 + "@types/unist": ^3.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 07671d239a075f888b78f318bc1d54de02799db4e9dce322474e67c35d75ac4a5ac0aaf37b18801d91c9f8152974ea39678aa72d7198758b07f3ba04fb7d7514 languageName: node linkType: hard -"vfile@npm:^4.0.0": - version: 4.2.1 - resolution: "vfile@npm:4.2.1" +"vfile@npm:^6.0.0, vfile@npm:^6.0.1": + version: 6.0.1 + resolution: "vfile@npm:6.0.1" dependencies: - "@types/unist": ^2.0.0 - is-buffer: ^2.0.0 - unist-util-stringify-position: ^2.0.0 - vfile-message: ^2.0.0 - checksum: 4816aecfedc794ba4d3131abff2032ef0e825632cfa8cd20dd9d83819ef260589924f4f3e8fa30e06da2d8e60d7ec8ef7d0af93e0483df62890738258daf098a + "@types/unist": ^3.0.0 + unist-util-stringify-position: ^4.0.0 + vfile-message: ^4.0.0 + checksum: 443bda43e5ad3b73c5976e987dba2b2d761439867ba7d5d7c5f4b01d3c1cb1b976f5f0e6b2399a00dc9b4eaec611bd9984ce9ce8a75a72e60aed518b10a902d2 languageName: node linkType: hard -"wait-on@npm:^6.0.1": - version: 6.0.1 - resolution: "wait-on@npm:6.0.1" +"wait-on@npm:^7.0.1": + version: 7.1.0 + resolution: "wait-on@npm:7.1.0" dependencies: - axios: ^0.25.0 - joi: ^17.6.0 + axios: ^0.27.2 + joi: ^17.11.0 lodash: ^4.17.21 - minimist: ^1.2.5 - rxjs: ^7.5.4 + minimist: ^1.2.8 + rxjs: ^7.8.1 bin: wait-on: bin/wait-on - checksum: 99772bc85d17f7e6ff8b0e40bd2c90a2c2025b0e9a5a3f8edcf39af0c367d8a5bbdd3d4f1190588be8b09745e80bbdf59c2c4059053a7d180e29b8711cc4a840 + checksum: 1d3977fa23edd2ab81daebfb7874cb770dee568d6ba0247b01ce67a5906962dcb060bcc1a85a80989d504ee0ab1925106c33093bea39ddf9f0d7443647b59ce3 languageName: node linkType: hard @@ -10488,10 +12340,10 @@ __metadata: languageName: node linkType: hard -"web-namespaces@npm:^1.0.0": - version: 1.1.4 - resolution: "web-namespaces@npm:1.1.4" - checksum: 05b5782c32a33ef94fa7a412afdebc9d0d3cc7b59db31d2cc7bd80de3e237d4b6309cb5f156d06e3a837b9826c9414448c25111ec1d4407d2025ffeb7bea4f62 +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd languageName: node linkType: hard @@ -10502,22 +12354,30 @@ __metadata: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:^4.5.0": - version: 4.5.0 - resolution: "webpack-bundle-analyzer@npm:4.5.0" +"webpack-bundle-analyzer@npm:^4.9.0": + version: 4.9.1 + resolution: "webpack-bundle-analyzer@npm:4.9.1" dependencies: + "@discoveryjs/json-ext": 0.5.7 acorn: ^8.0.4 acorn-walk: ^8.0.0 - chalk: ^4.1.0 commander: ^7.2.0 + escape-string-regexp: ^4.0.0 gzip-size: ^6.0.0 - lodash: ^4.17.20 + is-plain-object: ^5.0.0 + lodash.debounce: ^4.0.8 + lodash.escape: ^4.0.1 + lodash.flatten: ^4.4.0 + lodash.invokemap: ^4.6.0 + lodash.pullall: ^4.2.0 + lodash.uniqby: ^4.7.0 opener: ^1.5.2 - sirv: ^1.0.7 + picocolors: ^1.0.0 + sirv: ^2.0.3 ws: ^7.3.1 bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 5130be9fa58645e412e9824f98bd961afe540b9918951ddc87b688f3e176f4a101fcb16a304c74f0d1ddd9f2528ec2fa44bcfcea3fe07635fa9af0e3104644aa + checksum: dd047c306471e6c389d6d4156ff22402e587140310a065a6191ee380f8251063f73a8ec6ac6d977c1cd634dbb717e2522b5d0b6cc9b0e847d4f15737fd9c65c9 languageName: node linkType: hard @@ -10536,9 +12396,9 @@ __metadata: languageName: node linkType: hard -"webpack-dev-server@npm:^4.9.3": - version: 4.9.3 - resolution: "webpack-dev-server@npm:4.9.3" +"webpack-dev-server@npm:^4.15.1": + version: 4.15.1 + resolution: "webpack-dev-server@npm:4.15.1" dependencies: "@types/bonjour": ^3.5.9 "@types/connect-history-api-fallback": ^1.3.5 @@ -10546,7 +12406,7 @@ __metadata: "@types/serve-index": ^1.9.1 "@types/serve-static": ^1.13.10 "@types/sockjs": ^0.3.33 - "@types/ws": ^8.5.1 + "@types/ws": ^8.5.5 ansi-html-community: ^0.0.8 bonjour-service: ^1.0.11 chokidar: ^3.5.3 @@ -10559,34 +12419,38 @@ __metadata: html-entities: ^2.3.2 http-proxy-middleware: ^2.0.3 ipaddr.js: ^2.0.1 + launch-editor: ^2.6.0 open: ^8.0.9 p-retry: ^4.5.0 rimraf: ^3.0.2 schema-utils: ^4.0.0 - selfsigned: ^2.0.1 + selfsigned: ^2.1.1 serve-index: ^1.9.1 sockjs: ^0.3.24 spdy: ^4.0.2 webpack-dev-middleware: ^5.3.1 - ws: ^8.4.2 + ws: ^8.13.0 peerDependencies: webpack: ^4.37.0 || ^5.0.0 peerDependenciesMeta: + webpack: + optional: true webpack-cli: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 2fdc02b3f6cd44b13f8a062da56f999decd2df596c05dd212248c808f310ee77d5809919e5846a4f28fb02d062abfbef1b984f48260ed2a6e493ff2b9cb75231 + checksum: 2cf3edf556dcafdfc938e0adeac3dadf97fb959ed66b88bdd70acdb0b77b0f25be5e2d4b30cca2da8732548451418cadf00eb09e751e7674ff914fd9ab646b26 languageName: node linkType: hard -"webpack-merge@npm:^5.8.0": - version: 5.8.0 - resolution: "webpack-merge@npm:5.8.0" +"webpack-merge@npm:^5.9.0": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" dependencies: clone-deep: ^4.0.1 + flat: ^5.0.2 wildcard: ^2.0.0 - checksum: 400eaaba69d2240d51dc7a4427dde37849a8f2fdf93731be6a8aad34d70d55bb38cb10c5001c7b339fc91f8c8547e782ecbd79eff24ad861e21e6a4c5dc959fb + checksum: b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b languageName: node linkType: hard @@ -10597,21 +12461,21 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5.73.0": - version: 5.76.1 - resolution: "webpack@npm:5.76.1" +"webpack@npm:^5.88.1": + version: 5.89.0 + resolution: "webpack@npm:5.89.0" dependencies: "@types/eslint-scope": ^3.7.3 - "@types/estree": ^0.0.51 - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/wasm-edit": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 acorn: ^8.7.1 - acorn-import-assertions: ^1.7.6 + acorn-import-assertions: ^1.9.0 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.10.0 - es-module-lexer: ^0.9.0 + enhanced-resolve: ^5.15.0 + es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 glob-to-regexp: ^0.4.1 @@ -10620,9 +12484,9 @@ __metadata: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.1.0 + schema-utils: ^3.2.0 tapable: ^2.1.1 - terser-webpack-plugin: ^5.1.3 + terser-webpack-plugin: ^5.3.7 watchpack: ^2.4.0 webpack-sources: ^3.2.3 peerDependenciesMeta: @@ -10630,7 +12494,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 9cfc3f5a42d55bfe4fa1b2637ee984aa4455c785b9b3a938de2bdc717dcb9b6222fbc0175f53691b8098aa02db180fdc488a6417cd6a8676da70372d78db8e9f + checksum: 2562bf48788d651634fb7db6a5378c2fe3fce7f66831af38468da3944bd98756d68efea94a6909593993fb57b2d14cf802cbef2c83c6ef0047f7f606d59bec50 languageName: node linkType: hard @@ -10707,15 +12571,6 @@ __metadata: languageName: node linkType: hard -"widest-line@npm:^3.1.0": - version: 3.1.0 - resolution: "widest-line@npm:3.1.0" - dependencies: - string-width: ^4.0.0 - checksum: b1e623adcfb9df35350dd7fc61295d6d4a1eaa65a406ba39c4b8360045b614af95ad10e05abf704936ed022569be438c4bfa02d6d031863c4166a238c301119f - languageName: node - linkType: hard - "widest-line@npm:^4.0.1": version: 4.0.1 resolution: "widest-line@npm:4.0.1" @@ -10732,17 +12587,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - "wrap-ansi@npm:^8.0.1": version: 8.0.1 resolution: "wrap-ansi@npm:8.0.1" @@ -10754,6 +12598,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -10761,7 +12616,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": +"write-file-atomic@npm:^3.0.3": version: 3.0.3 resolution: "write-file-atomic@npm:3.0.3" dependencies: @@ -10788,25 +12643,25 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.4.2": - version: 8.5.0 - resolution: "ws@npm:8.5.0" +"ws@npm:^8.13.0": + version: 8.14.2 + resolution: "ws@npm:8.14.2" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 0baeee03e97865accda8fad51e8e5fa17d19b8e264529efdf662bbba2acc1c7f1de8316287e6df5cb639231a96009e6d5234b57e6ff36ee2d04e49a0995fec2f + checksum: 35b4c2da048b8015c797fd14bcb5a5766216ce65c8a5965616a5440ca7b6c3681ee3cbd0ea0c184a59975556e9d58f2002abf8485a14d11d3371770811050a16 languageName: node linkType: hard -"xdg-basedir@npm:^4.0.0": - version: 4.0.0 - resolution: "xdg-basedir@npm:4.0.0" - checksum: 1b5d70d58355af90363a4e0a51c992e77fc5a1d8de5822699c7d6e96a6afea9a1e048cb93312be6870f338ca45ebe97f000425028fa149c1e87d1b5b8b212a06 +"xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": + version: 5.1.0 + resolution: "xdg-basedir@npm:5.1.0" + checksum: c88efabc71ffd996ba9ad8923a8cc1c7c020a03e2c59f0ffa72e06be9e724ad2a0fccef488757bc6ed3d8849d753dd25082d1035d95cb179e79eae4d034d0b80 languageName: node linkType: hard @@ -10821,10 +12676,10 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:^4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 languageName: node linkType: hard @@ -10849,9 +12704,16 @@ __metadata: languageName: node linkType: hard -"zwitch@npm:^1.0.0": - version: 1.0.5 - resolution: "zwitch@npm:1.0.5" - checksum: 26dc7d32e5596824b565db1da9650d00d32659c1211195bef50c25c60820f9c942aa7abefe678fc1ed0b97c1755036ac1bde5f97881d7d0e73e04e02aca56957 +"yocto-queue@npm:^1.0.0": + version: 1.0.0 + resolution: "yocto-queue@npm:1.0.0" + checksum: 856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 + languageName: node + linkType: hard + +"zwitch@npm:^2.0.0": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: 3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e languageName: node linkType: hard diff --git a/package.json b/package.json index 32d9b998dc07..f8fcd0958d46 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "smoke-test": "node ./tasks/smoke-tests/smoke-tests.mjs", "test": "lerna run test --concurrency 2 -- --colors --maxWorkers=4", "test-ci": "lerna run test --concurrency 2 -- --colors --maxWorkers", - "test:k6": "tsx ./tasks/k6-test/run-k6-tests.mts" + "test:k6": "tsx ./tasks/k6-test/run-k6-tests.mts", + "test:types": "tstyche" }, "resolutions": { "vscode-languageserver": "6.1.1", @@ -40,8 +41,8 @@ "vscode-languageserver-types": "3.17.3" }, "devDependencies": { - "@actions/cache": "3.2.1", - "@actions/core": "1.10.0", + "@actions/cache": "3.2.2", + "@actions/core": "1.10.1", "@actions/exec": "1.1.1", "@actions/glob": "0.4.0", "@babel/cli": "7.23.0", @@ -64,8 +65,7 @@ "@playwright/test": "1.37.1", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "14.0.0", - "@testing-library/user-event": "14.4.3", - "@tsd/typescript": "5.1.6", + "@testing-library/user-event": "14.5.1", "@types/babel__generator": "7.6.5", "@types/fs-extra": "11.0.1", "@types/jest": "29.5.4", @@ -77,29 +77,29 @@ "babel-plugin-auto-import": "1.1.0", "babel-plugin-remove-code": "0.0.6", "boxen": "5.1.2", - "core-js": "3.32.2", + "core-js": "3.33.2", "cypress": "12.15.0", "cypress-wait-until": "1.7.2", "dependency-cruiser": "13.0.4", "eslint": "8.46.0", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "fs-extra": "11.1.1", "jest": "29.7.0", - "jest-runner-tsd": "5.0.0", "jscodeshift": "0.15.0", - "lerna": "7.3.0", + "lerna": "7.4.2", "listr2": "6.6.1", "make-dir-cli": "3.0.0", - "msw": "1.3.1", + "msw": "1.3.2", "ncp": "2.0.0", "nodemon": "2.0.22", "npm-packlist": "7.0.4", "nx": "16.4.1", "nx-cloud": "16.2.0", "octokit": "2.1.0", - "ora": "6.3.1", + "ora": "7.0.1", "prompts": "2.4.2", "rimraf": "5.0.5", + "tstyche": "1.0.0-beta.3", "tsx": "3.12.7", "typescript": "5.2.2", "yargs": "17.7.2", diff --git a/packages/api-server/package.json b/packages/api-server/package.json index 6743eddbeca4..efab1e237b5a 100644 --- a/packages/api-server/package.json +++ b/packages/api-server/package.json @@ -29,16 +29,16 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "@fastify/http-proxy": "9.2.1", - "@fastify/static": "6.11.2", - "@fastify/url-data": "5.3.1", + "@fastify/http-proxy": "9.3.0", + "@fastify/static": "6.12.0", + "@fastify/url-data": "5.4.0", "@redwoodjs/project-config": "6.0.7", "ansi-colors": "4.1.3", "chalk": "4.1.2", "chokidar": "3.5.3", - "core-js": "3.32.2", + "core-js": "3.33.2", "dotenv-defaults": "5.0.2", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "fast-json-parse": "1.0.3", "fastify": "4.23.2", "fastify-raw-body": "4.2.2", diff --git a/packages/api-server/tsconfig.json b/packages/api-server/tsconfig.json index ca58c848ae21..06fe65a2387a 100644 --- a/packages/api-server/tsconfig.json +++ b/packages/api-server/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src", "ambient.d.ts"], diff --git a/packages/api/package.json b/packages/api/package.json index a83ea83a240b..16b7117f30ea 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -32,20 +32,20 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "@prisma/client": "5.4.2", + "@prisma/client": "5.6.0", "@whatwg-node/fetch": "0.9.9", - "core-js": "3.32.2", + "core-js": "3.33.2", "humanize-string": "2.1.0", - "jsonwebtoken": "9.0.0", + "jsonwebtoken": "9.0.2", "pascalcase": "1.0.0", - "pino": "8.15.1", + "pino": "8.16.1", "title-case": "3.0.3" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@types/aws-lambda": "8.10.119", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "@types/memjs": "1", "@types/pascalcase": "1.0.1", "@types/split2": "4.2.0", diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 1b82fffaba16..e9440671d9f5 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src/**/*"] diff --git a/packages/auth-providers/auth0/api/package.json b/packages/auth-providers/auth0/api/package.json index d90522ec0f17..066d3a500c22 100644 --- a/packages/auth-providers/auth0/api/package.json +++ b/packages/auth-providers/auth0/api/package.json @@ -23,15 +23,15 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", - "jsonwebtoken": "9.0.0", + "core-js": "3.33.2", + "jsonwebtoken": "9.0.2", "jwks-rsa": "3.0.1" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@redwoodjs/api": "6.0.7", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/auth-providers/auth0/api/tsconfig.json b/packages/auth-providers/auth0/api/tsconfig.json index bb9ec4a21fd1..992f3e8dfddf 100644 --- a/packages/auth-providers/auth0/api/tsconfig.json +++ b/packages/auth-providers/auth0/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/auth0/setup/package.json b/packages/auth-providers/auth0/setup/package.json index 03852f494d48..6e0473b7018c 100644 --- a/packages/auth-providers/auth0/setup/package.json +++ b/packages/auth-providers/auth0/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/auth0/setup/tsconfig.json b/packages/auth-providers/auth0/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/auth0/setup/tsconfig.json +++ b/packages/auth-providers/auth0/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/auth0/web/package.json b/packages/auth-providers/auth0/web/package.json index 38784fb9c801..29e55288197f 100644 --- a/packages/auth-providers/auth0/web/package.json +++ b/packages/auth-providers/auth0/web/package.json @@ -24,10 +24,10 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { - "@auth0/auth0-spa-js": "2.1.1", + "@auth0/auth0-spa-js": "2.1.2", "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@types/react": "18.2.14", @@ -36,7 +36,7 @@ "typescript": "5.2.2" }, "peerDependencies": { - "@auth0/auth0-spa-js": "2.1.1" + "@auth0/auth0-spa-js": "2.1.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" } diff --git a/packages/auth-providers/auth0/web/tsconfig.json b/packages/auth-providers/auth0/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/auth0/web/tsconfig.json +++ b/packages/auth-providers/auth0/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/azureActiveDirectory/api/package.json b/packages/auth-providers/azureActiveDirectory/api/package.json index f31dabfd7774..2aa0b82554fa 100644 --- a/packages/auth-providers/azureActiveDirectory/api/package.json +++ b/packages/auth-providers/azureActiveDirectory/api/package.json @@ -23,8 +23,8 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", - "jsonwebtoken": "9.0.0", + "core-js": "3.33.2", + "jsonwebtoken": "9.0.2", "jwks-rsa": "3.0.1" }, "devDependencies": { @@ -32,7 +32,7 @@ "@babel/core": "^7.22.20", "@redwoodjs/api": "6.0.7", "@types/aws-lambda": "8.10.119", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/auth-providers/azureActiveDirectory/api/tsconfig.json b/packages/auth-providers/azureActiveDirectory/api/tsconfig.json index bb9ec4a21fd1..992f3e8dfddf 100644 --- a/packages/auth-providers/azureActiveDirectory/api/tsconfig.json +++ b/packages/auth-providers/azureActiveDirectory/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/azureActiveDirectory/setup/package.json b/packages/auth-providers/azureActiveDirectory/setup/package.json index 778abb8b2fbf..fffa4b917b04 100644 --- a/packages/auth-providers/azureActiveDirectory/setup/package.json +++ b/packages/auth-providers/azureActiveDirectory/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/azureActiveDirectory/setup/tsconfig.json b/packages/auth-providers/azureActiveDirectory/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/azureActiveDirectory/setup/tsconfig.json +++ b/packages/auth-providers/azureActiveDirectory/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/azureActiveDirectory/web/package.json b/packages/auth-providers/azureActiveDirectory/web/package.json index ac088253a4c5..14e72079261e 100644 --- a/packages/auth-providers/azureActiveDirectory/web/package.json +++ b/packages/auth-providers/azureActiveDirectory/web/package.json @@ -24,10 +24,10 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { - "@azure/msal-browser": "2.38.1", + "@azure/msal-browser": "2.38.3", "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@types/netlify-identity-widget": "1.9.3", @@ -37,7 +37,7 @@ "typescript": "5.2.2" }, "peerDependencies": { - "@azure/msal-browser": "2.38.1" + "@azure/msal-browser": "2.38.3" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" } diff --git a/packages/auth-providers/azureActiveDirectory/web/tsconfig.json b/packages/auth-providers/azureActiveDirectory/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/azureActiveDirectory/web/tsconfig.json +++ b/packages/auth-providers/azureActiveDirectory/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/clerk/api/package.json b/packages/auth-providers/clerk/api/package.json index 2ea43a496116..236b8287a51b 100644 --- a/packages/auth-providers/clerk/api/package.json +++ b/packages/auth-providers/clerk/api/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@clerk/clerk-sdk-node": "4.12.6", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/clerk/api/tsconfig.json b/packages/auth-providers/clerk/api/tsconfig.json index bb9ec4a21fd1..992f3e8dfddf 100644 --- a/packages/auth-providers/clerk/api/tsconfig.json +++ b/packages/auth-providers/clerk/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/clerk/setup/package.json b/packages/auth-providers/clerk/setup/package.json index f6e58e2d705a..a08af5aa4b33 100644 --- a/packages/auth-providers/clerk/setup/package.json +++ b/packages/auth-providers/clerk/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/clerk/setup/tsconfig.json b/packages/auth-providers/clerk/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/clerk/setup/tsconfig.json +++ b/packages/auth-providers/clerk/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/clerk/web/package.json b/packages/auth-providers/clerk/web/package.json index 61d42d2c5465..1bf87a2ae400 100644 --- a/packages/auth-providers/clerk/web/package.json +++ b/packages/auth-providers/clerk/web/package.json @@ -24,20 +24,20 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", - "@clerk/clerk-react": "4.25.1", - "@clerk/types": "3.52.0", + "@clerk/clerk-react": "4.28.0", + "@clerk/types": "3.58.0", "@types/react": "18.2.14", "jest": "29.7.0", "react": "0.0.0-experimental-e5205658f-20230913", "typescript": "5.2.2" }, "peerDependencies": { - "@clerk/clerk-react": "4.25.1" + "@clerk/clerk-react": "4.28.0" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" } diff --git a/packages/auth-providers/clerk/web/tsconfig.json b/packages/auth-providers/clerk/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/clerk/web/tsconfig.json +++ b/packages/auth-providers/clerk/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/custom/setup/package.json b/packages/auth-providers/custom/setup/package.json index 485364ad9162..d5f1d30f122b 100644 --- a/packages/auth-providers/custom/setup/package.json +++ b/packages/auth-providers/custom/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/custom/setup/tsconfig.json b/packages/auth-providers/custom/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/custom/setup/tsconfig.json +++ b/packages/auth-providers/custom/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/dbAuth/api/package.json b/packages/auth-providers/dbAuth/api/package.json index 0e0033b5a22d..844477b4347f 100644 --- a/packages/auth-providers/dbAuth/api/package.json +++ b/packages/auth-providers/dbAuth/api/package.json @@ -25,8 +25,7 @@ "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/project-config": "6.0.7", "base64url": "3.0.1", - "core-js": "3.32.2", - "crypto-js": "4.1.1", + "core-js": "3.33.2", "md5": "2.3.0", "uuid": "9.0.0" }, @@ -35,7 +34,6 @@ "@babel/core": "^7.22.20", "@redwoodjs/api": "6.0.7", "@simplewebauthn/server": "7.3.1", - "@types/crypto-js": "4.1.1", "@types/md5": "2.3.2", "@types/uuid": "9.0.2", "jest": "29.7.0", diff --git a/packages/auth-providers/dbAuth/api/src/DbAuthHandler.ts b/packages/auth-providers/dbAuth/api/src/DbAuthHandler.ts index bdc650dc85c1..6ba5d5320fcd 100644 --- a/packages/auth-providers/dbAuth/api/src/DbAuthHandler.ts +++ b/packages/auth-providers/dbAuth/api/src/DbAuthHandler.ts @@ -13,7 +13,6 @@ import type { } from '@simplewebauthn/typescript-types' import type { APIGatewayProxyEvent, Context as LambdaContext } from 'aws-lambda' import base64url from 'base64url' -import CryptoJS from 'crypto-js' import md5 from 'md5' import { v4 as uuidv4 } from 'uuid' @@ -24,11 +23,15 @@ import * as DbAuthError from './errors' import { cookieName, decryptSession, + encryptSession, extractCookie, getSession, hashPassword, + legacyHashPassword, + isLegacySession, hashToken, webAuthnSession, + extractHashingOptions, } from './shared' type SetCookieHeader = { 'set-cookie': string } @@ -633,12 +636,16 @@ export class DbAuthHandler< } let user = await this._findUserByToken(resetToken as string) - const [hashedPassword] = hashPassword(password, user.salt) + const [hashedPassword] = hashPassword(password, { + salt: user.salt, + }) + const [legacyHashedPassword] = legacyHashPassword(password, user.salt) if ( - !(this.options.resetPassword as ResetPasswordFlowOptions) + (!(this.options.resetPassword as ResetPasswordFlowOptions) .allowReusedPassword && - user.hashedPassword === hashedPassword + user.hashedPassword === hashedPassword) || + user.hashedPassword === legacyHashedPassword ) { throw new DbAuthError.ReusedPasswordError( ( @@ -1151,11 +1158,6 @@ export class DbAuthHandler< return meta } - // encrypts a string with the SESSION_SECRET - _encrypt(data: string) { - return CryptoJS.AES.encrypt(data, process.env.SESSION_SECRET as string) - } - // returns the set-cookie header to be returned in the request (effectively // creates the session) _createSessionHeader( @@ -1163,9 +1165,9 @@ export class DbAuthHandler< csrfToken: string ): SetCookieHeader { const session = JSON.stringify(data) + ';' + csrfToken - const encrypted = this._encrypt(session) + const encrypted = encryptSession(session) const cookie = [ - `${cookieName(this.options.cookie?.name)}=${encrypted.toString()}`, + `${cookieName(this.options.cookie?.name)}=${encrypted}`, ...this._cookieAttributes({ expires: this.sessionExpiresDate }), ].join(';') @@ -1276,19 +1278,56 @@ export class DbAuthHandler< ) } - // is password correct? - const [hashedPassword, _salt] = hashPassword( - password, - user[this.options.authFields.salt] + await this._verifyPassword(user, password) + return user + } + + // extracts scrypt strength options from hashed password (if present) and + // compares the hashed plain text password just submitted using those options + // with the one in the database. Falls back to the legacy CryptoJS algorihtm + // if no options are present. + async _verifyPassword(user: Record, password: string) { + const options = extractHashingOptions( + user[this.options.authFields.hashedPassword] as string ) - if (hashedPassword === user[this.options.authFields.hashedPassword]) { - return user + + if (Object.keys(options).length) { + // hashed using the node:crypto algorithm + const [hashedPassword] = hashPassword(password, { + salt: user[this.options.authFields.salt] as string, + options, + }) + + if (hashedPassword === user[this.options.authFields.hashedPassword]) { + return user + } } else { - throw new DbAuthError.IncorrectPasswordError( - username, - (this.options.login as LoginFlowOptions)?.errors?.incorrectPassword + // fallback to old CryptoJS hashing + const [legacyHashedPassword] = legacyHashPassword( + password, + user[this.options.authFields.salt] as string ) + + if ( + legacyHashedPassword === user[this.options.authFields.hashedPassword] + ) { + const [newHashedPassword] = hashPassword(password, { + salt: user[this.options.authFields.salt] as string, + }) + + // update user's hash to the new algorithm + await this.dbAccessor.update({ + where: { id: user.id }, + data: { [this.options.authFields.hashedPassword]: newHashedPassword }, + }) + return user + } } + + throw new DbAuthError.IncorrectPasswordError( + user[this.options.authFields.username] as string, + (this.options.login as LoginFlowOptions)?.errors?.incorrectPassword + ) } // gets the user from the database and returns only its ID @@ -1348,8 +1387,7 @@ export class DbAuthHandler< ) } - // if we get here everything is good, call the app's signup handler and let - // them worry about scrubbing data and saving to the DB + // if we get here everything is good, call the app's signup handler const [hashedPassword, salt] = hashPassword(password) const newUser = await (this.options.signup as SignupFlowOptions).handler({ username, @@ -1403,9 +1441,7 @@ export class DbAuthHandler< ] { const sessionData = { id: user[this.options.authFields.id] } - // TODO: this needs to go into graphql somewhere so that each request makes - // a new CSRF token and sets it in both the encrypted session and the - // csrf-token header + // TODO: this needs to go into graphql somewhere so that each request makes a new CSRF token and sets it in both the encrypted session and the csrf-token header const csrfToken = DbAuthHandler.CSRF_TOKEN return [ diff --git a/packages/auth-providers/dbAuth/api/src/__tests__/DbAuthHandler.test.js b/packages/auth-providers/dbAuth/api/src/__tests__/DbAuthHandler.test.js index 5abdf3aa731c..4d19f4847055 100644 --- a/packages/auth-providers/dbAuth/api/src/__tests__/DbAuthHandler.test.js +++ b/packages/auth-providers/dbAuth/api/src/__tests__/DbAuthHandler.test.js @@ -1,7 +1,6 @@ +import crypto from 'node:crypto' import path from 'node:path' -import CryptoJS from 'crypto-js' - import { DbAuthHandler } from '../DbAuthHandler' import * as dbAuthError from '../errors' import { hashToken } from '../shared' @@ -81,10 +80,10 @@ const db = new DbMock(['user', 'userCredential']) const UUID_REGEX = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/ -const SET_SESSION_REGEX = /^session=[a-zA-Z0-9+=/]+;/ +const SET_SESSION_REGEX = /^session=[a-zA-Z0-9+=/]|[a-zA-Z0-9+=/]+;/ const UTC_DATE_REGEX = /\w{3}, \d{2} \w{3} \d{4} [\d:]{8} GMT/ const LOGOUT_COOKIE = 'session=;Expires=Thu, 01 Jan 1970 00:00:00 GMT' - +const SESSION_SECRET = '540d03ebb00b441f8f7442cbc39958ad' const FIXTURE_PATH = path.resolve( __dirname, '../../../../../../__fixtures__/example-todo-main' @@ -102,9 +101,10 @@ const createDbUser = async (attributes = {}) => { return await db.user.create({ data: { email: 'rob@redwoodjs.com', + // default hashedPassword is from `node:crypto` hashedPassword: - '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba', - salt: '2ef27f4073c603ba8b7807c6de6d6a89', + '230847bea5154b6c7d281d09593ad1be26fa03a93c04a73bcc2b608c073a8213|16384|8|1', + salt: 'ba8b7807c6de6d6a892ef27f4073c603', ...attributes, }, }) @@ -119,7 +119,16 @@ const expectLoggedInResponse = (response) => { } const encryptToCookie = (data) => { - return `session=${CryptoJS.AES.encrypt(data, process.env.SESSION_SECRET)}` + const iv = crypto.randomBytes(16) + const cipher = crypto.createCipheriv( + 'aes-256-cbc', + SESSION_SECRET.substring(0, 32), + iv + ) + let encryptedSession = cipher.update(data, 'utf-8', 'base64') + encryptedSession += cipher.final('base64') + + return `session=${encryptedSession}|${iv.toString('base64')}` } let event, context, options @@ -129,7 +138,7 @@ describe('dbAuth', () => { // hide deprecation warnings during test jest.spyOn(console, 'warn').mockImplementation(() => {}) // encryption key so results are consistent regardless of settings in .env - process.env.SESSION_SECRET = 'nREjs1HPS7cFia6tQHK70EWGtfhOgbqJQKsHQz3S' + process.env.SESSION_SECRET = SESSION_SECRET delete process.env.DBAUTH_COOKIE_DOMAIN event = { @@ -581,7 +590,7 @@ describe('dbAuth', () => { event = { headers: { cookie: - 'session=U2FsdGVkX1/zRHVlEQhffsOufy7VLRAR6R4gb818vxblQQJFZI6W/T8uzxNUbQMx', + 'session=ko6iXKV11DSjb6kFJ4iwcf1FEqa5wPpbL1sdtKiV51Y=|cQaYkOPG/r3ILxWiFiz90w==', }, } const dbAuth = new DbAuthHandler(event, context, options) @@ -614,7 +623,7 @@ describe('dbAuth', () => { event.body = JSON.stringify({ method: 'logout' }) event.httpMethod = 'GET' event.headers.cookie = - 'session=U2FsdGVkX1/zRHVlEQhffsOufy7VLRAR6R4gb818vxblQQJFZI6W/T8uzxNUbQMx' + 'session=ko6iXKV11DSjb6kFJ4iwcf1FEqa5wPpbL1sdtKiV51Y=|cQaYkOPG/r3ILxWiFiz90w==' const dbAuth = new DbAuthHandler(event, context, options) const response = await dbAuth.invoke() @@ -625,7 +634,7 @@ describe('dbAuth', () => { event.body = JSON.stringify({ method: 'foobar' }) event.httpMethod = 'POST' event.headers.cookie = - 'session=U2FsdGVkX1/zRHVlEQhffsOufy7VLRAR6R4gb818vxblQQJFZI6W/T8uzxNUbQMx' + 'session=ko6iXKV11DSjb6kFJ4iwcf1FEqa5wPpbL1sdtKiV51Y=|cQaYkOPG/r3ILxWiFiz90w==' const dbAuth = new DbAuthHandler(event, context, options) const response = await dbAuth.invoke() @@ -636,7 +645,7 @@ describe('dbAuth', () => { event.body = JSON.stringify({ method: 'logout' }) event.httpMethod = 'POST' event.headers.cookie = - 'session=U2FsdGVkX1/zRHVlEQhffsOufy7VLRAR6R4gb818vxblQQJFZI6W/T8uzxNUbQMx' + 'session=ko6iXKV11DSjb6kFJ4iwcf1FEqa5wPpbL1sdtKiV51Y=|cQaYkOPG/r3ILxWiFiz90w==' const dbAuth = new DbAuthHandler(event, context, options) dbAuth.logout = jest.fn(() => { throw Error('Logout error') @@ -674,7 +683,7 @@ describe('dbAuth', () => { event.body = JSON.stringify({ method: 'logout' }) event.httpMethod = 'POST' event.headers.cookie = - 'session=U2FsdGVkX1/zRHVlEQhffsOufy7VLRAR6R4gb818vxblQQJFZI6W/T8uzxNUbQMx' + 'session=ko6iXKV11DSjb6kFJ4iwcf1FEqa5wPpbL1sdtKiV51Y=|cQaYkOPG/r3ILxWiFiz90w==' const dbAuth = new DbAuthHandler(event, context, options) dbAuth.logout = jest.fn(() => ['body', { foo: 'bar' }]) const response = await dbAuth.invoke() @@ -1595,6 +1604,27 @@ describe('dbAuth', () => { expect(response[0]).toEqual('{"error":"User not found"}') }) + + it('re-encrypts the session cookie if using the legacy algorithm', async () => { + await createDbUser({ id: 7 }) + event = { + headers: { + // legacy session with { id: 7 } for userID + cookie: 'session=U2FsdGVkX1+s7seQJnVgGgInxuXm13l8VvzA3Mg2fYg=', + }, + } + process.env.SESSION_SECRET = + 'QKxN2vFSHAf94XYynK8LUALfDuDSdFowG6evfkFX8uszh4YZqhTiqEdshrhWbwbw' + + const dbAuth = new DbAuthHandler(event, context, options) + const [userId, headers] = await dbAuth.getToken() + + expect(userId).toEqual(7) + expect(headers['set-cookie']).toMatch(SET_SESSION_REGEX) + + // set session back to default + process.env.SESSION_SECRET = SESSION_SECRET + }) }) describe('When a developer has set GraphiQL headers to mock a session cookie', () => { @@ -2168,11 +2198,11 @@ describe('dbAuth', () => { `Expires=${dbAuth.sessionExpiresDate}` ) // can't really match on the session value since it will change on every render, - // due to CSRF token generation but we can check that it contains a only the - // characters that would be returned by the hash function + // due to CSRF token generation but we can check that it contains only the + // characters that would be returned by the encrypt function expect(headers['set-cookie']).toMatch(SET_SESSION_REGEX) // and we can check that it's a certain number of characters - expect(headers['set-cookie'].split(';')[0].length).toEqual(72) + expect(headers['set-cookie'].split(';')[0].length).toEqual(77) }) }) @@ -2335,6 +2365,38 @@ describe('dbAuth', () => { expect(user.id).toEqual(dbUser.id) }) + + it('returns the user if password is hashed with legacy algorithm', async () => { + const dbUser = await createDbUser({ + // CryptoJS hashed password + hashedPassword: + '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba', + salt: '2ef27f4073c603ba8b7807c6de6d6a89', + }) + const dbAuth = new DbAuthHandler(event, context, options) + const user = await dbAuth._verifyUser(dbUser.email, 'password') + + expect(user.id).toEqual(dbUser.id) + }) + + it('updates the user hashPassword to the new algorithm', async () => { + const dbUser = await createDbUser({ + // CryptoJS hashed password + hashedPassword: + '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba', + salt: '2ef27f4073c603ba8b7807c6de6d6a89', + }) + const dbAuth = new DbAuthHandler(event, context, options) + await dbAuth._verifyUser(dbUser.email, 'password') + const user = await db.user.findFirst({ where: { id: dbUser.id } }) + + // password now hashed by node:crypto + expect(user.hashedPassword).toEqual( + 'f20d69d478fa1afc85057384e21bd457a76b23b23e2a94f5bd982976f700a552|16384|8|1' + ) + // salt should remain the same + expect(user.salt).toEqual('2ef27f4073c603ba8b7807c6de6d6a89') + }) }) describe('_getCurrentUser()', () => { diff --git a/packages/auth-providers/dbAuth/api/src/__tests__/shared.test.ts b/packages/auth-providers/dbAuth/api/src/__tests__/shared.test.ts index c96c7bc85892..67b1becccc60 100644 --- a/packages/auth-providers/dbAuth/api/src/__tests__/shared.test.ts +++ b/packages/auth-providers/dbAuth/api/src/__tests__/shared.test.ts @@ -1,7 +1,7 @@ +import crypto from 'node:crypto' import path from 'node:path' import type { APIGatewayProxyEvent } from 'aws-lambda' -import CryptoJS from 'crypto-js' import * as error from '../errors' import { @@ -9,19 +9,31 @@ import { getSession, cookieName, hashPassword, + isLegacySession, + legacyHashPassword, decryptSession, dbAuthSession, webAuthnSession, + extractHashingOptions, } from '../shared' const FIXTURE_PATH = path.resolve( __dirname, '../../../../../../__fixtures__/example-todo-main' ) -process.env.SESSION_SECRET = 'nREjs1HPS7cFia6tQHK70EWGtfhOgbqJQKsHQz3S' +const SESSION_SECRET = '540d03ebb00b441f8f7442cbc39958ad' const encrypt = (data) => { - return CryptoJS.AES.encrypt(data, process.env.SESSION_SECRET).toString() + const iv = crypto.randomBytes(16) + const cipher = crypto.createCipheriv( + 'aes-256-cbc', + SESSION_SECRET.substring(0, 32), + iv + ) + let encryptedSession = cipher.update(data, 'utf-8', 'base64') + encryptedSession += cipher.final('base64') + + return `${encryptedSession}|${iv.toString('base64')}` } function dummyEvent(cookie?: string) { @@ -80,7 +92,27 @@ describe('cookieName()', () => { }) }) +describe('isLegacySession()', () => { + it('returns `true` if the session cookie appears to be encrypted with CryptoJS', () => { + expect( + isLegacySession('U2FsdGVkX1+s7seQJnVgGgInxuXm13l8VvzA3Mg2fYg=') + ).toEqual(true) + }) + + it('returns `false` if the session cookie appears to be encrypted with node:crypto', () => { + expect( + isLegacySession( + 'ko6iXKV11DSjb6kFJ4iwcf1FEqa5wPpbL1sdtKiV51Y=|cQaYkOPG/r3ILxWiFiz90w==' + ) + ).toEqual(false) + }) +}) + describe('decryptSession()', () => { + beforeEach(() => { + process.env.SESSION_SECRET = SESSION_SECRET + }) + it('returns an empty array if no session', () => { expect(decryptSession(null)).toEqual([]) }) @@ -103,9 +135,23 @@ describe('decryptSession()', () => { expect(decryptSession(text)).toEqual([first, second]) }) + + it('decrypts a session cookie that was created with the legacy CryptoJS algorithm', () => { + process.env.SESSION_SECRET = + 'QKxN2vFSHAf94XYynK8LUALfDuDSdFowG6evfkFX8uszh4YZqhTiqEdshrhWbwbw' + const [json] = decryptSession( + 'U2FsdGVkX1+s7seQJnVgGgInxuXm13l8VvzA3Mg2fYg=' + ) + + expect(json).toEqual({ id: 7 }) + }) }) describe('dbAuthSession()', () => { + beforeEach(() => { + process.env.SESSION_SECRET = SESSION_SECRET + }) + it('returns null if no cookies', () => { expect(dbAuthSession(dummyEvent(), 'session_%port%')).toEqual(null) }) @@ -136,7 +182,52 @@ describe('webAuthnSession', () => { describe('hashPassword', () => { it('hashes a password with a given salt and returns both', () => { - const [hash, salt] = hashPassword( + const [hash, salt] = hashPassword('password', { + salt: 'ba8b7807c6de6d6a892ef27f4073c603', + }) + + expect(hash).toEqual( + '230847bea5154b6c7d281d09593ad1be26fa03a93c04a73bcc2b608c073a8213|16384|8|1' + ) + expect(salt).toEqual('ba8b7807c6de6d6a892ef27f4073c603') + }) + + it('hashes a password with a generated salt if none provided', () => { + const [hash, salt] = hashPassword('password') + + expect(hash).toMatch(/^[a-f0-9]+|16384|8|1$/) + expect(hash.length).toEqual(74) + expect(salt).toMatch(/^[a-f0-9]+$/) + expect(salt.length).toEqual(64) + }) + + it('normalizes strings so utf-8 variants hash to the same output', () => { + const salt = crypto.randomBytes(32).toString('hex') + const [hash1] = hashPassword('\u0041\u006d\u00e9\u006c\u0069\u0065', { + salt, + }) // AmΓ©lie + const [hash2] = hashPassword('\u0041\u006d\u0065\u0301\u006c\u0069\u0065', { + salt, + }) // AmΓ©lie but separate e and accent codepoints + + expect(hash1).toEqual(hash2) + }) + + it('encodes the scrypt difficulty options into the hash', () => { + const [hash] = hashPassword('password', { + options: { cost: 8192, blockSize: 16, parallelization: 2 }, + }) + const [_hash, cost, blockSize, parallelization] = hash.split('|') + + expect(cost).toEqual('8192') + expect(blockSize).toEqual('16') + expect(parallelization).toEqual('2') + }) +}) + +describe('legacyHashPassword', () => { + it('hashes a password with CryptoJS given a salt and returns both', () => { + const [hash, salt] = legacyHashPassword( 'password', '2ef27f4073c603ba8b7807c6de6d6a89' ) @@ -148,41 +239,62 @@ describe('hashPassword', () => { }) it('hashes a password with a generated salt if none provided', () => { - const [hash, salt] = hashPassword('password') + const [hash, salt] = legacyHashPassword('password') expect(hash).toMatch(/^[a-f0-9]+$/) expect(hash.length).toEqual(64) expect(salt).toMatch(/^[a-f0-9]+$/) - expect(salt.length).toEqual(32) + expect(salt.length).toEqual(64) }) +}) - describe('session cookie extraction', () => { - let event +describe('session cookie extraction', () => { + let event - const encryptToCookie = (data) => { - return `session=${CryptoJS.AES.encrypt(data, process.env.SESSION_SECRET)}` + const encryptToCookie = (data) => { + return `session=${encrypt(data)}` + } + + beforeEach(() => { + event = { + queryStringParameters: {}, + path: '/.redwood/functions/auth', + headers: {}, } + }) - beforeEach(() => { - event = { - queryStringParameters: {}, - path: '/.redwood/functions/auth', - headers: {}, - } - }) + it('extracts from the event', () => { + const cookie = encryptToCookie( + JSON.stringify({ id: 9999999999 }) + ';' + 'token' + ) - it('extracts from the event', () => { - const cookie = encryptToCookie( - JSON.stringify({ id: 9999999999 }) + ';' + 'token' - ) + event = { + headers: { + cookie, + }, + } - event = { - headers: { - cookie, - }, - } + expect(extractCookie(event)).toEqual(cookie) + }) - expect(extractCookie(event)).toEqual(cookie) + it('extract cookie handles non-JSON event body', () => { + event.body = '' + + expect(extractCookie(event)).toBeUndefined() + }) + + describe('when in development', () => { + const curNodeEnv = process.env.NODE_ENV + + beforeAll(() => { + // Session cookie from graphiQLHeaders only extracted in dev + process.env.NODE_ENV = 'development' + }) + + afterAll(() => { + process.env.NODE_ENV = curNodeEnv + event = {} + expect(process.env.NODE_ENV).toBe('test') }) it('extract cookie handles non-JSON event body', () => { @@ -191,69 +303,81 @@ describe('hashPassword', () => { expect(extractCookie(event)).toBeUndefined() }) - describe('when in development', () => { - const curNodeEnv = process.env.NODE_ENV + it('extracts GraphiQL cookie from the header extensions', () => { + const dbUserId = 42 - beforeAll(() => { - // Session cookie from graphiQLHeaders only extracted in dev - process.env.NODE_ENV = 'development' + const cookie = encryptToCookie(JSON.stringify({ id: dbUserId })) + event.body = JSON.stringify({ + extensions: { + headers: { + 'auth-provider': 'dbAuth', + cookie, + authorization: 'Bearer ' + dbUserId, + }, + }, }) - afterAll(() => { - process.env.NODE_ENV = curNodeEnv - event = {} - expect(process.env.NODE_ENV).toBe('test') - }) + expect(extractCookie(event)).toEqual(cookie) + }) - it('extract cookie handles non-JSON event body', () => { - event.body = '' + it('overwrites cookie with event header GraphiQL when in dev', () => { + const sessionCookie = encryptToCookie( + JSON.stringify({ id: 9999999999 }) + ';' + 'token' + ) - expect(extractCookie(event)).toBeUndefined() - }) + event = { + headers: { + cookie: sessionCookie, + }, + } - it('extracts GraphiQL cookie from the header extensions', () => { - const dbUserId = 42 - - const cookie = encryptToCookie(JSON.stringify({ id: dbUserId })) - event.body = JSON.stringify({ - extensions: { - headers: { - 'auth-provider': 'dbAuth', - cookie, - authorization: 'Bearer ' + dbUserId, - }, - }, - }) + const dbUserId = 42 - expect(extractCookie(event)).toEqual(cookie) + const cookie = encryptToCookie(JSON.stringify({ id: dbUserId })) + event.body = JSON.stringify({ + extensions: { + headers: { + 'auth-provider': 'dbAuth', + cookie, + authorization: 'Bearer ' + dbUserId, + }, + }, }) - it('overwrites cookie with event header GraphiQL when in dev', () => { - const sessionCookie = encryptToCookie( - JSON.stringify({ id: 9999999999 }) + ';' + 'token' - ) + expect(extractCookie(event)).toEqual(cookie) + }) + }) +}) - event = { - headers: { - cookie: sessionCookie, - }, - } - - const dbUserId = 42 - - const cookie = encryptToCookie(JSON.stringify({ id: dbUserId })) - event.body = JSON.stringify({ - extensions: { - headers: { - 'auth-provider': 'dbAuth', - cookie, - authorization: 'Bearer ' + dbUserId, - }, - }, - }) +describe('extractHashingOptions()', () => { + it('returns an empty object if no options', () => { + expect(extractHashingOptions('')).toEqual({}) + expect( + extractHashingOptions( + '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba' + ) + ).toEqual({}) + expect( + extractHashingOptions( + '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba|1' + ) + ).toEqual({}) + expect( + extractHashingOptions( + '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba|1|2' + ) + ).toEqual({}) + }) - expect(extractCookie(event)).toEqual(cookie) - }) + it('returns an object with scrypt options', () => { + expect( + extractHashingOptions( + '0c2b24e20ee76a887eac1415cc2c175ff961e7a0f057cead74789c43399dd5ba|16384|8|1' + ) + ).toEqual({ + cost: 16384, + blockSize: 8, + parallelization: 1, }) }) }) diff --git a/packages/auth-providers/dbAuth/api/src/shared.ts b/packages/auth-providers/dbAuth/api/src/shared.ts index 7883bc10d5e5..d1e001ff8ab4 100644 --- a/packages/auth-providers/dbAuth/api/src/shared.ts +++ b/packages/auth-providers/dbAuth/api/src/shared.ts @@ -1,15 +1,45 @@ +import crypto from 'node:crypto' + import type { APIGatewayProxyEvent } from 'aws-lambda' -import CryptoJS from 'crypto-js' -import { getConfig } from '@redwoodjs/project-config' +import { getConfig, getConfigPath } from '@redwoodjs/project-config' import * as DbAuthError from './errors' +type ScryptOptions = { + cost?: number + blockSize?: number + parallelization?: number + N?: number + r?: number + p?: number + maxmem?: number +} + +const DEFAULT_SCRYPT_OPTIONS: ScryptOptions = { + cost: 2 ** 14, + blockSize: 8, + parallelization: 1, +} + // Extracts the cookie from an event, handling lower and upper case header names. const eventHeadersCookie = (event: APIGatewayProxyEvent) => { return event.headers.cookie || event.headers.Cookie } +const getPort = () => { + let configPath + + try { + configPath = getConfigPath() + } catch { + // If this throws, we're in a serverless environment, and the `redwood.toml` file doesn't exist. + return 8911 + } + + return getConfig(configPath).api.port +} + // When in development environment, check for cookie in the request extension headers // if user has generated graphiql headers const eventGraphiQLHeadersCookie = (event: APIGatewayProxyEvent) => { @@ -29,6 +59,28 @@ const eventGraphiQLHeadersCookie = (event: APIGatewayProxyEvent) => { return } +// decrypts session text using old CryptoJS algorithm (using node:crypto library) +const legacyDecryptSession = (encryptedText: string) => { + const cypher = Buffer.from(encryptedText, 'base64') + const salt = cypher.slice(8, 16) + const password = Buffer.concat([ + Buffer.from(process.env.SESSION_SECRET as string, 'binary'), + salt, + ]) + const md5Hashes = [] + let digest = password + for (let i = 0; i < 3; i++) { + md5Hashes[i] = crypto.createHash('md5').update(digest).digest() + digest = Buffer.concat([md5Hashes[i], password]) + } + const key = Buffer.concat([md5Hashes[0], md5Hashes[1]]) + const iv = md5Hashes[2] + const contents = cypher.slice(16) + const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv) + + return decipher.update(contents) + decipher.final('utf-8') +} + // Extracts the session cookie from an event, handling both // development environment GraphiQL headers and production environment headers. export const extractCookie = (event: APIGatewayProxyEvent) => { @@ -39,17 +91,43 @@ function extractEncryptedSessionFromHeader(event: APIGatewayProxyEvent) { return event.headers.authorization?.split(' ')[1] } +// whether this encrypted session was made with the old CryptoJS algorithm +export const isLegacySession = (text: string | undefined) => { + if (!text) { + return false + } + + const [_encryptedText, iv] = text.split('|') + return !iv +} + // decrypts the session cookie and returns an array: [data, csrf] export const decryptSession = (text: string | null) => { if (!text || text.trim() === '') { return [] } + let decoded + // if cookie contains a pipe then it was encrypted using the `node:crypto` + // algorithm (first element is the ecrypted data, second is the initialization vector) + // otherwise fall back to using the older CryptoJS algorithm + const [encryptedText, iv] = text.split('|') + try { - const decoded = CryptoJS.AES.decrypt( - text, - process.env.SESSION_SECRET as string - ).toString(CryptoJS.enc.Utf8) + if (iv) { + // decrypt using the `node:crypto` algorithm + const decipher = crypto.createDecipheriv( + 'aes-256-cbc', + (process.env.SESSION_SECRET as string).substring(0, 32), + Buffer.from(iv, 'base64') + ) + decoded = + decipher.update(encryptedText, 'base64', 'utf-8') + + decipher.final('utf-8') + } else { + decoded = legacyDecryptSession(text) + } + const [data, csrf] = decoded.split(';') const json = JSON.parse(data) @@ -59,6 +137,19 @@ export const decryptSession = (text: string | null) => { } } +export const encryptSession = (dataString: string) => { + const iv = crypto.randomBytes(16) + const cipher = crypto.createCipheriv( + 'aes-256-cbc', + (process.env.SESSION_SECRET as string).substring(0, 32), + iv + ) + let encryptedData = cipher.update(dataString, 'utf-8', 'base64') + encryptedData += cipher.final('base64') + + return `${encryptedData}|${iv.toString('base64')}` +} + // returns the actual value of the session cookie export const getSession = ( text: string | undefined, @@ -77,7 +168,7 @@ export const getSession = ( return null } - return sessionCookie.split('=')[1].trim() + return sessionCookie.replace(`${cookieName(cookieNameOption)}=`, '').trim() } // Convenience function to get session, decrypt, and return session data all @@ -123,23 +214,58 @@ export const webAuthnSession = (event: APIGatewayProxyEvent) => { } export const hashToken = (token: string) => { - return CryptoJS.SHA256(token).toString(CryptoJS.enc.Hex) + return crypto.createHash('sha256').update(token).digest('hex') } // hashes a password using either the given `salt` argument, or creates a new // salt and hashes using that. Either way, returns an array with [hash, salt] -export const hashPassword = (text: string, salt?: string) => { - const useSalt = salt || CryptoJS.lib.WordArray.random(128 / 8).toString() +// normalizes the string in case it contains unicode characters: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize +// TODO: Add validation that the options are valid values for the scrypt algorithm +export const hashPassword = ( + text: string, + { + salt = crypto.randomBytes(32).toString('hex'), + options = DEFAULT_SCRYPT_OPTIONS, + }: { salt?: string; options?: ScryptOptions } = {} +) => { + const encryptedString = crypto + .scryptSync(text.normalize('NFC'), salt, 32, options) + .toString('hex') + const optionsToString = [ + options.cost, + options.blockSize, + options.parallelization, + ] + return [`${encryptedString}|${optionsToString.join('|')}`, salt] +} +// uses the old algorithm from CryptoJS: +// CryptoJS.PBKDF2(password, salt, { keySize: 8 }).toString() +export const legacyHashPassword = (text: string, salt?: string) => { + const useSalt = salt || crypto.randomBytes(32).toString('hex') return [ - CryptoJS.PBKDF2(text, useSalt, { keySize: 256 / 32 }).toString(), + crypto.pbkdf2Sync(text, useSalt, 1, 32, 'SHA1').toString('hex'), useSalt, ] } export const cookieName = (name: string | undefined) => { - const port = getConfig().api?.port || 8911 + const port = getPort() const cookieName = name?.replace('%port%', '' + port) ?? 'session' return cookieName } + +export const extractHashingOptions = (text: string): ScryptOptions => { + const [_hash, ...options] = text.split('|') + + if (options.length === 3) { + return { + cost: parseInt(options[0]), + blockSize: parseInt(options[1]), + parallelization: parseInt(options[2]), + } + } else { + return {} + } +} diff --git a/packages/auth-providers/dbAuth/api/tsconfig.json b/packages/auth-providers/dbAuth/api/tsconfig.json index 90b645a97314..de5a32a0ae66 100644 --- a/packages/auth-providers/dbAuth/api/tsconfig.json +++ b/packages/auth-providers/dbAuth/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/dbAuth/setup/package.json b/packages/auth-providers/dbAuth/setup/package.json index 980069bb5957..e6f6a4ea04df 100644 --- a/packages/auth-providers/dbAuth/setup/package.json +++ b/packages/auth-providers/dbAuth/setup/package.json @@ -24,17 +24,15 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "@simplewebauthn/browser": "7.2.0", - "core-js": "3.32.2", + "@simplewebauthn/browser": "7.4.0", + "core-js": "3.33.2", "prompts": "2.4.2", - "secure-random-password": "0.2.3", "terminal-link": "2.1.1" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@simplewebauthn/typescript-types": "7.0.0", - "@types/secure-random-password": "0.2.1", "@types/yargs": "17.0.24", "jest": "29.7.0", "typescript": "5.2.2" diff --git a/packages/auth-providers/dbAuth/setup/src/setupData.ts b/packages/auth-providers/dbAuth/setup/src/setupData.ts index 284ee1548927..82bdf2d88dab 100644 --- a/packages/auth-providers/dbAuth/setup/src/setupData.ts +++ b/packages/auth-providers/dbAuth/setup/src/setupData.ts @@ -1,7 +1,6 @@ +import crypto from 'node:crypto' import path from 'path' -import password from 'secure-random-password' - import { getPaths, colors, addEnvVarTask } from '@redwoodjs/cli-helpers' export const libPath = getPaths().api.lib.replace(getPaths().base, '') @@ -10,10 +9,7 @@ export const functionsPath = getPaths().api.functions.replace( '' ) -const secret = password.randomPassword({ - length: 64, - characters: [password.lower, password.upper, password.digits], -}) +const secret = crypto.randomBytes(32).toString('base64') export const extraTask = addEnvVarTask( 'SESSION_SECRET', diff --git a/packages/auth-providers/dbAuth/setup/tsconfig.json b/packages/auth-providers/dbAuth/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/dbAuth/setup/tsconfig.json +++ b/packages/auth-providers/dbAuth/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/dbAuth/web/package.json b/packages/auth-providers/dbAuth/web/package.json index a0a30c413800..10ccd63b5500 100644 --- a/packages/auth-providers/dbAuth/web/package.json +++ b/packages/auth-providers/dbAuth/web/package.json @@ -25,8 +25,8 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "@simplewebauthn/browser": "7.2.0", - "core-js": "3.32.2" + "@simplewebauthn/browser": "7.4.0", + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/dbAuth/web/tsconfig.json b/packages/auth-providers/dbAuth/web/tsconfig.json index 62646e80bdee..3221c1501034 100644 --- a/packages/auth-providers/dbAuth/web/tsconfig.json +++ b/packages/auth-providers/dbAuth/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src", "ambient.d.ts"], diff --git a/packages/auth-providers/firebase/api/package.json b/packages/auth-providers/firebase/api/package.json index d2183a08e733..c0613a55e76b 100644 --- a/packages/auth-providers/firebase/api/package.json +++ b/packages/auth-providers/firebase/api/package.json @@ -23,8 +23,8 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", - "firebase-admin": "11.10.1" + "core-js": "3.33.2", + "firebase-admin": "11.11.0" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/firebase/api/tsconfig.json b/packages/auth-providers/firebase/api/tsconfig.json index bb9ec4a21fd1..992f3e8dfddf 100644 --- a/packages/auth-providers/firebase/api/tsconfig.json +++ b/packages/auth-providers/firebase/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/firebase/setup/package.json b/packages/auth-providers/firebase/setup/package.json index 6bb7b56b3f38..e4556109cde2 100644 --- a/packages/auth-providers/firebase/setup/package.json +++ b/packages/auth-providers/firebase/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/firebase/setup/tsconfig.json b/packages/auth-providers/firebase/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/firebase/setup/tsconfig.json +++ b/packages/auth-providers/firebase/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/firebase/web/package.json b/packages/auth-providers/firebase/web/package.json index 69f0f00257e2..18416232461c 100644 --- a/packages/auth-providers/firebase/web/package.json +++ b/packages/auth-providers/firebase/web/package.json @@ -24,19 +24,19 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@types/react": "18.2.14", - "firebase": "10.4.0", + "firebase": "10.6.0", "jest": "29.7.0", "react": "0.0.0-experimental-e5205658f-20230913", "typescript": "5.2.2" }, "peerDependencies": { - "firebase": "10.4.0" + "firebase": "10.6.0" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" } diff --git a/packages/auth-providers/firebase/web/tsconfig.json b/packages/auth-providers/firebase/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/firebase/web/tsconfig.json +++ b/packages/auth-providers/firebase/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/netlify/api/package.json b/packages/auth-providers/netlify/api/package.json index c5e062cf4e42..7ce855e65fcd 100644 --- a/packages/auth-providers/netlify/api/package.json +++ b/packages/auth-providers/netlify/api/package.json @@ -23,15 +23,15 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", - "jsonwebtoken": "9.0.0" + "core-js": "3.33.2", + "jsonwebtoken": "9.0.2" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@redwoodjs/api": "6.0.7", "@types/aws-lambda": "8.10.119", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/auth-providers/netlify/api/tsconfig.json b/packages/auth-providers/netlify/api/tsconfig.json index bb9ec4a21fd1..992f3e8dfddf 100644 --- a/packages/auth-providers/netlify/api/tsconfig.json +++ b/packages/auth-providers/netlify/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/netlify/setup/package.json b/packages/auth-providers/netlify/setup/package.json index 18637cfae482..901fd1ae6592 100644 --- a/packages/auth-providers/netlify/setup/package.json +++ b/packages/auth-providers/netlify/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/netlify/setup/tsconfig.json b/packages/auth-providers/netlify/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/netlify/setup/tsconfig.json +++ b/packages/auth-providers/netlify/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/netlify/web/package.json b/packages/auth-providers/netlify/web/package.json index 9e75eb93c319..94ae0aef0b65 100644 --- a/packages/auth-providers/netlify/web/package.json +++ b/packages/auth-providers/netlify/web/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/netlify/web/tsconfig.json b/packages/auth-providers/netlify/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/netlify/web/tsconfig.json +++ b/packages/auth-providers/netlify/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/supabase/api/package.json b/packages/auth-providers/supabase/api/package.json index ba7dd5226698..8141dda34ea4 100644 --- a/packages/auth-providers/supabase/api/package.json +++ b/packages/auth-providers/supabase/api/package.json @@ -23,15 +23,15 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", - "jsonwebtoken": "9.0.0" + "core-js": "3.33.2", + "jsonwebtoken": "9.0.2" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@redwoodjs/api": "6.0.7", "@types/aws-lambda": "8.10.119", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/auth-providers/supabase/api/tsconfig.json b/packages/auth-providers/supabase/api/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/supabase/api/tsconfig.json +++ b/packages/auth-providers/supabase/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/supabase/setup/package.json b/packages/auth-providers/supabase/setup/package.json index 63ea03ae182b..31cc5fc454dc 100644 --- a/packages/auth-providers/supabase/setup/package.json +++ b/packages/auth-providers/supabase/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/supabase/setup/tsconfig.json b/packages/auth-providers/supabase/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/supabase/setup/tsconfig.json +++ b/packages/auth-providers/supabase/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/supabase/web/package.json b/packages/auth-providers/supabase/web/package.json index 3fce1a0bc8e5..7400efddfec0 100644 --- a/packages/auth-providers/supabase/web/package.json +++ b/packages/auth-providers/supabase/web/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/supabase/web/tsconfig.json b/packages/auth-providers/supabase/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/supabase/web/tsconfig.json +++ b/packages/auth-providers/supabase/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/supertokens/api/package.json b/packages/auth-providers/supertokens/api/package.json index d553f4c4ac64..7a0acf0b53f7 100644 --- a/packages/auth-providers/supertokens/api/package.json +++ b/packages/auth-providers/supertokens/api/package.json @@ -23,15 +23,15 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", - "jsonwebtoken": "9.0.0", + "core-js": "3.33.2", + "jsonwebtoken": "9.0.2", "jwks-rsa": "3.0.1" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@redwoodjs/api": "6.0.7", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/auth-providers/supertokens/api/tsconfig.json b/packages/auth-providers/supertokens/api/tsconfig.json index bb9ec4a21fd1..992f3e8dfddf 100644 --- a/packages/auth-providers/supertokens/api/tsconfig.json +++ b/packages/auth-providers/supertokens/api/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/supertokens/setup/package.json b/packages/auth-providers/supertokens/setup/package.json index b15d23b20e4b..01f876b71fa2 100644 --- a/packages/auth-providers/supertokens/setup/package.json +++ b/packages/auth-providers/supertokens/setup/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/cli-helpers": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/supertokens/setup/tsconfig.json b/packages/auth-providers/supertokens/setup/tsconfig.json index abb54b70112a..5be9707b2f05 100644 --- a/packages/auth-providers/supertokens/setup/tsconfig.json +++ b/packages/auth-providers/supertokens/setup/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth-providers/supertokens/web/package.json b/packages/auth-providers/supertokens/web/package.json index f441c1c347bf..62b0af22270b 100644 --- a/packages/auth-providers/supertokens/web/package.json +++ b/packages/auth-providers/supertokens/web/package.json @@ -24,7 +24,7 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", diff --git a/packages/auth-providers/supertokens/web/tsconfig.json b/packages/auth-providers/supertokens/web/tsconfig.json index a925964c5e44..bf6fbe8951bd 100644 --- a/packages/auth-providers/supertokens/web/tsconfig.json +++ b/packages/auth-providers/supertokens/web/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/auth/package.json b/packages/auth/package.json index 1b326a17c8c3..952cd267ca60 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", + "core-js": "3.33.2", "react": "0.0.0-experimental-e5205658f-20230913" }, "devDependencies": { @@ -32,7 +32,7 @@ "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "14.0.0", "jest": "29.7.0", - "msw": "1.3.1", + "msw": "1.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json index ba62a1160360..2ee6274e91d4 100644 --- a/packages/auth/tsconfig.json +++ b/packages/auth/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src", "ambient.d.ts"] diff --git a/packages/babel-config/package.json b/packages/babel-config/package.json index 206d725adf8c..6adbaa08101a 100644 --- a/packages/babel-config/package.json +++ b/packages/babel-config/package.json @@ -38,8 +38,8 @@ "babel-plugin-auto-import": "1.1.0", "babel-plugin-graphql-tag": "3.3.0", "babel-plugin-module-resolver": "5.0.0", - "core-js": "3.32.2", - "fast-glob": "3.3.1", + "core-js": "3.33.2", + "fast-glob": "3.3.2", "graphql": "16.8.1", "typescript": "5.2.2" }, @@ -47,7 +47,7 @@ "@types/babel-plugin-tester": "9.0.7", "@types/babel__core": "7.20.2", "babel-plugin-tester": "11.0.4", - "esbuild": "0.19.3", + "esbuild": "0.19.5", "jest": "29.7.0" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/babel-config/src/__tests__/api.test.ts b/packages/babel-config/src/__tests__/api.test.ts index 5305f2411eac..3a658cd420bf 100644 --- a/packages/babel-config/src/__tests__/api.test.ts +++ b/packages/babel-config/src/__tests__/api.test.ts @@ -57,7 +57,7 @@ describe('api', () => { { "corejs": { "proposals": true, - "version": "3.32", + "version": "3.33", }, "exclude": [ "@babel/plugin-transform-class-properties", diff --git a/packages/babel-config/tsconfig.json b/packages/babel-config/tsconfig.json index 8365ab8e0cee..91b48264c7cf 100644 --- a/packages/babel-config/tsconfig.json +++ b/packages/babel-config/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/cli-helpers/package.json b/packages/cli-helpers/package.json index bf0185c704c9..9599bab15e91 100644 --- a/packages/cli-helpers/package.json +++ b/packages/cli-helpers/package.json @@ -29,7 +29,7 @@ "@redwoodjs/project-config": "6.0.7", "@redwoodjs/telemetry": "6.0.7", "chalk": "4.1.2", - "core-js": "3.32.2", + "core-js": "3.33.2", "dotenv": "16.3.1", "execa": "5.1.1", "listr2": "6.6.1", diff --git a/packages/cli-helpers/tsconfig.json b/packages/cli-helpers/tsconfig.json index e26199e0de52..5e7f7fd919f2 100644 --- a/packages/cli-helpers/tsconfig.json +++ b/packages/cli-helpers/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/cli-packages/dataMigrate/package.json b/packages/cli-packages/dataMigrate/package.json index f255dfe63012..4ee4d299a8b9 100644 --- a/packages/cli-packages/dataMigrate/package.json +++ b/packages/cli-packages/dataMigrate/package.json @@ -35,11 +35,11 @@ "yargs": "17.7.2" }, "devDependencies": { - "@prisma/client": "5.4.2", + "@prisma/client": "5.6.0", "@types/fs-extra": "11.0.1", "@types/yargs": "17.0.24", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "jest": "29.7.0", "memfs": "4.2.1", "typescript": "5.2.2" diff --git a/packages/cli-packages/dataMigrate/tsconfig.json b/packages/cli-packages/dataMigrate/tsconfig.json index 24d99065db57..96510ef2be8c 100644 --- a/packages/cli-packages/dataMigrate/tsconfig.json +++ b/packages/cli-packages/dataMigrate/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/cli-packages/storybook/package.json b/packages/cli-packages/storybook/package.json index 7d7eeb83e63e..68979411f55e 100644 --- a/packages/cli-packages/storybook/package.json +++ b/packages/cli-packages/storybook/package.json @@ -27,20 +27,20 @@ "@redwoodjs/cli-helpers": "6.0.7", "@redwoodjs/project-config": "6.0.7", "@redwoodjs/telemetry": "6.0.7", - "@storybook/addon-a11y": "7.4.6", - "@storybook/addon-docs": "7.4.6", - "@storybook/addon-essentials": "7.4.6", - "@storybook/react-webpack5": "7.4.6", + "@storybook/addon-a11y": "7.5.3", + "@storybook/addon-docs": "7.5.3", + "@storybook/addon-essentials": "7.5.3", + "@storybook/react-webpack5": "7.5.3", "chalk": "4.1.2", "execa": "5.1.1", - "storybook": "7.4.6", + "storybook": "7.5.3", "terminal-link": "2.1.1", "yargs": "17.7.2" }, "devDependencies": { "@types/yargs": "17.0.24", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/cli-packages/storybook/tsconfig.json b/packages/cli-packages/storybook/tsconfig.json index 066b0156e2db..9625d97d662f 100644 --- a/packages/cli-packages/storybook/tsconfig.json +++ b/packages/cli-packages/storybook/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/cli/package.json b/packages/cli/package.json index c7f515923536..15f0e9d55d5c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -36,7 +36,7 @@ "@opentelemetry/resources": "1.15.2", "@opentelemetry/sdk-trace-node": "1.15.2", "@opentelemetry/semantic-conventions": "1.15.2", - "@prisma/internals": "5.4.2", + "@prisma/internals": "5.6.0", "@redwoodjs/api-server": "6.0.7", "@redwoodjs/cli-helpers": "6.0.7", "@redwoodjs/fastify": "6.0.7", @@ -45,22 +45,20 @@ "@redwoodjs/project-config": "6.0.7", "@redwoodjs/structure": "6.0.7", "@redwoodjs/telemetry": "6.0.7", - "@types/secure-random-password": "0.2.1", "boxen": "5.1.2", "camelcase": "6.3.0", "chalk": "4.1.2", "ci-info": "3.8.0", "concurrently": "8.2.2", "configstore": "3.1.5", - "core-js": "3.32.2", + "core-js": "3.33.2", "cross-env": "7.0.3", - "crypto-js": "4.1.1", "decamelize": "5.0.1", "dotenv-defaults": "5.0.2", "enquirer": "2.4.1", "envinfo": "7.9.0", "execa": "5.1.1", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "fs-extra": "11.1.1", "humanize-string": "2.1.0", "latest-version": "5.1.0", @@ -71,13 +69,12 @@ "pluralize": "8.0.0", "portfinder": "1.0.32", "prettier": "2.8.8", - "prisma": "5.4.2", + "prisma": "5.6.0", "prompts": "2.4.2", "rimraf": "5.0.5", - "secure-random-password": "0.2.3", - "semver": "7.5.3", + "semver": "7.5.4", "string-env-interpolation": "1.0.1", - "systeminformation": "5.21.7", + "systeminformation": "5.21.17", "terminal-link": "2.1.1", "title-case": "3.0.3", "uuid": "9.0.0", @@ -86,7 +83,6 @@ "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", - "@types/crypto-js": "4.1.1", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/cli/src/commands/buildHandler.js b/packages/cli/src/commands/buildHandler.js index f6bb7a08029f..dcb17dba2e86 100644 --- a/packages/cli/src/commands/buildHandler.js +++ b/packages/cli/src/commands/buildHandler.js @@ -138,14 +138,17 @@ export const handler = async ({ ) } - console.log('Creating 200.html...') + // Streaming SSR does not use the index.html file. + if (!getConfig().experimental?.streamingSsr?.enabled) { + console.log('Creating 200.html...') - const indexHtmlPath = path.join(getPaths().web.dist, 'index.html') + const indexHtmlPath = path.join(getPaths().web.dist, 'index.html') - fs.copyFileSync( - indexHtmlPath, - path.join(getPaths().web.dist, '200.html') - ) + fs.copyFileSync( + indexHtmlPath, + path.join(getPaths().web.dist, '200.html') + ) + } }, }, ].filter(Boolean) diff --git a/packages/cli/src/commands/experimental/setupDockerHandler.js b/packages/cli/src/commands/experimental/setupDockerHandler.js index 19705489233b..6e4824e8c0c0 100644 --- a/packages/cli/src/commands/experimental/setupDockerHandler.js +++ b/packages/cli/src/commands/experimental/setupDockerHandler.js @@ -185,20 +185,36 @@ export async function handler({ force }) { ].join('\n') } - writeFile(dockerfilePath, dockerfileTemplateContent, { - existingFiles: force ? 'OVERWRITE' : 'SKIP', - }) - writeFile(dockerComposeDevFilePath, dockerComposeDevTemplateContent, { - existingFiles: force ? 'OVERWRITE' : 'SKIP', - }) + writeFile( + dockerfilePath, + dockerfileTemplateContent, + { + existingFiles: force ? 'OVERWRITE' : 'SKIP', + }, + task + ) + writeFile( + dockerComposeDevFilePath, + dockerComposeDevTemplateContent, + { + existingFiles: force ? 'OVERWRITE' : 'SKIP', + }, + task + ) writeFile( dockerComposeProdFilePath, dockerComposeProdTemplateContent, - { existingFiles: force ? 'OVERWRITE' : 'SKIP' } + { existingFiles: force ? 'OVERWRITE' : 'SKIP' }, + task + ) + writeFile( + dockerignoreFilePath, + dockerignoreTemplateContent, + { + existingFiles: force ? 'OVERWRITE' : 'SKIP', + }, + task ) - writeFile(dockerignoreFilePath, dockerignoreTemplateContent, { - existingFiles: force ? 'OVERWRITE' : 'SKIP', - }) }, }, diff --git a/packages/cli/src/commands/experimental/setupStreamingSsrHandler.js b/packages/cli/src/commands/experimental/setupStreamingSsrHandler.js index 007e1bdf7b99..9c431b5a41f7 100644 --- a/packages/cli/src/commands/experimental/setupStreamingSsrHandler.js +++ b/packages/cli/src/commands/experimental/setupStreamingSsrHandler.js @@ -3,6 +3,7 @@ import path from 'path' import { Listr } from 'listr2' +import { addWebPackages } from '@redwoodjs/cli-helpers' import { getConfigPath } from '@redwoodjs/project-config' import { errorTelemetry } from '@redwoodjs/telemetry' @@ -158,6 +159,9 @@ export const handler = async ({ force, verbose }) => { }) }, }, + addWebPackages([ + '@apollo/experimental-nextjs-app-support@0.0.0-commit-b8a73fe', + ]), { task: () => { printTaskEpilogue(command, description, EXPERIMENTAL_TOPIC_ID) diff --git a/packages/cli/src/commands/experimental/templates/streamingSsr/entry.server.tsx.template b/packages/cli/src/commands/experimental/templates/streamingSsr/entry.server.tsx.template index fda9b9b6a01c..a52b268b771d 100644 --- a/packages/cli/src/commands/experimental/templates/streamingSsr/entry.server.tsx.template +++ b/packages/cli/src/commands/experimental/templates/streamingSsr/entry.server.tsx.template @@ -1,20 +1,15 @@ -import { LocationProvider } from '@redwoodjs/router' - import App from './App' import { Document } from './Document' interface Props { - url: string css: string[] meta?: any[] } -export const ServerEntry: React.FC = ({ url, css, meta }) => { +export const ServerEntry: React.FC = ({ css, meta }) => { return ( - - - - - + + + ) } diff --git a/packages/cli/src/commands/generate/secret/__tests__/secret.test.js b/packages/cli/src/commands/generate/secret/__tests__/secret.test.js index be2680dbede0..417f52f9cadd 100644 --- a/packages/cli/src/commands/generate/secret/__tests__/secret.test.js +++ b/packages/cli/src/commands/generate/secret/__tests__/secret.test.js @@ -1,18 +1,27 @@ import yargs from 'yargs' -import { generateSecret, handler, builder } from './../secret.js' +import { + DEFAULT_LENGTH, + generateSecret, + handler, + builder, +} from './../secret.js' describe('generateSecret', () => { - it('contains only uppercase letters, lowercase letters, and digits', () => { + it('contains base64-encoded string', () => { const secret = generateSecret() + const buffer = Buffer.alloc(DEFAULT_LENGTH) + const stringLength = buffer.toString('base64').length - expect(secret).toMatch(/^[A-Za-z0-9]{64}$/) + expect(secret).toMatch(new RegExp(`^[A-Za-z0-9+/=]{${stringLength}}$`)) }) it('can optionally accept a length', () => { const secret = generateSecret(16) + const buffer = Buffer.alloc(16) - expect(secret.length).toEqual(16) + // however long a 16-byte buffer is when base64-encoded (24 characters) + expect(secret.length).toEqual(buffer.toString('base64').length) }) it('prints nothing but the secret when setting the --raw flag', () => { @@ -26,7 +35,7 @@ describe('generateSecret', () => { console.info = (...args) => (output += args.join(' ') + '\n') process.stdout.write = (str) => (output += str) - const { raw, length } = yargs + const { raw } = yargs .command('secret', false, builder, handler) .parse('secret --raw') @@ -35,6 +44,6 @@ describe('generateSecret', () => { process.stdout.write = realWrite expect(raw).toBeTruthy() - expect(output).toMatch(new RegExp(`^[A-Za-z0-9]{${length}}\n$`)) + expect(output).toMatch(new RegExp(`^[A-Za-z0-9+/=]+\n$`)) }) }) diff --git a/packages/cli/src/commands/generate/secret/secret.js b/packages/cli/src/commands/generate/secret/secret.js index d8cf9514e229..a012efe5e227 100644 --- a/packages/cli/src/commands/generate/secret/secret.js +++ b/packages/cli/src/commands/generate/secret/secret.js @@ -1,15 +1,13 @@ -import password from 'secure-random-password' +import crypto from 'node:crypto' + import terminalLink from 'terminal-link' import { recordTelemetryAttributes } from '@redwoodjs/cli-helpers' -const DEFAULT_LENGTH = 64 +export const DEFAULT_LENGTH = 32 export const generateSecret = (length = DEFAULT_LENGTH) => { - return password.randomPassword({ - length, - characters: [password.lower, password.upper, password.digits], - }) + return crypto.randomBytes(length).toString('base64') } export const command = 'secret' diff --git a/packages/cli/src/commands/serveBothHandler.js b/packages/cli/src/commands/serveBothHandler.js index 349c4563f900..79b6921f6bd5 100644 --- a/packages/cli/src/commands/serveBothHandler.js +++ b/packages/cli/src/commands/serveBothHandler.js @@ -60,12 +60,7 @@ export const bothRscServerHandler = async (argv) => { // TODO (RSC) More gracefully handle Ctrl-C const fePromise = execa( 'node', - [ - // TODO (RSC): Do we need these on the worker thread? - '--experimental-loader @redwoodjs/vite/node-loader', - '--experimental-loader @redwoodjs/vite/react-node-loader', - './node_modules/@redwoodjs/vite/dist/runRscFeServer.js', - ], + ['./node_modules/@redwoodjs/vite/dist/runRscFeServer.js'], { cwd: getPaths().base, stdio: 'inherit', diff --git a/packages/cli/src/commands/setup/graphiql/__tests__/graphiqlHandler.test.js b/packages/cli/src/commands/setup/graphiql/__tests__/graphiqlHandler.test.js index 4354c56aadd5..49f8250fa3d7 100644 --- a/packages/cli/src/commands/setup/graphiql/__tests__/graphiqlHandler.test.js +++ b/packages/cli/src/commands/setup/graphiql/__tests__/graphiqlHandler.test.js @@ -53,18 +53,18 @@ describe('Graphiql generator tests', () => { expect(processExitSpy).toHaveBeenCalledWith(1) }) - it('throws an error if auth provider is dbAuth and no user id is provided', () => { + it('throws an error if auth provider is dbAuth and no user id is provided', async () => { try { - graphiqlHelpers.generatePayload('dbAuth') + await graphiqlHelpers.generatePayload('dbAuth') } catch (e) { expect(e.message).toBe('Require an unique id to generate session cookie') } }) - it('throws an error if auth provider is dbAuth and no supabase env is set', () => { - process.env.SESSION_SECRET = null + it('throws an error if auth provider is dbAuth and no supabase env is set', async () => { + delete process.env.SESSION_SECRET try { - graphiqlHelpers.generatePayload('dbAuth', 'user-id-123') + await graphiqlHelpers.generatePayload('dbAuth', 'user-id-123') } catch (e) { expect(e.message).toBe( 'dbAuth requires a SESSION_SECRET environment variable that is used to encrypt session cookies. Use `yarn rw g secret` to create one, then add to your `.env` file. DO NOT check this variable in your version control system!!' @@ -75,7 +75,11 @@ describe('Graphiql generator tests', () => { it('returns a payload if a token is provided', async () => { const provider = 'supabase' const token = 'mock-token' - const response = graphiqlHelpers.generatePayload(provider, null, token) + const response = await graphiqlHelpers.generatePayload( + provider, + null, + token + ) expect(response).toEqual({ 'auth-provider': provider, authorization: `Bearer ${token}`, diff --git a/packages/cli/src/commands/setup/graphiql/graphiqlHandler.js b/packages/cli/src/commands/setup/graphiql/graphiqlHandler.js index 6b1aaeca11a1..c2f0c148f71c 100644 --- a/packages/cli/src/commands/setup/graphiql/graphiqlHandler.js +++ b/packages/cli/src/commands/setup/graphiql/graphiqlHandler.js @@ -68,8 +68,8 @@ export const handler = async ({ provider, id, token, expiry, view }) => { [ { title: 'Generating graphiql header...', - task: () => { - payload = generatePayload(provider, id, token, expiry) + task: async () => { + payload = await generatePayload(provider, id, token, expiry) }, }, { diff --git a/packages/cli/src/commands/setup/graphiql/supportedProviders.js b/packages/cli/src/commands/setup/graphiql/supportedProviders.js index b02c48f42498..fdb50cafa9b5 100644 --- a/packages/cli/src/commands/setup/graphiql/supportedProviders.js +++ b/packages/cli/src/commands/setup/graphiql/supportedProviders.js @@ -1,4 +1,3 @@ -import CryptoJS from 'crypto-js' import { v4 as uuidv4 } from 'uuid' // tests if id, which is always a string from cli, is actually a number or uuid @@ -10,7 +9,7 @@ const getExpiryTime = (expiry) => { return expiry ? Date.now() + expiry * 60 * 1000 : Date.now() + 3600 * 1000 } -const getDBAuthHeader = (userId) => { +const getDBAuthHeader = async (userId) => { if (!userId) { throw new Error('Require an unique id to generate session cookie') } @@ -20,11 +19,11 @@ const getDBAuthHeader = (userId) => { 'dbAuth requires a SESSION_SECRET environment variable that is used to encrypt session cookies. Use `yarn rw g secret` to create one, then add to your `.env` file. DO NOT check this variable in your version control system!!' ) } + + const { encryptSession } = await import('@redwoodjs/auth-dbauth-api') + const id = isNumeric(userId) ? parseInt(userId) : userId - const cookie = CryptoJS.AES.encrypt( - JSON.stringify({ id }) + ';' + uuidv4(), - process.env.SESSION_SECRET - ).toString() + const cookie = encryptSession(JSON.stringify({ id }) + ';' + uuidv4()) return { 'auth-provider': 'dbAuth', diff --git a/packages/cli/src/telemetry/resource.js b/packages/cli/src/telemetry/resource.js index 42060d7eecb7..976264031b75 100644 --- a/packages/cli/src/telemetry/resource.js +++ b/packages/cli/src/telemetry/resource.js @@ -59,6 +59,13 @@ export async function getResources() { const cpu = await system.cpu() const mem = await system.mem() + // Record any specific development environment + let developmentEnvironment = undefined + // Gitpod + if (Object.keys(process.env).some((key) => key.startsWith('GITPOD_'))) { + developmentEnvironment = 'gitpod' + } + // Must only call getConfig() once the project is setup - so not within telemetry for CRWA // Default to 'webpack' for new projects const webBundler = getConfig().web.bundler @@ -104,6 +111,7 @@ export async function getResources() { 'env.node_env': process.env.NODE_ENV || null, 'ci.redwood': !!process.env.REDWOOD_CI, 'ci.isci': ci.isCI, + 'dev.environment': developmentEnvironment, complexity, sides, experiments: JSON.stringify(experiments), diff --git a/packages/codemods/package.json b/packages/codemods/package.json index fe4b5dda072b..9fafa5fa0091 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -35,10 +35,10 @@ "@vscode/ripgrep": "1.15.5", "@whatwg-node/fetch": "0.9.9", "cheerio": "1.0.0-rc.12", - "core-js": "3.32.2", + "core-js": "3.33.2", "deepmerge": "4.3.1", "execa": "5.1.1", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "graphql": "16.8.1", "jest": "29.7.0", "jscodeshift": "0.15.0", diff --git a/packages/core/config/webpack.common.js b/packages/core/config/webpack.common.js index 077779b4369a..6a5073366cc8 100644 --- a/packages/core/config/webpack.common.js +++ b/packages/core/config/webpack.common.js @@ -340,6 +340,11 @@ module.exports = (webpackEnv) => { filename: 'static/media/[name].[contenthash:8][ext]', }, }, + // (8) + !redwoodConfig.experimental.realtime.enabled && { + test: require.resolve('@redwoodjs/web/dist/apollo/sseLink'), + use: require.resolve('null-loader'), + }, ].filter(Boolean), }, ], diff --git a/packages/core/package.json b/packages/core/package.json index 1935c35d4797..db675e24c813 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -39,7 +39,7 @@ "dependencies": { "@babel/cli": "7.23.0", "@babel/runtime-corejs3": "7.23.2", - "@pmmmwh/react-refresh-webpack-plugin": "0.5.10", + "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", "@redwoodjs/cli": "6.0.7", "@redwoodjs/eslint-config": "6.0.7", "@redwoodjs/internal": "6.0.7", @@ -49,7 +49,7 @@ "babel-loader": "^9.1.3", "babel-timing": "0.9.1", "copy-webpack-plugin": "11.0.0", - "core-js": "3.32.2", + "core-js": "3.33.2", "css-loader": "6.8.1", "css-minimizer-webpack-plugin": "5.0.1", "dotenv-webpack": "8.0.1", @@ -65,7 +65,7 @@ "style-loader": "3.3.3", "typescript": "5.2.2", "url-loader": "4.1.1", - "webpack": "5.88.2", + "webpack": "5.89.0", "webpack-bundle-analyzer": "4.9.0", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1", diff --git a/packages/create-redwood-app/package.json b/packages/create-redwood-app/package.json index 8adc4fbbe3a7..bf2655a75dd5 100644 --- a/packages/create-redwood-app/package.json +++ b/packages/create-redwood-app/package.json @@ -32,8 +32,8 @@ "envinfo": "7.9.0", "execa": "5.1.1", "fs-extra": "11.1.1", - "semver": "7.5.3", - "systeminformation": "5.21.7", + "semver": "7.5.4", + "systeminformation": "5.21.17", "terminal-link": "2.1.1", "untildify": "4.0.0", "uuid": "9.0.0", @@ -43,7 +43,7 @@ "@babel/core": "^7.22.20", "@babel/plugin-transform-typescript": "^7.22.15", "@types/babel__core": "7.20.2", - "esbuild": "0.19.3", + "esbuild": "0.19.5", "jest": "29.7.0", "klaw-sync": "6.0.0" }, diff --git a/packages/create-redwood-app/src/telemetry.js b/packages/create-redwood-app/src/telemetry.js index 973f1889e105..2f183e021840 100644 --- a/packages/create-redwood-app/src/telemetry.js +++ b/packages/create-redwood-app/src/telemetry.js @@ -57,6 +57,13 @@ export async function startTelemetry() { const cpu = await system.cpu() const mem = await system.mem() + // Record any specific development environment + let developmentEnvironment = undefined + // Gitpod + if (Object.keys(process.env).some((key) => key.startsWith('GITPOD_'))) { + developmentEnvironment = 'gitpod' + } + const resource = Resource.default().merge( new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: packageName, @@ -73,6 +80,7 @@ export async function startTelemetry() { 'env.node_env': process.env.NODE_ENV || null, 'ci.redwood': !!process.env.REDWOOD_CI, 'ci.isci': ci.isCI, + 'dev.environment': developmentEnvironment, uid: UID, }) ) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 044e633544d0..e45ca1abeff1 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -28,8 +28,8 @@ "@types/eslint": "8", "@types/estree": "1.0.1", "@typescript-eslint/parser": "5.61.0", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "glob": "10.3.1", "typescript": "5.2.2" }, diff --git a/packages/eslint-plugin/tsconfig.json b/packages/eslint-plugin/tsconfig.json index c8decd5a6f94..999e7b69a94c 100644 --- a/packages/eslint-plugin/tsconfig.json +++ b/packages/eslint-plugin/tsconfig.json @@ -4,7 +4,6 @@ "strict": true, "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 043c3df3c08e..d516190c7d9d 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -18,13 +18,13 @@ "prepublishOnly": "NODE_ENV=production yarn build" }, "dependencies": { - "@fastify/http-proxy": "9.2.1", - "@fastify/static": "6.11.2", - "@fastify/url-data": "5.3.1", + "@fastify/http-proxy": "9.3.0", + "@fastify/static": "6.12.0", + "@fastify/url-data": "5.4.0", "@redwoodjs/graphql-server": "6.0.7", "@redwoodjs/project-config": "6.0.7", "ansi-colors": "4.1.3", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "fastify": "4.23.2", "fastify-raw-body": "4.2.2", "lodash": "4.17.21", @@ -34,7 +34,7 @@ "@types/aws-lambda": "8.10.119", "@types/lodash": "4.14.195", "@types/qs": "6.9.7", - "esbuild": "0.19.3", + "esbuild": "0.19.5", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/fastify/tsconfig.json b/packages/fastify/tsconfig.json index a7661df61c9d..79a0db168ed0 100644 --- a/packages/fastify/tsconfig.json +++ b/packages/fastify/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/forms/package.json b/packages/forms/package.json index 8391e8ee8636..63d0c22cb2ce 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -23,17 +23,17 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "core-js": "3.32.2", + "core-js": "3.33.2", "pascalcase": "1.0.0", - "react-hook-form": "7.46.1" + "react-hook-form": "7.48.2" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", - "@testing-library/dom": "9.3.1", + "@testing-library/dom": "9.3.3", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "14.0.0", - "@testing-library/user-event": "14.4.3", + "@testing-library/user-event": "14.5.1", "@types/pascalcase": "1.0.1", "@types/react": "18.2.14", "@types/react-dom": "18.2.6", diff --git a/packages/forms/tsconfig.json b/packages/forms/tsconfig.json index 9680b4aba17e..b5f78cfe089b 100644 --- a/packages/forms/tsconfig.json +++ b/packages/forms/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"] diff --git a/packages/graphql-server/package.json b/packages/graphql-server/package.json index 3ddc6b407e57..0288d8f7d302 100644 --- a/packages/graphql-server/package.json +++ b/packages/graphql-server/package.json @@ -23,20 +23,20 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "@envelop/core": "4.0.0", - "@envelop/depth-limit": "3.0.0", - "@envelop/disable-introspection": "5.0.0", - "@envelop/filter-operation-type": "5.0.0", - "@envelop/on-resolve": "3.0.0", + "@envelop/core": "4.0.3", + "@envelop/depth-limit": "3.0.3", + "@envelop/disable-introspection": "5.0.3", + "@envelop/filter-operation-type": "5.0.3", + "@envelop/on-resolve": "3.0.3", "@escape.tech/graphql-armor": "2.3.1", "@graphql-tools/merge": "9.0.0", "@graphql-tools/schema": "10.0.0", - "@graphql-tools/utils": "10.0.1", + "@graphql-tools/utils": "10.0.8", "@opentelemetry/api": "1.4.1", "@redwoodjs/api": "6.0.7", - "core-js": "3.32.2", + "core-js": "3.33.2", "graphql": "16.8.1", - "graphql-scalars": "1.22.2", + "graphql-scalars": "1.22.4", "graphql-tag": "2.12.6", "graphql-yoga": "4.0.4", "lodash": "4.17.21", @@ -45,17 +45,17 @@ "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", - "@envelop/testing": "6.0.0", - "@envelop/types": "4.0.0", + "@envelop/testing": "6.0.3", + "@envelop/types": "4.0.1", "@redwoodjs/project-config": "6.0.7", "@redwoodjs/realtime": "6.0.7", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "@types/lodash": "4.14.195", "@types/uuid": "9.0.2", "@whatwg-node/fetch": "0.9.9", "aws-lambda": "1.0.7", "jest": "29.7.0", - "jsonwebtoken": "9.0.0", + "jsonwebtoken": "9.0.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/graphql-server/tsconfig.json b/packages/graphql-server/tsconfig.json index 9888eee99e82..f0240cb8f495 100644 --- a/packages/graphql-server/tsconfig.json +++ b/packages/graphql-server/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["ambient.d.ts", "src/**/*"], diff --git a/packages/internal/package.json b/packages/internal/package.json index 171a47371fb5..33eb3dd6f666 100644 --- a/packages/internal/package.json +++ b/packages/internal/package.json @@ -48,10 +48,10 @@ "@redwoodjs/router": "6.0.7", "@sdl-codegen/node": "0.0.10", "chalk": "4.1.2", - "core-js": "3.32.2", + "core-js": "3.33.2", "deepmerge": "4.3.1", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "fs-extra": "11.1.1", "graphql": "16.8.1", "kill-port": "1.6.1", @@ -59,7 +59,7 @@ "rimraf": "5.0.5", "source-map": "0.7.4", "string-env-interpolation": "1.0.1", - "systeminformation": "5.21.7", + "systeminformation": "5.21.17", "terminal-link": "2.1.1", "ts-node": "10.9.1", "typescript": "5.2.2" diff --git a/packages/internal/src/generate/graphqlSchema.ts b/packages/internal/src/generate/graphqlSchema.ts index d253057ef161..b4542780ec81 100644 --- a/packages/internal/src/generate/graphqlSchema.ts +++ b/packages/internal/src/generate/graphqlSchema.ts @@ -24,13 +24,16 @@ export const generateGraphQLSchema = async () => { 'subscriptions/**/*.{js,ts}': {}, } - // If we are serverful and the user is using realtime, we need to include the live directive for realtime support. + // If we're serverful and the user is using realtime, we need to include the live directive for realtime support. + // Note the `ERR_ prefix in`ERR_MODULE_NOT_FOUND`. Since we're using `await import`, + // if the package (here, `@redwoodjs/realtime`) can't be found, it throws this error, with the prefix. + // Whereas `require('@redwoodjs/realtime')` would throw `MODULE_NOT_FOUND`. if (resolveFile(`${getPaths().api.src}/server`)) { try { const { liveDirectiveTypeDefs } = await import('@redwoodjs/realtime') schemaPointerMap[liveDirectiveTypeDefs] = {} } catch (error) { - if ((error as { code: string }).code !== 'MODULE_NOT_FOUND') { + if ((error as { code: string }).code !== 'ERR_MODULE_NOT_FOUND') { throw error } } diff --git a/packages/internal/tsconfig.json b/packages/internal/tsconfig.json index 6ab97c422944..f66f3436bdcb 100644 --- a/packages/internal/tsconfig.json +++ b/packages/internal/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src/**/*", "./ambient.d.ts"], diff --git a/packages/mailer/core/package.json b/packages/mailer/core/package.json index d574e063e87f..737474121a94 100644 --- a/packages/mailer/core/package.json +++ b/packages/mailer/core/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@redwoodjs/api": "6.0.7", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "jest": "29.7.0", "typescript": "5.2.2" }, diff --git a/packages/mailer/core/tsconfig.json b/packages/mailer/core/tsconfig.json index f6d461616d8b..3e87becf1fb2 100644 --- a/packages/mailer/core/tsconfig.json +++ b/packages/mailer/core/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/mailer/handlers/in-memory/package.json b/packages/mailer/handlers/in-memory/package.json index c85450f66b54..f58f6d5910e8 100644 --- a/packages/mailer/handlers/in-memory/package.json +++ b/packages/mailer/handlers/in-memory/package.json @@ -27,8 +27,8 @@ "@redwoodjs/mailer-core": "6.0.7" }, "devDependencies": { - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/mailer/handlers/in-memory/tsconfig.json b/packages/mailer/handlers/in-memory/tsconfig.json index e6ac04331fa9..31d835aec8b3 100644 --- a/packages/mailer/handlers/in-memory/tsconfig.json +++ b/packages/mailer/handlers/in-memory/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/mailer/handlers/nodemailer/package.json b/packages/mailer/handlers/nodemailer/package.json index 2ae093fed1a5..58812d05aaa0 100644 --- a/packages/mailer/handlers/nodemailer/package.json +++ b/packages/mailer/handlers/nodemailer/package.json @@ -25,12 +25,12 @@ }, "dependencies": { "@redwoodjs/mailer-core": "6.0.7", - "nodemailer": "6.9.5" + "nodemailer": "6.9.7" }, "devDependencies": { "@types/nodemailer": "6", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/mailer/handlers/nodemailer/tsconfig.json b/packages/mailer/handlers/nodemailer/tsconfig.json index e6ac04331fa9..31d835aec8b3 100644 --- a/packages/mailer/handlers/nodemailer/tsconfig.json +++ b/packages/mailer/handlers/nodemailer/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/mailer/handlers/resend/package.json b/packages/mailer/handlers/resend/package.json index a19dc55af895..bc88e610948d 100644 --- a/packages/mailer/handlers/resend/package.json +++ b/packages/mailer/handlers/resend/package.json @@ -28,8 +28,8 @@ "resend": "1.0.0" }, "devDependencies": { - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/mailer/handlers/resend/tsconfig.json b/packages/mailer/handlers/resend/tsconfig.json index e6ac04331fa9..31d835aec8b3 100644 --- a/packages/mailer/handlers/resend/tsconfig.json +++ b/packages/mailer/handlers/resend/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/mailer/handlers/studio/package.json b/packages/mailer/handlers/studio/package.json index 09a9c16785fd..7a54a7ad5d23 100644 --- a/packages/mailer/handlers/studio/package.json +++ b/packages/mailer/handlers/studio/package.json @@ -29,8 +29,8 @@ }, "devDependencies": { "@types/nodemailer": "^6", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/mailer/handlers/studio/tsconfig.json b/packages/mailer/handlers/studio/tsconfig.json index e6ac04331fa9..31d835aec8b3 100644 --- a/packages/mailer/handlers/studio/tsconfig.json +++ b/packages/mailer/handlers/studio/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/mailer/renderers/mjml-react/package.json b/packages/mailer/renderers/mjml-react/package.json index 5df162d21ebb..d8671ea77cfd 100644 --- a/packages/mailer/renderers/mjml-react/package.json +++ b/packages/mailer/renderers/mjml-react/package.json @@ -30,8 +30,8 @@ }, "devDependencies": { "@types/mjml": "4", - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/mailer/renderers/mjml-react/tsconfig.json b/packages/mailer/renderers/mjml-react/tsconfig.json index e6ac04331fa9..31d835aec8b3 100644 --- a/packages/mailer/renderers/mjml-react/tsconfig.json +++ b/packages/mailer/renderers/mjml-react/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/mailer/renderers/react-email/package.json b/packages/mailer/renderers/react-email/package.json index 8eabb181960a..d9de41c1c0e6 100644 --- a/packages/mailer/renderers/react-email/package.json +++ b/packages/mailer/renderers/react-email/package.json @@ -28,8 +28,8 @@ "@redwoodjs/mailer-core": "6.0.7" }, "devDependencies": { - "esbuild": "0.19.3", - "fast-glob": "3.3.1", + "esbuild": "0.19.5", + "fast-glob": "3.3.2", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/mailer/renderers/react-email/tsconfig.json b/packages/mailer/renderers/react-email/tsconfig.json index e6ac04331fa9..31d835aec8b3 100644 --- a/packages/mailer/renderers/react-email/tsconfig.json +++ b/packages/mailer/renderers/react-email/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src"], diff --git a/packages/prerender/package.json b/packages/prerender/package.json index 35c20dbc0b32..17fc65fa9d0c 100644 --- a/packages/prerender/package.json +++ b/packages/prerender/package.json @@ -34,7 +34,7 @@ "@whatwg-node/fetch": "0.9.9", "babel-plugin-ignore-html-and-css-imports": "0.1.0", "cheerio": "1.0.0-rc.12", - "core-js": "3.32.2", + "core-js": "3.33.2", "graphql": "16.8.1", "mime-types": "2.1.35" }, diff --git a/packages/prerender/tsconfig.json b/packages/prerender/tsconfig.json index af86fac5578d..7c7e238bbb66 100644 --- a/packages/prerender/tsconfig.json +++ b/packages/prerender/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", "paths": { "src/*": ["./src/*"] diff --git a/packages/project-config/package.json b/packages/project-config/package.json index ee6c0f93661f..fd3081d47a60 100644 --- a/packages/project-config/package.json +++ b/packages/project-config/package.json @@ -25,11 +25,11 @@ "dependencies": { "@iarna/toml": "2.2.5", "deepmerge": "4.3.1", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "string-env-interpolation": "1.0.1" }, "devDependencies": { - "esbuild": "0.19.3", + "esbuild": "0.19.5", "jest": "29.7.0", "rimraf": "5.0.5", "typescript": "5.2.2" diff --git a/packages/project-config/src/__tests__/config.test.ts b/packages/project-config/src/__tests__/config.test.ts index 5e0b777bf9b6..28487c70ceed 100644 --- a/packages/project-config/src/__tests__/config.test.ts +++ b/packages/project-config/src/__tests__/config.test.ts @@ -59,6 +59,9 @@ describe('getConfig', () => { "enabled": false, "wrapApi": true, }, + "realtime": { + "enabled": false, + }, "rsc": { "enabled": false, }, diff --git a/packages/project-config/src/config.ts b/packages/project-config/src/config.ts index 17f9ff66b7a5..bc322160733d 100644 --- a/packages/project-config/src/config.ts +++ b/packages/project-config/src/config.ts @@ -111,6 +111,9 @@ export interface Config { rsc: { enabled: boolean } + realtime: { + enabled: boolean + } } } @@ -193,6 +196,9 @@ const DEFAULT_CONFIG: Config = { rsc: { enabled: false, }, + realtime: { + enabled: false, + }, }, } diff --git a/packages/project-config/tsconfig.json b/packages/project-config/tsconfig.json index a2b798b675c7..74bdeb595478 100644 --- a/packages/project-config/tsconfig.json +++ b/packages/project-config/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src/**/*"], diff --git a/packages/realtime/package.json b/packages/realtime/package.json index b5b19511399f..91f5f798685c 100644 --- a/packages/realtime/package.json +++ b/packages/realtime/package.json @@ -23,11 +23,11 @@ "test:watch": "run test --watch" }, "dependencies": { - "@envelop/live-query": "6.0.0", + "@envelop/live-query": "6.0.3", "@graphql-tools/schema": "10.0.0", - "@graphql-tools/utils": "10.0.1", - "@graphql-yoga/plugin-defer-stream": "2.0.4", - "@graphql-yoga/plugin-graphql-sse": "2.0.4", + "@graphql-tools/utils": "10.0.8", + "@graphql-yoga/plugin-defer-stream": "2.0.5", + "@graphql-yoga/plugin-graphql-sse": "2.0.5", "@graphql-yoga/redis-event-target": "2.0.0", "@graphql-yoga/subscription": "4.0.0", "@n1ru4l/graphql-live-query": "0.10.0", @@ -36,10 +36,10 @@ "ioredis": "5.3.2" }, "devDependencies": { - "@envelop/core": "4.0.0", - "@envelop/testing": "6.0.0", - "@envelop/types": "4.0.0", - "esbuild": "0.19.3", + "@envelop/core": "4.0.3", + "@envelop/testing": "6.0.3", + "@envelop/types": "4.0.1", + "esbuild": "0.19.5", "jest": "29.7.0", "nodemon": "2.0.22", "typescript": "5.2.2" diff --git a/packages/realtime/tsconfig.json b/packages/realtime/tsconfig.json index a2b798b675c7..74bdeb595478 100644 --- a/packages/realtime/tsconfig.json +++ b/packages/realtime/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src/**/*"], diff --git a/packages/record/package.json b/packages/record/package.json index ce2be4551100..b14b75a3fad4 100644 --- a/packages/record/package.json +++ b/packages/record/package.json @@ -28,15 +28,15 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "@prisma/client": "5.4.2", + "@prisma/client": "5.6.0", "@redwoodjs/project-config": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", - "@prisma/internals": "5.4.2", - "esbuild": "0.19.3", + "@prisma/internals": "5.6.0", + "esbuild": "0.19.5", "jest": "29.7.0" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/router/jest.config.js b/packages/router/jest.config.js index b5a6c5ead350..ef06e5a2a089 100644 --- a/packages/router/jest.config.js +++ b/packages/router/jest.config.js @@ -1,19 +1,6 @@ /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { - projects: [ - { - displayName: 'code', - setupFilesAfterEnv: ['./jest.setup.js'], - testEnvironment: 'jest-environment-jsdom', - testMatch: ['**/*.test.+(ts|tsx|js|jsx)', '!**/__typetests__/*.ts'], - }, - { - displayName: { - color: 'blue', - name: 'types', - }, - runner: 'jest-runner-tsd', - testMatch: ['**/__typetests__/*.test.ts'], - }, - ], + setupFilesAfterEnv: ['./jest.setup.js'], + testEnvironment: 'jest-environment-jsdom', + testMatch: ['**/*.test.+(ts|tsx|js|jsx)', '!**/__typetests__/*.ts'], } diff --git a/packages/router/package.json b/packages/router/package.json index a9ce2abbd533..db559b81ce86 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -19,13 +19,14 @@ "build:watch": "nodemon --watch src --ext \"js,jsx,ts,tsx\" --ignore dist --exec \"yarn build\"", "prepublishOnly": "NODE_ENV=production yarn build", "test": "jest", + "test:types": "tstyche", "test:watch": "yarn test --watch" }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@reach/skip-nav": "0.18.0", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2" + "core-js": "3.33.2" }, "devDependencies": { "@babel/cli": "7.23.0", @@ -35,6 +36,7 @@ "jest": "29.7.0", "react": "0.0.0-experimental-e5205658f-20230913", "react-dom": "0.0.0-experimental-e5205658f-20230913", + "tstyche": "1.0.0-beta.3", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/packages/router/src/__typetests__/routeParamsTypes.test.ts b/packages/router/src/__typetests__/routeParamsTypes.test.ts index 54f0a6263795..50680153709d 100644 --- a/packages/router/src/__typetests__/routeParamsTypes.test.ts +++ b/packages/router/src/__typetests__/routeParamsTypes.test.ts @@ -1,10 +1,10 @@ -import { expectAssignable, expectType } from 'tsd-lite' +import { context, describe, expect, test } from 'tstyche' import type { RouteParams, ParamType } from '../routeParamsTypes' /** * FAQ: - * - why aren't you using expectAssignable in all tests? + * - why aren't you using .toBeAssignable() in all tests? * because {b: string} is assignable to Record, and then test isn't accurate enough * * - why aren't you just checking the entire type? @@ -21,7 +21,7 @@ describe('RouteParams<>', () => { id: 2, } - expectType(simple.id) + expect(simple.id).type.toBeNumber() }) test('Starts with parameter', () => { @@ -30,8 +30,8 @@ describe('RouteParams<>', () => { driver: 44, } - expectType(startParam.driver) - expectType(startParam.position) + expect(startParam.driver).type.toBeNumber() + expect(startParam.position).type.toBeNumber() }) test('Route string with no types defaults to string', () => { @@ -42,10 +42,10 @@ describe('RouteParams<>', () => { slug: 'hello-world', } - expectType(untypedParams.year) - expectType(untypedParams.month) - expectType(untypedParams.day) - expectType(untypedParams.slug) + expect(untypedParams.year).type.toBeString() + expect(untypedParams.month).type.toBeString() + expect(untypedParams.day).type.toBeString() + expect(untypedParams.slug).type.toBeString() }) test('Custom param types', () => { @@ -53,7 +53,7 @@ describe('RouteParams<>', () => { name: 'hello-world-slug', } - expectType(customParams.name) + expect(customParams.name).type.toBeString() }) test('Parameter inside string', () => { @@ -61,7 +61,7 @@ describe('RouteParams<>', () => { status: true, } - expectType(stringConcat.status) + expect(stringConcat.status).type.toBeBoolean() }) test('Multiple Glob route params', () => { @@ -70,8 +70,8 @@ describe('RouteParams<>', () => { toDate: '2021/11/17', } - expectType(globRoutes.fromDate) - expectType(globRoutes.toDate) + expect(globRoutes.fromDate).type.toBeString() + expect(globRoutes.toDate).type.toBeString() }) test('Single Glob route params', () => { @@ -79,7 +79,7 @@ describe('RouteParams<>', () => { fromDate: '2021/11/03', } - expectType(globRoutes.fromDate) + expect(globRoutes.fromDate).type.toBeString() }) test('Starts with Glob route params', () => { @@ -87,16 +87,16 @@ describe('RouteParams<>', () => { description: 'cute', } - expectType(globRoutes.description) + expect(globRoutes.description).type.toBeString() }) - test('Glob params in the middle', () => { + context('Glob params in the middle', () => { test('Multiple Glob route params', () => { const middleGlob: RouteParams<'/repo/{folders...}/edit'> = { folders: 'src/lib/auth.js', } - expectType(middleGlob.folders) + expect(middleGlob.folders).type.toBeString() }) }) @@ -111,11 +111,11 @@ describe('RouteParams<>', () => { c: 'stringy-string', } - expectType(untypedFirst.b) - expectType(untypedFirst.c) + expect(untypedFirst.b).type.toBeString() + expect(untypedFirst.c).type.toBeBoolean() - expectType(typedFirst.b) - expectType(typedFirst.c) + expect(typedFirst.b).type.toBeNumber() + expect(typedFirst.c).type.toBeString() }) test('Params in the middle', () => { @@ -125,26 +125,26 @@ describe('RouteParams<>', () => { id: 10, } - expectType(paramsInTheMiddle.authorId) - expectType(paramsInTheMiddle.id) + expect(paramsInTheMiddle.authorId).type.toBeString() + expect(paramsInTheMiddle.id).type.toBeNumber() }) }) describe('ParamType<>', () => { test('Float', () => { - expectAssignable>(1.02) + expect>().type.toBeAssignable(1.02) }) test('Boolean', () => { - expectAssignable>(true) - expectAssignable>(false) + expect>().type.toBeAssignable(true) + expect>().type.toBeAssignable(false) }) test('Int', () => { - expectAssignable>(51) + expect>().type.toBeAssignable(51) }) test('String', () => { - expectAssignable>('bazinga') + expect>().type.toBeAssignable('bazinga') }) }) diff --git a/packages/router/src/__typetests__/tsconfig.json b/packages/router/src/__typetests__/tsconfig.json index a8ba755cc20a..f9a91474ca22 100644 --- a/packages/router/src/__typetests__/tsconfig.json +++ b/packages/router/src/__typetests__/tsconfig.json @@ -1,10 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "composite": false, "incremental": true, - "declaration": false, "declarationMap": false, - "emitDeclarationOnly": false + "emitDeclarationOnly": false, + "types": [] }, + "include": ["./"], + "exclude": [], + "references": [{"path": "../../"}] } diff --git a/packages/router/tsconfig.json b/packages/router/tsconfig.json index db9449de1641..2d34bcb6b768 100644 --- a/packages/router/tsconfig.json +++ b/packages/router/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../../tsconfig.compilerOption.json", "compilerOptions": { - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "baseUrl": ".", "rootDir": "src", "outDir": "dist", @@ -10,11 +9,6 @@ } }, "include": ["src", "./ambient.d.ts"], - "exclude": [ - "dist", - "node_modules", - "**/__mocks__", - ], "references": [ { "path": "../auth" }, ] diff --git a/packages/structure/package.json b/packages/structure/package.json index e048d992e9c4..544d0a8bbe5b 100644 --- a/packages/structure/package.json +++ b/packages/structure/package.json @@ -32,15 +32,15 @@ "dependencies": { "@babel/runtime-corejs3": "7.23.2", "@iarna/toml": "2.2.5", - "@prisma/internals": "5.4.2", + "@prisma/internals": "5.6.0", "@redwoodjs/project-config": "6.0.7", "@types/line-column": "1.0.0", "camelcase": "6.3.0", - "core-js": "3.32.2", + "core-js": "3.33.2", "deepmerge": "4.3.1", "dotenv-defaults": "5.0.2", "enquirer": "2.4.1", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "graphql": "16.8.1", "lazy-get-decorator": "2.2.1", "line-column": "1.0.2", diff --git a/packages/structure/tsconfig.json b/packages/structure/tsconfig.json index 8547f94aafc7..fb5f03b70121 100644 --- a/packages/structure/tsconfig.json +++ b/packages/structure/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", "experimentalDecorators": true, "noImplicitReturns": false, diff --git a/packages/studio/api/lib/authProviderEncoders/dbAuthEncoder.ts b/packages/studio/api/lib/authProviderEncoders/dbAuthEncoder.ts index bbd89198ed3e..771fefca29a1 100644 --- a/packages/studio/api/lib/authProviderEncoders/dbAuthEncoder.ts +++ b/packages/studio/api/lib/authProviderEncoders/dbAuthEncoder.ts @@ -1,4 +1,3 @@ -import CryptoJS from 'crypto-js' import { v4 as uuidv4 } from 'uuid' import { SESSION_SECRET } from '../envars' @@ -18,11 +17,10 @@ export const getDBAuthHeader = async (userId?: string) => { ) } + const { encryptSession } = await import('@redwoodjs/auth-dbauth-api') + const id = isNumeric(userId) ? parseInt(userId) : userId - const cookie = CryptoJS.AES.encrypt( - JSON.stringify({ id }) + ';' + uuidv4(), - SESSION_SECRET - ).toString() + const cookie = encryptSession(JSON.stringify({ id }) + ';' + uuidv4()) return { authProvider: 'dbAuth', diff --git a/packages/studio/package.json b/packages/studio/package.json index a76ac633deef..376a98e05938 100644 --- a/packages/studio/package.json +++ b/packages/studio/package.json @@ -22,25 +22,24 @@ }, "dependencies": { "@babel/runtime-corejs3": "7.23.2", - "@fastify/http-proxy": "9.2.1", - "@fastify/static": "6.11.2", - "@fastify/url-data": "5.3.1", + "@fastify/http-proxy": "9.3.0", + "@fastify/static": "6.12.0", + "@fastify/url-data": "5.4.0", "@redwoodjs/internal": "6.0.7", "@redwoodjs/project-config": "6.0.7", "@swc/cli": "0.1.62", "@swc/core": "1.3.60", "ansi-colors": "4.1.3", "chokidar": "3.5.3", - "core-js": "3.32.2", - "crypto-js": "4.1.1", + "core-js": "3.33.2", "dotenv": "16.3.1", "fast-json-parse": "1.0.3", "fastify": "4.23.2", "fastify-raw-body": "4.2.2", "graphql": "16.8.1", - "graphql-scalars": "1.22.2", + "graphql-scalars": "1.22.4", "graphql-yoga": "4.0.4", - "jsonwebtoken": "9.0.0", + "jsonwebtoken": "9.0.2", "lodash": "4.17.21", "mailparser": "^3.6.5", "pretty-bytes": "5.6.0", @@ -53,7 +52,7 @@ "yargs": "17.7.2" }, "devDependencies": { - "@apollo/client": "3.8.5", + "@apollo/client": "3.8.7", "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@graphiql/plugin-explorer": "0.1.22", @@ -68,8 +67,7 @@ "@tailwindcss/forms": "0.5.3", "@tremor/react": "3.4.1", "@types/aws-lambda": "8.10.119", - "@types/crypto-js": "4.1.1", - "@types/jsonwebtoken": "9.0.2", + "@types/jsonwebtoken": "9.0.5", "@types/lodash": "4.14.195", "@types/mailparser": "^3", "@types/qs": "6.9.7", @@ -80,13 +78,13 @@ "@types/split2": "4.2.0", "@types/uuid": "9.0.2", "@types/yargs": "17.0.24", - "@vitejs/plugin-react": "4.0.4", + "@vitejs/plugin-react": "4.1.1", "autoprefixer": "10.4.14", "aws-lambda": "1.0.7", "buffer": "6.0.3", "graphiql": "2.4.7", "graphql": "16.8.1", - "graphql-scalars": "1.22.2", + "graphql-scalars": "1.22.4", "jest": "29.7.0", "json-bigint-patch": "0.0.8", "postcss": "8.4.31", @@ -98,7 +96,7 @@ "react-router-dom": "6.8.1", "react-split-pane": "0.1.92", "react-toastify": "9.1.3", - "tailwindcss": "3.3.2", + "tailwindcss": "3.3.5", "typescript": "5.2.2", "use-url-search-params": "2.5.1", "vite": "4.5.0" diff --git a/packages/studio/tsconfig.json b/packages/studio/tsconfig.json index b54f3647040e..6872f71d5add 100644 --- a/packages/studio/tsconfig.json +++ b/packages/studio/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "baseUrl": "./", "rootDir": "api", - "tsBuildInfoFile": "dist/api/tsconfig.tsbuildinfo", + "tsBuildInfoFile": "tsconfig.tsbuildinfo", "outDir": "dist/api", }, "include": ["api/**/*"], diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index a223426fb5ea..3b9f3c681e43 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -31,9 +31,9 @@ "@redwoodjs/structure": "6.0.7", "@whatwg-node/fetch": "0.9.9", "ci-info": "3.8.0", - "core-js": "3.32.2", + "core-js": "3.33.2", "envinfo": "7.9.0", - "systeminformation": "5.21.7", + "systeminformation": "5.21.17", "uuid": "9.0.0", "yargs": "17.7.2" }, diff --git a/packages/telemetry/tsconfig.json b/packages/telemetry/tsconfig.json index 26719b65252f..a20bd6bbd951 100644 --- a/packages/telemetry/tsconfig.json +++ b/packages/telemetry/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/testing/package.json b/packages/testing/package.json index 1b8713ac5cc3..02527e0e2fff 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -36,22 +36,22 @@ "@redwoodjs/web": "6.0.7", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "14.0.0", - "@testing-library/user-event": "14.4.3", + "@testing-library/user-event": "14.5.1", "@types/aws-lambda": "8.10.119", "@types/babel-core": "6.25.8", "@types/jest": "29.5.4", "@types/node": "18.16.18", "@types/react": "18.2.14", "@types/react-dom": "18.2.6", - "@types/webpack": "5.28.1", + "@types/webpack": "5.28.5", "@types/webpack-env": "1.18.1", "babel-jest": "^29.7.0", - "core-js": "3.32.2", - "fast-glob": "3.3.1", + "core-js": "3.33.2", + "fast-glob": "3.3.2", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-watch-typeahead": "2.2.2", - "msw": "1.3.1", + "msw": "1.3.2", "ts-toolbelt": "9.6.0", "whatwg-fetch": "3.6.17" }, diff --git a/packages/testing/tsconfig.json b/packages/testing/tsconfig.json index 6d4f752a7087..db0c5ab530cc 100644 --- a/packages/testing/tsconfig.json +++ b/packages/testing/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", "paths": { "src/*": ["./src/*"], diff --git a/packages/tui/package.json b/packages/tui/package.json index 38aaf189730e..adea57dcddc8 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -33,7 +33,7 @@ "stdout-update": "1.6.8" }, "devDependencies": { - "esbuild": "0.19.3", + "esbuild": "0.19.5", "jest": "29.7.0", "typescript": "5.2.2" } diff --git a/packages/tui/tsconfig.json b/packages/tui/tsconfig.json index 43947dd79bd1..42d8f7c0aa1e 100644 --- a/packages/tui/tsconfig.json +++ b/packages/tui/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src"], diff --git a/packages/vite/package.json b/packages/vite/package.json index 30c01bf7d8bc..086daaeb86f6 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -68,12 +68,12 @@ "@redwoodjs/project-config": "6.0.7", "@redwoodjs/web": "6.0.7", "@swc/core": "1.3.60", - "@vitejs/plugin-react": "4.0.4", + "@vitejs/plugin-react": "4.1.1", "@whatwg-node/server": "0.9.14", "acorn-loose": "8.3.0", "buffer": "6.0.3", "busboy": "^1.6.0", - "core-js": "3.32.2", + "core-js": "3.33.2", "dotenv-defaults": "5.0.2", "express": "4.18.2", "http-proxy-middleware": "2.0.6", diff --git a/packages/vite/src/buildFeServer.ts b/packages/vite/src/buildFeServer.ts index 3755346e1414..8aa0a67f48cb 100644 --- a/packages/vite/src/buildFeServer.ts +++ b/packages/vite/src/buildFeServer.ts @@ -71,13 +71,8 @@ export const buildFeServer = async ({ verbose, webDir }: BuildOptions = {}) => { configFile: viteConfigPath, build: { outDir: rwPaths.web.distServer, - ssr: true, // use boolean, and supply the inputs in rollup options (see Documentation) - rollupOptions: { - input: { - 'entry.server': rwPaths.web.entryServer, - Document: rwPaths.web.document, // We need the document for React's fallback - }, - }, + ssr: true, // use boolean here, instead of string. + // rollup inputs are defined in the vite plugin }, envFile: false, logLevel: verbose ? 'info' : 'warn', diff --git a/packages/vite/src/buildRscFeServer.ts b/packages/vite/src/buildRscFeServer.ts index a4a46d08d71f..607f83fc8492 100644 --- a/packages/vite/src/buildRscFeServer.ts +++ b/packages/vite/src/buildRscFeServer.ts @@ -54,6 +54,15 @@ export const buildRscFeServer = async ({ ...clientEntryFiles, }, preserveEntrySignatures: 'exports-only', + output: { + // This is not ideal. See + // https://rollupjs.org/faqs/#why-do-additional-imports-turn-up-in-my-entry-chunks-when-code-splitting + // But we need it to prevent `import 'client-only'` from being + // hoisted into App.tsx + // TODO (RSC): Fix when https://github.com/rollup/rollup/issues/5235 + // is resolved + hoistTransitiveImports: false, + }, }, manifest: 'client-build-manifest.json', }, diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index ffea7d56bce7..e25fd25af950 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -17,7 +17,7 @@ const checkStatus = async ( return response } -export function serve(rscId: string, basePath = '/RSC/') { +export function serve(rscId: string, basePath = '/rw-rsc/') { type SetRerender = ( rerender: (next: [ReactElement, string]) => void ) => () => void @@ -54,6 +54,9 @@ export function serve(rscId: string, basePath = '/RSC/') { const response = fetch(basePath + id + '/' + searchParams, { method: 'POST', body: await encodeReply(args), + headers: { + 'rw-rsc': '1', + }, }) const data = createFromFetch(response, options) @@ -76,7 +79,12 @@ export function serve(rscId: string, basePath = '/RSC/') { ) const response = - prefetched || fetch(basePath + rscId + '/' + searchParams) + prefetched || + fetch(basePath + rscId + '/' + searchParams, { + headers: { + 'rw-rsc': '1', + }, + }) const data = createFromFetch(checkStatus(response), options) console.log('fetchRSC after createFromFetch. data:', data) diff --git a/packages/vite/src/devFeServer.ts b/packages/vite/src/devFeServer.ts index ddc8af8730af..d4e5445ee8d7 100644 --- a/packages/vite/src/devFeServer.ts +++ b/packages/vite/src/devFeServer.ts @@ -1,10 +1,14 @@ import { createServerAdapter } from '@whatwg-node/server' import express from 'express' +import type { ViteDevServer } from 'vite' import { createServer as createViteServer } from 'vite' +import type { RouteSpec } from '@redwoodjs/internal/dist/routes' import { getProjectRoutes } from '@redwoodjs/internal/dist/routes' +import type { Paths } from '@redwoodjs/project-config' import { getConfig, getPaths } from '@redwoodjs/project-config' +import { collectCssPaths, componentsModules } from './streaming/collectCss' import { createReactStreamingHandler } from './streaming/createReactStreamingHandler' import { registerFwGlobals } from './streaming/registerGlobals' import { ensureProcessDirWeb } from './utils' @@ -55,18 +59,12 @@ async function createServer() { const routes = getProjectRoutes() - // TODO (STREAMING) CSS is handled by Vite in dev mode, we don't need to - // worry about it in dev but..... it causes a flash of unstyled content. - // For now I'm just injecting index css here - // Look at collectStyles in packages/vite/src/fully-react/find-styles.ts - const FIXME_HardcodedIndexCss = ['index.css'] - for (const route of routes) { const routeHandler = await createReactStreamingHandler( { route, clientEntryPath: rwPaths.web.entryClient as string, - cssLinks: FIXME_HardcodedIndexCss, + getStylesheetLinks: () => getCssLinks(rwPaths, route, vite), }, vite ) @@ -100,3 +98,21 @@ process.stdin.on('data', async (data) => { }) } }) + +/** + * This function is used to collect the CSS links for a given route. + * + * Passed as a getter to the createReactStreamingHandler function, because + * at the time of creating the handler, the ViteDevServer hasn't analysed the module graph yet + */ +function getCssLinks(rwPaths: Paths, route: RouteSpec, vite: ViteDevServer) { + const appAndRouteModules = componentsModules( + [rwPaths.web.app, route.filePath].filter(Boolean) as string[], + vite + ) + + const collectedCss = collectCssPaths(appAndRouteModules) + + const cssLinks = Array.from(collectedCss) + return cssLinks +} diff --git a/packages/vite/src/index.ts b/packages/vite/src/index.ts index 6803a9a813a2..a7443cae632c 100644 --- a/packages/vite/src/index.ts +++ b/packages/vite/src/index.ts @@ -2,6 +2,7 @@ import { existsSync } from 'fs' import path from 'path' import react from '@vitejs/plugin-react' +import type { InputOption } from 'rollup' import type { ConfigEnv, UserConfig, PluginOption } from 'vite' import { normalizePath } from 'vite' @@ -10,6 +11,7 @@ import { getConfig, getPaths } from '@redwoodjs/project-config' import handleJsAsJsx from './plugins/vite-plugin-jsx-loader' import removeFromBundle from './plugins/vite-plugin-remove-from-bundle' +import swapApolloProvider from './plugins/vite-plugin-swap-apollo-provider' /** * Pre-configured vite plugin, with required config for Redwood apps. @@ -239,6 +241,9 @@ export default function redwoodPluginVite(): PluginOption[] { emptyOutDir: true, manifest: !env.ssrBuild ? 'build-manifest.json' : undefined, sourcemap: !env.ssrBuild && rwConfig.web.sourceMap, // Note that this can be boolean or 'inline' + rollupOptions: { + input: getRollupInput(!!env.ssrBuild), + }, }, legacy: { buildSsrCjsExternalHeuristics: rwConfig.experimental?.rsc?.enabled @@ -261,6 +266,8 @@ export default function redwoodPluginVite(): PluginOption[] { } }, }, + // We can remove when streaming is stable + rwConfig.experimental.streamingSsr.enabled && swapApolloProvider(), // ----------------- handleJsAsJsx(), // Remove the splash-page from the bundle. @@ -269,6 +276,12 @@ export default function redwoodPluginVite(): PluginOption[] { id: /@redwoodjs\/router\/dist\/splash-page/, }, ]), + !rwConfig.experimental.realtime.enabled && + removeFromBundle([ + { + id: /@redwoodjs\/web\/dist\/apollo\/sseLink/, + }, + ]), react({ babel: { ...getWebSideDefaultBabelConfig({ @@ -278,3 +291,32 @@ export default function redwoodPluginVite(): PluginOption[] { }), ] } + +/** + * + * This function configures how vite (actually Rollup) will bundle. + * + * By default, the entry point is the index.html file - even if you don't specify it in RollupOptions + * + * With streaming SSR, out entrypoint is different - either entry.client.tsx or entry.server.tsx + * and the html file is not used at all, because it is defined in Document.tsx + * + * @param ssr {boolean} Whether to return the SSR inputs or not + * @returns Rollup input Options + */ +function getRollupInput(ssr: boolean): InputOption | undefined { + const rwConfig = getConfig() + const rwPaths = getPaths() + + // @NOTE once streaming ssr is out of experimental, this will become the default + if (rwConfig.experimental.streamingSsr.enabled) { + return ssr + ? { + 'entry.server': rwPaths.web.entryServer as string, + Document: rwPaths.web.document, // We need the document for React's fallback + } + : (rwPaths.web.entryClient as string) + } + + return rwPaths.web.html +} diff --git a/packages/vite/src/plugins/__tests__/swap-apollo-provider.test.mts b/packages/vite/src/plugins/__tests__/swap-apollo-provider.test.mts new file mode 100644 index 000000000000..35f352a1e8fc --- /dev/null +++ b/packages/vite/src/plugins/__tests__/swap-apollo-provider.test.mts @@ -0,0 +1,18 @@ +import assert from 'node:assert/strict' +import { describe, it } from 'node:test' + +import plugin from '../vite-plugin-swap-apollo-provider.js' + +// @ts-expect-error node test not configured correctly +const swapApolloProvider = plugin.default + + +describe('excludeModule', () => { + it('should swap the import', async() => { + const plugin = swapApolloProvider() + + const output = await plugin.transform(`import ApolloProvider from '@redwoodjs/web/apollo'`, '/Users/dac09/Experiments/ssr-2354/web/src/App.tsx') + + assert.strictEqual(output, "import ApolloProvider from '@redwoodjs/web/dist/apollo/suspense'") +}) +}) diff --git a/packages/vite/src/plugins/vite-plugin-remove-from-bundle.ts b/packages/vite/src/plugins/vite-plugin-remove-from-bundle.ts index 3cfd18d8a138..5292ecc89057 100644 --- a/packages/vite/src/plugins/vite-plugin-remove-from-bundle.ts +++ b/packages/vite/src/plugins/vite-plugin-remove-from-bundle.ts @@ -31,7 +31,7 @@ export default function removeFromBundle( // Currently configured for CJS only. const EMPTY_MODULE = { - code: `module.exports = null`, + code: `module.exports = {}`, } export function excludeOnMatch(modulesToExclude: ModulesToExclude, id: string) { diff --git a/packages/vite/src/plugins/vite-plugin-swap-apollo-provider.ts b/packages/vite/src/plugins/vite-plugin-swap-apollo-provider.ts new file mode 100644 index 000000000000..8f3742492b4c --- /dev/null +++ b/packages/vite/src/plugins/vite-plugin-swap-apollo-provider.ts @@ -0,0 +1,26 @@ +import type { PluginOption } from 'vite' + +/** + * + * Temporary plugin, that swaps the ApolloProvider import with the Suspense enabled one, + * until it becomes stable. + * + * import { RedwoodApolloProvider } from "@redwoodjs/web/apollo" -> + * import { RedwoodApolloProvider } from "@redwoodjs/web/dist/apollo/suspense" + * + */ +export default function swapApolloProvider(): PluginOption { + return { + name: 'redwood-swap-apollo-provider', + async transform(code: string, id: string) { + if (/web\/src\/App\.(ts|tsx|js|jsx)$/.test(id)) { + return code.replace( + '@redwoodjs/web/apollo', + '@redwoodjs/web/dist/apollo/suspense' + ) + } + + return code + }, + } +} diff --git a/packages/vite/src/rsc/rscRequestHandler.ts b/packages/vite/src/rsc/rscRequestHandler.ts index 33e5b03df7b2..abffbf8e6ae5 100644 --- a/packages/vite/src/rsc/rscRequestHandler.ts +++ b/packages/vite/src/rsc/rscRequestHandler.ts @@ -9,12 +9,19 @@ import { renderRsc } from './rscWorkerCommunication' const { decodeReply, decodeReplyFromBusboy } = RSDWServer export function createRscRequestHandler() { - // This is mounted at /RSC, so will have /RSC stripped from req.url - return async (req: Request, res: Response) => { - const basePath = '/RSC/' + // This is mounted at /rw-rsc, so will have /rw-rsc stripped from req.url + return async (req: Request, res: Response, next: () => void) => { + const basePath = '/rw-rsc/' console.log('basePath', basePath) console.log('req.originalUrl', req.originalUrl, 'req.url', req.url) console.log('req.headers.host', req.headers.host) + console.log("req.headers['rw-rsc']", req.headers['rw-rsc']) + + // https://www.rfc-editor.org/rfc/rfc6648 + // SHOULD NOT prefix their parameter names with "X-" or similar constructs. + if (req.headers['rw-rsc'] !== '1') { + return next() + } const url = new URL(req.originalUrl || '', 'http://' + req.headers.host) let rscId: string | undefined @@ -41,6 +48,9 @@ export function createRscRequestHandler() { } if (rsfId) { + // TODO (RSC): For React Server Actions we need to limit the request + // size somehow + // https://nextjs.org/docs/app/api-reference/functions/server-actions#size-limitation if (req.headers['content-type']?.startsWith('multipart/form-data')) { const bb = busboy({ headers: req.headers }) const reply = decodeReplyFromBusboy(bb) diff --git a/packages/vite/src/rsc/rscWorker.ts b/packages/vite/src/rsc/rscWorker.ts index 56bda94a8906..63686e91a3c8 100644 --- a/packages/vite/src/rsc/rscWorker.ts +++ b/packages/vite/src/rsc/rscWorker.ts @@ -255,6 +255,9 @@ const resolveClientEntry = ( ) => { const clientEntry = absoluteClientEntries[filePath] + console.log('absoluteClientEntries', absoluteClientEntries) + console.log('filePath', filePath) + if (!clientEntry) { if (absoluteClientEntries['*'] === '*') { return config.base + path.relative(config.root, filePath) diff --git a/packages/vite/src/rsc/rscWorkerCommunication.ts b/packages/vite/src/rsc/rscWorkerCommunication.ts index 6570c0125c51..1405a8661d2c 100644 --- a/packages/vite/src/rsc/rscWorkerCommunication.ts +++ b/packages/vite/src/rsc/rscWorkerCommunication.ts @@ -4,7 +4,14 @@ import type { Readable } from 'node:stream' import { Worker } from 'node:worker_threads' const worker = new Worker(path.join(__dirname, 'rscWorker.js'), { - execArgv: ['--conditions', 'react-server'], + execArgv: [ + '--conditions', + 'react-server', + '--experimental-loader', + '@redwoodjs/vite/node-loader', + '--experimental-loader', + '@redwoodjs/vite/react-node-loader', + ], }) export type RenderInput< diff --git a/packages/vite/src/runFeServer.ts b/packages/vite/src/runFeServer.ts index 891631079d01..76df352825bc 100644 --- a/packages/vite/src/runFeServer.ts +++ b/packages/vite/src/runFeServer.ts @@ -98,14 +98,14 @@ export async function runFeServer() { }) ) - const collectedCss = indexEntry.css || [] + const getStylesheetLinks = () => indexEntry.css || [] const clientEntry = '/' + indexEntry.file for (const route of Object.values(routeManifest)) { const routeHandler = await createReactStreamingHandler({ route, clientEntryPath: clientEntry, - cssLinks: collectedCss, + getStylesheetLinks, }) // if it is a 404, register it at the end somehow. diff --git a/packages/vite/src/runRscFeServer.ts b/packages/vite/src/runRscFeServer.ts index 6ef02ae1f01e..2be7c4960360 100644 --- a/packages/vite/src/runRscFeServer.ts +++ b/packages/vite/src/runRscFeServer.ts @@ -103,8 +103,8 @@ export async function runFeServer() { }) ) - // Mounting middleware at /RSC will strip /RSC from req.url - app.use('/RSC', createRscRequestHandler()) + // Mounting middleware at /rw-rsc will strip /rw-rsc from req.url + app.use('/rw-rsc', createRscRequestHandler()) app.use(express.static(rwPaths.web.dist)) diff --git a/packages/vite/src/streaming/collectCss.ts b/packages/vite/src/streaming/collectCss.ts new file mode 100644 index 000000000000..67fe1454364f --- /dev/null +++ b/packages/vite/src/streaming/collectCss.ts @@ -0,0 +1,40 @@ +import type { ViteDevServer, ModuleNode } from 'vite' + +/** + * Collect SSR CSS for Vite + */ +export const componentsModules = ( + components: string[], + vite: ViteDevServer +) => { + const matchedModules: Set = new Set() + components.forEach((component) => { + const modules = vite.moduleGraph.getModulesByFile(component) + modules?.forEach((mod) => { + matchedModules.add(mod) + }) + }) + return matchedModules +} + +export const collectCssPaths = ( + mods: Set, + cssLinks = new Set(), + checkedComponents = new Set() +) => { + for (const mod of mods) { + if ( + mod.file?.endsWith('.scss') || + mod.file?.endsWith('.css') || + mod.file?.endsWith('.less') // technically less is not supported oob by vite + ) { + cssLinks.add(mod.url) + } + if (mod.importedModules.size > 0 && !checkedComponents.has(mod.id)) { + checkedComponents.add(mod.id) + collectCssPaths(mod.importedModules, cssLinks, checkedComponents) + } + } + + return cssLinks +} diff --git a/packages/vite/src/streaming/createReactStreamingHandler.ts b/packages/vite/src/streaming/createReactStreamingHandler.ts index ac441fa461de..a479c8c668e8 100644 --- a/packages/vite/src/streaming/createReactStreamingHandler.ts +++ b/packages/vite/src/streaming/createReactStreamingHandler.ts @@ -8,22 +8,24 @@ import { getAppRouteHook, getPaths } from '@redwoodjs/project-config' import { matchPath } from '@redwoodjs/router' import type { TagDescriptor } from '@redwoodjs/web' -// import { stripQueryStringAndHashFromPath } from '../utils' - import { reactRenderToStreamResponse } from './streamHelpers' import { loadAndRunRouteHooks } from './triggerRouteHooks' interface CreateReactStreamingHandlerOptions { route: RWRouteManifestItem clientEntryPath: string - cssLinks: string[] + getStylesheetLinks: () => string[] } const checkUaForSeoCrawler = isbot.spawn() checkUaForSeoCrawler.exclude(['chrome-lighthouse']) export const createReactStreamingHandler = async ( - { route, clientEntryPath, cssLinks }: CreateReactStreamingHandlerOptions, + { + route, + clientEntryPath, + getStylesheetLinks, + }: CreateReactStreamingHandlerOptions, viteDevServer?: ViteDevServer ) => { const { redirect, routeHooks, bundle } = route @@ -115,6 +117,10 @@ export const createReactStreamingHandler = async ( req.headers.get('user-agent') || '' ) + // Using a function to get the CSS links because we need to wait for the + // vite dev server to analyze the module graph + const cssLinks = getStylesheetLinks() + const reactResponse = await reactRenderToStreamResponse( { ServerEntry, diff --git a/packages/vite/src/streaming/registerGlobals.ts b/packages/vite/src/streaming/registerGlobals.ts index 1ace576f59b2..75d034636579 100644 --- a/packages/vite/src/streaming/registerGlobals.ts +++ b/packages/vite/src/streaming/registerGlobals.ts @@ -33,11 +33,11 @@ export const registerFwGlobals = () => { if (/^[a-zA-Z][a-zA-Z\d+\-.]*?:/.test(apiPath)) { return apiPath } else { - const proxiedApiUrl = - // NOTE: rwConfig.web.host defaults to "localhost", which is - // troublesome in regards to IPv6/IPv4. So all the more - // reason to set RWJS_EXP_SSR_GRAPHQL_ENDPOINT + // NOTE: rwConfig.web.host defaults to "localhost", which is + // When running in production, the api server does not listen on localhost + const proxiedApiUrl = swapLocalhostFor127( 'http://' + rwConfig.web.host + ':' + rwConfig.web.port + apiPath + ) if ( process.env.NODE_ENV === 'production' && @@ -47,9 +47,7 @@ export const registerFwGlobals = () => { console.warn() console.warn() - console.warn( - `You haven't configured your API absolute url. Localhost is unlikely to work in production` - ) + console.warn(`You haven't configured your API absolute url.`) console.warn(`Using ${proxiedApiUrl}`) console.warn() @@ -64,7 +62,7 @@ export const registerFwGlobals = () => { return proxiedApiUrl } - return ( + return swapLocalhostFor127( (process.env.RWJS_EXP_SSR_GRAPHQL_ENDPOINT as string) ?? proxiedApiUrl ) } @@ -76,3 +74,7 @@ export const registerFwGlobals = () => { REDWOOD_ENV_EDITOR: JSON.stringify(process.env.REDWOOD_ENV_EDITOR), } } + +function swapLocalhostFor127(hostString: string) { + return hostString.replace('localhost', '127.0.0.1') +} diff --git a/packages/vite/src/streaming/streamHelpers.ts b/packages/vite/src/streaming/streamHelpers.ts index 265e1255e6e1..bd93e9c216c9 100644 --- a/packages/vite/src/streaming/streamHelpers.ts +++ b/packages/vite/src/streaming/streamHelpers.ts @@ -9,6 +9,7 @@ import type { import { ServerAuthProvider } from '@redwoodjs/auth' import type { AuthProviderState } from '@redwoodjs/auth/src/AuthProvider/AuthProviderState' +import { LocationProvider } from '@redwoodjs/router' import type { TagDescriptor } from '@redwoodjs/web' // @TODO (ESM), use exports field. Cannot import from web because of index exports import { @@ -71,6 +72,7 @@ export async function reactRenderToStreamResponse( // This is a transformer stream, that will inject all things called with useServerInsertedHtml const serverInjectionTransform = createServerInjectionTransform({ injectionState, + onlyOnFlush: waitForAllReady, }) // Timeout after 10 seconds @@ -82,7 +84,6 @@ export async function reactRenderToStreamResponse( const timeoutTransform = createTimeoutTransform(timeoutHandle) - // @ts-expect-error Something in React's packages mean types dont come through // Possible that we need to upgrade the @types/* packages const { renderToReadableStream } = await import('react-dom/server.edge') @@ -94,15 +95,23 @@ export async function reactRenderToStreamResponse( value: authState as any, }, React.createElement( - ServerHtmlProvider, + LocationProvider, { - value: injectToPage, + location: { + pathname: path, + }, }, - ServerEntry({ - url: path, - css: cssLinks, - meta: metaTags, - }) + React.createElement( + ServerHtmlProvider, + { + value: injectToPage, + }, + ServerEntry({ + url: path, + css: cssLinks, + meta: metaTags, + }) + ) ) ) } @@ -140,16 +149,24 @@ export async function reactRenderToStreamResponse( renderToStreamOptions ) - const output = reactStream - .pipeThrough(bufferTransform) - .pipeThrough(serverInjectionTransform) - .pipeThrough(timeoutTransform) - + // @NOTE: very important that we await this before we apply any transforms if (waitForAllReady) { await reactStream.allReady + clearTimeout(timeoutHandle) } - return new Response(output, { + const transformsToApply = [ + !waitForAllReady && bufferTransform, + serverInjectionTransform, + !waitForAllReady && timeoutTransform, + ] + + const outputStream: ReadableStream = applyStreamTransforms( + reactStream, + transformsToApply + ) + + return new Response(outputStream, { status: didErrorOutsideShell ? 500 : 200, // I think better right? Prevents caching a bad page headers: { 'content-type': 'text/html' }, }) @@ -157,6 +174,8 @@ export async function reactRenderToStreamResponse( console.error('πŸ”» Failed to render shell') streamOptions.onError?.(e as Error) + clearTimeout(timeoutHandle) + // @TODO Asking for clarification from React team. Their documentation on this is incomplete I think. // Having the Document (and bootstrap scripts) here allows client to recover from errors in the shell // To test this, throw an error in the App on the server only @@ -175,3 +194,19 @@ export async function reactRenderToStreamResponse( }) } } +function applyStreamTransforms( + reactStream: ReactDOMServerReadableStream, + transformsToApply: (TransformStream | false)[] +) { + let outputStream: ReadableStream = reactStream + + for (const transform of transformsToApply) { + // If its false, skip + if (!transform) { + continue + } + outputStream = outputStream.pipeThrough(transform) + } + + return outputStream +} diff --git a/packages/vite/src/streaming/transforms/serverInjectionTransform.ts b/packages/vite/src/streaming/transforms/serverInjectionTransform.ts index 15475cf731b4..5908dfa0b373 100644 --- a/packages/vite/src/streaming/transforms/serverInjectionTransform.ts +++ b/packages/vite/src/streaming/transforms/serverInjectionTransform.ts @@ -8,15 +8,25 @@ import { ServerInjectedHtml } from '@redwoodjs/web/dist/components/ServerInject' import { encodeText } from './encode-decode' +type CreateServerInjectionArgs = { + injectionState: Set + onlyOnFlush?: boolean +} + export function createServerInjectionTransform({ injectionState, -}: { - injectionState: Set -}) { + onlyOnFlush = false, +}: CreateServerInjectionArgs) { const transformStream = new TransformStream({ transform(chunk, controller) { - const mergedBytes = insertHtml(chunk) - controller.enqueue(mergedBytes) + if (onlyOnFlush) { + // when waiting for flush (or all ready), we do NOT buffer the stream + // and its not safe to inject except at the end + controller.enqueue(chunk) + } else { + const mergedBytes = insertHtml(chunk) + controller.enqueue(mergedBytes) + } }, flush(controller) { // Before you finish, flush injected HTML again diff --git a/packages/vite/src/waku-lib/build-server.ts b/packages/vite/src/waku-lib/build-server.ts index 2003621f6c0e..fca7c113ce7a 100644 --- a/packages/vite/src/waku-lib/build-server.ts +++ b/packages/vite/src/waku-lib/build-server.ts @@ -31,28 +31,38 @@ export async function serverBuild( root: rwPaths.web.base, ssr: { // Externalize everything except packages with files that have - // 'use client' in them + // 'use client' in them (which are the files in `clientEntryFiles`) // Files included in `noExternal` are files we want Vite to analyze // The values in the array here are compared to npm package names, like // 'react', 'core-js', @anthropic-ai/sdk', @redwoodjs/vite', etc // The map function below will return '..' for local files. That's not // very pretty, but it works. It just won't match anything. - noExternal: Object.values(clientEntryFiles).map((fname) => { + noExternal: Object.values(clientEntryFiles).map((fullPath) => { + // On Windows `fullPath` will be something like + // D:/a/redwood/test-project-rsc-external-packages/node_modules/@tobbe.dev/rsc-test/dist/rsc-test.es.js const relativePath = path.relative( path.join(rwPaths.base, 'node_modules'), - fname + fullPath ) - const splitPath = relativePath.split('/') + // On Windows `relativePath` will be something like + // @tobbe.dev\rsc-test\dist\rsc-test.es.js + // So `splitPath` will in this case become + // ['@tobbe.dev', 'rsc-test', 'dist', 'rsc-test.es.js'] + const splitPath = relativePath.split(path.sep) - // TODO (RSC): Verify this is correct. Need to find a scoped package - // that uses 'use client' - // Handle scoped packages - if (relativePath.startsWith('@')) { - return splitPath[0] + '/' + splitPath[1] + // Packages without scope. Full package name looks like: package_name + let packageName = splitPath[0] + + // Handle scoped packages. Full package name looks like: + // @org_name/package_name + if (splitPath[0].startsWith('@')) { + // join @org_name with package_name + packageName = path.join(splitPath[0], splitPath[1]) } - // Packages without scope - return splitPath[0] + console.log('noExternal packageName', packageName) + + return packageName }), resolve: { externalConditions: ['react-server'], @@ -97,6 +107,13 @@ export async function serverBuild( } return 'assets/[name].js' }, + // This is not ideal. See + // https://rollupjs.org/faqs/#why-do-additional-imports-turn-up-in-my-entry-chunks-when-code-splitting + // But we need it to prevent `import 'client-only'` from being + // hoisted into App.tsx + // TODO (RSC): Fix when https://github.com/rollup/rollup/issues/5235 + // is resolved + hoistTransitiveImports: false, }, }, }, diff --git a/packages/vite/tsconfig.json b/packages/vite/tsconfig.json index 4737f682735f..c6adbbf1121b 100644 --- a/packages/vite/tsconfig.json +++ b/packages/vite/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["src/**/*", "./ambient.d.ts", "./modules.d.ts"], diff --git a/packages/web-server/package.json b/packages/web-server/package.json index d161b804dc5f..2a228fb84ad3 100644 --- a/packages/web-server/package.json +++ b/packages/web-server/package.json @@ -25,18 +25,18 @@ "test:watch": "echo \"No tests yet\"" }, "dependencies": { - "@fastify/http-proxy": "9.2.1", - "@fastify/static": "6.11.2", + "@fastify/http-proxy": "9.3.0", + "@fastify/static": "6.12.0", "@redwoodjs/project-config": "6.0.7", "chalk": "4.1.2", "dotenv-defaults": "5.0.2", - "fast-glob": "3.3.1", + "fast-glob": "3.3.2", "fastify": "4.23.2", "yargs-parser": "21.1.1" }, "devDependencies": { "@types/yargs-parser": "21.0.0", - "esbuild": "0.19.3", + "esbuild": "0.19.5", "typescript": "5.2.2" }, "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" diff --git a/packages/web-server/tsconfig.json b/packages/web-server/tsconfig.json index e44bac161b96..22f62ab3b242 100644 --- a/packages/web-server/tsconfig.json +++ b/packages/web-server/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist", }, "include": ["src", "ambient.d.ts"], diff --git a/packages/web/jest.config.js b/packages/web/jest.config.js index ded53dea3d98..df0b39dd2621 100644 --- a/packages/web/jest.config.js +++ b/packages/web/jest.config.js @@ -1,25 +1,12 @@ /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { - projects: [ - { - displayName: 'code', - testEnvironment: 'jest-environment-jsdom', - testMatch: [ - '**/*.test.+(ts|tsx|js|jsx)', - '!**/__typetests__/*.+(ts|tsx|js|jsx)', - ], - globals: { - // Required for code that use experimental flags - RWJS_ENV: {}, - }, - }, - { - displayName: { - color: 'blue', - name: 'types', - }, - runner: 'jest-runner-tsd', - testMatch: ['**/__typetests__/*.test.+(ts|tsx|js|jsx)'], - }, + testEnvironment: 'jest-environment-jsdom', + testMatch: [ + '**/*.test.+(ts|tsx|js|jsx)', + '!**/__typetests__/*.+(ts|tsx|js|jsx)', ], + globals: { + // Required for code that use experimental flags + RWJS_ENV: {}, + }, } diff --git a/packages/web/package.json b/packages/web/package.json index a7e30fec1377..ca6feb957d77 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -32,15 +32,16 @@ "build:watch": "nodemon --watch src --ext \"js,jsx,ts,tsx\" --ignore dist --exec \"yarn build\"", "prepublishOnly": "NODE_ENV=production yarn build", "test": "jest", + "test:types": "tstyche", "test:watch": "yarn test --watch" }, "dependencies": { - "@apollo/client": "3.8.5", + "@apollo/client": "3.8.7", "@babel/runtime-corejs3": "7.23.2", "@redwoodjs/auth": "6.0.7", - "core-js": "3.32.2", + "core-js": "3.33.2", "graphql": "16.8.1", - "graphql-sse": "2.2.1", + "graphql-sse": "2.3.0", "graphql-tag": "2.12.6", "react-helmet-async": "1.3.0", "react-hot-toast": "2.4.1", @@ -48,7 +49,7 @@ "ts-toolbelt": "9.6.0" }, "devDependencies": { - "@apollo/experimental-nextjs-app-support": "0.4.3", + "@apollo/experimental-nextjs-app-support": "0.5.1", "@babel/cli": "7.23.0", "@babel/core": "^7.22.20", "@testing-library/jest-dom": "5.16.5", @@ -57,10 +58,10 @@ "@types/react-dom": "18.2.6", "@types/testing-library__jest-dom": "5.14.8", "jest": "29.7.0", - "jest-runner-tsd": "5.0.0", "nodemon": "2.0.22", "react": "0.0.0-experimental-e5205658f-20230913", "react-dom": "0.0.0-experimental-e5205658f-20230913", + "tstyche": "1.0.0-beta.3", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/packages/web/src/__typetests__/cellProps.test.tsx b/packages/web/src/__typetests__/cellProps.test.tsx index 79622eab4ea5..0b4f8c37e1dc 100644 --- a/packages/web/src/__typetests__/cellProps.test.tsx +++ b/packages/web/src/__typetests__/cellProps.test.tsx @@ -2,7 +2,7 @@ import React from 'react' import gql from 'graphql-tag' -import { expectAssignable } from 'tsd-lite' +import { describe, expect, test } from 'tstyche' import type { CellProps, CellSuccessProps } from '@redwoodjs/web' @@ -68,7 +68,7 @@ describe('CellProps mapper type', () => { ExampleQueryVariables > - expectAssignable({ + expect().type.toBeAssignable({ customProp: 55, category: 'Dinner', saved: true, @@ -83,7 +83,7 @@ describe('CellProps mapper type', () => { EmptyVariables > - expectAssignable({ + expect().type.toBeAssignable({ customProp: 55, }) }) @@ -111,7 +111,7 @@ describe('CellProps mapper type', () => { > // Note that the gql variables are no longer required here - expectAssignable({ + expect().type.toBeAssignable({ word: 'abracadabra', customProp: 99, }) @@ -134,7 +134,7 @@ describe('CellProps mapper type', () => { EmptyVariables > - expectAssignable({ + expect().type.toBeAssignable({ fetchPolicy: 'cache-only', customProp: 55, }) @@ -163,7 +163,7 @@ describe('CellProps mapper type', () => { > // Note that the gql variables are no longer required here - expectAssignable({ + expect().type.toBeAssignable({ customProp: 99, }) }) @@ -185,7 +185,7 @@ describe('CellProps mapper type', () => { EmptyVariables > - expectAssignable({ + expect().type.toBeAssignable({ customProp: 55, }) }) diff --git a/packages/web/src/__typetests__/cellSuccessData.test.tsx b/packages/web/src/__typetests__/cellSuccessData.test.tsx index 82e92186cfe1..5db88f5dc69e 100644 --- a/packages/web/src/__typetests__/cellSuccessData.test.tsx +++ b/packages/web/src/__typetests__/cellSuccessData.test.tsx @@ -1,4 +1,4 @@ -import { expectType } from 'tsd-lite' +import { describe, expect, it } from 'tstyche' import type { CellSuccessData } from '@redwoodjs/web' @@ -9,13 +9,13 @@ describe('CellSuccessData', () => { foo: '', } - expectType<{ foo: string }>(value) + expect(value).type.toEqual<{ foo: string }>() }) it('removes null and undefined from properties', () => { const value: CellSuccessData<{ foo?: string | null }> = { foo: '' } - expectType<{ foo: string }>(value) + expect(value).type.toEqual<{ foo: string }>() }) }) @@ -30,7 +30,7 @@ describe('CellSuccessData', () => { bar: '', } - expectType<{ foo: string; bar: string }>(value) + expect(value).type.toEqual<{ foo: string; bar: string }>() }) it('does not remove null or undefined from properties', () => { @@ -42,7 +42,7 @@ describe('CellSuccessData', () => { bar: '', } - expectType<{ foo?: string | null; bar?: string | null }>(value) + expect(value).type.toEqual<{ foo?: string | null; bar?: string | null }>() }) }) }) diff --git a/packages/web/src/__typetests__/tsconfig.json b/packages/web/src/__typetests__/tsconfig.json index a8ba755cc20a..8f0aa3e9058f 100644 --- a/packages/web/src/__typetests__/tsconfig.json +++ b/packages/web/src/__typetests__/tsconfig.json @@ -1,10 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "composite": false, "incremental": true, - "declaration": false, "declarationMap": false, - "emitDeclarationOnly": false + "emitDeclarationOnly": false, + "sourceMap": true, + "types": [] }, + "include": ["./"], + "exclude": [] } diff --git a/packages/web/src/apollo/index.tsx b/packages/web/src/apollo/index.tsx index 3933a9c134cf..00a229b8ff36 100644 --- a/packages/web/src/apollo/index.tsx +++ b/packages/web/src/apollo/index.tsx @@ -50,7 +50,7 @@ export type { export { useCache } -export { fragmentRegistry, registerFragment, registerFragments, SSELink } +export { fragmentRegistry, registerFragment, registerFragments } export type ApolloClientCacheConfig = apolloClient.InMemoryCacheConfig @@ -212,23 +212,26 @@ const ApolloProviderWithFetchConfig: React.FunctionComponent<{ // Our terminating link needs to be smart enough to handle subscriptions, and if the GraphQL query // is subscription it needs to use the SSELink (server sent events link). - const httpOrSSELink = apolloClient.split( - ({ query }) => { - const definition = getMainDefinition(query) - - return ( - definition.kind === 'OperationDefinition' && - definition.operation === 'subscription' - ) - }, - new SSELink({ - url: uri, - auth: { authProviderType, tokenFn: getToken }, - httpLinkConfig, - headers, - }), - httpLink - ) + const httpOrSSELink = + typeof SSELink !== 'undefined' + ? apolloClient.split( + ({ query }) => { + const definition = getMainDefinition(query) + + return ( + definition.kind === 'OperationDefinition' && + definition.operation === 'subscription' + ) + }, + new SSELink({ + url: uri, + auth: { authProviderType, tokenFn: getToken }, + httpLinkConfig, + headers, + }), + httpLink + ) + : httpLink // The order here is important. The last link *must* be a terminating link like HttpLink or SSELink. const redwoodApolloLinks: RedwoodApolloLinks = [ diff --git a/packages/web/src/components/htmlTags.tsx b/packages/web/src/components/htmlTags.tsx index e49c3a3c10d1..a774bcc4277f 100644 --- a/packages/web/src/components/htmlTags.tsx +++ b/packages/web/src/components/htmlTags.tsx @@ -8,15 +8,25 @@ const extractFromAssetMap = (key: 'css' | 'meta') => { return null } +function addSlashIfNeeded(path: string): string { + if (path.startsWith('http') || path.startsWith('/')) { + return path + } else { + return '/' + path + } +} + /** CSS is a specialised metatag */ export const Css = ({ css }: { css: string[] }) => { - const cssLinks = css || extractFromAssetMap('css') || [] + const cssLinks = (css || extractFromAssetMap('css') || []).map( + addSlashIfNeeded + ) return ( <> {cssLinks.map((cssLink, index) => { return ( - + ) })} diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 87438585e174..b06c68cab7cd 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "baseUrl": ".", "rootDir": "src", - "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "outDir": "dist" }, "include": ["./src/**/*", "ambient.d.ts"], diff --git a/tasks/check/package.json b/tasks/check/package.json index 5b9b03b17a42..06d211582383 100644 --- a/tasks/check/package.json +++ b/tasks/check/package.json @@ -2,7 +2,7 @@ "name": "check", "private": true, "dependencies": { - "@actions/core": "1.10.0", + "@actions/core": "1.10.1", "@actions/exec": "1.1.1", "sort-package-json": "2.5.0" } diff --git a/tasks/check/yarn.lock b/tasks/check/yarn.lock index 7db249a3ff0e..eacb58b90b9e 100644 --- a/tasks/check/yarn.lock +++ b/tasks/check/yarn.lock @@ -5,13 +5,13 @@ __metadata: version: 6 cacheKey: 8c0 -"@actions/core@npm:1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" +"@actions/core@npm:1.10.1": + version: 1.10.1 + resolution: "@actions/core@npm:1.10.1" dependencies: "@actions/http-client": ^2.0.1 uuid: ^8.3.2 - checksum: 9214d1e0cf5cf2a5d48b8f3b12488c6be9f6722ea60f2397409226e8410b5a3e12e558d9b66c93469d180399865ec20180119408a1770f026bd9ecac6965fcda + checksum: 7a61446697a23dcad3545cf0634dedbdedf20ae9a0ee6ee977554589a15deb4a93593ee48a41258933d58ce0778f446b0d2c162b60750956fb75e0b9560fb832 languageName: node linkType: hard @@ -80,7 +80,7 @@ __metadata: version: 0.0.0-use.local resolution: "check@workspace:." dependencies: - "@actions/core": 1.10.0 + "@actions/core": 1.10.1 "@actions/exec": 1.1.1 sort-package-json: 2.5.0 languageName: unknown diff --git a/tasks/clean.mjs b/tasks/clean.mjs index 9264c3e0651e..f906c3861cd3 100644 --- a/tasks/clean.mjs +++ b/tasks/clean.mjs @@ -11,3 +11,8 @@ await rimraf('packages/**/dist', { ignore: 'packages/**/{fixtures,__fixtures__}/**/dist', }, }) + +// Remove all `tsconfig.tsbuildinfo` files. +await rimraf('packages/**/tsconfig.tsbuildinfo', { + glob: true, +}) diff --git a/tasks/framework-tools/frameworkSyncToProject.mjs b/tasks/framework-tools/frameworkSyncToProject.mjs index 9b21ee65bb8e..adc4ea10a9e3 100644 --- a/tasks/framework-tools/frameworkSyncToProject.mjs +++ b/tasks/framework-tools/frameworkSyncToProject.mjs @@ -49,6 +49,8 @@ const ignored = [ // esbuild emits meta.json files that we sometimes suffix. /meta.(\w*\.?)json/, + /tsconfig.tsbuildinfo/, + (filePath) => IGNORE_EXTENSIONS.some((ext) => filePath.endsWith(ext)), ] @@ -252,6 +254,9 @@ async function main() { try { logStatus(`Cleaning ${c.magenta(packageName)}...`) await rimraf(path.join(path.dirname(packageJsonPath), 'dist')) + await rimraf( + path.join(path.dirname(packageJsonPath), 'tsconfig.tsbuildinfo') + ) logStatus(`Building ${c.magenta(packageName)}...`) execSync('yarn build', { diff --git a/tasks/release/releaseCommand.mjs b/tasks/release/releaseCommand.mjs index d81b070518ce..07256cfbbfb8 100644 --- a/tasks/release/releaseCommand.mjs +++ b/tasks/release/releaseCommand.mjs @@ -413,8 +413,6 @@ async function releaseMajorOrMinor() { await $`git commit -am "chore: temporary update to workspaces"` console.log() - await removeTSConfigTSBuildInfo() - // ------------------------ try { await $`yarn lerna publish from-package` @@ -576,8 +574,6 @@ async function releasePatch() { await $`git commit -am "chore: temporary update to workspaces"` console.log() - await removeTSConfigTSBuildInfo() - // ------------------------ try { await $`yarn lerna publish from-package` @@ -793,7 +789,3 @@ async function versionDocs() { await $`git commit -m "Version docs to ${nextDocsVersion}"` await cd('../') } - -async function removeTSConfigTSBuildInfo() { - await rimraf('packages/**/dist/tsconfig.tsbuildinfo') -} diff --git a/tasks/smoke-tests/auth/tests/authChecks.spec.ts b/tasks/smoke-tests/auth/tests/authChecks.spec.ts index d5b8fa1c5632..86b4c711eb88 100644 --- a/tasks/smoke-tests/auth/tests/authChecks.spec.ts +++ b/tasks/smoke-tests/auth/tests/authChecks.spec.ts @@ -1,13 +1,17 @@ import { test, expect } from '@playwright/test' -import { loginAsTestUser, signUpTestUser } from '../../common' +import { loginAsTestUser, signUpTestUser } from '../../shared/common' -// Signs up a user before these tests +const testUser = { + email: 'testuser@bazinga.com', + password: 'test123', + fullName: 'Test User', +} test.beforeAll(async ({ browser }) => { const page = await browser.newPage() - await signUpTestUser({ page }) + await signUpTestUser({ page, ...testUser }) await page.close() }) @@ -20,7 +24,7 @@ test('useAuth hook, auth redirects checks', async ({ page }) => { `http://localhost:8910/login?redirectTo=/profile` ) - await loginAsTestUser({ page }) + await loginAsTestUser({ page, ...testUser }) await page.goto('/profile') @@ -41,14 +45,19 @@ test('useAuth hook, auth redirects checks', async ({ page }) => { '
' ) - // Log Out await page.goto('/') - await page.click('text=Log Out') - await expect(await page.locator('text=Login')).toBeTruthy() + await page.getByText('Log Out').click() + await expect(page.getByText('Log In')).toBeVisible() }) +const post = { + title: 'Hello world! Soft kittens are the best.', + body: 'Bazinga, bazinga, bazinga', + authorId: '2', +} + test('requireAuth graphql checks', async ({ page }) => { - // Create posts + // Try to create a post as an anonymous user. await createNewPost({ page }) await expect( @@ -59,48 +68,36 @@ test('requireAuth graphql checks', async ({ page }) => { await page.goto('/') - await expect( - await page - .locator('article:has-text("Hello world! Soft kittens are the best.")') - .count() - ).toBe(0) + await expect(page.getByText(post.title)).not.toBeVisible() - await loginAsTestUser({ - page, - }) + // Now log in and try again. + await loginAsTestUser({ page, ...testUser }) await createNewPost({ page }) await page.goto('/') - await expect( - await page - .locator('article:has-text("Hello world! Soft kittens are the best.")') - .first() - ).not.toBeEmpty() + + await expect(page.getByText(post.title)).toBeVisible() + + // Delete the post to keep this test idempotent. + // Clicking "Delete" opens a confirmation dialog that we havee to accept. + await page.goto('/posts') + + page.once('dialog', (dialog) => dialog.accept()) + + await page + .getByRole('row') + .filter({ has: page.getByText(post.title) }) + .getByRole('button', { name: 'Delete' }) + .click() }) async function createNewPost({ page }) { await page.goto('/posts/new') - await page.locator('input[name="title"]').click() - await page - .locator('input[name="title"]') - .fill('Hello world! Soft kittens are the best.') - await page.locator('input[name="title"]').press('Tab') - await page.locator('input[name="body"]').fill('Bazinga, bazinga, bazinga') - await page.locator('input[name="authorId"]').fill('2') - - const permissionError = page - .locator('.rw-form-error-title') - .locator(`text=You don't have permission to do that`) - - // Either wait for success and redirect - // Or get the error - await Promise.all([ - Promise.race([ - page.waitForURL('**/'), - permissionError.waitFor({ timeout: 5000 }), - ]), - await page.click('text=SAVE'), - ]) + await page.getByLabel('Title').fill(post.title) + await page.getByLabel('Body').fill(post.body) + await page.getByLabel('Author id').fill(post.authorId) + + await page.getByRole('button', { name: 'Save' }).click() } diff --git a/tasks/smoke-tests/auth/tests/rbacChecks.spec.ts b/tasks/smoke-tests/auth/tests/rbacChecks.spec.ts index 216c49e97f48..280c2ad4c820 100644 --- a/tasks/smoke-tests/auth/tests/rbacChecks.spec.ts +++ b/tasks/smoke-tests/auth/tests/rbacChecks.spec.ts @@ -3,10 +3,9 @@ import * as path from 'node:path' import { test, expect } from '@playwright/test' import type { PlaywrightTestArgs, Page } from '@playwright/test' -// @ts-expect-error - With `* as` you have to use .default() when calling execa import execa from 'execa' -import { loginAsTestUser, signUpTestUser } from '../../common' +import { loginAsTestUser, signUpTestUser } from '../../shared/common' // This is a special test that does the following // Signup a user (admin@bazinga.com), because salt/secrets won't match, we need to do this diff --git a/tasks/smoke-tests/common.ts b/tasks/smoke-tests/common.ts deleted file mode 100644 index d2ab977dddba..000000000000 --- a/tasks/smoke-tests/common.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { expect } from '@playwright/test' -import type { PlaywrightTestArgs } from '@playwright/test' - -export async function smokeTest({ page }: PlaywrightTestArgs) { - await page.goto('/') - - // Check that the blog posts are being loaded. - // Avoid checking titles because we edit them in other tests. - await page.textContent('text=Meh waistcoat succulents umami') - await page.textContent('text=Raclette shoreditch before they sold out lyft.') - await page.textContent( - 'text=baby single- origin coffee kickstarter lo - fi paleo skateboard.' - ) - - const bgBlue700 = 'rgb(29, 78, 216)' - expect( - await page - .locator('#redwood-app > header') - .evaluate((e) => window.getComputedStyle(e).backgroundColor) - ).toBe(bgBlue700) - - const textBlue400 = 'rgb(96, 165, 250)' - expect( - await page - .locator('header a') - .filter({ hasText: 'Redwood Blog' }) - .evaluate((e) => window.getComputedStyle(e).color) - ).toBe(textBlue400) - - // Click text=About - await page.click('text=About') - - expect(page.url()).toBe('http://localhost:8910/about') - - await page.textContent( - 'text=This site was created to demonstrate my mastery of Redwood: Look on my works, ye' - ) - // Click text=Contact - await page.click('text=Contact') - expect(page.url()).toBe('http://localhost:8910/contact') - - // Click text=Admin - await page.click('text=Admin') - expect(page.url()).toBe('http://localhost:8910/posts') -} - -interface AuthUtilsParams { - email?: string - password?: string - fullName?: string - page: PlaywrightTestArgs['page'] -} - -export const signUpTestUser = async ({ - page, - email = 'testuser@bazinga.com', - password = 'test123', - fullName = 'Test User', -}: AuthUtilsParams) => { - await page.goto('/signup') - - await page.locator('input[name="username"]').click() - // Fill input[name="username"] - await page.locator('input[name="username"]').fill(email) - // Press Tab - await page.locator('input[name="username"]').press('Tab') - // Fill input[name="password"] - await page.locator('input[name="password"]').fill(password) - await page.locator('input[name="full-name"]').click() - await page.locator('input[name="full-name"]').fill(fullName) - - const alreadyRegisteredErr = page.locator( - `text=Username \`${email}\` already in use` - ) - - // Either wait for signup to succeed and redirect - // Or get the username already registered error, either way is fine! - await Promise.all([ - Promise.race([ - page.waitForURL('**/'), - alreadyRegisteredErr.waitFor({ timeout: 5000 }), - ]), - page.locator('text=Sign Up').click(), - ]) - - console.log(`Signup successful for ${email}!`) -} - -export const loginAsTestUser = async ({ - page, - email = 'testuser@bazinga.com', - password = 'test123', -}: AuthUtilsParams) => { - await page.goto('/login') - - // Click input[name="username"] - await page.locator('input[name="username"]').click() - // Fill input[name="username"] - await page.locator('input[name="username"]').fill(email) - // Click input[name="password"] - await page.locator('input[name="password"]').click() - // Fill input[name="password"] - await page.locator('input[name="password"]').fill(password) - - // Click button:has-text("Login") - await Promise.all([ - page.waitForURL('**/'), - page.locator('button:has-text("Login")').click(), - ]) -} diff --git a/tasks/smoke-tests/dev/tests/dev.spec.ts b/tasks/smoke-tests/dev/tests/dev.spec.ts index c36dd405d595..17a5e003c9ef 100644 --- a/tasks/smoke-tests/dev/tests/dev.spec.ts +++ b/tasks/smoke-tests/dev/tests/dev.spec.ts @@ -1,5 +1,5 @@ import { test } from '@playwright/test' -import { smokeTest } from '../../common' +import { smokeTest } from '../../shared/common' test('Smoke test with dev server', smokeTest) diff --git a/tasks/smoke-tests/prerender/tests/prerender.spec.ts b/tasks/smoke-tests/prerender/tests/prerender.spec.ts index 77557ec35613..4dd89b0e32c5 100644 --- a/tasks/smoke-tests/prerender/tests/prerender.spec.ts +++ b/tasks/smoke-tests/prerender/tests/prerender.spec.ts @@ -7,9 +7,10 @@ import type { PlaywrightTestArgs, PlaywrightWorkerArgs, } from '@playwright/test' -// @ts-expect-error - With `* as` you have to use .default() when calling execa import execa from 'execa' +import { checkHomePageCellRender } from '../../shared/homePage' + let noJsBrowser: BrowserContext test.beforeAll(async ({ browser }: PlaywrightWorkerArgs) => { @@ -22,21 +23,7 @@ test('Check that homepage is prerendered', async () => { const pageWithoutJs = await noJsBrowser.newPage() await pageWithoutJs.goto('/') - const cellSuccessState = await pageWithoutJs.locator('main').innerHTML() - expect(cellSuccessState).toMatch(/Welcome to the blog!/) - expect(cellSuccessState).toMatch(/A little more about me/) - expect(cellSuccessState).toMatch(/What is the meaning of life\?/) - - const navTitle = await pageWithoutJs.locator('header >> h1').innerText() - expect(navTitle).toBe('Redwood Blog') - - const navLinks = await pageWithoutJs.locator('nav >> ul').innerText() - expect(navLinks.split('\n')).toEqual([ - 'About', - 'Contact Us', - 'Admin', - 'Log In', - ]) + checkHomePageCellRender(pageWithoutJs) pageWithoutJs.close() }) diff --git a/tasks/smoke-tests/rsc-external-packages/tests/rsc-external-packages.spec.ts b/tasks/smoke-tests/rsc-external-packages/tests/rsc-external-packages.spec.ts index 9d1016c4f926..f569e7763cd3 100644 --- a/tasks/smoke-tests/rsc-external-packages/tests/rsc-external-packages.spec.ts +++ b/tasks/smoke-tests/rsc-external-packages/tests/rsc-external-packages.spec.ts @@ -9,7 +9,7 @@ test('Client components should work', async ({ page }) => { await page.locator('button').filter({ hasText: 'Increment' }).click() - const count = await page.locator('p').first().innerText() + const count = await page.locator('p').nth(2).innerText() expect(count).toMatch('Count: 1') page.close() @@ -22,23 +22,21 @@ test('Submitting the form should return a response', async ({ page }) => { expect(h3).toMatch(/Hello Redwood RSAs!!/) const pageText = await page.locator('#redwood-app > div').innerText() - expect(pageText).toMatch('The form has been submitted 0 times.') + expect(pageText).toMatch('This form has been sent 0 times') await page.getByRole('textbox').fill('Hello World') await page.getByRole('button').getByText('Send').click() const submittedPageText = page.locator('#redwood-app > div') - await expect(submittedPageText).toHaveText( - /The form has been submitted 1 times./ - ) + await expect(submittedPageText).toHaveText(/This form has been sent 1 times/) // Expect an echo of our message back from the server - const echo = await page.locator('p').first().innerText() + const echo = await page.locator('p').nth(1).innerText() expect(echo).toMatch('Hello World') // Expect to get five (random) words back from the server const words = await page.locator('p').nth(1).innerText() - expect(words.split(' ')).toHaveLength(5) + expect(words.split('Hello World: ')[1].split(' ')).toHaveLength(5) page.close() }) diff --git a/tasks/smoke-tests/serve/tests/serve.spec.ts b/tasks/smoke-tests/serve/tests/serve.spec.ts index 08fbb4cd3c82..715ee04b6c1d 100644 --- a/tasks/smoke-tests/serve/tests/serve.spec.ts +++ b/tasks/smoke-tests/serve/tests/serve.spec.ts @@ -1,5 +1,5 @@ import { test } from '@playwright/test' -import { smokeTest } from '../../common' +import { smokeTest } from '../../shared/common' test('Smoke test with rw serve', smokeTest) diff --git a/tasks/smoke-tests/shared/common.ts b/tasks/smoke-tests/shared/common.ts new file mode 100644 index 000000000000..deee6af7c03b --- /dev/null +++ b/tasks/smoke-tests/shared/common.ts @@ -0,0 +1,99 @@ +import { expect } from '@playwright/test' +import type { PlaywrightTestArgs } from '@playwright/test' + +export async function smokeTest({ page }: PlaywrightTestArgs) { + await page.goto('/') + + // Check that the blog posts load. We're deliberately not checking their titles because we edit them in other tests. + await expect( + page.getByText( + 'Meh waistcoat succulents umami asymmetrical, hoodie post-ironic paleo chillwave ' + ) + ).toBeVisible() + await expect( + page.getByText( + 'Raclette shoreditch before they sold out lyft. Ethical bicycle rights meh prism ' + ) + ).toBeVisible() + await expect( + page.getByText( + "I'm baby single- origin coffee kickstarter lo - fi paleo skateboard.Tumblr hasht" + ) + ).toBeVisible() + + // CSS checks. We saw this break when we switched bundlers, so while it's not comprehensive, it's at least something. + // While playwright recommends against using locators that are too-closely tied to the DOM, `#redwood-app` is a stable ID. + const bgBlue700 = 'rgb(29, 78, 216)' + expect(page.locator('#redwood-app > header')).toHaveCSS( + 'background-color', + bgBlue700 + ) + + const textBlue400 = 'rgb(96, 165, 250)' + expect(await page.getByRole('link', { name: 'Redwood Blog' })).toHaveCSS( + 'color', + textBlue400 + ) + + // Check the about page. + await page.getByRole('link', { name: 'About', exact: true }).click() + expect(page.url()).toBe('http://localhost:8910/about') + await page.getByText( + 'This site was created to demonstrate my mastery of Redwood: Look on my works, ye' + ) + + // Check the contact us page. + await page.getByRole('link', { name: 'Contact Us' }).click() + expect(page.url()).toBe('http://localhost:8910/contact') + + // Check the admin page. + await page.getByRole('link', { name: 'Admin' }).click() + expect(page.url()).toBe('http://localhost:8910/posts') +} + +interface AuthUtilsParams { + email?: string + password?: string + fullName?: string + page: PlaywrightTestArgs['page'] +} + +export const signUpTestUser = async ({ + page, + email = 'testuser@bazinga.com', + password = 'test123', + fullName = 'Test User', +}: AuthUtilsParams) => { + await page.goto('/signup') + + await page.getByLabel('Username').fill(email) + await page.getByLabel('Password').fill(password) + await page.getByLabel('Full Name').fill(fullName) + + await page.getByRole('button', { name: 'Sign Up' }).click() + + // Wait for either... + // - signup to succeed and redirect to the home page + // - an error message to appear in a toast + await Promise.race([ + page.waitForURL('/'), + expect( + page.getByText(`Username \`${email}\` already in use`) + ).toBeVisible(), + ]) +} + +export const loginAsTestUser = async ({ + page, + email = 'testuser@bazinga.com', + password = 'test123', +}: AuthUtilsParams) => { + await page.goto('/login') + + await page.getByLabel('Username').fill(email) + await page.getByLabel('Password').fill(password) + + await page.getByRole('button', { name: 'Login' }).click() + + await page.waitForURL('/') +} diff --git a/tasks/smoke-tests/shared/delayedPage.ts b/tasks/smoke-tests/shared/delayedPage.ts new file mode 100644 index 000000000000..4b52aaf7c85f --- /dev/null +++ b/tasks/smoke-tests/shared/delayedPage.ts @@ -0,0 +1,47 @@ +import type { Page } from '@playwright/test' +import { expect } from '@playwright/test' + +export async function checkDelayedPageRendering( + page: Page, + { expectedDelay }: { expectedDelay: number } +) { + const delayedLogStatements: { message: string; time: number }[] = [] + + page.on('console', (message) => { + if (message.type() === 'log') { + const messageText = message.text() + + if (messageText.includes('delayed by')) { + delayedLogStatements.push({ + message: messageText, + time: Date.now(), + }) + } + } + }) + + await page.goto('/delayed') + + expect(delayedLogStatements.length).toBe(4) + + delayedLogStatements.forEach((log, index) => { + if (index > 0) { + const timeDiff = log.time - delayedLogStatements[index - 1].time + // If we're not expecting a delay + // Check that timeDiff is less than 300ms (with margin of error) + if (expectedDelay === 0) { + expect(timeDiff).toBeLessThan(300) + } else { + // Allow a 300ms margin of error + expect(timeDiff).toBeGreaterThan(expectedDelay - 300) + expect(timeDiff).toBeLessThan(expectedDelay + 300) + } + } + }) + + // Check that its actually rendered on the page. Important when **not** progressively rendering + await expect(page.locator('[data-test-id="delayed-text-1"]')).toHaveCount(1) + await expect(page.locator('[data-test-id="delayed-text-2"]')).toHaveCount(1) + await expect(page.locator('[data-test-id="delayed-text-3"]')).toHaveCount(1) + await expect(page.locator('[data-test-id="delayed-text-4"]')).toHaveCount(1) +} diff --git a/tasks/smoke-tests/shared/homePage.ts b/tasks/smoke-tests/shared/homePage.ts new file mode 100644 index 000000000000..dc442192999c --- /dev/null +++ b/tasks/smoke-tests/shared/homePage.ts @@ -0,0 +1,21 @@ +import { expect } from '@playwright/test' +import type { Page } from '@playwright/test' + +export async function checkHomePageCellRender(page: Page) { + const cellSuccessState = await page.locator('main').innerHTML() + + expect(cellSuccessState).toMatch(/Welcome to the blog!/) + expect(cellSuccessState).toMatch(/A little more about me/) + expect(cellSuccessState).toMatch(/What is the meaning of life\?/) + + const navTitle = await page.locator('header >> h1').innerText() + expect(navTitle).toBe('Redwood Blog') + + const navLinks = await page.locator('nav >> ul').innerText() + expect(navLinks.split('\n')).toEqual([ + 'About', + 'Contact Us', + 'Admin', + 'Log In', + ]) +} diff --git a/tasks/smoke-tests/smoke-tests.mjs b/tasks/smoke-tests/smoke-tests.mjs index 0bfb1db7c46f..fddbe1b0c708 100644 --- a/tasks/smoke-tests/smoke-tests.mjs +++ b/tasks/smoke-tests/smoke-tests.mjs @@ -64,7 +64,7 @@ async function main() { .readdirSync(path.dirname(fileURLToPath(import.meta.url)), { withFileTypes: true, }) - .filter((dirent) => dirent.isDirectory()) + .filter((dirent) => dirent.isDirectory() && dirent.name !== 'shared') .map((dirent) => dirent.name) if (smokeTest === undefined) { diff --git a/tasks/smoke-tests/streaming-ssr-dev/playwright.config.ts b/tasks/smoke-tests/streaming-ssr-dev/playwright.config.ts new file mode 100644 index 000000000000..b188c0d86434 --- /dev/null +++ b/tasks/smoke-tests/streaming-ssr-dev/playwright.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from '@playwright/test' + +import { basePlaywrightConfig } from '../basePlaywright.config' + +// See https://playwright.dev/docs/test-configuration#global-configuration +export default defineConfig({ + ...basePlaywrightConfig, + use: { + baseURL: 'http://localhost:8910', + // headless: false, + }, + + // Run your local dev server before starting the tests + webServer: { + command: 'yarn redwood dev --no-generate --fwd="--no-open"', + cwd: process.env.REDWOOD_TEST_PROJECT_PATH, + url: 'http://localhost:8910', + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, +}) diff --git a/tasks/smoke-tests/streaming-ssr-dev/tests/progressiveRendering.spec.ts b/tasks/smoke-tests/streaming-ssr-dev/tests/progressiveRendering.spec.ts new file mode 100644 index 000000000000..0f630a02bae9 --- /dev/null +++ b/tasks/smoke-tests/streaming-ssr-dev/tests/progressiveRendering.spec.ts @@ -0,0 +1,85 @@ +import { setTimeout } from 'node:timers/promises' + +import type { Page } from '@playwright/test' +import { expect, test } from '@playwright/test' + +import { checkHomePageCellRender } from '../../shared/homePage' + +let pageWithClientBlocked: Page + +test.beforeAll(async ({ browser }) => { + const page = await browser.newPage() + + // Disable loading of client-side JS + await page.route('**/entry.client.{js,tsx,ts,jsx}', (route) => route.abort()) + await page.route('**/App.{js,tsx,ts,jsx}', (route) => route.abort()) + await page.route('**/index.*.{js,tsx,ts,jsx}', (route) => route.abort()) + + pageWithClientBlocked = page +}) + +test.afterAll(() => { + pageWithClientBlocked.close() +}) + +test('Check that homepage has content rendered from the server (progressively)', async () => { + await pageWithClientBlocked.goto('/') + + // @NOTE: It shows loading when the fetch fails, so client side can recover. + const apiServerLoading = pageWithClientBlocked.getByText('Loading...') + + while (await apiServerLoading.isVisible()) { + await pageWithClientBlocked.reload() + await setTimeout(500) + } + + // Appears when Cell is successfully rendered + await pageWithClientBlocked.waitForSelector('article') + + await checkHomePageCellRender(pageWithClientBlocked) +}) + +test('Check delayed page has content progressively rendered', async () => { + const delayedLogStatements: { message: string; time: number }[] = [] + + pageWithClientBlocked.on('console', (message) => { + if (message.type() === 'log') { + const messageText = message.text() + + if (messageText.includes('delayed by')) { + delayedLogStatements.push({ + message: messageText, + time: Date.now(), + }) + } + } + }) + + await pageWithClientBlocked.goto('/delayed') + + expect(delayedLogStatements.length).toBe(4) + + delayedLogStatements.forEach((log, index) => { + if (index > 0) { + const timeDiff = log.time - delayedLogStatements[index - 1].time + + // With room for error, approximately 1 second + expect(timeDiff).toBeGreaterThan(600) + expect(timeDiff).toBeLessThan(1400) + } + }) + + // Check that its actually rendered on the page. Important when **not** progressively rendering + await expect( + pageWithClientBlocked.locator('[data-test-id="delayed-text-1"]') + ).toHaveCount(1) + await expect( + pageWithClientBlocked.locator('[data-test-id="delayed-text-2"]') + ).toHaveCount(1) + await expect( + pageWithClientBlocked.locator('[data-test-id="delayed-text-3"]') + ).toHaveCount(1) + await expect( + pageWithClientBlocked.locator('[data-test-id="delayed-text-4"]') + ).toHaveCount(1) +}) diff --git a/tasks/smoke-tests/streaming-ssr-prod/playwright.config.ts b/tasks/smoke-tests/streaming-ssr-prod/playwright.config.ts new file mode 100644 index 000000000000..29c14c8da4a3 --- /dev/null +++ b/tasks/smoke-tests/streaming-ssr-prod/playwright.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from '@playwright/test' + +import { basePlaywrightConfig } from '../basePlaywright.config' + +// See https://playwright.dev/docs/test-configuration#global-configuration +export default defineConfig({ + ...basePlaywrightConfig, + use: { + baseURL: 'http://localhost:8910', + // headless: false, + }, + + // Run your local dev server before starting the tests + webServer: { + command: 'yarn redwood serve', + cwd: process.env.REDWOOD_TEST_PROJECT_PATH, + url: 'http://localhost:8910', + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, +}) diff --git a/tasks/smoke-tests/streaming-ssr-prod/tests/botRendering.spec.ts b/tasks/smoke-tests/streaming-ssr-prod/tests/botRendering.spec.ts new file mode 100644 index 000000000000..59619645f3bc --- /dev/null +++ b/tasks/smoke-tests/streaming-ssr-prod/tests/botRendering.spec.ts @@ -0,0 +1,49 @@ +import { test } from '@playwright/test' + +import { checkDelayedPageRendering } from '../../shared/delayedPage' +import { checkHomePageCellRender } from '../../shared/homePage' + +// UA taken from https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers +const BOT_USERAGENT = + 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36' + +test('Check that homepage has content fully rendered from the server, without JS', async ({ + browser, +}) => { + const botContext = await browser.newContext({ + userAgent: BOT_USERAGENT, + // Even without JS, this should be a fully rendered page + javaScriptEnabled: false, + }) + + const botPageNoJs = await botContext.newPage() + + await botPageNoJs.goto('/') + + // Appears when Cell is successfully rendered + await botPageNoJs.waitForSelector('article') + + await checkHomePageCellRender(botPageNoJs) + + await botPageNoJs.close() +}) + +test('Check delayed page is NOT progressively rendered', async ({ + browser, +}) => { + // For this test we need to enable JS, but block all client side scripts + // So that we can check that expected delay is 0 + const botContext = await browser.newContext({ + userAgent: BOT_USERAGENT, + }) + + const botPageNoBundle = await botContext.newPage() + + await botPageNoBundle.route('**/*.*.{js,tsx,ts,jsx}', (route) => + route.abort() + ) + + await checkDelayedPageRendering(botPageNoBundle, { + expectedDelay: 0, + }) +}) diff --git a/tasks/smoke-tests/streaming-ssr-prod/tests/progressiveRendering.spec.ts b/tasks/smoke-tests/streaming-ssr-prod/tests/progressiveRendering.spec.ts new file mode 100644 index 000000000000..f95495dc915c --- /dev/null +++ b/tasks/smoke-tests/streaming-ssr-prod/tests/progressiveRendering.spec.ts @@ -0,0 +1,37 @@ +import type { Page } from '@playwright/test' +import { test } from '@playwright/test' + +import { checkDelayedPageRendering } from '../../shared/delayedPage' +import { checkHomePageCellRender } from '../../shared/homePage' + +let pageWithClientBlocked: Page + +test.beforeAll(async ({ browser }) => { + const page = await browser.newPage() + + // Disable loading of client-side JS + // Note that we don't want to disable JS entirely, because progressive rendering + // requires JS injected in
Is Adminfalse