svelte-origin 0.0.0 → 1.0.0-next.49

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 (49) hide show
  1. package/LLM.md +545 -0
  2. package/README.md +678 -1
  3. package/dist/aliases.d.ts +45 -0
  4. package/dist/cli.d.ts +20 -0
  5. package/dist/cli.js +163 -0
  6. package/dist/generate-dts.d.ts +31 -0
  7. package/dist/globals.d.ts +649 -0
  8. package/dist/index.d.ts +9 -0
  9. package/dist/index.js +108 -0
  10. package/dist/plugin.d.ts +176 -0
  11. package/dist/plugin.js +81 -0
  12. package/dist/post-process.d.ts +31 -0
  13. package/dist/post-process.js +99 -0
  14. package/dist/preprocess.d.ts +119 -0
  15. package/dist/preprocess.js +81 -0
  16. package/dist/runtime/attrs.d.ts +65 -0
  17. package/dist/runtime/index.d.ts +8 -0
  18. package/dist/runtime/index.js +28 -0
  19. package/dist/runtime/origin.d.ts +170 -0
  20. package/dist/runtime/types.d.ts +193 -0
  21. package/dist/runtime-inline.d.ts +117 -0
  22. package/dist/runtime-inline.min.js +1 -0
  23. package/dist/schema-resolver.d.ts +61 -0
  24. package/dist/shared-state.d.ts +47 -0
  25. package/dist/transform/ast-parser.d.ts +282 -0
  26. package/dist/transform/attrs-for-transform.d.ts +17 -0
  27. package/dist/transform/attrs-origin-transform.d.ts +38 -0
  28. package/dist/transform/attrs-schema.d.ts +63 -0
  29. package/dist/transform/codegen.d.ts +15 -0
  30. package/dist/transform/comments.d.ts +31 -0
  31. package/dist/transform/core.d.ts +37 -0
  32. package/dist/transform/declaration-parser.d.ts +77 -0
  33. package/dist/transform/element-types.d.ts +10 -0
  34. package/dist/transform/expression-utils.d.ts +59 -0
  35. package/dist/transform/origin-body-helpers.d.ts +143 -0
  36. package/dist/transform/origin-create-transform.d.ts +32 -0
  37. package/dist/transform/origin-destructure-transform.d.ts +62 -0
  38. package/dist/transform/origin-transform.d.ts +51 -0
  39. package/dist/transform/patterns.d.ts +86 -0
  40. package/dist/transform/reserved-keywords.d.ts +87 -0
  41. package/dist/transform/schema-codegen.d.ts +105 -0
  42. package/dist/transform/schema-parse.d.ts +50 -0
  43. package/dist/transform/schema-types.d.ts +40 -0
  44. package/dist/transform/schema.d.ts +11 -0
  45. package/dist/transform/standalone-attrs-transform.d.ts +36 -0
  46. package/dist/utils.d.ts +21 -0
  47. package/dist/vite-dts.d.ts +17 -0
  48. package/dist/vite-dts.js +24 -0
  49. package/package.json +79 -3
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Standalone $origin.props() transformation logic.
3
+ *
4
+ * This module handles transforming standalone $origin.props({...})
5
+ * macro calls (outside of $origin definitions) into __createAttrs({...}) runtime calls.
6
+ */
7
+ import type MagicString from 'magic-string';
8
+ /**
9
+ * Transform standalone $origin.props({...}) calls.
10
+ *
11
+ * Input:
12
+ * ```ts
13
+ * export const BaseProps = $origin.props({
14
+ * label: 'Default',
15
+ * disabled: false
16
+ * })
17
+ *
18
+ * // With inheritance:
19
+ * export const WidgetProps = $origin.props([BaseProps], {
20
+ * value: $bindable(0)
21
+ * })
22
+ * ```
23
+ *
24
+ * Output:
25
+ * ```ts
26
+ * export const BaseProps = __createAttrs({
27
+ * __attrSchema: { label: {...}, disabled: {...} }
28
+ * })
29
+ *
30
+ * export const WidgetProps = __createAttrs({
31
+ * __parents: [BaseProps],
32
+ * __attrSchema: { value: {...} }
33
+ * })
34
+ * ```
35
+ */
36
+ export declare function transformStandaloneAttrsCalls(s: MagicString, source: string, neededImports: Set<string>): boolean;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared utility functions for svelte-origin
3
+ */
4
+ export interface TransformOutputOptions {
5
+ /** Whether to write transformed output */
6
+ enabled: boolean;
7
+ /** Directory to write to (defaults to same as source) */
8
+ outputDir?: string;
9
+ /** Enable debug logging */
10
+ debug?: boolean;
11
+ }
12
+ /**
13
+ * Write transformed output to file for debugging.
14
+ * Creates a .transformed.txt file alongside the source file.
15
+ */
16
+ export declare function writeTransformedOutput(filePath: string | undefined, code: string, options: TransformOutputOptions): void;
17
+ /**
18
+ * Recursively find all files in a directory matching the given extensions.
19
+ * Skips node_modules and hidden directories.
20
+ */
21
+ export declare function findFiles(dir: string, extensions: string[]): string[];
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Generate .svelte.d.ts declaration files for svelte-origin components
3
+ *
4
+ * This module generates sidecar .d.ts files when a component uses $origin.component().
5
+ * These declaration files help svelte-check and TypeScript understand the
6
+ * transformed props, since svelte2tsx runs on original file content.
7
+ */
8
+ import type { Plugin } from 'vite';
9
+ export interface DtsGeneratorOptions {
10
+ /** Enable debug logging */
11
+ debug?: boolean;
12
+ }
13
+ /**
14
+ * Create a Vite plugin that generates .svelte.d.ts files for origin-based components.
15
+ */
16
+ export declare function svelteOriginDts(options?: DtsGeneratorOptions): Plugin;
17
+ export default svelteOriginDts;
@@ -0,0 +1,24 @@
1
+ import{existsSync as zQ}from"node:fs";import{writeFile as gQ,unlink as fQ}from"node:fs/promises";var JQ={hasMacros:/\$origin\s*[.(]/,origin:/\$origin\s*\(/g,originWithParents:/\$origin\s*\(\s*\[/,originPropsInOrigin:/\$origin\s*\.\s*props\s*\(\s*\{/g,standaloneOriginProps:/(?:let|const|export\s+const|export\s+let)\s+\w+\s*=\s*\$origin\s*\.\s*props\s*\(/g,bindableInAttrs:/\$bindable\s*\(/g,originComponent:/\$origin\s*\.\s*component\s*\(\s*(\w+)\s*\)/g,originCreate:/\$origin\s*\.\s*create\s*\(\s*(\w+)\s*(?:,\s*(\{[^}]*\}))?\s*\)/g,originBind:/\$origin\s*\.\s*bind\s*\(\s*([^)]+)\s*\)/g,originForOrigin:/\$origin\s*\.\s*for\s*\(\s*(\w+)\s*\)/g,originForElement:/\$origin\s*\.\s*for\s*\(\s*['"]([\w-]+)['"]\s*\)/g};function lQ(Q){return JQ.hasMacros.test(Q)}function dQ(Q,Z){let Y=0;while(Y<Z){let X=Q[Y];if(X==="/"&&Q[Y+1]==="/"){let $=Q.indexOf(`
2
+ `,Y+2);if($===-1)return Z>Y;if(Z>Y&&Z<=$)return!0;Y=$+1;continue}if(X==="/"&&Q[Y+1]==="*"){let $=Q.indexOf("*/",Y+2);if($===-1)return Z>Y;if(Z>Y&&Z<$+2)return!0;Y=$+2;continue}if(X==='"'||X==="'"||X==="`"){let $=X,_=Y;Y++;while(Y<Q.length){if(Q[Y]==="\\"){Y+=2;continue}if(Q[Y]===$){if(Z>_&&Z<=Y)return!0;Y++;break}if($==="`"&&Q[Y]==="$"&&Q[Y+1]==="{"){let G=Y;Y+=2;let H=1;while(Y<Q.length&&H>0){if(Q[Y]==="{")H++;else if(Q[Y]==="}")H--;else if(Q[Y]==="\\")Y++;Y++}if(Z>_&&Z<G)return!0;continue}Y++}continue}Y++}return!1}function p(Q){if(!Q.startsWith("$bindable"))return{isBindable:!1};let Z=9;if(Q[Z]==="<"){let _=1;Z++;while(Z<Q.length&&_>0){let G=Q[Z];if(G==="="&&Q[Z+1]===">"){Z+=2;continue}if(G==="<")_++;else if(G===">")_--;Z++}}while(Z<Q.length&&/\s/.test(Q[Z]))Z++;if(Q[Z]!=="(")return{isBindable:!1};let Y=Z,X=T(Q,Y);if(X===-1)return{isBindable:!1};return{isBindable:!0,innerValue:Q.slice(Y+1,X).trim()||"undefined"}}function c(Q){let Z=0,Y=0;for(let X=0;X<Q.length-4;X++){let $=Q[X];if($==='"'||$==="'"||$==="`"){let _=$;X++;while(X<Q.length&&Q[X]!==_){if(Q[X]==="\\")X++;X++}continue}if($==="{"||$==="("||$==="[")Z++;else if($==="}"||$===")"||$==="]")Z--;else if($==="<"){let _=X>0?Q[X-1]:"";if(/[\w$)]/.test(_))Y++}else if($===">"){if(X>0&&Q[X-1]==="=")continue;if(Y>0)Y--}else if(Z===0&&Y===0&&Q.slice(X,X+4)===" as ")return X}return-1}function T(Q,Z,Y="(",X=")"){let $=0;for(let _=Z;_<Q.length;_++){let G=Q[_];if(G==="/"&&Q[_+1]==="/"){let H=Q.indexOf(`
3
+ `,_+2);if(H!==-1)_=H;else _=Q.length;continue}if(G==="/"&&Q[_+1]==="*"){let H=Q.indexOf("*/",_+2);if(H!==-1)_=H+1;else _=Q.length;continue}if(G==='"'||G==="'"||G==="`"){let H=G;_++;while(_<Q.length&&Q[_]!==H){if(Q[_]==="\\")_++;_++}continue}if(G===Y)$++;else if(G===X){if($--,$===0)return _}}return-1}function n(Q){let Z=Q.trim();while(!0){if(Z.startsWith("/*")){let X=Z.indexOf("*/");if(X!==-1){Z=Z.slice(X+2).trim();continue}break}if(Z.startsWith("//")){let X=Z.indexOf(`
4
+ `);if(X!==-1){Z=Z.slice(X+1).trim();continue}Z="";break}break}let Y=Z.indexOf("*/");if(Y!==-1){let X=Z.slice(Y+2).trim();if(X.match(/^(\w+)\s*:/))Z=X}return Z}function WQ(Q){let Z=0,Y=0;while(Z<Q.length){let X=Q[Z];if(X==='"'||X==="'"||X==="`"){let _=X;Z++;while(Z<Q.length&&Q[Z]!==_){if(Q[Z]==="\\")Z++;Z++}Z++;continue}if(X==="/"&&Q[Z+1]==="*"){Y++,Z+=2;continue}if(X==="*"&&Q[Z+1]==="/")if(Y>0){Y--,Z+=2;continue}else return qQ(Q,Z);Z++}return-1}function qQ(Q,Z){let Y=Z-1;while(Y>=0&&/\s/.test(Q[Y]))Y--;let X=Q.slice(0,Y+1),$=0,_=0;while(_<X.length){let G=X[_];if(G==='"'||G==="'"||G==="`"){let q=G;_++;while(_<X.length&&X[_]!==q){if(X[_]==="\\")_++;_++}if(_<X.length)$=_+1,_++;continue}if(G==="{"||G==="("||G==="["){let q=G,w=G==="{"?"}":G==="("?")":"]",O=1;_++;while(_<X.length&&O>0){let K=X[_];if(K===q)O++;else if(K===w){if(O--,O===0)$=_+1}else if(K==='"'||K==="'"||K==="`"){let F=K;_++;while(_<X.length&&X[_]!==F){if(X[_]==="\\")_++;_++}}_++}continue}let z=X.slice(_),W=z.match(/^(true|false|null|undefined)\b/);if(W){_+=W[0].length;let q=X.slice(_);if(/^\s+[\w$]/.test(q)){$=_;break}$=_;continue}let U=z.match(/^-?\d+(\.\d+)?/);if(U){_+=U[0].length;let q=X.slice(_);if(/^\s+[\w$]/.test(q)){$=_;break}$=_;continue}let J=z.match(/^[\w$]+/);if(J){_+=J[0].length;let q=X.slice(_);if(/^\s+[\w$]/.test(q)){$=_;break}$=_;continue}_++}return $>0?$:Z}function i(Q){let Z=Q.trim(),Y=WQ(Z);if(Y!==-1)Z=Z.slice(0,Y).trim();let X=0;while(X<Z.length){let $=Z[X];if($==='"'||$==="'"||$==="`"){let G=$;X++;while(X<Z.length&&Z[X]!==G){if(Z[X]==="\\")X++;X++}X++;continue}if($==="{"||$==="("||$==="["){let G=1;X++;while(X<Z.length&&G>0){let H=Z[X];if(H==="{"||H==="("||H==="[")G++;else if(H==="}"||H===")"||H==="]")G--;else if(H==='"'||H==="'"||H==="`"){let z=H;X++;while(X<Z.length&&Z[X]!==z){if(Z[X]==="\\")X++;X++}}X++}continue}if($==="/"&&Z[X+1]==="*"){Z=Z.slice(0,X).trim();break}if($==="/"&&Z[X+1]==="/"){Z=Z.slice(0,X).trim();break}X++}return Z}function s(Q){let Z=[],Y="",X=0,$=0,_=0;while(_<Q.length){let G=Q[_];if(G==="/"&&Q[_+1]==="/"){let z=Q.indexOf(`
5
+ `,_+2);if(z!==-1)Y+=Q.slice(_,z+1),_=z+1;else Y+=Q.slice(_),_=Q.length;continue}if(G==="/"&&Q[_+1]==="*"){let z=Q.indexOf("*/",_+2);if(z!==-1)Y+=Q.slice(_,z+2),_=z+2;else Y+=Q.slice(_),_=Q.length;continue}if(G==='"'||G==="'"||G==="`"){let z=G;Y+=G,_++;while(_<Q.length&&Q[_]!==z){if(Q[_]==="\\")Y+=Q[_],_++;if(_<Q.length)Y+=Q[_],_++}if(_<Q.length)Y+=Q[_],_++;continue}if(G==="<"){let z=Y.length>0?Y[Y.length-1]:"";if(/[\w$)]/.test(z))$++;Y+=G,_++;continue}if(G===">"){if(_>0&&Q[_-1]==="="){Y+=G,_++;continue}if($>0)$--;Y+=G,_++;continue}if(G==="{"||G==="("||G==="[")X++,Y+=G;else if(G==="}"||G===")"||G==="]")X--,Y+=G;else if(G===","&&X===0&&$===0)Z.push(Y),Y="";else Y+=G;_++}if(Y.trim())Z.push(Y);return Z}function g(Q,Z){let Y=wQ(Q,Z);if(Y)return Y;let X=LQ(Q,Z);if(X)return X;return null}function v(Q,Z){let Y=UQ(Q,Z);if(Y)return Y;let X=OQ(Q,Z);if(X)return X;return null}function I(Q,Z){let Y=[new RegExp(`import\\s*\\{[^}]*\\b${Z}\\b[^}]*\\}\\s*from\\s*['"]([^'"]+)['"]`),new RegExp(`import\\s+type\\s*\\{[^}]*\\b${Z}\\b[^}]*\\}\\s*from\\s*['"]([^'"]+)['"]`),new RegExp(`import\\s*\\{[^}]*\\bas\\s+${Z}\\b[^}]*\\}\\s*from\\s*['"]([^'"]+)['"]`),new RegExp(`import\\s+type\\s*\\{[^}]*\\bas\\s+${Z}\\b[^}]*\\}\\s*from\\s*['"]([^'"]+)['"]`),new RegExp(`import\\s+${Z}\\s+from\\s*['"]([^'"]+)['"]`),new RegExp(`import\\s*\\*\\s*as\\s+${Z}\\s+from\\s*['"]([^'"]+)['"]`),new RegExp(`export\\s*\\{[^}]*\\b${Z}\\b[^}]*\\}\\s*from\\s*['"]([^'"]+)['"]`),new RegExp(`export\\s*\\{[^}]*\\bas\\s+${Z}\\b[^}]*\\}\\s*from\\s*['"]([^'"]+)['"]`)];for(let X of Y){let $=X.exec(Q);if($)return $[1]}return null}function UQ(Q,Z){let X=new RegExp(`export\\s+(?:const|var|let)\\s+${Z}\\s*=\\s*\\$origin\\s*\\.\\s*props\\s*\\(`,"s").exec(Q);if(!X)return null;let $=X.index+X[0].length-1,_=T(Q,$);if(_===-1)return null;let G=Q.slice($+1,_).trim(),H=[];if(G.startsWith("[")){let J=T(G,0,"[","]");if(J!==-1){H=G.slice(1,J).split(",").map((O)=>O.trim()).map((O)=>{let K=O.match(/^(\w+)\s*\(/);if(K)return K[1];return O}).filter((O)=>O&&/^\w+$/.test(O));let w=J+1;while(w<G.length&&/[\s,]/.test(G[w]))w++;G=G.slice(w)}}if(!G.startsWith("{"))return{attrs:[],parentNames:H};let z=T(G,0,"{","}");if(z===-1)return{attrs:[],parentNames:H};let W=G.slice(1,z);return{attrs:a(W),parentNames:H}}function OQ(Q,Z){let X=new RegExp(`export\\s+(?:const|var|let)\\s+${Z}\\s*=\\s*__createAttrs\\s*\\(\\s*\\{`,"s").exec(Q);if(!X)return null;let $=X.index+X[0].length-1,_=T(Q,$,"{","}");if(_===-1)return null;let G=Q.slice($+1,_),H=G.match(/__attrSchema\s*:\s*\{/);if(!H)return{attrs:[],parentNames:[]};let z=H.index+H[0].length-1,W=T(G,z,"{","}");if(W===-1)return{attrs:[],parentNames:[]};let U=G.slice(z+1,W),J=r(U),q=G.match(/__parents\s*:\s*\[([^\]]*)\]/),w=[];if(q&&q[1].trim())w=q[1].split(",").map((O)=>O.trim()).filter((O)=>O&&/^\w+$/.test(O));return{attrs:J,parentNames:w}}function wQ(Q,Z){let Y=FQ(Q,Z);if(Y)return Y;let X=KQ(Q,Z);if(X)return X;let $=TQ(Q,Z);if($)return $;return null}function FQ(Q,Z){let X=new RegExp(`export\\s+(?:const|var|let)\\s+${Z}\\s*=\\s*\\$origin\\s*\\(`,"s").exec(Q);if(!X)return null;let $=X.index+X[0].length-1,_=T(Q,$);if(_===-1)return null;let G=Q.slice($+1,_);return f(G)}function KQ(Q,Z){let X=new RegExp(`export\\s+function\\s+${Z}\\s*(?:<[^>]*>)?\\s*\\([^)]*\\)\\s*(?::\\s*[^{]+)?\\s*\\{`,"s").exec(Q);if(!X)return null;let $=X.index+X[0].length-1,_=T(Q,$,"{","}");if(_===-1)return null;let G=Q.slice($+1,_);return o(G)}function TQ(Q,Z){let X=new RegExp(`export\\s+(?:const|var|let)\\s+${Z}\\s*=\\s*(?:<[^>]*>)?\\s*\\([^)]*\\)\\s*(?::\\s*[^=]+)?\\s*=>\\s*`,"s").exec(Q);if(!X)return null;let $=Q.slice(X.index+X[0].length).trim();if($.startsWith("$origin(")){let _=X.index+X[0].length+$.indexOf("$origin(")+8,G=T(Q,_-1);if(G===-1)return null;let H=Q.slice(_,G);return f(H)}if($.startsWith("{")){let _=X.index+X[0].length,G=T(Q,_,"{","}");if(G===-1)return null;let H=Q.slice(_+1,G);return o(H)}return null}function o(Q){let Z=Q.match(/(?:return\s+)?\$origin\s*\(/);if(!Z)return null;let Y=Z.index+Z[0].length-1,X=T(Q,Y);if(X===-1)return null;let $=Q.slice(Y+1,X);return f($)}function f(Q){let Z=[],Y=Q.trim();if(Y.startsWith("[")){let W=T(Y,0,"[","]");if(W!==-1){Z=Y.slice(1,W).split(",").map((q)=>q.trim()).map((q)=>{let w=q.match(/^(\w+)\s*\(/);if(w)return w[1];return q}).filter((q)=>q&&/^\w+$/.test(q));let J=W+1;while(J<Y.length&&/[\s,]/.test(Y[J]))J++;Y=Y.slice(J)}}let X=Y.match(/(\w+)\s*:\s*\$origin\s*\.\s*props\s*\(\s*\{/);if(!X){let W=Y.match(/(?:props|attrs)\s*:\s*([A-Z]\w*)\b/);if(W){let U=W[1];if(!["Object","Array","String","Number","Boolean"].includes(U))return{attrs:[],parentNames:Z,propsRef:U}}return{attrs:[],parentNames:Z}}let $=X.index,_=Y.indexOf("{",$+X[0].length-1),G=T(Y,_,"{","}");if(G===-1)return{attrs:[],parentNames:Z};let H=Y.slice(_+1,G);return{attrs:a(H),parentNames:Z}}function LQ(Q,Z){let X=new RegExp(`export\\s+(?:const|var|let)\\s+${Z}\\s*=\\s*__createOrigin\\s*\\(\\s*\\{`,"s").exec(Q);if(!X)return null;let $=X.index+X[0].length-1,_=T(Q,$,"{","}");if(_===-1)return null;let G=Q.slice($+1,_),H=G.match(/__attrSchema\s*:\s*\{/);if(!H)return{attrs:[],parentNames:[]};let z=H.index+H[0].length-1,W=T(G,z,"{","}");if(W===-1)return{attrs:[],parentNames:[]};let U=G.slice(z+1,W),J=r(U),q=G.match(/__parents\s*:\s*\[([^\]]*)\]/),w=[];if(q&&q[1].trim())w=q[1].split(",").map((F)=>F.trim()).filter((F)=>F&&/^\w+$/.test(F));let O=G.match(/__propsRef\s*:\s*(\w+)/),K=O?O[1]:void 0;return{attrs:J,parentNames:w,propsRef:K}}function r(Q){let Z=[],Y=0;while(Y<Q.length){while(Y<Q.length&&/[\s,]/.test(Q[Y]))Y++;if(Y>=Q.length)break;if(Q.slice(Y,Y+2)==="/*"){let O=Q.indexOf("*/",Y+2);if(O!==-1){Y=O+2;continue}}let X=Q.slice(Y).match(/^(\w+)\s*:/);if(!X)break;let $=X[1];Y+=X[0].length;while(Y<Q.length&&/\s/.test(Q[Y]))Y++;if(Q[Y]!=="{")break;let _=Y,G=T(Q,_,"{","}");if(G===-1)break;let H=Q.slice(_+1,G),z="undefined",W=!1,U=!1,J=H.match(/\bdefault\s*:\s*/);if(J){let O=J.index+J[0].length,K=0,F=O;while(F<H.length){let R=H[F];if(R==="{"||R==="("||R==="[")K++;else if(R==="}"||R===")"||R==="]")K--;else if(R===","&&K===0)break;F++}z=H.slice(O,F).trim()}let q=H.match(/\bbindable\s*:\s*(true|false)/);if(q)W=q[1]==="true";let w=H.match(/\bhasDefault\s*:\s*(true|false)/);if(w)U=w[1]==="true";Z.push({key:$,defaultValue:z,bindable:W,hasDefault:U}),Y=G+1}return Z}function a(Q){let Z=[],Y=s(Q);for(let X of Y){let $=X.trim();if(!$)continue;if($=n($),!$)continue;let _=$.indexOf(":");if(_===-1)continue;let G=$.slice(0,_).trim(),H=$.slice(_+1).trim();H=i(H);let z=c(H);if(z!==-1)H=H.slice(0,z).trim();let W=p(H);if(W.isBindable){let U=W.innerValue,J=U!==""&&U!=="undefined";Z.push({key:G,defaultValue:U,bindable:!0,hasDefault:J})}else{let U=H!=="undefined";Z.push({key:G,defaultValue:H,bindable:!1,hasDefault:U})}}return Z}function N(Q){return`___${Q}`}function b(Q,Z){let Y=N(Q);return`${Q}: ${Y} = ${Z}`}function t(Q){let Z=N(Q);return`${Q}: ${Z}`}function e(Q){let Z=N(Q);return`get ${Q}() { return ${Z} }`}function QQ(Q){let Z=N(Q);return`set ${Q}(v) { ${Z} = v }`}function u(Q){let Z=Q.trim();if(!Z.endsWith(")"))return!1;let Y=0;for(let X=Z.length-1;X>=0;X--)if(Z[X]===")")Y++;else if(Z[X]==="("){if(Y--,Y===0)return!0}return!1}function XQ(Q){let Z=Q.trim(),Y=0;for(let X=Z.length-1;X>=0;X--)if(Z[X]===")")Y++;else if(Z[X]==="("){if(Y--,Y===0)return Z.slice(0,X)}return Z}function jQ(Q){let Z=Q.trim(),Y=0;for(let X=0;X<Z.length;X++){let $=Z[X];if($==="(")Y++;else if($===")")Y--;else if($==="<"&&Y===0)return!0}return!1}function sQ(Q){let Z=Q.trim(),Y=Z.indexOf("<");if(Y!==-1)return Z.slice(0,Y);let X=Z.indexOf("(");return X===-1?Z:Z.slice(0,X)}function oQ(Q){let Z=Q.trim();if(jQ(Z)&&!u(Z))return`${Z}()`;return Z}function BQ(Q){if(u(Q))return`ReturnType<typeof ${XQ(Q)}>`;return`typeof ${Q}`}function RQ(Q,Z,Y={}){let{useNewApi:X=!0,useUserPropsType:$=!1}=Y,_=[];for(let z of Q)if(z.bindable)if(z.hasDefault)_.push(b(z.key,`$bindable(${z.defaultValue})`));else _.push(b(z.key,"$bindable()"));else if(z.hasDefault)_.push(b(z.key,z.defaultValue));else _.push(t(z.key));if($)return`let { ${_.join(", ")} }: $$Props = $props()`;let G=BQ(Z),H=X?"$origin.Props":"$origin.Props";return`let { ${_.join(", ")} }: ${H}<${G}> = $props()`}function VQ(Q,Z){let Y=[];for(let X of Z)if(Y.push(e(X.key)),X.bindable)Y.push(QQ(X.key));return`${Q}({ ${Y.join(", ")} })`}function AQ(Q){let Z=[],Y=[];for(let $ of Q.attrs){let _=l($.defaultValue),G=$.hasDefault?"?":"";if(Z.push(`${$.key}${G}: ${_}`),$.bindable)Y.push($.key)}return{interfaceContent:Z.length>0?`{ ${Z.join("; ")} }`:"{}",bindings:Y}}function l(Q){if(Q==="undefined")return"unknown";if(Q==="true"||Q==="false")return"boolean";if(/^-?\d+$/.test(Q))return"number";if(/^-?\d+\.\d+$/.test(Q))return"number";if(/^['"]/.test(Q))return"string";if(Q.startsWith("["))return"unknown[]";if(Q.startsWith("{"))return"Record<string, unknown>";if(Q==="null")return"null";return"unknown"}function d(Q,Z,Y,X="regenerated on save"){let $=[],_=[];for(let z of Y.attrs){let W=l(z.defaultValue),U=z.hasDefault?"?":"";if($.push(` ${z.key}${U}: ${W};`),z.bindable)_.push(`"${z.key}"`)}let G=$.length>0?`{
6
+ ${$.join(`
7
+ `)}
8
+ }`:"{}",H=_.length>0?_.join(" | "):"never";return`// Auto-generated by svelte-origin
9
+ // Do not edit manually - ${X}
10
+
11
+ import type { Component } from 'svelte';
12
+ import type { ${Q} } from '${Z}';
13
+
14
+ /**
15
+ * Props derived from ${Q} origin factory.
16
+ *
17
+ * Bindable props: ${_.length>0?_.join(", "):"none"}
18
+ */
19
+ type Props = ${G};
20
+
21
+ declare const __component: Component<Props, {}, ${H}>;
22
+ export default __component;
23
+ `}import{readFileSync as vQ,statSync as HQ}from"node:fs";import{basename as $Q,dirname as NQ}from"node:path";import{existsSync as L,readFileSync as m,statSync as EQ}from"node:fs";import{dirname as D,join as j,resolve as B,isAbsolute as A}from"node:path";function IQ(Q){let Z="",Y=!1,X=!1,$=!1,_=0;while(_<Q.length){let G=Q[_],H=Q[_+1];if(X){if(G===`
24
+ `)X=!1,Z+=G;_++;continue}if($){if(G==="*"&&H==="/"){$=!1,_+=2;continue}_++;continue}if(Y){if(Z+=G,G==="\\"&&H){Z+=H,_+=2;continue}if(G==='"')Y=!1;_++;continue}if(G==='"'){Y=!0,Z+=G,_++;continue}if(G==="/"&&H==="/"){X=!0,_+=2;continue}if(G==="/"&&H==="*"){$=!0,_+=2;continue}Z+=G,_++}return Z}function ZQ(Q,Z=new Set){let Y=B(Q);if(Z.has(Y))return null;if(Z.add(Y),!L(Y))return null;try{let X=m(Y,"utf-8"),$=IQ(X),_=JSON.parse($),G=D(Y),H={},z=_.compilerOptions?.baseUrl,W=_.extends;if(W){let U=Array.isArray(W)?W:[W];for(let J of U){let q;if(J.startsWith("."))q=B(G,J);else if(J.startsWith("/")||/^[a-zA-Z]:/.test(J))q=J;else{let O=DQ(J,G);if(O)q=O;else continue}if(!q.endsWith(".json")){if(L(q+".json"))q=q+".json";else if(L(j(q,"tsconfig.json")))q=j(q,"tsconfig.json")}let w=ZQ(q,Z);if(w){if(w.paths)H={...w.paths,...H};if(w.baseUrl&&!z){let O=D(q);z=B(O,w.baseUrl)}}}}if(_.compilerOptions?.paths)H={...H,..._.compilerOptions.paths};if(z&&!A(z))z=B(G,z);return{paths:Object.keys(H).length>0?H:void 0,baseUrl:z}}catch{return null}}function DQ(Q,Z){let Y=Z,X=A(Z)?(Z.match(/^[a-zA-Z]:[/\\]/)||["/"])[0]:"/";while(Y!==X&&Y!==D(Y)){let $=j(Y,"node_modules",Q);if(L($)){if($.endsWith(".json"))return $;let _=j($,"tsconfig.json");if(L(_))return _;if(L($+".json"))return $+".json"}Y=D(Y)}return null}function MQ(Q,Z){let Y={};for(let[X,$]of Object.entries(Q)){if(!$||$.length===0)continue;let _=$[0],G=X.endsWith("/*"),H=G?X.slice(0,-2):X;if(G&&_.endsWith("/*"))_=_.slice(0,-2);let z=A(_)?_:B(Z,_);Y[H]=z}return Y}function SQ(Q,Z){if(!L(Q))return{};try{let Y=m(Q,"utf-8"),X={},$=Y.match(/alias\s*:\s*\{([^}]+)\}/s);if(!$)return{};let _=$[1],G=/['"]?(\$[\w-]+)['"]?\s*:\s*['"]([^'"]+)['"]/g,H;while((H=G.exec(_))!==null){let[,z,W]=H,U=A(W)?W:B(Z,W);X[z]=U}return X}catch{return{}}}function kQ(Q){let Z=[],Y=["tsconfig.json","jsconfig.json",".svelte-kit/tsconfig.json"];for(let X of Y){let $=B(Q,X);if(L($))Z.push($)}return Z}function $X(Q={}){let{aliases:Z={},root:Y=process.cwd(),autoDetect:X=!0,tsconfig:$,svelteConfig:_}=Q,G=A(Y)?Y:B(process.cwd(),Y),H={};if(X){let z=$?[A($)?$:B(G,$)]:kQ(G);for(let J of z){let q=ZQ(J);if(q?.paths){let w=q.baseUrl||D(J);H={...MQ(q.paths,w),...H}}}let W=_?A(_)?_:B(G,_):B(G,"svelte.config.js"),U=SQ(W,G);H={...H,...U}}for(let[z,W]of Object.entries(Z))H[z]=A(W)?W:B(G,W);return{aliases:H,root:G}}function YQ(Q,Z,Y){if(Q.startsWith("."))return B(Y,Q);let X=Object.entries(Z).sort((_,G)=>G[0].length-_[0].length);for(let[_,G]of X){if(Q===_)return G;if(Q.startsWith(_+"/")){let H=Q.slice(_.length+1);return j(G,H)}}let $=yQ(Q,Y);if($)return $;return null}function yQ(Q,Z){if(Q.startsWith(".")||Q.startsWith("/")||/^[a-zA-Z]:/.test(Q))return null;let Y,X;if(Q.startsWith("@")){let G=Q.split("/");if(G.length<2)return null;Y=`${G[0]}/${G[1]}`,X=G.slice(2).join("/")}else{let G=Q.indexOf("/");if(G===-1)Y=Q,X="";else Y=Q.slice(0,G),X=Q.slice(G+1)}let $=Z,_=A(Z)?(Z.match(/^[a-zA-Z]:[/\\]/)||["/"])[0]:"/";while($!==_&&$!==D($)){let G=j($,"node_modules"),H=j(G,Y);if(L(H)){let z=j(H,"package.json"),W=X?`./${X}`:".";if(L(z))try{let U=JSON.parse(m(z,"utf-8"));if(U.exports){let J=CQ(U.exports,W);if(J)return j(H,J)}if(!X){let J=U.module||U.main||"index.js";return j(H,J)}}catch{}if(X)return j(H,X);return j(H,"index.js")}$=D($)}return null}function CQ(Q,Z){if(typeof Q==="string")return Z==="."?Q:null;if(typeof Q!=="object"||Q===null)return null;let Y=Q[Z];if(Y)return P(Y);if(Z==="."&&Q["."])return P(Q["."]);if(Z==="."){let X=P(Q);if(X)return X}return null}function P(Q){if(typeof Q==="string")return Q;if(typeof Q!=="object"||Q===null)return null;let Z=Q,Y=["svelte","import","module","default","require"];for(let X of Y)if(X in Z){let $=Z[X];if(typeof $==="string")return $;let _=P($);if(_)return _}return null}function _Q(Q){if(L(Q))try{let X=EQ(Q);if(X.isFile())return Q;if(X.isDirectory()){let $=["index.ts","index.js"];for(let _ of $){let G=j(Q,_);if(L(G))return G}}}catch{}let Z=[".ts",".js",".svelte.ts",".svelte.js"];if(Q.endsWith(".svelte")){let X=Q+".ts";if(L(X))return X}if(Q.endsWith(".svelte.js")){let X=Q.slice(0,-3)+".ts";if(L(X))return X}for(let X of Z){let $=Q+X;if(L($))return $}let Y=["/index.ts","/index.js"];for(let X of Y){let $=Q+X;if(L($))return $}return null}var y=new Map;function bQ(Q,Z){let Y=y.get(Q);if(!Y)return!1;try{for(let X=0;X<Y.filePaths.length;X++)if(HQ(Y.filePaths[X]).mtimeMs!==Y.mtimes[X]){if(Z)console.log(`[svelte-origin] Cache stale for ${Q}: ${Y.filePaths[X]} changed`);return!1}return!0}catch{return!1}}function GQ(Q,Z){let Y=[],X=[];for(let $ of Z)try{let _=HQ($).mtimeMs;Y.push($),X.push(_)}catch{}if(Y.length>0)y.set(Q,{filePaths:Y,mtimes:X})}function qX(Q,Z){let Y=$Q(Q);for(let[X,$]of y.entries())if($.filePaths.some((G)=>G===Q||$Q(G)===Y))Z.delete(X),y.delete(X)}function M(Q,Z,Y=!1){for(let X of Z){let $=Q.findIndex((_)=>_.key===X.key);if($===-1)Q.push(X);else if(Y)Q[$]=X}}function PQ(Q,Z,Y,X){let $=YQ(Q,Y,Z);if(!$){if(X)console.log(`[svelte-origin] No alias match for ${Q}, skipping`);return null}if(X)console.log(`[svelte-origin] Resolved path: ${$}`);let _=_Q($);if(!_){if(X)console.log(`[svelte-origin] Could not find file for ${$}`);return null}if(X)console.log(`[svelte-origin] Found file: ${_}`);let G=vQ(_,"utf-8");return{filePath:_,source:G}}async function S(Q,Z,Y,X,$,_={},G=null){let{debug:H=!1,aliases:z={}}=_,W=G===null,U=G??new Set,J=Q==="attrs"?`attrs::${Z}::${Y}`:`${Z}::${Y}`;if($.has(J)&&bQ(J,H)){if(H)console.log(`[svelte-origin] Cache hit for ${J}`);return $.get(J)||null}if($.has(J))$.delete(J),y.delete(J);try{let q=NQ(X);if(H)console.log(`[svelte-origin] Resolving ${Q}: ${Y} from ${Z}`);let w=PQ(Z,q,z,H);if(!w)return $.set(J,null),null;let{filePath:O,source:K}=w;U.add(O);let F=Q==="attrs"?v(K,Y):g(K,Y);if(!F){if($.set(J,null),W)GQ(J,U);return null}let R=[];for(let V of F.parentNames){let E=I(K,V),C=null;if(E)C=Q==="attrs"?await S("attrs",E,V,O,$,_,U):await S("origin",E,V,O,$,_,U);else if(Q==="attrs")C=await h(K,V,O,$,_,U);if(C)M(R,C.attrs)}if(Q==="origin"&&F.propsRef){let V=I(K,F.propsRef),E=null;if(V){if(H)console.log(`[svelte-origin] Resolving propsRef: ${F.propsRef} from import ${V}`);E=await S("attrs",V,F.propsRef,O,$,_,U)}else{if(H)console.log(`[svelte-origin] Resolving propsRef: ${F.propsRef} from same file`);E=await h(K,F.propsRef,O,$,_,U)}if(E)M(R,E.attrs,!0)}M(R,F.attrs,!0);let x={attrs:R,parentNames:F.parentNames};if(H)console.log(`[svelte-origin] Resolved ${Q} schema for ${Y}:`,x.attrs.map((V)=>V.key));if($.set(J,x),W)GQ(J,U);return x}catch(q){if(H)console.error(`[svelte-origin] Error resolving ${Q} schema for ${Z}:`,q);return $.set(J,null),null}}async function k(Q,Z,Y,X,$={}){return S("origin",Q,Z,Y,X,$)}async function h(Q,Z,Y,X,$={},_=null){let{debug:G=!1}=$;if(_)_.add(Y);let H=v(Q,Z);if(!H)return null;if(H.parentNames.length===0)return H;let z=[];for(let W of H.parentNames){let U=I(Q,W),J=null;if(U)J=await S("attrs",U,W,Y,X,$,_);else J=await h(Q,W,Y,X,$,_);if(J)M(z,J.attrs)}if(M(z,H.attrs,!0),G)console.log(`[svelte-origin] Resolved same-file attrs for ${Z}:`,z.map((W)=>W.key));return{attrs:z,parentNames:H.parentNames}}function UX(Q,Z,Y={}){let{debug:X=!1,moduleImports:$}=Y;return{resolve:async(_,G)=>{if(_!==null)return k(_,G,Q,Z,Y);if($?.has(G)){let z=$.get(G);if(X)console.log(`[svelte-origin] Found ${G} in module imports: ${z}`);return k(z,G,Q,Z,Y)}if(X)console.log(`[svelte-origin] No import path for ${G}, attempting sibling file resolution`);let H=xQ(G,Q);for(let z of H){if(X)console.log(`[svelte-origin] Trying sibling path: ${z}`);let W=await k(z,G,Q,Z,Y);if(W){if(X)console.log(`[svelte-origin] Found schema in sibling file: ${z}`);return W}}if(X)console.log(`[svelte-origin] Could not find schema for ${G} in sibling files`);return null}}}function xQ(Q,Z){let Y=new Set,X=[],$=(J)=>{if(!Y.has(J))Y.add(J),X.push(J)},_=[".svelte.ts",".svelte.js",".svelte"],G=Q.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),H=Q.charAt(0).toLowerCase()+Q.slice(1),z=Q,W=Q.replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase();for(let J of _)$(`./${G}${J}`),$(`./${H}${J}`),$(`./${z}${J}`),$(`./${W}${J}`);let U=Q.match(/^[A-Z][a-z]+(?=[A-Z])/);if(U){let J=Q.slice(U[0].length);if(J){let q=J.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),w=J.charAt(0).toLowerCase()+J.slice(1),O=J,K=J.replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase();for(let F of _)$(`./${q}${F}`),$(`./${w}${F}`),$(`./${O}${F}`),$(`./${K}${F}`)}}for(let J of _)$(`./state${J}`),$(`./factory${J}`),$(`./schema${J}`),$(`./origin${J}`);return X}function uQ(Q={}){let{debug:Z=!1}=Q,Y=new Map;return{name:"svelte-origin-dts",enforce:"pre",async transform(X,$){if(!$.endsWith(".svelte"))return null;let _=X.match(/\$origin\s*\.\s*component\s*\(\s*(\w+)\s*\)/);if(!_)return null;let G=_[1],H=I(X,G);if(!H)return null;let z=await k(H,G,$,Y,{debug:Z});if(!z||z.attrs.length===0)return null;let W=d(G,H,z),U=$+".d.ts";return await gQ(U,W,"utf-8"),null},async handleHotUpdate({file:X}){if(X.endsWith(".svelte")){let $=X+".d.ts";if(!zQ(X)&&zQ($))await fQ($)}}}}var jX=uQ;export{uQ as svelteOriginDts,jX as default};
package/package.json CHANGED
@@ -1,4 +1,80 @@
1
- {
2
- "name": "svelte-origin",
3
- "version": "0.0.0"
1
+ {
2
+ "name": "svelte-origin",
3
+ "version": "1.0.0-next.49",
4
+ "description": "Compiler-assisted state and prop ergonomics for Svelte 5",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "bin": {
9
+ "svelte-origin": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "README.md",
13
+ "LLM.md",
14
+ "dist"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./runtime": {
22
+ "types": "./dist/runtime/index.d.ts",
23
+ "import": "./dist/runtime/index.js"
24
+ },
25
+ "./plugin": {
26
+ "types": "./dist/plugin.d.ts",
27
+ "import": "./dist/plugin.js"
28
+ },
29
+ "./preprocess": {
30
+ "types": "./dist/preprocess.d.ts",
31
+ "import": "./dist/preprocess.js"
32
+ },
33
+ "./vite-dts": {
34
+ "types": "./dist/vite-dts.d.ts",
35
+ "import": "./dist/vite-dts.js"
36
+ },
37
+ "./post-process": {
38
+ "types": "./dist/post-process.d.ts",
39
+ "import": "./dist/post-process.js"
40
+ },
41
+ "./globals": "./dist/globals.d.ts"
42
+ },
43
+ "scripts": {
44
+ "build": "bun run build:types && bun run build:globals && bun run build:esm && bun run build:inline-runtime",
45
+ "build:esm": "bun build src/index.ts src/plugin.ts src/preprocess.ts src/vite-dts.ts src/cli.ts src/post-process.ts src/runtime/index.ts --outdir dist --format esm --external node:fs --external node:path --external node:fs/promises --external magic-string --target node --minify",
46
+ "build:types": "tsc --project tsconfig.build.json",
47
+ "build:globals": "bun -e \"require('fs').copyFileSync('src/globals.d.ts', 'dist/globals.d.ts')\"",
48
+ "build:inline-runtime": "bun build src/runtime-inline.ts --outfile dist/runtime-inline.min.js --format esm --external svelte --external svelte/attachments --minify",
49
+ "generate:runtime-inline": "bun scripts/generate-runtime-inline.ts",
50
+ "test": "vitest run",
51
+ "test:watch": "vitest",
52
+ "typecheck": "tsc --noEmit"
53
+ },
54
+ "peerDependencies": {
55
+ "svelte": "^5.0.0"
56
+ },
57
+ "peerDependenciesMeta": {
58
+ "vite": {
59
+ "optional": true
60
+ }
61
+ },
62
+ "dependencies": {
63
+ "magic-string": "^0.30.0"
64
+ },
65
+ "devDependencies": {
66
+ "@sveltejs/acorn-typescript": "^1.0.8",
67
+ "@sveltejs/vite-plugin-svelte": "^5.0.0",
68
+ "@testing-library/svelte": "^5.0.0",
69
+ "@types/estree": "^1.0.8",
70
+ "acorn": "^8.15.0",
71
+ "astring": "^1.9.0",
72
+ "bun-types": "latest",
73
+ "jsdom": "^25.0.0",
74
+ "svelte": "^5.0.0",
75
+ "svelte2tsx": "^0.7.45",
76
+ "typescript": "^5.0.0",
77
+ "vite": "^6.0.0",
78
+ "vitest": "^2.0.0"
79
+ }
4
80
  }