GitXplorerGitXplorer
a

nestjs-esm-fix

public
5 stars
3 forks
0 issues

Commits

List of commits on branch master.
Unverified
dc241a8118a74e29c26c8547aada1219d65304f4

chore(release): 1.6.1 [skip ci]

aantongolub committed a year ago
Unverified
946a58604c4a29082703c3aafeee2f3987721c13

fix: nestjs-redoc is not dev dep

ddimonka83 committed a year ago
Verified
c1aee44f9a71b304694fdf26680418a8d5cf47c5

docs: specify nestjs compat range

aantongolub committed a year ago
Unverified
2d2282cc8a52c20655ffd8230e4989843a222f5b

chore(release): 1.6.0 [skip ci]

aantongolub committed 2 years ago
Unverified
9be878b0ef16ea72c38ec81aa2f48e64497bf374

refactor: separate patch module

aantongolub committed 2 years ago
Unverified
858ff7175b18eaa66ed0401fcfcde9eebdaa7280

feat: add TS libdefs

aantongolub committed 2 years ago

README

The README file for this repository.

nestjs-esm-fix

CI Maintainability Test Coverage npm (tag)

Patch Nestjs app ESM bundles to make them work RHRN
⚠️ This is a temporary solution until Nestjs is fixed

Stack

Problems

https://github.com/nestjs/nest-cli/issues/1157 https://github.com/nestjs/swagger/issues/1450 https://github.com/evanw/esbuild/pull/509 https://github.com/evanw/esbuild/issues/566

  1. openapi is not defined. https://github.com/nestjs/swagger/issues/1450
__decorate([
  Post('event-unsafe-batch'),
  HttpCode(200),
  openapi.ApiResponse({ status: 200, type: String }),
  __param(0, Body()),
  __param(1, Req()),
  __metadata("design:type", Function),
  __metadata("design:paramtypes", [Object, Object]),
  __metadata("design:returntype", Promise)
], EventUnsafeController.prototype, "logEventBatch", null);
  1. openapi / class-validator DTOs are referenced by require API. https://github.com/microsoft/TypeScript/issues/43329
export class CspReportDto {
  static _OPENAPI_METADATA_FACTORY() {
    return { timestamp: { required: false, type: () => Object }, 'csp-report': { required: true, type: () => require("./csp.dto.js").CspReport } };
  }
}
  1. NodeJS builtins are referenced via require API.
var require_async4 = __commonJS({
  "node_modules/resolve/lib/async.js"(exports, module2) {
    var fs2 = require("fs");
  1. esbuild-compiled ESM bundle cannot refer to views/redoc.handlebars
const redocFilePath = path_1.default.join(__dirname, "..", "views", "redoc.handlebars");
  1. _OPENAPI_METADATA_FACTORY class fields may be empty, so the swagger declaration cannot be properly rendered.
var Meta = class {
};
// →
var Meta = class {
  static _OPENAPI_METADATA_FACTORY() {
    return { appName: { required: false,  type: () =>  String }, appHost: { required: false,  type: () =>  String }, appVersion: { required: false,  type: () =>  String }, appNamespace: { required: false,  type: () =>  String }, appConfig: { required: false,  type: () =>  typeof (_a3 = typeof Record !== "undefined" && Record) === "function" ? _a3 : Object }, deviceInfo: { required: false,  type: () =>  typeof (_b3 = typeof Record !== "undefined" && Record) === "function" ? _b3 : Object }, userAgent: { required: false,  type: () =>  String }, envProfile: { required: false,  enum:  typeof (_c = typeof import_substrate2.EnvironmentProfile !== "undefined" && import_substrate2.EnvironmentProfile) === "function" ? _c : Object } }
  }
};
  1. Extra type wrappers cannot be processed by openapi / class-validator / class-transformer
  __metadata("design:type", typeof (_d = typeof Array !== "undefined" && Array) === "function" ? _d : Object)
  __metadata("design:type", typeof (_e = typeof import_substrate2.LogLevel !== "undefined" && import_substrate2.LogLevel) === "function" ? _e : Object)
  // →
  __metadata("design:type", Array)
  __metadata("design:type", import_substrate2.LogLevel)

Solution

Old good monkey patching.

Install

yarn add -D nestjs-esm-fix

Usage

CLI

nestjs-esm-fix target/**/*.js
nestjs-esm-fix --target=target/**/*.js
nestjs-esm-fix --target=**/* --cwd=target
Option Description Default
--target Pattern to match files to fix. **/*
--cwd Current working dir. process.cwd()
--openapi-complex-types Simplify __metadata("design:type") declarations. true
--openapi-meta Restore static OPENAPI_METADATA_FACTORY if missing. true
--openapi-var Inject openapi variable. Set --no-openapi-var to disable. true
--dirname-var Inject __dirname and __filename polyfills. true
--importify Replace require with import API for Nodejs builtins. Replace type: () => require(smth) statements with import. true
--require-main Inject main field for require API polyfill. true
--redoc-tpl Inject redoc.hbs templates. true

JS API

import { fix } from 'nestjs-esm-fix'
await fix({
  cwd: '.',
  target: 'target/**/*.js',
  openapiComplexTypes: true,
  openapiVar: true,
  openapiMeta: true,
  dirnameVar: true,
  importify: true,
  requireMain: true,
  redocTpl: true
})

License

MIT