Socket
Socket
Sign inDemoInstall

@esbuild-plugins/node-modules-polyfill

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@esbuild-plugins/node-modules-polyfill - npm Package Compare versions

Comparing version 0.1.1 to 0.1.2

6

CHANGELOG.md
# @esbuild-plugins/node-modules-polyfill
## 0.1.2
### Patch Changes
- f35eeb6: Fix problem with commonjs interopability
## 0.1.1

@@ -4,0 +10,0 @@

187

dist/index.js

@@ -11,49 +11,2 @@ "use strict";

};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
var __importDefault = (this && this.__importDefault) || function (mod) {

@@ -64,9 +17,9 @@ return (mod && mod.__esModule) ? mod : { "default": mod };

exports.NodeModulesPolyfillPlugin = void 0;
var escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
var fs_1 = __importDefault(require("fs"));
var path_1 = __importDefault(require("path"));
var polyfills_1 = require("./polyfills");
const escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const polyfills_1 = require("./polyfills");
// import { NodeResolvePlugin } from '@esbuild-plugins/node-resolve'
var NAME = 'node-modules-polyfills';
var NAMESPACE = NAME;
const NAME = 'node-modules-polyfills';
const NAMESPACE = NAME;
function removeEndingSlash(importee) {

@@ -78,77 +31,63 @@ if (importee && importee.slice(-1) === '/') {

}
function NodeModulesPolyfillPlugin(options) {
if (options === void 0) { options = {}; }
var _a = options.namespace, namespace = _a === void 0 ? NAMESPACE : _a, _b = options.name, name = _b === void 0 ? NAME : _b;
function NodeModulesPolyfillPlugin(options = {}) {
const { namespace = NAMESPACE, name = NAME } = options;
if (namespace.endsWith('commonjs')) {
throw new Error("namespace " + namespace + " must not end with commonjs");
throw new Error(`namespace ${namespace} must not end with commonjs`);
}
// this namespace is needed to make ES modules expose their default export to require: require('assert') will give you import('assert').default
var commonjsNamespace = namespace + '-commonjs';
var polyfilledBuiltins = polyfills_1.builtinsPolyfills();
var polyfilledBuiltinsNames = __spread(polyfilledBuiltins.keys());
const commonjsNamespace = namespace + '-commonjs';
const polyfilledBuiltins = polyfills_1.builtinsPolyfills();
const polyfilledBuiltinsNames = [...polyfilledBuiltins.keys()];
return {
name: name,
setup: function setup(_a) {
var onLoad = _a.onLoad, onResolve = _a.onResolve;
name,
setup: function setup({ onLoad, onResolve }) {
// TODO these polyfill module cannot import anything, is that ok?
function loader(args) {
return __awaiter(this, void 0, void 0, function () {
var isCommonjs, resolved, contents, resolveDir, e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 3, , 4]);
isCommonjs = args.namespace.endsWith('commonjs');
resolved = polyfilledBuiltins.get(removeEndingSlash(args.path));
return [4 /*yield*/, fs_1.default.promises.readFile(resolved)];
case 1: return [4 /*yield*/, (_a.sent()).toString()];
case 2:
contents = _a.sent();
resolveDir = path_1.default.dirname(resolved);
if (isCommonjs) {
return [2 /*return*/, {
loader: 'js',
contents: commonJsTemplate({
importPath: args.path,
}),
resolveDir: resolveDir,
}];
}
return [2 /*return*/, {
loader: 'js',
contents: contents,
resolveDir: resolveDir,
}];
case 3:
e_1 = _a.sent();
console.error('node-modules-polyfill', e_1);
return [2 /*return*/, {
contents: "export {}",
loader: 'js',
}];
case 4: return [2 /*return*/];
return __awaiter(this, void 0, void 0, function* () {
try {
const isCommonjs = args.namespace.endsWith('commonjs');
const resolved = polyfilledBuiltins.get(removeEndingSlash(args.path));
const contents = yield (yield fs_1.default.promises.readFile(resolved)).toString();
let resolveDir = path_1.default.dirname(resolved);
if (isCommonjs) {
return {
loader: 'js',
contents: commonJsTemplate({
importPath: args.path,
}),
resolveDir,
};
}
});
return {
loader: 'js',
contents,
resolveDir,
};
}
catch (e) {
console.error('node-modules-polyfill', e);
return {
contents: `export {}`,
loader: 'js',
};
}
});
}
onLoad({ filter: /.*/, namespace: namespace }, loader);
onLoad({ filter: /.*/, namespace }, loader);
onLoad({ filter: /.*/, namespace: commonjsNamespace }, loader);
var filter = new RegExp(polyfilledBuiltinsNames.map(escape_string_regexp_1.default).join('|'));
const filter = new RegExp(polyfilledBuiltinsNames.map(escape_string_regexp_1.default).join('|'));
function resolver(args) {
return __awaiter(this, void 0, void 0, function () {
var ignoreRequire, isCommonjs;
return __generator(this, function (_a) {
ignoreRequire = args.namespace === commonjsNamespace;
if (!polyfilledBuiltins.has(args.path)) {
return [2 /*return*/];
}
isCommonjs = !ignoreRequire && args.kind === 'require-call';
return [2 /*return*/, {
namespace: isCommonjs ? commonjsNamespace : namespace,
path: args.path,
}];
});
return __awaiter(this, void 0, void 0, function* () {
const ignoreRequire = args.namespace === commonjsNamespace;
if (!polyfilledBuiltins.has(args.path)) {
return;
}
const isCommonjs = !ignoreRequire && args.kind === 'require-call';
return {
namespace: isCommonjs ? commonjsNamespace : namespace,
path: args.path,
};
});
}
onResolve({ filter: filter }, resolver);
onResolve({ filter }, resolver);
// onResolve({ filter: /.*/, namespace }, resolver)

@@ -159,7 +98,19 @@ },

exports.NodeModulesPolyfillPlugin = NodeModulesPolyfillPlugin;
function commonJsTemplate(_a) {
var importPath = _a.importPath;
return "\nconst polyfill = require('" + importPath + "')\n\nif (polyfill && polyfill.default) {\n module.exports = polyfill.default\n} else if (polyfill) {\n module.exports = polyfill\n}\n\nif (polyfill) {\n for (let k in polyfill) {\n module.exports[k] = polyfill[k]\n }\n}\n";
function commonJsTemplate({ importPath }) {
return `
const polyfill = require('${importPath}')
if (polyfill && polyfill.default) {
module.exports = polyfill.default
for (let k in polyfill) {
module.exports[k] = polyfill[k]
}
} else if (polyfill) {
module.exports = polyfill
}
`;
}
exports.default = NodeModulesPolyfillPlugin;
//# sourceMappingURL=index.js.map

@@ -11,45 +11,2 @@ "use strict";

};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __importDefault = (this && this.__importDefault) || function (mod) {

@@ -59,151 +16,129 @@ return (mod && mod.__esModule) ? mod : { "default": mod };

Object.defineProperty(exports, "__esModule", { value: true });
var esbuild_1 = require("esbuild");
var test_support_1 = require("test-support");
var _1 = __importDefault(require("."));
const esbuild_1 = require("esbuild");
const test_support_1 = require("test-support");
const fs_1 = __importDefault(require("fs"));
const _1 = __importDefault(require("."));
require('debug').enable(require('../package.json').name);
test('works', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, unlink, _b, ENTRY, res;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, test_support_1.writeFiles({
'entry.ts': "import {x} from './utils'; console.log(x);",
'utils.ts': "import path from 'path'; import { Buffer } from 'buffer'; export const x = path.resolve(Buffer.from('x').toString());",
})
// const outfile = randomOutputFile()
];
case 1:
_a = _c.sent(), unlink = _a.unlink, _b = __read(_a.paths, 1), ENTRY = _b[0];
return [4 /*yield*/, esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
})];
case 2:
res = _c.sent();
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
return [2 /*return*/];
}
test('works', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield test_support_1.writeFiles({
'entry.ts': `import {x} from './utils'; console.log(x);`,
'utils.ts': `import path from 'path'; import { Buffer } from 'buffer'; export const x = path.resolve(Buffer.from('x').toString());`,
});
}); });
test('events works', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, unlink, _b, ENTRY, res;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, test_support_1.writeFiles({
'entry.ts': "\n import EventEmitter from 'events';\n\n class Test extends EventEmitter {\n constructor() { };\n }\n console.log(Test)\n ",
})
// const outfile = randomOutputFile()
];
case 1:
_a = _c.sent(), unlink = _a.unlink, _b = __read(_a.paths, 1), ENTRY = _b[0];
return [4 /*yield*/, esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
})
// console.log(res.outputFiles[0].text)
];
case 2:
res = _c.sent();
// console.log(res.outputFiles[0].text)
eval(res.outputFiles[0].text);
unlink();
return [2 /*return*/];
}
// const outfile = randomOutputFile()
const res = yield esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
});
}); });
test('require can use default export', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, unlink, _b, ENTRY, res;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, test_support_1.writeFiles({
'entry.ts': "\n const assert = require('assert')\n // console.log(assert)\n assert('ok')\n ",
})
// const outfile = randomOutputFile()
];
case 1:
_a = _c.sent(), unlink = _a.unlink, _b = __read(_a.paths, 1), ENTRY = _b[0];
return [4 /*yield*/, esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
})
// console.log(res.outputFiles[0].text)
];
case 2:
res = _c.sent();
// console.log(res.outputFiles[0].text)
eval(res.outputFiles[0].text);
unlink();
return [2 /*return*/];
}
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
}));
test('works with SafeBuffer and other package consumers', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield test_support_1.writeFiles({
'entry.ts': `import {Buffer as SafeBuffer} from './safe-buffer'; console.log(SafeBuffer);`,
'safe-buffer.ts': fs_1.default
.readFileSync(require.resolve('safe-buffer'))
.toString(),
});
}); });
test.skip('crypto', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, unlink, _b, ENTRY, res;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, test_support_1.writeFiles({
'entry.ts': "import { randomBytes } from 'crypto'; console.log(randomBytes(20).toString('hex'))",
})
// const outfile = randomOutputFile()
];
case 1:
_a = _c.sent(), unlink = _a.unlink, _b = __read(_a.paths, 1), ENTRY = _b[0];
return [4 /*yield*/, esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
})];
case 2:
res = _c.sent();
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
return [2 /*return*/];
}
// const outfile = randomOutputFile()
const res = yield esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
});
}); });
test.skip('fs', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, unlink, _b, ENTRY, res;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, test_support_1.writeFiles({
'entry.ts': "import { readFile } from 'fs'; console.log(readFile(''))",
})
// const outfile = randomOutputFile()
];
case 1:
_a = _c.sent(), unlink = _a.unlink, _b = __read(_a.paths, 1), ENTRY = _b[0];
return [4 /*yield*/, esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
})];
case 2:
res = _c.sent();
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
return [2 /*return*/];
// console.log(
// res.outputFiles[0].text
// .split('\n')
// .map((x, i) => i + ' ' + x)
// .join('\n'),
// )
eval(res.outputFiles[0].text);
unlink();
}));
test('events works', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield test_support_1.writeFiles({
'entry.ts': `
import EventEmitter from 'events';
class Test extends EventEmitter {
constructor() { };
}
console.log(Test)
`,
});
}); });
// const outfile = randomOutputFile()
const res = yield esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
});
// console.log(res.outputFiles[0].text)
eval(res.outputFiles[0].text);
unlink();
}));
test('require can use default export', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield test_support_1.writeFiles({
'entry.ts': `
const assert = require('assert')
// console.log(assert)
assert('ok')
`,
});
// const outfile = randomOutputFile()
const res = yield esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
});
// console.log(res.outputFiles[0].text)
eval(res.outputFiles[0].text);
unlink();
}));
test.skip('crypto', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield test_support_1.writeFiles({
'entry.ts': `import { randomBytes } from 'crypto'; console.log(randomBytes(20).toString('hex'))`,
});
// const outfile = randomOutputFile()
const res = yield esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
});
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
}));
test.skip('fs', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield test_support_1.writeFiles({
'entry.ts': `import { readFile } from 'fs'; console.log(readFile(''))`,
});
// const outfile = randomOutputFile()
const res = yield esbuild_1.build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [_1.default()],
});
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
}));
//# sourceMappingURL=index.test.js.map

