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.
- package/README.md +48 -1
- package/dist/generators/react.js +3 -24
- package/dist/generators/react.js.map +1 -1
- package/dist/generators/shared.d.ts +3 -1
- package/dist/generators/shared.js +24 -0
- package/dist/generators/shared.js.map +1 -1
- package/dist/generators/svelte.js +315 -4
- package/dist/generators/svelte.js.map +1 -1
- package/dist/generators/vue.js +356 -4
- package/dist/generators/vue.js.map +1 -1
- package/dist/lsp/completion.d.ts +2 -0
- package/dist/lsp/completion.js +141 -0
- package/dist/lsp/completion.js.map +1 -0
- package/dist/lsp/definition.d.ts +2 -0
- package/dist/lsp/definition.js +74 -0
- package/dist/lsp/definition.js.map +1 -0
- package/dist/lsp/diagnostics.d.ts +2 -0
- package/dist/lsp/diagnostics.js +68 -0
- package/dist/lsp/diagnostics.js.map +1 -0
- package/dist/lsp/hover.d.ts +2 -0
- package/dist/lsp/hover.js +153 -0
- package/dist/lsp/hover.js.map +1 -0
- package/dist/lsp/server.d.ts +1 -0
- package/dist/lsp/server.js +70 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/symbols.d.ts +2 -0
- package/dist/lsp/symbols.js +74 -0
- package/dist/lsp/symbols.js.map +1 -0
- package/dist/react/admin.jsx +114 -0
- package/dist/react/blog.jsx +80 -0
- package/dist/react/crm.jsx +98 -0
- package/dist/react/kanban.jsx +93 -0
- package/dist/react/saas-landing.jsx +91 -0
- package/package.json +3 -1
|
@@ -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
|