LinbuduLab / esbuild-plugins

ESBuild plugins by @LinbuduLab
MIT License
113 stars 18 forks source link

[plugin plugin:compress] outputFiles is not iterable #83

Closed renanwilliam closed 2 years ago

renanwilliam commented 2 years ago

Just trying the compress plugin and always receiving the same message:

const compress = require('esbuild-plugin-compress').compress

require('esbuild').build({
  entryPoints: ['./src/index.ts'],
  bundle: true,
  platform: 'node',
  outfile: './build/index.js',
  plugins: [
    compress({
      outputDir: 'dist',
    }),
  ],
}).catch(() => process.exit(1));
    ✘ [ERROR] [plugin plugin:compress] outputFiles is not iterable

    /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild-plugin-compress/src/lib/esbuild-plugin-compress.js:48:67:
      48 │                 for (const { path: originOutputPath, contents } of outputFiles) {
         ╵                                                                    ^

    at /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild-plugin-compress/src/lib/esbuild-plugin-compress.js:48:68
    at /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:1040:21
    at runOnEndCallbacks (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:1045:11)
    at buildResponseToResult (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:1249:7)
    at /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:1358:14
    at /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:666:9
    at handleIncomingPacket (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:763:9)
    at Socket.readFromStdout (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:632:7)
    at Socket.emit (events.js:400:28)
    at addChunk (internal/streams/readable.js:293:12)

  This error came from the "onEnd" callback registered here:

    /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild-plugin-compress/src/lib/esbuild-plugin-compress.js:47:12:
      47 │             onEnd(async ({ outputFiles }) => {
         ╵             ~~~~~

    at setup (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild-plugin-compress/src/lib/esbuild-plugin-compress.js:47:13)
    at handlePlugins (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:843:23)
    at Object.buildOrServe (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:1137:7)
    at /Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:2085:17
    at new Promise (<anonymous>)
    at Object.build (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:2084:14)
    at Object.build (/Users/renan/Projetos/tunnelhub/templates/template-delta/node_modules/esbuild/lib/main.js:1931:51)
    at Object.<anonymous> (/Users/renan/Projetos/tunnelhub/templates/template-delta/esbuild.js:6:20)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)

Using:

zorgick commented 2 years ago

I'm having exactly the same error

renanwilliam commented 2 years ago

Have used @tybys/cross-zip while this issue is open:

const zip = require('@tybys/cross-zip');
const path = require('path');

require('esbuild').build({
  entryPoints: ['./src/index.ts'],
  bundle: true,
  platform: 'node',
  outfile: './build/index.js',
  plugins: [
    compress({
      outputDir: 'dist',
    }),
  ],
}).then(result => {
  if (result.errors.length === 0) {
    const inPath = path.join(__dirname, 'build/');
    const outPath = path.join(__dirname, 'dist', 'artifact.zip');
    zip.zipSync(inPath, outPath, false);
  }
}).catch(() => process.exit(1));
linbudu599 commented 2 years ago

It looks like the ESBuild update caused the breaking change, need fix.

linbudu599 commented 2 years ago

ESBuild doesnot expose outputFile info when using write: true options. so you need to set this explictly, and this was incorrectly tiped in plugin.

You can use just like this:

import { compress } from './plugin';
import { build } from 'esbuild';
import type { BuildOptions } from 'esbuild';

const baseOptions: BuildOptions = {
  entryPoints: ['./src/index.ts'],
  bundle: true,
  platform: 'node',
  outfile: './build/index.js',
};
const compressOptions: BuildOptions = {
  ...baseOptions,
  write: false,
  plugins: [
    ...(baseOptions.plugins ?? []),
    compress({
      outputDir: 'dist',
    }),
  ],
};

build(baseOptions).catch(() => process.exit(1));

build(compressOptions).catch(() => process.exit(1));
renanwilliam commented 2 years ago

ok, I've seen the updated docs. thanks