svelte-origin 1.0.0-next.14 → 1.0.0-next.16

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/cli.js CHANGED
@@ -1919,7 +1919,7 @@ function parseObjectMembers(source) {
1919
1919
  }
1920
1920
 
1921
1921
  // src/transform/origin-transform.ts
1922
- function transformOriginCalls(s, source, neededImports) {
1922
+ function transformOriginCalls(s, source, neededImports, svelteImports) {
1923
1923
  const regex = /\$origin\s*\(/g;
1924
1924
  let match;
1925
1925
  let changed = false;
@@ -1935,14 +1935,14 @@ function transformOriginCalls(s, source, neededImports) {
1935
1935
  continue;
1936
1936
  }
1937
1937
  const definitionContent = source.slice(openParenIndex + 1, closeParenIndex);
1938
- const transformed = transformOriginDefinition(definitionContent);
1938
+ const transformed = transformOriginDefinition(definitionContent, svelteImports);
1939
1939
  s.overwrite(startIndex, closeParenIndex + 1, `__createOrigin(${transformed})`);
1940
1940
  neededImports.add("__createOrigin");
1941
1941
  changed = true;
1942
1942
  }
1943
1943
  return changed;
1944
1944
  }
1945
- function transformOriginDefinition(content) {
1945
+ function transformOriginDefinition(content, svelteImports) {
1946
1946
  let parents = [];
1947
1947
  let bodyContent = content.trim();
1948
1948
  let initCallback = null;
@@ -2007,7 +2007,7 @@ function transformOriginDefinition(content) {
2007
2007
  }
2008
2008
  }
2009
2009
  const attrDetails = parseAttrsSource(attrsContent);
2010
- const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName);
2010
+ const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName, svelteImports);
2011
2011
  const parentsCode = parents.length > 0 ? `[${parents.join(", ")}]` : "undefined";
2012
2012
  let configCode = `{
2013
2013
  __attrSchema: ${attrSchemaCode},
@@ -2027,19 +2027,35 @@ ${createFnBody}
2027
2027
  }`;
2028
2028
  return configCode;
2029
2029
  }
2030
- function transformOriginBody(content, parents = [], attrDetails = [], propName = "props") {
2030
+ function transformOriginBody(content, parents = [], attrDetails = [], propName = "props", svelteImports) {
2031
2031
  let body = content.trim();
2032
2032
  const hasParents = parents.length > 0;
2033
+ const attrStateDeclarations = [];
2034
+ const attrSyncEffects = [];
2033
2035
  const attrGettersSetters = [];
2034
- for (const attr of attrDetails) {
2035
- if (attr.hasDefault) {
2036
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} ?? ${attr.defaultValue} }`);
2037
- } else {
2038
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} }`);
2039
- }
2040
- attrGettersSetters.push(`set ${attr.key}(v) { __inputAttrs.${attr.key} = v }`);
2036
+ if (attrDetails.length > 0 && svelteImports) {
2037
+ svelteImports.add("untrack");
2041
2038
  }
2042
- const propsObjectCode = attrGettersSetters.length > 0 ? ` const __props = {
2039
+ for (const attr of attrDetails) {
2040
+ const defaultExpr = attr.hasDefault ? ` ?? ${attr.defaultValue}` : "";
2041
+ attrStateDeclarations.push(`let __attr_${attr.key} = $state(__inputAttrs.${attr.key}${defaultExpr})`);
2042
+ attrSyncEffects.push(`$effect(() => {
2043
+ const __parentVal = __inputAttrs.${attr.key}
2044
+ const __currentVal = untrack(() => __attr_${attr.key})
2045
+ if (__parentVal !== __currentVal) {
2046
+ __attr_${attr.key} = __parentVal${defaultExpr}
2047
+ }
2048
+ })`);
2049
+ attrGettersSetters.push(`get ${attr.key}() { return __attr_${attr.key} }`);
2050
+ attrGettersSetters.push(`set ${attr.key}(v) { __attr_${attr.key} = v; __inputAttrs.${attr.key} = v }`);
2051
+ }
2052
+ const attrStateSection = attrStateDeclarations.length > 0 ? attrStateDeclarations.join(`
2053
+ `) + `
2054
+ ` : "";
2055
+ const attrEffectSection = attrSyncEffects.length > 0 ? attrSyncEffects.join(`
2056
+ `) + `
2057
+ ` : "";
2058
+ const propsObjectCode = attrGettersSetters.length > 0 ? `${attrStateSection}${attrEffectSection}const __props = {
2043
2059
  ${attrGettersSetters.join(`,
2044
2060
  `)}
2045
2061
  }` : ` const __props = __inputAttrs`;
@@ -2056,10 +2072,17 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2056
2072
  const members = parseObjectMembers(body);
2057
2073
  const derivedNames = new Set;
2058
2074
  const stateNames = new Set;
2075
+ const valueNames = new Set;
2076
+ const methodNames = new Set;
2059
2077
  for (const member of members) {
2060
2078
  const { key, value, isGetter, isMethod, isSetter } = member;
2061
2079
  if (!isGetter && !isMethod && !isSetter && value.startsWith("$state")) {
2062
2080
  stateNames.add(key);
2081
+ } else if (!isGetter && !isMethod && !isSetter) {
2082
+ valueNames.add(key);
2083
+ }
2084
+ if (isMethod) {
2085
+ methodNames.add(key);
2063
2086
  }
2064
2087
  if (isGetter && /return\s+\$derived(\.by)?\s*\(/.test(value)) {
2065
2088
  derivedNames.add(key);
@@ -2121,7 +2144,10 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2121
2144
  if (stateNames.has(name)) {
2122
2145
  return name;
2123
2146
  }
2124
- return name;
2147
+ if (valueNames.has(name)) {
2148
+ return name;
2149
+ }
2150
+ return `this.${name}`;
2125
2151
  });
2126
2152
  const asyncPrefix = isAsync ? "async " : "";
2127
2153
  const generatorPrefix = isGenerator ? "*" : "";
@@ -2146,7 +2172,9 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2146
2172
  } else if (isMethod) {
2147
2173
  returnMembers.push(`${asyncPrefix}${generatorPrefix}${outputKey}${transformedValue}`);
2148
2174
  } else {
2149
- returnMembers.push(`get ${key}() { return ${transformedValue} }`);
2175
+ stateDeclarations.push(` let ${key} = ${transformedValue}`);
2176
+ returnMembers.push(`get ${key}() { return ${key} }`);
2177
+ returnMembers.push(`set ${key}(v) { ${key} = v }`);
2150
2178
  }
2151
2179
  }
2152
2180
  const stateSection = stateDeclarations.length > 0 ? stateDeclarations.join(`