@@ -5,5 +5,5 @@ "use strict";

exports.builtinsPolyfills = void 0;
var EMPTY_PATH = require.resolve('rollup-plugin-node-polyfills/polyfills/empty.js');
const EMPTY_PATH = require.resolve('rollup-plugin-node-polyfills/polyfills/empty.js');
function builtinsPolyfills() {
var libs = new Map();
const libs = new Map();
libs.set('process', require.resolve('rollup-plugin-node-polyfills/polyfills/process-es6'));

@@ -10,0 +10,0 @@ libs.set('buffer', require.resolve('rollup-plugin-node-polyfills/polyfills/buffer-es6'));

import { Plugin } from 'esbuild';
export interface NodePolyfillsOptions {
fs?: boolean;
crypto?: boolean;
name?: string;
namespace?: string;
}

@@ -6,0 +6,0 @@ export declare function NodeModulesPolyfillPlugin(options?: NodePolyfillsOptions): Plugin;

@@ -10,50 +10,2 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
import builtins from 'builtin-modules';
import escapeStringRegexp from 'escape-string-regexp';

@@ -63,5 +15,5 @@ import fs from 'fs';

import { builtinsPolyfills } from './polyfills';
var NAME = require('../package.json').name;
var debug = require('debug')(NAME);
var NAMESPACE = NAME;
// import { NodeResolvePlugin } from '@esbuild-plugins/node-resolve'
const NAME = 'node-modules-polyfills';
const NAMESPACE = NAME;
function removeEndingSlash(importee) {

@@ -73,51 +25,85 @@ if (importee && importee.slice(-1) === '/') {

}
export function NodeModulesPolyfillPlugin(options) {
if (options === void 0) { options = {}; }
var builtinsSet = new Set(builtins);
var polyfilledBuiltins = builtinsPolyfills(options);
var polyfilledBuiltinsNames = __spread(polyfilledBuiltins.keys());
export function NodeModulesPolyfillPlugin(options = {}) {
const { namespace = NAMESPACE, name = NAME } = options;
if (namespace.endsWith('commonjs')) {
throw new Error(`namespace ${namespace} must not end with commonjs`);
}
// this namespace is needed to make ES modules expose their default export to require: require('assert') will give you import('assert').default
const commonjsNamespace = namespace + '-commonjs';
const polyfilledBuiltins = builtinsPolyfills();
const polyfilledBuiltinsNames = [...polyfilledBuiltins.keys()];
return {
name: NAME,
setup: function setup(_a) {
var _this = this;
var onLoad = _a.onLoad, onResolve = _a.onResolve;
onLoad({ filter: /.*/, namespace: NAMESPACE }, function (args) { return __awaiter(_this, void 0, void 0, function () {
var resolved, contents, resolveDir;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
resolved = polyfilledBuiltins.get(removeEndingSlash(args.path));
return [4 /*yield*/, fs.promises.readFile(resolved)];
case 1: return [4 /*yield*/, (_a.sent()).toString()];
case 2:
contents = _a.sent();
resolveDir = path.dirname(resolved);
// console.log({ resolveDir })
debug('onLoad');
return [2 /*return*/, {
loader: 'js',
contents: contents,
resolveDir: resolveDir,
}];
name,
setup: function setup({ onLoad, onResolve }) {
// TODO these polyfill module cannot import anything, is that ok?
function loader(args) {
return __awaiter(this, void 0, void 0, function* () {
try {
const isCommonjs = args.namespace.endsWith('commonjs');
const resolved = polyfilledBuiltins.get(removeEndingSlash(args.path));
const contents = yield (yield fs.promises.readFile(resolved)).toString();
let resolveDir = path.dirname(resolved);
if (isCommonjs) {
return {
loader: 'js',
contents: commonJsTemplate({
importPath: args.path,
}),
resolveDir,
};
}
return {
loader: 'js',
contents,
resolveDir,
};
}
catch (e) {
console.error('node-modules-polyfill', e);
return {
contents: `export {}`,
loader: 'js',
};
}
});
}); });
var filter = new RegExp(polyfilledBuiltinsNames.map(escapeStringRegexp).join('|'));
onResolve({ filter: filter }, function resolver(args) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
if (builtinsSet.has(args.path)) {
return [2 /*return*/, {
namespace: NAMESPACE,
path: args.path,
}];
}
return [2 /*return*/, null];
});
}
onLoad({ filter: /.*/, namespace }, loader);
onLoad({ filter: /.*/, namespace: commonjsNamespace }, loader);
const filter = new RegExp(polyfilledBuiltinsNames.map(escapeStringRegexp).join('|'));
function resolver(args) {
return __awaiter(this, void 0, void 0, function* () {
const ignoreRequire = args.namespace === commonjsNamespace;
if (!polyfilledBuiltins.has(args.path)) {
return;
}
const isCommonjs = !ignoreRequire && args.kind === 'require-call';
return {
namespace: isCommonjs ? commonjsNamespace : namespace,
path: args.path,
};
});
});
}
onResolve({ filter }, resolver);
// onResolve({ filter: /.*/, namespace }, resolver)
},
};
}
function commonJsTemplate({ importPath }) {
return `
const polyfill = require('${importPath}')
if (polyfill && polyfill.default) {
module.exports = polyfill.default
} else if (polyfill) {
module.exports = polyfill
}
if (polyfill) {
for (let k in polyfill) {
module.exports[k] = polyfill[k]
}
}
`;
}
export default NodeModulesPolyfillPlugin;
//# sourceMappingURL=index.js.map

@@ -10,45 +10,2 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
import { build } from 'esbuild';

@@ -58,32 +15,99 @@ import { writeFiles } from 'test-support';

require('debug').enable(require('../package.json').name);
test('works', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, unlink, _b, ENTRY, res;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, writeFiles({
'entry.ts': "import {x} from './utils'; console.log(x);",
'utils.ts': "import path from 'path'; export const x = path.resolve('x');",
})
// const outfile = randomOutputFile()
];
case 1:
_a = _c.sent(), unlink = _a.unlink, _b = __read(_a.paths, 1), ENTRY = _b[0];
return [4 /*yield*/, build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
})
// console.log(res.outputFiles[0].text)
];
case 2:
res = _c.sent();
// console.log(res.outputFiles[0].text)
unlink();
return [2 /*return*/];
test('works', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield writeFiles({
'entry.ts': `import {x} from './utils'; console.log(x);`,
'utils.ts': `import path from 'path'; import { Buffer } from 'buffer'; export const x = path.resolve(Buffer.from('x').toString());`,
});
// const outfile = randomOutputFile()
const res = yield build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
});
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
}));
test('events works', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield writeFiles({
'entry.ts': `
import EventEmitter from 'events';
class Test extends EventEmitter {
constructor() { };
}
console.log(Test)
`,
});
}); });
// const outfile = randomOutputFile()
const res = yield build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
});
// console.log(res.outputFiles[0].text)
eval(res.outputFiles[0].text);
unlink();
}));
test('require can use default export', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield writeFiles({
'entry.ts': `
const assert = require('assert')
// console.log(assert)
assert('ok')
`,
});
// const outfile = randomOutputFile()
const res = yield build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
});
// console.log(res.outputFiles[0].text)
eval(res.outputFiles[0].text);
unlink();
}));
test.skip('crypto', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield writeFiles({
'entry.ts': `import { randomBytes } from 'crypto'; console.log(randomBytes(20).toString('hex'))`,
});
// const outfile = randomOutputFile()
const res = yield build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
});
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
}));
test.skip('fs', () => __awaiter(void 0, void 0, void 0, function* () {
const { unlink, paths: [ENTRY], } = yield writeFiles({
'entry.ts': `import { readFile } from 'fs'; console.log(readFile(''))`,
});
// const outfile = randomOutputFile()
const res = yield build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
});
eval(res.outputFiles[0].text);
// console.log(res.outputFiles[0].text)
unlink();
}));
//# sourceMappingURL=index.test.js.map

