dispersa 0.3.0 → 0.4.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/dist/index.js CHANGED
@@ -5880,6 +5880,32 @@ var TokenParser = class {
5880
5880
  };
5881
5881
 
5882
5882
  // src/build/pipeline/token-pipeline.ts
5883
+ var ROOT_REF_PATTERN = /\.\$root\}/g;
5884
+ function rewriteRootReferences(value) {
5885
+ if (typeof value === "string") {
5886
+ return ROOT_REF_PATTERN.test(value) ? value.replace(ROOT_REF_PATTERN, "}") : value;
5887
+ }
5888
+ if (Array.isArray(value)) {
5889
+ let changed = false;
5890
+ const mapped = value.map((item) => {
5891
+ const rewritten = rewriteRootReferences(item);
5892
+ if (rewritten !== item) changed = true;
5893
+ return rewritten;
5894
+ });
5895
+ return changed ? mapped : value;
5896
+ }
5897
+ if (typeof value === "object" && value !== null) {
5898
+ let changed = false;
5899
+ const result = {};
5900
+ for (const [k, v] of Object.entries(value)) {
5901
+ const rewritten = rewriteRootReferences(v);
5902
+ if (rewritten !== v) changed = true;
5903
+ result[k] = rewritten;
5904
+ }
5905
+ return changed ? result : value;
5906
+ }
5907
+ return value;
5908
+ }
5883
5909
  var TokenPipeline = class {
5884
5910
  options;
5885
5911
  validationHandler;
@@ -5904,8 +5930,9 @@ var TokenPipeline = class {
5904
5930
  * 5. Resolve JSON Pointer references
5905
5931
  * 6. Parse and flatten token structure
5906
5932
  * 7. Resolve alias references
5907
- * 8. Apply filters (if provided) runs first to remove tokens before transforms
5908
- * 9. Apply transforms (if provided) — runs on the already-filtered token set
5933
+ * 8. Strip $root from token names/paths (DTCG structural mechanism, transparent in output)
5934
+ * 9. Apply filters (if provided) — runs first to remove tokens before transforms
5935
+ * 10. Apply transforms (if provided) — runs on the already-filtered token set
5909
5936
  *
5910
5937
  * Each stage is explicitly typed to ensure correct order and prevent temporal coupling.
5911
5938
  *
@@ -5945,7 +5972,8 @@ var TokenPipeline = class {
5945
5972
  const refResolved = await this.resolveReferences(preprocessed);
5946
5973
  const flattened = this.flattenTokens(refResolved);
5947
5974
  const aliasResolved = this.resolveAliases(flattened);
5948
- const filtered = this.applyFilterStage(aliasResolved, filterList);
5975
+ const rootStripped = this.stripRootTokenNames(aliasResolved);
5976
+ const filtered = this.applyFilterStage(rootStripped, filterList);
5949
5977
  return this.applyTransformStage(filtered, transformList);
5950
5978
  }
5951
5979
  /**
@@ -6030,8 +6058,34 @@ var TokenPipeline = class {
6030
6058
  return { ...rest, aliasResolvedTokens };
6031
6059
  }
6032
6060
  /**
6033
- * Stage 8: Apply filters to final tokens (before transforms to skip unnecessary work)
6061
+ * Stage 8: Strip `$root` from token names and paths.
6062
+ *
6063
+ * `$root` is a DTCG structural mechanism that allows a group to carry a
6064
+ * default value alongside child tokens. References must use the full path
6065
+ * (`{color.action.brand.$root}`) for alias resolution, but `$root` should
6066
+ * be transparent in output. This stage re-keys tokens so downstream
6067
+ * consumers (filters, transforms, renderers) see clean names.
6034
6068
  */
6069
+ stripRootTokenNames(stage) {
6070
+ const tokens = stage.aliasResolvedTokens;
6071
+ const result = {};
6072
+ for (const [key, token] of Object.entries(tokens)) {
6073
+ const rewrittenOriginal = rewriteRootReferences(token.originalValue);
6074
+ if (!key.endsWith(".$root")) {
6075
+ result[key] = rewrittenOriginal !== token.originalValue ? { ...token, originalValue: rewrittenOriginal } : token;
6076
+ continue;
6077
+ }
6078
+ const strippedPath = token.path.filter((segment) => segment !== "$root");
6079
+ const strippedName = strippedPath.join(".");
6080
+ result[strippedName] = {
6081
+ ...token,
6082
+ path: strippedPath,
6083
+ name: strippedName,
6084
+ originalValue: rewrittenOriginal
6085
+ };
6086
+ }
6087
+ return { ...stage, aliasResolvedTokens: result };
6088
+ }
6035
6089
  applyFilterStage(stage, filterList) {
6036
6090
  let tokens = stage.aliasResolvedTokens;
6037
6091
  if (filterList !== void 0 && filterList.length > 0) {