From f22dfbeda624dfb80ce54fde59329f155f29f2e9 Mon Sep 17 00:00:00 2001 From: Tobbe Lundberg Date: Thu, 6 Jul 2023 22:28:32 +0200 Subject: [PATCH] React Server Components (RSC) (#8451) # Initial PR to add React Server Components support to Redwood RSC support is far from complete. But a simple test app is working! See screenshot below ![image](https://github.com/redwoodjs/redwood/assets/30793/b8a52420-f726-4aa9-8b5e-6956c1b4aed4) ## How to try this code * Check out this PR (`gh pr checkout 8451`) * `git clean -fdx && yarn && yarn build` * `yarn build:test-project --link ~/tmp/rw-rsc-test` * `cd ~/tmp/rw-rsc-test` * `yarn rw experimental setup-streaming-ssr`. Allow it to overwrite entry.client.tsx Now you need to add a new file, `web/src/entries.ts` ```ts export type GetEntry = (rscId: string) => Promise< | React.FunctionComponent | { default: React.FunctionComponent } | null > export function defineEntries(getEntry: GetEntry) { return { getEntry, } } export default defineEntries( // getEntry async (id) => { switch (id) { case 'App': return import('./App') default: return null } } ) ``` Update `web/src/App.tsx` to look like this ```tsx import { Counter } from './Counter' const App = ({ name = 'Anonymous' }) => { return (

Hello {name}!!

This is a server component.

) } export default App ``` And add `web/src/Counter.tsx` ```tsx 'use client' import React from 'react' export const Counter = () => { const [count, setCount] = React.useState(0) return (

Count: {count}

This is a client component.

) } ``` Make these changes in `entry.client.tsx` ```diff --- a/web/src/entry.client.tsx +++ b/web/src/entry.client.tsx @@ -1,12 +1,9 @@ import { hydrateRoot, createRoot } from 'react-dom/client' +import { serve } from '@redwoodjs/vite/client' // TODO (STREAMING) This was marked "temporary workaround" // Need to figure out why it's a temporary workaround and what we // should do instead. -import { ServerContextProvider } from '@redwoodjs/web/dist/serverContext' - -import App from './App' -import { Document } from './Document' /** * When `#redwood-app` isn't empty then it's very likely that you're using @@ -16,23 +13,12 @@ import { Document } from './Document' */ const redwoodAppElement = document.getElementById('redwood-app') +const App = serve('App') + if (redwoodAppElement.children?.length > 0) { - hydrateRoot( - document, - - - - - - ) + hydrateRoot(redwoodAppElement, ) } else { console.log('Rendering from scratch') - const root = createRoot(document) - root.render( - - - - - - ) + const root = createRoot(redwoodAppElement) + root.render() } ``` Add `entry.client.tsx` to `index.html` ```diff --- a/web/src/index.html +++ b/web/src/index.html @@ -5,6 +5,7 @@ + ``` Remove the redwood plugin from `vite.config.ts` ```diff --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -6,10 +6,10 @@ import { defineConfig, UserConfig } from 'vite' // So that Vite will load on local instead of 127.0.0.1 dns.setDefaultResultOrder('verbatim') -import redwood from '@redwoodjs/vite' +// import redwood from '@redwoodjs/vite' const viteConfig: UserConfig = { - plugins: [redwood()], + // plugins: [redwood()], } export default defineConfig(viteConfig) ``` **Build** `node ./node_modules/@redwoodjs/vite/dist/buildRscFeServer.js` **Serve** `node --conditions react-server ./node_modules/@redwoodjs/vite/dist/runRscFeServer.js` --- packages/vite/ambient.d.ts | 1 + packages/vite/bins/rw-vite-build.mjs | 2 +- packages/vite/modules.d.ts | 5 + packages/vite/package.json | 21 +- packages/vite/src/buildRscFeServer.ts | 327 ++++ packages/vite/src/client.ts | 108 ++ .../react-server-dom-webpack/node-loader.ts | 582 +++++++ packages/vite/src/runRscFeServer.ts | 186 ++ packages/vite/src/waku-lib/build-server.ts | 82 + packages/vite/src/waku-lib/builder.ts | 185 ++ packages/vite/src/waku-lib/config.ts | 41 + .../vite/src/waku-lib/rsc-handler-worker.ts | 450 +++++ packages/vite/src/waku-lib/rsc-handler.ts | 149 ++ packages/vite/src/waku-lib/rsc-utils.ts | 79 + packages/vite/src/waku-lib/vite-plugin-rsc.ts | 171 ++ packages/vite/src/waku-server.ts | 27 + packages/vite/tsconfig.json | 6 +- packages/web/src/global.web-auto-imports.ts | 5 +- yarn.lock | 1503 +++++++++++------ 19 files changed, 3409 insertions(+), 521 deletions(-) create mode 100644 packages/vite/modules.d.ts create mode 100644 packages/vite/src/buildRscFeServer.ts create mode 100644 packages/vite/src/client.ts create mode 100644 packages/vite/src/react-server-dom-webpack/node-loader.ts create mode 100644 packages/vite/src/runRscFeServer.ts create mode 100644 packages/vite/src/waku-lib/build-server.ts create mode 100644 packages/vite/src/waku-lib/builder.ts create mode 100644 packages/vite/src/waku-lib/config.ts create mode 100644 packages/vite/src/waku-lib/rsc-handler-worker.ts create mode 100644 packages/vite/src/waku-lib/rsc-handler.ts create mode 100644 packages/vite/src/waku-lib/rsc-utils.ts create mode 100644 packages/vite/src/waku-lib/vite-plugin-rsc.ts create mode 100644 packages/vite/src/waku-server.ts diff --git a/packages/vite/ambient.d.ts b/packages/vite/ambient.d.ts index 3814acb97c3d..64c58d8e3a00 100644 --- a/packages/vite/ambient.d.ts +++ b/packages/vite/ambient.d.ts @@ -1,4 +1,5 @@ /* eslint-disable no-var */ +/// declare global { var RWJS_ENV: { diff --git a/packages/vite/bins/rw-vite-build.mjs b/packages/vite/bins/rw-vite-build.mjs index c4380ada75ed..158e57b75905 100755 --- a/packages/vite/bins/rw-vite-build.mjs +++ b/packages/vite/bins/rw-vite-build.mjs @@ -4,7 +4,7 @@ import yargsParser from 'yargs-parser' import { buildWeb } from '@redwoodjs/internal/dist/build/web.js' import { getConfig, getPaths } from '@redwoodjs/project-config' -import { buildFeServer } from '@redwoodjs/vite/dist/buildFeServer.js' +import { buildFeServer } from '@redwoodjs/vite/buildFeServer' const rwPaths = getPaths() diff --git a/packages/vite/modules.d.ts b/packages/vite/modules.d.ts new file mode 100644 index 000000000000..d10c6a02532b --- /dev/null +++ b/packages/vite/modules.d.ts @@ -0,0 +1,5 @@ +declare module 'react-server-dom-webpack/node-loader' +declare module 'react-server-dom-webpack/server' +declare module 'react-server-dom-webpack/server.node.unbundled' +declare module 'react-server-dom-webpack/client' +declare module 'acorn-loose' diff --git a/packages/vite/package.json b/packages/vite/package.json index 25b8b9dfdc18..20dcd56c379e 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -12,7 +12,21 @@ "dist", "inject" ], - "main": "dist/index.js", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./client": { + "types": "./dist/client.d.ts", + "default": "./dist/client.js" + }, + "./buildFeServer": { + "types": "./dist/buildFeServer.d.ts", + "default": "./dist/buildFeServer.js" + } + }, "bin": { "rw-dev-fe": "./dist/devFeServer.js", "rw-serve-fe": "./dist/runFeServer.js", @@ -33,13 +47,17 @@ "@redwoodjs/internal": "5.0.0", "@redwoodjs/project-config": "5.0.0", "@redwoodjs/web": "5.0.0", + "@swc/core": "1.3.60", "@vitejs/plugin-react": "4.0.1", + "acorn-loose": "^8.3.0", "buffer": "6.0.3", "core-js": "3.31.0", "dotenv-defaults": "5.0.2", "express": "4.18.2", "http-proxy-middleware": "2.0.6", "isbot": "3.6.8", + "react": "18.3.0-canary-035a41c4e-20230704", + "react-server-dom-webpack": "18.3.0-canary-035a41c4e-20230704", "vite": "4.3.9", "vite-plugin-environment": "1.1.3", "yargs-parser": "21.1.1" @@ -47,6 +65,7 @@ "devDependencies": { "@babel/cli": "7.22.5", "@types/express": "4", + "@types/react": "18.2.14", "@types/yargs-parser": "21.0.0", "glob": "10.3.1", "jest": "29.5.0", diff --git a/packages/vite/src/buildRscFeServer.ts b/packages/vite/src/buildRscFeServer.ts new file mode 100644 index 000000000000..4a42d3ef783f --- /dev/null +++ b/packages/vite/src/buildRscFeServer.ts @@ -0,0 +1,327 @@ +import fs from 'fs/promises' +import path from 'path' + +import react from '@vitejs/plugin-react' +import { build as viteBuild } from 'vite' +import type { Manifest as ViteBuildManifest } from 'vite' + +import { RouteSpec } from '@redwoodjs/internal/dist/routes' +import { getAppRouteHook, getPaths } from '@redwoodjs/project-config' + +import { RWRouteManifest } from './types' +import { serverBuild } from './waku-lib/build-server' +import { rscAnalyzePlugin, rscIndexPlugin } from './waku-lib/vite-plugin-rsc' + +interface BuildOptions { + verbose?: boolean +} + +export const buildFeServer = async ({ verbose: _verbose }: BuildOptions) => { + const rwPaths = getPaths() + + const clientEntryFileSet = new Set() + const serverEntryFileSet = new Set() + + /** + * RSC build + * Uses rscAnalyzePlugin to collect client and server entry points + * Starts building the AST in entries.ts + * Doesn't output any files, only collects a list of RSCs and RSFs + */ + await viteBuild({ + // ...configFileConfig, + root: rwPaths.base, + plugins: [ + react(), + { + name: 'rsc-test-plugin', + transform(_code, id) { + console.log('rsc-test-plugin id', id) + }, + }, + rscAnalyzePlugin( + (id) => clientEntryFileSet.add(id), + (id) => serverEntryFileSet.add(id) + ), + ], + // ssr: { + // // FIXME Without this, waku/router isn't considered to have client + // // entries, and "No client entry" error occurs. + // // Unless we fix this, RSC-capable packages aren't supported. + // // This also seems to cause problems with pnpm. + // // noExternal: ['@redwoodjs/web', '@redwoodjs/router'], + // }, + build: { + write: false, + ssr: true, + rollupOptions: { + input: { + // entries: rwPaths.web.entryServer, + entries: path.join(rwPaths.web.src, 'entries.ts'), + }, + }, + }, + }) + + const clientEntryFiles = Object.fromEntries( + Array.from(clientEntryFileSet).map((filename, i) => [`rsc${i}`, filename]) + ) + const serverEntryFiles = Object.fromEntries( + Array.from(serverEntryFileSet).map((filename, i) => [`rsf${i}`, filename]) + ) + + console.log('clientEntryFileSet', Array.from(clientEntryFileSet)) + console.log('serverEntryFileSet', Array.from(serverEntryFileSet)) + console.log('clientEntryFiles', clientEntryFiles) + console.log('serverEntryFiles', serverEntryFiles) + + const clientEntryPath = rwPaths.web.entryClient + + if (!clientEntryPath) { + throw new Error( + 'Vite client entry point not found. Please check that your project ' + + 'has an entry.client.{jsx,tsx} file in the web/src directory.' + ) + } + + const clientBuildOutput = await viteBuild({ + // ...configFileConfig, + root: rwPaths.web.src, + plugins: [ + // TODO (RSC) Update index.html to include the entry.client.js script + // TODO (RSC) Do the above in the exp-rsc setup command + // { + // name: 'redwood-plugin-vite', + + // // ---------- Bundle injection ---------- + // // Used by rollup during build to inject the entrypoint + // // but note index.html does not come through as an id during dev + // transform: (code: string, id: string) => { + // if ( + // existsSync(clientEntryPath) && + // // TODO (RSC) Is this even needed? We throw if we can't find it above + // // TODO (RSC) Consider making this async (if we do need it) + // normalizePath(id) === normalizePath(rwPaths.web.html) + // ) { + // const newCode = code.replace( + // '', + // '' + // ) + // + // return { code: newCode, map: null } + // } else { + // // Returning null as the map preserves the original sourcemap + // return { code, map: null } + // } + // }, + // }, + react(), + rscIndexPlugin(), + ], + build: { + outDir: rwPaths.web.dist, + emptyOutDir: true, // Needed because `outDir` is not inside `root` + // TODO (RSC) Enable this when we switch to a server-first approach + // emptyOutDir: false, // Already done when building server + rollupOptions: { + input: { + main: rwPaths.web.html, + ...clientEntryFiles, + }, + preserveEntrySignatures: 'exports-only', + }, + manifest: 'build-manifest.json', + }, + esbuild: { + logLevel: 'debug', + }, + }) + + if (!('output' in clientBuildOutput)) { + throw new Error('Unexpected vite client build output') + } + + const serverBuildOutput = await serverBuild( + // rwPaths.web.entryServer, + path.join(rwPaths.web.src, 'entries.ts'), + clientEntryFiles, + serverEntryFiles, + {} + ) + + const clientEntries: Record = {} + for (const item of clientBuildOutput.output) { + const { name, fileName } = item + const entryFile = + name && + serverBuildOutput.output.find( + (item) => + 'moduleIds' in item && + item.moduleIds.includes(clientEntryFiles[name] as string) + )?.fileName + if (entryFile) { + clientEntries[entryFile] = fileName + } + } + + console.log('clientEntries', clientEntries) + + await fs.appendFile( + path.join(rwPaths.web.distServer, 'entries.js'), + `export const clientEntries=${JSON.stringify(clientEntries)};` + ) + + // // Step 1A: Generate the client bundle + // await buildWeb({ verbose }) + + // const rollupInput = { + // entries: rwPaths.web.entryServer, + // ...clientEntryFiles, + // ...serverEntryFiles, + // } + + // Step 1B: Generate the server output + // await build({ + // // TODO (RSC) I had this marked as 'FIXME'. I guess I just need to make + // // sure we still include it, or at least make it possible for users to pass + // // in their own config + // // configFile: viteConfig, + // ssr: { + // noExternal: Array.from(clientEntryFileSet).map( + // // TODO (RSC) I think the comment below is from waku. We don't care + // // about pnpm, do we? Does it also affect yarn? + // // FIXME this might not work with pnpm + // // TODO (RSC) No idea what's going on here + // (filename) => { + // const nodeModulesPath = path.join(rwPaths.base, 'node_modules') + // console.log('nodeModulesPath', nodeModulesPath) + // const relativePath = path.relative(nodeModulesPath, filename) + // console.log('relativePath', relativePath) + // console.log('first split', relativePath.split('/')[0]) + + // return relativePath.split('/')[0] + // } + // ), + // }, + // build: { + // // Because we configure the root to be web/src, we need to go up one level + // outDir: rwPaths.web.distServer, + // // TODO (RSC) Maybe we should re-enable this. I can't remember anymore) + // // What does 'ssr' even mean? + // // ssr: rwPaths.web.entryServer, + // rollupOptions: { + // input: { + // // TODO (RSC) entries: rwPaths.web.entryServer, + // ...clientEntryFiles, + // ...serverEntryFiles, + // }, + // output: { + // banner: (chunk) => { + // console.log('chunk', chunk) + + // // HACK to bring directives to the front + // let code = '' + + // if (chunk.moduleIds.some((id) => clientEntryFileSet.has(id))) { + // code += '"use client";' + // } + + // if (chunk.moduleIds.some((id) => serverEntryFileSet.has(id))) { + // code += '"use server";' + // } + + // console.log('code', code) + // return code + // }, + // entryFileNames: (chunkInfo) => { + // console.log('chunkInfo', chunkInfo) + + // // TODO (RSC) Don't hardcode 'entry.server' + // if (chunkInfo.name === 'entry.server') { + // return '[name].js' + // } + + // return 'assets/[name].js' + // }, + // }, + // }, + // }, + // envFile: false, + // logLevel: verbose ? 'info' : 'warn', + // }) + + // Step 3: Generate route-manifest.json + + // TODO When https://github.com/tc39/proposal-import-attributes and + // https://github.com/microsoft/TypeScript/issues/53656 have both landed we + // should try to do this instead: + // const clientBuildManifest: ViteBuildManifest = await import( + // path.join(getPaths().web.dist, 'build-manifest.json'), + // { with: { type: 'json' } } + // ) + // NOTES: + // * There's a related babel plugin here + // https://babeljs.io/docs/babel-plugin-syntax-import-attributes + // * Included in `preset-env` if you set `shippedProposals: true` + // * We had this before, but with `assert` instead of `with`. We really + // should be using `with`. See motivation in issues linked above. + // * With `assert` and `@babel/plugin-syntax-import-assertions` the + // code compiled and ran properly, but Jest tests failed, complaining + // about the syntax. + const manifestPath = path.join(getPaths().web.dist, 'build-manifest.json') + const buildManifestStr = await fs.readFile(manifestPath, 'utf-8') + const clientBuildManifest: ViteBuildManifest = JSON.parse(buildManifestStr) + + // TODO (RSC) We don't have support for a router yet, so skip all routes + const routesList = [] as RouteSpec[] // getProjectRoutes() + + // This is all a no-op for now + const routeManifest = routesList.reduce((acc, route) => { + acc[route.path] = { + name: route.name, + bundle: route.relativeFilePath + ? clientBuildManifest[route.relativeFilePath].file + : null, + matchRegexString: route.matchRegexString, + // NOTE this is the path definition, not the actual path + // E.g. /blog/post/{id:Int} + pathDefinition: route.path, + hasParams: route.hasParams, + routeHooks: FIXME_constructRouteHookPath(route.routeHooks), + redirect: route.redirect + ? { + to: route.redirect?.to, + permanent: false, + } + : null, + renderMode: route.renderMode, + } + + return acc + }, {}) + + await fs.writeFile(rwPaths.web.routeManifest, JSON.stringify(routeManifest)) +} + +// TODO (STREAMING) Hacky work around because when you don't have a App.routeHook, esbuild doesn't create +// the pages folder in the dist/server/routeHooks directory. +// @MARK need to change to .mjs here if we use esm +const FIXME_constructRouteHookPath = (rhSrcPath: string | null | undefined) => { + const rwPaths = getPaths() + if (!rhSrcPath) { + return null + } + + if (getAppRouteHook()) { + return path.relative(rwPaths.web.src, rhSrcPath).replace('.ts', '.js') + } else { + return path + .relative(path.join(rwPaths.web.src, 'pages'), rhSrcPath) + .replace('.ts', '.js') + } +} + +if (require.main === module) { + const verbose = process.argv.includes('--verbose') + buildFeServer({ verbose }) +} diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts new file mode 100644 index 000000000000..af3c5fa503c4 --- /dev/null +++ b/packages/vite/src/client.ts @@ -0,0 +1,108 @@ +import { cache, use, useEffect, useState } from 'react' +import type { ReactElement } from 'react' + +import { createFromFetch, encodeReply } from 'react-server-dom-webpack/client' + +export function serve(rscId: string, basePath = '/RSC/') { + type SetRerender = ( + rerender: (next: [ReactElement, string]) => void + ) => () => void + const fetchRSC = cache( + (serializedProps: string): readonly [React.ReactElement, SetRerender] => { + console.log('fetchRSC serializedProps', serializedProps) + + let rerender: ((next: [ReactElement, string]) => void) | undefined + const setRerender: SetRerender = (fn) => { + rerender = fn + return () => { + rerender = undefined + } + } + + const searchParams = new URLSearchParams() + searchParams.set('props', serializedProps) + + const options = { + async callServer(rsfId: string, args: unknown[]) { + const isMutating = !!mutationMode + const searchParams = new URLSearchParams() + searchParams.set('action_id', rsfId) + let id: string + if (isMutating) { + id = rscId + searchParams.set('props', serializedProps) + } else { + id = '_' + } + const response = fetch(basePath + id + '/' + searchParams, { + method: 'POST', + body: await encodeReply(args), + }) + const data = createFromFetch(response, options) + if (isMutating) { + rerender?.([data, serializedProps]) + } + return data + }, + } + + const prefetched = (globalThis as any).__WAKU_PREFETCHED__?.[rscId]?.[ + serializedProps + ] + + console.log( + 'fetchRSC before createFromFetch', + basePath + rscId + '/' + searchParams + ) + const data = createFromFetch( + prefetched || fetch(basePath + rscId + '/' + searchParams), + options + ) + console.log('fetchRSC after createFromFetch. data:', data) + return [data, setRerender] + } + ) + + // Create temporary client component that wraps the ServerComponent returned + // by the `createFromFetch` call. + const ServerComponent = (props: Props) => { + console.log('ServerComponent props', props) + + // FIXME we blindly expect JSON.stringify usage is deterministic + const serializedProps = JSON.stringify(props || {}) + const [data, setRerender] = fetchRSC(serializedProps) + const [state, setState] = useState< + [dataToOverride: ReactElement, lastSerializedProps: string] | undefined + >() + + // MARK Should this be useLayoutEffect? + useEffect(() => setRerender(setState), [setRerender]) + + let dataToReturn = data + + if (state) { + if (state[1] === serializedProps) { + dataToReturn = state[0] + } else { + setState(undefined) + } + } + + // FIXME The type error + // "Cannot read properties of null (reading 'alternate')" + // is caused with startTransition. + // Not sure if it's a React bug or our misusage. + // For now, using `use` seems to fix it. Is it a correct fix? + return use(dataToReturn as any) as typeof dataToReturn + } + + return ServerComponent +} + +let mutationMode = 0 + +export function mutate(fn: () => void) { + ++mutationMode + fn() + --mutationMode +} diff --git a/packages/vite/src/react-server-dom-webpack/node-loader.ts b/packages/vite/src/react-server-dom-webpack/node-loader.ts new file mode 100644 index 000000000000..565d126e8f0c --- /dev/null +++ b/packages/vite/src/react-server-dom-webpack/node-loader.ts @@ -0,0 +1,582 @@ +/** + * @license React + * react-server-dom-webpack-node-loader.production.min.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Copied from https://github.com/facebook/react/blob/8ec962d825fc948ffda5ab863e639cd4158935ba/packages/react-server-dom-webpack/src/ReactFlightWebpackNodeLoader.js +// and converted to TypeScript. + +import * as acorn from 'acorn-loose' + +interface ResolveContext { + parentURL: string | void + conditions: Array +} + +export type ResolveFunction = ( + specifier: string, + context: ResolveContext, + resolveFunction: ResolveFunction +) => { url: string } | Promise<{ url: string }> + +interface GetSourceContext { + format: string +} + +type GetSourceFunction = ( + url: string, + context: GetSourceContext, + getSourceFunction: GetSourceFunction +) => Promise<{ source: Source }> + +interface TransformSourceContext { + format: string + url: string +} + +type TransformSourceFunction = ( + source: Source, + context: TransformSourceContext, + transformSourceFunction: TransformSourceFunction +) => Promise<{ source: Source }> + +interface LoadContext { + conditions: Array + format: string | null | void + importAssertions: object +} + +type LoadFunction = ( + url: string, + loadContext: LoadContext | null, + loadFunction: LoadFunction +) => Promise<{ format: string; shortCircuit?: boolean; source: Source }> + +// This is the official type, but the code below throws if it isn't a string. +// Tightening the type to string is required for interop with Vite (Rollup). +// type Source = string | ArrayBuffer | Uint8Array +type Source = string + +let warnedAboutConditionsFlag = false + +let stashedGetSource: null | GetSourceFunction = null +let stashedResolve: null | ResolveFunction = null + +export async function resolve( + specifier: string, + context: ResolveContext, + defaultResolve: ResolveFunction +): Promise<{ url: string }> { + // We stash this in case we end up needing to resolve export * statements later. + stashedResolve = defaultResolve + + if (!context.conditions.includes('react-server')) { + context = { + ...context, + conditions: [...context.conditions, 'react-server'], + } + + if (!warnedAboutConditionsFlag) { + warnedAboutConditionsFlag = true + + console.warn( + 'You did not run Node.js with the `--conditions react-server` flag. ' + + 'Any "react-server" override will only work with ESM imports.' + ) + } + } + + return await defaultResolve(specifier, context, defaultResolve) +} + +export async function getSource( + url: string, + context: GetSourceContext, + defaultGetSource: GetSourceFunction +): Promise<{ source: Source }> { + // We stash this in case we end up needing to resolve export * statements later. + stashedGetSource = defaultGetSource + return defaultGetSource(url, context, defaultGetSource) +} + +function addLocalExportedNames(names: Map, node: any) { + switch (node.type) { + case 'Identifier': + names.set(node.name, node.name) + return + + case 'ObjectPattern': + for (let i = 0; i < node.properties.length; i++) { + addLocalExportedNames(names, node.properties[i]) + } + + return + + case 'ArrayPattern': + for (let i = 0; i < node.elements.length; i++) { + const element = node.elements[i] + if (element) { + addLocalExportedNames(names, element) + } + } + + return + + case 'Property': + addLocalExportedNames(names, node.value) + return + + case 'AssignmentPattern': + addLocalExportedNames(names, node.left) + return + + case 'RestElement': + addLocalExportedNames(names, node.argument) + return + + case 'ParenthesizedExpression': + addLocalExportedNames(names, node.expression) + return + } +} + +function transformServerModule( + source: string, + body: any, + url: string, + _loader?: LoadFunction +): string { + // If the same local name is exported more than once, we only need one of the names. + const localNames = new Map() + const localTypes = new Map() + + for (let i = 0; i < body.length; i++) { + const node = body[i] + + switch (node.type) { + case 'ExportAllDeclaration': + // If export * is used, the other file needs to explicitly opt into "use server" too. + break + + case 'ExportDefaultDeclaration': + if (node.declaration.type === 'Identifier') { + localNames.set(node.declaration.name, 'default') + } else if (node.declaration.type === 'FunctionDeclaration') { + if (node.declaration.id) { + localNames.set(node.declaration.id.name, 'default') + localTypes.set(node.declaration.id.name, 'function') + } + } + + continue + + case 'ExportNamedDeclaration': + if (node.declaration) { + if (node.declaration.type === 'VariableDeclaration') { + const declarations = node.declaration.declarations + + for (let j = 0; j < declarations.length; j++) { + addLocalExportedNames(localNames, declarations[j].id) + } + } else { + const name = node.declaration.id.name + localNames.set(name, name) + + if (node.declaration.type === 'FunctionDeclaration') { + localTypes.set(name, 'function') + } + } + } + + if (node.specifiers) { + const specifiers = node.specifiers + + for (let j = 0; j < specifiers.length; j++) { + const specifier = specifiers[j] + localNames.set(specifier.local.name, specifier.exported.name) + } + } + + continue + } + } + + let newSrc = source + '\n\n;' + localNames.forEach(function (exported, local) { + if (localTypes.get(local) !== 'function') { + // We first check if the export is a function and if so annotate it. + newSrc += 'if (typeof ' + local + ' === "function") ' + } + + newSrc += 'Object.defineProperties(' + local + ',{' + newSrc += '$$typeof: {value: Symbol.for("react.server.reference")},' + newSrc += '$$id: {value: ' + JSON.stringify(url + '#' + exported) + '},' + newSrc += '$$bound: { value: null }' + newSrc += '});\n' + }) + return newSrc +} + +function addExportNames(names: Array, node: any) { + switch (node.type) { + case 'Identifier': + names.push(node.name) + return + + case 'ObjectPattern': + for (let i = 0; i < node.properties.length; i++) { + addExportNames(names, node.properties[i]) + } + + return + + case 'ArrayPattern': + for (let i = 0; i < node.elements.length; i++) { + const element = node.elements[i] + if (element) { + addExportNames(names, element) + } + } + + return + + case 'Property': + addExportNames(names, node.value) + return + + case 'AssignmentPattern': + addExportNames(names, node.left) + return + + case 'RestElement': + addExportNames(names, node.argument) + return + + case 'ParenthesizedExpression': + addExportNames(names, node.expression) + return + } +} + +function resolveClientImport( + specifier: string, + parentURL: string +): { url: string } | Promise<{ url: string }> { + // Resolve an import specifier as if it was loaded by the client. This doesn't use + // the overrides that this loader does but instead reverts to the default. + // This resolution algorithm will not necessarily have the same configuration + // as the actual client loader. It should mostly work and if it doesn't you can + // always convert to explicit exported names instead. + const conditions = ['node', 'import'] + + if (stashedResolve === null) { + throw new Error( + 'Expected resolve to have been called before transformSource' + ) + } + + return stashedResolve( + specifier, + { + conditions, + parentURL, + }, + stashedResolve + ) +} + +async function parseExportNamesInto( + body: any, + names: Array, + parentURL: string, + loader: LoadFunction +): Promise { + for (let i = 0; i < body.length; i++) { + const node = body[i] + + switch (node.type) { + case 'ExportAllDeclaration': + if (node.exported) { + addExportNames(names, node.exported) + continue + } else { + const _await$resolveClientI = await resolveClientImport( + node.source.value, + parentURL + ), + url = _await$resolveClientI.url + + const _await$loader = await loader( + url, + { + format: 'module', + conditions: [], + importAssertions: {}, + }, + loader + ), + source = _await$loader.source + + if (typeof source !== 'string') { + throw new Error('Expected the transformed source to be a string.') + } + + let childBody + + try { + childBody = acorn.parse(source, { + ecmaVersion: '2024', + sourceType: 'module', + }).body + } catch (x: any) { + console.error('Error parsing %s %s', url, x.message) + continue + } + + await parseExportNamesInto(childBody, names, url, loader) + continue + } + + case 'ExportDefaultDeclaration': + names.push('default') + continue + + case 'ExportNamedDeclaration': + if (node.declaration) { + if (node.declaration.type === 'VariableDeclaration') { + const declarations = node.declaration.declarations + + for (let j = 0; j < declarations.length; j++) { + addExportNames(names, declarations[j].id) + } + } else { + addExportNames(names, node.declaration.id) + } + } + + if (node.specifiers) { + const specifiers = node.specifiers + + for (let j = 0; j < specifiers.length; j++) { + addExportNames(names, specifiers[j].exported) + } + } + + continue + } + } +} + +async function transformClientModule( + body: any, + url: string, + loader: LoadFunction +): Promise { + const names: Array = [] + await parseExportNamesInto(body, names, url, loader) + let newSrc = + "const CLIENT_REFERENCE = Symbol.for('react.client.reference');\n" + + for (let i = 0; i < names.length; i++) { + const name = names[i] + + if (name === 'default') { + newSrc += 'export default ' + newSrc += 'Object.defineProperties(function() {' + newSrc += + 'throw new Error(' + + JSON.stringify( + 'Attempted to call the default export of ' + + url + + ' from the server' + + "but it's on the client. It's not possible to invoke a client function from " + + 'the server, it can only be rendered as a Component or passed to props of a' + + 'Client Component.' + ) + + ');' + } else { + newSrc += 'export const ' + name + ' = ' + newSrc += 'Object.defineProperties(function() {' + newSrc += + 'throw new Error(' + + JSON.stringify( + 'Attempted to call ' + + name + + '() from the server but ' + + name + + ' is on the client. ' + + "It's not possible to invoke a client function from the server, it can " + + 'only be rendered as a Component or passed to props of a Client Component.' + ) + + ');' + } + + newSrc += '},{' + newSrc += '$$typeof: {value: CLIENT_REFERENCE},' + newSrc += '$$id: {value: ' + JSON.stringify(url + '#' + name) + '}' + newSrc += '});\n' + } + + return newSrc +} + +async function loadClientImport( + url: string, + defaultTransformSource: TransformSourceFunction +): Promise<{ format: string; shortCircuit?: boolean; source: Source }> { + if (stashedGetSource === null) { + throw new Error( + 'Expected getSource to have been called before transformSource' + ) + } // TODO: Validate that this is another module by calling getFormat. + + const _await$stashedGetSour = await stashedGetSource( + url, + { + format: 'module', + }, + stashedGetSource + ), + source = _await$stashedGetSour.source + + const result = await defaultTransformSource( + source, + { + format: 'module', + url, + }, + defaultTransformSource + ) + return { + format: 'module', + source: result.source, + } +} + +async function transformModuleIfNeeded( + source: string, + url: string, + loader: LoadFunction +): Promise { + // Do a quick check for the exact string. If it doesn't exist, don't + // bother parsing. + if ( + source.indexOf('use client') === -1 && + source.indexOf('use server') === -1 + ) { + return source + } + + let body + + try { + body = acorn.parse(source, { + ecmaVersion: '2024', + sourceType: 'module', + }).body + } catch (x: any) { + console.error('Error parsing %s %s', url, x.message) + return source + } + + let useClient = false + let useServer = false + + for (let i = 0; i < body.length; i++) { + const node = body[i] + + if (node.type !== 'ExpressionStatement' || !node.directive) { + break + } + + if (node.directive === 'use client') { + useClient = true + } + + if (node.directive === 'use server') { + useServer = true + } + } + + if (!useClient && !useServer) { + return source + } + + if (useClient && useServer) { + throw new Error( + 'Cannot have both "use client" and "use server" directives in the same file.' + ) + } + + if (useClient) { + return transformClientModule(body, url, loader) + } + + return transformServerModule(source, body, url) +} + +export async function transformSource( + source: Source, + context: TransformSourceContext, + defaultTransformSource: TransformSourceFunction +): Promise<{ source: Source }> { + const transformed = await defaultTransformSource( + source, + context, + defaultTransformSource + ) + + if (context.format === 'module') { + const transformedSource = transformed.source + + if (typeof transformedSource !== 'string') { + throw new Error('Expected source to have been transformed to a string.') + } + + const newSrc = await transformModuleIfNeeded( + transformedSource, + context.url, + (url: string) => { + return loadClientImport(url, defaultTransformSource) + } + ) + return { + source: newSrc, + } + } + + return transformed +} + +export async function load( + url: string, + context: LoadContext | null, + defaultLoad: LoadFunction +): Promise<{ format: string; shortCircuit?: boolean; source: Source }> { + const result = await defaultLoad(url, context, defaultLoad) + + if (result.format === 'module') { + if (typeof result.source !== 'string') { + throw new Error('Expected source to have been loaded into a string.') + } + + const newSrc = await transformModuleIfNeeded( + result.source, + url, + defaultLoad + ) + return { + format: 'module', + source: newSrc, + } + } + + return result +} + +// export { getSource, load, resolve, transformSource } diff --git a/packages/vite/src/runRscFeServer.ts b/packages/vite/src/runRscFeServer.ts new file mode 100644 index 000000000000..e6f7d4620460 --- /dev/null +++ b/packages/vite/src/runRscFeServer.ts @@ -0,0 +1,186 @@ +// TODO (STREAMING) Move this to a new package called @redwoodjs/fe-server (goes +// well in naming with with @redwoodjs/api-server) +// Only things used during dev can be in @redwoodjs/vite. Everything else has +// to go in fe-server + +import fs from 'fs/promises' +import path from 'path' + +// @ts-expect-error We will remove dotenv-defaults from this package anyway +import { config as loadDotEnv } from 'dotenv-defaults' +import express from 'express' +import { createProxyMiddleware } from 'http-proxy-middleware' +import isbot from 'isbot' +import type { Manifest as ViteBuildManifest } from 'vite' + +import { getConfig, getPaths } from '@redwoodjs/project-config' + +import { renderRSC, setClientEntries } from './waku-lib/rsc-handler-worker' + +globalThis.RWJS_ENV = {} + +/** + * TODO (STREAMING) + * We have this server in the vite package only temporarily. + * We will need to decide where to put it, so that rwjs/internal and other heavy dependencies + * can be removed from the final docker image + */ + +// --- @MARK This should be removed once we have re-architected the rw serve command --- +// We need the dotenv, so that prisma knows the DATABASE env var +// Normally the RW cli loads this for us, but we expect this file to be run directly +// without using the CLI. Remember to remove dotenv-defaults dependency from this package +loadDotEnv({ + path: path.join(getPaths().base, '.env'), + defaults: path.join(getPaths().base, '.env.defaults'), + multiline: true, +}) +//------------------------------------------------ + +const checkUaForSeoCrawler = isbot.spawn() +checkUaForSeoCrawler.exclude(['chrome-lighthouse']) + +export async function runFeServer() { + const app = express() + const rwPaths = getPaths() + const rwConfig = getConfig() + + await setClientEntries('load') + + // TODO When https://github.com/tc39/proposal-import-attributes and + // https://github.com/microsoft/TypeScript/issues/53656 have both landed we + // should try to do this instead: + // const routeManifest: RWRouteManifest = await import( + // rwPaths.web.routeManifest, { with: { type: 'json' } } + // ) + // NOTES: + // * There's a related babel plugin here + // https://babeljs.io/docs/babel-plugin-syntax-import-attributes + // * Included in `preset-env` if you set `shippedProposals: true` + // * We had this before, but with `assert` instead of `with`. We really + // should be using `with`. See motivation in issues linked above. + // * With `assert` and `@babel/plugin-syntax-import-assertions` the + // code compiled and ran properly, but Jest tests failed, complaining + // about the syntax. + // const routeManifestStr = await fs.readFile(rwPaths.web.routeManifest, 'utf-8') + // const routeManifest: RWRouteManifest = JSON.parse(routeManifestStr) + + // TODO See above about using `import { with: { type: 'json' } }` instead + const manifestPath = path.join(getPaths().web.dist, 'build-manifest.json') + const buildManifestStr = await fs.readFile(manifestPath, 'utf-8') + const buildManifest: ViteBuildManifest = JSON.parse(buildManifestStr) + + console.log('='.repeat(80)) + console.log('buildManifest', buildManifest) + console.log('='.repeat(80)) + + const indexEntry = Object.values(buildManifest).find((manifestItem) => { + return manifestItem.isEntry + }) + + if (!indexEntry) { + throw new Error('Could not find index.html in build manifest') + } + + // 👉 1. Use static handler for assets + // For CF workers, we'd need an equivalent of this + app.use('/assets', express.static(rwPaths.web.dist + '/assets')) + + // 👉 2. Proxy the api server + // TODO (STREAMING) we need to be able to specify whether proxying is required or not + // e.g. deploying to Netlify, we don't need to proxy but configure it in Netlify + // Also be careful of differences between v2 and v3 of the server + app.use( + rwConfig.web.apiUrl, + // @WARN! Be careful, between v2 and v3 of http-proxy-middleware + // the syntax has changed https://github.com/chimurai/http-proxy-middleware + createProxyMiddleware({ + changeOrigin: true, + pathRewrite: { + [`^${rwConfig.web.apiUrl}`]: '', // remove base path + }, + // Using 127.0.0.1 to force ipv4. With `localhost` you don't really know + // if it's going to be ipv4 or ipv6 + target: `http://127.0.0.1:${rwConfig.api.port}`, + }) + ) + + app.use((req, _res, next) => { + console.log('req.url', req.url) + next() + }) + + // Mounting middleware at /RSC will strip /RSC from req.url + app.use('/RSC', async (req, res) => { + const basePath = '/RSC/' + console.log('basePath', basePath) + console.log('req.originalUrl', req.originalUrl, 'req.url', req.url) + console.log('req.headers.host', req.headers.host) + const url = new URL(req.originalUrl || '', 'http://' + req.headers.host) + let rscId: string | undefined + let props = {} + let rsfId: string | undefined + const args: unknown[] = [] + + console.log('url.pathname', url.pathname) + if (url.pathname.startsWith(basePath)) { + const index = url.pathname.lastIndexOf('/') + rscId = url.pathname.slice(basePath.length, index) + console.log('rscId', rscId) + const params = new URLSearchParams(url.pathname.slice(index + 1)) + if (rscId && rscId !== '_') { + res.setHeader('Content-Type', 'text/x-component') + props = JSON.parse(params.get('props') || '{}') + } else { + rscId = undefined + } + rsfId = params.get('action_id') || undefined + if (rsfId) { + console.warn('RSF is not supported yet') + console.warn('RSF is not supported yet') + console.warn('RSF is not supported yet') + // if (req.headers["content-type"]?.startsWith("multipart/form-data")) { + // const bb = busboy({ headers: req.headers }); + // const reply = decodeReplyFromBusboy(bb); + // req.pipe(bb); + // args = await reply; + // } else { + // let body = ""; + // for await (const chunk of req) { + // body += chunk; + // } + // if (body) { + // args = await decodeReply(body); + // } + // } + } + } + + if (rscId || rsfId) { + const pipeable = await renderRSC({ rscId, props, rsfId, args }) + + // TODO handle errors + + // pipeable.on('error', (err) => { + // console.info('Cannot render RSC', err) + // res.statusCode = 500 + // if (options.mode === 'development') { + // res.end(String(err)) + // } else { + // res.end() + // } + // }) + pipeable.pipe(res) + return + } + }) + + app.use(express.static(rwPaths.web.dist)) + + app.listen(rwConfig.web.port) + console.log( + `Started production FE server on http://localhost:${rwConfig.web.port}` + ) +} + +runFeServer() diff --git a/packages/vite/src/waku-lib/build-server.ts b/packages/vite/src/waku-lib/build-server.ts new file mode 100644 index 000000000000..09ef7b4be399 --- /dev/null +++ b/packages/vite/src/waku-lib/build-server.ts @@ -0,0 +1,82 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +import react from '@vitejs/plugin-react' +import { build as viteBuild } from 'vite' + +import { getPaths } from '@redwoodjs/project-config' + +export async function serverBuild( + entriesFile: string, + clientEntryFiles: Record, + serverEntryFiles: Record, + customModules: Record +) { + // const noExternal = Array.from(clientEntryFileSet).map( + // // FIXME this might not work with pnpm + // (fname) => + // path + // .relative(path.join(config.root, "node_modules"), fname) + // .split("/")[0]! + // ); + // + const input = { + entries: entriesFile, + ...clientEntryFiles, + ...serverEntryFiles, + ...customModules, + } + + console.log('input', input) + + const rwPaths = getPaths() + + const serverBuildOutput = await viteBuild({ + // ...configFileConfig, + root: rwPaths.web.base, + ssr: { + noExternal: ['..'], + }, + plugins: [react()], + build: { + ssr: true, + // TODO (RSC) Change output dir to just dist. We should be "server + // first". Client components are the "special case" and should be output + // to dist/client + outDir: rwPaths.web.distServer, + rollupOptions: { + input, + output: { + banner: (chunk) => { + // HACK to bring directives to the front + let code = '' + const clientValues = Object.values(clientEntryFiles) + console.log('chunk.moduleIds', chunk.moduleIds) + console.log('clientValues', clientValues) + if (chunk.moduleIds.some((id) => clientValues.includes(id))) { + console.log('adding "use client" to', chunk.fileName) + code += '"use client";' + } + + const serverKeys = Object.keys(serverEntryFiles) + if (chunk.moduleIds.some((id) => serverKeys.includes(id))) { + code += '"use server";' + } + return code + }, + entryFileNames: (chunkInfo) => { + // TODO (RSC) Probably don't want 'entries'. And definitely don't want it hardcoded + if (chunkInfo.name === 'entries' || customModules[chunkInfo.name]) { + return '[name].js' + } + return 'assets/[name].js' + }, + }, + }, + }, + }) + + if (!('output' in serverBuildOutput)) { + throw new Error('Unexpected vite server build output') + } + + return serverBuildOutput +} diff --git a/packages/vite/src/waku-lib/builder.ts b/packages/vite/src/waku-lib/builder.ts new file mode 100644 index 000000000000..17aef1cdb43d --- /dev/null +++ b/packages/vite/src/waku-lib/builder.ts @@ -0,0 +1,185 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +import fs from 'node:fs' +import { createRequire } from 'node:module' +import path from 'node:path' + +import react from '@vitejs/plugin-react' +import { build as viteBuild } from 'vite' + +import { configFileConfig, resolveConfig } from './config' +import { + shutdown, + setClientEntries, + getCustomModulesRSC, + buildRSC, +} from './rsc-handler' +import { rscIndexPlugin, rscAnalyzePlugin } from './vite-plugin-rsc' + +export async function build() { + const config = await resolveConfig('build') + const indexHtmlFile = path.join(config.root, config.framework.indexHtml) + const distEntriesFile = path.join( + config.root, + config.build.outDir, + config.framework.entriesJs + ) + let entriesFile = path.join(config.root, config.framework.entriesJs) + if (entriesFile.endsWith('.js')) { + for (const ext of ['.js', '.ts', '.tsx', '.jsx']) { + const tmp = entriesFile.slice(0, -3) + ext + if (fs.existsSync(tmp)) { + entriesFile = tmp + break + } + } + } + const require = createRequire(import.meta.url) + + const customModules = await getCustomModulesRSC() + const clientEntryFileSet = new Set() + const serverEntryFileSet = new Set() + await viteBuild({ + ...configFileConfig, + plugins: [ + rscAnalyzePlugin( + (id) => clientEntryFileSet.add(id), + (id) => serverEntryFileSet.add(id) + ), + ], + ssr: { + // FIXME Without this, waku/router isn't considered to have client + // entries, and "No client entry" error occurs. + // Unless we fix this, RSC-capable packages aren't supported. + // This also seems to cause problems with pnpm. + noExternal: ['waku'], + }, + build: { + write: false, + ssr: true, + rollupOptions: { + input: { + entries: entriesFile, + ...customModules, + }, + }, + }, + }) + const clientEntryFiles = Object.fromEntries( + Array.from(clientEntryFileSet).map((fname, i) => [`rsc${i}`, fname]) + ) + const serverEntryFiles = Object.fromEntries( + Array.from(serverEntryFileSet).map((fname, i) => [`rsf${i}`, fname]) + ) + + const serverBuildOutput = await viteBuild({ + ...configFileConfig, + ssr: { + noExternal: Array.from(clientEntryFileSet).map( + // FIXME this might not work with pnpm + (fname) => + path + .relative(path.join(config.root, 'node_modules'), fname) + .split('/')[0] + ), + }, + build: { + ssr: true, + rollupOptions: { + input: { + entries: entriesFile, + ...clientEntryFiles, + ...serverEntryFiles, + ...customModules, + }, + output: { + banner: (chunk) => { + // HACK to bring directives to the front + let code = '' + if (chunk.moduleIds.some((id) => clientEntryFileSet.has(id))) { + code += '"use client";' + } + if (chunk.moduleIds.some((id) => serverEntryFileSet.has(id))) { + code += '"use server";' + } + return code + }, + entryFileNames: (chunkInfo) => { + if (chunkInfo.name === 'entries' || customModules[chunkInfo.name]) { + return '[name].js' + } + return 'assets/[name].js' + }, + }, + }, + }, + }) + if (!('output' in serverBuildOutput)) { + throw new Error('Unexpected vite server build output') + } + + const clientBuildOutput = await viteBuild({ + ...configFileConfig, + plugins: [react(), rscIndexPlugin()], + build: { + outDir: path.join(config.build.outDir, config.framework.outPublic), + rollupOptions: { + input: { + main: indexHtmlFile, + ...clientEntryFiles, + }, + preserveEntrySignatures: 'exports-only', + }, + }, + }) + if (!('output' in clientBuildOutput)) { + throw new Error('Unexpected vite client build output') + } + + const clientEntries: Record = {} + for (const item of clientBuildOutput.output) { + const { name, fileName } = item + const entryFile = + name && + serverBuildOutput.output.find( + (item) => + 'moduleIds' in item && + item.moduleIds.includes(clientEntryFiles[name] as string) + )?.fileName + if (entryFile) { + clientEntries[entryFile] = fileName + } + } + console.log('clientEntries', clientEntries) + fs.appendFileSync( + distEntriesFile, + `export const clientEntries=${JSON.stringify(clientEntries)};` + ) + + const absoluteClientEntries = Object.fromEntries( + Object.entries(clientEntries).map(([key, val]) => [ + path.join(path.dirname(entriesFile), config.build.outDir, key), + config.base + val, + ]) + ) + await setClientEntries(absoluteClientEntries) + + await buildRSC() + + const origPackageJson = require(path.join(config.root, 'package.json')) + const packageJson = { + name: origPackageJson.name, + version: origPackageJson.version, + private: true, + type: 'module', + scripts: { + start: 'waku start', + }, + dependencies: origPackageJson.dependencies, + } + fs.writeFileSync( + path.join(config.root, config.build.outDir, 'package.json'), + JSON.stringify(packageJson, null, 2) + ) + + await shutdown() +} diff --git a/packages/vite/src/waku-lib/config.ts b/packages/vite/src/waku-lib/config.ts new file mode 100644 index 000000000000..386ee6b1e91d --- /dev/null +++ b/packages/vite/src/waku-lib/config.ts @@ -0,0 +1,41 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +import type { ConfigEnv, UserConfig } from 'vite' +import { resolveConfig as viteResolveConfig } from 'vite' + +export interface FrameworkConfig { + indexHtml?: string // relative to root + entriesJs?: string // relative to root + outPublic?: string // relative to build.outDir + rscPrefix?: string // defaults to "RSC/" +} + +export interface ExtendedUserConfig extends UserConfig { + framework?: FrameworkConfig +} + +export function defineConfig( + config: + | ExtendedUserConfig + | Promise + | ((env: ConfigEnv) => ExtendedUserConfig) + | ((env: ConfigEnv) => Promise) +) { + return config +} + +export const configFileConfig = process.env.CONFIG_FILE + ? { configFile: process.env.CONFIG_FILE } + : {} + +export async function resolveConfig(command: 'build' | 'serve') { + const origConfig = await viteResolveConfig(configFileConfig, command) + const framework: Required = { + indexHtml: 'index.html', + entriesJs: 'entries.js', + outPublic: 'public', + rscPrefix: 'RSC/', + ...(origConfig as { framework?: FrameworkConfig }).framework, + } + const config = { ...origConfig, framework } + return config +} diff --git a/packages/vite/src/waku-lib/rsc-handler-worker.ts b/packages/vite/src/waku-lib/rsc-handler-worker.ts new file mode 100644 index 000000000000..fff2308b6cb1 --- /dev/null +++ b/packages/vite/src/waku-lib/rsc-handler-worker.ts @@ -0,0 +1,450 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +// import fs from 'node:fs' +import path from 'node:path' +import { Writable } from 'node:stream' +import { parentPort } from 'node:worker_threads' + +import { createElement } from 'react' + +import RSDWServer from 'react-server-dom-webpack/server' +import { createServer } from 'vite' + +import { getPaths } from '@redwoodjs/project-config' + +import { defineEntries } from '../waku-server' +// import type { unstable_GetCustomModules } from '../waku-server' + +import { configFileConfig, resolveConfig } from './config' +// import type { RenderInput, MessageReq, MessageRes } from './rsc-handler' +import type { RenderInput, MessageRes } from './rsc-handler' +// import { transformRsfId, generatePrefetchCode } from './rsc-utils' +import { transformRsfId } from './rsc-utils' +import { rscTransformPlugin, rscReloadPlugin } from './vite-plugin-rsc' + +const { renderToPipeableStream } = RSDWServer + +type Entries = { default: ReturnType } +type PipeableStream = { pipe(destination: T): T } + +// const handleSetClientEntries = async ( +// mesg: MessageReq & { type: 'setClientEntries' } +// ) => { +// const { id, value } = mesg +// try { +// await setClientEntries(value) + +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const message: MessageRes = { id, type: 'end' } +// parentPort.postMessage(message) +// } catch (err) { +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const message: MessageRes = { id, type: 'err', err } +// parentPort.postMessage(message) +// } +// } + +// const handleRender = async (message: MessageReq & { type: 'render' }) => { +// const { id, input } = message + +// try { +// const pipeable = await renderRSC(input) +// const writable = new Writable({ +// write(chunk, encoding, callback) { +// if (encoding !== ('buffer' as any)) { +// throw new Error('Unknown encoding') +// } + +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const buffer: Buffer = chunk +// const msg: MessageRes = { +// id, +// type: 'buf', +// buf: buffer.buffer, +// offset: buffer.byteOffset, +// len: buffer.length, +// } +// parentPort.postMessage(msg, [msg.buf]) +// callback() +// }, +// final(callback) { +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const mesg: MessageRes = { id, type: 'end' } +// parentPort.postMessage(mesg) +// callback() +// }, +// }) +// pipeable.pipe(writable) +// } catch (err) { +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const mesg: MessageRes = { id, type: 'err', err } +// parentPort.postMessage(mesg) +// } +// } + +// const handleGetCustomModules = async ( +// mesg: MessageReq & { type: 'getCustomModules' } +// ) => { +// const { id } = mesg +// try { +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const modules = await getCustomModulesRSC() +// const mesg: MessageRes = { id, type: 'customModules', modules } +// parentPort.postMessage(mesg) +// } catch (err) { +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const mesg: MessageRes = { id, type: 'err', err } +// parentPort.postMessage(mesg) +// } +// } + +// const handleBuild = async (mesg: MessageReq & { type: 'build' }) => { +// const { id } = mesg +// try { +// await buildRSC() + +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const mesg: MessageRes = { id, type: 'end' } +// parentPort.postMessage(mesg) +// } catch (err) { +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// const mesg: MessageRes = { id, type: 'err', err } +// parentPort.postMessage(mesg) +// } +// } + +const vitePromise = createServer({ + ...configFileConfig, + plugins: [ + rscTransformPlugin(), + rscReloadPlugin((type) => { + if (!parentPort) { + throw new Error('parentPort is undefined') + } + + const mesg: MessageRes = { type } + parentPort.postMessage(mesg) + }), + ], + ssr: { + // FIXME Without this, "use client" directive in waku/router/client + // is ignored, and some errors occur. + // Unless we fix this, RSC-capable packages aren't supported. + // This also seems to cause problems with pnpm. + noExternal: ['waku'], + }, + appType: 'custom', +}) + +// const shutdown = async () => { +// const vite = await vitePromise +// await vite.close() +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// parentPort.close() +// } + +const loadServerFile = async (fname: string) => { + const vite = await vitePromise + return vite.ssrLoadModule(fname) +} + +// if (!parentPort) { +// throw new Error('parentPort is undefined') +// } + +// parentPort.on('message', (mesg: MessageReq) => { +// if (mesg.type === 'shutdown') { +// shutdown() +// } else if (mesg.type === 'setClientEntries') { +// handleSetClientEntries(mesg) +// } else if (mesg.type === 'render') { +// handleRender(mesg) +// } else if (mesg.type === 'getCustomModules') { +// handleGetCustomModules(mesg) +// } else if (mesg.type === 'build') { +// handleBuild(mesg) +// } +// }) + +const configPromise = resolveConfig('serve') + +const getEntriesFile = async ( + config: Awaited>, + isBuild: boolean +) => { + const rwPaths = getPaths() + + if (isBuild) { + return path.join( + config.root, + config.build.outDir, + config.framework.entriesJs + ) + } + + // TODO: Don't hardcode the name of the entries file + return path.join(rwPaths.web.distServer, 'entries.js') // path.join(config.root, config.framework.entriesJs) +} + +const getFunctionComponent = async ( + rscId: string, + config: Awaited>, + isBuild: boolean +) => { + const entriesFile = await getEntriesFile(config, isBuild) + const { + default: { getEntry }, + } = await (loadServerFile(entriesFile) as Promise) + const mod = await getEntry(rscId) + if (typeof mod === 'function') { + return mod + } + if (typeof mod?.default === 'function') { + return mod?.default + } + throw new Error('No function component found') +} + +let absoluteClientEntries: Record = {} + +const resolveClientEntry = ( + config: Awaited>, + filePath: string +) => { + const clientEntry = absoluteClientEntries[filePath] + if (!clientEntry) { + if (absoluteClientEntries['*'] === '*') { + return config.base + path.relative(config.root, filePath) + } + throw new Error('No client entry found for ' + filePath) + } + return clientEntry +} + +export async function setClientEntries( + value: 'load' | Record +): Promise { + if (value !== 'load') { + absoluteClientEntries = value + return + } + const config = await configPromise + const entriesFile = await getEntriesFile(config, false) + console.log('entriesFile', entriesFile) + const { clientEntries } = await loadServerFile(entriesFile) + if (!clientEntries) { + throw new Error('Failed to load clientEntries') + } + const baseDir = path.dirname(entriesFile) + absoluteClientEntries = Object.fromEntries( + Object.entries(clientEntries).map(([key, val]) => [ + path.join(baseDir, key), + config.base + val, + ]) + ) + + console.log('absoluteClientEntries', absoluteClientEntries) +} + +export async function renderRSC(input: RenderInput): Promise { + const config = await configPromise + const bundlerConfig = new Proxy( + {}, + { + get(_target, encodedId: string) { + console.log('Proxy get', encodedId) + const [filePath, name] = encodedId.split('#') as [string, string] + // filePath /Users/tobbe/dev/waku/examples/01_counter/dist/assets/rsc0.js + // name Counter + const id = resolveClientEntry(config, filePath) + // id /assets/rsc0-beb48afe.js + return { id, chunks: [id], name, async: true } + }, + } + ) + + if (input.rsfId && input.args) { + const [fileId, name] = input.rsfId.split('#') + const fname = path.join(config.root, fileId) + const mod = await loadServerFile(fname) + const data = await (mod[name] || mod)(...input.args) + if (!input.rscId) { + return renderToPipeableStream(data, bundlerConfig) + } + // continue for mutation mode + } + + if (input.rscId && input.props) { + const component = await getFunctionComponent(input.rscId, config, false) + return renderToPipeableStream( + createElement(component, input.props), + bundlerConfig + ).pipe(transformRsfId(config.root)) + } + + throw new Error('Unexpected input') +} + +// async function getCustomModulesRSC(): Promise<{ [name: string]: string }> { +// const config = await configPromise +// const entriesFile = await getEntriesFile(config, false) +// const { +// default: { unstable_getCustomModules: getCustomModules }, +// } = await (loadServerFile(entriesFile) as Promise<{ +// default: Entries['default'] & { +// unstable_getCustomModules?: unstable_GetCustomModules +// } +// }>) +// if (!getCustomModules) { +// return {} +// } +// const modules = await getCustomModules() +// return modules +// } + +// // FIXME this may take too much responsibility +// async function buildRSC(): Promise { +// const config = await resolveConfig('build') +// const basePath = config.base + config.framework.rscPrefix +// const distEntriesFile = await getEntriesFile(config, true) +// const { +// default: { getBuilder }, +// } = await (loadServerFile(distEntriesFile) as Promise) +// if (!getBuilder) { +// console.warn( +// "getBuilder is undefined. It's recommended for optimization and sometimes required." +// ) +// return +// } + +// // FIXME this doesn't seem an ideal solution +// const decodeId = (encodedId: string): [id: string, name: string] => { +// const [filePath, name] = encodedId.split('#') as [string, string] +// const id = resolveClientEntry(config, filePath) +// return [id, name] +// } + +// const pathMap = await getBuilder(decodeId) +// const clientModuleMap = new Map>() +// const addClientModule = (pathStr: string, id: string) => { +// let idSet = clientModuleMap.get(pathStr) +// if (!idSet) { +// idSet = new Set() +// clientModuleMap.set(pathStr, idSet) +// } +// idSet.add(id) +// } +// await Promise.all( +// Object.entries(pathMap).map(async ([pathStr, { elements }]) => { +// for (const [rscId, props] of elements || []) { +// // FIXME we blindly expect JSON.stringify usage is deterministic +// const serializedProps = JSON.stringify(props) +// const searchParams = new URLSearchParams() +// searchParams.set('props', serializedProps) +// const destFile = path.join( +// config.root, +// config.build.outDir, +// config.framework.outPublic, +// config.framework.rscPrefix, +// decodeURIComponent(rscId), +// decodeURIComponent(`${searchParams}`) +// ) +// fs.mkdirSync(path.dirname(destFile), { recursive: true }) +// const bundlerConfig = new Proxy( +// {}, +// { +// get(_target, encodedId: string) { +// const [id, name] = decodeId(encodedId) +// addClientModule(pathStr, id) +// return { id, chunks: [id], name, async: true } +// }, +// } +// ) +// const component = await getFunctionComponent(rscId, config, true) +// const pipeable = renderToPipeableStream( +// createElement(component, props as any), +// bundlerConfig +// ).pipe(transformRsfId(path.join(config.root, config.build.outDir))) +// await new Promise((resolve, reject) => { +// const stream = fs.createWriteStream(destFile) +// stream.on('finish', resolve) +// stream.on('error', reject) +// pipeable.pipe(stream) +// }) +// } +// }) +// ) + +// const publicIndexHtmlFile = path.join( +// config.root, +// config.build.outDir, +// config.framework.outPublic, +// config.framework.indexHtml +// ) +// const publicIndexHtml = fs.readFileSync(publicIndexHtmlFile, { +// encoding: 'utf8', +// }) +// await Promise.all( +// Object.entries(pathMap).map(async ([pathStr, { elements, customCode }]) => { +// const destFile = path.join( +// config.root, +// config.build.outDir, +// config.framework.outPublic, +// pathStr, +// pathStr.endsWith('/') ? 'index.html' : '' +// ) +// let data = '' +// if (fs.existsSync(destFile)) { +// data = fs.readFileSync(destFile, { encoding: 'utf8' }) +// } else { +// fs.mkdirSync(path.dirname(destFile), { recursive: true }) +// data = publicIndexHtml +// } +// const code = +// generatePrefetchCode( +// basePath, +// Array.from(elements || []).flatMap(([rscId, props, skipPrefetch]) => { +// if (skipPrefetch) { +// return [] +// } +// return [[rscId, props]] +// }), +// clientModuleMap.get(pathStr) || [] +// ) + (customCode || '') +// if (code) { +// // HACK is this too naive to inject script code? +// data = data.replace(/<\/body>/, ``) +// } +// fs.writeFileSync(destFile, data, { encoding: 'utf8' }) +// }) +// ) +// } diff --git a/packages/vite/src/waku-lib/rsc-handler.ts b/packages/vite/src/waku-lib/rsc-handler.ts new file mode 100644 index 000000000000..9a179f17a4c6 --- /dev/null +++ b/packages/vite/src/waku-lib/rsc-handler.ts @@ -0,0 +1,149 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +import { PassThrough } from 'node:stream' +import type { Readable } from 'node:stream' +import { Worker } from 'node:worker_threads' + +const worker = new Worker(new URL('rsc-handler-worker.js', import.meta.url), { + execArgv: ['--conditions', 'react-server'], +}) + +export type RenderInput = { + rscId?: string | undefined + props?: Props | undefined + rsfId?: string | undefined + args?: unknown[] | undefined +} + +type CustomModules = { + [name: string]: string +} + +export type MessageReq = + | { type: 'shutdown' } + | { + id: number + type: 'setClientEntries' + value: 'load' | Record + } + | { + id: number + type: 'render' + input: RenderInput + } + | { + id: number + type: 'getCustomModules' + } + | { + id: number + type: 'build' + } + +export type MessageRes = + | { type: 'full-reload' } + | { id: number; type: 'buf'; buf: ArrayBuffer; offset: number; len: number } + | { id: number; type: 'end' } + | { id: number; type: 'err'; err: unknown } + | { id: number; type: 'customModules'; modules: CustomModules } + +const messageCallbacks = new Map void>() + +worker.on('message', (mesg: MessageRes) => { + if ('id' in mesg) { + messageCallbacks.get(mesg.id)?.(mesg) + } +}) + +export function registerReloadCallback(fn: (type: 'full-reload') => void) { + const listener = (mesg: MessageRes) => { + if (mesg.type === 'full-reload') { + fn(mesg.type) + } + } + worker.on('message', listener) + return () => worker.off('message', listener) +} + +export function shutdown() { + return new Promise((resolve) => { + worker.on('close', resolve) + const mesg: MessageReq = { type: 'shutdown' } + worker.postMessage(mesg) + }) +} + +let nextId = 1 + +export function setClientEntries( + value: 'load' | Record +): Promise { + return new Promise((resolve, reject) => { + const id = nextId++ + messageCallbacks.set(id, (mesg) => { + if (mesg.type === 'end') { + resolve() + messageCallbacks.delete(id) + } else if (mesg.type === 'err') { + reject(mesg.err) + messageCallbacks.delete(id) + } + }) + const mesg: MessageReq = { id, type: 'setClientEntries', value } + worker.postMessage(mesg) + }) +} + +export function renderRSC(input: RenderInput): Readable { + const id = nextId++ + const passthrough = new PassThrough() + messageCallbacks.set(id, (mesg) => { + if (mesg.type === 'buf') { + passthrough.write(Buffer.from(mesg.buf, mesg.offset, mesg.len)) + } else if (mesg.type === 'end') { + passthrough.end() + messageCallbacks.delete(id) + } else if (mesg.type === 'err') { + passthrough.destroy( + mesg.err instanceof Error ? mesg.err : new Error(String(mesg.err)) + ) + messageCallbacks.delete(id) + } + }) + const mesg: MessageReq = { id, type: 'render', input } + worker.postMessage(mesg) + return passthrough +} + +export function getCustomModulesRSC(): Promise { + return new Promise((resolve, reject) => { + const id = nextId++ + messageCallbacks.set(id, (mesg) => { + if (mesg.type === 'customModules') { + resolve(mesg.modules) + messageCallbacks.delete(id) + } else if (mesg.type === 'err') { + reject(mesg.err) + messageCallbacks.delete(id) + } + }) + const mesg: MessageReq = { id, type: 'getCustomModules' } + worker.postMessage(mesg) + }) +} + +export function buildRSC(): Promise { + return new Promise((resolve, reject) => { + const id = nextId++ + messageCallbacks.set(id, (mesg) => { + if (mesg.type === 'end') { + resolve() + messageCallbacks.delete(id) + } else if (mesg.type === 'err') { + reject(mesg.err) + messageCallbacks.delete(id) + } + }) + const mesg: MessageReq = { id, type: 'build' } + worker.postMessage(mesg) + }) +} diff --git a/packages/vite/src/waku-lib/rsc-utils.ts b/packages/vite/src/waku-lib/rsc-utils.ts new file mode 100644 index 000000000000..df13c0adeccc --- /dev/null +++ b/packages/vite/src/waku-lib/rsc-utils.ts @@ -0,0 +1,79 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +import { Buffer } from 'node:buffer' +import { Transform } from 'node:stream' + +export const codeToInject = ` + globalThis.__rw_module_cache__ = new Map(); + + globalThis.__webpack_chunk_load__ = (id) => { + return import(id).then((m) => globalThis.__rw_module_cache__.set(id, m)) + }; + + globalThis.__webpack_require__ = (id) => { + return globalThis.__rw_module_cache__.get(id) + };\n ` + +export const generatePrefetchCode = ( + basePath: string, + entryItemsIterable: Iterable, + moduleIds: Iterable +) => { + const entryItems = Array.from(entryItemsIterable) + let code = '' + if (entryItems.length) { + const rscIds = Array.from(new Set(entryItems.map(([rscId]) => rscId))) + code += ` +globalThis.__WAKU_PREFETCHED__ = { +${rscIds + .map((rscId) => { + const value = + '{' + + entryItems + .flatMap(([id, props]) => { + if (id !== rscId) { + return [] + } + // FIXME we blindly expect JSON.stringify usage is deterministic + const serializedProps = JSON.stringify(props) + const searchParams = new URLSearchParams() + searchParams.set('props', serializedProps) + return [ + `'${serializedProps}': fetch('${basePath}${rscId}/${searchParams}')`, + ] + }) + .join(',') + + '}' + return ` '${rscId}': ${value}` + }) + .join(',\n')} +};` + } + for (const moduleId of moduleIds) { + code += ` +import('${moduleId}');` + } + return code +} + +// HACK Patching stream is very fragile. +export const transformRsfId = (prefixToRemove: string) => + new Transform({ + transform(chunk, encoding, callback) { + if (encoding !== ('buffer' as any)) { + throw new Error('Unknown encoding') + } + const data = chunk.toString() + const lines = data.split('\n') + let changed = false + for (let i = 0; i < lines.length; ++i) { + const match = lines[i].match( + new RegExp(`^([0-9]+):{"id":"${prefixToRemove}(.*?)"(.*)$`) + ) + if (match) { + lines[i] = `${match[1]}:{"id":"${match[2]}"${match[3]}` + changed = true + } + } + callback(null, changed ? Buffer.from(lines.join('\n')) : chunk) + }, + }) diff --git a/packages/vite/src/waku-lib/vite-plugin-rsc.ts b/packages/vite/src/waku-lib/vite-plugin-rsc.ts new file mode 100644 index 000000000000..d22dbec40500 --- /dev/null +++ b/packages/vite/src/waku-lib/vite-plugin-rsc.ts @@ -0,0 +1,171 @@ +// TODO (RSC) Take ownership of this file and move it out ouf the waku-lib folder +import path from 'node:path' + +import * as swc from '@swc/core' +import type { Plugin } from 'vite' + +import * as RSDWNodeLoader from '../react-server-dom-webpack/node-loader' +import type { ResolveFunction } from '../react-server-dom-webpack/node-loader' + +import { codeToInject } from './rsc-utils.js' + +export function rscIndexPlugin(): Plugin { + return { + name: 'rsc-index-plugin', + async transformIndexHtml() { + return [ + { + tag: 'script', + children: codeToInject, + injectTo: 'body', + }, + ] + }, + } +} + +export function rscTransformPlugin(): Plugin { + return { + name: 'rsc-transform-plugin', + async resolveId(id, importer, options) { + if (!id.endsWith('.js')) { + return id + } + + // FIXME This isn't necessary in production mode + for (const ext of ['.js', '.ts', '.tsx', '.jsx']) { + const resolved = await this.resolve(id.slice(0, -3) + ext, importer, { + ...options, + skipSelf: true, + }) + + if (resolved) { + return resolved + } + } + + return undefined + }, + async transform(code, id) { + const resolve: ResolveFunction = async ( + specifier: string, + { parentURL }: { parentURL: string | void; conditions: Array } + ) => { + if (!specifier) { + return { url: '' } + } + + let resolved: Awaited> | undefined + + if (parentURL) { + resolved = await this.resolve(specifier, parentURL, { + skipSelf: true, + }) + } + + if (!resolved) { + throw new Error(`Failed to resolve ${specifier}`) + } + + const url = resolved.id + return { url } + } + + const load = async (url: string) => { + let source = url === id ? code : (await this.load({ id: url })).code + + if (!source) { + throw new Error(`Failed to load ${url}`) + } + + // HACK move directives before import statements. + source = source.replace( + /^(import {.*?} from ".*?";)\s*"use (client|server)";/, + '"use $2";$1' + ) + return { format: 'module', source } + } + + RSDWNodeLoader.resolve( + '', + { conditions: ['react-server'], parentURL: '' }, + resolve + ) + + return (await RSDWNodeLoader.load(id, null, load)).source + }, + } +} + +export function rscReloadPlugin(fn: (type: 'full-reload') => void): Plugin { + let enabled = false + const isClientEntry = (id: string, code: string) => { + const ext = path.extname(id) + if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) { + const mod = swc.parseSync(code, { + syntax: ext === '.ts' || ext === '.tsx' ? 'typescript' : 'ecmascript', + tsx: ext === '.tsx', + }) + for (const item of mod.body) { + if ( + item.type === 'ExpressionStatement' && + item.expression.type === 'StringLiteral' && + item.expression.value === 'use client' + ) { + return true + } + } + } + return false + } + return { + name: 'reload-plugin', + configResolved(config) { + if (config.mode === 'development') { + enabled = true + } + }, + async handleHotUpdate(ctx) { + if (!enabled) { + return [] + } + + if (ctx.modules.length && !isClientEntry(ctx.file, await ctx.read())) { + return fn('full-reload') + } else { + return [] + } + }, + } +} + +export function rscAnalyzePlugin( + clientEntryCallback: (id: string) => void, + serverEntryCallback: (id: string) => void +): Plugin { + return { + name: 'rsc-bundle-plugin', + transform(code, id) { + const ext = path.extname(id) + if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) { + const mod = swc.parseSync(code, { + syntax: ext === '.ts' || ext === '.tsx' ? 'typescript' : 'ecmascript', + tsx: ext === '.tsx', + }) + for (const item of mod.body) { + if ( + item.type === 'ExpressionStatement' && + item.expression.type === 'StringLiteral' + ) { + if (item.expression.value === 'use client') { + clientEntryCallback(id) + } else if (item.expression.value === 'use server') { + serverEntryCallback(id) + } + } + } + } + return code + }, + } +} diff --git a/packages/vite/src/waku-server.ts b/packages/vite/src/waku-server.ts new file mode 100644 index 000000000000..eb6079e2b63d --- /dev/null +++ b/packages/vite/src/waku-server.ts @@ -0,0 +1,27 @@ +import type { FunctionComponent } from 'react' + +export type GetEntry = ( + rscId: string +) => Promise + +export type GetBuilder = ( + // FIXME can we somehow avoid leaking internal implementation? + unstable_decodeId: (encodedId: string) => [id: string, name: string] +) => Promise<{ + [pathStr: string]: { + elements?: Iterable< + readonly [rscId: string, props: unknown, skipPrefetch?: boolean] + > + customCode?: string // optional code to inject + } +}> + +// This is for ignored dynamic imports +// XXX Are there any better ways? +export type unstable_GetCustomModules = () => Promise<{ + [name: string]: string +}> + +export function defineEntries(getEntry: GetEntry, getBuilder?: GetBuilder) { + return { getEntry, getBuilder } +} diff --git a/packages/vite/tsconfig.json b/packages/vite/tsconfig.json index 00e919443e94..4737f682735f 100644 --- a/packages/vite/tsconfig.json +++ b/packages/vite/tsconfig.json @@ -4,12 +4,12 @@ "baseUrl": ".", "rootDir": "src", "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", - "outDir": "dist", + "outDir": "dist" }, - "include": ["src/**/*", "./ambient.d.ts"], + "include": ["src/**/*", "./ambient.d.ts", "./modules.d.ts"], "references": [ { "path": "../internal" }, { "path": "../project-config" }, - { "path": "../web" }, + { "path": "../web" } ] } diff --git a/packages/web/src/global.web-auto-imports.ts b/packages/web/src/global.web-auto-imports.ts index 09594cc8ee42..3740b5386007 100644 --- a/packages/web/src/global.web-auto-imports.ts +++ b/packages/web/src/global.web-auto-imports.ts @@ -7,10 +7,13 @@ import type _PropTypes from 'prop-types' // For "internal" global types see ambient.d.ts declare global { - const React: typeof _React const PropTypes: typeof _PropTypes const gql: typeof _gql + // Having this as a type instead of a const allows us to augment/override it + // in other packages + type React = typeof _React + interface Window { /** URL or absolute path to the GraphQL serverless function */ RWJS_API_GRAPHQL_URL: string diff --git a/yarn.lock b/yarn.lock index b252762b501e..e66f423ecf5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -587,14 +587,14 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.21.5, @babel/compat-data@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/compat-data@npm:7.22.5" - checksum: 97f3c24a71b4e7d5f91c5807f6206a9cdb4123e595c51b34a19e9ea22b837003f969f732fde8819928d66e7b64047fd736c6717c8a1b96bf27fbfc30f6834aff +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.21.5, @babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/compat-data@npm:7.22.6" + checksum: 09971bda48c46e19d8f1d8c817ebd60ccca2ca30b90324ba6227cfa3765847a9ddd7730481ec81149a2270e2c90c2674e41ebbb73258e48c37922171ffe1e6dc languageName: node linkType: hard -"@babel/core@npm:7.22.5, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.12.9, @babel/core@npm:^7.13.16, @babel/core@npm:^7.14.0, @babel/core@npm:^7.20.2, @babel/core@npm:^7.21.3, @babel/core@npm:^7.22.5, @babel/core@npm:^7.7.5": +"@babel/core@npm:7.22.5": version: 7.22.5 resolution: "@babel/core@npm:7.22.5" dependencies: @@ -617,6 +617,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.12.9, @babel/core@npm:^7.13.16, @babel/core@npm:^7.14.0, @babel/core@npm:^7.20.2, @babel/core@npm:^7.21.3, @babel/core@npm:^7.22.5, @babel/core@npm:^7.7.5": + version: 7.22.6 + resolution: "@babel/core@npm:7.22.6" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.22.5 + "@babel/generator": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.6 + "@babel/helper-module-transforms": ^7.22.5 + "@babel/helpers": ^7.22.6 + "@babel/parser": ^7.22.6 + "@babel/template": ^7.22.5 + "@babel/traverse": ^7.22.6 + "@babel/types": ^7.22.5 + "@nicolo-ribaudo/semver-v6": ^6.3.3 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.2 + checksum: e4669022b3d5934c3afe35c5976cdd20fc060f84d790b3c945ad7befd9930124703ed279727404f10254e9462bb449339bc7241b426d1c754a30332dea6013a2 + languageName: node + linkType: hard + "@babel/core@npm:~7.21.0": version: 7.21.8 resolution: "@babel/core@npm:7.21.8" @@ -708,24 +731,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.21.5, @babel/helper-compilation-targets@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-compilation-targets@npm:7.22.5" +"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.21.5, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-compilation-targets@npm:7.22.6" dependencies: - "@babel/compat-data": ^7.22.5 + "@babel/compat-data": ^7.22.6 "@babel/helper-validator-option": ^7.22.5 - browserslist: ^4.21.3 + "@nicolo-ribaudo/semver-v6": ^6.3.3 + browserslist: ^4.21.9 lru-cache: ^5.1.1 - semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: f36a2f27d970fa61b32090840ec847f73c6ada50becf7222c8778dd7ae07661c56f83d57e4c18437160e221512f91c442e3b86703741b45fc1277a548a6fd819 + checksum: a37ae986bbfc61bc1adebe05a415ac03e0e8100e4b1ccbfd6ed90ffe201947beae9d7bd2cebe562199e1326797f908153d7b544520786eecf99fccb9db3c0fa9 languageName: node linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.5" + version: 7.22.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.6" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.5 @@ -734,24 +757,24 @@ __metadata: "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-replace-supers": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 - semver: ^6.3.0 + "@babel/helper-split-export-declaration": ^7.22.6 + "@nicolo-ribaudo/semver-v6": ^6.3.3 peerDependencies: "@babel/core": ^7.0.0 - checksum: a7a98b73dde9c7b0820f5b56e2b8f4cdeaf1a23ec9ab5bb642a9b6cc7c24154e84d20f6de49761dbc34dc84a4797a87db328e8f4b86867bff004a5809fe9e3d5 + checksum: 4411b40bad0b4f1927eaaabbedd0b75cb9a7c18d18c3c2139dcf66a59352092632d8e38fe462337206167f11a6d4a70459ecc06a0ae30400dcbe56773fe3617d languageName: node linkType: hard "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.5" + version: 7.22.6 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.6" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 + "@nicolo-ribaudo/semver-v6": ^6.3.3 regexpu-core: ^5.3.1 - semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 134e019881cd985bf329648c2885eee31298e2ef0610ed3ba36dca8dc3a5d17851c61d890acb7904bf72a755182bdca39861079729ca71940f0149ed589c9f85 + checksum: 09e195edf82c94d04fe4a53dc2dc38f9bac499625e99da21e2b16b3f3f765971ce903b7621fe868e496117a5084fd513d05b5ca58b57f46acc641af84eedc68d languageName: node linkType: hard @@ -771,19 +794,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.0": - version: 0.4.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.0" +"@babel/helper-define-polyfill-provider@npm:^0.4.0, @babel/helper-define-polyfill-provider@npm:^0.4.1": + version: 0.4.1 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.1" 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: 953c6ebda6871f2aa093f002f5e085ecbefe684580543fc7c309fe9aa5ce626758e02697a51cd25acf5cab56b1028a789fd38674d5872de74927a58049fbdc19 + checksum: 402a8ca29354f01640d7226587576479507093437239ec1ba283c190986442a8759e5043859df9795c07c43d9b99d0685ee36ff77974c5be9a0cbec36a8283af languageName: node linkType: hard @@ -909,12 +931,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.18.6, @babel/helper-split-export-declaration@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-split-export-declaration@npm:7.22.5" +"@babel/helper-split-export-declaration@npm:^7.18.6, @babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-split-export-declaration@npm:7.22.6" dependencies: "@babel/types": ^7.22.5 - checksum: a1e463086f97778584c44129c5c37282d033bf97867b300ff42e64279df18d41fe0e56ebe6a1b27f907afa66ad2a313558db8d2e83e73384c5b22ac726c9c52a + checksum: d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 languageName: node linkType: hard @@ -951,14 +973,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.21.5, @babel/helpers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helpers@npm:7.22.5" +"@babel/helpers@npm:^7.21.5, @babel/helpers@npm:^7.22.5, @babel/helpers@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helpers@npm:7.22.6" dependencies: "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 + "@babel/traverse": ^7.22.6 "@babel/types": ^7.22.5 - checksum: efa2d0fc2107e270782a784af3a52e5e0b97187b7b34feeeeb00454bc322e802ff4007b22410c387c05580c793f517c4bafc8a6a3acfdb0e3a1b349728f270c4 + checksum: 8c03c19802d0fcc78d00d1eaa9ddab28f97f0c78a5d570762800e86f08c6f41750ad61e20cdede977a56173edf85e7175f1fd804eb6ef817280f064d3a3ca514 languageName: node linkType: hard @@ -991,7 +1013,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:7.22.5, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.5, @babel/parser@npm:^7.21.8, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.3.2": +"@babel/parser@npm:7.22.5": version: 7.22.5 resolution: "@babel/parser@npm:7.22.5" bin: @@ -1000,6 +1022,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.5, @babel/parser@npm:^7.21.8, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.6, @babel/parser@npm:^7.3.2": + version: 7.22.6 + resolution: "@babel/parser@npm:7.22.6" + bin: + parser: ./bin/babel-parser.js + checksum: efc4ab2ed9b765ea7fa234b3e9b5cb10d81554279e9337fc82b6ebc2de720a40148cc29e18850a0e8679d48367e70f45c76f5197e254528535121615da43496b + languageName: node + linkType: hard + "@babel/parser@npm:~7.21.2": version: 7.21.9 resolution: "@babel/parser@npm:7.21.9" @@ -1585,22 +1616,22 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.21.0, @babel/plugin-transform-classes@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-classes@npm:7.22.5" +"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.21.0, @babel/plugin-transform-classes@npm:^7.22.5, @babel/plugin-transform-classes@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/plugin-transform-classes@npm:7.22.6" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.6 "@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.5 - "@babel/helper-split-export-declaration": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c5ac4a3ea8bf7441246e963c35617c1fe8d6515c94a376ef0b724c6950fbb9e5481c51fc4ff13e5afd8949a6bfe1ef20ab937692054772e2376dfeae3b6b99b5 + checksum: 915f1c0d3a0446a3ebfb099c4a5e714896f773322432b91572e6739d7af82e9743ae2874eb596ef1d26ed94472385eb814e1f33b033fc708155576d566e1f5ff languageName: node linkType: hard @@ -1905,16 +1936,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.22.5" +"@babel/plugin-transform-optional-chaining@npm:^7.22.5, @babel/plugin-transform-optional-chaining@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.22.6" dependencies: "@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-0 - checksum: 73c62d707d47a8a483e81700beef9119e8af7290623b8ac2cf4918fadd7286a700c8fdb846e66b0fb795d4dc67c8e60b13dfed3fa2311129c67314bbe173b82a + checksum: bb8188df57ab46c4c708eea17eddd20238ef9106c0e82016b1eb9565f073746e385e0be0b6ee25148507f3dc849311147a43323109c97106f15e0e7ff3220fdf languageName: node linkType: hard @@ -2193,7 +2224,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.22.5, @babel/preset-env@npm:^7.20.2": +"@babel/preset-env@npm:7.22.5": version: 7.22.5 resolution: "@babel/preset-env@npm:7.22.5" dependencies: @@ -2283,6 +2314,96 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.20.2": + version: 7.22.6 + resolution: "@babel/preset-env@npm:7.22.6" + dependencies: + "@babel/compat-data": ^7.22.6 + "@babel/helper-compilation-targets": ^7.22.6 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-option": ^7.22.5 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.5 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.22.5 + "@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.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 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@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-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.22.5 + "@babel/plugin-transform-async-generator-functions": ^7.22.5 + "@babel/plugin-transform-async-to-generator": ^7.22.5 + "@babel/plugin-transform-block-scoped-functions": ^7.22.5 + "@babel/plugin-transform-block-scoping": ^7.22.5 + "@babel/plugin-transform-class-properties": ^7.22.5 + "@babel/plugin-transform-class-static-block": ^7.22.5 + "@babel/plugin-transform-classes": ^7.22.6 + "@babel/plugin-transform-computed-properties": ^7.22.5 + "@babel/plugin-transform-destructuring": ^7.22.5 + "@babel/plugin-transform-dotall-regex": ^7.22.5 + "@babel/plugin-transform-duplicate-keys": ^7.22.5 + "@babel/plugin-transform-dynamic-import": ^7.22.5 + "@babel/plugin-transform-exponentiation-operator": ^7.22.5 + "@babel/plugin-transform-export-namespace-from": ^7.22.5 + "@babel/plugin-transform-for-of": ^7.22.5 + "@babel/plugin-transform-function-name": ^7.22.5 + "@babel/plugin-transform-json-strings": ^7.22.5 + "@babel/plugin-transform-literals": ^7.22.5 + "@babel/plugin-transform-logical-assignment-operators": ^7.22.5 + "@babel/plugin-transform-member-expression-literals": ^7.22.5 + "@babel/plugin-transform-modules-amd": ^7.22.5 + "@babel/plugin-transform-modules-commonjs": ^7.22.5 + "@babel/plugin-transform-modules-systemjs": ^7.22.5 + "@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.5 + "@babel/plugin-transform-numeric-separator": ^7.22.5 + "@babel/plugin-transform-object-rest-spread": ^7.22.5 + "@babel/plugin-transform-object-super": ^7.22.5 + "@babel/plugin-transform-optional-catch-binding": ^7.22.5 + "@babel/plugin-transform-optional-chaining": ^7.22.6 + "@babel/plugin-transform-parameters": ^7.22.5 + "@babel/plugin-transform-private-methods": ^7.22.5 + "@babel/plugin-transform-private-property-in-object": ^7.22.5 + "@babel/plugin-transform-property-literals": ^7.22.5 + "@babel/plugin-transform-regenerator": ^7.22.5 + "@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.5 + "@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.5 + "@babel/types": ^7.22.5 + "@nicolo-ribaudo/semver-v6": ^6.3.3 + babel-plugin-polyfill-corejs2: ^0.4.3 + babel-plugin-polyfill-corejs3: ^0.8.1 + babel-plugin-polyfill-regenerator: ^0.5.0 + core-js-compat: ^3.31.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: edb9fbfc1c386d33042e6891ea2ca786f2959605170749970c27257421a7b5aa5cf7cbc60735d9d8e48126672f24708383367a5ff01a805033050527a6a46dbf + languageName: node + linkType: hard + "@babel/preset-env@npm:~7.21.0": version: 7.21.5 resolution: "@babel/preset-env@npm:7.21.5" @@ -2461,11 +2582,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": - version: 7.22.5 - resolution: "@babel/runtime@npm:7.22.5" + version: 7.22.6 + resolution: "@babel/runtime@npm:7.22.6" dependencies: regenerator-runtime: ^0.13.11 - checksum: 11dcaeecd2246857ccf22f939fcae28a58d29e410607bfa28b95d9b03e298a3e3df8a530e22637d5bfccfc1661fb39cc50c06b404b5d53454bd93889c7dd3eb8 + checksum: 5a273e7d66586582041c68332028db5376d754d483422541fdc904e10474a6f8aef14dd3a5aabcbcb6daea87b64531cc4be993d2943557ede4a2613f5328a981 languageName: node linkType: hard @@ -2480,7 +2601,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:7.22.5, @babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.21.5, @babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.7.2": +"@babel/traverse@npm:7.22.5": version: 7.22.5 resolution: "@babel/traverse@npm:7.22.5" dependencies: @@ -2498,6 +2619,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.21.5, @babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/traverse@npm:7.22.6" + dependencies: + "@babel/code-frame": ^7.22.5 + "@babel/generator": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.22.6 + "@babel/types": ^7.22.5 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 2806f03033df822e987216d74fd1cbbe91aabeaa7f7e65cc3e6396e591ba1ef51f48e6c46a372cd0cda3258020791e2051d80b2bac542a19c8eb9c50d504bee4 + languageName: node + linkType: hard + "@babel/traverse@npm:~7.21.2": version: 7.21.5 resolution: "@babel/traverse@npm:7.21.5" @@ -3378,19 +3517,19 @@ __metadata: linkType: hard "@eslint/eslintrc@npm:^2.0.3": - version: 2.0.3 - resolution: "@eslint/eslintrc@npm:2.0.3" + version: 2.1.0 + resolution: "@eslint/eslintrc@npm:2.1.0" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.5.2 + espree: ^9.6.0 globals: ^13.19.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 46291c33bf580ab12101fb7f20adabaa60326a7de094409ab4a5ca4611552ab2325f8d677d6c1d2d9f45f83f93360b115a0b4488bc48180cca0d0f386804d829 + checksum: 6ffbc3e7867b377754492539af0e2f5b55645a2c67279a70508fe09080bc76d49ba64b579e59a2a04014f84d0768301736fbcdd94c7b3ad4f0e648c32bf21e43 languageName: node linkType: hard @@ -4714,7 +4853,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:10.0.1, @graphql-tools/utils@npm:^10.0.0": +"@graphql-tools/utils@npm:10.0.1": version: 10.0.1 resolution: "@graphql-tools/utils@npm:10.0.1" dependencies: @@ -4726,6 +4865,19 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/utils@npm:^10.0.0": + version: 10.0.3 + resolution: "@graphql-tools/utils@npm:10.0.3" + dependencies: + "@graphql-typed-document-node/core": ^3.1.1 + dset: ^3.1.2 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 68cddc24bbf7a96479444a644b3c41b2ed3616d127159d420589162b85dddada8a3c9b726fba96740bca3a05ee913dc5d6e5e32c6855e3958833c0dff0d225cf + languageName: node + linkType: hard + "@graphql-tools/utils@npm:^8.5.2, @graphql-tools/utils@npm:^8.8.0": version: 8.13.1 resolution: "@graphql-tools/utils@npm:8.13.1" @@ -4991,29 +5143,29 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/console@npm:29.5.0" +"@jest/console@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/console@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 + jest-message-util: ^29.6.0 + jest-util: ^29.6.0 slash: ^3.0.0 - checksum: 59dfbdb6c3c15652f8d7267071f24d6335afbed0b1cf71aed70b6ce8deb1d86e7f4aadb978f639435650107fd22476b59e63a3d3a9ac99b1aca739b795a54410 + checksum: 04b2010a4f58f65745e54be87be5d4d7c1ef4efd4386dfec12f9ab350705618f5eb9afa73464ecaeded62846d57dd3bde5218a987ee48f40072523b5703c045c languageName: node linkType: hard -"@jest/core@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/core@npm:29.5.0" +"@jest/core@npm:^29.5.0, @jest/core@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/core@npm:29.6.0" dependencies: - "@jest/console": ^29.5.0 - "@jest/reporters": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.6.0 + "@jest/reporters": ^29.6.0 + "@jest/test-result": ^29.6.0 + "@jest/transform": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 @@ -5021,20 +5173,20 @@ __metadata: exit: ^0.1.2 graceful-fs: ^4.2.9 jest-changed-files: ^29.5.0 - jest-config: ^29.5.0 - jest-haste-map: ^29.5.0 - jest-message-util: ^29.5.0 + jest-config: ^29.6.0 + jest-haste-map: ^29.6.0 + jest-message-util: ^29.6.0 jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-resolve-dependencies: ^29.5.0 - jest-runner: ^29.5.0 - jest-runtime: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 - jest-watcher: ^29.5.0 + jest-resolve: ^29.6.0 + jest-resolve-dependencies: ^29.6.0 + jest-runner: ^29.6.0 + jest-runtime: ^29.6.0 + jest-snapshot: ^29.6.0 + jest-util: ^29.6.0 + jest-validate: ^29.6.0 + jest-watcher: ^29.6.0 micromatch: ^4.0.4 - pretty-format: ^29.5.0 + pretty-format: ^29.6.0 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -5042,77 +5194,77 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: e4b3e0de48614b2c339083b9159f00a024839984bd89b9afa4cfff4c38f6ce485c2009f2efa1c1e3bb3b87386288bc15798c6aebb7937d7820e8048d75461a4d + checksum: 9ab0313a6dc94d9b8e0e5169984e6a9cd44a14e22c23c3b1b2558b749b2a668807708e9980f3aa0a8ddb4476ae755cd6f6fda37c756054a4b90a0d8c00eb306d languageName: node linkType: hard -"@jest/environment@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/environment@npm:29.5.0" +"@jest/environment@npm:^29.5.0, @jest/environment@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/environment@npm:29.6.0" dependencies: - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/fake-timers": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" - jest-mock: ^29.5.0 - checksum: 1fbe63cbfb9c3f6c9fc9d8f6917a5aceee1828d589569bbffcf5fb4bb56bc021dc3a6f239cde3099144767c97763ae134904ee522f236cd8c0d071bd7f9ef63b + jest-mock: ^29.6.0 + checksum: 49c7c100b55990090961a9f99ae968de2fdfe3987ea02b88d78f65d3c753ca926c03bfd8a6d8b37b6dc764e52692befe9fe5d260f63cc3dbb2204a420fa13d1e languageName: node linkType: hard -"@jest/expect-utils@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/expect-utils@npm:29.5.0" +"@jest/expect-utils@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/expect-utils@npm:29.6.0" dependencies: jest-get-type: ^29.4.3 - checksum: e7f44de651b5ef71c6e1b7a0350a704258167c20b6e8165b3100346d5c7f8eb4cd2c229ea2c048e9161666d1c086fbbc422f111f3b77da3fb89a99d52d4b3690 + checksum: 53f19b6162e427af2808033534b96ab93e5f174b97b23931b4adac8b12a81322b9fa6997fa7de08ba71114a224d19d037d8f21e4539833fd5d8fb62e3bfe59dc languageName: node linkType: hard -"@jest/expect@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/expect@npm:29.5.0" +"@jest/expect@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/expect@npm:29.6.0" dependencies: - expect: ^29.5.0 - jest-snapshot: ^29.5.0 - checksum: 447e7450af8ba61ac34d8a2ca11c56c62f6f0fb33ff13130f11a1ec9526a08d756ee72da622316a2c52ecfe726fe14432bdfb46e45aff5676f8d1a8efc8d201c + expect: ^29.6.0 + jest-snapshot: ^29.6.0 + checksum: e6bd23e082b2ff1f2c7780b47216347aea83776236d8936d84c692a1cc2657c4b6bc03d13dc0025fb635b61e4d14bae030941293225c9ab847616f783fc308a4 languageName: node linkType: hard -"@jest/fake-timers@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/fake-timers@npm:29.5.0" +"@jest/fake-timers@npm:^29.5.0, @jest/fake-timers@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/fake-timers@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.5.0 - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - checksum: dbf52fd302bf6b3d7ec49499f12835b7d7d4069d61adc62dac233021eba61186bbad3add1ceb3225a23a8745dd04fa0dcc2c38d350ecb0f26eec63f2cf5e6aff + jest-message-util: ^29.6.0 + jest-mock: ^29.6.0 + jest-util: ^29.6.0 + checksum: 3f3dca4c2d96aadc2f9192473a4b181ddf0cf8b67f7c6b19c95d11a121fd3de92716297091ae0caa9bc3bc43e8e50a2882fe285b1508c8f3235896956b908b31 languageName: node linkType: hard -"@jest/globals@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/globals@npm:29.5.0" +"@jest/globals@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/globals@npm:29.6.0" dependencies: - "@jest/environment": ^29.5.0 - "@jest/expect": ^29.5.0 - "@jest/types": ^29.5.0 - jest-mock: ^29.5.0 - checksum: 0c25f07d8125e45cf3c21442e625f6a636eaf7f4cf1cf3f9f66bae059aeb31d3dc61dfff9479eb861a5089dca34c95e231ad88b8925bee42387abecbfe5ecbc2 + "@jest/environment": ^29.6.0 + "@jest/expect": ^29.6.0 + "@jest/types": ^29.6.0 + jest-mock: ^29.6.0 + checksum: ce7c8fe70d2e06c9a33f9ee71f9cca36391ddf79360b9f4675554ccc414f6e84ffd1ff0befc91b1833fae2ff4d1cf366b94d4e7d91b48fde662bec7bfa23c03d languageName: node linkType: hard -"@jest/reporters@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/reporters@npm:29.5.0" +"@jest/reporters@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/reporters@npm:29.6.0" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@jridgewell/trace-mapping": ^0.3.15 + "@jest/console": ^29.6.0 + "@jest/test-result": ^29.6.0 + "@jest/transform": ^29.6.0 + "@jest/types": ^29.6.0 + "@jridgewell/trace-mapping": ^0.3.18 "@types/node": "*" chalk: ^4.0.0 collect-v8-coverage: ^1.0.0 @@ -5124,9 +5276,9 @@ __metadata: istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - jest-worker: ^29.5.0 + jest-message-util: ^29.6.0 + jest-util: ^29.6.0 + jest-worker: ^29.6.0 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -5136,88 +5288,88 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 72b771a7749ac2eb9b671f2a886dc98cbe914dfa1a4266854b040e4cc563bf9f5db02b8ff8654b7bfbc3b28caa6d48ca0dde9707454ea4f79d77bd13b6357929 + checksum: a7de9cd6140095ead210c5d32c220895d8ad0151b458af93839c79b5803162bb328830530b0d0bf2b3ef60f3e6a8ccc6c75a75c590687828dbce3ac24e01e51b languageName: node linkType: hard -"@jest/schemas@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/schemas@npm:29.4.3" +"@jest/schemas@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/schemas@npm:29.6.0" dependencies: - "@sinclair/typebox": ^0.25.16 - checksum: 8a35967cec454d1de2d5a58ab99b49a0ff798d1dce2d817bdd9960bb2f070493f767fbbf419e6a263860d3b1ef1e50ab609a76ae21b5f8c09bb0859e8f51a098 + "@sinclair/typebox": ^0.27.8 + checksum: 8671b1fb59c4296204d335190e8451e1983d9f2db6dbbd38f838c6c273fd222fc11e4e0df04adfb6169d36acfb9693d525db136653ec04e6884180f45a131d8f languageName: node linkType: hard -"@jest/source-map@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/source-map@npm:29.4.3" +"@jest/source-map@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/source-map@npm:29.6.0" dependencies: - "@jridgewell/trace-mapping": ^0.3.15 + "@jridgewell/trace-mapping": ^0.3.18 callsites: ^3.0.0 graceful-fs: ^4.2.9 - checksum: 353f9989dcb416e8a2559ad2831b4b3e8446a9f8259782cec97f89903b5c00baa76ea3e23a3f1c83c1ccb3999a9e318b8c6a4bab29e4b66a4abdbb760e445a50 + checksum: afa654e3634ad74d5f8388ccffd7ecbd745bdce7f6f0860b69c07827c3ee5bb408f52b6c3136b43157ef5874c099059484e43bd3aa391232ab27d8c330399789 languageName: node linkType: hard -"@jest/test-result@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/test-result@npm:29.5.0" +"@jest/test-result@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/test-result@npm:29.6.0" dependencies: - "@jest/console": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.6.0 + "@jest/types": ^29.6.0 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 5d637c9935ea0438b2a7c106d48756967e5a96fa4426a9b16ea2a3e73e1538eabd10fd4faa8eb46aa4fee710a165e0fd2ce0603dacde5e8a1bba541100854b1d + checksum: 81828bd442af347e44222f4d89e27bc4350ccfb0184e1c7368e9c5e9cd796fd5a031bbfb93b3dd5ac96cfab2806b2d1dad6735c3d821b01e19f48a29c672cc6b languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/test-sequencer@npm:29.5.0" +"@jest/test-sequencer@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/test-sequencer@npm:29.6.0" dependencies: - "@jest/test-result": ^29.5.0 + "@jest/test-result": ^29.6.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 + jest-haste-map: ^29.6.0 slash: ^3.0.0 - checksum: 6fb7549a5dbe2da6817eb853134f76cf2b320b283900c5e63c997ecfadc616379372a49ac8c0f4ffdb9616eed4a5908c74cb7a560a395a6e1dc0d072b865657b + checksum: 51b6f795515e6b1f785ad6ea219ff21c6c05e5587246bb26a384c5a391983387645668bc296a22020a0eb7bf66c6a658f4af2084c5b88e91b53356b45325def1 languageName: node linkType: hard -"@jest/transform@npm:^29.3.1, @jest/transform@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/transform@npm:29.5.0" +"@jest/transform@npm:^29.3.1, @jest/transform@npm:^29.5.0, @jest/transform@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/transform@npm:29.6.0" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.5.0 - "@jridgewell/trace-mapping": ^0.3.15 + "@jest/types": ^29.6.0 + "@jridgewell/trace-mapping": ^0.3.18 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 + jest-haste-map: ^29.6.0 jest-regex-util: ^29.4.3 - jest-util: ^29.5.0 + jest-util: ^29.6.0 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.2 - checksum: 113598311d84ec7e4a4aadd340e332bbfbbd66e20eabea8b2f084b80cf97c1bc9e1ff90278c4f04b227afa95e3386d702363715f9923062c370c042c31911d94 + checksum: 8730b7647f398e47ff9a45c8cdbc1e78283e38fdabbb52abd20062617d7c72cc10b154a4a3c1a19f05b4c01c24036a9da8f700ccf80ca911ca4cdac1917ab28d languageName: node linkType: hard -"@jest/types@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/types@npm:29.5.0" +"@jest/types@npm:^29.5.0, @jest/types@npm:^29.6.0": + version: 29.6.0 + resolution: "@jest/types@npm:29.6.0" dependencies: - "@jest/schemas": ^29.4.3 + "@jest/schemas": ^29.6.0 "@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: f1cccd2e9b00a985bfdac03517f906cdf7a481be3606c335f8ec08a7272b7cf700b23484ce323a912b374defb90d3ab88c643cf2a2f47635c1c4feacfa1c1b2d + checksum: 48047182af12e50460d3bdd86699383d8999cca7dd3a4825ea3e9e6791f81733f7626b5fc07409a8aeec566cb790e4949d207a927ddc800ab7db46f76633b31a languageName: node linkType: hard @@ -5261,9 +5413,12 @@ __metadata: linkType: hard "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.4 - resolution: "@jridgewell/source-map@npm:0.3.4" - checksum: 4b83e015c3df8552b303f0d7d3f46b9fc297ae08e67dfe621ccbacf2879193e0890c397668a75ec90444de701616905376b02305d1a762c813ca03e86b8d9def + 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 @@ -5291,7 +5446,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.18 resolution: "@jridgewell/trace-mapping@npm:0.3.18" dependencies: @@ -5489,6 +5644,15 @@ __metadata: languageName: node linkType: hard +"@nicolo-ribaudo/semver-v6@npm:^6.3.3": + version: 6.3.3 + resolution: "@nicolo-ribaudo/semver-v6@npm:6.3.3" + bin: + semver: bin/semver.js + checksum: 9ef70305fa9b03709805128611c0d95beec479cdd6f6b608386d6cee7a3d36f61e6f749378b60f1e5fca19fc58da7b06fccfe3540c0dbc40719731827d4eb1df + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -5699,12 +5863,12 @@ __metadata: languageName: node linkType: hard -"@nrwl/devkit@npm:16.4.1": - version: 16.4.1 - resolution: "@nrwl/devkit@npm:16.4.1" +"@nrwl/devkit@npm:16.4.3": + version: 16.4.3 + resolution: "@nrwl/devkit@npm:16.4.3" dependencies: - "@nx/devkit": 16.4.1 - checksum: 9382bc2e05a9849042b8a738108fe5b59a18aeee9de349ef06196311b588482e7c3ea4909769ed255928c3827704ecc4efa8fa3bd5be8593662c903e94dc28fb + "@nx/devkit": 16.4.3 + checksum: 062be3bb0a6e1013e98e0d7eeeb2bae49567d777165eb8c99e144575f4d737ef9792c7e7ba143a6d1b0ae8d86e5a3ac425ca19860f84004c361a1621cd8398e6 languageName: node linkType: hard @@ -5728,22 +5892,22 @@ __metadata: languageName: node linkType: hard -"@nrwl/tao@npm:16.4.1": - version: 16.4.1 - resolution: "@nrwl/tao@npm:16.4.1" +"@nrwl/tao@npm:16.4.3": + version: 16.4.3 + resolution: "@nrwl/tao@npm:16.4.3" dependencies: - nx: 16.4.1 + nx: 16.4.3 bin: tao: index.js - checksum: 1b170fe0a1cfdb85b43947f47b96f0bcc62ee3c24b183b479d25dc280b2338d65269105e2297382c6527d6e95a11ef3a09022a5eef3134b9a0ae69a729547239 + checksum: bc0c6b1409da7e22d3147f81a09826db0a5bdb2b8a5d2f3b80a4fe1c1d575a5a01313f6098940c2bec1fe25f8fad3adc801a53334f30172b19bbc64408a841a8 languageName: node linkType: hard -"@nx/devkit@npm:16.4.1, @nx/devkit@npm:>=16.1.3 < 17": - version: 16.4.1 - resolution: "@nx/devkit@npm:16.4.1" +"@nx/devkit@npm:16.4.3, @nx/devkit@npm:>=16.1.3 < 17": + version: 16.4.3 + resolution: "@nx/devkit@npm:16.4.3" dependencies: - "@nrwl/devkit": 16.4.1 + "@nrwl/devkit": 16.4.3 ejs: ^3.1.7 ignore: ^5.0.4 semver: 7.5.3 @@ -5751,7 +5915,7 @@ __metadata: tslib: ^2.3.0 peerDependencies: nx: ">= 15 <= 17" - checksum: b2b6b779f9a8f90ecd6e0da1777c87f3102a5ee87d415bf1c02d2086b992dc1e309297c37cad158113e1f6b9cb2f028f428c980bc21dfb1989ef9ea4b46b24da + checksum: b470ee4cdb920a5880a781045a3b0bffce1d1c1f5be65d1c92a074f87325d3d8c29668703b56436112d5e87b98024437542bde4163f89aac67433f6e18be6043 languageName: node linkType: hard @@ -5762,9 +5926,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-darwin-arm64@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-darwin-arm64@npm:16.4.1" +"@nx/nx-darwin-arm64@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-darwin-arm64@npm:16.4.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -5776,9 +5940,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-darwin-x64@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-darwin-x64@npm:16.4.1" +"@nx/nx-darwin-x64@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-darwin-x64@npm:16.4.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -5790,9 +5954,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-freebsd-x64@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-freebsd-x64@npm:16.4.1" +"@nx/nx-freebsd-x64@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-freebsd-x64@npm:16.4.3" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -5804,9 +5968,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-linux-arm-gnueabihf@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-linux-arm-gnueabihf@npm:16.4.1" +"@nx/nx-linux-arm-gnueabihf@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:16.4.3" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -5818,9 +5982,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-linux-arm64-gnu@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-linux-arm64-gnu@npm:16.4.1" +"@nx/nx-linux-arm64-gnu@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-linux-arm64-gnu@npm:16.4.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -5832,9 +5996,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-linux-arm64-musl@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-linux-arm64-musl@npm:16.4.1" +"@nx/nx-linux-arm64-musl@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-linux-arm64-musl@npm:16.4.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -5846,9 +6010,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-linux-x64-gnu@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-linux-x64-gnu@npm:16.4.1" +"@nx/nx-linux-x64-gnu@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-linux-x64-gnu@npm:16.4.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -5860,9 +6024,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-linux-x64-musl@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-linux-x64-musl@npm:16.4.1" +"@nx/nx-linux-x64-musl@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-linux-x64-musl@npm:16.4.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -5874,9 +6038,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-win32-arm64-msvc@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-win32-arm64-msvc@npm:16.4.1" +"@nx/nx-win32-arm64-msvc@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-win32-arm64-msvc@npm:16.4.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -5888,9 +6052,9 @@ __metadata: languageName: node linkType: hard -"@nx/nx-win32-x64-msvc@npm:16.4.1": - version: 16.4.1 - resolution: "@nx/nx-win32-x64-msvc@npm:16.4.1" +"@nx/nx-win32-x64-msvc@npm:16.4.3": + version: 16.4.3 + resolution: "@nx/nx-win32-x64-msvc@npm:16.4.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6398,6 +6562,76 @@ __metadata: languageName: node linkType: hard +"@parcel/watcher-android-arm64@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-android-arm64@npm:2.2.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.2.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.2.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.2.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.2.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.2.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.2.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.2.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.2.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.2.0": + version: 2.2.0 + resolution: "@parcel/watcher-win32-x64@npm:2.2.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@parcel/watcher@npm:2.0.4": version: 2.0.4 resolution: "@parcel/watcher@npm:2.0.4" @@ -6410,15 +6644,46 @@ __metadata: linkType: hard "@parcel/watcher@npm:^2.1.0": - version: 2.1.0 - resolution: "@parcel/watcher@npm:2.1.0" - dependencies: + version: 2.2.0 + resolution: "@parcel/watcher@npm:2.2.0" + dependencies: + "@parcel/watcher-android-arm64": 2.2.0 + "@parcel/watcher-darwin-arm64": 2.2.0 + "@parcel/watcher-darwin-x64": 2.2.0 + "@parcel/watcher-linux-arm-glibc": 2.2.0 + "@parcel/watcher-linux-arm64-glibc": 2.2.0 + "@parcel/watcher-linux-arm64-musl": 2.2.0 + "@parcel/watcher-linux-x64-glibc": 2.2.0 + "@parcel/watcher-linux-x64-musl": 2.2.0 + "@parcel/watcher-win32-arm64": 2.2.0 + "@parcel/watcher-win32-x64": 2.2.0 + detect-libc: ^1.0.3 is-glob: ^4.0.3 micromatch: ^4.0.5 - node-addon-api: ^3.2.1 + node-addon-api: ^7.0.0 node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: e11adf285cb959d17f2126db76b9c3e42a4c7bb0acac3726fab913e1dc589bfd3f84a0818306417367e852d3a78cb859a96a898d41e03254a5092b0921a354fc + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 905d7eff0caf3461cbcf3ffa08f0f1886790fe965c7a914e04cb35807b4770121cad95eb67c9d09165fe7be0799a2e3530e75b1131f18cdff9e326f457bd37d1 languageName: node linkType: hard @@ -8105,9 +8370,12 @@ __metadata: "@redwoodjs/internal": 5.0.0 "@redwoodjs/project-config": 5.0.0 "@redwoodjs/web": 5.0.0 + "@swc/core": 1.3.60 "@types/express": 4 + "@types/react": 18.2.14 "@types/yargs-parser": 21.0.0 "@vitejs/plugin-react": 4.0.1 + acorn-loose: ^8.3.0 buffer: 6.0.3 core-js: 3.31.0 dotenv-defaults: 5.0.2 @@ -8116,6 +8384,8 @@ __metadata: http-proxy-middleware: 2.0.6 isbot: 3.6.8 jest: 29.5.0 + react: 18.3.0-canary-035a41c4e-20230704 + react-server-dom-webpack: 18.3.0-canary-035a41c4e-20230704 typescript: 5.1.3 vite: 4.3.9 vite-plugin-environment: 1.1.3 @@ -8205,14 +8475,13 @@ __metadata: languageName: node linkType: hard -"@sigstore/tuf@npm:^1.0.0": - version: 1.0.0 - resolution: "@sigstore/tuf@npm:1.0.0" +"@sigstore/tuf@npm:^1.0.1": + version: 1.0.2 + resolution: "@sigstore/tuf@npm:1.0.2" dependencies: "@sigstore/protobuf-specs": ^0.1.0 - make-fetch-happen: ^11.0.1 - tuf-js: ^1.1.3 - checksum: 95251d95b42875907863f67637238c4cafe7c24d816ab01f71dc6ac07e275d8fef33c65d49a4165368c208e427119bd57737e4913dd7053cee0021195bc5655f + tuf-js: ^1.1.7 + checksum: de76e20e6c131b118aa721c62efa1f7512ecbe3d94044770ddc06edb5d78be79fef0da1b81b69c2b012ed6fd2ace0fe0080e5dbdc40703d170de550188befb34 languageName: node linkType: hard @@ -8263,10 +8532,10 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.25.16": - version: 0.25.24 - resolution: "@sinclair/typebox@npm:0.25.24" - checksum: 2faf9878f3a65a1f2855add80b0fe8c6fe83f084ea1ab432fa7506e7c85c55ae121c4af516d089b5737f5fad23b3628fcc83a6a5df29030c3f611185ce0388ac +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e languageName: node linkType: hard @@ -9314,11 +9583,11 @@ __metadata: linkType: hard "@supabase/gotrue-js@npm:^2.31.0": - version: 2.37.0 - resolution: "@supabase/gotrue-js@npm:2.37.0" + version: 2.39.0 + resolution: "@supabase/gotrue-js@npm:2.39.0" dependencies: cross-fetch: ^3.1.5 - checksum: 9727b6dd04c52f333036ce857b315dfae230779954812e20a6ea43aba0d8d4f41b450207bfba6e6cf695e2abad2242843cd9b58fc63c4f8c7f846b6a6b6ea587 + checksum: 5e2b45bbcc8724df56a7c73f30d79d3fe4907754cd040c1433604a225bbb838cbd79557c20dfe35bb4e95863ddc1e268d69de1dc73bad6bd58a7779895379b4b languageName: node linkType: hard @@ -9492,6 +9761,120 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-darwin-arm64@npm:1.3.60" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-darwin-x64@npm:1.3.60" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.60" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.60" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.60" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.60" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-linux-x64-musl@npm:1.3.60" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.60" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.60" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.60" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:1.3.60": + version: 1.3.60 + resolution: "@swc/core@npm:1.3.60" + dependencies: + "@swc/core-darwin-arm64": 1.3.60 + "@swc/core-darwin-x64": 1.3.60 + "@swc/core-linux-arm-gnueabihf": 1.3.60 + "@swc/core-linux-arm64-gnu": 1.3.60 + "@swc/core-linux-arm64-musl": 1.3.60 + "@swc/core-linux-x64-gnu": 1.3.60 + "@swc/core-linux-x64-musl": 1.3.60 + "@swc/core-win32-arm64-msvc": 1.3.60 + "@swc/core-win32-ia32-msvc": 1.3.60 + "@swc/core-win32-x64-msvc": 1.3.60 + peerDependencies: + "@swc/helpers": ^0.5.0 + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: ec016437e1814cd4ca75bd96925dfda759a839f95163c0e647ac3eb5e055a9145269b6daf1c7956aab49c0a0c2d92d4619c69c1924faaef5414ea36e25f22baf + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^1.1.2": version: 1.1.2 resolution: "@szmarczak/http-timer@npm:1.1.2" @@ -10331,9 +10714,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 20.3.2 - resolution: "@types/node@npm:20.3.2" - checksum: d857cbe388d11fefd6c598144db42a32e1c15c09624b9e0669ec65e9d72e080093db3ec6b536037e6575574e33413479d4b3762140c2544ff30eb0c2111b5596 + version: 20.3.3 + resolution: "@types/node@npm:20.3.3" + checksum: d172311e9e2d42e060eacb78ecdfd4e1596dbd1e54939bacf42003c84559bdcb5d7dbe539dc5262db4c8f408e21f3abd65435fec9bc0ff8968a3b32dafde0bbf languageName: node linkType: hard @@ -10344,7 +10727,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:18.16.18, @types/node@npm:^18.11.9, @types/node@npm:^18.16.3": +"@types/node@npm:18.16.18": version: 18.16.18 resolution: "@types/node@npm:18.16.18" checksum: 1ad22342d1aaad446625e7eb2ca6137d0036fbc451fcb367c005ed4d6a102190bbba3d104652b2f9a73d0e520752b98fb89f22f5ef8fe09e8487bcb6fd75223f @@ -10352,16 +10735,23 @@ __metadata: linkType: hard "@types/node@npm:^14.14.31": - version: 14.18.52 - resolution: "@types/node@npm:14.18.52" - checksum: 25b34334c109fae745ad7d52d2eebbc20e2feee5967594008992338f05f1d235d3f56929d3213b15dbb35681b2722dd106c603170606f2ec89e1215ba490e080 + version: 14.18.53 + resolution: "@types/node@npm:14.18.53" + checksum: 8248f9d3813b74fc059fe5d6c709bceb599988a107ca2a127081bee75659d17f91d5d08cf1f4785c87ba6e73b0c9ae6b5e9da69d88527c723907dc19af65336e languageName: node linkType: hard "@types/node@npm:^16.0.0": - version: 16.18.37 - resolution: "@types/node@npm:16.18.37" - checksum: b0bc60bb9045ab13af31d4de14a53a0e2617296bb3c686849150d579043691164833b844ca0db1fea16d91d8e8d8fc6fc91ebf38f8615044bd131198de38ac90 + version: 16.18.38 + resolution: "@types/node@npm:16.18.38" + checksum: 02631f1cfe0c111024e4bf0909c3bfc7476e65e03cb32dc48b2f71f000590b244d239b349b91a6b03667c33f31fbd3200c8fc5838623fcaadce3e92d60efee1a + languageName: node + linkType: hard + +"@types/node@npm:^18.11.9, @types/node@npm:^18.16.3": + version: 18.16.19 + resolution: "@types/node@npm:18.16.19" + checksum: 322aaf3c04dcbbae619c7e8d40ed70e4ae41894e88776267d87bf3719a71b9a21ecde903d9f67cec3a663cf608d2822056ab739b48dada75433db38fadac2514 languageName: node linkType: hard @@ -11404,12 +11794,12 @@ __metadata: linkType: hard "@yarnpkg/parsers@npm:^3.0.0-rc.18": - version: 3.0.0-rc.47.1 - resolution: "@yarnpkg/parsers@npm:3.0.0-rc.47.1" + version: 3.0.0-rc.48.1 + resolution: "@yarnpkg/parsers@npm:3.0.0-rc.48.1" dependencies: js-yaml: ^3.10.0 tslib: ^2.4.0 - checksum: f06da6653a79c6eeaabaddbc73c120c49362fdffcbc00993c3c706e2362094881b19c960d6b0ae22a06b81a1d8ef9112ac9829c8961682f30dd0a4357a55d21c + checksum: 05197a056e9817f9fe059df303f7e0cb9b1740ffd18b4f5bc831366f8284f638973f1ae324e99300c463540ecb5a3c189c1b36f96c320d782c8224ff2954e8c2 languageName: node linkType: hard @@ -11525,7 +11915,7 @@ __metadata: languageName: node linkType: hard -"acorn-loose@npm:8.3.0": +"acorn-loose@npm:8.3.0, acorn-loose@npm:^8.3.0": version: 8.3.0 resolution: "acorn-loose@npm:8.3.0" dependencies: @@ -11548,7 +11938,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:8.9.0, acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2": +"acorn@npm:8.9.0": version: 8.9.0 resolution: "acorn@npm:8.9.0" bin: @@ -11575,6 +11965,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: deaeebfbea6e40f6c0e1070e9b0e16e76ba484de54cbd735914d1d41d19169a450de8630b7a3a0c4e271a3b0c0b075a3427ad1a40d8a69f8747c0e8cb02ee3e2 + languageName: node + linkType: hard + "add-stream@npm:^1.0.0": version: 1.0.0 resolution: "add-stream@npm:1.0.0" @@ -12394,8 +12793,8 @@ __metadata: linkType: hard "aws-sdk@npm:^2.814.0": - version: 2.1408.0 - resolution: "aws-sdk@npm:2.1408.0" + version: 2.1410.0 + resolution: "aws-sdk@npm:2.1410.0" dependencies: buffer: 4.9.2 events: 1.1.1 @@ -12407,7 +12806,7 @@ __metadata: util: ^0.12.4 uuid: 8.0.0 xml2js: 0.5.0 - checksum: 32db1abaf86b7ff39d095ce2e144c838d7299b390751498182719924603c702cda0145e9bd9538dc941f01134c77e2e9e3cded35a411d5cd5d0d0eecabc41b25 + checksum: cc95d2eb4bb81b7df4738911a6e2591cfeb141b1dc6d057620b4c5639245d43c153cb50d6a89e47e1b4a9c10a5782c402330b4e6925bb2eee5e34fb0afae9ead languageName: node linkType: hard @@ -12472,7 +12871,7 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:29.5.0, babel-jest@npm:^29.5.0": +"babel-jest@npm:29.5.0": version: 29.5.0 resolution: "babel-jest@npm:29.5.0" dependencies: @@ -12489,6 +12888,23 @@ __metadata: languageName: node linkType: hard +"babel-jest@npm:^29.6.0": + version: 29.6.0 + resolution: "babel-jest@npm:29.6.0" + dependencies: + "@jest/transform": ^29.6.0 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.5.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 86c2fbe7de4770183e53f9cbf7cad120f476c5df5ebdaca9bede260a375458888435b6d1c83566abaef9d8a67bf1f4783ae1ee97c94c7e7e40736e499994ac2e + languageName: node + linkType: hard + "babel-literal-to-ast@npm:^2.1.0": version: 2.1.0 resolution: "babel-literal-to-ast@npm:2.1.0" @@ -12628,19 +13044,19 @@ __metadata: linkType: hard "babel-plugin-polyfill-corejs2@npm:^0.4.3": - version: 0.4.3 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.3" + version: 0.4.4 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.4" dependencies: - "@babel/compat-data": ^7.17.7 - "@babel/helper-define-polyfill-provider": ^0.4.0 - semver: ^6.1.1 + "@babel/compat-data": ^7.22.6 + "@babel/helper-define-polyfill-provider": ^0.4.1 + "@nicolo-ribaudo/semver-v6": ^6.3.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 27e014ab6116704a201a71aefa2a377f26d0e5432d0dcb7f71930773ef0ddac7a693f3a6699721efa15ae4c83631a35dcc52cc8b3032878b2dadd0a33aeabc59 + checksum: 4bb3056ae17002776e3003314068bdd7dd8e5d4b038ce1198db84346b953e73beb8d2b4445bff831c09ff217e533466eb28e771a80c3696decc2dae1347164e3 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:0.8.1, babel-plugin-polyfill-corejs3@npm:^0.8.1": +"babel-plugin-polyfill-corejs3@npm:0.8.1": version: 0.8.1 resolution: "babel-plugin-polyfill-corejs3@npm:0.8.1" dependencies: @@ -12664,6 +13080,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.8.1": + version: 0.8.2 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.2" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.4.1 + core-js-compat: ^3.31.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: de094cc9d703a3bf6518f4312491b6f033f2db45791825499c905173b2d7d0f8ab9b1919a607eb76833907c6533a2106c951108da7689c0929354d38c661f346 + languageName: node + linkType: hard + "babel-plugin-polyfill-regenerator@npm:^0.4.1": version: 0.4.1 resolution: "babel-plugin-polyfill-regenerator@npm:0.4.1" @@ -12676,13 +13104,13 @@ __metadata: linkType: hard "babel-plugin-polyfill-regenerator@npm:^0.5.0": - version: 0.5.0 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.0" + version: 0.5.1 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.1" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.0 + "@babel/helper-define-polyfill-provider": ^0.4.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d33f4e6f5b925754175d4058ede4d400ea92b9ad465f07a4211e4ad01a6cdb60e3a04428150eb9dd5fb7ba9c1d0cba9e22278206462b432d46d7d851b3c3cb19 + checksum: 5ec9e2ab2f031028a36f8d611f3fc3bc8347e2842e4354a28ac303e81697968549ea0ebea79cf0c28658e1e09d3a55a2a2085bb5a53d00f28bd688daa301fd6b languageName: node linkType: hard @@ -13219,7 +13647,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5": +"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5, browserslist@npm:^4.21.9": version: 4.21.9 resolution: "browserslist@npm:4.21.9" dependencies: @@ -13578,9 +14006,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001509 - resolution: "caniuse-lite@npm:1.0.30001509" - checksum: 631e61b8de50174ffe0baeb0b87d52f0b873bae6c13b4b4eb7eb9e2dbd7d48fb05c8426cc9eccc21e4e4156d2d2bdfe7f7d9677a6f9484c2f24404e737020700 + version: 1.0.30001512 + resolution: "caniuse-lite@npm:1.0.30001512" + checksum: 19287a85976152477cca0829249c6e357b66bf57f0366ff047db370f235f9f3ce8eee47cc10a66a4b84cef32e93259e30cd8471d9451eced99630d95949f900f languageName: node linkType: hard @@ -14700,7 +15128,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.25.1, core-js-compat@npm:^3.30.1, core-js-compat@npm:^3.30.2": +"core-js-compat@npm:^3.25.1, core-js-compat@npm:^3.30.1, core-js-compat@npm:^3.30.2, core-js-compat@npm:^3.31.0": version: 3.31.0 resolution: "core-js-compat@npm:3.31.0" dependencies: @@ -14913,11 +15341,11 @@ __metadata: linkType: hard "cross-fetch@npm:^3.1.5": - version: 3.1.6 - resolution: "cross-fetch@npm:3.1.6" + version: 3.1.8 + resolution: "cross-fetch@npm:3.1.8" dependencies: - node-fetch: ^2.6.11 - checksum: 39cdd0e16603e43b66fe187bb2a14fb7b4a0b35322ff61d7b08bf48b29a2a7fe835423b27eece46348ab92c45719054e49c4de52de89f279e0935f36a301a5a5 + node-fetch: ^2.6.12 + checksum: 4c5e022ffe6abdf380faa6e2373c0c4ed7ef75e105c95c972b6f627c3f083170b6886f19fb488a7fa93971f4f69dcc890f122b0d97f0bf5f41ca1d9a8f58c8af languageName: node linkType: hard @@ -15358,9 +15786,9 @@ __metadata: linkType: hard "dayjs@npm:^1.10.4": - version: 1.11.8 - resolution: "dayjs@npm:1.11.8" - checksum: 66833f3eb88ac06c8dd9b163986faab9b03f46df9e16a7d1a95aa3fca86eee334234e873e322977c8a458d721dee8f730a43ddda2c383e70d306454088eca8bb + version: 1.11.9 + resolution: "dayjs@npm:1.11.9" + checksum: 1697892de0f4107083ec72451ba86c947df61d9a67f8c52da991c5f8e347781baccec5c4c42e81a99e63cf603389ed324723cd77ad1b6fbd04f0f34433334979 languageName: node linkType: hard @@ -15757,6 +16185,15 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: 4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d + languageName: node + linkType: hard + "detect-libc@npm:^2.0.0": version: 2.0.1 resolution: "detect-libc@npm:2.0.1" @@ -16165,9 +16602,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.431": - version: 1.4.446 - resolution: "electron-to-chromium@npm:1.4.446" - checksum: 207de6583e24d643a62223b623cb93dfd553bbf767be31eaf91ba6c503795eebb4393f21b5d30fbc615551b284848c09566e3464b224f2ea5140eb3c992ace44 + version: 1.4.450 + resolution: "electron-to-chromium@npm:1.4.450" + checksum: 815cdb08fd09a38712daadec9495a85541782258254850b1a3c4c21297cc17d3780bd3f4a2509fdadda79d32f0106443371a1a24482ee2f14825d0d0cf1b2e81 languageName: node linkType: hard @@ -17043,14 +17480,14 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.0.0, espree@npm:^9.5.2": - version: 9.5.2 - resolution: "espree@npm:9.5.2" +"espree@npm:^9.0.0, espree@npm:^9.5.2, espree@npm:^9.6.0": + version: 9.6.0 + resolution: "espree@npm:9.6.0" dependencies: - acorn: ^8.8.0 + acorn: ^8.9.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.4.1 - checksum: 6885e57b3dcea3f65211403a10077a80a57f03e6c8b45c1e1db4bc5958e0fdb5c358819c88898ea67655d25fb646836182f688156e124a05610e714d3fcb6822 + checksum: f064a43bcf7f435d34e600c056320dde1c15b3eeb5da24e7585ed6cf83adcbbeafb4fa4d062ff14281b0d246b0a9645dd9d3796a638099f19595004eee4ac8be languageName: node linkType: hard @@ -17271,16 +17708,17 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.5.0": - version: 29.5.0 - resolution: "expect@npm:29.5.0" +"expect@npm:^29.0.0, expect@npm:^29.6.0": + version: 29.6.0 + resolution: "expect@npm:29.6.0" dependencies: - "@jest/expect-utils": ^29.5.0 + "@jest/expect-utils": ^29.6.0 + "@types/node": "*" jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - checksum: 3c9382967217ad1453e9271e0da3f83c4aeb12272968007b90fc5873340e7fb64bf4852e1522bdf27556623d031ce62f82aaac09e485a15c6d0589d50999422d + jest-matcher-utils: ^29.6.0 + jest-message-util: ^29.6.0 + jest-util: ^29.6.0 + checksum: 1351daed3f7d7072a9566a089f10e13c9a12538ae85b6ec398d9e34311e3687ced10d961c39903926dcb0a441d6c36e9f661cd6c6b95de43d3192305481c783c languageName: node linkType: hard @@ -17472,7 +17910,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.2.12, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": +"fast-glob@npm:3.2.12": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -17498,6 +17936,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": + version: 3.3.0 + resolution: "fast-glob@npm:3.3.0" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 4700063a2d7c9aae178f575648580bee1fc3f02ab3f358236d77811f52332bc10a398e75c6d5ecde61216996f3308247b37d70e2ee605a0748abe147f01b8f64 + languageName: node + linkType: hard + "fast-json-parse@npm:1.0.3, fast-json-parse@npm:^1.0.3": version: 1.0.3 resolution: "fast-json-parse@npm:1.0.3" @@ -17997,9 +18448,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.210.2 - resolution: "flow-parser@npm:0.210.2" - checksum: 498dc1d92cec80f8d5035a7af3faa29b7411c5d0e9e4081c0f987722e4d659b22fadf44015fef9bf191f1c6f1973097df55fe2a174ea4a9b915abfcb75343ad3 + version: 0.211.0 + resolution: "flow-parser@npm:0.211.0" + checksum: 0cab6e54d2b427052cc4e98ab2b227c6faed9026b2185f779a1ae2c123d0413bc090899e24dec6d1a42cbf15e3dcda699f5d8548a5b6f7ca734700f09251322d languageName: node linkType: hard @@ -18880,15 +19331,15 @@ __metadata: linkType: hard "globby@npm:^13.1.1, globby@npm:^13.1.4": - version: 13.2.0 - resolution: "globby@npm:13.2.0" + version: 13.2.1 + resolution: "globby@npm:13.2.1" dependencies: dir-glob: ^3.0.1 fast-glob: ^3.2.11 ignore: ^5.2.0 merge2: ^1.4.1 slash: ^4.0.0 - checksum: d1ea2b09dbb24961d16413cdb45764cb63280a2a7066739df5e5b33292ce4980d9da1d168a6a135c332ea1856f921e28d8ffcc2c6c24b82d4f4208477bfe62b4 + checksum: 263cd0a2fa8cfa90b9922f3a3f5309b1ac1be0aa5439f3c11e71087c7d6ae797f236c231fa2c02c5fe576a1d2d247810932525f57f77c1ba2994a41b81a41c27 languageName: node linkType: hard @@ -20886,48 +21337,48 @@ __metadata: languageName: node linkType: hard -"jest-circus@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-circus@npm:29.5.0" +"jest-circus@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-circus@npm:29.6.0" dependencies: - "@jest/environment": ^29.5.0 - "@jest/expect": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/environment": ^29.6.0 + "@jest/expect": ^29.6.0 + "@jest/test-result": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^0.7.0 is-generator-fn: ^2.0.0 - jest-each: ^29.5.0 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-runtime: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 + jest-each: ^29.6.0 + jest-matcher-utils: ^29.6.0 + jest-message-util: ^29.6.0 + jest-runtime: ^29.6.0 + jest-snapshot: ^29.6.0 + jest-util: ^29.6.0 p-limit: ^3.1.0 - pretty-format: ^29.5.0 + pretty-format: ^29.6.0 pure-rand: ^6.0.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 77f77b826941f67e9794e185072ee612cbddf53a1cfbf736de86176b7dc54e54aef151cf31b492adaef221f550924fd60dbaa01c9b939c3a4bfb46d8392c60a8 + checksum: 195b37ae6a6105b47829294db3f4712056f26f05716f016d9c329692ec0430af4f1fb7b964f3bfb1a764cf84afe0036aae7d614827d422a82bb82f50176c0556 languageName: node linkType: hard "jest-cli@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-cli@npm:29.5.0" + version: 29.6.0 + resolution: "jest-cli@npm:29.6.0" dependencies: - "@jest/core": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/core": ^29.6.0 + "@jest/test-result": ^29.6.0 + "@jest/types": ^29.6.0 chalk: ^4.0.0 exit: ^0.1.2 graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 + jest-config: ^29.6.0 + jest-util: ^29.6.0 + jest-validate: ^29.6.0 prompts: ^2.0.1 yargs: ^17.3.1 peerDependencies: @@ -20937,34 +21388,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: d63df7e329760bc036d11980883399de86b41a7fa93bbc2e79feef28284b096dec40afc21796504555ccbf32806bfc78cf64a63eac9093bb4f036b282b409863 + checksum: 52d13d0c216676fae30f1e2d57cbda1c5b813dc7d0249abdf9e2ee50d8ddaf2dbfb93866484a070b8d315c4a2f070f0896416314af8af74791ba6e0f87755498 languageName: node linkType: hard -"jest-config@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-config@npm:29.5.0" +"jest-config@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-config@npm:29.6.0" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.5.0 - "@jest/types": ^29.5.0 - babel-jest: ^29.5.0 + "@jest/test-sequencer": ^29.6.0 + "@jest/types": ^29.6.0 + babel-jest: ^29.6.0 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.5.0 - jest-environment-node: ^29.5.0 + jest-circus: ^29.6.0 + jest-environment-node: ^29.6.0 jest-get-type: ^29.4.3 jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-runner: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 + jest-resolve: ^29.6.0 + jest-runner: ^29.6.0 + jest-util: ^29.6.0 + jest-validate: ^29.6.0 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.5.0 + pretty-format: ^29.6.0 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -20975,19 +21426,19 @@ __metadata: optional: true ts-node: optional: true - checksum: 01780eb66815e3d31d237aab5d7611ea59e0cdf159cbab2a7c682cb08bde6d053c17a528547440fb1b0294c26ebfd5b54ad35d8c9439f6fae76960ee0bc90197 + checksum: 1903bf71c8f64cb61e537906ed4cc63a36b65df636dd49b3c3137caa104899a5c039a6dcc6b8708682b864ad5a96ea02b05e5d3f9baac73977de90d9dc607510 languageName: node linkType: hard -"jest-diff@npm:>=29.4.3 < 30, jest-diff@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-diff@npm:29.5.0" +"jest-diff@npm:>=29.4.3 < 30, jest-diff@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-diff@npm:29.6.0" dependencies: chalk: ^4.0.0 diff-sequences: ^29.4.3 jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: 00fda597fa6ee22774453c3cd35c2210bd7f749cf48ad7a41c13b898b2943c9c047842720eb928cdb949b9de87204d8d8987bf12aefdb2f0504f5f4112cab5b0 + pretty-format: ^29.6.0 + checksum: 394ab5f8e075952e97b434af60e89a085f6f4f88c4cfddb0eb593145ccaca0ee6639869ff8fd8ac3e7a48d0cbb6b3476fc3e89421d796c22dd085123d1d6512f languageName: node linkType: hard @@ -21000,16 +21451,16 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-each@npm:29.5.0" +"jest-each@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-each@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 chalk: ^4.0.0 jest-get-type: ^29.4.3 - jest-util: ^29.5.0 - pretty-format: ^29.5.0 - checksum: 214f6b5adfc0d6a3e837769018b7a7b69f41e99aac939fe4730bcca23f69e3566ed23706f95a396b20e63e6b9f90990053fc3c1662808036d4f41e4d6d32641d + jest-util: ^29.6.0 + pretty-format: ^29.6.0 + checksum: f130371e564b13f1fa18ddb1048b05d1134470349ec1fbd3d53a5fa8db104e10971e1add6cf5bad7eeb237173cb34446765f07f972def4a8b447f9b108fe5ad2 languageName: node linkType: hard @@ -21034,17 +21485,17 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-environment-node@npm:29.5.0" +"jest-environment-node@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-environment-node@npm:29.6.0" dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/environment": ^29.6.0 + "@jest/fake-timers": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - checksum: 2e636a095ff9a9e0aa20fda5b4c06eebed8f3ba2411062bdf724b114eedafd49b880167998af9f77aa8aa68231621aebe3998389d73433e9553ea5735cad1e14 + jest-mock: ^29.6.0 + jest-util: ^29.6.0 + checksum: 8974f8f98224dba761cdeb6c8d32c0e89cff0a50973544e86312343b2bbcc2865bc63f5099492fba2a91bcf90b81437ab5fa4cc07e07f6d7e3fc5b973d0ecc44 languageName: node linkType: hard @@ -21055,11 +21506,11 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-haste-map@npm:29.5.0" +"jest-haste-map@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-haste-map@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 @@ -21067,64 +21518,64 @@ __metadata: fsevents: ^2.3.2 graceful-fs: ^4.2.9 jest-regex-util: ^29.4.3 - jest-util: ^29.5.0 - jest-worker: ^29.5.0 + jest-util: ^29.6.0 + jest-worker: ^29.6.0 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: 162edfa185478db9ebe7dff73f3475ef2c205d94fa2b0fc3b41aba4fc29bab274d4a76ca41ca20ea7d9d6ed2b0d8519e298cfffbf5cad6631412d8961c190612 + checksum: cef07f294154246218eb887e60057cd5a219c4258e76a91a17d16c04f6aa468d572815312d3560823d62f787991f59f6088d42d8c97d87d8fddf3f9deefb3576 languageName: node linkType: hard -"jest-leak-detector@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-leak-detector@npm:29.5.0" +"jest-leak-detector@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-leak-detector@npm:29.6.0" dependencies: jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: d7db5d4a7cb676fc151f533d6887f3d6bbb4e35346346cbed0b5583c296b13af2d3c8434b30f62b0eb9c711718c7f4bd48496c47af3a20320ee162e33d64aaf2 + pretty-format: ^29.6.0 + checksum: a05793069e17ed6e74734d7152698d58c4486aa2a8cf57807b2fdca77b6bb4a665cd67cbb9c2006b78bb7c7a4d5d5efc528a969264ffbf47b61f5bddd0664067 languageName: node linkType: hard -"jest-matcher-utils@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-matcher-utils@npm:29.5.0" +"jest-matcher-utils@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-matcher-utils@npm:29.6.0" dependencies: chalk: ^4.0.0 - jest-diff: ^29.5.0 + jest-diff: ^29.6.0 jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: 0a3ae95ef5c5c4ac2b2c503c2f57e173fa82725722e1fadcd902fd801afe17d9d36e9366820959465f553627bf1e481a0e4a540125f3b4371eec674b3557f7f3 + pretty-format: ^29.6.0 + checksum: c8a2531f945e2eaf0a0041b67829f2f09c3fa3ac99723601e7e787063f5c1f53b2fb1842386804b5a87be377c9ee7e8744354124d35607296ac13a768edb5b47 languageName: node linkType: hard -"jest-message-util@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-message-util@npm:29.5.0" +"jest-message-util@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-message-util@npm:29.6.0" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.5.0 + pretty-format: ^29.6.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 706e89cacc89c090af584f4687c4e7f0616706481e468ec7c88270e07ae7458a829e477b7b3dff56b75d801f799d65eb2c28d6453c25dd02bea0fd98f0809dbb + checksum: 67e6825ac12e8766053a3c8c2a3732de8f645dab44a854088dda335eebdaeef5a0864ff3b95411df7512e8d9f644a05755360a914a228e480282e42430b607c9 languageName: node linkType: hard -"jest-mock@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-mock@npm:29.5.0" +"jest-mock@npm:^29.5.0, jest-mock@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-mock@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 "@types/node": "*" - jest-util: ^29.5.0 - checksum: c5b71d397d6acd44d99cd48dad8ca76334fc5a27e120da72d264d7527a9efc7c6fc431d79de64d0b73aa0ab26a2d0712498e323d42b9e03bee05e983b0d2035c + jest-util: ^29.6.0 + checksum: 1c937b624ca6a54df06f951608ec76e3a289d4414101982b92a072b7c9f95fe37907fabec9aeb11f3c35dc75eab9c8ddb4c8e020e028ca642f90fbc5240b4c4f languageName: node linkType: hard @@ -21147,30 +21598,30 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-resolve-dependencies@npm:29.5.0" +"jest-resolve-dependencies@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-resolve-dependencies@npm:29.6.0" dependencies: jest-regex-util: ^29.4.3 - jest-snapshot: ^29.5.0 - checksum: fbe513b7d905c4a70be17fd1cb4bd83da1e82cceb47ed7ceababbe11c75f1d0c18eadeb3f4ebb6997ba979f35fa18dfd02e1d57eb556675e47b35675fde0aac7 + jest-snapshot: ^29.6.0 + checksum: 9d1353736cbc1165ef3b82eb6e23de2e29dcda39ff78519a98f48a60f445b7c05f4e5622a8b6e05d7e457e6637e4acd08af92a7f63d54d7972f707a5dfac04ea languageName: node linkType: hard -"jest-resolve@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-resolve@npm:29.5.0" +"jest-resolve@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-resolve@npm:29.6.0" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 + jest-haste-map: ^29.6.0 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 + jest-util: ^29.6.0 + jest-validate: ^29.6.0 resolve: ^1.20.0 resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: e7ea3b1cf865a7e63ad297d0f43a093dde145f9ca72dc8e75b6c7eb3af60fe78e4f7d024fd92fa280419a4ca038d42a9268d4d5d512958d11347e680daca1f12 + checksum: aabf34ad14d47448fc6ab8ba3a3b9edbe8adf200107aad0ebe7430f3c008c499b60d3298ce0d1383e0476f5d6c6b76c922c2480cd34ccf5b6643bf698f815a6b languageName: node linkType: hard @@ -21188,121 +21639,119 @@ __metadata: languageName: node linkType: hard -"jest-runner@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-runner@npm:29.5.0" +"jest-runner@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-runner@npm:29.6.0" dependencies: - "@jest/console": ^29.5.0 - "@jest/environment": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/console": ^29.6.0 + "@jest/environment": ^29.6.0 + "@jest/test-result": ^29.6.0 + "@jest/transform": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 jest-docblock: ^29.4.3 - jest-environment-node: ^29.5.0 - jest-haste-map: ^29.5.0 - jest-leak-detector: ^29.5.0 - jest-message-util: ^29.5.0 - jest-resolve: ^29.5.0 - jest-runtime: ^29.5.0 - jest-util: ^29.5.0 - jest-watcher: ^29.5.0 - jest-worker: ^29.5.0 + jest-environment-node: ^29.6.0 + jest-haste-map: ^29.6.0 + jest-leak-detector: ^29.6.0 + jest-message-util: ^29.6.0 + jest-resolve: ^29.6.0 + jest-runtime: ^29.6.0 + jest-util: ^29.6.0 + jest-watcher: ^29.6.0 + jest-worker: ^29.6.0 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 96f47976b9bcc0554455c200d02ebc1547b9a7749b05353c0d55aff535509032c0c12ea25ccc294350f62c14665dbc1e00b15e0d1c52207edfb807e4fec4a36a + checksum: d451270862d7850dfefe6ff7d2ce73ac6fc91275eba4f43aaeb3c389cc5cba1c4a338e9c3512c868b0514b0abc2192d5c109906573dc19756912c124a976ac0c languageName: node linkType: hard -"jest-runtime@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-runtime@npm:29.5.0" +"jest-runtime@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-runtime@npm:29.6.0" dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/globals": ^29.5.0 - "@jest/source-map": ^29.4.3 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/environment": ^29.6.0 + "@jest/fake-timers": ^29.6.0 + "@jest/globals": ^29.6.0 + "@jest/source-map": ^29.6.0 + "@jest/test-result": ^29.6.0 + "@jest/transform": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 - jest-message-util: ^29.5.0 - jest-mock: ^29.5.0 + jest-haste-map: ^29.6.0 + jest-message-util: ^29.6.0 + jest-mock: ^29.6.0 jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 + jest-resolve: ^29.6.0 + jest-snapshot: ^29.6.0 + jest-util: ^29.6.0 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 9b5c0a97e1f24945059695e056188041730a3f1dc5924153e323eb7429244e10e7cc877b13d057869d6621c460deae11b77a2a2e9ab56e22b56864a3e44c4448 + checksum: 352b461525636ec98e9878f0b2e84a645dd9f28d9c863c041deb7f349178a6ea7dd87e3dd2f140ec455d7a6eceddd452d5a33031e3a58cf96db7a819a23ae585 languageName: node linkType: hard -"jest-snapshot@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-snapshot@npm:29.5.0" +"jest-snapshot@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-snapshot@npm:29.6.0" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 "@babel/plugin-syntax-jsx": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 - "@babel/traverse": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/babel__traverse": ^7.0.6 + "@jest/expect-utils": ^29.6.0 + "@jest/transform": ^29.6.0 + "@jest/types": ^29.6.0 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.5.0 + expect: ^29.6.0 graceful-fs: ^4.2.9 - jest-diff: ^29.5.0 + jest-diff: ^29.6.0 jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 + jest-matcher-utils: ^29.6.0 + jest-message-util: ^29.6.0 + jest-util: ^29.6.0 natural-compare: ^1.4.0 - pretty-format: ^29.5.0 - semver: ^7.3.5 - checksum: db9957d9c8607d75bb08302605331b5d90fa738fafeed820ab8ebcb2c90f9e62fb4fec0b4c826c04a37557cbb7a9ed26a10b0c74d46ffedce2d6ae8a9c891b00 + pretty-format: ^29.6.0 + semver: ^7.5.3 + checksum: 1274149dfe38997ac9c14ced93d24b5b0b6707355530a10ff2d31cfb91de51927e5349a1560d91f11341a86afadc1d3cf07e51456993eff1f2a206903442d531 languageName: node linkType: hard -"jest-util@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-util@npm:29.5.0" +"jest-util@npm:^29.5.0, jest-util@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-util@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: c7f1dc8ae82cd9614a31e09806499560b4812beb57589b214241dd213d3cc6d24417593aef2caf2d3d9694925438849fec371ff36ca8a7f1be8438fd41e83373 + checksum: 0576242db9650e6555aa76b6682fff09051853b1b0e20de9029b498ae14b200675ba6eb4948f3a93fc82fb57771a0271ca8c62a0ab169446ecd31cc73ce04b51 languageName: node linkType: hard -"jest-validate@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-validate@npm:29.5.0" +"jest-validate@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-validate@npm:29.6.0" dependencies: - "@jest/types": ^29.5.0 + "@jest/types": ^29.6.0 camelcase: ^6.2.0 chalk: ^4.0.0 jest-get-type: ^29.4.3 leven: ^3.1.0 - pretty-format: ^29.5.0 - checksum: 7aabde27a9b736df65902a1bb4ec63af518d4c95e12a910e7658140784168f08c662d5babe67dfa70d843dd2096bc08aa7090fef83c7a9d6bb0893793c3a599a + pretty-format: ^29.6.0 + checksum: 77a6dc7dade738f14f7a8d707931d660ba8e29ae17bc8fe5c73f174fa2df4e11bec284d293215a3fefceb3e2695a3007048abb329206cde9929094f342d58f9c languageName: node linkType: hard @@ -21323,19 +21772,19 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-watcher@npm:29.5.0" +"jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-watcher@npm:29.6.0" dependencies: - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 + "@jest/test-result": ^29.6.0 + "@jest/types": ^29.6.0 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.5.0 + jest-util: ^29.6.0 string-length: ^4.0.1 - checksum: 6a2e71e720183303913fc34fc24a3f87fca7fcfa638bc6c9109a4808b36251a1cb7fe98b956eb0d9c9ead1ad47c3dc3745289ee89e62c6c615168e92282069ca + checksum: a9645099917220215f4f7cbe33d4914bbba6d9cd58fd216eda3435a46c2c4d1514ff5317ba6f410b48df473b837a11428bde58de52266a96fa2c5094be4b9536 languageName: node linkType: hard @@ -21350,15 +21799,15 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.4.3, jest-worker@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-worker@npm:29.5.0" +"jest-worker@npm:^29.4.3, jest-worker@npm:^29.5.0, jest-worker@npm:^29.6.0": + version: 29.6.0 + resolution: "jest-worker@npm:29.6.0" dependencies: "@types/node": "*" - jest-util: ^29.5.0 + jest-util: ^29.6.0 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 4191ec3209cb1d838c931d47c7328fec7279eb7a5d40fa86bb3fac4d34cbad835349bc366150712259a274507fd210ddb450733032394d8e0b19640b3d3ac17d + checksum: bd28189d7144453864c8a3c10460afbd7f2efd47dc145c600bea956164a943b5f5e874821f5cc620445a5a52ddb0d408de60bf7162fa39b22773ec5024c3e048 languageName: node linkType: hard @@ -21391,11 +21840,11 @@ __metadata: linkType: hard "jiti@npm:^1.17.1": - version: 1.18.2 - resolution: "jiti@npm:1.18.2" + version: 1.19.1 + resolution: "jiti@npm:1.19.1" bin: jiti: bin/jiti.js - checksum: 578343e883838a5d6775350925d9e1a647e00132ade9c8cc318c163b692988612472f0af3cd9d92b8d8ca61e623092e86ab89563cbf6394900a5a39962e3c4e8 + checksum: c09f15b3ef81f0fcda45f96aaecd130213c81d8a9b8a92f5eb4f8d21972b833b2ef494db8fb3e819b258ceb569b9d5cfa3facbd2d786ecf0bc0fd0e98cc862f7 languageName: node linkType: hard @@ -23776,6 +24225,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.0.0 + resolution: "node-addon-api@npm:7.0.0" + dependencies: + node-gyp: latest + checksum: 3d5a15ee434e122b345e614db122a63f30194c298104c3d8a0fa9f68707abb278af27b45222602456a131890a59b4a92291ff5b4b7938ff282168e9ad1bf7103 + languageName: node + linkType: hard + "node-dir@npm:^0.1.10, node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" @@ -23855,7 +24313,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.0.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9": +"node-fetch@npm:^2.0.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9": version: 2.6.12 resolution: "node-fetch@npm:2.6.12" dependencies: @@ -24332,9 +24790,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.2": - version: 2.2.5 - resolution: "nwsapi@npm:2.2.5" - checksum: bc1cffd006ac9648085b89550be6083cdde7d7d4bd93139d4f1d7183c8cc6ca8878d8274c9f00456fd02701928d14df4f4ab2ff5422f172b9e9c1fa845dd49ce + version: 2.2.6 + resolution: "nwsapi@npm:2.2.6" + checksum: 193d4c86b6ee4dbadd73dae283c922a0d372a70d1a9c381e5db851c64251216016a425256ee0d20229b69c9612eb9387512eed61239ccc04fd02f7769f5dfd65 languageName: node linkType: hard @@ -24441,21 +24899,21 @@ __metadata: languageName: node linkType: hard -"nx@npm:16.4.1, nx@npm:>=16.1.3 < 17": - version: 16.4.1 - resolution: "nx@npm:16.4.1" +"nx@npm:16.4.3, nx@npm:>=16.1.3 < 17": + version: 16.4.3 + resolution: "nx@npm:16.4.3" dependencies: - "@nrwl/tao": 16.4.1 - "@nx/nx-darwin-arm64": 16.4.1 - "@nx/nx-darwin-x64": 16.4.1 - "@nx/nx-freebsd-x64": 16.4.1 - "@nx/nx-linux-arm-gnueabihf": 16.4.1 - "@nx/nx-linux-arm64-gnu": 16.4.1 - "@nx/nx-linux-arm64-musl": 16.4.1 - "@nx/nx-linux-x64-gnu": 16.4.1 - "@nx/nx-linux-x64-musl": 16.4.1 - "@nx/nx-win32-arm64-msvc": 16.4.1 - "@nx/nx-win32-x64-msvc": 16.4.1 + "@nrwl/tao": 16.4.3 + "@nx/nx-darwin-arm64": 16.4.3 + "@nx/nx-darwin-x64": 16.4.3 + "@nx/nx-freebsd-x64": 16.4.3 + "@nx/nx-linux-arm-gnueabihf": 16.4.3 + "@nx/nx-linux-arm64-gnu": 16.4.3 + "@nx/nx-linux-arm64-musl": 16.4.3 + "@nx/nx-linux-x64-gnu": 16.4.3 + "@nx/nx-linux-x64-musl": 16.4.3 + "@nx/nx-win32-arm64-msvc": 16.4.3 + "@nx/nx-win32-x64-msvc": 16.4.3 "@parcel/watcher": 2.0.4 "@yarnpkg/lockfile": ^1.1.0 "@yarnpkg/parsers": 3.0.0-rc.46 @@ -24520,7 +24978,7 @@ __metadata: optional: true bin: nx: bin/nx.js - checksum: cfafd5e4ec5ac6f7c4751342c6f10365abb91df644568c07a0aa91e9047a0b9192b570bb96442adec42d4e7f8fe156ddd13a86be2d2927fc78fbf7cb577b3e01 + checksum: f6dddc019700ee95a93fb8122c1f8c1df0499ae8736a390bbdc317fa7ecb435b37438ac71931d579670a04bdfcdd4023b05d5f52e4462635c706385ffce00cd0 languageName: node linkType: hard @@ -26043,14 +26501,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": - version: 29.5.0 - resolution: "pretty-format@npm:29.5.0" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.0": + version: 29.6.0 + resolution: "pretty-format@npm:29.6.0" dependencies: - "@jest/schemas": ^29.4.3 + "@jest/schemas": ^29.6.0 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: bcc0190d050196b64e501e5c2b44beb802d79a2b70b6fe6b24ae2d5e0f31237dfcb1f0ab2ada4678829b6ee38507ba292396301aff0a8122e575ffd45d5d037c + checksum: 237511f64ba2eab48b9c037b6c92a3bb28df10fa2c63d73ecc108346047936bba3a1639cac880a47dd491f8b0e2294189478361406d5f326c6a677c6848e5c33 languageName: node linkType: hard @@ -26797,6 +27255,21 @@ __metadata: languageName: node linkType: hard +"react-server-dom-webpack@npm:18.3.0-canary-035a41c4e-20230704": + version: 18.3.0-canary-035a41c4e-20230704 + resolution: "react-server-dom-webpack@npm:18.3.0-canary-035a41c4e-20230704" + dependencies: + acorn-loose: ^8.3.0 + loose-envify: ^1.1.0 + neo-async: ^2.6.1 + peerDependencies: + react: 18.3.0-canary-035a41c4e-20230704 + react-dom: 18.3.0-canary-035a41c4e-20230704 + webpack: ^5.59.0 + checksum: 3da1c83e3fe647798c690ac40ec4f5fb58d0f8660e6480bb4bdcc5204f3fc94e3298b117286cb93514a5a66ebdc749c6c684cbd6eecb60cb5677631afa2a97e2 + languageName: node + linkType: hard + "react@npm:18.3.0-canary-035a41c4e-20230704": version: 18.3.0-canary-035a41c4e-20230704 resolution: "react@npm:18.3.0-canary-035a41c4e-20230704" @@ -26938,14 +27411,15 @@ __metadata: linkType: hard "readable-stream@npm:^4.0.0, readable-stream@npm:^4.1.0": - version: 4.4.1 - resolution: "readable-stream@npm:4.4.1" + version: 4.4.2 + resolution: "readable-stream@npm:4.4.2" dependencies: abort-controller: ^3.0.0 buffer: ^6.0.3 events: ^3.3.0 process: ^0.11.10 - checksum: 3bd4b8a847b0a582e98e2d61cb1469ac2d4168be30c6849384a1b091aaf0b5ebbb79f3d8583afc4b0c130923c5982d401b236140172ee3902dcfb9d87f68dcc7 + string_decoder: ^1.3.0 + checksum: cf7cc8daa2b57872d120945a20a1458c13dcb6c6f352505421115827b18ac4df0e483ac1fe195cb1f5cd226e1073fc55b92b569269d8299e8530840bcdbba40c languageName: node linkType: hard @@ -27635,8 +28109,8 @@ __metadata: linkType: hard "rollup@npm:^3.21.0": - version: 3.26.0 - resolution: "rollup@npm:3.26.0" + version: 3.26.1 + resolution: "rollup@npm:3.26.1" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -27644,7 +28118,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 948b028978dc943c2dee30713c12e2cdc5f63c99871a86e8de1fa31038209dd14a1408146e6d112105d9f82231f2cdfca319cadd29459eec81cb37a152692311 + checksum: ce517e146f305159e5b48df35115b80124f1e2417c6157598cdeca8febef62c432159f8238d3300b186a52b2f3f2f301c6ce516716660b9e8bafe6bcad4de387 languageName: node linkType: hard @@ -27987,7 +28461,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.5.3, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.2": +"semver@npm:7.5.3, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.2, semver@npm:^7.5.3": version: 7.5.3 resolution: "semver@npm:7.5.3" dependencies: @@ -28257,16 +28731,15 @@ __metadata: linkType: hard "sigstore@npm:^1.3.0, sigstore@npm:^1.4.0": - version: 1.6.0 - resolution: "sigstore@npm:1.6.0" + version: 1.7.0 + resolution: "sigstore@npm:1.7.0" dependencies: "@sigstore/protobuf-specs": ^0.1.0 - "@sigstore/tuf": ^1.0.0 + "@sigstore/tuf": ^1.0.1 make-fetch-happen: ^11.0.1 - tuf-js: ^1.1.3 bin: sigstore: bin/sigstore.js - checksum: d0dd051774765ded57d19652a115ddebd2bd3253b1db11ce6cb83f32ab86c3f200bfe83138c577ea179236e148d93d3480430561081eef7cb0d8deab1b466f75 + checksum: 2cf2b7fe40323ef7a664627ac9e862cad985685bbc14528355d7a0813916dd4c96d94ffd3149de08d2ea33a86dfd4b073908d995cfcedba510cdb5073a49382c languageName: node linkType: hard @@ -29061,7 +29534,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -30074,7 +30547,7 @@ __metadata: languageName: node linkType: hard -"tuf-js@npm:^1.1.3": +"tuf-js@npm:^1.1.7": version: 1.1.7 resolution: "tuf-js@npm:1.1.7" dependencies: