@greensight/gts 1.0.0-beta.1 → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/classes/Config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,WAAW,UAAU;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,qBAAa,MAAM;IACf,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAmB;WAE5C,MAAM;IAQN,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;CAYvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/classes/Config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,WAAW,UAAU;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,qBAAa,MAAM;IACf,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAmB;WAE5C,MAAM;IAQN,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;CAcvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/generate/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,qBAgBpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/generate/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,qBAkBpB,CAAC"}
package/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var je=Object.defineProperty;var ve=(t,e,o)=>e in t?je(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var m=(t,e,o)=>ve(t,typeof e!="symbol"?e+"":e,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("path"),Me=require("ts-import"),C=require("node:fs"),w=require("node:fs/promises"),V=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 V.resolve(h.baseDir,e)}static resolveWritePath(e,o){const r=V.resolve(h.baseDir,o??"");return{targetDir:r,targetPath:V.resolve(r,e)}}static handleReadError(e,o){throw e.code==="ENOENT"?new Error(`File not found: ${o}`):new Error(`Failed to read file "${o}": ${e.message??String(e)}`)}static async read(e,o="utf8"){const r=h.resolveReadPath(e);try{return await w.readFile(r,{encoding:o})}catch(n){h.handleReadError(n,r)}}static async readBuffer(e){const o=h.resolveReadPath(e);try{return await w.readFile(o)}catch(r){h.handleReadError(r,o)}}static async readJson(e){const o=h.resolveReadPath(e);try{const r=await w.readFile(o,{encoding:"utf8"});try{return JSON.parse(r)}catch(n){throw new Error(`Failed to parse JSON from "${o}": ${n.message}`)}}catch(r){h.handleReadError(r,o)}}static async write(e,o="",r={}){const{directory:n,overwrite:s=!0}=r,{targetDir:a,targetPath:l}=h.resolveWritePath(e,n);if(!s&&C.existsSync(l))throw new Error(`File ${l} already exists`);return await w.mkdir(a,{recursive:!0}),await w.writeFile(l,o,{encoding:"utf8"}),l}static async writeWithExtension(e,o,r="",n){const s=o.startsWith(".")?o:`.${o}`,a=`${e}${s}`;return h.write(a,r,n)}static exists(e){const o=h.resolveReadPath(e);return C.existsSync(o)}static async delete(e,o){const{targetPath:r}=h.resolveWritePath(e,o);C.existsSync(r)&&await w.rm(r,{recursive:!0,force:!0})}};m(h,"baseDir",process.cwd());let d=h;const S=class S{static async create(){if(d.exists(S.configFileName))throw new Error("The file already exists");await d.write(S.configFileName,"",{overwrite:!1})}async load(){try{const e=await Me.tsImport.compile(`${$.resolve(process.cwd(),S.configFileName)}`);if(!e)throw new Error;return e.default}catch(e){console.error("Cannot find module gts.config.ts",e)}}};m(S,"configFileName","gts.config.ts");let v=S;const Fe=t=>{const e=new URLSearchParams;return Object.keys(t).forEach(o=>{Array.isArray(t[o])?t[o].forEach(r=>e.append(`${o}[]`,r)):e.append(o,t[o])}),e},Ce=(t,e=50)=>{const o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};class P{constructor(e,o){m(this,"figmaToken");m(this,"fileId");m(this,"onTimeMeasureHandler");this.figmaToken=e,this.fileId=o}setOnTimeMeasureHandler(e){this.onTimeMeasureHandler=e}static async returnJSON(e){const o=await e.json();if(!e.ok){let r="Request failed";throw new Error(r)}return o}async performControlledRequest(e,{params:o={},timeout:r=3e4,abortController:n=new AbortController}={}){var g;if(!this.figmaToken||!this.fileId)throw new Error("Добавьте figmaToken и figmaId");const s=Object.entries(o).reduce((p,[b,k])=>typeof k<"u"?{...p,[b]:k}:p,{}),a=`https://api.figma.com/v1${e}${s&&Object.keys(s).length?`?${Fe(s)}`:""}`;console.log("endpoinWithParams=",a);const l=setTimeout(()=>n.abort(),r),i={"Content-Type":"application/json",...this.figmaToken&&{"X-Figma-Token":this.figmaToken}},c={method:"GET",headers:i,signal:n.signal},u=performance.now(),y=await fetch(`${a}`,c);clearTimeout(l);const f=performance.now()-u;return(g=this.onTimeMeasureHandler)==null||g.call(this,a,i,f),y}async request(e,o){var n;const r=await this.performControlledRequest(e,{...o});return(n=r.headers.get("content-type"))!=null&&n.includes("application/json")?P.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 o=Ce(e).map(s=>this.request(`/files/${this.fileId}/nodes`,{params:{ids:s.join(",")}})),r=await Promise.all(o);return{...r[0],nodes:r.reduce((s,a)=>({...s,...a.nodes}),{})}}}const Q=(t,e)=>{const o=Array.isArray(e)?e:e.split(".");let r=t;for(const n of o){if(r==null||typeof r!="object")return;r=r[n]}return r},Z=(t,e)=>{if(!e||typeof e!="object")return t;if(!t||typeof t!="object")return e;const o={...t};for(const r in e)e.hasOwnProperty(r)&&(typeof e[r]=="object"&&e[r]!==null&&typeof o[r]=="object"&&o[r]!==null?o[r]=Z(o[r],e[r]):o[r]=e[r]);return o};function x(t,e){if(t===e)return!0;if(t==null||e==null)return t===e;if(typeof t!=typeof e)return!1;if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(t instanceof RegExp&&e instanceof RegExp)return t.toString()===e.toString();if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(let o=0;o<t.length;o++)if(!x(t[o],e[o]))return!1;return!0}if(typeof t=="object"&&typeof e=="object"){const o=Object.keys(t),r=Object.keys(e);if(o.length!==r.length)return!1;for(const n of o)if(!r.includes(n)||!x(t[n],e[n]))return!1;return!0}return!1}const U={color:{},effect:{},text:{},grid:{}};class X{constructor(e){m(this,"tokensDir");m(this,"manifestPath");m(this,"variables");m(this,"styles");m(this,"loaded",!1);this.tokensDir=e||"",this.manifestPath=$.join(this.tokensDir,"manifest.json")}isLoaded(){return this.loaded&&!!this.variables&&!!this.styles}normalizeKey(e){const o=e.trim();return o&&o.replace(/[-_\s]+/g," ").split(" ").filter(r=>r.length).map((r,n)=>{const s=r.charAt(0),a=r.slice(1);return n===0?r.toLowerCase():s.toUpperCase()+a}).join("")}parseVariableString(e){if(typeof e!="string")return e;const o=/^\{(.+)\}$/,r=e.match(o);if(r){const n=r[1].trim();return`{${this.normalizeKey(n)}}`}return e}createVariableFileList(e){return Object.entries(e).flatMap(([o,r])=>Object.entries(r.modes).flatMap(([n,s])=>s.map(a=>({fileName:a,modeName:this.normalizeKey(n.trim()),collectionName:o}))))}parseValue(e){return e&&(typeof e=="string"?this.parseVariableString(e):typeof e!="object"?e:Array.isArray(e)?e.map(o=>this.parseValue(o)):Object.entries(e).reduce((o,[r,n])=>({...o,[r]:this.parseValue(n)}),{}))}getTokensFromFile(e,o){return Object.entries(e).reduce((r,[n,s])=>"$type"in s&&"$value"in s?{...r,[this.normalizeKey(n)]:{type:s.$type,description:s.$description,value:o?{[this.normalizeKey(o)]:this.parseValue(s.$value)}:this.parseValue(s.$value)}}:{...r,[this.normalizeKey(n)]:this.getTokensFromFile(s,o)},{})}processTokensFile(e,o,r){const n=this.normalizeKey(r),s=this.getTokensFromFile(e,o);return{[n]:s}}async loadVariableFiles(e){return Promise.all(e.map(async({fileName:o,modeName:r,collectionName:n})=>{try{const s=$.join(this.tokensDir,o),a=await d.readJson(s);return this.processTokensFile(a,r,n)}catch(s){return console.warn(`Failed to load variable file: ${$.join(this.tokensDir,o)}`,s),{}}}))}mergeVariables(e){return e.reduce((o,r)=>Z(o,r),{})}async loadTokenVariables(e){try{const o=this.createVariableFileList(e),r=await this.loadVariableFiles(o);return this.mergeVariables(r)}catch(o){throw new Error(`Failed to load token variables from ${this.tokensDir}: ${o}`)}}createStyleFileList(e){return Object.entries(e).flatMap(([o,r])=>(r==null?void 0:r.map(n=>({styleType:o,fileName:n})))||[])}async loadStyleFiles(e){return(await Promise.all(e.map(async({styleType:r,fileName:n})=>{try{const s=$.join(this.tokensDir,n),a=await d.readJson(s);return{styleType:r,styleTokens:a}}catch(s){return console.warn(`Failed to load style file: ${$.join(this.tokensDir,n)}`,s),{styleType:r,styleTokens:{}}}}))).reduce((r,n)=>({...r,[n.styleType]:this.getTokensFromFile(n.styleTokens,"")}),{...U})}async loadStyles(e){if(!e)return{...U};const o=this.createStyleFileList(e);return await this.loadStyleFiles(o)}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((o,r)=>{const n=e[r],s=this.resolveVariableValueString(n,r);return s&&(o[r]=s),o},{})}resolveVariableValueString(e,o){if(!this.isVariableReference(e))return e;const r=this.getVariablePath(e),n=this.getToken(r,o);if(n)return this.resolveVariableValueString(n,o)}getToken(e,o){if(!this.loaded||!this.variables)throw new Error("Tokens not loaded. Call load() first.");for(const r of Object.values(this.variables)){const n=Q(r,e);if(n!=null&&n.value&&typeof n.value=="object"){if(o)return n.value[o];{const s=Object.keys(n.value)[0];return n.value[s]}}}}}const Ve=async()=>{const e=await new v().load();if(!e)throw new Error("Заполнить ошибку через нейронку");const{figmaToken:o,fileId:r,modules:n,manifest:s}=e,a=new P(o,r),l=new X(s);s&&d.exists(s)&&await l.load(),await Promise.all(n.map(i=>i.executor({figmaApiClient:a,tokenManagerClient:l})))},Ne=async()=>{await v.create(),console.log("\x1B[32m%s\x1B[0m","✔️ Configuration file created gts.config.ts")},Y=["xxxl","xxl","xl","lg","md","sm","xs","xxs","xxxs"],xe=t=>parseInt(t.value,10),Oe=t=>t.reduce((e,o)=>({...e,[o.name]:xe(o)}),{}),Pe=async(t,e)=>{await d.delete(t,e)},Ee=async(t,e,o)=>{await d.write(t,e,{directory:o})},N=async(t,e,o)=>{await Pe(t,o),await Ee(t,e,o)},Be=t=>{const e=t.map(({name:o,value:r})=>` --${o}: ${r};`);return e.length?`.breakpoint-variables {
1
+ "use strict";var je=Object.defineProperty;var ve=(t,e,o)=>e in t?je(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var m=(t,e,o)=>ve(t,typeof e!="symbol"?e+"":e,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("path"),Me=require("ts-import"),C=require("node:fs"),w=require("node:fs/promises"),V=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 V.resolve(h.baseDir,e)}static resolveWritePath(e,o){const r=V.resolve(h.baseDir,o??"");return{targetDir:r,targetPath:V.resolve(r,e)}}static handleReadError(e,o){throw e.code==="ENOENT"?new Error(`File not found: ${o}`):new Error(`Failed to read file "${o}": ${e.message??String(e)}`)}static async read(e,o="utf8"){const r=h.resolveReadPath(e);try{return await w.readFile(r,{encoding:o})}catch(n){h.handleReadError(n,r)}}static async readBuffer(e){const o=h.resolveReadPath(e);try{return await w.readFile(o)}catch(r){h.handleReadError(r,o)}}static async readJson(e){const o=h.resolveReadPath(e);try{const r=await w.readFile(o,{encoding:"utf8"});try{return JSON.parse(r)}catch(n){throw new Error(`Failed to parse JSON from "${o}": ${n.message}`)}}catch(r){h.handleReadError(r,o)}}static async write(e,o="",r={}){const{directory:n,overwrite:s=!0}=r,{targetDir:a,targetPath:l}=h.resolveWritePath(e,n);if(!s&&C.existsSync(l))throw new Error(`File ${l} already exists`);return await w.mkdir(a,{recursive:!0}),await w.writeFile(l,o,{encoding:"utf8"}),l}static async writeWithExtension(e,o,r="",n){const s=o.startsWith(".")?o:`.${o}`,a=`${e}${s}`;return h.write(a,r,n)}static exists(e){const o=h.resolveReadPath(e);return C.existsSync(o)}static async delete(e,o){const{targetPath:r}=h.resolveWritePath(e,o);C.existsSync(r)&&await w.rm(r,{recursive:!0,force:!0})}};m(h,"baseDir",process.cwd());let d=h;const S=class S{static async create(){if(d.exists(S.configFileName))throw new Error("The file already exists");await d.write(S.configFileName,"",{overwrite:!1})}async load(){try{const e=await Me.tsImport.compile(`${$.resolve(process.cwd(),S.configFileName)}`);if(!e)throw new Error("gts.config.ts must default-export a configuration object");return e.default}catch(e){console.error("Cannot find module gts.config.ts",e)}}};m(S,"configFileName","gts.config.ts");let v=S;const Fe=t=>{const e=new URLSearchParams;return Object.keys(t).forEach(o=>{Array.isArray(t[o])?t[o].forEach(r=>e.append(`${o}[]`,r)):e.append(o,t[o])}),e},Ce=(t,e=50)=>{const o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};class P{constructor(e,o){m(this,"figmaToken");m(this,"fileId");m(this,"onTimeMeasureHandler");this.figmaToken=e,this.fileId=o}setOnTimeMeasureHandler(e){this.onTimeMeasureHandler=e}static async returnJSON(e){const o=await e.json();if(!e.ok){let r="Request failed";throw new Error(r)}return o}async performControlledRequest(e,{params:o={},timeout:r=3e4,abortController:n=new AbortController}={}){var y;if(!this.figmaToken||!this.fileId)throw new Error("figmaToken and fileId are required in gts.config.ts");const s=Object.entries(o).reduce((p,[b,k])=>typeof k<"u"?{...p,[b]:k}:p,{}),a=`https://api.figma.com/v1${e}${s&&Object.keys(s).length?`?${Fe(s)}`:""}`;console.log("endpoinWithParams=",a);const l=setTimeout(()=>n.abort(),r),i={"Content-Type":"application/json",...this.figmaToken&&{"X-Figma-Token":this.figmaToken}},c={method:"GET",headers:i,signal:n.signal},u=performance.now(),f=await fetch(`${a}`,c);clearTimeout(l);const g=performance.now()-u;return(y=this.onTimeMeasureHandler)==null||y.call(this,a,i,g),f}async request(e,o){var n;const r=await this.performControlledRequest(e,{...o});return(n=r.headers.get("content-type"))!=null&&n.includes("application/json")?P.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 o=Ce(e).map(s=>this.request(`/files/${this.fileId}/nodes`,{params:{ids:s.join(",")}})),r=await Promise.all(o);return{...r[0],nodes:r.reduce((s,a)=>({...s,...a.nodes}),{})}}}const Q=(t,e)=>{const o=Array.isArray(e)?e:e.split(".");let r=t;for(const n of o){if(r==null||typeof r!="object")return;r=r[n]}return r},Z=(t,e)=>{if(!e||typeof e!="object")return t;if(!t||typeof t!="object")return e;const o={...t};for(const r in e)e.hasOwnProperty(r)&&(typeof e[r]=="object"&&e[r]!==null&&typeof o[r]=="object"&&o[r]!==null?o[r]=Z(o[r],e[r]):o[r]=e[r]);return o};function x(t,e){if(t===e)return!0;if(t==null||e==null)return t===e;if(typeof t!=typeof e)return!1;if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(t instanceof RegExp&&e instanceof RegExp)return t.toString()===e.toString();if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(let o=0;o<t.length;o++)if(!x(t[o],e[o]))return!1;return!0}if(typeof t=="object"&&typeof e=="object"){const o=Object.keys(t),r=Object.keys(e);if(o.length!==r.length)return!1;for(const n of o)if(!r.includes(n)||!x(t[n],e[n]))return!1;return!0}return!1}const U={color:{},effect:{},text:{},grid:{}};class X{constructor(e){m(this,"tokensDir");m(this,"manifestPath");m(this,"variables");m(this,"styles");m(this,"loaded",!1);this.tokensDir=e||"",this.manifestPath=$.join(this.tokensDir,"manifest.json")}isLoaded(){return this.loaded&&!!this.variables&&!!this.styles}normalizeKey(e){const o=e.trim();return o&&o.replace(/[-_\s]+/g," ").split(" ").filter(r=>r.length).map((r,n)=>{const s=r.charAt(0),a=r.slice(1);return n===0?r.toLowerCase():s.toUpperCase()+a}).join("")}parseVariableString(e){if(typeof e!="string")return e;const o=/^\{(.+)\}$/,r=e.match(o);if(r){const n=r[1].trim();return`{${this.normalizeKey(n)}}`}return e}createVariableFileList(e){return Object.entries(e).flatMap(([o,r])=>Object.entries(r.modes).flatMap(([n,s])=>s.map(a=>({fileName:a,modeName:this.normalizeKey(n.trim()),collectionName:o}))))}parseValue(e){return e&&(typeof e=="string"?this.parseVariableString(e):typeof e!="object"?e:Array.isArray(e)?e.map(o=>this.parseValue(o)):Object.entries(e).reduce((o,[r,n])=>({...o,[r]:this.parseValue(n)}),{}))}getTokensFromFile(e,o){return Object.entries(e).reduce((r,[n,s])=>"$type"in s&&"$value"in s?{...r,[this.normalizeKey(n)]:{type:s.$type,description:s.$description,value:o?{[this.normalizeKey(o)]:this.parseValue(s.$value)}:this.parseValue(s.$value)}}:{...r,[this.normalizeKey(n)]:this.getTokensFromFile(s,o)},{})}processTokensFile(e,o,r){const n=this.normalizeKey(r),s=this.getTokensFromFile(e,o);return{[n]:s}}async loadVariableFiles(e){return Promise.all(e.map(async({fileName:o,modeName:r,collectionName:n})=>{try{const s=$.join(this.tokensDir,o),a=await d.readJson(s);return this.processTokensFile(a,r,n)}catch(s){return console.warn(`Failed to load variable file: ${$.join(this.tokensDir,o)}`,s),{}}}))}mergeVariables(e){return e.reduce((o,r)=>Z(o,r),{})}async loadTokenVariables(e){try{const o=this.createVariableFileList(e),r=await this.loadVariableFiles(o);return this.mergeVariables(r)}catch(o){throw new Error(`Failed to load token variables from ${this.tokensDir}: ${o}`)}}createStyleFileList(e){return Object.entries(e).flatMap(([o,r])=>(r==null?void 0:r.map(n=>({styleType:o,fileName:n})))||[])}async loadStyleFiles(e){return(await Promise.all(e.map(async({styleType:r,fileName:n})=>{try{const s=$.join(this.tokensDir,n),a=await d.readJson(s);return{styleType:r,styleTokens:a}}catch(s){return console.warn(`Failed to load style file: ${$.join(this.tokensDir,n)}`,s),{styleType:r,styleTokens:{}}}}))).reduce((r,n)=>({...r,[n.styleType]:this.getTokensFromFile(n.styleTokens,"")}),{...U})}async loadStyles(e){if(!e)return{...U};const o=this.createStyleFileList(e);return await this.loadStyleFiles(o)}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((o,r)=>{const n=e[r],s=this.resolveVariableValueString(n,r);return s&&(o[r]=s),o},{})}resolveVariableValueString(e,o){if(!this.isVariableReference(e))return e;const r=this.getVariablePath(e),n=this.getToken(r,o);if(n)return this.resolveVariableValueString(n,o)}getToken(e,o){if(!this.loaded||!this.variables)throw new Error("Tokens not loaded. Call load() first.");for(const r of Object.values(this.variables)){const n=Q(r,e);if(n!=null&&n.value&&typeof n.value=="object"){if(o)return n.value[o];{const s=Object.keys(n.value)[0];return n.value[s]}}}}}const Ve=async()=>{const e=await new v().load();if(!e)throw new Error('Failed to load gts.config.ts. Run "npx gts-init" to create it, or ensure the file exists and default-exports a valid configuration.');const{figmaToken:o,fileId:r,modules:n,manifest:s}=e,a=new P(o,r),l=new X(s);s&&d.exists(s)&&await l.load(),await Promise.all(n.map(i=>i.executor({figmaApiClient:a,tokenManagerClient:l})))},Ne=async()=>{await v.create(),console.log("\x1B[32m%s\x1B[0m","✔️ Configuration file created gts.config.ts")},Y=["xxxl","xxl","xl","lg","md","sm","xs","xxs","xxxs"],xe=t=>parseInt(t.value,10),Oe=t=>t.reduce((e,o)=>({...e,[o.name]:xe(o)}),{}),Pe=async(t,e)=>{await d.delete(t,e)},Ee=async(t,e,o)=>{await d.write(t,e,{directory:o})},N=async(t,e,o)=>{await Pe(t,o),await Ee(t,e,o)},Be=t=>{const e=t.map(({name:o,value:r})=>` --${o}: ${r};`);return e.length?`.breakpoint-variables {
2
2
  ${e.join(`
3
3
  `)}
4
4
  }
@@ -24,7 +24,7 @@ ${t.map(r=>` '${r.name}': 'var(${_(r.name)})'`).join(`,
24
24
  type ColorsKeysType = keyof typeof colors;
25
25
 
26
26
  export { colors, type ColorsKeysType };
27
- `,Je=async({tsContent:t,cssContent:e,dir:o})=>{await d.delete(o);const r=d.write(Ie,t,{directory:o}),n=d.write(Le,e,{directory:o});await Promise.all([r,n])},He=async({colorTokens:t,dir:e})=>{const o=We(t),r=Ge(o),n=qe(t);await Je({tsContent:n,cssContent:r,dir:e})},M=t=>t.reduce((e,o)=>{const r=Number((o.position*100).toFixed(1));return[...e,`${o.color}${r>0&&r<100?` ${r}%`:""}`]},[]).join(", "),Qe=t=>{const e=M(t.stops);return`linear-gradient(${t.angle}deg, ${e})`},Ze=t=>`radial-gradient(circle, ${M(t.stops)})`,Xe=t=>{const e=M(t.stops);return`conic-gradient(from ${t.angle}deg, ${e})`},Ye=t=>{const e=M(t.stops);return`linear-gradient(${t.angle}deg, ${e})`},K=t=>typeof t=="string"?t:t.type==="linear"?Qe(t):t.type==="radial"?Ze(t):t.type==="conic"?Xe(t):t.type==="diamond"?Ye(t):"",ee=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=t[r],s=e?`${e}-${r}`:r;if(n&&typeof n=="object"&&"type"in n&&"value"in n){const l=Object.keys(n.value),i=l.length>1?n.value:n.value[l[0]],c=typeof i=="object"?Object.keys(i).reduce((y,f)=>({...y,[f]:K(i[f])}),{}):K(i),u={[s]:c};return{...o,...u}}const a=ee(n,s);return{...o,...a}},{}),te=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=t[r];if(n.type&&n.type!=="color")return o;if(n.type&&n.value){const a=typeof n.value=="string"?e.resolveVariableValueString(n.value,r):e.resolveVariableValue(n.value);return a?{...o,[r]:{...n,value:a}}:o}const s=te(n,e);return s?{...o,[r]:s}:o},{}),_e=({input:t={},output:{dir:e}})=>({name:"colors/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[colors/tokenManager] Generating colors from TokenManager...");const{includeVariables:r,includeStyles:n=!0}=t;if(!(r!=null&&r.length)&&!n)throw new Error("Either includeVariables or includeStyles must be enabled");if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const s=[],a=o.getVariables();if(n){const i=o.getStyles();console.log("[colors/tokenManager] Processing styles for colors..."),i.color&&s.push(i.color)}if(r!=null&&r.length){console.log(`[colors/tokenManager] Processing ${r.length} variable groups...`);const i=r.map(c=>a[c]).filter(Boolean);s.push(...i)}const l=s.map(i=>te(i,o)).flatMap(i=>Object.entries(ee(i,"")).reduce((c,[u,y])=>[...c,{name:u,value:y}],[]));if(l.length===0){console.warn("[colors/tokenManager] No color tokens generated");return}console.log(`[colors/tokenManager] Generated ${l.length} color tokens`),console.log(`[colors/tokenManager] Writing files to ${e}...`),await He({colorTokens:l,dir:e}),console.log("[colors/tokenManager] ✅ Successfully generated color files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[colors/tokenManager] ❌ Failed to generate colors:",n),r instanceof Error&&r.stack&&console.error("[colors/tokenManager] Stack trace:",r.stack),r}}}),et=t=>` @media (width <= ${t.breakpoint}px) {
27
+ `,Je=async({tsContent:t,cssContent:e,dir:o})=>{await d.delete(o);const r=d.write(Ie,t,{directory:o}),n=d.write(Le,e,{directory:o});await Promise.all([r,n])},He=async({colorTokens:t,dir:e})=>{const o=We(t),r=Ge(o),n=qe(t);await Je({tsContent:n,cssContent:r,dir:e})},M=t=>t.reduce((e,o)=>{const r=Number((o.position*100).toFixed(1));return[...e,`${o.color}${r>0&&r<100?` ${r}%`:""}`]},[]).join(", "),Qe=t=>{const e=M(t.stops);return`linear-gradient(${t.angle}deg, ${e})`},Ze=t=>`radial-gradient(circle, ${M(t.stops)})`,Xe=t=>{const e=M(t.stops);return`conic-gradient(from ${t.angle}deg, ${e})`},Ye=t=>{const e=M(t.stops);return`linear-gradient(${t.angle}deg, ${e})`},K=t=>typeof t=="string"?t:t.type==="linear"?Qe(t):t.type==="radial"?Ze(t):t.type==="conic"?Xe(t):t.type==="diamond"?Ye(t):"",ee=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=t[r],s=e?`${e}-${r}`:r;if(n&&typeof n=="object"&&"type"in n&&"value"in n){const l=Object.keys(n.value),i=l.length>1?n.value:n.value[l[0]],c=typeof i=="object"?Object.keys(i).reduce((f,g)=>({...f,[g]:K(i[g])}),{}):K(i),u={[s]:c};return{...o,...u}}const a=ee(n,s);return{...o,...a}},{}),te=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=t[r];if(n.type&&n.type!=="color")return o;if(n.type&&n.value){const a=typeof n.value=="string"?e.resolveVariableValueString(n.value,r):e.resolveVariableValue(n.value);return a?{...o,[r]:{...n,value:a}}:o}const s=te(n,e);return s?{...o,[r]:s}:o},{}),_e=({input:t={},output:{dir:e}})=>({name:"colors/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[colors/tokenManager] Generating colors from TokenManager...");const{includeVariables:r,includeStyles:n=!0}=t;if(!(r!=null&&r.length)&&!n)throw new Error("Either includeVariables or includeStyles must be enabled");if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const s=[],a=o.getVariables();if(n){const i=o.getStyles();console.log("[colors/tokenManager] Processing styles for colors..."),i.color&&s.push(i.color)}if(r!=null&&r.length){console.log(`[colors/tokenManager] Processing ${r.length} variable groups...`);const i=r.map(c=>a[c]).filter(Boolean);s.push(...i)}const l=s.map(i=>te(i,o)).flatMap(i=>Object.entries(ee(i,"")).reduce((c,[u,f])=>[...c,{name:u,value:f}],[]));if(l.length===0){console.warn("[colors/tokenManager] No color tokens generated");return}console.log(`[colors/tokenManager] Generated ${l.length} color tokens`),console.log(`[colors/tokenManager] Writing files to ${e}...`),await He({colorTokens:l,dir:e}),console.log("[colors/tokenManager] ✅ Successfully generated color files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[colors/tokenManager] ❌ Failed to generate colors:",n),r instanceof Error&&r.stack&&console.error("[colors/tokenManager] Stack trace:",r.stack),r}}}),et=t=>` @media (width <= ${t.breakpoint}px) {
28
28
  .container {
29
29
  padding-left: ${t.offset};
30
30
  padding-right: ${t.offset};
@@ -45,11 +45,11 @@ export const conatinerTabletClassName = styles.containerTablet;
45
45
  `,L=async(t,e,o)=>{await d.delete(t,o),await d.write(t,e,{directory:o})},ot=async({containerTokens:t,dir:e,layer:o})=>{const r=tt(t,o),n=rt();await L("styles.module.css",r,e),await L("index.ts",n,e)},nt=t=>{const e=t.trim().toLowerCase();return e==="0"||e==="0px"},st=(t,e)=>Object.keys(t).filter(s=>!isNaN(Number(s))).sort((s,a)=>Number(a)-Number(s)).reduce((s,a)=>{const l=t[a];if(!l||!("value"in l)||!Array.isArray(l.value))return s;const i=l.value.find(u=>u.pattern==="columns");if(!(i!=null&&i.offset))return s;const c=e.resolveVariableValueString(i.offset);return!c||typeof c!="string"||nt(c)?s:[...s,{breakpoint:Number(a),offset:c}]},[]).reduce((s,a)=>{const l=s[s.length-1];return l&&x(l.offset,a.offset)||s.push(a),s},[]),at=({input:t={},output:{dir:e}})=>({name:"container/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[container/tokenManager] Generating container styles...");const{layer:r}=t;if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");console.log("[container/tokenManager] Extracting container tokens...");const n=o.getStyles();if(!n.grid)throw new Error("No grid styles found in TokenManager. Grid tokens must be loaded.");const s=st(n.grid,o);if(!s.length){console.warn("[container/tokenManager] No container tokens found.");return}console.log(`[container/tokenManager] Found ${s.length} container tokens: ${s.map(a=>a.breakpoint).join(", ")}`),console.log(`[container/tokenManager] Writing files to ${e}...`),await ot({containerTokens:s,dir:e,layer:r}),console.log("[container/tokenManager] ✅ Successfully generated container files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[container/tokenManager] ❌ Failed to generate container:",n),r instanceof Error&&r.stack&&console.error("[container/tokenManager] Stack trace:",r.stack),r}}}),it="styles.css",lt="index.ts",I=(t,e)=>{if(!e.length)return"";const o=e.map(r=>` ${r}`).join(`
46
46
  `);return`${t} {
47
47
  ${o}
48
- }`},ct=t=>`.${t.replace(/\s+/g,"-").toLowerCase()}`,re=t=>`--${t}`,ut=({offsetX:t,offsetY:e,blur:o,spread:r,color:n})=>`${t} ${e} ${o} ${r} ${n}`,dt=t=>t.reduce((e,o)=>{const r=re(o.name);return typeof o.value!="object"?(e.root.push(`${r}: ${o.value};`),e):Object.entries(o.value).reduce((n,[s,a])=>{const l=n[s]??[];return{...n,[s]:[...l,`${r}: ${a};`]}},e)},{root:[]}),yt=t=>{const e=I(".shadow-variables",t.root),o=Object.entries(t).reduce((r,[n,s])=>{if(n==="root"||!s.length)return r;const a=I(ct(`${n}-shadow-variables`),s);return a&&r.push(a),r},[]).join(`
48
+ }`},ct=t=>`.${t.replace(/\s+/g,"-").toLowerCase()}`,re=t=>`--${t}`,ut=({offsetX:t,offsetY:e,blur:o,spread:r,color:n})=>`${t} ${e} ${o} ${r} ${n}`,dt=t=>t.reduce((e,o)=>{const r=re(o.name);return typeof o.value!="object"?(e.root.push(`${r}: ${o.value};`),e):Object.entries(o.value).reduce((n,[s,a])=>{const l=n[s]??[];return{...n,[s]:[...l,`${r}: ${a};`]}},e)},{root:[]}),ft=t=>{const e=I(".shadow-variables",t.root),o=Object.entries(t).reduce((r,[n,s])=>{if(n==="root"||!s.length)return r;const a=I(ct(`${n}-shadow-variables`),s);return a&&r.push(a),r},[]).join(`
49
49
 
50
50
  `);return[e,o].filter(Boolean).join(`
51
51
 
52
- `)},ft=t=>`${`const shadows = {
52
+ `)},gt=t=>`${`const shadows = {
53
53
  ${t.map(r=>` '${r.name}': 'var(${re(r.name)})'`).join(`,
54
54
  `)}
55
55
  } as const;`}
@@ -57,10 +57,10 @@ ${t.map(r=>` '${r.name}': 'var(${re(r.name)})'`).join(`,
57
57
  type ShadowsKeysType = keyof typeof shadows;
58
58
 
59
59
  export { shadows, type ShadowsKeysType };
60
- `,gt=async({tsContent:t,cssContent:e,dir:o})=>{await d.delete(o);const r=d.write(lt,t,{directory:o}),n=d.write(it,e,{directory:o});await Promise.all([r,n])},pt=async({shadowTokens:t,dir:e})=>{const o=dt(t),r=yt(o),n=ft(t);await gt({tsContent:n,cssContent:r,dir:e})},oe=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=t[r],s=e?`${e}-${r}`:r;if(n&&typeof n=="object"&&"type"in n&&"value"in n){const l={[s]:n.value.map(ut).join(", ")};return{...o,...l}}const a=oe(n,s);return{...o,...a}},{}),ht=({input:t={},output:{dir:e}})=>({name:"shadows/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[shadows/tokenManager] Generating shadows from TokenManager...");const{includeStyles:r=!0}=t;if(!r)throw new Error("includeStyles must be enabled for shadows generation");if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const n=[];if(r){const a=o.getStyles();console.log("[shadows/tokenManager] Processing styles for shadows..."),a.effect&&n.push(a.effect)}const s=n.flatMap(a=>Object.entries(oe(a,"")).reduce((l,[i,c])=>[...l,{name:i,value:c}],[]));if(s.length===0){console.warn("[shadows/tokenManager] No shadow tokens generated");return}console.log(`[shadows/tokenManager] Generated ${s.length} shadow tokens`),console.log(`[shadows/tokenManager] Writing files to ${e}...`),await pt({shadowTokens:s,dir:e}),console.log("[shadows/tokenManager] ✅ Successfully generated shadow files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[shadows/tokenManager] ❌ Failed to generate shadows:",n),r instanceof Error&&r.stack&&console.error("[shadows/tokenManager] Stack trace:",r.stack),r}}}),bt="styles.module.css",mt="index.ts",kt="typography.ts",z="sans-serif",W=(t,e)=>{if(!e.length)return"";const o=e.map(r=>` ${r}`).join(`
60
+ `,yt=async({tsContent:t,cssContent:e,dir:o})=>{await d.delete(o);const r=d.write(lt,t,{directory:o}),n=d.write(it,e,{directory:o});await Promise.all([r,n])},pt=async({shadowTokens:t,dir:e})=>{const o=dt(t),r=ft(o),n=gt(t);await yt({tsContent:n,cssContent:r,dir:e})},oe=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=t[r],s=e?`${e}-${r}`:r;if(n&&typeof n=="object"&&"type"in n&&"value"in n){const l={[s]:n.value.map(ut).join(", ")};return{...o,...l}}const a=oe(n,s);return{...o,...a}},{}),ht=({input:t={},output:{dir:e}})=>({name:"shadows/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[shadows/tokenManager] Generating shadows from TokenManager...");const{includeStyles:r=!0}=t;if(!r)throw new Error("includeStyles must be enabled for shadows generation");if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const n=[];if(r){const a=o.getStyles();console.log("[shadows/tokenManager] Processing styles for shadows..."),a.effect&&n.push(a.effect)}const s=n.flatMap(a=>Object.entries(oe(a,"")).reduce((l,[i,c])=>[...l,{name:i,value:c}],[]));if(s.length===0){console.warn("[shadows/tokenManager] No shadow tokens generated");return}console.log(`[shadows/tokenManager] Generated ${s.length} shadow tokens`),console.log(`[shadows/tokenManager] Writing files to ${e}...`),await pt({shadowTokens:s,dir:e}),console.log("[shadows/tokenManager] ✅ Successfully generated shadow files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[shadows/tokenManager] ❌ Failed to generate shadows:",n),r instanceof Error&&r.stack&&console.error("[shadows/tokenManager] Stack trace:",r.stack),r}}}),bt="styles.module.css",mt="index.ts",kt="typography.ts",z="sans-serif",W=(t,e)=>{if(!e.length)return"";const o=e.map(r=>` ${r}`).join(`
61
61
  `);return`${t} {
62
62
  ${o}
63
- }`},ne=(t,e)=>{if(typeof t!="string")return t;const o=e[t]??t;return o.trim().toLowerCase().endsWith(z)?o:`${o}, ${z}`},G=(t,e)=>typeof t.fontFamily!="string"?t:{...t,fontFamily:ne(t.fontFamily,e)},T=(t,e)=>{const o={};return Object.entries(t).forEach(([r,n])=>{const s=r==="fontFamily"?ne(n,e):n,a=r.replace(/([A-Z])/g,"-$1").toLowerCase();o[a]=s}),o},wt=(t,e,o)=>{const r=Object.keys(t.breakpoints),n=T(t.base,o);return r.reduce((s,a,l)=>{const i=T(t.breakpoints[a],o);return l?[...s,{breakpoint:Number(e[a]),css:i}]:[{breakpoint:null,css:{...n,...i}}]},[{breakpoint:null,css:n}])},se=()=>({base:{},breakpoints:{}}),O=(t,e,o,r)=>{Object.keys(r).length&&(t.breakpoints[e]||(t.breakpoints[e]={}),t.breakpoints[e][o]={...t.breakpoints[e][o],...r})},j=(t,e,o,r)=>{wt(e.value,o,r).forEach(({breakpoint:s,css:a})=>{if(s===null){t.base[e.name]=a;return}O(t,s,e.name,a)})},ae=t=>{const e=q(t.base),o=Object.keys(t.breakpoints).map(Number).sort((r,n)=>n-r).reduce((r,n)=>{const s=t.breakpoints[n];return r+`@media (max-width: ${n}px) { ${q(s)} }`},"");return e+o},$t=(t,e,o)=>{const r=t.reduce((n,s)=>(j(n,s,e,o),n),se());return ae(r)},q=t=>Object.keys(t).reduce((e,o)=>{const r=t[o],n=Object.keys(r).map(s=>`${s}: ${r[s]}`).join(";");return e+`.typo-${o} { ${n} }`},""),J=t=>{if(typeof t=="number")return Number.isFinite(t)?t:null;const e=Number.parseFloat(t);return Number.isFinite(e)?e:null},H=t=>{if(typeof t=="number")return t/16;const e=t.trim().toLowerCase();if(e.endsWith("rem"))return J(e);if(e.endsWith("px")){const o=J(e);return o===null?null:o/16}return null},St=t=>{const{minValueRem:e,maxValueRem:o,minVwRem:r,maxVwRem:n}=t,s=o-e;return`calc(${e}rem + ((100vw - ${r}rem) / (${n}rem - ${r}rem)) * ${s}rem)`},Tt=(t,e,o,r)=>{const n=["font-size","line-height"],s=Object.entries(e.value.breakpoints).map(([p,b])=>{const k=Number.parseInt(o[p],10);return{breakpointName:p,width:k,typography:b}}).filter(p=>Number.isFinite(p.width)).sort((p,b)=>b.width-p.width);if(s.length<2){j(t,e,o,r);return}const a=s[0],l=s[s.length-1];if(a.width<=l.width){j(t,e,o,r);return}const i=T(e.value.base,r),c=T(a.typography,r),u=T(l.typography,r),y=a.width/16,f=l.width/16;if(y===f){j(t,e,o,r);return}t.base[e.name]={...i,...c};const g=n.reduce((p,b)=>{const k=c[b],F=u[b];if(k===void 0||F===void 0||k===F)return p;const R=H(k),A=H(F);return R===null||A===null?p:{...p,[b]:St({minValueRem:A,maxValueRem:R,minVwRem:f,maxVwRem:y})}},{});O(t,a.width,e.name,g),O(t,l.width,e.name,u)},jt=(t,e,o,r)=>{if(!r)return $t(t,e,o);const n=t.reduce((s,a)=>(Tt(s,a,e,o),s),se());return ae(n)},vt=t=>t.length?`import styles from './styles.module.css';
63
+ }`},ne=(t,e)=>{if(typeof t!="string")return t;const o=e[t]??t;return o.trim().toLowerCase().endsWith(z)?o:`${o}, ${z}`},G=(t,e)=>typeof t.fontFamily!="string"?t:{...t,fontFamily:ne(t.fontFamily,e)},T=(t,e)=>{const o={};return Object.entries(t).forEach(([r,n])=>{const s=r==="fontFamily"?ne(n,e):n,a=r.replace(/([A-Z])/g,"-$1").toLowerCase();o[a]=s}),o},wt=(t,e,o)=>{const r=Object.keys(t.breakpoints),n=T(t.base,o);return r.reduce((s,a,l)=>{const i=T(t.breakpoints[a],o);return l?[...s,{breakpoint:Number(e[a]),css:i}]:[{breakpoint:null,css:{...n,...i}}]},[{breakpoint:null,css:n}])},se=()=>({base:{},breakpoints:{}}),O=(t,e,o,r)=>{Object.keys(r).length&&(t.breakpoints[e]||(t.breakpoints[e]={}),t.breakpoints[e][o]={...t.breakpoints[e][o],...r})},j=(t,e,o,r)=>{wt(e.value,o,r).forEach(({breakpoint:s,css:a})=>{if(s===null){t.base[e.name]=a;return}O(t,s,e.name,a)})},ae=t=>{const e=q(t.base),o=Object.keys(t.breakpoints).map(Number).sort((r,n)=>n-r).reduce((r,n)=>{const s=t.breakpoints[n];return r+`@media (max-width: ${n}px) { ${q(s)} }`},"");return e+o},$t=(t,e,o)=>{const r=t.reduce((n,s)=>(j(n,s,e,o),n),se());return ae(r)},q=t=>Object.keys(t).reduce((e,o)=>{const r=t[o],n=Object.keys(r).map(s=>`${s}: ${r[s]}`).join(";");return e+`.typo-${o} { ${n} }`},""),J=t=>{if(typeof t=="number")return Number.isFinite(t)?t:null;const e=Number.parseFloat(t);return Number.isFinite(e)?e:null},H=t=>{if(typeof t=="number")return t/16;const e=t.trim().toLowerCase();if(e.endsWith("rem"))return J(e);if(e.endsWith("px")){const o=J(e);return o===null?null:o/16}return null},St=t=>{const{minValueRem:e,maxValueRem:o,minVwRem:r,maxVwRem:n}=t,s=o-e;return`calc(${e}rem + ((100vw - ${r}rem) / (${n}rem - ${r}rem)) * ${s}rem)`},Tt=(t,e,o,r)=>{const n=["font-size","line-height"],s=Object.entries(e.value.breakpoints).map(([p,b])=>{const k=Number.parseInt(o[p],10);return{breakpointName:p,width:k,typography:b}}).filter(p=>Number.isFinite(p.width)).sort((p,b)=>b.width-p.width);if(s.length<2){j(t,e,o,r);return}const a=s[0],l=s[s.length-1];if(a.width<=l.width){j(t,e,o,r);return}const i=T(e.value.base,r),c=T(a.typography,r),u=T(l.typography,r),f=a.width/16,g=l.width/16;if(f===g){j(t,e,o,r);return}t.base[e.name]={...i,...c};const y=n.reduce((p,b)=>{const k=c[b],F=u[b];if(k===void 0||F===void 0||k===F)return p;const R=H(k),A=H(F);return R===null||A===null?p:{...p,[b]:St({minValueRem:A,maxValueRem:R,minVwRem:g,maxVwRem:f})}},{});O(t,a.width,e.name,y),O(t,l.width,e.name,u)},jt=(t,e,o,r)=>{if(!r)return $t(t,e,o);const n=t.reduce((s,a)=>(Tt(s,a,e,o),s),se());return ae(n)},vt=t=>t.length?`import styles from './styles.module.css';
64
64
  import { typography } from './typography';
