boss-css 0.0.17 → 0.0.19

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.
@@ -23,7 +23,7 @@ const plugin = {
23
23
  [require_prefer_unitless_values.default.name]: require_prefer_unitless_values.default
24
24
  }
25
25
  };
26
- const plugins = [plugin.meta.name];
26
+ const plugins = { [plugin.meta.name]: plugin };
27
27
  const globalOptions = { languageOptions: { globals: { $$: "readonly" } } };
28
28
  const createConfig = (name, getRules) => ({
29
29
  [`${name}-error`]: {
@@ -23,7 +23,7 @@ const plugin = {
23
23
  [prefer_unitless_values_default.name]: prefer_unitless_values_default
24
24
  }
25
25
  };
26
- const plugins = [plugin.meta.name];
26
+ const plugins = { [plugin.meta.name]: plugin };
27
27
  const globalOptions = { languageOptions: { globals: { $$: "readonly" } } };
28
28
  const createConfig = (name, getRules) => ({
29
29
  [`${name}-error`]: {
@@ -4,6 +4,7 @@ const require_defaults = require('../utils/defaults.cjs');
4
4
  const require_format = require('../utils/format.cjs');
5
5
  const require_boss_classes = require('../utils/boss-classes.cjs');
6
6
  const require_order = require('../utils/order.cjs');
7
+ const require_context = require('../utils/context.cjs');
7
8
  let boss_css_merge = require("boss-css/merge");
8
9
 
9
10
  //#region src/eslint-plugin/rules/format-classnames.js
@@ -30,13 +31,14 @@ const formatClassList = (merge, literal, options) => {
30
31
  return next;
31
32
  };
32
33
  const create = (context) => {
33
- const sourceCode = context.getSourceCode();
34
+ const sourceCode = require_context.getSourceCode(context);
34
35
  const options = {
35
36
  ...defaultOptions,
36
37
  ...context.options[0] || {}
37
38
  };
38
39
  const patterns = createPatterns(options);
39
40
  const merge = (0, boss_css_merge.createBossMerge)(options.merge || {});
41
+ if (!sourceCode) return {};
40
42
  const reportLiteral = (literal) => {
41
43
  if (!literal || !literal.canFix) return;
42
44
  const next = formatClassList(merge, literal, options);
@@ -3,6 +3,7 @@ import { DEFAULT_ATTRIBUTE_PATTERNS, DEFAULT_CALLEE_PATTERNS, DEFAULT_TAG_PATTER
3
3
  import { buildLiteralReplacement } from "../utils/format.mjs";
4
4
  import { splitClassList } from "../utils/boss-classes.mjs";
5
5
  import { sortTokens } from "../utils/order.mjs";
6
+ import { getSourceCode } from "../utils/context.mjs";
6
7
  import { createBossMerge } from "boss-css/merge";
7
8
 
8
9
  //#region src/eslint-plugin/rules/format-classnames.js
@@ -29,13 +30,14 @@ const formatClassList = (merge, literal, options) => {
29
30
  return next;
30
31
  };
31
32
  const create = (context) => {
32
- const sourceCode = context.getSourceCode();
33
+ const sourceCode = getSourceCode(context);
33
34
  const options = {
34
35
  ...defaultOptions,
35
36
  ...context.options[0] || {}
36
37
  };
37
38
  const patterns = createPatterns(options);
38
39
  const merge = createBossMerge(options.merge || {});
40
+ if (!sourceCode) return {};
39
41
  const reportLiteral = (literal) => {
40
42
  if (!literal || !literal.canFix) return;
41
43
  const next = formatClassList(merge, literal, options);
@@ -1,6 +1,7 @@
1
1
  const require_ast = require('../utils/ast.cjs');
2
2
  const require_defaults = require('../utils/defaults.cjs');
3
3
  const require_boss_classes = require('../utils/boss-classes.cjs');
4
+ const require_context = require('../utils/context.cjs');
4
5
 
5
6
  //#region src/eslint-plugin/rules/no-unknown-classes.js
6
7
  const RULE_NAME = "no-unknown-classes";
@@ -21,12 +22,13 @@ const createPatterns = (options) => ({
21
22
  tags: require_ast.compilePatterns(options.tags)
22
23
  });
23
24
  const create = (context) => {
24
- const sourceCode = context.getSourceCode();
25
+ const sourceCode = require_context.getSourceCode(context);
25
26
  const options = {
26
27
  ...defaultOptions,
27
28
  ...context.options[0] || {}
28
29
  };
29
30
  const patterns = createPatterns(options);
31
+ if (!sourceCode) return {};
30
32
  const reportInvalid = (literal) => {
31
33
  if (!literal || !literal.value) return;
32
34
  const invalid = require_boss_classes.findInvalidTokens(literal.value, options);
@@ -1,6 +1,7 @@
1
1
  import { collectClassLiteralsFromExpression, compilePatterns, getCalleeName, getJSXAttributeName, getLiteralInfo, matchesPattern } from "../utils/ast.mjs";
2
2
  import { DEFAULT_ATTRIBUTE_PATTERNS, DEFAULT_CALLEE_PATTERNS, DEFAULT_TAG_PATTERNS, DEFAULT_VARIABLE_PATTERNS } from "../utils/defaults.mjs";
3
3
  import { findInvalidTokens } from "../utils/boss-classes.mjs";
4
+ import { getSourceCode } from "../utils/context.mjs";
4
5
 
5
6
  //#region src/eslint-plugin/rules/no-unknown-classes.js
6
7
  const RULE_NAME = "no-unknown-classes";
@@ -21,12 +22,13 @@ const createPatterns = (options) => ({
21
22
  tags: compilePatterns(options.tags)
22
23
  });
23
24
  const create = (context) => {
24
- const sourceCode = context.getSourceCode();
25
+ const sourceCode = getSourceCode(context);
25
26
  const options = {
26
27
  ...defaultOptions,
27
28
  ...context.options[0] || {}
28
29
  };
29
30
  const patterns = createPatterns(options);
31
+ if (!sourceCode) return {};
30
32
  const reportInvalid = (literal) => {
31
33
  if (!literal || !literal.value) return;
32
34
  const invalid = findInvalidTokens(literal.value, options);
@@ -2,6 +2,7 @@ const require_ast = require('../utils/ast.cjs');
2
2
  const require_defaults = require('../utils/defaults.cjs');
3
3
  const require_api = require('../utils/api.cjs');
4
4
  const require_boss_classes = require('../utils/boss-classes.cjs');
5
+ const require_context = require('../utils/context.cjs');
5
6
 
6
7
  //#region src/eslint-plugin/rules/prefer-token-values.js
7
8
  const RULE_NAME = "prefer-token-values";
@@ -94,7 +95,7 @@ const resolveTokenValue = (groupValues, tokenPath) => {
94
95
  return current;
95
96
  };
96
97
  const create = (context) => {
97
- const sourceCode = context.getSourceCode();
98
+ const sourceCode = require_context.getSourceCode(context);
98
99
  const options = {
99
100
  ...defaultOptions,
100
101
  ...context.options[0] || {}
@@ -105,6 +106,7 @@ const create = (context) => {
105
106
  const { api } = require_api.getApi();
106
107
  const tokenGroups = api?.tokens && typeof api.tokens === "object" ? api.tokens : null;
107
108
  if (!api || !tokenGroups) return {};
109
+ if (!sourceCode) return {};
108
110
  const reportTokenUsage = (node, propName, tokenKey) => {
109
111
  context.report({
110
112
  node,
@@ -2,6 +2,7 @@ import { getJSXAttributeName, getJSXRootName, getLiteralInfo } from "../utils/as
2
2
  import { DEFAULT_COMPONENTS } from "../utils/defaults.mjs";
3
3
  import { getApi } from "../utils/api.mjs";
4
4
  import { getContextSet, isCssPropName } from "../utils/boss-classes.mjs";
5
+ import { getSourceCode } from "../utils/context.mjs";
5
6
 
6
7
  //#region src/eslint-plugin/rules/prefer-token-values.js
7
8
  const RULE_NAME = "prefer-token-values";
@@ -94,7 +95,7 @@ const resolveTokenValue = (groupValues, tokenPath) => {
94
95
  return current;
95
96
  };
96
97
  const create = (context) => {
97
- const sourceCode = context.getSourceCode();
98
+ const sourceCode = getSourceCode(context);
98
99
  const options = {
99
100
  ...defaultOptions,
100
101
  ...context.options[0] || {}
@@ -105,6 +106,7 @@ const create = (context) => {
105
106
  const { api } = getApi();
106
107
  const tokenGroups = api?.tokens && typeof api.tokens === "object" ? api.tokens : null;
107
108
  if (!api || !tokenGroups) return {};
109
+ if (!sourceCode) return {};
108
110
  const reportTokenUsage = (node, propName, tokenKey) => {
109
111
  context.report({
110
112
  node,
@@ -3,6 +3,7 @@ const require_defaults = require('../utils/defaults.cjs');
3
3
  const require_format = require('../utils/format.cjs');
4
4
  const require_api = require('../utils/api.cjs');
5
5
  const require_boss_classes = require('../utils/boss-classes.cjs');
6
+ const require_context = require('../utils/context.cjs');
6
7
 
7
8
  //#region src/eslint-plugin/rules/prefer-unitless-values.js
8
9
  const RULE_NAME = "prefer-unitless-values";
@@ -118,7 +119,7 @@ const analyzeClassList = (classList, unit, extraProps) => {
118
119
  };
119
120
  };
120
121
  const create = (context) => {
121
- const sourceCode = context.getSourceCode();
122
+ const sourceCode = require_context.getSourceCode(context);
122
123
  const options = {
123
124
  ...defaultOptions,
124
125
  ...context.options[0] || {}
@@ -128,6 +129,7 @@ const create = (context) => {
128
129
  const { api } = require_api.getApi();
129
130
  const unit = normalizeUnit(options.unit) || normalizeUnit(api?.unit) || "px";
130
131
  if (!unit) return {};
132
+ if (!sourceCode) return {};
131
133
  const reportLiteral = (literal) => {
132
134
  if (!literal || !literal.value) return;
133
135
  const { issues, nextClassList } = analyzeClassList(literal.value, unit, extraProps);
@@ -3,6 +3,7 @@ import { DEFAULT_ATTRIBUTE_PATTERNS, DEFAULT_CALLEE_PATTERNS, DEFAULT_TAG_PATTER
3
3
  import { buildLiteralReplacement } from "../utils/format.mjs";
4
4
  import { getApi } from "../utils/api.mjs";
5
5
  import { isCssPropName, parseGroupedSelector, splitClassList, splitFragments } from "../utils/boss-classes.mjs";
6
+ import { getSourceCode } from "../utils/context.mjs";
6
7
 
7
8
  //#region src/eslint-plugin/rules/prefer-unitless-values.js
8
9
  const RULE_NAME = "prefer-unitless-values";
@@ -118,7 +119,7 @@ const analyzeClassList = (classList, unit, extraProps) => {
118
119
  };
119
120
  };
120
121
  const create = (context) => {
121
- const sourceCode = context.getSourceCode();
122
+ const sourceCode = getSourceCode(context);
122
123
  const options = {
123
124
  ...defaultOptions,
124
125
  ...context.options[0] || {}
@@ -128,6 +129,7 @@ const create = (context) => {
128
129
  const { api } = getApi();
129
130
  const unit = normalizeUnit(options.unit) || normalizeUnit(api?.unit) || "px";
130
131
  if (!unit) return {};
132
+ if (!sourceCode) return {};
131
133
  const reportLiteral = (literal) => {
132
134
  if (!literal || !literal.value) return;
133
135
  const { issues, nextClassList } = analyzeClassList(literal.value, unit, extraProps);
@@ -1,6 +1,7 @@
1
1
  const require_ast = require('../utils/ast.cjs');
2
2
  const require_defaults = require('../utils/defaults.cjs');
3
3
  const require_boss_classes = require('../utils/boss-classes.cjs');
4
+ const require_context = require('../utils/context.cjs');
4
5
 
5
6
  //#region src/eslint-plugin/rules/props-only.js
6
7
  const RULE_NAME = "props-only";
@@ -21,12 +22,13 @@ const createPatterns = (options) => ({
21
22
  tags: require_ast.compilePatterns(options.tags)
22
23
  });
23
24
  const create = (context) => {
24
- const sourceCode = context.getSourceCode();
25
+ const sourceCode = require_context.getSourceCode(context);
25
26
  const options = {
26
27
  ...defaultOptions,
27
28
  ...context.options[0] || {}
28
29
  };
29
30
  const patterns = createPatterns(options);
31
+ if (!sourceCode) return {};
30
32
  const reportLiteral = (literal) => {
31
33
  if (!literal || !literal.value) return;
32
34
  if (!require_boss_classes.containsBossToken(literal.value, options)) return;
@@ -1,6 +1,7 @@
1
1
  import { collectClassLiteralsFromExpression, compilePatterns, getCalleeName, getJSXAttributeName, getLiteralInfo, matchesPattern } from "../utils/ast.mjs";
2
2
  import { DEFAULT_ATTRIBUTE_PATTERNS, DEFAULT_CALLEE_PATTERNS, DEFAULT_TAG_PATTERNS, DEFAULT_VARIABLE_PATTERNS } from "../utils/defaults.mjs";
3
3
  import { containsBossToken } from "../utils/boss-classes.mjs";
4
+ import { getSourceCode } from "../utils/context.mjs";
4
5
 
5
6
  //#region src/eslint-plugin/rules/props-only.js
6
7
  const RULE_NAME = "props-only";
@@ -21,12 +22,13 @@ const createPatterns = (options) => ({
21
22
  tags: compilePatterns(options.tags)
22
23
  });
23
24
  const create = (context) => {
24
- const sourceCode = context.getSourceCode();
25
+ const sourceCode = getSourceCode(context);
25
26
  const options = {
26
27
  ...defaultOptions,
27
28
  ...context.options[0] || {}
28
29
  };
29
30
  const patterns = createPatterns(options);
31
+ if (!sourceCode) return {};
30
32
  const reportLiteral = (literal) => {
31
33
  if (!literal || !literal.value) return;
32
34
  if (!containsBossToken(literal.value, options)) return;
@@ -0,0 +1,9 @@
1
+
2
+ //#region src/eslint-plugin/utils/context.js
3
+ const getSourceCode = (context) => {
4
+ if (typeof context?.getSourceCode === "function") return context.getSourceCode();
5
+ return context?.sourceCode ?? null;
6
+ };
7
+
8
+ //#endregion
9
+ exports.getSourceCode = getSourceCode;
@@ -0,0 +1,8 @@
1
+ //#region src/eslint-plugin/utils/context.js
2
+ const getSourceCode = (context) => {
3
+ if (typeof context?.getSourceCode === "function") return context.getSourceCode();
4
+ return context?.sourceCode ?? null;
5
+ };
6
+
7
+ //#endregion
8
+ export { getSourceCode };
@@ -141,7 +141,15 @@ type BossComponentProps<C> = C extends keyof BossIntrinsicElements
141
141
  type AsProp<C extends BossElementType> = {
142
142
  as?: C
143
143
  }
144
- type PolymorphicComponentProp<C extends BossElementType, Props = {}> = Props & BossComponentProps<C> & AsProp<C>
144
+ type BossMergedProps<Props, ComponentProps> = Omit<Props, keyof ComponentProps> &
145
+ Omit<ComponentProps, keyof Props> & {
146
+ [K in Extract<keyof ComponentProps, keyof Props>]?: ComponentProps[K] | Props[K]
147
+ }
148
+ type PolymorphicComponentProp<C extends BossElementType, Props = {}> = BossMergedProps<
149
+ Props,
150
+ BossComponentProps<C>
151
+ > &
152
+ AsProp<C>
145
153
  type PolymorphicComponentPropWithRef<C extends BossElementType, Props = {}> = PolymorphicComponentProp<C, Props> & {
146
154
  ref?: unknown
147
155
  }
@@ -140,7 +140,15 @@ type BossComponentProps<C> = C extends keyof BossIntrinsicElements
140
140
  type AsProp<C extends BossElementType> = {
141
141
  as?: C
142
142
  }
143
- type PolymorphicComponentProp<C extends BossElementType, Props = {}> = Props & BossComponentProps<C> & AsProp<C>
143
+ type BossMergedProps<Props, ComponentProps> = Omit<Props, keyof ComponentProps> &
144
+ Omit<ComponentProps, keyof Props> & {
145
+ [K in Extract<keyof ComponentProps, keyof Props>]?: ComponentProps[K] | Props[K]
146
+ }
147
+ type PolymorphicComponentProp<C extends BossElementType, Props = {}> = BossMergedProps<
148
+ Props,
149
+ BossComponentProps<C>
150
+ > &
151
+ AsProp<C>
144
152
  type PolymorphicComponentPropWithRef<C extends BossElementType, Props = {}> = PolymorphicComponentProp<C, Props> & {
145
153
  ref?: unknown
146
154
  }
@@ -64,7 +64,8 @@ const onBrowserObjectStart = (api, { input }) => {
64
64
  else mutableInput[prop] = toTokenVar(path);
65
65
  } else if (typeof prop === "string") {
66
66
  const rawValue = mutableInput[prop];
67
- if (typeof rawValue !== "string") continue;
67
+ if (typeof rawValue !== "string" && typeof rawValue !== "number") continue;
68
+ const rawTokenKey = String(rawValue);
68
69
  const dashProp = api.camelCaseToDash?.(prop) ?? prop;
69
70
  const groupCandidates = [];
70
71
  const seen = /* @__PURE__ */ new Set();
@@ -77,8 +78,8 @@ const onBrowserObjectStart = (api, { input }) => {
77
78
  for (const group of require_propMap.getTokenGroupsForProp(dashProp)) addCandidate(group);
78
79
  addCandidate(prop);
79
80
  addCandidate(dashProp);
80
- const groupName = groupCandidates.find((group) => tokenPaths.has(`${group}.${rawValue}`));
81
- if (groupName && !isClassnameFirst) mutableInput[prop] = toTokenVar(`${groupName}.${rawValue.replace("$$.token.", "")}`);
81
+ const groupName = groupCandidates.find((group) => tokenPaths.has(`${group}.${rawTokenKey}`));
82
+ if (groupName && !isClassnameFirst) mutableInput[prop] = toTokenVar(`${groupName}.${rawTokenKey.replace("$$.token.", "")}`);
82
83
  }
83
84
  }
84
85
  };
@@ -64,7 +64,8 @@ const onBrowserObjectStart = (api, { input }) => {
64
64
  else mutableInput[prop] = toTokenVar(path);
65
65
  } else if (typeof prop === "string") {
66
66
  const rawValue = mutableInput[prop];
67
- if (typeof rawValue !== "string") continue;
67
+ if (typeof rawValue !== "string" && typeof rawValue !== "number") continue;
68
+ const rawTokenKey = String(rawValue);
68
69
  const dashProp = api.camelCaseToDash?.(prop) ?? prop;
69
70
  const groupCandidates = [];
70
71
  const seen = /* @__PURE__ */ new Set();
@@ -77,8 +78,8 @@ const onBrowserObjectStart = (api, { input }) => {
77
78
  for (const group of getTokenGroupsForProp(dashProp)) addCandidate(group);
78
79
  addCandidate(prop);
79
80
  addCandidate(dashProp);
80
- const groupName = groupCandidates.find((group) => tokenPaths.has(`${group}.${rawValue}`));
81
- if (groupName && !isClassnameFirst) mutableInput[prop] = toTokenVar(`${groupName}.${rawValue.replace("$$.token.", "")}`);
81
+ const groupName = groupCandidates.find((group) => tokenPaths.has(`${group}.${rawTokenKey}`));
82
+ if (groupName && !isClassnameFirst) mutableInput[prop] = toTokenVar(`${groupName}.${rawTokenKey.replace("$$.token.", "")}`);
82
83
  }
83
84
  }
84
85
  };
@@ -98,7 +98,8 @@ const getTokenPath = (api, prop, value) => {
98
98
  path: value.replace("$$.token.", ""),
99
99
  source: "group"
100
100
  };
101
- if (typeof value !== "string") return null;
101
+ if (typeof value !== "string" && typeof value !== "number") return null;
102
+ const rawTokenKey = String(value);
102
103
  const { groups } = getTokenState(api);
103
104
  const dashProp = api?.camelCaseToDash ? api.camelCaseToDash(prop) : prop;
104
105
  const groupCandidates = [];
@@ -113,10 +114,9 @@ const getTokenPath = (api, prop, value) => {
113
114
  addCandidate(prop);
114
115
  addCandidate(dashProp);
115
116
  if (!groupCandidates.length) return null;
116
- if (typeof value !== "string") return null;
117
- const tokenAlphaCandidate = parseTokenAlphaValue(value);
117
+ const tokenAlphaCandidate = typeof value === "string" ? parseTokenAlphaValue(value) : null;
118
118
  const baseParts = tokenAlphaCandidate ? tokenAlphaCandidate.base.split(".") : [];
119
- const rawParts = value.split(".");
119
+ const rawParts = rawTokenKey.split(".");
120
120
  const colorTokens = groups?.color;
121
121
  for (const group of groupCandidates) {
122
122
  const values = groups?.[group];
@@ -133,12 +133,12 @@ const getTokenPath = (api, prop, value) => {
133
133
  };
134
134
  }
135
135
  if (resolveTokenParts(values, rawParts) !== void 0) return {
136
- path: `${group}.${value}`,
136
+ path: `${group}.${rawTokenKey}`,
137
137
  source: "prop",
138
138
  values
139
139
  };
140
- if (value in values) return {
141
- path: `${group}.${value}`,
140
+ if (rawTokenKey in values) return {
141
+ path: `${group}.${rawTokenKey}`,
142
142
  source: "prop",
143
143
  values
144
144
  };
@@ -98,7 +98,8 @@ const getTokenPath = (api, prop, value) => {
98
98
  path: value.replace("$$.token.", ""),
99
99
  source: "group"
100
100
  };
101
- if (typeof value !== "string") return null;
101
+ if (typeof value !== "string" && typeof value !== "number") return null;
102
+ const rawTokenKey = String(value);
102
103
  const { groups } = getTokenState(api);
103
104
  const dashProp = api?.camelCaseToDash ? api.camelCaseToDash(prop) : prop;
104
105
  const groupCandidates = [];
@@ -113,10 +114,9 @@ const getTokenPath = (api, prop, value) => {
113
114
  addCandidate(prop);
114
115
  addCandidate(dashProp);
115
116
  if (!groupCandidates.length) return null;
116
- if (typeof value !== "string") return null;
117
- const tokenAlphaCandidate = parseTokenAlphaValue(value);
117
+ const tokenAlphaCandidate = typeof value === "string" ? parseTokenAlphaValue(value) : null;
118
118
  const baseParts = tokenAlphaCandidate ? tokenAlphaCandidate.base.split(".") : [];
119
- const rawParts = value.split(".");
119
+ const rawParts = rawTokenKey.split(".");
120
120
  const colorTokens = groups?.color;
121
121
  for (const group of groupCandidates) {
122
122
  const values = groups?.[group];
@@ -133,12 +133,12 @@ const getTokenPath = (api, prop, value) => {
133
133
  };
134
134
  }
135
135
  if (resolveTokenParts(values, rawParts) !== void 0) return {
136
- path: `${group}.${value}`,
136
+ path: `${group}.${rawTokenKey}`,
137
137
  source: "prop",
138
138
  values
139
139
  };
140
- if (value in values) return {
141
- path: `${group}.${value}`,
140
+ if (rawTokenKey in values) return {
141
+ path: `${group}.${rawTokenKey}`,
142
142
  source: "prop",
143
143
  values
144
144
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "boss-css",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
4
4
  "description": "Polymorphic, usage-driven CSS-in-JS.",
5
5
  "bin": {
6
6
  "boss": "./dist/cli/index.cjs",
@@ -275,6 +275,7 @@
275
275
  "@types/jsdom": "^27.0.0",
276
276
  "@types/node": "^25.0.9",
277
277
  "@types/react": "^19.2.8",
278
+ "eslint": "^10.0.2",
278
279
  "postcss": "^8.5.6",
279
280
  "preact": "^10.28.2",
280
281
  "prettier": "^3.8.0",