Skip to content
Merged
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
46 changes: 38 additions & 8 deletions .github/workflows/npm-experimental.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,53 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Install dependencies and build
- name: Install dependencies
run: |
pnpm install
pnpm run build
cp ../README.md .
cp ../LICENSE .
working-directory: ./package

- name: Compute experimental version
id: version
run: |
HASH=$(git rev-parse --short HEAD)
echo "version=0.0.0-experimental-${HASH}" >> $GITHUB_OUTPUT

- name: Publish experimental package
- name: Build and publish classnames-minifier
run: |
cd packages/classnames-minifier
pnpm run build
cp ../../LICENSE .
[ ! -f README.md ] && cp ../../README.md .
npm set //registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}
npm version --no-git-tag-version ${{steps.version.outputs.version}}
npm version --no-git-tag-version ${{ steps.version.outputs.version }}
npm publish --tag experimental --access public
working-directory: ./package

- name: Wait for npm registry propagation
run: sleep 20

- name: Install latest classnames-minifier in other packages
run: |
VERSION=${{ steps.version.outputs.version }}
for package in packages/*/; do
if [ "$(basename "$package")" != "classnames-minifier" ]; then
echo "Installing classnames-minifier@$VERSION in $package"
cd "$package"
pnpm add classnames-minifier@$VERSION
cd - > /dev/null
fi
done

- name: Build and publish other packages
run: |
npm set //registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}
for package in packages/*/; do
if [ "$(basename "$package")" != "classnames-minifier" ]; then
echo "Building and publishing package: $package"
cd "$package"
pnpm run build
cp ../../LICENSE .
[ ! -f README.md ] && cp ../../README.md .
npm version --no-git-tag-version ${{ steps.version.outputs.version }}
npm publish --tag experimental --access public
cd - > /dev/null
fi
done
57 changes: 43 additions & 14 deletions .github/workflows/npm-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,54 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Install dependencies and build
- name: Install dependencies
run: |
pnpm install
pnpm run build
cp ../README.md .
cp ../LICENSE .
working-directory: ./package

- name: Publish on main
if: "!contains(github.ref_name, 'canary')"
- name: Build and publish classnames-minifier
run: |
cd packages/classnames-minifier
pnpm run build
cp ../../LICENSE .
[ ! -f README.md ] && cp ../../README.md .
npm set //registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}
npm publish --access public
working-directory: ./package
npm version --no-git-tag-version ${{github.ref_name}}
if [[ "${{github.ref_name}}" == *"canary"* ]]; then
npm publish --tag canary --access public
else
npm publish --access public
fi

- name: Wait for npm registry propagation
run: sleep 20

- name: Publish on canary
if: contains(github.ref_name, 'canary')
- name: Install latest classnames-minifier in other packages
run: |
for package in packages/*/; do
if [ "$(basename "$package")" != "classnames-minifier" ]; then
echo "Installing classnames-minifier@${{github.ref_name}} in $package"
cd "$package"
pnpm add classnames-minifier@${{github.ref_name}}
cd - > /dev/null
fi
done

- name: Build and publish other packages
run: |
npm set //registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}
npm version --no-git-tag-version ${{github.ref_name}}
npm publish --tag canary --access public
working-directory: ./package
for package in packages/*/; do
if [ "$(basename "$package")" != "classnames-minifier" ]; then
echo "Building and publishing package: $package"
cd "$package"
pnpm run build
cp ../../LICENSE .
[ ! -f README.md ] && cp ../../README.md .
npm version --no-git-tag-version ${{github.ref_name}}
if [[ "${{github.ref_name}}" == *"canary"* ]]; then
npm publish --tag canary --access public
else
npm publish --access public
fi
cd - > /dev/null
fi
done
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
pnpm run lint
npx lint-staged
9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
"description": "",
"scripts": {
"nimpl:classnames-minifier": "pnpm --filter @nimpl/classnames-minifier",
"lint": "eslint \"package/\"",
"lint": "eslint \"./\"",
"eslint": "eslint",
"prettier": "prettier",
"prepare": "husky"
},
"lint-staged": {
"*.{ts,tsx,js,jsx}": ["eslint"]
},
"repository": {
"type": "git",
"url": "git://github.com/alexdln/nimpl-classnames-minifier.git"
Expand All @@ -27,5 +29,8 @@
"typescript-eslint": "8.51.0"
},
"license": "MIT",
"resolutions": {
"@nimpl/classnames-minifier>classnames-minifier": "workspace:*"
},
"packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971"
}
83 changes: 83 additions & 0 deletions packages/classnames-minifier/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# classnames-minifier

