0x-lang 0.1.19 → 0.1.21

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.
@@ -117,6 +117,30 @@ export const COMMON_MISTAKES = {
117
117
  'img': "Use 'image \"src\"' instead of 'img'",
118
118
  'a': "Use 'link \"text\" href=\"url\"' instead of 'a'",
119
119
  };
120
+ // ── Shared type/field utilities ──────────────────────────
121
+ export function typeExprToJs(t) {
122
+ switch (t.kind) {
123
+ case 'primitive': {
124
+ const map = { int: 'number', float: 'number', str: 'string', bool: 'boolean', datetime: 'Date', date: 'Date', time: 'string' };
125
+ return map[t.name] || t.name;
126
+ }
127
+ case 'list': return `${typeExprToJs(t.itemType)}[]`;
128
+ case 'named': return t.name;
129
+ case 'nullable': return `${typeExprToJs(t.inner)} | null`;
130
+ default: return 'any';
131
+ }
132
+ }
133
+ export function getFieldDefault(t) {
134
+ if (t.kind === 'primitive') {
135
+ if (t.name === 'str')
136
+ return "''";
137
+ if (t.name === 'int' || t.name === 'float')
138
+ return '0';
139
+ if (t.name === 'bool')
140
+ return 'false';
141
+ }
142
+ return "''";
143
+ }
120
144
  export const SIZE_MAP = {
121
145
  'xs': '12px', 'sm': '14px', 'md': '16px', 'lg': '20px',
122
146
  'xl': '24px', '2xl': '32px', '3xl': '40px',
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/generators/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/generators/shared.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAI3C,0DAA0D;AAE1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI;IAC/D,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ;IAClE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU;IAChE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO;CACvD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;CAC5C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,OAAO,EAAE,MAAM;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,OAAO;CACR,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAiC,EACjC,KAAkB,EAClB,SAAoC,EACpC,OAAmC,OAAO;IAE1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;QACvC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;QAEtC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAe;YACf,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,0DAA0D;AAE1D,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,QAAkB;IAC9D,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,YAAY;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;YACjB,QAAQ,GAAG,CAAC,CAAC;YACb,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,SAAS,EAAE,sCAAsC;IACjD,WAAW,EAAE,wCAAwC;IACrD,SAAS,EAAE,iDAAiD;IAC5D,UAAU,EAAE,kCAAkC;IAC9C,UAAU,EAAE,4CAA4C;IACxD,WAAW,EAAE,6CAA6C;IAC1D,MAAM,EAAE,gDAAgD;IACxD,KAAK,EAAE,yFAAyF;IAChG,UAAU,EAAE,6CAA6C;IACzD,KAAK,EAAE,wCAAwC;IAC/C,MAAM,EAAE,0CAA0C;IAClD,KAAK,EAAE,sCAAsC;IAC7C,GAAG,EAAE,iDAAiD;CACvD,CAAC;AAEF,4DAA4D;AAE5D,MAAM,UAAU,YAAY,CAAC,CAAW;IACtC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,GAAG,GAA2B,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACvJ,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAC/B,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpD,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;QAC5B,KAAK,UAAU,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;QAC1D,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAW;IACzC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC;QACvD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,OAAO,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAA2B;IAC9C,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IACtD,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAC3C,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IACnC,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9B,wCAAwC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtC,kBAAkB;IAClB,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,qCAAqC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC3F,IAAI,KAAK,EAAE,CAAC;QACV,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC/D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3D,OAAO,QAAQ,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,mBAAmB,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/D,CAAC;IAED,uEAAuE;IACvE,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7E,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,mBAAmB,SAAS,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACnE,CAAC;IAED,+BAA+B;IAC/B,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1,6 +1,6 @@
1
1
  // 0x → Svelte 5 Code Generator
2
2
  import { SourceMapBuilder } from './source-map.js';
3
- import { SIZE_MAP, unquote, capitalize, parseGradient, addPx, getPassthroughProps, KNOWN_LAYOUT_PROPS, KNOWN_TEXT_PROPS, KNOWN_BUTTON_PROPS, KNOWN_INPUT_PROPS, KNOWN_IMAGE_PROPS, KNOWN_LINK_PROPS, KNOWN_TOGGLE_PROPS, KNOWN_SELECT_PROPS } from './shared.js';
3
+ import { SIZE_MAP, unquote, capitalize, parseGradient, addPx, getPassthroughProps, typeExprToJs, getFieldDefault, KNOWN_LAYOUT_PROPS, KNOWN_TEXT_PROPS, KNOWN_BUTTON_PROPS, KNOWN_INPUT_PROPS, KNOWN_IMAGE_PROPS, KNOWN_LINK_PROPS, KNOWN_TOGGLE_PROPS, KNOWN_SELECT_PROPS } from './shared.js';
4
4
  import { generateBackendCode } from './react.js';
5
5
  function newCtx() {
6
6
  return { states: new Map(), styles: new Map(), needsOnMount: false, extraScriptLines: [], props: [] };
@@ -11,6 +11,15 @@ export function generateSvelte(ast) {
11
11
  if (node.type === 'Page' || node.type === 'Component' || node.type === 'App') {
12
12
  parts.push(generateSvelteComponent(node));
13
13
  }
14
+ else if (node.type === 'Model') {
15
+ parts.push(genSvelteModelCode(node));
16
+ }
17
+ else if (node.type === 'AuthDecl') {
18
+ parts.push(genSvelteAuthCode(node));
19
+ }
20
+ else if (node.type === 'RouteDecl') {
21
+ parts.push(genSvelteRouteCode(node));
22
+ }
14
23
  else {
15
24
  const backend = generateBackendCode(node);
16
25
  if (backend)
@@ -103,14 +112,23 @@ function generateSvelteComponent(node) {
103
112
  scriptLines.push(`${tlv.keyword} ${tlv.name} = ${genExpr(tlv.value, c)};`);
104
113
  break;
105
114
  }
115
+ case 'StoreDecl':
116
+ scriptLines.push(genSvelteStore(child, c));
117
+ break;
118
+ case 'DataDecl':
119
+ scriptLines.push(genSvelteDataDecl(child, c));
120
+ break;
121
+ case 'FormDecl':
122
+ scriptLines.push(genSvelteFormDecl(child, c));
123
+ break;
124
+ case 'RealtimeDecl':
125
+ scriptLines.push(genSvelteRealtimeDecl(child, c));
126
+ break;
106
127
  case 'TypeDecl':
107
128
  case 'StyleDecl':
108
129
  case 'Comment':
109
130
  case 'Model':
110
- case 'DataDecl':
111
- case 'FormDecl':
112
131
  case 'AuthDecl':
113
- case 'RealtimeDecl':
114
132
  case 'RouteDecl': break;
115
133
  default:
116
134
  templateParts.push(genUINode(child, c));
@@ -941,4 +959,297 @@ function exprHasAwait(e) {
941
959
  default: return false;
942
960
  }
943
961
  }
962
+ // ── Phase 2: Store (localStorage persistence) ───────
963
+ function genSvelteStore(node, c) {
964
+ const init = genExpr(node.initial, c);
965
+ const lines = [
966
+ `let ${node.name} = $state(JSON.parse(localStorage.getItem('${node.name}') ?? 'null') ?? ${init});`,
967
+ `$effect(() => { localStorage.setItem('${node.name}', JSON.stringify(${node.name})); });`,
968
+ ];
969
+ c.states.set(node.name, node);
970
+ return lines.join('\n');
971
+ }
972
+ // ── Phase 2: Data Fetching ──────────────────────────
973
+ function genSvelteDataDecl(node, c) {
974
+ c.needsOnMount = true;
975
+ const query = genExpr(node.query, c);
976
+ const lines = [];
977
+ lines.push(`let ${node.name} = $state([]);`);
978
+ lines.push(`let ${node.name}Loading = $state(true);`);
979
+ lines.push(`let ${node.name}Error = $state(null);`);
980
+ lines.push(`onMount(async () => {`);
981
+ lines.push(` try {`);
982
+ lines.push(` ${node.name} = await ${query};`);
983
+ lines.push(` ${node.name}Error = null;`);
984
+ lines.push(` } catch (e) {`);
985
+ lines.push(` ${node.name}Error = e.message;`);
986
+ lines.push(` } finally {`);
987
+ lines.push(` ${node.name}Loading = false;`);
988
+ lines.push(` }`);
989
+ lines.push(`});`);
990
+ c.states.set(node.name, { type: 'StateDecl', name: node.name, valueType: { kind: 'primitive', name: 'any' }, initial: { kind: 'array', elements: [] }, loc: node.loc });
991
+ return lines.join('\n');
992
+ }
993
+ // ── Phase 2: Form ───────────────────────────────────
994
+ function genSvelteFormDecl(node, c) {
995
+ const lines = [];
996
+ const initialValues = node.fields.map(f => `${f.name}: ${getFieldDefault(f.fieldType)}`).join(', ');
997
+ lines.push(`let ${node.name} = $state({ ${initialValues} });`);
998
+ lines.push(`let ${node.name}Errors = $state({});`);
999
+ lines.push(`let ${node.name}Submitting = $state(false);`);
1000
+ lines.push(`function update${capitalize(node.name)}(field, value) {`);
1001
+ lines.push(` ${node.name}[field] = value;`);
1002
+ lines.push(` ${node.name}Errors[field] = null;`);
1003
+ lines.push(`}`);
1004
+ lines.push(`function validate${capitalize(node.name)}() {`);
1005
+ lines.push(` const errors = {};`);
1006
+ for (const f of node.fields) {
1007
+ for (const v of f.validations) {
1008
+ switch (v.rule) {
1009
+ case 'required':
1010
+ lines.push(` if (!${node.name}.${f.name}) errors.${f.name} = '${v.message}';`);
1011
+ break;
1012
+ case 'min':
1013
+ lines.push(` if (${node.name}.${f.name}.length < ${genExprStandalone(v.value)}) errors.${f.name} = '${v.message}';`);
1014
+ break;
1015
+ case 'max':
1016
+ lines.push(` if (${node.name}.${f.name}.length > ${genExprStandalone(v.value)}) errors.${f.name} = '${v.message}';`);
1017
+ break;
1018
+ case 'format':
1019
+ if (v.value?.kind === 'string' && v.value.value === 'email') {
1020
+ lines.push(` if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(${node.name}.${f.name})) errors.${f.name} = '${v.message}';`);
1021
+ }
1022
+ break;
1023
+ case 'pattern':
1024
+ if (v.value?.kind === 'string') {
1025
+ lines.push(` if (!/${v.value.value}/.test(${node.name}.${f.name})) errors.${f.name} = '${v.message}';`);
1026
+ }
1027
+ break;
1028
+ }
1029
+ }
1030
+ }
1031
+ lines.push(` ${node.name}Errors = errors;`);
1032
+ lines.push(` return Object.keys(errors).length === 0;`);
1033
+ lines.push(`}`);
1034
+ if (node.submit) {
1035
+ const action = genExpr(node.submit.action, c);
1036
+ lines.push(`async function submit${capitalize(node.name)}() {`);
1037
+ lines.push(` if (!validate${capitalize(node.name)}()) return;`);
1038
+ lines.push(` ${node.name}Submitting = true;`);
1039
+ lines.push(` try {`);
1040
+ lines.push(` await ${action};`);
1041
+ if (node.submit.success) {
1042
+ lines.push(` ${genExpr(node.submit.success, c)};`);
1043
+ }
1044
+ lines.push(` } catch (e) {`);
1045
+ if (node.submit.error) {
1046
+ lines.push(` ${genExpr(node.submit.error, c)};`);
1047
+ }
1048
+ lines.push(` } finally {`);
1049
+ lines.push(` ${node.name}Submitting = false;`);
1050
+ lines.push(` }`);
1051
+ lines.push(`}`);
1052
+ }
1053
+ return lines.join('\n');
1054
+ }
1055
+ // ── Phase 2: Realtime (WebSocket) ───────────────────
1056
+ function genSvelteRealtimeDecl(node, c) {
1057
+ c.needsOnMount = true;
1058
+ const channel = genExpr(node.channel, c);
1059
+ const lines = [];
1060
+ lines.push(`let ${node.name} = $state([]);`);
1061
+ lines.push(`let ${node.name}Ws = null;`);
1062
+ lines.push(`onMount(() => {`);
1063
+ lines.push(` const ws = new WebSocket(${channel});`);
1064
+ lines.push(` ${node.name}Ws = ws;`);
1065
+ for (const handler of node.handlers) {
1066
+ if (handler.event === 'message') {
1067
+ lines.push(` ws.onmessage = (event) => {`);
1068
+ lines.push(` const message = JSON.parse(event.data);`);
1069
+ const body = handler.body.map(s => genStmt(s, c)).join('\n ');
1070
+ lines.push(` ${body}`);
1071
+ lines.push(` };`);
1072
+ }
1073
+ else if (handler.event === 'error') {
1074
+ lines.push(` ws.onerror = (event) => {`);
1075
+ const body = handler.body.map(s => genStmt(s, c)).join('\n ');
1076
+ lines.push(` ${body}`);
1077
+ lines.push(` };`);
1078
+ }
1079
+ else if (handler.event === 'open') {
1080
+ lines.push(` ws.onopen = () => {`);
1081
+ const body = handler.body.map(s => genStmt(s, c)).join('\n ');
1082
+ lines.push(` ${body}`);
1083
+ lines.push(` };`);
1084
+ }
1085
+ else if (handler.event === 'close') {
1086
+ lines.push(` ws.onclose = () => {`);
1087
+ const body = handler.body.map(s => genStmt(s, c)).join('\n ');
1088
+ lines.push(` ${body}`);
1089
+ lines.push(` };`);
1090
+ }
1091
+ }
1092
+ lines.push(` return () => { ws.close(); };`);
1093
+ lines.push(`});`);
1094
+ c.states.set(node.name, { type: 'StateDecl', name: node.name, valueType: { kind: 'list', itemType: { kind: 'primitive', name: 'any' } }, initial: { kind: 'array', elements: [] }, loc: node.loc });
1095
+ return lines.join('\n');
1096
+ }
1097
+ // ── Phase 2: Auth (Svelte context) ──────────────────
1098
+ function genSvelteAuthCode(node) {
1099
+ const lines = [
1100
+ `// Generated by 0x — Svelte Auth: ${node.provider}`,
1101
+ `<script>`,
1102
+ ` import { setContext, getContext } from 'svelte';`,
1103
+ '',
1104
+ ` const AUTH_KEY = Symbol('auth');`,
1105
+ '',
1106
+ ` export function createAuth() {`,
1107
+ ` let user = $state(null);`,
1108
+ ` let loading = $state(false);`,
1109
+ ` let error = $state(null);`,
1110
+ '',
1111
+ ];
1112
+ if (node.loginFields.length > 0) {
1113
+ const params = node.loginFields.join(', ');
1114
+ lines.push(` async function login(${params}) {`);
1115
+ lines.push(` loading = true; error = null;`);
1116
+ lines.push(` try {`);
1117
+ lines.push(` const res = await fetch('/api/auth/login', {`);
1118
+ lines.push(` method: 'POST',`);
1119
+ lines.push(` headers: { 'Content-Type': 'application/json' },`);
1120
+ lines.push(` body: JSON.stringify({ ${params} }),`);
1121
+ lines.push(` });`);
1122
+ lines.push(` const data = await res.json();`);
1123
+ lines.push(` if (!res.ok) throw new Error(data.message || 'Login failed');`);
1124
+ lines.push(` user = data.user;`);
1125
+ lines.push(` return data;`);
1126
+ lines.push(` } catch (e) { error = e.message; throw e; }`);
1127
+ lines.push(` finally { loading = false; }`);
1128
+ lines.push(` }`);
1129
+ lines.push('');
1130
+ }
1131
+ if (node.signupFields.length > 0) {
1132
+ const params = node.signupFields.join(', ');
1133
+ lines.push(` async function signup(${params}) {`);
1134
+ lines.push(` loading = true; error = null;`);
1135
+ lines.push(` try {`);
1136
+ lines.push(` const res = await fetch('/api/auth/signup', {`);
1137
+ lines.push(` method: 'POST',`);
1138
+ lines.push(` headers: { 'Content-Type': 'application/json' },`);
1139
+ lines.push(` body: JSON.stringify({ ${params} }),`);
1140
+ lines.push(` });`);
1141
+ lines.push(` const data = await res.json();`);
1142
+ lines.push(` if (!res.ok) throw new Error(data.message || 'Sign up failed');`);
1143
+ lines.push(` user = data.user;`);
1144
+ lines.push(` return data;`);
1145
+ lines.push(` } catch (e) { error = e.message; throw e; }`);
1146
+ lines.push(` finally { loading = false; }`);
1147
+ lines.push(` }`);
1148
+ lines.push('');
1149
+ }
1150
+ lines.push(` async function logout() {`);
1151
+ lines.push(` await fetch('/api/auth/logout', { method: 'POST' });`);
1152
+ lines.push(` user = null;`);
1153
+ lines.push(` }`);
1154
+ lines.push('');
1155
+ lines.push(` const auth = {`);
1156
+ lines.push(` get user() { return user; },`);
1157
+ lines.push(` get loading() { return loading; },`);
1158
+ lines.push(` get error() { return error; },`);
1159
+ lines.push(` login, signup, logout,`);
1160
+ lines.push(` };`);
1161
+ lines.push(` setContext(AUTH_KEY, auth);`);
1162
+ lines.push(` return auth;`);
1163
+ lines.push(` }`);
1164
+ lines.push('');
1165
+ lines.push(` export function useAuth() {`);
1166
+ lines.push(` return getContext(AUTH_KEY);`);
1167
+ lines.push(` }`);
1168
+ lines.push(`</script>`);
1169
+ return lines.join('\n');
1170
+ }
1171
+ // ── Phase 2: Route (SvelteKit-compatible config) ────
1172
+ function genSvelteRouteCode(node) {
1173
+ const lines = [];
1174
+ lines.push(`// Route: ${node.path} -> ${node.target}`);
1175
+ if (node.guard) {
1176
+ lines.push(`// Guard: ${node.guard}`);
1177
+ lines.push(`// SvelteKit: create src/routes${node.path}/+page.svelte with ${node.target} component`);
1178
+ lines.push(`// Add load guard in +page.server.js`);
1179
+ }
1180
+ else {
1181
+ lines.push(`// SvelteKit: create src/routes${node.path}/+page.svelte with ${node.target} component`);
1182
+ }
1183
+ return lines.join('\n');
1184
+ }
1185
+ // ── Phase 2: Model (CRUD API + Svelte stores) ───────
1186
+ function genSvelteModelCode(node) {
1187
+ const name = node.name;
1188
+ const lower = name.toLowerCase();
1189
+ const lines = [
1190
+ `// Generated by 0x — Svelte Model: ${name}`,
1191
+ '',
1192
+ ];
1193
+ // JSDoc type
1194
+ lines.push(`/** @typedef {Object} ${name}`);
1195
+ for (const f of node.fields) {
1196
+ lines.push(` * @property {${typeExprToJs(f.fieldType)}} ${f.name}`);
1197
+ }
1198
+ lines.push(' */');
1199
+ lines.push('');
1200
+ // CRUD API (framework-agnostic)
1201
+ lines.push(`const ${name}API = {`);
1202
+ lines.push(` findAll: async (params = {}) => {`);
1203
+ lines.push(` const query = new URLSearchParams(params).toString();`);
1204
+ lines.push(` const res = await fetch(\`/api/${lower}s\${query ? '?' + query : ''}\`);`);
1205
+ lines.push(` return res.json();`);
1206
+ lines.push(` },`);
1207
+ lines.push(` findById: async (id) => {`);
1208
+ lines.push(` const res = await fetch(\`/api/${lower}s/\${id}\`);`);
1209
+ lines.push(` return res.json();`);
1210
+ lines.push(` },`);
1211
+ lines.push(` create: async (data) => {`);
1212
+ lines.push(` const res = await fetch('/api/${lower}s', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) });`);
1213
+ lines.push(` return res.json();`);
1214
+ lines.push(` },`);
1215
+ lines.push(` update: async (id, data) => {`);
1216
+ lines.push(` const res = await fetch(\`/api/${lower}s/\${id}\`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) });`);
1217
+ lines.push(` return res.json();`);
1218
+ lines.push(` },`);
1219
+ lines.push(` delete: async (id) => {`);
1220
+ lines.push(` const res = await fetch(\`/api/${lower}s/\${id}\`, { method: 'DELETE' });`);
1221
+ lines.push(` return res.json();`);
1222
+ lines.push(` },`);
1223
+ lines.push(`};`);
1224
+ lines.push('');
1225
+ // Svelte store-like functions using $state
1226
+ lines.push(`function create${name}Store(params = {}) {`);
1227
+ lines.push(` let data = $state([]);`);
1228
+ lines.push(` let loading = $state(true);`);
1229
+ lines.push(` let error = $state(null);`);
1230
+ lines.push(` async function fetch${name}s() {`);
1231
+ lines.push(` loading = true;`);
1232
+ lines.push(` try {`);
1233
+ lines.push(` data = await ${name}API.findAll(params);`);
1234
+ lines.push(` error = null;`);
1235
+ lines.push(` } catch (e) {`);
1236
+ lines.push(` error = e.message;`);
1237
+ lines.push(` } finally {`);
1238
+ lines.push(` loading = false;`);
1239
+ lines.push(` }`);
1240
+ lines.push(` }`);
1241
+ lines.push(` return {`);
1242
+ lines.push(` get data() { return data; },`);
1243
+ lines.push(` get loading() { return loading; },`);
1244
+ lines.push(` get error() { return error; },`);
1245
+ lines.push(` refetch: fetch${name}s,`);
1246
+ lines.push(` };`);
1247
+ lines.push(`}`);
1248
+ return lines.join('\n');
1249
+ }
1250
+ // ── Standalone expression helper ────────────────────
1251
+ function genExprStandalone(expr) {
1252
+ const c = newCtx();
1253
+ return genExpr(expr, c);
1254
+ }
944
1255
  //# sourceMappingURL=svelte.js.map