65
65
 
66
66
  type TypographyKeysType = keyof typeof typography;
@@ -79,8 +79,8 @@ ${t.map(r=>{const n=G(r.value.base,e),s=Object.entries(r.value.breakpoints).redu
79
79
  } as const;
80
80
 
81
81
  export { typography };
82
- `:"",Ft=async({indexTSContent:t,typographyTSContent:e,cssContent:o,dir:r})=>{await d.delete(r);const n=d.write(mt,t,{directory:r}),s=d.write(kt,e,{directory:r}),a=d.write(bt,o,{directory:r});await Promise.all([n,s,a])},Ct=async({typographyTokens:t,dir:e,breakpoints:o,fontFamily:r,fluid:n})=>{const s=jt(t,o,r,n),a=Mt(t,r),l=vt(t);await Ft({indexTSContent:l,typographyTSContent:a,cssContent:s,dir:e})},ie=(t,e,o)=>Object.keys(t).reduce((r,n)=>{const s=t[n];if(typeof s!="object"||Array.isArray(s))return r;if(!("type"in s)||!("value"in s))return{...r,[n]:ie(s,e,o)};if(s.type!=="typography")return r;const a=s.value,l=Object.entries(a).reduce((i,[c,u])=>{const y=Object.keys(o.breakpoints);if(y.length)y.forEach(f=>{const g=e.resolveVariableValueString(u,f);g&&(g===u?i.base={...i.base,[c]:g}:i.breakpoints[f]={...i.breakpoints[f],[c]:g})});else{const f=e.resolveVariableValueString(u);f&&(i.base={...i.base,[c]:f})}return i},{base:{},breakpoints:{}});return{...r,[n]:{type:"typography",value:l}}},{}),le=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=e?`${e}-${r}`:r,s=t[r];if(!("type"in s)||!("value"in s))return{...o,...le(s,n)};const a=s.value;return{...o,[n]:a}},{}),Vt=({input:t,output:{dir:e}})=>({name:"typography/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[typography/tokenManager] Generating typography from TokenManager...");const{breakpoints:r,fontFamily:n}=t,s=t.fluid??!0;if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const a=[],l=o.getStyles();console.log("[typography/tokenManager] Processing styles for typography..."),l.text&&a.push(l.text);const i=a.reduce((u,y)=>({...u,...ie(y,o,{breakpoints:t.breakpoints})}),{}),c=Object.entries(le(i)).map(([u,y])=>({name:u,value:y}));if(c.length===0){console.warn("[typography/tokenManager] No typography tokens generated");return}console.log(`[typography/tokenManager] Generated ${c.length} typography tokens`),console.log(`[typography/tokenManager] Writing files to ${e}...`),await Ct({typographyTokens:c,dir:e,breakpoints:r,fontFamily:n||{},fluid:s}),console.log("[typography/tokenManager] ✅ Successfully generated typography files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[typography/tokenManager] ❌ Failed to generate typography:",n),r instanceof Error&&r.stack&&console.error("[typography/tokenManager] Stack trace:",r.stack),r}}}),Nt=t=>typeof t=="object"&&t!==null&&"type"in t&&"value"in t,xt=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),ce=t=>t.trim().split(".").map(e=>e.trim()).filter(Boolean),ue=(t,e)=>{const o=ce(e);if(!o.length)throw new Error("variablePath must contain at least one segment");const r=Q(t,o);if(r===void 0)throw new Error(`Variables subtree not found at path: ${o.join(".")}`);return r},de=(t,e,o)=>{if(!t)return[];if(Nt(t)){if(t.type!=="dimension")return[];const r=t.value,n=Object.keys(r).reduce((s,a)=>{const l=r[a],i=o.resolveVariableValueString(l,a);return{...s,[a]:i??l}},{});return[{flatName:e,resolvedByMode:n}]}return xt(t)?Object.keys(t).flatMap(r=>{const n=t[r],s=e?`${e}-${r}`:r;return de(n,s,o)}):[]},ye=(t,e)=>de(t,"",e),fe=(t,e)=>typeof e=="string"?t===e:e.test(t),ge=(t,e)=>e!=null&&e.length?t.filter(o=>e.some(r=>fe(o.flatName,r))):t,E=t=>Object.keys(t).map(e=>({mode:e,widthPx:Number.parseInt(t[e],10)})).filter(e=>Number.isFinite(e.widthPx)).sort((e,o)=>o.widthPx-e.widthPx),pe=t=>{const e=ce(t);if(!e.length)throw new Error("variablePath must contain at least one segment");const o=e[e.length-1];return{variablesClassName:`${o}-variables`,variableNamePrefix:o}},B=t=>{const e=pe(t.variablePath),o=t.variableNamePrefix??e.variableNamePrefix,r=t.variablesClassName??`${o}-variables`;return{variableNamePrefix:o,variablesClassName:r}},he=(t,e)=>t?`--${t}-${e}`:`--${e}`,Ot=(t,e)=>Object.keys(e).reduce((o,r)=>{const n=Number(r);return{...o,[n]:{...o[n],...e[n]}}},{...t}),be=(t,e,o)=>{const r=he(o,t.flatName),n=E(e);if(Object.keys(e).length===0||n.length===0){const i=Object.values(t.resolvedByMode)[0]??"";return{base:{[r]:i},byBreakpoint:{}}}const s=n.filter(i=>i.mode in t.resolvedByMode);if(s.length===0){const i=Object.values(t.resolvedByMode)[0]??"";return{base:{[r]:i},byBreakpoint:{}}}if(s.length===1){const i=s[0],c=t.resolvedByMode[i.mode]??"";return{base:{[r]:c},byBreakpoint:{}}}const a=t.resolvedByMode[s[0].mode]??"",l=s.slice(1).reduce((i,c,u)=>{const y=s[u].mode,f=t.resolvedByMode[y],g=t.resolvedByMode[c.mode];if(g===void 0||g===f)return i;const p=c.widthPx,b=i[p]??{};return{...i,[p]:{...b,[r]:g}}},{});return{base:{[r]:a},byBreakpoint:l}},Pt=(t,e,o)=>t.reduce((r,n)=>{const{base:s,byBreakpoint:a}=be(n,e,o);return{base:{...r.base,...s},breakpoints:Ot(r.breakpoints,a)}},{base:{},breakpoints:{}}),me=(t,e)=>{if(!t.length)return"";const{breakpoints:o}=e,{variablesClassName:r,variableNamePrefix:n}=B(e),s=Pt(t,o,n),a=Object.keys(s.base).map(c=>` ${c}: ${s.base[c]};`),l=W(`.${r}`,a),i=Object.keys(s.breakpoints).map(Number).sort((c,u)=>u-c).map(c=>{const u=s.breakpoints[c],y=Object.keys(u).map(g=>` ${g}: ${u[g]};`),f=W(`.${r}`,y);return`@media (max-width: ${c}px) {
83
- ${f}
82
+ `:"",Ft=async({indexTSContent:t,typographyTSContent:e,cssContent:o,dir:r})=>{await d.delete(r);const n=d.write(mt,t,{directory:r}),s=d.write(kt,e,{directory:r}),a=d.write(bt,o,{directory:r});await Promise.all([n,s,a])},Ct=async({typographyTokens:t,dir:e,breakpoints:o,fontFamily:r,fluid:n})=>{const s=jt(t,o,r,n),a=Mt(t,r),l=vt(t);await Ft({indexTSContent:l,typographyTSContent:a,cssContent:s,dir:e})},ie=(t,e,o)=>Object.keys(t).reduce((r,n)=>{const s=t[n];if(typeof s!="object"||Array.isArray(s))return r;if(!("type"in s)||!("value"in s))return{...r,[n]:ie(s,e,o)};if(s.type!=="typography")return r;const a=s.value,l=Object.entries(a).reduce((i,[c,u])=>{const f=Object.keys(o.breakpoints);if(f.length)f.forEach(g=>{const y=e.resolveVariableValueString(u,g);y&&(y===u?i.base={...i.base,[c]:y}:i.breakpoints[g]={...i.breakpoints[g],[c]:y})});else{const g=e.resolveVariableValueString(u);g&&(i.base={...i.base,[c]:g})}return i},{base:{},breakpoints:{}});return{...r,[n]:{type:"typography",value:l}}},{}),le=(t,e)=>Object.keys(t).reduce((o,r)=>{const n=e?`${e}-${r}`:r,s=t[r];if(!("type"in s)||!("value"in s))return{...o,...le(s,n)};const a=s.value;return{...o,[n]:a}},{}),Vt=({input:t,output:{dir:e}})=>({name:"typography/tokenManager",executor:async({tokenManagerClient:o})=>{try{console.log("[typography/tokenManager] Generating typography from TokenManager...");const{breakpoints:r,fontFamily:n}=t,s=t.fluid??!0;if(!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const a=[],l=o.getStyles();console.log("[typography/tokenManager] Processing styles for typography..."),l.text&&a.push(l.text);const i=a.reduce((u,f)=>({...u,...ie(f,o,{breakpoints:t.breakpoints})}),{}),c=Object.entries(le(i)).map(([u,f])=>({name:u,value:f}));if(c.length===0){console.warn("[typography/tokenManager] No typography tokens generated");return}console.log(`[typography/tokenManager] Generated ${c.length} typography tokens`),console.log(`[typography/tokenManager] Writing files to ${e}...`),await Ct({typographyTokens:c,dir:e,breakpoints:r,fontFamily:n||{},fluid:s}),console.log("[typography/tokenManager] ✅ Successfully generated typography files")}catch(r){const n=r instanceof Error?r.message:String(r);throw console.error("[typography/tokenManager] ❌ Failed to generate typography:",n),r instanceof Error&&r.stack&&console.error("[typography/tokenManager] Stack trace:",r.stack),r}}}),Nt=t=>typeof t=="object"&&t!==null&&"type"in t&&"value"in t,xt=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),ce=t=>t.trim().split(".").map(e=>e.trim()).filter(Boolean),ue=(t,e)=>{const o=ce(e);if(!o.length)throw new Error("variablePath must contain at least one segment");const r=Q(t,o);if(r===void 0)throw new Error(`Variables subtree not found at path: ${o.join(".")}`);return r},de=(t,e,o)=>{if(!t)return[];if(Nt(t)){if(t.type!=="dimension")return[];const r=t.value,n=Object.keys(r).reduce((s,a)=>{const l=r[a],i=o.resolveVariableValueString(l,a);return{...s,[a]:i??l}},{});return[{flatName:e,resolvedByMode:n}]}return xt(t)?Object.keys(t).flatMap(r=>{const n=t[r],s=e?`${e}-${r}`:r;return de(n,s,o)}):[]},fe=(t,e)=>de(t,"",e),ge=(t,e)=>typeof e=="string"?t===e:e.test(t),ye=(t,e)=>e!=null&&e.length?t.filter(o=>e.some(r=>ge(o.flatName,r))):t,E=t=>Object.keys(t).map(e=>({mode:e,widthPx:Number.parseInt(t[e],10)})).filter(e=>Number.isFinite(e.widthPx)).sort((e,o)=>o.widthPx-e.widthPx),pe=t=>{const e=ce(t);if(!e.length)throw new Error("variablePath must contain at least one segment");const o=e[e.length-1];return{variablesClassName:`${o}-variables`,variableNamePrefix:o}},B=t=>{const e=pe(t.variablePath),o=t.variableNamePrefix??e.variableNamePrefix,r=t.variablesClassName??`${o}-variables`;return{variableNamePrefix:o,variablesClassName:r}},he=(t,e)=>t?`--${t}-${e}`:`--${e}`,Ot=(t,e)=>Object.keys(e).reduce((o,r)=>{const n=Number(r);return{...o,[n]:{...o[n],...e[n]}}},{...t}),be=(t,e,o)=>{const r=he(o,t.flatName),n=E(e);if(Object.keys(e).length===0||n.length===0){const i=Object.values(t.resolvedByMode)[0]??"";return{base:{[r]:i},byBreakpoint:{}}}const s=n.filter(i=>i.mode in t.resolvedByMode);if(s.length===0){const i=Object.values(t.resolvedByMode)[0]??"";return{base:{[r]:i},byBreakpoint:{}}}if(s.length===1){const i=s[0],c=t.resolvedByMode[i.mode]??"";return{base:{[r]:c},byBreakpoint:{}}}const a=t.resolvedByMode[s[0].mode]??"",l=s.slice(1).reduce((i,c,u)=>{const f=s[u].mode,g=t.resolvedByMode[f],y=t.resolvedByMode[c.mode];if(y===void 0||y===g)return i;const p=c.widthPx,b=i[p]??{};return{...i,[p]:{...b,[r]:y}}},{});return{base:{[r]:a},byBreakpoint:l}},Pt=(t,e,o)=>t.reduce((r,n)=>{const{base:s,byBreakpoint:a}=be(n,e,o);return{base:{...r.base,...s},breakpoints:Ot(r.breakpoints,a)}},{base:{},breakpoints:{}}),me=(t,e)=>{if(!t.length)return"";const{breakpoints:o}=e,{variablesClassName:r,variableNamePrefix:n}=B(e),s=Pt(t,o,n),a=Object.keys(s.base).map(c=>` ${c}: ${s.base[c]};`),l=W(`.${r}`,a),i=Object.keys(s.breakpoints).map(Number).sort((c,u)=>u-c).map(c=>{const u=s.breakpoints[c],f=Object.keys(u).map(y=>` ${y}: ${u[y]};`),g=W(`.${r}`,f);return`@media (max-width: ${c}px) {
83
+ ${g}
84
84
  }`}).filter(Boolean).join(`
85
85
 
86
86
  `);return i?`${l}
@@ -96,4 +96,4 @@ export { utilities };
96
96
 
97
97
  export { utilities };
98
98
  `},$e=t=>{const{variableNamePrefix:e}=B(t);return["import { utilities } from './utilities';","","type UtilitiesKeysType = keyof typeof utilities;","",`const utilityVariableNamePrefix = ${JSON.stringify(e)};`,"","const getUtilityCssVariableName = (key: UtilitiesKeysType): string =>"," utilityVariableNamePrefix"," ? `--${utilityVariableNamePrefix}-${String(key)}`"," : `--${String(key)}`;","","const getUtilityCssVar = (key: UtilitiesKeysType): string =>"," `var(${getUtilityCssVariableName(key)})`;","","export {"," utilities,"," getUtilityCssVariableName,"," getUtilityCssVar,"," type UtilitiesKeysType,","};",""].join(`
99
- `)},Et="styles.css",Bt="utilities.ts",Rt="index.ts",Se=async({dir:t,globalCss:e,utilitiesTs:o,indexTs:r})=>{await d.delete(t),await Promise.all([d.write(Et,e,{directory:t}),d.write(Bt,o,{directory:t}),d.write(Rt,r,{directory:t})])},Te=async({tokens:t,input:e,output:o})=>{const{dir:r}=o,n=me(t,e),s=we(t,e),a=$e(e);await Se({dir:r,globalCss:n,utilitiesTs:s,indexTs:a})},At=({input:t,output:e})=>({name:"utilities/tokenManager",executor:async({tokenManagerClient:o})=>{var r;try{if(console.log("[utilities/tokenManager] Generating utility classes from TokenManager..."),!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const n=o.getVariables(),s=ue(n,t.variablePath),a=ye(s,o),l=ge(a,t.include);if(!l.length){a.length&&((r=t.include)!=null&&r.length)?console.warn(`[utilities/tokenManager] No tokens left after include filter (${a.length} at path "${t.variablePath}")`):console.warn(`[utilities/tokenManager] No dimension tokens found at path "${t.variablePath}"`);return}console.log(`[utilities/tokenManager] Resolved ${l.length} utility token(s)`),console.log(`[utilities/tokenManager] Writing files to ${e.dir}...`),await Te({tokens:l,input:t,output:e}),console.log("[utilities/tokenManager] ✅ Successfully generated utility files")}catch(n){const s=n instanceof Error?n.message:String(n);throw console.error("[utilities/tokenManager] ❌ Failed to generate utilities:",s),n instanceof Error&&n.stack&&console.error("[utilities/tokenManager] Stack trace:",n.stack),n}}});exports.BREAKPOINTS_NAMES=Y;exports.TokenManager=X;exports.breakpointsFromTokenManager=Ke;exports.buildUtilitiesDataTSContent=we;exports.buildUtilitiesGlobalStylesCSS=me;exports.buildUtilitiesIndexTSContent=$e;exports.colorsFromTokenManager=_e;exports.containerFromTokenManager=at;exports.deriveUtilityNamingFromVariablePath=pe;exports.filterResolvedUtilitiesByInclude=ge;exports.generate=Ve;exports.generateUtilitiesFiles=Te;exports.getSortedBreakpointModes=E;exports.getUtilityCssVariableName=he;exports.getVariablesSubtree=ue;exports.init=Ne;exports.resolveUtilitiesSubtree=ye;exports.resolveUtilityNaming=B;exports.shadowsFromTokenManager=ht;exports.splitUtilityTokenForMedia=be;exports.typographyFromTokenManager=Vt;exports.utilitiesFromTokenManager=At;exports.utilityFlatNameMatchesIncludePattern=fe;exports.utilityTokenToSerializableData=ke;exports.writeUtilitiesFiles=Se;
99
+ `)},Et="styles.css",Bt="utilities.ts",Rt="index.ts",Se=async({dir:t,globalCss:e,utilitiesTs:o,indexTs:r})=>{await d.delete(t),await Promise.all([d.write(Et,e,{directory:t}),d.write(Bt,o,{directory:t}),d.write(Rt,r,{directory:t})])},Te=async({tokens:t,input:e,output:o})=>{const{dir:r}=o,n=me(t,e),s=we(t,e),a=$e(e);await Se({dir:r,globalCss:n,utilitiesTs:s,indexTs:a})},At=({input:t,output:e})=>({name:"utilities/tokenManager",executor:async({tokenManagerClient:o})=>{var r;try{if(console.log("[utilities/tokenManager] Generating utility classes from TokenManager..."),!o.isLoaded())throw new Error("TokenManager is not loaded. Tokens must be loaded before using this module.");const n=o.getVariables(),s=ue(n,t.variablePath),a=fe(s,o),l=ye(a,t.include);if(!l.length){a.length&&((r=t.include)!=null&&r.length)?console.warn(`[utilities/tokenManager] No tokens left after include filter (${a.length} at path "${t.variablePath}")`):console.warn(`[utilities/tokenManager] No dimension tokens found at path "${t.variablePath}"`);return}console.log(`[utilities/tokenManager] Resolved ${l.length} utility token(s)`),console.log(`[utilities/tokenManager] Writing files to ${e.dir}...`),await Te({tokens:l,input:t,output:e}),console.log("[utilities/tokenManager] ✅ Successfully generated utility files")}catch(n){const s=n instanceof Error?n.message:String(n);throw console.error("[utilities/tokenManager] ❌ Failed to generate utilities:",s),n instanceof Error&&n.stack&&console.error("[utilities/tokenManager] Stack trace:",n.stack),n}}});exports.BREAKPOINTS_NAMES=Y;exports.TokenManager=X;exports.breakpointsFromTokenManager=Ke;exports.buildUtilitiesDataTSContent=we;exports.buildUtilitiesGlobalStylesCSS=me;exports.buildUtilitiesIndexTSContent=$e;exports.colorsFromTokenManager=_e;exports.containerFromTokenManager=at;exports.deriveUtilityNamingFromVariablePath=pe;exports.filterResolvedUtilitiesByInclude=ye;exports.generate=Ve;exports.generateUtilitiesFiles=Te;exports.getSortedBreakpointModes=E;exports.getUtilityCssVariableName=he;exports.getVariablesSubtree=ue;exports.init=Ne;exports.resolveUtilitiesSubtree=fe;exports.resolveUtilityNaming=B;exports.shadowsFromTokenManager=ht;exports.splitUtilityTokenForMedia=be;exports.typographyFromTokenManager=Vt;exports.utilitiesFromTokenManager=At;exports.utilityFlatNameMatchesIncludePattern=ge;exports.utilityTokenToSerializableData=ke;exports.writeUtilitiesFiles=Se;
package/index.mjs CHANGED
@@ -5,18 +5,18 @@ import k from "path";
5
5
  import { tsImport as de } from "ts-import";
6
6
  import { existsSync as C } from "node:fs";
7
7
  import { readFile as V, mkdir as fe, writeFile as ye, rm as ge } from "node:fs/promises";
8
- import { resolve as F } from "node:path";
8
+ import { resolve as x } from "node:path";
9
9
  const h = class h {
10
10
  static resolveReadPath(e) {
11
11
  if (!e || !e.trim())
12
12
  throw new Error("File path must be a non-empty string");
13
- return F(h.baseDir, e);
13
+ return x(h.baseDir, e);
14
14
  }
15
15
  static resolveWritePath(e, o) {
16
- const r = F(h.baseDir, o ?? "");
16
+ const r = x(h.baseDir, o ?? "");
17
17
  return {
18
18
  targetDir: r,
19
- targetPath: F(r, e)
19
+ targetPath: x(r, e)
20
20
  };
21
21
  }
22
22
  static handleReadError(e, o) {
@@ -85,7 +85,8 @@ const $ = class $ {
85
85
  const e = await de.compile(
86
86
  `${k.resolve(process.cwd(), $.configFileName)}`
87
87
  );
88
- if (!e) throw new Error();
88
+ if (!e)
89
+ throw new Error("gts.config.ts must default-export a configuration object");
89
90
  return e.default;
90
91
  } catch (e) {
91
92
  console.error("Cannot find module gts.config.ts", e);
@@ -126,7 +127,7 @@ class P {
126
127
  async performControlledRequest(e, { params: o = {}, timeout: r = 3e4, abortController: n = new AbortController() } = {}) {
127
128
  var g;
128
129
  if (!this.figmaToken || !this.fileId)
129
- throw new Error("Добавьте figmaToken и figmaId");
130
+ throw new Error("figmaToken and fileId are required in gts.config.ts");
130
131
  const s = Object.entries(o).reduce((p, [b, w]) => typeof w < "u" ? { ...p, [b]: w } : p, {}), a = `https://api.figma.com/v1${e}${s && Object.keys(s).length ? `?${pe(s)}` : ""}`;
131
132
  console.log("endpoinWithParams=", a);
132
133
  const l = setTimeout(() => n.abort(), r), i = {
@@ -180,7 +181,7 @@ const q = (t, e) => {
180
181
  e.hasOwnProperty(r) && (typeof e[r] == "object" && e[r] !== null && typeof o[r] == "object" && o[r] !== null ? o[r] = H(o[r], e[r]) : o[r] = e[r]);
181
182
  return o;
182
183
  };
183
- function x(t, e) {
184
+ function N(t, e) {
184
185
  if (t === e)
185
186
  return !0;
186
187
  if (t == null || e == null)
@@ -195,7 +196,7 @@ function x(t, e) {
195
196
  if (t.length !== e.length)
196
197
  return !1;
197
198
  for (let o = 0; o < t.length; o++)
198
- if (!x(t[o], e[o]))
199
+ if (!N(t[o], e[o]))
199
200
  return !1;
200
201
  return !0;
201
202
  }
@@ -204,7 +205,7 @@ function x(t, e) {
204
205
  if (o.length !== r.length)
205
206
  return !1;
206
207
  for (const n of o)
207
- if (!r.includes(n) || !x(t[n], e[n]))
208
+ if (!r.includes(n) || !N(t[n], e[n]))
208
209
  return !1;
209
210
  return !0;
210
211
  }
@@ -437,7 +438,9 @@ class be {
437
438
  const Kt = async () => {
438
439
  const e = await new j().load();
439
440
  if (!e)
440
- throw new Error("Заполнить ошибку через нейронку");
441
+ throw new Error(
442
+ 'Failed to load gts.config.ts. Run "npx gts-init" to create it, or ensure the file exists and default-exports a valid configuration.'
443
+ );
441
444
  const { figmaToken: o, fileId: r, modules: n, manifest: s } = e, a = new P(o, r), l = new be(s);
442
445
  s && d.exists(s) && await l.load(), await Promise.all(n.map((i) => i.executor({ figmaApiClient: a, tokenManagerClient: l })));
443
446
  }, Lt = async () => {
@@ -452,7 +455,7 @@ const Kt = async () => {
452
455
  await d.delete(t, e);
453
456
  }, Se = async (t, e, o) => {
454
457
  await d.write(t, e, { directory: o });
455
- }, N = async (t, e, o) => {
458
+ }, F = async (t, e, o) => {
456
459
  await $e(t, o), await Se(t, e, o);
457
460
  }, Te = (t) => {
458
461
  const e = t.map(({ name: o, value: r }) => ` --${o}: ${r};`);
@@ -486,9 +489,9 @@ $defaultBreakpoint: '${o}';
486
489
  `), Me = async ({ breakpointTokens: t, dir: e }) => {
487
490
  const o = ke(t), r = Te(t), n = je(t), s = ve(o);
488
491
  await Promise.all([
489
- N("styles.css", r, e),
490
- N("styles.scss", n, e),
491
- N("index.ts", s, e)
492
+ F("styles.css", r, e),
493
+ F("styles.scss", n, e),
494
+ F("index.ts", s, e)
492
495
  ]);
493
496
  }, Ce = (t, e) => {
494
497
  const o = Object.keys(t).filter((s) => !isNaN(Number(s))).sort((s, a) => Number(s) - Number(a));
@@ -536,14 +539,14 @@ $defaultBreakpoint: '${o}';
536
539
  throw console.error("[breakpoints/tokenManager] ❌ Failed to generate breakpoints:", n), r instanceof Error && r.stack && console.error("[breakpoints/tokenManager] Stack trace:", r.stack), r;
537
540
  }
538
541
  }
539
- }), Ve = "styles.css", Fe = "index.ts", A = (t, e) => {
542
+ }), Ve = "styles.css", xe = "index.ts", A = (t, e) => {
540
543
  if (!e.length) return "";
541
544
  const o = e.map((r) => ` ${r}`).join(`
542
545
  `);
543
546
  return `${t} {
544
547
  ${o}
545
548
  }`;
546
- }, Ne = (t) => `.${t.replace(/\s+/g, "-").toLowerCase()}`, Q = (t) => `--cl-${t}`, xe = (t) => t.reduce(
549
+ }, Fe = (t) => `.${t.replace(/\s+/g, "-").toLowerCase()}`, Q = (t) => `--cl-${t}`, Ne = (t) => t.reduce(
547
550
  (e, o) => {
548
551
  const r = Q(o.name);
549
552
  return typeof o.value == "object" ? Object.entries(o.value).forEach(([n, s]) => {
@@ -554,7 +557,7 @@ ${o}
554
557
  ), Oe = (t) => {
555
558
  const e = A(".color-variables", t.root), o = Object.entries(t).reduce((r, [n, s]) => {
556
559
  if (n === "root" || !s.length) return r;
557
- const a = A(Ne(`${n}-color-variables`), s);
560
+ const a = A(Fe(`${n}-color-variables`), s);
558
561
  return a && r.push(a), r;
559
562
  }, []).join(`
560
563
 
@@ -576,10 +579,10 @@ export { colors, type ColorsKeysType };
576
579
  dir: o
577
580
  }) => {
578
581
  await d.delete(o);
579
- const r = d.write(Fe, t, { directory: o }), n = d.write(Ve, e, { directory: o });
582
+ const r = d.write(xe, t, { directory: o }), n = d.write(Ve, e, { directory: o });
580
583
  await Promise.all([r, n]);
581
584
  }, Be = async ({ colorTokens: t, dir: e }) => {
582
- const o = xe(t), r = Oe(o), n = Pe(t);
585
+ const o = Ne(t), r = Oe(o), n = Pe(t);
583
586
  await Ee({ tsContent: n, cssContent: r, dir: e });
584
587
  }, v = (t) => t.reduce((e, o) => {
585
588
  const r = Number((o.position * 100).toFixed(1));
@@ -704,7 +707,7 @@ export const conatinerTabletClassName = styles.containerTablet;
704
707
  ];
705
708
  }, []).reduce((s, a) => {
706
709
  const l = s[s.length - 1];
707
- return l && x(l.offset, a.offset) || s.push(a), s;
710
+ return l && N(l.offset, a.offset) || s.push(a), s;
708
711
  }, []), zt = ({
709
712
  input: t = {},
710
713
  output: { dir: e }
@@ -1210,7 +1213,7 @@ export { utilities };
1210
1213
  ""
1211
1214
  ].join(`
1212
1215
  `);
1213
- }, Vt = "styles.css", Ft = "utilities.ts", Nt = "index.ts", xt = async ({
1216
+ }, Vt = "styles.css", xt = "utilities.ts", Ft = "index.ts", Nt = async ({
1214
1217
  dir: t,
1215
1218
  globalCss: e,
1216
1219
  utilitiesTs: o,
@@ -1218,8 +1221,8 @@ export { utilities };
1218
1221
  }) => {
1219
1222
  await d.delete(t), await Promise.all([
1220
1223
  d.write(Vt, e, { directory: t }),
1221
- d.write(Ft, o, { directory: t }),
1222
- d.write(Nt, r, { directory: t })
1224
+ d.write(xt, o, { directory: t }),
1225
+ d.write(Ft, r, { directory: t })
1223
1226
  ]);
1224
1227
  }, Ot = async ({
1225
1228
  tokens: t,
@@ -1227,7 +1230,7 @@ export { utilities };
1227
1230
  output: o
1228
1231
  }) => {
1229
1232
  const { dir: r } = o, n = jt(t, e), s = Mt(t, e), a = Ct(e);
1230
- await xt({ dir: r, globalCss: n, utilitiesTs: s, indexTs: a });
1233
+ await Nt({ dir: r, globalCss: n, utilitiesTs: s, indexTs: a });
1231
1234
  }, Jt = ({ input: t, output: e }) => ({
1232
1235
  name: "utilities/tokenManager",
1233
1236
  executor: async ({ tokenManagerClient: o }) => {
@@ -1274,5 +1277,5 @@ export {
1274
1277
  Jt as utilitiesFromTokenManager,
1275
1278
  bt as utilityFlatNameMatchesIncludePattern,
1276
1279
  vt as utilityTokenToSerializableData,
1277
- xt as writeUtilitiesFiles
1280
+ Nt as writeUtilitiesFiles
1278
1281
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greensight/gts",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.3",
4
4
  "description": "Generate design tokens from Figma",
5
5
  "keywords": [
6
6
  "figma",