@teacss/language-server 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +1 -1
- package/package.json +7 -7
package/dist/server.js
CHANGED
|
@@ -31,4 +31,4 @@ const ti={216:`O`,223:`s`,248:`o`,273:`d`,295:`h`,305:`i`,320:`l`,322:`l`,359:`t
|
|
|
31
31
|
`)}function tl(e,t,n){let r=new Map,i=new Set([me]);for(let e of n){let t=e[4]?.layer||`utilities`;i.add(t);let n=e[3]||``,a=r.get(t);a||(a=new Map,r.set(t,a));let o=a.get(n);o?o.push(e):a.set(n,[e])}let a=t=>Object.hasOwn(e.layers,t)?e.layers[t]??0:0,o=e.sortLayers([...i].sort((e,t)=>a(e)-a(t)||qc(e,t))),s=[];for(let n of o){let i=r.get(n);if(i)for(let n of[...i.keys()].sort((e,n)=>vr(t,e,n))){let t=el(i.get(n),e.mergeSelectors,Qc(n));if(t)if(!n)s.push(t);else{let e=Zc(n);s.push(`${e.join(`{`)}{${t}${`}`.repeat(e.length)}`)}}}return s.join(`
|
|
32
32
|
`)}async function nl(e,t){let n=e.config,r=await e.parseToken(t);if(e.config!==n)return nl(e,t);if(r?.length)return Cc(tl(n,new Map(e.parentOrders),r))}async function rl(e,t){let n=Kc.get(e);return(!n||n.config!==e.config)&&(n={config:e.config,values:new Map},Kc.set(e,n)),Xr(n.values,t,1e3,()=>nl(e,t).then(e=>e?{colorString:e,color:wc(e)}:{}))}const il=[...Nc,`teacss`],al={tokenTypes:[...Mc],tokenModifiers:il},ol=new Map(Mc.map((e,t)=>[e,t])),sl=new Map(il.map((e,t)=>[e,1<<t])),cl=sl.get(`teacss`)??0,ll=/^-?(?:\d+\.?\d*|\.\d+)[a-z%]*$/i,ul=new WeakMap,dl={log(){},warn(){}};function fl(e,t){let n=Ko(e,t)?.toLowerCase();return n?.endsWith(`class`)||n?.endsWith(`classname`)}function pl(e){let t=[];if(!e.includes(`:`))for(let n=e.indexOf(`-`);n>0;n=e.indexOf(`-`,n+1))t.push(`${e.slice(0,n)}:${e.slice(n+1)}`);let n=e.indexOf(`:`);return n>0&&e.indexOf(`:`,n+1)>n&&t.push(`${e.slice(n+1)}@${e.slice(0,n)}`),t}function ml(e,t){let n=e[t-1];if(n===`"`||n===`'`){for(let r=t;r<e.length;r++)if(e[r]===`\\`)r++;else if(e[r]===n)return r;return e.length}let r=t;for(;r<e.length&&!/[\s>]/.test(e[r]);)r++;return r}async function hl(e,t,n){let r=Array(e.length),i=0,a=Array.from({length:Math.min(t,e.length)},async()=>{for(;i<e.length;){let t=i++;r[t]=await n(e[t],t)}});return await Promise.all(a),r}function gl(e){return!e.startsWith(`[`)||!e.endsWith(`]`)||wc(e.slice(1,-1).replace(/\\?_/g,e=>e===`_`?` `:`_`).trim())!==void 0}function _l(e){let t=ul.get(e);if(t?.config===e.config)return t.classifier;let n=oc(e.config?.theme??{});return ul.set(e,{config:e.config,classifier:n}),n}function vl(e){e.sort((e,t)=>e.line-t.line||e.char-t.char);let t=[],n=0,r=0;for(let i of e){let e=i.line-n,a=e===0?i.char-r:i.char;t.push(e,a,i.length,i.type,i.modifiers),n=i.line,r=i.char}return{data:t}}function yl(e,t,n,r,i=cl){let a=e.positionAt(t);return{line:a.line,char:a.character,length:n,type:ol.get(r)??0,modifiers:i}}function bl(e,t,n,r,i=cl){let a=[],o=0;for(let s=0;s<n.length;s++)(n[s]===`\r`||n[s]===`
|
|
33
33
|
`)&&(s>o&&a.push(yl(e,t+o,s-o,r,i)),n[s]===`\r`&&n[s+1]===`
|
|
34
|
-
`&&s++,o=s+1);return o<n.length&&a.push(yl(e,t+o,n.length-o,r,i)),a}function xl(e,t){return t.isColorValue?.(e)?`enumMember`:ll.test(e)?`number`:`string`}function Sl(e,t,n){return e.some(e=>e.open===t&&e.close===n-1)}function Cl(e,t,n){let r=[];for(let i of n){r.push(yl(e,i.open,1,`operator`,cl|(sl.get(`group`)??0)));for(let n of i.declarations){let{property:i,start:a,colon:o,value:s,valueStart:c}=n;r.push(yl(e,a,2,`operator`,cl|(sl.get(`variable`)??0))),r.push(yl(e,a+2,i.length-2,`property`)),r.push(yl(e,o,1,`operator`)),s&&r.push(...bl(e,c,s,xl(s,t)))}r.push(yl(e,i.close,1,`operator`,cl|(sl.get(`group`)??0)))}return r}var wl=class{contextManager;getSettings;logger;autoCompletes=new Map;semanticTokensCache=new Map;featureFailures=new Map;constructor(e){this.getSettings=e.getSettings??(()=>nc),this.logger=e.logger??dl;let t=e.folderPaths?.length?e.folderPaths:[e.rootPath];this.contextManager=new Ms(e.rootPath,this.logger,t),this.contextManager.events.on(`contextReload`,e=>this.resetFeatureCaches(e)),this.contextManager.events.on(`contextUnload`,e=>this.resetFeatureCaches(e)),this.contextManager.events.on(`unload`,e=>this.resetFeatureCaches(e))}get events(){return this.contextManager.events}get ready(){return this.contextManager.ready}resetAutoCompleteCache(e){e?this.autoCompletes.delete(e):this.autoCompletes.clear()}resetFeatureCaches(e){this.resetAutoCompleteCache(e),this.semanticTokensCache.clear(),this.featureFailures.clear()}reportFeatureFailure(e,t,n){let r=`${e}\0${t}`,i=n instanceof Error?n.message:String(n);this.featureFailures.get(r)!==i&&(Yr(this.featureFailures,r,i,100),this.logger.warn(`⚠️ Failed to provide ${e} for ${t}: ${i}`))}clearFeatureFailure(e,t){this.featureFailures.delete(`${e}\0${t}`)}getAutocomplete(e,t){let n=this.autoCompletes.get(e);if(n?.matchType===t)return n.autocomplete;let r=Ss(e.generator,{matchType:t,throwErrors:!1});return this.autoCompletes.set(e,{matchType:t,autocomplete:r}),r}async resolveTargetContext(e){let t=Cs(e.uri);if(!this.contextManager.isTarget(t))return null;let n=e.getText();if(!n)return null;let r=await this.contextManager.resolveClosestContext(n,t);return!r||!(r.filter(n,t)||n.includes(`@teacss-ide-include`)||this.contextManager.configSources.includes(t)||fn(t))?null:{ctx:r,id:t,code:n,doc:e.getText()===n?e:O.create(e.uri,e.languageId,e.version,n)}}async getSemanticTokens(e){let t={data:[]},n=`semantic tokens`;try{let r=this.getSettings();if(!r.syntaxHighlight)return this.clearFeatureFailure(n,e.uri),t;let i=await this.resolveTargetContext(e);if(!i)return this.clearFeatureFailure(n,e.uri),t;let{ctx:a,id:o,code:s,doc:c}=i,l=r.strictAnnotationMatch,u=this.semanticTokensCache.get(o);if(u&&u.code===s&&u.generator===a.generator&&u.strictAnnotationMatch===l)return Yr(this.semanticTokensCache,o,u,100),this.clearFeatureFailure(n,e.uri),u.result;let d=await ei(a.generator,s,o,l),f=_l(a.generator),p=[],m=new Map,h=fn(o)?v(s):[];for(let[e,t]of d){if(Sl(h,e,t))continue;let n=s.slice(e,t),r=m.get(n);r||(r=Hc(n,0,f),m.set(n,r));for(let t of r){let n=e+t.start,r=c.positionAt(n),i=cl;for(let e of t.modifiers)i|=sl.get(e)??0;p.push({line:r.line,char:r.character,length:t.length,type:ol.get(t.type)??0,modifiers:i})}}h.length&&p.push(...Cl(c,f,h));let g=vl(p);return Yr(this.semanticTokensCache,o,{code:s,generator:a.generator,strictAnnotationMatch:l,result:g},100),this.clearFeatureFailure(n,e.uri),g}catch(r){return this.reportFeatureFailure(n,e.uri,r),t}}async getDiagnostics(e){try{let t=await this.resolveTargetContext(e);if(!t)return this.clearFeatureFailure(`diagnostics`,e.uri),[];let{ctx:n,id:r,code:i,doc:a}=t,o;if(fn(r))o=m(i,_(n.generator.config?.theme??{})).map(e=>({range:{start:a.positionAt(e.start),end:a.positionAt(e.end)},message:e.message,severity:j.Warning,source:`teacss`,code:e.reason}));else if(this.getSettings().unmatchedDiagnostics){let e=await Kn.extract?.({code:i,id:r,generator:n.generator})??[],t=Kr(i,Array.from(new Set(e)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Er(i,r)}).filter(([e,t])=>fl(i,Math.max(e+1,t-1))),s=await n.generator.generate(new Set(t.map(e=>e[2])),{preflights:!1,safelist:!1}),c=t.filter(e=>!s.matched.has(e[2])),l=new Map;for(let[,,e]of c){let t=nr(e),r=e.slice(t.length),i=dr(e,n.generator.config,{confirmedIntent:!0})?.map(e=>`${e}${r}`)??[];l.set(e,Array.from(new Set([...pl(e),...i])))}let u=Array.from(new Set(Array.from(l.values()).flat())),d=u.length?(await n.generator.generate(new Set(u),{preflights:!1,safelist:!1})).matched:new Set;o=c.map(([e,t,n])=>{let r=(l.get(n)??[]).filter(e=>d.has(e)).slice(0,3);return{range:{start:a.positionAt(e),end:a.positionAt(t)},message:r.length?`Unmatched TeaCSS token \`${n}\`. Did you mean ${r.map(e=>`\`${e}\``).join(`, `)}?`:`Unmatched TeaCSS token \`${n}\` generates no CSS.`,severity:j.Warning,source:`teacss`,code:`unmatched-token`,data:{token:n,suggestions:r}}})}else o=[];return this.clearFeatureFailure(`diagnostics`,e.uri),o}catch(t){return this.reportFeatureFailure(`diagnostics`,e.uri,t),[]}}async getCodeActions(e,t){let n=[];for(let r of t){if(r.source!==`teacss`||r.code!==`unmatched-token`)continue;let t=r.data;if(!Array.isArray(t?.suggestions))continue;let i=t.suggestions.filter(e=>typeof e==`string`);for(let t=0;t<i.length;t++){let a=i[t];n.push({title:`Replace with ${a}`,kind:k.QuickFix,diagnostics:[r],isPreferred:t===0,edit:{changes:{[e.uri]:[{range:r.range,newText:a}]}}})}}return n}async getProjectStatus(e){let t=await this.resolveTargetContext(e);if(!t)return null;let{ctx:n,id:r,code:i}=t,a=n.getConfigFileList(),o=a.find(e=>fn(e))??null,s=n.generator.config.presets.map(e=>e.name||`(anonymous)`),c=[...n.generator.config.content?.filesystem??[]],l=n.filter(i,r)||i.includes(`@teacss-ide-include`)||fn(r),u=(await ei(n.generator,i,r,this.getSettings().strictAnnotationMatch)).length,d=(await this.getDiagnostics(e)).filter(e=>e.code===`unmatched-token`).length,f=[];return o||f.push(`No TeaCSS CSS entry was resolved.`),s.length||f.push(`The active entry selects no preset.`),l||f.push(`The active file is outside the entry's @source coverage.`),{root:n.root,entry:o,configSources:a,presets:s,sources:c,rules:n.generator.config.rulesSize,shortcuts:n.generator.config.shortcuts.length,activeFile:r,activeFileCovered:l,matchedCount:u,unmatchedCount:d,issues:f}}async getClassNameEdits(e){let t=await this.resolveTargetContext(e);if(!t)return[];let{ctx:n,id:r,code:i,doc:a}=t,o=await Kn.extract?.({code:i,id:r,generator:n.generator})??[],s=Kr(i,Array.from(new Set(o)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Er(i,r)}),c=new Map;for(let[e,t]of s){let n=qo(i,Math.max(e+1,t-1)),r=n?.key.toLowerCase();!n||!(r?.endsWith(`class`)||r?.endsWith(`classname`))||c.set(n.valueStart,ml(i,n.valueStart))}let l=Array.from(c,([e,t])=>({end:t,start:e,tokens:i.slice(e,t).match(/\S+/g)??[]})).filter(e=>e.tokens.length>1),u=Array.from(new Set(l.flatMap(e=>e.tokens)));if(!u.length)return[];let d=await n.generator.generate(new Set(u),{extendedInfo:!0,preflights:!1,safelist:!1}),f=d.css,p=new Map;for(let[e,t]of d.matched){let n=t.data.map(e=>e[1]?f.indexOf(e[1]):-1).filter(e=>e>=0);p.set(e,n.length?Math.min(...n):t.data[0]?.[0]??2**53-1)}let m=[];for(let e of l){let t=e.tokens.filter(e=>d.matched.has(e));if(t.length<2)continue;t.sort((e,t)=>(p.get(e)??2**53-1)-(p.get(t)??2**53-1)||(e<t?-1:+(e>t)));let n=0,r=e.tokens.map(e=>d.matched.has(e)?t[n++]:e).join(` `);r!==i.slice(e.start,e.end)&&m.push({range:{start:a.positionAt(e.start),end:a.positionAt(e.end)},newText:r})}return m}async getHover(e,t){let n=`hover`;try{if(fn(Cs(e.uri)))return this.clearFeatureFailure(n,e.uri),null;let r=this.getSettings(),i=await this.resolveTargetContext(e);if(!i)return this.clearFeatureFailure(n,e.uri),null;let{ctx:a,id:o,code:s,doc:c}=i,l=c.offsetAt(t),u=(await ei(a.generator,s,o,r.strictAnnotationMatch)).find(([e,t])=>l>=e&&l<t);if(!u)return this.clearFeatureFailure(n,e.uri),null;let d=r.remToPxPreview?r.remToPxRatio:-1,f={contents:{kind:`markdown`,value:await jc(a.generator,u[2],d)},range:{start:c.positionAt(u[0]),end:c.positionAt(u[1])}};return this.clearFeatureFailure(n,e.uri),f}catch(t){return this.reportFeatureFailure(n,e.uri,t),null}}async getDocumentColors(e){let t=`document colors`;try{let n=this.getSettings();if(!n.colorPreview)return this.clearFeatureFailure(t,e.uri),[];let r=await this.resolveTargetContext(e);if(!r)return this.clearFeatureFailure(t,e.uri),[];let{ctx:i,id:a,code:o,doc:s}=r,c=await ei(i.generator,o,a,n.strictAnnotationMatch),l=[],u=!1;for(let[n,r,a]of c)try{let{color:e}=await rl(i.generator,a);e&&l.push({range:{start:s.positionAt(n),end:s.positionAt(r)},color:{...e}})}catch(n){u=!0,this.reportFeatureFailure(t,e.uri,n)}return u||this.clearFeatureFailure(t,e.uri),l}catch(n){return this.reportFeatureFailure(t,e.uri,n),[]}}getColorPresentations(e,t,n){let r=Math.round(e.red*255),i=Math.round(e.green*255),a=Math.round(e.blue*255),o=Math.min(1,Math.max(0,e.alpha)),s=e=>e.toString(16).padStart(2,`0`),c=o<1?`#${s(r)}${s(i)}${s(a)}${s(Math.round(o*255))}`:`#${s(r)}${s(i)}${s(a)}`;if(t&&n){let e=Tl(n),r=n.slice(0,e),i=n.slice(e),a=r.indexOf(`:`);if(a>0){let e=r.endsWith(`!`)?`!`:``;if(gl(r.slice(a+1,r.length-e.length))){let n=`${r.slice(0,a)}:[${c}]${e}${i}`;return[{label:n,textEdit:{range:t,newText:n}}]}}}return n&&t?[{label:n,textEdit:{range:t,newText:n}}]:[{label:c}]}async getMatchedPositions(e){let t=this.getSettings(),n=await this.resolveTargetContext(e);if(!n)return[];let{ctx:r,id:i,code:a}=n;return(await ei(r.generator,a,i,t.strictAnnotationMatch)).map(([e,t,n])=>({start:e,end:t,text:n}))}async getReferences(e,t){let n=this.getSettings(),r=Cs(e.uri),i=e.getText(),a=await this.contextManager.resolveClosestContext(i,r);if(!a?.filter(i,r))return null;let o=e.getText()===i?e:O.create(e.uri,e.languageId,e.version,i),s=await ei(a.generator,i,r,n.strictAnnotationMatch),c=o.offsetAt(t),l=s.find(e=>e[0]<=c&&c<e[1]);if(!l?.[2])return null;let u=l[2],d=new Set(a.generator.getCachedEquivalentTokens(u)),m=a.getConfigFileList().find(e=>fn(e)),h=a.generator.config.content?.filesystem,g=h??b,_=g.filter(e=>!e.startsWith(`!`)),v=g.filter(e=>e.startsWith(`!`)).map(e=>e.slice(1)),y=m?f(m):a.root,x=tc(void 0,h===void 0?[...D,...v]:v,{resolve:y}),C=h===void 0?new Set([`node_modules`,`dist`,`build`,`storybook-static`]):void 0,w=[];if(_.length)for await(let e of T(_,{cwd:y,exclude:e=>C?.has(e)??!1})){let t=p(y,e);x(t)&&w.push(t)}return w.includes(r)||w.unshift(r),(await hl(Array.from(new Set(w)),16,async e=>{let t;try{t=e===r?i:await E(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return[];throw e}let s=e===r?o:O.create(S(e).href,``,0,t);return(await ei(a.generator,t,e,n.strictAnnotationMatch)).filter(e=>d.has(e[2])).map(e=>({uri:s.uri,range:{start:s.positionAt(e[0]),end:s.positionAt(e[1])}}))})).flat()}async getCompletions(e,t){let n=`completions`;try{let r=this.getSettings(),i=Cs(e.uri);if(!this.contextManager.isTarget(i))return this.clearFeatureFailure(n,e.uri),null;let a=e.getText();if(!a)return this.clearFeatureFailure(n,e.uri),null;let o=await this.contextManager.resolveClosestContext(a,i);if(!o)return this.clearFeatureFailure(n,e.uri),null;let s=e.getText()===a?e:O.create(e.uri,e.languageId,e.version,a),c=s.offsetAt(t);if(r.autocompleteStrict&&!Ds(a,i,c))return this.clearFeatureFailure(n,e.uri),null;let l=await this.getSuggestionResult({ctx:o,code:a,id:i,offset:c,matchType:r.autocompleteMatchType});if(!l?.suggestions.length)return this.clearFeatureFailure(n,e.uri),null;let u=l.suggestions.slice(0,r.autocompleteMaxItems),d=r.colorPreview?await hl(u,32,async([e])=>{try{return(await rl(o.generator,e)).colorString}catch{return}}):[],f=[];for(let t=0;t<u.length;t++){let[n,r]=u[t],i=d[t],a=l.resolveReplacement(n),o={label:r,kind:i?A.Color:A.EnumMember,sortText:i?/-\d$/.test(r)?`1`:`2`:void 0,data:{value:n,uri:e.uri},textEdit:{range:{start:s.positionAt(a.start),end:s.positionAt(a.end)},newText:a.replacement}};i&&(o.documentation=i),f.push(o)}return this.clearFeatureFailure(n,e.uri),{isIncomplete:!0,items:f}}catch(t){return this.reportFeatureFailure(n,e.uri,t),null}}async resolveCompletion(e,t){if(!e.data?.uri||!e.data?.value||!t)return e;let n=this.getSettings(),r=Cs(e.data.uri),i=t.getText(),a=await this.contextManager.resolveClosestContext(i,r);if(!a)return e;let o=n.remToPxPreview?n.remToPxRatio:-1;return e.kind===A.Color?e.detail=await(await Ac(a.generator,e.data.value,o)).prettified:e.documentation={kind:`markdown`,value:await jc(a.generator,e.data.value,o)},e}async getSuggestionResult({ctx:e,code:t,id:n,offset:r,matchType:i}){let a=Os(t,n);if(!e.filter(t,n)&&!fn(n)&&!a)return null;let o=this.getAutocomplete(e,i),s;if(a){let e=t.substring(0,r).match(/\.[-\w]*$/);if(e){let t=e[0].substring(1),n=await o.suggest(t||``);n.length&&(s={suggestions:n.map(e=>[e,e]),resolveReplacement:e=>({start:r-(t?.length||0),end:r,replacement:e})})}else s=await o.suggestInFile(t,r)}else s=await o.suggestInFile(t,r);return s}};function Tl(e){let t=0,n;for(let r=0;r<e.length;r++){let i=e[r];if(n){i===`\\`?r++:i===n&&(n=void 0);continue}if(i===`"`||i===`'`)n=i;else if(i===`\\`)r++;else if(i===`[`||i===`(`)t++;else if(i===`]`||i===`)`)t--;else if(i===`@`&&t===0)return r}return e.length}function El(e,t){let n=Ol(t.workspaceFolderPaths||[]),r=n.length?n:Ol([t.workspaceRootPath]),i=le(e).filter(e=>typeof e==`string`&&e.length>0);if(!i.length)return r;let a=Ol([t.workspaceFileDir,...n,t.workspaceRootPath]);return Ol(i.flatMap(e=>Dl(e,a)))}function Dl(e,t){if(!e)return[];if(kl(e))return[d.normalize(e)];let n=d.normalize(e),r=t.filter(e=>{let t=d.normalize(e);return t===n||t.endsWith(`${d.sep}${n}`)});if(r.length)return r;let i=t.map(t=>d.resolve(t,e)),a=i.filter(e=>u(e));return a.length?a:i.slice(0,1)}function Ol(e){return Array.from(new Set(e.filter(Boolean).map(e=>d.normalize(e))))}function kl(e){return d.isAbsolute(e)||d.win32.isAbsolute(e)}function Al(e,t,n,i=r){e.onCodeAction(async e=>{await i();let r=n(),a=t.get(e.textDocument.uri);return!r||!a?[]:r.getCodeActions(a,e.context.diagnostics)})}const jl=/[\\/](?:node_modules|dist|\.temp|\.cache|\.git)[\\/]/,Ml=new Set([`node_modules`,`dist`,`.temp`,`.cache`,`.git`]),Nl=`**/{${Array.from(new Set(h.map(e=>d.posix.basename(e)))).join(`,`)}}`;function Pl(e,t){let n=d.relative(e,t);return n===``||!n.startsWith(`..${d.sep}`)&&n!==`..`&&!d.isAbsolute(n)}function Fl(e){return[...e].map(e=>e===`*`?`[*]`:e===`?`?`[?]`:e===`[`?`[[]`:e===`]`?`[]]`:e===`{`?`[{]`:e===`}`?`[}]`:e).join(``)}function Il(e){try{let t=JSON.parse(l.readFileSync(d.join(e,`package.json`),`utf8`))?.teacss?.entry;return typeof t==`string`&&t?d.resolve(e,t):void 0}catch{return}}function Ll(e){let t=[],n=[e];for(let e of n){let r;try{r=l.readdirSync(e,{withFileTypes:!0})}catch{continue}if(r.some(e=>e.isFile()&&e.name===`package.json`)){let n=Il(e);n&&t.push({directory:e,entry:n})}for(let t of r)t.isDirectory()&&!Ml.has(t.name)&&n.push(d.join(e,t.name))}return t.sort((e,t)=>e.directory<t.directory?-1:+(e.directory>t.directory))}function Rl(e,t){return t.map(e=>d.normalize(e)).filter(t=>Pl(t,e)).sort((e,t)=>t.length-e.length)[0]}function zl(e,t){let n=d.dirname(e);for(;Pl(t,n);){if(d.normalize(g(n)??``)===e)return!0;if(n===t)break;n=d.dirname(n)}return!1}function Bl(e){let t=e.map(({globPattern:e,kind:t})=>typeof e==`string`?`${t??``}\0${e}`:`${t??``}\0${e.baseUri}\0${e.pattern}`);return JSON.stringify(t.sort())}function Vl(e,t,n){let r=new Map,i=(e,t,i=!0)=>{let a=i?Fl(t):t,o={baseUri:S(e).href,pattern:a};r.set(`${o.baseUri}\0${a}`,{globPattern:o,kind:n})};for(let t of e)i(d.dirname(t),d.basename(t));for(let e of t){i(e,Nl,!1);for(let{directory:t,entry:n}of Ll(e)){let e=d.relative(t,n);Pl(t,n)?i(t,e.split(d.sep).join(`/`)):i(d.dirname(n),d.basename(n))}}return Array.from(r.values())}function Hl(e,t,n){let r=new Set(t.map(e=>d.normalize(e))),i=new Set(n.map(Il).filter(e=>!!e).map(e=>d.normalize(e))),a=new Set;for(let t of e){let e;try{e=d.normalize(x(t.uri))}catch{return!0}if(r.has(e)||i.has(e))return!0;if(jl.test(e))continue;let o=Rl(e,n);if(!o){a.add(e);continue}if(d.basename(e)===`package.json`)return!0;if(d.extname(e).toLowerCase()!==`.css`){a.add(e);continue}try{if(zl(e,o))return!0}catch{return!0}}if(a.size){for(let e of n)for(let{entry:t}of Ll(e))if(a.has(d.normalize(t)))return!0}return!1}function Ul(e){let t,n,r,i,a=0,o=Promise.resolve();return{update(s){let c=Bl(s);if(i&&r===c)return i;if(!i&&n===c)return Promise.resolve();let l=++a,u=o.then(async()=>{if(l!==a||n===c)return;let r=await e(s);if(l!==a){r.dispose();return}t?.dispose(),t=r,n=c});o=u.catch(()=>{}),r=c,i=u;let d=()=>{i===u&&(i=void 0,r=void 0)};return u.then(d,d),u}}}function Wl(e){return e instanceof Error?e.message:String(e)}function Gl(e){let t=new Map,n=new Map,r=0;return{async publish(i){let a=++r;t.set(i.uri,a);try{let r=await e.getDiagnostics(i);if(t.get(i.uri)!==a)return;await e.sendDiagnostics(i.uri,r),t.get(i.uri)===a&&n.delete(i.uri)}catch(r){if(t.get(i.uri)!==a)return;let o=Wl(r);if(n.get(i.uri)===o)return;n.set(i.uri,o),e.reportError(i.uri,r)}},invalidate(e){t.delete(e),n.delete(e)}}}function Kl(e,t){e.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[teacss] ${n===`unhandledRejection`?`Unhandled rejection`:`Uncaught exception`}: ${e.message}`)})}function ql(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function Jl(e,t){return typeof e==`boolean`?e:t}function Yl(e,t){if(e!==null)return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`):t}function Xl(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function Zl(e,t){return typeof e!=`number`||!Number.isFinite(e)?t:Math.min(1e4,Math.max(0,Math.floor(e)))}function Ql(e){let t=ql(e),n={};return Object.hasOwn(t,`root`)&&(n.root=t.root),(t.semanticTokens===`native`||t.semanticTokens===`overlay`)&&(n.semanticTokens=t.semanticTokens),typeof t.workspaceFileDir==`string`&&(n.workspaceFileDir=t.workspaceFileDir),Array.isArray(t.workspaceFolderPaths)&&(n.workspaceFolderPaths=t.workspaceFolderPaths.filter(e=>typeof e==`string`)),n}function $l(e,t){let n=ql(t),r=ql(n.autocomplete),i=r.matchType;return{root:Yl(n.root,e.root),colorPreview:Jl(n.colorPreview,e.colorPreview),remToPxPreview:Jl(n.remToPxPreview,e.remToPxPreview),remToPxRatio:Xl(n.remToPxRatio,e.remToPxRatio),syntaxHighlight:Jl(n.syntaxHighlight,e.syntaxHighlight),strictAnnotationMatch:Jl(n.strictAnnotationMatch,e.strictAnnotationMatch),unmatchedDiagnostics:Jl(n.unmatchedDiagnostics,e.unmatchedDiagnostics),autocompleteMatchType:i===`prefix`||i===`fuzzy`?i:e.autocompleteMatchType,autocompleteStrict:Jl(r.strict,e.autocompleteStrict),autocompleteMaxItems:Zl(r.maxItems,e.autocompleteMaxItems)}}function eu(e){return $l(nc,e)}function tu(e,t){return e.syntaxHighlight!==t.syntaxHighlight||e.strictAnnotationMatch!==t.strictAnnotationMatch}function nu(e,t){let n=new Set(e),r=new Set(t);return n.size!==r.size||[...n].some(e=>!r.has(e))}async function ru(e,t,n){if(e)try{return await t()}catch(e){n(e);return}}const Q=te(B.all),iu=new H(O);let au=eu(),$,ou=!1,su=!1,cu=!1,lu=!1,uu=!1,du=!1,fu=0,pu;const mu=new Promise(e=>{pu=e}),hu=U.Create|U.Change|U.Delete,gu=[{globPattern:`**/*.css`,kind:hu}],_u={folderPaths:[]};function vu(e){au=$l(au,e)}function yu(e){return El(e,{workspaceRootPath:_u.rootPath,workspaceFileDir:_u.fileDir,workspaceFolderPaths:_u.folderPaths})}function bu(e){return typeof e==`string`?e.length>0:Array.isArray(e)&&e.some(Boolean)}async function xu(){$&&await Su(()=>$.contextManager.setRoots(yu(au.root)))}async function Su(e){fu++;try{return await e()}finally{fu--}}function Cu(e,t,n){_u.rootPath=e?Cs(e):void 0,_u.fileDir=n?.workspaceFileDir,_u.folderPaths=n?.workspaceFolderPaths||t?.map(e=>Cs(e.uri))||[]}function wu(e=_u.rootPath){if(!e)return;let t=new wl({rootPath:e,folderPaths:yu(au.root),logger:{log:e=>Q.console.log(e),warn:e=>Q.console.warn(e)},getSettings:Pu});$=t;let n=()=>{fu||(Au().catch(e=>ju(`Failed to update config watchers`,e)),Mu(),Gu())};return t.events.on(`reload`,()=>{fu||Au().catch(e=>ju(`Failed to update config watchers`,e))}),t.events.on(`contextLoaded`,n),t.events.on(`contextReload`,n),t.events.on(`contextUnload`,n),t.events.on(`unload`,n),t}async function Tu(e){$||!e[0]||await wu(e[0])?.ready}function Eu(){return $?.contextManager.configSources??[]}function Du(){return Array.from(new Set([...yu(au.root),...$?.contextManager.contextsMap.keys()??[]]))}function Ou(){let e=Eu(),t=Vl(e,Du(),hu);return e.length?t:[...gu,...t]}const ku=Ul(async e=>Q.client.register(ee.type,{watchers:[...e]}));async function Au(){!ou||!du||!$||await ku.update(Ou())}function ju(e,t){Q.console.error(`[teacss] ${e}: ${t instanceof Error?t.message:String(t)}`)}async function Mu(){du&&(uu?await Q.sendNotification(`teacss/semanticTokens/refresh`).catch(e=>ju(`Failed to refresh semantic token decorations`,e)):lu&&await Q.languages.semanticTokens.refresh().catch(e=>ju(`Failed to refresh semantic tokens`,e)))}const Nu=Gl({async getDiagnostics(e){return await Iu(),await $?.getDiagnostics(e)??[]},sendDiagnostics(e,t){return Q.sendDiagnostics({uri:e,diagnostics:[...t]})},reportError(e,t){ju(`Failed to publish diagnostics for ${e}`,t)}});Kl(s,e=>Q.console.error(e));function Pu(){return au}function Fu(){return $}function Iu(){return mu}Q.onInitialize(r=>{ou=!!r.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration,su=!!r.capabilities.workspace?.configuration,cu=!!r.capabilities.workspace?.workspaceFolders,lu=!!r.capabilities.workspace?.semanticTokens?.refreshSupport;let o=Ql(r.initializationOptions);uu=o?.semanticTokens===`overlay`,`root`in o&&vu({root:o.root});let s=r.workspaceFolders,c=s?.[0]?.uri||r.rootUri;Cu(c,s,o);let l=c?void 0:yu(au.root)[0];return c?wu():l&&wu(l),Al(Q,iu,Fu,Iu),t(Q,iu,Fu,Iu),i(Q,iu,Fu,Iu),e(Q,iu,Fu,Iu),n(Q,iu,Fu,Iu),a(Q,iu,Fu,Iu),{capabilities:{textDocumentSync:V.Incremental,completionProvider:{resolveProvider:!0,triggerCharacters:[`-`,`:`,` `,`"`,`'`]},hoverProvider:!0,codeActionProvider:!0,referencesProvider:!0,colorProvider:!0,...uu?{}:{semanticTokensProvider:{legend:al,full:!0}},...cu?{workspace:{workspaceFolders:{supported:!0,changeNotifications:!0}}}:{}}}}),Q.onInitialized(async()=>{cu&&Q.workspace.onDidChangeWorkspaceFolders(e=>{Ku(e).catch(e=>ju(`Failed to update workspace folders`,e))});try{let e=await ru(su,()=>Q.workspace.getConfiguration(`teacss`),e=>ju(`Failed to read workspace configuration`,e));e!==void 0&&vu(e),await Tu(yu(au.root)),$&&(await $.ready,await xu())}catch(e){ju(`Failed to complete initial setup`,e)}finally{du=!0,pu?.(),pu=void 0}Q.console.log(`✅ TeaCSS Language Server initialized`),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu()});let Lu;Q.onDidChangeWatchedFiles(e=>{Hl(e.changes,Eu(),Du())&&(clearTimeout(Lu),Lu=setTimeout(()=>{Ru().catch(e=>ju(`Failed to reload config sources`,e))},500))});async function Ru(){await Iu(),$&&(Q.console.log(`🔄 Config source changed, reloading TeaCSS...`),$r(),await Su(()=>$.contextManager.reload()),Q.console.log(`🔵 Reloaded.`),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu(),await Gu())}Q.onDidChangeConfiguration(async e=>{await Iu();let t=e.settings?.teacss;if(t!==void 0){let e=au,n=yu(e.root);vu(t);let r=yu(au.root),i=nu(n,r);i&&(await Tu(r),$&&await Su(()=>$.contextManager.setRoots(r)),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Gu()),!i&&e.unmatchedDiagnostics!==au.unmatchedDiagnostics&&await Gu(),(i||tu(e,au))&&await Mu()}});async function zu(){return await Iu(),$?($r(),await Su(()=>$.contextManager.reload()),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu(),await Gu(),{success:!0}):{success:!1}}async function Bu(e){if(await Iu(),!$)return{count:0};let t=iu.get(e.uri);if(!t)return{count:0};let n=Cs(e.uri),r=t.getText(),i=await $.contextManager.resolveClosestContext(r,n);return i?{count:(await i.generator.generate(r,{id:n,preflights:!1,safelist:!1,minify:!0})).matched.size}:{count:0}}async function Vu(e){if(await Iu(),!$)return{positions:[]};let t=iu.get(e.uri);return t?{positions:(await $.getMatchedPositions(t)).map(e=>({start:t.positionAt(e.start),end:t.positionAt(e.end),className:e.text}))}:{positions:[]}}async function Hu(e){if(await Iu(),!$)return null;let t=e.uri?iu.get(e.uri):iu.all()[0];return t?$.getProjectStatus(t):null}async function Uu(e){if(await Iu(),!$)return[];let t=iu.get(e.uri);return t?$.getClassNameEdits(t):[]}Q.onRequest(`teacss/reloadConfig`,zu),Q.onRequest(`teacss/getMatchedCount`,Bu),Q.onRequest(`teacss/getMatchedPositions`,Vu),Q.onRequest(`teacss/projectStatus`,Hu),Q.onRequest(`teacss/normalizeClasses`,Uu);async function Wu(e){$&&await Nu.publish(e)}async function Gu(){await Promise.all(iu.all().map(e=>Wu(e)))}async function Ku(e){await Iu();let t=new Set(e.removed.map(e=>Cs(e.uri))),n=_u.folderPaths.filter(e=>!t.has(e));for(let t of e.added){let e=Cs(t.uri);n.includes(e)||n.push(e)}if(_u.folderPaths=n,_u.rootPath=n[0],!$&&_u.rootPath&&(wu(),await Fu()?.ready),!$)return;$r();let r=bu(au.root)?yu(au.root):_u.folderPaths;await Su(()=>$.contextManager.setRoots(r)),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu(),await Gu()}iu.onDidChangeContent(e=>{Qr(Cs(e.document.uri)),Wu(e.document)}),iu.onDidClose(e=>{let t=Cs(e.document.uri);Qr(t),$?.contextManager.releaseDocument(t),Nu.invalidate(e.document.uri),Q.sendDiagnostics({uri:e.document.uri,diagnostics:[]})}),iu.listen(Q),Q.listen();export{};
|
|
34
|
+
`&&s++,o=s+1);return o<n.length&&a.push(yl(e,t+o,n.length-o,r,i)),a}function xl(e,t){return t.isColorValue?.(e)?`enumMember`:ll.test(e)?`number`:`string`}function Sl(e,t,n){return e.some(e=>e.open===t&&e.close===n-1)}function Cl(e,t,n){let r=[];for(let i of n){r.push(yl(e,i.open,1,`operator`,cl|(sl.get(`group`)??0)));for(let n of i.declarations){let{property:i,start:a,colon:o,value:s,valueStart:c}=n;r.push(yl(e,a,2,`operator`,cl|(sl.get(`variable`)??0))),r.push(yl(e,a+2,i.length-2,`property`)),r.push(yl(e,o,1,`operator`)),s&&r.push(...bl(e,c,s,xl(s,t)))}r.push(yl(e,i.close,1,`operator`,cl|(sl.get(`group`)??0)))}return r}var wl=class{contextManager;getSettings;logger;autoCompletes=new Map;semanticTokensCache=new Map;featureFailures=new Map;constructor(e){this.getSettings=e.getSettings??(()=>nc),this.logger=e.logger??dl;let t=e.folderPaths?.length?e.folderPaths:[e.rootPath];this.contextManager=new Ms(e.rootPath,this.logger,t),this.contextManager.events.on(`contextReload`,e=>this.resetFeatureCaches(e)),this.contextManager.events.on(`contextUnload`,e=>this.resetFeatureCaches(e)),this.contextManager.events.on(`unload`,e=>this.resetFeatureCaches(e))}get events(){return this.contextManager.events}get ready(){return this.contextManager.ready}resetAutoCompleteCache(e){e?this.autoCompletes.delete(e):this.autoCompletes.clear()}resetFeatureCaches(e){this.resetAutoCompleteCache(e),this.semanticTokensCache.clear(),this.featureFailures.clear()}reportFeatureFailure(e,t,n){let r=`${e}\0${t}`,i=n instanceof Error?n.message:String(n);this.featureFailures.get(r)!==i&&(Yr(this.featureFailures,r,i,100),this.logger.warn(`⚠️ Failed to provide ${e} for ${t}: ${i}`))}clearFeatureFailure(e,t){this.featureFailures.delete(`${e}\0${t}`)}getAutocomplete(e,t){let n=this.autoCompletes.get(e);if(n?.matchType===t)return n.autocomplete;let r=Ss(e.generator,{matchType:t,throwErrors:!1});return this.autoCompletes.set(e,{matchType:t,autocomplete:r}),r}async resolveTargetContext(e){let t=Cs(e.uri);if(!this.contextManager.isTarget(t))return null;let n=e.getText();if(!n)return null;let r=await this.contextManager.resolveClosestContext(n,t);return!r||!(r.filter(n,t)||n.includes(`@teacss-ide-include`)||this.contextManager.configSources.includes(t)||fn(t))?null:{ctx:r,id:t,code:n,doc:e.getText()===n?e:O.create(e.uri,e.languageId,e.version,n)}}async getSemanticTokens(e){let t={data:[]},n=`semantic tokens`;try{let r=this.getSettings();if(!r.syntaxHighlight)return this.clearFeatureFailure(n,e.uri),t;let i=await this.resolveTargetContext(e);if(!i)return this.clearFeatureFailure(n,e.uri),t;let{ctx:a,id:o,code:s,doc:c}=i,l=r.strictAnnotationMatch,u=this.semanticTokensCache.get(o);if(u&&u.code===s&&u.generator===a.generator&&u.strictAnnotationMatch===l)return Yr(this.semanticTokensCache,o,u,100),this.clearFeatureFailure(n,e.uri),u.result;let d=await ei(a.generator,s,o,l),f=_l(a.generator),p=[],m=new Map,h=fn(o)?v(s):[];for(let[e,t]of d){if(Sl(h,e,t))continue;let n=s.slice(e,t),r=m.get(n);r||(r=Hc(n,0,f),m.set(n,r));for(let t of r){let n=e+t.start,r=c.positionAt(n),i=cl;for(let e of t.modifiers)i|=sl.get(e)??0;p.push({line:r.line,char:r.character,length:t.length,type:ol.get(t.type)??0,modifiers:i})}}h.length&&p.push(...Cl(c,f,h));let g=vl(p);return Yr(this.semanticTokensCache,o,{code:s,generator:a.generator,strictAnnotationMatch:l,result:g},100),this.clearFeatureFailure(n,e.uri),g}catch(r){return this.reportFeatureFailure(n,e.uri,r),t}}async getDiagnostics(e){try{let t=await this.resolveTargetContext(e);if(!t)return this.clearFeatureFailure(`diagnostics`,e.uri),[];let{ctx:n,id:r,code:i,doc:a}=t,o;if(fn(r)){let e=n.generator.config?.theme??{};o=m(i,_(e),e).map(e=>({range:{start:a.positionAt(e.start),end:a.positionAt(e.end)},message:e.message,severity:j.Warning,source:`teacss`,code:e.reason}))}else if(this.getSettings().unmatchedDiagnostics){let e=await Kn.extract?.({code:i,id:r,generator:n.generator})??[],t=Kr(i,Array.from(new Set(e)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Er(i,r)}).filter(([e,t])=>fl(i,Math.max(e+1,t-1))),s=await n.generator.generate(new Set(t.map(e=>e[2])),{preflights:!1,safelist:!1}),c=t.filter(e=>!s.matched.has(e[2])),l=new Map;for(let[,,e]of c){let t=nr(e),r=e.slice(t.length),i=dr(e,n.generator.config,{confirmedIntent:!0})?.map(e=>`${e}${r}`)??[];l.set(e,Array.from(new Set([...pl(e),...i])))}let u=Array.from(new Set(Array.from(l.values()).flat())),d=u.length?(await n.generator.generate(new Set(u),{preflights:!1,safelist:!1})).matched:new Set;o=c.map(([e,t,n])=>{let r=(l.get(n)??[]).filter(e=>d.has(e)).slice(0,3);return{range:{start:a.positionAt(e),end:a.positionAt(t)},message:r.length?`Unmatched TeaCSS token \`${n}\`. Did you mean ${r.map(e=>`\`${e}\``).join(`, `)}?`:`Unmatched TeaCSS token \`${n}\` generates no CSS.`,severity:j.Warning,source:`teacss`,code:`unmatched-token`,data:{token:n,suggestions:r}}})}else o=[];return this.clearFeatureFailure(`diagnostics`,e.uri),o}catch(t){return this.reportFeatureFailure(`diagnostics`,e.uri,t),[]}}async getCodeActions(e,t){let n=[];for(let r of t){if(r.source!==`teacss`||r.code!==`unmatched-token`)continue;let t=r.data;if(!Array.isArray(t?.suggestions))continue;let i=t.suggestions.filter(e=>typeof e==`string`);for(let t=0;t<i.length;t++){let a=i[t];n.push({title:`Replace with ${a}`,kind:k.QuickFix,diagnostics:[r],isPreferred:t===0,edit:{changes:{[e.uri]:[{range:r.range,newText:a}]}}})}}return n}async getProjectStatus(e){let t=await this.resolveTargetContext(e);if(!t)return null;let{ctx:n,id:r,code:i}=t,a=n.getConfigFileList(),o=a.find(e=>fn(e))??null,s=n.generator.config.presets.map(e=>e.name||`(anonymous)`),c=[...n.generator.config.content?.filesystem??[]],l=n.filter(i,r)||i.includes(`@teacss-ide-include`)||fn(r),u=(await ei(n.generator,i,r,this.getSettings().strictAnnotationMatch)).length,d=(await this.getDiagnostics(e)).filter(e=>e.code===`unmatched-token`).length,f=[];return o||f.push(`No TeaCSS CSS entry was resolved.`),s.length||f.push(`The active entry selects no preset.`),l||f.push(`The active file is outside the entry's @source coverage.`),{root:n.root,entry:o,configSources:a,presets:s,sources:c,rules:n.generator.config.rulesSize,shortcuts:n.generator.config.shortcuts.length,activeFile:r,activeFileCovered:l,matchedCount:u,unmatchedCount:d,issues:f}}async getClassNameEdits(e){let t=await this.resolveTargetContext(e);if(!t)return[];let{ctx:n,id:r,code:i,doc:a}=t,o=await Kn.extract?.({code:i,id:r,generator:n.generator})??[],s=Kr(i,Array.from(new Set(o)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Er(i,r)}),c=new Map;for(let[e,t]of s){let n=qo(i,Math.max(e+1,t-1)),r=n?.key.toLowerCase();!n||!(r?.endsWith(`class`)||r?.endsWith(`classname`))||c.set(n.valueStart,ml(i,n.valueStart))}let l=Array.from(c,([e,t])=>({end:t,start:e,tokens:i.slice(e,t).match(/\S+/g)??[]})).filter(e=>e.tokens.length>1),u=Array.from(new Set(l.flatMap(e=>e.tokens)));if(!u.length)return[];let d=await n.generator.generate(new Set(u),{extendedInfo:!0,preflights:!1,safelist:!1}),f=d.css,p=new Map;for(let[e,t]of d.matched){let n=t.data.map(e=>e[1]?f.indexOf(e[1]):-1).filter(e=>e>=0);p.set(e,n.length?Math.min(...n):t.data[0]?.[0]??2**53-1)}let m=[];for(let e of l){let t=e.tokens.filter(e=>d.matched.has(e));if(t.length<2)continue;t.sort((e,t)=>(p.get(e)??2**53-1)-(p.get(t)??2**53-1)||(e<t?-1:+(e>t)));let n=0,r=e.tokens.map(e=>d.matched.has(e)?t[n++]:e).join(` `);r!==i.slice(e.start,e.end)&&m.push({range:{start:a.positionAt(e.start),end:a.positionAt(e.end)},newText:r})}return m}async getHover(e,t){let n=`hover`;try{if(fn(Cs(e.uri)))return this.clearFeatureFailure(n,e.uri),null;let r=this.getSettings(),i=await this.resolveTargetContext(e);if(!i)return this.clearFeatureFailure(n,e.uri),null;let{ctx:a,id:o,code:s,doc:c}=i,l=c.offsetAt(t),u=(await ei(a.generator,s,o,r.strictAnnotationMatch)).find(([e,t])=>l>=e&&l<t);if(!u)return this.clearFeatureFailure(n,e.uri),null;let d=r.remToPxPreview?r.remToPxRatio:-1,f={contents:{kind:`markdown`,value:await jc(a.generator,u[2],d)},range:{start:c.positionAt(u[0]),end:c.positionAt(u[1])}};return this.clearFeatureFailure(n,e.uri),f}catch(t){return this.reportFeatureFailure(n,e.uri,t),null}}async getDocumentColors(e){let t=`document colors`;try{let n=this.getSettings();if(!n.colorPreview)return this.clearFeatureFailure(t,e.uri),[];let r=await this.resolveTargetContext(e);if(!r)return this.clearFeatureFailure(t,e.uri),[];let{ctx:i,id:a,code:o,doc:s}=r,c=await ei(i.generator,o,a,n.strictAnnotationMatch),l=[],u=!1;for(let[n,r,a]of c)try{let{color:e}=await rl(i.generator,a);e&&l.push({range:{start:s.positionAt(n),end:s.positionAt(r)},color:{...e}})}catch(n){u=!0,this.reportFeatureFailure(t,e.uri,n)}return u||this.clearFeatureFailure(t,e.uri),l}catch(n){return this.reportFeatureFailure(t,e.uri,n),[]}}getColorPresentations(e,t,n){let r=Math.round(e.red*255),i=Math.round(e.green*255),a=Math.round(e.blue*255),o=Math.min(1,Math.max(0,e.alpha)),s=e=>e.toString(16).padStart(2,`0`),c=o<1?`#${s(r)}${s(i)}${s(a)}${s(Math.round(o*255))}`:`#${s(r)}${s(i)}${s(a)}`;if(t&&n){let e=Tl(n),r=n.slice(0,e),i=n.slice(e),a=r.indexOf(`:`);if(a>0){let e=r.endsWith(`!`)?`!`:``;if(gl(r.slice(a+1,r.length-e.length))){let n=`${r.slice(0,a)}:[${c}]${e}${i}`;return[{label:n,textEdit:{range:t,newText:n}}]}}}return n&&t?[{label:n,textEdit:{range:t,newText:n}}]:[{label:c}]}async getMatchedPositions(e){let t=this.getSettings(),n=await this.resolveTargetContext(e);if(!n)return[];let{ctx:r,id:i,code:a}=n;return(await ei(r.generator,a,i,t.strictAnnotationMatch)).map(([e,t,n])=>({start:e,end:t,text:n}))}async getReferences(e,t){let n=this.getSettings(),r=Cs(e.uri),i=e.getText(),a=await this.contextManager.resolveClosestContext(i,r);if(!a?.filter(i,r))return null;let o=e.getText()===i?e:O.create(e.uri,e.languageId,e.version,i),s=await ei(a.generator,i,r,n.strictAnnotationMatch),c=o.offsetAt(t),l=s.find(e=>e[0]<=c&&c<e[1]);if(!l?.[2])return null;let u=l[2],d=new Set(a.generator.getCachedEquivalentTokens(u)),m=a.getConfigFileList().find(e=>fn(e)),h=a.generator.config.content?.filesystem,g=h??b,_=g.filter(e=>!e.startsWith(`!`)),v=g.filter(e=>e.startsWith(`!`)).map(e=>e.slice(1)),y=m?f(m):a.root,x=tc(void 0,h===void 0?[...D,...v]:v,{resolve:y}),C=h===void 0?new Set([`node_modules`,`dist`,`build`,`storybook-static`]):void 0,w=[];if(_.length)for await(let e of T(_,{cwd:y,exclude:e=>C?.has(e)??!1})){let t=p(y,e);x(t)&&w.push(t)}return w.includes(r)||w.unshift(r),(await hl(Array.from(new Set(w)),16,async e=>{let t;try{t=e===r?i:await E(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return[];throw e}let s=e===r?o:O.create(S(e).href,``,0,t);return(await ei(a.generator,t,e,n.strictAnnotationMatch)).filter(e=>d.has(e[2])).map(e=>({uri:s.uri,range:{start:s.positionAt(e[0]),end:s.positionAt(e[1])}}))})).flat()}async getCompletions(e,t){let n=`completions`;try{let r=this.getSettings(),i=Cs(e.uri);if(!this.contextManager.isTarget(i))return this.clearFeatureFailure(n,e.uri),null;let a=e.getText();if(!a)return this.clearFeatureFailure(n,e.uri),null;let o=await this.contextManager.resolveClosestContext(a,i);if(!o)return this.clearFeatureFailure(n,e.uri),null;let s=e.getText()===a?e:O.create(e.uri,e.languageId,e.version,a),c=s.offsetAt(t);if(r.autocompleteStrict&&!Ds(a,i,c))return this.clearFeatureFailure(n,e.uri),null;let l=await this.getSuggestionResult({ctx:o,code:a,id:i,offset:c,matchType:r.autocompleteMatchType});if(!l?.suggestions.length)return this.clearFeatureFailure(n,e.uri),null;let u=l.suggestions.slice(0,r.autocompleteMaxItems),d=r.colorPreview?await hl(u,32,async([e])=>{try{return(await rl(o.generator,e)).colorString}catch{return}}):[],f=[];for(let t=0;t<u.length;t++){let[n,r]=u[t],i=d[t],a=l.resolveReplacement(n),o={label:r,kind:i?A.Color:A.EnumMember,sortText:i?/-\d$/.test(r)?`1`:`2`:void 0,data:{value:n,uri:e.uri},textEdit:{range:{start:s.positionAt(a.start),end:s.positionAt(a.end)},newText:a.replacement}};i&&(o.documentation=i),f.push(o)}return this.clearFeatureFailure(n,e.uri),{isIncomplete:!0,items:f}}catch(t){return this.reportFeatureFailure(n,e.uri,t),null}}async resolveCompletion(e,t){if(!e.data?.uri||!e.data?.value||!t)return e;let n=this.getSettings(),r=Cs(e.data.uri),i=t.getText(),a=await this.contextManager.resolveClosestContext(i,r);if(!a)return e;let o=n.remToPxPreview?n.remToPxRatio:-1;return e.kind===A.Color?e.detail=await(await Ac(a.generator,e.data.value,o)).prettified:e.documentation={kind:`markdown`,value:await jc(a.generator,e.data.value,o)},e}async getSuggestionResult({ctx:e,code:t,id:n,offset:r,matchType:i}){let a=Os(t,n);if(!e.filter(t,n)&&!fn(n)&&!a)return null;let o=this.getAutocomplete(e,i),s;if(a){let e=t.substring(0,r).match(/\.[-\w]*$/);if(e){let t=e[0].substring(1),n=await o.suggest(t||``);n.length&&(s={suggestions:n.map(e=>[e,e]),resolveReplacement:e=>({start:r-(t?.length||0),end:r,replacement:e})})}else s=await o.suggestInFile(t,r)}else s=await o.suggestInFile(t,r);return s}};function Tl(e){let t=0,n;for(let r=0;r<e.length;r++){let i=e[r];if(n){i===`\\`?r++:i===n&&(n=void 0);continue}if(i===`"`||i===`'`)n=i;else if(i===`\\`)r++;else if(i===`[`||i===`(`)t++;else if(i===`]`||i===`)`)t--;else if(i===`@`&&t===0)return r}return e.length}function El(e,t){let n=Ol(t.workspaceFolderPaths||[]),r=n.length?n:Ol([t.workspaceRootPath]),i=le(e).filter(e=>typeof e==`string`&&e.length>0);if(!i.length)return r;let a=Ol([t.workspaceFileDir,...n,t.workspaceRootPath]);return Ol(i.flatMap(e=>Dl(e,a)))}function Dl(e,t){if(!e)return[];if(kl(e))return[d.normalize(e)];let n=d.normalize(e),r=t.filter(e=>{let t=d.normalize(e);return t===n||t.endsWith(`${d.sep}${n}`)});if(r.length)return r;let i=t.map(t=>d.resolve(t,e)),a=i.filter(e=>u(e));return a.length?a:i.slice(0,1)}function Ol(e){return Array.from(new Set(e.filter(Boolean).map(e=>d.normalize(e))))}function kl(e){return d.isAbsolute(e)||d.win32.isAbsolute(e)}function Al(e,t,n,i=r){e.onCodeAction(async e=>{await i();let r=n(),a=t.get(e.textDocument.uri);return!r||!a?[]:r.getCodeActions(a,e.context.diagnostics)})}const jl=/[\\/](?:node_modules|dist|\.temp|\.cache|\.git)[\\/]/,Ml=new Set([`node_modules`,`dist`,`.temp`,`.cache`,`.git`]),Nl=`**/{${Array.from(new Set(h.map(e=>d.posix.basename(e)))).join(`,`)}}`;function Pl(e,t){let n=d.relative(e,t);return n===``||!n.startsWith(`..${d.sep}`)&&n!==`..`&&!d.isAbsolute(n)}function Fl(e){return[...e].map(e=>e===`*`?`[*]`:e===`?`?`[?]`:e===`[`?`[[]`:e===`]`?`[]]`:e===`{`?`[{]`:e===`}`?`[}]`:e).join(``)}function Il(e){try{let t=JSON.parse(l.readFileSync(d.join(e,`package.json`),`utf8`))?.teacss?.entry;return typeof t==`string`&&t?d.resolve(e,t):void 0}catch{return}}function Ll(e){let t=[],n=[e];for(let e of n){let r;try{r=l.readdirSync(e,{withFileTypes:!0})}catch{continue}if(r.some(e=>e.isFile()&&e.name===`package.json`)){let n=Il(e);n&&t.push({directory:e,entry:n})}for(let t of r)t.isDirectory()&&!Ml.has(t.name)&&n.push(d.join(e,t.name))}return t.sort((e,t)=>e.directory<t.directory?-1:+(e.directory>t.directory))}function Rl(e,t){return t.map(e=>d.normalize(e)).filter(t=>Pl(t,e)).sort((e,t)=>t.length-e.length)[0]}function zl(e,t){let n=d.dirname(e);for(;Pl(t,n);){if(d.normalize(g(n)??``)===e)return!0;if(n===t)break;n=d.dirname(n)}return!1}function Bl(e){let t=e.map(({globPattern:e,kind:t})=>typeof e==`string`?`${t??``}\0${e}`:`${t??``}\0${e.baseUri}\0${e.pattern}`);return JSON.stringify(t.sort())}function Vl(e,t,n){let r=new Map,i=(e,t,i=!0)=>{let a=i?Fl(t):t,o={baseUri:S(e).href,pattern:a};r.set(`${o.baseUri}\0${a}`,{globPattern:o,kind:n})};for(let t of e)i(d.dirname(t),d.basename(t));for(let e of t){i(e,Nl,!1);for(let{directory:t,entry:n}of Ll(e)){let e=d.relative(t,n);Pl(t,n)?i(t,e.split(d.sep).join(`/`)):i(d.dirname(n),d.basename(n))}}return Array.from(r.values())}function Hl(e,t,n){let r=new Set(t.map(e=>d.normalize(e))),i=new Set(n.map(Il).filter(e=>!!e).map(e=>d.normalize(e))),a=new Set;for(let t of e){let e;try{e=d.normalize(x(t.uri))}catch{return!0}if(r.has(e)||i.has(e))return!0;if(jl.test(e))continue;let o=Rl(e,n);if(!o){a.add(e);continue}if(d.basename(e)===`package.json`)return!0;if(d.extname(e).toLowerCase()!==`.css`){a.add(e);continue}try{if(zl(e,o))return!0}catch{return!0}}if(a.size){for(let e of n)for(let{entry:t}of Ll(e))if(a.has(d.normalize(t)))return!0}return!1}function Ul(e){let t,n,r,i,a=0,o=Promise.resolve();return{update(s){let c=Bl(s);if(i&&r===c)return i;if(!i&&n===c)return Promise.resolve();let l=++a,u=o.then(async()=>{if(l!==a||n===c)return;let r=await e(s);if(l!==a){r.dispose();return}t?.dispose(),t=r,n=c});o=u.catch(()=>{}),r=c,i=u;let d=()=>{i===u&&(i=void 0,r=void 0)};return u.then(d,d),u}}}function Wl(e){return e instanceof Error?e.message:String(e)}function Gl(e){let t=new Map,n=new Map,r=0;return{async publish(i){let a=++r;t.set(i.uri,a);try{let r=await e.getDiagnostics(i);if(t.get(i.uri)!==a)return;await e.sendDiagnostics(i.uri,r),t.get(i.uri)===a&&n.delete(i.uri)}catch(r){if(t.get(i.uri)!==a)return;let o=Wl(r);if(n.get(i.uri)===o)return;n.set(i.uri,o),e.reportError(i.uri,r)}},invalidate(e){t.delete(e),n.delete(e)}}}function Kl(e,t){e.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[teacss] ${n===`unhandledRejection`?`Unhandled rejection`:`Uncaught exception`}: ${e.message}`)})}function ql(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function Jl(e,t){return typeof e==`boolean`?e:t}function Yl(e,t){if(e!==null)return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`):t}function Xl(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function Zl(e,t){return typeof e!=`number`||!Number.isFinite(e)?t:Math.min(1e4,Math.max(0,Math.floor(e)))}function Ql(e){let t=ql(e),n={};return Object.hasOwn(t,`root`)&&(n.root=t.root),(t.semanticTokens===`native`||t.semanticTokens===`overlay`)&&(n.semanticTokens=t.semanticTokens),typeof t.workspaceFileDir==`string`&&(n.workspaceFileDir=t.workspaceFileDir),Array.isArray(t.workspaceFolderPaths)&&(n.workspaceFolderPaths=t.workspaceFolderPaths.filter(e=>typeof e==`string`)),n}function $l(e,t){let n=ql(t),r=ql(n.autocomplete),i=r.matchType;return{root:Yl(n.root,e.root),colorPreview:Jl(n.colorPreview,e.colorPreview),remToPxPreview:Jl(n.remToPxPreview,e.remToPxPreview),remToPxRatio:Xl(n.remToPxRatio,e.remToPxRatio),syntaxHighlight:Jl(n.syntaxHighlight,e.syntaxHighlight),strictAnnotationMatch:Jl(n.strictAnnotationMatch,e.strictAnnotationMatch),unmatchedDiagnostics:Jl(n.unmatchedDiagnostics,e.unmatchedDiagnostics),autocompleteMatchType:i===`prefix`||i===`fuzzy`?i:e.autocompleteMatchType,autocompleteStrict:Jl(r.strict,e.autocompleteStrict),autocompleteMaxItems:Zl(r.maxItems,e.autocompleteMaxItems)}}function eu(e){return $l(nc,e)}function tu(e,t){return e.syntaxHighlight!==t.syntaxHighlight||e.strictAnnotationMatch!==t.strictAnnotationMatch}function nu(e,t){let n=new Set(e),r=new Set(t);return n.size!==r.size||[...n].some(e=>!r.has(e))}async function ru(e,t,n){if(e)try{return await t()}catch(e){n(e);return}}const Q=te(B.all),iu=new H(O);let au=eu(),$,ou=!1,su=!1,cu=!1,lu=!1,uu=!1,du=!1,fu=0,pu;const mu=new Promise(e=>{pu=e}),hu=U.Create|U.Change|U.Delete,gu=[{globPattern:`**/*.css`,kind:hu}],_u={folderPaths:[]};function vu(e){au=$l(au,e)}function yu(e){return El(e,{workspaceRootPath:_u.rootPath,workspaceFileDir:_u.fileDir,workspaceFolderPaths:_u.folderPaths})}function bu(e){return typeof e==`string`?e.length>0:Array.isArray(e)&&e.some(Boolean)}async function xu(){$&&await Su(()=>$.contextManager.setRoots(yu(au.root)))}async function Su(e){fu++;try{return await e()}finally{fu--}}function Cu(e,t,n){_u.rootPath=e?Cs(e):void 0,_u.fileDir=n?.workspaceFileDir,_u.folderPaths=n?.workspaceFolderPaths||t?.map(e=>Cs(e.uri))||[]}function wu(e=_u.rootPath){if(!e)return;let t=new wl({rootPath:e,folderPaths:yu(au.root),logger:{log:e=>Q.console.log(e),warn:e=>Q.console.warn(e)},getSettings:Pu});$=t;let n=()=>{fu||(Au().catch(e=>ju(`Failed to update config watchers`,e)),Mu(),Gu())};return t.events.on(`reload`,()=>{fu||Au().catch(e=>ju(`Failed to update config watchers`,e))}),t.events.on(`contextLoaded`,n),t.events.on(`contextReload`,n),t.events.on(`contextUnload`,n),t.events.on(`unload`,n),t}async function Tu(e){$||!e[0]||await wu(e[0])?.ready}function Eu(){return $?.contextManager.configSources??[]}function Du(){return Array.from(new Set([...yu(au.root),...$?.contextManager.contextsMap.keys()??[]]))}function Ou(){let e=Eu(),t=Vl(e,Du(),hu);return e.length?t:[...gu,...t]}const ku=Ul(async e=>Q.client.register(ee.type,{watchers:[...e]}));async function Au(){!ou||!du||!$||await ku.update(Ou())}function ju(e,t){Q.console.error(`[teacss] ${e}: ${t instanceof Error?t.message:String(t)}`)}async function Mu(){du&&(uu?await Q.sendNotification(`teacss/semanticTokens/refresh`).catch(e=>ju(`Failed to refresh semantic token decorations`,e)):lu&&await Q.languages.semanticTokens.refresh().catch(e=>ju(`Failed to refresh semantic tokens`,e)))}const Nu=Gl({async getDiagnostics(e){return await Iu(),await $?.getDiagnostics(e)??[]},sendDiagnostics(e,t){return Q.sendDiagnostics({uri:e,diagnostics:[...t]})},reportError(e,t){ju(`Failed to publish diagnostics for ${e}`,t)}});Kl(s,e=>Q.console.error(e));function Pu(){return au}function Fu(){return $}function Iu(){return mu}Q.onInitialize(r=>{ou=!!r.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration,su=!!r.capabilities.workspace?.configuration,cu=!!r.capabilities.workspace?.workspaceFolders,lu=!!r.capabilities.workspace?.semanticTokens?.refreshSupport;let o=Ql(r.initializationOptions);uu=o?.semanticTokens===`overlay`,`root`in o&&vu({root:o.root});let s=r.workspaceFolders,c=s?.[0]?.uri||r.rootUri;Cu(c,s,o);let l=c?void 0:yu(au.root)[0];return c?wu():l&&wu(l),Al(Q,iu,Fu,Iu),t(Q,iu,Fu,Iu),i(Q,iu,Fu,Iu),e(Q,iu,Fu,Iu),n(Q,iu,Fu,Iu),a(Q,iu,Fu,Iu),{capabilities:{textDocumentSync:V.Incremental,completionProvider:{resolveProvider:!0,triggerCharacters:[`-`,`:`,` `,`"`,`'`]},hoverProvider:!0,codeActionProvider:!0,referencesProvider:!0,colorProvider:!0,...uu?{}:{semanticTokensProvider:{legend:al,full:!0}},...cu?{workspace:{workspaceFolders:{supported:!0,changeNotifications:!0}}}:{}}}}),Q.onInitialized(async()=>{cu&&Q.workspace.onDidChangeWorkspaceFolders(e=>{Ku(e).catch(e=>ju(`Failed to update workspace folders`,e))});try{let e=await ru(su,()=>Q.workspace.getConfiguration(`teacss`),e=>ju(`Failed to read workspace configuration`,e));e!==void 0&&vu(e),await Tu(yu(au.root)),$&&(await $.ready,await xu())}catch(e){ju(`Failed to complete initial setup`,e)}finally{du=!0,pu?.(),pu=void 0}Q.console.log(`✅ TeaCSS Language Server initialized`),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu()});let Lu;Q.onDidChangeWatchedFiles(e=>{Hl(e.changes,Eu(),Du())&&(clearTimeout(Lu),Lu=setTimeout(()=>{Ru().catch(e=>ju(`Failed to reload config sources`,e))},500))});async function Ru(){await Iu(),$&&(Q.console.log(`🔄 Config source changed, reloading TeaCSS...`),$r(),await Su(()=>$.contextManager.reload()),Q.console.log(`🔵 Reloaded.`),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu(),await Gu())}Q.onDidChangeConfiguration(async e=>{await Iu();let t=e.settings?.teacss;if(t!==void 0){let e=au,n=yu(e.root);vu(t);let r=yu(au.root),i=nu(n,r);i&&(await Tu(r),$&&await Su(()=>$.contextManager.setRoots(r)),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Gu()),!i&&e.unmatchedDiagnostics!==au.unmatchedDiagnostics&&await Gu(),(i||tu(e,au))&&await Mu()}});async function zu(){return await Iu(),$?($r(),await Su(()=>$.contextManager.reload()),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu(),await Gu(),{success:!0}):{success:!1}}async function Bu(e){if(await Iu(),!$)return{count:0};let t=iu.get(e.uri);if(!t)return{count:0};let n=Cs(e.uri),r=t.getText(),i=await $.contextManager.resolveClosestContext(r,n);return i?{count:(await i.generator.generate(r,{id:n,preflights:!1,safelist:!1,minify:!0})).matched.size}:{count:0}}async function Vu(e){if(await Iu(),!$)return{positions:[]};let t=iu.get(e.uri);return t?{positions:(await $.getMatchedPositions(t)).map(e=>({start:t.positionAt(e.start),end:t.positionAt(e.end),className:e.text}))}:{positions:[]}}async function Hu(e){if(await Iu(),!$)return null;let t=e.uri?iu.get(e.uri):iu.all()[0];return t?$.getProjectStatus(t):null}async function Uu(e){if(await Iu(),!$)return[];let t=iu.get(e.uri);return t?$.getClassNameEdits(t):[]}Q.onRequest(`teacss/reloadConfig`,zu),Q.onRequest(`teacss/getMatchedCount`,Bu),Q.onRequest(`teacss/getMatchedPositions`,Vu),Q.onRequest(`teacss/projectStatus`,Hu),Q.onRequest(`teacss/normalizeClasses`,Uu);async function Wu(e){$&&await Nu.publish(e)}async function Gu(){await Promise.all(iu.all().map(e=>Wu(e)))}async function Ku(e){await Iu();let t=new Set(e.removed.map(e=>Cs(e.uri))),n=_u.folderPaths.filter(e=>!t.has(e));for(let t of e.added){let e=Cs(t.uri);n.includes(e)||n.push(e)}if(_u.folderPaths=n,_u.rootPath=n[0],!$&&_u.rootPath&&(wu(),await Fu()?.ready),!$)return;$r();let r=bu(au.root)?yu(au.root):_u.folderPaths;await Su(()=>$.contextManager.setRoots(r)),await Au().catch(e=>ju(`Failed to update config watchers`,e)),await Mu(),await Gu()}iu.onDidChangeContent(e=>{Qr(Cs(e.document.uri)),Wu(e.document)}),iu.onDidClose(e=>{let t=Cs(e.document.uri);Qr(t),$?.contextManager.releaseDocument(t),Nu.invalidate(e.document.uri),Q.sendDiagnostics({uri:e.document.uri,diagnostics:[]})}),iu.listen(Q),Q.listen();export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teacss/language-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Standalone LSP server for TeaCSS — completion, hover, color, and token highlighting over stdio.",
|
|
5
5
|
"homepage": "https://css.teasim.com",
|
|
6
6
|
"funding": "https://github.com/sponsors/billgo",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@colordx/core": "^5.5.0",
|
|
33
|
-
"@teacss/config": "0.4.
|
|
34
|
-
"@teacss/language-service": "0.4.
|
|
35
|
-
"@teacss/runtime": "0.4.
|
|
33
|
+
"@teacss/config": "0.4.5",
|
|
34
|
+
"@teacss/language-service": "0.4.5",
|
|
35
|
+
"@teacss/runtime": "0.4.5",
|
|
36
36
|
"magic-string": "^1.1.0",
|
|
37
37
|
"prettier": "^3.9.6",
|
|
38
38
|
"vscode-languageserver": "^10.1.0",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"vscode-languageserver-types": "^3.18.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@teacss/autocomplete": "0.4.
|
|
44
|
-
"@teacss/core": "0.4.
|
|
45
|
-
"@teacss/preset-standard": "0.4.
|
|
43
|
+
"@teacss/autocomplete": "0.4.5",
|
|
44
|
+
"@teacss/core": "0.4.5",
|
|
45
|
+
"@teacss/preset-standard": "0.4.5"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
48
|
"node": ">=22.12.0"
|