@terrazzo/plugin-sass 2.0.0-beta.4 → 2.0.0-beta.6

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.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { CSSPluginOptions } from "@terrazzo/plugin-css";
2
2
  import { BuildHookOptions, Plugin } from "@terrazzo/parser";
3
+ import { CachedWildcardMatcher } from "@terrazzo/token-tools";
3
4
 
4
5
  //#region src/lib.d.ts
5
6
  declare const FORMAT_ID = "sass";
@@ -9,6 +10,7 @@ interface SassPluginOptions {
9
10
  /** Glob patterns to exclude tokens from output */
10
11
  exclude?: CSSPluginOptions['exclude'];
11
12
  }
13
+ declare const cachedMatcher: CachedWildcardMatcher;
12
14
  declare const FILE_HEADER = "////\n/// Autogenerated by \u26CB Terrazzo. DO NOT EDIT!\n////\n\n@use \"sass:list\";\n@use \"sass:map\";\n@use \"sass:meta\";";
13
15
  declare const MIXIN_TOKEN = "@function token($tokenName) {\n @if map.has-key($__token-values, $tokenName) == false {\n @error 'No token named \"#{$tokenName}\"';\n }\n $_token: map.get($__token-values, $tokenName);\n @if meta.type-of($_token) == map and map.has-key($_token, \"__tz-error\") {\n @error map.get($_token, \"__tz-error\");\n }\n\n @return $_token;\n}";
14
16
  declare const MIXIN_TYPOGRAPHY = "@mixin typography($tokenName, $modeName: \".\") {\n @if map.has-key($__token-typography-mixins, $tokenName) == false {\n @error 'No typography mixin named \"#{$tokenName}\"';\n }\n $_mixin: map.get($__token-typography-mixins, $tokenName);\n $_properties: map.get($_mixin, \".\");\n @if map.has-key($_mixin) {\n $_properties: map.get($_mixin);\n }\n @each $_property, $_value in $_properties {\n #{$_property}: #{$_value};\n }\n}";
