esBuild serverless (#14886)

Use [esbuild](https://esbuild.github.io/) to Build serverless entire
folder instead of just the src/index.ts file. Application serverless
folders can contain code organized in folders

## Small example

This now works:

<img width="1330" height="686" alt="image"
src="https://github.com/user-attachments/assets/e0639517-492d-4b64-8722-18bbe94dacb0"
/>
This commit is contained in:
martmull
2025-10-06 10:47:42 +02:00
committed by GitHub
parent 1a9bc6d3dd
commit 31b73c3580
14 changed files with 403 additions and 347 deletions
+1 -1
View File
@@ -164,7 +164,7 @@
"cross-var": "^1.1.0",
"danger": "^11.3.0",
"dotenv-cli": "^7.2.1",
"esbuild": "^0.23.0",
"esbuild": "^0.25.10",
"eslint": "^9.32.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.31.0",
@@ -55,11 +55,9 @@ export class ApiService {
async validateAuth(): Promise<boolean> {
try {
const query = `
query FindManyAgents {
findManyAgents {
id
name
}
query CurrentWorkspace {
currentWorkspace {
id
}
`;
+1 -3
View File
@@ -182,7 +182,6 @@
"tslib": "2.8.1",
"type-fest": "4.10.1",
"typeorm": "patch:typeorm@0.3.20#./patches/typeorm+0.3.20.patch",
"typescript": "5.9.2",
"unzipper": "^0.12.3",
"uuid": "9.0.1",
"vite-tsconfig-paths": "4.3.2",
@@ -232,8 +231,7 @@
"@yarnpkg/types": "^4.0.0",
"rimraf": "^5.0.5",
"twenty-emails": "workspace:*",
"twenty-shared": "workspace:*",
"typescript": "5.9.2"
"twenty-shared": "workspace:*"
},
"engines": {
"node": "^24.5.0",
@@ -1 +0,0 @@
export const BUILD_FILE_NAME = 'build.js';
@@ -1 +0,0 @@
export const ENV_FILE_NAME = '.env';
@@ -1 +0,0 @@
export const INDEX_FILE_NAME = 'index.ts';
@@ -1 +0,0 @@
export const OUTDIR_FOLDER = 'dist';
@@ -4,7 +4,7 @@ import { type ServerlessFunctionExecutionStatus } from 'src/engine/metadata-modu
export type ServerlessExecuteError = {
errorType: string;
errorMessage: string;
stackTrace: string;
stackTrace: string | string[];
};
export type ServerlessExecuteResult = {
@@ -20,7 +20,6 @@ import {
} from '@aws-sdk/client-lambda';
import { AssumeRoleCommand, STSClient } from '@aws-sdk/client-sts';
import { isDefined } from 'twenty-shared/utils';
import ts, { transpileModule } from 'typescript';
import {
type ServerlessDriver,
@@ -28,9 +27,7 @@ import {
} from 'src/engine/core-modules/serverless/drivers/interfaces/serverless-driver.interface';
import { type FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { readFileContent } from 'src/engine/core-modules/file-storage/utils/read-file-content';
import { COMMON_LAYER_NAME } from 'src/engine/core-modules/serverless/drivers/constants/common-layer-name';
import { INDEX_FILE_NAME } from 'src/engine/core-modules/serverless/drivers/constants/index-file-name';
import { copyAndBuildDependencies } from 'src/engine/core-modules/serverless/drivers/utils/copy-and-build-dependencies';
import { copyExecutor } from 'src/engine/core-modules/serverless/drivers/utils/copy-executor';
import { createZipFile } from 'src/engine/core-modules/serverless/drivers/utils/create-zip-file';
@@ -48,6 +45,8 @@ import {
ServerlessFunctionException,
ServerlessFunctionExceptionCode,
} from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { buildServerlessFunctionInMemory } from 'src/engine/core-modules/serverless/drivers/utils/build-serverless-function-in-memory';
import { formatBuildError } from 'src/engine/core-modules/serverless/drivers/utils/format-build-error';
const UPDATE_FUNCTION_DURATION_TIMEOUT_IN_SECONDS = 60;
const CREDENTIALS_DURATION_IN_SECONDS = 60 * 60; // 1h
@@ -318,68 +317,80 @@ export class LambdaDriver implements ServerlessDriver {
version,
});
const tsCodeStream = await this.fileStorageService.read({
folderPath: join(folderPath, 'src'),
filename: INDEX_FILE_NAME,
});
const tsCode = await readFileContent(tsCodeStream);
const compiledCode = transpileModule(tsCode, {
compilerOptions: {
module: ts.ModuleKind.ESNext,
target: ts.ScriptTarget.ES2017,
},
}).outputText;
const executorPayload = {
params: payload,
code: compiledCode,
};
const params: InvokeCommandInput = {
FunctionName: serverlessFunction.id,
Payload: JSON.stringify(executorPayload),
LogType: LogType.Tail,
};
const command = new InvokeCommand(params);
const lambdaBuildDirectoryManager = new LambdaBuildDirectoryManager();
try {
const result = await (await this.getLambdaClient()).send(command);
const { sourceTemporaryDir } = await lambdaBuildDirectoryManager.init();
const parsedResult = result.Payload
? JSON.parse(result.Payload.transformToString())
: {};
await this.fileStorageService.download({
from: { folderPath },
to: { folderPath: sourceTemporaryDir },
});
const logs = result.LogResult ? this.extractLogs(result.LogResult) : '';
let builtBundleFilePath = '';
const duration = Date.now() - startTime;
if (result.FunctionError) {
return {
data: null,
duration,
status: ServerlessFunctionExecutionStatus.ERROR,
error: parsedResult,
logs,
};
try {
builtBundleFilePath =
await buildServerlessFunctionInMemory(sourceTemporaryDir);
} catch (error) {
return formatBuildError(error, startTime);
}
return {
data: parsedResult,
logs,
duration,
status: ServerlessFunctionExecutionStatus.SUCCESS,
const compiledCode = (await fs.readFile(builtBundleFilePath)).toString(
'utf-8',
);
const executorPayload = {
params: payload,
code: compiledCode,
};
} catch (error) {
if (error instanceof ResourceNotFoundException) {
throw new ServerlessFunctionException(
`Function Version '${version}' does not exist`,
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
const params: InvokeCommandInput = {
FunctionName: serverlessFunction.id,
Payload: JSON.stringify(executorPayload),
LogType: LogType.Tail,
};
const command = new InvokeCommand(params);
try {
const result = await (await this.getLambdaClient()).send(command);
const parsedResult = result.Payload
? JSON.parse(result.Payload.transformToString())
: {};
const logs = result.LogResult ? this.extractLogs(result.LogResult) : '';
const duration = Date.now() - startTime;
if (result.FunctionError) {
return {
data: null,
duration,
status: ServerlessFunctionExecutionStatus.ERROR,
error: parsedResult,
logs,
};
}
return {
data: parsedResult,
logs,
duration,
status: ServerlessFunctionExecutionStatus.SUCCESS,
};
} catch (error) {
if (error instanceof ResourceNotFoundException) {
throw new ServerlessFunctionException(
`Function Version '${version}' does not exist`,
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
}
throw error;
}
throw error;
} finally {
await lambdaBuildDirectoryManager.clean();
}
}
}
@@ -1,8 +1,6 @@
import { promises as fs } from 'fs';
import { join } from 'path';
import ts, { transpileModule } from 'typescript';
import { v4 } from 'uuid';
import { isDefined } from 'twenty-shared/utils';
import {
@@ -11,15 +9,16 @@ import {
} from 'src/engine/core-modules/serverless/drivers/interfaces/serverless-driver.interface';
import { type FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { readFileContent } from 'src/engine/core-modules/file-storage/utils/read-file-content';
import { COMMON_LAYER_NAME } from 'src/engine/core-modules/serverless/drivers/constants/common-layer-name';
import { INDEX_FILE_NAME } from 'src/engine/core-modules/serverless/drivers/constants/index-file-name';
import { SERVERLESS_TMPDIR_FOLDER } from 'src/engine/core-modules/serverless/drivers/constants/serverless-tmpdir-folder';
import { copyAndBuildDependencies } from 'src/engine/core-modules/serverless/drivers/utils/copy-and-build-dependencies';
import { ConsoleListener } from 'src/engine/core-modules/serverless/drivers/utils/intercept-console';
import { getServerlessFolder } from 'src/engine/core-modules/serverless/utils/serverless-get-folder.utils';
import { ServerlessFunctionExecutionStatus } from 'src/engine/metadata-modules/serverless-function/dtos/serverless-function-execution-result.dto';
import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/serverless/drivers/utils/lambda-build-directory-manager';
import { buildServerlessFunctionInMemory } from 'src/engine/core-modules/serverless/drivers/utils/build-serverless-function-in-memory';
import { formatBuildError } from 'src/engine/core-modules/serverless/drivers/utils/format-build-error';
export interface LocalDriverOptions {
fileStorageService: FileStorageService;
@@ -106,111 +105,106 @@ export class LocalDriver implements ServerlessDriver {
version,
});
const tsCodeStream = await this.fileStorageService.read({
folderPath: join(folderPath, 'src'),
filename: INDEX_FILE_NAME,
});
const tsCode = await readFileContent(tsCodeStream);
const compiledCode = transpileModule(tsCode, {
compilerOptions: {
module: ts.ModuleKind.CommonJS,
target: ts.ScriptTarget.ES2017,
},
}).outputText;
const compiledCodeFolderPath = join(
SERVERLESS_TMPDIR_FOLDER,
`compiled-code-${v4()}`,
);
const compiledCodeFilePath = join(compiledCodeFolderPath, 'main.js');
await fs.mkdir(compiledCodeFolderPath, { recursive: true });
await fs.writeFile(compiledCodeFilePath, compiledCode, 'utf8');
const lambdaBuildDirectoryManager = new LambdaBuildDirectoryManager();
try {
await fs.symlink(
join(
this.getInMemoryLayerFolderPath(serverlessFunction),
'node_modules',
),
join(compiledCodeFolderPath, 'node_modules'),
'dir',
);
} catch (err) {
if (err.code !== 'EEXIST') {
throw err;
}
}
const { sourceTemporaryDir } = await lambdaBuildDirectoryManager.init();
let logs = '';
const consoleListener = new ConsoleListener();
consoleListener.intercept((type, args) => {
const formattedArgs = args.map((arg) => {
if (typeof arg === 'object' && arg !== null) {
const seen = new WeakSet();
return JSON.stringify(
arg,
(_key, value) => {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) {
return '[Circular]'; // Handle circular references
}
seen.add(value);
}
return value;
},
2,
);
}
return arg;
await this.fileStorageService.download({
from: { folderPath },
to: { folderPath: sourceTemporaryDir },
});
const formattedType = type === 'log' ? 'info' : type;
let builtBundleFilePath = '';
logs += `${new Date().toISOString()} ${formattedType.toUpperCase()} ${formattedArgs.join(' ')}\n`;
});
try {
builtBundleFilePath =
await buildServerlessFunctionInMemory(sourceTemporaryDir);
} catch (error) {
return formatBuildError(error, startTime);
}
try {
const mainFile = await import(compiledCodeFilePath);
try {
await fs.symlink(
join(
this.getInMemoryLayerFolderPath(serverlessFunction),
'node_modules',
),
join(sourceTemporaryDir, 'node_modules'),
'dir',
);
} catch (err) {
if (err.code !== 'EEXIST') {
throw err;
}
}
const result = await this.executeWithTimeout<object | null>(
() => mainFile.main(payload),
serverlessFunction.timeoutSeconds * 1_000,
);
let logs = '';
const duration = Date.now() - startTime;
const consoleListener = new ConsoleListener();
return {
data: result,
logs,
duration,
status: ServerlessFunctionExecutionStatus.SUCCESS,
};
} catch (error) {
return {
data: null,
logs,
duration: Date.now() - startTime,
error: {
errorType: 'UnhandledError',
errorMessage: error.message || 'Unknown error',
stackTrace: error.stack ? error.stack.split('\n') : [],
},
status: ServerlessFunctionExecutionStatus.ERROR,
};
consoleListener.intercept((type, args) => {
const formattedArgs = args.map((arg) => {
if (typeof arg === 'object' && arg !== null) {
const seen = new WeakSet();
return JSON.stringify(
arg,
(_key, value) => {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) {
return '[Circular]'; // Handle circular references
}
seen.add(value);
}
return value;
},
2,
);
}
return arg;
});
const formattedType = type === 'log' ? 'info' : type;
logs += `${new Date().toISOString()} ${formattedType.toUpperCase()} ${formattedArgs.join(' ')}\n`;
});
try {
const mainFile = await import(builtBundleFilePath);
const result = await this.executeWithTimeout<object | null>(
() => mainFile.main(payload),
serverlessFunction.timeoutSeconds * 1_000,
);
const duration = Date.now() - startTime;
return {
data: result,
logs,
duration,
status: ServerlessFunctionExecutionStatus.SUCCESS,
};
} catch (error) {
return {
data: null,
logs,
duration: Date.now() - startTime,
error: {
errorType: 'UnhandledError',
errorMessage: error.message || 'Unknown error',
stackTrace: error.stack ? error.stack.split('\n') : [],
},
status: ServerlessFunctionExecutionStatus.ERROR,
};
} finally {
consoleListener.release();
}
} finally {
// Restoring originalConsole
consoleListener.release();
await fs.rm(compiledCodeFolderPath, { recursive: true, force: true });
await lambdaBuildDirectoryManager.clean();
}
}
}
@@ -0,0 +1,24 @@
import { join } from 'path';
import { build } from 'esbuild';
export const buildServerlessFunctionInMemory = async (
sourceTemporaryDir: string,
) => {
const entryFilePath = join(sourceTemporaryDir, 'src', 'index.ts');
const builtBundleFilePath = join(sourceTemporaryDir, 'dist', 'main.mjs');
await build({
entryPoints: [entryFilePath],
outfile: builtBundleFilePath,
platform: 'node',
format: 'esm',
target: 'es2017',
bundle: true,
sourcemap: true,
packages: 'external',
});
return builtBundleFilePath;
};
@@ -0,0 +1,20 @@
import { type BuildFailure } from 'esbuild';
import { type ServerlessExecuteResult } from 'src/engine/core-modules/serverless/drivers/interfaces/serverless-driver.interface';
import { ServerlessFunctionExecutionStatus } from 'src/engine/metadata-modules/serverless-function/dtos/serverless-function-execution-result.dto';
export const formatBuildError = (
error: BuildFailure,
startTime: number,
): ServerlessExecuteResult => ({
data: null,
logs: '',
duration: Date.now() - startTime,
error: {
errorType: 'BuildError',
errorMessage: error.errors.map((e) => e.text).join('\n') || 'Unknown error',
stackTrace: error.stack ? error.stack.split('\n') : [],
},
status: ServerlessFunctionExecutionStatus.ERROR,
});
@@ -8,7 +8,6 @@ import { SERVERLESS_TMPDIR_FOLDER } from 'src/engine/core-modules/serverless/dri
export const NODE_LAYER_SUBFOLDER = 'nodejs';
const TEMPORARY_LAMBDA_FOLDER = 'lambda-build';
const TEMPORARY_LAMBDA_SOURCE_FOLDER = 'src';
const LAMBDA_ZIP_FILE_NAME = 'lambda.zip';
export class LambdaBuildDirectoryManager {
@@ -18,10 +17,7 @@ export class LambdaBuildDirectoryManager {
);
async init() {
const sourceTemporaryDir = join(
this.temporaryDir,
TEMPORARY_LAMBDA_SOURCE_FOLDER,
);
const sourceTemporaryDir = join(this.temporaryDir);
const lambdaZipPath = join(this.temporaryDir, LAMBDA_ZIP_FILE_NAME);
await fs.mkdir(sourceTemporaryDir, { recursive: true });
+193 -174
View File
@@ -4471,16 +4471,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/aix-ppc64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/aix-ppc64@npm:0.23.0"
"@esbuild/aix-ppc64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/aix-ppc64@npm:0.25.0"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/aix-ppc64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/aix-ppc64@npm:0.25.0"
"@esbuild/aix-ppc64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/aix-ppc64@npm:0.25.10"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
@@ -4520,16 +4520,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/android-arm64@npm:0.23.0"
"@esbuild/android-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/android-arm64@npm:0.25.0"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/android-arm64@npm:0.25.0"
"@esbuild/android-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/android-arm64@npm:0.25.10"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
@@ -4569,16 +4569,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/android-arm@npm:0.23.0"
"@esbuild/android-arm@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/android-arm@npm:0.25.0"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/android-arm@npm:0.25.0"
"@esbuild/android-arm@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/android-arm@npm:0.25.10"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
@@ -4618,16 +4618,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/android-x64@npm:0.23.0"
"@esbuild/android-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/android-x64@npm:0.25.0"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/android-x64@npm:0.25.0"
"@esbuild/android-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/android-x64@npm:0.25.10"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
@@ -4667,16 +4667,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/darwin-arm64@npm:0.23.0"
"@esbuild/darwin-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/darwin-arm64@npm:0.25.0"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/darwin-arm64@npm:0.25.0"
"@esbuild/darwin-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/darwin-arm64@npm:0.25.10"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
@@ -4716,16 +4716,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/darwin-x64@npm:0.23.0"
"@esbuild/darwin-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/darwin-x64@npm:0.25.0"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/darwin-x64@npm:0.25.0"
"@esbuild/darwin-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/darwin-x64@npm:0.25.10"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
@@ -4765,16 +4765,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/freebsd-arm64@npm:0.23.0"
"@esbuild/freebsd-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/freebsd-arm64@npm:0.25.0"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/freebsd-arm64@npm:0.25.0"
"@esbuild/freebsd-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/freebsd-arm64@npm:0.25.10"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
@@ -4814,16 +4814,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/freebsd-x64@npm:0.23.0"
"@esbuild/freebsd-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/freebsd-x64@npm:0.25.0"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/freebsd-x64@npm:0.25.0"
"@esbuild/freebsd-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/freebsd-x64@npm:0.25.10"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
@@ -4863,16 +4863,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-arm64@npm:0.23.0"
"@esbuild/linux-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-arm64@npm:0.25.0"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-arm64@npm:0.25.0"
"@esbuild/linux-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-arm64@npm:0.25.10"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
@@ -4912,16 +4912,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-arm@npm:0.23.0"
"@esbuild/linux-arm@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-arm@npm:0.25.0"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-arm@npm:0.25.0"
"@esbuild/linux-arm@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-arm@npm:0.25.10"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
@@ -4961,16 +4961,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-ia32@npm:0.23.0"
"@esbuild/linux-ia32@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-ia32@npm:0.25.0"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-ia32@npm:0.25.0"
"@esbuild/linux-ia32@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-ia32@npm:0.25.10"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
@@ -5010,16 +5010,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-loong64@npm:0.23.0"
"@esbuild/linux-loong64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-loong64@npm:0.25.0"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-loong64@npm:0.25.0"
"@esbuild/linux-loong64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-loong64@npm:0.25.10"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
@@ -5059,16 +5059,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-mips64el@npm:0.23.0"
"@esbuild/linux-mips64el@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-mips64el@npm:0.25.0"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-mips64el@npm:0.25.0"
"@esbuild/linux-mips64el@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-mips64el@npm:0.25.10"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
@@ -5108,16 +5108,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-ppc64@npm:0.23.0"
"@esbuild/linux-ppc64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-ppc64@npm:0.25.0"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-ppc64@npm:0.25.0"
"@esbuild/linux-ppc64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-ppc64@npm:0.25.10"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
@@ -5157,16 +5157,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-riscv64@npm:0.23.0"
"@esbuild/linux-riscv64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-riscv64@npm:0.25.0"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-riscv64@npm:0.25.0"
"@esbuild/linux-riscv64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-riscv64@npm:0.25.10"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
@@ -5206,16 +5206,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-s390x@npm:0.23.0"
"@esbuild/linux-s390x@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-s390x@npm:0.25.0"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-s390x@npm:0.25.0"
"@esbuild/linux-s390x@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-s390x@npm:0.25.10"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
@@ -5255,16 +5255,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/linux-x64@npm:0.23.0"
"@esbuild/linux-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-x64@npm:0.25.0"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/linux-x64@npm:0.25.0"
"@esbuild/linux-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/linux-x64@npm:0.25.10"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
@@ -5290,6 +5290,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/netbsd-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/netbsd-arm64@npm:0.25.10"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/netbsd-arm64@npm:0.25.5":
version: 0.25.5
resolution: "@esbuild/netbsd-arm64@npm:0.25.5"
@@ -5325,16 +5332,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/netbsd-x64@npm:0.23.0"
"@esbuild/netbsd-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/netbsd-x64@npm:0.25.0"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/netbsd-x64@npm:0.25.0"
"@esbuild/netbsd-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/netbsd-x64@npm:0.25.10"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
@@ -5353,16 +5360,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/openbsd-arm64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/openbsd-arm64@npm:0.23.0"
"@esbuild/openbsd-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/openbsd-arm64@npm:0.25.0"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/openbsd-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/openbsd-arm64@npm:0.25.0"
"@esbuild/openbsd-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/openbsd-arm64@npm:0.25.10"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
@@ -5402,16 +5409,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/openbsd-x64@npm:0.23.0"
"@esbuild/openbsd-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/openbsd-x64@npm:0.25.0"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/openbsd-x64@npm:0.25.0"
"@esbuild/openbsd-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/openbsd-x64@npm:0.25.10"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
@@ -5430,6 +5437,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/openharmony-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/openharmony-arm64@npm:0.25.10"
conditions: os=openharmony & cpu=arm64
languageName: node
linkType: hard
"@esbuild/openharmony-arm64@npm:0.25.8":
version: 0.25.8
resolution: "@esbuild/openharmony-arm64@npm:0.25.8"
@@ -5458,16 +5472,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/sunos-x64@npm:0.23.0"
"@esbuild/sunos-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/sunos-x64@npm:0.25.0"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/sunos-x64@npm:0.25.0"
"@esbuild/sunos-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/sunos-x64@npm:0.25.10"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
@@ -5507,16 +5521,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/win32-arm64@npm:0.23.0"
"@esbuild/win32-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/win32-arm64@npm:0.25.0"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/win32-arm64@npm:0.25.0"
"@esbuild/win32-arm64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/win32-arm64@npm:0.25.10"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
@@ -5556,16 +5570,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/win32-ia32@npm:0.23.0"
"@esbuild/win32-ia32@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/win32-ia32@npm:0.25.0"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/win32-ia32@npm:0.25.0"
"@esbuild/win32-ia32@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/win32-ia32@npm:0.25.10"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
@@ -5605,16 +5619,16 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.23.0":
version: 0.23.0
resolution: "@esbuild/win32-x64@npm:0.23.0"
"@esbuild/win32-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/win32-x64@npm:0.25.0"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.25.0":
version: 0.25.0
resolution: "@esbuild/win32-x64@npm:0.25.0"
"@esbuild/win32-x64@npm:0.25.10":
version: 0.25.10
resolution: "@esbuild/win32-x64@npm:0.25.10"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@@ -31684,34 +31698,36 @@ __metadata:
languageName: node
linkType: hard
"esbuild@npm:^0.23.0":
version: 0.23.0
resolution: "esbuild@npm:0.23.0"
"esbuild@npm:^0.25.10":
version: 0.25.10
resolution: "esbuild@npm:0.25.10"
dependencies:
"@esbuild/aix-ppc64": "npm:0.23.0"
"@esbuild/android-arm": "npm:0.23.0"
"@esbuild/android-arm64": "npm:0.23.0"
"@esbuild/android-x64": "npm:0.23.0"
"@esbuild/darwin-arm64": "npm:0.23.0"
"@esbuild/darwin-x64": "npm:0.23.0"
"@esbuild/freebsd-arm64": "npm:0.23.0"
"@esbuild/freebsd-x64": "npm:0.23.0"
"@esbuild/linux-arm": "npm:0.23.0"
"@esbuild/linux-arm64": "npm:0.23.0"
"@esbuild/linux-ia32": "npm:0.23.0"
"@esbuild/linux-loong64": "npm:0.23.0"
"@esbuild/linux-mips64el": "npm:0.23.0"
"@esbuild/linux-ppc64": "npm:0.23.0"
"@esbuild/linux-riscv64": "npm:0.23.0"
"@esbuild/linux-s390x": "npm:0.23.0"
"@esbuild/linux-x64": "npm:0.23.0"
"@esbuild/netbsd-x64": "npm:0.23.0"
"@esbuild/openbsd-arm64": "npm:0.23.0"
"@esbuild/openbsd-x64": "npm:0.23.0"
"@esbuild/sunos-x64": "npm:0.23.0"
"@esbuild/win32-arm64": "npm:0.23.0"
"@esbuild/win32-ia32": "npm:0.23.0"
"@esbuild/win32-x64": "npm:0.23.0"
"@esbuild/aix-ppc64": "npm:0.25.10"
"@esbuild/android-arm": "npm:0.25.10"
"@esbuild/android-arm64": "npm:0.25.10"
"@esbuild/android-x64": "npm:0.25.10"
"@esbuild/darwin-arm64": "npm:0.25.10"
"@esbuild/darwin-x64": "npm:0.25.10"
"@esbuild/freebsd-arm64": "npm:0.25.10"
"@esbuild/freebsd-x64": "npm:0.25.10"
"@esbuild/linux-arm": "npm:0.25.10"
"@esbuild/linux-arm64": "npm:0.25.10"
"@esbuild/linux-ia32": "npm:0.25.10"
"@esbuild/linux-loong64": "npm:0.25.10"
"@esbuild/linux-mips64el": "npm:0.25.10"
"@esbuild/linux-ppc64": "npm:0.25.10"
"@esbuild/linux-riscv64": "npm:0.25.10"
"@esbuild/linux-s390x": "npm:0.25.10"
"@esbuild/linux-x64": "npm:0.25.10"
"@esbuild/netbsd-arm64": "npm:0.25.10"
"@esbuild/netbsd-x64": "npm:0.25.10"
"@esbuild/openbsd-arm64": "npm:0.25.10"
"@esbuild/openbsd-x64": "npm:0.25.10"
"@esbuild/openharmony-arm64": "npm:0.25.10"
"@esbuild/sunos-x64": "npm:0.25.10"
"@esbuild/win32-arm64": "npm:0.25.10"
"@esbuild/win32-ia32": "npm:0.25.10"
"@esbuild/win32-x64": "npm:0.25.10"
dependenciesMeta:
"@esbuild/aix-ppc64":
optional: true
@@ -31747,12 +31763,16 @@ __metadata:
optional: true
"@esbuild/linux-x64":
optional: true
"@esbuild/netbsd-arm64":
optional: true
"@esbuild/netbsd-x64":
optional: true
"@esbuild/openbsd-arm64":
optional: true
"@esbuild/openbsd-x64":
optional: true
"@esbuild/openharmony-arm64":
optional: true
"@esbuild/sunos-x64":
optional: true
"@esbuild/win32-arm64":
@@ -31763,7 +31783,7 @@ __metadata:
optional: true
bin:
esbuild: bin/esbuild
checksum: 10c0/08c148c067795165798c0467ce02d2d1ecedc096989bded5f0d795c61a1fcbec6c14d0a3c9f4ad6185cc29ec52087acaa335ed6d98be6ad57f7fa4264626bde0
checksum: 10c0/8ee5fdd43ed0d4092ce7f41577c63147f54049d5617763f0549c638bbe939e8adaa8f1a2728adb63417eb11df51956b7b0d8eb88ee08c27ad1d42960256158fa
languageName: node
linkType: hard
@@ -52719,7 +52739,6 @@ __metadata:
twenty-shared: "workspace:*"
type-fest: "npm:4.10.1"
typeorm: "patch:typeorm@0.3.20#./patches/typeorm+0.3.20.patch"
typescript: "npm:5.9.2"
unzipper: "npm:^0.12.3"
uuid: "npm:9.0.1"
vite-tsconfig-paths: "npm:4.3.2"
@@ -52952,7 +52971,7 @@ __metadata:
deep-equal: "npm:^2.2.2"
dotenv-cli: "npm:^7.2.1"
drizzle-orm: "npm:^0.29.3"
esbuild: "npm:^0.23.0"
esbuild: "npm:^0.25.10"
eslint: "npm:^9.32.0"
eslint-config-prettier: "npm:^9.1.0"
eslint-plugin-import: "npm:^2.31.0"