Code Monkey home page Code Monkey logo

stream's Introduction

tests cover npm size libera manifesto

@rollup/stream

๐Ÿฃ Stream Rollup build results

This package exists to provide a streaming interface for Rollup builds. This is useful in situations where a build system is working with vinyl files, such as gulp.js.

Requirements

This plugin requires an LTS Node version (v8.0.0+) and Rollup v1.20.0+.

Install

Using npm:

npm install @rollup/stream --save-dev

Usage

Assume a src/index.js file exists and contains code like the following:

export default 'jingle bells, batman smells';

We can bundle src/index.js using streams such like:

import rollupStream from '@rollup/stream';

const { log } = console;
const options = {
  input: 'src/index.js',
  output: { format: 'cjs' },
};
const stream = rollupStream(options);
let bundle = '';

stream.on('data', (data) => (bundle += data));
stream.on('end', () => log(bundle));

The preceding code will concatenate each chunk (or asset) and output the entire bundle's content when Rollup has completed bundling and the stream has ended.

Options

All Rollup options are valid to pass as options to @rollup/stream.

Usage with Gulp

Using Gulp requires piping. Suppose one wanted to take the bundle content and run it through a minifier, such as terser:

import rollupStream from '@rollup/stream';
import gulp from 'gulp';
import terser from 'gulp-terser';
import source from 'vinyl-source-stream';

gulp.task('rollup', () => {
  const options = { input: 'src/index.js' };
  return rollupStream(options)
    .pipe(source('bundle.js'))
    .pipe(terser({ keep_fnames: true, mangle: false }))
    .pipe(gulp.dest('dist'));
});

Using Sourcemaps

Rollup can produce source maps by specifying the sourcemap output option. For example; to use the generated sourcemaps with Gulp and @rollup/stream:

import rollupStream from '@rollup/stream';
import buffer from 'vinyl-buffer';
import gulp from 'gulp';
import sourcemaps from 'gulp-sourcemaps';
import source from 'vinyl-source-stream';

gulp.task('rollup', () => {
  const options = { input: 'src/index.js', output: { sourcemap: true } };
  return rollupStream(options)
    .pipe(source('bundle.js'))
    .pipe(buffer())
    .pipe(sourcemaps.init({ loadMaps: true }))
    .pipe(sourcemaps.write('dist'))
    .pipe(gulp.dest('dist'));
});

Caching

The ability to cache a build is already built into Rollup, so users of @rollup/stream get that for free. Caching can be useful to reduce or optimize build times, and is often used when watching files that are part of a build. For example; to utilize caching with Gulp and @rollup/stream:

import rollupStream from '@rollup/stream';
import buffer from 'vinyl-buffer';
import gulp from 'gulp';
import source from 'vinyl-source-stream';

// declare the cache variable outside of task scopes
let cache;

gulp.task('rollup', () => {
  return rollupStream({
    input: 'src/index.js',
    // define the cache in Rollup options
    cache,
  })
    .on('bundle', (bundle) => {
      // update the cache after every new bundle is created
      cache = bundle;
    })
    .pipe(source('bundle.js'))
    .pipe(buffer())
    .pipe(gulp.dest('dist'));
});

gulp.task('watch', (done) => {
  gulp.watch('./src/**/*.js', gulp.series('rollup'));

  // or, with Gulp v3
  // gulp.watch('./src/**/*.js', ['rollup']);

  done();
});

(Example based on the rollup-stream README)

Meta

CONTRIBUTING

LICENSE (MIT)

stream's People

Contributors

dan503 avatar jameelmoses avatar lukastaegert avatar notwoods avatar shellscape avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

stream's Issues

Error: You must supply an options object - but options object is being supplied

I am trying to use this module but it seems to have an issue with the options object. Even though I am providing one, it is returning Error: You must supply an options object. Please see report below.

  • @rollup/stream Version: ^2.0.0
  • Rollup Version:
  • "peerDependencies": {
    "rollup": "^2.35.1"
    }
  • Operating System (or Browser): Macbook Air M1
  • Node Version: 16

How Do We Reproduce?

Minimal repository reproduction: https://github.com/Liam-OShea/RollupIssueReproduction

Expected Behavior

Bundling works without issue

Actual Behavior