@@ -83,5 +85,5 @@ declare class VariableDefinitionSassToken extends SassToken {
83
85
  //#region src/index.d.ts
84
86
  declare function pluginSass(options?: SassPluginOptions): Plugin;
85
87
  //#endregion
86
- export { BlankLineSassToken, BuildParams, CssVarReferenceSassToken, FILE_HEADER, FORMAT_ID, MIXIN_TOKEN, MIXIN_TYPOGRAPHY, RootSassToken, SassMap, SassMapKey, SassMapValue, SassMapValues, SassPluginOptions, SassToken, StringSassToken, UseSassToken, ValueSassToken, VariableDefinitionSassToken, pluginSass as default, getIndent };
88
+ export { BlankLineSassToken, BuildParams, CssVarReferenceSassToken, FILE_HEADER, FORMAT_ID, MIXIN_TOKEN, MIXIN_TYPOGRAPHY, RootSassToken, SassMap, SassMapKey, SassMapValue, SassMapValues, SassPluginOptions, SassToken, StringSassToken, UseSassToken, ValueSassToken, VariableDefinitionSassToken, cachedMatcher, pluginSass as default, getIndent };
87
89
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/node.ts","../src/index.ts"],"mappings":";;;;cAEa,SAAA;AAAA,UAEI,iBAAA;;EAEf,QAAA,GAAW,gBAAA;EAJS;EAMpB,OAAA,GAAU,gBAAA;AAAA;AAAA,cAGC,WAAA;AAAA,cAQA,WAAA;AAAA,cAYA,gBAAA;AAAA,iBAgBG,SAAA,CAAU,gBAAA;;;UC1CT,WAAA;EACf,aAAA,EAAe,gBAAA;EACf,OAAA,GAAU,iBAAA;AAAA;;;KCJA,UAAA;AAAA,KACA,YAAA,YAAwB,SAAA;AAAA,KACxB,aAAA,GAAgB,MAAA,CAAO,UAAA,EAAY,YAAA,IAAgB,QAAA,EAAU,UAAA,EAAY,YAAA;AAAA,uBAE/D,SAAA;EAAA,SACQ,gBAAA;cAAA,gBAAA;EAAA,SAEnB,MAAA,CAAA;EAEF,QAAA,CAAA;EAIA,SAAA,CAAU,MAAA,GAAS,aAAA,GAAgB,OAAA;EAInC,wBAAA,CAAyB,IAAA,UAAc,KAAA,EAAO,SAAA,GAAY,2BAAA;AAAA;AAAA,uBAK7C,cAAA,SAAuB,SAAA;EACpC,QAAA,CAAA;AAAA;AAAA,cAKI,eAAA,SAAwB,SAAA;EAAA,SAEjB,KAAA;cAAA,KAAA,UAChB,gBAAA;EAKK,MAAA,CAAA;AAAA;AAAA,cAKI,wBAAA,SAAiC,eAAA;EACrC,MAAA,CAAA;AAAA;AAAA,cAKI,kBAAA,SAA2B,eAAA;EAAA,WAAA,CAAA;AAAA;AAAA,cAM3B,aAAA,SAAsB,SAAA;EAAA,iBAChB,SAAA;EAAA,QAET,UAAA;;EAOD,MAAA,CAAO,SAAA,EAAW,SAAA;EAIlB,YAAA,CAAa,KAAA;EAIb,wBAAA,CAAyB,IAAA,UAAc,SAAA,EAAW,SAAA;EAIlD,eAAA,CAAA;EAIA,SAAA,CAAU,KAAA,UAAe,GAAA;EAIzB,MAAA,CAAA;AAAA;AAAA,cAKI,OAAA,SAAgB,cAAA;EAAA,iBACV,QAAA;EAAA,iBACA,SAAA;EAAA,iBACA,mBAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,MAAA;cAEL,gBAAA,UAA0B,MAAA,GAAS,aAAA;EAKxC,GAAA,CAAI,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,YAAA;EAI5B,MAAA,CAAO,MAAA,EAAQ,aAAA;EAMf,MAAA,CAAO,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,aAAA,GAAa,OAAA;EAM7C,MAAA,CAAA;EAAA,QAYC,mBAAA;AAAA;AAAA,cAKG,YAAA,SAAqB,eAAA;cACpB,KAAA,UAAe,GAAA;AAAA;AAAA,cAOhB,2BAAA,SAAoC,SAAA;EAAA,SAG7B,IAAA;EAAA,SACA,KAAA,EAAO,SAAA;cAFvB,gBAAA,UACgB,IAAA,UACA,KAAA,EAAO,SAAA;EAKlB,MAAA,CAAA;AAAA;;;iBClJe,UAAA,CAAW,OAAA,GAAU,iBAAA,GAAoB,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/node.ts","../src/index.ts"],"mappings":";;;;;cAGa,SAAA;AAAA,UAEI,iBAAA;;EAEf,QAAA,GAAW,gBAAA;EAJS;EAMpB,OAAA,GAAU,gBAAA;AAAA;AAAA,cAGC,aAAA,EAAa,qBAAA;AAAA,cAEb,WAAA;AAAA,cAQA,WAAA;AAAA,cAYA,gBAAA;AAAA,iBAgBG,SAAA,CAAU,gBAAA;;;UC9CT,WAAA;EACf,aAAA,EAAe,gBAAA;EACf,OAAA,GAAU,iBAAA;AAAA;;;KCHA,UAAA;AAAA,KACA,YAAA,YAAwB,SAAA;AAAA,KACxB,aAAA,GAAgB,MAAA,CAAO,UAAA,EAAY,YAAA,IAAgB,QAAA,EAAU,UAAA,EAAY,YAAA;AAAA,uBAE/D,SAAA;EAAA,SACQ,gBAAA;cAAA,gBAAA;EAAA,SAEnB,MAAA,CAAA;EAEF,QAAA,CAAA;EAIA,SAAA,CAAU,MAAA,GAAS,aAAA,GAAgB,OAAA;EAInC,wBAAA,CAAyB,IAAA,UAAc,KAAA,EAAO,SAAA,GAAY,2BAAA;AAAA;AAAA,uBAK7C,cAAA,SAAuB,SAAA;EACpC,QAAA,CAAA;AAAA;AAAA,cAKI,eAAA,SAAwB,SAAA;EAAA,SAEjB,KAAA;cAAA,KAAA,UAChB,gBAAA;EAKK,MAAA,CAAA;AAAA;AAAA,cAKI,wBAAA,SAAiC,eAAA;EACrC,MAAA,CAAA;AAAA;AAAA,cAKI,kBAAA,SAA2B,eAAA;EAAA,WAAA,CAAA;AAAA;AAAA,cAM3B,aAAA,SAAsB,SAAA;EAAA,iBAChB,SAAA;EAAA,QAET,UAAA;;EAOD,MAAA,CAAO,SAAA,EAAW,SAAA;EAIlB,YAAA,CAAa,KAAA;EAIb,wBAAA,CAAyB,IAAA,UAAc,SAAA,EAAW,SAAA;EAIlD,eAAA,CAAA;EAIA,SAAA,CAAU,KAAA,UAAe,GAAA;EAIzB,MAAA,CAAA;AAAA;AAAA,cAKI,OAAA,SAAgB,cAAA;EAAA,iBACV,QAAA;EAAA,iBACA,SAAA;EAAA,iBACA,mBAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,MAAA;cAEL,gBAAA,UAA0B,MAAA,GAAS,aAAA;EAKxC,GAAA,CAAI,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,YAAA;EAI5B,MAAA,CAAO,MAAA,EAAQ,aAAA;EAMf,MAAA,CAAO,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,aAAA,GAAa,OAAA;EAM7C,MAAA,CAAA;EAAA,QAYC,mBAAA;AAAA;AAAA,cAKG,YAAA,SAAqB,eAAA;cACpB,KAAA,UAAe,GAAA;AAAA;AAAA,cAOhB,2BAAA,SAAoC,SAAA;EAAA,SAG7B,IAAA;EAAA,SACA,KAAA,EAAO,SAAA;cAFvB,gBAAA,UACgB,IAAA,UACA,KAAA,EAAO,SAAA;EAKlB,MAAA,CAAA;AAAA;;;iBClJe,UAAA,CAAW,OAAA,GAAU,iBAAA,GAAoB,MAAA"}
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { FORMAT_ID as FORMAT_ID$1 } from "@terrazzo/plugin-css";
2
2
  import { MULTI_VALUE } from "@terrazzo/parser";
3
- import { getTokenMatcher } from "@terrazzo/token-tools";
3
+ import { CachedWildcardMatcher } from "@terrazzo/token-tools";
4
4
  import { makeCSSVar } from "@terrazzo/token-tools/css";
5
5
 
6
6
  //#region src/lib.ts
7
7
  const FORMAT_ID = "sass";
8
+ const cachedMatcher = new CachedWildcardMatcher();
8
9
  const FILE_HEADER = `////
9
10
  /// Autogenerated by ⛋ Terrazzo. DO NOT EDIT!
10
11
  ////
@@ -204,43 +205,34 @@ async function build({ getTransforms, options }) {
204
205
  root.appendUse("sass:map");
205
206
  root.appendBlankLine();
206
207
  const tokenValuesMap = root.createMap();
207
- const exclude = options?.exclude ? getTokenMatcher(options?.exclude) : void 0;
208
- for (const token of getTransforms({
209
- format: FORMAT_ID,
210
- id: "*",
211
- mode: "."
212
- })) {
213
- if (exclude?.(token.token.id)) continue;
214
- const tokenId = token.token.id;
215
- const tokenName = token.localID ?? tokenId;
208
+ const exclude = options?.exclude ? cachedMatcher.tokenIDMatch(options.exclude) : void 0;
209
+ for (const token of getTransforms({ format: FORMAT_ID })) {
210
+ if (exclude?.(token.id)) continue;
211
+ const tokenName = token.localID ?? token.id;
216
212
  if (token.token.$type === "typography" && token.type === MULTI_VALUE) {
217
213
  const tokenValue = token.value;
218
- const typographySassVars = new Map(Object.keys(tokenValue).map((key) => [`${tokenId}.${key}`, new CssVarReferenceSassToken(`${tokenName}-${key}`)]));
219
- if ("font-size" in tokenValue && "font-family" in tokenValue) typographySassVars.set(tokenId, new CssVarReferenceSassToken(tokenName));
214
+ const typographySassVars = new Map(Object.keys(tokenValue).map((key) => [`${token.id}.${key}`, new CssVarReferenceSassToken(`${tokenName}-${key}`)]));
215
+ if ("font-size" in tokenValue && "font-family" in tokenValue) typographySassVars.set(token.id, new CssVarReferenceSassToken(tokenName));
220
216
  tokenValuesMap.extend(typographySassVars);
221
- } else tokenValuesMap.set(tokenId, new CssVarReferenceSassToken(tokenName));
217
+ } else tokenValuesMap.set(token.id, new CssVarReferenceSassToken(tokenName));
222
218
  }
223
219
  root.appendVariableDefinition("$__token-values", tokenValuesMap);
224
220
  root.appendBlankLine();
225
221
  const tokenTypographyMixinsMap = root.createMap();
226
222
  for (const token of getTransforms({
227
223
  format: "css",
228
- id: "*",
229
- mode: ".",
230
224
  $type: "typography"
231
225
  })) {
232
226
  if (typeof token.value === "string") continue;
233
- const tokenId = token.token.id;
234
- const tokenName = token.localID ?? tokenId;
235
- const tokenValue = token.value;
227
+ const tokenName = token.localID ?? token.id;
236
228
  const values = { ...token.value };
237
229
  const fontMap = tokenTypographyMixinsMap.createMap();
238
- if ("font-size" in tokenValue && "font-family" in tokenValue) {
230
+ if ("font-size" in token.value && "font-family" in token.value) {
239
231
  fontMap.set("font", new CssVarReferenceSassToken(`${tokenName}`));
240
232
  for (const property of FONT_SHORTHAND_PROPERTIES) delete values[property];
241
233
  }
242
234
  fontMap.extend(Object.keys(values).map((propertyName) => [propertyName, new CssVarReferenceSassToken(`${tokenName}-${propertyName}`)]));
243
- tokenTypographyMixinsMap.set(tokenId, fontMap);
235
+ tokenTypographyMixinsMap.set(token.id, fontMap);
244
236
  }
245
237
  root.appendVariableDefinition("$__token-typography-mixins", tokenTypographyMixinsMap);
246
238
  root.appendBlankLine();
@@ -264,12 +256,11 @@ Please install @terrazzo/plugin-css and follow setup to add to your config.`);
264
256
  for (const token of tokens) {
265
257
  const value = `var(${token.localID})`;
266
258
  let listingName = `token("${token.token.id}")`;
267
- if (token.token.$type === "typography") listingName = token.mode !== "." ? `typography("${token.token.id}", "${token.mode}")` : `typography("${token.token.id}")`;
259
+ if (token.token.$type === "typography") listingName = `typography("${token.token.id}")`;
268
260
  setTransform(token.id, {
269
261
  format: FORMAT_ID,
270
262
  localID: token.id,
271
263
  value,
272
- mode: token.mode,
273
264
  meta: { "token-listing": { name: listingName } }
274
265
  });
275
266
  }
