Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion babel.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ module.exports = (api) => {
targets: {
node: "18.12.0",
},
exclude: ["transform-dynamic-import"],
},
],
],
Expand Down
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"fix:js": "npm run lint:js -- --fix",
"fix:prettier": "npm run lint:prettier -- --write",
"fix": "npm-run-all -l fix:js fix:prettier",
"test:only": "node --experimental-vm-modules node_modules/jest-cli/bin/jest.js",
"test:only": "cross-env NODE_ENV=test jest",
"test:watch": "npm run test:only -- --watch",
"test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage",
"pretest": "npm run lint",
Expand All @@ -61,7 +61,7 @@
"eslint-config-webpack": "^4.5.1",
"husky": "^9.1.3",
"jest": "^30.0.0",
"less": "^4.6.2",
"less": "^4.6.3",
"less-plugin-glob": "^3.0.0",
"lint-staged": "^15.2.7",
"memfs": "^4.9.3",
Expand Down
2 changes: 1 addition & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ async function lessLoader(source) {
let implementation;

try {
implementation = await getLessImplementation(this, options.implementation);
implementation = getLessImplementation(this, options.implementation);
} catch (error) {
callback(error);

Expand Down
7 changes: 4 additions & 3 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -223,19 +223,20 @@ function normalizeSourceMap(map) {

newMap.sourceRoot = "";

// `less` (old versions) returns POSIX paths, that's why we need to transform them back to native paths.
// `less` returns POSIX paths, that's why we need to transform them back to native paths.

newMap.sources = newMap.sources.map((source) => path.normalize(source));

return newMap;
}

async function getLessImplementation(loaderContext, implementation) {
function getLessImplementation(loaderContext, implementation) {
let resolvedImplementation = implementation;

if (!implementation || typeof implementation === "string") {
const lessImplPkg = implementation || "less";

resolvedImplementation = (await import(lessImplPkg)).default;
resolvedImplementation = require(lessImplPkg);
}

return resolvedImplementation;
Expand Down
6 changes: 3 additions & 3 deletions test/__snapshots__/sourceMap-options.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ exports[`"sourceMap" options should generate source maps when value has "false"
#it-works {
margin: 10px;
}
"
/*# sourceMappingURL=source-map.css.map */"
`;

exports[`"sourceMap" options should generate source maps when value has "false" value, but the "lessOptions.sourceMap.outputSourceFiles" is "true": errors 1`] = `[]`;
Expand All @@ -60,8 +60,8 @@ exports[`"sourceMap" options should generate source maps when value has "false"
"names": [],
"sourceRoot": "",
"sources": [
"test/fixtures/node_modules/some/module.less",
"test/fixtures/source-map.less",
"node_modules/some/module.less",
"source-map.less",
],
"sourcesContent": [
".modules-dir-some-module {
Expand Down
57 changes: 27 additions & 30 deletions test/fixtures/folder/customFileLoaderPlugin.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,36 @@
import path from "path";
import less from "less";

export default async () => {
const less = (await import("less")).default;

class Plugin extends less.FileManager {
supports(filename) {
if (filename === 'forFileLoaderPluginResolve.less') {
return true;
}

if (filename === "https://fonts.googleapis.com/css?family=Roboto:500") {
return true;
}

return false;
class Plugin extends less.FileManager {
supports(filename) {
if (filename === 'forFileLoaderPluginResolve.less') {
return true;
}

if (filename === "https://fonts.googleapis.com/css?family=Roboto:500") {
return true;
}

loadFile(filename, ...args) {
let result;

if (filename === 'forFileLoaderPluginResolve.less') {
result = path.resolve(__dirname, '../', 'file-load-replacement.less');
} else if (filename === "https://fonts.googleapis.com/css?family=Roboto:500") {
result = path.resolve(__dirname, '../', 'mock-fonts.less');
}

return super.loadFile(result, ...args);
};
return false;
}

class CustomFileLoaderPlugin {
install(less, pluginManager) {
pluginManager.addFileManager(new Plugin());
loadFile(filename, ...args) {
let result;

if (filename === 'forFileLoaderPluginResolve.less') {
result = path.resolve(__dirname, '../', 'file-load-replacement.less');
} else if (filename === "https://fonts.googleapis.com/css?family=Roboto:500") {
result = path.resolve(__dirname, '../', 'mock-fonts.less');
}

return super.loadFile(result, ...args);
};
}

class CustomFileLoaderPlugin {
install(less, pluginManager) {
pluginManager.addFileManager(new Plugin());
}
}

return CustomFileLoaderPlugin;
};
module.exports = CustomFileLoaderPlugin;
67 changes: 33 additions & 34 deletions test/helpers/getCodeFromLess.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import fs from "node:fs";
import path from "node:path";

import less from "less";

const pathMap = {
"some/css.css": path.resolve(
__dirname,
Expand Down Expand Up @@ -141,6 +143,37 @@ const pathMap = {
"3rd/b.less": path.resolve(__dirname, "..", "fixtures", "3rd", "b.less"),
};

class ResolvePlugin extends less.FileManager {
supports(filename) {
if (filename[0] === "/" || path.win32.isAbsolute(filename)) {
return true;
}

if (this.isPathAbsolute(filename)) {
return false;
}

return true;
}

supportsSync() {
return false;
}

async loadFile(filename, ...args) {
const result =
pathMap[filename] || path.resolve(__dirname, "..", "fixtures", filename);

return super.loadFile(result, ...args);
}
}

class CustomImportPlugin {
install(lessInstance, pluginManager) {
pluginManager.addFileManager(new ResolvePlugin());
}
}

async function getCodeFromLess(testId, options = {}, context = {}) {
let pathToFile;

Expand Down Expand Up @@ -186,40 +219,6 @@ async function getCodeFromLess(testId, options = {}, context = {}) {
...lessOptions,
};

const less = (await import("less")).default;

class ResolvePlugin extends less.FileManager {
supports(filename) {
if (filename[0] === "/" || path.win32.isAbsolute(filename)) {
return true;
}

if (this.isPathAbsolute(filename)) {
return false;
}

return true;
}

supportsSync() {
return false;
}

async loadFile(filename, ...args) {
const result =
pathMap[filename] ||
path.resolve(__dirname, "..", "fixtures", filename);

return super.loadFile(result, ...args);
}
}

class CustomImportPlugin {
install(lessInstance, pluginManager) {
pluginManager.addFileManager(new ResolvePlugin());
}
}

mergedOptions.plugins.unshift(new CustomImportPlugin());

return less.render(data.toString(), mergedOptions);
Expand Down
6 changes: 2 additions & 4 deletions test/implementation.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ import {

describe('"implementation" option', () => {
it("should work", async () => {
const less = (await import("less")).default;
const testId = "./basic.less";
const compiler = getCompiler(testId, {
implementation: less,
implementation: require("less"),
});
const stats = await compile(compiler);
const codeFromBundle = getCodeFromBundle(stats, compiler);
Expand All @@ -26,9 +25,8 @@ describe('"implementation" option', () => {

it("should work when implementation option is string", async () => {
const testId = "./basic.less";

const compiler = getCompiler(testId, {
implementation: "less",
implementation: require.resolve("less"),
});
const stats = await compile(compiler);
const codeFromBundle = getCodeFromBundle(stats, compiler);
Expand Down
11 changes: 3 additions & 8 deletions test/loader.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import {
validateDependencies,
} from "./helpers";

const CustomFileLoaderPlugin = require("./fixtures/folder/customFileLoaderPlugin");

const nodeModulesPath = path.resolve(__dirname, "fixtures", "node_modules");

jest.setTimeout(30000);
Expand Down Expand Up @@ -105,11 +107,6 @@ describe("loader", () => {
});

it("should work third-party plugins as fileLoader", async () => {
const getCustomFileLoaderPlugin = (
await import("./fixtures/folder/customFileLoaderPlugin")
).default.default;
const CustomFileLoaderPlugin = await getCustomFileLoaderPlugin();

const testId = "./file-load.less";
const compiler = getCompiler(testId, {
lessOptions: {
Expand Down Expand Up @@ -805,9 +802,7 @@ describe("loader", () => {
let contextInClass = false;
let contextInObject = false;

const less = (await import("less")).default;

class Plugin extends less.FileManager {
class Plugin extends require("less").FileManager {
constructor(less, pluginManager) {
super();

Expand Down
19 changes: 4 additions & 15 deletions test/sourceMap-options.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,29 +110,18 @@ describe('"sourceMap" options', () => {
const compiler = getCompiler(testId, {
sourceMap: false,
lessOptions: {
sourceMap: {
sourceMapBasepath: "",
outputSourceFiles: true,
disableSourcemapAnnotation: true,
},
sourceMap: { outputSourceFiles: true },
},
});
const stats = await compile(compiler);
const codeFromBundle = getCodeFromBundle(stats, compiler);
const codeFromLess = await getCodeFromLess(testId);
const { css, map } = codeFromBundle;

map.sourceRoot = "";
map.sources = map.sources.map((source) => {
expect(path.isAbsolute(source)).toBe(true);
expect(fs.existsSync(path.resolve(map.sourceRoot, source))).toBe(true);

return path
.relative(path.resolve(__dirname, ".."), source)
.replaceAll("\\", "/");
});
map.sources = map.sources.map((source) =>
path.normalize(source).replaceAll("\\", "/"),
);

expect(css).toBe(codeFromLess.css);
expect(css).toMatchSnapshot("css");
expect(map).toMatchSnapshot("source map");
expect(getWarnings(stats)).toMatchSnapshot("warnings");
Expand Down
2 changes: 1 addition & 1 deletion test/validate-options.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ describe("validate options", () => {
failure: ["string"],
},
implementation: {
success: ["less"],
success: [require("less"), "less"],
failure: [true, false, () => {}, []],
},
lessLogAsWarnOrErr: {
Expand Down
Loading