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.cjs CHANGED
@@ -5907,6 +5907,32 @@ var TokenParser = class {
5907
5907
  };
5908
5908
 
5909
5909
  // src/build/pipeline/token-pipeline.ts
5910
+ var ROOT_REF_PATTERN = /\.\$root\}/g;
5911
+ function rewriteRootReferences(value) {
5912
+ if (typeof value === "string") {
5913
+ return ROOT_REF_PATTERN.test(value) ? value.replace(ROOT_REF_PATTERN, "}") : value;
5914
+ }
5915
+ if (Array.isArray(value)) {
5916
+ let changed = false;
5917
+ const mapped = value.map((item) => {
5918
+ const rewritten = rewriteRootReferences(item);
5919
+ if (rewritten !== item) changed = true;
5920
+ return rewritten;
5921
+ });
5922
+ return changed ? mapped : value;
5923
+ }
5924
+ if (typeof value === "object" && value !== null) {
5925
+ let changed = false;
5926
+ const result = {};
5927
+ for (const [k, v] of Object.entries(value)) {
5928
+ const rewritten = rewriteRootReferences(v);
5929
+ if (rewritten !== v) changed = true;
5930
+ result[k] = rewritten;
5931
+ }
5932
+ return changed ? result : value;
5933
+ }
5934
+ return value;
5935
+ }
5910
5936
  var TokenPipeline = class {
5911
5937
  options;
5912
5938
  validationHandler;
@@ -5931,8 +5957,9 @@ var TokenPipeline = class {
5931
5957
  * 5. Resolve JSON Pointer references
5932
5958
  * 6. Parse and flatten token structure
5933
5959
  * 7. Resolve alias references
5934
- * 8. Apply filters (if provided) runs first to remove tokens before transforms
5935
- * 9. Apply transforms (if provided) — runs on the already-filtered token set
5960
+ * 8. Strip $root from token names/paths (DTCG structural mechanism, transparent in output)
5961
+ * 9. Apply filters (if provided) — runs first to remove tokens before transforms
5962
+ * 10. Apply transforms (if provided) — runs on the already-filtered token set
5936
5963
  *
5937
5964
  * Each stage is explicitly typed to ensure correct order and prevent temporal coupling.
5938
5965
  *
@@ -5972,7 +5999,8 @@ var TokenPipeline = class {
5972
5999
  const refResolved = await this.resolveReferences(preprocessed);
5973
6000
  const flattened = this.flattenTokens(refResolved);
5974
6001
  const aliasResolved = this.resolveAliases(flattened);
5975
- const filtered = this.applyFilterStage(aliasResolved, filterList);
6002
+ const rootStripped = this.stripRootTokenNames(aliasResolved);
6003
+ const filtered = this.applyFilterStage(rootStripped, filterList);
5976
6004
  return this.applyTransformStage(filtered, transformList);
5977
6005
  }
5978
6006
  /**
@@ -6057,8 +6085,34 @@ var TokenPipeline = class {
6057
6085
  return { ...rest, aliasResolvedTokens };
6058
6086
  }
6059
6087
  /**
6060
- * Stage 8: Apply filters to final tokens (before transforms to skip unnecessary work)
6088
+ * Stage 8: Strip `$root` from token names and paths.
6089
+ *
6090
+ * `$root` is a DTCG structural mechanism that allows a group to carry a
6091
+ * default value alongside child tokens. References must use the full path
6092
+ * (`{color.action.brand.$root}`) for alias resolution, but `$root` should
6093
+ * be transparent in output. This stage re-keys tokens so downstream
6094
+ * consumers (filters, transforms, renderers) see clean names.
6061
6095
  */
6096
+ stripRootTokenNames(stage) {
6097
+ const tokens = stage.aliasResolvedTokens;
6098
+ const result = {};
6099
+ for (const [key, token] of Object.entries(tokens)) {
6100
+ const rewrittenOriginal = rewriteRootReferences(token.originalValue);
6101
+ if (!key.endsWith(".$root")) {
6102
+ result[key] = rewrittenOriginal !== token.originalValue ? { ...token, originalValue: rewrittenOriginal } : token;
6103
+ continue;
6104
+ }
6105
+ const strippedPath = token.path.filter((segment) => segment !== "$root");
6106
+ const strippedName = strippedPath.join(".");
6107
+ result[strippedName] = {
6108
+ ...token,
6109
+ path: strippedPath,
6110
+ name: strippedName,
6111
+ originalValue: rewrittenOriginal
6112
+ };
6113
+ }
6114
+ return { ...stage, aliasResolvedTokens: result };
6115
+ }
6062
6116
  applyFilterStage(stage, filterList) {
6063
6117
  let tokens = stage.aliasResolvedTokens;
6064
6118
  if (filterList !== void 0 && filterList.length > 0) {