@macfja/svelte-persistent-runes
Version:
A Svelte reactive rune that keep its value through pages and reloads
7 lines (6 loc) • 4.79 kB
JavaScript
var P=Object.defineProperty;var p=(r,s)=>P(r,"name",{value:s,configurable:!0});import{SourceMapGenerator as y}from"source-map";import{Project as h,StructureKind as x,SyntaxKind as d,VariableDeclaration as I,CallExpression as S,Identifier as b,ClassDeclaration as E,Block as C}from"ts-morph";function j(){const r=v();return{name:"macfja-svelte-persistent-runes",transform:p((s,o)=>{var a;if(/\.svelte\.(c|m|)[jt]s$/.test(o)){const l=(a=r.script)==null?void 0:a.call(r,{content:s,filename:o,attributes:{},markup:""});return l?{code:l.code,map:l.map}:{code:s}}return{code:s}},"transform")}}p(j,"persistPlugin");function v(){return{script:p(({content:r,filename:s})=>{if(r.indexOf("$persist")===-1)return{code:r};const o=new y({file:s});o.setSourceContent(s!=null?s:"tmp.js",r);let a=0;const u=new h({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0,skipLoadingLibFiles:!0,useInMemoryFileSystem:!0}).createSourceFile(s!=null?s:"tmp.js",r);u.addImportDeclaration({kind:x.ImportDeclaration,moduleSpecifier:"@macfja/svelte-persistent-runes",namespaceImport:"dyn___persistent_runes"}),a+=u.getFullText().split(`
`).length-r.split(`
`).length;const c=[],t=p((e,n)=>{var i;e&&o.addMapping({original:{column:e.column,line:e.line-a},generated:{line:n.line,column:n.column},source:s!=null?s:"tmp.js"}),a+=n.lines-((i=e==null?void 0:e.lines)!=null?i:0)},"addMapping");if(u.forEachDescendant(e=>{c.push(...F(e,t)),k(e,t)}),c.length>0){const e=u.addStatements(`$effect.root(() => {${c.map(({varname:n,key:i,options:g})=>`$effect(() => dyn___persistent_runes.save(${i}, $state.snapshot(${n}), ${g}))`).join(`
`)}});`);t(void 0,{line:e[0].getStartLineNumber(!1),column:0,lines:e[0].getEndLineNumber()-e[0].getStartLineNumber(!1)})}return{code:u.getFullText(),map:o.toString()}},"script")}}p(v,"persistPreprocessor");function F(r,s){var o,a,l,u;if(r.getKind()!==d.VariableDeclaration)return[];if(!(r instanceof I))return[];const c=r.getName(),t=r.getInitializer();if(t===void 0)return[];if(t.getKind()!==d.CallExpression||!(t instanceof S))return[];const e=t.getExpression();if(e.getKind()!==d.Identifier||!(e instanceof b))return[];if(e.getFullText().trim()!=="$persist")return[];if(t.getArguments().length<2)return[];const n=(o=t.getArguments()[1])==null?void 0:o.print(),i=(a=t.getArguments()[0])==null?void 0:a.print(),g=(u=(l=t.getArguments()[2])==null?void 0:l.print())!=null?u:"undefined",$=c,_={line:t.getStartLineNumber(!1),column:t.getPos()-t.getStartLinePos(!1),lines:t.getEndLineNumber()-t.getStartLineNumber(!1)};r.setInitializer(L=>L.write(`$state(dyn___persistent_runes.load(${n}, ${g}) ?? ${i})`));const f=r.getInitializer();return f&&s(_,{line:f.getStartLineNumber(!1),column:f.getPos()-f.getStartLinePos(!1),lines:f.getEndLineNumber()-f.getStartLineNumber(!1)}),[{varname:$,key:n,options:g}]}p(F,"processVariable");function k(r,s){var o,a;if(r.getKind()!==d.ClassDeclaration||!(r instanceof E))return;const l=[];for(const t of r.getProperties()){const e=t.getName(),n=t.getInitializer();if((n==null?void 0:n.getKind())!==d.CallExpression||!(n instanceof S))continue;const i=n.getExpression();if(i.getKind()!==d.Identifier||!(i instanceof b)||i.getFullText().trim()!=="$persist"||n.getArguments().length<2)continue;const g=n.getArguments()[1].print(),$=n.getArguments()[0].print(),_=e,f=(a=(o=n.getArguments()[2])==null?void 0:o.print())!=null?a:"undefined",L={line:n.getStartLineNumber(!1),column:n.getPos()-n.getStartLinePos(!1),lines:n.getEndLineNumber()-n.getStartLineNumber(!1)};t.setInitializer(N=>N.write(`$state(dyn___persistent_runes.load(${g}, ${f}) ?? ${$})`));const m=t.getInitializer();m&&s(L,{line:m.getStartLineNumber(!1),column:m.getPos()-m.getStartLinePos(!1),lines:m.getEndLineNumber()-m.getStartLineNumber(!1)}),l.push({varname:_,key:g,options:f})}for(const t of r.getConstructors()){const e=t.getBody();if(!(e===void 0||!(e instanceof C))){e.addStatements(`$effect.root(() => {${l.map(({varname:n,key:i,options:g})=>`$effect(() => dyn___persistent_runes.save(${i}, $state.snapshot(this.${n}), ${g}))`).join(`
`)}});`),s(void 0,{line:e.getStartLineNumber(!1),column:e.getPos()-e.getStartLinePos(!1),lines:e.getEndLineNumber()-e.getStartLineNumber(!1)});return}}const u=!!r.getExtends();r.addConstructor({parameters:[u&&{isRestParameter:!0,name:"args",type:"any[]"}].filter(Boolean),statements:p(t=>{u&&t.writeLine("super(...args);"),t.write(`$effect.root(() => {${l.map(({varname:e,key:n,options:i})=>`$effect(() => dyn___persistent_runes.save(${n}, $state.snapshot(this.${e}), ${i}))`).join(`
`)}});`)},"statements")});const c=r.getConstructors()[0];s(void 0,{line:c.getStartLineNumber(!1),column:c.getPos()-c.getStartLinePos(!1),lines:c.getEndLineNumber()-c.getStartLineNumber(!1)})}p(k,"processClass");export{j as persistPlugin,v as persistPreprocessor};