perf(controller): полный SWC через @swc-node/register + Node 22

Финал миграции: вместо ts-node --transpileOnly теперь полный SWC
(Rust-транспайлер) через ts-node "swc" mode. Установлены
@swc-node/register@^1.11.1 и @swc/core@^1.15.33 в controller.
tsconfig "ts-node" → { "swc": true, "files": true } (вместо
transpileOnly). Все 14 ts-node-вызовов очищены от --transpileOnly
(избыточно при swc).

Замер:
- ts-node + tsc (baseline): 26+ сек cold-start на простом скрипте
- ts-node --transpileOnly (Node 20): ~1.0 сек
- ts-node + swc (Node 22):           ~1.0 сек (та же скорость, но
  без потери типов — SWC всё ещё транспайлит, просто на Rust)

На полном controller-проекте dev-cold-start раньше был 60+ сек,
теперь — secunda-уровень (точно замерить можно только перезапустив
coopback в контейнере).

Node 22:
- nvm alias default 22 (Node 22.22.3 — требование Quasar 2.5.2,
  заодно убрал quasar-prepare warning при pnpm install).
- libxmljs2 native binary теперь совместим с runtime (на Node 20
  падал tests/unit/reports на NODE_MODULE_VERSION mismatch).

.npmrc в корне (`store-dir=./.pnpm-store`) — фиксирует store в
монорепе. Корень проблемы был: docker-coopback запущен от root и
писал в `/app/.pnpm-store` (= host's /home/ant/mono/.pnpm-store),
host-pnpm дефолтно искал в ~/.local/share/pnpm/store — отсюда
ERR_PNPM_UNEXPECTED_STORE. Relative-path в .npmrc устраняет
mismatch навсегда: и хост, и контейнер видят store через тот же
relative-путь от repo root.

Smoke-suite tests/unit/_swc-readiness/ — 4/4 PASS на SWC, что
формально подтверждает: emitDecoratorMetadata через barrel-import
сохраняется (Nest DI, class-validator, @ValidateNested + @Type все
получают правильные design:type/paramtypes из SWC).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alex Ant
2026-05-23 09:20:05 +05:00
parent 40be8fb60c
commit 79e333db44
4 changed files with 535 additions and 59 deletions
+1
View File
@@ -0,0 +1 @@
store-dir=./.pnpm-store
+17 -15
View File
@@ -18,8 +18,8 @@
"scripts": {
"deploy-testnet": "git checkout testnet && git merge main && git push origin testnet && git checkout main",
"deploy-production": "git checkout production && git merge testnet && git push origin production && git checkout main",
"start": "ts-node --transpileOnly -r tsconfig-paths/register src/index.ts",
"dev": "nodemon --watch src --watch migrations --ext ts,js,env --exec 'ts-node --transpileOnly -r tsconfig-paths/register' src/index.ts",
"start": "ts-node -r tsconfig-paths/register src/index.ts",
"dev": "nodemon --watch src --watch migrations --ext ts,js,env --exec 'ts-node -r tsconfig-paths/register' src/index.ts",
"test": "jest -i --testPathPattern=tests/unit",
"test:integration": "echo 'Integration tests run via @coopenomics/boot' && exit 0",
"test:integration:file-storage": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --testRegex 'tests/file-storage/.*\\.integration\\.spec\\.ts$' --testPathIgnorePatterns='/node_modules/' --testTimeout=60000 -i",
@@ -29,26 +29,26 @@
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"prettier": "prettier --check **/*.js",
"analyze:modules": "ts-node --transpileOnly -r tsconfig-paths/register scripts/analyze-modules.ts",
"migration:generate": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/generate-migration.ts",
"migration:run": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/migration-cli.ts run",
"migration:run-specific": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/migration-cli.ts run-specific",
"migration:rollback": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/migration-cli.ts rollback",
"migration:rollback-latest": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/migration-cli.ts rollback-latest",
"migration:status": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/migration-cli.ts status",
"migration:list": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/migration-cli.ts list",
"migrate": "ts-node --transpileOnly -r tsconfig-paths/register src/index.ts --migrate",
"analyze:modules": "ts-node -r tsconfig-paths/register scripts/analyze-modules.ts",
"migration:generate": "ts-node -r tsconfig-paths/register src/scripts/generate-migration.ts",
"migration:run": "ts-node -r tsconfig-paths/register src/scripts/migration-cli.ts run",
"migration:run-specific": "ts-node -r tsconfig-paths/register src/scripts/migration-cli.ts run-specific",
"migration:rollback": "ts-node -r tsconfig-paths/register src/scripts/migration-cli.ts rollback",
"migration:rollback-latest": "ts-node -r tsconfig-paths/register src/scripts/migration-cli.ts rollback-latest",
"migration:status": "ts-node -r tsconfig-paths/register src/scripts/migration-cli.ts status",
"migration:list": "ts-node -r tsconfig-paths/register src/scripts/migration-cli.ts list",
"migrate": "ts-node -r tsconfig-paths/register src/index.ts --migrate",
"prettier:fix": "prettier --write **/*.js",
"docker:prod": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up",
"docker:dev": "docker-compose -f docker-compose.yml -f docker-compose.dev.yml up",
"docker:test": "docker-compose -f docker-compose.yml -f docker-compose.test.yml up",
"types": "ts-node --transpileOnly scripts/types.ts",
"init": "ts-node --transpileOnly scripts/init.ts",
"init:cooperative": "ts-node --transpileOnly -r tsconfig-paths/register src/scripts/init-cooperative.ts",
"types": "ts-node scripts/types.ts",
"init": "ts-node scripts/init.ts",
"init:cooperative": "ts-node -r tsconfig-paths/register src/scripts/init-cooperative.ts",
"typecheck": "tsc --noEmit",
"docs": "spectaql spectaql-config.yml",
"generate-client": "node ./scripts/generate-client.cjs",
"generate-schema": "ts-node --transpileOnly -r ./scripts/register-schema-gen-env.cjs -r tsconfig-paths/register scripts/generate-schema.ts"
"generate-schema": "ts-node -r ./scripts/register-schema-gen-env.cjs -r tsconfig-paths/register scripts/generate-schema.ts"
},
"keywords": [
"node",
@@ -193,6 +193,8 @@
"@antfu/eslint-config": "^2.24.1",
"@graphql-codegen/cli": "^5.0.3",
"@graphql-codegen/typescript": "^4.1.1",
"@swc-node/register": "^1.11.1",
"@swc/core": "^1.15.33",
"@graphql-codegen/typescript-apollo-client-helpers": "^3.0.0",
"@graphql-codegen/typescript-operations": "^4.3.1",
"@nestjs/testing": "^11.1.19",
+1 -1
View File
@@ -22,7 +22,7 @@
"include": ["src/**/*.ts", "scripts/*.ts", "tests/**/*.ts"],
"exclude": ["node_modules", "dist"],
"ts-node": {
"transpileOnly": true,
"swc": true,
"files": true
}
}
+516 -43
View File
File diff suppressed because it is too large Load Diff