Skip to content

Commit 1de4ccd

Browse files
refactor: prepare code before release (#599)
1 parent 44fb40d commit 1de4ccd

16 files changed

Lines changed: 341 additions & 113 deletions

.changeset/add-jsdoc-types.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
"less-loader": patch
2+
"less-loader": minor
33
---
44

5-
Add JSDoc type annotations to `src/index.js` and `src/utils.js` so editors and downstream consumers get IntelliSense without a TypeScript toolchain.
5+
Added types.

.changeset/track-sync-loaded-dependencies.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
"less-loader": patch
33
---
44

5-
Track files loaded synchronously by Less (e.g. `data-uri()` and custom functions installed via `@plugin`) as webpack file dependencies. Previously these reads were delegated to Less's default file manager and never registered with webpack, so persistent caching could keep a stale build when only the sync-loaded file changed. See [#492](https://github.com/webpack/less-loader/issues/492).
5+
Track files loaded synchronously by Less (e.g. `data-uri()` and custom functions installed via `@plugin`) as webpack file dependencies. See [#492](https://github.com/webpack/less-loader/issues/492).

.github/workflows/nodejs.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ jobs:
5252
- name: Security audit
5353
run: npm run security
5454

55+
- name: Build types
56+
run: npm run build:types
57+
58+
- name: Check types
59+
run: if [ -n "$(git status types --porcelain)" ]; then echo "Missing types. Update types by running 'npm run build:types'"; exit 1; else echo "All types are valid"; fi
60+
5561
test:
5662
name: Test - ${{ matrix.os }} - Node v${{ matrix.node-version }}, Webpack ${{ matrix.webpack-version }}
5763

package-lock.json

Lines changed: 18 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"type": "module",
2424
"exports": {
2525
".": {
26+
"types": "./types/index.d.ts",
2627
"import": "./dist/esm/index.js",
2728
"require": "./dist/cjs/index.js",
2829
"default": "./dist/esm/index.js"
@@ -31,20 +32,24 @@
3132
},
3233
"main": "./dist/cjs/index.js",
3334
"module": "./dist/esm/index.js",
35+
"types": "./types/index.d.ts",
3436
"files": [
35-
"dist"
37+
"dist",
38+
"types"
3639
],
3740
"scripts": {
3841
"start": "npm run build -- -w",
3942
"clean": "del-cli dist",
4043
"prebuild": "npm run clean",
4144
"build:esm": "babel src -d dist/esm --env-name esm --copy-files --no-copy-ignored && node -e \"require('fs').writeFileSync('dist/esm/package.json','{\\\"type\\\":\\\"module\\\"}\\n')\"",
4245
"build:cjs": "babel src -d dist/cjs --env-name cjs --copy-files --no-copy-ignored && node -e \"const fs=require('fs');fs.writeFileSync('dist/cjs/package.json','{\\\"type\\\":\\\"commonjs\\\"}\\n');fs.appendFileSync('dist/cjs/index.js','module.exports = exports.default;\\nmodule.exports.default = exports.default;\\n')\"",
46+
"build:types": "tsc && prettier \"types/**/*.ts\" --write",
4347
"build": "npm-run-all -p \"build:*\"",
4448
"security": "npm audit --production",
4549
"lint": "npm-run-all -l -p \"lint:**\" && npm run fmt:check",
4650
"lint:code": "eslint --cache .",
4751
"lint:spelling": "cspell --cache --no-must-find-files --quiet \"**/*.*\"",
52+
"lint:types": "tsc --pretty --noEmit",
4853
"fmt": "npm run fmt:check -- --write",
4954
"fmt:check": "prettier --list-different --cache --ignore-unknown .",
5055
"fix": "npm run fix:code && npm run fmt",
@@ -57,12 +62,16 @@
5762
"version": "changeset version",
5863
"release": "npm run build && changeset publish"
5964
},
65+
"dependencies": {
66+
"@types/less": "^3.0.8"
67+
},
6068
"devDependencies": {
6169
"@babel/cli": "^7.24.7",
6270
"@babel/core": "^7.24.7",
6371
"@babel/preset-env": "^7.29.5",
6472
"@changesets/cli": "^2.30.0",
6573
"@changesets/get-github-info": "^0.8.0",
74+
"@types/node": "^22.13.4",
6675
"cspell": "^10.0.0",
6776
"del": "^8.0.1",
6877
"del-cli": "^7.0.0",
@@ -75,6 +84,7 @@
7584
"memfs": "^4.57.2",
7685
"npm-run-all": "^4.1.5",
7786
"prettier": "^3.8.3",
87+
"typescript": "^6.0.3",
7888
"webpack": "^5.107.0"
7989
},
8090
"peerDependencies": {

src/index.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ import {
99
normalizeSourceMap,
1010
} from "./utils.js";
1111

12-
/** @typedef {import("webpack").LoaderContext<import("./utils.js").LessLoaderOptions>} LoaderContext */
13-
/** @typedef {import("./utils.js").LessLoaderOptions} LessLoaderOptions */
12+
/** @typedef {import("webpack").LoaderContext<LoaderOptions>} LoaderContext */
13+
/** @typedef {import("schema-utils/declarations/validate").Schema} Schema */
14+
/** @typedef {import("./utils.js").LoaderOptions} LoaderOptions */
1415
/** @typedef {import("./utils.js").LessError} LessError */
1516
/** @typedef {import("./utils.js").SourceMap} SourceMap */
1617

1718
/**
1819
* Webpack loader that compiles Less to CSS.
19-
*
2020
* @this {LoaderContext}
21-
* @param {string} source
22-
* @returns {Promise<void>}
21+
* @param {string} content content
22+
* @returns {Promise<void>} loader result
2323
*/
24-
async function lessLoader(source) {
25-
const options = /** @type {LessLoaderOptions} */ (this.getOptions(schema));
24+
async function lessLoader(content) {
25+
const options = this.getOptions(/** @type {Schema} */ (schema));
2626
const callback = this.async();
2727
let implementation;
2828

@@ -56,11 +56,12 @@ async function lessLoader(source) {
5656
lessOptions.sourceMap = {
5757
sourceMapBasepath: "",
5858
outputSourceFiles: true,
59+
// @ts-expect-error bad types
5960
disableSourcemapAnnotation: true,
6061
};
6162
}
6263

63-
let data = source;
64+
let data = content;
6465

6566
if (typeof options.additionalData !== "undefined") {
6667
data =
@@ -72,7 +73,7 @@ async function lessLoader(source) {
7273
const logger = this.getLogger("less-loader");
7374
const loaderContext = this;
7475
const loggerListener = {
75-
/** @param {string} message */
76+
/** @param {string} message message */
7677
error(message) {
7778
// TODO enable by default in the next major release
7879
if (options.lessLogAsWarnOrErr) {
@@ -81,7 +82,7 @@ async function lessLoader(source) {
8182
logger.error(message);
8283
}
8384
},
84-
/** @param {string} message */
85+
/** @param {string} message message */
8586
warn(message) {
8687
// TODO enable by default in the next major release
8788
if (options.lessLogAsWarnOrErr) {
@@ -90,16 +91,17 @@ async function lessLoader(source) {
9091
logger.warn(message);
9192
}
9293
},
93-
/** @param {string} message */
94+
/** @param {string} message message */
9495
info(message) {
9596
logger.log(message);
9697
},
97-
/** @param {string} message */
98+
/** @param {string} message message */
9899
debug(message) {
99100
logger.debug(message);
100101
},
101102
};
102103

104+
// @ts-expect-error bad types
103105
implementation.logger.addListener(loggerListener);
104106

105107
let result;
@@ -124,9 +126,12 @@ async function lessLoader(source) {
124126
return;
125127
} finally {
126128
// Fix memory leaks in `less`
129+
// @ts-expect-error bad types
127130
implementation.logger.removeListener(loggerListener);
128131

132+
// @ts-expect-error we need it to reset loader context
129133
delete lessOptions.pluginManager.webpackLoaderContext;
134+
// @ts-expect-error we need it to reset loader context
130135
delete lessOptions.pluginManager;
131136
}
132137

0 commit comments

Comments
 (0)