[![npm version](https://badge.fury.io/js/classnames-minifier.svg)](https://badge.fury.io/js/classnames-minifier)

Library for configuring style _(css/scss/sass)_ modules to generate compressed classes (`.header` -> `.a`, `.nav` -> `.b`, ..., `.footer` -> `.aad`, etc.) with support for changes and rebuilding without clearing the built application.

## Reasons

_Compressing classes_ can reduce the size of the generated html and css by up to _20%_, which will have a positive effect on page rendering and metrics (primarily [FCP](https://web.dev/first-contentful-paint/))

## Installation

**Using npm:**

```bash
npm i classnames-minifier
```

**Using yarn:**

```bash
yarn add classnames-minifier
```

## Configuration

### Options

- `prefix` - custom prefix that will be added to each updated class;
- `reservedNames` - array of reserved names that should not be used by this package (must include prefix);
- `cacheDir` - directory where this library will write the cache. Passing this parameter will enable caching. Use this option only if your framework really needs it;
- `distDir` - directory where the project is being assembled. Used only when caching is enabled to synchronize caches between this library and the project;
- `disableDistDeletion` - option that allows you to disable the automatic deletion of the dist folder if necessary (_f.e. differences in package setup in cache and now or first launch_);

Configuration example:

```js
// webpack.config.js
const classnamesMinifier = new ClassnamesMinifier({
prefix: "_",
reservedNames: ["_en", "_de"],
});
// ...
loaders.push({
loader: require.resolve("css-loader"),
options: {
importLoaders: 3,
modules: {
mode: "local",
getLocalIdent: classnamesMinifier.getLocalIdent,
},
},
});
```

If the framework you are using utilizes component caching between builds, you can configure caching in classnames-minifier as well. As a result, module classes between builds will use the same compressed classes.

```js
// webpack.config.js
const classnamesMinifier = new ClassnamesMinifier({
distDir: path.join(process.cwd(), "build"),
cacheDir: path.join(process.cwd(), "build/cache"),
});
// ...
loaders.push(
classnamesMinifier.postLoader,
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 3,
modules: {
mode: "local",
getLocalIdent: classnamesMinifier.getLocalIdent,
},
},
},
classnamesMinifier.preLoader
);
```

## License

[MIT](https://github.com/alexdln/classnames-minifier/blob/main/LICENSE)
61 changes: 61 additions & 0 deletions packages/classnames-minifier/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
{
"name": "classnames-minifier",
"version": "1.0.0",
"description": "Library for configuring style modules to generate compressed classes",
"main": "dist/cjs/ClassnamesMinifier.js",
"module": "dist/esm/ClassnamesMinifier.mjs",
"types": "dist/cjs/ClassnamesMinifier.d.ts",
"files": [
"dist"
],
"scripts": {
"build": "pnpm run build:cjs && pnpm run build:esm",
"build:cjs": "tsc -p tsconfig.cjs.json",
"build:esm": "tsc -p tsconfig.esm.json",
"lint": "eslint .",
"eslint": "eslint",
"prepare": "husky"
},
"exports": {
".": {
"types": "./dist/cjs/ClassnamesMinifier.d.ts",
"import": "./dist/esm/ClassnamesMinifier.mjs",
"require": "./dist/cjs/ClassnamesMinifier.js",
"default": "./dist/esm/ClassnamesMinifier.mjs"
}
},
"keywords": [
"classname",
"class",
"minify",
"compress",
"cut",
"css",
"sass",
"scss",
"modules"
],
"repository": {
"type": "git",
"url": "git://github.com/alexdln/nimpl-classnames-minifier.git"
},
"author": {
"name": "Alex Savelyev",
"email": "dev@alexdln.com",
"url": "https://github.com/alexdln/"
},
"license": "MIT",
"devDependencies": {
"@types/node": "25.0.3",
"@types/uuid": "11.0.0",
"@types/webpack": "5.28.5",
"css-loader": "7.1.2",
"typescript": "5.9.3"
},
"peerDependencies": {
"css-loader": ">=4.0.0"
},
"dependencies": {
"uuid": "13.0.0"
}
}
Loading