@charcoal-ui/theme 5.0.0-beta.2 → 5.0.0-beta.4
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/dist/index.cjs +177 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +129 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +128 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +175 -0
- package/dist/index.js.map +1 -0
- package/dist/unstable-token-object/index.cjs +108 -0
- package/dist/unstable-token-object/index.cjs.map +1 -0
- package/dist/unstable-token-object/index.d.cts +25 -0
- package/dist/unstable-token-object/index.d.cts.map +1 -0
- package/dist/unstable-token-object/index.d.ts +24 -4
- package/dist/unstable-token-object/index.d.ts.map +1 -1
- package/dist/unstable-token-object/index.js +81 -0
- package/dist/unstable-token-object/index.js.map +1 -0
- package/package.json +16 -29
- package/src/default.test.ts +211 -0
- package/src/default.ts +167 -131
- package/src/docs/ThemeColors.tsx +2 -1
- package/src/unstable-token-object/helpers/changecase-keys.test-d.ts +2 -0
- package/src/unstable-token-object/reference-token.ts +1 -1
- package/theme.json +242 -242
- package/dist/abstract-theme.d.ts +0 -52
- package/dist/abstract-theme.d.ts.map +0 -1
- package/dist/default.d.ts +0 -4
- package/dist/default.d.ts.map +0 -1
- package/dist/index.cjs.js +0 -202
- package/dist/index.cjs.js.map +0 -1
- package/dist/index.esm.js +0 -171
- package/dist/index.esm.js.map +0 -1
- package/dist/theme.d.ts +0 -90
- package/dist/theme.d.ts.map +0 -1
- package/dist/unstable-token-object/helpers/changecase-keys.d.ts +0 -7
- package/dist/unstable-token-object/helpers/changecase-keys.d.ts.map +0 -1
- package/dist/unstable-token-object/helpers/changecase-keys.test-d.d.ts +0 -2
- package/dist/unstable-token-object/helpers/changecase-keys.test-d.d.ts.map +0 -1
- package/dist/unstable-token-object/helpers/changecase-keys.test.d.ts +0 -2
- package/dist/unstable-token-object/helpers/changecase-keys.test.d.ts.map +0 -1
- package/dist/unstable-token-object/helpers/is-empty-array.d.ts +0 -2
- package/dist/unstable-token-object/helpers/is-empty-array.d.ts.map +0 -1
- package/dist/unstable-token-object/helpers/nest-object.d.ts +0 -11
- package/dist/unstable-token-object/helpers/nest-object.d.ts.map +0 -1
- package/dist/unstable-token-object/helpers/nest-object.test.d.ts +0 -2
- package/dist/unstable-token-object/helpers/nest-object.test.d.ts.map +0 -1
- package/dist/unstable-token-object/index.cjs.js +0 -156
- package/dist/unstable-token-object/index.cjs.js.map +0 -1
- package/dist/unstable-token-object/index.esm.js +0 -117
- package/dist/unstable-token-object/index.esm.js.map +0 -1
- package/dist/unstable-token-object/reference-token.d.ts +0 -4
- package/dist/unstable-token-object/reference-token.d.ts.map +0 -1
- package/dist/unstable-token-object/reference-token.test.d.ts +0 -2
- package/dist/unstable-token-object/reference-token.test.d.ts.map +0 -1
- package/dist/unstable-token-object/to-token-object.d.ts +0 -3
- package/dist/unstable-token-object/to-token-object.d.ts.map +0 -1
- package/dist/unstable-token-object/token-object.bench.d.ts +0 -2
- package/dist/unstable-token-object/token-object.bench.d.ts.map +0 -1
- package/dist/unstable-token-object/token-object.test.d.ts +0 -2
- package/dist/unstable-token-object/token-object.test.d.ts.map +0 -1
- package/dist/unstable-token-object/types.d.ts +0 -20
- package/dist/unstable-token-object/types.d.ts.map +0 -1
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
|
|
30
|
-
// src/unstable-token-object/index.ts
|
|
31
|
-
var unstable_token_object_exports = {};
|
|
32
|
-
__export(unstable_token_object_exports, {
|
|
33
|
-
camelCaseKeys: () => camelCaseKeys,
|
|
34
|
-
createCSSTokenObject: () => createCSSTokenObject,
|
|
35
|
-
createTokenObject: () => createTokenObject
|
|
36
|
-
});
|
|
37
|
-
module.exports = __toCommonJS(unstable_token_object_exports);
|
|
38
|
-
|
|
39
|
-
// src/unstable-token-object/reference-token.ts
|
|
40
|
-
var isReferenceToken = (value) => value.startsWith("{") && value.endsWith("}");
|
|
41
|
-
var parseReferenceToken = (value) => {
|
|
42
|
-
const [category, key] = value.slice(1, -1).split(".");
|
|
43
|
-
return [category, key];
|
|
44
|
-
};
|
|
45
|
-
var createReferenceTokenResolver = (tokenDictionary, baseTokenDictionary) => {
|
|
46
|
-
const resolver = (value) => {
|
|
47
|
-
if (!isReferenceToken(value))
|
|
48
|
-
return value;
|
|
49
|
-
const [category, tokenKey] = parseReferenceToken(value);
|
|
50
|
-
const baseTokens = baseTokenDictionary[category];
|
|
51
|
-
return resolver(
|
|
52
|
-
(baseTokens?.[tokenKey] ?? tokenDictionary[category][tokenKey]).value
|
|
53
|
-
);
|
|
54
|
-
};
|
|
55
|
-
return resolver;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// src/unstable-token-object/to-token-object.ts
|
|
59
|
-
var import_deepmerge = __toESM(require("deepmerge"));
|
|
60
|
-
|
|
61
|
-
// src/unstable-token-object/helpers/is-empty-array.ts
|
|
62
|
-
var isNonEmptyArray = (arr) => arr.length > 0;
|
|
63
|
-
|
|
64
|
-
// src/unstable-token-object/helpers/nest-object.ts
|
|
65
|
-
var nestObject = (path, value) => {
|
|
66
|
-
if (!isNonEmptyArray(path))
|
|
67
|
-
throw new Error("Path must be a non-empty array");
|
|
68
|
-
const [key, ...rest] = path;
|
|
69
|
-
if (!isNonEmptyArray(rest))
|
|
70
|
-
return { [key]: value };
|
|
71
|
-
return {
|
|
72
|
-
[key]: nestObject(rest, value)
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// src/unstable-token-object/to-token-object.ts
|
|
77
|
-
var toTokenObject = (tokens) => {
|
|
78
|
-
let result = {};
|
|
79
|
-
for (const key in tokens) {
|
|
80
|
-
const { value } = tokens[key];
|
|
81
|
-
const splitted = key.split("/");
|
|
82
|
-
if (!isNonEmptyArray(splitted))
|
|
83
|
-
continue;
|
|
84
|
-
const v = nestObject(splitted, value);
|
|
85
|
-
result = (0, import_deepmerge.default)(result, v);
|
|
86
|
-
}
|
|
87
|
-
return result;
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
// src/unstable-token-object/index.ts
|
|
91
|
-
var import_change_case_all2 = require("change-case-all");
|
|
92
|
-
|
|
93
|
-
// src/unstable-token-object/helpers/changecase-keys.ts
|
|
94
|
-
var import_change_case_all = require("change-case-all");
|
|
95
|
-
var isObject = (value) => {
|
|
96
|
-
if (value instanceof RegExp)
|
|
97
|
-
return false;
|
|
98
|
-
if (value instanceof Date)
|
|
99
|
-
return false;
|
|
100
|
-
if (value instanceof Error)
|
|
101
|
-
return false;
|
|
102
|
-
return typeof value === "object" && value !== null;
|
|
103
|
-
};
|
|
104
|
-
var camelCaseKeys = (obj) => {
|
|
105
|
-
return Object.fromEntries(
|
|
106
|
-
Object.entries(obj).map(([key, value]) => [
|
|
107
|
-
(0, import_change_case_all.camelCase)(key),
|
|
108
|
-
isObject(value) ? camelCaseKeys(value) : value
|
|
109
|
-
])
|
|
110
|
-
);
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
// src/unstable-token-object/index.ts
|
|
114
|
-
var createTokenObject = (tokenDictionary, baseTokenDictionary) => {
|
|
115
|
-
const result = {};
|
|
116
|
-
const referenceTokenResolver = createReferenceTokenResolver(
|
|
117
|
-
tokenDictionary,
|
|
118
|
-
baseTokenDictionary
|
|
119
|
-
);
|
|
120
|
-
for (const category in tokenDictionary) {
|
|
121
|
-
const value = tokenDictionary[category];
|
|
122
|
-
const resolvedTokens = Object.fromEntries(
|
|
123
|
-
Object.entries(value).map(([key, value2]) => [
|
|
124
|
-
key,
|
|
125
|
-
{ value: referenceTokenResolver(value2.value) }
|
|
126
|
-
])
|
|
127
|
-
);
|
|
128
|
-
result[category] = toTokenObject(resolvedTokens);
|
|
129
|
-
}
|
|
130
|
-
return result;
|
|
131
|
-
};
|
|
132
|
-
var createCSSTokenObject = (tokenDictionary, format = (value) => value) => {
|
|
133
|
-
const result = {};
|
|
134
|
-
for (const category in tokenDictionary) {
|
|
135
|
-
const value = tokenDictionary[category];
|
|
136
|
-
const resolvedTokens = Object.fromEntries(
|
|
137
|
-
Object.entries(value).map(([key]) => [
|
|
138
|
-
key,
|
|
139
|
-
{
|
|
140
|
-
value: `var(--${format(
|
|
141
|
-
[category, ...key.split("/")].map((x) => (0, import_change_case_all2.kebabCase)(x)).join("-")
|
|
142
|
-
)})`
|
|
143
|
-
}
|
|
144
|
-
])
|
|
145
|
-
);
|
|
146
|
-
result[category] = toTokenObject(resolvedTokens);
|
|
147
|
-
}
|
|
148
|
-
return result;
|
|
149
|
-
};
|
|
150
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
151
|
-
0 && (module.exports = {
|
|
152
|
-
camelCaseKeys,
|
|
153
|
-
createCSSTokenObject,
|
|
154
|
-
createTokenObject
|
|
155
|
-
});
|
|
156
|
-
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/unstable-token-object/index.ts","../../src/unstable-token-object/reference-token.ts","../../src/unstable-token-object/to-token-object.ts","../../src/unstable-token-object/helpers/is-empty-array.ts","../../src/unstable-token-object/helpers/nest-object.ts","../../src/unstable-token-object/helpers/changecase-keys.ts"],"sourcesContent":["import { createReferenceTokenResolver } from './reference-token'\nimport { toTokenObject } from './to-token-object'\nimport type { TokenObject, TokenDictionary, TokenValue } from './types'\n\nimport { kebabCase } from 'change-case-all'\nexport { camelCaseKeys } from './helpers/changecase-keys'\n\nexport const createTokenObject = <T extends TokenDictionary>(\n tokenDictionary: T,\n baseTokenDictionary: TokenDictionary\n): { [K in keyof T]: TokenObject<T[K]> } => {\n const result = {} as { [K in keyof T]: TokenObject<T[K]> }\n const referenceTokenResolver = createReferenceTokenResolver(\n tokenDictionary,\n baseTokenDictionary\n )\n\n for (const category in tokenDictionary) {\n const value = tokenDictionary[category]\n\n // category ごとに template を展開していく\n const resolvedTokens = Object.fromEntries(\n Object.entries(value).map(([key, value]) => [\n key,\n { value: referenceTokenResolver(value.value) } satisfies TokenValue,\n ])\n ) as typeof value\n\n result[category] = toTokenObject(resolvedTokens)\n }\n\n return result\n}\n\nexport const createCSSTokenObject = <T extends TokenDictionary>(\n tokenDictionary: T,\n format: (value: string) => string = (value) => value\n): { [K in keyof T]: TokenObject<T[K]> } => {\n const result = {} as { [K in keyof T]: TokenObject<T[K]> }\n\n for (const category in tokenDictionary) {\n const value = tokenDictionary[category]\n\n // category ごとに template を展開していく\n const resolvedTokens = Object.fromEntries(\n Object.entries(value).map(([key]) => [\n key,\n {\n value: `var(--${format(\n [category, ...key.split('/')].map((x) => kebabCase(x)).join('-')\n )})`,\n } satisfies TokenValue,\n ])\n ) as typeof value\n\n result[category] = toTokenObject(resolvedTokens)\n }\n\n return result\n}\n","import { TokenDictionary, Tokens } from './types'\n\nexport type ReferenceToken = `{${string}}`\n\nconst isReferenceToken = (value: string): value is ReferenceToken =>\n value.startsWith('{') && value.endsWith('}')\n\nconst parseReferenceToken = (\n value: ReferenceToken\n): [category: string, key: string] => {\n const [category, key] = value.slice(1, -1).split('.')\n\n return [category, key]\n}\n\nexport const createReferenceTokenResolver = <T extends TokenDictionary>(\n tokenDictionary: T,\n baseTokenDictionary: TokenDictionary\n) => {\n const resolver = (value: string): string => {\n if (!isReferenceToken(value)) return value\n\n const [category, tokenKey] = parseReferenceToken(value)\n const baseTokens = baseTokenDictionary[category] as Tokens | undefined\n\n return resolver(\n (baseTokens?.[tokenKey] ?? tokenDictionary[category][tokenKey]).value\n )\n }\n\n return resolver\n}\n","import deepmerge from 'deepmerge'\nimport { isNonEmptyArray } from './helpers/is-empty-array'\nimport { nestObject } from './helpers/nest-object'\nimport { Tokens, TokenObject } from './types'\n\nexport const toTokenObject = <T extends Tokens>(tokens: T): TokenObject<T> => {\n let result = {}\n for (const key in tokens) {\n const { value } = tokens[key]\n const splitted = key.split('/')\n if (!isNonEmptyArray(splitted)) continue\n\n const v = nestObject(splitted, value)\n result = deepmerge(result, v)\n }\n\n return result as TokenObject<T>\n}\n","export const isNonEmptyArray = <T>(arr: T[]): arr is [T, ...T[]] =>\n arr.length > 0\n","import { isNonEmptyArray } from './is-empty-array'\n\ntype MakeNestObject<P extends readonly string[], T> = P extends [\n infer Head,\n ...infer Tail\n]\n ? Head extends string\n ? Tail extends string[]\n ? {\n [K in Head]: MakeNestObject<Tail, T>\n }\n : { [K in Head]: T }\n : T\n : T\n\nexport const nestObject = <P extends [string, ...string[]], T>(\n path: P,\n value: T\n): MakeNestObject<P, T> => {\n if (!isNonEmptyArray(path)) throw new Error('Path must be a non-empty array')\n\n const [key, ...rest] = path\n if (!isNonEmptyArray(rest)) return { [key]: value } as MakeNestObject<P, T>\n\n return {\n [key]: nestObject(rest, value),\n } as MakeNestObject<P, T>\n}\n","import { camelCase } from 'change-case-all'\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n if (value instanceof RegExp) return false\n if (value instanceof Date) return false\n if (value instanceof Error) return false\n\n return typeof value === 'object' && value !== null\n}\n\ntype CamelCase<\n T extends string,\n D extends string = '-'\n> = T extends `${infer A}${D}${infer B}`\n ? `${Lowercase<A>}${Capitalize<CamelCase<B, D>>}`\n : T\n\ntype CamelCaseKeys<\n T extends Record<string, unknown>,\n D extends string = '-'\n> = {\n [K in keyof T as CamelCase<K & string, D>]: T[K] extends Record<\n string,\n unknown\n >\n ? CamelCaseKeys<T[K], D>\n : T[K]\n}\n\nexport const camelCaseKeys = <\n T extends Record<string, unknown>,\n Delimiter extends string = '-'\n>(\n obj: T\n): CamelCaseKeys<T, Delimiter> => {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n camelCase(key),\n isObject(value) ? camelCaseKeys(value) : value,\n ])\n ) as CamelCaseKeys<T, Delimiter>\n}\n"],"mappings":"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","names":["deepmerge","import_change_case_all","value"]}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
// src/unstable-token-object/reference-token.ts
|
|
2
|
-
var isReferenceToken = (value) => value.startsWith("{") && value.endsWith("}");
|
|
3
|
-
var parseReferenceToken = (value) => {
|
|
4
|
-
const [category, key] = value.slice(1, -1).split(".");
|
|
5
|
-
return [category, key];
|
|
6
|
-
};
|
|
7
|
-
var createReferenceTokenResolver = (tokenDictionary, baseTokenDictionary) => {
|
|
8
|
-
const resolver = (value) => {
|
|
9
|
-
if (!isReferenceToken(value))
|
|
10
|
-
return value;
|
|
11
|
-
const [category, tokenKey] = parseReferenceToken(value);
|
|
12
|
-
const baseTokens = baseTokenDictionary[category];
|
|
13
|
-
return resolver(
|
|
14
|
-
(baseTokens?.[tokenKey] ?? tokenDictionary[category][tokenKey]).value
|
|
15
|
-
);
|
|
16
|
-
};
|
|
17
|
-
return resolver;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// src/unstable-token-object/to-token-object.ts
|
|
21
|
-
import deepmerge from "deepmerge";
|
|
22
|
-
|
|
23
|
-
// src/unstable-token-object/helpers/is-empty-array.ts
|
|
24
|
-
var isNonEmptyArray = (arr) => arr.length > 0;
|
|
25
|
-
|
|
26
|
-
// src/unstable-token-object/helpers/nest-object.ts
|
|
27
|
-
var nestObject = (path, value) => {
|
|
28
|
-
if (!isNonEmptyArray(path))
|
|
29
|
-
throw new Error("Path must be a non-empty array");
|
|
30
|
-
const [key, ...rest] = path;
|
|
31
|
-
if (!isNonEmptyArray(rest))
|
|
32
|
-
return { [key]: value };
|
|
33
|
-
return {
|
|
34
|
-
[key]: nestObject(rest, value)
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// src/unstable-token-object/to-token-object.ts
|
|
39
|
-
var toTokenObject = (tokens) => {
|
|
40
|
-
let result = {};
|
|
41
|
-
for (const key in tokens) {
|
|
42
|
-
const { value } = tokens[key];
|
|
43
|
-
const splitted = key.split("/");
|
|
44
|
-
if (!isNonEmptyArray(splitted))
|
|
45
|
-
continue;
|
|
46
|
-
const v = nestObject(splitted, value);
|
|
47
|
-
result = deepmerge(result, v);
|
|
48
|
-
}
|
|
49
|
-
return result;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
// src/unstable-token-object/index.ts
|
|
53
|
-
import { kebabCase } from "change-case-all";
|
|
54
|
-
|
|
55
|
-
// src/unstable-token-object/helpers/changecase-keys.ts
|
|
56
|
-
import { camelCase } from "change-case-all";
|
|
57
|
-
var isObject = (value) => {
|
|
58
|
-
if (value instanceof RegExp)
|
|
59
|
-
return false;
|
|
60
|
-
if (value instanceof Date)
|
|
61
|
-
return false;
|
|
62
|
-
if (value instanceof Error)
|
|
63
|
-
return false;
|
|
64
|
-
return typeof value === "object" && value !== null;
|
|
65
|
-
};
|
|
66
|
-
var camelCaseKeys = (obj) => {
|
|
67
|
-
return Object.fromEntries(
|
|
68
|
-
Object.entries(obj).map(([key, value]) => [
|
|
69
|
-
camelCase(key),
|
|
70
|
-
isObject(value) ? camelCaseKeys(value) : value
|
|
71
|
-
])
|
|
72
|
-
);
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
// src/unstable-token-object/index.ts
|
|
76
|
-
var createTokenObject = (tokenDictionary, baseTokenDictionary) => {
|
|
77
|
-
const result = {};
|
|
78
|
-
const referenceTokenResolver = createReferenceTokenResolver(
|
|
79
|
-
tokenDictionary,
|
|
80
|
-
baseTokenDictionary
|
|
81
|
-
);
|
|
82
|
-
for (const category in tokenDictionary) {
|
|
83
|
-
const value = tokenDictionary[category];
|
|
84
|
-
const resolvedTokens = Object.fromEntries(
|
|
85
|
-
Object.entries(value).map(([key, value2]) => [
|
|
86
|
-
key,
|
|
87
|
-
{ value: referenceTokenResolver(value2.value) }
|
|
88
|
-
])
|
|
89
|
-
);
|
|
90
|
-
result[category] = toTokenObject(resolvedTokens);
|
|
91
|
-
}
|
|
92
|
-
return result;
|
|
93
|
-
};
|
|
94
|
-
var createCSSTokenObject = (tokenDictionary, format = (value) => value) => {
|
|
95
|
-
const result = {};
|
|
96
|
-
for (const category in tokenDictionary) {
|
|
97
|
-
const value = tokenDictionary[category];
|
|
98
|
-
const resolvedTokens = Object.fromEntries(
|
|
99
|
-
Object.entries(value).map(([key]) => [
|
|
100
|
-
key,
|
|
101
|
-
{
|
|
102
|
-
value: `var(--${format(
|
|
103
|
-
[category, ...key.split("/")].map((x) => kebabCase(x)).join("-")
|
|
104
|
-
)})`
|
|
105
|
-
}
|
|
106
|
-
])
|
|
107
|
-
);
|
|
108
|
-
result[category] = toTokenObject(resolvedTokens);
|
|
109
|
-
}
|
|
110
|
-
return result;
|
|
111
|
-
};
|
|
112
|
-
export {
|
|
113
|
-
camelCaseKeys,
|
|
114
|
-
createCSSTokenObject,
|
|
115
|
-
createTokenObject
|
|
116
|
-
};
|
|
117
|
-
//# sourceMappingURL=index.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/unstable-token-object/reference-token.ts","../../src/unstable-token-object/to-token-object.ts","../../src/unstable-token-object/helpers/is-empty-array.ts","../../src/unstable-token-object/helpers/nest-object.ts","../../src/unstable-token-object/index.ts","../../src/unstable-token-object/helpers/changecase-keys.ts"],"sourcesContent":["import { TokenDictionary, Tokens } from './types'\n\nexport type ReferenceToken = `{${string}}`\n\nconst isReferenceToken = (value: string): value is ReferenceToken =>\n value.startsWith('{') && value.endsWith('}')\n\nconst parseReferenceToken = (\n value: ReferenceToken\n): [category: string, key: string] => {\n const [category, key] = value.slice(1, -1).split('.')\n\n return [category, key]\n}\n\nexport const createReferenceTokenResolver = <T extends TokenDictionary>(\n tokenDictionary: T,\n baseTokenDictionary: TokenDictionary\n) => {\n const resolver = (value: string): string => {\n if (!isReferenceToken(value)) return value\n\n const [category, tokenKey] = parseReferenceToken(value)\n const baseTokens = baseTokenDictionary[category] as Tokens | undefined\n\n return resolver(\n (baseTokens?.[tokenKey] ?? tokenDictionary[category][tokenKey]).value\n )\n }\n\n return resolver\n}\n","import deepmerge from 'deepmerge'\nimport { isNonEmptyArray } from './helpers/is-empty-array'\nimport { nestObject } from './helpers/nest-object'\nimport { Tokens, TokenObject } from './types'\n\nexport const toTokenObject = <T extends Tokens>(tokens: T): TokenObject<T> => {\n let result = {}\n for (const key in tokens) {\n const { value } = tokens[key]\n const splitted = key.split('/')\n if (!isNonEmptyArray(splitted)) continue\n\n const v = nestObject(splitted, value)\n result = deepmerge(result, v)\n }\n\n return result as TokenObject<T>\n}\n","export const isNonEmptyArray = <T>(arr: T[]): arr is [T, ...T[]] =>\n arr.length > 0\n","import { isNonEmptyArray } from './is-empty-array'\n\ntype MakeNestObject<P extends readonly string[], T> = P extends [\n infer Head,\n ...infer Tail\n]\n ? Head extends string\n ? Tail extends string[]\n ? {\n [K in Head]: MakeNestObject<Tail, T>\n }\n : { [K in Head]: T }\n : T\n : T\n\nexport const nestObject = <P extends [string, ...string[]], T>(\n path: P,\n value: T\n): MakeNestObject<P, T> => {\n if (!isNonEmptyArray(path)) throw new Error('Path must be a non-empty array')\n\n const [key, ...rest] = path\n if (!isNonEmptyArray(rest)) return { [key]: value } as MakeNestObject<P, T>\n\n return {\n [key]: nestObject(rest, value),\n } as MakeNestObject<P, T>\n}\n","import { createReferenceTokenResolver } from './reference-token'\nimport { toTokenObject } from './to-token-object'\nimport type { TokenObject, TokenDictionary, TokenValue } from './types'\n\nimport { kebabCase } from 'change-case-all'\nexport { camelCaseKeys } from './helpers/changecase-keys'\n\nexport const createTokenObject = <T extends TokenDictionary>(\n tokenDictionary: T,\n baseTokenDictionary: TokenDictionary\n): { [K in keyof T]: TokenObject<T[K]> } => {\n const result = {} as { [K in keyof T]: TokenObject<T[K]> }\n const referenceTokenResolver = createReferenceTokenResolver(\n tokenDictionary,\n baseTokenDictionary\n )\n\n for (const category in tokenDictionary) {\n const value = tokenDictionary[category]\n\n // category ごとに template を展開していく\n const resolvedTokens = Object.fromEntries(\n Object.entries(value).map(([key, value]) => [\n key,\n { value: referenceTokenResolver(value.value) } satisfies TokenValue,\n ])\n ) as typeof value\n\n result[category] = toTokenObject(resolvedTokens)\n }\n\n return result\n}\n\nexport const createCSSTokenObject = <T extends TokenDictionary>(\n tokenDictionary: T,\n format: (value: string) => string = (value) => value\n): { [K in keyof T]: TokenObject<T[K]> } => {\n const result = {} as { [K in keyof T]: TokenObject<T[K]> }\n\n for (const category in tokenDictionary) {\n const value = tokenDictionary[category]\n\n // category ごとに template を展開していく\n const resolvedTokens = Object.fromEntries(\n Object.entries(value).map(([key]) => [\n key,\n {\n value: `var(--${format(\n [category, ...key.split('/')].map((x) => kebabCase(x)).join('-')\n )})`,\n } satisfies TokenValue,\n ])\n ) as typeof value\n\n result[category] = toTokenObject(resolvedTokens)\n }\n\n return result\n}\n","import { camelCase } from 'change-case-all'\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n if (value instanceof RegExp) return false\n if (value instanceof Date) return false\n if (value instanceof Error) return false\n\n return typeof value === 'object' && value !== null\n}\n\ntype CamelCase<\n T extends string,\n D extends string = '-'\n> = T extends `${infer A}${D}${infer B}`\n ? `${Lowercase<A>}${Capitalize<CamelCase<B, D>>}`\n : T\n\ntype CamelCaseKeys<\n T extends Record<string, unknown>,\n D extends string = '-'\n> = {\n [K in keyof T as CamelCase<K & string, D>]: T[K] extends Record<\n string,\n unknown\n >\n ? CamelCaseKeys<T[K], D>\n : T[K]\n}\n\nexport const camelCaseKeys = <\n T extends Record<string, unknown>,\n Delimiter extends string = '-'\n>(\n obj: T\n): CamelCaseKeys<T, Delimiter> => {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n camelCase(key),\n isObject(value) ? camelCaseKeys(value) : value,\n ])\n ) as CamelCaseKeys<T, Delimiter>\n}\n"],"mappings":"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","names":["value"]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { TokenDictionary } from './types';
|
|
2
|
-
export type ReferenceToken = `{${string}}`;
|
|
3
|
-
export declare const createReferenceTokenResolver: <T extends TokenDictionary>(tokenDictionary: T, baseTokenDictionary: TokenDictionary) => (value: string) => string;
|
|
4
|
-
//# sourceMappingURL=reference-token.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reference-token.d.ts","sourceRoot":"","sources":["../../src/unstable-token-object/reference-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAU,MAAM,SAAS,CAAA;AAEjD,MAAM,MAAM,cAAc,GAAG,IAAI,MAAM,GAAG,CAAA;AAa1C,eAAO,MAAM,4BAA4B,uEAElB,eAAe,aAEX,MAAM,KAAG,MAYnC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reference-token.test.d.ts","sourceRoot":"","sources":["../../src/unstable-token-object/reference-token.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { Tokens, TokenObject } from './types';
|
|
2
|
-
export declare const toTokenObject: <T extends Tokens>(tokens: T) => ({ [K in keyof T]: K & string extends infer T_1 ? T_1 extends K & string ? T_1 extends `${infer F}/${infer R}` ? { [K_1 in F]: R extends `${infer F}/${infer R}` ? any : { [K_2 in R]: T[K]["value"]; }; } : { [K_3 in T_1]: T[K]["value"]; } : never : never; }[keyof T] extends infer T_2 ? T_2 extends { [K in keyof T]: K & string extends infer T_1 ? T_1 extends K & string ? T_1 extends `${infer F}/${infer R}` ? { [K_1 in F]: R extends `${infer F}/${infer R}` ? any : { [K_2 in R]: T[K]["value"]; }; } : { [K_3 in T_1]: T[K]["value"]; } : never : never; }[keyof T] ? T_2 extends any ? (k: T_2) => void : never : never : never) extends (k: infer I) => void ? I : never;
|
|
3
|
-
//# sourceMappingURL=to-token-object.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-token-object.d.ts","sourceRoot":"","sources":["../../src/unstable-token-object/to-token-object.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE7C,eAAO,MAAM,aAAa,4rBAYzB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token-object.bench.d.ts","sourceRoot":"","sources":["../../src/unstable-token-object/token-object.bench.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token-object.test.d.ts","sourceRoot":"","sources":["../../src/unstable-token-object/token-object.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
2
|
-
export type TokenValue = {
|
|
3
|
-
value: string;
|
|
4
|
-
};
|
|
5
|
-
export type Tokens = {
|
|
6
|
-
[key: string]: TokenValue;
|
|
7
|
-
};
|
|
8
|
-
export type TokenDictionary = {
|
|
9
|
-
[category: string]: Tokens;
|
|
10
|
-
};
|
|
11
|
-
type TokenToObject<S extends string, V> = S extends `${infer F}/${infer R}` ? {
|
|
12
|
-
[K in F]: TokenToObject<R, V>;
|
|
13
|
-
} : {
|
|
14
|
-
[K in S]: V;
|
|
15
|
-
};
|
|
16
|
-
export type TokenObject<T extends Tokens> = UnionToIntersection<{
|
|
17
|
-
[K in keyof T]: TokenToObject<K & string, T[K]['value']>;
|
|
18
|
-
}[keyof T]>;
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/unstable-token-object/types.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,CAAC,CAAC,IAExB,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GACjE,CAAC,GACD,KAAK,CAAA;AAEX,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC1C,MAAM,MAAM,MAAM,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAC1B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GACvE;KAAG,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;CAAE,GACjC;KAAG,CAAC,IAAI,CAAC,GAAG,CAAC;CAAE,CAAA;AAEnB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,mBAAmB,CAC7D;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CACtE,CAAA"}
|