@vesk/compiler 0.1.1 → 0.1.14

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/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { parse, createBaseParser } from '@vesk/compiler/src/parser';
2
2
  export { VeskParserPlugin } from '@vesk/compiler/src/vesk-plugin';
3
3
  export { generateIR } from '@vesk/compiler/src/ir-generator';
4
4
  export { render } from '@vesk/compiler/src/server-codegen';
5
+ export { AMBIENT, RUNTIME_OVERRIDE } from '@vesk/compiler/src/typecheck';
5
6
  export { compileClient, compile } from '@vesk/compiler/src/client-codegen';
6
7
  export { IRRoot, ComponentIR, StaticNode, TextNode, DynamicBinding, OpaqueDynamicRegion, MapRegion, ComponentCall, Expression, } from '@vesk/compiler/src/ir';
7
8
  export type { IRNode } from '@vesk/compiler/src/ir';
@@ -13,4 +14,6 @@ export type { VeskCors } from '@vesk/compiler/src/types';
13
14
  export type { VeskRateLimit } from '@vesk/compiler/src/types';
14
15
  export { defineConfig, validateConfig, preset, definePlugin } from '@vesk/compiler/src/config';
15
16
  export { scanRoutes, scanComponents, collectSources, matchUrl } from '@vesk/compiler/src/router';
17
+ export { compileVskCodegen } from '@vesk/compiler/src/vsk-tsx';
18
+ export type { CodeInfo, CodeMapping, StyleRegion, VskCodegenError, VskCodegenOptions, VskCodegenResult, } from '@vesk/compiler/src/vsk-tsx';
16
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -2,7 +2,9 @@ export { parse, createBaseParser } from '@vesk/compiler/src/parser';
2
2
  export { VeskParserPlugin } from '@vesk/compiler/src/vesk-plugin';
3
3
  export { generateIR } from '@vesk/compiler/src/ir-generator';
4
4
  export { render } from '@vesk/compiler/src/server-codegen';
5
+ export { AMBIENT, RUNTIME_OVERRIDE } from '@vesk/compiler/src/typecheck';
5
6
  export { compileClient, compile } from '@vesk/compiler/src/client-codegen';
6
7
  export { IRRoot, ComponentIR, StaticNode, TextNode, DynamicBinding, OpaqueDynamicRegion, MapRegion, ComponentCall, Expression, } from '@vesk/compiler/src/ir';
7
8
  export { defineConfig, validateConfig, preset, definePlugin } from '@vesk/compiler/src/config';
8
9
  export { scanRoutes, scanComponents, collectSources, matchUrl } from '@vesk/compiler/src/router';
