@teacss/language-server 0.4.6 → 0.4.7

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.
Files changed (2) hide show
  1. package/dist/server.js +1 -1
  2. package/package.json +7 -7
package/dist/server.js CHANGED
@@ -31,4 +31,4 @@ const fi={216:`O`,223:`s`,248:`o`,273:`d`,295:`h`,305:`i`,320:`l`,322:`l`,359:`t
31
31
  `)}function fl(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)||il(e,t))),s=[];for(let n of o){let i=r.get(n);if(i)for(let n of[...i.keys()].sort((e,n)=>kr(t,e,n))){let t=dl(i.get(n),e.mergeSelectors,ll(n));if(t)if(!n)s.push(t);else{let e=cl(n);s.push(`${e.join(`{`)}{${t}${`}`.repeat(e.length)}`)}}}return s.join(`
32
32
  `)}async function pl(e,t){let n=e.config,r=await e.parseToken(t);if(e.config!==n)return pl(e,t);if(r?.length)return Pc(fl(n,new Map(e.parentOrders),r))}async function ml(e,t){let n=rl.get(e);return(!n||n.config!==e.config)&&(n={config:e.config,values:new Map},rl.set(e,n)),si(n.values,t,1e3,()=>pl(e,t).then(e=>e?{colorString:e,color:Fc(e)}:{}))}const hl=[...Wc,`teacss`],gl={tokenTypes:[...Uc],tokenModifiers:hl},_l=new Map(Uc.map((e,t)=>[e,t])),vl=new Map(hl.map((e,t)=>[e,1<<t])),yl=vl.get(`teacss`)??0,bl=/^-?(?:\d+\.?\d*|\.\d+)[a-z%]*$/i,xl=new WeakMap,Sl={log(){},warn(){}};function Cl(e,t){let n=rs(e,t)?.toLowerCase();return n?.endsWith(`class`)||n?.endsWith(`classname`)}function wl(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 Tl(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 El(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 Dl(e){return!e.startsWith(`[`)||!e.endsWith(`]`)||Fc(e.slice(1,-1).replace(/\\?_/g,e=>e===`_`?` `:`_`).trim())!==void 0}function Ol(e){let t=xl.get(e);if(t?.config===e.config)return t.classifier;let n=_c(e.config?.theme??{});return xl.set(e,{config:e.config,classifier:n}),n}function kl(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 Al(e,t,n,r,i=yl){let a=e.positionAt(t);return{line:a.line,char:a.character,length:n,type:_l.get(r)??0,modifiers:i}}function jl(e,t,n,r,i=yl){let a=[],o=0;for(let s=0;s<n.length;s++)(n[s]===`\r`||n[s]===`
33
33
  `)&&(s>o&&a.push(Al(e,t+o,s-o,r,i)),n[s]===`\r`&&n[s+1]===`
34
- `&&s++,o=s+1);return o<n.length&&a.push(Al(e,t+o,n.length-o,r,i)),a}function Ml(e,t){return t.isColorValue?.(e)?`enumMember`:bl.test(e)?`number`:`string`}function Nl(e,t,n){return e.some(e=>e.open===t&&e.close===n-1)}function Pl(e,t,n){let r=[];for(let i of n){r.push(Al(e,i.open,1,`operator`,yl|(vl.get(`group`)??0)));for(let n of i.declarations){let{property:i,start:a,colon:o,value:s,valueStart:c}=n;r.push(Al(e,a,2,`operator`,yl|(vl.get(`variable`)??0))),r.push(Al(e,a+2,i.length-2,`property`)),r.push(Al(e,o,1,`operator`)),s&&r.push(...jl(e,c,s,Ml(s,t)))}r.push(Al(e,i.close,1,`operator`,yl|(vl.get(`group`)??0)))}return r}var Fl=class{contextManager;getSettings;logger;autoCompletes=new Map;semanticTokensCache=new Map;featureFailures=new Map;constructor(e){this.getSettings=e.getSettings??(()=>pc),this.logger=e.logger??Sl;let t=e.folderPaths?.length?e.folderPaths:[e.rootPath];this.contextManager=new Us(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&&(oi(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=Ns(e.generator,{matchType:t,throwErrors:!1});return this.autoCompletes.set(e,{matchType:t,autocomplete:r}),r}async resolveTargetContext(e){let t=Ps(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)||vn(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 oi(this.semanticTokensCache,o,u,100),this.clearFeatureFailure(n,e.uri),u.result;let d=await di(a.generator,s,o,l),f=Ol(a.generator),p=[],m=new Map,h=vn(o)?v(s):[];for(let[e,t]of d){if(Nl(h,e,t))continue;let n=s.slice(e,t),r=m.get(n);r||(r=$c(n,0,f),m.set(n,r));for(let t of r){let n=e+t.start,r=c.positionAt(n),i=yl;for(let e of t.modifiers)i|=vl.get(e)??0;p.push({line:r.line,char:r.character,length:t.length,type:_l.get(t.type)??0,modifiers:i})}}h.length&&p.push(...Pl(c,f,h));let g=kl(p);return oi(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(vn(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 Qn.extract?.({code:i,id:r,generator:n.generator})??[],t=ri(i,Array.from(new Set(e)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Lr(i,r)}).filter(([e,t])=>Cl(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])=>{if(s.matched.has(e))return!1;if(!e.includes(`{`))return!0;let t=Sr(mn(e));return t.length===1&&t[0]===e||!t.every(e=>s.matched.has(e))&&t.some(e=>!s.matched.has(e)&&dr(e))}),l=new Map;for(let[,,e]of c){let t=ur(e),r=e.slice(t.length),i=br(e,n.generator.config,{confirmedIntent:!0})?.map(e=>`${e}${r}`)??[];l.set(e,Array.from(new Set([...wl(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=>vn(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`)||vn(r),u=(await di(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 Qn.extract?.({code:i,id:r,generator:n.generator})??[],s=ri(i,Array.from(new Set(o)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Lr(i,r)}),c=new Map;for(let[e,t]of s){let n=is(i,Math.max(e+1,t-1)),r=n?.key.toLowerCase();!n||!(r?.endsWith(`class`)||r?.endsWith(`classname`))||c.set(n.valueStart,Tl(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(vn(Ps(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 di(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 Hc(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 di(i.generator,o,a,n.strictAnnotationMatch),l=[],u=!1;for(let[n,r,a]of c)try{let{color:e}=await ml(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=Il(n),r=n.slice(0,e),i=n.slice(e),a=r.indexOf(`:`);if(a>0){let e=r.endsWith(`!`)?`!`:``;if(Dl(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 di(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=Ps(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 di(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=>vn(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=fc(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 El(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 di(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=Ps(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&&!Rs(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 El(u,32,async([e])=>{try{return(await ml(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=Ps(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 Vc(a.generator,e.data.value,o)).prettified:e.documentation={kind:`markdown`,value:await Hc(a.generator,e.data.value,o)},e}async getSuggestionResult({ctx:e,code:t,id:n,offset:r,matchType:i}){let a=zs(t,n);if(!e.filter(t,n)&&!vn(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 Il(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 Ll(e,t){let n=zl(t.workspaceFolderPaths||[]),r=n.length?n:zl([t.workspaceRootPath]),i=le(e).filter(e=>typeof e==`string`&&e.length>0);if(!i.length)return r;let a=zl([t.workspaceFileDir,...n,t.workspaceRootPath]);return zl(i.flatMap(e=>Rl(e,a)))}function Rl(e,t){if(!e)return[];if(Bl(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 zl(e){return Array.from(new Set(e.filter(Boolean).map(e=>d.normalize(e))))}function Bl(e){return d.isAbsolute(e)||d.win32.isAbsolute(e)}function Vl(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 Hl=/[\\/](?:node_modules|dist|\.temp|\.cache|\.git)[\\/]/,Ul=new Set([`node_modules`,`dist`,`.temp`,`.cache`,`.git`]),Wl=`**/{${Array.from(new Set(h.map(e=>d.posix.basename(e)))).join(`,`)}}`;function Gl(e,t){let n=d.relative(e,t);return n===``||!n.startsWith(`..${d.sep}`)&&n!==`..`&&!d.isAbsolute(n)}function Kl(e){return[...e].map(e=>e===`*`?`[*]`:e===`?`?`[?]`:e===`[`?`[[]`:e===`]`?`[]]`:e===`{`?`[{]`:e===`}`?`[}]`:e).join(``)}function ql(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 Jl(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=ql(e);n&&t.push({directory:e,entry:n})}for(let t of r)t.isDirectory()&&!Ul.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 Yl(e,t){return t.map(e=>d.normalize(e)).filter(t=>Gl(t,e)).sort((e,t)=>t.length-e.length)[0]}function Xl(e,t){let n=d.dirname(e);for(;Gl(t,n);){if(d.normalize(g(n)??``)===e)return!0;if(n===t)break;n=d.dirname(n)}return!1}function Zl(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 Ql(e,t,n){let r=new Map,i=(e,t,i=!0)=>{let a=i?Kl(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,Wl,!1);for(let{directory:t,entry:n}of Jl(e)){let e=d.relative(t,n);Gl(t,n)?i(t,e.split(d.sep).join(`/`)):i(d.dirname(n),d.basename(n))}}return Array.from(r.values())}function $l(e,t,n){let r=new Set(t.map(e=>d.normalize(e))),i=new Set(n.map(ql).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(Hl.test(e))continue;let o=Yl(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(Xl(e,o))return!0}catch{return!0}}if(a.size){for(let e of n)for(let{entry:t}of Jl(e))if(a.has(d.normalize(t)))return!0}return!1}function eu(e){let t,n,r,i,a=0,o=Promise.resolve();return{update(s){let c=Zl(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 tu(e){return e instanceof Error?e.message:String(e)}function nu(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=tu(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 ru(e,t){e.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[teacss] ${n===`unhandledRejection`?`Unhandled rejection`:`Uncaught exception`}: ${e.message}`)})}function iu(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function au(e,t){return typeof e==`boolean`?e:t}function ou(e,t){if(e!==null)return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`):t}function su(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function cu(e,t){return typeof e!=`number`||!Number.isFinite(e)?t:Math.min(1e4,Math.max(0,Math.floor(e)))}function lu(e){let t=iu(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 uu(e,t){let n=iu(t),r=iu(n.autocomplete),i=r.matchType;return{root:ou(n.root,e.root),colorPreview:au(n.colorPreview,e.colorPreview),remToPxPreview:au(n.remToPxPreview,e.remToPxPreview),remToPxRatio:su(n.remToPxRatio,e.remToPxRatio),syntaxHighlight:au(n.syntaxHighlight,e.syntaxHighlight),strictAnnotationMatch:au(n.strictAnnotationMatch,e.strictAnnotationMatch),unmatchedDiagnostics:au(n.unmatchedDiagnostics,e.unmatchedDiagnostics),autocompleteMatchType:i===`prefix`||i===`fuzzy`?i:e.autocompleteMatchType,autocompleteStrict:au(r.strict,e.autocompleteStrict),autocompleteMaxItems:cu(r.maxItems,e.autocompleteMaxItems)}}function du(e){return uu(pc,e)}function fu(e,t){return e.syntaxHighlight!==t.syntaxHighlight||e.strictAnnotationMatch!==t.strictAnnotationMatch}function pu(e,t){let n=new Set(e),r=new Set(t);return n.size!==r.size||[...n].some(e=>!r.has(e))}async function mu(e,t,n){if(e)try{return await t()}catch(e){n(e);return}}const Q=te(B.all),hu=new H(O);let gu=du(),$,_u=!1,vu=!1,yu=!1,bu=!1,xu=!1,Su=!1,Cu=0,wu;const Tu=new Promise(e=>{wu=e}),Eu=U.Create|U.Change|U.Delete,Du=[{globPattern:`**/*.css`,kind:Eu}],Ou={folderPaths:[]};function ku(e){gu=uu(gu,e)}function Au(e){return Ll(e,{workspaceRootPath:Ou.rootPath,workspaceFileDir:Ou.fileDir,workspaceFolderPaths:Ou.folderPaths})}function ju(e){return typeof e==`string`?e.length>0:Array.isArray(e)&&e.some(Boolean)}async function Mu(){$&&await Nu(()=>$.contextManager.setRoots(Au(gu.root)))}async function Nu(e){Cu++;try{return await e()}finally{Cu--}}function Pu(e,t,n){Ou.rootPath=e?Ps(e):void 0,Ou.fileDir=n?.workspaceFileDir,Ou.folderPaths=n?.workspaceFolderPaths||t?.map(e=>Ps(e.uri))||[]}function Fu(e=Ou.rootPath){if(!e)return;let t=new Fl({rootPath:e,folderPaths:Au(gu.root),logger:{log:e=>Q.console.log(e),warn:e=>Q.console.warn(e)},getSettings:Gu});$=t;let n=()=>{Cu||(Vu().catch(e=>Hu(`Failed to update config watchers`,e)),Uu(),nd())};return t.events.on(`reload`,()=>{Cu||Vu().catch(e=>Hu(`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 Iu(e){$||!e[0]||await Fu(e[0])?.ready}function Lu(){return $?.contextManager.configSources??[]}function Ru(){return Array.from(new Set([...Au(gu.root),...$?.contextManager.contextsMap.keys()??[]]))}function zu(){let e=Lu(),t=Ql(e,Ru(),Eu);return e.length?t:[...Du,...t]}const Bu=eu(async e=>Q.client.register(ee.type,{watchers:[...e]}));async function Vu(){!_u||!Su||!$||await Bu.update(zu())}function Hu(e,t){Q.console.error(`[teacss] ${e}: ${t instanceof Error?t.message:String(t)}`)}async function Uu(){Su&&(xu?await Q.sendNotification(`teacss/semanticTokens/refresh`).catch(e=>Hu(`Failed to refresh semantic token decorations`,e)):bu&&await Q.languages.semanticTokens.refresh().catch(e=>Hu(`Failed to refresh semantic tokens`,e)))}const Wu=nu({async getDiagnostics(e){return await qu(),await $?.getDiagnostics(e)??[]},sendDiagnostics(e,t){return Q.sendDiagnostics({uri:e,diagnostics:[...t]})},reportError(e,t){Hu(`Failed to publish diagnostics for ${e}`,t)}});ru(s,e=>Q.console.error(e));function Gu(){return gu}function Ku(){return $}function qu(){return Tu}Q.onInitialize(r=>{_u=!!r.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration,vu=!!r.capabilities.workspace?.configuration,yu=!!r.capabilities.workspace?.workspaceFolders,bu=!!r.capabilities.workspace?.semanticTokens?.refreshSupport;let o=lu(r.initializationOptions);xu=o?.semanticTokens===`overlay`,`root`in o&&ku({root:o.root});let s=r.workspaceFolders,c=s?.[0]?.uri||r.rootUri;Pu(c,s,o);let l=c?void 0:Au(gu.root)[0];return c?Fu():l&&Fu(l),Vl(Q,hu,Ku,qu),t(Q,hu,Ku,qu),i(Q,hu,Ku,qu),e(Q,hu,Ku,qu),n(Q,hu,Ku,qu),a(Q,hu,Ku,qu),{capabilities:{textDocumentSync:V.Incremental,completionProvider:{resolveProvider:!0,triggerCharacters:[`-`,`:`,` `,`"`,`'`]},hoverProvider:!0,codeActionProvider:!0,referencesProvider:!0,colorProvider:!0,...xu?{}:{semanticTokensProvider:{legend:gl,full:!0}},...yu?{workspace:{workspaceFolders:{supported:!0,changeNotifications:!0}}}:{}}}}),Q.onInitialized(async()=>{yu&&Q.workspace.onDidChangeWorkspaceFolders(e=>{rd(e).catch(e=>Hu(`Failed to update workspace folders`,e))});try{let e=await mu(vu,()=>Q.workspace.getConfiguration(`teacss`),e=>Hu(`Failed to read workspace configuration`,e));e!==void 0&&ku(e),await Iu(Au(gu.root)),$&&(await $.ready,await Mu())}catch(e){Hu(`Failed to complete initial setup`,e)}finally{Su=!0,wu?.(),wu=void 0}Q.console.log(`✅ TeaCSS Language Server initialized`),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu()});let Ju;Q.onDidChangeWatchedFiles(e=>{$l(e.changes,Lu(),Ru())&&(clearTimeout(Ju),Ju=setTimeout(()=>{Yu().catch(e=>Hu(`Failed to reload config sources`,e))},500))});async function Yu(){await qu(),$&&(Q.console.log(`🔄 Config source changed, reloading TeaCSS...`),ui(),await Nu(()=>$.contextManager.reload()),Q.console.log(`🔵 Reloaded.`),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu(),await nd())}Q.onDidChangeConfiguration(async e=>{await qu();let t=e.settings?.teacss;if(t!==void 0){let e=gu,n=Au(e.root);ku(t);let r=Au(gu.root),i=pu(n,r);i&&(await Iu(r),$&&await Nu(()=>$.contextManager.setRoots(r)),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await nd()),!i&&e.unmatchedDiagnostics!==gu.unmatchedDiagnostics&&await nd(),(i||fu(e,gu))&&await Uu()}});async function Xu(){return await qu(),$?(ui(),await Nu(()=>$.contextManager.reload()),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu(),await nd(),{success:!0}):{success:!1}}async function Zu(e){if(await qu(),!$)return{count:0};let t=hu.get(e.uri);if(!t)return{count:0};let n=Ps(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 Qu(e){if(await qu(),!$)return{positions:[]};let t=hu.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 $u(e){if(await qu(),!$)return null;let t=e.uri?hu.get(e.uri):hu.all()[0];return t?$.getProjectStatus(t):null}async function ed(e){if(await qu(),!$)return[];let t=hu.get(e.uri);return t?$.getClassNameEdits(t):[]}Q.onRequest(`teacss/reloadConfig`,Xu),Q.onRequest(`teacss/getMatchedCount`,Zu),Q.onRequest(`teacss/getMatchedPositions`,Qu),Q.onRequest(`teacss/projectStatus`,$u),Q.onRequest(`teacss/normalizeClasses`,ed);async function td(e){$&&await Wu.publish(e)}async function nd(){await Promise.all(hu.all().map(e=>td(e)))}async function rd(e){await qu();let t=new Set(e.removed.map(e=>Ps(e.uri))),n=Ou.folderPaths.filter(e=>!t.has(e));for(let t of e.added){let e=Ps(t.uri);n.includes(e)||n.push(e)}if(Ou.folderPaths=n,Ou.rootPath=n[0],!$&&Ou.rootPath&&(Fu(),await Ku()?.ready),!$)return;ui();let r=ju(gu.root)?Au(gu.root):Ou.folderPaths;await Nu(()=>$.contextManager.setRoots(r)),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu(),await nd()}hu.onDidChangeContent(e=>{li(Ps(e.document.uri)),td(e.document)}),hu.onDidClose(e=>{let t=Ps(e.document.uri);li(t),$?.contextManager.releaseDocument(t),Wu.invalidate(e.document.uri),Q.sendDiagnostics({uri:e.document.uri,diagnostics:[]})}),hu.listen(Q),Q.listen();export{};
34
+ `&&s++,o=s+1);return o<n.length&&a.push(Al(e,t+o,n.length-o,r,i)),a}function Ml(e,t){return t.isColorValue?.(e)?`enumMember`:bl.test(e)?`number`:`string`}function Nl(e,t,n){return e.some(e=>e.open===t&&e.close===n-1)}function Pl(e,t,n){let r=[];for(let i of n){r.push(Al(e,i.open,1,`operator`,yl|(vl.get(`group`)??0)));for(let n of i.declarations){let{property:i,start:a,colon:o,value:s,valueStart:c}=n;r.push(Al(e,a,2,`operator`,yl|(vl.get(`variable`)??0))),r.push(Al(e,a+2,i.length-2,`property`)),r.push(Al(e,o,1,`operator`)),s&&r.push(...jl(e,c,s,Ml(s,t)))}r.push(Al(e,i.close,1,`operator`,yl|(vl.get(`group`)??0)))}return r}var Fl=class{contextManager;getSettings;logger;autoCompletes=new Map;semanticTokensCache=new Map;featureFailures=new Map;constructor(e){this.getSettings=e.getSettings??(()=>pc),this.logger=e.logger??Sl;let t=e.folderPaths?.length?e.folderPaths:[e.rootPath];this.contextManager=new Us(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&&(oi(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=Ns(e.generator,{matchType:t,throwErrors:!1});return this.autoCompletes.set(e,{matchType:t,autocomplete:r}),r}async resolveTargetContext(e){let t=Ps(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)||vn(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 oi(this.semanticTokensCache,o,u,100),this.clearFeatureFailure(n,e.uri),u.result;let d=await di(a.generator,s,o,l),f=Ol(a.generator),p=[],m=new Map,h=vn(o)?v(s):[];for(let[e,t]of d){if(Nl(h,e,t))continue;let n=s.slice(e,t),r=m.get(n);r||(r=$c(n,0,f),m.set(n,r));for(let t of r){let n=e+t.start,r=c.positionAt(n),i=yl;for(let e of t.modifiers)i|=vl.get(e)??0;p.push({line:r.line,char:r.character,length:t.length,type:_l.get(t.type)??0,modifiers:i})}}h.length&&p.push(...Pl(c,f,h));let g=kl(p);return oi(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(vn(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 Qn.extract?.({code:i,id:r,generator:n.generator})??[],t=ri(i,Array.from(new Set(e)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Lr(i,r)}).filter(([e,t])=>Cl(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])=>{if(s.matched.has(e))return!1;if(!e.includes(`{`))return!0;let t=Sr(mn(e));return t.length===1&&t[0]===e||!t.every(e=>s.matched.has(e))&&t.some(e=>!s.matched.has(e)&&dr(e))}),l=new Map;for(let[,,e]of c){let t=ur(e),r=e.slice(t.length),i=br(e,n.generator.config,{confirmedIntent:!0})?.map(e=>`${e}${r}`)??[];l.set(e,Array.from(new Set([...wl(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.flatMap(([e,t,n])=>{let r=(l.get(n)??[]).filter(e=>d.has(e)).slice(0,3);return!r.length&&!dr(n)&&ur(n)===n&&!n.includes(`{`)?[]:[{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=>vn(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`)||vn(r),u=(await di(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 Qn.extract?.({code:i,id:r,generator:n.generator})??[],s=ri(i,Array.from(new Set(o)).filter(e=>typeof e==`string`&&e.length>0),[],{excludeRanges:Lr(i,r)}),c=new Map;for(let[e,t]of s){let n=is(i,Math.max(e+1,t-1)),r=n?.key.toLowerCase();!n||!(r?.endsWith(`class`)||r?.endsWith(`classname`))||c.set(n.valueStart,Tl(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(vn(Ps(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 di(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 Hc(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 di(i.generator,o,a,n.strictAnnotationMatch),l=[],u=!1;for(let[n,r,a]of c)try{let{color:e}=await ml(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=Il(n),r=n.slice(0,e),i=n.slice(e),a=r.indexOf(`:`);if(a>0){let e=r.endsWith(`!`)?`!`:``;if(Dl(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 di(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=Ps(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 di(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=>vn(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=fc(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 El(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 di(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=Ps(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&&!Rs(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 El(u,32,async([e])=>{try{return(await ml(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=Ps(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 Vc(a.generator,e.data.value,o)).prettified:e.documentation={kind:`markdown`,value:await Hc(a.generator,e.data.value,o)},e}async getSuggestionResult({ctx:e,code:t,id:n,offset:r,matchType:i}){let a=zs(t,n);if(!e.filter(t,n)&&!vn(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 Il(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 Ll(e,t){let n=zl(t.workspaceFolderPaths||[]),r=n.length?n:zl([t.workspaceRootPath]),i=le(e).filter(e=>typeof e==`string`&&e.length>0);if(!i.length)return r;let a=zl([t.workspaceFileDir,...n,t.workspaceRootPath]);return zl(i.flatMap(e=>Rl(e,a)))}function Rl(e,t){if(!e)return[];if(Bl(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 zl(e){return Array.from(new Set(e.filter(Boolean).map(e=>d.normalize(e))))}function Bl(e){return d.isAbsolute(e)||d.win32.isAbsolute(e)}function Vl(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 Hl=/[\\/](?:node_modules|dist|\.temp|\.cache|\.git)[\\/]/,Ul=new Set([`node_modules`,`dist`,`.temp`,`.cache`,`.git`]),Wl=`**/{${Array.from(new Set(h.map(e=>d.posix.basename(e)))).join(`,`)}}`;function Gl(e,t){let n=d.relative(e,t);return n===``||!n.startsWith(`..${d.sep}`)&&n!==`..`&&!d.isAbsolute(n)}function Kl(e){return[...e].map(e=>e===`*`?`[*]`:e===`?`?`[?]`:e===`[`?`[[]`:e===`]`?`[]]`:e===`{`?`[{]`:e===`}`?`[}]`:e).join(``)}function ql(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 Jl(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=ql(e);n&&t.push({directory:e,entry:n})}for(let t of r)t.isDirectory()&&!Ul.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 Yl(e,t){return t.map(e=>d.normalize(e)).filter(t=>Gl(t,e)).sort((e,t)=>t.length-e.length)[0]}function Xl(e,t){let n=d.dirname(e);for(;Gl(t,n);){if(d.normalize(g(n)??``)===e)return!0;if(n===t)break;n=d.dirname(n)}return!1}function Zl(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 Ql(e,t,n){let r=new Map,i=(e,t,i=!0)=>{let a=i?Kl(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,Wl,!1);for(let{directory:t,entry:n}of Jl(e)){let e=d.relative(t,n);Gl(t,n)?i(t,e.split(d.sep).join(`/`)):i(d.dirname(n),d.basename(n))}}return Array.from(r.values())}function $l(e,t,n){let r=new Set(t.map(e=>d.normalize(e))),i=new Set(n.map(ql).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(Hl.test(e))continue;let o=Yl(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(Xl(e,o))return!0}catch{return!0}}if(a.size){for(let e of n)for(let{entry:t}of Jl(e))if(a.has(d.normalize(t)))return!0}return!1}function eu(e){let t,n,r,i,a=0,o=Promise.resolve();return{update(s){let c=Zl(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 tu(e){return e instanceof Error?e.message:String(e)}function nu(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=tu(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 ru(e,t){e.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[teacss] ${n===`unhandledRejection`?`Unhandled rejection`:`Uncaught exception`}: ${e.message}`)})}function iu(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function au(e,t){return typeof e==`boolean`?e:t}function ou(e,t){if(e!==null)return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`):t}function su(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function cu(e,t){return typeof e!=`number`||!Number.isFinite(e)?t:Math.min(1e4,Math.max(0,Math.floor(e)))}function lu(e){let t=iu(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 uu(e,t){let n=iu(t),r=iu(n.autocomplete),i=r.matchType;return{root:ou(n.root,e.root),colorPreview:au(n.colorPreview,e.colorPreview),remToPxPreview:au(n.remToPxPreview,e.remToPxPreview),remToPxRatio:su(n.remToPxRatio,e.remToPxRatio),syntaxHighlight:au(n.syntaxHighlight,e.syntaxHighlight),strictAnnotationMatch:au(n.strictAnnotationMatch,e.strictAnnotationMatch),unmatchedDiagnostics:au(n.unmatchedDiagnostics,e.unmatchedDiagnostics),autocompleteMatchType:i===`prefix`||i===`fuzzy`?i:e.autocompleteMatchType,autocompleteStrict:au(r.strict,e.autocompleteStrict),autocompleteMaxItems:cu(r.maxItems,e.autocompleteMaxItems)}}function du(e){return uu(pc,e)}function fu(e,t){return e.syntaxHighlight!==t.syntaxHighlight||e.strictAnnotationMatch!==t.strictAnnotationMatch}function pu(e,t){let n=new Set(e),r=new Set(t);return n.size!==r.size||[...n].some(e=>!r.has(e))}async function mu(e,t,n){if(e)try{return await t()}catch(e){n(e);return}}const Q=te(B.all),hu=new H(O);let gu=du(),$,_u=!1,vu=!1,yu=!1,bu=!1,xu=!1,Su=!1,Cu=0,wu;const Tu=new Promise(e=>{wu=e}),Eu=U.Create|U.Change|U.Delete,Du=[{globPattern:`**/*.css`,kind:Eu}],Ou={folderPaths:[]};function ku(e){gu=uu(gu,e)}function Au(e){return Ll(e,{workspaceRootPath:Ou.rootPath,workspaceFileDir:Ou.fileDir,workspaceFolderPaths:Ou.folderPaths})}function ju(e){return typeof e==`string`?e.length>0:Array.isArray(e)&&e.some(Boolean)}async function Mu(){$&&await Nu(()=>$.contextManager.setRoots(Au(gu.root)))}async function Nu(e){Cu++;try{return await e()}finally{Cu--}}function Pu(e,t,n){Ou.rootPath=e?Ps(e):void 0,Ou.fileDir=n?.workspaceFileDir,Ou.folderPaths=n?.workspaceFolderPaths||t?.map(e=>Ps(e.uri))||[]}function Fu(e=Ou.rootPath){if(!e)return;let t=new Fl({rootPath:e,folderPaths:Au(gu.root),logger:{log:e=>Q.console.log(e),warn:e=>Q.console.warn(e)},getSettings:Gu});$=t;let n=()=>{Cu||(Vu().catch(e=>Hu(`Failed to update config watchers`,e)),Uu(),nd())};return t.events.on(`reload`,()=>{Cu||Vu().catch(e=>Hu(`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 Iu(e){$||!e[0]||await Fu(e[0])?.ready}function Lu(){return $?.contextManager.configSources??[]}function Ru(){return Array.from(new Set([...Au(gu.root),...$?.contextManager.contextsMap.keys()??[]]))}function zu(){let e=Lu(),t=Ql(e,Ru(),Eu);return e.length?t:[...Du,...t]}const Bu=eu(async e=>Q.client.register(ee.type,{watchers:[...e]}));async function Vu(){!_u||!Su||!$||await Bu.update(zu())}function Hu(e,t){Q.console.error(`[teacss] ${e}: ${t instanceof Error?t.message:String(t)}`)}async function Uu(){Su&&(xu?await Q.sendNotification(`teacss/semanticTokens/refresh`).catch(e=>Hu(`Failed to refresh semantic token decorations`,e)):bu&&await Q.languages.semanticTokens.refresh().catch(e=>Hu(`Failed to refresh semantic tokens`,e)))}const Wu=nu({async getDiagnostics(e){return await qu(),await $?.getDiagnostics(e)??[]},sendDiagnostics(e,t){return Q.sendDiagnostics({uri:e,diagnostics:[...t]})},reportError(e,t){Hu(`Failed to publish diagnostics for ${e}`,t)}});ru(s,e=>Q.console.error(e));function Gu(){return gu}function Ku(){return $}function qu(){return Tu}Q.onInitialize(r=>{_u=!!r.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration,vu=!!r.capabilities.workspace?.configuration,yu=!!r.capabilities.workspace?.workspaceFolders,bu=!!r.capabilities.workspace?.semanticTokens?.refreshSupport;let o=lu(r.initializationOptions);xu=o?.semanticTokens===`overlay`,`root`in o&&ku({root:o.root});let s=r.workspaceFolders,c=s?.[0]?.uri||r.rootUri;Pu(c,s,o);let l=c?void 0:Au(gu.root)[0];return c?Fu():l&&Fu(l),Vl(Q,hu,Ku,qu),t(Q,hu,Ku,qu),i(Q,hu,Ku,qu),e(Q,hu,Ku,qu),n(Q,hu,Ku,qu),a(Q,hu,Ku,qu),{capabilities:{textDocumentSync:V.Incremental,completionProvider:{resolveProvider:!0,triggerCharacters:[`-`,`:`,` `,`"`,`'`]},hoverProvider:!0,codeActionProvider:!0,referencesProvider:!0,colorProvider:!0,...xu?{}:{semanticTokensProvider:{legend:gl,full:!0}},...yu?{workspace:{workspaceFolders:{supported:!0,changeNotifications:!0}}}:{}}}}),Q.onInitialized(async()=>{yu&&Q.workspace.onDidChangeWorkspaceFolders(e=>{rd(e).catch(e=>Hu(`Failed to update workspace folders`,e))});try{let e=await mu(vu,()=>Q.workspace.getConfiguration(`teacss`),e=>Hu(`Failed to read workspace configuration`,e));e!==void 0&&ku(e),await Iu(Au(gu.root)),$&&(await $.ready,await Mu())}catch(e){Hu(`Failed to complete initial setup`,e)}finally{Su=!0,wu?.(),wu=void 0}Q.console.log(`✅ TeaCSS Language Server initialized`),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu()});let Ju;Q.onDidChangeWatchedFiles(e=>{$l(e.changes,Lu(),Ru())&&(clearTimeout(Ju),Ju=setTimeout(()=>{Yu().catch(e=>Hu(`Failed to reload config sources`,e))},500))});async function Yu(){await qu(),$&&(Q.console.log(`🔄 Config source changed, reloading TeaCSS...`),ui(),await Nu(()=>$.contextManager.reload()),Q.console.log(`🔵 Reloaded.`),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu(),await nd())}Q.onDidChangeConfiguration(async e=>{await qu();let t=e.settings?.teacss;if(t!==void 0){let e=gu,n=Au(e.root);ku(t);let r=Au(gu.root),i=pu(n,r);i&&(await Iu(r),$&&await Nu(()=>$.contextManager.setRoots(r)),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await nd()),!i&&e.unmatchedDiagnostics!==gu.unmatchedDiagnostics&&await nd(),(i||fu(e,gu))&&await Uu()}});async function Xu(){return await qu(),$?(ui(),await Nu(()=>$.contextManager.reload()),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu(),await nd(),{success:!0}):{success:!1}}async function Zu(e){if(await qu(),!$)return{count:0};let t=hu.get(e.uri);if(!t)return{count:0};let n=Ps(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 Qu(e){if(await qu(),!$)return{positions:[]};let t=hu.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 $u(e){if(await qu(),!$)return null;let t=e.uri?hu.get(e.uri):hu.all()[0];return t?$.getProjectStatus(t):null}async function ed(e){if(await qu(),!$)return[];let t=hu.get(e.uri);return t?$.getClassNameEdits(t):[]}Q.onRequest(`teacss/reloadConfig`,Xu),Q.onRequest(`teacss/getMatchedCount`,Zu),Q.onRequest(`teacss/getMatchedPositions`,Qu),Q.onRequest(`teacss/projectStatus`,$u),Q.onRequest(`teacss/normalizeClasses`,ed);async function td(e){$&&await Wu.publish(e)}async function nd(){await Promise.all(hu.all().map(e=>td(e)))}async function rd(e){await qu();let t=new Set(e.removed.map(e=>Ps(e.uri))),n=Ou.folderPaths.filter(e=>!t.has(e));for(let t of e.added){let e=Ps(t.uri);n.includes(e)||n.push(e)}if(Ou.folderPaths=n,Ou.rootPath=n[0],!$&&Ou.rootPath&&(Fu(),await Ku()?.ready),!$)return;ui();let r=ju(gu.root)?Au(gu.root):Ou.folderPaths;await Nu(()=>$.contextManager.setRoots(r)),await Vu().catch(e=>Hu(`Failed to update config watchers`,e)),await Uu(),await nd()}hu.onDidChangeContent(e=>{li(Ps(e.document.uri)),td(e.document)}),hu.onDidClose(e=>{let t=Ps(e.document.uri);li(t),$?.contextManager.releaseDocument(t),Wu.invalidate(e.document.uri),Q.sendDiagnostics({uri:e.document.uri,diagnostics:[]})}),hu.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.6",
3
+ "version": "0.4.7",
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.6",
34
- "@teacss/language-service": "0.4.6",
35
- "@teacss/runtime": "0.4.6",
33
+ "@teacss/config": "0.4.7",
34
+ "@teacss/language-service": "0.4.7",
35
+ "@teacss/runtime": "0.4.7",
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.6",
44
- "@teacss/core": "0.4.6",
45
- "@teacss/preset-standard": "0.4.6"
43
+ "@teacss/autocomplete": "0.4.7",
44
+ "@teacss/core": "0.4.7",
45
+ "@teacss/preset-standard": "0.4.7"
46
46
  },
47
47
  "engines": {
48
48
  "node": ">=22.12.0"