elcrm 1.1.9 → 1.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,12 @@ export type MinifyCssVarsOptions = {
11
11
  start?: number;
12
12
  varStart?: number;
13
13
  nameStart?: number;
14
+ /** Минифицировать `--*` (по умолчанию true) */
14
15
  vars?: boolean;
16
+ /**
17
+ * Минифицировать составные классы. По умолчанию **false** —
18
+ * иначе ломаются `className={\`foo--${x}\`}`.
19
+ */
15
20
  classes?: boolean;
16
21
  minVar?: number;
17
22
  minClass?: number;
@@ -48,6 +53,12 @@ export declare function replaceCssVarToken(
48
53
  /** Имена `--*` в CSS, без суффиксов BEM-классов. */
49
54
  export declare function collectCssVarNames(texts: string[]): string[];
50
55
 
56
+ /** Один словарь: длинные `--*` первыми, граница токена (CSS и JS). */
57
+ export declare function applyVarDictionary(
58
+ text: string,
59
+ map: Iterable<[string, string]>,
60
+ ): string;
61
+
51
62
  export declare function isVendorJsChunk(code: string): boolean;
52
63
 
53
64
  export declare function minifyCssVars(
@@ -1,6 +1,6 @@
1
1
  // src/vite/minify-css-vars.ts
2
2
  var VAR_RE = /(?<![\w-])--[a-zA-Z_][\w-]*/g;
3
- var VAR_IN_JS_RE = /var\(\s*(--[a-zA-Z_][\w-]*)|["'](--[a-zA-Z_][\w-]*)["']/g;
3
+ var VAR_IN_JS_RE = /var\(\s*(--[a-zA-Z_][\w-]*)|["'](--[a-zA-Z_][\w-]*)["']|(?<![\w-])(--[a-zA-Z_][\w-]*)\s*:/g;
4
4
  var CLASS_SEL_RE = /\.(-?[_a-zA-Z]+[_a-zA-Z0-9-]*)/g;
5
5
  var LETTERS = "abcdefghijklmnopqrstuvwxyz";
6
6
  function collect(texts, re) {
@@ -23,7 +23,7 @@ function collectJsVars(texts) {
23
23
  VAR_IN_JS_RE.lastIndex = 0;
24
24
  let m;
25
25
  while (m = VAR_IN_JS_RE.exec(text)) {
26
- const name = m[1] ?? m[2];
26
+ const name = m[1] ?? m[2] ?? m[3];
27
27
  if (name && !/^--[a-zA-Z_]{1,3}$/.test(name))
28
28
  set.add(name);
29
29
  }
@@ -111,21 +111,13 @@ function replaceCssVarToken(text, from, to) {
111
111
  function collectCssVarNames(texts) {
112
112
  return [...collect(texts, VAR_RE)].sort();
113
113
  }
114
- function replaceVarsInCss(text, map) {
114
+ function applyVarDictionary(text, map) {
115
+ const entries = [...map].sort((a, b) => b[0].length - a[0].length);
115
116
  let out = text;
116
- for (const [from, to] of map)
117
+ for (const [from, to] of entries)
117
118
  out = replaceCssVarToken(out, from, to);
118
119
  return out;
119
120
  }
120
- function replaceVarsInJs(text, map) {
121
- let out = text;
122
- for (const [from, to] of map) {
123
- const esc = escapeRe(from);
124
- out = out.replace(new RegExp(`var\\(\\s*${esc}(?=[\\s,)])`, "g"), (m) => m.replace(from, to));
125
- out = out.replace(new RegExp(`(["'])${esc}\\1`, "g"), `$1${to}$1`);
126
- }
127
- return out;
128
- }
129
121
  function isVendorJsChunk(code) {
130
122
  return /ZipFileWorker|\bJSZip\b|pako deflate|readable-stream/.test(code);
131
123
  }
@@ -171,7 +163,7 @@ function normalizeOpts(raw) {
171
163
  varStart: toIndex(o.varStart, start),
172
164
  nameStart: toIndex(o.nameStart, start),
173
165
  vars: o.vars !== false,
174
- classes: o.classes !== false,
166
+ classes: o.classes === true,
175
167
  minVar: o.minVar ?? Math.max(4, varLen + 2),
176
168
  minClass: o.minClass ?? 5,
177
169
  classPrefix: o.classPrefix ?? "x",
@@ -199,7 +191,7 @@ function minifyCssVars(options) {
199
191
  files.push({ item, fileName, raw, isCss, isJs });
200
192
  }
201
193
  const cssTexts = files.filter((f) => f.isCss).map((f) => f.raw);
202
- const jsTexts = files.filter((f) => f.isJs).map((f) => f.raw);
194
+ const jsTexts = files.filter((f) => f.isJs && !isVendorJsChunk(f.raw)).map((f) => f.raw);
203
195
  const varMap = new Map;
204
196
  if (opt.vars) {
205
197
  const names = new Set([
@@ -260,7 +252,7 @@ function minifyCssVars(options) {
260
252
  let next = file.raw;
261
253
  const skipJsVendor = file.isJs && isVendorJsChunk(next);
262
254
  if (varMap.size && !skipJsVendor) {
263
- next = file.isCss ? replaceVarsInCss(next, varEntries) : replaceVarsInJs(next, varEntries);
255
+ next = applyVarDictionary(next, varEntries);
264
256
  }
265
257
  if (classMap.size && !skipJsVendor) {
266
258
  next = replaceClasses(next, classMap, file.isCss);
@@ -296,5 +288,6 @@ export {
296
288
  isVendorJsChunk,
297
289
  encodeName,
298
290
  collectCssVarNames,
291
+ applyVarDictionary,
299
292
  allocateUnique
300
293
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elcrm",
3
- "version": "1.1.9",
3
+ "version": "1.1.11",
4
4
  "description": "CLI @elcrm/*: update --fix --test, css (prune imports), docs, cursor, migrate, audit",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -92,16 +92,17 @@ elcrm test --front|--server|--no-scripts
92
92
 
93
93
  ### Vite-плагины из пакета `elcrm`
94
94
 
95
- Нужен **elcrm ≥ 1.1.9** в `devDependencies` приложения (не только глобальный `bun i -g`). Иначе Vite: `Missing "./vite/minify-css-vars"` или BEM-классы ломаются (`--wide` в `.account--wide`).
95
+ Нужен **elcrm ≥ 1.1.11** в `devDependencies` приложения (не только глобальный `bun i -g`). Иначе Vite: `Missing "./vite/minify-css-vars"` или CSS-in-JS оставляет `--field-height:`.
96
96
 
97
97
  ```js
98
98
  import { minifyCssVars } from "elcrm/vite/minify-css-vars";
99
99
 
100
- // только command === "build"
101
- minifyCssVars({ var: 2, name: 3, classPrefix: "x" })
100
+ // только command === "build"; классы по умолчанию выключены
101
+ minifyCssVars({ var: 2 })
102
+ // classes: true — только если нет className={\`foo--${x}\`}
102
103
  ```
103
104
 
104
- `nameStart` / `varStart` — **числа** (индекс алфавита), не `"x"`. Префикс класса — `classPrefix`. В JS плагин не трогает декремент `--n` (иначе `aqt is not defined`). BEM `.account--wide` — это класс, не переменная `--wide` (иначе CSS и `className` разъедутся).
105
+ `nameStart` / `varStart` — **числа** (индекс алфавита), не `"x"`. Префикс класса — `classPrefix`. Словарь один на CSS+JS: `var(--token)`, `"--token"` и объявления `--token:` (в т.ч. CSS внутри JS от `@elcrm/form` size). Чанки JSZip не трогаем (`--n`). BEM `.account--wide` — класс, не переменная `--wide`. **`classes: true` нельзя** при динамических модификаторах (`account-passkey-status--${tone}`).
105
106
 
106
107
  Короткие имена **уникальны и подряд**: `--aa`, `--ab`, `--ac`… Занятые слоты пропускаются; `--field` не затирает `--field-border`. Чанки JSZip не минифицируются (декремент `--n`). Если слотов нет — сборка падает.
107
108