@velarscript/web 0.31.0 → 0.32.0
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 +1 -1
- package/dist/analysis/calls/intrinsics/config.d.ts +10 -0
- package/dist/analysis/calls/intrinsics/config.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics/config.js +19 -0
- package/dist/analysis/calls/intrinsics/config.js.map +1 -0
- package/dist/analysis/calls/intrinsics/forms.d.ts +10 -0
- package/dist/analysis/calls/intrinsics/forms.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics/forms.js +38 -0
- package/dist/analysis/calls/intrinsics/forms.js.map +1 -0
- package/dist/analysis/calls/intrinsics/http.d.ts +10 -0
- package/dist/analysis/calls/intrinsics/http.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics/http.js +37 -0
- package/dist/analysis/calls/intrinsics/http.js.map +1 -0
- package/dist/analysis/calls/intrinsics/reactive.d.ts +10 -0
- package/dist/analysis/calls/intrinsics/reactive.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics/reactive.js +30 -0
- package/dist/analysis/calls/intrinsics/reactive.js.map +1 -0
- package/dist/analysis/calls/intrinsics/storage.d.ts +12 -0
- package/dist/analysis/calls/intrinsics/storage.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics/storage.js +86 -0
- package/dist/analysis/calls/intrinsics/storage.js.map +1 -0
- package/dist/analysis/calls/intrinsics/web.d.ts +10 -0
- package/dist/analysis/calls/intrinsics/web.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics/web.js +100 -0
- package/dist/analysis/calls/intrinsics/web.js.map +1 -0
- package/dist/analysis/calls/intrinsics.d.ts +13 -0
- package/dist/analysis/calls/intrinsics.d.ts.map +1 -0
- package/dist/analysis/calls/intrinsics.js +31 -0
- package/dist/analysis/calls/intrinsics.js.map +1 -0
- package/dist/analysis/components/contracts.d.ts +19 -0
- package/dist/analysis/components/contracts.d.ts.map +1 -0
- package/dist/analysis/components/contracts.js +83 -0
- package/dist/analysis/components/contracts.js.map +1 -0
- package/dist/analysis/components/declaration.d.ts +4 -0
- package/dist/analysis/components/declaration.d.ts.map +1 -0
- package/dist/analysis/components/declaration.js +163 -0
- package/dist/analysis/components/declaration.js.map +1 -0
- package/dist/analysis/components/host.d.ts +61 -0
- package/dist/analysis/components/host.d.ts.map +1 -0
- package/dist/analysis/components/host.js +22 -0
- package/dist/analysis/components/host.js.map +1 -0
- package/dist/analysis/components/lifecycle.d.ts +22 -0
- package/dist/analysis/components/lifecycle.d.ts.map +1 -0
- package/dist/analysis/components/lifecycle.js +33 -0
- package/dist/analysis/components/lifecycle.js.map +1 -0
- package/dist/analysis/components/ownership.d.ts +74 -0
- package/dist/analysis/components/ownership.d.ts.map +1 -0
- package/dist/analysis/components/ownership.js +106 -0
- package/dist/analysis/components/ownership.js.map +1 -0
- package/dist/analysis/declarations.d.ts +99 -0
- package/dist/analysis/declarations.d.ts.map +1 -0
- package/dist/analysis/declarations.js +176 -0
- package/dist/analysis/declarations.js.map +1 -0
- package/dist/analysis/inference.d.ts +67 -0
- package/dist/analysis/inference.d.ts.map +1 -0
- package/dist/analysis/inference.js +236 -0
- package/dist/analysis/inference.js.map +1 -0
- package/dist/analysis/jsx/attributes.d.ts +103 -0
- package/dist/analysis/jsx/attributes.d.ts.map +1 -0
- package/dist/analysis/jsx/attributes.js +601 -0
- package/dist/analysis/jsx/attributes.js.map +1 -0
- package/dist/analysis/jsx/elements.d.ts +17 -0
- package/dist/analysis/jsx/elements.d.ts.map +1 -0
- package/dist/analysis/jsx/elements.js +213 -0
- package/dist/analysis/jsx/elements.js.map +1 -0
- package/dist/analysis/jsx/host.d.ts +61 -0
- package/dist/analysis/jsx/host.d.ts.map +1 -0
- package/dist/analysis/jsx/host.js +15 -0
- package/dist/analysis/jsx/host.js.map +1 -0
- package/dist/analysis/jsx/keys.d.ts +15 -0
- package/dist/analysis/jsx/keys.d.ts.map +1 -0
- package/dist/analysis/jsx/keys.js +67 -0
- package/dist/analysis/jsx/keys.js.map +1 -0
- package/dist/analysis/jsx/security.d.ts +29 -0
- package/dist/analysis/jsx/security.d.ts.map +1 -0
- package/dist/analysis/jsx/security.js +61 -0
- package/dist/analysis/jsx/security.js.map +1 -0
- package/dist/analysis/jsx-detection.d.ts +49 -0
- package/dist/analysis/jsx-detection.d.ts.map +1 -0
- package/dist/analysis/jsx-detection.js +196 -0
- package/dist/analysis/jsx-detection.js.map +1 -0
- package/dist/analysis/keyed-rebuild.d.ts +148 -0
- package/dist/analysis/keyed-rebuild.d.ts.map +1 -0
- package/dist/analysis/keyed-rebuild.js +299 -0
- package/dist/analysis/keyed-rebuild.js.map +1 -0
- package/dist/analysis/keyframes-analysis.d.ts +6 -0
- package/dist/analysis/keyframes-analysis.d.ts.map +1 -0
- package/dist/analysis/keyframes-analysis.js +79 -0
- package/dist/analysis/keyframes-analysis.js.map +1 -0
- package/dist/analysis/look/builders.d.ts +29 -0
- package/dist/analysis/look/builders.d.ts.map +1 -0
- package/dist/analysis/look/builders.js +168 -0
- package/dist/analysis/look/builders.js.map +1 -0
- package/dist/analysis/look/conditions.d.ts +13 -0
- package/dist/analysis/look/conditions.d.ts.map +1 -0
- package/dist/analysis/look/conditions.js +84 -0
- package/dist/analysis/look/conditions.js.map +1 -0
- package/dist/analysis/look/edits.d.ts +25 -0
- package/dist/analysis/look/edits.d.ts.map +1 -0
- package/dist/analysis/look/edits.js +57 -0
- package/dist/analysis/look/edits.js.map +1 -0
- package/dist/analysis/look/entries.d.ts +56 -0
- package/dist/analysis/look/entries.d.ts.map +1 -0
- package/dist/analysis/look/entries.js +223 -0
- package/dist/analysis/look/entries.js.map +1 -0
- package/dist/analysis/look/host.d.ts +47 -0
- package/dist/analysis/look/host.d.ts.map +1 -0
- package/dist/analysis/look/host.js +16 -0
- package/dist/analysis/look/host.js.map +1 -0
- package/dist/analysis/look/tokens.d.ts +75 -0
- package/dist/analysis/look/tokens.d.ts.map +1 -0
- package/dist/analysis/look/tokens.js +151 -0
- package/dist/analysis/look/tokens.js.map +1 -0
- package/dist/analysis/look/values.d.ts +45 -0
- package/dist/analysis/look/values.d.ts.map +1 -0
- package/dist/analysis/look/values.js +148 -0
- package/dist/analysis/look/values.js.map +1 -0
- package/dist/analysis/look-conditions.d.ts +47 -0
- package/dist/analysis/look-conditions.d.ts.map +1 -0
- package/dist/analysis/look-conditions.js +157 -0
- package/dist/analysis/look-conditions.js.map +1 -0
- package/dist/analysis/look-sites.d.ts +54 -0
- package/dist/analysis/look-sites.d.ts.map +1 -0
- package/dist/analysis/look-sites.js +104 -0
- package/dist/analysis/look-sites.js.map +1 -0
- package/dist/analysis/look-vocabulary-guidance.d.ts +76 -0
- package/dist/analysis/look-vocabulary-guidance.d.ts.map +1 -0
- package/dist/analysis/look-vocabulary-guidance.js +338 -0
- package/dist/analysis/look-vocabulary-guidance.js.map +1 -0
- package/dist/analysis/media-conditions.d.ts +33 -0
- package/dist/analysis/media-conditions.d.ts.map +1 -0
- package/dist/analysis/media-conditions.js +92 -0
- package/dist/analysis/media-conditions.js.map +1 -0
- package/dist/analysis/program-passes.d.ts +106 -0
- package/dist/analysis/program-passes.d.ts.map +1 -0
- package/dist/analysis/program-passes.js +149 -0
- package/dist/analysis/program-passes.js.map +1 -0
- package/dist/analysis/reactivity/bindings.d.ts +37 -0
- package/dist/analysis/reactivity/bindings.d.ts.map +1 -0
- package/dist/analysis/reactivity/bindings.js +88 -0
- package/dist/analysis/reactivity/bindings.js.map +1 -0
- package/dist/analysis/reactivity/derived.d.ts +39 -0
- package/dist/analysis/reactivity/derived.d.ts.map +1 -0
- package/dist/analysis/reactivity/derived.js +80 -0
- package/dist/analysis/reactivity/derived.js.map +1 -0
- package/dist/analysis/reactivity/host.d.ts +38 -0
- package/dist/analysis/reactivity/host.d.ts.map +1 -0
- package/dist/analysis/reactivity/host.js +14 -0
- package/dist/analysis/reactivity/host.js.map +1 -0
- package/dist/analysis/reactivity/retired-accessors.d.ts +82 -0
- package/dist/analysis/reactivity/retired-accessors.d.ts.map +1 -0
- package/dist/analysis/reactivity/retired-accessors.js +118 -0
- package/dist/analysis/reactivity/retired-accessors.js.map +1 -0
- package/dist/analysis/renderable.d.ts +47 -0
- package/dist/analysis/renderable.d.ts.map +1 -0
- package/dist/analysis/renderable.js +105 -0
- package/dist/analysis/renderable.js.map +1 -0
- package/dist/analysis/routes.d.ts +64 -0
- package/dist/analysis/routes.d.ts.map +1 -0
- package/dist/analysis/routes.js +182 -0
- package/dist/analysis/routes.js.map +1 -0
- package/dist/analysis/url-attributes.d.ts +12 -0
- package/dist/analysis/url-attributes.d.ts.map +1 -0
- package/dist/analysis/url-attributes.js +48 -0
- package/dist/analysis/url-attributes.js.map +1 -0
- package/dist/analysis/watch-cycles.d.ts +102 -0
- package/dist/analysis/watch-cycles.d.ts.map +1 -1
- package/dist/analysis/watch-cycles.js +240 -1
- package/dist/analysis/watch-cycles.js.map +1 -1
- package/dist/analysis/watch-subject.d.ts +45 -0
- package/dist/analysis/watch-subject.d.ts.map +1 -0
- package/dist/analysis/watch-subject.js +272 -0
- package/dist/analysis/watch-subject.js.map +1 -0
- package/dist/analysis/web-types.d.ts +27 -0
- package/dist/analysis/web-types.d.ts.map +1 -0
- package/dist/analysis/web-types.js +170 -0
- package/dist/analysis/web-types.js.map +1 -0
- package/dist/analyzer.d.ts +18 -617
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +208 -4853
- package/dist/analyzer.js.map +1 -1
- package/dist/compiler.d.ts +20 -0
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +29 -864
- package/dist/compiler.js.map +1 -1
- package/dist/documentation.d.ts +28 -0
- package/dist/documentation.d.ts.map +1 -0
- package/dist/documentation.js +67 -0
- package/dist/documentation.js.map +1 -0
- package/dist/editor/completions.d.ts +12 -0
- package/dist/editor/completions.d.ts.map +1 -0
- package/dist/editor/completions.js +6 -0
- package/dist/editor/completions.js.map +1 -0
- package/dist/editor/jsx-completion.d.ts +12 -0
- package/dist/editor/jsx-completion.d.ts.map +1 -0
- package/dist/editor/jsx-completion.js +137 -0
- package/dist/editor/jsx-completion.js.map +1 -0
- package/dist/editor/look-completion.d.ts +29 -0
- package/dist/editor/look-completion.d.ts.map +1 -0
- package/dist/editor/look-completion.js +159 -0
- package/dist/editor/look-completion.js.map +1 -0
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +12 -288
- package/dist/editor.js.map +1 -1
- package/dist/emit/components.d.ts +33 -0
- package/dist/emit/components.d.ts.map +1 -0
- package/dist/emit/components.js +135 -0
- package/dist/emit/components.js.map +1 -0
- package/dist/emit/jsx.d.ts +57 -0
- package/dist/emit/jsx.d.ts.map +1 -0
- package/dist/emit/jsx.js +384 -0
- package/dist/emit/jsx.js.map +1 -0
- package/dist/emit/look-css.d.ts +44 -0
- package/dist/emit/look-css.d.ts.map +1 -0
- package/dist/emit/look-css.js +177 -0
- package/dist/emit/look-css.js.map +1 -0
- package/dist/emit/look.d.ts +39 -0
- package/dist/emit/look.d.ts.map +1 -0
- package/dist/emit/look.js +218 -0
- package/dist/emit/look.js.map +1 -0
- package/dist/emit/runtime-imports.d.ts +40 -0
- package/dist/emit/runtime-imports.d.ts.map +1 -0
- package/dist/emit/runtime-imports.js +184 -0
- package/dist/emit/runtime-imports.js.map +1 -0
- package/dist/emitter.d.ts +15 -68
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +79 -1008
- package/dist/emitter.js.map +1 -1
- package/dist/look/animation.d.ts +7 -0
- package/dist/look/animation.d.ts.map +1 -0
- package/dist/look/animation.js +13 -0
- package/dist/look/animation.js.map +1 -0
- package/dist/look/builders.d.ts +35 -0
- package/dist/look/builders.d.ts.map +1 -0
- package/dist/look/builders.js +74 -0
- package/dist/look/builders.js.map +1 -0
- package/dist/look/css-functions.d.ts +28 -0
- package/dist/look/css-functions.d.ts.map +1 -0
- package/dist/look/css-functions.js +54 -0
- package/dist/look/css-functions.js.map +1 -0
- package/dist/look/keyword-sets.d.ts +41 -0
- package/dist/look/keyword-sets.d.ts.map +1 -0
- package/dist/look/keyword-sets.js +117 -0
- package/dist/look/keyword-sets.js.map +1 -0
- package/dist/look/keywords.d.ts +55 -0
- package/dist/look/keywords.d.ts.map +1 -0
- package/dist/look/keywords.js +387 -0
- package/dist/look/keywords.js.map +1 -0
- package/dist/look/media.d.ts +19 -0
- package/dist/look/media.d.ts.map +1 -0
- package/dist/look/media.js +27 -0
- package/dist/look/media.js.map +1 -0
- package/dist/look/naming.d.ts +9 -0
- package/dist/look/naming.d.ts.map +1 -0
- package/dist/look/naming.js +45 -0
- package/dist/look/naming.js.map +1 -0
- package/dist/look/properties.d.ts +16 -0
- package/dist/look/properties.d.ts.map +1 -0
- package/dist/look/properties.js +52 -0
- package/dist/look/properties.js.map +1 -0
- package/dist/look/shorthands.d.ts +25 -0
- package/dist/look/shorthands.d.ts.map +1 -0
- package/dist/look/shorthands.js +130 -0
- package/dist/look/shorthands.js.map +1 -0
- package/dist/look/tokens.d.ts +38 -0
- package/dist/look/tokens.d.ts.map +1 -0
- package/dist/look/tokens.js +59 -0
- package/dist/look/tokens.js.map +1 -0
- package/dist/look/units.d.ts +24 -0
- package/dist/look/units.d.ts.map +1 -0
- package/dist/look/units.js +33 -0
- package/dist/look/units.js.map +1 -0
- package/dist/look.d.ts +32 -227
- package/dist/look.d.ts.map +1 -1
- package/dist/look.js +28 -933
- package/dist/look.js.map +1 -1
- package/dist/module-roster.d.ts +16 -0
- package/dist/module-roster.d.ts.map +1 -0
- package/dist/module-roster.js +28 -0
- package/dist/module-roster.js.map +1 -0
- package/dist/modules/app.d.ts +9 -0
- package/dist/modules/app.d.ts.map +1 -0
- package/dist/modules/app.js +20 -0
- package/dist/modules/app.js.map +1 -0
- package/dist/modules/browser-test.d.ts +9 -0
- package/dist/modules/browser-test.d.ts.map +1 -0
- package/dist/modules/browser-test.js +67 -0
- package/dist/modules/browser-test.js.map +1 -0
- package/dist/modules/browser.d.ts +10 -0
- package/dist/modules/browser.d.ts.map +1 -0
- package/dist/modules/browser.js +89 -0
- package/dist/modules/browser.js.map +1 -0
- package/dist/modules/config.d.ts +9 -0
- package/dist/modules/config.d.ts.map +1 -0
- package/dist/modules/config.js +14 -0
- package/dist/modules/config.js.map +1 -0
- package/dist/modules/files.d.ts +9 -0
- package/dist/modules/files.d.ts.map +1 -0
- package/dist/modules/files.js +16 -0
- package/dist/modules/files.js.map +1 -0
- package/dist/modules/forms.d.ts +9 -0
- package/dist/modules/forms.d.ts.map +1 -0
- package/dist/modules/forms.js +26 -0
- package/dist/modules/forms.js.map +1 -0
- package/dist/modules/http.d.ts +9 -0
- package/dist/modules/http.d.ts.map +1 -0
- package/dist/modules/http.js +127 -0
- package/dist/modules/http.js.map +1 -0
- package/dist/modules/look.d.ts +9 -0
- package/dist/modules/look.d.ts.map +1 -0
- package/dist/modules/look.js +58 -0
- package/dist/modules/look.js.map +1 -0
- package/dist/modules/realtime.d.ts +9 -0
- package/dist/modules/realtime.d.ts.map +1 -0
- package/dist/modules/realtime.js +163 -0
- package/dist/modules/realtime.js.map +1 -0
- package/dist/modules/storage.d.ts +9 -0
- package/dist/modules/storage.d.ts.map +1 -0
- package/dist/modules/storage.js +59 -0
- package/dist/modules/storage.js.map +1 -0
- package/dist/modules/types.d.ts +78 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +154 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/modules/web.d.ts +9 -0
- package/dist/modules/web.d.ts.map +1 -0
- package/dist/modules/web.js +63 -0
- package/dist/modules/web.js.map +1 -0
- package/dist/modules/websocket.d.ts +11 -0
- package/dist/modules/websocket.d.ts.map +1 -0
- package/dist/modules/websocket.js +75 -0
- package/dist/modules/websocket.js.map +1 -0
- package/dist/parser/expressions/jsx.d.ts +17 -0
- package/dist/parser/expressions/jsx.d.ts.map +1 -0
- package/dist/parser/expressions/jsx.js +43 -0
- package/dist/parser/expressions/jsx.js.map +1 -0
- package/dist/parser/expressions/keyframes.d.ts +15 -0
- package/dist/parser/expressions/keyframes.d.ts.map +1 -0
- package/dist/parser/expressions/keyframes.js +33 -0
- package/dist/parser/expressions/keyframes.js.map +1 -0
- package/dist/parser/expressions/look.d.ts +16 -0
- package/dist/parser/expressions/look.d.ts.map +1 -0
- package/dist/parser/expressions/look.js +37 -0
- package/dist/parser/expressions/look.js.map +1 -0
- package/dist/parser/expressions/visual-block.d.ts +17 -0
- package/dist/parser/expressions/visual-block.d.ts.map +1 -0
- package/dist/parser/expressions/visual-block.js +21 -0
- package/dist/parser/expressions/visual-block.js.map +1 -0
- package/dist/parser/keyframes-source.d.ts +24 -0
- package/dist/parser/keyframes-source.d.ts.map +1 -0
- package/dist/parser/keyframes-source.js +133 -0
- package/dist/parser/keyframes-source.js.map +1 -0
- package/dist/parser/look-source.d.ts +25 -0
- package/dist/parser/look-source.d.ts.map +1 -0
- package/dist/parser/look-source.js +189 -0
- package/dist/parser/look-source.js.map +1 -0
- package/dist/parser/spans.d.ts +24 -0
- package/dist/parser/spans.d.ts.map +1 -0
- package/dist/parser/spans.js +113 -0
- package/dist/parser/spans.js.map +1 -0
- package/dist/parser/statements/components.d.ts +37 -0
- package/dist/parser/statements/components.d.ts.map +1 -0
- package/dist/parser/statements/components.js +185 -0
- package/dist/parser/statements/components.js.map +1 -0
- package/dist/parser/statements/heads.d.ts +38 -0
- package/dist/parser/statements/heads.d.ts.map +1 -0
- package/dist/parser/statements/heads.js +55 -0
- package/dist/parser/statements/heads.js.map +1 -0
- package/dist/parser/statements/imports.d.ts +9 -0
- package/dist/parser/statements/imports.d.ts.map +1 -0
- package/dist/parser/statements/imports.js +31 -0
- package/dist/parser/statements/imports.js.map +1 -0
- package/dist/parser/statements/reactive.d.ts +31 -0
- package/dist/parser/statements/reactive.d.ts.map +1 -0
- package/dist/parser/statements/reactive.js +68 -0
- package/dist/parser/statements/reactive.js.map +1 -0
- package/dist/parser/statements/unsafe-css.d.ts +21 -0
- package/dist/parser/statements/unsafe-css.d.ts.map +1 -0
- package/dist/parser/statements/unsafe-css.js +42 -0
- package/dist/parser/statements/unsafe-css.js.map +1 -0
- package/dist/parser.d.ts +37 -50
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +98 -882
- package/dist/parser.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a Web declaration means and what analyzing one does: the types a
|
|
3
|
+
* `component` and an `action` publish, the four reactive declarations
|
|
4
|
+
* (`state`, `computed`, `resource`, `action`), the module-level `import css
|
|
5
|
+
* unsafe`, the scope prescan's answer, and the demotion an imported derived
|
|
6
|
+
* name receives.
|
|
7
|
+
*
|
|
8
|
+
* D115 P4 R3c. Every one of these is reached from the analyzer's statement
|
|
9
|
+
* seams, which stay on the root as the dispatch over statement kinds; the arms
|
|
10
|
+
* themselves live here. `analyzeComponent` calls the same four declaration
|
|
11
|
+
* analyzers from a component body, which is why they are a module both the root
|
|
12
|
+
* and `components/` can call and why the import runs one way only:
|
|
13
|
+
* `components/` reads this module, and this module never reads `components/`.
|
|
14
|
+
*/
|
|
15
|
+
import { type Diagnostic, type Span } from "@velarscript/compiler";
|
|
16
|
+
import { type Expression, type Statement, type TypeReference, type ValueType } from "@velarscript/compiler/extension";
|
|
17
|
+
import { type WebActionDeclaration as ActionDeclaration, type WebComponentDeclaration as ComponentDeclaration, type WebComputedDeclaration as ComputedDeclaration, type WebResourceDeclaration as ResourceDeclaration, type WebStateDeclaration as StateDeclaration, type WebUnsafeCssDeclaration as UnsafeCssDeclaration } from "../ast.ts";
|
|
18
|
+
import { type KeyedRebuildHost } from "./keyed-rebuild.ts";
|
|
19
|
+
/**
|
|
20
|
+
* What the declaration analyzers ask of the analyzer that hosts them: the four
|
|
21
|
+
* span tables a declaration records itself in, the module's unsafe-CSS and
|
|
22
|
+
* resource inputs, and the base-analyzer operations declaring a name performs.
|
|
23
|
+
*
|
|
24
|
+
* It extends `KeyedRebuildHost` because a `computed` declaration is one of the
|
|
25
|
+
* two places a keyed-list rebuild is recorded, so analyzing a declaration
|
|
26
|
+
* really does need everything that advisory needs.
|
|
27
|
+
*/
|
|
28
|
+
export interface DeclarationAnalysisHost extends KeyedRebuildHost {
|
|
29
|
+
/** D71 rule 182: the declaration spans of every `computed` binding in scope. */
|
|
30
|
+
readonly computedBindingSpans: Set<string>;
|
|
31
|
+
/** Local names bound to an imported `export computed`, from the Web interface. */
|
|
32
|
+
readonly importedComputedNames: ReadonlySet<string>;
|
|
33
|
+
/** The resolved spans of those imports, so a local shadow of the name is not one. */
|
|
34
|
+
readonly importedComputedSpans: Set<string>;
|
|
35
|
+
/** The project resources this compile read, which is where an external unsafe stylesheet's text comes from. */
|
|
36
|
+
readonly resources: ReadonlyMap<string, string>;
|
|
37
|
+
/** D114 W: the declaration spans of every `resource` in scope. */
|
|
38
|
+
readonly resourceBindingSpans: Set<string>;
|
|
39
|
+
/** Each external stylesheet already given an order position, which is how a second import of one is recognised. */
|
|
40
|
+
readonly unsafeCssImports: Set<string>;
|
|
41
|
+
/** How many synchronous reactive bodies enclose the expression being inferred; a `computed` initializer is one. */
|
|
42
|
+
synchronousReactiveDepth: number;
|
|
43
|
+
readonly diagnostics: Diagnostic[];
|
|
44
|
+
analyzeFunctionDeclaration(statement: ActionDeclaration, className: null, method: boolean, declareSelf: boolean, forceAsynchronous: boolean, declarationKind: string): void;
|
|
45
|
+
declareBinding(name: string, mutable: boolean, type: ValueType, declarationSpan: Span): void;
|
|
46
|
+
inferExpression(expression: Expression, contextualType?: ValueType): ValueType;
|
|
47
|
+
inferredFunctionResult(statement: ActionDeclaration): ValueType;
|
|
48
|
+
isTopLevelScope(): boolean;
|
|
49
|
+
markDeclaredBindingReactive(name: string, kind: "state" | "prop"): void;
|
|
50
|
+
requireAssignable(actual: ValueType, expected: ValueType, valueSpan: Span): void;
|
|
51
|
+
requireSettledCollectionElement(initializer: Expression, declared: ValueType, annotated: boolean): void;
|
|
52
|
+
resolveAnnotation(reference: TypeReference | null): ValueType;
|
|
53
|
+
resolveValidatedAnnotation(reference: TypeReference | null): ValueType;
|
|
54
|
+
resolvedAsyncResult(type: ValueType): ValueType;
|
|
55
|
+
validateTypeReference(reference: TypeReference): boolean;
|
|
56
|
+
}
|
|
57
|
+
export declare function componentType(host: DeclarationAnalysisHost, statement: ComponentDeclaration): ValueType;
|
|
58
|
+
/**
|
|
59
|
+
* A `state` declaration, at module scope and in a component body alike: the two
|
|
60
|
+
* arms are the same eight lines, so they are written once here.
|
|
61
|
+
*/
|
|
62
|
+
export declare function analyzeStateDeclaration(host: DeclarationAnalysisHost, statement: StateDeclaration): void;
|
|
63
|
+
/**
|
|
64
|
+
* D71 rule 182: a derived value is reactive and read-only, which is exactly
|
|
65
|
+
* the reactive identity a component prop already carries — a bare read lowers
|
|
66
|
+
* through `.get()`, and nothing may write it. Registering that identity
|
|
67
|
+
* rather than `state` is what keeps `bind={doubled}` and every other writable
|
|
68
|
+
* position refusing a derived name for free.
|
|
69
|
+
*/
|
|
70
|
+
export declare function analyzeComputedDeclaration(host: DeclarationAnalysisHost, statement: ComputedDeclaration): void;
|
|
71
|
+
export declare function analyzeResourceDeclaration(host: DeclarationAnalysisHost, statement: ResourceDeclaration): void;
|
|
72
|
+
export declare function actionType(host: DeclarationAnalysisHost, statement: ActionDeclaration): ValueType;
|
|
73
|
+
export declare function analyzeActionDeclaration(host: DeclarationAnalysisHost, statement: ActionDeclaration): void;
|
|
74
|
+
/**
|
|
75
|
+
* LOK-D2 / D53: unsafe CSS is a module-level ordering declaration, whether its
|
|
76
|
+
* source is an external resource or an inline raw block. Nested inside a
|
|
77
|
+
* component or a function it used to pass every check, build, and then appear
|
|
78
|
+
* in no output at all.
|
|
79
|
+
*/
|
|
80
|
+
export declare function analyzeUnsafeCssDeclaration(host: DeclarationAnalysisHost, statement: UnsafeCssDeclaration): void;
|
|
81
|
+
/** The three Web declarations a scope prescan has to see, so a later shadow of one is recognised. */
|
|
82
|
+
export declare function webScopeDeclaration(statement: Statement): {
|
|
83
|
+
readonly name: string;
|
|
84
|
+
readonly span: Span;
|
|
85
|
+
} | null;
|
|
86
|
+
/**
|
|
87
|
+
* D71 rule 184: a cross-module `computed` travels through `reactiveExports`
|
|
88
|
+
* so its bare read lowers through `.get()` like an exported `state` — but it
|
|
89
|
+
* is not writable, and the imported binding must not inherit the writable
|
|
90
|
+
* identity that carries `bind={...}` and `event => name = ...`. The Web
|
|
91
|
+
* extension publishes which exported names are derived, so the import is
|
|
92
|
+
* demoted to the read-only reactive identity here.
|
|
93
|
+
*
|
|
94
|
+
* `markCore` is the base analyzer's own registration, which only the class can
|
|
95
|
+
* reach: this rule decides which identity the name receives and then hands the
|
|
96
|
+
* decision back.
|
|
97
|
+
*/
|
|
98
|
+
export declare function markWebBindingReactive(host: DeclarationAnalysisHost, name: string, kind: "state" | "prop", markCore: (name: string, kind: "state" | "prop") => void): void;
|
|
99
|
+
//# sourceMappingURL=declarations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarations.d.ts","sourceRoot":"","sources":["../../src/analysis/declarations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a Web declaration means and what analyzing one does: the types a
|
|
3
|
+
* `component` and an `action` publish, the four reactive declarations
|
|
4
|
+
* (`state`, `computed`, `resource`, `action`), the module-level `import css
|
|
5
|
+
* unsafe`, the scope prescan's answer, and the demotion an imported derived
|
|
6
|
+
* name receives.
|
|
7
|
+
*
|
|
8
|
+
* D115 P4 R3c. Every one of these is reached from the analyzer's statement
|
|
9
|
+
* seams, which stay on the root as the dispatch over statement kinds; the arms
|
|
10
|
+
* themselves live here. `analyzeComponent` calls the same four declaration
|
|
11
|
+
* analyzers from a component body, which is why they are a module both the root
|
|
12
|
+
* and `components/` can call and why the import runs one way only:
|
|
13
|
+
* `components/` reads this module, and this module never reads `components/`.
|
|
14
|
+
*/
|
|
15
|
+
import {} from "@velarscript/compiler";
|
|
16
|
+
import { anyType, boolType, describeType, isInvalidType, nullType, optionalOf, spanIdentity, stringType, unknownType, } from "@velarscript/compiler/extension";
|
|
17
|
+
import { isWebStatement, } from "../ast.js";
|
|
18
|
+
import { webComponentConstructor } from "../types.js";
|
|
19
|
+
import { recordDerivedKeyedListRebuild } from "./keyed-rebuild.js";
|
|
20
|
+
import { containsCssImport, firstRelativeCssAssetAddress } from "./look-sites.js";
|
|
21
|
+
import { diagnostic } from "./web-types.js";
|
|
22
|
+
export function componentType(host, statement) {
|
|
23
|
+
const props = new Map(statement.parameters.map((parameter) => [parameter.name, host.resolveValidatedAnnotation(parameter.type)]));
|
|
24
|
+
if (!props.has("class"))
|
|
25
|
+
props.set("class", optionalOf(stringType));
|
|
26
|
+
if (!props.has("look"))
|
|
27
|
+
props.set("look", optionalOf({ kind: "named", name: "Look" }));
|
|
28
|
+
return webComponentConstructor(statement.name, props, new Set(statement.parameters.filter((parameter) => !parameter.defaultValue).map((parameter) => parameter.name)), statement.handleType ? host.resolveValidatedAnnotation(statement.handleType) : null);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A `state` declaration, at module scope and in a component body alike: the two
|
|
32
|
+
* arms are the same eight lines, so they are written once here.
|
|
33
|
+
*/
|
|
34
|
+
export function analyzeStateDeclaration(host, statement) {
|
|
35
|
+
const annotationValid = statement.type ? host.validateTypeReference(statement.type) : true;
|
|
36
|
+
const annotationContext = statement.type ? host.resolveValidatedAnnotation(statement.type) : null;
|
|
37
|
+
const actual = host.inferExpression(statement.initializer, annotationContext ?? unknownType);
|
|
38
|
+
const declared = annotationContext ?? actual;
|
|
39
|
+
if (annotationValid)
|
|
40
|
+
host.requireAssignable(actual, declared, statement.initializer.span);
|
|
41
|
+
host.requireSettledCollectionElement(statement.initializer, declared, annotationContext !== null);
|
|
42
|
+
host.declareBinding(statement.name, true, declared, statement.span);
|
|
43
|
+
host.markDeclaredBindingReactive(statement.name, "state");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* D71 rule 182: a derived value is reactive and read-only, which is exactly
|
|
47
|
+
* the reactive identity a component prop already carries — a bare read lowers
|
|
48
|
+
* through `.get()`, and nothing may write it. Registering that identity
|
|
49
|
+
* rather than `state` is what keeps `bind={doubled}` and every other writable
|
|
50
|
+
* position refusing a derived name for free.
|
|
51
|
+
*/
|
|
52
|
+
export function analyzeComputedDeclaration(host, statement) {
|
|
53
|
+
const annotationValid = statement.type ? host.validateTypeReference(statement.type) : true;
|
|
54
|
+
const annotationContext = statement.type ? host.resolveValidatedAnnotation(statement.type) : null;
|
|
55
|
+
// The initializer re-runs on every dependency change, so it is a deferred
|
|
56
|
+
// read for the module-initialization-cycle classification, exactly like a
|
|
57
|
+
// watch subject.
|
|
58
|
+
host.synchronousReactiveDepth += 1;
|
|
59
|
+
const actual = host.inferExpression(statement.initializer, annotationContext ?? unknownType);
|
|
60
|
+
host.synchronousReactiveDepth -= 1;
|
|
61
|
+
const declared = annotationContext ?? actual;
|
|
62
|
+
if (annotationValid)
|
|
63
|
+
host.requireAssignable(actual, declared, statement.initializer.span);
|
|
64
|
+
host.declareBinding(statement.name, false, declared, statement.span);
|
|
65
|
+
host.markDeclaredBindingReactive(statement.name, "prop");
|
|
66
|
+
host.computedBindingSpans.add(spanIdentity(statement.span));
|
|
67
|
+
recordDerivedKeyedListRebuild(host, statement);
|
|
68
|
+
}
|
|
69
|
+
export function analyzeResourceDeclaration(host, statement) {
|
|
70
|
+
const annotated = statement.type ? host.resolveAnnotation(statement.type) : null;
|
|
71
|
+
const annotationValid = statement.type ? host.validateTypeReference(statement.type) : true;
|
|
72
|
+
const annotationContext = statement.type ? host.resolveValidatedAnnotation(statement.type) : null;
|
|
73
|
+
const expected = annotationContext ? { kind: "promise", value: annotationContext } : unknownType;
|
|
74
|
+
const actual = host.inferExpression(statement.initializer, expected);
|
|
75
|
+
let value = annotationContext ?? unknownType;
|
|
76
|
+
if (actual.kind === "promise") {
|
|
77
|
+
if (annotated && annotationValid)
|
|
78
|
+
host.requireAssignable(actual.value, annotated, statement.initializer.span);
|
|
79
|
+
else if (!statement.type)
|
|
80
|
+
value = actual.value;
|
|
81
|
+
}
|
|
82
|
+
else if (actual.kind === "any") {
|
|
83
|
+
value = annotationContext ?? anyType;
|
|
84
|
+
}
|
|
85
|
+
else if (!isInvalidType(actual)) {
|
|
86
|
+
host.diagnostics.push(diagnostic("VEL4016", `A resource initializer must return Promise<T>, received ${describeType(actual)}`, statement.initializer.span));
|
|
87
|
+
}
|
|
88
|
+
const fields = new Map([
|
|
89
|
+
["value", value.kind === "null" ? nullType : optionalOf(value)],
|
|
90
|
+
["loading", boolType],
|
|
91
|
+
["ready", boolType],
|
|
92
|
+
["error", optionalOf({ kind: "class", name: "Error" })],
|
|
93
|
+
["reload", { kind: "function", parameters: [], requiredParameters: 0, result: { kind: "promise", value: nullType } }],
|
|
94
|
+
]);
|
|
95
|
+
host.declareBinding(statement.name, false, { kind: "object", fields }, statement.span);
|
|
96
|
+
host.resourceBindingSpans.add(spanIdentity(statement.span));
|
|
97
|
+
}
|
|
98
|
+
export function actionType(host, statement) {
|
|
99
|
+
const declaredResult = host.resolvedAsyncResult(host.inferredFunctionResult(statement));
|
|
100
|
+
const rest = statement.parameters.find((parameter) => parameter.rest);
|
|
101
|
+
return {
|
|
102
|
+
kind: "action",
|
|
103
|
+
parameters: statement.parameters.filter((parameter) => !parameter.rest).map((parameter) => host.resolveValidatedAnnotation(parameter.type)),
|
|
104
|
+
parameterNames: statement.parameters.filter((parameter) => !parameter.rest).map((parameter) => parameter.name),
|
|
105
|
+
requiredParameters: statement.parameters.filter((parameter) => !parameter.rest && !parameter.defaultValue).length,
|
|
106
|
+
...(rest ? { rest: host.resolveValidatedAnnotation(rest.type) } : {}),
|
|
107
|
+
result: { kind: "promise", value: declaredResult },
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function analyzeActionDeclaration(host, statement) {
|
|
111
|
+
host.declareBinding(statement.name, false, actionType(host, statement), statement.span);
|
|
112
|
+
host.analyzeFunctionDeclaration(statement, null, true, false, true, "Action");
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* LOK-D2 / D53: unsafe CSS is a module-level ordering declaration, whether its
|
|
116
|
+
* source is an external resource or an inline raw block. Nested inside a
|
|
117
|
+
* component or a function it used to pass every check, build, and then appear
|
|
118
|
+
* in no output at all.
|
|
119
|
+
*/
|
|
120
|
+
export function analyzeUnsafeCssDeclaration(host, statement) {
|
|
121
|
+
if (!host.isTopLevelScope()) {
|
|
122
|
+
host.diagnostics.push(diagnostic("VEL5037", "Unsafe CSS is module-level; move the declaration to the top of the module so its order against Look stays visible", statement.span));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (statement.source.kind === "external" && host.unsafeCssImports.has(statement.source.path)) {
|
|
126
|
+
host.diagnostics.push(diagnostic("VEL5037", `Unsafe CSS '${statement.source.path}' is imported more than once; each stylesheet must have one explicit order position`, statement.span));
|
|
127
|
+
}
|
|
128
|
+
if (statement.source.kind === "external")
|
|
129
|
+
host.unsafeCssImports.add(statement.source.path);
|
|
130
|
+
const source = statement.source.kind === "inline" ? statement.source.css : host.resources.get(statement.source.path);
|
|
131
|
+
const subject = statement.source.kind === "inline" ? "Inline unsafe CSS" : `Unsafe CSS '${statement.source.path}'`;
|
|
132
|
+
if (source && containsCssImport(source)) {
|
|
133
|
+
host.diagnostics.push(diagnostic("VEL5037", `${subject} contains @import; declare every stylesheet with 'import css unsafe' so project order remains visible`, statement.source.span));
|
|
134
|
+
}
|
|
135
|
+
if (source) {
|
|
136
|
+
const relativeAddress = firstRelativeCssAssetAddress(source);
|
|
137
|
+
if (relativeAddress)
|
|
138
|
+
host.diagnostics.push(diagnostic("VEL5037", `${subject} uses relative asset address ${relativeAddress.syntax}(${JSON.stringify(relativeAddress.value)}); use a project-public /path, data URL, fragment, or absolute URL so extracted asset ownership stays explicit`, statement.source.span));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/** The three Web declarations a scope prescan has to see, so a later shadow of one is recognised. */
|
|
142
|
+
export function webScopeDeclaration(statement) {
|
|
143
|
+
if (!isWebStatement(statement))
|
|
144
|
+
return null;
|
|
145
|
+
return statement.kind === "ExtensionStatement:web:state" || statement.kind === "ExtensionStatement:web:computed"
|
|
146
|
+
|| statement.kind === "ExtensionStatement:web:resource"
|
|
147
|
+
? { name: statement.name, span: statement.span }
|
|
148
|
+
: null;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* D71 rule 184: a cross-module `computed` travels through `reactiveExports`
|
|
152
|
+
* so its bare read lowers through `.get()` like an exported `state` — but it
|
|
153
|
+
* is not writable, and the imported binding must not inherit the writable
|
|
154
|
+
* identity that carries `bind={...}` and `event => name = ...`. The Web
|
|
155
|
+
* extension publishes which exported names are derived, so the import is
|
|
156
|
+
* demoted to the read-only reactive identity here.
|
|
157
|
+
*
|
|
158
|
+
* `markCore` is the base analyzer's own registration, which only the class can
|
|
159
|
+
* reach: this rule decides which identity the name receives and then hands the
|
|
160
|
+
* decision back.
|
|
161
|
+
*/
|
|
162
|
+
export function markWebBindingReactive(host, name, kind, markCore) {
|
|
163
|
+
// Only the import itself is demoted. A local `state` of the same name in a
|
|
164
|
+
// component or a block is a shadow that really is writable, and demoting it
|
|
165
|
+
// would compile its assignment as a plain store into the handle.
|
|
166
|
+
const imported = kind === "state" && host.isTopLevelScope() && host.importedComputedNames.has(name);
|
|
167
|
+
markCore(name, imported ? "prop" : kind);
|
|
168
|
+
if (!imported)
|
|
169
|
+
return;
|
|
170
|
+
const binding = host.lookup(name);
|
|
171
|
+
if (!binding)
|
|
172
|
+
return;
|
|
173
|
+
host.computedBindingSpans.add(spanIdentity(binding.span));
|
|
174
|
+
host.importedComputedSpans.add(spanIdentity(binding.span));
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=declarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../src/analysis/declarations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the Web extension adds to expression inference, either side of the core
|
|
3
|
+
* walk: the shapes it refuses before the core sees them, the answers it has
|
|
4
|
+
* already computed and hands back instead of walking again, the Look length a
|
|
5
|
+
* builder call folds to, and the two reports a call earns once its type is
|
|
6
|
+
* known. The extension's own call and type-syntax rules — a component element
|
|
7
|
+
* called like a function, and `Component<Props, Handle>` — are here too.
|
|
8
|
+
*
|
|
9
|
+
* D115 P4 R3c. The dispatch itself stays on the analyzer: `inferExpression` and
|
|
10
|
+
* `inferExtensionExpression` are seams the core owns, and what they hand to the
|
|
11
|
+
* JSX, keyframes and Look walks is the one thing that is genuinely a dispatch.
|
|
12
|
+
* Everything on either side of it is a rule, and rules live here.
|
|
13
|
+
*/
|
|
14
|
+
import { type Span } from "@velarscript/compiler";
|
|
15
|
+
import { type Expression, type ExtensionValueType, type TypeReference, type TypeSyntax, type ValueType } from "@velarscript/compiler/extension";
|
|
16
|
+
import { type LookAnalysisHost } from "./look/host.ts";
|
|
17
|
+
import { type ReactiveNamesHost } from "./reactivity/host.ts";
|
|
18
|
+
import { type RetiredAccessorHost } from "./reactivity/retired-accessors.ts";
|
|
19
|
+
/** The state the inference rules own: the probe cache, and the two module inputs a call is proved against. */
|
|
20
|
+
export interface ExpressionInferenceHost {
|
|
21
|
+
/** The Look-arithmetic hints this walk records for the emitter, keyed by expression span. */
|
|
22
|
+
readonly extensionCalls: Map<string, string>;
|
|
23
|
+
/**
|
|
24
|
+
* Operands probed for Look arithmetic. The core analyzer re-requests one
|
|
25
|
+
* immediately after the probe declines, so the answer is parked here and
|
|
26
|
+
* consumed once — that is what keeps operand analysis single-run and operand
|
|
27
|
+
* diagnostics unrepeated.
|
|
28
|
+
*/
|
|
29
|
+
readonly probedOperandTypes: Map<string, ValueType>;
|
|
30
|
+
/** The names this module declares as public configuration, from the program's own reading. Replaced per program. */
|
|
31
|
+
readonly publicConfigNames: ReadonlySet<string>;
|
|
32
|
+
/** D114 0.29.0 LC-D1: the manifest's `web.publicConfig`, or null when this compile read no project manifest. */
|
|
33
|
+
readonly webPublicConfig: Readonly<Record<string, unknown>> | null;
|
|
34
|
+
/** The module's source, which is what a component-call refusal quotes the arguments out of. */
|
|
35
|
+
readonly webSourceText: string;
|
|
36
|
+
fieldsOf(identity: string): ReadonlyMap<string, ValueType> | null;
|
|
37
|
+
typeError(message: string, errorSpan: Span): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The one face the inference rules read. It is an intersection because the
|
|
41
|
+
* rules on either side of the core walk really do reach three other groups: a
|
|
42
|
+
* call is checked as a Look builder call, a zero-argument call of a derived
|
|
43
|
+
* name is refused, and an identifier read is recorded for the D71 migration.
|
|
44
|
+
*/
|
|
45
|
+
export type InferenceHost = ExpressionInferenceHost & LookAnalysisHost & ReactiveNamesHost & RetiredAccessorHost;
|
|
46
|
+
/**
|
|
47
|
+
* The Web shapes refused before the core analyzer sees the expression, in the
|
|
48
|
+
* order they are asked. `undefined` means nothing here claimed the expression
|
|
49
|
+
* and the extension dispatch continues.
|
|
50
|
+
*/
|
|
51
|
+
export declare function webExpressionShapeRefusals(host: InferenceHost, expression: Expression): ValueType | undefined;
|
|
52
|
+
/** The two Web expressions that are a value rather than a walk: a misplaced Look hook, and a unit literal. */
|
|
53
|
+
export declare function webExtensionValueType(host: InferenceHost, expression: Expression): ValueType | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* The answers the Web extension already holds for this expression, given back
|
|
56
|
+
* instead of walking it a second time. Null means the core walk should run.
|
|
57
|
+
*/
|
|
58
|
+
export declare function answeredBeforeInference(host: InferenceHost, expression: Expression): ValueType | null;
|
|
59
|
+
/** The compile-time Look length a builder call folds to, or null when the call is not one. */
|
|
60
|
+
export declare function foldedWebLength(host: InferenceHost, expression: Expression): ValueType | null;
|
|
61
|
+
/** Infers one builder slot and parks the answer in the probe cache, so the call's own analysis reads it back. */
|
|
62
|
+
export declare function probedSlotType(host: InferenceHost, argument: Expression): ValueType;
|
|
63
|
+
/** The two reports a call earns once the core walk has answered its type. */
|
|
64
|
+
export declare function reportInferredWebCall(host: InferenceHost, expression: Expression, result: ValueType): void;
|
|
65
|
+
export declare function inferWebExtensionCall(host: InferenceHost, callee: ExtensionValueType, arguments_: readonly Expression[], argumentNames: readonly (string | null)[] | undefined, callSpan: Span): ValueType | undefined;
|
|
66
|
+
export declare function validateWebExtensionTypeSyntax(host: InferenceHost, syntax: TypeSyntax, validate: (syntax: TypeSyntax) => boolean, resolve: (reference: TypeReference) => ValueType): boolean | undefined;
|
|
67
|
+
//# sourceMappingURL=inference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../src/analysis/inference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAOL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMvD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAoD,KAAK,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAG/H,8GAA8G;AAC9G,MAAM,WAAW,uBAAuB;IACtC,6FAA6F;IAC7F,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,oHAAoH;IACpH,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,gHAAgH;IAChH,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IACnE,+FAA+F;IAC/F,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IAClE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,uBAAuB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;AAEjH;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAoF7G;AAED,8GAA8G;AAC9G,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAWxG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAwBrG;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAG7F;AAED,iHAAiH;AACjH,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,GAAG,SAAS,CAInF;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAO1G;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,SAAS,UAAU,EAAE,EACjC,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS,EACrD,QAAQ,EAAE,IAAI,GACb,SAAS,GAAG,SAAS,CAKvB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,EACzC,OAAO,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,SAAS,GAC/C,OAAO,GAAG,SAAS,CA8CrB"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the Web extension adds to expression inference, either side of the core
|
|
3
|
+
* walk: the shapes it refuses before the core sees them, the answers it has
|
|
4
|
+
* already computed and hands back instead of walking again, the Look length a
|
|
5
|
+
* builder call folds to, and the two reports a call earns once its type is
|
|
6
|
+
* known. The extension's own call and type-syntax rules — a component element
|
|
7
|
+
* called like a function, and `Component<Props, Handle>` — are here too.
|
|
8
|
+
*
|
|
9
|
+
* D115 P4 R3c. The dispatch itself stays on the analyzer: `inferExpression` and
|
|
10
|
+
* `inferExtensionExpression` are seams the core owns, and what they hand to the
|
|
11
|
+
* JSX, keyframes and Look walks is the one thing that is genuinely a dispatch.
|
|
12
|
+
* Everything on either side of it is a rule, and rules live here.
|
|
13
|
+
*/
|
|
14
|
+
import {} from "@velarscript/compiler";
|
|
15
|
+
import { boolType, describeType, expressionContainsDirectAwait, invalidType, spanIdentity, unknownType, } from "@velarscript/compiler/extension";
|
|
16
|
+
import { isWebExpression, isWebJsx, isWebUnit } from "../ast.js";
|
|
17
|
+
import { LOOK_ARITHMETIC_HINT, LOOK_UNIT_TYPES } from "../look.js";
|
|
18
|
+
import { isWebComponentType, isWebNodeType, webComponentName, webNodeType } from "../types.js";
|
|
19
|
+
import { componentCallRefusal } from "./component-guidance.js";
|
|
20
|
+
import { checkLookBuilderCall } from "./look/builders.js";
|
|
21
|
+
import {} from "./look/host.js";
|
|
22
|
+
import { foldedLengthPercentage, isLookNumericType } from "./look-values.js";
|
|
23
|
+
import { lookJoin, lookLiteralZero } from "./look-sites.js";
|
|
24
|
+
import { lookSourceOf } from "./media-conditions.js";
|
|
25
|
+
import { publicConfigDiagnostic } from "./public-config.js";
|
|
26
|
+
import { calledComputedBinding } from "./reactivity/derived.js";
|
|
27
|
+
import {} from "./reactivity/host.js";
|
|
28
|
+
import { recordRetiredAccessorRead, RETIRED_ACCESSOR_TYPE } from "./reactivity/retired-accessors.js";
|
|
29
|
+
import { diagnostic, webEventDeadFields, webEventTypeNames } from "./web-types.js";
|
|
30
|
+
/**
|
|
31
|
+
* The Web shapes refused before the core analyzer sees the expression, in the
|
|
32
|
+
* order they are asked. `undefined` means nothing here claimed the expression
|
|
33
|
+
* and the extension dispatch continues.
|
|
34
|
+
*/
|
|
35
|
+
export function webExpressionShapeRefusals(host, expression) {
|
|
36
|
+
if (expression.kind === "CallExpression" && expression.callee.kind === "IdentifierExpression"
|
|
37
|
+
&& expression.callee.name === "mount") {
|
|
38
|
+
const namedNode = expression.argumentNames?.findIndex((name) => name === "node") ?? -1;
|
|
39
|
+
const node = expression.arguments[namedNode >= 0 ? namedNode : 0];
|
|
40
|
+
if (node && expressionContainsDirectAwait(node, (value) => value.kind === "ExtensionExpression:web:jsx" ? false : undefined)) {
|
|
41
|
+
host.diagnostics.push(diagnostic("VEL4007", "mount constructs its root synchronously; await the root in a separate module binding before calling mount", node.span));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (expression.kind === "UnaryExpression" && (expression.operator === "+" || expression.operator === "-")) {
|
|
45
|
+
const operand = host.inferExpression(expression.operand);
|
|
46
|
+
if (isLookNumericType(operand)) {
|
|
47
|
+
host.extensionCalls.set(spanIdentity(expression.span), LOOK_ARITHMETIC_HINT);
|
|
48
|
+
return operand;
|
|
49
|
+
}
|
|
50
|
+
host.probedOperandTypes.set(spanIdentity(expression.operand.span), operand);
|
|
51
|
+
}
|
|
52
|
+
// WEB-U15 / GRM-A3: '&&' rendering is the React habit. The lexer now starts
|
|
53
|
+
// JSX after 'and'/'or' so the shape parses and this rejection names the
|
|
54
|
+
// conditional-rendering spelling instead of leaking a bool type error.
|
|
55
|
+
if (expression.kind === "BinaryExpression" && (expression.operator === "and" || expression.operator === "or")
|
|
56
|
+
&& (isWebJsx(expression.left) || isWebJsx(expression.right))) {
|
|
57
|
+
const rightIsElement = isWebJsx(expression.right);
|
|
58
|
+
const tag = rightIsElement ? expression.right.tag : isWebJsx(expression.left) ? expression.left.tag : "";
|
|
59
|
+
const condition = lookSourceOf(rightIsElement ? expression.left : expression.right);
|
|
60
|
+
host.inferExpression(expression.left);
|
|
61
|
+
host.inferExpression(expression.right);
|
|
62
|
+
host.diagnostics.push(diagnostic("VEL5029", `'${expression.operator}' combines bool values and cannot yield an element; render conditionally with '{${condition} ? <${tag || ">"} ... : null}'`, expression.span));
|
|
63
|
+
return invalidType;
|
|
64
|
+
}
|
|
65
|
+
if (expression.kind === "BinaryExpression" && ["+", "-", "*", "/"].includes(expression.operator)) {
|
|
66
|
+
const left = host.inferExpression(expression.left);
|
|
67
|
+
const right = host.inferExpression(expression.right);
|
|
68
|
+
if (!isLookNumericType(left) && !isLookNumericType(right)) {
|
|
69
|
+
host.probedOperandTypes.set(spanIdentity(expression.left.span), left);
|
|
70
|
+
host.probedOperandTypes.set(spanIdentity(expression.right.span), right);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const additive = expression.operator === "+" || expression.operator === "-" ? lookJoin(left, right) : null;
|
|
74
|
+
const result = additive
|
|
75
|
+
?? ((expression.operator === "*" || expression.operator === "/") && isLookNumericType(left) && right.kind === "number" ? left : null)
|
|
76
|
+
?? (expression.operator === "*" && left.kind === "number" && isLookNumericType(right) ? right : null);
|
|
77
|
+
if (result) {
|
|
78
|
+
// LOK-U8: dividing a visual value by a literal zero produces a
|
|
79
|
+
// non-finite length that the runtime rejects on first construction.
|
|
80
|
+
if (expression.operator === "/" && lookLiteralZero(expression.right)) {
|
|
81
|
+
host.diagnostics.push(diagnostic("VEL5042", "Look unit arithmetic cannot divide by zero", expression.span));
|
|
82
|
+
return invalidType;
|
|
83
|
+
}
|
|
84
|
+
host.extensionCalls.set(spanIdentity(expression.span), LOOK_ARITHMETIC_HINT);
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
// The rejection is final: returning the invalid type keeps the Look
|
|
88
|
+
// property's own assignment error from co-reporting a union dump on the
|
|
89
|
+
// very expression that was already named (LOK-I1).
|
|
90
|
+
host.diagnostics.push(diagnostic("VEL5042", `Look unit arithmetic cannot apply '${expression.operator}' to ${describeType(left)} and ${describeType(right)}`, expression.span));
|
|
91
|
+
return invalidType;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// WEB-N2 / D47 rule 84: the event object is typed down to event semantics
|
|
95
|
+
// and deliberately carries no target, so `event.target.value` is a dead end
|
|
96
|
+
// that used to cascade into three unknown-access errors. The read is where
|
|
97
|
+
// the author wanted two-way binding, so it names that spelling and stops.
|
|
98
|
+
if (expression.kind === "MemberExpression" && !expression.optional && webEventDeadFields.has(expression.property)
|
|
99
|
+
&& expression.object.kind === "IdentifierExpression") {
|
|
100
|
+
const binding = host.lookup(expression.object.name);
|
|
101
|
+
const expanded = binding ? host.expandAliases(binding.type) : null;
|
|
102
|
+
if (expanded?.kind === "named" && webEventTypeNames.has(expanded.name)) {
|
|
103
|
+
host.diagnostics.push(diagnostic("VEL5019", `A VelarScript event object carries typed event fields only and has no '${expression.property}': read the element's value through a two-way binding instead — 'bind:value={name}' binds a state name, and 'bind:value={form.field}' or 'bind:value={items[0]}' binds a writable path inside state`, expression.span));
|
|
104
|
+
return invalidType;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
/** The two Web expressions that are a value rather than a walk: a misplaced Look hook, and a unit literal. */
|
|
110
|
+
export function webExtensionValueType(host, expression) {
|
|
111
|
+
if (isWebExpression(expression) && expression.kind === "ExtensionExpression:web:look-hook") {
|
|
112
|
+
host.diagnostics.push(diagnostic("VEL5038", `Look hook '@${expression.name}' is only valid inside a Look condition`, expression.span));
|
|
113
|
+
return boolType;
|
|
114
|
+
}
|
|
115
|
+
if (isWebUnit(expression)) {
|
|
116
|
+
const type = LOOK_UNIT_TYPES.get(expression.unit);
|
|
117
|
+
if (type)
|
|
118
|
+
return { kind: "named", name: type };
|
|
119
|
+
return unknownType;
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The answers the Web extension already holds for this expression, given back
|
|
125
|
+
* instead of walking it a second time. Null means the core walk should run.
|
|
126
|
+
*/
|
|
127
|
+
export function answeredBeforeInference(host, expression) {
|
|
128
|
+
// Operands probed for Look arithmetic are re-requested by the core analyzer immediately after the
|
|
129
|
+
// probe declines; reusing the probe result (consume-once) keeps operand analysis single-run so
|
|
130
|
+
// operand diagnostics are not reported twice.
|
|
131
|
+
const key = spanIdentity(expression.span);
|
|
132
|
+
const probed = host.probedOperandTypes.get(key);
|
|
133
|
+
if (probed !== undefined) {
|
|
134
|
+
host.probedOperandTypes.delete(key);
|
|
135
|
+
return probed;
|
|
136
|
+
}
|
|
137
|
+
if (expression.kind === "CallExpression" && expression.arguments.length === 0
|
|
138
|
+
&& expression.callee.kind === "IdentifierExpression") {
|
|
139
|
+
host.plainCallSpans.set(spanIdentity(expression.callee.span), expression.span);
|
|
140
|
+
const called = calledComputedBinding(host, expression);
|
|
141
|
+
if (called)
|
|
142
|
+
return called;
|
|
143
|
+
}
|
|
144
|
+
if (expression.kind === "IdentifierExpression") {
|
|
145
|
+
const retired = recordRetiredAccessorRead(host, expression);
|
|
146
|
+
// The retired name is answered here rather than left to fall through as an
|
|
147
|
+
// unknown one: the author gets its migration and nothing else, and the
|
|
148
|
+
// call around it still type-checks against the signature it always had.
|
|
149
|
+
if (retired)
|
|
150
|
+
return RETIRED_ACCESSOR_TYPE;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
/** The compile-time Look length a builder call folds to, or null when the call is not one. */
|
|
155
|
+
export function foldedWebLength(host, expression) {
|
|
156
|
+
return expression.kind !== "CallExpression" ? null
|
|
157
|
+
: foldedLengthPercentage(expression, (name) => host.lookBuilderNames.get(name), (argument) => probedSlotType(host, argument), lookJoin);
|
|
158
|
+
}
|
|
159
|
+
/** Infers one builder slot and parks the answer in the probe cache, so the call's own analysis reads it back. */
|
|
160
|
+
export function probedSlotType(host, argument) {
|
|
161
|
+
const inferred = host.inferExpression(argument);
|
|
162
|
+
host.probedOperandTypes.set(spanIdentity(argument.span), inferred);
|
|
163
|
+
return host.expandAliases(inferred);
|
|
164
|
+
}
|
|
165
|
+
/** The two reports a call earns once the core walk has answered its type. */
|
|
166
|
+
export function reportInferredWebCall(host, expression, result) {
|
|
167
|
+
if (expression.kind !== "CallExpression")
|
|
168
|
+
return;
|
|
169
|
+
checkLookBuilderCall(host, expression);
|
|
170
|
+
// D114 0.29.0 LC-D1: the manifest this build bakes in, proved against the declared type.
|
|
171
|
+
const report = publicConfigDiagnostic(expression, result, host.publicConfigNames, host.webPublicConfig, { expandAliases: (type) => host.expandAliases(type), fieldsOf: (identity) => host.fieldsOf(identity), describeType });
|
|
172
|
+
if (report)
|
|
173
|
+
host.diagnostics.push(report);
|
|
174
|
+
}
|
|
175
|
+
export function inferWebExtensionCall(host, callee, arguments_, argumentNames, callSpan) {
|
|
176
|
+
if (!isWebComponentType(callee))
|
|
177
|
+
return undefined;
|
|
178
|
+
host.typeError(componentCallRefusal(webComponentName(callee), arguments_, argumentNames, host.webSourceText), callSpan);
|
|
179
|
+
for (const argument of arguments_)
|
|
180
|
+
host.inferExpression(argument);
|
|
181
|
+
return webNodeType;
|
|
182
|
+
}
|
|
183
|
+
export function validateWebExtensionTypeSyntax(host, syntax, validate, resolve) {
|
|
184
|
+
if (syntax.kind !== "GenericTypeSyntax" || syntax.name !== "Component")
|
|
185
|
+
return undefined;
|
|
186
|
+
let valid = true;
|
|
187
|
+
if (syntax.arguments.length < 1 || syntax.arguments.length > 2) {
|
|
188
|
+
host.typeError("Component<Props, Handle> requires a named prop signature and at most one Handle type", syntax.span);
|
|
189
|
+
valid = false;
|
|
190
|
+
}
|
|
191
|
+
const argumentsValid = syntax.arguments.map(validate).every(Boolean);
|
|
192
|
+
const signature = syntax.arguments[0];
|
|
193
|
+
if (!signature)
|
|
194
|
+
return false;
|
|
195
|
+
if (signature.kind !== "FunctionTypeSyntax") {
|
|
196
|
+
host.typeError("Component<Props, Handle> requires a named function signature such as Component<(title: string) -> WebNode, DialogHandle>", signature.span);
|
|
197
|
+
valid = false;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const names = new Set();
|
|
201
|
+
for (const parameter of signature.parameters) {
|
|
202
|
+
if (!parameter.name) {
|
|
203
|
+
host.typeError("Every Component signature prop requires a name", parameter.span);
|
|
204
|
+
valid = false;
|
|
205
|
+
}
|
|
206
|
+
else if (names.has(parameter.name)) {
|
|
207
|
+
host.typeError(`Component signature prop '${parameter.name}' is declared more than once`, parameter.span);
|
|
208
|
+
valid = false;
|
|
209
|
+
}
|
|
210
|
+
else
|
|
211
|
+
names.add(parameter.name);
|
|
212
|
+
if (parameter.rest) {
|
|
213
|
+
host.typeError("Component signatures use named props and cannot declare a rest parameter", parameter.span);
|
|
214
|
+
valid = false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const result = resolve({ syntax: signature.result, span: signature.result.span });
|
|
218
|
+
if (!isWebNodeType(result)) {
|
|
219
|
+
host.typeError(`A Component signature must return WebNode, received ${describeType(result)}`, signature.result.span);
|
|
220
|
+
valid = false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const handleSyntax = syntax.arguments[1];
|
|
224
|
+
if (handleSyntax && argumentsValid) {
|
|
225
|
+
const handle = host.expandAliases(resolve({ syntax: handleSyntax, span: handleSyntax.span }));
|
|
226
|
+
const fields = handle.kind === "object"
|
|
227
|
+
? handle.fields
|
|
228
|
+
: handle.kind === "named" ? host.fieldsOf(handle.identity ?? handle.name) : null;
|
|
229
|
+
if (!fields) {
|
|
230
|
+
host.typeError(`A Component Handle must be a concrete record type, received ${describeType(handle)}`, handleSyntax.span);
|
|
231
|
+
valid = false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return valid && argumentsValid;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=inference.js.map
|