Error: You must supply an options object
at getOutputOptionsAndPluginDriver (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/rollup/dist/shared/rollup.js:23604:15)
at handleGenerateWrite (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/rollup/dist/shared/rollup.js:23587:74)
at Object.generate (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/rollup/dist/shared/rollup.js:23548:20)
at build (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/@rollup/stream/dist/index.js:10:37)

Any plans to update this for compatibility with Rollup 2.x?

  • @rollup/stream Version: 0.1.0

Feature Use Case

Developers who want to use the latest Rollup.

Feature Proposal

Update this for support with the latest Rollup (am I using this template right? ๐Ÿ˜…).

I don't know for sure that this isn't compatible with the latest Rollup, but I do note that Rollup 2.x violates this package's peer dependencies.

Hopefully context on this might be fresh given that this package is only 3 months old itself.

sourcemap true errors, sourcemap inline works (.js.map being passed through as asset)

  • @rollup/stream Version: 3.0.0
  • Rollup Version: 3.24.0
  • Operating System (or Browser): macos
  • Node Version: 16

How Do We Reproduce?

Use the gulp example from the rollup/stream sourcemaps example

Not sure if this is rollup/stream or rollup problem.

gulp-sourcemaps has some deprecated dependencies (convert-source-map), but they don't look like they are at fault here.

Configuring rollup sourcemap:true gives error.

SyntaxError: Unexpected token in JSON at position 0

Changing to sourcemap:'inline' works.

Repro

Place the below 3 files in an empty project.

Install the deps:

npm install --save-dev {gulp,gulp-sourcemaps,@rollup/stream,@rollup/plugin-babel,@rollup/plugin-commonjs,@rollup/plugin-node-resolve,vinyl-source-stream,vinyl-buffer}@latest

Run it: node ./rollup-repro.js

