From 9d357064c96cf7277c279b8eef0a670108d15fc9 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Wed, 7 Feb 2024 20:58:57 +0100 Subject: [PATCH 1/7] add test project for generic JSX transform --- .gitignore | 4 + analysis/Makefile | 6 +- analysis/tests-generic-jsx-transform/Makefile | 17 + .../package-lock.json | 33 + .../tests-generic-jsx-transform/package.json | 10 + .../tests-generic-jsx-transform/rescript.json | 11 + .../src/GenericJsx.res | 62 + .../src/GenericJsxCompletion.res | 2 + .../src/expected/GenericJsx.res.txt | 0 .../src/expected/GenericJsxCompletion.res.txt | 2890 +++++++++++++++++ analysis/tests-generic-jsx-transform/test.sh | 21 + 11 files changed, 3055 insertions(+), 1 deletion(-) create mode 100644 analysis/tests-generic-jsx-transform/Makefile create mode 100644 analysis/tests-generic-jsx-transform/package-lock.json create mode 100644 analysis/tests-generic-jsx-transform/package.json create mode 100644 analysis/tests-generic-jsx-transform/rescript.json create mode 100644 analysis/tests-generic-jsx-transform/src/GenericJsx.res create mode 100644 analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res create mode 100644 analysis/tests-generic-jsx-transform/src/expected/GenericJsx.res.txt create mode 100644 analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt create mode 100755 analysis/tests-generic-jsx-transform/test.sh diff --git a/.gitignore b/.gitignore index be3459b4b..fb3e740fd 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ analysis/tests/lib analysis/tests/.bsb.lock analysis/tests/.merlin +analysis/tests-generic-jsx-transform/lib +analysis/tests-generic-jsx-transform/.bsb.lock +analysis/tests-generic-jsx-transform/.merlin + tools/node_modules tools/lib tools/**/*.res.js diff --git a/analysis/Makefile b/analysis/Makefile index a29bdbd81..e0e190d30 100644 --- a/analysis/Makefile +++ b/analysis/Makefile @@ -3,16 +3,20 @@ SHELL = /bin/bash build-tests: make -C tests build +build-tests-generic-jsx-transform: + make -C tests-generic-jsx-transform build + build-reanalyze: make -C reanalyze build -build: build-reanalyze build-tests +build: build-reanalyze build-tests build-tests-generic-jsx-transform dce: build-analysis-binary opam exec reanalyze.exe -- -dce-cmt _build -suppress vendor test-analysis-binary: make -C tests test + make -C tests-generic-jsx-transform test test-reanalyze: make -C reanalyze test diff --git a/analysis/tests-generic-jsx-transform/Makefile b/analysis/tests-generic-jsx-transform/Makefile new file mode 100644 index 000000000..5084c67ab --- /dev/null +++ b/analysis/tests-generic-jsx-transform/Makefile @@ -0,0 +1,17 @@ +SHELL = /bin/bash + +node_modules/.bin/rescript: + npm install + +build: node_modules/.bin/rescript + node_modules/.bin/rescript + +test: build + ./test.sh + +clean: + rm -r node_modules lib + +.DEFAULT_GOAL := test + +.PHONY: clean test diff --git a/analysis/tests-generic-jsx-transform/package-lock.json b/analysis/tests-generic-jsx-transform/package-lock.json new file mode 100644 index 000000000..46f650085 --- /dev/null +++ b/analysis/tests-generic-jsx-transform/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "tests-generic-jsx-transform", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "rescript": "11.1.0-rc.1" + } + }, + "node_modules/rescript": { + "version": "11.1.0-rc.1", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.1.tgz", + "integrity": "sha512-EGm6Es+Cbrpct0sDnHY2oRTsrtVzKmuCio9EEIFnznSlLIt3ZmJvFQiZ94m0CwHQP68tS0YRO7HlR/HS/nZJRw==", + "hasInstallScript": true, + "bin": { + "bsc": "bsc", + "bstracing": "lib/bstracing", + "rescript": "rescript" + }, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "rescript": { + "version": "11.1.0-rc.1", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.1.tgz", + "integrity": "sha512-EGm6Es+Cbrpct0sDnHY2oRTsrtVzKmuCio9EEIFnznSlLIt3ZmJvFQiZ94m0CwHQP68tS0YRO7HlR/HS/nZJRw==" + } + } +} diff --git a/analysis/tests-generic-jsx-transform/package.json b/analysis/tests-generic-jsx-transform/package.json new file mode 100644 index 000000000..002dfb7be --- /dev/null +++ b/analysis/tests-generic-jsx-transform/package.json @@ -0,0 +1,10 @@ +{ + "scripts": { + "build": "rescript", + "clean": "rescript clean -with-deps" + }, + "private": true, + "dependencies": { + "rescript": "11.1.0-rc.1" + } +} diff --git a/analysis/tests-generic-jsx-transform/rescript.json b/analysis/tests-generic-jsx-transform/rescript.json new file mode 100644 index 000000000..22fafc047 --- /dev/null +++ b/analysis/tests-generic-jsx-transform/rescript.json @@ -0,0 +1,11 @@ +{ + "name": "test-generic-jsx-transform", + "sources": [ + { + "dir": "src", + "subdirs": true + } + ], + "bsc-flags": ["-w -33-44-8"], + "jsx": { "module": "GenericJsx" } +} diff --git a/analysis/tests-generic-jsx-transform/src/GenericJsx.res b/analysis/tests-generic-jsx-transform/src/GenericJsx.res new file mode 100644 index 000000000..cd1b851e7 --- /dev/null +++ b/analysis/tests-generic-jsx-transform/src/GenericJsx.res @@ -0,0 +1,62 @@ +/* Below is a number of aliases to the common `Jsx` module */ +type element = Jsx.element + +type component<'props> = Jsx.component<'props> + +type componentLike<'props, 'return> = Jsx.componentLike<'props, 'return> + +@module("preact") +external jsx: (component<'props>, 'props) => element = "jsx" + +@module("preact") +external jsxKeyed: (component<'props>, 'props, ~key: string=?, @ignore unit) => element = "jsx" + +@module("preact") +external jsxs: (component<'props>, 'props) => element = "jsxs" + +@module("preact") +external jsxsKeyed: (component<'props>, 'props, ~key: string=?, @ignore unit) => element = "jsxs" + +/* These identity functions and static values below are optional, but lets +you move things easily to the `element` type. The only required thing to +define though is `array`, which the JSX transform will output. */ +external array: array => element = "%identity" +@val external null: element = "null" + +external float: float => element = "%identity" +external int: int => element = "%identity" +external string: string => element = "%identity" + +/* These are needed for Fragment (<> ) support */ +type fragmentProps = {children?: element} + +@module("preact") external jsxFragment: component = "Fragment" + +/* The Elements module is the equivalent to the ReactDOM module in React. This holds things relevant to _lowercase_ JSX elements. */ +module Elements = { + /* Here you can control what props lowercase JSX elements should have. + A base that the React JSX transform uses is provided via JsxDOM.domProps, + but you can make this anything. The editor tooling will support + autocompletion etc for your specific type. */ + type props = { + testing?: bool, + test2?: string + } + + @module("preact") + external jsx: (string, props) => Jsx.element = "jsx" + + @module("preact") + external div: (string, props) => Jsx.element = "jsx" + + @module("preact") + external jsxKeyed: (string, props, ~key: string=?, @ignore unit) => Jsx.element = "jsx" + + @module("preact") + external jsxs: (string, props) => Jsx.element = "jsxs" + + @module("preact") + external jsxsKeyed: (string, props, ~key: string=?, @ignore unit) => Jsx.element = "jsxs" + + external someElement: element => option = "%identity" +} \ No newline at end of file diff --git a/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res b/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res new file mode 100644 index 000000000..9714d6321 --- /dev/null +++ b/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res @@ -0,0 +1,2 @@ +//
0:7] +JSX 0:7] > _children:None +Completable: Cjsx([div], "", []) +Package opens Pervasives.JsxModules.place holder +Resolved opens 1 pervasives +Path ReactDOM.domProps +Could not find ReactDOM.domProps to complete from. +[{ + "label": "ariaDetails", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaDisabled", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaHidden", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaKeyshortcuts", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaLabel", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaRoledescription", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaExpanded", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaLevel", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaModal", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaMultiline", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaMultiselectable", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaPlaceholder", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaReadonly", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaRequired", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaSelected", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaSort", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaValuemax", + "kind": 4, + "tags": [], + "detail": "float", + "documentation": null + }, { + "label": "ariaValuemin", + "kind": 4, + "tags": [], + "detail": "float", + "documentation": null + }, { + "label": "ariaValuenow", + "kind": 4, + "tags": [], + "detail": "float", + "documentation": null + }, { + "label": "ariaValuetext", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaAtomic", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaBusy", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaRelevant", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaGrabbed", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "ariaActivedescendant", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaColcount", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaColindex", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaColspan", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaControls", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaDescribedby", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaErrormessage", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaFlowto", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaLabelledby", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaOwns", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ariaPosinset", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaRowcount", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaRowindex", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaRowspan", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "ariaSetsize", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "defaultChecked", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "defaultValue", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "accessKey", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "className", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "contentEditable", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "contextMenu", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dir", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "draggable", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "hidden", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "id", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "lang", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "style", + "kind": 4, + "tags": [], + "detail": "style", + "documentation": null + }, { + "label": "spellCheck", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "tabIndex", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "title", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "itemID", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "itemProp", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "itemRef", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "itemScope", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "itemType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "accept", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "acceptCharset", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "action", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "allowFullScreen", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "alt", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "async", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "autoComplete", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "autoCapitalize", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "autoFocus", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "autoPlay", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "challenge", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "charSet", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "checked", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "cite", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "crossOrigin", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "cols", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "colSpan", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "content", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "controls", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "coords", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "data", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dateTime", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "default", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "defer", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "disabled", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "download", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "encType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "form", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "formAction", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "formTarget", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "formMethod", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "headers", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "height", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "high", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "href", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "hrefLang", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "htmlFor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "httpEquiv", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "icon", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "inputMode", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "integrity", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "keyType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "label", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "list", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "loop", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "low", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "manifest", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "max", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "maxLength", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "media", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "mediaGroup", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "method", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "min", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "minLength", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "multiple", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "muted", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "name", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "nonce", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "noValidate", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "open_", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "optimum", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "pattern", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "placeholder", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "playsInline", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "poster", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "preload", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "radioGroup", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "readOnly", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "rel", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "required", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "reversed", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "rows", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "rowSpan", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "sandbox", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "scope", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "scoped", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "scrolling", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "selected", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "shape", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "size", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "sizes", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "span", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "src", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "srcDoc", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "srcLang", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "srcSet", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "start", + "kind": 4, + "tags": [], + "detail": "int", + "documentation": null + }, { + "label": "step", + "kind": 4, + "tags": [], + "detail": "float", + "documentation": null + }, { + "label": "summary", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "target", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "type_", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "useMap", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "value", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "width", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "wrap", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "onCopy", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Clipboard.t => unit", + "documentation": null + }, { + "label": "onCut", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Clipboard.t => unit", + "documentation": null + }, { + "label": "onPaste", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Clipboard.t => unit", + "documentation": null + }, { + "label": "onCompositionEnd", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Composition.t => unit", + "documentation": null + }, { + "label": "onCompositionStart", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Composition.t => unit", + "documentation": null + }, { + "label": "onCompositionUpdate", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Composition.t => unit", + "documentation": null + }, { + "label": "onKeyDown", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Keyboard.t => unit", + "documentation": null + }, { + "label": "onKeyPress", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Keyboard.t => unit", + "documentation": null + }, { + "label": "onKeyUp", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Keyboard.t => unit", + "documentation": null + }, { + "label": "onFocus", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Focus.t => unit", + "documentation": null + }, { + "label": "onBlur", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Focus.t => unit", + "documentation": null + }, { + "label": "onChange", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Form.t => unit", + "documentation": null + }, { + "label": "onInput", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Form.t => unit", + "documentation": null + }, { + "label": "onSubmit", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Form.t => unit", + "documentation": null + }, { + "label": "onInvalid", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Form.t => unit", + "documentation": null + }, { + "label": "onClick", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onContextMenu", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDoubleClick", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDrag", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDragEnd", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDragEnter", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDragExit", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDragLeave", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDragOver", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDragStart", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onDrop", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseDown", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseEnter", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseLeave", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseMove", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseOut", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseOver", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onMouseUp", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Mouse.t => unit", + "documentation": null + }, { + "label": "onSelect", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Selection.t => unit", + "documentation": null + }, { + "label": "onTouchCancel", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Touch.t => unit", + "documentation": null + }, { + "label": "onTouchEnd", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Touch.t => unit", + "documentation": null + }, { + "label": "onTouchMove", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Touch.t => unit", + "documentation": null + }, { + "label": "onTouchStart", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Touch.t => unit", + "documentation": null + }, { + "label": "onPointerOver", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerEnter", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerDown", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerMove", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerUp", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerCancel", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerOut", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onPointerLeave", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onGotPointerCapture", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onLostPointerCapture", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Pointer.t => unit", + "documentation": null + }, { + "label": "onScroll", + "kind": 4, + "tags": [], + "detail": "ReactEvent.UI.t => unit", + "documentation": null + }, { + "label": "onWheel", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Wheel.t => unit", + "documentation": null + }, { + "label": "onAbort", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onCanPlay", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onCanPlayThrough", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onDurationChange", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onEmptied", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onEncrypetd", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onEnded", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onError", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onLoadedData", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onLoadedMetadata", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onLoadStart", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onPause", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onPlay", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onPlaying", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onProgress", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onRateChange", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onSeeked", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onSeeking", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onStalled", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onSuspend", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onTimeUpdate", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onVolumeChange", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onWaiting", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Media.t => unit", + "documentation": null + }, { + "label": "onAnimationStart", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Animation.t => unit", + "documentation": null + }, { + "label": "onAnimationEnd", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Animation.t => unit", + "documentation": null + }, { + "label": "onAnimationIteration", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Animation.t => unit", + "documentation": null + }, { + "label": "onTransitionEnd", + "kind": 4, + "tags": [], + "detail": "ReactEvent.Transition.t => unit", + "documentation": null + }, { + "label": "accentHeight", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "accumulate", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "additive", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "alignmentBaseline", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "allowReorder", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "alphabetic", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "amplitude", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "arabicForm", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ascent", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "attributeName", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "attributeType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "autoReverse", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "azimuth", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "baseFrequency", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "baseProfile", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "baselineShift", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "bbox", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "bias", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "by", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "calcMode", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "capHeight", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "clip", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "clipPath", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "clipPathUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "clipRule", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "colorInterpolation", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "colorInterpolationFilters", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "colorProfile", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "colorRendering", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "contentScriptType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "contentStyleType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "cursor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "cx", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "cy", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "d", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "decelerate", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "descent", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "diffuseConstant", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "direction", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "display", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "divisor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dominantBaseline", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dur", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dx", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dy", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "edgeMode", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "elevation", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "enableBackground", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "exponent", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "externalResourcesRequired", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fill", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fillOpacity", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fillRule", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "filter", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "filterRes", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "filterUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "floodColor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "floodOpacity", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "focusable", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontFamily", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontSize", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontSizeAdjust", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontStretch", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontStyle", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontVariant", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fontWeight", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fomat", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "from", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fx", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "fy", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "g1", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "g2", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "glyphName", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "glyphOrientationHorizontal", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "glyphOrientationVertical", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "glyphRef", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "gradientTransform", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "gradientUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "hanging", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "horizAdvX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "horizOriginX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ideographic", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "imageRendering", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "in2", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "intercept", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "k", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "k1", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "k2", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "k3", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "k4", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "kernelMatrix", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "kernelUnitLength", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "kerning", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "keyPoints", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "keySplines", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "keyTimes", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "lengthAdjust", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "letterSpacing", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "lightingColor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "limitingConeAngle", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "local", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "markerEnd", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "markerHeight", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "markerMid", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "markerStart", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "markerUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "markerWidth", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "mask", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "maskContentUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "maskUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "mathematical", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "mode", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "numOctaves", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "offset", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "opacity", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "operator", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "order", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "orient", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "orientation", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "origin", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "overflow", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "overflowX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "overflowY", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "overlinePosition", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "overlineThickness", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "paintOrder", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "panose1", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "pathLength", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "patternContentUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "patternTransform", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "patternUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "pointerEvents", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "points", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "pointsAtX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "pointsAtY", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "pointsAtZ", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "preserveAlpha", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "preserveAspectRatio", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "primitiveUnits", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "r", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "radius", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "refX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "refY", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "renderingIntent", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "repeatCount", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "repeatDur", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "requiredExtensions", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "requiredFeatures", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "restart", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "result", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "rotate", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "rx", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "ry", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "scale", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "seed", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "shapeRendering", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "slope", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "spacing", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "specularConstant", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "specularExponent", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "speed", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "spreadMethod", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "startOffset", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stdDeviation", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stemh", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stemv", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stitchTiles", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stopColor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stopOpacity", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strikethroughPosition", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strikethroughThickness", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "string", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "stroke", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeDasharray", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeDashoffset", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeLinecap", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeLinejoin", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeMiterlimit", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeOpacity", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "strokeWidth", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "surfaceScale", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "systemLanguage", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "tableValues", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "targetX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "targetY", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "textAnchor", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "textDecoration", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "textLength", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "textRendering", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "transform", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "u1", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "u2", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "underlinePosition", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "underlineThickness", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "unicode", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "unicodeBidi", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "unicodeRange", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "unitsPerEm", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vAlphabetic", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vHanging", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vIdeographic", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vMathematical", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "values", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vectorEffect", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "version", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vertAdvX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vertAdvY", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vertOriginX", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vertOriginY", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "viewBox", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "viewTarget", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "visibility", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "widths", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "wordSpacing", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "writingMode", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "x", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "x1", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "x2", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xChannelSelector", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xHeight", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkActuate", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkArcrole", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkHref", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkRole", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkShow", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkTitle", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xlinkType", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xmlns", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xmlnsXlink", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xmlBase", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xmlLang", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "xmlSpace", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "y", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "y1", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "y2", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "yChannelSelector", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "z", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "zoomAndPan", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "about", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "datatype", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "inlist", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "prefix", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "property", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "resource", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "typeof", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "vocab", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }, { + "label": "dangerouslySetInnerHTML", + "kind": 4, + "tags": [], + "detail": "{\"__html\": string}", + "documentation": null + }, { + "label": "suppressContentEditableWarning", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "key", + "kind": 4, + "tags": [], + "detail": "string", + "documentation": null + }] + diff --git a/analysis/tests-generic-jsx-transform/test.sh b/analysis/tests-generic-jsx-transform/test.sh new file mode 100755 index 000000000..ec23433ba --- /dev/null +++ b/analysis/tests-generic-jsx-transform/test.sh @@ -0,0 +1,21 @@ +for file in src/*.res; do + output="$(dirname $file)/expected/$(basename $file).txt" + ../../rescript-editor-analysis.exe test $file &> $output + # CI. We use LF, and the CI OCaml fork prints CRLF. Convert. + if [ "$RUNNER_OS" == "Windows" ]; then + perl -pi -e 's/\r\n/\n/g' -- $output + fi +done + +warningYellow='\033[0;33m' +successGreen='\033[0;32m' +reset='\033[0m' + +diff=$(git ls-files --modified src/expected) +if [[ $diff = "" ]]; then + printf "${successGreen}✅ No unstaged tests difference.${reset}\n" +else + printf "${warningYellow}⚠️ There are unstaged differences in tests/! Did you break a test?\n${diff}\n${reset}" + git --no-pager diff src/expected + exit 1 +fi From 109fd73f747e2fc4ca9b709f322e6543177f8461 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Wed, 7 Feb 2024 21:14:51 +0100 Subject: [PATCH 2/7] adapt completion to look up the correct types when using a generic JSX transform --- analysis/src/CompletionBackEnd.ml | 19 +- analysis/src/Packages.ml | 11 + analysis/src/SharedTypes.ml | 4 +- analysis/src/TypeUtils.ml | 5 + .../src/GenericJsx.res | 2 +- .../src/GenericJsxCompletion.res | 5 +- .../src/expected/GenericJsxCompletion.res.txt | 2879 +---------------- 7 files changed, 53 insertions(+), 2872 deletions(-) diff --git a/analysis/src/CompletionBackEnd.ml b/analysis/src/CompletionBackEnd.ml index 941c5b16c..57c9439ba 100644 --- a/analysis/src/CompletionBackEnd.ml +++ b/analysis/src/CompletionBackEnd.ml @@ -1078,7 +1078,7 @@ and getCompletionsForContextPath ~debug ~full ~opens ~rawOpens ~pos ~env ~exact | Some f -> Some (f.fname.txt, f.typ, env)) | _ -> None in - ["ReactDOM"; "domProps"] |> digToTypeForCompletion + TypeUtils.pathToElementProps package |> digToTypeForCompletion else CompletionJsx.getJsxLabels ~componentPath:pathToComponent ~findTypeOfValue ~package @@ -1692,9 +1692,14 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover completable = (* We always try to look up completion from the actual domProps type first. This works in JSXv4. For JSXv3, we have a backup hardcoded list of dom labels we can use for completion. *) - let fromDomProps = + let pathToElementProps = TypeUtils.pathToElementProps package in + if Debug.verbose () then + Printf.printf + "[completing-lowercase-jsx] Attempting to complete from type at %s\n" + (pathToElementProps |> String.concat "."); + let fromElementProps = match - ["ReactDOM"; "domProps"] + pathToElementProps |> digToRecordFieldsForCompletion ~debug ~package ~opens ~full ~pos ~env ~scope with @@ -1713,11 +1718,13 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover completable = else None) |> List.map mkLabel) in - match fromDomProps with - | Some domProps -> domProps + match fromElementProps with + | Some elementProps -> elementProps | None -> if debug then - Printf.printf "Could not find ReactDOM.domProps to complete from.\n"; + Printf.printf + "[completing-lowercase-jsx] could not find element props to complete \ + from.\n"; (CompletionJsx.domLabels |> List.filter (fun (name, _t) -> Utils.startsWith name prefix diff --git a/analysis/src/Packages.ml b/analysis/src/Packages.ml index 057873902..20818f264 100644 --- a/analysis/src/Packages.ml +++ b/analysis/src/Packages.ml @@ -59,6 +59,16 @@ let newBsPackage ~rootPath = | (major, _), None when major >= 11 -> Some true | _, ns -> Option.bind ns Json.bool in + let genericJsxModule = + let jsxConfig = config |> Json.get "jsx" in + match jsxConfig with + | Some jsxConfig -> ( + match jsxConfig |> Json.get "module" with + | Some (String m) when String.lowercase_ascii m <> "react" -> + Some m + | _ -> None) + | None -> None + in let uncurried = uncurried = Some true in let sourceDirectories = FindFiles.getSourceDirectories ~includeDev:true ~baseDir:rootPath @@ -121,6 +131,7 @@ let newBsPackage ~rootPath = ("Opens from ReScript config file: " ^ (opens |> List.map pathToString |> String.concat " ")); { + genericJsxModule; suffix; rescriptVersion; rootPath; diff --git a/analysis/src/SharedTypes.ml b/analysis/src/SharedTypes.ml index 3e4bd63d3..50ae41f8f 100644 --- a/analysis/src/SharedTypes.ml +++ b/analysis/src/SharedTypes.ml @@ -497,6 +497,7 @@ type builtInCompletionModules = { } type package = { + genericJsxModule: string option; suffix: string; rootPath: filePath; projectFiles: FileSet.t; @@ -718,7 +719,8 @@ module Completable = struct | Cpath cp -> "Cpath " ^ contextPathToString cp | Cdecorator s -> "Cdecorator(" ^ str s ^ ")" | CdecoratorPayload (Module s) -> "CdecoratorPayload(module=" ^ s ^ ")" - | CdecoratorPayload (ModuleWithImportAttributes _) -> "CdecoratorPayload(moduleWithImportAttributes)" + | CdecoratorPayload (ModuleWithImportAttributes _) -> + "CdecoratorPayload(moduleWithImportAttributes)" | CdecoratorPayload (JsxConfig _) -> "JsxConfig" | CnamedArg (cp, s, sl2) -> "CnamedArg(" diff --git a/analysis/src/TypeUtils.ml b/analysis/src/TypeUtils.ml index 8964fe1da..989a662a0 100644 --- a/analysis/src/TypeUtils.ml +++ b/analysis/src/TypeUtils.ml @@ -1079,3 +1079,8 @@ let removeOpensFromCompletionPath ~rawOpens ~package completionPath = |> removeRawOpens rawOpens in completionPathMinusOpens + +let pathToElementProps package = + match package.genericJsxModule with + | None -> ["ReactDOM"; "domProps"] + | Some g -> (g |> String.split_on_char '.') @ ["DOM"; "props"] diff --git a/analysis/tests-generic-jsx-transform/src/GenericJsx.res b/analysis/tests-generic-jsx-transform/src/GenericJsx.res index cd1b851e7..83494e733 100644 --- a/analysis/tests-generic-jsx-transform/src/GenericJsx.res +++ b/analysis/tests-generic-jsx-transform/src/GenericJsx.res @@ -33,7 +33,7 @@ type fragmentProps = {children?: element} @module("preact") external jsxFragment: component = "Fragment" /* The Elements module is the equivalent to the ReactDOM module in React. This holds things relevant to _lowercase_ JSX elements. */ -module Elements = { +module DOM = { /* Here you can control what props lowercase JSX elements should have. A base that the React JSX transform uses is provided via JsxDOM.domProps, but you can make this anything. The editor tooling will support diff --git a/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res b/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res index 9714d6321..efdaba4ad 100644 --- a/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res +++ b/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res @@ -1,2 +1,5 @@ //
0:7] > _children:None Completable: Cjsx([div], "", []) Package opens Pervasives.JsxModules.place holder Resolved opens 1 pervasives -Path ReactDOM.domProps -Could not find ReactDOM.domProps to complete from. +Path GenericJsx.DOM.props [{ - "label": "ariaDetails", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaDisabled", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaHidden", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaKeyshortcuts", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaLabel", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaRoledescription", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaExpanded", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaLevel", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaModal", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaMultiline", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaMultiselectable", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaPlaceholder", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaReadonly", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaRequired", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaSelected", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaSort", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaValuemax", - "kind": 4, - "tags": [], - "detail": "float", - "documentation": null - }, { - "label": "ariaValuemin", - "kind": 4, - "tags": [], - "detail": "float", - "documentation": null - }, { - "label": "ariaValuenow", - "kind": 4, - "tags": [], - "detail": "float", - "documentation": null - }, { - "label": "ariaValuetext", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaAtomic", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaBusy", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaRelevant", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaGrabbed", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "ariaActivedescendant", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaColcount", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaColindex", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaColspan", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaControls", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaDescribedby", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaErrormessage", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaFlowto", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaLabelledby", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaOwns", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ariaPosinset", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaRowcount", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaRowindex", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaRowspan", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "ariaSetsize", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "defaultChecked", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "defaultValue", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "accessKey", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "className", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "contentEditable", + "label": "testing", "kind": 4, "tags": [], "detail": "bool", "documentation": null }, { - "label": "contextMenu", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dir", + "label": "test2", "kind": 4, "tags": [], "detail": "string", "documentation": null - }, { - "label": "draggable", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "hidden", + }] + +Complete src/GenericJsxCompletion.res 3:16 +posCursor:[3:16] posNoWhite:[3:15] Found expr:[3:4->3:16] +JSX 3:7] testing[3:8->3:15]=...__ghost__[0:-1->0:-1]> _children:None +Completable: Cexpression CJsxPropValue [div] testing +Package opens Pervasives.JsxModules.place holder +Resolved opens 1 pervasives +ContextPath CJsxPropValue [div] testing +Path GenericJsx.DOM.props +[{ + "label": "true", "kind": 4, "tags": [], "detail": "bool", "documentation": null }, { - "label": "id", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "lang", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "style", - "kind": 4, - "tags": [], - "detail": "style", - "documentation": null - }, { - "label": "spellCheck", + "label": "false", "kind": 4, "tags": [], "detail": "bool", "documentation": null - }, { - "label": "tabIndex", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "title", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "itemID", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "itemProp", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "itemRef", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "itemScope", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "itemType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "accept", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "acceptCharset", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "action", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "allowFullScreen", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "alt", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "async", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "autoComplete", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "autoCapitalize", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "autoFocus", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "autoPlay", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "challenge", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "charSet", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "checked", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "cite", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "crossOrigin", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "cols", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "colSpan", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "content", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "controls", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "coords", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "data", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dateTime", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "default", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "defer", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "disabled", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "download", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "encType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "form", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "formAction", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "formTarget", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "formMethod", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "headers", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "height", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "high", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "href", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "hrefLang", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "htmlFor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "httpEquiv", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "icon", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "inputMode", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "integrity", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "keyType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "label", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "list", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "loop", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "low", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "manifest", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "max", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "maxLength", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "media", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "mediaGroup", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "method", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "min", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "minLength", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "multiple", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "muted", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "name", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "nonce", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "noValidate", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "open_", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "optimum", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "pattern", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "placeholder", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "playsInline", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "poster", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "preload", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "radioGroup", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "readOnly", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "rel", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "required", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "reversed", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "rows", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "rowSpan", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "sandbox", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "scope", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "scoped", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "scrolling", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "selected", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "shape", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "size", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "sizes", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "span", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "src", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "srcDoc", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "srcLang", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "srcSet", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "start", - "kind": 4, - "tags": [], - "detail": "int", - "documentation": null - }, { - "label": "step", - "kind": 4, - "tags": [], - "detail": "float", - "documentation": null - }, { - "label": "summary", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "target", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "type_", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "useMap", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "value", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "width", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "wrap", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "onCopy", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Clipboard.t => unit", - "documentation": null - }, { - "label": "onCut", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Clipboard.t => unit", - "documentation": null - }, { - "label": "onPaste", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Clipboard.t => unit", - "documentation": null - }, { - "label": "onCompositionEnd", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Composition.t => unit", - "documentation": null - }, { - "label": "onCompositionStart", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Composition.t => unit", - "documentation": null - }, { - "label": "onCompositionUpdate", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Composition.t => unit", - "documentation": null - }, { - "label": "onKeyDown", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Keyboard.t => unit", - "documentation": null - }, { - "label": "onKeyPress", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Keyboard.t => unit", - "documentation": null - }, { - "label": "onKeyUp", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Keyboard.t => unit", - "documentation": null - }, { - "label": "onFocus", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Focus.t => unit", - "documentation": null - }, { - "label": "onBlur", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Focus.t => unit", - "documentation": null - }, { - "label": "onChange", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Form.t => unit", - "documentation": null - }, { - "label": "onInput", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Form.t => unit", - "documentation": null - }, { - "label": "onSubmit", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Form.t => unit", - "documentation": null - }, { - "label": "onInvalid", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Form.t => unit", - "documentation": null - }, { - "label": "onClick", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onContextMenu", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDoubleClick", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDrag", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDragEnd", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDragEnter", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDragExit", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDragLeave", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDragOver", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDragStart", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onDrop", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseDown", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseEnter", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseLeave", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseMove", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseOut", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseOver", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onMouseUp", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Mouse.t => unit", - "documentation": null - }, { - "label": "onSelect", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Selection.t => unit", - "documentation": null - }, { - "label": "onTouchCancel", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Touch.t => unit", - "documentation": null - }, { - "label": "onTouchEnd", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Touch.t => unit", - "documentation": null - }, { - "label": "onTouchMove", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Touch.t => unit", - "documentation": null - }, { - "label": "onTouchStart", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Touch.t => unit", - "documentation": null - }, { - "label": "onPointerOver", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerEnter", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerDown", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerMove", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerUp", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerCancel", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerOut", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onPointerLeave", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onGotPointerCapture", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onLostPointerCapture", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Pointer.t => unit", - "documentation": null - }, { - "label": "onScroll", - "kind": 4, - "tags": [], - "detail": "ReactEvent.UI.t => unit", - "documentation": null - }, { - "label": "onWheel", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Wheel.t => unit", - "documentation": null - }, { - "label": "onAbort", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onCanPlay", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onCanPlayThrough", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onDurationChange", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onEmptied", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onEncrypetd", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onEnded", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onError", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onLoadedData", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onLoadedMetadata", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onLoadStart", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onPause", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onPlay", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onPlaying", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onProgress", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onRateChange", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onSeeked", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onSeeking", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onStalled", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onSuspend", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onTimeUpdate", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onVolumeChange", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onWaiting", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Media.t => unit", - "documentation": null - }, { - "label": "onAnimationStart", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Animation.t => unit", - "documentation": null - }, { - "label": "onAnimationEnd", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Animation.t => unit", - "documentation": null - }, { - "label": "onAnimationIteration", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Animation.t => unit", - "documentation": null - }, { - "label": "onTransitionEnd", - "kind": 4, - "tags": [], - "detail": "ReactEvent.Transition.t => unit", - "documentation": null - }, { - "label": "accentHeight", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "accumulate", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "additive", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "alignmentBaseline", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "allowReorder", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "alphabetic", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "amplitude", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "arabicForm", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ascent", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "attributeName", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "attributeType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "autoReverse", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "azimuth", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "baseFrequency", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "baseProfile", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "baselineShift", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "bbox", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "bias", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "by", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "calcMode", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "capHeight", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "clip", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "clipPath", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "clipPathUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "clipRule", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "colorInterpolation", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "colorInterpolationFilters", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "colorProfile", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "colorRendering", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "contentScriptType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "contentStyleType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "cursor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "cx", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "cy", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "d", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "decelerate", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "descent", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "diffuseConstant", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "direction", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "display", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "divisor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dominantBaseline", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dur", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dx", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dy", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "edgeMode", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "elevation", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "enableBackground", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "exponent", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "externalResourcesRequired", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fill", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fillOpacity", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fillRule", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "filter", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "filterRes", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "filterUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "floodColor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "floodOpacity", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "focusable", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontFamily", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontSize", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontSizeAdjust", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontStretch", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontStyle", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontVariant", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fontWeight", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fomat", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "from", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fx", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "fy", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "g1", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "g2", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "glyphName", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "glyphOrientationHorizontal", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "glyphOrientationVertical", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "glyphRef", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "gradientTransform", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "gradientUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "hanging", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "horizAdvX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "horizOriginX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ideographic", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "imageRendering", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "in2", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "intercept", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "k", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "k1", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "k2", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "k3", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "k4", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "kernelMatrix", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "kernelUnitLength", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "kerning", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "keyPoints", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "keySplines", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "keyTimes", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "lengthAdjust", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "letterSpacing", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "lightingColor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "limitingConeAngle", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "local", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "markerEnd", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "markerHeight", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "markerMid", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "markerStart", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "markerUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "markerWidth", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "mask", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "maskContentUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "maskUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "mathematical", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "mode", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "numOctaves", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "offset", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "opacity", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "operator", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "order", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "orient", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "orientation", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "origin", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "overflow", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "overflowX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "overflowY", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "overlinePosition", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "overlineThickness", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "paintOrder", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "panose1", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "pathLength", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "patternContentUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "patternTransform", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "patternUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "pointerEvents", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "points", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "pointsAtX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "pointsAtY", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "pointsAtZ", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "preserveAlpha", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "preserveAspectRatio", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "primitiveUnits", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "r", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "radius", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "refX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "refY", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "renderingIntent", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "repeatCount", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "repeatDur", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "requiredExtensions", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "requiredFeatures", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "restart", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "result", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "rotate", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "rx", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "ry", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "scale", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "seed", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "shapeRendering", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "slope", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "spacing", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "specularConstant", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "specularExponent", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "speed", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "spreadMethod", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "startOffset", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stdDeviation", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stemh", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stemv", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stitchTiles", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stopColor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stopOpacity", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strikethroughPosition", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strikethroughThickness", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "string", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "stroke", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeDasharray", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeDashoffset", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeLinecap", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeLinejoin", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeMiterlimit", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeOpacity", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "strokeWidth", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "surfaceScale", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "systemLanguage", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "tableValues", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "targetX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "targetY", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "textAnchor", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "textDecoration", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "textLength", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "textRendering", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "transform", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "u1", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "u2", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "underlinePosition", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "underlineThickness", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "unicode", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "unicodeBidi", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "unicodeRange", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "unitsPerEm", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vAlphabetic", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vHanging", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vIdeographic", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vMathematical", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "values", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vectorEffect", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "version", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vertAdvX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vertAdvY", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vertOriginX", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vertOriginY", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "viewBox", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "viewTarget", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "visibility", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "widths", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "wordSpacing", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "writingMode", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "x", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "x1", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "x2", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xChannelSelector", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xHeight", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkActuate", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkArcrole", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkHref", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkRole", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkShow", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkTitle", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xlinkType", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xmlns", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xmlnsXlink", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xmlBase", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xmlLang", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "xmlSpace", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "y", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "y1", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "y2", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "yChannelSelector", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "z", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "zoomAndPan", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "about", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "datatype", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "inlist", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "prefix", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "property", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "resource", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "typeof", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "vocab", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null - }, { - "label": "dangerouslySetInnerHTML", - "kind": 4, - "tags": [], - "detail": "{\"__html\": string}", - "documentation": null - }, { - "label": "suppressContentEditableWarning", - "kind": 4, - "tags": [], - "detail": "bool", - "documentation": null - }, { - "label": "key", - "kind": 4, - "tags": [], - "detail": "string", - "documentation": null }] From f4461709b4500f0f07a8532a9da67c737268b5b9 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sun, 11 Feb 2024 20:40:32 +0100 Subject: [PATCH 3/7] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2a112cd7..d9369950d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - Relax filter for what local files that come up in from and regular string completion in `@module`. https://github.com/rescript-lang/rescript-vscode/pull/918 - Make from completion trigger for expr hole so we get a nice experience when completing {from: } in `@module`. https://github.com/rescript-lang/rescript-vscode/pull/918 - Latest parser for newest syntax features. https://github.com/rescript-lang/rescript-vscode/pull/917 +- Handle completion for DOM/element attributes and attribute values properly when using a generic JSX transform. https://github.com/rescript-lang/rescript-vscode/pull/919 ## 1.38.0 From 4dbf86c3ca4155a04e6f86ea0c6068b6929bf7ca Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sat, 10 Feb 2024 21:12:26 +0100 Subject: [PATCH 4/7] adapt the primitive completions inside of jsx to the generic JSX moe --- analysis/src/CompletionBackEnd.ml | 17 ++- analysis/src/CompletionDecorators.ml | 9 +- analysis/src/CompletionFrontEnd.ml | 2 +- analysis/src/TypeUtils.ml | 2 +- analysis/src/Utils.ml | 4 +- analysis/src/Xform.ml | 6 +- .../package-lock.json | 14 +-- .../tests-generic-jsx-transform/package.json | 2 +- .../src/GenericJsx.res | 7 +- .../src/GenericJsxCompletion.res | 24 +++- .../src/expected/GenericJsxCompletion.res.txt | 110 +++++++++++++++++- analysis/tests/package-lock.json | 14 +-- analysis/tests/package.json | 2 +- .../tests/src/expected/Completion.res.txt | 4 +- 14 files changed, 176 insertions(+), 41 deletions(-) diff --git a/analysis/src/CompletionBackEnd.ml b/analysis/src/CompletionBackEnd.ml index 57c9439ba..d5d1a1462 100644 --- a/analysis/src/CompletionBackEnd.ml +++ b/analysis/src/CompletionBackEnd.ml @@ -1010,14 +1010,23 @@ and getCompletionsForContextPath ~debug ~full ~opens ~rawOpens ~pos ~env ~exact | Some (builtinNameToComplete, typ) when Utils.checkName builtinNameToComplete ~prefix:funNamePrefix ~exact:false -> + let name = + match package.genericJsxModule with + | None -> "React." ^ builtinNameToComplete + | Some g -> + g ^ "." ^ builtinNameToComplete + |> String.split_on_char '.' + |> TypeUtils.removeOpensFromCompletionPath ~rawOpens + ~package:full.package + |> String.concat "." + in [ - Completion.createWithSnippet - ~name:("React." ^ builtinNameToComplete) - ~kind:(Value typ) ~env ~sortText:"A" + Completion.createWithSnippet ~name ~kind:(Value typ) ~env + ~sortText:"A" ~docstring: [ "Turns `" ^ builtinNameToComplete - ^ "` into `React.element` so it can be used inside of JSX."; + ^ "` into a JSX element so it can be used inside of JSX."; ] (); ] diff --git a/analysis/src/CompletionDecorators.ml b/analysis/src/CompletionDecorators.ml index d529cec78..8319a5f4c 100644 --- a/analysis/src/CompletionDecorators.ml +++ b/analysis/src/CompletionDecorators.ml @@ -164,10 +164,17 @@ Example `@raises(Exn)` or `@raises([E1, E2, E3])` for multiple exceptions. You will need this decorator whenever you want to use a ReScript / React component in ReScript JSX expressions. -Note: The `@react.component` decorator requires the react-jsx config to be set in your `bsconfig.json` to enable the required React transformations. +Note: The `@react.component` decorator requires the `jsx` config to be set in your `rescript.json`/`bsconfig.json` to enable the required React transformations. [Read more and see examples in the documentation](https://rescript-lang.org/syntax-lookup#react-component-decorator).|}; ] ); + ( "jsx.component", + None, + [ + {|The `@jsx.component` decorator is used to annotate functions that are JSX components used with ReScript's [generic JSX transform](https://rescript-lang.org/docs/manual/latest/jsx#generic-jsx-transform-jsx-beyond-react-experimental). + +You will need this decorator whenever you want to use a JSX component in ReScript JSX expressions.|}; + ] ); ( "return", Some "return(${1:nullable})", [ diff --git a/analysis/src/CompletionFrontEnd.ml b/analysis/src/CompletionFrontEnd.ml index 1c88ed968..5c0ebc3af 100644 --- a/analysis/src/CompletionFrontEnd.ml +++ b/analysis/src/CompletionFrontEnd.ml @@ -659,7 +659,7 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor let value_binding (iterator : Ast_iterator.iterator) (value_binding : Parsetree.value_binding) = let oldInJsxContext = !inJsxContext in - if Utils.isReactComponent value_binding then inJsxContext := true; + if Utils.isJsxComponent value_binding then inJsxContext := true; (match value_binding with | {pvb_pat = {ppat_desc = Ppat_constraint (_pat, coreType)}; pvb_expr} when locHasCursor pvb_expr.pexp_loc -> ( diff --git a/analysis/src/TypeUtils.ml b/analysis/src/TypeUtils.ml index 989a662a0..dbef28dd7 100644 --- a/analysis/src/TypeUtils.ml +++ b/analysis/src/TypeUtils.ml @@ -1083,4 +1083,4 @@ let removeOpensFromCompletionPath ~rawOpens ~package completionPath = let pathToElementProps package = match package.genericJsxModule with | None -> ["ReactDOM"; "domProps"] - | Some g -> (g |> String.split_on_char '.') @ ["DOM"; "props"] + | Some g -> (g |> String.split_on_char '.') @ ["Elements"; "props"] diff --git a/analysis/src/Utils.ml b/analysis/src/Utils.ml index 3d374ef57..bb9f94a2e 100644 --- a/analysis/src/Utils.ml +++ b/analysis/src/Utils.ml @@ -156,10 +156,10 @@ let rec unwrapIfOption (t : Types.type_expr) = | Tconstr (Path.Pident {name = "option"}, [unwrappedType], _) -> unwrappedType | _ -> t -let isReactComponent (vb : Parsetree.value_binding) = +let isJsxComponent (vb : Parsetree.value_binding) = vb.pvb_attributes |> List.exists (function - | {Location.txt = "react.component"}, _payload -> true + | {Location.txt = "react.component" | "jsx.component"}, _payload -> true | _ -> false) let checkName name ~prefix ~exact = diff --git a/analysis/src/Xform.ml b/analysis/src/Xform.ml index 3a27a60b5..699a3cfa9 100644 --- a/analysis/src/Xform.ml +++ b/analysis/src/Xform.ml @@ -215,9 +215,9 @@ module AddTypeAnnotation = struct match si.pstr_desc with | Pstr_value (_recFlag, bindings) -> let processBinding (vb : Parsetree.value_binding) = - (* Can't add a type annotation to a react component, or the compiler crashes *) - let isReactComponent = Utils.isReactComponent vb in - if not isReactComponent then processPattern vb.pvb_pat; + (* Can't add a type annotation to a jsx component, or the compiler crashes *) + let isJsxComponent = Utils.isJsxComponent vb in + if not isJsxComponent then processPattern vb.pvb_pat; processFunction vb.pvb_expr in bindings |> List.iter (processBinding ~argNum:1); diff --git a/analysis/tests-generic-jsx-transform/package-lock.json b/analysis/tests-generic-jsx-transform/package-lock.json index 46f650085..8966274c5 100644 --- a/analysis/tests-generic-jsx-transform/package-lock.json +++ b/analysis/tests-generic-jsx-transform/package-lock.json @@ -5,13 +5,13 @@ "packages": { "": { "dependencies": { - "rescript": "11.1.0-rc.1" + "rescript": "11.1.0-rc.2" } }, "node_modules/rescript": { - "version": "11.1.0-rc.1", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.1.tgz", - "integrity": "sha512-EGm6Es+Cbrpct0sDnHY2oRTsrtVzKmuCio9EEIFnznSlLIt3ZmJvFQiZ94m0CwHQP68tS0YRO7HlR/HS/nZJRw==", + "version": "11.1.0-rc.2", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.2.tgz", + "integrity": "sha512-kCUtmsODEUF1Eth5ppc+yIK79HLI7CwRs1R4iopDek4FC58IqHSLT3K1XHGB39YCWuOuV9WMly+wksHRJcSLcw==", "hasInstallScript": true, "bin": { "bsc": "bsc", @@ -25,9 +25,9 @@ }, "dependencies": { "rescript": { - "version": "11.1.0-rc.1", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.1.tgz", - "integrity": "sha512-EGm6Es+Cbrpct0sDnHY2oRTsrtVzKmuCio9EEIFnznSlLIt3ZmJvFQiZ94m0CwHQP68tS0YRO7HlR/HS/nZJRw==" + "version": "11.1.0-rc.2", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.2.tgz", + "integrity": "sha512-kCUtmsODEUF1Eth5ppc+yIK79HLI7CwRs1R4iopDek4FC58IqHSLT3K1XHGB39YCWuOuV9WMly+wksHRJcSLcw==" } } } diff --git a/analysis/tests-generic-jsx-transform/package.json b/analysis/tests-generic-jsx-transform/package.json index 002dfb7be..000126246 100644 --- a/analysis/tests-generic-jsx-transform/package.json +++ b/analysis/tests-generic-jsx-transform/package.json @@ -5,6 +5,6 @@ }, "private": true, "dependencies": { - "rescript": "11.1.0-rc.1" + "rescript": "11.1.0-rc.2" } } diff --git a/analysis/tests-generic-jsx-transform/src/GenericJsx.res b/analysis/tests-generic-jsx-transform/src/GenericJsx.res index 83494e733..d5f15273d 100644 --- a/analysis/tests-generic-jsx-transform/src/GenericJsx.res +++ b/analysis/tests-generic-jsx-transform/src/GenericJsx.res @@ -33,14 +33,15 @@ type fragmentProps = {children?: element} @module("preact") external jsxFragment: component = "Fragment" /* The Elements module is the equivalent to the ReactDOM module in React. This holds things relevant to _lowercase_ JSX elements. */ -module DOM = { +module Elements = { /* Here you can control what props lowercase JSX elements should have. A base that the React JSX transform uses is provided via JsxDOM.domProps, but you can make this anything. The editor tooling will support autocompletion etc for your specific type. */ type props = { - testing?: bool, - test2?: string + testing?: bool, + test2?: string, + children?: element } @module("preact") diff --git a/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res b/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res index efdaba4ad..7b4e3824f 100644 --- a/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res +++ b/analysis/tests-generic-jsx-transform/src/GenericJsxCompletion.res @@ -1,5 +1,25 @@ //
{ + let someString = "" + let someInt = 12 + let someArr = [GenericJsx.null] + ignore(someInt) + ignore(someArr) + // someString->st + // ^com + open GenericJsx +
+ {GenericJsx.string(someProp)} +
{GenericJsx.null}
+ // {someString->st} + // ^com +
+ } +} \ No newline at end of file diff --git a/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt b/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt index 801fdb7c4..8bf132033 100644 --- a/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt +++ b/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt @@ -4,7 +4,7 @@ JSX 0:7] > _children:None Completable: Cjsx([div], "", []) Package opens Pervasives.JsxModules.place holder Resolved opens 1 pervasives -Path GenericJsx.DOM.props +Path GenericJsx.Elements.props [{ "label": "testing", "kind": 4, @@ -17,16 +17,22 @@ Path GenericJsx.DOM.props "tags": [], "detail": "string", "documentation": null + }, { + "label": "children", + "kind": 4, + "tags": [], + "detail": "element", + "documentation": null }] -Complete src/GenericJsxCompletion.res 3:16 -posCursor:[3:16] posNoWhite:[3:15] Found expr:[3:4->3:16] -JSX 3:7] testing[3:8->3:15]=...__ghost__[0:-1->0:-1]> _children:None -Completable: Cexpression CJsxPropValue [div] testing +Complete src/GenericJsxCompletion.res 3:17 +posCursor:[3:17] posNoWhite:[3:16] Found expr:[3:4->3:18] +JSX 3:7] testing[3:8->3:15]=...[3:16->3:18]> _children:None +Completable: Cexpression CJsxPropValue [div] testing->recordBody Package opens Pervasives.JsxModules.place holder Resolved opens 1 pervasives ContextPath CJsxPropValue [div] testing -Path GenericJsx.DOM.props +Path GenericJsx.Elements.props [{ "label": "true", "kind": 4, @@ -41,3 +47,95 @@ Path GenericJsx.DOM.props "documentation": null }] +Complete src/GenericJsxCompletion.res 14:21 +posCursor:[14:21] posNoWhite:[14:20] Found expr:[8:13->23:3] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[8:14->23:3] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[9:1->22:10] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[10:4->22:10] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[11:4->22:10] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[12:4->22:10] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[13:4->22:10] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[14:7->22:10] +posCursor:[14:21] posNoWhite:[14:20] Found expr:[14:7->14:21] +Completable: Cpath Value[someString]->st <> +Package opens Pervasives.JsxModules.place holder +Resolved opens 1 pervasives +ContextPath Value[someString]->st <> +ContextPath Value[someString] +Path someString +CPPipe env:GenericJsxCompletion +Path Js.String2.st +[{ + "label": "GenericJsx.string", + "kind": 12, + "tags": [], + "detail": "string", + "documentation": {"kind": "markdown", "value": "Turns `string` into `GenericJsx.element` so it can be used inside of JSX."}, + "sortText": "A", + "insertTextFormat": 2 + }, { + "label": "Js.String2.startsWith", + "kind": 12, + "tags": [], + "detail": "(t, t) => bool", + "documentation": {"kind": "markdown", "value": "\nES2015: `startsWith(str, substr)` returns `true` if the `str` starts with\n`substr`, `false` otherwise.\n\nSee [`String.startsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\non MDN.\n\n## Examples\n\n```rescript\nJs.String2.startsWith(\"ReScript\", \"Re\") == true\nJs.String2.startsWith(\"ReScript\", \"\") == true\nJs.String2.startsWith(\"JavaScript\", \"Re\") == false\n```\n"} + }, { + "label": "Js.String2.startsWithFrom", + "kind": 12, + "tags": [], + "detail": "(t, t, int) => bool", + "documentation": {"kind": "markdown", "value": "\nES2015: `startsWithFrom(str, substr, n)` returns `true` if the `str` starts\nwith `substr` starting at position `n`, false otherwise. If `n` is negative,\nthe search starts at the beginning of `str`.\n\nSee [`String.startsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\non MDN.\n\n## Examples\n\n```rescript\nJs.String2.startsWithFrom(\"ReScript\", \"Scri\", 2) == true\nJs.String2.startsWithFrom(\"ReScript\", \"\", 2) == true\nJs.String2.startsWithFrom(\"JavaScript\", \"Scri\", 2) == false\n```\n"} + }] + +Complete src/GenericJsxCompletion.res 20:24 +posCursor:[20:24] posNoWhite:[20:23] Found expr:[8:13->23:3] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[8:14->23:3] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[9:1->22:10] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[10:4->22:10] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[11:4->22:10] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[12:4->22:10] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[13:4->22:10] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[16:1->22:10] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[17:5->22:10] +JSX 17:8] > _children:17:8 +posCursor:[20:24] posNoWhite:[20:23] Found expr:[17:8->22:4] +Pexp_construct :::[18:7->22:4] [18:7->22:4] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[18:7->22:4] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[19:7->22:4] +Pexp_construct :::[19:7->22:4] [19:7->22:4] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[19:7->22:4] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[20:10->22:4] +Pexp_construct :::[20:10->22:4] [20:10->22:4] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[20:10->22:4] +posCursor:[20:24] posNoWhite:[20:23] Found expr:[20:10->20:24] +Completable: Cpath Value[someString]->st <> +Raw opens: 1 GenericJsx.place holder +Package opens Pervasives.JsxModules.place holder +Resolved opens 2 pervasives GenericJsx.res +ContextPath Value[someString]->st <> +ContextPath Value[someString] +Path someString +CPPipe env:GenericJsxCompletion +Path Js.String2.st +[{ + "label": "string", + "kind": 12, + "tags": [], + "detail": "string", + "documentation": {"kind": "markdown", "value": "Turns `string` into `GenericJsx.element` so it can be used inside of JSX."}, + "sortText": "A", + "insertTextFormat": 2 + }, { + "label": "Js.String2.startsWith", + "kind": 12, + "tags": [], + "detail": "(t, t) => bool", + "documentation": {"kind": "markdown", "value": "\nES2015: `startsWith(str, substr)` returns `true` if the `str` starts with\n`substr`, `false` otherwise.\n\nSee [`String.startsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\non MDN.\n\n## Examples\n\n```rescript\nJs.String2.startsWith(\"ReScript\", \"Re\") == true\nJs.String2.startsWith(\"ReScript\", \"\") == true\nJs.String2.startsWith(\"JavaScript\", \"Re\") == false\n```\n"} + }, { + "label": "Js.String2.startsWithFrom", + "kind": 12, + "tags": [], + "detail": "(t, t, int) => bool", + "documentation": {"kind": "markdown", "value": "\nES2015: `startsWithFrom(str, substr, n)` returns `true` if the `str` starts\nwith `substr` starting at position `n`, false otherwise. If `n` is negative,\nthe search starts at the beginning of `str`.\n\nSee [`String.startsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\non MDN.\n\n## Examples\n\n```rescript\nJs.String2.startsWithFrom(\"ReScript\", \"Scri\", 2) == true\nJs.String2.startsWithFrom(\"ReScript\", \"\", 2) == true\nJs.String2.startsWithFrom(\"JavaScript\", \"Scri\", 2) == false\n```\n"} + }] + diff --git a/analysis/tests/package-lock.json b/analysis/tests/package-lock.json index d10af3afd..e1a3416e2 100644 --- a/analysis/tests/package-lock.json +++ b/analysis/tests/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "rescript": "11.0.1" + "rescript": "11.1.0-rc.2" }, "devDependencies": { "@rescript/react": "0.12.0" @@ -69,9 +69,9 @@ } }, "node_modules/rescript": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.0.1.tgz", - "integrity": "sha512-7T4PRp/d0+CBNnY6PYKffFqo9tGZlvnZpboF/n+8SKS+JZ6VvXJO7W538VPZXf3EYx1COGAWWvkF9e/HgSAqHg==", + "version": "11.1.0-rc.2", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.2.tgz", + "integrity": "sha512-kCUtmsODEUF1Eth5ppc+yIK79HLI7CwRs1R4iopDek4FC58IqHSLT3K1XHGB39YCWuOuV9WMly+wksHRJcSLcw==", "hasInstallScript": true, "bin": { "bsc": "bsc", @@ -140,9 +140,9 @@ } }, "rescript": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.0.1.tgz", - "integrity": "sha512-7T4PRp/d0+CBNnY6PYKffFqo9tGZlvnZpboF/n+8SKS+JZ6VvXJO7W538VPZXf3EYx1COGAWWvkF9e/HgSAqHg==" + "version": "11.1.0-rc.2", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-11.1.0-rc.2.tgz", + "integrity": "sha512-kCUtmsODEUF1Eth5ppc+yIK79HLI7CwRs1R4iopDek4FC58IqHSLT3K1XHGB39YCWuOuV9WMly+wksHRJcSLcw==" }, "scheduler": { "version": "0.23.0", diff --git a/analysis/tests/package.json b/analysis/tests/package.json index a45384296..3b96b9bd8 100644 --- a/analysis/tests/package.json +++ b/analysis/tests/package.json @@ -8,6 +8,6 @@ "@rescript/react": "0.12.0" }, "dependencies": { - "rescript": "11.0.1" + "rescript": "11.1.0-rc.2" } } diff --git a/analysis/tests/src/expected/Completion.res.txt b/analysis/tests/src/expected/Completion.res.txt index 3add27f62..ba0f27ed4 100644 --- a/analysis/tests/src/expected/Completion.res.txt +++ b/analysis/tests/src/expected/Completion.res.txt @@ -553,7 +553,7 @@ Resolved opens 1 pervasives "kind": 4, "tags": [], "detail": "", - "documentation": {"kind": "markdown", "value": "The `@react.component` decorator is used to annotate functions that are RescriptReact components.\n\nYou will need this decorator whenever you want to use a ReScript / React component in ReScript JSX expressions.\n\nNote: The `@react.component` decorator requires the react-jsx config to be set in your `bsconfig.json` to enable the required React transformations.\n\n[Read more and see examples in the documentation](https://rescript-lang.org/syntax-lookup#react-component-decorator)."}, + "documentation": {"kind": "markdown", "value": "The `@react.component` decorator is used to annotate functions that are RescriptReact components.\n\nYou will need this decorator whenever you want to use a ReScript / React component in ReScript JSX expressions.\n\nNote: The `@react.component` decorator requires the `jsx` config to be set in your `rescript.json`/`bsconfig.json` to enable the required React transformations.\n\n[Read more and see examples in the documentation](https://rescript-lang.org/syntax-lookup#react-component-decorator)."}, "insertTextFormat": 2 }] @@ -569,7 +569,7 @@ Resolved opens 1 pervasives "kind": 4, "tags": [], "detail": "", - "documentation": {"kind": "markdown", "value": "The `@react.component` decorator is used to annotate functions that are RescriptReact components.\n\nYou will need this decorator whenever you want to use a ReScript / React component in ReScript JSX expressions.\n\nNote: The `@react.component` decorator requires the react-jsx config to be set in your `bsconfig.json` to enable the required React transformations.\n\n[Read more and see examples in the documentation](https://rescript-lang.org/syntax-lookup#react-component-decorator)."}, + "documentation": {"kind": "markdown", "value": "The `@react.component` decorator is used to annotate functions that are RescriptReact components.\n\nYou will need this decorator whenever you want to use a ReScript / React component in ReScript JSX expressions.\n\nNote: The `@react.component` decorator requires the `jsx` config to be set in your `rescript.json`/`bsconfig.json` to enable the required React transformations.\n\n[Read more and see examples in the documentation](https://rescript-lang.org/syntax-lookup#react-component-decorator)."}, "insertTextFormat": 2 }] From 22e78ba47fd5eb7aa4b858fef878b2035d56df9f Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sat, 10 Feb 2024 21:13:35 +0100 Subject: [PATCH 5/7] remove uneccessary ignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index fb3e740fd..e7b7a1ca8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,11 +5,9 @@ examples/*/lib analysis/tests/lib analysis/tests/.bsb.lock -analysis/tests/.merlin analysis/tests-generic-jsx-transform/lib analysis/tests-generic-jsx-transform/.bsb.lock -analysis/tests-generic-jsx-transform/.merlin tools/node_modules tools/lib From 7093bb07ae96b6758bc4b8aab34f6b0d224cf3d2 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sat, 10 Feb 2024 21:32:18 +0100 Subject: [PATCH 6/7] update --- analysis/tests/src/expected/CompletionJsx.res.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/analysis/tests/src/expected/CompletionJsx.res.txt b/analysis/tests/src/expected/CompletionJsx.res.txt index 4b357a531..fbf3e6e80 100644 --- a/analysis/tests/src/expected/CompletionJsx.res.txt +++ b/analysis/tests/src/expected/CompletionJsx.res.txt @@ -44,7 +44,7 @@ Path Js.String2.st "kind": 12, "tags": [], "detail": "string", - "documentation": {"kind": "markdown", "value": "Turns `string` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `string` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -93,7 +93,7 @@ Path Js.String2.st "kind": 12, "tags": [], "detail": "string", - "documentation": {"kind": "markdown", "value": "Turns `string` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `string` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -141,7 +141,7 @@ Path Js.String2.st "kind": 12, "tags": [], "detail": "string", - "documentation": {"kind": "markdown", "value": "Turns `string` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `string` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -191,7 +191,7 @@ Path Js.String2.st "kind": 12, "tags": [], "detail": "string", - "documentation": {"kind": "markdown", "value": "Turns `string` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `string` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -240,7 +240,7 @@ Path Belt.Int. "kind": 12, "tags": [], "detail": "int", - "documentation": {"kind": "markdown", "value": "Turns `int` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `int` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -324,7 +324,7 @@ Path Belt.Int. "kind": 12, "tags": [], "detail": "int", - "documentation": {"kind": "markdown", "value": "Turns `int` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `int` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -409,7 +409,7 @@ Path Js.Array2.a "kind": 12, "tags": [], "detail": "array", - "documentation": {"kind": "markdown", "value": "Turns `array` into `React.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `array` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { From 8f7346fd82d8553f7a4e0032fda517ad3830d397 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sat, 10 Feb 2024 21:36:14 +0100 Subject: [PATCH 7/7] update --- .../src/expected/GenericJsxCompletion.res.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt b/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt index 8bf132033..3707266be 100644 --- a/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt +++ b/analysis/tests-generic-jsx-transform/src/expected/GenericJsxCompletion.res.txt @@ -70,7 +70,7 @@ Path Js.String2.st "kind": 12, "tags": [], "detail": "string", - "documentation": {"kind": "markdown", "value": "Turns `string` into `GenericJsx.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `string` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, { @@ -122,7 +122,7 @@ Path Js.String2.st "kind": 12, "tags": [], "detail": "string", - "documentation": {"kind": "markdown", "value": "Turns `string` into `GenericJsx.element` so it can be used inside of JSX."}, + "documentation": {"kind": "markdown", "value": "Turns `string` into a JSX element so it can be used inside of JSX."}, "sortText": "A", "insertTextFormat": 2 }, {