From 07c6122204ff882d9f87cee87f25f459e8782829 Mon Sep 17 00:00:00 2001 From: Tobbe Lundberg Date: Sun, 9 Jun 2024 00:10:04 +0200 Subject: [PATCH] @redwoodjs/server-store and @redwoodjs/cookie-jar (#10756) --- packages/cookie-jar/README.md | 3 ++ packages/cookie-jar/build.mts | 8 ++++ packages/cookie-jar/package.json | 37 ++++++++++++++++++ .../src}/CookieJar.test.ts | 0 .../src}/CookieJar.ts | 0 packages/cookie-jar/tsconfig.json | 14 +++++++ packages/server-store/README.md | 3 ++ packages/server-store/build.mts | 8 ++++ packages/server-store/package.json | 38 +++++++++++++++++++ .../{vite => server-store}/src/serverStore.ts | 5 +-- packages/server-store/tsconfig.json | 16 ++++++++ packages/vite/package.json | 6 +-- packages/vite/src/devFeServer.ts | 5 ++- .../vite/src/middleware/MiddlewareRequest.ts | 3 +- .../vite/src/middleware/MiddlewareResponse.ts | 2 +- packages/vite/src/middleware/index.ts | 1 - .../src/middleware/invokeMiddleware.test.ts | 3 +- .../vite/src/middleware/invokeMiddleware.ts | 3 +- packages/vite/src/rsc/rscBuildAnalyze.ts | 2 + packages/vite/src/rsc/rscBuildForServer.ts | 7 +++- packages/vite/src/rsc/rscBuildForSsr.ts | 2 + packages/vite/src/rsc/rscRequestHandler.ts | 3 +- packages/vite/src/rsc/rscStudioHandlers.ts | 2 +- packages/vite/src/rsc/rscWorker.ts | 5 ++- packages/vite/src/runFeServer.ts | 5 ++- packages/vite/tsconfig.json | 2 + yarn.lock | 33 ++++++++++++++++ 27 files changed, 195 insertions(+), 21 deletions(-) create mode 100644 packages/cookie-jar/README.md create mode 100644 packages/cookie-jar/build.mts create mode 100644 packages/cookie-jar/package.json rename packages/{vite/src/middleware => cookie-jar/src}/CookieJar.test.ts (100%) rename packages/{vite/src/middleware => cookie-jar/src}/CookieJar.ts (100%) create mode 100644 packages/cookie-jar/tsconfig.json create mode 100644 packages/server-store/README.md create mode 100644 packages/server-store/build.mts create mode 100644 packages/server-store/package.json rename packages/{vite => server-store}/src/serverStore.ts (94%) create mode 100644 packages/server-store/tsconfig.json diff --git a/packages/cookie-jar/README.md b/packages/cookie-jar/README.md new file mode 100644 index 000000000000..02ca3ab09214 --- /dev/null +++ b/packages/cookie-jar/README.md @@ -0,0 +1,3 @@ +# Cookie Jar + +Specialized cookie map, that lets you set cookies with options diff --git a/packages/cookie-jar/build.mts b/packages/cookie-jar/build.mts new file mode 100644 index 000000000000..a607d8f03817 --- /dev/null +++ b/packages/cookie-jar/build.mts @@ -0,0 +1,8 @@ +import { build, defaultBuildOptions } from '@redwoodjs/framework-tools' + +await build({ + buildOptions: { + ...defaultBuildOptions, + format: 'cjs', + }, +}) diff --git a/packages/cookie-jar/package.json b/packages/cookie-jar/package.json new file mode 100644 index 000000000000..b8e6a16c0a83 --- /dev/null +++ b/packages/cookie-jar/package.json @@ -0,0 +1,37 @@ +{ + "name": "@redwoodjs/cookie-jar", + "version": "7.0.0", + "repository": { + "type": "git", + "url": "git+https://github.com/redwoodjs/redwood.git", + "directory": "packages/cookie-jar" + }, + "license": "MIT", + "type": "commonjs", + "exports": { + "types": "./dist/CookieJar.d.ts", + "default": "./dist/CookieJar.js" + }, + "types": "./dist/CookieJar.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsx ./build.mts && run build:types", + "build:pack": "yarn pack -o redwoodjs-cookie-jar.tgz", + "build:types": "tsc --build --verbose" + }, + "dependencies": { + "cookie": "0.6.0", + "esbuild": "0.21.3", + "fast-glob": "3.3.2", + "fs-extra": "11.2.0" + }, + "devDependencies": { + "@redwoodjs/framework-tools": "workspace:*", + "@types/fs-extra": "11.0.4", + "tsx": "4.10.3", + "typescript": "5.4.5" + }, + "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" +} diff --git a/packages/vite/src/middleware/CookieJar.test.ts b/packages/cookie-jar/src/CookieJar.test.ts similarity index 100% rename from packages/vite/src/middleware/CookieJar.test.ts rename to packages/cookie-jar/src/CookieJar.test.ts diff --git a/packages/vite/src/middleware/CookieJar.ts b/packages/cookie-jar/src/CookieJar.ts similarity index 100% rename from packages/vite/src/middleware/CookieJar.ts rename to packages/cookie-jar/src/CookieJar.ts diff --git a/packages/cookie-jar/tsconfig.json b/packages/cookie-jar/tsconfig.json new file mode 100644 index 000000000000..d475921e8a0a --- /dev/null +++ b/packages/cookie-jar/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.compilerOption.json", + "compilerOptions": { + "moduleResolution": "NodeNext", + "module": "NodeNext", + "baseUrl": ".", + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src"], + "references": [ + { "path": "../framework-tools" } + ] +} diff --git a/packages/server-store/README.md b/packages/server-store/README.md new file mode 100644 index 000000000000..ea834cad9252 --- /dev/null +++ b/packages/server-store/README.md @@ -0,0 +1,3 @@ +# Server Store + +Singleton used to access Async Local Storage diff --git a/packages/server-store/build.mts b/packages/server-store/build.mts new file mode 100644 index 000000000000..a607d8f03817 --- /dev/null +++ b/packages/server-store/build.mts @@ -0,0 +1,8 @@ +import { build, defaultBuildOptions } from '@redwoodjs/framework-tools' + +await build({ + buildOptions: { + ...defaultBuildOptions, + format: 'cjs', + }, +}) diff --git a/packages/server-store/package.json b/packages/server-store/package.json new file mode 100644 index 000000000000..7452b418d15c --- /dev/null +++ b/packages/server-store/package.json @@ -0,0 +1,38 @@ +{ + "name": "@redwoodjs/server-store", + "version": "7.0.0", + "repository": { + "type": "git", + "url": "git+https://github.com/redwoodjs/redwood.git", + "directory": "packages/server-store" + }, + "license": "MIT", + "type": "commonjs", + "exports": { + "types": "./dist/serverStore.d.ts", + "default": "./dist/serverStore.js" + }, + "types": "./dist/serverStore.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsx ./build.mts && run build:types", + "build:pack": "yarn pack -o redwoodjs-server-store.tgz", + "build:types": "tsc --build --verbose" + }, + "dependencies": { + "@redwoodjs/auth": "workspace:*", + "@redwoodjs/cookie-jar": "workspace:*", + "esbuild": "0.21.3", + "fast-glob": "3.3.2", + "fs-extra": "11.2.0" + }, + "devDependencies": { + "@redwoodjs/framework-tools": "workspace:*", + "@types/fs-extra": "11.0.4", + "tsx": "4.10.3", + "typescript": "5.4.5" + }, + "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1" +} diff --git a/packages/vite/src/serverStore.ts b/packages/server-store/src/serverStore.ts similarity index 94% rename from packages/vite/src/serverStore.ts rename to packages/server-store/src/serverStore.ts index deb32c0da917..0108219b765e 100644 --- a/packages/vite/src/serverStore.ts +++ b/packages/server-store/src/serverStore.ts @@ -1,8 +1,7 @@ import { AsyncLocalStorage } from 'async_hooks' -import type { ServerAuthState } from '@redwoodjs/auth/dist/AuthProvider/ServerAuthProvider.js' - -import { CookieJar } from './middleware/CookieJar.js' +import type { ServerAuthState } from '@redwoodjs/auth/dist/AuthProvider/ServerAuthProvider.js' with { 'resolution-mode': 'import' } +import { CookieJar } from '@redwoodjs/cookie-jar' export interface ServerStore extends Map {} diff --git a/packages/server-store/tsconfig.json b/packages/server-store/tsconfig.json new file mode 100644 index 000000000000..0fa558989214 --- /dev/null +++ b/packages/server-store/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.compilerOption.json", + "compilerOptions": { + "moduleResolution": "NodeNext", + "module": "NodeNext", + "baseUrl": ".", + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src"], + "references": [ + { "path": "../auth/tsconfig.build.json" }, + { "path": "../cookie-jar" }, + { "path": "../framework-tools" } + ] +} diff --git a/packages/vite/package.json b/packages/vite/package.json index 55c6fdfb57f7..c4a08efbba78 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -44,10 +44,6 @@ "./middleware": { "types": "./dist/middleware/index.d.ts", "default": "./dist/middleware/index.js" - }, - "./serverStore": { - "types": "./dist/serverStore.d.ts", - "default": "./dist/serverStore.js" } }, "bin": { @@ -75,8 +71,10 @@ "@babel/traverse": "^7.22.20", "@redwoodjs/auth": "workspace:*", "@redwoodjs/babel-config": "workspace:*", + "@redwoodjs/cookie-jar": "workspace:*", "@redwoodjs/internal": "workspace:*", "@redwoodjs/project-config": "workspace:*", + "@redwoodjs/server-store": "workspace:*", "@redwoodjs/web": "workspace:*", "@swc/core": "1.5.7", "@vitejs/plugin-react": "4.2.1", diff --git a/packages/vite/src/devFeServer.ts b/packages/vite/src/devFeServer.ts index 42c8e54e7d36..a142135588fe 100644 --- a/packages/vite/src/devFeServer.ts +++ b/packages/vite/src/devFeServer.ts @@ -9,6 +9,10 @@ import type { RouteSpec } from '@redwoodjs/internal/dist/routes' import { getProjectRoutes } from '@redwoodjs/internal/dist/routes' import type { Paths } from '@redwoodjs/project-config' import { getConfig, getPaths } from '@redwoodjs/project-config' +import { + createPerRequestMap, + createServerStorage, +} from '@redwoodjs/server-store' import { registerFwGlobalsAndShims } from './lib/registerFwGlobalsAndShims.js' import { invoke } from './middleware/invokeMiddleware.js' @@ -16,7 +20,6 @@ import { createMiddlewareRouter } from './middleware/register.js' import type { Middleware } from './middleware/types.js' import { rscRoutesAutoLoader } from './plugins/vite-plugin-rsc-routes-auto-loader.js' import { createRscRequestHandler } from './rsc/rscRequestHandler.js' -import { createPerRequestMap, createServerStorage } from './serverStore.js' import { collectCssPaths, componentsModules } from './streaming/collectCss.js' import { createReactStreamingHandler } from './streaming/createReactStreamingHandler.js' import { diff --git a/packages/vite/src/middleware/MiddlewareRequest.ts b/packages/vite/src/middleware/MiddlewareRequest.ts index 78d6e6739790..9ba7dcc34483 100644 --- a/packages/vite/src/middleware/MiddlewareRequest.ts +++ b/packages/vite/src/middleware/MiddlewareRequest.ts @@ -2,8 +2,7 @@ import { Request as WhatWgRequest } from '@whatwg-node/fetch' import { middlewareDefaultAuthProviderState } from '@redwoodjs/auth/dist/AuthProvider/AuthProviderState.js' import type { ServerAuthState } from '@redwoodjs/auth/dist/AuthProvider/ServerAuthProvider.js' - -import { CookieJar } from './CookieJar.js' +import { CookieJar } from '@redwoodjs/cookie-jar' class AuthStateJar { private _data: ServerAuthState | null diff --git a/packages/vite/src/middleware/MiddlewareResponse.ts b/packages/vite/src/middleware/MiddlewareResponse.ts index b49c43c25851..43570999191b 100644 --- a/packages/vite/src/middleware/MiddlewareResponse.ts +++ b/packages/vite/src/middleware/MiddlewareResponse.ts @@ -1,7 +1,7 @@ import { Response as PonyResponse } from '@whatwg-node/fetch' import cookie from 'cookie' -import { CookieJar } from './CookieJar.js' +import { CookieJar } from '@redwoodjs/cookie-jar' export class MiddlewareShortCircuit extends Error { mwResponse: MiddlewareResponse diff --git a/packages/vite/src/middleware/index.ts b/packages/vite/src/middleware/index.ts index 6ea8a596ce7c..e5857b0fc17a 100644 --- a/packages/vite/src/middleware/index.ts +++ b/packages/vite/src/middleware/index.ts @@ -1,4 +1,3 @@ -export * from './CookieJar.js' export * from './MiddlewareRequest.js' export * from './MiddlewareResponse.js' export * from './types.js' diff --git a/packages/vite/src/middleware/invokeMiddleware.test.ts b/packages/vite/src/middleware/invokeMiddleware.test.ts index 98051fbbd1c0..28a4ca38e6db 100644 --- a/packages/vite/src/middleware/invokeMiddleware.test.ts +++ b/packages/vite/src/middleware/invokeMiddleware.test.ts @@ -3,8 +3,7 @@ import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest' import type { ServerAuthState } from '@redwoodjs/auth' import { middlewareDefaultAuthProviderState } from '@redwoodjs/auth' - -import { createServerStorage } from '../serverStore' +import { createServerStorage } from '@redwoodjs/server-store' import { invoke } from './invokeMiddleware' import type { MiddlewareRequest } from './MiddlewareRequest' diff --git a/packages/vite/src/middleware/invokeMiddleware.ts b/packages/vite/src/middleware/invokeMiddleware.ts index 22ccacbb5a75..521fbfc4848c 100644 --- a/packages/vite/src/middleware/invokeMiddleware.ts +++ b/packages/vite/src/middleware/invokeMiddleware.ts @@ -1,6 +1,5 @@ import type { ServerAuthState } from '@redwoodjs/auth/dist/AuthProvider/ServerAuthProvider.js' - -import { setServerAuthState } from '../serverStore.js' +import { setServerAuthState } from '@redwoodjs/server-store' import { MiddlewareRequest } from './MiddlewareRequest.js' import { diff --git a/packages/vite/src/rsc/rscBuildAnalyze.ts b/packages/vite/src/rsc/rscBuildAnalyze.ts index fef49d334722..2290461f27ef 100644 --- a/packages/vite/src/rsc/rscBuildAnalyze.ts +++ b/packages/vite/src/rsc/rscBuildAnalyze.ts @@ -59,6 +59,8 @@ export async function rscBuildAnalyze() { '@prisma/fetch-engine', '@prisma/internals', 'playwright', + '@redwoodjs/cookie-jar', + '@redwoodjs/server-store', ], resolve: { externalConditions: ['react-server'], diff --git a/packages/vite/src/rsc/rscBuildForServer.ts b/packages/vite/src/rsc/rscBuildForServer.ts index 567b1b50efec..0f6b08d39bd3 100644 --- a/packages/vite/src/rsc/rscBuildForServer.ts +++ b/packages/vite/src/rsc/rscBuildForServer.ts @@ -53,7 +53,12 @@ export async function rscBuildForServer( // Can't inline prisma client (db calls fail at runtime) or react-dom // (css pre-init failure) // Server store has to be externalized, because it's a singleton (shared between FW and App) - external: ['@prisma/client', 'react-dom', '@redwoodjs/vite/serverStore'], + external: [ + '@prisma/client', + 'react-dom', + '@redwoodjs/cookie-jar', + '@redwoodjs/server-store', + ], resolve: { // These conditions are used in the plugin pipeline, and only affect non-externalized // dependencies during the SSR build. Which because of `noExternal: true` means all diff --git a/packages/vite/src/rsc/rscBuildForSsr.ts b/packages/vite/src/rsc/rscBuildForSsr.ts index b370f9852997..79c682bba936 100644 --- a/packages/vite/src/rsc/rscBuildForSsr.ts +++ b/packages/vite/src/rsc/rscBuildForSsr.ts @@ -51,6 +51,8 @@ export async function rscBuildForSsr({ '@prisma/fetch-engine', '@prisma/internals', 'playwright', + '@redwoodjs/cookie-jar', + '@redwoodjs/server-store', ], }, plugins: [ diff --git a/packages/vite/src/rsc/rscRequestHandler.ts b/packages/vite/src/rsc/rscRequestHandler.ts index 76786e5b61fd..a3f016bd5123 100644 --- a/packages/vite/src/rsc/rscRequestHandler.ts +++ b/packages/vite/src/rsc/rscRequestHandler.ts @@ -9,6 +9,8 @@ import type Router from 'find-my-way' import type { HTTPMethod } from 'find-my-way' import type { ViteDevServer } from 'vite' +import { getAuthState, getRequestHeaders } from '@redwoodjs/server-store' + import { decodeReply, decodeReplyFromBusboy, @@ -16,7 +18,6 @@ import { import { hasStatusCode } from '../lib/StatusError.js' import type { Middleware } from '../middleware' import { invoke } from '../middleware/invokeMiddleware' -import { getAuthState, getRequestHeaders } from '../serverStore' import { getFullUrlForFlightRequest } from '../utils' import type { RscFetchProps } from './rscFetchForClientRouter' diff --git a/packages/vite/src/rsc/rscStudioHandlers.ts b/packages/vite/src/rsc/rscStudioHandlers.ts index cf27ffebc735..7629d73304a6 100644 --- a/packages/vite/src/rsc/rscStudioHandlers.ts +++ b/packages/vite/src/rsc/rscStudioHandlers.ts @@ -4,8 +4,8 @@ import type { PassThrough } from 'node:stream' import type { Request } from 'express' import { getConfig, getRawConfig } from '@redwoodjs/project-config' +import { getAuthState, getRequestHeaders } from '@redwoodjs/server-store' -import { getAuthState, getRequestHeaders } from '../serverStore.js' import { getFullUrlForFlightRequest } from '../utils.js' import type { RenderInput } from './rscWorkerCommunication.js' diff --git a/packages/vite/src/rsc/rscWorker.ts b/packages/vite/src/rsc/rscWorker.ts index 0e15de449c7d..b0ee27d904e7 100644 --- a/packages/vite/src/rsc/rscWorker.ts +++ b/packages/vite/src/rsc/rscWorker.ts @@ -16,6 +16,10 @@ import type { ResolvedConfig } from 'vite' import { createServer, resolveConfig } from 'vite' import { getPaths } from '@redwoodjs/project-config' +import { + createPerRequestMap, + createServerStorage, +} from '@redwoodjs/server-store' import { getEntriesFromDist } from '../lib/entries.js' import { registerFwGlobalsAndShims } from '../lib/registerFwGlobalsAndShims.js' @@ -24,7 +28,6 @@ import { rscReloadPlugin } from '../plugins/vite-plugin-rsc-reload.js' import { rscRoutesAutoLoader } from '../plugins/vite-plugin-rsc-routes-auto-loader.js' import { rscTransformUseClientPlugin } from '../plugins/vite-plugin-rsc-transform-client.js' import { rscTransformUseServerPlugin } from '../plugins/vite-plugin-rsc-transform-server.js' -import { createPerRequestMap, createServerStorage } from '../serverStore.js' import type { MessageReq, diff --git a/packages/vite/src/runFeServer.ts b/packages/vite/src/runFeServer.ts index 6c7a043ad717..b4a673f8ad03 100644 --- a/packages/vite/src/runFeServer.ts +++ b/packages/vite/src/runFeServer.ts @@ -17,6 +17,10 @@ import { createProxyMiddleware } from 'http-proxy-middleware' import type { Manifest as ViteBuildManifest } from 'vite' import { getConfig, getPaths } from '@redwoodjs/project-config' +import { + createPerRequestMap, + createServerStorage, +} from '@redwoodjs/server-store' import { registerFwGlobalsAndShims } from './lib/registerFwGlobalsAndShims.js' import { invoke } from './middleware/invokeMiddleware.js' @@ -25,7 +29,6 @@ import type { Middleware } from './middleware/types.js' import { getRscStylesheetLinkGenerator } from './rsc/rscCss.js' import { createRscRequestHandler } from './rsc/rscRequestHandler.js' import { setClientEntries } from './rsc/rscWorkerCommunication.js' -import { createPerRequestMap, createServerStorage } from './serverStore.js' import { createReactStreamingHandler } from './streaming/createReactStreamingHandler.js' import type { RWRouteManifest } from './types.js' import { convertExpressHeaders, getFullUrl } from './utils.js' diff --git a/packages/vite/tsconfig.json b/packages/vite/tsconfig.json index 7a14ff97cc24..35043e882523 100644 --- a/packages/vite/tsconfig.json +++ b/packages/vite/tsconfig.json @@ -6,9 +6,11 @@ }, "include": ["src/**/*", "./ambient.d.ts", "./modules.d.ts"], "references": [ + { "path": "../cookie-jar" }, { "path": "../internal" }, { "path": "../project-config" }, { "path": "../router" }, + { "path": "../server-store" }, { "path": "../web" } ] } diff --git a/yarn.lock b/yarn.lock index 893f04a9d03e..d234b5fb8e50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8110,6 +8110,21 @@ __metadata: languageName: unknown linkType: soft +"@redwoodjs/cookie-jar@workspace:*, @redwoodjs/cookie-jar@workspace:packages/cookie-jar": + version: 0.0.0-use.local + resolution: "@redwoodjs/cookie-jar@workspace:packages/cookie-jar" + dependencies: + "@redwoodjs/framework-tools": "workspace:*" + "@types/fs-extra": "npm:11.0.4" + cookie: "npm:0.6.0" + esbuild: "npm:0.21.3" + fast-glob: "npm:3.3.2" + fs-extra: "npm:11.2.0" + tsx: "npm:4.10.3" + typescript: "npm:5.4.5" + languageName: unknown + linkType: soft + "@redwoodjs/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@redwoodjs/core@workspace:packages/core" @@ -8592,6 +8607,22 @@ __metadata: languageName: unknown linkType: soft +"@redwoodjs/server-store@workspace:*, @redwoodjs/server-store@workspace:packages/server-store": + version: 0.0.0-use.local + resolution: "@redwoodjs/server-store@workspace:packages/server-store" + dependencies: + "@redwoodjs/auth": "workspace:*" + "@redwoodjs/cookie-jar": "workspace:*" + "@redwoodjs/framework-tools": "workspace:*" + "@types/fs-extra": "npm:11.0.4" + esbuild: "npm:0.21.3" + fast-glob: "npm:3.3.2" + fs-extra: "npm:11.2.0" + tsx: "npm:4.10.3" + typescript: "npm:5.4.5" + languageName: unknown + linkType: soft + "@redwoodjs/structure@workspace:*, @redwoodjs/structure@workspace:packages/structure": version: 0.0.0-use.local resolution: "@redwoodjs/structure@workspace:packages/structure" @@ -8713,8 +8744,10 @@ __metadata: "@babel/traverse": "npm:^7.22.20" "@redwoodjs/auth": "workspace:*" "@redwoodjs/babel-config": "workspace:*" + "@redwoodjs/cookie-jar": "workspace:*" "@redwoodjs/internal": "workspace:*" "@redwoodjs/project-config": "workspace:*" + "@redwoodjs/server-store": "workspace:*" "@redwoodjs/web": "workspace:*" "@swc/core": "npm:1.5.7" "@types/busboy": "npm:^1"