You should observe the error (new since rollup@3, issue wasn't present in the last 2.x).

SyntaxError: Unexpected token in JSON at position 0
    at JSON.parse (<anonymous>)
    at new Converter (/tmp/sample-project/node_modules/convert-source-map/index.js:76:48)
    at Object.exports.fromComment (/tmp/sample-project/node_modules/convert-source-map/index.js:155:10)
    at Object.exports.fromSource (/tmp/sample-project/node_modules/convert-source-map/index.js:167:22)
    at _getInlineSources (/tmp/sample-project/node_modules/gulp-sourcemaps/src/init/index.internals.js:85:27)
    at Object.loadMaps (/tmp/sample-project/node_modules/gulp-sourcemaps/src/init/index.internals.js:24:5)
    at DestroyableTransform.sourceMapInit [as _transform] (/tmp/sample-project/node_modules/gulp-sourcemaps/src/init/index.js:41:30)
    at DestroyableTransform.Transform._read (/tmp/sample-project/node_modules/readable-stream/lib/_stream_transform.js:184:10)
...

Edit the rollup config to change sourcemap: true, to sourcemap: 'inline',

Run again, the error should disappear.

The problem seems to be that in the non-inline case, the .js.map files are streamed out raw as "assets"

...or maybe this is gulp-sourcemaps fault?

I inserted some dumb logging up and down the error stack to see what was going on with the data. What I saw is that we end up with the sourcemap twice. Once as a base64 encoded inline comment and appended to that directly is an unencoded .js.map file contents. When that is attempted to be extracted, it blows up of course. Switching to inline mode removes the presence of the .js.map files being output and so the problem disappears.

Example of what gulp-sourcemaps is receiving

Note the end where the base64 inline sourcemap ends and we jump right into a javascript object from the non-inline sourcemap file that was emitted as an "asset".

...0FBQzs7Ozs7OyJ9{"version":3,"file":"some-app.js",...

{
    path: '',
    map: null,
    content: '(function () {\n' +
        "    'use strict';\n" +
        '\n' +
        '    var urlDecode = {\n' +
        '      urlDecode: urlDecode$1,\n' +
        '      encodeURIComponent: encodeURIComponent,\n' +
        '      decodeURIComponent: decodeURIComponent\n' +
        '    };\n' +
        '    function encodeURIComponent(str) {\n' +
        '      return window.encodeURIComponent(str);\n' +
        '    }\n' +
        '    function decodeURIComponent(str) {\n' +
        '      return window.decodeURIComponent(str);\n' +
        '    }\n' +
        '    function urlDecode$1(url) {\n' +
        '      var limit = 5,\n' +
        '        i,\n' +
        '        origUrl = url;\n' +
        '      url = url.trim();\n' +
        '      if (!url) return origUrl;\n' +
        '\n' +
        "      // don't try to decode stuff that doesn't start with http\n" +
        "      if (url.toLowerCase().indexOf('http') !== 0) return url;\n" +
        '      for (i = 0; i <= limit; i++) {\n' +
        "        if (url.toLowerCase().indexOf('http://') == 0 || url.toLowerCase().indexOf('https://') == 0) {\n" +
        '          return url;\n' +
        '        }\n' +
        '        try {\n' +
        '          url = window.decodeURIComponent(url);\n' +
        '        } catch (e) {\n' +
        '          return origUrl;\n' +
        '        }\n' +
        '      }\n' +
        '      return origUrl;\n' +
        '    }\n' +
        '\n' +
        "    var aUrl = 'http%25253A%25252F%25252Fexample.com%25253Ffoo%2525252Cbar%25253Dhello%2525252Cworld';\n" +
        "    console.log('Hello world: ' + urlDecode(aUrl));\n" +
        '\n' +
        '})();\n' +
        '//# sourceMappingURL=some-app.js.map\n' +
        '\n' +
        `//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29tZS1hcHAuanMiLCJzb3VyY2VzIjpbInNyYy9qcy9saWIvdXJsLWRlY29kZS5qcyIsInNyYy9qcy9zb21lLWFwcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgdXJsRGVjb2RlLFxuICAgIGVuY29kZVVSSUNvbXBvbmVudCxcbiAgICBkZWNvZGVVUklDb21wb25lbnQsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50IChzdHIpIHtcbiAgICByZXR1cm4gd2luZG93LmVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVVSSUNvbXBvbmVudCAoc3RyKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5kZWNvZGVVUklDb21wb25lbnQoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVybERlY29kZSh1cmwpIHtcbiAgICB2YXIgbGltaXQgPSA1LCBpLFxuICAgICAgICBvcmlnVXJsID0gdXJsO1xuXG4gICAgdXJsID0gdXJsLnRyaW0oKTtcblxuICAgIGlmICghdXJsKSByZXR1cm4gb3JpZ1VybDtcblxuICAgIC8vIGRvbid0IHRyeSB0byBkZWNvZGUgc3R1ZmYgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggaHR0cFxuICAgIGlmICh1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdodHRwJykgIT09IDApIHJldHVybiB1cmw7XG5cbiAgICBmb3IgKGk9MDsgaSA8PSBsaW1pdDsgaSsrICkge1xuICAgICAgICBpZiAodXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaHR0cDovLycpID09IDBcbiAgICAgICAgICAgIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2h0dHBzOi8vJykgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXJsID0gd2luZG93LmRlY29kZVVSSUNvbXBvbmVudCh1cmwpOyAgICBcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdVcmw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWdVcmw7XG59IiwiXG5pbXBvcnQgdXJsRGVjb2RlIGZyb20gJy4vbGliL3VybC1kZWNvZGUuanMnO1xuXG5jb25zdCBhVXJsID0gJ2h0dHAlMjUyNTNBJTI1MjUyRiUyNTI1MkZleGFtcGxlLmNvbSUyNTI1M0Zmb28lMjUyNTI1MkNiYXIlMjUyNTNEaGVsbG8lMjUyNTI1MkN3b3JsZCc7XG5cbmNvbnNvbGUubG9nKCdIZWxsbyB3b3JsZDogJyArIHVybERlY29kZShhVXJsKSk7Il0sIm5hbWVzIjpbInVybERlY29kZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImRlY29kZVVSSUNvbXBvbmVudCIsInN0ciIsIndpbmRvdyIsInVybCIsImxpbWl0IiwiaSIsIm9yaWdVcmwiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwiZSIsImFVcmwiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiOzs7QUFHQSxvQkFBZTtJQUNYQSxFQUFBQSxTQUFTLEVBQVRBLFdBQVM7SUFDVEMsRUFBQUEsa0JBQWtCLEVBQWxCQSxrQkFBa0I7SUFDbEJDLEVBQUFBLGtCQUFrQixFQUFsQkEsa0JBQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRU0sU0FBU0Qsa0JBQWtCQSxDQUFFRSxHQUFHLEVBQUU7SUFDckMsRUFBQSxPQUFPQyxNQUFNLENBQUNILGtCQUFrQixDQUFDRSxHQUFHLENBQUMsQ0FBQTtJQUN6QyxDQUFBO0lBQ08sU0FBU0Qsa0JBQWtCQSxDQUFFQyxHQUFHLEVBQUU7SUFDckMsRUFBQSxPQUFPQyxNQUFNLENBQUNGLGtCQUFrQixDQUFDQyxHQUFHLENBQUMsQ0FBQTtJQUN6QyxDQUFBO0lBRU8sU0FBU0gsV0FBU0EsQ0FBQ0ssR0FBRyxFQUFFO01BQzNCLElBQUlDLEtBQUssR0FBRyxDQUFDO1FBQUVDLENBQUM7SUFDWkMsSUFBQUEsT0FBTyxHQUFHSCxHQUFHLENBQUE7SUFFakJBLEVBQUFBLEdBQUcsR0FBR0EsR0FBRyxDQUFDSSxJQUFJLEVBQUUsQ0FBQTtJQUVoQixFQUFBLElBQUksQ0FBQ0osR0FBRyxFQUFFLE9BQU9HLE9BQU8sQ0FBQTs7SUFFeEI7SUFDQSxFQUFBLElBQUlILEdBQUcsQ0FBQ0ssV0FBVyxFQUFFLENBQUNDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBT04sR0FBRyxDQUFBO01BRXZELEtBQUtFLENBQUMsR0FBQyxDQUFDLEVBQUVBLENBQUMsSUFBSUQsS0FBSyxFQUFFQyxDQUFDLEVBQUUsRUFBRztRQUN4QixJQUFJRixHQUFHLENBQUNLLFdBQVcsRUFBRSxDQUFDQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUN0Q04sR0FBRyxDQUFDSyxXQUFXLEVBQUUsQ0FBQ0MsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUMvQyxNQUFBLE9BQU9OLEdBQUcsQ0FBQTtJQUNkLEtBQUE7UUFDQSxJQUFJO0lBQ0FBLE1BQUFBLEdBQUcsR0FBR0QsTUFBTSxDQUFDRixrQkFBa0IsQ0FBQ0csR0FBRyxDQUFDLENBQUE7U0FDdkMsQ0FDRCxPQUFPTyxDQUFDLEVBQUU7SUFDTixNQUFBLE9BQU9KLE9BQU8sQ0FBQTtJQUNsQixLQUFBO0lBQ0osR0FBQTtJQUNBLEVBQUEsT0FBT0EsT0FBTyxDQUFBO0lBQ2xCOztJQ3JDQSxJQUFNSyxJQUFJLEdBQUcsc0ZBQXNGLENBQUE7SUFFbkdDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLGVBQWUsR0FBR2YsU0FBUyxDQUFDYSxJQUFJLENBQUMsQ0FBQzs7Ozs7OyJ9{"version":3,"file":"some-app.js","sources":["src/js/lib/url-decode.js","src/js/some-app.js"],"sourcesContent":["\\n\\n\\nexport default {\\n    urlDecode,\\n    encodeURIComponent,\\n    decodeURIComponent,\\n};\\n\\nexport function encodeURIComponent (str) {\\n    return window.encodeURIComponent(str);\\n}\\nexport function decodeURIComponent (str) {\\n    return window.decodeURIComponent(str);\\n}\\n\\nexport function urlDecode(url) {\\n    var limit = 5, i,\\n        origUrl = url;\\n\\n    url = url.trim();\\n\\n    if (!url) return origUrl;\\n\\n    // don't try to decode stuff that doesn't start with http\\n    if (url.toLowerCase().indexOf('http') !== 0) return url;\\n\\n    for (i=0; i <= limit; i++ ) {\\n        if (url.toLowerCase().indexOf('http://') == 0\\n            || url.toLowerCase().indexOf('https://') == 0) {\\n            return url;\\n        }\\n        try {\\n            url = window.decodeURIComponent(url);    \\n        }\\n        catch (e) {\\n            return origUrl;\\n        }\\n    }\\n    return origUrl;\\n}","\\nimport urlDecode from './lib/url-decode.js';\\n\\nconst aUrl = 'http%25253A%25252F%25252Fexample.com%25253Ffoo%2525252Cbar%25253Dhello%2525252Cworld';\\n\\nconsole.log('Hello world: ' + urlDecode(aUrl));"],"names":["urlDecode","encodeURIComponent","decodeURIComponent","str","window","url","limit","i","origUrl","trim","toLowerCase","indexOf","e","aUrl","console","log"],"mappings":";;;AAGA,oBAAe;IACXA,EAAAA,SAAS,EAATA,WAAS;IACTC,EAAAA,kBAAkB,EAAlBA,kBAAkB;IAClBC,EAAAA,kBAAkB,EAAlBA,kBAAAA;IACJ,CAAC,CAAA;IAEM,SAASD,kBAAkBA,CAAEE,GAAG,EAAE;IACrC,EAAA,OAAOC,MAAM,CAACH,kBAAkB,CAACE,GAAG,CAAC,CAAA;IACzC,CAAA;IACO,SAASD,kBAAkBA,CAAEC,GAAG,EAAE;IACrC,EAAA,OAAOC,MAAM,CAACF,kBAAkB,CAACC,GAAG,CAAC,CAAA;IACzC,CAAA;IAEO,SAASH,WAASA,CAACK,GAAG,EAAE;MAC3B,IAAIC,KAAK,GAAG,CAAC;QAAEC,CAAC;IACZC,IAAAA,OAAO,GAAGH,GAAG,CAAA;IAEjBA,EAAAA,GAAG,GAAGA,GAAG,CAACI,IAAI,EAAE,CAAA;IAEhB,EAAA,IAAI,CAACJ,GAAG,EAAE,OAAOG,OAAO,CAAA;;IAExB;IACA,EAAA,IAAIH,GAAG,CAACK,WAAW,EAAE,CAACC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAON,GAAG,CAAA;MAEvD,KAAKE,CAAC,GAAC,CAAC,EAAEA,CAAC,IAAID,KAAK,EAAEC,CAAC,EAAE,EAAG;QACxB,IAAIF,GAAG,CAACK,WAAW,EAAE,CAACC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IACtCN,GAAG,CAACK,WAAW,EAAE,CAACC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;IAC/C,MAAA,OAAON,GAAG,CAAA;IACd,KAAA;QACA,IAAI;IACAA,MAAAA,GAAG,GAAGD,MAAM,CAACF,kBAAkB,CAACG,GAAG,CAAC,CAAA;SACvC,CACD,OAAOO,CAAC,EAAE;IACN,MAAA,OAAOJ,OAAO,CAAA;IAClB,KAAA;IACJ,GAAA;IACA,EAAA,OAAOA,OAAO,CAAA;IAClB;;ICrCA,IAAMK,IAAI,GAAG,sFAAsF,CAAA;IAEnGC,OAAO,CAACC,GAAG,CAAC,eAAe,GAAGf,SAAS,CAACa,IAAI,CAAC,CAAC;;;;;;"}`,
    preExistingComment: null
}

rollup-repro.js

import gulp from 'gulp';
import sourcemaps from 'gulp-sourcemaps';
import path from 'node:path';
import rollupStream from '@rollup/stream';
import source from 'vinyl-source-stream';
import buffer from 'vinyl-buffer';
import babel from '@rollup/plugin-babel';
import commonJs from '@rollup/plugin-commonjs';
import resolveNodeModules from '@rollup/plugin-node-resolve';

const babelConfig = {
    babelHelpers: 'bundled',
    presets: [
        [
            '@babel/preset-env',
            {
                corejs: {
                    version: 3 
                },
                useBuiltIns: 'entry',
                targets: '> 0.1%',
            }
        ]
    ]
};

function rollup (entryPath, destDir, exportName) {
    
    const entryFileName = path.basename(entryPath),
        rollupConfig = {
            input: entryPath,
            output: {
                format: 'iife',
                name: exportName ? exportName : '_crCus',    // the output global name.
                sourcemap: true,
            },
            plugins: [
                resolveNodeModules({browser:true}),
                commonJs(),
                babel(babelConfig),
            ],
        };

    
    return rollupStream(rollupConfig)
        .pipe(source(entryFileName))
        .pipe(buffer())
        .pipe(sourcemaps.init({loadMaps: true}))
        // terser or whatever here
        .pipe(sourcemaps.write('.'))
        .pipe(gulp.dest(destDir));
}


rollup('./some-app.js', '/tmp', '_someApp');
        

some-app.js

import urlDecode from './url-decode.js';

const aUrl = 'http%25253A%25252F%25252Fexample.com%25253Ffoo%2525252Cbar%25253Dhello%2525252Cworld';

console.log('Hello world: ' + urlDecode(aUrl));

url-decode.js

export default {
    urlDecode,
    encodeURIComponent,
    decodeURIComponent,
};

export function encodeURIComponent (str) {
    return window.encodeURIComponent(str);
}
export function decodeURIComponent (str) {
    return window.decodeURIComponent(str);
}

export function urlDecode(url) {
    var limit = 5, i,
        origUrl = url;

    url = url.trim();

    if (!url) return origUrl;

    // don't try to decode stuff that doesn't start with http
    if (url.toLowerCase().indexOf('http') !== 0) return url;

    for (i=0; i <= limit; i++ ) {
        if (url.toLowerCase().indexOf('http://') == 0
            || url.toLowerCase().indexOf('https://') == 0) {
            return url;
        }
        try {
            url = decodeURIComponent(url);    
        }
        catch (e) {
            return origUrl;
        }
    }
    return origUrl;
}

Expected Behavior

I expect both inline/non-inline sourcemap configs to work.
I expect the examples in the README to work.

Actual Behavior

See above.

Support for Rollup 3

  • @rollup/stream Version: 2.0.0

Feature Use Case

Rollup 3 was just released last week, so this would be useful for developers who want to use the new version.

Feature Proposal

The current version of rollup/stream requires rollup 2.x as a peer dependency, but now that rollup 3 has been released, it would be useful to have a version of rollup/stream that supports it. The current version might still work with rollup 3 (I haven't tried it, so I'm not sure), but it might also have unintended consequences (especially with some of the deprecated/removed config/plugin options in rollup 3).

I realise it might be early days and you haven't had the chance to update the package yet, but I'd love to know if there are plans to support rollup 3 soon. I'd be happy to help testing/updating (if necessary) the package with rollup 3 if you want/need.

Thank you!

Error: You must supply an options object - but options object is being supplied

I am trying to use this module but it seems to have an issue with the options object. Even though I am providing one, it is returning Error: You must supply an options object. Please see report below.

  • @rollup/stream Version: ^2.0.0
  • Rollup Version:
  • "peerDependencies": {
    "rollup": "^2.35.1"
    }
  • Operating System (or Browser): Macbook Air M1
  • Node Version: 16

How Do We Reproduce?

gulpfile.js

function bundle() {
const options = {input : "src/main.js"}
return rollupStream(options)
.pipe(source("bundle.js"))
.pipe(dest("dist"))
}
exports.default = series(bundle);

run using gulp CLI

Expected Behavior

Bundling works without issue

Actual Behavior

Error: You must supply an options object
at getOutputOptionsAndPluginDriver (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/rollup/dist/shared/rollup.js:23604:15)
at handleGenerateWrite (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/rollup/dist/shared/rollup.js:23587:74)
at Object.generate (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/rollup/dist/shared/rollup.js:23548:20)
at build (/Users/liam/Documents/Work/ProofOfConcept/gulpinject/node_modules/@rollup/stream/dist/index.js:10:37)

Feature Request: Given a multi-entry-point configuration, output multiple chunks with known names as generated by Rollup

  • @rollup/stream Version: 2.0.0

Feature Use Case

I'm using Rollup to bundle node dependencies specifically (not an entire app), and to do that efficiently it is useful to define multiple named entry points in a single config. With this approach, dependencies of dependencies which are sometimes shared between dependencies and thus can benefit from having multiple entry points that are evaluated together are also efficiently output as separate chunks as necessary via code splitting. The current examples, however, don't appear to support this output well since with them it seems like I can only have one file output and I need to know what it's called. To be able to do this efficiently, I believe that I need to have a mode for this plugin in which it wraps the files in Vinyl streams itself to provide multiple file outputs and preserve the names of those files.

The reason I'm not using gulp-rollup for this is that it seems to imply that I'd need to load every file that Rollup might need in gulp.src, which seems inefficient, particularly because I'd ideally also want to avoid pulling in dev dependencies. I could maybe avoid providing any source files at all using this option, but that seems to be discouraged ๐Ÿคฃ

The rollup.config.js that I'm currently using for this is below:

var replace = require('@rollup/plugin-replace');
var nodeResolve = require('@rollup/plugin-node-resolve');
var commonjs = require('@rollup/plugin-commonjs');
var babel = require('@rollup/plugin-babel');

var config = {
    // the entry points for each item to bundle
    input: {
        '@date-io/moment': './node_modules/@date-io/moment/build/index.js'
        '@material-ui/core': './node_modules/@material-ui/core/esm/index.js',
        '@material-ui/lab/Autocomplete': './node_modules/@material-ui/lab/esm/Autocomplete/index.js',
        '@material-ui/pickers': './node_modules/@material-ui/pickers/index.js',
        'react': './node_modules/react/index.js',
        'react/jsx-runtime': './node_modules/react/jsx-runtime.js',
        'react/jsx-dev-runtime': './node_modules/react/jsx-dev-runtime.js',
        'react-dom': './node_modules/react-dom/index.js',
        'react-infinite-scroll-hook': './node_modules/react-infinite-scroll-hook/dist/index.js',
        'react-merge-refs': './node_modules/react-merge-refs/dist/index.js'
        'redux': './node_modules/redux/es/redux.js',
        'react-redux': './node_modules/react-redux/es/index.js',
        'redux-thunk': './node_modules/redux-thunk/es/index.js',
    },

    plugins: [
        // replace node environment variables with appropriate values
        replace({
            preventAssignment: true,
            values: {
                'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
            }
        }),

        // resolve named dependencies using node resolution rules
        nodeResolve.nodeResolve({
            browser: true
        }),

        // convert CommonJS modules to ES6 so Rollup will understand them
        commonjs(),

        // use babel to read and transpile modules, which may contain stuff like JSX
        babel.babel({
            babelHelpers: 'bundled',
            extensions: [
                '.js',
                '.jsx'
            ]
        })
    ],

    output: {
        // prefix dependency chunk bundles with __chunk_ to prevent conflicts
        chunkFileNames: '__chunk_[name]/js/index.js',

        // output all entry point bundles as AMD modules to js/index.js under the module's path
        entryFileNames: '[name]/js/index.js',

        // output modules in AMD format - our codebase is old and we'd like to eventually move
        // away from this but we can't yet
        format: 'amd',

        // use ES interop
        interop: 'auto'
    }
};

// reference entry point dependencies by name rather than relative path
config.external = Object.keys(config.input);

module.exports = config;

Feature Proposal

It would be nice if this plugin offered an option to provide multiple chunks from Rollup as separate outputs in a format that's easy to consume since it seems like such output isn't available in the current version. I'm interested in potentially contributing a change that accomplishes this goal back to the main repository if this is a feature that maintainers are interested in adding or possibly documentation that shows how to use this plugin to accomplish such a goal if this feature already exists and I missed it.

I've put together a proposed implementation at master...reubenrybnik:output-vinyl-stream that is comprised of an optional flag which when specified causes this plugin's output to be changed to a Vinyl object stream to which the separate named files provided by Rollup are written. I'm currently using this implementation in a private commercial repository. This works for my use case but may not be the best implementation of this feature from maintainers' perspective, and I'm happy to discuss potential alternatives in that case.

If this approach is accepted, I believe my current proposed implementation of adding an option to switch to this output mode and making the Vinyl dependencies optional would make this a non-breaking change. However, I'm interested in knowing maintainers' views on whether it might be better to move away from the current pattern of using vinyl-source-stream to convert the output to a single Vinyl item. In particular, I'm not sure whether there are any use cases in which this output is not immediately converted to Vinyl or whether maintainers are interested in supporting such use cases. I'm also interested in views on whether it would be better to switch to this mode using an option as in my current implementation or whether it might be better to provide a separate function property off of the main export instead (i.e. something like webpackStream.vinyl(config) instead of webpackStream(config, { outputVinyl: true })). I'd also welcome any other feedback you'd like to provide on this approach.

Thanks in advance for your consideration of this request!

@rollup/stream incompatible with current nodejs?

  • @rollup/stream Version: 1.0.0
  • Rollup Version: 2.18.2
  • Operating System (or Browser): Ubuntu 18.4
  • Node Version: 13.5.0

How Do We Reproduce?

Load @rollup/stream via require in new node

I did not isolate the problem since to me it looks pretty self-explanatory. But I may be mistaken and maybe the problem is even somehow in my code. So if you don't see the problem, please let me know and I'll try to isolate it.

Expected Behavior

Script is loaded

Actual Behavior

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /my/path/node_modules/rollup/dist/es/rollup.browser.js
require() of ES modules is not supported.
require() of /my/path/node_modules/rollup/dist/es/rollup.browser.js from /my/path/node_modules/@rollup/stream/dist/index.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename rollup.browser.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /my/path/node_modules/rollup/dist/es/package.json.

NPM Package out of date?

  • @rollup/stream Version: 1.0.0
  • Rollup Version: 2.18.0
  • Operating System (or Browser): Windows 10
  • Node Version: 12.14.1

How Do We Reproduce?

Run a rollup build using this plugin, with plugins specified in the Rollup config, e.g.

plugins: [
      rollupResolve(),
      rollupBabel({
        exclude: 'node_modules/**',
        presets: [
          ['@babel/preset-env', {modules: false}],
          ['@babel/preset-react', {modules: false, development: isDev}]
        ],
        plugins: ['@babel/plugin-proposal-class-properties'],
        babelHelpers: 'bundled'
      }),
      commonJs({
        include: 'node_modules/**',
        ignore: ['conditional-runtime-dependency']
      })
    ]

It builds correctly, but lots of errors appear like the following:

The "buildStart" hook used by the output plugin node-resolve is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.

Expected Behavior

These errors shouldn't appear.

Actual Behavior

As above.

Hypothesis

The NPM package doesn't appear to match the code shown here: https://github.com/rollup/stream/blob/master/src/index.ts

Specifically, in the version in my local node_modules folder I see the following line:

const { output } = await bundle.generate(options);

If I change it to match the version hosted here (by only supplying the output options) it works correctly:

const { output } = await bundle.generate(options.output);

Workaround for output options issue

If you're seeing the output plugin warnings, the issue is fixed on the master branch but hasn't been pushed to npm yet.
I made a temporary workaround repo at download13/stream#v1.0.1

You can use it with npm install github:download13/stream#v1.0.1

Feel free to delete this when no longer relevant. Wasn't going to make another thread, but #8 was locked.

Messages from Rollup plugins

I'm receiving some messages bellow when using some Rollup plugins (rollup-plugin-babel, @rollup/plugin-commonjs and @rollup/plugin-node-resolve).

The "resolveId" hook used by the output plugin babel is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "load" hook used by the output plugin babel is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "transform" hook used by the output plugin babel is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "buildStart" hook used by the output plugin node-resolve is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "resolveId" hook used by the output plugin node-resolve is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "load" hook used by the output plugin node-resolve is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "buildStart" hook used by the output plugin commonjs is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "resolveId" hook used by the output plugin commonjs is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "load" hook used by the output plugin commonjs is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.
The "transform" hook used by the output plugin commonjs is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.

My code:

...
return rollupStream({
    input: 'src/test.js',
    cache,
    plugins: [
        babel({
            presets: [ [ '@babel/preset-env', { modules: false } ] ],
            exclude: 'node_modules/**',
            babelrc: false
        }),
        resolve(),
        commonjs()
    ],
...

Apparently the plugins are working, but they are displaying these messages.

Please, can help me how to solve?

Thanks!

Cache support for better performance

Feature Use Case

You are running Gulp watch so it runs rollup every time you save. You make a small change to one of the files and save. Instead of waiting for Rollup to recalculate the entire package bundle from scratch, it can improve performance by using data from the last bundle to only recalculate what is different.

Feature Proposal

The old rollup-stream plugin supported a cache option that allowed bundling performance to be drastically faster by only recalculating what had changed.

You can see an example of how the cache option was used in this example:
https://github.com/Dan503/gulp-file-loader/blob/master/README.md#rollup-in-gulp-4

If it was capable of self-caching without any extra code, that would be even better.

If this has already been implemented then documenting it would be helpful.

If not, this is an important feature that most Gulp users would benefit greatly from.

Gulp example misses output

The example in the readme

import rollupStream from '@rollup/stream';
import gulp from 'gulp';
import terser from 'gulp-terser';
import source from 'vinyl-source-stream';

gulp.task('rollup', () => {
  const options = { input: 'src/index.js' };
  return rollupStream(options)
    .pipe(source('bundle.js'))
    .pipe(terser({ keep_fnames: true, mangle: false }))
    .pipe(gulp.dest('dist'));
});

Causes an error Error: You must supply an options object.

I fixed it by setting the output

import rollupStream from '@rollup/stream';
import gulp from 'gulp';
import terser from 'gulp-terser';
import source from 'vinyl-source-stream';

gulp.task('rollup', () => {
  const options = { input: 'src/index.js', output: { format: 'cjs' } };
  return rollupStream(options)
    .pipe(source('bundle.js'))
    .pipe(terser({ keep_fnames: true, mangle: false }))
    .pipe(gulp.dest('dist'));
});

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.