@@ -2716,9 +2744,10 @@ function transformScript(source, options = {}) {
2716
2744
  const { isComponent = false } = options;
2717
2745
  let changed = false;
2718
2746
  const neededImports = new Set;
2747
+ const svelteImports = new Set;
2719
2748
  let propsTypeDeclaration = null;
2720
2749
  if (!isComponent) {
2721
- changed = transformOriginCalls(s, source, neededImports) || changed;
2750
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2722
2751
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2723
2752
  }
2724
2753
  if (isComponent) {
@@ -2757,10 +2786,17 @@ function transformScript(source, options = {}) {
2757
2786
  `);
2758
2787
  }
2759
2788
  }
2760
- } else if (neededImports.size > 0) {
2761
- const importStatement = generateRuntimeImport([...neededImports]);
2762
- s.prepend(importStatement + `
2789
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2790
+ if (neededImports.size > 0) {
2791
+ const importStatement = generateRuntimeImport([...neededImports]);
2792
+ s.prepend(importStatement + `
2793
+ `);
2794
+ }
2795
+ if (svelteImports.size > 0) {
2796
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2797
+ s.prepend(svelteImportStatement + `
2763
2798
  `);
2799
+ }
2764
2800
  }
2765
2801
  if (!changed) {
2766
2802
  return { code: source, changed: false };
@@ -2779,9 +2815,10 @@ async function transformScriptAsync(source, options) {
2779
2815
  const { isComponent = false, schemaResolver } = options;
2780
2816
  let changed = false;
2781
2817
  const neededImports = new Set;
2818
+ const svelteImports = new Set;
2782
2819
  let propsTypeDeclaration = null;
2783
2820
  if (!isComponent) {
2784
- changed = transformOriginCalls(s, source, neededImports) || changed;
2821
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2785
2822
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2786
2823
  }
2787
2824
  if (isComponent) {
@@ -2820,10 +2857,17 @@ async function transformScriptAsync(source, options) {
2820
2857
  `);
2821
2858
  }
2822
2859
  }
2823
- } else if (neededImports.size > 0) {
2824
- const importStatement = generateRuntimeImport([...neededImports]);
2825
- s.prepend(importStatement + `
2860
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2861
+ if (neededImports.size > 0) {
2862
+ const importStatement = generateRuntimeImport([...neededImports]);
2863
+ s.prepend(importStatement + `
2864
+ `);
2865
+ }
2866
+ if (svelteImports.size > 0) {
2867
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2868
+ s.prepend(svelteImportStatement + `
2826
2869
  `);
2870
+ }
2827
2871
  }
2828
2872
  if (!changed) {
2829
2873
  return { code: source, changed: false };
@@ -2842,9 +2886,10 @@ async function transformScriptContent(source, options) {
2842
2886
  const { isComponent = false, schemaResolver } = options;
2843
2887
  let changed = false;
2844
2888
  const neededImports = new Set;
2889
+ const svelteImports = new Set;
2845
2890
  let propsTypeDeclaration = null;
2846
2891
  if (!isComponent) {
2847
- changed = transformOriginCalls(s, source, neededImports) || changed;
2892
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2848
2893
  }
2849
2894
  if (isComponent) {
2850
2895
  const result = await transformAttrsOriginCalls(s, source, neededImports, schemaResolver);
@@ -2857,11 +2902,22 @@ async function transformScriptContent(source, options) {
2857
2902
  if (neededImports.size > 0) {
2858
2903
  const importStatement = generateRuntimeImport([...neededImports]);
2859
2904
  s.prepend(importStatement + `
2905
+ `);
2906
+ }
2907
+ if (svelteImports.size > 0) {
2908
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2909
+ s.prepend(svelteImportStatement + `
2860
2910
  `);
2861
2911
  }
2862
2912
  if (propsTypeDeclaration) {
2863
2913
  const afterImports = findPropsInjectionPosition(source);
2864
- const offset = neededImports.size > 0 ? generateRuntimeImport([...neededImports]).length + 1 : 0;
2914
+ let offset = 0;
2915
+ if (neededImports.size > 0) {
2916
+ offset += generateRuntimeImport([...neededImports]).length + 1;
2917
+ }
2918
+ if (svelteImports.size > 0) {
2919
+ offset += `import { ${[...svelteImports].join(", ")} } from 'svelte'`.length + 1;
2920
+ }
2865
2921
  s.appendLeft(afterImports + offset, propsTypeDeclaration + `
2866
2922
  `);
2867
2923
  }
package/dist/index.js CHANGED
@@ -5969,7 +5969,7 @@ function parseObjectMembers(source2) {
5969
5969
  }
5970
5970
 
5971
5971
  // src/transform/origin-transform.ts
5972
- function transformOriginCalls(s, source2, neededImports) {
5972
+ function transformOriginCalls(s, source2, neededImports, svelteImports) {
5973
5973
  const regex = /\$origin\s*\(/g;
5974
5974
  let match;
5975
5975
  let changed = false;
@@ -5985,14 +5985,14 @@ function transformOriginCalls(s, source2, neededImports) {
5985
5985
  continue;
5986
5986
  }
5987
5987
  const definitionContent = source2.slice(openParenIndex + 1, closeParenIndex);
5988
- const transformed = transformOriginDefinition(definitionContent);
5988
+ const transformed = transformOriginDefinition(definitionContent, svelteImports);
5989
5989
  s.overwrite(startIndex, closeParenIndex + 1, `__createOrigin(${transformed})`);
5990
5990
  neededImports.add("__createOrigin");
5991
5991
  changed = true;
5992
5992
  }
5993
5993
  return changed;
5994
5994
  }
5995
- function transformOriginDefinition(content) {
5995
+ function transformOriginDefinition(content, svelteImports) {
5996
5996
  let parents = [];
5997
5997
  let bodyContent = content.trim();
5998
5998
  let initCallback = null;
@@ -6057,7 +6057,7 @@ function transformOriginDefinition(content) {
6057
6057
  }
6058
6058
  }
6059
6059
  const attrDetails = parseAttrsSource(attrsContent);
6060
- const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName);
6060
+ const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName, svelteImports);
6061
6061
  const parentsCode = parents.length > 0 ? `[${parents.join(", ")}]` : "undefined";
6062
6062
  let configCode = `{
6063
6063
  __attrSchema: ${attrSchemaCode},
@@ -6077,19 +6077,35 @@ ${createFnBody}
6077
6077
  }`;
6078
6078
  return configCode;
6079
6079
  }
6080
- function transformOriginBody(content, parents = [], attrDetails = [], propName = "props") {
6080
+ function transformOriginBody(content, parents = [], attrDetails = [], propName = "props", svelteImports) {
6081
6081
  let body = content.trim();
6082
6082
  const hasParents = parents.length > 0;
6083
+ const attrStateDeclarations = [];
6084
+ const attrSyncEffects = [];
6083
6085
  const attrGettersSetters = [];
6084
- for (const attr2 of attrDetails) {
6085
- if (attr2.hasDefault) {
6086
- attrGettersSetters.push(`get ${attr2.key}() { return __inputAttrs.${attr2.key} ?? ${attr2.defaultValue} }`);
6087
- } else {
6088
- attrGettersSetters.push(`get ${attr2.key}() { return __inputAttrs.${attr2.key} }`);
6089
- }
6090
- attrGettersSetters.push(`set ${attr2.key}(v) { __inputAttrs.${attr2.key} = v }`);
6086
+ if (attrDetails.length > 0 && svelteImports) {
6087
+ svelteImports.add("untrack");
6091
6088
  }
6092
- const propsObjectCode = attrGettersSetters.length > 0 ? ` const __props = {
6089
+ for (const attr2 of attrDetails) {
6090
+ const defaultExpr = attr2.hasDefault ? ` ?? ${attr2.defaultValue}` : "";
6091
+ attrStateDeclarations.push(`let __attr_${attr2.key} = $state(__inputAttrs.${attr2.key}${defaultExpr})`);
6092
+ attrSyncEffects.push(`$effect(() => {
6093
+ const __parentVal = __inputAttrs.${attr2.key}
6094
+ const __currentVal = untrack(() => __attr_${attr2.key})
6095
+ if (__parentVal !== __currentVal) {
6096
+ __attr_${attr2.key} = __parentVal${defaultExpr}
6097
+ }
6098
+ })`);
6099
+ attrGettersSetters.push(`get ${attr2.key}() { return __attr_${attr2.key} }`);
6100
+ attrGettersSetters.push(`set ${attr2.key}(v) { __attr_${attr2.key} = v; __inputAttrs.${attr2.key} = v }`);
6101
+ }
6102
+ const attrStateSection = attrStateDeclarations.length > 0 ? attrStateDeclarations.join(`
6103
+ `) + `
6104
+ ` : "";
6105
+ const attrEffectSection = attrSyncEffects.length > 0 ? attrSyncEffects.join(`
6106
+ `) + `
6107
+ ` : "";
6108
+ const propsObjectCode = attrGettersSetters.length > 0 ? `${attrStateSection}${attrEffectSection}const __props = {
6093
6109
  ${attrGettersSetters.join(`,
6094
6110
  `)}
6095
6111
  }` : ` const __props = __inputAttrs`;
@@ -6106,10 +6122,17 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
6106
6122
  const members = parseObjectMembers(body);
6107
6123
  const derivedNames = new Set;
6108
6124
  const stateNames = new Set;
6125
+ const valueNames = new Set;
6126
+ const methodNames = new Set;
6109
6127
  for (const member of members) {
6110
6128
  const { key: key2, value, isGetter, isMethod, isSetter } = member;
6111
6129
  if (!isGetter && !isMethod && !isSetter && value.startsWith("$state")) {
6112
6130
  stateNames.add(key2);
6131
+ } else if (!isGetter && !isMethod && !isSetter) {
6132
+ valueNames.add(key2);
6133
+ }
6134
+ if (isMethod) {
6135
+ methodNames.add(key2);
6113
6136
  }
6114
6137
  if (isGetter && /return\s+\$derived(\.by)?\s*\(/.test(value)) {
6115
6138
  derivedNames.add(key2);
@@ -6171,7 +6194,10 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
6171
6194
  if (stateNames.has(name)) {
6172
6195
  return name;
6173
6196
  }
6174
- return name;
6197
+ if (valueNames.has(name)) {
6198
+ return name;
6199
+ }
6200
+ return `this.${name}`;
6175
6201
  });
6176
6202
  const asyncPrefix = isAsync ? "async " : "";
6177
6203
  const generatorPrefix = isGenerator ? "*" : "";
@@ -6196,7 +6222,9 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
6196
6222
  } else if (isMethod) {
6197
6223
  returnMembers.push(`${asyncPrefix}${generatorPrefix}${outputKey}${transformedValue}`);
6198
6224
  } else {
6199
- returnMembers.push(`get ${key2}() { return ${transformedValue} }`);
6225
+ stateDeclarations.push(` let ${key2} = ${transformedValue}`);
6226
+ returnMembers.push(`get ${key2}() { return ${key2} }`);
6227
+ returnMembers.push(`set ${key2}(v) { ${key2} = v }`);
6200
6228
  }
6201
6229
  }
6202
6230
  const stateSection = stateDeclarations.length > 0 ? stateDeclarations.join(`
@@ -6497,9 +6525,10 @@ function transformScript(source2, options = {}) {
6497
6525
  const { isComponent = false } = options;
6498
6526
  let changed = false;
6499
6527
  const neededImports = new Set;
6528
+ const svelteImports = new Set;
6500
6529
  let propsTypeDeclaration = null;
6501
6530
  if (!isComponent) {
6502
- changed = transformOriginCalls(s, source2, neededImports) || changed;
6531
+ changed = transformOriginCalls(s, source2, neededImports, svelteImports) || changed;
6503
6532
  changed = transformStandaloneAttrsCalls(s, source2, neededImports) || changed;
6504
6533
  }
6505
6534
  if (isComponent) {
@@ -6538,10 +6567,17 @@ function transformScript(source2, options = {}) {
6538
6567
  `);
6539
6568
  }
6540
6569
  }
6541
- } else if (neededImports.size > 0) {
6542
- const importStatement = generateRuntimeImport([...neededImports]);
6543
- s.prepend(importStatement + `
6570
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
6571
+ if (neededImports.size > 0) {
6572
+ const importStatement = generateRuntimeImport([...neededImports]);
6573
+ s.prepend(importStatement + `
6574
+ `);
6575
+ }
6576
+ if (svelteImports.size > 0) {
6577
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
6578
+ s.prepend(svelteImportStatement + `
6544
6579
  `);
6580
+ }
6545
6581
  }
6546
6582
  if (!changed) {
6547
6583
  return { code: source2, changed: false };
@@ -6560,9 +6596,10 @@ async function transformScriptAsync(source2, options) {
6560
6596
  const { isComponent = false, schemaResolver } = options;
6561
6597
  let changed = false;
6562
6598
  const neededImports = new Set;
6599
+ const svelteImports = new Set;
6563
6600
  let propsTypeDeclaration = null;
6564
6601
  if (!isComponent) {
6565
- changed = transformOriginCalls(s, source2, neededImports) || changed;
6602
+ changed = transformOriginCalls(s, source2, neededImports, svelteImports) || changed;
6566
6603
  changed = transformStandaloneAttrsCalls(s, source2, neededImports) || changed;
6567
6604
  }
6568
6605
  if (isComponent) {
@@ -6601,10 +6638,17 @@ async function transformScriptAsync(source2, options) {
6601
6638
  `);
6602
6639
  }
6603
6640
  }
6604
- } else if (neededImports.size > 0) {
6605
- const importStatement = generateRuntimeImport([...neededImports]);
6606
- s.prepend(importStatement + `
6641
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
6642
+ if (neededImports.size > 0) {
6643
+ const importStatement = generateRuntimeImport([...neededImports]);
6644
+ s.prepend(importStatement + `
6645
+ `);
6646
+ }
6647
+ if (svelteImports.size > 0) {
6648
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
6649
+ s.prepend(svelteImportStatement + `
6607
6650
  `);
6651
+ }
6608
6652
  }
6609
6653
  if (!changed) {
6610
6654
  return { code: source2, changed: false };
@@ -6623,9 +6667,10 @@ async function transformScriptContent(source2, options) {
6623
6667
  const { isComponent = false, schemaResolver } = options;
6624
6668
  let changed = false;
6625
6669
  const neededImports = new Set;
6670
+ const svelteImports = new Set;
6626
6671
  let propsTypeDeclaration = null;
6627
6672
  if (!isComponent) {
6628
- changed = transformOriginCalls(s, source2, neededImports) || changed;
6673
+ changed = transformOriginCalls(s, source2, neededImports, svelteImports) || changed;
6629
6674
  }
6630
6675
  if (isComponent) {
6631
6676
  const result = await transformAttrsOriginCalls(s, source2, neededImports, schemaResolver);
@@ -6638,11 +6683,22 @@ async function transformScriptContent(source2, options) {
6638
6683
  if (neededImports.size > 0) {
6639
6684
  const importStatement = generateRuntimeImport([...neededImports]);
6640
6685
  s.prepend(importStatement + `
6686
+ `);
6687
+ }
6688
+ if (svelteImports.size > 0) {
6689
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
6690
+ s.prepend(svelteImportStatement + `
6641
6691
  `);
6642
6692
  }
6643
6693
  if (propsTypeDeclaration) {
6644
6694
  const afterImports = findPropsInjectionPosition(source2);
6645
- const offset = neededImports.size > 0 ? generateRuntimeImport([...neededImports]).length + 1 : 0;
6695
+ let offset = 0;
6696
+ if (neededImports.size > 0) {
6697
+ offset += generateRuntimeImport([...neededImports]).length + 1;
6698
+ }
6699
+ if (svelteImports.size > 0) {
6700
+ offset += `import { ${[...svelteImports].join(", ")} } from 'svelte'`.length + 1;
6701
+ }
6646
6702
  s.appendLeft(afterImports + offset, propsTypeDeclaration + `
6647
6703
  `);
6648
6704
  }
package/dist/plugin.js CHANGED
@@ -1913,7 +1913,7 @@ function parseObjectMembers(source) {
1913
1913
  }
1914
1914
 
1915
1915
  // src/transform/origin-transform.ts
1916
- function transformOriginCalls(s, source, neededImports) {
1916
+ function transformOriginCalls(s, source, neededImports, svelteImports) {
1917
1917
  const regex = /\$origin\s*\(/g;
1918
1918
  let match;
1919
1919
  let changed = false;
@@ -1929,14 +1929,14 @@ function transformOriginCalls(s, source, neededImports) {
1929
1929
  continue;
1930
1930
  }
1931
1931
  const definitionContent = source.slice(openParenIndex + 1, closeParenIndex);
1932
- const transformed = transformOriginDefinition(definitionContent);
1932
+ const transformed = transformOriginDefinition(definitionContent, svelteImports);
1933
1933
  s.overwrite(startIndex, closeParenIndex + 1, `__createOrigin(${transformed})`);
1934
1934
  neededImports.add("__createOrigin");
1935
1935
  changed = true;
1936
1936
  }
1937
1937
  return changed;
1938
1938
  }
1939
- function transformOriginDefinition(content) {
1939
+ function transformOriginDefinition(content, svelteImports) {
1940
1940
  let parents = [];
1941
1941
  let bodyContent = content.trim();
1942
1942
  let initCallback = null;
@@ -2001,7 +2001,7 @@ function transformOriginDefinition(content) {
2001
2001
  }
2002
2002
  }
2003
2003
  const attrDetails = parseAttrsSource(attrsContent);
2004
- const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName);
2004
+ const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName, svelteImports);
2005
2005
  const parentsCode = parents.length > 0 ? `[${parents.join(", ")}]` : "undefined";
2006
2006
  let configCode = `{
2007
2007
  __attrSchema: ${attrSchemaCode},
@@ -2021,19 +2021,35 @@ ${createFnBody}
2021
2021
  }`;
2022
2022
  return configCode;
2023
2023
  }
2024
- function transformOriginBody(content, parents = [], attrDetails = [], propName = "props") {
2024
+ function transformOriginBody(content, parents = [], attrDetails = [], propName = "props", svelteImports) {
2025
2025
  let body = content.trim();
2026
2026
  const hasParents = parents.length > 0;
2027
+ const attrStateDeclarations = [];
2028
+ const attrSyncEffects = [];
2027
2029
  const attrGettersSetters = [];
2028
- for (const attr of attrDetails) {
2029
- if (attr.hasDefault) {
2030
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} ?? ${attr.defaultValue} }`);
2031
- } else {
2032
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} }`);
2033
- }
2034
- attrGettersSetters.push(`set ${attr.key}(v) { __inputAttrs.${attr.key} = v }`);
2030
+ if (attrDetails.length > 0 && svelteImports) {
2031
+ svelteImports.add("untrack");
2035
2032
  }
2036
- const propsObjectCode = attrGettersSetters.length > 0 ? ` const __props = {
2033
+ for (const attr of attrDetails) {
2034
+ const defaultExpr = attr.hasDefault ? ` ?? ${attr.defaultValue}` : "";
2035
+ attrStateDeclarations.push(`let __attr_${attr.key} = $state(__inputAttrs.${attr.key}${defaultExpr})`);
2036
+ attrSyncEffects.push(`$effect(() => {
2037
+ const __parentVal = __inputAttrs.${attr.key}
2038
+ const __currentVal = untrack(() => __attr_${attr.key})
2039
+ if (__parentVal !== __currentVal) {
2040
+ __attr_${attr.key} = __parentVal${defaultExpr}
2041
+ }
2042
+ })`);
2043
+ attrGettersSetters.push(`get ${attr.key}() { return __attr_${attr.key} }`);
2044
+ attrGettersSetters.push(`set ${attr.key}(v) { __attr_${attr.key} = v; __inputAttrs.${attr.key} = v }`);
2045
+ }
2046
+ const attrStateSection = attrStateDeclarations.length > 0 ? attrStateDeclarations.join(`
2047
+ `) + `
2048
+ ` : "";
2049
+ const attrEffectSection = attrSyncEffects.length > 0 ? attrSyncEffects.join(`
2050
+ `) + `
2051
+ ` : "";
2052
+ const propsObjectCode = attrGettersSetters.length > 0 ? `${attrStateSection}${attrEffectSection}const __props = {
2037
2053
  ${attrGettersSetters.join(`,
2038
2054
  `)}
2039
2055
  }` : ` const __props = __inputAttrs`;
@@ -2050,10 +2066,17 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2050
2066
  const members = parseObjectMembers(body);
2051
2067
  const derivedNames = new Set;
2052
2068
  const stateNames = new Set;
2069
+ const valueNames = new Set;
2070
+ const methodNames = new Set;
2053
2071
  for (const member of members) {
2054
2072
  const { key, value, isGetter, isMethod, isSetter } = member;
2055
2073
  if (!isGetter && !isMethod && !isSetter && value.startsWith("$state")) {
2056
2074
  stateNames.add(key);
2075
+ } else if (!isGetter && !isMethod && !isSetter) {
2076
+ valueNames.add(key);
2077
+ }
2078
+ if (isMethod) {
2079
+ methodNames.add(key);
2057
2080
  }
2058
2081
  if (isGetter && /return\s+\$derived(\.by)?\s*\(/.test(value)) {
2059
2082
  derivedNames.add(key);
@@ -2115,7 +2138,10 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2115
2138
  if (stateNames.has(name)) {
2116
2139
  return name;
2117
2140
  }
2118
- return name;
2141
+ if (valueNames.has(name)) {
2142
+ return name;
2143
+ }
2144
+ return `this.${name}`;
2119
2145
  });
2120
2146
  const asyncPrefix = isAsync ? "async " : "";
2121
2147
  const generatorPrefix = isGenerator ? "*" : "";
@@ -2140,7 +2166,9 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2140
2166
  } else if (isMethod) {
2141
2167
  returnMembers.push(`${asyncPrefix}${generatorPrefix}${outputKey}${transformedValue}`);
2142
2168
  } else {
2143
- returnMembers.push(`get ${key}() { return ${transformedValue} }`);
2169
+ stateDeclarations.push(` let ${key} = ${transformedValue}`);
2170
+ returnMembers.push(`get ${key}() { return ${key} }`);
2171
+ returnMembers.push(`set ${key}(v) { ${key} = v }`);
2144
2172
  }
2145
2173
  }
2146
2174
  const stateSection = stateDeclarations.length > 0 ? stateDeclarations.join(`
@@ -2710,9 +2738,10 @@ function transformScript(source, options = {}) {
2710
2738
  const { isComponent = false } = options;
2711
2739
  let changed = false;
2712
2740
  const neededImports = new Set;
2741
+ const svelteImports = new Set;
2713
2742
  let propsTypeDeclaration = null;
2714
2743
  if (!isComponent) {
2715
- changed = transformOriginCalls(s, source, neededImports) || changed;
2744
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2716
2745
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2717
2746
  }
2718
2747
  if (isComponent) {
@@ -2751,10 +2780,17 @@ function transformScript(source, options = {}) {
2751
2780
  `);
2752
2781
  }
2753
2782
  }
2754
- } else if (neededImports.size > 0) {
2755
- const importStatement = generateRuntimeImport([...neededImports]);
2756
- s.prepend(importStatement + `
2783
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2784
+ if (neededImports.size > 0) {
2785
+ const importStatement = generateRuntimeImport([...neededImports]);
2786
+ s.prepend(importStatement + `
2787
+ `);
2788
+ }
2789
+ if (svelteImports.size > 0) {
2790
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2791
+ s.prepend(svelteImportStatement + `
2757
2792
  `);
2793
+ }
2758
2794
  }
2759
2795
  if (!changed) {
2760
2796
  return { code: source, changed: false };
@@ -2773,9 +2809,10 @@ async function transformScriptAsync(source, options) {
2773
2809
  const { isComponent = false, schemaResolver } = options;
2774
2810
  let changed = false;
2775
2811
  const neededImports = new Set;
2812
+ const svelteImports = new Set;
2776
2813
  let propsTypeDeclaration = null;
2777
2814
  if (!isComponent) {
2778
- changed = transformOriginCalls(s, source, neededImports) || changed;
2815
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2779
2816
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2780
2817
  }
2781
2818
  if (isComponent) {
@@ -2814,10 +2851,17 @@ async function transformScriptAsync(source, options) {
2814
2851
  `);
2815
2852
  }
2816
2853
  }
2817
- } else if (neededImports.size > 0) {
2818
- const importStatement = generateRuntimeImport([...neededImports]);
2819
- s.prepend(importStatement + `
2854
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2855
+ if (neededImports.size > 0) {
2856
+ const importStatement = generateRuntimeImport([...neededImports]);
2857
+ s.prepend(importStatement + `
2858
+ `);
2859
+ }
2860
+ if (svelteImports.size > 0) {
2861
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2862
+ s.prepend(svelteImportStatement + `
2820
2863
  `);
2864
+ }
2821
2865
  }
2822
2866
  if (!changed) {
2823
2867
  return { code: source, changed: false };
@@ -2836,9 +2880,10 @@ async function transformScriptContent(source, options) {
2836
2880
  const { isComponent = false, schemaResolver } = options;
2837
2881
  let changed = false;
2838
2882
  const neededImports = new Set;
2883
+ const svelteImports = new Set;
2839
2884
  let propsTypeDeclaration = null;
2840
2885
  if (!isComponent) {
2841
- changed = transformOriginCalls(s, source, neededImports) || changed;
2886
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2842
2887
  }
2843
2888
  if (isComponent) {
2844
2889
  const result = await transformAttrsOriginCalls(s, source, neededImports, schemaResolver);
@@ -2851,11 +2896,22 @@ async function transformScriptContent(source, options) {
2851
2896
  if (neededImports.size > 0) {
2852
2897
  const importStatement = generateRuntimeImport([...neededImports]);
2853
2898
  s.prepend(importStatement + `
2899
+ `);
2900
+ }
2901
+ if (svelteImports.size > 0) {
2902
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2903
+ s.prepend(svelteImportStatement + `
2854
2904
  `);
2855
2905
  }
2856
2906
  if (propsTypeDeclaration) {
2857
2907
  const afterImports = findPropsInjectionPosition(source);
2858
- const offset = neededImports.size > 0 ? generateRuntimeImport([...neededImports]).length + 1 : 0;
2908
+ let offset = 0;
2909
+ if (neededImports.size > 0) {
2910
+ offset += generateRuntimeImport([...neededImports]).length + 1;
2911
+ }
2912
+ if (svelteImports.size > 0) {
2913
+ offset += `import { ${[...svelteImports].join(", ")} } from 'svelte'`.length + 1;
2914
+ }
2859
2915
  s.appendLeft(afterImports + offset, propsTypeDeclaration + `
2860
2916
  `);
2861
2917
  }
@@ -1917,7 +1917,7 @@ function parseObjectMembers(source) {
1917
1917
  }
1918
1918
 
1919
1919
  // src/transform/origin-transform.ts
1920
- function transformOriginCalls(s, source, neededImports) {
1920
+ function transformOriginCalls(s, source, neededImports, svelteImports) {
1921
1921
  const regex = /\$origin\s*\(/g;
1922
1922
  let match;
1923
1923
  let changed = false;
@@ -1933,14 +1933,14 @@ function transformOriginCalls(s, source, neededImports) {
1933
1933
  continue;
1934
1934
  }
1935
1935
  const definitionContent = source.slice(openParenIndex + 1, closeParenIndex);
1936
- const transformed = transformOriginDefinition(definitionContent);
1936
+ const transformed = transformOriginDefinition(definitionContent, svelteImports);
1937
1937
  s.overwrite(startIndex, closeParenIndex + 1, `__createOrigin(${transformed})`);
1938
1938
  neededImports.add("__createOrigin");
1939
1939
  changed = true;
1940
1940
  }
1941
1941
  return changed;
1942
1942
  }
1943
- function transformOriginDefinition(content) {
1943
+ function transformOriginDefinition(content, svelteImports) {
1944
1944
  let parents = [];
1945
1945
  let bodyContent = content.trim();
1946
1946
  let initCallback = null;
@@ -2005,7 +2005,7 @@ function transformOriginDefinition(content) {
2005
2005
  }
2006
2006
  }
2007
2007
  const attrDetails = parseAttrsSource(attrsContent);
2008
- const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName);
2008
+ const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName, svelteImports);
2009
2009
  const parentsCode = parents.length > 0 ? `[${parents.join(", ")}]` : "undefined";
2010
2010
  let configCode = `{
2011
2011
  __attrSchema: ${attrSchemaCode},
@@ -2025,19 +2025,35 @@ ${createFnBody}
2025
2025
  }`;
2026
2026
  return configCode;
2027
2027
  }
2028
- function transformOriginBody(content, parents = [], attrDetails = [], propName = "props") {
2028
+ function transformOriginBody(content, parents = [], attrDetails = [], propName = "props", svelteImports) {
2029
2029
  let body = content.trim();
2030
2030
  const hasParents = parents.length > 0;
2031
+ const attrStateDeclarations = [];
2032
+ const attrSyncEffects = [];
2031
2033
  const attrGettersSetters = [];
2032
- for (const attr of attrDetails) {
2033
- if (attr.hasDefault) {
2034
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} ?? ${attr.defaultValue} }`);
2035
- } else {
2036
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} }`);
2037
- }
2038
- attrGettersSetters.push(`set ${attr.key}(v) { __inputAttrs.${attr.key} = v }`);
2034
+ if (attrDetails.length > 0 && svelteImports) {
2035
+ svelteImports.add("untrack");
2039
2036
  }
2040
- const propsObjectCode = attrGettersSetters.length > 0 ? ` const __props = {
2037
+ for (const attr of attrDetails) {
2038
+ const defaultExpr = attr.hasDefault ? ` ?? ${attr.defaultValue}` : "";
2039
+ attrStateDeclarations.push(`let __attr_${attr.key} = $state(__inputAttrs.${attr.key}${defaultExpr})`);
2040
+ attrSyncEffects.push(`$effect(() => {
2041
+ const __parentVal = __inputAttrs.${attr.key}
2042
+ const __currentVal = untrack(() => __attr_${attr.key})
2043
+ if (__parentVal !== __currentVal) {
2044
+ __attr_${attr.key} = __parentVal${defaultExpr}
2045
+ }
2046
+ })`);
2047
+ attrGettersSetters.push(`get ${attr.key}() { return __attr_${attr.key} }`);
2048
+ attrGettersSetters.push(`set ${attr.key}(v) { __attr_${attr.key} = v; __inputAttrs.${attr.key} = v }`);
2049
+ }
2050
+ const attrStateSection = attrStateDeclarations.length > 0 ? attrStateDeclarations.join(`
2051
+ `) + `
2052
+ ` : "";
2053
+ const attrEffectSection = attrSyncEffects.length > 0 ? attrSyncEffects.join(`
2054
+ `) + `
2055
+ ` : "";
2056
+ const propsObjectCode = attrGettersSetters.length > 0 ? `${attrStateSection}${attrEffectSection}const __props = {
2041
2057
  ${attrGettersSetters.join(`,
2042
2058
  `)}
2043
2059
  }` : ` const __props = __inputAttrs`;
@@ -2054,10 +2070,17 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2054
2070
  const members = parseObjectMembers(body);
2055
2071
  const derivedNames = new Set;
2056
2072
  const stateNames = new Set;
2073
+ const valueNames = new Set;
2074
+ const methodNames = new Set;
2057
2075
  for (const member of members) {
2058
2076
  const { key, value, isGetter, isMethod, isSetter } = member;
2059
2077
  if (!isGetter && !isMethod && !isSetter && value.startsWith("$state")) {
2060
2078
  stateNames.add(key);
2079
+ } else if (!isGetter && !isMethod && !isSetter) {
2080
+ valueNames.add(key);
2081
+ }
2082
+ if (isMethod) {
2083
+ methodNames.add(key);
2061
2084
  }
2062
2085
  if (isGetter && /return\s+\$derived(\.by)?\s*\(/.test(value)) {
2063
2086
  derivedNames.add(key);
@@ -2119,7 +2142,10 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2119
2142
  if (stateNames.has(name)) {
2120
2143
  return name;
2121
2144
  }
2122
- return name;
2145
+ if (valueNames.has(name)) {
2146
+ return name;
2147
+ }
2148
+ return `this.${name}`;
2123
2149
  });
2124
2150
  const asyncPrefix = isAsync ? "async " : "";
2125
2151
  const generatorPrefix = isGenerator ? "*" : "";
@@ -2144,7 +2170,9 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2144
2170
  } else if (isMethod) {
2145
2171
  returnMembers.push(`${asyncPrefix}${generatorPrefix}${outputKey}${transformedValue}`);
2146
2172
  } else {
2147
- returnMembers.push(`get ${key}() { return ${transformedValue} }`);
2173
+ stateDeclarations.push(` let ${key} = ${transformedValue}`);
2174
+ returnMembers.push(`get ${key}() { return ${key} }`);
2175
+ returnMembers.push(`set ${key}(v) { ${key} = v }`);
2148
2176
  }
2149
2177
  }
2150
2178
  const stateSection = stateDeclarations.length > 0 ? stateDeclarations.join(`
@@ -2714,9 +2742,10 @@ function transformScript(source, options = {}) {
2714
2742
  const { isComponent = false } = options;
2715
2743
  let changed = false;
2716
2744
  const neededImports = new Set;
2745
+ const svelteImports = new Set;
2717
2746
  let propsTypeDeclaration = null;
2718
2747
  if (!isComponent) {
2719
- changed = transformOriginCalls(s, source, neededImports) || changed;
2748
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2720
2749
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2721
2750
  }
2722
2751
  if (isComponent) {
@@ -2755,10 +2784,17 @@ function transformScript(source, options = {}) {
2755
2784
  `);
2756
2785
  }
2757
2786
  }
2758
- } else if (neededImports.size > 0) {
2759
- const importStatement = generateRuntimeImport([...neededImports]);
2760
- s.prepend(importStatement + `
2787
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2788
+ if (neededImports.size > 0) {
2789
+ const importStatement = generateRuntimeImport([...neededImports]);
2790
+ s.prepend(importStatement + `
2791
+ `);
2792
+ }
2793
+ if (svelteImports.size > 0) {
2794
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2795
+ s.prepend(svelteImportStatement + `
2761
2796
  `);
2797
+ }
2762
2798
  }
2763
2799
  if (!changed) {
2764
2800
  return { code: source, changed: false };
@@ -2777,9 +2813,10 @@ async function transformScriptAsync(source, options) {
2777
2813
  const { isComponent = false, schemaResolver } = options;
2778
2814
  let changed = false;
2779
2815
  const neededImports = new Set;
2816
+ const svelteImports = new Set;
2780
2817
  let propsTypeDeclaration = null;
2781
2818
  if (!isComponent) {
2782
- changed = transformOriginCalls(s, source, neededImports) || changed;
2819
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2783
2820
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2784
2821
  }
2785
2822
  if (isComponent) {
@@ -2818,10 +2855,17 @@ async function transformScriptAsync(source, options) {
2818
2855
  `);
2819
2856
  }
2820
2857
  }
2821
- } else if (neededImports.size > 0) {
2822
- const importStatement = generateRuntimeImport([...neededImports]);
2823
- s.prepend(importStatement + `
2858
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2859
+ if (neededImports.size > 0) {
2860
+ const importStatement = generateRuntimeImport([...neededImports]);
2861
+ s.prepend(importStatement + `
2862
+ `);
2863
+ }
2864
+ if (svelteImports.size > 0) {
2865
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2866
+ s.prepend(svelteImportStatement + `
2824
2867
  `);
2868
+ }
2825
2869
  }
2826
2870
  if (!changed) {
2827
2871
  return { code: source, changed: false };
@@ -2840,9 +2884,10 @@ async function transformScriptContent(source, options) {
2840
2884
  const { isComponent = false, schemaResolver } = options;
2841
2885
  let changed = false;
2842
2886
  const neededImports = new Set;
2887
+ const svelteImports = new Set;
2843
2888
  let propsTypeDeclaration = null;
2844
2889
  if (!isComponent) {
2845
- changed = transformOriginCalls(s, source, neededImports) || changed;
2890
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2846
2891
  }
2847
2892
  if (isComponent) {
2848
2893
  const result = await transformAttrsOriginCalls(s, source, neededImports, schemaResolver);
@@ -2855,11 +2900,22 @@ async function transformScriptContent(source, options) {
2855
2900
  if (neededImports.size > 0) {
2856
2901
  const importStatement = generateRuntimeImport([...neededImports]);
2857
2902
  s.prepend(importStatement + `
2903
+ `);
2904
+ }
2905
+ if (svelteImports.size > 0) {
2906
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2907
+ s.prepend(svelteImportStatement + `
2858
2908
  `);
2859
2909
  }
2860
2910
  if (propsTypeDeclaration) {
2861
2911
  const afterImports = findPropsInjectionPosition(source);
2862
- const offset = neededImports.size > 0 ? generateRuntimeImport([...neededImports]).length + 1 : 0;
2912
+ let offset = 0;
2913
+ if (neededImports.size > 0) {
2914
+ offset += generateRuntimeImport([...neededImports]).length + 1;
2915
+ }
2916
+ if (svelteImports.size > 0) {
2917
+ offset += `import { ${[...svelteImports].join(", ")} } from 'svelte'`.length + 1;
2918
+ }
2863
2919
  s.appendLeft(afterImports + offset, propsTypeDeclaration + `
2864
2920
  `);
2865
2921
  }
@@ -1913,7 +1913,7 @@ function parseObjectMembers(source) {
1913
1913
  }
1914
1914
 
1915
1915
  // src/transform/origin-transform.ts
1916
- function transformOriginCalls(s, source, neededImports) {
1916
+ function transformOriginCalls(s, source, neededImports, svelteImports) {
1917
1917
  const regex = /\$origin\s*\(/g;
1918
1918
  let match;
1919
1919
  let changed = false;
@@ -1929,14 +1929,14 @@ function transformOriginCalls(s, source, neededImports) {
1929
1929
  continue;
1930
1930
  }
1931
1931
  const definitionContent = source.slice(openParenIndex + 1, closeParenIndex);
1932
- const transformed = transformOriginDefinition(definitionContent);
1932
+ const transformed = transformOriginDefinition(definitionContent, svelteImports);
1933
1933
  s.overwrite(startIndex, closeParenIndex + 1, `__createOrigin(${transformed})`);
1934
1934
  neededImports.add("__createOrigin");
1935
1935
  changed = true;
1936
1936
  }
1937
1937
  return changed;
1938
1938
  }
1939
- function transformOriginDefinition(content) {
1939
+ function transformOriginDefinition(content, svelteImports) {
1940
1940
  let parents = [];
1941
1941
  let bodyContent = content.trim();
1942
1942
  let initCallback = null;
@@ -2001,7 +2001,7 @@ function transformOriginDefinition(content) {
2001
2001
  }
2002
2002
  }
2003
2003
  const attrDetails = parseAttrsSource(attrsContent);
2004
- const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName);
2004
+ const { body: createFnBody, attachments } = transformOriginBody(contentWithoutAttrs.trim(), parents, attrDetails, attrPropertyName, svelteImports);
2005
2005
  const parentsCode = parents.length > 0 ? `[${parents.join(", ")}]` : "undefined";
2006
2006
  let configCode = `{
2007
2007
  __attrSchema: ${attrSchemaCode},
@@ -2021,19 +2021,35 @@ ${createFnBody}
2021
2021
  }`;
2022
2022
  return configCode;
2023
2023
  }
2024
- function transformOriginBody(content, parents = [], attrDetails = [], propName = "props") {
2024
+ function transformOriginBody(content, parents = [], attrDetails = [], propName = "props", svelteImports) {
2025
2025
  let body = content.trim();
2026
2026
  const hasParents = parents.length > 0;
2027
+ const attrStateDeclarations = [];
2028
+ const attrSyncEffects = [];
2027
2029
  const attrGettersSetters = [];
2028
- for (const attr of attrDetails) {
2029
- if (attr.hasDefault) {
2030
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} ?? ${attr.defaultValue} }`);
2031
- } else {
2032
- attrGettersSetters.push(`get ${attr.key}() { return __inputAttrs.${attr.key} }`);
2033
- }
2034
- attrGettersSetters.push(`set ${attr.key}(v) { __inputAttrs.${attr.key} = v }`);
2030
+ if (attrDetails.length > 0 && svelteImports) {
2031
+ svelteImports.add("untrack");
2035
2032
  }
2036
- const propsObjectCode = attrGettersSetters.length > 0 ? ` const __props = {
2033
+ for (const attr of attrDetails) {
2034
+ const defaultExpr = attr.hasDefault ? ` ?? ${attr.defaultValue}` : "";
2035
+ attrStateDeclarations.push(`let __attr_${attr.key} = $state(__inputAttrs.${attr.key}${defaultExpr})`);
2036
+ attrSyncEffects.push(`$effect(() => {
2037
+ const __parentVal = __inputAttrs.${attr.key}
2038
+ const __currentVal = untrack(() => __attr_${attr.key})
2039
+ if (__parentVal !== __currentVal) {
2040
+ __attr_${attr.key} = __parentVal${defaultExpr}
2041
+ }
2042
+ })`);
2043
+ attrGettersSetters.push(`get ${attr.key}() { return __attr_${attr.key} }`);
2044
+ attrGettersSetters.push(`set ${attr.key}(v) { __attr_${attr.key} = v; __inputAttrs.${attr.key} = v }`);
2045
+ }
2046
+ const attrStateSection = attrStateDeclarations.length > 0 ? attrStateDeclarations.join(`
2047
+ `) + `
2048
+ ` : "";
2049
+ const attrEffectSection = attrSyncEffects.length > 0 ? attrSyncEffects.join(`
2050
+ `) + `
2051
+ ` : "";
2052
+ const propsObjectCode = attrGettersSetters.length > 0 ? `${attrStateSection}${attrEffectSection}const __props = {
2037
2053
  ${attrGettersSetters.join(`,
2038
2054
  `)}
2039
2055
  }` : ` const __props = __inputAttrs`;
@@ -2050,10 +2066,17 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2050
2066
  const members = parseObjectMembers(body);
2051
2067
  const derivedNames = new Set;
2052
2068
  const stateNames = new Set;
2069
+ const valueNames = new Set;
2070
+ const methodNames = new Set;
2053
2071
  for (const member of members) {
2054
2072
  const { key, value, isGetter, isMethod, isSetter } = member;
2055
2073
  if (!isGetter && !isMethod && !isSetter && value.startsWith("$state")) {
2056
2074
  stateNames.add(key);
2075
+ } else if (!isGetter && !isMethod && !isSetter) {
2076
+ valueNames.add(key);
2077
+ }
2078
+ if (isMethod) {
2079
+ methodNames.add(key);
2057
2080
  }
2058
2081
  if (isGetter && /return\s+\$derived(\.by)?\s*\(/.test(value)) {
2059
2082
  derivedNames.add(key);
@@ -2115,7 +2138,10 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2115
2138
  if (stateNames.has(name)) {
2116
2139
  return name;
2117
2140
  }
2118
- return name;
2141
+ if (valueNames.has(name)) {
2142
+ return name;
2143
+ }
2144
+ return `this.${name}`;
2119
2145
  });
2120
2146
  const asyncPrefix = isAsync ? "async " : "";
2121
2147
  const generatorPrefix = isGenerator ? "*" : "";
@@ -2140,7 +2166,9 @@ function transformOriginBody(content, parents = [], attrDetails = [], propName =
2140
2166
  } else if (isMethod) {
2141
2167
  returnMembers.push(`${asyncPrefix}${generatorPrefix}${outputKey}${transformedValue}`);
2142
2168
  } else {
2143
- returnMembers.push(`get ${key}() { return ${transformedValue} }`);
2169
+ stateDeclarations.push(` let ${key} = ${transformedValue}`);
2170
+ returnMembers.push(`get ${key}() { return ${key} }`);
2171
+ returnMembers.push(`set ${key}(v) { ${key} = v }`);
2144
2172
  }
2145
2173
  }
2146
2174
  const stateSection = stateDeclarations.length > 0 ? stateDeclarations.join(`
@@ -2710,9 +2738,10 @@ function transformScript(source, options = {}) {
2710
2738
  const { isComponent = false } = options;
2711
2739
  let changed = false;
2712
2740
  const neededImports = new Set;
2741
+ const svelteImports = new Set;
2713
2742
  let propsTypeDeclaration = null;
2714
2743
  if (!isComponent) {
2715
- changed = transformOriginCalls(s, source, neededImports) || changed;
2744
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2716
2745
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2717
2746
  }
2718
2747
  if (isComponent) {
@@ -2751,10 +2780,17 @@ function transformScript(source, options = {}) {
2751
2780
  `);
2752
2781
  }
2753
2782
  }
2754
- } else if (neededImports.size > 0) {
2755
- const importStatement = generateRuntimeImport([...neededImports]);
2756
- s.prepend(importStatement + `
2783
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2784
+ if (neededImports.size > 0) {
2785
+ const importStatement = generateRuntimeImport([...neededImports]);
2786
+ s.prepend(importStatement + `
2787
+ `);
2788
+ }
2789
+ if (svelteImports.size > 0) {
2790
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2791
+ s.prepend(svelteImportStatement + `
2757
2792
  `);
2793
+ }
2758
2794
  }
2759
2795
  if (!changed) {
2760
2796
  return { code: source, changed: false };
@@ -2773,9 +2809,10 @@ async function transformScriptAsync(source, options) {
2773
2809
  const { isComponent = false, schemaResolver } = options;
2774
2810
  let changed = false;
2775
2811
  const neededImports = new Set;
2812
+ const svelteImports = new Set;
2776
2813
  let propsTypeDeclaration = null;
2777
2814
  if (!isComponent) {
2778
- changed = transformOriginCalls(s, source, neededImports) || changed;
2815
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2779
2816
  changed = transformStandaloneAttrsCalls(s, source, neededImports) || changed;
2780
2817
  }
2781
2818
  if (isComponent) {
@@ -2814,10 +2851,17 @@ async function transformScriptAsync(source, options) {
2814
2851
  `);
2815
2852
  }
2816
2853
  }
2817
- } else if (neededImports.size > 0) {
2818
- const importStatement = generateRuntimeImport([...neededImports]);
2819
- s.prepend(importStatement + `
2854
+ } else if (neededImports.size > 0 || svelteImports.size > 0) {
2855
+ if (neededImports.size > 0) {
2856
+ const importStatement = generateRuntimeImport([...neededImports]);
2857
+ s.prepend(importStatement + `
2858
+ `);
2859
+ }
2860
+ if (svelteImports.size > 0) {
2861
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2862
+ s.prepend(svelteImportStatement + `
2820
2863
  `);
2864
+ }
2821
2865
  }
2822
2866
  if (!changed) {
2823
2867
  return { code: source, changed: false };
@@ -2836,9 +2880,10 @@ async function transformScriptContent(source, options) {
2836
2880
  const { isComponent = false, schemaResolver } = options;
2837
2881
  let changed = false;
2838
2882
  const neededImports = new Set;
2883
+ const svelteImports = new Set;
2839
2884
  let propsTypeDeclaration = null;
2840
2885
  if (!isComponent) {
2841
- changed = transformOriginCalls(s, source, neededImports) || changed;
2886
+ changed = transformOriginCalls(s, source, neededImports, svelteImports) || changed;
2842
2887
  }
2843
2888
  if (isComponent) {
2844
2889
  const result = await transformAttrsOriginCalls(s, source, neededImports, schemaResolver);
@@ -2851,11 +2896,22 @@ async function transformScriptContent(source, options) {
2851
2896
  if (neededImports.size > 0) {
2852
2897
  const importStatement = generateRuntimeImport([...neededImports]);
2853
2898
  s.prepend(importStatement + `
2899
+ `);
2900
+ }
2901
+ if (svelteImports.size > 0) {
2902
+ const svelteImportStatement = `import { ${[...svelteImports].join(", ")} } from 'svelte'`;
2903
+ s.prepend(svelteImportStatement + `
2854
2904
  `);
2855
2905
  }
2856
2906
  if (propsTypeDeclaration) {
2857
2907
  const afterImports = findPropsInjectionPosition(source);
2858
- const offset = neededImports.size > 0 ? generateRuntimeImport([...neededImports]).length + 1 : 0;
2908
+ let offset = 0;
2909
+ if (neededImports.size > 0) {
2910
+ offset += generateRuntimeImport([...neededImports]).length + 1;
2911
+ }
2912
+ if (svelteImports.size > 0) {
2913
+ offset += `import { ${[...svelteImports].join(", ")} } from 'svelte'`.length + 1;
2914
+ }
2859
2915
  s.appendLeft(afterImports + offset, propsTypeDeclaration + `
2860
2916
  `);
2861
2917
  }
@@ -48,4 +48,4 @@ export interface TransformOriginBodyResult {
48
48
  * })
49
49
  * ```
50
50
  */
51
- export declare function transformOriginCalls(s: MagicString, source: string, neededImports: Set<string>): boolean;
51
+ export declare function transformOriginCalls(s: MagicString, source: string, neededImports: Set<string>, svelteImports?: Set<string>): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-origin",
3
- "version": "1.0.0-next.14",
3
+ "version": "1.0.0-next.16",
4
4
  "description": "Compiler-assisted state and prop ergonomics for Svelte 5",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",