@@ -1,3 +0,2 @@

import { NodePolyfillsOptions } from ".";
export declare function builtinsPolyfills(opts?: NodePolyfillsOptions): Map<any, any>;
export declare function builtinsPolyfills(): Map<any, any>;
//# sourceMappingURL=polyfills.d.ts.map
// Taken from https://github.com/ionic-team/rollup-plugin-node-polyfills/blob/master/src/modules.ts
var EMPTY_PATH = require.resolve('rollup-plugin-node-polyfills/polyfills/empty.js');
export function builtinsPolyfills(opts) {
if (opts === void 0) { opts = {}; }
var libs = new Map();
const EMPTY_PATH = require.resolve('rollup-plugin-node-polyfills/polyfills/empty.js');
export function builtinsPolyfills() {
const libs = new Map();
libs.set('process', require.resolve('rollup-plugin-node-polyfills/polyfills/process-es6'));

@@ -45,10 +44,15 @@ libs.set('buffer', require.resolve('rollup-plugin-node-polyfills/polyfills/buffer-es6'));

libs.set('crypto', EMPTY_PATH);
if (opts.fs) {
libs.set('fs', require.resolve('rollup-plugin-node-polyfills/polyfills/browserify-fs'));
}
if (opts.crypto) {
libs.set('crypto', require.resolve('rollup-plugin-node-polyfills/polyfills/crypto-browserify'));
}
// libs.set(
// 'fs',
// require.resolve('rollup-plugin-node-polyfills/polyfills/browserify-fs'),
// )
// TODO enable crypto and fs https://github.com/ionic-team/rollup-plugin-node-polyfills/issues/20
// libs.set(
// 'crypto',
// require.resolve(
// 'rollup-plugin-node-polyfills/polyfills/crypto-browserify',
// ),
// )
return libs;
}
//# sourceMappingURL=polyfills.js.map
{
"name": "@esbuild-plugins/node-modules-polyfill",
"version": "0.1.1",
"version": "0.1.2",
"description": "",

@@ -22,2 +22,3 @@ "main": "dist/index.js",

"devDependencies": {
"safe-buffer": "^5.2.1",
"test-support": "*"

@@ -24,0 +25,0 @@ },

import { build } from 'esbuild'
import { writeFiles } from 'test-support'
import fs from 'fs'
import NodeModulesPolyfillsPlugin from '.'

@@ -28,2 +29,32 @@

})
test('works with SafeBuffer and other package consumers', async () => {
const {
unlink,
paths: [ENTRY],
} = await writeFiles({
'entry.ts': `import {Buffer as SafeBuffer} from './safe-buffer'; console.log(SafeBuffer);`,
'safe-buffer.ts': fs
.readFileSync(require.resolve('safe-buffer'))
.toString(),
})
// const outfile = randomOutputFile()
const res = await build({
entryPoints: [ENTRY],
write: false,
format: 'esm',
target: 'es2017',
bundle: true,
plugins: [NodeModulesPolyfillsPlugin()],
})
// console.log(
// res.outputFiles[0].text
// .split('\n')
// .map((x, i) => i + ' ' + x)
// .join('\n'),
// )
eval(res.outputFiles[0].text)
unlink()
})
test('events works', async () => {

@@ -30,0 +61,0 @@ const {

@@ -108,2 +108,5 @@ import { OnResolveArgs, Plugin } from 'esbuild'

module.exports = polyfill.default
for (let k in polyfill) {
module.exports[k] = polyfill[k]
}
} else if (polyfill) {

@@ -113,7 +116,3 @@ module.exports = polyfill

if (polyfill) {
for (let k in polyfill) {
module.exports[k] = polyfill[k]
}
}
`

@@ -120,0 +119,0 @@ }

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc