@terrazzo/plugin-js 2.0.0-beta.1 → 2.0.0-beta.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;cAEa,oBAAoB,UAAU;UAe1B,0BAA0B,yBAAyB;EAfvD;AAeb;;;EAO6B,QAAA,CAAA,EAAA,MAAA;EAAI;EAAQ,QAAA,CAAA,EAAA,UAEnB,MAFO,CAEP,GAFW,CAEX,CAAA,MAFmB,CAEnB,CAAA,EAAA,EAAe;EAGzB;EAAmB,UAAA,CAAA,EAAA,CAAA,MAHT,eAGS,CAAA,EAAA;;AAAwC,KAA3D,QAA2D,CAAA,UAAxC,MAAwC,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,KAAA,EAAN,CAAM,EAAA,GAAA,kBAAA;AAAkB,cAE5E,WAAA,GAF4E,uJAAA;AAE5E,cAIA,QAJW,EAID,MAJC,CAIM,KAJN,CAAA,OAAA,CAAA,EAAA,MAAA,CAAA;;;iBClBR,OAAA;;;;;;YAMJ;EDjBC,UAAA,ECkBC,GDlBD,CAAA,MCkBW,eDlBmB,CAAA;EAe1B,QAAA,CAAA,ECIJ,MDJI,CAAe,MAAA,EAAA,MAAA,EAAA,CAAA;EAAW,MAAA,ECKjC,MDLiC;CAAyB,CAAA,EAAA;EAOvC,IAAA,EAAA,MAAA;EAAI,OAAA,ECDJ,MDCI,CAAA,MAAA,ECDW,KDCX,CAAA,OAAA,CAAA,CAAA;CAAQ;AAEnB,iBCsEN,QAAA,CDtEM;EAAA,QAAA;EAAA,QAAA;EAAA,UAAA;EAAA;CAAA,EAAA;EAAe,QAAA,EC4EzB,UD5EyB;EAGzB,QAAA,CAAA,EC0EC,MD1EO,CAAA,MAAA,EAAA,MAAA,EAAA,CAAA;EAAW,UAAA,EC2EjB,GD3EiB,CAAA,MC2EP,eD3EO,CAAA;EAAkC,OAAA,EC4EtD,MD5EsD,CAAA,MAAA,EC4EvC,KD5EuC,CAAA,OAAA,CAAA,CAAA;CAAM,CAAA,EAAA,MAAA;;;AAZtD,iBEVO,QAAA,CFUQ;EAAA,QAAA;EAAA,UAAA,EERlB,cFQkB;EAAA;AAAA,CAAA,CAAA,EEN7B,eFM6B,CAAA,EENN,MFMM"}
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"}
package/dist/index.js CHANGED
@@ -53,9 +53,9 @@ function buildJS({ resolver, properties, logger, contexts }) {
53
53
  try {
54
54
  const tokens = resolver.apply(value);
55
55
  output += ` ${JSON.stringify(id)}: {\n`;
56
- for (const id$1 of Object.keys(tokens)) {
57
- output += ` ${serializeToken(tokens[id$1], properties)},\n`;
58
- if (!(id$1 in typeMap)) typeMap[id$1] = tokens[id$1].$type;
56
+ for (const id of Object.keys(tokens)) {
57
+ output += ` ${serializeToken(tokens[id], properties)},\n`;
58
+ if (!(id in typeMap)) typeMap[id] = tokens[id].$type;
59
59
  }
60
60
  output += " },\n";
61
61
  } catch (err) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["id"],"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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terrazzo/plugin-js",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.0-beta.2",
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.0.0-beta.1",
32
- "@terrazzo/parser": "^2.0.0-beta.1"
31
+ "@terrazzo/cli": "^2.0.0-beta.2",
32
+ "@terrazzo/parser": "^2.0.0-beta.2"
33
33
  },
34
34
  "dependencies": {
35
35
  "scule": "^1.3.0",
36
- "@terrazzo/parser": "^2.0.0-beta.1"
36
+ "@terrazzo/parser": "^2.0.0-beta.2"
37
37
  },
38
38
  "devDependencies": {
39
39
  "dtcg-examples": "^1.0.2",
40
- "@terrazzo/cli": "^2.0.0-beta.1"
40
+ "@terrazzo/cli": "^2.0.0-beta.2"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "rolldown -c && attw --profile esm-only --pack .",