@salty-css/core 0.1.0-alpha.26 → 0.1.0-alpha.28
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.
- package/README.md +126 -0
- package/{class-name-generator-BIYysuhW.cjs → class-name-generator-DZcz_NT4.cjs} +1 -1
- package/{class-name-generator-B2LriwKm.js → class-name-generator-zQ8zLbPI.js} +1 -1
- package/compiler/resolve-import.d.ts +17 -0
- package/compiler/salty-compiler.cjs +104 -25
- package/compiler/salty-compiler.d.ts +1 -0
- package/compiler/salty-compiler.js +106 -26
- package/config/index.cjs +2 -0
- package/config/index.js +3 -1
- package/css/dynamic-styles.cjs +1 -1
- package/css/dynamic-styles.js +1 -1
- package/css/keyframes.cjs +1 -1
- package/css/keyframes.js +1 -1
- package/factories/define-import.d.ts +14 -0
- package/factories/index.cjs +16 -0
- package/factories/index.d.ts +1 -0
- package/factories/index.js +16 -0
- package/generators/index.cjs +1 -1
- package/generators/index.js +2 -2
- package/instances/classname-instance.cjs +1 -1
- package/instances/classname-instance.js +1 -1
- package/package.json +1 -1
- package/{parse-styles-jPtMfgXH.cjs → parse-styles-BFoV7HiL.cjs} +187 -6
- package/{parse-styles--vHKY6Mw.js → parse-styles-CtA-RKqt.js} +187 -6
- package/parsers/index.cjs +80 -3
- package/parsers/index.js +81 -4
- package/parsers/parse-templates.d.ts +10 -0
- package/parsers/resolve-template-variants.d.ts +21 -0
- package/runtime/index.cjs +1 -1
- package/runtime/index.js +1 -1
- package/types/config-types.d.ts +32 -1
package/parsers/index.cjs
CHANGED
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const parseStyles = require("../parse-styles-
|
|
3
|
+
const parseStyles = require("../parse-styles-BFoV7HiL.cjs");
|
|
4
4
|
const dashCase = require("../dash-case-DIwKaYgE.cjs");
|
|
5
5
|
const toHash = require("../to-hash-C05Y906F.cjs");
|
|
6
|
+
const RICH_META_KEYS = /* @__PURE__ */ new Set(["base", "variants", "defaultVariants", "compoundVariants", "anyOfVariants"]);
|
|
7
|
+
const isChildEntry = (key, value) => {
|
|
8
|
+
if (RICH_META_KEYS.has(key)) return false;
|
|
9
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
10
|
+
};
|
|
6
11
|
const parseTemplates = async (obj, path = []) => {
|
|
7
12
|
if (!obj) return "";
|
|
8
13
|
const classes = [];
|
|
14
|
+
if (parseStyles.isRichTemplateNode(obj)) {
|
|
15
|
+
const rich = obj;
|
|
16
|
+
if (rich.base) {
|
|
17
|
+
const className = path.map((p) => dashCase.dashCase(String(p))).join("-");
|
|
18
|
+
const hashClass = "t_" + toHash.toHash(className, 4);
|
|
19
|
+
const result = await parseStyles.parseAndJoinStyles(rich.base, `.${className}, .${hashClass}`);
|
|
20
|
+
classes.push(result);
|
|
21
|
+
}
|
|
22
|
+
for (const [key, value] of Object.entries(rich)) {
|
|
23
|
+
if (!isChildEntry(key, value)) continue;
|
|
24
|
+
const result = await parseTemplates(value, [...path, key.trim()]);
|
|
25
|
+
classes.push(result);
|
|
26
|
+
}
|
|
27
|
+
return classes.join("\n");
|
|
28
|
+
}
|
|
9
29
|
const levelStyles = {};
|
|
10
30
|
for (const [key, value] of Object.entries(obj)) {
|
|
11
31
|
if (typeof value === "function") ;
|
|
@@ -18,7 +38,7 @@ const parseTemplates = async (obj, path = []) => {
|
|
|
18
38
|
}
|
|
19
39
|
}
|
|
20
40
|
if (Object.keys(levelStyles).length) {
|
|
21
|
-
const className = path.map(dashCase.dashCase).join("-");
|
|
41
|
+
const className = path.map((p) => dashCase.dashCase(String(p))).join("-");
|
|
22
42
|
const hashClass = "t_" + toHash.toHash(className, 4);
|
|
23
43
|
const result = await parseStyles.parseAndJoinStyles(levelStyles, `.${className}, .${hashClass}`);
|
|
24
44
|
classes.push(result);
|
|
@@ -40,13 +60,69 @@ const getTemplateTypes = (templates) => {
|
|
|
40
60
|
};
|
|
41
61
|
const getTemplateTokens = (templates, parent = "", templateTokens = /* @__PURE__ */ new Set()) => {
|
|
42
62
|
if (!templates) return [];
|
|
63
|
+
if (parseStyles.isRichTemplateNode(templates)) {
|
|
64
|
+
if (parent) templateTokens.add(parent);
|
|
65
|
+
Object.entries(templates).forEach(([key, value]) => {
|
|
66
|
+
if (!isChildEntry(key, value)) return;
|
|
67
|
+
const keyValue = parent ? `${parent}.${key}` : key;
|
|
68
|
+
getTemplateTokens(value, keyValue, templateTokens);
|
|
69
|
+
});
|
|
70
|
+
return [...templateTokens];
|
|
71
|
+
}
|
|
43
72
|
Object.entries(templates).forEach(([key, value]) => {
|
|
44
73
|
const keyValue = parent ? `${parent}.${key}` : key;
|
|
45
|
-
if (typeof value === "object") return getTemplateTokens(value, keyValue, templateTokens);
|
|
74
|
+
if (value && typeof value === "object") return getTemplateTokens(value, keyValue, templateTokens);
|
|
46
75
|
return templateTokens.add(parent);
|
|
47
76
|
});
|
|
48
77
|
return [...templateTokens];
|
|
49
78
|
};
|
|
79
|
+
const getTemplateVariantMaps = (templates) => {
|
|
80
|
+
const result = {};
|
|
81
|
+
if (!templates) return result;
|
|
82
|
+
for (const [topKey, topNode] of Object.entries(templates)) {
|
|
83
|
+
if (!topNode || typeof topNode !== "object" || typeof topNode === "function") continue;
|
|
84
|
+
walk(topNode, [], result[topKey] || (result[topKey] = {}), {});
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
};
|
|
88
|
+
const mergeAxes = (inherited, node) => {
|
|
89
|
+
const next = {};
|
|
90
|
+
for (const [axis, vals] of Object.entries(inherited)) {
|
|
91
|
+
next[axis] = { ...vals };
|
|
92
|
+
}
|
|
93
|
+
if (parseStyles.isRichTemplateNode(node) && node.variants) {
|
|
94
|
+
for (const [axis, valueMap] of Object.entries(node.variants)) {
|
|
95
|
+
next[axis] = next[axis] || {};
|
|
96
|
+
for (const value of Object.keys(valueMap)) next[axis][value] = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return next;
|
|
100
|
+
};
|
|
101
|
+
const walk = (node, path, out, inheritedAxes) => {
|
|
102
|
+
if (!node || typeof node !== "object" || Array.isArray(node)) return;
|
|
103
|
+
const axes = mergeAxes(inheritedAxes, node);
|
|
104
|
+
const dot = path.join(".");
|
|
105
|
+
if (path.length && (parseStyles.isRichTemplateNode(node) || Object.keys(axes).length)) {
|
|
106
|
+
const axisMap = {};
|
|
107
|
+
for (const [axis, valSet] of Object.entries(axes)) {
|
|
108
|
+
const values = Object.keys(valSet);
|
|
109
|
+
const isBooleanOnly = values.length === 1 && values[0] === "true";
|
|
110
|
+
axisMap[axis] = isBooleanOnly ? "boolean" : values.map((v) => `"${v}"`).join(" | ");
|
|
111
|
+
}
|
|
112
|
+
if (Object.keys(axisMap).length) out[dot] = axisMap;
|
|
113
|
+
}
|
|
114
|
+
if (parseStyles.isRichTemplateNode(node)) {
|
|
115
|
+
for (const [key, value] of Object.entries(node)) {
|
|
116
|
+
if (!isChildEntry(key, value)) continue;
|
|
117
|
+
walk(value, [...path, key.trim()], out, axes);
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
for (const [key, value] of Object.entries(node)) {
|
|
122
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) continue;
|
|
123
|
+
walk(value, [...path, key.trim()], out, axes);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
50
126
|
exports.parseAndJoinStyles = parseStyles.parseAndJoinStyles;
|
|
51
127
|
exports.parseStyles = parseStyles.parseStyles;
|
|
52
128
|
exports.parseValueModifiers = parseStyles.parseValueModifiers;
|
|
@@ -56,4 +132,5 @@ exports.reportParserIssue = parseStyles.reportParserIssue;
|
|
|
56
132
|
exports.getTemplateKeys = getTemplateKeys;
|
|
57
133
|
exports.getTemplateTokens = getTemplateTokens;
|
|
58
134
|
exports.getTemplateTypes = getTemplateTypes;
|
|
135
|
+
exports.getTemplateVariantMaps = getTemplateVariantMaps;
|
|
59
136
|
exports.parseTemplates = parseTemplates;
|
package/parsers/index.js
CHANGED
|
@@ -1,10 +1,30 @@
|
|
|
1
|
-
import { p as parseAndJoinStyles } from "../parse-styles
|
|
2
|
-
import { a, c, d, b, r } from "../parse-styles
|
|
1
|
+
import { i as isRichTemplateNode, p as parseAndJoinStyles } from "../parse-styles-CtA-RKqt.js";
|
|
2
|
+
import { a, c, d, b, r } from "../parse-styles-CtA-RKqt.js";
|
|
3
3
|
import { d as dashCase } from "../dash-case-DblXvymC.js";
|
|
4
4
|
import { t as toHash } from "../to-hash-DAN2LcHK.js";
|
|
5
|
+
const RICH_META_KEYS = /* @__PURE__ */ new Set(["base", "variants", "defaultVariants", "compoundVariants", "anyOfVariants"]);
|
|
6
|
+
const isChildEntry = (key, value) => {
|
|
7
|
+
if (RICH_META_KEYS.has(key)) return false;
|
|
8
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
9
|
+
};
|
|
5
10
|
const parseTemplates = async (obj, path = []) => {
|
|
6
11
|
if (!obj) return "";
|
|
7
12
|
const classes = [];
|
|
13
|
+
if (isRichTemplateNode(obj)) {
|
|
14
|
+
const rich = obj;
|
|
15
|
+
if (rich.base) {
|
|
16
|
+
const className = path.map((p) => dashCase(String(p))).join("-");
|
|
17
|
+
const hashClass = "t_" + toHash(className, 4);
|
|
18
|
+
const result = await parseAndJoinStyles(rich.base, `.${className}, .${hashClass}`);
|
|
19
|
+
classes.push(result);
|
|
20
|
+
}
|
|
21
|
+
for (const [key, value] of Object.entries(rich)) {
|
|
22
|
+
if (!isChildEntry(key, value)) continue;
|
|
23
|
+
const result = await parseTemplates(value, [...path, key.trim()]);
|
|
24
|
+
classes.push(result);
|
|
25
|
+
}
|
|
26
|
+
return classes.join("\n");
|
|
27
|
+
}
|
|
8
28
|
const levelStyles = {};
|
|
9
29
|
for (const [key, value] of Object.entries(obj)) {
|
|
10
30
|
if (typeof value === "function") ;
|
|
@@ -17,7 +37,7 @@ const parseTemplates = async (obj, path = []) => {
|
|
|
17
37
|
}
|
|
18
38
|
}
|
|
19
39
|
if (Object.keys(levelStyles).length) {
|
|
20
|
-
const className = path.map(dashCase).join("-");
|
|
40
|
+
const className = path.map((p) => dashCase(String(p))).join("-");
|
|
21
41
|
const hashClass = "t_" + toHash(className, 4);
|
|
22
42
|
const result = await parseAndJoinStyles(levelStyles, `.${className}, .${hashClass}`);
|
|
23
43
|
classes.push(result);
|
|
@@ -39,17 +59,74 @@ const getTemplateTypes = (templates) => {
|
|
|
39
59
|
};
|
|
40
60
|
const getTemplateTokens = (templates, parent = "", templateTokens = /* @__PURE__ */ new Set()) => {
|
|
41
61
|
if (!templates) return [];
|
|
62
|
+
if (isRichTemplateNode(templates)) {
|
|
63
|
+
if (parent) templateTokens.add(parent);
|
|
64
|
+
Object.entries(templates).forEach(([key, value]) => {
|
|
65
|
+
if (!isChildEntry(key, value)) return;
|
|
66
|
+
const keyValue = parent ? `${parent}.${key}` : key;
|
|
67
|
+
getTemplateTokens(value, keyValue, templateTokens);
|
|
68
|
+
});
|
|
69
|
+
return [...templateTokens];
|
|
70
|
+
}
|
|
42
71
|
Object.entries(templates).forEach(([key, value]) => {
|
|
43
72
|
const keyValue = parent ? `${parent}.${key}` : key;
|
|
44
|
-
if (typeof value === "object") return getTemplateTokens(value, keyValue, templateTokens);
|
|
73
|
+
if (value && typeof value === "object") return getTemplateTokens(value, keyValue, templateTokens);
|
|
45
74
|
return templateTokens.add(parent);
|
|
46
75
|
});
|
|
47
76
|
return [...templateTokens];
|
|
48
77
|
};
|
|
78
|
+
const getTemplateVariantMaps = (templates) => {
|
|
79
|
+
const result = {};
|
|
80
|
+
if (!templates) return result;
|
|
81
|
+
for (const [topKey, topNode] of Object.entries(templates)) {
|
|
82
|
+
if (!topNode || typeof topNode !== "object" || typeof topNode === "function") continue;
|
|
83
|
+
walk(topNode, [], result[topKey] || (result[topKey] = {}), {});
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
};
|
|
87
|
+
const mergeAxes = (inherited, node) => {
|
|
88
|
+
const next = {};
|
|
89
|
+
for (const [axis, vals] of Object.entries(inherited)) {
|
|
90
|
+
next[axis] = { ...vals };
|
|
91
|
+
}
|
|
92
|
+
if (isRichTemplateNode(node) && node.variants) {
|
|
93
|
+
for (const [axis, valueMap] of Object.entries(node.variants)) {
|
|
94
|
+
next[axis] = next[axis] || {};
|
|
95
|
+
for (const value of Object.keys(valueMap)) next[axis][value] = true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return next;
|
|
99
|
+
};
|
|
100
|
+
const walk = (node, path, out, inheritedAxes) => {
|
|
101
|
+
if (!node || typeof node !== "object" || Array.isArray(node)) return;
|
|
102
|
+
const axes = mergeAxes(inheritedAxes, node);
|
|
103
|
+
const dot = path.join(".");
|
|
104
|
+
if (path.length && (isRichTemplateNode(node) || Object.keys(axes).length)) {
|
|
105
|
+
const axisMap = {};
|
|
106
|
+
for (const [axis, valSet] of Object.entries(axes)) {
|
|
107
|
+
const values = Object.keys(valSet);
|
|
108
|
+
const isBooleanOnly = values.length === 1 && values[0] === "true";
|
|
109
|
+
axisMap[axis] = isBooleanOnly ? "boolean" : values.map((v) => `"${v}"`).join(" | ");
|
|
110
|
+
}
|
|
111
|
+
if (Object.keys(axisMap).length) out[dot] = axisMap;
|
|
112
|
+
}
|
|
113
|
+
if (isRichTemplateNode(node)) {
|
|
114
|
+
for (const [key, value] of Object.entries(node)) {
|
|
115
|
+
if (!isChildEntry(key, value)) continue;
|
|
116
|
+
walk(value, [...path, key.trim()], out, axes);
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const [key, value] of Object.entries(node)) {
|
|
121
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) continue;
|
|
122
|
+
walk(value, [...path, key.trim()], out, axes);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
49
125
|
export {
|
|
50
126
|
getTemplateKeys,
|
|
51
127
|
getTemplateTokens,
|
|
52
128
|
getTemplateTypes,
|
|
129
|
+
getTemplateVariantMaps,
|
|
53
130
|
parseAndJoinStyles,
|
|
54
131
|
a as parseStyles,
|
|
55
132
|
parseTemplates,
|
|
@@ -2,3 +2,13 @@ export declare const parseTemplates: <T extends object>(obj: T, path?: PropertyK
|
|
|
2
2
|
export declare const getTemplateKeys: <T extends object>(templates: T) => string[];
|
|
3
3
|
export declare const getTemplateTypes: <T extends object>(templates: T) => Record<string, string>;
|
|
4
4
|
export declare const getTemplateTokens: <T extends object>(templates: T, parent?: string, templateTokens?: Set<string>) => string[];
|
|
5
|
+
/**
|
|
6
|
+
* Walk every rich-template path in a templates root and emit, for each reachable dot-path, the set of
|
|
7
|
+
* variant axes valid at that path (axis name → union of value names, with `boolean` for axes whose only
|
|
8
|
+
* declared value is `true`).
|
|
9
|
+
*
|
|
10
|
+
* Inheritance: a leaf's axis enum is the union of its own values and every ancestor's values for the
|
|
11
|
+
* same axis. Matches the resolver's bottom-up lookup semantics — anything reachable via fallback is a
|
|
12
|
+
* valid call-site value.
|
|
13
|
+
*/
|
|
14
|
+
export declare const getTemplateVariantMaps: (templates: Record<string, any>) => Record<string, Record<string, Record<string, string>>>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RichTemplateNode } from '../types/config-types';
|
|
2
|
+
export type TemplateCallSite = {
|
|
3
|
+
path: string[];
|
|
4
|
+
variants: Record<string, string | boolean>;
|
|
5
|
+
};
|
|
6
|
+
export declare const isRichTemplateNode: (node: unknown) => node is RichTemplateNode;
|
|
7
|
+
/**
|
|
8
|
+
* Parse a template call-site value into its dot-path and the axis values requested at the call site.
|
|
9
|
+
*
|
|
10
|
+
* String form: `'heading.large@weight=heavy&emphasis=loud&italic'`
|
|
11
|
+
* Object form: `{ name: 'heading.large', weight: 'heavy', emphasis: 'loud', italic: true }`
|
|
12
|
+
*/
|
|
13
|
+
export declare const parseTemplateCallSite: (value: unknown) => TemplateCallSite | undefined;
|
|
14
|
+
export declare const pathHasRichNode: (root: any, path: string[]) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a rich-template invocation into a flat CSS-in-JS object.
|
|
17
|
+
* Implements docs/template-variants-spec.md §5 (parent-to-leaf inheritance, replace semantics).
|
|
18
|
+
*
|
|
19
|
+
* Returns `undefined` if the path doesn't resolve. Emits console.warn for unknown axes / values.
|
|
20
|
+
*/
|
|
21
|
+
export declare const resolveRichTemplate: (root: any, path: string[], callSiteVariants: Record<string, string | boolean>, templateName: string) => Record<string, any> | undefined;
|
package/runtime/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const parseStyles = require("../parse-styles-
|
|
3
|
+
const parseStyles = require("../parse-styles-BFoV7HiL.cjs");
|
|
4
4
|
const defineRuntime = (config) => {
|
|
5
5
|
const getDynamicStylesCss = async (styles, scope) => {
|
|
6
6
|
const parsed = await parseStyles.parseStyles(styles, scope, config);
|
package/runtime/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as parseStyles } from "../parse-styles
|
|
1
|
+
import { a as parseStyles } from "../parse-styles-CtA-RKqt.js";
|
|
2
2
|
const defineRuntime = (config) => {
|
|
3
3
|
const getDynamicStylesCss = async (styles, scope) => {
|
|
4
4
|
const parsed = await parseStyles(styles, scope, config);
|
package/types/config-types.d.ts
CHANGED
|
@@ -16,7 +16,38 @@ export interface SaltyVariables {
|
|
|
16
16
|
conditional?: CssConditionalVariables;
|
|
17
17
|
[key: string]: undefined | string | number | CssVariableTokensObject;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* A variant axis value bundle: a map from axis name to a map from value name (string keys or `'true'`)
|
|
21
|
+
* to a CSS-in-JS block. `name` is reserved as the call-site object form's path key and cannot be used
|
|
22
|
+
* as an axis name (build-time error).
|
|
23
|
+
*/
|
|
24
|
+
export type CssVariantAxes = {
|
|
25
|
+
[axis: string]: {
|
|
26
|
+
[value: string]: CssStyles;
|
|
27
|
+
};
|
|
28
|
+
} & {
|
|
29
|
+
name?: never;
|
|
30
|
+
};
|
|
31
|
+
export interface CssCompoundVariant {
|
|
32
|
+
css: CssStyles;
|
|
33
|
+
[axis: string]: any;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A "rich" template node: declares its own base styles, named variant bundles, defaults, and compound rules.
|
|
37
|
+
* May coexist with child template nodes (descendants) as additional sibling keys.
|
|
38
|
+
*/
|
|
39
|
+
export type RichTemplateNode = {
|
|
40
|
+
base?: CssStyles;
|
|
41
|
+
variants?: CssVariantAxes;
|
|
42
|
+
defaultVariants?: {
|
|
43
|
+
[axis: string]: string | boolean;
|
|
44
|
+
};
|
|
45
|
+
compoundVariants?: CssCompoundVariant[];
|
|
46
|
+
anyOfVariants?: CssCompoundVariant[];
|
|
47
|
+
} & {
|
|
48
|
+
[key: PropertyKey]: any;
|
|
49
|
+
};
|
|
50
|
+
type CssTemplate = MediaQueryStyles | CssStyles | RichTemplateNode | {
|
|
20
51
|
[key: PropertyKey]: CssTemplate;
|
|
21
52
|
};
|
|
22
53
|
export interface CssTemplateObject {
|