@ripple-ts/typescript-plugin 0.2.175 → 0.2.176
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -3
- package/package.json +2 -2
- package/src/language.js +207 -37
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ var e=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),t=e((e=>{Object.de
|
|
|
4
4
|
|
|
5
5
|
`+s[0].text}),e.documentation.push(...s.slice(1)));for(let t of c??[])r.has(t.name+`__volar__`+q(t.text))||(r.add(t.name+`__volar__`+q(t.text)),e.tags??=[],e.tags.push(t))}return e}}else return n(l,s,...c)}}function C(e,n){return(o,s,c)=>{let l=o.replace(a,`/`),[u,d,f]=(0,i.getServiceScript)(e,l);if(!d?.associatedOnly)if(u){let i=(0,r.toGeneratedOffset)(e,u,f,s,t.isSignatureHelpEnabled);if(i!==void 0){let a=n(d.id,i,c);if(a){let n=(0,r.transformTextSpan)(f,e,u,a.applicableSpan,!0,t.isSignatureHelpEnabled)?.[1];if(n)return{...a,applicableSpan:n}}}}else return n(l,s,c)}}function w(e,n){return(i,o,s)=>K(e,i.replace(a,`/`),o,t.isHighlightEnabled,(e,t)=>n(e,t,s),function*(e){for(let t of e)for(let e of t.highlightSpans)yield[e.fileName??t.fileName,e.textSpan.start]}).flat().map(n=>({...n,highlightSpans:n.highlightSpans.map(i=>{let{textSpan:a}=(0,r.transformSpan)(e,i.fileName??n.fileName,i.textSpan,!1,t.isHighlightEnabled)??{};if(a)return{...i,contextSpan:(0,r.transformSpan)(e,i.fileName??n.fileName,i.contextSpan,!1,t.isHighlightEnabled)?.textSpan,textSpan:a}}).filter(e=>!!e)}))}function T(e,n){return(o,s,c,l,u,d)=>{let f=o.replace(a,`/`),[p,m,h]=(0,i.getServiceScript)(e,f);if(m?.associatedOnly)return[];if(p){if(typeof s==`number`){let i=(0,r.toGeneratedOffset)(e,p,h,s,t.isCodeActionsEnabled);if(i!==void 0)return n(m.id,i,c,l,u,d)}else for(let[i,a]of(0,r.toGeneratedRanges)(e,p,h,s.pos,s.end,t.isCodeActionsEnabled))return n(m.id,{pos:i,end:a},c,l,u,d);return[]}else return n(f,s,c,l,u,d)}}function E(e,n){return(o,s,c,l,u,d,f)=>{let p,m=o.replace(a,`/`),[h,g,_]=(0,i.getServiceScript)(e,m);if(!g?.associatedOnly){if(h)if(typeof c==`number`){let i=(0,r.toGeneratedOffset)(e,h,_,c,t.isCodeActionsEnabled);i!==void 0&&(p=n(g.id,s,i,l,u,d,f))}else for(let[i,a]of(0,r.toGeneratedRanges)(e,h,_,c.pos,c.end,t.isCodeActionsEnabled))p=n(g.id,s,{pos:i,end:a},l,u,d,f);else p=n(m,s,c,l,u,d,f);if(p)return p.edits=(0,r.transformFileTextChanges)(e,p.edits,!1,t.isCodeActionsEnabled),p}}}function D(e,n){return(...i)=>{let a=n(...i);return a.changes=(0,r.transformFileTextChanges)(e,a.changes,!1,t.isCodeActionsEnabled),a}}function O(e,n){return(o,s,c)=>{let l=o.replace(a,`/`),[u,d,f]=(0,i.getServiceScript)(e,l);if(d?.associatedOnly)return{canRename:!1,localizedErrorMessage:`Cannot rename`};if(u){let i;for(let[a]of(0,r.toGeneratedOffsets)(e,u,f,s,t.isRenameEnabled)){let o=n(d.id,a,c);if(o.canRename){let n=(0,r.transformTextSpan)(f,e,u,o.triggerSpan,!1,t.isRenameEnabled)?.[1];if(n)return o.triggerSpan=n,o}else i=o}return i||{canRename:!1,localizedErrorMessage:`Failed to get rename locations`}}else return n(l,s,c)}}function k(e,n){return(o,s,c,l,u,d)=>{let f=[],p=o.replace(a,`/`),[m,h,g]=(0,i.getServiceScript)(e,p);if(h?.associatedOnly)return[];if(m){let i=(0,r.toGeneratedRange)(e,m,g,s,c,t.isCodeActionsEnabled);i!==void 0&&(f=n(h.id,i[0],i[1],l,u,d))}else f=n(p,s,c,l,u,d);return f=f.map(n=>(n.changes=(0,r.transformFileTextChanges)(e,n.changes,!1,t.isCodeActionsEnabled),n)),f}}function A(e,n){return(o,s,c)=>{let l=o.replace(a,`/`),[u,d,f]=(0,i.getServiceScript)(e,l);if(d?.associatedOnly)return{spans:[],endOfLineState:0};if(u){let i=e.maps.get(u.code,d),a=(0,t.findOverlapCodeRange)(s.start,s.start+s.length,i,t.isSemanticTokensEnabled);if(!a)return{spans:[],endOfLineState:0};let o=(0,r.getMappingOffset)(e,u),l=a.start+o,p=a.end+o,m=n(d.id,{start:l,length:p-l},c),h=[];for(let n=0;n<m.spans.length;n+=3)for(let[i,a,o]of(0,r.toSourceRanges)(f,e,u,m.spans[n],m.spans[n]+m.spans[n+1],!1,t.isSemanticTokensEnabled)){h.push(a,o-a,m.spans[n+2]);break}return m.spans=h,m}else return n(l,s,c)}}function j(e,t,n){return o=>{let s=o.replace(a,`/`),[c,l,u]=(0,i.getServiceScript)(e,s);return l?.associatedOnly?[]:n(l?.id??s).map(n=>(0,r.transformDiagnostic)(e,n,t.getProgram(),!1)).filter(e=>!!e).filter(t=>!c||e.scripts.get(t.file.fileName)===u)}}function M(e,t,n){return o=>{let s=o.replace(a,`/`),[c,l,u]=(0,i.getServiceScript)(e,s);return l?.associatedOnly?[]:n(l?.id??s).map(n=>(0,r.transformDiagnostic)(e,n,t.getProgram(),!1)).filter(e=>!!e).filter(t=>!c||!t.file||e.scripts.get(t.file.fileName)===u)}}function N(e,t,n){return o=>{let s=o.replace(a,`/`),[c,l,u]=(0,i.getServiceScript)(e,s);return l?.associatedOnly?[]:n(l?.id??s).map(n=>(0,r.transformDiagnostic)(e,n,t.getProgram(),!1)).filter(e=>!!e).filter(t=>!c||!t.file||e.scripts.get(t.file.fileName)===u)}}function P(e,i){return(o,s)=>{let c=o.replace(a,`/`),l=K(e,c,s,t.isDefinitionEnabled,(e,t)=>i(e,t),function*(e){for(let t of e.definitions??[])yield[t.fileName,t.textSpan.start]}),u=l.map(n=>(0,r.transformSpan)(e,c,n.textSpan,!0,t.isDefinitionEnabled)?.textSpan).filter(e=>!!e)[0];if(!u)return;let d=l.map(n=>n.definitions?.map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isDefinitionEnabled,n.fileName!==c)).filter(e=>!!e)??[]).flat();return{textSpan:u,definitions:(0,n.dedupeDocumentSpans)(d)}}}function F(e,n){return(i,o)=>K(e,i.replace(a,`/`),o,t.isReferencesEnabled,(e,t)=>n(e,t),function*(e){for(let t of e)for(let e of t.references)yield[e.fileName,e.textSpan.start]}).flat().map(n=>({definition:(0,r.transformDocumentSpan)(e,n.definition,!0,t.isDefinitionEnabled,!0),references:n.references.map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isReferencesEnabled)).filter(e=>!!e)}))}function I(e,i){return(o,s)=>{let c=o.replace(a,`/`),l=K(e,c,s,t.isDefinitionEnabled,(e,t)=>i(e,t),function*(e){for(let t of e)yield[t.fileName,t.textSpan.start]}).flat().map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isDefinitionEnabled,n.fileName!==c)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(l)}}function L(e,i){return(o,s)=>{let c=K(e,o.replace(a,`/`),s,t.isTypeDefinitionEnabled,(e,t)=>i(e,t),function*(e){for(let t of e)yield[t.fileName,t.textSpan.start]}).flat().map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isTypeDefinitionEnabled)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(c)}}function R(e,i){return(o,s)=>{let c=K(e,o.replace(a,`/`),s,t.isImplementationEnabled,(e,t)=>i(e,t),function*(e){for(let t of e)yield[t.fileName,t.textSpan.start]}).flat().map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isImplementationEnabled)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(c)}}function z(e,i){return(o,s,c,l,u)=>{let d=K(e,o.replace(a,`/`),s,t.isRenameEnabled,(e,t)=>i(e,t,c,l,u),function*(e){for(let t of e)yield[t.fileName,t.textSpan.start]}).flat().map(n=>(0,r.transformDocumentSpan)(e,n,!1,t.isRenameEnabled)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(d)}}function B(e,i){return(o,s)=>{let c=K(e,o.replace(a,`/`),s,t.isReferencesEnabled,(e,t)=>i(e,t),function*(e){for(let t of e)yield[t.fileName,t.textSpan.start]}).flat().map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isReferencesEnabled)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(c)}}function V(e,n){return(o,s,c,l)=>{let u=o.replace(a,`/`),[d,f,p]=(0,i.getServiceScript)(e,u);if(!f?.associatedOnly)if(d){let i,a=[];for(let[o,u]of(0,r.toGeneratedOffsets)(e,d,p,s,t.isCompletionEnabled)){let s=typeof u.data.completion==`object`&&u.data.completion.isAdditional;if(!s&&i?.entries.length)continue;let m=n(f.id,o,c,l);if(m){typeof u.data.completion==`object`&&u.data.completion.onlyImport&&(m.entries=m.entries.filter(e=>!!e.sourceDisplay));for(let n of m.entries)n.replacementSpan=n.replacementSpan&&(0,r.transformTextSpan)(p,e,d,n.replacementSpan,!1,t.isCompletionEnabled)?.[1];m.optionalReplacementSpan=m.optionalReplacementSpan&&(0,r.transformTextSpan)(p,e,d,m.optionalReplacementSpan,!1,t.isCompletionEnabled)?.[1],s?a.push(m):i=m}}let o=a;if(i&&o.unshift(i),o.length)return{...o[0],entries:o.map(e=>e.entries).flat()}}else return n(u,s,c,l)}}function H(e,n){return(o,s,c,l,u,d,f)=>{let p,m=o.replace(a,`/`),[h,g,_]=(0,i.getServiceScript)(e,m);if(!g?.associatedOnly){if(h){let i=(0,r.toGeneratedOffset)(e,h,_,s,t.isCompletionEnabled);i!==void 0&&(p=n(g.id,i,c,l,u,d,f))}else return n(m,s,c,l,u,d,f);if(p?.codeActions)for(let n of p.codeActions)n.changes=(0,r.transformFileTextChanges)(e,n.changes,!1,t.isCompletionEnabled);return p}}}function U(e,n){return(o,s,c)=>{let l=o.replace(a,`/`),[u,d,f]=(0,i.getServiceScript)(e,l);if(d?.associatedOnly)return[];if(u){let i=e.maps.get(u.code,f),a=(0,t.findOverlapCodeRange)(s.start,s.start+s.length,i,t.isSemanticTokensEnabled);if(!a)return[];let o=(0,r.getMappingOffset)(e,u),l=a.start+o,p=a.end+o,m=n(d.id,{start:l,length:p-l},c),h=[];for(let n of m){let i=(0,r.toSourceOffset)(f,e,u,n.position,t.isInlayHintsEnabled);i!==void 0&&h.push({...n,position:i[1]})}return h}else return n(l,s,c)}}function W(e,i){return o=>{let s=i(o.replace(a,`/`)).map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isReferencesEnabled)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(s)}}function G(e,i){return(...a)=>{let o=i(...a).map(n=>(0,r.transformDocumentSpan)(e,n,!0,t.isReferencesEnabled)).filter(e=>!!e);return(0,n.dedupeDocumentSpans)(o)}}function K(e,t,n,a,o,s){let c=[],l=new Set,[u,d,f]=(0,i.getServiceScript)(e,t);if(u)for(let[t]of(0,r.toGeneratedOffsets)(e,u,f,n,a))p(d.id,t);else p(t,n);return c;function p(t,n){if(l.has(t+`:`+n))return;l.add(t+`:`+n);let a=o(t,n);if(a){c.push(a);for(let t of s(a)){l.add(t[0]+`:`+t[1]);let[n]=(0,i.getServiceScript)(e,t[0]);if(!n)continue;let a=e.linkedCodeMaps.get(n.code);if(!a)continue;let o=(0,r.getMappingOffset)(e,n);for(let e of a.getLinkedOffsets(t[1]-o))p(t[0],e+o)}}}}function q(e){return e?e.map(e=>e.text).join(``):``}})),m=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.resolveFileLanguageId=t;function t(e){switch(e.split(`.`).pop()){case`js`:return`javascript`;case`cjs`:return`javascript`;case`mjs`:return`javascript`;case`ts`:return`typescript`;case`cts`:return`typescript`;case`mts`:return`typescript`;case`jsx`:return`javascriptreact`;case`tsx`:return`typescriptreact`;case`json`:return`json`}}})),h=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.createResolveModuleName=t;function t(e,t,n,r,i){let a=new Map,o={readFile:n.readFile.bind(n),directoryExists:n.directoryExists?.bind(n),realpath:n.realpath?.bind(n),getCurrentDirectory:n.getCurrentDirectory?.bind(n),getDirectories:n.getDirectories?.bind(n),useCaseSensitiveFileNames:typeof n.useCaseSensitiveFileNames==`function`?n.useCaseSensitiveFileNames.bind(n):n.useCaseSensitiveFileNames,fileExists(e){let t=n.fileExists(e);for(let{typescript:n}of r)if(n){if(!t)for(let{extension:t}of n.extraFileExtensions){if(!e.endsWith(`.d.${t}.ts`))continue;let n=e.slice(0,-`.d.${t}.ts`.length)+`.${t}`;if(s(n)){let t=i(n);if(t?.generated){let r=t.generated.languagePlugin.typescript?.getServiceScript(t.generated.root);if(r){let t=n+`.d.ts`;return(r.extension===`.js`||r.extension===`.jsx`)&&s(t)?a.set(e,{sourceFileName:t,extension:`.ts`}):a.set(e,{sourceFileName:n,extension:r.extension}),!0}}}}if(n.resolveHiddenExtensions&&e.endsWith(`.d.ts`))for(let{extension:t}of n.extraFileExtensions){let n=e.slice(0,-5)+`.${t}`;if(s(n)){let t=i(n);if(t?.generated){let r=t.generated.languagePlugin.typescript?.getServiceScript(t.generated.root);if(r)return a.set(e,{sourceFileName:n,extension:r.extension}),!0}}}}return t}};return(t,n,r,i,s,c)=>{let l=e.resolveModuleName(t,n,r,o,i,s,c);if(l.resolvedModule){let e=a.get(l.resolvedModule.resolvedFileName);e&&(l.resolvedModule.resolvedFileName=e.sourceFileName,l.resolvedModule.extension=e.extension)}return a.clear(),l};function s(e){return n.fileExists(e)?(t?.(e)??n.readFile(e)?.length??0)<4*1024*1024:!1}}})),g=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.decorateLanguageServiceHost=n,e.searchExternalFiles=r;let t=h();function n(e,n,r){let i=n.plugins.map(e=>e.typescript?.extraFileExtensions.map(e=>`.`+e.extension)??[]).flat(),a=new Map,o=new Set,s=r.readDirectory?.bind(r),c=r.resolveModuleNameLiterals?.bind(r),l=r.resolveModuleNames?.bind(r),u=r.getScriptSnapshot.bind(r),d=r.getScriptKind?.bind(r);if(s&&(r.readDirectory=(e,t,n,r,a)=>{if(t)for(let e of i)t.includes(e)||(t=[...t,e]);return s(e,t,n,r,a)}),i.length){let a=(0,t.createResolveModuleName)(e,e.sys.getFileSize,r,n.plugins,e=>n.scripts.get(e)),o=r.useCaseSensitiveFileNames?.()?e=>e:e=>e.toLowerCase(),s=e.createModuleResolutionCache(r.getCurrentDirectory(),o,r.getCompilationSettings());c&&(r.resolveModuleNameLiterals=(t,n,r,o,l,...u)=>t.every(e=>!i.some(t=>e.text.endsWith(t)))?c(t,n,r,o,l,...u):t.map(t=>{let i=e.getModeForUsageLocation(l,t,o);return a(t.text,n,o,s,r,i)})),l&&(r.resolveModuleNames=(e,t,n,r,o,c)=>e.every(e=>!i.some(t=>e.endsWith(t)))?l(e,t,n,r,o,c):e.map(e=>a(e,t,o,s,r).resolvedModule))}r.getScriptSnapshot=e=>{let t=f(e,!0);return t?t.snapshot:u(e)},d&&(r.getScriptKind=e=>{let t=f(e,!1);return t?t.scriptKind:d(e)});function f(t,i){if(o.has(t))return;let s;try{s=r.getScriptVersion(t)}catch{o.add(t)}if(s===void 0)return;let c=a.get(t);if(!c||c[0]!==s){c=[s];let r=n.scripts.get(t,void 0,i);if(r?.generated){let t=r.generated.languagePlugin.typescript?.getServiceScript(r.generated.root);if(t)if(t.preventLeadingOffset)c[1]={extension:t.extension,scriptKind:t.scriptKind,snapshot:t.code.snapshot};else{let n=r.snapshot.getText(0,r.snapshot.getLength()).split(`
|
|
6
6
|
`).map(e=>` `.repeat(e.length)).join(`
|
|
7
|
-
`)+t.code.snapshot.getText(0,t.code.snapshot.getLength());c[1]={extension:t.extension,scriptKind:t.scriptKind,snapshot:e.ScriptSnapshot.fromString(n)}}r.generated.languagePlugin.typescript?.getExtraServiceScripts&&console.warn(`getExtraServiceScripts() is not available in TS plugin.`)}a.set(t,c)}return c[1]}}function r(e,t,n){if(t.projectKind!==e.server.ProjectKind.Configured)return[];let r=t.getProjectName(),i=e.readJsonConfigFile(r,t.readFile.bind(t)),a={useCaseSensitiveFileNames:t.useCaseSensitiveFileNames(),fileExists:t.fileExists.bind(t),readFile:t.readFile.bind(t),readDirectory:(...e)=>(e[1]=n,t.readDirectory(...e))};return e.parseJsonSourceFileConfigFileContent(i,a,t.getCurrentDirectory()).fileNames}})),_=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.makeGetExternalFiles=e.decoratedLanguageServiceHosts=e.decoratedLanguageServices=e.projectExternalFileExtensions=e.externalFiles=void 0,e.makeGetScriptInfoWithLargeFileFailsafe=i,e.createLanguageCommon=a,e.isHasAlreadyDecoratedLanguageService=s;let t=l(),n=m(),r=g();e.externalFiles=new WeakMap,e.projectExternalFileExtensions=new WeakMap,e.decoratedLanguageServices=new WeakSet,e.decoratedLanguageServiceHosts=new WeakSet;function i(e){return t=>{try{return e.project.getScriptInfo(t)}catch{}}}function a(e,a,o,s){let c=o.languageServiceHost.getScriptSnapshot.bind(o.languageServiceHost),l=i(o),u=(0,t.createLanguage)([...e.languagePlugins,{getLanguageId:n.resolveFileLanguageId}],new t.FileMap(a.sys.useCaseSensitiveFileNames),(e,t,n)=>{let r;n?r=c(e):(r=l(e)?.getSnapshot(),r||=(o.project.getScriptVersion(e),l(e)?.getSnapshot())),r?u.scripts.set(e,r):u.scripts.delete(e)},e=>{o.session.change({file:e,line:1,offset:1,endLine:1,endOffset:1,insertString:``})});s(u),(0,r.decorateLanguageServiceHost)(a,u,o.languageServiceHost),e.setup?.(u)}e.makeGetExternalFiles=t=>(n,i=0)=>{if(i>=1||!e.externalFiles.has(n)){let i=e.externalFiles.get(n),a=e.projectExternalFileExtensions.get(n),s=a?.length?(0,r.searchExternalFiles)(t,n,a):[];e.externalFiles.set(n,s),i&&!o(i,s)&&n.refreshDiagnostics()}return e.externalFiles.get(n)};function o(e,t){if(e.length!==t.length)return!1;let n=new Set(e);for(let e of t)if(!n.has(e))return!1;return!0}function s(t){return e.decoratedLanguageServices.has(t.languageService)||e.decoratedLanguageServiceHosts.has(t.languageServiceHost)?!0:(e.decoratedLanguageServices.add(t.languageService),e.decoratedLanguageServiceHosts.add(t.languageServiceHost),!1)}})),v=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.createLanguageServicePlugin=r;let t=p(),n=_();function r(e){return r=>{let{typescript:i}=r;return{create(r){if(!(0,n.isHasAlreadyDecoratedLanguageService)(r)){let a=e(i,r),o=a.languagePlugins.map(e=>e.typescript?.extraFileExtensions.map(e=>`.`+e.extension)??[]).flat();n.projectExternalFileExtensions.set(r.project,o);let{proxy:s,initialize:c}=(0,t.createProxyLanguageService)(r.languageService);r.languageService=s,(0,n.createLanguageCommon)(a,i,r,c)}return r.languageService},getExternalFiles:(0,n.makeGetExternalFiles)(i)}}}})),y=e(((e,t)=>{let n=require(`typescript`),{forEachEmbeddedCode:r}=l(),i=require(`fs`),a=require(`path`),o=process.env.RIPPLE_DEBUG===`true`;function s(...e){o&&console.log(`[Ripple Language]`,...e)}function c(...e){console.error(`[Ripple Language ERROR]`,...e)}function u(...e){console.warn(`[Ripple Language WARNING]`,...e)}function d(){s(`Creating Ripple language plugin...`);let e=new Map,t=null;return{getLanguageId(e){let t=typeof e==`string`?e:e.fsPath.replace(/\\/g,`/`);if(t.endsWith(`.ripple`))return s(`Identified Ripple file:`,t),`ripple`},createVirtualCode(e,t,r){if(t===`ripple`){let t=typeof e==`string`?e:e.fsPath.replace(/\\/g,`/`),i=n(t);if(!i){c(`Ripple compiler not found for file: ${t}`);return}s(`Creating virtual code for:`,t);try{return new f(t,r,i)}catch(e){throw c(`Failed to create virtual code for:`,t,`:`,e),e}}},typescript:{extraFileExtensions:[{extension:`ripple`,isMixedContent:!1,scriptKind:7}],getServiceScript(e){for(let t of r(e))if(t.languageId===`ripple`)return{code:t,extension:`.tsx`,scriptKind:4}}}};function n(n){let r=[`node_modules`,`ripple`,`src`,`compiler`,`index.js`],o=n.split(`/`);for(let t=o.length-2;t>=0;t--){let n=o.slice(0,t+1).join(`/`);if(!e.has(n)){let t=[n,...r].join(`/`);i.existsSync(t)?(e.set(n,t),s(`Found ripple compiler at:`,t)):e.set(n,null)}let a=e.get(n);if(a)return require(a)}let c=`Ripple compiler not found in workspace for ${n}. \
|
|
8
|
-
Using packaged version`;if(t)return u(`${c} at ${t}`),require(t);let l=__dirname;for(;l;){let e=a.join(l,...r);if(i.existsSync(e))return t=e,u(`${c} at ${t}`),require(e);let n=a.dirname(l);if(n===l)break;l=n}}}var f=class{id=`root`;languageId=`ripple`;codegenStacks=[];ripple;generatedCode=``;embeddedCodes=[];mappings=[];isErrorMode=!1;errors=[];snapshot;originalCode=``;diagnostics=[]
|
|
9
|
-
|
|
7
|
+
`)+t.code.snapshot.getText(0,t.code.snapshot.getLength());c[1]={extension:t.extension,scriptKind:t.scriptKind,snapshot:e.ScriptSnapshot.fromString(n)}}r.generated.languagePlugin.typescript?.getExtraServiceScripts&&console.warn(`getExtraServiceScripts() is not available in TS plugin.`)}a.set(t,c)}return c[1]}}function r(e,t,n){if(t.projectKind!==e.server.ProjectKind.Configured)return[];let r=t.getProjectName(),i=e.readJsonConfigFile(r,t.readFile.bind(t)),a={useCaseSensitiveFileNames:t.useCaseSensitiveFileNames(),fileExists:t.fileExists.bind(t),readFile:t.readFile.bind(t),readDirectory:(...e)=>(e[1]=n,t.readDirectory(...e))};return e.parseJsonSourceFileConfigFileContent(i,a,t.getCurrentDirectory()).fileNames}})),_=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.makeGetExternalFiles=e.decoratedLanguageServiceHosts=e.decoratedLanguageServices=e.projectExternalFileExtensions=e.externalFiles=void 0,e.makeGetScriptInfoWithLargeFileFailsafe=i,e.createLanguageCommon=a,e.isHasAlreadyDecoratedLanguageService=s;let t=l(),n=m(),r=g();e.externalFiles=new WeakMap,e.projectExternalFileExtensions=new WeakMap,e.decoratedLanguageServices=new WeakSet,e.decoratedLanguageServiceHosts=new WeakSet;function i(e){return t=>{try{return e.project.getScriptInfo(t)}catch{}}}function a(e,a,o,s){let c=o.languageServiceHost.getScriptSnapshot.bind(o.languageServiceHost),l=i(o),u=(0,t.createLanguage)([...e.languagePlugins,{getLanguageId:n.resolveFileLanguageId}],new t.FileMap(a.sys.useCaseSensitiveFileNames),(e,t,n)=>{let r;n?r=c(e):(r=l(e)?.getSnapshot(),r||=(o.project.getScriptVersion(e),l(e)?.getSnapshot())),r?u.scripts.set(e,r):u.scripts.delete(e)},e=>{o.session.change({file:e,line:1,offset:1,endLine:1,endOffset:1,insertString:``})});s(u),(0,r.decorateLanguageServiceHost)(a,u,o.languageServiceHost),e.setup?.(u)}e.makeGetExternalFiles=t=>(n,i=0)=>{if(i>=1||!e.externalFiles.has(n)){let i=e.externalFiles.get(n),a=e.projectExternalFileExtensions.get(n),s=a?.length?(0,r.searchExternalFiles)(t,n,a):[];e.externalFiles.set(n,s),i&&!o(i,s)&&n.refreshDiagnostics()}return e.externalFiles.get(n)};function o(e,t){if(e.length!==t.length)return!1;let n=new Set(e);for(let e of t)if(!n.has(e))return!1;return!0}function s(t){return e.decoratedLanguageServices.has(t.languageService)||e.decoratedLanguageServiceHosts.has(t.languageServiceHost)?!0:(e.decoratedLanguageServices.add(t.languageService),e.decoratedLanguageServiceHosts.add(t.languageServiceHost),!1)}})),v=e((e=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.createLanguageServicePlugin=r;let t=p(),n=_();function r(e){return r=>{let{typescript:i}=r;return{create(r){if(!(0,n.isHasAlreadyDecoratedLanguageService)(r)){let a=e(i,r),o=a.languagePlugins.map(e=>e.typescript?.extraFileExtensions.map(e=>`.`+e.extension)??[]).flat();n.projectExternalFileExtensions.set(r.project,o);let{proxy:s,initialize:c}=(0,t.createProxyLanguageService)(r.languageService);r.languageService=s,(0,n.createLanguageCommon)(a,i,r,c)}return r.languageService},getExternalFiles:(0,n.makeGetExternalFiles)(i)}}}})),y=e(((e,t)=>{let n=require(`typescript`),{forEachEmbeddedCode:r}=l(),i=require(`fs`),a=require(`path`),o=process.env.RIPPLE_DEBUG===`true`;function s(...e){o&&console.log(`[Ripple Language]`,...e)}function c(...e){console.error(`[Ripple Language ERROR]`,...e)}function u(...e){console.warn(`[Ripple Language WARNING]`,...e)}function d(){s(`Creating Ripple language plugin...`);let e=new Map,t=null;return{getLanguageId(e){let t=typeof e==`string`?e:e.fsPath.replace(/\\/g,`/`);if(t.endsWith(`.ripple`))return s(`Identified Ripple file:`,t),`ripple`},createVirtualCode(e,t,r){if(t===`ripple`){let t=typeof e==`string`?e:e.fsPath.replace(/\\/g,`/`),i=n(t);if(!i){c(`Ripple compiler not found for file: ${t}`);return}s(`Creating virtual code for:`,t);try{return new f(t,r,i)}catch(e){throw c(`Failed to create virtual code for:`,t,`:`,e),e}}},updateVirtualCode(e,t,n){if(t instanceof f)return s(`Updating existing virtual code for:`,t.fileName),t.update(n),t},typescript:{extraFileExtensions:[{extension:`ripple`,isMixedContent:!1,scriptKind:7}],getServiceScript(e){for(let t of r(e))if(t.languageId===`ripple`)return{code:t,extension:`.tsx`,scriptKind:4}}}};function n(n){let r=[`node_modules`,`ripple`,`src`,`compiler`,`index.js`],o=n.split(`/`);for(let t=o.length-2;t>=0;t--){let n=o.slice(0,t+1).join(`/`);if(!e.has(n)){let t=[n,...r].join(`/`);i.existsSync(t)?(e.set(n,t),s(`Found ripple compiler at:`,t)):e.set(n,null)}let a=e.get(n);if(a)return require(a)}let c=`Ripple compiler not found in workspace for ${n}. \
|
|
8
|
+
Using packaged version`;if(t)return u(`${c} at ${t}`),require(t);let l=__dirname;for(;l;){let e=a.join(l,...r);if(i.existsSync(e))return t=e,u(`${c} at ${t}`),require(e);let n=a.dirname(l);if(n===l)break;l=n}}}var f=class{id=`root`;languageId=`ripple`;codegenStacks=[];ripple;generatedCode=``;embeddedCodes=[];mappings=[];isErrorMode=!1;errors=[];snapshot;sourceSnapshot;originalCode=``;diagnostics=[];#e=null;#t=null;constructor(e,t,n){if(s(`Initializing RippleVirtualCode for:`,e),this.fileName=e,this.ripple=n,this.snapshot=t,this.sourceSnapshot=t,this.originalCode=t.getText(0,t.getLength()),!n||typeof n.compile_to_volar_mappings!=`function`)throw c(`Invalid ripple compiler - missing compile_to_volar_mappings method`),Error(`Invalid ripple compiler`);this.update(t)}update(e){s(`Updating virtual code for:`,this.fileName);let t=e.getText(0,e.getLength()),n=e.getChangeRange(this.sourceSnapshot);this.sourceSnapshot=e,this.#e=null,this.#t=null;let r,i=!1,a=-1;if(s(`changeRange:`,JSON.stringify(n)),n){let e=n.span.start,r=e+n.span.length,o=e+n.newLength,c=this.originalCode.substring(e,r),l=t.substring(e,o);if(s(`Change details:`),s(` Position:`,e,`-`,r,`(length:`,n.span.length,`)`),s(` Old text:`,JSON.stringify(c)),s(` New text:`,JSON.stringify(l),`(length:`,n.newLength,`)`),l.endsWith(`.`)){let e=o>1?t[o-2]:``;s(` Char before dot:`,JSON.stringify(e)),/[a-zA-Z0-9_\)\]\}]/.test(e)&&(i=!0,a=o-1,s(`ChangeRange detected dot typed at position`,a))}}try{if(i&&a>=0){let e=t[a-1],n=t.substring(0,a)+e+t.substring(a+1);if(s(`Using placeholder technique for dot at position`,a),r=this.ripple.compile_to_volar_mappings(n,this.fileName),s(`Compilation with placeholder successful`),r&&r.code&&r.mappings.length>0){let e=null;for(let t of r.mappings){let n=t.sourceOffsets[0],r=n+t.lengths[0];if(a>=n&&a<r){e=t;break}}if(e){let t=a-e.sourceOffsets[0],n=e.generatedOffsets[0]+t;r.code=r.code.substring(0,n)+`.`+r.code.substring(n+1),s(`Replaced placeholder at position`,n,`with dot`)}}this.errors=[]}else s(`Compiling Ripple code...`),r=this.ripple.compile_to_volar_mappings(t,this.fileName,{loose:!0}),s(`Compilation successful, generated code length:`,r?.code?.length||0),this.errors=[]}catch(e){c(`Ripple compilation failed for`,this.fileName,`:`,e),this.errors.push(e)}if(r&&r.code){this.originalCode=t,this.generatedCode=r.code,this.mappings=r.mappings??[],this.isErrorMode=!1;let{cssMappings:e,cssSources:n}=r;if(e.length>0?(s(`Creating`,e.length,`CSS embedded codes`),this.embeddedCodes=e.map((e,t)=>{let r=n[t];return s(`CSS region ${t}: \
|
|
9
|
+
offset ${e.sourceOffsets[0]}-${e.sourceOffsets[0]+e.lengths[0]}, \
|
|
10
|
+
length ${e.lengths[0]}`),{id:`style_${t}`,languageId:`css`,snapshot:{getText:(e,t)=>r.substring(e,t),getLength:()=>e.lengths[0],getChangeRange:()=>void 0},mappings:[e],embeddedCodes:[]}})):this.embeddedCodes=[],o){s(`CSS embedded codes:`,this.embeddedCodes.length),s(`Using transpiled code, mapping count:`,this.mappings.length),s(`Original code length:`,t.length),s(`Generated code length:`,this.generatedCode.length),s(`Last 100 chars of original:`,JSON.stringify(t.slice(-100))),s(`Last 200 chars of generated:`,JSON.stringify(this.generatedCode.slice(-200))),s(`Last few mappings:`);let e=Math.max(0,this.mappings.length-5);for(let t=e;t<this.mappings.length;t++){let e=this.mappings[t];s(` Mapping ${t}: source[${e.sourceOffsets[0]}:${e.sourceOffsets[0]+e.lengths[0]}] -> gen[${e.generatedOffsets[0]}:${e.generatedOffsets[0]+e.lengths[0]}], len=${e.lengths[0]}, completion=${e.data?.completion}`)}}this.snapshot={getText:(e,t)=>this.generatedCode.substring(e,t),getLength:()=>this.generatedCode.length,getChangeRange:()=>void 0}}else s(`Compilation failed, only display where the compilation error occurred.`),this.originalCode=t,this.generatedCode=`export {};
|
|
11
|
+
`,this.isErrorMode=!0,this.mappings=[{sourceOffsets:[this.errors[0]?.pos??0],generatedOffsets:[0],lengths:[t.length],data:{verification:!0,customData:{generatedLengths:[t.length]}}}],this.snapshot={getText:(e,t)=>this.generatedCode.substring(e,t),getLength:()=>this.generatedCode.length,getChangeRange:()=>void 0}}#n(){if(!(this.#e||this.#t)){this.#e=new Map,this.#t=new Map;for(var e,t,n,r,i,a,o,s,c,l=0;l<this.mappings.length;l++)e=this.mappings[l],t=e.generatedOffsets[0],n=e.data.customData.generatedLengths[0],r=t+n,i=`${t}-${r}`,this.#e.set(i,e),a=e.sourceOffsets[0],o=e.lengths[0],s=a+o,c=`${a}-${s}`,this.#t.set(c,e)}}findMappingByGeneratedRange(e,t){return this.#n(),this.#e.get(`${e}-${t}`)??null}findMappingBySourceRange(e,t){return this.#n(),this.#t.get(`${e}-${t}`)??null}};t.exports={getRippleLanguagePlugin:d,RippleVirtualCode:f,resolveConfig:e=>{let t={...e.options??{}};t.target===void 0&&(t.target=n.ScriptTarget.ESNext);let r=new Set((t.lib??[]).map(e=>{if(typeof e!=`string`||e.length===0)return;let t=e.trim();return t.startsWith(`lib.`)?t.toLowerCase():`lib.${t.toLowerCase().replace(/\s+/g,``).replace(/_/g,`.`)}\.d.ts`}).filter(e=>typeof e==`string`));if(r.size===0){let e=n.createCompilerHost(t).getDefaultLibFileName(t).toLowerCase();r.add(e),r.add(`lib.dom.d.ts`),r.add(`lib.dom.iterable.d.ts`)}if(t.lib=[...r],!t.types){let e=n.createCompilerHost(t),r=n.getEffectiveTypeRoots(t,e);r&&r.length>0&&(t.typeRoots=r)}return{...e,options:t}}}}));const{createLanguageServicePlugin:b}=v(),{getRippleLanguagePlugin:x}=y();module.exports=b(()=>({languagePlugins:[x()]}));
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "TypeScript plugin for Ripple",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Dominic Gannaway",
|
|
6
|
-
"version": "0.2.
|
|
6
|
+
"version": "0.2.176",
|
|
7
7
|
"main": "src/index.js",
|
|
8
8
|
"homepage": "https://ripplejs.com",
|
|
9
9
|
"repository": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"typescript": "^5.9.2",
|
|
26
|
-
"ripple": "0.2.
|
|
26
|
+
"ripple": "0.2.176"
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
29
29
|
"build": "tsdown",
|
package/src/language.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** @type {import('typescript')} */
|
|
2
|
-
// @ts-expect-error -
|
|
3
|
-
/** @import {
|
|
2
|
+
// @ts-expect-error type-only import from ESM module into CJS is fine
|
|
3
|
+
/** @import { CodeMapping } from 'ripple/compiler' */
|
|
4
|
+
/** @typedef {Map<string, CodeMapping>} CachedMappings */
|
|
4
5
|
|
|
5
6
|
const ts = require('typescript');
|
|
6
7
|
const { forEachEmbeddedCode } = require('@volar/language-core');
|
|
@@ -14,11 +15,8 @@ const path = require('path');
|
|
|
14
15
|
/** @typedef {string | { fsPath: string }} ScriptId */
|
|
15
16
|
/** @typedef {import('@volar/typescript')} */
|
|
16
17
|
/** @typedef {import('@volar/language-core').LanguagePlugin<ScriptId, VirtualCode>} RippleLanguagePlugin */
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* @typedef {object} RippleCompiler
|
|
20
|
-
* @property {(code: string, fileName: string) => MappingsResult} compile_to_volar_mappings
|
|
21
|
-
*/
|
|
18
|
+
// @ts-expect-error type-only import from ESM module into CJS is fine
|
|
19
|
+
/** @typedef {import('ripple/compiler')} RippleCompiler */
|
|
22
20
|
|
|
23
21
|
const DEBUG = process.env.RIPPLE_DEBUG === 'true';
|
|
24
22
|
|
|
@@ -98,6 +96,20 @@ function getRippleLanguagePlugin() {
|
|
|
98
96
|
return undefined;
|
|
99
97
|
},
|
|
100
98
|
|
|
99
|
+
/**
|
|
100
|
+
* @param {ScriptId} fileNameOrUri
|
|
101
|
+
* @param {VirtualCode} virtualCode
|
|
102
|
+
* @param {IScriptSnapshot} snapshot
|
|
103
|
+
*/
|
|
104
|
+
updateVirtualCode(fileNameOrUri, virtualCode, snapshot) {
|
|
105
|
+
if (virtualCode instanceof RippleVirtualCode) {
|
|
106
|
+
log('Updating existing virtual code for:', virtualCode.fileName);
|
|
107
|
+
virtualCode.update(snapshot);
|
|
108
|
+
return virtualCode;
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
},
|
|
112
|
+
|
|
101
113
|
typescript: {
|
|
102
114
|
extraFileExtensions: [{ extension: 'ripple', isMixedContent: false, scriptKind: 7 }],
|
|
103
115
|
/**
|
|
@@ -205,12 +217,16 @@ class RippleVirtualCode {
|
|
|
205
217
|
errors = [];
|
|
206
218
|
/** @type {IScriptSnapshot} */
|
|
207
219
|
snapshot;
|
|
220
|
+
/** @type {IScriptSnapshot} */
|
|
221
|
+
sourceSnapshot;
|
|
208
222
|
/** @type {string} */
|
|
209
223
|
originalCode = '';
|
|
210
224
|
/** @type {unknown[]} */
|
|
211
225
|
diagnostics = [];
|
|
212
|
-
/** @type {
|
|
213
|
-
|
|
226
|
+
/** @type {CachedMappings | null} */
|
|
227
|
+
#mappingGenToSource = null;
|
|
228
|
+
/** @type {CachedMappings | null} */
|
|
229
|
+
#mappingSourceToGen = null;
|
|
214
230
|
|
|
215
231
|
/**
|
|
216
232
|
* @param {string} file_name
|
|
@@ -223,6 +239,7 @@ class RippleVirtualCode {
|
|
|
223
239
|
this.fileName = file_name;
|
|
224
240
|
this.ripple = ripple;
|
|
225
241
|
this.snapshot = snapshot;
|
|
242
|
+
this.sourceSnapshot = snapshot;
|
|
226
243
|
this.originalCode = snapshot.getText(0, snapshot.getLength());
|
|
227
244
|
|
|
228
245
|
// Validate ripple compiler
|
|
@@ -241,28 +258,156 @@ class RippleVirtualCode {
|
|
|
241
258
|
update(snapshot) {
|
|
242
259
|
log('Updating virtual code for:', this.fileName);
|
|
243
260
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
this.
|
|
247
|
-
|
|
261
|
+
const newCode = snapshot.getText(0, snapshot.getLength());
|
|
262
|
+
const changeRange = snapshot.getChangeRange(this.sourceSnapshot);
|
|
263
|
+
this.sourceSnapshot = snapshot;
|
|
264
|
+
|
|
265
|
+
// Only clear mapping index - don't update snapshot/originalCode yet
|
|
266
|
+
this.#mappingGenToSource = null;
|
|
267
|
+
this.#mappingSourceToGen = null;
|
|
268
|
+
|
|
269
|
+
/** @type {ReturnType<RippleCompiler['compile_to_volar_mappings']> | undefined} */
|
|
248
270
|
let transpiled;
|
|
249
271
|
|
|
272
|
+
// Check if a single "." was typed using changeRange
|
|
273
|
+
let isDotTyped = false;
|
|
274
|
+
let dotPosition = -1;
|
|
275
|
+
|
|
276
|
+
log('changeRange:', JSON.stringify(changeRange));
|
|
277
|
+
|
|
278
|
+
if (changeRange) {
|
|
279
|
+
const changeStart = changeRange.span.start;
|
|
280
|
+
const changeEnd = changeStart + changeRange.span.length;
|
|
281
|
+
const newEnd = changeStart + changeRange.newLength;
|
|
282
|
+
|
|
283
|
+
// Get the old text (what was replaced) from originalCode
|
|
284
|
+
const oldText = this.originalCode.substring(changeStart, changeEnd);
|
|
285
|
+
// Get the new text (what replaced it) from newCode
|
|
286
|
+
const newText = newCode.substring(changeStart, newEnd);
|
|
287
|
+
|
|
288
|
+
log('Change details:');
|
|
289
|
+
log(' Position:', changeStart, '-', changeEnd, '(length:', changeRange.span.length, ')');
|
|
290
|
+
log(' Old text:', JSON.stringify(oldText));
|
|
291
|
+
log(' New text:', JSON.stringify(newText), '(length:', changeRange.newLength, ')');
|
|
292
|
+
|
|
293
|
+
// Check if a dot was added at the end of the new text
|
|
294
|
+
if (newText.endsWith('.')) {
|
|
295
|
+
// The dot is at position newEnd - 1
|
|
296
|
+
// We need to check the character BEFORE the dot (inside the new text)
|
|
297
|
+
const charBeforeDot = newEnd > 1 ? newCode[newEnd - 2] : '';
|
|
298
|
+
log(' Char before dot:', JSON.stringify(charBeforeDot));
|
|
299
|
+
|
|
300
|
+
if (/[a-zA-Z0-9_\)\]\}]/.test(charBeforeDot)) {
|
|
301
|
+
isDotTyped = true;
|
|
302
|
+
dotPosition = newEnd - 1; // Position of the dot
|
|
303
|
+
log('ChangeRange detected dot typed at position', dotPosition);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
250
308
|
try {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
309
|
+
// If user typed a ".", use placeholder technique to get completions
|
|
310
|
+
if (isDotTyped && dotPosition >= 0) {
|
|
311
|
+
const charBeforeDot = newCode[dotPosition - 1];
|
|
312
|
+
const codeWithPlaceholder =
|
|
313
|
+
newCode.substring(0, dotPosition) + charBeforeDot + newCode.substring(dotPosition + 1);
|
|
314
|
+
|
|
315
|
+
log('Using placeholder technique for dot at position', dotPosition);
|
|
316
|
+
transpiled = this.ripple.compile_to_volar_mappings(codeWithPlaceholder, this.fileName);
|
|
317
|
+
log('Compilation with placeholder successful');
|
|
318
|
+
|
|
319
|
+
// Find where the placeholder ended up in generated code and replace with "."
|
|
320
|
+
if (transpiled && transpiled.code && transpiled.mappings.length > 0) {
|
|
321
|
+
let placeholderMapping = null;
|
|
322
|
+
for (const mapping of transpiled.mappings) {
|
|
323
|
+
const sourceStart = mapping.sourceOffsets[0];
|
|
324
|
+
const sourceEnd = sourceStart + mapping.lengths[0];
|
|
325
|
+
|
|
326
|
+
if (dotPosition >= sourceStart && dotPosition < sourceEnd) {
|
|
327
|
+
placeholderMapping = mapping;
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (placeholderMapping) {
|
|
333
|
+
const offsetInMapping = dotPosition - placeholderMapping.sourceOffsets[0];
|
|
334
|
+
const placeholderPosInGenerated =
|
|
335
|
+
placeholderMapping.generatedOffsets[0] + offsetInMapping;
|
|
336
|
+
|
|
337
|
+
transpiled.code =
|
|
338
|
+
transpiled.code.substring(0, placeholderPosInGenerated) +
|
|
339
|
+
'.' +
|
|
340
|
+
transpiled.code.substring(placeholderPosInGenerated + 1);
|
|
341
|
+
|
|
342
|
+
log('Replaced placeholder at position', placeholderPosInGenerated, 'with dot');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
this.errors = [];
|
|
346
|
+
} else {
|
|
347
|
+
// Normal compilation
|
|
348
|
+
log('Compiling Ripple code...');
|
|
349
|
+
transpiled = this.ripple.compile_to_volar_mappings(newCode, this.fileName, {
|
|
350
|
+
loose: true,
|
|
351
|
+
});
|
|
352
|
+
log('Compilation successful, generated code length:', transpiled?.code?.length || 0);
|
|
353
|
+
this.errors = [];
|
|
354
|
+
}
|
|
254
355
|
} catch (error) {
|
|
255
356
|
logError('Ripple compilation failed for', this.fileName, ':', error);
|
|
256
357
|
this.errors.push(/** @type {Error & { pos?: number }} */ (error));
|
|
257
358
|
}
|
|
258
359
|
|
|
259
360
|
if (transpiled && transpiled.code) {
|
|
260
|
-
//
|
|
361
|
+
// Successful compilation - update everything
|
|
362
|
+
this.originalCode = newCode;
|
|
261
363
|
this.generatedCode = transpiled.code;
|
|
262
364
|
this.mappings = transpiled.mappings ?? [];
|
|
263
|
-
this.isErrorMode = false;
|
|
365
|
+
this.isErrorMode = false;
|
|
366
|
+
|
|
367
|
+
const { cssMappings, cssSources } = transpiled;
|
|
368
|
+
if (cssMappings.length > 0) {
|
|
369
|
+
log('Creating', cssMappings.length, 'CSS embedded codes');
|
|
370
|
+
|
|
371
|
+
this.embeddedCodes = cssMappings.map((mapping, index) => {
|
|
372
|
+
const cssContent = cssSources[index];
|
|
373
|
+
log(
|
|
374
|
+
`CSS region ${index}: \
|
|
375
|
+
offset ${mapping.sourceOffsets[0]}-${mapping.sourceOffsets[0] + mapping.lengths[0]}, \
|
|
376
|
+
length ${mapping.lengths[0]}`,
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
return {
|
|
380
|
+
id: `style_${index}`,
|
|
381
|
+
languageId: 'css',
|
|
382
|
+
snapshot: {
|
|
383
|
+
getText: (start, end) => cssContent.substring(start, end),
|
|
384
|
+
getLength: () => mapping.lengths[0],
|
|
385
|
+
getChangeRange: () => undefined,
|
|
386
|
+
},
|
|
387
|
+
mappings: [mapping],
|
|
388
|
+
embeddedCodes: [],
|
|
389
|
+
};
|
|
390
|
+
});
|
|
391
|
+
} else {
|
|
392
|
+
this.embeddedCodes = [];
|
|
393
|
+
}
|
|
264
394
|
|
|
265
|
-
|
|
395
|
+
if (DEBUG) {
|
|
396
|
+
log('CSS embedded codes:', this.embeddedCodes.length);
|
|
397
|
+
log('Using transpiled code, mapping count:', this.mappings.length);
|
|
398
|
+
log('Original code length:', newCode.length);
|
|
399
|
+
log('Generated code length:', this.generatedCode.length);
|
|
400
|
+
log('Last 100 chars of original:', JSON.stringify(newCode.slice(-100)));
|
|
401
|
+
log('Last 200 chars of generated:', JSON.stringify(this.generatedCode.slice(-200)));
|
|
402
|
+
log('Last few mappings:');
|
|
403
|
+
const startIdx = Math.max(0, this.mappings.length - 5);
|
|
404
|
+
for (let i = startIdx; i < this.mappings.length; i++) {
|
|
405
|
+
const m = this.mappings[i];
|
|
406
|
+
log(
|
|
407
|
+
` Mapping ${i}: source[${m.sourceOffsets[0]}:${m.sourceOffsets[0] + m.lengths[0]}] -> gen[${m.generatedOffsets[0]}:${m.generatedOffsets[0] + m.lengths[0]}], len=${m.lengths[0]}, completion=${m.data?.completion}`,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
266
411
|
|
|
267
412
|
this.snapshot = /** @type {IScriptSnapshot} */ ({
|
|
268
413
|
getText: (start, end) => this.generatedCode.substring(start, end),
|
|
@@ -274,19 +419,19 @@ class RippleVirtualCode {
|
|
|
274
419
|
// TypeScript diagnostics until the compilation error is fixed
|
|
275
420
|
log('Compilation failed, only display where the compilation error occurred.');
|
|
276
421
|
|
|
277
|
-
|
|
422
|
+
this.originalCode = newCode;
|
|
278
423
|
this.generatedCode = 'export {};\n';
|
|
279
|
-
this.isErrorMode = true;
|
|
424
|
+
this.isErrorMode = true;
|
|
280
425
|
|
|
281
426
|
// Create 1:1 mappings for the entire content
|
|
282
427
|
this.mappings = [
|
|
283
428
|
{
|
|
284
429
|
sourceOffsets: [this.errors[0]?.pos ?? 0],
|
|
285
430
|
generatedOffsets: [0],
|
|
286
|
-
lengths: [
|
|
431
|
+
lengths: [newCode.length],
|
|
287
432
|
data: {
|
|
288
433
|
verification: true,
|
|
289
|
-
customData: { generatedLengths: [
|
|
434
|
+
customData: { generatedLengths: [newCode.length] },
|
|
290
435
|
},
|
|
291
436
|
},
|
|
292
437
|
];
|
|
@@ -299,6 +444,33 @@ class RippleVirtualCode {
|
|
|
299
444
|
}
|
|
300
445
|
}
|
|
301
446
|
|
|
447
|
+
#buildMappingCache() {
|
|
448
|
+
if (this.#mappingGenToSource || this.#mappingSourceToGen) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
this.#mappingGenToSource = new Map();
|
|
453
|
+
this.#mappingSourceToGen = new Map();
|
|
454
|
+
|
|
455
|
+
var mapping, genStart, genLength, genEnd, genKey;
|
|
456
|
+
var sourceStart, sourceLength, sourceEnd, sourceKey;
|
|
457
|
+
for (var i = 0; i < this.mappings.length; i++) {
|
|
458
|
+
mapping = this.mappings[i];
|
|
459
|
+
|
|
460
|
+
genStart = mapping.generatedOffsets[0];
|
|
461
|
+
genLength = mapping.data.customData.generatedLengths[0];
|
|
462
|
+
genEnd = genStart + genLength;
|
|
463
|
+
genKey = `${genStart}-${genEnd}`;
|
|
464
|
+
this.#mappingGenToSource.set(genKey, mapping);
|
|
465
|
+
|
|
466
|
+
sourceStart = mapping.sourceOffsets[0];
|
|
467
|
+
sourceLength = mapping.lengths[0];
|
|
468
|
+
sourceEnd = sourceStart + sourceLength;
|
|
469
|
+
sourceKey = `${sourceStart}-${sourceEnd}`;
|
|
470
|
+
this.#mappingSourceToGen.set(sourceKey, mapping);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
302
474
|
/**
|
|
303
475
|
* Find mapping by generated range
|
|
304
476
|
* @param {number} start - The start offset of the range
|
|
@@ -306,21 +478,19 @@ class RippleVirtualCode {
|
|
|
306
478
|
* @returns {CodeMapping | null} The mapping for this range, or null if not found
|
|
307
479
|
*/
|
|
308
480
|
findMappingByGeneratedRange(start, end) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
for (const mapping of this.mappings) {
|
|
313
|
-
const genStart = mapping.generatedOffsets[0];
|
|
314
|
-
// Use generatedLengths from customData if available, otherwise fall back to lengths
|
|
315
|
-
const genLength = mapping.data.customData.generatedLengths[0];
|
|
316
|
-
const genEnd = genStart + genLength;
|
|
317
|
-
const key = `${genStart}-${genEnd}`;
|
|
318
|
-
this._mappingIndex.set(key, mapping);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
481
|
+
this.#buildMappingCache();
|
|
482
|
+
return /** @type {CachedMappings} */ (this.#mappingGenToSource).get(`${start}-${end}`) ?? null;
|
|
483
|
+
}
|
|
321
484
|
|
|
322
|
-
|
|
323
|
-
|
|
485
|
+
/**
|
|
486
|
+
* Find mapping by source range
|
|
487
|
+
* @param {number} start - The start offset of the range
|
|
488
|
+
* @param {number} end - The end offset of the range
|
|
489
|
+
* @returns {CodeMapping | null} The mapping for this range, or null if not found
|
|
490
|
+
*/
|
|
491
|
+
findMappingBySourceRange(start, end) {
|
|
492
|
+
this.#buildMappingCache();
|
|
493
|
+
return /** @type {CachedMappings} */ (this.#mappingSourceToGen).get(`${start}-${end}`) ?? null;
|
|
324
494
|
}
|
|
325
495
|
}
|
|
326
496
|
|