ci: fix selfhost (#5920)

## **Type**
enhancement

___

## **Description**
- 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`.

___

## **Changes walkthrough**
<table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
  <td>
    <details>
      <summary><strong>loader.js</strong><dd><code>Introduce ESM Module Resolution via ts-node</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

packages/backend/server/scripts/loader.js

<li>Introduced <code>ts-node</code> configuration for ESM module resolution.<br> <li> Exported a <code>resolve</code> function for module resolution.<br>

</details>

  </td>
  <td><a href="https:/toeverything/AFFiNE/pull/5920/files#diff-9ed793897a493633028d510db0742ff38d2d86471c54b17513d4354c51597ef8">+11/-0</a>&nbsp; &nbsp; </td>

</tr>

<tr>
  <td>
    <details>
      <summary><strong>register.js</strong><dd><code>Implement Dynamic Loader Script Registration</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

packages/backend/server/scripts/register.js

<li>Implemented dynamic registration of the loader script.<br> <li> Utilized <code>node:module</code> and <code>node:url</code> for script registration.<br>

</details>

  </td>
  <td><a href="https:/toeverything/AFFiNE/pull/5920/files#diff-64831012a09f2bc4bc5a611ddb8e0871b0e83588de6c5d4f2f5cb1dae8fff244">+4/-0</a>&nbsp; &nbsp; &nbsp; </td>

</tr>

<tr>
  <td>
    <details>
      <summary><strong>self-host-predeploy.js</strong><dd><code>Simplify Predeploy Script Execution</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

packages/backend/server/scripts/self-host-predeploy.js

<li>Simplified environment variable passing to <code>execSync</code>.<br> <li> Changed stdout handling to inherit from the parent process.<br>

</details>

  </td>
  <td><a href="https:/toeverything/AFFiNE/pull/5920/files#diff-bd7b0be14c198018c21dadda6945a779c57d13e4c8584ee62da4baa99d370664">+3/-5</a>&nbsp; &nbsp; &nbsp; </td>

</tr>

<tr>
  <td>
    <details>
      <summary><strong>package.json</strong><dd><code>Update Scripts and Dependencies for ESM Support</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

packages/backend/server/package.json

<li>Updated script commands for ESM compatibility.<br> <li> Added <code>ts-node</code> and <code>typescript</code> dependencies.<br> <li> Removed redundant <code>--es-module-specifier-resolution=node</code> flags.<br>

</details>

  </td>
  <td><a href="https:/toeverything/AFFiNE/pull/5920/files#diff-a6530c6fe539aaa49ff0a7a80bc4362c1d95c419fdd19125415dcc869b31a443">+6/-6</a>&nbsp; &nbsp; &nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

___

>  **PR-Agent usage**:
>Comment `/help` on the PR to get a list of all available PR-Agent tools and their descriptions
This commit is contained in:
liuyi
2024-02-27 07:22:21 +00:00
parent 39d177c507
commit 540d079308
7 changed files with 43 additions and 28 deletions

View File

@@ -8,4 +8,4 @@ RUN apt-get update && \
apt-get install -y --no-install-recommends openssl && \ apt-get install -y --no-install-recommends openssl && \
rm -rf /var/lib/apt/lists/* 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"]

View File

@@ -23,7 +23,7 @@ services:
max-size: '1000m' max-size: '1000m'
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_OPTIONS="--es-module-specifier-resolution=node" - NODE_OPTIONS="--import=./scripts/register.js"
- AFFINE_CONFIG_PATH=/root/.affine/config - AFFINE_CONFIG_PATH=/root/.affine/config
- REDIS_SERVER_HOST=redis - REDIS_SERVER_HOST=redis
- DATABASE_URL=postgres://affine:affine@postgres:5432/affine - DATABASE_URL=postgres://affine:affine@postgres:5432/affine

View File

@@ -9,13 +9,13 @@
}, },
"scripts": { "scripts": {
"build": "tsc", "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", "dev": "nodemon ./src/index.ts",
"test": "ava --concurrency 1 --serial", "test": "ava --concurrency 1 --serial",
"test:coverage": "c8 ava --concurrency 1 --serial", "test:coverage": "c8 ava --concurrency 1 --serial",
"postinstall": "prisma generate", "postinstall": "prisma generate",
"data-migration": "node --loader ts-node/esm/transpile-only.mjs --es-module-specifier-resolution=node ./src/data/index.ts", "data-migration": "node --loader ts-node/esm/transpile-only.mjs ./src/data/index.ts",
"predeploy": "yarn prisma migrate deploy && node --es-module-specifier-resolution=node ./dist/data/index.js run" "predeploy": "yarn prisma migrate deploy && node --import ./scripts/register.js ./dist/data/index.js run"
}, },
"dependencies": { "dependencies": {
"@apollo/server": "^4.10.0", "@apollo/server": "^4.10.0",
@@ -86,6 +86,8 @@
"semver": "^7.6.0", "semver": "^7.6.0",
"socket.io": "^4.7.4", "socket.io": "^4.7.4",
"stripe": "^14.18.0", "stripe": "^14.18.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.3",
"ws": "^8.16.0", "ws": "^8.16.0",
"yjs": "^13.6.12", "yjs": "^13.6.12",
"zod": "^3.22.4" "zod": "^3.22.4"
@@ -112,9 +114,7 @@
"c8": "^9.1.0", "c8": "^9.1.0",
"nodemon": "^3.1.0", "nodemon": "^3.1.0",
"sinon": "^17.0.1", "sinon": "^17.0.1",
"supertest": "^6.3.4", "supertest": "^6.3.4"
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
}, },
"ava": { "ava": {
"timeout": "1m", "timeout": "1m",

View File

@@ -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;

View File

@@ -0,0 +1,4 @@
import { register } from 'node:module';
import { pathToFileURL } from 'node:url';
register('./scripts/loader.js', pathToFileURL('./'));

View File

@@ -42,11 +42,9 @@ function prepare() {
function runPredeployScript() { function runPredeployScript() {
console.log('running predeploy script.'); console.log('running predeploy script.');
execSync('yarn predeploy', { execSync('yarn predeploy', {
env: { encoding: 'utf-8',
...process.env, env: process.env,
NODE_OPTIONS: stdio: 'inherit',
(process.env.NODE_OPTIONS ?? '') + ' --import ./dist/prelude.js',
},
}); });
} }

View File

@@ -116,9 +116,6 @@ export const NextAuthOptionsProvider: FactoryProvider<NextAuthOptions> = {
// @ts-expect-error Third part library type mismatch // @ts-expect-error Third part library type mismatch
adapter: prismaAdapter, adapter: prismaAdapter,
debug: !config.node.prod, debug: !config.node.prod,
session: {
strategy: 'database',
},
logger: { logger: {
debug(code, metadata) { debug(code, metadata) {
logger.debug(`${code}: ${JSON.stringify(metadata)}`); logger.debug(`${code}: ${JSON.stringify(metadata)}`);
@@ -139,18 +136,6 @@ export const NextAuthOptionsProvider: FactoryProvider<NextAuthOptions> = {
}, },
}; };
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( nextAuthOptions.providers.push(
// @ts-expect-error esm interop issue // @ts-expect-error esm interop issue
Credentials.default({ Credentials.default({
@@ -183,6 +168,18 @@ export const NextAuthOptionsProvider: FactoryProvider<NextAuthOptions> = {
}) })
); );
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) { if (config.auth.oauthProviders.github) {
nextAuthOptions.providers.push( nextAuthOptions.providers.push(
// @ts-expect-error esm interop issue // @ts-expect-error esm interop issue
@@ -209,6 +206,11 @@ export const NextAuthOptionsProvider: FactoryProvider<NextAuthOptions> = {
); );
} }
if (nextAuthOptions.providers.length > 1) {
// not only credentials provider
nextAuthOptions.session = { strategy: 'database' };
}
nextAuthOptions.jwt = { nextAuthOptions.jwt = {
encode: async ({ token, maxAge }) => encode: async ({ token, maxAge }) =>
encode(config, prisma, token, maxAge), encode(config, prisma, token, maxAge),