From 0fa917aabb52e0a308036bec2df19c931c47a49f Mon Sep 17 00:00:00 2001 From: liuyi Date: Tue, 27 Feb 2024 07:22:21 +0000 Subject: [PATCH] ci: fix selfhost (#5920) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit enhancement ___ - Introduced a new ESM module resolution setup using `ts-node` to enhance the development and deployment process. - Implemented a dynamic loader script registration mechanism to facilitate ESM module loading. - Simplified the predeploy script execution by refining environment variable handling and stdout configuration. - Updated `package.json` to reflect changes in script commands for better ESM support and added necessary dependencies for `ts-node` and `typescript`. ___
Relevant files
Enhancement
loader.js
Introduce ESM Module Resolution via ts-node                           

packages/backend/server/scripts/loader.js
  • Introduced ts-node configuration for ESM module resolution.
  • Exported a resolve function for module resolution.
  • +11/-0   
    register.js
    Implement Dynamic Loader Script Registration                         

    packages/backend/server/scripts/register.js
  • Implemented dynamic registration of the loader script.
  • Utilized node:module and node:url for script registration.
  • +4/-0     
    self-host-predeploy.js
    Simplify Predeploy Script Execution                                           

    packages/backend/server/scripts/self-host-predeploy.js
  • Simplified environment variable passing to execSync.
  • Changed stdout handling to inherit from the parent process.
  • +3/-5     
    package.json
    Update Scripts and Dependencies for ESM Support                   

    packages/backend/server/package.json
  • Updated script commands for ESM compatibility.
  • Added ts-node and typescript dependencies.
  • Removed redundant --es-module-specifier-resolution=node flags.
  • +6/-6     
    ___ > ✨ **PR-Agent usage**: >Comment `/help` on the PR to get a list of all available PR-Agent tools and their descriptions --- .github/deployment/node/Dockerfile | 2 +- .github/deployment/self-host/compose.yaml | 2 +- packages/backend/server/package.json | 12 ++--- packages/backend/server/scripts/loader.js | 11 +++++ packages/backend/server/scripts/register.js | 4 ++ .../server/scripts/self-host-predeploy.js | 8 ++-- .../server/src/core/auth/next-auth-options.ts | 32 +++++++------ yarn.lock | 48 +++++++++++++++++-- 8 files changed, 86 insertions(+), 33 deletions(-) create mode 100644 packages/backend/server/scripts/loader.js create mode 100644 packages/backend/server/scripts/register.js diff --git a/.github/deployment/node/Dockerfile b/.github/deployment/node/Dockerfile index b2a0d442bb..6213f05b9e 100644 --- a/.github/deployment/node/Dockerfile +++ b/.github/deployment/node/Dockerfile @@ -8,4 +8,4 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends openssl && \ rm -rf /var/lib/apt/lists/* -CMD ["node", "--es-module-specifier-resolution=node", "./dist/index.js"] +CMD ["node", "--import", "./scripts/register.js", "./dist/index.js"] diff --git a/.github/deployment/self-host/compose.yaml b/.github/deployment/self-host/compose.yaml index 16abda5e5e..dc16d7c8fc 100644 --- a/.github/deployment/self-host/compose.yaml +++ b/.github/deployment/self-host/compose.yaml @@ -23,7 +23,7 @@ services: max-size: '1000m' restart: unless-stopped environment: - - NODE_OPTIONS=--es-module-specifier-resolution=node + - NODE_OPTIONS="--import=./scripts/register.js" - AFFINE_CONFIG_PATH=/root/.affine/config - REDIS_SERVER_HOST=redis - DATABASE_URL=postgres://affine:affine@postgres:5432/affine diff --git a/packages/backend/server/package.json b/packages/backend/server/package.json index e8d21535d3..dace4428ba 100644 --- a/packages/backend/server/package.json +++ b/packages/backend/server/package.json @@ -9,13 +9,13 @@ }, "scripts": { "build": "tsc", - "start": "node --loader ts-node/esm/transpile-only.mjs --es-module-specifier-resolution node ./src/index.ts", + "start": "node --loader ts-node/esm/transpile-only.mjs ./src/index.ts", "dev": "nodemon ./src/index.ts", "test": "ava --concurrency 1 --serial", "test:coverage": "c8 ava --concurrency 1 --serial", "postinstall": "prisma generate", - "data-migration": "node --loader ts-node/esm/transpile-only.mjs --es-module-specifier-resolution node ./src/data/index.ts", - "predeploy": "yarn prisma migrate deploy && node --es-module-specifier-resolution node ./dist/data/index.js run" + "data-migration": "node --loader ts-node/esm/transpile-only.mjs ./src/data/index.ts", + "predeploy": "yarn prisma migrate deploy && node --import ./scripts/register.js ./dist/data/index.js run" }, "dependencies": { "@apollo/server": "^4.9.5", @@ -86,6 +86,8 @@ "semver": "^7.5.4", "socket.io": "^4.7.2", "stripe": "^14.5.0", + "ts-node": "^10.9.2", + "typescript": "^5.3.3", "ws": "^8.14.2", "yjs": "^13.6.10", "zod": "^3.22.4" @@ -112,9 +114,7 @@ "c8": "^9.0.0", "nodemon": "^3.0.1", "sinon": "^17.0.1", - "supertest": "^6.3.3", - "ts-node": "^10.9.1", - "typescript": "^5.3.2" + "supertest": "^6.3.3" }, "ava": { "timeout": "1m", diff --git a/packages/backend/server/scripts/loader.js b/packages/backend/server/scripts/loader.js new file mode 100644 index 0000000000..ce31fb5096 --- /dev/null +++ b/packages/backend/server/scripts/loader.js @@ -0,0 +1,11 @@ +import { create, createEsmHooks } from 'ts-node'; + +const service = create({ + experimentalSpecifierResolution: 'node', + transpileOnly: true, + logError: true, + skipProject: true, +}); +const hooks = createEsmHooks(service); + +export const resolve = hooks.resolve; diff --git a/packages/backend/server/scripts/register.js b/packages/backend/server/scripts/register.js new file mode 100644 index 0000000000..ce20ff5368 --- /dev/null +++ b/packages/backend/server/scripts/register.js @@ -0,0 +1,4 @@ +import { register } from 'node:module'; +import { pathToFileURL } from 'node:url'; + +register('./scripts/loader.js', pathToFileURL('./')); diff --git a/packages/backend/server/scripts/self-host-predeploy.js b/packages/backend/server/scripts/self-host-predeploy.js index 2e71f738d7..6d2cf55749 100644 --- a/packages/backend/server/scripts/self-host-predeploy.js +++ b/packages/backend/server/scripts/self-host-predeploy.js @@ -42,11 +42,9 @@ function prepare() { function runPredeployScript() { console.log('running predeploy script.'); execSync('yarn predeploy', { - env: { - ...process.env, - NODE_OPTIONS: - (process.env.NODE_OPTIONS ?? '') + ' --import ./dist/prelude.js', - }, + encoding: 'utf-8', + env: process.env, + stdio: 'inherit', }); } diff --git a/packages/backend/server/src/core/auth/next-auth-options.ts b/packages/backend/server/src/core/auth/next-auth-options.ts index 709a9d9189..a134363bb6 100644 --- a/packages/backend/server/src/core/auth/next-auth-options.ts +++ b/packages/backend/server/src/core/auth/next-auth-options.ts @@ -118,9 +118,6 @@ export const NextAuthOptionsProvider: FactoryProvider = { providers: [], adapter: prismaAdapter, debug: !config.node.prod, - session: { - strategy: 'database', - }, logger: { debug(code, metadata) { logger.debug(`${code}: ${JSON.stringify(metadata)}`); @@ -141,18 +138,6 @@ export const NextAuthOptionsProvider: FactoryProvider = { }, }; - if (config.mailer && mailer) { - nextAuthOptions.providers.push( - // @ts-expect-error esm interop issue - Email.default({ - server: config.mailer, - from: config.mailer.from, - sendVerificationRequest: (params: SendVerificationRequestParams) => - sendVerificationRequest(config, logger, mailer, session, params), - }) - ); - } - nextAuthOptions.providers.push( // @ts-expect-error esm interop issue Credentials.default({ @@ -185,6 +170,18 @@ export const NextAuthOptionsProvider: FactoryProvider = { }) ); + if (config.mailer && mailer) { + nextAuthOptions.providers.push( + // @ts-expect-error esm interop issue + Email.default({ + server: config.mailer, + from: config.mailer.from, + sendVerificationRequest: (params: SendVerificationRequestParams) => + sendVerificationRequest(config, logger, mailer, session, params), + }) + ); + } + if (config.auth.oauthProviders.github) { nextAuthOptions.providers.push( // @ts-expect-error esm interop issue @@ -211,6 +208,11 @@ export const NextAuthOptionsProvider: FactoryProvider = { ); } + if (nextAuthOptions.providers.length > 1) { + // not only credentials provider + nextAuthOptions.session = { strategy: 'database' }; + } + nextAuthOptions.jwt = { encode: async ({ token, maxAge }) => encode(config, prisma, token, maxAge), diff --git a/yarn.lock b/yarn.lock index ae72378f49..90c70d0326 100644 --- a/yarn.lock +++ b/yarn.lock @@ -709,8 +709,8 @@ __metadata: socket.io: "npm:^4.7.2" stripe: "npm:^14.5.0" supertest: "npm:^6.3.3" - ts-node: "npm:^10.9.1" - typescript: "npm:^5.3.2" + ts-node: "npm:^10.9.2" + typescript: "npm:^5.3.3" ws: "npm:^8.14.2" yjs: "npm:^13.6.10" zod: "npm:^3.22.4" @@ -34173,7 +34173,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:10.9.1, ts-node@npm:^10.9.1": +"ts-node@npm:10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -34211,6 +34211,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.1, ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: a91a15b3c9f76ac462f006fa88b6bfa528130dcfb849dd7ef7f9d640832ab681e235b8a2bc58ecde42f72851cc1d5d4e22c901b0c11aa51001ea1d395074b794 + languageName: node + linkType: hard + "tsconfck@npm:^2.1.0": version: 2.1.2 resolution: "tsconfck@npm:2.1.2" @@ -34392,7 +34430,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.3.3, typescript@npm:^5.2.2, typescript@npm:^5.3.2": +"typescript@npm:5.3.3, typescript@npm:^5.2.2, typescript@npm:^5.3.2, typescript@npm:^5.3.3": version: 5.3.3 resolution: "typescript@npm:5.3.3" bin: @@ -34402,7 +34440,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.2#optional!builtin": +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": version: 5.3.3 resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" bin: