@greensight/gts 1.0.0-alpha.14 → 1.0.0-alpha.15

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/index.cjs CHANGED
@@ -1,19 +1,19 @@
1
- "use strict";var z=Object.defineProperty;var K=(n,e,t)=>e in n?z(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var y=(n,e,t)=>K(n,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("path"),D=require("ts-import"),j=require("node:fs"),m=require("node:fs/promises"),M=require("node:path"),h=class h{static resolveReadPath(e){if(!e||!e.trim())throw new Error("File path must be a non-empty string");return M.resolve(h.baseDir,e)}static resolveWritePath(e,t){const r=M.resolve(h.baseDir,t??"");return{targetDir:r,targetPath:M.resolve(r,e)}}static handleReadError(e,t){throw e.code==="ENOENT"?new Error(`File not found: ${t}`):new Error(`Failed to read file "${t}": ${e.message??String(e)}`)}static async read(e,t="utf8"){const r=h.resolveReadPath(e);try{return await m.readFile(r,{encoding:t})}catch(o){h.handleReadError(o,r)}}static async readBuffer(e){const t=h.resolveReadPath(e);try{return await m.readFile(t)}catch(r){h.handleReadError(r,t)}}static async readJson(e){const t=h.resolveReadPath(e);try{const r=await m.readFile(t,{encoding:"utf8"});try{return JSON.parse(r)}catch(o){throw new Error(`Failed to parse JSON from "${t}": ${o.message}`)}}catch(r){h.handleReadError(r,t)}}static async write(e,t="",r={}){const{directory:o,overwrite:s=!0}=r,{targetDir:a,targetPath:i}=h.resolveWritePath(e,o);if(!s&&j.existsSync(i))throw new Error(`File ${i} already exists`);return await m.mkdir(a,{recursive:!0}),await m.writeFile(i,t,{encoding:"utf8"}),i}static async writeWithExtension(e,t,r="",o){const s=t.startsWith(".")?t:`.${t}`,a=`${e}${s}`;return h.write(a,r,o)}static exists(e){const t=h.resolveReadPath(e);return j.existsSync(t)}static async delete(e,t){const{targetPath:r}=h.resolveWritePath(e,t);j.existsSync(r)&&await m.rm(r,{force:!0})}};y(h,"baseDir",process.cwd());let d=h;const k=class k{static async create(){if(d.exists(k.configFileName))throw new Error("The file already exists");await d.write(k.configFileName,"",{overwrite:!1})}async load(){try{const e=await D.tsImport.compile(`${b.resolve(process.cwd(),k.configFileName)}`);if(!e)throw new Error;return e.default}catch(e){console.error("Cannot find module gts.config.ts",e)}}};y(k,"configFileName","gts.config.ts");let S=k;const H=n=>{const e=new URLSearchParams;return Object.keys(n).forEach(t=>{Array.isArray(n[t])?n[t].forEach(r=>e.append(`${t}[]`,r)):e.append(t,n[t])}),e},U=(n,e=50)=>{const t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,r+e));return t};class E{constructor(e,t){y(this,"figmaToken");y(this,"fileId");y(this,"onTimeMeasureHandler");this.figmaToken=e,this.fileId=t}setOnTimeMeasureHandler(e){this.onTimeMeasureHandler=e}static async returnJSON(e){const t=await e.json();if(!e.ok){let r="Request failed";throw new Error(r)}return t}async performControlledRequest(e,{params:t={},timeout:r=3e4,abortController:o=new AbortController}={}){var p;if(!this.figmaToken||!this.fileId)throw new Error("Добавьте figmaToken и figmaId");const s=Object.entries(t).reduce((w,[q,C])=>typeof C<"u"?{...w,[q]:C}:w,{}),a=`https://api.figma.com/v1${e}${s&&Object.keys(s).length?`?${H(s)}`:""}`;console.log("endpoinWithParams=",a);const i=setTimeout(()=>o.abort(),r),l={"Content-Type":"application/json",...this.figmaToken&&{"X-Figma-Token":this.figmaToken}},c={method:"GET",headers:l,signal:o.signal},u=performance.now(),f=await fetch(`${a}`,c);clearTimeout(i);const g=performance.now()-u;return(p=this.onTimeMeasureHandler)==null||p.call(this,a,l,g),f}async request(e,t){var o;const r=await this.performControlledRequest(e,{...t});return(o=r.headers.get("content-type"))!=null&&o.includes("application/json")?E.returnJSON(r):r}async getComponents(){return this.request(`/files/${this.fileId}/components`)}async getStyles(){return this.request(`/files/${this.fileId}/styles`)}async getNodes(e){const t=U(e).map(s=>this.request(`/files/${this.fileId}/nodes`,{params:{ids:s.join(",")}})),r=await Promise.all(t);return{...r[0],nodes:r.reduce((s,a)=>({...s,...a.nodes}),{})}}}const Q=(n,e)=>{const t=Array.isArray(e)?e:e.split(".");let r=n;for(const o of t){if(r==null||typeof r!="object")return;r=r[o]}return r},B=(n,e)=>{if(!e||typeof e!="object")return n;if(!n||typeof n!="object")return e;const t={...n};for(const r in e)e.hasOwnProperty(r)&&(typeof e[r]=="object"&&e[r]!==null&&typeof t[r]=="object"&&t[r]!==null?t[r]=B(t[r],e[r]):t[r]=e[r]);return t};function F(n,e){if(n===e)return!0;if(n==null||e==null)return n===e;if(typeof n!=typeof e)return!1;if(n instanceof Date&&e instanceof Date)return n.getTime()===e.getTime();if(n instanceof RegExp&&e instanceof RegExp)return n.toString()===e.toString();if(Array.isArray(n)&&Array.isArray(e)){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(!F(n[t],e[t]))return!1;return!0}if(typeof n=="object"&&typeof e=="object"){const t=Object.keys(n),r=Object.keys(e);if(t.length!==r.length)return!1;for(const o of t)if(!r.includes(o)||!F(n[o],e[o]))return!1;return!0}return!1}const O={color:{},effect:{},text:{},grid:{}};class L{constructor(e){y(this,"tokensDir");y(this,"manifestPath");y(this,"variables");y(this,"styles");y(this,"loaded",!1);this.tokensDir=e||"",this.manifestPath=b.join(this.tokensDir,"manifest.json")}isLoaded(){return this.loaded&&!!this.variables&&!!this.styles}normalizeKey(e){const t=e.trim();return t&&t.replace(/[-_\s]+/g," ").split(" ").filter(r=>r.length).map((r,o)=>{const s=r.charAt(0),a=r.slice(1);return o===0?r.toLowerCase():s.toUpperCase()+a}).join("")}parseVariableString(e){if(typeof e!="string")return e;const t=/^\{(.+)\}$/,r=e.match(t);if(r){const o=r[1].trim();return`{${this.normalizeKey(o)}}`}return e}createVariableFileList(e){return Object.entries(e).flatMap(([t,r])=>Object.entries(r.modes).flatMap(([o,s])=>s.map(a=>({fileName:a,modeName:this.normalizeKey(o.trim()),collectionName:t}))))}parseValue(e){return e&&(typeof e=="string"?this.parseVariableString(e):typeof e!="object"?e:Array.isArray(e)?e.map(t=>this.parseValue(t)):Object.entries(e).reduce((t,[r,o])=>({...t,[r]:this.parseValue(o)}),{}))}getTokensFromFile(e,t){return Object.entries(e).reduce((r,[o,s])=>"$type"in s&&"$value"in s?{...r,[this.normalizeKey(o)]:{type:s.$type,description:s.$description,value:t?{[this.normalizeKey(t)]:this.parseValue(s.$value)}:this.parseValue(s.$value)}}:{...r,[this.normalizeKey(o)]:this.getTokensFromFile(s,t)},{})}processTokensFile(e,t,r){const o=this.normalizeKey(r),s=this.getTokensFromFile(e,t);return{[o]:s}}async loadVariableFiles(e){return Promise.all(e.map(async({fileName:t,modeName:r,collectionName:o})=>{try{const s=b.join(this.tokensDir,t),a=await d.readJson(s);return this.processTokensFile(a,r,o)}catch(s){return console.warn(`Failed to load variable file: ${b.join(this.tokensDir,t)}`,s),{}}}))}mergeVariables(e){return e.reduce((t,r)=>B(t,r),{})}async loadTokenVariables(e){try{const t=this.createVariableFileList(e),r=await this.loadVariableFiles(t);return this.mergeVariables(r)}catch(t){throw new Error(`Failed to load token variables from ${this.tokensDir}: ${t}`)}}createStyleFileList(e){return Object.entries(e).flatMap(([t,r])=>(r==null?void 0:r.map(o=>({styleType:t,fileName:o})))||[])}async loadStyleFiles(e){return(await Promise.all(e.map(async({styleType:r,fileName:o})=>{try{const s=b.join(this.tokensDir,o),a=await d.readJson(s);return{styleType:r,styleTokens:a}}catch(s){return console.warn(`Failed to load style file: ${b.join(this.tokensDir,o)}`,s),{styleType:r,styleTokens:{}}}}))).reduce((r,o)=>({...r,[o.styleType]:this.getTokensFromFile(o.styleTokens,"")}),{...O})}async loadStyles(e){if(!e)return{...O};const t=this.createStyleFileList(e);return await this.loadStyleFiles(t)}async load(){if(this.loaded)return;const e=await d.readJson(this.manifestPath);if(!e)throw new Error(`Failed to load manifest file from: ${this.manifestPath}`);this.variables=await this.loadTokenVariables(e.collections),this.styles=await this.loadStyles(e.styles),this.loaded=!0}getVariables(){if(!this.loaded||!this.variables)throw new Error("Tokens not loaded. Call load() first.");return this.variables}getStyles(){if(!this.loaded||!this.styles)throw new Error("Tokens not loaded. Call load() first.");return this.styles}isVariableReference(e){return typeof e!="string"?!1:/^\{.+\}$/.test(e)}getVariablePath(e){return e.slice(1,-1)}resolveVariableValue(e){if(typeof e=="object")return Object.keys(e).reduce((t,r)=>{const o=e[r],s=this.resolveVariableValueString(o,r);return s&&(t[r]=s),t},{})}resolveVariableValueString(e,t){if(!this.isVariableReference(e))return e;const r=this.getVariablePath(e),o=this.getToken(r,t);if(o)return this.resolveVariableValueString(o,t)}getToken(e,t){if(!this.loaded||!this.variables)throw new Error("Tokens not loaded. Call load() first.");for(const r of Object.values(this.variables)){const o=Q(r,e);if(o!=null&&o.value&&typeof o.value=="object"){if(t)return o.value[t];{const s=Object.keys(o.value)[0];return o.value[s]}}}}}const X=async()=>{const e=await new S().load();if(!e)throw new Error("Заполнить ошибку через нейронку");const{figmaToken:t,fileId:r,modules:o,manifest:s}=e,a=new E(t,r),i=new L(s);s&&d.exists(s)&&await i.load(),await Promise.all(o.map(l=>l.executor({figmaApiClient:a,tokenManagerClient:i})))},Y=async()=>{await S.create(),console.log("\x1B[32m%s\x1B[0m","✔️ Configuration file created gts.config.ts")},v=["xxxl","xxl","xl","lg","md","sm","xs","xxs","xxxs"],Z=n=>parseInt(n.value,10),A=n=>n.reduce((e,t)=>({...e,[t.name]:Z(t)}),{}),_=async(n,e)=>{await d.delete(n,e)},ee=async(n,e,t)=>{await d.write(n,e,{directory:t})},$=async(n,e,t)=>{await _(n,t),await ee(n,e,t)},te=(n,e)=>{if(!e.length)return"";const t=e.map(r=>` ${r}`).join(`
1
+ "use strict";var z=Object.defineProperty;var K=(n,e,t)=>e in n?z(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var y=(n,e,t)=>K(n,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("path"),D=require("ts-import"),j=require("node:fs"),m=require("node:fs/promises"),M=require("node:path"),h=class h{static resolveReadPath(e){if(!e||!e.trim())throw new Error("File path must be a non-empty string");return M.resolve(h.baseDir,e)}static resolveWritePath(e,t){const r=M.resolve(h.baseDir,t??"");return{targetDir:r,targetPath:M.resolve(r,e)}}static handleReadError(e,t){throw e.code==="ENOENT"?new Error(`File not found: ${t}`):new Error(`Failed to read file "${t}": ${e.message??String(e)}`)}static async read(e,t="utf8"){const r=h.resolveReadPath(e);try{return await m.readFile(r,{encoding:t})}catch(o){h.handleReadError(o,r)}}static async readBuffer(e){const t=h.resolveReadPath(e);try{return await m.readFile(t)}catch(r){h.handleReadError(r,t)}}static async readJson(e){const t=h.resolveReadPath(e);try{const r=await m.readFile(t,{encoding:"utf8"});try{return JSON.parse(r)}catch(o){throw new Error(`Failed to parse JSON from "${t}": ${o.message}`)}}catch(r){h.handleReadError(r,t)}}static async write(e,t="",r={}){const{directory:o,overwrite:s=!0}=r,{targetDir:a,targetPath:i}=h.resolveWritePath(e,o);if(!s&&j.existsSync(i))throw new Error(`File ${i} already exists`);return await m.mkdir(a,{recursive:!0}),await m.writeFile(i,t,{encoding:"utf8"}),i}static async writeWithExtension(e,t,r="",o){const s=t.startsWith(".")?t:`.${t}`,a=`${e}${s}`;return h.write(a,r,o)}static exists(e){const t=h.resolveReadPath(e);return j.existsSync(t)}static async delete(e,t){const{targetPath:r}=h.resolveWritePath(e,t);j.existsSync(r)&&await m.rm(r,{force:!0})}};y(h,"baseDir",process.cwd());let d=h;const k=class k{static async create(){if(d.exists(k.configFileName))throw new Error("The file already exists");await d.write(k.configFileName,"",{overwrite:!1})}async load(){try{const e=await D.tsImport.compile(`${b.resolve(process.cwd(),k.configFileName)}`);if(!e)throw new Error;return e.default}catch(e){console.error("Cannot find module gts.config.ts",e)}}};y(k,"configFileName","gts.config.ts");let S=k;const H=n=>{const e=new URLSearchParams;return Object.keys(n).forEach(t=>{Array.isArray(n[t])?n[t].forEach(r=>e.append(`${t}[]`,r)):e.append(t,n[t])}),e},U=(n,e=50)=>{const t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,r+e));return t};class v{constructor(e,t){y(this,"figmaToken");y(this,"fileId");y(this,"onTimeMeasureHandler");this.figmaToken=e,this.fileId=t}setOnTimeMeasureHandler(e){this.onTimeMeasureHandler=e}static async returnJSON(e){const t=await e.json();if(!e.ok){let r="Request failed";throw new Error(r)}return t}async performControlledRequest(e,{params:t={},timeout:r=3e4,abortController:o=new AbortController}={}){var p;if(!this.figmaToken||!this.fileId)throw new Error("Добавьте figmaToken и figmaId");const s=Object.entries(t).reduce((w,[q,C])=>typeof C<"u"?{...w,[q]:C}:w,{}),a=`https://api.figma.com/v1${e}${s&&Object.keys(s).length?`?${H(s)}`:""}`;console.log("endpoinWithParams=",a);const i=setTimeout(()=>o.abort(),r),l={"Content-Type":"application/json",...this.figmaToken&&{"X-Figma-Token":this.figmaToken}},c={method:"GET",headers:l,signal:o.signal},u=performance.now(),f=await fetch(`${a}`,c);clearTimeout(i);const g=performance.now()-u;return(p=this.onTimeMeasureHandler)==null||p.call(this,a,l,g),f}async request(e,t){var o;const r=await this.performControlledRequest(e,{...t});return(o=r.headers.get("content-type"))!=null&&o.includes("application/json")?v.returnJSON(r):r}async getComponents(){return this.request(`/files/${this.fileId}/components`)}async getStyles(){return this.request(`/files/${this.fileId}/styles`)}async getNodes(e){const t=U(e).map(s=>this.request(`/files/${this.fileId}/nodes`,{params:{ids:s.join(",")}})),r=await Promise.all(t);return{...r[0],nodes:r.reduce((s,a)=>({...s,...a.nodes}),{})}}}const Q=(n,e)=>{const t=Array.isArray(e)?e:e.split(".");let r=n;for(const o of t){if(r==null||typeof r!="object")return;r=r[o]}return r},B=(n,e)=>{if(!e||typeof e!="object")return n;if(!n||typeof n!="object")return e;const t={...n};for(const r in e)e.hasOwnProperty(r)&&(typeof e[r]=="object"&&e[r]!==null&&typeof t[r]=="object"&&t[r]!==null?t[r]=B(t[r],e[r]):t[r]=e[r]);return t};function F(n,e){if(n===e)return!0;if(n==null||e==null)return n===e;if(typeof n!=typeof e)return!1;if(n instanceof Date&&e instanceof Date)return n.getTime()===e.getTime();if(n instanceof RegExp&&e instanceof RegExp)return n.toString()===e.toString();if(Array.isArray(n)&&Array.isArray(e)){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(!F(n[t],e[t]))return!1;return!0}if(typeof n=="object"&&typeof e=="object"){const t=Object.keys(n),r=Object.keys(e);if(t.length!==r.length)return!1;for(const o of t)if(!r.includes(o)||!F(n[o],e[o]))return!1;return!0}return!1}const O={color:{},effect:{},text:{},grid:{}};class L{constructor(e){y(this,"tokensDir");y(this,"manifestPath");y(this,"variables");y(this,"styles");y(this,"loaded",!1);this.tokensDir=e||"",this.manifestPath=b.join(this.tokensDir,"manifest.json")}isLoaded(){return this.loaded&&!!this.variables&&!!this.styles}normalizeKey(e){const t=e.trim();return t&&t.replace(/[-_\s]+/g," ").split(" ").filter(r=>r.length).map((r,o)=>{const s=r.charAt(0),a=r.slice(1);return o===0?r.toLowerCase():s.toUpperCase()+a}).join("")}parseVariableString(e){if(typeof e!="string")return e;const t=/^\{(.+)\}$/,r=e.match(t);if(r){const o=r[1].trim();return`{${this.normalizeKey(o)}}`}return e}createVariableFileList(e){return Object.entries(e).flatMap(([t,r])=>Object.entries(r.modes).flatMap(([o,s])=>s.map(a=>({fileName:a,modeName:this.normalizeKey(o.trim()),collectionName:t}))))}parseValue(e){return e&&(typeof e=="string"?this.parseVariableString(e):typeof e!="object"?e:Array.isArray(e)?e.map(t=>this.parseValue(t)):Object.entries(e).reduce((t,[r,o])=>({...t,[r]:this.parseValue(o)}),{}))}getTokensFromFile(e,t){return Object.entries(e).reduce((r,[o,s])=>"$type"in s&&"$value"in s?{...r,[this.normalizeKey(o)]:{type:s.$type,description:s.$description,value:t?{[this.normalizeKey(t)]:this.parseValue(s.$value)}:this.parseValue(s.$value)}}:{...r,[this.normalizeKey(o)]:this.getTokensFromFile(s,t)},{})}processTokensFile(e,t,r){const o=this.normalizeKey(r),s=this.getTokensFromFile(e,t);return{[o]:s}}async loadVariableFiles(e){return Promise.all(e.map(async({fileName:t,modeName:r,collectionName:o})=>{try{const s=b.join(this.tokensDir,t),a=await d.readJson(s);return this.processTokensFile(a,r,o)}catch(s){return console.warn(`Failed to load variable file: ${b.join(this.tokensDir,t)}`,s),{}}}))}mergeVariables(e){return e.reduce((t,r)=>B(t,r),{})}async loadTokenVariables(e){try{const t=this.createVariableFileList(e),r=await this.loadVariableFiles(t);return this.mergeVariables(r)}catch(t){throw new Error(`Failed to load token variables from ${this.tokensDir}: ${t}`)}}createStyleFileList(e){return Object.entries(e).flatMap(([t,r])=>(r==null?void 0:r.map(o=>({styleType:t,fileName:o})))||[])}async loadStyleFiles(e){return(await Promise.all(e.map(async({styleType:r,fileName:o})=>{try{const s=b.join(this.tokensDir,o),a=await d.readJson(s);return{styleType:r,styleTokens:a}}catch(s){return console.warn(`Failed to load style file: ${b.join(this.tokensDir,o)}`,s),{styleType:r,styleTokens:{}}}}))).reduce((r,o)=>({...r,[o.styleType]:this.getTokensFromFile(o.styleTokens,"")}),{...O})}async loadStyles(e){if(!e)return{...O};const t=this.createStyleFileList(e);return await this.loadStyleFiles(t)}async load(){if(this.loaded)return;const e=await d.readJson(this.manifestPath);if(!e)throw new Error(`Failed to load manifest file from: ${this.manifestPath}`);this.variables=await this.loadTokenVariables(e.collections),this.styles=await this.loadStyles(e.styles),this.loaded=!0}getVariables(){if(!this.loaded||!this.variables)throw new Error("Tokens not loaded. Call load() first.");return this.variables}getStyles(){if(!this.loaded||!this.styles)throw new Error("Tokens not loaded. Call load() first.");return this.styles}isVariableReference(e){return typeof e!="string"?!1:/^\{.+\}$/.test(e)}getVariablePath(e){return e.slice(1,-1)}resolveVariableValue(e){if(typeof e=="object")return Object.keys(e).reduce((t,r)=>{const o=e[r],s=this.resolveVariableValueString(o,r);return s&&(t[r]=s),t},{})}resolveVariableValueString(e,t){if(!this.isVariableReference(e))return e;const r=this.getVariablePath(e),o=this.getToken(r,t);if(o)return this.resolveVariableValueString(o,t)}getToken(e,t){if(!this.loaded||!this.variables)throw new Error("Tokens not loaded. Call load() first.");for(const r of Object.values(this.variables)){const o=Q(r,e);if(o!=null&&o.value&&typeof o.value=="object"){if(t)return o.value[t];{const s=Object.keys(o.value)[0];return o.value[s]}}}}}const X=async()=>{const e=await new S().load();if(!e)throw new Error("Заполнить ошибку через нейронку");const{figmaToken:t,fileId:r,modules:o,manifest:s}=e,a=new v(t,r),i=new L(s);s&&d.exists(s)&&await i.load(),await Promise.all(o.map(l=>l.executor({figmaApiClient:a,tokenManagerClient:i})))},Y=async()=>{await S.create(),console.log("\x1B[32m%s\x1B[0m","✔️ Configuration file created gts.config.ts")},E=["xxxl","xxl","xl","lg","md","sm","xs","xxs","xxxs"],Z=n=>parseInt(n.value,10),A=n=>n.reduce((e,t)=>({...e,[t.name]:Z(t)}),{}),_=async(n,e)=>{await d.delete(n,e)},ee=async(n,e,t)=>{await d.write(n,e,{directory:t})},$=async(n,e,t)=>{await _(n,t),await ee(n,e,t)},te=(n,e)=>{if(!e.length)return"";const t=e.map(r=>` ${r}`).join(`
2
2
  `);return`${n} {
3
3
  ${t}
4
4
  }`},re=n=>n.length?n.join(`
5
- `):"",ne=n=>`--${n}`,oe=n=>`$${n}`,se=n=>n.map(e=>`${ne(e.name)}: ${e.value}px;`),ae=n=>n.map(e=>`${oe(e.name)}: ${e.value}px;`),ie=n=>te(":root",n),le=n=>re(n),ce=n=>{const e=A(n);return JSON.stringify(e)},ue=async(n,e,t,r,o,s,a,i)=>{const l=[];l.push($(s,n,r)),a&&e&&l.push($(a,e,o)),i&&t&&l.push($(i,t,o)),await Promise.all(l)},de=async({breakpointTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,stylesFileName:o,extensions:s})=>{const a=se(n),i=ae(n),l=s.includes("css")?ie(a):null,c=s.includes("scss")?le(i):null,u=s.includes("css")?`${o}.css`:null,f=s.includes("scss")?`${o}.scss`:null,g=ce(n);await ue(g,l,c,e,t,r,u,f)},ge=(n,e)=>{const t=Object.keys(n).filter(s=>!isNaN(Number(s))).sort((s,a)=>Number(s)-Number(a));if(t.length>e.length)throw new Error(`Not enough breakpoint names provided. Found ${t.length} breakpoints in data, but only ${e.length} names specified: ${e.join(", ")}`);const o=Object.keys(n).filter(s=>isNaN(Number(s)));if(o.length>0)throw new Error(`Found non-numeric breakpoint keys in grid data: ${o.join(", ")}. All breakpoint keys must be numeric values.`);return t.map((s,a)=>({name:e[e.length-1-a]||`bp-${s}`,value:s}))},fe=({input:n={},output:{jsonDir:e,stylesDir:t,jsonFileName:r="breakpoints.json",stylesFileName:o="breakpoints"}})=>({name:"breakpoints/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[breakpoints/tokenManager] Generating breakpoints from TokenManager...");const{extensions:a=["css"],names:i=v}=n;if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=s.getStyles();if(!l.grid)throw new Error("No grid styles found in TokenManager. Grid tokens must be loaded.");console.log("[breakpoints/tokenManager] Extracting breakpoints from grid styles...");const c=ge(l.grid,i);if(!c.length){console.warn("[breakpoints/tokenManager] No breakpoints found in grid styles.");return}console.log(`[breakpoints/tokenManager] Found ${c.length} breakpoints: ${c.map(u=>u.name).join(", ")}`),await de({breakpointTokens:c,jsonDir:e,stylesDir:t,jsonFileName:r,stylesFileName:o,extensions:a}),console.log("[breakpoints/tokenManager] Breakpoints generated successfully.")}catch(a){throw console.error("[breakpoints/tokenManager] Error:",a),a}}}),pe=n=>{const e=A(n),t=Object.entries(e).map(([o,s])=>` ${o}: ${s}`).join(`,
5
+ `):"",ne=n=>`--${n}`,oe=n=>`$${n}`,se=n=>n.map(e=>`${ne(e.name)}: ${e.value}px;`),ae=n=>n.map(e=>`${oe(e.name)}: ${e.value}px;`),ie=n=>te(":root",n),le=n=>re(n),ce=n=>{const e=A(n);return JSON.stringify(e)},ue=async(n,e,t,r,o,s,a,i)=>{const l=[];l.push($(s,n,r)),a&&e&&l.push($(a,e,o)),i&&t&&l.push($(i,t,o)),await Promise.all(l)},de=async({breakpointTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,stylesFileName:o,extensions:s})=>{const a=se(n),i=ae(n),l=s.includes("css")?ie(a):null,c=s.includes("scss")?le(i):null,u=s.includes("css")?`${o}.css`:null,f=s.includes("scss")?`${o}.scss`:null,g=ce(n);await ue(g,l,c,e,t,r,u,f)},ge=(n,e)=>{const t=Object.keys(n).filter(s=>!isNaN(Number(s))).sort((s,a)=>Number(s)-Number(a));if(t.length>e.length)throw new Error(`Not enough breakpoint names provided. Found ${t.length} breakpoints in data, but only ${e.length} names specified: ${e.join(", ")}`);const o=Object.keys(n).filter(s=>isNaN(Number(s)));if(o.length>0)throw new Error(`Found non-numeric breakpoint keys in grid data: ${o.join(", ")}. All breakpoint keys must be numeric values.`);return t.map((s,a)=>({name:e[e.length-1-a]||`bp-${s}`,value:s}))},fe=({input:n={},output:{jsonDir:e,stylesDir:t,jsonFileName:r="breakpoints.json",stylesFileName:o="breakpoints"}})=>({name:"breakpoints/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[breakpoints/tokenManager] Generating breakpoints from TokenManager...");const{extensions:a=["css"],names:i=E}=n;if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=s.getStyles();if(!l.grid)throw new Error("No grid styles found in TokenManager. Grid tokens must be loaded.");console.log("[breakpoints/tokenManager] Extracting breakpoints from grid styles...");const c=ge(l.grid,i);if(!c.length){console.warn("[breakpoints/tokenManager] No breakpoints found in grid styles.");return}console.log(`[breakpoints/tokenManager] Found ${c.length} breakpoints: ${c.map(u=>u.name).join(", ")}`),await de({breakpointTokens:c,jsonDir:e,stylesDir:t,jsonFileName:r,stylesFileName:o,extensions:a}),console.log("[breakpoints/tokenManager] Breakpoints generated successfully.")}catch(a){throw console.error("[breakpoints/tokenManager] Error:",a),a}}}),pe=n=>{const e=A(n),t=Object.entries(e).map(([o,s])=>` ${o}: ${s}`).join(`,
6
6
  `),r=n.length>0?n[n.length-1].name:"xxxl";return`$breakpointList: (
7
7
  ${t}
8
8
  );
9
- $defaultBreakpoint: '${r}';`},he=async(n,e,t)=>{await $(t,n,e)},ye=async({breakpointTokens:n,stylesDir:e,fileName:t})=>{const r=pe(n);await he(r,e,`${t}.scss`)},me=(n,e)=>{const t=Object.keys(n).filter(r=>!isNaN(Number(r))).sort((r,o)=>Number(r)-Number(o));if(t.length>e.length)throw new Error(`Not enough breakpoint names provided. Found ${t.length} breakpoints in data, but only ${e.length} names specified: ${e.join(", ")}`);return t.map((r,o)=>({name:e[e.length-1-o]||`bp-${r}`,value:r}))},be=({input:n={},output:{stylesDir:e,fileName:t="breakpointList"}})=>({name:"breakpointsList/tokenManager",executor:async({tokenManagerClient:r})=>{try{console.log("[breakpointsList/tokenManager] Generating SCSS breakpoint map...");const{names:o=v}=n;if(!r.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const s=r.getStyles();if(!s.grid)throw new Error("No grid styles found in TokenManager. Grid tokens must be loaded.");console.log("[breakpointsList/tokenManager] Extracting breakpoints for SCSS map...");const a=me(s.grid,o);if(!a.length){console.warn("[breakpointsList/tokenManager] No breakpoints found in grid styles.");return}console.log(`[breakpointsList/tokenManager] Found ${a.length} breakpoints for map: ${a.map(i=>i.name).join(", ")}`),await ye({breakpointTokens:a,stylesDir:e,fileName:t}),console.log("[breakpointsList/tokenManager] SCSS breakpoint map generated successfully.")}catch(o){throw console.error("[breakpointsList/tokenManager] Error:",o),o}}}),V=(n,e)=>{if(!e.length)return"";const t=e.map(r=>` ${r}`).join(`
9
+ $defaultBreakpoint: '${r}';`},he=async(n,e,t)=>{await $(t,n,e)},ye=async({breakpointTokens:n,stylesDir:e,fileName:t})=>{const r=pe(n);await he(r,e,`${t}.scss`)},me=(n,e)=>{const t=Object.keys(n).filter(r=>!isNaN(Number(r))).sort((r,o)=>Number(r)-Number(o));if(t.length>e.length)throw new Error(`Not enough breakpoint names provided. Found ${t.length} breakpoints in data, but only ${e.length} names specified: ${e.join(", ")}`);return t.map((r,o)=>({name:e[e.length-1-o]||`bp-${r}`,value:r}))},be=({input:n={},output:{stylesDir:e,fileName:t="breakpointList"}})=>({name:"breakpointsList/tokenManager",executor:async({tokenManagerClient:r})=>{try{console.log("[breakpointsList/tokenManager] Generating SCSS breakpoint map...");const{names:o=E}=n;if(!r.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const s=r.getStyles();if(!s.grid)throw new Error("No grid styles found in TokenManager. Grid tokens must be loaded.");console.log("[breakpointsList/tokenManager] Extracting breakpoints for SCSS map...");const a=me(s.grid,o);if(!a.length){console.warn("[breakpointsList/tokenManager] No breakpoints found in grid styles.");return}console.log(`[breakpointsList/tokenManager] Found ${a.length} breakpoints for map: ${a.map(i=>i.name).join(", ")}`),await ye({breakpointTokens:a,stylesDir:e,fileName:t}),console.log("[breakpointsList/tokenManager] SCSS breakpoint map generated successfully.")}catch(o){throw console.error("[breakpointsList/tokenManager] Error:",o),o}}}),V=(n,e)=>{if(!e.length)return"";const t=e.map(r=>` ${r}`).join(`
10
10
  `);return`${n} {
11
11
  ${t}
12
12
  }`},ke=n=>`.${n.replace(/\s+/g,"-").toLowerCase()}`,we=n=>`--${n}`,$e=n=>n.reduce((e,t)=>{const r=we(t.name);return typeof t.value=="object"?Object.entries(t.value).forEach(([o,s])=>{e[o]||(e[o]=[]),e[o].push(`${r}: ${s};`)}):e.root.push(`${r}: ${t.value};`),e},{root:[]}),Se=n=>{const e=V(":root",n.root),t=Object.entries(n).reduce((r,[o,s])=>{if(o==="root"||!s.length)return r;const a=V(ke(o),s);return a&&r.push(a),r},[]).join(`
13
13
 
14
14
  `);return[e,t].filter(Boolean).join(`
15
15
 
16
- `)},Te=n=>{const e=n.reduce((t,r)=>({...t,[r.name]:r.value}),{});return JSON.stringify(e)},je=async(n,e,t,r,o,s)=>{await Promise.all([d.delete(o,t),d.delete(s,r)]);const a=d.write(o,n,{directory:t}),i=d.write(s,e,{directory:r});await Promise.all([a,i])},Me=async({colorTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o})=>{const s=$e(n),a=Se(s),i=Te(n);await je(i,a,e,t,r,o)},T=n=>n.reduce((e,t)=>{const r=Number((t.position*100).toFixed(1));return[...e,`${t.color}${r>0&&r<100?` ${r}%`:""}`]},[]).join(", "),Fe=n=>{const e=T(n.stops);return`linear-gradient(${n.angle}deg, ${e})`},Ee=n=>`radial-gradient(circle, ${T(n.stops)})`,ve=n=>{const e=T(n.stops);return`conic-gradient(from ${n.angle}deg, ${e})`},Ce=n=>{const e=T(n.stops);return`linear-gradient(${n.angle}deg, ${e})`},Oe=n=>typeof n=="string"?n:n.type==="linear"?Fe(n):n.type==="radial"?Ee(n):n.type==="conic"?ve(n):n.type==="diamond"?Ce(n):"",R=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=n[r],s=e?`${e}-${r}`:r;if(o&&typeof o=="object"&&"type"in o&&"value"in o){const i=Object.keys(o.value),l=i.length>1?o.value:o.value[i[0]],c={[s]:Oe(l)};return{...t,...c}}const a=R(o,s);return{...t,...a}},{}),Ve=n=>`cl-${n}`,G=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=n[r];if(o.type&&o.value){const a=typeof o.value=="string"?e.resolveVariableValueString(o.value,r):e.resolveVariableValue(o.value);return a?{...t,[r]:{...o,value:a}}:t}const s=G(o,e);return s?{...t,[r]:s}:t},{}),Pe=({input:n={},output:{jsonDir:e,stylesDir:t,jsonFileName:r="colors.json",cssFileName:o="colors.css"}})=>({name:"colors/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[colors/tokenManager] Generating colors from TokenManager...");const{includeVariables:a,includeStyles:i=!0}=n;if(!(a!=null&&a.length)&&!i)throw new Error("Either includeVariables or includeStyles must be enabled");if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=[],c=s.getVariables();if(i){const f=s.getStyles();console.log("[colors/tokenManager] Processing styles for colors..."),f.color&&l.push(f.color)}if(a!=null&&a.length){console.log(`[colors/tokenManager] Processing ${a.length} variable groups...`);const f=a.map(g=>{const p=c[g];if(p.type==="color")return p}).filter(Boolean);l.push(...f)}const u=l.map(f=>G(f,s)).flatMap(f=>Object.entries(R(f,"")).reduce((g,[p,w])=>[...g,{name:Ve(p),value:w}],[]));if(u.length===0){console.warn("[colors/tokenManager] No color tokens generated");return}console.log(`[colors/tokenManager] Generated ${u.length} color tokens`),console.log(`[colors/tokenManager] Writing files to ${e} and ${t}...`),await Me({colorTokens:u,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o}),console.log("[colors/tokenManager] ✅ Successfully generated color files")}catch(a){const i=a instanceof Error?a.message:String(a);throw console.error("[colors/tokenManager] ❌ Failed to generate colors:",i),a instanceof Error&&a.stack&&console.error("[colors/tokenManager] Stack trace:",a.stack),a}}}),xe=(n,e)=>{if(!e.length)return"";const t=e.map(r=>` ${r}`).join(`
16
+ `)},Te=n=>{const e=n.reduce((t,r)=>({...t,[r.name]:r.value}),{});return JSON.stringify(e)},je=async(n,e,t,r,o,s)=>{await Promise.all([d.delete(o,t),d.delete(s,r)]);const a=d.write(o,n,{directory:t}),i=d.write(s,e,{directory:r});await Promise.all([a,i])},Me=async({colorTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o})=>{const s=$e(n),a=Se(s),i=Te(n);await je(i,a,e,t,r,o)},T=n=>n.reduce((e,t)=>{const r=Number((t.position*100).toFixed(1));return[...e,`${t.color}${r>0&&r<100?` ${r}%`:""}`]},[]).join(", "),Fe=n=>{const e=T(n.stops);return`linear-gradient(${n.angle}deg, ${e})`},ve=n=>`radial-gradient(circle, ${T(n.stops)})`,Ee=n=>{const e=T(n.stops);return`conic-gradient(from ${n.angle}deg, ${e})`},Ce=n=>{const e=T(n.stops);return`linear-gradient(${n.angle}deg, ${e})`},Oe=n=>typeof n=="string"?n:n.type==="linear"?Fe(n):n.type==="radial"?ve(n):n.type==="conic"?Ee(n):n.type==="diamond"?Ce(n):"",R=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=n[r],s=e?`${e}-${r}`:r;if(o&&typeof o=="object"&&"type"in o&&"value"in o){const i=Object.keys(o.value),l=i.length>1?o.value:o.value[i[0]],c={[s]:Oe(l)};return{...t,...c}}const a=R(o,s);return{...t,...a}},{}),Ve=n=>`cl-${n}`,G=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=n[r];if(o.type&&o.type!=="color")return t;if(o.type&&o.value){const a=typeof o.value=="string"?e.resolveVariableValueString(o.value,r):e.resolveVariableValue(o.value);return a?{...t,[r]:{...o,value:a}}:t}const s=G(o,e);return s?{...t,[r]:s}:t},{}),Pe=({input:n={},output:{jsonDir:e,stylesDir:t,jsonFileName:r="colors.json",cssFileName:o="colors.css"}})=>({name:"colors/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[colors/tokenManager] Generating colors from TokenManager...");const{includeVariables:a,includeStyles:i=!0}=n;if(!(a!=null&&a.length)&&!i)throw new Error("Either includeVariables or includeStyles must be enabled");if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=[],c=s.getVariables();if(i){const f=s.getStyles();console.log("[colors/tokenManager] Processing styles for colors..."),f.color&&l.push(f.color)}if(a!=null&&a.length){console.log(`[colors/tokenManager] Processing ${a.length} variable groups...`);const f=a.map(g=>c[g]).filter(Boolean);l.push(...f)}const u=l.map(f=>G(f,s)).flatMap(f=>Object.entries(R(f,"")).reduce((g,[p,w])=>[...g,{name:Ve(p),value:w}],[]));if(u.length===0){console.warn("[colors/tokenManager] No color tokens generated");return}console.log(`[colors/tokenManager] Generated ${u.length} color tokens`),console.log(`[colors/tokenManager] Writing files to ${e} and ${t}...`),await Me({colorTokens:u,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o}),console.log("[colors/tokenManager] ✅ Successfully generated color files")}catch(a){const i=a instanceof Error?a.message:String(a);throw console.error("[colors/tokenManager] ❌ Failed to generate colors:",i),a instanceof Error&&a.stack&&console.error("[colors/tokenManager] Stack trace:",a.stack),a}}}),xe=(n,e)=>{if(!e.length)return"";const t=e.map(r=>` ${r}`).join(`
17
17
  `);return`${n} {
18
18
  ${t}
19
19
  }`},Ne=(n,e)=>{if(!e.length)return"";const t=n-1,r=e.map(o=>` ${o}`).join(`
@@ -30,4 +30,4 @@ ${t}
30
30
 
31
31
  `);return[e,t].filter(Boolean).join(`
32
32
 
33
- `)},De=n=>{const e=n.reduce((t,r)=>({...t,[r.name]:r.value}),{});return JSON.stringify(e)},He=async(n,e,t,r,o,s)=>{await Promise.all([d.delete(o,t),d.delete(s,r)]);const a=d.write(o,n,{directory:t}),i=d.write(s,e,{directory:r});await Promise.all([a,i])},Ue=async({shadowTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o})=>{const s=ze(n),a=Ke(s),i=De(n);await He(i,a,e,t,r,o)},I=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=n[r],s=e?`${e}-${r}`:r;if(o&&typeof o=="object"&&"type"in o&&"value"in o){const i={[s]:o.value.map(qe).join(", ")};return{...t,...i}}const a=I(o,s);return{...t,...a}},{}),Qe=n=>`sh-${n}`,Xe=({input:n={},output:{jsonDir:e,stylesDir:t,jsonFileName:r="shadows.json",cssFileName:o="shadows.css"}})=>({name:"shadows/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[shadows/tokenManager] Generating shadows from TokenManager...");const{includeVariables:a,includeStyles:i=!0}=n;if(!(a!=null&&a.length)&&!i)throw new Error("Either includeVariables or includeStyles must be enabled");if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=[];if(i){const u=s.getStyles();console.log("[shadows/tokenManager] Processing styles for shadows..."),u.effect&&l.push(u.effect)}const c=l.flatMap(u=>Object.entries(I(u,"")).reduce((f,[g,p])=>[...f,{name:Qe(g),value:p}],[]));if(console.log("shadowTokens=",c),c.length===0){console.warn("[shadows/tokenManager] No shadow tokens generated");return}console.log(`[shadows/tokenManager] Generated ${c.length} shadow tokens`),console.log(`[shadows/tokenManager] Writing files to ${e} and ${t}...`),await Ue({shadowTokens:c,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o}),console.log("[shadows/tokenManager] ✅ Successfully generated shadow files")}catch(a){const i=a instanceof Error?a.message:String(a);throw console.error("[shadows/tokenManager] ❌ Failed to generate shadows:",i),a instanceof Error&&a.stack&&console.error("[shadows/tokenManager] Stack trace:",a.stack),a}}}),x=n=>{const e={};return Object.entries(n).forEach(([t,r])=>{const o=t.replace(/([A-Z])/g,"-$1").toLowerCase();e[o]=r}),e},Ye=(n,e)=>{const t=Object.keys(n.breakpoints),r=x(n.base);return t.reduce((o,s,a)=>{const i=x(n.breakpoints[s]);return a?[...o,{breakpoint:Number(e[s]),css:i}]:[{breakpoint:null,css:{...r,...i}}]},[{breakpoint:null,css:r}])},N=n=>Object.keys(n).reduce((e,t)=>{const r=n[t],o=Object.keys(r).map(s=>`${s}: ${r[s]}`).join(";");return e+`.${t}Typography { ${o} }`},""),Ze=(n,e)=>{const t=n.reduce((s,a)=>(Ye(a.value,e).forEach(({breakpoint:l,css:c})=>{l?(s.breakpoints[l]||(s.breakpoints[l]={}),s.breakpoints[l][a.name]=c):s.base[a.name]=c}),s),{base:{},breakpoints:{}}),r=N(t.base),o=Object.keys(t.breakpoints).reduce((s,a)=>{const i=t.breakpoints[a];return s+`@media (max-width: ${a}px) { ${N(i)} }`},"");return r+o},_e=n=>{const e=n.reduce((t,r)=>({...t,[r.name]:r.value}),{});return JSON.stringify(e)},et=async(n,e,t,r,o,s)=>{await Promise.all([d.delete(o,t),d.delete(s,r)]);const a=d.write(o,n,{directory:t}),i=d.write(s,e,{directory:r});await Promise.all([a,i])},tt=async({typographyTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o,breakpoints:s,isModule:a})=>{const i=Ze(n,s),l=_e(n),c=`${o}${a?".module":""}.css`,u=`${r}.json`;await et(l,i,e,t,u,c)},J=(n,e,t)=>Object.keys(n).reduce((r,o)=>{const s=n[o];if(typeof s!="object"||Array.isArray(s))return r;if(!("type"in s)||!("value"in s))return{...r,[o]:J(s,e,t)};if(s.type!=="typography")return r;const a=s.value,i=Object.entries(a).reduce((l,[c,u])=>{const f=Object.keys(t.breakpoints);if(f.length)f.forEach(g=>{const p=e.resolveVariableValueString(u,g);p&&(p===u?l.base={...l.base,[c]:p}:l.breakpoints[g]={...l.breakpoints[g],[c]:p})});else{const g=e.resolveVariableValueString(u);g&&(l.base={...l.base,[c]:g})}return l},{base:{},breakpoints:{}});return{...r,[o]:{type:"typography",value:i}}},{}),W=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=e?`${e}-${r}`:r,s=n[r];if(!("type"in s)||!("value"in s))return{...t,...W(s,o)};const a=s.value;return{...t,[o]:a}},{}),rt=({input:n,output:{jsonDir:e,stylesDir:t,jsonFileName:r="typography",cssFileName:o="typography"}})=>({name:"typography/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[typography/tokenManager] Generating typography from TokenManager...");const{breakpoints:a,isModule:i}=n;if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=[],c=s.getStyles();console.log("[typography/tokenManager] Processing styles for typography..."),c.text&&l.push(c.text);const u=l.reduce((g,p)=>({...g,...J(p,s,{breakpoints:n.breakpoints})}),{}),f=Object.entries(W(u)).map(([g,p])=>({name:g,value:p}));if(f.length===0){console.warn("[typography/tokenManager] No typography tokens generated");return}console.log(`[typography/tokenManager] Generated ${f.length} typography tokens`),console.log(`[typography/tokenManager] Writing files to ${e} and ${t}...`),await tt({typographyTokens:f,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o,breakpoints:a,isModule:i}),console.log("[typography/tokenManager] ✅ Successfully generated typography files")}catch(a){const i=a instanceof Error?a.message:String(a);throw console.error("[typography/tokenManager] ❌ Failed to generate typography:",i),a instanceof Error&&a.stack&&console.error("[typography/tokenManager] Stack trace:",a.stack),a}}});exports.BREAKPOINTS_NAMES=v;exports.TokenManager=L;exports.breakpointsFromTokenManager=fe;exports.breakpointsListFromTokenManager=be;exports.colorsFromTokenManager=Pe;exports.containerFromTokenManager=Ie;exports.generate=X;exports.init=Y;exports.shadowsFromTokenManager=Xe;exports.typographyFromTokenManager=rt;
33
+ `)},De=n=>{const e=n.reduce((t,r)=>({...t,[r.name]:r.value}),{});return JSON.stringify(e)},He=async(n,e,t,r,o,s)=>{await Promise.all([d.delete(o,t),d.delete(s,r)]);const a=d.write(o,n,{directory:t}),i=d.write(s,e,{directory:r});await Promise.all([a,i])},Ue=async({shadowTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o})=>{const s=ze(n),a=Ke(s),i=De(n);await He(i,a,e,t,r,o)},I=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=n[r],s=e?`${e}-${r}`:r;if(o&&typeof o=="object"&&"type"in o&&"value"in o){const i={[s]:o.value.map(qe).join(", ")};return{...t,...i}}const a=I(o,s);return{...t,...a}},{}),Qe=n=>`sh-${n}`,Xe=({input:n={},output:{jsonDir:e,stylesDir:t,jsonFileName:r="shadows.json",cssFileName:o="shadows.css"}})=>({name:"shadows/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[shadows/tokenManager] Generating shadows from TokenManager...");const{includeVariables:a,includeStyles:i=!0}=n;if(!(a!=null&&a.length)&&!i)throw new Error("Either includeVariables or includeStyles must be enabled");if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=[];if(i){const u=s.getStyles();console.log("[shadows/tokenManager] Processing styles for shadows..."),u.effect&&l.push(u.effect)}const c=l.flatMap(u=>Object.entries(I(u,"")).reduce((f,[g,p])=>[...f,{name:Qe(g),value:p}],[]));if(console.log("shadowTokens=",c),c.length===0){console.warn("[shadows/tokenManager] No shadow tokens generated");return}console.log(`[shadows/tokenManager] Generated ${c.length} shadow tokens`),console.log(`[shadows/tokenManager] Writing files to ${e} and ${t}...`),await Ue({shadowTokens:c,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o}),console.log("[shadows/tokenManager] ✅ Successfully generated shadow files")}catch(a){const i=a instanceof Error?a.message:String(a);throw console.error("[shadows/tokenManager] ❌ Failed to generate shadows:",i),a instanceof Error&&a.stack&&console.error("[shadows/tokenManager] Stack trace:",a.stack),a}}}),x=n=>{const e={};return Object.entries(n).forEach(([t,r])=>{const o=t.replace(/([A-Z])/g,"-$1").toLowerCase();e[o]=r}),e},Ye=(n,e)=>{const t=Object.keys(n.breakpoints),r=x(n.base);return t.reduce((o,s,a)=>{const i=x(n.breakpoints[s]);return a?[...o,{breakpoint:Number(e[s]),css:i}]:[{breakpoint:null,css:{...r,...i}}]},[{breakpoint:null,css:r}])},N=n=>Object.keys(n).reduce((e,t)=>{const r=n[t],o=Object.keys(r).map(s=>`${s}: ${r[s]}`).join(";");return e+`.${t}Typography { ${o} }`},""),Ze=(n,e)=>{const t=n.reduce((s,a)=>(Ye(a.value,e).forEach(({breakpoint:l,css:c})=>{l?(s.breakpoints[l]||(s.breakpoints[l]={}),s.breakpoints[l][a.name]=c):s.base[a.name]=c}),s),{base:{},breakpoints:{}}),r=N(t.base),o=Object.keys(t.breakpoints).reduce((s,a)=>{const i=t.breakpoints[a];return s+`@media (max-width: ${a}px) { ${N(i)} }`},"");return r+o},_e=n=>{const e=n.reduce((t,r)=>({...t,[r.name]:r.value}),{});return JSON.stringify(e)},et=async(n,e,t,r,o,s)=>{await Promise.all([d.delete(o,t),d.delete(s,r)]);const a=d.write(o,n,{directory:t}),i=d.write(s,e,{directory:r});await Promise.all([a,i])},tt=async({typographyTokens:n,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o,breakpoints:s,isModule:a})=>{const i=Ze(n,s),l=_e(n),c=`${o}${a?".module":""}.css`,u=`${r}.json`;await et(l,i,e,t,u,c)},J=(n,e,t)=>Object.keys(n).reduce((r,o)=>{const s=n[o];if(typeof s!="object"||Array.isArray(s))return r;if(!("type"in s)||!("value"in s))return{...r,[o]:J(s,e,t)};if(s.type!=="typography")return r;const a=s.value,i=Object.entries(a).reduce((l,[c,u])=>{const f=Object.keys(t.breakpoints);if(f.length)f.forEach(g=>{const p=e.resolveVariableValueString(u,g);p&&(p===u?l.base={...l.base,[c]:p}:l.breakpoints[g]={...l.breakpoints[g],[c]:p})});else{const g=e.resolveVariableValueString(u);g&&(l.base={...l.base,[c]:g})}return l},{base:{},breakpoints:{}});return{...r,[o]:{type:"typography",value:i}}},{}),W=(n,e)=>Object.keys(n).reduce((t,r)=>{const o=e?`${e}-${r}`:r,s=n[r];if(!("type"in s)||!("value"in s))return{...t,...W(s,o)};const a=s.value;return{...t,[o]:a}},{}),rt=({input:n,output:{jsonDir:e,stylesDir:t,jsonFileName:r="typography",cssFileName:o="typography"}})=>({name:"typography/tokenManager",executor:async({tokenManagerClient:s})=>{try{console.log("[typography/tokenManager] Generating typography from TokenManager...");const{breakpoints:a,isModule:i}=n;if(!s.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const l=[],c=s.getStyles();console.log("[typography/tokenManager] Processing styles for typography..."),c.text&&l.push(c.text);const u=l.reduce((g,p)=>({...g,...J(p,s,{breakpoints:n.breakpoints})}),{}),f=Object.entries(W(u)).map(([g,p])=>({name:g,value:p}));if(f.length===0){console.warn("[typography/tokenManager] No typography tokens generated");return}console.log(`[typography/tokenManager] Generated ${f.length} typography tokens`),console.log(`[typography/tokenManager] Writing files to ${e} and ${t}...`),await tt({typographyTokens:f,jsonDir:e,stylesDir:t,jsonFileName:r,cssFileName:o,breakpoints:a,isModule:i}),console.log("[typography/tokenManager] ✅ Successfully generated typography files")}catch(a){const i=a instanceof Error?a.message:String(a);throw console.error("[typography/tokenManager] ❌ Failed to generate typography:",i),a instanceof Error&&a.stack&&console.error("[typography/tokenManager] Stack trace:",a.stack),a}}});exports.BREAKPOINTS_NAMES=E;exports.TokenManager=L;exports.breakpointsFromTokenManager=fe;exports.breakpointsListFromTokenManager=be;exports.colorsFromTokenManager=Pe;exports.containerFromTokenManager=Ie;exports.generate=X;exports.init=Y;exports.shadowsFromTokenManager=Xe;exports.typographyFromTokenManager=rt;
package/index.mjs CHANGED
@@ -105,7 +105,7 @@ const Q = (n) => {
105
105
  t.push(n.slice(r, r + e));
106
106
  return t;
107
107
  };
108
- class C {
108
+ class v {
109
109
  constructor(e, t) {
110
110
  y(this, "figmaToken");
111
111
  y(this, "fileId");
@@ -127,7 +127,7 @@ class C {
127
127
  var p;
128
128
  if (!this.figmaToken || !this.fileId)
129
129
  throw new Error("Добавьте figmaToken и figmaId");
130
- const s = Object.entries(t).reduce((k, [W, v]) => typeof v < "u" ? { ...k, [W]: v } : k, {}), a = `https://api.figma.com/v1${e}${s && Object.keys(s).length ? `?${Q(s)}` : ""}`;
130
+ const s = Object.entries(t).reduce((k, [W, C]) => typeof C < "u" ? { ...k, [W]: C } : k, {}), a = `https://api.figma.com/v1${e}${s && Object.keys(s).length ? `?${Q(s)}` : ""}`;
131
131
  console.log("endpoinWithParams=", a);
132
132
  const i = setTimeout(() => o.abort(), r), l = {
133
133
  "Content-Type": "application/json",
@@ -146,7 +146,7 @@ class C {
146
146
  const r = await this.performControlledRequest(e, {
147
147
  ...t
148
148
  });
149
- return (o = r.headers.get("content-type")) != null && o.includes("application/json") ? C.returnJSON(r) : r;
149
+ return (o = r.headers.get("content-type")) != null && o.includes("application/json") ? v.returnJSON(r) : r;
150
150
  }
151
151
  async getComponents() {
152
152
  return this.request(`/files/${this.fileId}/components`);
@@ -438,7 +438,7 @@ const ot = async () => {
438
438
  const e = await new $().load();
439
439
  if (!e)
440
440
  throw new Error("Заполнить ошибку через нейронку");
441
- const { figmaToken: t, fileId: r, modules: o, manifest: s } = e, a = new C(t, r), i = new Z(s);
441
+ const { figmaToken: t, fileId: r, modules: o, manifest: s } = e, a = new v(t, r), i = new Z(s);
442
442
  s && d.exists(s) && await i.load(), await Promise.all(
443
443
  // [
444
444
  // colorsFromTokenManager({
@@ -708,13 +708,13 @@ ${t}
708
708
  }, []).join(", "), Me = (n) => {
709
709
  const e = S(n.stops);
710
710
  return `linear-gradient(${n.angle}deg, ${e})`;
711
- }, Ee = (n) => `radial-gradient(circle, ${S(n.stops)})`, Ce = (n) => {
711
+ }, Ee = (n) => `radial-gradient(circle, ${S(n.stops)})`, ve = (n) => {
712
712
  const e = S(n.stops);
713
713
  return `conic-gradient(from ${n.angle}deg, ${e})`;
714
- }, ve = (n) => {
714
+ }, Ce = (n) => {
715
715
  const e = S(n.stops);
716
716
  return `linear-gradient(${n.angle}deg, ${e})`;
717
- }, Fe = (n) => typeof n == "string" ? n : n.type === "linear" ? Me(n) : n.type === "radial" ? Ee(n) : n.type === "conic" ? Ce(n) : n.type === "diamond" ? ve(n) : "", A = (n, e) => Object.keys(n).reduce(
717
+ }, Fe = (n) => typeof n == "string" ? n : n.type === "linear" ? Me(n) : n.type === "radial" ? Ee(n) : n.type === "conic" ? ve(n) : n.type === "diamond" ? Ce(n) : "", A = (n, e) => Object.keys(n).reduce(
718
718
  (t, r) => {
719
719
  const o = n[r], s = e ? `${e}-${r}` : r;
720
720
  if (o && typeof o == "object" && "type" in o && "value" in o) {
@@ -727,6 +727,7 @@ ${t}
727
727
  {}
728
728
  ), Ve = (n) => `cl-${n}`, R = (n, e) => Object.keys(n).reduce((t, r) => {
729
729
  const o = n[r];
730
+ if (o.type && o.type !== "color") return t;
730
731
  if (o.type && o.value) {
731
732
  const a = typeof o.value == "string" ? e.resolveVariableValueString(o.value, r) : e.resolveVariableValue(o.value);
732
733
  return a ? { ...t, [r]: { ...o, value: a } } : t;
@@ -753,11 +754,7 @@ ${t}
753
754
  }
754
755
  if (a != null && a.length) {
755
756
  console.log(`[colors/tokenManager] Processing ${a.length} variable groups...`);
756
- const f = a.map((g) => {
757
- const p = c[g];
758
- if (p.type === "color")
759
- return p;
760
- }).filter(Boolean);
757
+ const f = a.map((g) => c[g]).filter(Boolean);
761
758
  l.push(...f);
762
759
  }
763
760
  const u = l.map((f) => R(f, s)).flatMap(
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/modules/colors/colorsFromTokenManager/module.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,4BAA4B;IACzC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,6BAA6B;IAC1C,KAAK,CAAC,EAAE,4BAA4B,CAAC;IACrC,MAAM,EAAE,6BAA6B,CAAC;CACzC;AAyDD,eAAO,MAAM,sBAAsB,GAAI,uEAGpC,6BAA6B,KAAG,OA6EjC,CAAC"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/modules/colors/colorsFromTokenManager/module.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,4BAA4B;IACzC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,6BAA6B;IAC1C,KAAK,CAAC,EAAE,4BAA4B,CAAC;IACrC,MAAM,EAAE,6BAA6B,CAAC;CACzC;AAyDD,eAAO,MAAM,sBAAsB,GAAI,uEAGpC,6BAA6B,KAAG,OA0EjC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greensight/gts",
3
- "version": "1.0.0-alpha.14",
3
+ "version": "1.0.0-alpha.15",
4
4
  "description": "Generate design tokens from Figma",
5
5
  "keywords": [
6
6
  "figma",