10
+ export { compileVskCodegen } from '@vesk/compiler/src/vsk-tsx';
@@ -1 +1 @@
1
- {"version":3,"file":"server-jsgen.d.ts","sourceRoot":"","sources":["../src/server-jsgen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAOzE,OAAO,EAA4E,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAU/I,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,GAAE,OAAe,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CA8CjJ;AA4SD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAkD1F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAwBhG"}
1
+ {"version":3,"file":"server-jsgen.d.ts","sourceRoot":"","sources":["../src/server-jsgen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAOzE,OAAO,EAA4E,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAU/I,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,GAAE,OAAe,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CA8CjJ;AA4SD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAmD1F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAwBhG"}
@@ -383,8 +383,9 @@ export function generateFunctionBody(comp, importedNames) {
383
383
  lines.push(`const __tk = globalThis.__vsk_ssr_token || '';`);
384
384
  if (asyncMode) {
385
385
  lines.push(`const __pk = __tk ? '__vsk_ssr_promises_' + __tk : '__vsk_ssr_promises';`);
386
+ lines.push(`let __out = [];`);
386
387
  lines.push(`for (let __pass = 0; __pass < 3; __pass++) {`);
387
- lines.push(`const __out = [];`);
388
+ lines.push(`__out = [];`);
388
389
  lines.push(`const __start = (globalThis[__pk] || []).length;`);
389
390
  }
390
391
  else {
@@ -407,7 +408,7 @@ export function generateFunctionBody(comp, importedNames) {
407
408
  lines.push(`globalThis[__pk] = __all.slice(0, __start);`);
408
409
  lines.push(`await Promise.allSettled(__ps);`);
409
410
  lines.push(`}`);
410
- lines.push(`return '';`);
411
+ lines.push(`return __out.join('');`);
411
412
  }
412
413
  else {
413
414
  lines.push(`return __out.join('');`);
@@ -1 +1 @@
1
- {"version":3,"file":"server-render.d.ts","sourceRoot":"","sources":["../src/server-render.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAqB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAcvJ,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAEhG;AA0BD,wBAAgB,MAAM,CACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC1B;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiE9C;AAYD,wBAAsB,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAO,GAC9G,OAAO,CAAC,SAAS,CAAC,CA8DpB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EACpD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACnC,MAAM,EAAE,CAuBV;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAoEjB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAAC,MAAM,CAAC,CAkFxB"}
1
+ {"version":3,"file":"server-render.d.ts","sourceRoot":"","sources":["../src/server-render.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAqB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAcvJ,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAEhG;AA0BD,wBAAgB,MAAM,CACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC1B;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiE9C;AAcD,wBAAsB,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAO,GAC9G,OAAO,CAAC,SAAS,CAAC,CA8DpB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EACpD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACnC,MAAM,EAAE,CAuBV;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAoEjB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,EAC3C,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAAC,MAAM,CAAC,CAkFxB"}
@@ -148,6 +148,8 @@ function clearSsrCells(token) {
148
148
  if (!token)
149
149
  return;
150
150
  delete globalThis[`__vsk_ssr_promises_${token}`];
151
+ delete globalThis[`__vsk_ssr_failures_${token}`];
152
+ delete globalThis.__vsk_ssr_token;
151
153
  const cells = globalThis.__vsk_ssr_cells;
152
154
  if (!cells || !(cells instanceof Map))
153
155
  return;
@@ -1,4 +1,4 @@
1
- import { type SsrDataSink } from '@vesk/runtime/src/index-server';
1
+ import type { SsrDataSink } from '@vesk/runtime/src/resource';
2
2
  export declare function withSsrStore<T>(fn: () => T): T;
3
3
  export declare const ssrSink: SsrDataSink;
4
4
  //# sourceMappingURL=ssr-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssr-store.d.ts","sourceRoot":"","sources":["../src/ssr-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAI9E,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAI9C;AAED,eAAO,MAAM,OAAO,EAAE,WAgBrB,CAAC"}
1
+ {"version":3,"file":"ssr-store.d.ts","sourceRoot":"","sources":["../src/ssr-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAI9D,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAI9C;AAED,eAAO,MAAM,OAAO,EAAE,WAgBrB,CAAC"}
package/dist/ssr-store.js CHANGED
@@ -1,4 +1,7 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
+ // Import the type from its defining module (not the barrel): on a fresh
3
+ // checkout the compiler typechecks BEFORE @vesk/runtime's dist exists, and
4
+ // resolving types through the barrel then fails.
2
5
  import { setSsrSink } from '@vesk/runtime/src/index-server';
3
6
  const storage = new AsyncLocalStorage();
4
7
  export function withSsrStore(fn) {
@@ -9,6 +9,8 @@ export interface TypecheckError {
9
9
  code: string;
10
10
  message: string;
11
11
  }
12
+ export declare const AMBIENT = "\ndeclare namespace JSX {\n type VeskEventHandler<E extends Event = Event> = (event: E) => void;\n interface VeskCommonAttributes {\n key?: string | number;\n class?: string;\n id?: string;\n style?: string;\n title?: string;\n hidden?: boolean | string;\n lang?: string;\n dir?: 'ltr' | 'rtl' | 'auto';\n tabIndex?: number;\n role?: string;\n }\n interface VeskEventAttributes {\n onClick?: VeskEventHandler<MouseEvent>;\n onDblClick?: VeskEventHandler<MouseEvent>;\n onMouseDown?: VeskEventHandler<MouseEvent>;\n onMouseUp?: VeskEventHandler<MouseEvent>;\n onMouseEnter?: VeskEventHandler<MouseEvent>;\n onMouseLeave?: VeskEventHandler<MouseEvent>;\n onMouseMove?: VeskEventHandler<MouseEvent>;\n onKeyDown?: VeskEventHandler<KeyboardEvent>;\n onKeyUp?: VeskEventHandler<KeyboardEvent>;\n onFocus?: VeskEventHandler<FocusEvent>;\n onBlur?: VeskEventHandler<FocusEvent>;\n onInput?: VeskEventHandler<InputEvent>;\n onChange?: VeskEventHandler<Event>;\n onSubmit?: VeskEventHandler<SubmitEvent>;\n onScroll?: VeskEventHandler<UIEvent>;\n onWheel?: VeskEventHandler<WheelEvent>;\n // Lowercase aliases \u2014 HTML attribute names are case-insensitive and real\n // code writes onclick=/oninput=. Keep in sync with the camelCase members.\n onclick?: VeskEventHandler<MouseEvent>;\n ondblclick?: VeskEventHandler<MouseEvent>;\n onmousedown?: VeskEventHandler<MouseEvent>;\n onmouseup?: VeskEventHandler<MouseEvent>;\n onmouseenter?: VeskEventHandler<MouseEvent>;\n onmouseleave?: VeskEventHandler<MouseEvent>;\n onmousemove?: VeskEventHandler<MouseEvent>;\n onkeydown?: VeskEventHandler<KeyboardEvent>;\n onkeyup?: VeskEventHandler<KeyboardEvent>;\n onfocus?: VeskEventHandler<FocusEvent>;\n onblur?: VeskEventHandler<FocusEvent>;\n oninput?: VeskEventHandler<InputEvent>;\n onchange?: VeskEventHandler<Event>;\n onsubmit?: VeskEventHandler<SubmitEvent>;\n }\n interface VeskGlobalAttributes extends VeskCommonAttributes, VeskEventAttributes {\n children?: unknown;\n }\n interface VeskAnchorAttributes extends VeskGlobalAttributes {\n href?: string;\n target?: string;\n rel?: string;\n download?: string | boolean;\n type?: string;\n hreflang?: string;\n }\n interface VeskMediaAttributes extends VeskGlobalAttributes {\n src?: string;\n width?: string | number;\n height?: string | number;\n }\n interface VeskInputAttributes extends VeskGlobalAttributes {\n type?: string;\n name?: string;\n value?: string | number | readonly string[];\n placeholder?: string;\n checked?: boolean | string;\n disabled?: boolean | string;\n readOnly?: boolean | string;\n required?: boolean | string;\n min?: string | number;\n max?: string | number;\n step?: string | number;\n pattern?: string;\n autoComplete?: string;\n autoFocus?: boolean | string;\n multiple?: boolean | string;\n accept?: string;\n size?: number;\n list?: string;\n }\n interface IntrinsicElements {\n html?: VeskGlobalAttributes & { manifest?: string };\n head?: VeskGlobalAttributes;\n body?: VeskGlobalAttributes;\n div?: VeskGlobalAttributes;\n span?: VeskGlobalAttributes;\n p?: VeskGlobalAttributes;\n h1?: VeskGlobalAttributes;\n h2?: VeskGlobalAttributes;\n h3?: VeskGlobalAttributes;\n h4?: VeskGlobalAttributes;\n h5?: VeskGlobalAttributes;\n h6?: VeskGlobalAttributes;\n a?: VeskAnchorAttributes;\n nav?: VeskGlobalAttributes;\n header?: VeskGlobalAttributes;\n footer?: VeskGlobalAttributes;\n main?: VeskGlobalAttributes;\n section?: VeskGlobalAttributes;\n article?: VeskGlobalAttributes;\n aside?: VeskGlobalAttributes;\n button?: VeskGlobalAttributes & {\n type?: 'button' | 'submit' | 'reset';\n disabled?: boolean | string;\n name?: string;\n value?: string | number;\n };\n form?: VeskGlobalAttributes & {\n action?: string;\n method?: 'get' | 'post';\n target?: string;\n encType?: string;\n noValidate?: boolean | string;\n name?: string;\n autoComplete?: string;\n };\n input?: VeskInputAttributes;\n textarea?: VeskGlobalAttributes & {\n rows?: number;\n cols?: number;\n placeholder?: string;\n value?: string | number;\n disabled?: boolean | string;\n readOnly?: boolean | string;\n required?: boolean | string;\n name?: string;\n };\n select?: VeskGlobalAttributes & {\n name?: string;\n value?: string | number | readonly string[];\n disabled?: boolean | string;\n required?: boolean | string;\n multiple?: boolean | string;\n size?: number;\n autoComplete?: string;\n };\n option?: VeskGlobalAttributes & {\n value?: string | number;\n selected?: boolean | string;\n disabled?: boolean | string;\n label?: string;\n };\n optgroup?: VeskGlobalAttributes & { label?: string; disabled?: boolean | string };\n label?: VeskGlobalAttributes & { htmlFor?: string };\n fieldset?: VeskGlobalAttributes & { disabled?: boolean | string; name?: string; form?: string };\n legend?: VeskGlobalAttributes;\n datalist?: VeskGlobalAttributes;\n img?: VeskGlobalAttributes & {\n src?: string;\n alt?: string;\n width?: string | number;\n height?: string | number;\n srcSet?: string;\n sizes?: string;\n loading?: 'eager' | 'lazy';\n decoding?: 'sync' | 'async' | 'auto';\n };\n picture?: VeskGlobalAttributes;\n source?: VeskGlobalAttributes & { src?: string; srcSet?: string; sizes?: string; media?: string; type?: string };\n video?: VeskMediaAttributes & {\n controls?: boolean | string;\n autoPlay?: boolean | string;\n loop?: boolean | string;\n muted?: boolean | string;\n preload?: 'none' | 'metadata' | 'auto' | '';\n poster?: string;\n playsInline?: boolean | string;\n };\n audio?: VeskGlobalAttributes & {\n src?: string;\n controls?: boolean | string;\n autoPlay?: boolean | string;\n loop?: boolean | string;\n muted?: boolean | string;\n preload?: 'none' | 'metadata' | 'auto' | '';\n };\n track?: VeskGlobalAttributes & {\n src?: string;\n kind?: string;\n srclang?: string;\n label?: string;\n default?: boolean | string;\n };\n canvas?: VeskGlobalAttributes & { width?: number; height?: number };\n iframe?: VeskGlobalAttributes & {\n src?: string;\n srcDoc?: string;\n width?: string | number;\n height?: string | number;\n allow?: string;\n loading?: 'eager' | 'lazy';\n sandbox?: string;\n allowFullScreen?: boolean | string;\n referrerPolicy?: string;\n };\n embed?: VeskGlobalAttributes & { src?: string; type?: string; width?: string | number; height?: string | number };\n object?: VeskGlobalAttributes & { data?: string; type?: string; name?: string; width?: string | number; height?: string | number };\n table?: VeskGlobalAttributes;\n caption?: VeskGlobalAttributes;\n thead?: VeskGlobalAttributes;\n tbody?: VeskGlobalAttributes;\n tfoot?: VeskGlobalAttributes;\n tr?: VeskGlobalAttributes;\n th?: VeskGlobalAttributes & { colSpan?: number; rowSpan?: number; scope?: string; headers?: string };\n td?: VeskGlobalAttributes & { colSpan?: number; rowSpan?: number; headers?: string };\n col?: VeskGlobalAttributes & { span?: number };\n colgroup?: VeskGlobalAttributes & { span?: number };\n ul?: VeskGlobalAttributes;\n ol?: VeskGlobalAttributes & { start?: number; reversed?: boolean | string; type?: string };\n li?: VeskGlobalAttributes & { value?: number };\n dl?: VeskGlobalAttributes;\n dt?: VeskGlobalAttributes;\n dd?: VeskGlobalAttributes;\n br?: VeskGlobalAttributes;\n hr?: VeskGlobalAttributes;\n pre?: VeskGlobalAttributes;\n code?: VeskGlobalAttributes;\n blockquote?: VeskGlobalAttributes & { cite?: string };\n q?: VeskGlobalAttributes & { cite?: string };\n strong?: VeskGlobalAttributes;\n em?: VeskGlobalAttributes;\n small?: VeskGlobalAttributes;\n s?: VeskGlobalAttributes;\n cite?: VeskGlobalAttributes;\n dfn?: VeskGlobalAttributes;\n abbr?: VeskGlobalAttributes & { title?: string };\n time?: VeskGlobalAttributes & { dateTime?: string };\n data?: VeskGlobalAttributes & { value?: string | number };\n mark?: VeskGlobalAttributes;\n del?: VeskGlobalAttributes & { cite?: string; dateTime?: string };\n ins?: VeskGlobalAttributes & { cite?: string; dateTime?: string };\n sub?: VeskGlobalAttributes;\n sup?: VeskGlobalAttributes;\n u?: VeskGlobalAttributes;\n kbd?: VeskGlobalAttributes;\n samp?: VeskGlobalAttributes;\n var?: VeskGlobalAttributes;\n figure?: VeskGlobalAttributes;\n figcaption?: VeskGlobalAttributes;\n details?: VeskGlobalAttributes & { open?: boolean | string };\n summary?: VeskGlobalAttributes;\n dialog?: VeskGlobalAttributes & { open?: boolean | string };\n menu?: VeskGlobalAttributes;\n address?: VeskGlobalAttributes;\n b?: VeskGlobalAttributes;\n i?: VeskGlobalAttributes;\n ruby?: VeskGlobalAttributes;\n rt?: VeskGlobalAttributes;\n rp?: VeskGlobalAttributes;\n bdi?: VeskGlobalAttributes;\n bdo?: VeskGlobalAttributes;\n wbr?: VeskGlobalAttributes;\n area?: VeskGlobalAttributes & {\n coords?: string;\n shape?: string;\n href?: string;\n target?: string;\n alt?: string;\n };\n map?: VeskGlobalAttributes & { name?: string };\n noscript?: VeskGlobalAttributes;\n template?: VeskGlobalAttributes;\n slot?: VeskGlobalAttributes & { name?: string };\n meta?: VeskGlobalAttributes & { name?: string; content?: string; charSet?: string; httpEquiv?: string };\n title?: VeskGlobalAttributes;\n base?: VeskGlobalAttributes & { href?: string; target?: string };\n link?: VeskGlobalAttributes & {\n rel?: string;\n href?: string;\n sizes?: string;\n media?: string;\n as?: string;\n crossOrigin?: string;\n integrity?: string;\n };\n style?: VeskGlobalAttributes & { media?: string };\n script?: VeskGlobalAttributes & {\n src?: string;\n async?: boolean | string;\n defer?: boolean | string;\n type?: string;\n crossOrigin?: string;\n integrity?: string;\n nonce?: string;\n noModule?: boolean | string;\n };\n svg?: VeskGlobalAttributes & {\n viewBox?: string;\n xmlns?: string;\n width?: string | number;\n height?: string | number;\n fill?: string;\n stroke?: string;\n strokeWidth?: string | number;\n };\n g?: VeskGlobalAttributes & { transform?: string; fill?: string; stroke?: string; strokeWidth?: string | number };\n path?: VeskGlobalAttributes & {\n d?: string;\n fill?: string;\n stroke?: string;\n strokeWidth?: string | number;\n fillRule?: string;\n clipRule?: string;\n };\n circle?: VeskGlobalAttributes & {\n cx?: string | number;\n cy?: string | number;\n r?: string | number;\n fill?: string;\n stroke?: string;\n strokeWidth?: string | number;\n };\n ellipse?: VeskGlobalAttributes & {\n cx?: string | number;\n cy?: string | number;\n rx?: string | number;\n ry?: string | number;\n fill?: string;\n };\n rect?: VeskGlobalAttributes & {\n x?: string | number;\n y?: string | number;\n width?: string | number;\n height?: string | number;\n rx?: string | number;\n ry?: string | number;\n fill?: string;\n };\n line?: VeskGlobalAttributes & {\n x1?: string | number;\n y1?: string | number;\n x2?: string | number;\n y2?: string | number;\n stroke?: string;\n strokeWidth?: string | number;\n };\n polyline?: VeskGlobalAttributes & { points?: string; fill?: string; stroke?: string };\n polygon?: VeskGlobalAttributes & { points?: string; fill?: string; stroke?: string };\n text?: VeskGlobalAttributes & { x?: string | number; y?: string | number; fill?: string; fontSize?: string | number };\n defs?: VeskGlobalAttributes;\n linearGradient?: VeskGlobalAttributes;\n radialGradient?: VeskGlobalAttributes;\n stop?: VeskGlobalAttributes & { offset?: string | number; stopColor?: string; stopOpacity?: string | number };\n\n // Unknown/custom tags stay permissive \u2014 components and web components\n // resolve through the index signature, known tags get the typed members.\n [elemName: string]: unknown;\n }\n}\ndeclare const Head: (props: { children?: unknown }) => unknown;\ndeclare class Cell<T> {\n get(): T;\n set(value: T): void;\n peek(): T;\n update(fn: (current: T) => T): boolean;\n unsubscribe(effect: unknown): void;\n}\ndeclare function track<T>(initialValue: T): Cell<T>;\ndeclare function derived<T>(fn: () => T): Cell<T>;\ndeclare function effect(fn: () => void): unknown;\ndeclare function untrack<T>(fn: () => T): T;\ndeclare function peek<T>(fn: () => T): T;\ndeclare function tick(): Promise<void>;\ndeclare function flushSync(fn: () => void): void;\ndeclare function on_destroy(fn: () => void): void;\ndeclare function createContext<T>(defaultValue?: T): { id: symbol; defaultValue: T | undefined };\n// useFetch returns a THENABLE resource, not the data itself. In async\n// components you must `await` it before reading/iterating the payload;\n// passing `into: <tracked cell>` writes the payload into the cell and makes\n// awaiting unnecessary (the return value can be ignored).\ninterface VeskResource<T> {\n loading: boolean;\n error: unknown;\n data: T | undefined;\n refresh(): void;\n abort(): void;\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n ): PromiseLike<TResult1 | TResult2>;\n}\ninterface VeskUseFetchOptions<T> {\n /** Cache/SSR key \u2014 defaults to the URL string. */\n key?: string;\n /** Target tracked cell (from track<T>()) \u2014 the payload is written into it, so awaiting is unnecessary. */\n into?: Cell<T>;\n staleTime?: number;\n keepPreviousData?: boolean;\n retry?: number;\n retryDelay?: number;\n timeout?: number;\n enabled?: boolean;\n dedupe?: boolean;\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n credentials?: 'omit' | 'same-origin' | 'include';\n signal?: { readonly aborted: boolean };\n}\ndeclare function useFetch<T = unknown>(\n urlOrFn: string | (() => Promise<T>),\n options?: VeskUseFetchOptions<T>,\n): VeskResource<T>;\ndeclare function useRouter(): unknown;\ndeclare function useParams(): Record<string, string>;\ndeclare function usePathname(): string;\ndeclare function useSearchParams(): URLSearchParams;\ndeclare function useNavigate(): (to: string) => void;\ndeclare function defineAction(...args: unknown[]): unknown;\ndeclare const Form: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const Field: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare function required(...args: unknown[]): unknown;\ndeclare function email(...args: unknown[]): unknown;\ndeclare function minLength(...args: unknown[]): unknown;\ndeclare function maxLength(...args: unknown[]): unknown;\ndeclare function pattern(...args: unknown[]): unknown;\ndeclare function custom(...args: unknown[]): unknown;\ndeclare const Link: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const NavLink: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const Outlet: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const Image: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const Portal: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const Experiment: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const JsonLd: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const ArticleSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const ProductSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const FAQPageSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const BreadcrumbListSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const OrganizationSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const LocalBusinessSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare const VideoSchema: (props: { [k: string]: unknown; children?: unknown }) => unknown;\ndeclare function redirect(...args: unknown[]): unknown;\ndeclare function permanentRedirect(...args: unknown[]): unknown;\ndeclare function notFound(...args: unknown[]): never;\ndeclare class NotFoundError extends Error {}\ndeclare function createResource(...args: unknown[]): unknown;\ndeclare function getAction(...args: unknown[]): unknown;\ndeclare function validateActionInput(...args: unknown[]): unknown;\ndeclare function issuesToFieldMap(...args: unknown[]): unknown;\ndeclare function isFormAction(...args: unknown[]): unknown;\n";
13
+ export declare const RUNTIME_OVERRIDE = "\nimport '@vesk/runtime';\ndeclare module '@vesk/runtime' {\n export function track<T>(initialValue: T): Cell<T>;\n export function derived<T>(fn: () => T): Cell<T>;\n}\n";
12
14
  export interface TypecheckResult {
13
15
  errors: TypecheckError[];
14
16
  warnings: TypecheckError[];
@@ -1 +1 @@
1
- {"version":3,"file":"typecheck.d.ts","sourceRoot":"","sources":["../src/typecheck.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAmQD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,eAAe,CA0FlG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAItE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAI1E"}
1
+ {"version":3,"file":"typecheck.d.ts","sourceRoot":"","sources":["../src/typecheck.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,eAAO,MAAM,OAAO,goiBA6bnB,CAAC;AAEF,eAAO,MAAM,gBAAgB,iLAM5B,CAAC;AAyLF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,eAAe,CA0FlG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAItE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAI1E"}
package/dist/typecheck.js CHANGED
@@ -5,16 +5,364 @@ import { parse } from '@vesk/compiler/src/parser';
5
5
  import { vskToTsx, generateVskDts } from '@vesk/compiler/src/vsk-tsx';
6
6
  const SKIP_DIRS = new Set(['node_modules', '.vesk', '.git', 'dist', 'tarballs', '.next']);
7
7
  const SKIP_FILES = new Set(['__vesk_ambient.d.ts', '__vesk_runtime_override.d.ts']);
8
- const AMBIENT = `
8
+ export const AMBIENT = `
9
9
  declare namespace JSX {
10
+ type VeskEventHandler<E extends Event = Event> = (event: E) => void;
11
+ interface VeskCommonAttributes {
12
+ key?: string | number;
13
+ class?: string;
14
+ id?: string;
15
+ style?: string;
16
+ title?: string;
17
+ hidden?: boolean | string;
18
+ lang?: string;
19
+ dir?: 'ltr' | 'rtl' | 'auto';
20
+ tabIndex?: number;
21
+ role?: string;
22
+ }
23
+ interface VeskEventAttributes {
24
+ onClick?: VeskEventHandler<MouseEvent>;
25
+ onDblClick?: VeskEventHandler<MouseEvent>;
26
+ onMouseDown?: VeskEventHandler<MouseEvent>;
27
+ onMouseUp?: VeskEventHandler<MouseEvent>;
28
+ onMouseEnter?: VeskEventHandler<MouseEvent>;
29
+ onMouseLeave?: VeskEventHandler<MouseEvent>;
30
+ onMouseMove?: VeskEventHandler<MouseEvent>;
31
+ onKeyDown?: VeskEventHandler<KeyboardEvent>;
32
+ onKeyUp?: VeskEventHandler<KeyboardEvent>;
33
+ onFocus?: VeskEventHandler<FocusEvent>;
34
+ onBlur?: VeskEventHandler<FocusEvent>;
35
+ onInput?: VeskEventHandler<InputEvent>;
36
+ onChange?: VeskEventHandler<Event>;
37
+ onSubmit?: VeskEventHandler<SubmitEvent>;
38
+ onScroll?: VeskEventHandler<UIEvent>;
39
+ onWheel?: VeskEventHandler<WheelEvent>;
40
+ // Lowercase aliases — HTML attribute names are case-insensitive and real
41
+ // code writes onclick=/oninput=. Keep in sync with the camelCase members.
42
+ onclick?: VeskEventHandler<MouseEvent>;
43
+ ondblclick?: VeskEventHandler<MouseEvent>;
44
+ onmousedown?: VeskEventHandler<MouseEvent>;
45
+ onmouseup?: VeskEventHandler<MouseEvent>;
46
+ onmouseenter?: VeskEventHandler<MouseEvent>;
47
+ onmouseleave?: VeskEventHandler<MouseEvent>;
48
+ onmousemove?: VeskEventHandler<MouseEvent>;
49
+ onkeydown?: VeskEventHandler<KeyboardEvent>;
50
+ onkeyup?: VeskEventHandler<KeyboardEvent>;
51
+ onfocus?: VeskEventHandler<FocusEvent>;
52
+ onblur?: VeskEventHandler<FocusEvent>;
53
+ oninput?: VeskEventHandler<InputEvent>;
54
+ onchange?: VeskEventHandler<Event>;
55
+ onsubmit?: VeskEventHandler<SubmitEvent>;
56
+ }
57
+ interface VeskGlobalAttributes extends VeskCommonAttributes, VeskEventAttributes {
58
+ children?: unknown;
59
+ }
60
+ interface VeskAnchorAttributes extends VeskGlobalAttributes {
61
+ href?: string;
62
+ target?: string;
63
+ rel?: string;
64
+ download?: string | boolean;
65
+ type?: string;
66
+ hreflang?: string;
67
+ }
68
+ interface VeskMediaAttributes extends VeskGlobalAttributes {
69
+ src?: string;
70
+ width?: string | number;
71
+ height?: string | number;
72
+ }
73
+ interface VeskInputAttributes extends VeskGlobalAttributes {
74
+ type?: string;
75
+ name?: string;
76
+ value?: string | number | readonly string[];
77
+ placeholder?: string;
78
+ checked?: boolean | string;
79
+ disabled?: boolean | string;
80
+ readOnly?: boolean | string;
81
+ required?: boolean | string;
82
+ min?: string | number;
83
+ max?: string | number;
84
+ step?: string | number;
85
+ pattern?: string;
86
+ autoComplete?: string;
87
+ autoFocus?: boolean | string;
88
+ multiple?: boolean | string;
89
+ accept?: string;
90
+ size?: number;
91
+ list?: string;
92
+ }
10
93
  interface IntrinsicElements {
94
+ html?: VeskGlobalAttributes & { manifest?: string };
95
+ head?: VeskGlobalAttributes;
96
+ body?: VeskGlobalAttributes;
97
+ div?: VeskGlobalAttributes;
98
+ span?: VeskGlobalAttributes;
99
+ p?: VeskGlobalAttributes;
100
+ h1?: VeskGlobalAttributes;
101
+ h2?: VeskGlobalAttributes;
102
+ h3?: VeskGlobalAttributes;
103
+ h4?: VeskGlobalAttributes;
104
+ h5?: VeskGlobalAttributes;
105
+ h6?: VeskGlobalAttributes;
106
+ a?: VeskAnchorAttributes;
107
+ nav?: VeskGlobalAttributes;
108
+ header?: VeskGlobalAttributes;
109
+ footer?: VeskGlobalAttributes;
110
+ main?: VeskGlobalAttributes;
111
+ section?: VeskGlobalAttributes;
112
+ article?: VeskGlobalAttributes;
113
+ aside?: VeskGlobalAttributes;
114
+ button?: VeskGlobalAttributes & {
115
+ type?: 'button' | 'submit' | 'reset';
116
+ disabled?: boolean | string;
117
+ name?: string;
118
+ value?: string | number;
119
+ };
120
+ form?: VeskGlobalAttributes & {
121
+ action?: string;
122
+ method?: 'get' | 'post';
123
+ target?: string;
124
+ encType?: string;
125
+ noValidate?: boolean | string;
126
+ name?: string;
127
+ autoComplete?: string;
128
+ };
129
+ input?: VeskInputAttributes;
130
+ textarea?: VeskGlobalAttributes & {
131
+ rows?: number;
132
+ cols?: number;
133
+ placeholder?: string;
134
+ value?: string | number;
135
+ disabled?: boolean | string;
136
+ readOnly?: boolean | string;
137
+ required?: boolean | string;
138
+ name?: string;
139
+ };
140
+ select?: VeskGlobalAttributes & {
141
+ name?: string;
142
+ value?: string | number | readonly string[];
143
+ disabled?: boolean | string;
144
+ required?: boolean | string;
145
+ multiple?: boolean | string;
146
+ size?: number;
147
+ autoComplete?: string;
148
+ };
149
+ option?: VeskGlobalAttributes & {
150
+ value?: string | number;
151
+ selected?: boolean | string;
152
+ disabled?: boolean | string;
153
+ label?: string;
154
+ };
155
+ optgroup?: VeskGlobalAttributes & { label?: string; disabled?: boolean | string };
156
+ label?: VeskGlobalAttributes & { htmlFor?: string };
157
+ fieldset?: VeskGlobalAttributes & { disabled?: boolean | string; name?: string; form?: string };
158
+ legend?: VeskGlobalAttributes;
159
+ datalist?: VeskGlobalAttributes;
160
+ img?: VeskGlobalAttributes & {
161
+ src?: string;
162
+ alt?: string;
163
+ width?: string | number;
164
+ height?: string | number;
165
+ srcSet?: string;
166
+ sizes?: string;
167
+ loading?: 'eager' | 'lazy';
168
+ decoding?: 'sync' | 'async' | 'auto';
169
+ };
170
+ picture?: VeskGlobalAttributes;
171
+ source?: VeskGlobalAttributes & { src?: string; srcSet?: string; sizes?: string; media?: string; type?: string };
172
+ video?: VeskMediaAttributes & {
173
+ controls?: boolean | string;
174
+ autoPlay?: boolean | string;
175
+ loop?: boolean | string;
176
+ muted?: boolean | string;
177
+ preload?: 'none' | 'metadata' | 'auto' | '';
178
+ poster?: string;
179
+ playsInline?: boolean | string;
180
+ };
181
+ audio?: VeskGlobalAttributes & {
182
+ src?: string;
183
+ controls?: boolean | string;
184
+ autoPlay?: boolean | string;
185
+ loop?: boolean | string;
186
+ muted?: boolean | string;
187
+ preload?: 'none' | 'metadata' | 'auto' | '';
188
+ };
189
+ track?: VeskGlobalAttributes & {
190
+ src?: string;
191
+ kind?: string;
192
+ srclang?: string;
193
+ label?: string;
194
+ default?: boolean | string;
195
+ };
196
+ canvas?: VeskGlobalAttributes & { width?: number; height?: number };
197
+ iframe?: VeskGlobalAttributes & {
198
+ src?: string;
199
+ srcDoc?: string;
200
+ width?: string | number;
201
+ height?: string | number;
202
+ allow?: string;
203
+ loading?: 'eager' | 'lazy';
204
+ sandbox?: string;
205
+ allowFullScreen?: boolean | string;
206
+ referrerPolicy?: string;
207
+ };
208
+ embed?: VeskGlobalAttributes & { src?: string; type?: string; width?: string | number; height?: string | number };
209
+ object?: VeskGlobalAttributes & { data?: string; type?: string; name?: string; width?: string | number; height?: string | number };
210
+ table?: VeskGlobalAttributes;
211
+ caption?: VeskGlobalAttributes;
212
+ thead?: VeskGlobalAttributes;
213
+ tbody?: VeskGlobalAttributes;
214
+ tfoot?: VeskGlobalAttributes;
215
+ tr?: VeskGlobalAttributes;
216
+ th?: VeskGlobalAttributes & { colSpan?: number; rowSpan?: number; scope?: string; headers?: string };
217
+ td?: VeskGlobalAttributes & { colSpan?: number; rowSpan?: number; headers?: string };
218
+ col?: VeskGlobalAttributes & { span?: number };
219
+ colgroup?: VeskGlobalAttributes & { span?: number };
220
+ ul?: VeskGlobalAttributes;
221
+ ol?: VeskGlobalAttributes & { start?: number; reversed?: boolean | string; type?: string };
222
+ li?: VeskGlobalAttributes & { value?: number };
223
+ dl?: VeskGlobalAttributes;
224
+ dt?: VeskGlobalAttributes;
225
+ dd?: VeskGlobalAttributes;
226
+ br?: VeskGlobalAttributes;
227
+ hr?: VeskGlobalAttributes;
228
+ pre?: VeskGlobalAttributes;
229
+ code?: VeskGlobalAttributes;
230
+ blockquote?: VeskGlobalAttributes & { cite?: string };
231
+ q?: VeskGlobalAttributes & { cite?: string };
232
+ strong?: VeskGlobalAttributes;
233
+ em?: VeskGlobalAttributes;
234
+ small?: VeskGlobalAttributes;
235
+ s?: VeskGlobalAttributes;
236
+ cite?: VeskGlobalAttributes;
237
+ dfn?: VeskGlobalAttributes;
238
+ abbr?: VeskGlobalAttributes & { title?: string };
239
+ time?: VeskGlobalAttributes & { dateTime?: string };
240
+ data?: VeskGlobalAttributes & { value?: string | number };
241
+ mark?: VeskGlobalAttributes;
242
+ del?: VeskGlobalAttributes & { cite?: string; dateTime?: string };
243
+ ins?: VeskGlobalAttributes & { cite?: string; dateTime?: string };
244
+ sub?: VeskGlobalAttributes;
245
+ sup?: VeskGlobalAttributes;
246
+ u?: VeskGlobalAttributes;
247
+ kbd?: VeskGlobalAttributes;
248
+ samp?: VeskGlobalAttributes;
249
+ var?: VeskGlobalAttributes;
250
+ figure?: VeskGlobalAttributes;
251
+ figcaption?: VeskGlobalAttributes;
252
+ details?: VeskGlobalAttributes & { open?: boolean | string };
253
+ summary?: VeskGlobalAttributes;
254
+ dialog?: VeskGlobalAttributes & { open?: boolean | string };
255
+ menu?: VeskGlobalAttributes;
256
+ address?: VeskGlobalAttributes;
257
+ b?: VeskGlobalAttributes;
258
+ i?: VeskGlobalAttributes;
259
+ ruby?: VeskGlobalAttributes;
260
+ rt?: VeskGlobalAttributes;
261
+ rp?: VeskGlobalAttributes;
262
+ bdi?: VeskGlobalAttributes;
263
+ bdo?: VeskGlobalAttributes;
264
+ wbr?: VeskGlobalAttributes;
265
+ area?: VeskGlobalAttributes & {
266
+ coords?: string;
267
+ shape?: string;
268
+ href?: string;
269
+ target?: string;
270
+ alt?: string;
271
+ };
272
+ map?: VeskGlobalAttributes & { name?: string };
273
+ noscript?: VeskGlobalAttributes;
274
+ template?: VeskGlobalAttributes;
275
+ slot?: VeskGlobalAttributes & { name?: string };
276
+ meta?: VeskGlobalAttributes & { name?: string; content?: string; charSet?: string; httpEquiv?: string };
277
+ title?: VeskGlobalAttributes;
278
+ base?: VeskGlobalAttributes & { href?: string; target?: string };
279
+ link?: VeskGlobalAttributes & {
280
+ rel?: string;
281
+ href?: string;
282
+ sizes?: string;
283
+ media?: string;
284
+ as?: string;
285
+ crossOrigin?: string;
286
+ integrity?: string;
287
+ };
288
+ style?: VeskGlobalAttributes & { media?: string };
289
+ script?: VeskGlobalAttributes & {
290
+ src?: string;
291
+ async?: boolean | string;
292
+ defer?: boolean | string;
293
+ type?: string;
294
+ crossOrigin?: string;
295
+ integrity?: string;
296
+ nonce?: string;
297
+ noModule?: boolean | string;
298
+ };
299
+ svg?: VeskGlobalAttributes & {
300
+ viewBox?: string;
301
+ xmlns?: string;
302
+ width?: string | number;
303
+ height?: string | number;
304
+ fill?: string;
305
+ stroke?: string;
306
+ strokeWidth?: string | number;
307
+ };
308
+ g?: VeskGlobalAttributes & { transform?: string; fill?: string; stroke?: string; strokeWidth?: string | number };
309
+ path?: VeskGlobalAttributes & {
310
+ d?: string;
311
+ fill?: string;
312
+ stroke?: string;
313
+ strokeWidth?: string | number;
314
+ fillRule?: string;
315
+ clipRule?: string;
316
+ };
317
+ circle?: VeskGlobalAttributes & {
318
+ cx?: string | number;
319
+ cy?: string | number;
320
+ r?: string | number;
321
+ fill?: string;
322
+ stroke?: string;
323
+ strokeWidth?: string | number;
324
+ };
325
+ ellipse?: VeskGlobalAttributes & {
326
+ cx?: string | number;
327
+ cy?: string | number;
328
+ rx?: string | number;
329
+ ry?: string | number;
330
+ fill?: string;
331
+ };
332
+ rect?: VeskGlobalAttributes & {
333
+ x?: string | number;
334
+ y?: string | number;
335
+ width?: string | number;
336
+ height?: string | number;
337
+ rx?: string | number;
338
+ ry?: string | number;
339
+ fill?: string;
340
+ };
341
+ line?: VeskGlobalAttributes & {
342
+ x1?: string | number;
343
+ y1?: string | number;
344
+ x2?: string | number;
345
+ y2?: string | number;
346
+ stroke?: string;
347
+ strokeWidth?: string | number;
348
+ };
349
+ polyline?: VeskGlobalAttributes & { points?: string; fill?: string; stroke?: string };
350
+ polygon?: VeskGlobalAttributes & { points?: string; fill?: string; stroke?: string };
351
+ text?: VeskGlobalAttributes & { x?: string | number; y?: string | number; fill?: string; fontSize?: string | number };
352
+ defs?: VeskGlobalAttributes;
353
+ linearGradient?: VeskGlobalAttributes;
354
+ radialGradient?: VeskGlobalAttributes;
355
+ stop?: VeskGlobalAttributes & { offset?: string | number; stopColor?: string; stopOpacity?: string | number };
356
+
357
+ // Unknown/custom tags stay permissive — components and web components
358
+ // resolve through the index signature, known tags get the typed members.
11
359
  [elemName: string]: unknown;
12
360
  }
13
361
  }
14
362
  declare const Head: (props: { children?: unknown }) => unknown;
15
363
  declare class Cell<T> {
16
364
  get(): T;
17
- set(value: T): boolean;
365
+ set(value: T): void;
18
366
  peek(): T;
19
367
  update(fn: (current: T) => T): boolean;
20
368
  unsubscribe(effect: unknown): void;
@@ -28,7 +376,43 @@ declare function tick(): Promise<void>;
28
376
  declare function flushSync(fn: () => void): void;
29
377
  declare function on_destroy(fn: () => void): void;
30
378
  declare function createContext<T>(defaultValue?: T): { id: symbol; defaultValue: T | undefined };
31
- declare function useFetch<T = unknown>(...args: unknown[]): T;
379
+ // useFetch returns a THENABLE resource, not the data itself. In async
380
+ // components you must \`await\` it before reading/iterating the payload;
381
+ // passing \`into: <tracked cell>\` writes the payload into the cell and makes
382
+ // awaiting unnecessary (the return value can be ignored).
383
+ interface VeskResource<T> {
384
+ loading: boolean;
385
+ error: unknown;
386
+ data: T | undefined;
387
+ refresh(): void;
388
+ abort(): void;
389
+ then<TResult1 = T, TResult2 = never>(
390
+ onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
391
+ onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null,
392
+ ): PromiseLike<TResult1 | TResult2>;
393
+ }
394
+ interface VeskUseFetchOptions<T> {
395
+ /** Cache/SSR key — defaults to the URL string. */
396
+ key?: string;
397
+ /** Target tracked cell (from track<T>()) — the payload is written into it, so awaiting is unnecessary. */
398
+ into?: Cell<T>;
399
+ staleTime?: number;
400
+ keepPreviousData?: boolean;
401
+ retry?: number;
402
+ retryDelay?: number;
403
+ timeout?: number;
404
+ enabled?: boolean;
405
+ dedupe?: boolean;
406
+ method?: string;
407
+ headers?: Record<string, string>;
408
+ body?: unknown;
409
+ credentials?: 'omit' | 'same-origin' | 'include';
410
+ signal?: { readonly aborted: boolean };
411
+ }
412
+ declare function useFetch<T = unknown>(
413
+ urlOrFn: string | (() => Promise<T>),
414
+ options?: VeskUseFetchOptions<T>,
415
+ ): VeskResource<T>;
32
416
  declare function useRouter(): unknown;
33
417
  declare function useParams(): Record<string, string>;
34
418
  declare function usePathname(): string;
@@ -67,7 +451,7 @@ declare function validateActionInput(...args: unknown[]): unknown;
67
451
  declare function issuesToFieldMap(...args: unknown[]): unknown;
68
452
  declare function isFormAction(...args: unknown[]): unknown;
69
453
  `;
70
- const RUNTIME_OVERRIDE = `
454
+ export const RUNTIME_OVERRIDE = `
71
455
  import '@vesk/runtime';
72
456
  declare module '@vesk/runtime' {
73
457
  export function track<T>(initialValue: T): Cell<T>;
package/dist/vsk-tsx.d.ts CHANGED
@@ -1,3 +1,65 @@
1
+ /**
2
+ * Segment-based TSX codegen. `vskToTsx` remains the byte-identical string
3
+ * transform used by the typechecker; `compileVskCodegen` additionally
4
+ * records `CodeMapping`s (source offset -> generated offset) so the
5
+ * Volar-based LSP can map positions, hover, completions and diagnostics
6
+ * between the user's `.vsk` source and the virtual TSX file TS actually
7
+ * analyzes. Synthetic text (braces, semicolons, `.map` scaffolding) is
8
+ * emitted without a mapping; verbatim user text is mapped 1:1.
9
+ */
10
+ export interface CodeInfo {
11
+ verification?: boolean;
12
+ completion?: boolean | {
13
+ isAdditional?: boolean;
14
+ };
15
+ semantic?: boolean | {
16
+ shouldHighlight?: boolean;
17
+ shouldRename?: boolean;
18
+ };
19
+ navigation?: boolean | {
20
+ shouldRename?: boolean;
21
+ resolveRenameNewName?: (newName: string) => string;
22
+ };
23
+ structure?: boolean;
24
+ format?: boolean;
25
+ customData?: Record<string, unknown>;
26
+ }
27
+ export interface CodeMapping {
28
+ sourceOffsets: number[];
29
+ generatedOffsets: number[];
30
+ lengths: number[];
31
+ generatedLengths?: number[];
32
+ data: CodeInfo;
33
+ }
34
+ export interface StyleRegion {
35
+ /** Source range of the whole `<style>` element. */
36
+ start: number;
37
+ end: number;
38
+ /** The CSS text between the opening and closing tags. */
39
+ content: string;
40
+ }
41
+ export interface VskCodegenError {
42
+ message: string;
43
+ start: number;
44
+ end: number;
45
+ }
46
+ export interface VskCodegenOptions {
47
+ /**
48
+ * When set, `&[count] = track(...)` declarations rewrite to
49
+ * `const __cell = track(...); let count = __cell.get(); let rawCell =
50
+ * __cell;` so TypeScript infers the cell's value type (hover shows
51
+ * `number`, not `any`). Only used by the LSP — `vskToTsx` keeps the
52
+ * plain `let count: any = ...` form.
53
+ */
54
+ typedCells?: boolean;
55
+ }
56
+ export interface VskCodegenResult {
57
+ code: string;
58
+ mappings: CodeMapping[];
59
+ styleRegions: StyleRegion[];
60
+ errors: VskCodegenError[];
61
+ }
62
+ export declare function compileVskCodegen(source: string, opts?: VskCodegenOptions): VskCodegenResult;
1
63
  export declare function vskToTsx(source: string): string;
2
64
  export declare function generateVskDts(source: string): string;
3
65
  //# sourceMappingURL=vsk-tsx.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vsk-tsx.d.ts","sourceRoot":"","sources":["../src/vsk-tsx.ts"],"names":[],"mappings":"AAmfA,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA8C/C;AAWD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmDrD"}
1
+ {"version":3,"file":"vsk-tsx.d.ts","sourceRoot":"","sources":["../src/vsk-tsx.ts"],"names":[],"mappings":"AAiBA;;;;;;;;GAQG;AAEH,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,GAAG;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3E,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,CAAC;IACtG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AA09BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,gBAAgB,CA0ChG;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAWD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmDrD"}