@terrazzo/plugin-js 2.1.0 → 2.3.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @terrazzo/plugin-js
2
2
 
3
+ ## 2.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#769](https://github.com/terrazzoapp/terrazzo/pull/769) [`96972d4`](https://github.com/terrazzoapp/terrazzo/commit/96972d4d4aee14a7ca290864c275a48e8f9139ba) Thanks [@drwpow](https://github.com/drwpow)! - [plugin-css]: Minor breaking change: inherit `alphabetize` from options
8
+
9
+ - [#763](https://github.com/terrazzoapp/terrazzo/pull/763) [`1d353be`](https://github.com/terrazzoapp/terrazzo/commit/1d353be6bc126c7cfb73a8ecc78680fbd42ca2f3) Thanks [@unpunnyfuns](https://github.com/unpunnyfuns)! - Register a `transform` hook on plugin-js so each token gets a transform entry under `format: "js"`. The transform's `localID` matches the token id; the `value` and `meta['token-listing'].name` carry a JS access expression like `tokens["color.brand.500"]`. This aligns plugin-js with the other format plugins (css/sass/swift/tailwind/vanilla-extract/css-in-js) which all register transforms, and lets plugin-token-listing populate the `js` row of its per-platform `names` map by name lookup the same way it does for the other plugins.
10
+
11
+ No build-output change; the existing `build` hook is unchanged. Consumers not using token-listing see no functional difference.
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [[`96972d4`](https://github.com/terrazzoapp/terrazzo/commit/96972d4d4aee14a7ca290864c275a48e8f9139ba)]:
16
+ - @terrazzo/cli@2.3.0
17
+ - @terrazzo/parser@2.3.0
18
+
19
+ ## 2.2.0
20
+
21
+ ### Patch Changes
22
+
23
+ - [#705](https://github.com/terrazzoapp/terrazzo/pull/705) [`8979deb`](https://github.com/terrazzoapp/terrazzo/commit/8979deb7eba13db9999a9d30fa04fc55f3c12fe1) Thanks [@suikkee](https://github.com/suikkee)! - Fixed an issue where TokenNormalizedSet was missing from the generated type imports.
24
+
25
+ Previously, the build logic only included individual token types in the .d.ts imports. This change ensures that TokenNormalizedSet, a structural type required for permutations, is always included in the generated imports.
26
+
3
27
  ## 2.1.0
4
28
 
5
29
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Logger, Plugin, Resolver as Resolver$1, Token, TokenNormalized, TokenNormalizedSet } from "@terrazzo/parser";
2
2
 
3
3
  //#region src/lib.d.ts
4
+ declare const FORMAT_ID = "js";
4
5
  declare const DEFAULT_PROPERTIES: Set<keyof TokenNormalized>;
5
6
  interface JSPluginOptions<T extends Record<string, string> = Record<string, string>> {
6
7
  /**
@@ -15,6 +16,8 @@ interface JSPluginOptions<T extends Record<string, string> = Record<string, stri
15
16
  }
16
17
  type Resolver<T extends Record<string, string>> = (input: T) => TokenNormalizedSet;
17
18
  declare const FILE_HEADER = "/** ------------------------------------------\n * Autogenerated by \u26CB Terrazzo. DO NOT EDIT!\n * ------------------------------------------- */";
19
+ /** Types that are always imported in generated .d.ts files, regardless of which token types are used. */
20
+ declare const BASE_IMPORT_TYPES: string[];
18
21
  declare const TYPE_MAP: Record<Token['$type'], string>;
19
22
  //#endregion
20
23
  //#region src/build.d.ts
@@ -51,5 +54,5 @@ declare function pluginJS({
51
54
  contexts
52
55
  }?: JSPluginOptions): Plugin;
53
56
  //#endregion
54
- export { DEFAULT_PROPERTIES, FILE_HEADER, JSPluginOptions, Resolver, TYPE_MAP, buildDTS, buildJS, pluginJS as default };
57
+ export { BASE_IMPORT_TYPES, DEFAULT_PROPERTIES, FILE_HEADER, FORMAT_ID, JSPluginOptions, Resolver, TYPE_MAP, buildDTS, buildJS, pluginJS as default };
55
58
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/index.ts"],"mappings":";;;cAEa,kBAAA,EAAoB,GAAA,OAAU,eAAA;AAAA,UAe1B,eAAA,WAA0B,MAAA,mBAAyB,MAAA;EAfvD;;;;EAoBX,QAAA;EALe;EAOf,QAAA,mBAA2B,CAAA,GAAI,CAAA,OAAQ,CAAA;EAP2B;EASlE,UAAA,UAAoB,eAAA;AAAA;AAAA,KAGV,QAAA,WAAmB,MAAA,qBAA2B,KAAA,EAAO,CAAA,KAAM,kBAAA;AAAA,cAE1D,WAAA;AAAA,cAIA,QAAA,EAAU,MAAA,CAAO,KAAA;;;iBCtBd,OAAA,CAAA;EACd,QAAA;EACA,UAAA;EACA,MAAA;EACA;AAAA;EAEA,QAAA,EAAU,UAAA;EACV,UAAA,EAAY,GAAA,OAAU,eAAA;EACtB,QAAA,GAAW,MAAA;EACX,MAAA,EAAQ,MAAA;AAAA;EACJ,IAAA;EAAc,OAAA,EAAS,MAAA,SAAe,KAAA;AAAA;AAAA,iBAyE5B,QAAA,CAAA;EACd,QAAA;EACA,QAAA;EACA,UAAA;EACA;AAAA;EAEA,QAAA,EAAU,UAAA;EACV,QAAA,GAAW,MAAA;EACX,UAAA,EAAY,GAAA,OAAU,eAAA;EACtB,OAAA,EAAS,MAAA,SAAe,KAAA;AAAA;;;iBClGF,QAAA,CAAA;EACtB,QAAA;EACA,UAAA,EAAY,cAAA;EACZ;AAAA,IACC,eAAA,GAAuB,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/index.ts"],"mappings":";;;cAEa,SAAA;AAAA,cAEA,kBAAA,EAAoB,GAAG,OAAO,eAAA;AAAA,UAe1B,eAAA,WAA0B,MAAA,mBAAyB,MAAA;EAjB9C;;;AAAA;EAsBpB,QAAA;EAPA;EASA,QAAA,mBAA2B,CAAA,GAAI,CAAA,OAAQ,CAAA;EAPxB;EASf,UAAA,UAAoB,eAAA;AAAA;AAAA,KAGV,QAAA,WAAmB,MAAA,qBAA2B,KAAA,EAAO,CAAA,KAAM,kBAAA;AAAA,cAE1D,WAAA;;cAKA,iBAAA;AAAA,cAEA,QAAA,EAAU,MAAM,CAAC,KAAA;;;iBC3Bd,OAAA,CAAA;EACd,QAAA;EACA,UAAA;EACA,MAAA;EACA;AAAA;EAEA,QAAA,EAAU,UAAA;EACV,UAAA,EAAY,GAAA,OAAU,eAAA;EACtB,QAAA,GAAW,MAAA;EACX,MAAA,EAAQ,MAAA;AAAA;EACJ,IAAA;EAAc,OAAA,EAAS,MAAA,SAAe,KAAA;AAAA;AAAA,iBA0E5B,QAAA,CAAA;EACd,QAAA;EACA,QAAA;EACA,UAAA;EACA;AAAA;EAEA,QAAA,EAAU,UAAA;EACV,QAAA,GAAW,MAAA;EACX,UAAA,EAAY,GAAA,OAAU,eAAA;EACtB,OAAA,EAAS,MAAA,SAAe,KAAA;AAAA;;;iBCnGF,QAAA,CAAA;EACtB,QAAA;EACA,UAAA,EAAY,cAAA;EACZ;AAAA,IACC,eAAA,GAAuB,MAAA"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { calculatePermutations } from "@terrazzo/parser";
2
2
  import { pascalCase } from "scule";
3
3
  //#region src/lib.ts
4
+ const FORMAT_ID = "js";
4
5
  const DEFAULT_PROPERTIES = new Set([
5
6
  "$type",
6
7
  "$value",
@@ -11,6 +12,8 @@ const DEFAULT_PROPERTIES = new Set([
11
12
  const FILE_HEADER = `/** ------------------------------------------
12
13
  * Autogenerated by ⛋ Terrazzo. DO NOT EDIT!
13
14
  * ------------------------------------------- */`;
15
+ /** Types that are always imported in generated .d.ts files, regardless of which token types are used. */
16
+ const BASE_IMPORT_TYPES = ["TokenNormalizedSet"];
14
17
  const TYPE_MAP = {
15
18
  boolean: "BooleanTokenNormalized",
16
19
  border: "BorderTokenNormalized",
@@ -40,7 +43,7 @@ function buildJS({ resolver, properties, logger, contexts }) {
40
43
  const typeMap = {};
41
44
  let output = FILE_HEADER;
42
45
  output += "\n";
43
- const permutations = (contexts ? calculatePermutations(Object.entries(contexts)) : resolver.listPermutations()).map((value) => ({
46
+ const permutations = (contexts ? calculatePermutations(Object.entries(contexts)) : resolver.listPermutations?.() ?? []).map((value) => ({
44
47
  value,
45
48
  id: JSON.stringify(Object.fromEntries(Object.entries(value).sort((a, b) => a[0].localeCompare(b[0], "en-us", { numeric: true }))))
46
49
  }));
@@ -98,6 +101,7 @@ function buildDTS({ resolver, contexts, properties, typeMap }) {
98
101
  let output = FILE_HEADER;
99
102
  output += "\n";
100
103
  output += "import type {\n";
104
+ for (const $baseType of BASE_IMPORT_TYPES) output += ` ${$baseType},\n`;
101
105
  for (const $type of unique$type) if ($type in TYPE_MAP) output += ` ${TYPE_MAP[$type]},\n`;
102
106
  output += "} from \"@terrazzo/parser\";";
103
107
  output += "\n\n";
@@ -157,6 +161,17 @@ function pluginJS({ filename = "index.js", properties: userProperties, contexts
157
161
  message: "properties option can’t be empty"
158
162
  });
159
163
  },
164
+ async transform({ tokens, setTransform }) {
165
+ for (const id of Object.keys(tokens)) {
166
+ const accessor = `tokens[${JSON.stringify(id)}]`;
167
+ setTransform(id, {
168
+ format: "js",
169
+ localID: id,
170
+ value: accessor,
171
+ meta: { "token-listing": { name: accessor } }
172
+ });
173
+ }
174
+ },
160
175
  async build({ resolver, outputFile, context }) {
161
176
  const properties = userProperties ? new Set(userProperties) : DEFAULT_PROPERTIES;
162
177
  const { code: js, typeMap } = buildJS({
@@ -177,6 +192,6 @@ function pluginJS({ filename = "index.js", properties: userProperties, contexts
177
192
  };
178
193
  }
179
194
  //#endregion
180
- export { DEFAULT_PROPERTIES, FILE_HEADER, TYPE_MAP, buildDTS, buildJS, pluginJS as default };
195
+ export { BASE_IMPORT_TYPES, DEFAULT_PROPERTIES, FILE_HEADER, FORMAT_ID, TYPE_MAP, buildDTS, buildJS, pluginJS as default };
181
196
 
182
197
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/index.ts"],"sourcesContent":["import type { Token, TokenNormalized, TokenNormalizedSet } from '@terrazzo/parser';\n\nexport const DEFAULT_PROPERTIES: Set<keyof TokenNormalized> = new Set([\n '$type',\n '$value',\n '$description',\n '$extensions',\n '$deprecated',\n // 'id',\n // 'jsonID',\n // 'aliasOf',\n // 'aliasChain',\n // 'aliasedBy',\n // 'dependencies',\n // 'group',\n]);\n\nexport interface JSPluginOptions<T extends Record<string, string> = Record<string, string>> {\n /**\n * Change the output filename\n * @default \"index.js\"\n */\n filename?: string;\n /** Only generate permutations for the specified modifiers (by default, generate all permutations) */\n contexts?: { [key in keyof T]: T[keyof T][] };\n /** Only include specified properties as part of token output. */\n properties?: (keyof TokenNormalized)[];\n}\n\nexport type Resolver<T extends Record<string, string>> = (input: T) => TokenNormalizedSet;\n\nexport const FILE_HEADER = `/** ------------------------------------------\n * Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n * ------------------------------------------- */`;\n\nexport const TYPE_MAP: Record<Token['$type'], string> = {\n boolean: 'BooleanTokenNormalized',\n border: 'BorderTokenNormalized',\n color: 'ColorTokenNormalized',\n cubicBezier: 'CubicBezierTokenNormalized',\n dimension: 'DimensionTokenNormalized',\n duration: 'DurationTokenNormalized',\n fontFamily: 'FontFamilyTokenNormalized',\n fontWeight: 'FontWeightTokenNormalized',\n gradient: 'GradientTokenNormalized',\n link: 'LinkTokenNormalized',\n number: 'NumberTokenNormalized',\n shadow: 'ShadowTokenNormalized',\n string: 'StringTokenNormalized',\n strokeStyle: 'StrokeStyleTokenNormalized',\n typography: 'TypographyTokenNormalized',\n transition: 'TransitionTokenNormalized',\n};\n","import {\n calculatePermutations,\n type Logger,\n type Resolver,\n type ResolverModifierNormalized,\n type Token,\n type TokenNormalized,\n} from '@terrazzo/parser';\nimport { pascalCase } from 'scule';\nimport { FILE_HEADER, TYPE_MAP } from './lib.js';\n\nconst RESOLVER_JSDOC_COMMENT = '/** Produce a token set from a given input. */';\n\nexport function buildJS({\n resolver,\n properties,\n logger,\n contexts,\n}: {\n resolver: Resolver;\n properties: Set<keyof TokenNormalized>;\n contexts?: Record<string, string[]>;\n logger: Logger;\n}): { code: string; typeMap: Record<string, Token['$type']> } {\n const entry = { group: 'plugin' as const, label: '@terrazzo/plugin-js' };\n const typeMap: Record<string, Token['$type']> = {};\n\n // here, output not being an array drastically reduces memory usage for large token sets\n let output = FILE_HEADER;\n output += '\\n';\n\n // 1. Permutations\n const permutations = (contexts ? calculatePermutations(Object.entries(contexts)) : resolver.listPermutations()).map(\n (value) => ({\n value,\n // Note: id MUST have modifiers sorted alphabetically, so we can index them shallowly\n id: JSON.stringify(\n Object.fromEntries(Object.entries(value).sort((a, b) => a[0].localeCompare(b[0], 'en-us', { numeric: true }))),\n ),\n }),\n );\n output += 'export const PERMUTATIONS = {\\n';\n let permutationI = 1;\n for (const { value, id } of permutations) {\n const start = performance.now();\n try {\n const tokens = resolver.apply(value);\n output += ` ${JSON.stringify(id)}: {\\n`;\n for (const id of Object.keys(tokens)) {\n output += ` ${serializeToken(tokens[id]!, properties)},\\n`;\n if (!(id in typeMap)) {\n typeMap[id] = tokens[id]!.$type;\n }\n }\n output += ' },\\n';\n } catch (err) {\n logger.error({ ...entry, message: (err as Error).message });\n }\n const timing = performance.now() - start;\n logger.info({\n ...entry,\n message: `Permutation ${permutationI}/${permutations.length} done (${id})`,\n timing,\n });\n permutationI++;\n }\n output += '};\\n';\n\n // 2. Input defaults\n const inputDefaults = Object.fromEntries(\n resolver.source.resolutionOrder\n .filter((i) => i.type === 'modifier' && 'default' in i)\n .map((m) => [m.name, (m as ResolverModifierNormalized).default!]),\n );\n output += `const INPUT_DEFAULTS = ${JSON.stringify(inputDefaults)};\\n`;\n\n // 3. Resolver\n output += RESOLVER_JSDOC_COMMENT;\n output += '\\n';\n output += `export const resolver = {\n apply(userInput) {\n if (!userInput || typeof userInput !== \"object\") {\n throw new Error(\\`invalid input: \\${userInput}\\`);\n }\n const input = { ...INPUT_DEFAULTS, ...userInput };\n const inputKey = JSON.stringify(Object.fromEntries(Object.entries(input).sort((a, b) => a[0].localeCompare(b[0], \"en-us\", { numeric: true }))));\n return PERMUTATIONS[inputKey];\n },\n listPermutations() {\n return [${permutations.map((p) => p.id).join(', ')}];\n },\n};\\n`;\n\n return { code: output, typeMap };\n}\n\nexport function buildDTS({\n resolver,\n contexts,\n properties,\n typeMap,\n}: {\n resolver: Resolver;\n contexts?: Record<string, string[]>;\n properties: Set<keyof TokenNormalized>;\n typeMap: Record<string, Token['$type']>;\n}): string {\n const unique$type = new Set(Object.values(typeMap));\n\n let output = FILE_HEADER;\n output += '\\n';\n output += 'import type {\\n';\n for (const $type of unique$type) {\n if ($type in TYPE_MAP) {\n output += ` ${TYPE_MAP[$type]},\\n`;\n }\n }\n output += '} from \"@terrazzo/parser\";';\n output += '\\n\\n';\n output += 'export const PERMUTATIONS: Record<string, TokenNormalizedSet>;\\n\\n';\n output += `type InputType = ${buildInputType(resolver, contexts)}\\n\\n`;\n for (const $type of unique$type) {\n if (!($type in TYPE_MAP)) {\n continue;\n }\n output += `export type ${localTypeName($type)} = Pick<${TYPE_MAP[$type]}, ${[...properties].map((p) => JSON.stringify(p)).join(' | ')}>;\\n`;\n }\n output += '\\nexport interface Tokens {\\n';\n for (const [id, $type] of Object.entries(typeMap)) {\n output += ` ${JSON.stringify(id)}: ${$type in TYPE_MAP ? localTypeName($type) : 'any'};\\n`;\n }\n output += '}\\n';\n output += '\\n';\n output += RESOLVER_JSDOC_COMMENT;\n output += '\\n';\n output += `export const resolver: {\n apply(input: InputType): Tokens;\n listPermutations(): InputType[];\n};\n`;\n return output;\n}\n\n/** Generate TypeScript definition of valid inputs given a resolver */\nfunction buildInputType(resolver: Resolver, contexts?: Record<string, string[]>): string {\n const validContexts: Record<string, string[]> = contexts ?? {};\n if (!Object.keys(validContexts).length) {\n for (const [name, m] of Object.entries(resolver.source.modifiers ?? {})) {\n validContexts[name] = Object.keys(m.contexts);\n }\n for (const m of resolver.source.resolutionOrder) {\n if (m?.type !== 'modifier') {\n continue;\n }\n validContexts[m.name] = Object.keys(m.contexts);\n }\n }\n\n let output = '{';\n for (const [name, values] of Object.entries(validContexts)) {\n output += `\\n ${JSON.stringify(name)}: ${values.length ? values.map((v) => JSON.stringify(v)).join(' | ') : 'never'};`;\n }\n output += '\\n};';\n return output;\n}\n\nfunction localTypeName($type: Token['$type']): string {\n return pascalCase($type);\n}\n\n/** Serialize normalized Tokens set into a string */\nfunction serializeToken(token: TokenNormalized, includeProperties: Set<keyof TokenNormalized>): string {\n return `${JSON.stringify(token.id)}:${JSON.stringify(Object.fromEntries(Object.entries(token).filter(([k]) => includeProperties.has(k as keyof TokenNormalized))))}`;\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport { buildDTS, buildJS } from './build.js';\nimport { DEFAULT_PROPERTIES, type JSPluginOptions } from './lib.js';\n\nexport * from './build.js';\nexport * from './lib.js';\n\nexport default function pluginJS({\n filename = 'index.js',\n properties: userProperties,\n contexts,\n}: JSPluginOptions = {}): Plugin {\n const entry = { group: 'plugin' as const, label: '@terrazzo/plugin-js' };\n\n return {\n name: '@terrazzo/plugin-js',\n config(_, context) {\n if (Array.isArray(userProperties) && !userProperties.length) {\n context.logger.error({ ...entry, message: 'properties option can’t be empty' });\n }\n },\n\n // As of 2.0, this plugin no longer pre-transforms values, because every instance\n // generates a unique output.\n async build({ resolver, outputFile, context }) {\n const properties = userProperties ? new Set(userProperties) : DEFAULT_PROPERTIES;\n const { code: js, typeMap } = buildJS({\n resolver,\n contexts,\n properties,\n logger: context.logger,\n });\n outputFile(filename, js);\n\n const dts = buildDTS({ resolver, contexts, properties, typeMap });\n const dtsFilename = typeof filename === 'string' ? filename.replace(/\\.(c|m)?js$/, '.d.$1ts') : 'index.d.ts';\n outputFile(dtsFilename, dts);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/index.ts"],"sourcesContent":["import type { Token, TokenNormalized, TokenNormalizedSet } from '@terrazzo/parser';\n\nexport const FORMAT_ID = 'js';\n\nexport const DEFAULT_PROPERTIES: Set<keyof TokenNormalized> = new Set([\n '$type',\n '$value',\n '$description',\n '$extensions',\n '$deprecated',\n // 'id',\n // 'jsonID',\n // 'aliasOf',\n // 'aliasChain',\n // 'aliasedBy',\n // 'dependencies',\n // 'group',\n]);\n\nexport interface JSPluginOptions<T extends Record<string, string> = Record<string, string>> {\n /**\n * Change the output filename\n * @default \"index.js\"\n */\n filename?: string;\n /** Only generate permutations for the specified modifiers (by default, generate all permutations) */\n contexts?: { [key in keyof T]: T[keyof T][] };\n /** Only include specified properties as part of token output. */\n properties?: (keyof TokenNormalized)[];\n}\n\nexport type Resolver<T extends Record<string, string>> = (input: T) => TokenNormalizedSet;\n\nexport const FILE_HEADER = `/** ------------------------------------------\n * Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n * ------------------------------------------- */`;\n\n/** Types that are always imported in generated .d.ts files, regardless of which token types are used. */\nexport const BASE_IMPORT_TYPES: string[] = ['TokenNormalizedSet'];\n\nexport const TYPE_MAP: Record<Token['$type'], string> = {\n boolean: 'BooleanTokenNormalized',\n border: 'BorderTokenNormalized',\n color: 'ColorTokenNormalized',\n cubicBezier: 'CubicBezierTokenNormalized',\n dimension: 'DimensionTokenNormalized',\n duration: 'DurationTokenNormalized',\n fontFamily: 'FontFamilyTokenNormalized',\n fontWeight: 'FontWeightTokenNormalized',\n gradient: 'GradientTokenNormalized',\n link: 'LinkTokenNormalized',\n number: 'NumberTokenNormalized',\n shadow: 'ShadowTokenNormalized',\n string: 'StringTokenNormalized',\n strokeStyle: 'StrokeStyleTokenNormalized',\n typography: 'TypographyTokenNormalized',\n transition: 'TransitionTokenNormalized',\n};\n","import {\n calculatePermutations,\n type Logger,\n type Resolver,\n type ResolverModifierNormalized,\n type Token,\n type TokenNormalized,\n} from '@terrazzo/parser';\nimport { pascalCase } from 'scule';\nimport { BASE_IMPORT_TYPES, FILE_HEADER, TYPE_MAP } from './lib.js';\n\nconst RESOLVER_JSDOC_COMMENT = '/** Produce a token set from a given input. */';\n\nexport function buildJS({\n resolver,\n properties,\n logger,\n contexts,\n}: {\n resolver: Resolver;\n properties: Set<keyof TokenNormalized>;\n contexts?: Record<string, string[]>;\n logger: Logger;\n}): { code: string; typeMap: Record<string, Token['$type']> } {\n const entry = { group: 'plugin' as const, label: '@terrazzo/plugin-js' };\n const typeMap: Record<string, Token['$type']> = {};\n\n // here, output not being an array drastically reduces memory usage for large token sets\n let output = FILE_HEADER;\n output += '\\n';\n\n // 1. Permutations\n // todo: replace internal usage of listPermutations\n const permutations = (\n contexts ? calculatePermutations(Object.entries(contexts)) : (resolver.listPermutations?.() ?? [])\n ).map((value) => ({\n value,\n // Note: id MUST have modifiers sorted alphabetically, so we can index them shallowly\n id: JSON.stringify(\n Object.fromEntries(Object.entries(value).sort((a, b) => a[0].localeCompare(b[0], 'en-us', { numeric: true }))),\n ),\n }));\n output += 'export const PERMUTATIONS = {\\n';\n let permutationI = 1;\n for (const { value, id } of permutations) {\n const start = performance.now();\n try {\n const tokens = resolver.apply(value);\n output += ` ${JSON.stringify(id)}: {\\n`;\n for (const id of Object.keys(tokens)) {\n output += ` ${serializeToken(tokens[id]!, properties)},\\n`;\n if (!(id in typeMap)) {\n typeMap[id] = tokens[id]!.$type;\n }\n }\n output += ' },\\n';\n } catch (err) {\n logger.error({ ...entry, message: (err as Error).message });\n }\n const timing = performance.now() - start;\n logger.info({\n ...entry,\n message: `Permutation ${permutationI}/${permutations.length} done (${id})`,\n timing,\n });\n permutationI++;\n }\n output += '};\\n';\n\n // 2. Input defaults\n const inputDefaults = Object.fromEntries(\n resolver.source.resolutionOrder\n .filter((i) => i.type === 'modifier' && 'default' in i)\n .map((m) => [m.name, (m as ResolverModifierNormalized).default!]),\n );\n output += `const INPUT_DEFAULTS = ${JSON.stringify(inputDefaults)};\\n`;\n\n // 3. Resolver\n output += RESOLVER_JSDOC_COMMENT;\n output += '\\n';\n output += `export const resolver = {\n apply(userInput) {\n if (!userInput || typeof userInput !== \"object\") {\n throw new Error(\\`invalid input: \\${userInput}\\`);\n }\n const input = { ...INPUT_DEFAULTS, ...userInput };\n const inputKey = JSON.stringify(Object.fromEntries(Object.entries(input).sort((a, b) => a[0].localeCompare(b[0], \"en-us\", { numeric: true }))));\n return PERMUTATIONS[inputKey];\n },\n listPermutations() {\n return [${permutations.map((p) => p.id).join(', ')}];\n },\n};\\n`;\n\n return { code: output, typeMap };\n}\n\nexport function buildDTS({\n resolver,\n contexts,\n properties,\n typeMap,\n}: {\n resolver: Resolver;\n contexts?: Record<string, string[]>;\n properties: Set<keyof TokenNormalized>;\n typeMap: Record<string, Token['$type']>;\n}): string {\n const unique$type = new Set(Object.values(typeMap));\n\n let output = FILE_HEADER;\n output += '\\n';\n output += 'import type {\\n';\n for (const $baseType of BASE_IMPORT_TYPES) {\n output += ` ${$baseType},\\n`;\n }\n for (const $type of unique$type) {\n if ($type in TYPE_MAP) {\n output += ` ${TYPE_MAP[$type]},\\n`;\n }\n }\n output += '} from \"@terrazzo/parser\";';\n output += '\\n\\n';\n output += 'export const PERMUTATIONS: Record<string, TokenNormalizedSet>;\\n\\n';\n output += `type InputType = ${buildInputType(resolver, contexts)}\\n\\n`;\n for (const $type of unique$type) {\n if (!($type in TYPE_MAP)) {\n continue;\n }\n output += `export type ${localTypeName($type)} = Pick<${TYPE_MAP[$type]}, ${[...properties].map((p) => JSON.stringify(p)).join(' | ')}>;\\n`;\n }\n output += '\\nexport interface Tokens {\\n';\n for (const [id, $type] of Object.entries(typeMap)) {\n output += ` ${JSON.stringify(id)}: ${$type in TYPE_MAP ? localTypeName($type) : 'any'};\\n`;\n }\n output += '}\\n';\n output += '\\n';\n output += RESOLVER_JSDOC_COMMENT;\n output += '\\n';\n output += `export const resolver: {\n apply(input: InputType): Tokens;\n listPermutations(): InputType[];\n};\n`;\n return output;\n}\n\n/** Generate TypeScript definition of valid inputs given a resolver */\nfunction buildInputType(resolver: Resolver, contexts?: Record<string, string[]>): string {\n const validContexts: Record<string, string[]> = contexts ?? {};\n if (!Object.keys(validContexts).length) {\n for (const [name, m] of Object.entries(resolver.source.modifiers ?? {})) {\n validContexts[name] = Object.keys(m.contexts);\n }\n for (const m of resolver.source.resolutionOrder) {\n if (m?.type !== 'modifier') {\n continue;\n }\n validContexts[m.name] = Object.keys(m.contexts);\n }\n }\n\n let output = '{';\n for (const [name, values] of Object.entries(validContexts)) {\n output += `\\n ${JSON.stringify(name)}: ${values.length ? values.map((v) => JSON.stringify(v)).join(' | ') : 'never'};`;\n }\n output += '\\n};';\n return output;\n}\n\nfunction localTypeName($type: Token['$type']): string {\n return pascalCase($type);\n}\n\n/** Serialize normalized Tokens set into a string */\nfunction serializeToken(token: TokenNormalized, includeProperties: Set<keyof TokenNormalized>): string {\n return `${JSON.stringify(token.id)}:${JSON.stringify(Object.fromEntries(Object.entries(token).filter(([k]) => includeProperties.has(k as keyof TokenNormalized))))}`;\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport { buildDTS, buildJS } from './build.js';\nimport { DEFAULT_PROPERTIES, FORMAT_ID, type JSPluginOptions } from './lib.js';\n\nexport * from './build.js';\nexport * from './lib.js';\n\nexport default function pluginJS({\n filename = 'index.js',\n properties: userProperties,\n contexts,\n}: JSPluginOptions = {}): Plugin {\n const entry = { group: 'plugin' as const, label: '@terrazzo/plugin-js' };\n\n return {\n name: '@terrazzo/plugin-js',\n config(_, context) {\n if (Array.isArray(userProperties) && !userProperties.length) {\n context.logger.error({ ...entry, message: 'properties option can’t be empty' });\n }\n },\n\n // Register a JS-access-expression transform for each token so consumers\n // (notably plugin-token-listing) can look up the identifier a token has\n // in the generated JS module. plugin-js doesn't pre-transform values\n // (see `build` below), so the `value` field mirrors the access expression\n // rather than carrying a separately-resolved literal.\n async transform({ tokens, setTransform }) {\n for (const id of Object.keys(tokens)) {\n const accessor = `tokens[${JSON.stringify(id)}]`;\n setTransform(id, {\n format: FORMAT_ID,\n localID: id,\n value: accessor,\n meta: { 'token-listing': { name: accessor } },\n });\n }\n },\n\n // As of 2.0, this plugin no longer pre-transforms values, because every instance\n // generates a unique output.\n async build({ resolver, outputFile, context }) {\n const properties = userProperties ? new Set(userProperties) : DEFAULT_PROPERTIES;\n const { code: js, typeMap } = buildJS({\n resolver,\n contexts,\n properties,\n logger: context.logger,\n });\n outputFile(filename, js);\n\n const dts = buildDTS({ resolver, contexts, properties, typeMap });\n const dtsFilename = typeof filename === 'string' ? filename.replace(/\\.(c|m)?js$/, '.d.$1ts') : 'index.d.ts';\n outputFile(dtsFilename, dts);\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terrazzo/plugin-js",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Use DTCG tokens in Node.js for server-rendered applications.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,16 +28,16 @@
28
28
  "directory": "./packages/plugin-js/"
29
29
  },
30
30
  "peerDependencies": {
31
- "@terrazzo/cli": "^2.1.0",
32
- "@terrazzo/parser": "^2.1.0"
31
+ "@terrazzo/cli": "^2.3.0",
32
+ "@terrazzo/parser": "^2.3.0"
33
33
  },
34
34
  "dependencies": {
35
35
  "scule": "^1.3.0",
36
- "@terrazzo/parser": "^2.1.0"
36
+ "@terrazzo/parser": "^2.3.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "dtcg-examples": "^1.0.3",
40
- "@terrazzo/cli": "^2.1.0"
40
+ "@terrazzo/cli": "^2.3.0"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "rolldown -c && attw --profile esm-only --pack .",