@@ -284,5 +275,5 @@ Please install @terrazzo/plugin-css and follow setup to add to your config.`);
284
275
  }
285
276
 
286
277
  //#endregion
287
- export { BlankLineSassToken, CssVarReferenceSassToken, FILE_HEADER, FORMAT_ID, MIXIN_TOKEN, MIXIN_TYPOGRAPHY, RootSassToken, SassMap, SassToken, StringSassToken, UseSassToken, ValueSassToken, VariableDefinitionSassToken, pluginSass as default, getIndent };
278
+ export { BlankLineSassToken, CssVarReferenceSassToken, FILE_HEADER, FORMAT_ID, MIXIN_TOKEN, MIXIN_TYPOGRAPHY, RootSassToken, SassMap, SassToken, StringSassToken, UseSassToken, ValueSassToken, VariableDefinitionSassToken, cachedMatcher, pluginSass as default, getIndent };
288
279
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["CSS_FORMAT_ID"],"sources":["../src/lib.ts","../src/node.ts","../src/build.ts","../src/index.ts"],"sourcesContent":["import type { CSSPluginOptions } from '@terrazzo/plugin-css';\n\nexport const FORMAT_ID = 'sass';\n\nexport interface SassPluginOptions {\n /** Where to output CSS */\n filename?: CSSPluginOptions['filename'];\n /** Glob patterns to exclude tokens from output */\n exclude?: CSSPluginOptions['exclude'];\n}\n\nexport const FILE_HEADER = `////\n/// Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n////\n\n@use \"sass:list\";\n@use \"sass:map\";\n@use \"sass:meta\";`;\n\nexport const MIXIN_TOKEN = `@function token($tokenName) {\n @if map.has-key($__token-values, $tokenName) == false {\n @error 'No token named \"#{$tokenName}\"';\n }\n $_token: map.get($__token-values, $tokenName);\n @if meta.type-of($_token) == map and map.has-key($_token, \"__tz-error\") {\n @error map.get($_token, \"__tz-error\");\n }\n\n @return $_token;\n}`;\n\nexport const MIXIN_TYPOGRAPHY = `@mixin typography($tokenName, $modeName: \".\") {\n @if map.has-key($__token-typography-mixins, $tokenName) == false {\n @error 'No typography mixin named \"#{$tokenName}\"';\n }\n $_mixin: map.get($__token-typography-mixins, $tokenName);\n $_properties: map.get($_mixin, \".\");\n @if map.has-key($_mixin) {\n $_properties: map.get($_mixin);\n }\n @each $_property, $_value in $_properties {\n #{$_property}: #{$_value};\n }\n}`;\n\nconst INDENT_NUM_SPACES = 2;\n\nexport function getIndent(indentationLevel: number): string {\n return indentationLevel > 0 ? ' '.repeat(indentationLevel * INDENT_NUM_SPACES) : '';\n}\n","import { makeCSSVar } from '@terrazzo/token-tools/css';\nimport { getIndent } from './lib.js';\n\nexport type SassMapKey = string | number;\nexport type SassMapValue = string | SassToken;\nexport type SassMapValues = Record<SassMapKey, SassMapValue> | Iterable<[SassMapKey, SassMapValue]>;\n\nexport abstract class SassToken {\n constructor(public readonly indentationLevel: number = 0) {}\n\n abstract format(): string;\n\n public toString(): string {\n return `${getIndent(this.indentationLevel)}${this.format()}`;\n }\n\n public createMap(values?: SassMapValues): SassMap {\n return new SassMap(this.indentationLevel + 1, values);\n }\n\n public createVariableDefinition(name: string, value: SassToken): VariableDefinitionSassToken {\n return new VariableDefinitionSassToken(this.indentationLevel + 1, name, value);\n }\n}\n\nexport abstract class ValueSassToken extends SassToken {\n public toString(): string {\n return this.format();\n }\n}\n\nexport class StringSassToken extends SassToken {\n constructor(\n public readonly value: string,\n indentationLevel = 0,\n ) {\n super(indentationLevel);\n }\n\n public format(): string {\n return this.value;\n }\n}\n\nexport class CssVarReferenceSassToken extends StringSassToken {\n public format(): string {\n return `${makeCSSVar(this.value, { wrapVar: true })}`;\n }\n}\n\nexport class BlankLineSassToken extends StringSassToken {\n constructor() {\n super('');\n }\n}\n\nexport class RootSassToken extends SassToken {\n private readonly SEPARATOR = '\\n';\n\n private sassTokens: SassToken[];\n\n constructor() {\n super(-1);\n this.sassTokens = [];\n }\n\n public append(sassToken: SassToken) {\n this.sassTokens.push(sassToken);\n }\n\n public appendString(value: string) {\n this.append(new StringSassToken(value));\n }\n\n public appendVariableDefinition(name: string, sassToken: SassToken) {\n this.append(this.createVariableDefinition(name, sassToken));\n }\n\n public appendBlankLine() {\n this.append(new BlankLineSassToken());\n }\n\n public appendUse(value: string, as_?: string) {\n this.append(new UseSassToken(value, as_));\n }\n\n public format(): string {\n return this.sassTokens.map((sassToken) => sassToken).join(this.SEPARATOR);\n }\n}\n\nexport class SassMap extends ValueSassToken {\n private readonly MAP_OPEN = '(';\n private readonly MAP_CLOSE = ')';\n private readonly MAP_VALUE_SEPARATOR = ',\\n';\n\n private readonly SEPARATOR = '\\n';\n\n private readonly values: Map<SassMapKey, SassMapValue>;\n\n constructor(indentationLevel: number, values?: SassMapValues) {\n super(indentationLevel);\n this.values = new Map<SassMapKey, SassMapValue>(values ? this.sassMapValuesToIter(values) : undefined);\n }\n\n public set(key: SassMapKey, value: SassMapValue) {\n this.values.set(key, value);\n }\n\n public extend(values: SassMapValues) {\n for (const [key, value] of this.sassMapValuesToIter(values)) {\n this.set(key, value);\n }\n }\n\n public setMap(key: SassMapKey, values: SassMapValues) {\n const nestedMap = this.createMap(values);\n this.set(key, nestedMap);\n return nestedMap;\n }\n\n public format(): string {\n return [\n this.MAP_OPEN,\n Array.from(\n this.values\n .entries()\n .map(([key, value]) => new StringSassToken(`\"${key}\": ${value}`, this.indentationLevel + 1)),\n ).join(this.MAP_VALUE_SEPARATOR),\n new StringSassToken(this.MAP_CLOSE, this.indentationLevel),\n ].join(this.SEPARATOR);\n }\n\n private sassMapValuesToIter(values: SassMapValues) {\n return Symbol.iterator in values && typeof values[Symbol.iterator] === 'function' ? values : Object.entries(values);\n }\n}\n\nexport class UseSassToken extends StringSassToken {\n constructor(value: string, as_?: string) {\n const valueQuoted = `\"${value}\"`;\n const atUseUrl = as_ ? `${valueQuoted} as ${as_}` : valueQuoted;\n super(`@use ${atUseUrl};`);\n }\n}\n\nexport class VariableDefinitionSassToken extends SassToken {\n constructor(\n indentationLevel: number,\n public readonly name: string,\n public readonly value: SassToken,\n ) {\n super(indentationLevel);\n }\n\n public format(): string {\n return `${this.name}: ${this.value};`;\n }\n}\n","import { type BuildHookOptions, MULTI_VALUE } from '@terrazzo/parser';\nimport { getTokenMatcher } from '@terrazzo/token-tools';\nimport { FORMAT_ID, type SassPluginOptions } from './lib.js';\nimport { CssVarReferenceSassToken, RootSassToken, type SassMapKey, type SassMapValue, type SassToken } from './node.js';\n\nexport interface BuildParams {\n getTransforms: BuildHookOptions['getTransforms'];\n options?: SassPluginOptions;\n}\n\nconst FONT_SHORTHAND_PROPERTIES = [\n 'font-family',\n 'font-size',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n];\n\nconst SASS_HEADER = `////\n/// Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n////\n`;\n\nconst SASS_LIB = `@function token($tokenName) {\n @if not map.has-key($__token-values, $tokenName) {\n @error 'No token named \"#{$tokenName}\"';\n }\n\n $token: map.get($__token-values, $tokenName);\n\n @if $token == \"__tz-error-typography\" {\n @error \"This is a typography mixin. Use \\`@include typography(\"#{tokenId}\")\\` instead.\";\n }\n\n @return $token;\n}\n\n@mixin typography($tokenName) {\n @if not map.has-key($__token-typography-mixins, $tokenName) {\n @error 'No typography mixin named \"#{$tokenName}\"';\n }\n\n $mixin: map.get($__token-typography-mixins, $tokenName);\n\n @each $_property, $_value in $mixin {\n #{$_property}: #{$_value};\n }\n}\n`;\n\nexport default async function build({ getTransforms, options }: BuildParams): Promise<string> {\n const root = new RootSassToken();\n root.appendString(SASS_HEADER);\n root.appendUse('sass:list');\n root.appendUse('sass:map');\n root.appendBlankLine();\n\n const tokenValuesMap = root.createMap();\n\n const exclude = options?.exclude ? getTokenMatcher(options?.exclude) : undefined;\n\n for (const token of getTransforms({ format: FORMAT_ID, id: '*', mode: '.' })) {\n if (exclude?.(token.token.id)) {\n continue;\n }\n const tokenId = token.token.id;\n const tokenName = token.localID ?? tokenId;\n if (token.token.$type === 'typography' && token.type === MULTI_VALUE) {\n const tokenValue = token.value;\n const typographySassVars = new Map<SassMapKey, SassToken>(\n Object.keys(tokenValue).map((key) => [\n `${tokenId}.${key}`,\n new CssVarReferenceSassToken(`${tokenName}-${key}`),\n ]),\n );\n if ('font-size' in tokenValue && 'font-family' in tokenValue) {\n typographySassVars.set(tokenId, new CssVarReferenceSassToken(tokenName));\n }\n tokenValuesMap.extend(typographySassVars);\n } else {\n tokenValuesMap.set(tokenId, new CssVarReferenceSassToken(tokenName));\n }\n }\n root.appendVariableDefinition('$__token-values', tokenValuesMap);\n root.appendBlankLine();\n const tokenTypographyMixinsMap = root.createMap();\n\n for (const token of getTransforms({ format: 'css', id: '*', mode: '.', $type: 'typography' })) {\n if (typeof token.value === 'string') {\n continue;\n }\n const tokenId = token.token.id;\n const tokenName = token.localID ?? tokenId;\n const tokenValue = token.value;\n const values = { ...token.value };\n const fontMap = tokenTypographyMixinsMap.createMap();\n if ('font-size' in tokenValue && 'font-family' in tokenValue) {\n fontMap.set('font', new CssVarReferenceSassToken(`${tokenName}`));\n for (const property of FONT_SHORTHAND_PROPERTIES) {\n delete values[property];\n }\n }\n fontMap.extend(\n Object.keys(values).map(\n (propertyName) =>\n [propertyName, new CssVarReferenceSassToken(`${tokenName}-${propertyName}`)] as [SassMapKey, SassMapValue],\n ),\n );\n tokenTypographyMixinsMap.set(tokenId, fontMap);\n }\n\n root.appendVariableDefinition('$__token-typography-mixins', tokenTypographyMixinsMap);\n root.appendBlankLine();\n root.appendString(SASS_LIB);\n return root.toString();\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport { FORMAT_ID as CSS_FORMAT_ID } from '@terrazzo/plugin-css';\nimport build from './build.js';\nimport { FORMAT_ID, type SassPluginOptions } from './lib.js';\n\nexport * from './build.js';\nexport * from './lib.js';\nexport * from './node.js';\n\nexport default function pluginSass(options?: SassPluginOptions): Plugin {\n const filename = options?.filename ?? 'index.scss';\n\n return {\n name: '@terrazzo/plugin-sass',\n enforce: 'post',\n config(config) {\n // plugin-css is required for transforms. throw error\n if (!config.plugins.some((p) => p.name === '@terrazzo/plugin-css')) {\n throw new Error(\n `@terrazzo/plugin-sass relies on @terrazzo/plugin-css.\nPlease install @terrazzo/plugin-css and follow setup to add to your config.`,\n );\n }\n },\n\n async transform({ getTransforms, setTransform }) {\n const tokens = getTransforms({ format: CSS_FORMAT_ID });\n for (const token of tokens) {\n const value = `var(${token.localID})`;\n let listingName = `token(\"${token.token.id}\")`;\n if (token.token.$type === 'typography') {\n listingName =\n token.mode !== '.' ? `typography(\"${token.token.id}\", \"${token.mode}\")` : `typography(\"${token.token.id}\")`;\n }\n setTransform(token.id, {\n format: FORMAT_ID,\n localID: token.id,\n value,\n mode: token.mode,\n meta: { 'token-listing': { name: listingName } },\n });\n }\n },\n\n async build({ getTransforms, outputFile }) {\n const output = await build({ getTransforms, options });\n outputFile(filename, output);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["CSS_FORMAT_ID"],"sources":["../src/lib.ts","../src/node.ts","../src/build.ts","../src/index.ts"],"sourcesContent":["import type { CSSPluginOptions } from '@terrazzo/plugin-css';\nimport { CachedWildcardMatcher } from '@terrazzo/token-tools';\n\nexport const FORMAT_ID = 'sass';\n\nexport interface SassPluginOptions {\n /** Where to output CSS */\n filename?: CSSPluginOptions['filename'];\n /** Glob patterns to exclude tokens from output */\n exclude?: CSSPluginOptions['exclude'];\n}\n\nexport const cachedMatcher = new CachedWildcardMatcher();\n\nexport const FILE_HEADER = `////\n/// Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n////\n\n@use \"sass:list\";\n@use \"sass:map\";\n@use \"sass:meta\";`;\n\nexport const MIXIN_TOKEN = `@function token($tokenName) {\n @if map.has-key($__token-values, $tokenName) == false {\n @error 'No token named \"#{$tokenName}\"';\n }\n $_token: map.get($__token-values, $tokenName);\n @if meta.type-of($_token) == map and map.has-key($_token, \"__tz-error\") {\n @error map.get($_token, \"__tz-error\");\n }\n\n @return $_token;\n}`;\n\nexport const MIXIN_TYPOGRAPHY = `@mixin typography($tokenName, $modeName: \".\") {\n @if map.has-key($__token-typography-mixins, $tokenName) == false {\n @error 'No typography mixin named \"#{$tokenName}\"';\n }\n $_mixin: map.get($__token-typography-mixins, $tokenName);\n $_properties: map.get($_mixin, \".\");\n @if map.has-key($_mixin) {\n $_properties: map.get($_mixin);\n }\n @each $_property, $_value in $_properties {\n #{$_property}: #{$_value};\n }\n}`;\n\nconst INDENT_NUM_SPACES = 2;\n\nexport function getIndent(indentationLevel: number): string {\n return indentationLevel > 0 ? ' '.repeat(indentationLevel * INDENT_NUM_SPACES) : '';\n}\n","import { makeCSSVar } from '@terrazzo/token-tools/css';\nimport { getIndent } from './lib.js';\n\nexport type SassMapKey = string | number;\nexport type SassMapValue = string | SassToken;\nexport type SassMapValues = Record<SassMapKey, SassMapValue> | Iterable<[SassMapKey, SassMapValue]>;\n\nexport abstract class SassToken {\n constructor(public readonly indentationLevel: number = 0) {}\n\n abstract format(): string;\n\n public toString(): string {\n return `${getIndent(this.indentationLevel)}${this.format()}`;\n }\n\n public createMap(values?: SassMapValues): SassMap {\n return new SassMap(this.indentationLevel + 1, values);\n }\n\n public createVariableDefinition(name: string, value: SassToken): VariableDefinitionSassToken {\n return new VariableDefinitionSassToken(this.indentationLevel + 1, name, value);\n }\n}\n\nexport abstract class ValueSassToken extends SassToken {\n public toString(): string {\n return this.format();\n }\n}\n\nexport class StringSassToken extends SassToken {\n constructor(\n public readonly value: string,\n indentationLevel = 0,\n ) {\n super(indentationLevel);\n }\n\n public format(): string {\n return this.value;\n }\n}\n\nexport class CssVarReferenceSassToken extends StringSassToken {\n public format(): string {\n return `${makeCSSVar(this.value, { wrapVar: true })}`;\n }\n}\n\nexport class BlankLineSassToken extends StringSassToken {\n constructor() {\n super('');\n }\n}\n\nexport class RootSassToken extends SassToken {\n private readonly SEPARATOR = '\\n';\n\n private sassTokens: SassToken[];\n\n constructor() {\n super(-1);\n this.sassTokens = [];\n }\n\n public append(sassToken: SassToken) {\n this.sassTokens.push(sassToken);\n }\n\n public appendString(value: string) {\n this.append(new StringSassToken(value));\n }\n\n public appendVariableDefinition(name: string, sassToken: SassToken) {\n this.append(this.createVariableDefinition(name, sassToken));\n }\n\n public appendBlankLine() {\n this.append(new BlankLineSassToken());\n }\n\n public appendUse(value: string, as_?: string) {\n this.append(new UseSassToken(value, as_));\n }\n\n public format(): string {\n return this.sassTokens.map((sassToken) => sassToken).join(this.SEPARATOR);\n }\n}\n\nexport class SassMap extends ValueSassToken {\n private readonly MAP_OPEN = '(';\n private readonly MAP_CLOSE = ')';\n private readonly MAP_VALUE_SEPARATOR = ',\\n';\n\n private readonly SEPARATOR = '\\n';\n\n private readonly values: Map<SassMapKey, SassMapValue>;\n\n constructor(indentationLevel: number, values?: SassMapValues) {\n super(indentationLevel);\n this.values = new Map<SassMapKey, SassMapValue>(values ? this.sassMapValuesToIter(values) : undefined);\n }\n\n public set(key: SassMapKey, value: SassMapValue) {\n this.values.set(key, value);\n }\n\n public extend(values: SassMapValues) {\n for (const [key, value] of this.sassMapValuesToIter(values)) {\n this.set(key, value);\n }\n }\n\n public setMap(key: SassMapKey, values: SassMapValues) {\n const nestedMap = this.createMap(values);\n this.set(key, nestedMap);\n return nestedMap;\n }\n\n public format(): string {\n return [\n this.MAP_OPEN,\n Array.from(\n this.values\n .entries()\n .map(([key, value]) => new StringSassToken(`\"${key}\": ${value}`, this.indentationLevel + 1)),\n ).join(this.MAP_VALUE_SEPARATOR),\n new StringSassToken(this.MAP_CLOSE, this.indentationLevel),\n ].join(this.SEPARATOR);\n }\n\n private sassMapValuesToIter(values: SassMapValues) {\n return Symbol.iterator in values && typeof values[Symbol.iterator] === 'function' ? values : Object.entries(values);\n }\n}\n\nexport class UseSassToken extends StringSassToken {\n constructor(value: string, as_?: string) {\n const valueQuoted = `\"${value}\"`;\n const atUseUrl = as_ ? `${valueQuoted} as ${as_}` : valueQuoted;\n super(`@use ${atUseUrl};`);\n }\n}\n\nexport class VariableDefinitionSassToken extends SassToken {\n constructor(\n indentationLevel: number,\n public readonly name: string,\n public readonly value: SassToken,\n ) {\n super(indentationLevel);\n }\n\n public format(): string {\n return `${this.name}: ${this.value};`;\n }\n}\n","import { type BuildHookOptions, MULTI_VALUE } from '@terrazzo/parser';\nimport { cachedMatcher, FORMAT_ID, type SassPluginOptions } from './lib.js';\nimport { CssVarReferenceSassToken, RootSassToken, type SassMapKey, type SassMapValue, type SassToken } from './node.js';\n\nexport interface BuildParams {\n getTransforms: BuildHookOptions['getTransforms'];\n options?: SassPluginOptions;\n}\n\nconst FONT_SHORTHAND_PROPERTIES = [\n 'font-family',\n 'font-size',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n];\n\nconst SASS_HEADER = `////\n/// Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n////\n`;\n\nconst SASS_LIB = `@function token($tokenName) {\n @if not map.has-key($__token-values, $tokenName) {\n @error 'No token named \"#{$tokenName}\"';\n }\n\n $token: map.get($__token-values, $tokenName);\n\n @if $token == \"__tz-error-typography\" {\n @error \"This is a typography mixin. Use \\`@include typography(\"#{tokenId}\")\\` instead.\";\n }\n\n @return $token;\n}\n\n@mixin typography($tokenName) {\n @if not map.has-key($__token-typography-mixins, $tokenName) {\n @error 'No typography mixin named \"#{$tokenName}\"';\n }\n\n $mixin: map.get($__token-typography-mixins, $tokenName);\n\n @each $_property, $_value in $mixin {\n #{$_property}: #{$_value};\n }\n}\n`;\n\nexport default async function build({ getTransforms, options }: BuildParams): Promise<string> {\n const root = new RootSassToken();\n root.appendString(SASS_HEADER);\n root.appendUse('sass:list');\n root.appendUse('sass:map');\n root.appendBlankLine();\n\n const tokenValuesMap = root.createMap();\n\n const exclude = options?.exclude ? cachedMatcher.tokenIDMatch(options.exclude) : undefined;\n\n for (const token of getTransforms({ format: FORMAT_ID })) {\n if (exclude?.(token.id)) {\n continue;\n }\n const tokenName = token.localID ?? token.id;\n if (token.token.$type === 'typography' && token.type === MULTI_VALUE) {\n const tokenValue = token.value;\n const typographySassVars = new Map<SassMapKey, SassToken>(\n Object.keys(tokenValue).map((key) => [\n `${token.id}.${key}`,\n new CssVarReferenceSassToken(`${tokenName}-${key}`),\n ]),\n );\n if ('font-size' in tokenValue && 'font-family' in tokenValue) {\n typographySassVars.set(token.id, new CssVarReferenceSassToken(tokenName));\n }\n tokenValuesMap.extend(typographySassVars);\n } else {\n tokenValuesMap.set(token.id, new CssVarReferenceSassToken(tokenName));\n }\n }\n root.appendVariableDefinition('$__token-values', tokenValuesMap);\n root.appendBlankLine();\n const tokenTypographyMixinsMap = root.createMap();\n\n for (const token of getTransforms({ format: 'css', $type: 'typography' })) {\n if (typeof token.value === 'string') {\n continue;\n }\n const tokenName = token.localID ?? token.id;\n const values = { ...token.value };\n const fontMap = tokenTypographyMixinsMap.createMap();\n if ('font-size' in token.value && 'font-family' in token.value) {\n fontMap.set('font', new CssVarReferenceSassToken(`${tokenName}`));\n for (const property of FONT_SHORTHAND_PROPERTIES) {\n delete values[property];\n }\n }\n fontMap.extend(\n Object.keys(values).map(\n (propertyName) =>\n [propertyName, new CssVarReferenceSassToken(`${tokenName}-${propertyName}`)] as [SassMapKey, SassMapValue],\n ),\n );\n tokenTypographyMixinsMap.set(token.id, fontMap);\n }\n\n root.appendVariableDefinition('$__token-typography-mixins', tokenTypographyMixinsMap);\n root.appendBlankLine();\n root.appendString(SASS_LIB);\n return root.toString();\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport { FORMAT_ID as CSS_FORMAT_ID } from '@terrazzo/plugin-css';\nimport build from './build.js';\nimport { FORMAT_ID, type SassPluginOptions } from './lib.js';\n\nexport * from './build.js';\nexport * from './lib.js';\nexport * from './node.js';\n\nexport default function pluginSass(options?: SassPluginOptions): Plugin {\n const filename = options?.filename ?? 'index.scss';\n\n return {\n name: '@terrazzo/plugin-sass',\n enforce: 'post',\n config(config) {\n // plugin-css is required for transforms. throw error\n if (!config.plugins.some((p) => p.name === '@terrazzo/plugin-css')) {\n throw new Error(\n `@terrazzo/plugin-sass relies on @terrazzo/plugin-css.\nPlease install @terrazzo/plugin-css and follow setup to add to your config.`,\n );\n }\n },\n\n async transform({ getTransforms, setTransform }) {\n const tokens = getTransforms({ format: CSS_FORMAT_ID });\n for (const token of tokens) {\n const value = `var(${token.localID})`;\n\n // TODO: don’t embed listingName into plugin-sass\n let listingName = `token(\"${token.token.id}\")`;\n if (token.token.$type === 'typography') {\n listingName = `typography(\"${token.token.id}\")`;\n }\n\n setTransform(token.id, {\n format: FORMAT_ID,\n localID: token.id,\n value,\n meta: { 'token-listing': { name: listingName } },\n });\n }\n },\n\n async build({ getTransforms, outputFile }) {\n const output = await build({ getTransforms, options });\n outputFile(filename, output);\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terrazzo/plugin-sass",
3
- "version": "2.0.0-beta.4",
3
+ "version": "2.0.0-beta.6",
4
4
  "description": "Generate .scss from your DTCG design tokens JSON.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,18 +27,17 @@
