mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-24 18:02:47 +08:00
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> </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> </td>
</tr>
<tr>
<td>
<details>
<summary><strong>register.js</strong><dd><code>Implement Dynamic Loader Script Registration</code> </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> </td>
</tr>
<tr>
<td>
<details>
<summary><strong>self-host-predeploy.js</strong><dd><code>Simplify Predeploy Script Execution</code> </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> </td>
</tr>
<tr>
<td>
<details>
<summary><strong>package.json</strong><dd><code>Update Scripts and Dependencies for ESM Support</code> </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> </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:
2
.github/deployment/node/Dockerfile
vendored
2
.github/deployment/node/Dockerfile
vendored
@@ -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"]
|
||||||
|
|||||||
2
.github/deployment/self-host/compose.yaml
vendored
2
.github/deployment/self-host/compose.yaml
vendored
@@ -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
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
11
packages/backend/server/scripts/loader.js
Normal file
11
packages/backend/server/scripts/loader.js
Normal 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;
|
||||||
4
packages/backend/server/scripts/register.js
Normal file
4
packages/backend/server/scripts/register.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import { register } from 'node:module';
|
||||||
|
import { pathToFileURL } from 'node:url';
|
||||||
|
|
||||||
|
register('./scripts/loader.js', pathToFileURL('./'));
|
||||||
@@ -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',
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user