Skip to content

Commit

Permalink
Add support for "browser" condition (e.g., as used by Webpack) by stu…
Browse files Browse the repository at this point in the history
…bbing-away Node imports (fixes #1441).
  • Loading branch information
DavidAnson committed Dec 12, 2024
1 parent 65eeb4c commit a009407
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 32 deletions.
26 changes: 0 additions & 26 deletions demo/webpack.config.mjs
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
// @ts-check

import { createRequire } from "node:module";
const require = createRequire(import.meta.url);
import webpack from "webpack";
import TerserPlugin from "terser-webpack-plugin";
import { __dirname, importWithTypeJson } from "../test/esm-helpers.mjs";
const libraryPackageJson = await importWithTypeJson(import.meta, "../package.json");
const nodeModulePrefixRe = /^node:/u;

// eslint-disable-next-line jsdoc/require-jsdoc
function config(options) {
Expand All @@ -19,14 +16,6 @@ function config(options) {
"markdown-it": "markdownit"
},
"mode": mode,
"module": {
"rules": [
{
"test": /\.[cm]?js$/,
"exclude": /node_modules/
}
]
},
"name": name,
"optimization": optimization,
"output": {
Expand All @@ -38,25 +27,10 @@ function config(options) {
"path": __dirname(import.meta)
},
"plugins": [
new webpack.NormalModuleReplacementPlugin(
nodeModulePrefixRe,
(resource) => {
const module = resource.request.replace(nodeModulePrefixRe, "");
resource.request = module;
}
),
new webpack.BannerPlugin({
"banner": `${name} ${version} ${homepage} @license ${license}`
})
],
"resolve": {
"fallback": {
"fs": false,
"os": false,
"path": false,
"module": require.resolve("./module-stub.cjs")
}
},
"ignoreWarnings": [
{
"message": /(asset|entrypoint) size limit/
Expand Down
8 changes: 3 additions & 5 deletions lib/markdownlint.mjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
// @ts-check

import * as nodeFs from "node:fs";
import { createRequire } from "node:module";
const dynamicRequire = createRequire(import.meta.url);
import * as os from "node:os";
import path from "node:path";
// @ts-ignore
import { fs as nodeFs, module, os, path } from "#node-imports";
const dynamicRequire = module.createRequire(import.meta.url);
import { initialize as cacheInitialize } from "./cache.mjs";
import { version } from "./constants.mjs";
import rules from "./rules.mjs";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
"use strict";

module.exports = {
// @ts-ignore
"createRequire": () => require
};
22 changes: 22 additions & 0 deletions lib/node-imports-browser.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// @ts-check

const getError = () => new Error("Node APIs are not available in browser context.");
const throwForSync = () => {
throw getError();
};

export const fs = {
"access": (path, callback) => callback(getError()),
"accessSync": throwForSync,
"readFile": (path, options, callback) => callback(getError()),
"readFileSync": throwForSync
};

export { default as module } from "./node-imports-browser-module.cjs";

export const os = {};

export const path = {
"dirname": throwForSync,
"resolve": throwForSync
};
14 changes: 14 additions & 0 deletions lib/node-imports-node.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// @ts-check

import { access, accessSync, readFile, readFileSync } from "node:fs";
export const fs = { access, accessSync, readFile, readFileSync };

import { createRequire } from "node:module";
export const module = { createRequire };

import { EOL, homedir } from "node:os";
export const os = { EOL, homedir };

// eslint-disable-next-line unicorn/import-style
import { dirname, resolve } from "node:path";
export const path = { dirname, resolve };
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@
"./style/prettier": "./style/prettier.json",
"./style/relaxed": "./style/relaxed.json"
},
"imports": {
"#node-imports": {
"browser": "./lib/node-imports-browser.mjs",
"default": "./lib/node-imports-node.mjs"
}
},
"types": "./lib/types.d.mts",
"author": "David Anson (https://dlaa.me/)",
"license": "MIT",
Expand Down

0 comments on commit a009407

Please sign in to comment.