27
27
  "directory": "packages/plugin-sass"
28
28
  },
29
29
  "peerDependencies": {
30
- "@terrazzo/cli": "^2.0.0-beta.4",
31
- "@terrazzo/parser": "^2.0.0-beta.4",
32
- "@terrazzo/plugin-css": "^2.0.0-beta.4"
30
+ "@terrazzo/cli": "^2.0.0-beta.6",
31
+ "@terrazzo/parser": "^2.0.0-beta.6",
32
+ "@terrazzo/plugin-css": "^2.0.0-beta.6"
33
33
  },
34
34
  "dependencies": {
35
- "wildcard-match": "^5.1.4",
36
- "@terrazzo/token-tools": "^2.0.0-beta.4"
35
+ "@terrazzo/token-tools": "^2.0.0-beta.6"
37
36
  },
38
37
  "devDependencies": {
39
- "@terrazzo/cli": "^2.0.0-beta.4",
40
- "@terrazzo/parser": "^2.0.0-beta.4",
41
- "@terrazzo/plugin-css": "^2.0.0-beta.4"
38
+ "@terrazzo/cli": "^2.0.0-beta.6",
39
+ "@terrazzo/parser": "^2.0.0-beta.6",
40
+ "@terrazzo/plugin-css": "^2.0.0-beta.6"
42
41
  },
43
42
  "scripts": {
44
43
  "build": "rolldown -c && attw --profile esm-only --pack .",