mirror of
https://github.com/DavidAnson/markdownlint.git
synced 2025-09-21 21:30:47 +02:00
Add support for "browser" condition (e.g., as used by Webpack) by stubbing-away Node imports (fixes #1441).
This commit is contained in:
parent
65eeb4c8d9
commit
a009407088
6 changed files with 45 additions and 32 deletions
|
@ -1,12 +1,9 @@
|
||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
import { createRequire } from "node:module";
|
|
||||||
const require = createRequire(import.meta.url);
|
|
||||||
import webpack from "webpack";
|
import webpack from "webpack";
|
||||||
import TerserPlugin from "terser-webpack-plugin";
|
import TerserPlugin from "terser-webpack-plugin";
|
||||||
import { __dirname, importWithTypeJson } from "../test/esm-helpers.mjs";
|
import { __dirname, importWithTypeJson } from "../test/esm-helpers.mjs";
|
||||||
const libraryPackageJson = await importWithTypeJson(import.meta, "../package.json");
|
const libraryPackageJson = await importWithTypeJson(import.meta, "../package.json");
|
||||||
const nodeModulePrefixRe = /^node:/u;
|
|
||||||
|
|
||||||
// eslint-disable-next-line jsdoc/require-jsdoc
|
// eslint-disable-next-line jsdoc/require-jsdoc
|
||||||
function config(options) {
|
function config(options) {
|
||||||
|
@ -19,14 +16,6 @@ function config(options) {
|
||||||
"markdown-it": "markdownit"
|
"markdown-it": "markdownit"
|
||||||
},
|
},
|
||||||
"mode": mode,
|
"mode": mode,
|
||||||
"module": {
|
|
||||||
"rules": [
|
|
||||||
{
|
|
||||||
"test": /\.[cm]?js$/,
|
|
||||||
"exclude": /node_modules/
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"name": name,
|
"name": name,
|
||||||
"optimization": optimization,
|
"optimization": optimization,
|
||||||
"output": {
|
"output": {
|
||||||
|
@ -38,25 +27,10 @@ function config(options) {
|
||||||
"path": __dirname(import.meta)
|
"path": __dirname(import.meta)
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
new webpack.NormalModuleReplacementPlugin(
|
|
||||||
nodeModulePrefixRe,
|
|
||||||
(resource) => {
|
|
||||||
const module = resource.request.replace(nodeModulePrefixRe, "");
|
|
||||||
resource.request = module;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
new webpack.BannerPlugin({
|
new webpack.BannerPlugin({
|
||||||
"banner": `${name} ${version} ${homepage} @license ${license}`
|
"banner": `${name} ${version} ${homepage} @license ${license}`
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
"resolve": {
|
|
||||||
"fallback": {
|
|
||||||
"fs": false,
|
|
||||||
"os": false,
|
|
||||||
"path": false,
|
|
||||||
"module": require.resolve("./module-stub.cjs")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ignoreWarnings": [
|
"ignoreWarnings": [
|
||||||
{
|
{
|
||||||
"message": /(asset|entrypoint) size limit/
|
"message": /(asset|entrypoint) size limit/
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
import * as nodeFs from "node:fs";
|
// @ts-ignore
|
||||||
import { createRequire } from "node:module";
|
import { fs as nodeFs, module, os, path } from "#node-imports";
|
||||||
const dynamicRequire = createRequire(import.meta.url);
|
const dynamicRequire = module.createRequire(import.meta.url);
|
||||||
import * as os from "node:os";
|
|
||||||
import path from "node:path";
|
|
||||||
import { initialize as cacheInitialize } from "./cache.mjs";
|
import { initialize as cacheInitialize } from "./cache.mjs";
|
||||||
import { version } from "./constants.mjs";
|
import { version } from "./constants.mjs";
|
||||||
import rules from "./rules.mjs";
|
import rules from "./rules.mjs";
|
||||||
|
|
|
@ -3,6 +3,5 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
// @ts-ignore
|
|
||||||
"createRequire": () => require
|
"createRequire": () => require
|
||||||
};
|
};
|
22
lib/node-imports-browser.mjs
Normal file
22
lib/node-imports-browser.mjs
Normal file
|
@ -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
lib/node-imports-node.mjs
Normal file
14
lib/node-imports-node.mjs
Normal file
|
@ -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 };
|
|
@ -14,6 +14,12 @@
|
||||||
"./style/prettier": "./style/prettier.json",
|
"./style/prettier": "./style/prettier.json",
|
||||||
"./style/relaxed": "./style/relaxed.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",
|
"types": "./lib/types.d.mts",
|
||||||
"author": "David Anson (https://dlaa.me/)",
|
"author": "David Anson (https://dlaa.me/)",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue