diff --git a/compiled-rn/VERSION_NATIVE_FB b/compiled-rn/VERSION_NATIVE_FB index c89cd36d4d..f950de5445 100644 --- a/compiled-rn/VERSION_NATIVE_FB +++ b/compiled-rn/VERSION_NATIVE_FB @@ -1 +1 @@ -19.2.0-native-fb-67e24bc5-20251001 \ No newline at end of file +19.2.0-native-fb-ae74234e-20251001 \ No newline at end of file diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js index 21000331fa..1e71161c0f 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<8c7bbb1b7da61fe0c31aa4bc3d973f31>> */ "use strict"; @@ -404,5 +404,5 @@ __DEV__ && exports.useFormStatus = function () { return resolveDispatcher().useHostTransitionStatus(); }; - exports.version = "19.2.0-native-fb-67e24bc5-20251001"; + exports.version = "19.2.0-native-fb-ae74234e-20251001"; })(); diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js index a5a9b1d48b..be7c30c9cf 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<9fadd324b891cfa2319b7c3d38560e79>> + * @generated SignedSource<> */ "use strict"; @@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) { exports.useFormStatus = function () { return ReactSharedInternals.H.useHostTransitionStatus(); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js index a5a9b1d48b..be7c30c9cf 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<9fadd324b891cfa2319b7c3d38560e79>> + * @generated SignedSource<> */ "use strict"; @@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) { exports.useFormStatus = function () { return ReactSharedInternals.H.useHostTransitionStatus(); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js index 917d7bbad0..1f1165b480 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<4a776a4c340dfb38ab66d9827b4fe95b>> + * @generated SignedSource<<0cceebe14b823fb2b4a752c96f542990>> */ /* @@ -30061,11 +30061,11 @@ __DEV__ && }; (function () { var isomorphicReactPackageVersion = React.version; - if ("19.2.0-native-fb-67e24bc5-20251001" !== isomorphicReactPackageVersion) + if ("19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion) throw Error( 'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + - "\n - react-dom: 19.2.0-native-fb-67e24bc5-20251001\nLearn more: https://react.dev/warnings/version-mismatch") + "\n - react-dom: 19.2.0-native-fb-ae74234e-20251001\nLearn more: https://react.dev/warnings/version-mismatch") ); })(); ("function" === typeof Map && @@ -30102,10 +30102,10 @@ __DEV__ && !(function () { var internals = { bundleType: 1, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; internals.overrideHookState = overrideHookState; internals.overrideHookStateDeletePath = overrideHookStateDeletePath; @@ -30255,5 +30255,5 @@ __DEV__ && listenToAllSupportedEvents(container); return new ReactDOMHydrationRoot(initialChildren); }; - exports.version = "19.2.0-native-fb-67e24bc5-20251001"; + exports.version = "19.2.0-native-fb-ae74234e-20251001"; })(); diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-prod.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-prod.js index 90eef63909..6a72405285 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-prod.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-prod.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<46731856dd2d4f328ddc4b5e1d3ecebe>> + * @generated SignedSource<> */ /* @@ -17578,14 +17578,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) { }; var isomorphicReactPackageVersion$jscomp$inline_2059 = React.version; if ( - "19.2.0-native-fb-67e24bc5-20251001" !== + "19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion$jscomp$inline_2059 ) throw Error( formatProdErrorMessage( 527, isomorphicReactPackageVersion$jscomp$inline_2059, - "19.2.0-native-fb-67e24bc5-20251001" + "19.2.0-native-fb-ae74234e-20251001" ) ); ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { @@ -17607,10 +17607,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { }; var internals$jscomp$inline_2636 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { var hook$jscomp$inline_2637 = __REACT_DEVTOOLS_GLOBAL_HOOK__; @@ -17717,4 +17717,4 @@ exports.hydrateRoot = function (container, initialChildren, options) { listenToAllSupportedEvents(container); return new ReactDOMHydrationRoot(initialChildren); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-profiling.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-profiling.js index 00ada23488..8f0315da8b 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-profiling.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<0be3fee32c93afcd7299cbb6ded6e669>> + * @generated SignedSource<<4887fd747289f8cd1f3cb68a2b04b490>> */ /* @@ -19716,14 +19716,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) { }; var isomorphicReactPackageVersion$jscomp$inline_2374 = React.version; if ( - "19.2.0-native-fb-67e24bc5-20251001" !== + "19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion$jscomp$inline_2374 ) throw Error( formatProdErrorMessage( 527, isomorphicReactPackageVersion$jscomp$inline_2374, - "19.2.0-native-fb-67e24bc5-20251001" + "19.2.0-native-fb-ae74234e-20251001" ) ); ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { @@ -19745,10 +19745,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { }; var internals$jscomp$inline_2381 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001", + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001", getLaneLabelMap: function () { for ( var map = new Map(), lane = 1, index$331 = 0; @@ -19871,4 +19871,4 @@ exports.hydrateRoot = function (container, initialChildren, options) { listenToAllSupportedEvents(container); return new ReactDOMHydrationRoot(initialChildren); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-dev.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-dev.js index 45d13bade8..f970ebc434 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-dev.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<5bde46827488e9807b6703f473f20792>> + * @generated SignedSource<<135c96374256ecad4d89ffdf56a29046>> */ /* @@ -30117,11 +30117,11 @@ __DEV__ && }; (function () { var isomorphicReactPackageVersion = React.version; - if ("19.2.0-native-fb-67e24bc5-20251001" !== isomorphicReactPackageVersion) + if ("19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion) throw Error( 'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + - "\n - react-dom: 19.2.0-native-fb-67e24bc5-20251001\nLearn more: https://react.dev/warnings/version-mismatch") + "\n - react-dom: 19.2.0-native-fb-ae74234e-20251001\nLearn more: https://react.dev/warnings/version-mismatch") ); })(); ("function" === typeof Map && @@ -30158,10 +30158,10 @@ __DEV__ && !(function () { var internals = { bundleType: 1, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; internals.overrideHookState = overrideHookState; internals.overrideHookStateDeletePath = overrideHookStateDeletePath; @@ -30627,7 +30627,7 @@ __DEV__ && exports.useFormStatus = function () { return resolveDispatcher().useHostTransitionStatus(); }; - exports.version = "19.2.0-native-fb-67e24bc5-20251001"; + exports.version = "19.2.0-native-fb-ae74234e-20251001"; "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-prod.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-prod.js index 52af6b30cd..8584eb6a7c 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-prod.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-prod.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ /* @@ -17589,14 +17589,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) { }; var isomorphicReactPackageVersion$jscomp$inline_2060 = React.version; if ( - "19.2.0-native-fb-67e24bc5-20251001" !== + "19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion$jscomp$inline_2060 ) throw Error( formatProdErrorMessage( 527, isomorphicReactPackageVersion$jscomp$inline_2060, - "19.2.0-native-fb-67e24bc5-20251001" + "19.2.0-native-fb-ae74234e-20251001" ) ); ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { @@ -17618,10 +17618,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { }; var internals$jscomp$inline_2639 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { var hook$jscomp$inline_2640 = __REACT_DEVTOOLS_GLOBAL_HOOK__; @@ -17881,4 +17881,4 @@ exports.useFormState = function (action, initialState, permalink) { exports.useFormStatus = function () { return ReactSharedInternals.H.useHostTransitionStatus(); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-profiling.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-profiling.js index 78c9e2753a..8e28413216 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-profiling.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<6da2ab9c04ce14da45d3ebf2ae42280c>> + * @generated SignedSource<<489a3a3e0993130a45f60933bdd9d15c>> */ /* @@ -19731,14 +19731,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) { }; var isomorphicReactPackageVersion$jscomp$inline_2375 = React.version; if ( - "19.2.0-native-fb-67e24bc5-20251001" !== + "19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion$jscomp$inline_2375 ) throw Error( formatProdErrorMessage( 527, isomorphicReactPackageVersion$jscomp$inline_2375, - "19.2.0-native-fb-67e24bc5-20251001" + "19.2.0-native-fb-ae74234e-20251001" ) ); ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { @@ -19760,10 +19760,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) { }; var internals$jscomp$inline_2382 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001", + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001", getLaneLabelMap: function () { for ( var map = new Map(), lane = 1, index$331 = 0; @@ -20039,7 +20039,7 @@ exports.useFormState = function (action, initialState, permalink) { exports.useFormStatus = function () { return ReactSharedInternals.H.useHostTransitionStatus(); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-dev.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-dev.js index f3e902cc3e..048a9904d4 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-dev.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ "use strict"; @@ -16015,10 +16015,10 @@ __DEV__ && (function () { var internals = { bundleType: 1, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-test-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; internals.overrideHookState = overrideHookState; internals.overrideHookStateDeletePath = overrideHookStateDeletePath; @@ -16164,5 +16164,5 @@ __DEV__ && flushSyncWorkAcrossRoots_impl(0, !0)); } }; - exports.version = "19.2.0-native-fb-67e24bc5-20251001"; + exports.version = "19.2.0-native-fb-ae74234e-20251001"; })(); diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-prod.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-prod.js index 8a2d7ef9f8..e6bd0a3d92 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-prod.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-prod.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<0fbd0b541ee3bd05ab3abdc56b5c0367>> + * @generated SignedSource<<03ad6ea3a34dce1d8fa98b6c84f5c7a3>> */ "use strict"; @@ -10105,10 +10105,10 @@ function wrapFiber(fiber) { } var internals$jscomp$inline_1493 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-test-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { var hook$jscomp$inline_1494 = __REACT_DEVTOOLS_GLOBAL_HOOK__; @@ -10244,4 +10244,4 @@ exports.unstable_batchedUpdates = function (fn, a) { flushSyncWorkAcrossRoots_impl(0, !0)); } }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-profiling.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-profiling.js index 32f38666f3..38ddeeb670 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-profiling.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ "use strict"; @@ -10726,10 +10726,10 @@ function wrapFiber(fiber) { } var internals$jscomp$inline_1274 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-test-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001", + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001", getLaneLabelMap: function () { for ( var map = new Map(), lane = 1, index$146 = 0; @@ -10880,4 +10880,4 @@ exports.unstable_batchedUpdates = function (fn, a) { flushSyncWorkAcrossRoots_impl(0, !0)); } }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-dev.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-dev.js index 00db61b2d0..4021fde9bf 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-dev.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ "use strict"; @@ -1400,7 +1400,7 @@ __DEV__ && exports.useTransition = function () { return resolveDispatcher().useTransition(); }; - exports.version = "19.2.0-native-fb-67e24bc5-20251001"; + exports.version = "19.2.0-native-fb-ae74234e-20251001"; "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-prod.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-prod.js index 57026276ff..8586c08180 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-prod.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-prod.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<035559208dcb9e36c4a9909b6cae2ce8>> + * @generated SignedSource<<16b2ff731d2eceea947e1a48153233f2>> */ "use strict"; @@ -583,4 +583,4 @@ exports.useSyncExternalStore = function ( exports.useTransition = function () { return ReactSharedInternals.H.useTransition(); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; diff --git a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-profiling.js b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-profiling.js index 945d8532ed..42b7b7dfc4 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-profiling.js +++ b/compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react/cjs/React-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<8f65edb3746087712c6419a65abf92fa>> */ "use strict"; @@ -587,7 +587,7 @@ exports.useSyncExternalStore = function ( exports.useTransition = function () { return ReactSharedInternals.H.useTransition(); }; -exports.version = "19.2.0-native-fb-67e24bc5-20251001"; +exports.version = "19.2.0-native-fb-ae74234e-20251001"; "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION index 473aef0c6e..79690d8143 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION @@ -1 +1 @@ -67e24bc5279204108b749fe48b4d395ef9e49e67 +ae74234eae6ebd62f19190731278e20bc1c37d51 diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-dev.fb.js b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-dev.fb.js index 2e6decf449..3c5c505255 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-dev.fb.js +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-dev.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<8fd45a331825a4ef12f4aec0d4304039>> + * @generated SignedSource<<21de229c2d24330ed7ac7f8f8eb97816>> */ "use strict"; @@ -20000,10 +20000,10 @@ __DEV__ && (function () { var internals = { bundleType: 1, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; null !== extraDevToolsConfig && (internals.rendererConfig = extraDevToolsConfig); diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-prod.fb.js b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-prod.fb.js index 96ab568e5b..5228bc716c 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-prod.fb.js +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-prod.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<08c282447d344ae2a4949e597bafec62>> */ "use strict"; @@ -11256,10 +11256,10 @@ batchedUpdatesImpl = function (fn, a) { var roots = new Map(), internals$jscomp$inline_1319 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; null !== extraDevToolsConfig && (internals$jscomp$inline_1319.rendererConfig = extraDevToolsConfig); diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js index f6766405ee..5542182f44 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<6a238bd910cff1eb0eaa66b41883ac06>> + * @generated SignedSource<> */ "use strict"; @@ -13320,10 +13320,10 @@ batchedUpdatesImpl = function (fn, a) { var roots = new Map(), internals$jscomp$inline_1627 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; null !== extraDevToolsConfig && (internals$jscomp$inline_1627.rendererConfig = extraDevToolsConfig); diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js index 7dd417fb91..0602d8eb71 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ "use strict"; @@ -20292,11 +20292,11 @@ __DEV__ && shouldSuspendImpl = newShouldSuspendImpl; }; var isomorphicReactPackageVersion = React.version; - if ("19.2.0-native-fb-67e24bc5-20251001" !== isomorphicReactPackageVersion) + if ("19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion) throw Error( 'Incompatible React versions: The "react" and "react-native-renderer" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + - "\n - react-native-renderer: 19.2.0-native-fb-67e24bc5-20251001\nLearn more: https://react.dev/warnings/version-mismatch") + "\n - react-native-renderer: 19.2.0-native-fb-ae74234e-20251001\nLearn more: https://react.dev/warnings/version-mismatch") ); if ( "function" !== @@ -20322,10 +20322,10 @@ __DEV__ && (function () { var internals = { bundleType: 1, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; null !== extraDevToolsConfig && (internals.rendererConfig = extraDevToolsConfig); diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js index eb1b7593a6..3d7b87553b 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<64ceace428801328a64b34dd3f9e8b82>> + * @generated SignedSource<<1386a6ce5628fdb9e782444d18739cfe>> */ "use strict"; @@ -11426,11 +11426,11 @@ function updateContainer(element, container, parentComponent, callback) { return lane; } var isomorphicReactPackageVersion = React.version; -if ("19.2.0-native-fb-67e24bc5-20251001" !== isomorphicReactPackageVersion) +if ("19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion) throw Error( 'Incompatible React versions: The "react" and "react-native-renderer" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + - "\n - react-native-renderer: 19.2.0-native-fb-67e24bc5-20251001\nLearn more: https://react.dev/warnings/version-mismatch") + "\n - react-native-renderer: 19.2.0-native-fb-ae74234e-20251001\nLearn more: https://react.dev/warnings/version-mismatch") ); if ( "function" !== @@ -11480,10 +11480,10 @@ batchedUpdatesImpl = function (fn, a) { var roots = new Map(), internals$jscomp$inline_1326 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; null !== extraDevToolsConfig && (internals$jscomp$inline_1326.rendererConfig = extraDevToolsConfig); diff --git a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js index f64048793f..73461c41a7 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js +++ b/compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<03763cb1b9bc415a0b6f1630579b4009>> + * @generated SignedSource<<97a101ade0837f50cca4a97dbc11cc5c>> */ "use strict"; @@ -13483,11 +13483,11 @@ function updateContainer(element, container, parentComponent, callback) { return lane; } var isomorphicReactPackageVersion = React.version; -if ("19.2.0-native-fb-67e24bc5-20251001" !== isomorphicReactPackageVersion) +if ("19.2.0-native-fb-ae74234e-20251001" !== isomorphicReactPackageVersion) throw Error( 'Incompatible React versions: The "react" and "react-native-renderer" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + - "\n - react-native-renderer: 19.2.0-native-fb-67e24bc5-20251001\nLearn more: https://react.dev/warnings/version-mismatch") + "\n - react-native-renderer: 19.2.0-native-fb-ae74234e-20251001\nLearn more: https://react.dev/warnings/version-mismatch") ); if ( "function" !== @@ -13537,10 +13537,10 @@ batchedUpdatesImpl = function (fn, a) { var roots = new Map(), internals$jscomp$inline_1634 = { bundleType: 0, - version: "19.2.0-native-fb-67e24bc5-20251001", + version: "19.2.0-native-fb-ae74234e-20251001", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.0-native-fb-67e24bc5-20251001" + reconcilerVersion: "19.2.0-native-fb-ae74234e-20251001" }; null !== extraDevToolsConfig && (internals$jscomp$inline_1634.rendererConfig = extraDevToolsConfig); diff --git a/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js b/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js index 43d6a933ed..adae9d6f3f 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js +++ b/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js @@ -12,7 +12,7 @@ * @lightSyntaxTransform * @preventMunge * @oncall react_core - * @generated SignedSource<<24ba748f76ee6efa709a1157485ed543>> + * @generated SignedSource<<601189980998463aafddff88451ac0c2>> */ 'use strict'; @@ -21,6 +21,15 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; +var core$1 = require('@babel/core'); +var BabelParser = require('@babel/parser'); +var zod = require('zod'); +var zodValidationError = require('zod-validation-error'); +var crypto = require('crypto'); +var PluginProposalPrivateMethods = require('@babel/plugin-proposal-private-methods'); +var HermesParser = require('hermes-parser'); +var util = require('util'); + const SETTINGS_KEY = 'react-hooks'; const SETTINGS_ADDITIONAL_EFFECT_HOOKS_KEY = 'additionalEffectHooks'; function getAdditionalEffectHooksFromSettings(settings) { @@ -1457,10 +1466,53025 @@ function getUnknownDependenciesMessage(reactiveHookName) { `are unknown. Pass an inline function instead.`); } +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } +var invariant_1; +var hasRequiredInvariant; + +function requireInvariant () { + if (hasRequiredInvariant) return invariant_1; + hasRequiredInvariant = 1; + + var invariant = function(condition, format, a, b, c, d, e, f) { + { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } + }; + + invariant_1 = invariant; + return invariant_1; +} + +var invariantExports = requireInvariant(); +var invariant = /*@__PURE__*/getDefaultExportFromCjs(invariantExports); + +var lib$3 = {}; + +var isReactComponent = {}; + +var buildMatchMemberExpression = {}; + +var matchesPattern = {}; + +var generated$3 = {}; + +var shallowEqual = {}; + +var hasRequiredShallowEqual; + +function requireShallowEqual () { + if (hasRequiredShallowEqual) return shallowEqual; + hasRequiredShallowEqual = 1; + + Object.defineProperty(shallowEqual, "__esModule", { + value: true + }); + shallowEqual.default = shallowEqual$1; + function shallowEqual$1(actual, expected) { + const keys = Object.keys(expected); + for (const key of keys) { + if (actual[key] !== expected[key]) { + return false; + } + } + return true; + } + + + return shallowEqual; +} + +var deprecationWarning = {}; + +var hasRequiredDeprecationWarning; + +function requireDeprecationWarning () { + if (hasRequiredDeprecationWarning) return deprecationWarning; + hasRequiredDeprecationWarning = 1; + + Object.defineProperty(deprecationWarning, "__esModule", { + value: true + }); + deprecationWarning.default = deprecationWarning$1; + const warnings = new Set(); + function deprecationWarning$1(oldName, newName, prefix = "") { + if (warnings.has(oldName)) return; + warnings.add(oldName); + const { + internal, + trace + } = captureShortStackTrace(1, 2); + if (internal) { + return; + } + console.warn(`${prefix}\`${oldName}\` has been deprecated, please migrate to \`${newName}\`\n${trace}`); + } + function captureShortStackTrace(skip, length) { + const { + stackTraceLimit, + prepareStackTrace + } = Error; + let stackTrace; + Error.stackTraceLimit = 1 + skip + length; + Error.prepareStackTrace = function (err, stack) { + stackTrace = stack; + }; + Error.stackTraceLimit = stackTraceLimit; + Error.prepareStackTrace = prepareStackTrace; + if (!stackTrace) return { + internal: false, + trace: "" + }; + const shortStackTrace = stackTrace.slice(1 + skip, 1 + skip + length); + return { + internal: /[\\/]@babel[\\/]/.test(shortStackTrace[1].getFileName()), + trace: shortStackTrace.map(frame => ` at ${frame}`).join("\n") + }; + } + + + return deprecationWarning; +} + +var hasRequiredGenerated$3; + +function requireGenerated$3 () { + if (hasRequiredGenerated$3) return generated$3; + hasRequiredGenerated$3 = 1; + + Object.defineProperty(generated$3, "__esModule", { + value: true + }); + generated$3.isAccessor = isAccessor; + generated$3.isAnyTypeAnnotation = isAnyTypeAnnotation; + generated$3.isArgumentPlaceholder = isArgumentPlaceholder; + generated$3.isArrayExpression = isArrayExpression; + generated$3.isArrayPattern = isArrayPattern; + generated$3.isArrayTypeAnnotation = isArrayTypeAnnotation; + generated$3.isArrowFunctionExpression = isArrowFunctionExpression; + generated$3.isAssignmentExpression = isAssignmentExpression; + generated$3.isAssignmentPattern = isAssignmentPattern; + generated$3.isAwaitExpression = isAwaitExpression; + generated$3.isBigIntLiteral = isBigIntLiteral; + generated$3.isBinary = isBinary; + generated$3.isBinaryExpression = isBinaryExpression; + generated$3.isBindExpression = isBindExpression; + generated$3.isBlock = isBlock; + generated$3.isBlockParent = isBlockParent; + generated$3.isBlockStatement = isBlockStatement; + generated$3.isBooleanLiteral = isBooleanLiteral; + generated$3.isBooleanLiteralTypeAnnotation = isBooleanLiteralTypeAnnotation; + generated$3.isBooleanTypeAnnotation = isBooleanTypeAnnotation; + generated$3.isBreakStatement = isBreakStatement; + generated$3.isCallExpression = isCallExpression; + generated$3.isCatchClause = isCatchClause; + generated$3.isClass = isClass; + generated$3.isClassAccessorProperty = isClassAccessorProperty; + generated$3.isClassBody = isClassBody; + generated$3.isClassDeclaration = isClassDeclaration; + generated$3.isClassExpression = isClassExpression; + generated$3.isClassImplements = isClassImplements; + generated$3.isClassMethod = isClassMethod; + generated$3.isClassPrivateMethod = isClassPrivateMethod; + generated$3.isClassPrivateProperty = isClassPrivateProperty; + generated$3.isClassProperty = isClassProperty; + generated$3.isCompletionStatement = isCompletionStatement; + generated$3.isConditional = isConditional; + generated$3.isConditionalExpression = isConditionalExpression; + generated$3.isContinueStatement = isContinueStatement; + generated$3.isDebuggerStatement = isDebuggerStatement; + generated$3.isDecimalLiteral = isDecimalLiteral; + generated$3.isDeclaration = isDeclaration; + generated$3.isDeclareClass = isDeclareClass; + generated$3.isDeclareExportAllDeclaration = isDeclareExportAllDeclaration; + generated$3.isDeclareExportDeclaration = isDeclareExportDeclaration; + generated$3.isDeclareFunction = isDeclareFunction; + generated$3.isDeclareInterface = isDeclareInterface; + generated$3.isDeclareModule = isDeclareModule; + generated$3.isDeclareModuleExports = isDeclareModuleExports; + generated$3.isDeclareOpaqueType = isDeclareOpaqueType; + generated$3.isDeclareTypeAlias = isDeclareTypeAlias; + generated$3.isDeclareVariable = isDeclareVariable; + generated$3.isDeclaredPredicate = isDeclaredPredicate; + generated$3.isDecorator = isDecorator; + generated$3.isDirective = isDirective; + generated$3.isDirectiveLiteral = isDirectiveLiteral; + generated$3.isDoExpression = isDoExpression; + generated$3.isDoWhileStatement = isDoWhileStatement; + generated$3.isEmptyStatement = isEmptyStatement; + generated$3.isEmptyTypeAnnotation = isEmptyTypeAnnotation; + generated$3.isEnumBody = isEnumBody; + generated$3.isEnumBooleanBody = isEnumBooleanBody; + generated$3.isEnumBooleanMember = isEnumBooleanMember; + generated$3.isEnumDeclaration = isEnumDeclaration; + generated$3.isEnumDefaultedMember = isEnumDefaultedMember; + generated$3.isEnumMember = isEnumMember; + generated$3.isEnumNumberBody = isEnumNumberBody; + generated$3.isEnumNumberMember = isEnumNumberMember; + generated$3.isEnumStringBody = isEnumStringBody; + generated$3.isEnumStringMember = isEnumStringMember; + generated$3.isEnumSymbolBody = isEnumSymbolBody; + generated$3.isExistsTypeAnnotation = isExistsTypeAnnotation; + generated$3.isExportAllDeclaration = isExportAllDeclaration; + generated$3.isExportDeclaration = isExportDeclaration; + generated$3.isExportDefaultDeclaration = isExportDefaultDeclaration; + generated$3.isExportDefaultSpecifier = isExportDefaultSpecifier; + generated$3.isExportNamedDeclaration = isExportNamedDeclaration; + generated$3.isExportNamespaceSpecifier = isExportNamespaceSpecifier; + generated$3.isExportSpecifier = isExportSpecifier; + generated$3.isExpression = isExpression; + generated$3.isExpressionStatement = isExpressionStatement; + generated$3.isExpressionWrapper = isExpressionWrapper; + generated$3.isFile = isFile; + generated$3.isFlow = isFlow; + generated$3.isFlowBaseAnnotation = isFlowBaseAnnotation; + generated$3.isFlowDeclaration = isFlowDeclaration; + generated$3.isFlowPredicate = isFlowPredicate; + generated$3.isFlowType = isFlowType; + generated$3.isFor = isFor; + generated$3.isForInStatement = isForInStatement; + generated$3.isForOfStatement = isForOfStatement; + generated$3.isForStatement = isForStatement; + generated$3.isForXStatement = isForXStatement; + generated$3.isFunction = isFunction; + generated$3.isFunctionDeclaration = isFunctionDeclaration; + generated$3.isFunctionExpression = isFunctionExpression; + generated$3.isFunctionParent = isFunctionParent; + generated$3.isFunctionTypeAnnotation = isFunctionTypeAnnotation; + generated$3.isFunctionTypeParam = isFunctionTypeParam; + generated$3.isGenericTypeAnnotation = isGenericTypeAnnotation; + generated$3.isIdentifier = isIdentifier; + generated$3.isIfStatement = isIfStatement; + generated$3.isImmutable = isImmutable; + generated$3.isImport = isImport; + generated$3.isImportAttribute = isImportAttribute; + generated$3.isImportDeclaration = isImportDeclaration; + generated$3.isImportDefaultSpecifier = isImportDefaultSpecifier; + generated$3.isImportExpression = isImportExpression; + generated$3.isImportNamespaceSpecifier = isImportNamespaceSpecifier; + generated$3.isImportOrExportDeclaration = isImportOrExportDeclaration; + generated$3.isImportSpecifier = isImportSpecifier; + generated$3.isIndexedAccessType = isIndexedAccessType; + generated$3.isInferredPredicate = isInferredPredicate; + generated$3.isInterfaceDeclaration = isInterfaceDeclaration; + generated$3.isInterfaceExtends = isInterfaceExtends; + generated$3.isInterfaceTypeAnnotation = isInterfaceTypeAnnotation; + generated$3.isInterpreterDirective = isInterpreterDirective; + generated$3.isIntersectionTypeAnnotation = isIntersectionTypeAnnotation; + generated$3.isJSX = isJSX; + generated$3.isJSXAttribute = isJSXAttribute; + generated$3.isJSXClosingElement = isJSXClosingElement; + generated$3.isJSXClosingFragment = isJSXClosingFragment; + generated$3.isJSXElement = isJSXElement; + generated$3.isJSXEmptyExpression = isJSXEmptyExpression; + generated$3.isJSXExpressionContainer = isJSXExpressionContainer; + generated$3.isJSXFragment = isJSXFragment; + generated$3.isJSXIdentifier = isJSXIdentifier; + generated$3.isJSXMemberExpression = isJSXMemberExpression; + generated$3.isJSXNamespacedName = isJSXNamespacedName; + generated$3.isJSXOpeningElement = isJSXOpeningElement; + generated$3.isJSXOpeningFragment = isJSXOpeningFragment; + generated$3.isJSXSpreadAttribute = isJSXSpreadAttribute; + generated$3.isJSXSpreadChild = isJSXSpreadChild; + generated$3.isJSXText = isJSXText; + generated$3.isLVal = isLVal; + generated$3.isLabeledStatement = isLabeledStatement; + generated$3.isLiteral = isLiteral; + generated$3.isLogicalExpression = isLogicalExpression; + generated$3.isLoop = isLoop; + generated$3.isMemberExpression = isMemberExpression; + generated$3.isMetaProperty = isMetaProperty; + generated$3.isMethod = isMethod; + generated$3.isMiscellaneous = isMiscellaneous; + generated$3.isMixedTypeAnnotation = isMixedTypeAnnotation; + generated$3.isModuleDeclaration = isModuleDeclaration; + generated$3.isModuleExpression = isModuleExpression; + generated$3.isModuleSpecifier = isModuleSpecifier; + generated$3.isNewExpression = isNewExpression; + generated$3.isNoop = isNoop; + generated$3.isNullLiteral = isNullLiteral; + generated$3.isNullLiteralTypeAnnotation = isNullLiteralTypeAnnotation; + generated$3.isNullableTypeAnnotation = isNullableTypeAnnotation; + generated$3.isNumberLiteral = isNumberLiteral; + generated$3.isNumberLiteralTypeAnnotation = isNumberLiteralTypeAnnotation; + generated$3.isNumberTypeAnnotation = isNumberTypeAnnotation; + generated$3.isNumericLiteral = isNumericLiteral; + generated$3.isObjectExpression = isObjectExpression; + generated$3.isObjectMember = isObjectMember; + generated$3.isObjectMethod = isObjectMethod; + generated$3.isObjectPattern = isObjectPattern; + generated$3.isObjectProperty = isObjectProperty; + generated$3.isObjectTypeAnnotation = isObjectTypeAnnotation; + generated$3.isObjectTypeCallProperty = isObjectTypeCallProperty; + generated$3.isObjectTypeIndexer = isObjectTypeIndexer; + generated$3.isObjectTypeInternalSlot = isObjectTypeInternalSlot; + generated$3.isObjectTypeProperty = isObjectTypeProperty; + generated$3.isObjectTypeSpreadProperty = isObjectTypeSpreadProperty; + generated$3.isOpaqueType = isOpaqueType; + generated$3.isOptionalCallExpression = isOptionalCallExpression; + generated$3.isOptionalIndexedAccessType = isOptionalIndexedAccessType; + generated$3.isOptionalMemberExpression = isOptionalMemberExpression; + generated$3.isParenthesizedExpression = isParenthesizedExpression; + generated$3.isPattern = isPattern; + generated$3.isPatternLike = isPatternLike; + generated$3.isPipelineBareFunction = isPipelineBareFunction; + generated$3.isPipelinePrimaryTopicReference = isPipelinePrimaryTopicReference; + generated$3.isPipelineTopicExpression = isPipelineTopicExpression; + generated$3.isPlaceholder = isPlaceholder; + generated$3.isPrivate = isPrivate; + generated$3.isPrivateName = isPrivateName; + generated$3.isProgram = isProgram; + generated$3.isProperty = isProperty; + generated$3.isPureish = isPureish; + generated$3.isQualifiedTypeIdentifier = isQualifiedTypeIdentifier; + generated$3.isRecordExpression = isRecordExpression; + generated$3.isRegExpLiteral = isRegExpLiteral; + generated$3.isRegexLiteral = isRegexLiteral; + generated$3.isRestElement = isRestElement; + generated$3.isRestProperty = isRestProperty; + generated$3.isReturnStatement = isReturnStatement; + generated$3.isScopable = isScopable; + generated$3.isSequenceExpression = isSequenceExpression; + generated$3.isSpreadElement = isSpreadElement; + generated$3.isSpreadProperty = isSpreadProperty; + generated$3.isStandardized = isStandardized; + generated$3.isStatement = isStatement; + generated$3.isStaticBlock = isStaticBlock; + generated$3.isStringLiteral = isStringLiteral; + generated$3.isStringLiteralTypeAnnotation = isStringLiteralTypeAnnotation; + generated$3.isStringTypeAnnotation = isStringTypeAnnotation; + generated$3.isSuper = isSuper; + generated$3.isSwitchCase = isSwitchCase; + generated$3.isSwitchStatement = isSwitchStatement; + generated$3.isSymbolTypeAnnotation = isSymbolTypeAnnotation; + generated$3.isTSAnyKeyword = isTSAnyKeyword; + generated$3.isTSArrayType = isTSArrayType; + generated$3.isTSAsExpression = isTSAsExpression; + generated$3.isTSBaseType = isTSBaseType; + generated$3.isTSBigIntKeyword = isTSBigIntKeyword; + generated$3.isTSBooleanKeyword = isTSBooleanKeyword; + generated$3.isTSCallSignatureDeclaration = isTSCallSignatureDeclaration; + generated$3.isTSConditionalType = isTSConditionalType; + generated$3.isTSConstructSignatureDeclaration = isTSConstructSignatureDeclaration; + generated$3.isTSConstructorType = isTSConstructorType; + generated$3.isTSDeclareFunction = isTSDeclareFunction; + generated$3.isTSDeclareMethod = isTSDeclareMethod; + generated$3.isTSEntityName = isTSEntityName; + generated$3.isTSEnumDeclaration = isTSEnumDeclaration; + generated$3.isTSEnumMember = isTSEnumMember; + generated$3.isTSExportAssignment = isTSExportAssignment; + generated$3.isTSExpressionWithTypeArguments = isTSExpressionWithTypeArguments; + generated$3.isTSExternalModuleReference = isTSExternalModuleReference; + generated$3.isTSFunctionType = isTSFunctionType; + generated$3.isTSImportEqualsDeclaration = isTSImportEqualsDeclaration; + generated$3.isTSImportType = isTSImportType; + generated$3.isTSIndexSignature = isTSIndexSignature; + generated$3.isTSIndexedAccessType = isTSIndexedAccessType; + generated$3.isTSInferType = isTSInferType; + generated$3.isTSInstantiationExpression = isTSInstantiationExpression; + generated$3.isTSInterfaceBody = isTSInterfaceBody; + generated$3.isTSInterfaceDeclaration = isTSInterfaceDeclaration; + generated$3.isTSIntersectionType = isTSIntersectionType; + generated$3.isTSIntrinsicKeyword = isTSIntrinsicKeyword; + generated$3.isTSLiteralType = isTSLiteralType; + generated$3.isTSMappedType = isTSMappedType; + generated$3.isTSMethodSignature = isTSMethodSignature; + generated$3.isTSModuleBlock = isTSModuleBlock; + generated$3.isTSModuleDeclaration = isTSModuleDeclaration; + generated$3.isTSNamedTupleMember = isTSNamedTupleMember; + generated$3.isTSNamespaceExportDeclaration = isTSNamespaceExportDeclaration; + generated$3.isTSNeverKeyword = isTSNeverKeyword; + generated$3.isTSNonNullExpression = isTSNonNullExpression; + generated$3.isTSNullKeyword = isTSNullKeyword; + generated$3.isTSNumberKeyword = isTSNumberKeyword; + generated$3.isTSObjectKeyword = isTSObjectKeyword; + generated$3.isTSOptionalType = isTSOptionalType; + generated$3.isTSParameterProperty = isTSParameterProperty; + generated$3.isTSParenthesizedType = isTSParenthesizedType; + generated$3.isTSPropertySignature = isTSPropertySignature; + generated$3.isTSQualifiedName = isTSQualifiedName; + generated$3.isTSRestType = isTSRestType; + generated$3.isTSSatisfiesExpression = isTSSatisfiesExpression; + generated$3.isTSStringKeyword = isTSStringKeyword; + generated$3.isTSSymbolKeyword = isTSSymbolKeyword; + generated$3.isTSThisType = isTSThisType; + generated$3.isTSTupleType = isTSTupleType; + generated$3.isTSType = isTSType; + generated$3.isTSTypeAliasDeclaration = isTSTypeAliasDeclaration; + generated$3.isTSTypeAnnotation = isTSTypeAnnotation; + generated$3.isTSTypeAssertion = isTSTypeAssertion; + generated$3.isTSTypeElement = isTSTypeElement; + generated$3.isTSTypeLiteral = isTSTypeLiteral; + generated$3.isTSTypeOperator = isTSTypeOperator; + generated$3.isTSTypeParameter = isTSTypeParameter; + generated$3.isTSTypeParameterDeclaration = isTSTypeParameterDeclaration; + generated$3.isTSTypeParameterInstantiation = isTSTypeParameterInstantiation; + generated$3.isTSTypePredicate = isTSTypePredicate; + generated$3.isTSTypeQuery = isTSTypeQuery; + generated$3.isTSTypeReference = isTSTypeReference; + generated$3.isTSUndefinedKeyword = isTSUndefinedKeyword; + generated$3.isTSUnionType = isTSUnionType; + generated$3.isTSUnknownKeyword = isTSUnknownKeyword; + generated$3.isTSVoidKeyword = isTSVoidKeyword; + generated$3.isTaggedTemplateExpression = isTaggedTemplateExpression; + generated$3.isTemplateElement = isTemplateElement; + generated$3.isTemplateLiteral = isTemplateLiteral; + generated$3.isTerminatorless = isTerminatorless; + generated$3.isThisExpression = isThisExpression; + generated$3.isThisTypeAnnotation = isThisTypeAnnotation; + generated$3.isThrowStatement = isThrowStatement; + generated$3.isTopicReference = isTopicReference; + generated$3.isTryStatement = isTryStatement; + generated$3.isTupleExpression = isTupleExpression; + generated$3.isTupleTypeAnnotation = isTupleTypeAnnotation; + generated$3.isTypeAlias = isTypeAlias; + generated$3.isTypeAnnotation = isTypeAnnotation; + generated$3.isTypeCastExpression = isTypeCastExpression; + generated$3.isTypeParameter = isTypeParameter; + generated$3.isTypeParameterDeclaration = isTypeParameterDeclaration; + generated$3.isTypeParameterInstantiation = isTypeParameterInstantiation; + generated$3.isTypeScript = isTypeScript; + generated$3.isTypeofTypeAnnotation = isTypeofTypeAnnotation; + generated$3.isUnaryExpression = isUnaryExpression; + generated$3.isUnaryLike = isUnaryLike; + generated$3.isUnionTypeAnnotation = isUnionTypeAnnotation; + generated$3.isUpdateExpression = isUpdateExpression; + generated$3.isUserWhitespacable = isUserWhitespacable; + generated$3.isV8IntrinsicIdentifier = isV8IntrinsicIdentifier; + generated$3.isVariableDeclaration = isVariableDeclaration; + generated$3.isVariableDeclarator = isVariableDeclarator; + generated$3.isVariance = isVariance; + generated$3.isVoidTypeAnnotation = isVoidTypeAnnotation; + generated$3.isWhile = isWhile; + generated$3.isWhileStatement = isWhileStatement; + generated$3.isWithStatement = isWithStatement; + generated$3.isYieldExpression = isYieldExpression; + var _shallowEqual = requireShallowEqual(); + var _deprecationWarning = requireDeprecationWarning(); + function isArrayExpression(node, opts) { + if (!node) return false; + if (node.type !== "ArrayExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAssignmentExpression(node, opts) { + if (!node) return false; + if (node.type !== "AssignmentExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBinaryExpression(node, opts) { + if (!node) return false; + if (node.type !== "BinaryExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterpreterDirective(node, opts) { + if (!node) return false; + if (node.type !== "InterpreterDirective") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDirective(node, opts) { + if (!node) return false; + if (node.type !== "Directive") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDirectiveLiteral(node, opts) { + if (!node) return false; + if (node.type !== "DirectiveLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBlockStatement(node, opts) { + if (!node) return false; + if (node.type !== "BlockStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBreakStatement(node, opts) { + if (!node) return false; + if (node.type !== "BreakStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isCallExpression(node, opts) { + if (!node) return false; + if (node.type !== "CallExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isCatchClause(node, opts) { + if (!node) return false; + if (node.type !== "CatchClause") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isConditionalExpression(node, opts) { + if (!node) return false; + if (node.type !== "ConditionalExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isContinueStatement(node, opts) { + if (!node) return false; + if (node.type !== "ContinueStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDebuggerStatement(node, opts) { + if (!node) return false; + if (node.type !== "DebuggerStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDoWhileStatement(node, opts) { + if (!node) return false; + if (node.type !== "DoWhileStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEmptyStatement(node, opts) { + if (!node) return false; + if (node.type !== "EmptyStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExpressionStatement(node, opts) { + if (!node) return false; + if (node.type !== "ExpressionStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFile(node, opts) { + if (!node) return false; + if (node.type !== "File") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForInStatement(node, opts) { + if (!node) return false; + if (node.type !== "ForInStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForStatement(node, opts) { + if (!node) return false; + if (node.type !== "ForStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "FunctionDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionExpression(node, opts) { + if (!node) return false; + if (node.type !== "FunctionExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "Identifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIfStatement(node, opts) { + if (!node) return false; + if (node.type !== "IfStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLabeledStatement(node, opts) { + if (!node) return false; + if (node.type !== "LabeledStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStringLiteral(node, opts) { + if (!node) return false; + if (node.type !== "StringLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumericLiteral(node, opts) { + if (!node) return false; + if (node.type !== "NumericLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNullLiteral(node, opts) { + if (!node) return false; + if (node.type !== "NullLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBooleanLiteral(node, opts) { + if (!node) return false; + if (node.type !== "BooleanLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRegExpLiteral(node, opts) { + if (!node) return false; + if (node.type !== "RegExpLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLogicalExpression(node, opts) { + if (!node) return false; + if (node.type !== "LogicalExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMemberExpression(node, opts) { + if (!node) return false; + if (node.type !== "MemberExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNewExpression(node, opts) { + if (!node) return false; + if (node.type !== "NewExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isProgram(node, opts) { + if (!node) return false; + if (node.type !== "Program") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectExpression(node, opts) { + if (!node) return false; + if (node.type !== "ObjectExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectMethod(node, opts) { + if (!node) return false; + if (node.type !== "ObjectMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRestElement(node, opts) { + if (!node) return false; + if (node.type !== "RestElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isReturnStatement(node, opts) { + if (!node) return false; + if (node.type !== "ReturnStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSequenceExpression(node, opts) { + if (!node) return false; + if (node.type !== "SequenceExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isParenthesizedExpression(node, opts) { + if (!node) return false; + if (node.type !== "ParenthesizedExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSwitchCase(node, opts) { + if (!node) return false; + if (node.type !== "SwitchCase") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSwitchStatement(node, opts) { + if (!node) return false; + if (node.type !== "SwitchStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isThisExpression(node, opts) { + if (!node) return false; + if (node.type !== "ThisExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isThrowStatement(node, opts) { + if (!node) return false; + if (node.type !== "ThrowStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTryStatement(node, opts) { + if (!node) return false; + if (node.type !== "TryStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUnaryExpression(node, opts) { + if (!node) return false; + if (node.type !== "UnaryExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUpdateExpression(node, opts) { + if (!node) return false; + if (node.type !== "UpdateExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVariableDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "VariableDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVariableDeclarator(node, opts) { + if (!node) return false; + if (node.type !== "VariableDeclarator") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isWhileStatement(node, opts) { + if (!node) return false; + if (node.type !== "WhileStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isWithStatement(node, opts) { + if (!node) return false; + if (node.type !== "WithStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAssignmentPattern(node, opts) { + if (!node) return false; + if (node.type !== "AssignmentPattern") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArrayPattern(node, opts) { + if (!node) return false; + if (node.type !== "ArrayPattern") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArrowFunctionExpression(node, opts) { + if (!node) return false; + if (node.type !== "ArrowFunctionExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassBody(node, opts) { + if (!node) return false; + if (node.type !== "ClassBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassExpression(node, opts) { + if (!node) return false; + if (node.type !== "ClassExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ClassDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportAllDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ExportAllDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportDefaultDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ExportDefaultDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportNamedDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ExportNamedDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ExportSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForOfStatement(node, opts) { + if (!node) return false; + if (node.type !== "ForOfStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ImportDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportDefaultSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ImportDefaultSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportNamespaceSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ImportNamespaceSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ImportSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportExpression(node, opts) { + if (!node) return false; + if (node.type !== "ImportExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMetaProperty(node, opts) { + if (!node) return false; + if (node.type !== "MetaProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassMethod(node, opts) { + if (!node) return false; + if (node.type !== "ClassMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectPattern(node, opts) { + if (!node) return false; + if (node.type !== "ObjectPattern") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSpreadElement(node, opts) { + if (!node) return false; + if (node.type !== "SpreadElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSuper(node, opts) { + if (!node) return false; + if (node.type !== "Super") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTaggedTemplateExpression(node, opts) { + if (!node) return false; + if (node.type !== "TaggedTemplateExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTemplateElement(node, opts) { + if (!node) return false; + if (node.type !== "TemplateElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTemplateLiteral(node, opts) { + if (!node) return false; + if (node.type !== "TemplateLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isYieldExpression(node, opts) { + if (!node) return false; + if (node.type !== "YieldExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAwaitExpression(node, opts) { + if (!node) return false; + if (node.type !== "AwaitExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImport(node, opts) { + if (!node) return false; + if (node.type !== "Import") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBigIntLiteral(node, opts) { + if (!node) return false; + if (node.type !== "BigIntLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportNamespaceSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ExportNamespaceSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOptionalMemberExpression(node, opts) { + if (!node) return false; + if (node.type !== "OptionalMemberExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOptionalCallExpression(node, opts) { + if (!node) return false; + if (node.type !== "OptionalCallExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassProperty(node, opts) { + if (!node) return false; + if (node.type !== "ClassProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassAccessorProperty(node, opts) { + if (!node) return false; + if (node.type !== "ClassAccessorProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassPrivateProperty(node, opts) { + if (!node) return false; + if (node.type !== "ClassPrivateProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassPrivateMethod(node, opts) { + if (!node) return false; + if (node.type !== "ClassPrivateMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPrivateName(node, opts) { + if (!node) return false; + if (node.type !== "PrivateName") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStaticBlock(node, opts) { + if (!node) return false; + if (node.type !== "StaticBlock") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAnyTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "AnyTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArrayTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ArrayTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBooleanTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "BooleanTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBooleanLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "BooleanLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNullLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NullLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassImplements(node, opts) { + if (!node) return false; + if (node.type !== "ClassImplements") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareClass(node, opts) { + if (!node) return false; + if (node.type !== "DeclareClass") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareFunction(node, opts) { + if (!node) return false; + if (node.type !== "DeclareFunction") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareInterface(node, opts) { + if (!node) return false; + if (node.type !== "DeclareInterface") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareModule(node, opts) { + if (!node) return false; + if (node.type !== "DeclareModule") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareModuleExports(node, opts) { + if (!node) return false; + if (node.type !== "DeclareModuleExports") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareTypeAlias(node, opts) { + if (!node) return false; + if (node.type !== "DeclareTypeAlias") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareOpaqueType(node, opts) { + if (!node) return false; + if (node.type !== "DeclareOpaqueType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareVariable(node, opts) { + if (!node) return false; + if (node.type !== "DeclareVariable") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareExportDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "DeclareExportDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareExportAllDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "DeclareExportAllDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclaredPredicate(node, opts) { + if (!node) return false; + if (node.type !== "DeclaredPredicate") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExistsTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ExistsTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "FunctionTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionTypeParam(node, opts) { + if (!node) return false; + if (node.type !== "FunctionTypeParam") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isGenericTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "GenericTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInferredPredicate(node, opts) { + if (!node) return false; + if (node.type !== "InferredPredicate") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterfaceExtends(node, opts) { + if (!node) return false; + if (node.type !== "InterfaceExtends") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterfaceDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "InterfaceDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterfaceTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "InterfaceTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIntersectionTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "IntersectionTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMixedTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "MixedTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEmptyTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "EmptyTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNullableTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NullableTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumberLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NumberLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumberTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NumberTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeInternalSlot(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeInternalSlot") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeCallProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeCallProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeIndexer(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeIndexer") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeSpreadProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeSpreadProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOpaqueType(node, opts) { + if (!node) return false; + if (node.type !== "OpaqueType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isQualifiedTypeIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "QualifiedTypeIdentifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStringLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "StringLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStringTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "StringTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSymbolTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "SymbolTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isThisTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ThisTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTupleTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TupleTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeofTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TypeofTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeAlias(node, opts) { + if (!node) return false; + if (node.type !== "TypeAlias") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeCastExpression(node, opts) { + if (!node) return false; + if (node.type !== "TypeCastExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeParameter(node, opts) { + if (!node) return false; + if (node.type !== "TypeParameter") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeParameterDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TypeParameterDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeParameterInstantiation(node, opts) { + if (!node) return false; + if (node.type !== "TypeParameterInstantiation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUnionTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "UnionTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVariance(node, opts) { + if (!node) return false; + if (node.type !== "Variance") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVoidTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "VoidTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "EnumDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumBooleanBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumBooleanBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumNumberBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumNumberBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumStringBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumStringBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumSymbolBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumSymbolBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumBooleanMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumBooleanMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumNumberMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumNumberMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumStringMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumStringMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumDefaultedMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumDefaultedMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIndexedAccessType(node, opts) { + if (!node) return false; + if (node.type !== "IndexedAccessType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOptionalIndexedAccessType(node, opts) { + if (!node) return false; + if (node.type !== "OptionalIndexedAccessType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXAttribute(node, opts) { + if (!node) return false; + if (node.type !== "JSXAttribute") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXClosingElement(node, opts) { + if (!node) return false; + if (node.type !== "JSXClosingElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXElement(node, opts) { + if (!node) return false; + if (node.type !== "JSXElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXEmptyExpression(node, opts) { + if (!node) return false; + if (node.type !== "JSXEmptyExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXExpressionContainer(node, opts) { + if (!node) return false; + if (node.type !== "JSXExpressionContainer") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXSpreadChild(node, opts) { + if (!node) return false; + if (node.type !== "JSXSpreadChild") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "JSXIdentifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXMemberExpression(node, opts) { + if (!node) return false; + if (node.type !== "JSXMemberExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXNamespacedName(node, opts) { + if (!node) return false; + if (node.type !== "JSXNamespacedName") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXOpeningElement(node, opts) { + if (!node) return false; + if (node.type !== "JSXOpeningElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXSpreadAttribute(node, opts) { + if (!node) return false; + if (node.type !== "JSXSpreadAttribute") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXText(node, opts) { + if (!node) return false; + if (node.type !== "JSXText") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXFragment(node, opts) { + if (!node) return false; + if (node.type !== "JSXFragment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXOpeningFragment(node, opts) { + if (!node) return false; + if (node.type !== "JSXOpeningFragment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXClosingFragment(node, opts) { + if (!node) return false; + if (node.type !== "JSXClosingFragment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNoop(node, opts) { + if (!node) return false; + if (node.type !== "Noop") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPlaceholder(node, opts) { + if (!node) return false; + if (node.type !== "Placeholder") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isV8IntrinsicIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "V8IntrinsicIdentifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArgumentPlaceholder(node, opts) { + if (!node) return false; + if (node.type !== "ArgumentPlaceholder") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBindExpression(node, opts) { + if (!node) return false; + if (node.type !== "BindExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportAttribute(node, opts) { + if (!node) return false; + if (node.type !== "ImportAttribute") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDecorator(node, opts) { + if (!node) return false; + if (node.type !== "Decorator") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDoExpression(node, opts) { + if (!node) return false; + if (node.type !== "DoExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportDefaultSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ExportDefaultSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRecordExpression(node, opts) { + if (!node) return false; + if (node.type !== "RecordExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTupleExpression(node, opts) { + if (!node) return false; + if (node.type !== "TupleExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDecimalLiteral(node, opts) { + if (!node) return false; + if (node.type !== "DecimalLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isModuleExpression(node, opts) { + if (!node) return false; + if (node.type !== "ModuleExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTopicReference(node, opts) { + if (!node) return false; + if (node.type !== "TopicReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPipelineTopicExpression(node, opts) { + if (!node) return false; + if (node.type !== "PipelineTopicExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPipelineBareFunction(node, opts) { + if (!node) return false; + if (node.type !== "PipelineBareFunction") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPipelinePrimaryTopicReference(node, opts) { + if (!node) return false; + if (node.type !== "PipelinePrimaryTopicReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSParameterProperty(node, opts) { + if (!node) return false; + if (node.type !== "TSParameterProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSDeclareFunction(node, opts) { + if (!node) return false; + if (node.type !== "TSDeclareFunction") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSDeclareMethod(node, opts) { + if (!node) return false; + if (node.type !== "TSDeclareMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSQualifiedName(node, opts) { + if (!node) return false; + if (node.type !== "TSQualifiedName") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSCallSignatureDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSCallSignatureDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSConstructSignatureDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSConstructSignatureDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSPropertySignature(node, opts) { + if (!node) return false; + if (node.type !== "TSPropertySignature") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSMethodSignature(node, opts) { + if (!node) return false; + if (node.type !== "TSMethodSignature") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIndexSignature(node, opts) { + if (!node) return false; + if (node.type !== "TSIndexSignature") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSAnyKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSAnyKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSBooleanKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSBooleanKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSBigIntKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSBigIntKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIntrinsicKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSIntrinsicKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNeverKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSNeverKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNullKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSNullKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNumberKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSNumberKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSObjectKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSObjectKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSStringKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSStringKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSSymbolKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSSymbolKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSUndefinedKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSUndefinedKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSUnknownKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSUnknownKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSVoidKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSVoidKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSThisType(node, opts) { + if (!node) return false; + if (node.type !== "TSThisType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSFunctionType(node, opts) { + if (!node) return false; + if (node.type !== "TSFunctionType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSConstructorType(node, opts) { + if (!node) return false; + if (node.type !== "TSConstructorType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeReference(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypePredicate(node, opts) { + if (!node) return false; + if (node.type !== "TSTypePredicate") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeQuery(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeQuery") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeLiteral(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSArrayType(node, opts) { + if (!node) return false; + if (node.type !== "TSArrayType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTupleType(node, opts) { + if (!node) return false; + if (node.type !== "TSTupleType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSOptionalType(node, opts) { + if (!node) return false; + if (node.type !== "TSOptionalType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSRestType(node, opts) { + if (!node) return false; + if (node.type !== "TSRestType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNamedTupleMember(node, opts) { + if (!node) return false; + if (node.type !== "TSNamedTupleMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSUnionType(node, opts) { + if (!node) return false; + if (node.type !== "TSUnionType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIntersectionType(node, opts) { + if (!node) return false; + if (node.type !== "TSIntersectionType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSConditionalType(node, opts) { + if (!node) return false; + if (node.type !== "TSConditionalType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInferType(node, opts) { + if (!node) return false; + if (node.type !== "TSInferType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSParenthesizedType(node, opts) { + if (!node) return false; + if (node.type !== "TSParenthesizedType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeOperator(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeOperator") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIndexedAccessType(node, opts) { + if (!node) return false; + if (node.type !== "TSIndexedAccessType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSMappedType(node, opts) { + if (!node) return false; + if (node.type !== "TSMappedType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSLiteralType(node, opts) { + if (!node) return false; + if (node.type !== "TSLiteralType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSExpressionWithTypeArguments(node, opts) { + if (!node) return false; + if (node.type !== "TSExpressionWithTypeArguments") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInterfaceDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSInterfaceDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInterfaceBody(node, opts) { + if (!node) return false; + if (node.type !== "TSInterfaceBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeAliasDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeAliasDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInstantiationExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSInstantiationExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSAsExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSAsExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSSatisfiesExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSSatisfiesExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeAssertion(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeAssertion") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSEnumDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSEnumDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSEnumMember(node, opts) { + if (!node) return false; + if (node.type !== "TSEnumMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSModuleDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSModuleDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSModuleBlock(node, opts) { + if (!node) return false; + if (node.type !== "TSModuleBlock") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSImportType(node, opts) { + if (!node) return false; + if (node.type !== "TSImportType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSImportEqualsDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSImportEqualsDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSExternalModuleReference(node, opts) { + if (!node) return false; + if (node.type !== "TSExternalModuleReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNonNullExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSNonNullExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSExportAssignment(node, opts) { + if (!node) return false; + if (node.type !== "TSExportAssignment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNamespaceExportDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSNamespaceExportDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeParameterInstantiation(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeParameterInstantiation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeParameterDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeParameterDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeParameter(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeParameter") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStandardized(node, opts) { + if (!node) return false; + switch (node.type) { + case "ArrayExpression": + case "AssignmentExpression": + case "BinaryExpression": + case "InterpreterDirective": + case "Directive": + case "DirectiveLiteral": + case "BlockStatement": + case "BreakStatement": + case "CallExpression": + case "CatchClause": + case "ConditionalExpression": + case "ContinueStatement": + case "DebuggerStatement": + case "DoWhileStatement": + case "EmptyStatement": + case "ExpressionStatement": + case "File": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "FunctionExpression": + case "Identifier": + case "IfStatement": + case "LabeledStatement": + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "LogicalExpression": + case "MemberExpression": + case "NewExpression": + case "Program": + case "ObjectExpression": + case "ObjectMethod": + case "ObjectProperty": + case "RestElement": + case "ReturnStatement": + case "SequenceExpression": + case "ParenthesizedExpression": + case "SwitchCase": + case "SwitchStatement": + case "ThisExpression": + case "ThrowStatement": + case "TryStatement": + case "UnaryExpression": + case "UpdateExpression": + case "VariableDeclaration": + case "VariableDeclarator": + case "WhileStatement": + case "WithStatement": + case "AssignmentPattern": + case "ArrayPattern": + case "ArrowFunctionExpression": + case "ClassBody": + case "ClassExpression": + case "ClassDeclaration": + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ExportSpecifier": + case "ForOfStatement": + case "ImportDeclaration": + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + case "ImportExpression": + case "MetaProperty": + case "ClassMethod": + case "ObjectPattern": + case "SpreadElement": + case "Super": + case "TaggedTemplateExpression": + case "TemplateElement": + case "TemplateLiteral": + case "YieldExpression": + case "AwaitExpression": + case "Import": + case "BigIntLiteral": + case "ExportNamespaceSpecifier": + case "OptionalMemberExpression": + case "OptionalCallExpression": + case "ClassProperty": + case "ClassAccessorProperty": + case "ClassPrivateProperty": + case "ClassPrivateMethod": + case "PrivateName": + case "StaticBlock": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Identifier": + case "StringLiteral": + case "BlockStatement": + case "ClassBody": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExpression(node, opts) { + if (!node) return false; + switch (node.type) { + case "ArrayExpression": + case "AssignmentExpression": + case "BinaryExpression": + case "CallExpression": + case "ConditionalExpression": + case "FunctionExpression": + case "Identifier": + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "LogicalExpression": + case "MemberExpression": + case "NewExpression": + case "ObjectExpression": + case "SequenceExpression": + case "ParenthesizedExpression": + case "ThisExpression": + case "UnaryExpression": + case "UpdateExpression": + case "ArrowFunctionExpression": + case "ClassExpression": + case "ImportExpression": + case "MetaProperty": + case "Super": + case "TaggedTemplateExpression": + case "TemplateLiteral": + case "YieldExpression": + case "AwaitExpression": + case "Import": + case "BigIntLiteral": + case "OptionalMemberExpression": + case "OptionalCallExpression": + case "TypeCastExpression": + case "JSXElement": + case "JSXFragment": + case "BindExpression": + case "DoExpression": + case "RecordExpression": + case "TupleExpression": + case "DecimalLiteral": + case "ModuleExpression": + case "TopicReference": + case "PipelineTopicExpression": + case "PipelineBareFunction": + case "PipelinePrimaryTopicReference": + case "TSInstantiationExpression": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSNonNullExpression": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Expression": + case "Identifier": + case "StringLiteral": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBinary(node, opts) { + if (!node) return false; + switch (node.type) { + case "BinaryExpression": + case "LogicalExpression": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isScopable(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "CatchClause": + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "FunctionExpression": + case "Program": + case "ObjectMethod": + case "SwitchStatement": + case "WhileStatement": + case "ArrowFunctionExpression": + case "ClassExpression": + case "ClassDeclaration": + case "ForOfStatement": + case "ClassMethod": + case "ClassPrivateMethod": + case "StaticBlock": + case "TSModuleBlock": + break; + case "Placeholder": + if (node.expectedNode === "BlockStatement") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBlockParent(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "CatchClause": + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "FunctionExpression": + case "Program": + case "ObjectMethod": + case "SwitchStatement": + case "WhileStatement": + case "ArrowFunctionExpression": + case "ForOfStatement": + case "ClassMethod": + case "ClassPrivateMethod": + case "StaticBlock": + case "TSModuleBlock": + break; + case "Placeholder": + if (node.expectedNode === "BlockStatement") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBlock(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "Program": + case "TSModuleBlock": + break; + case "Placeholder": + if (node.expectedNode === "BlockStatement") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStatement(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "BreakStatement": + case "ContinueStatement": + case "DebuggerStatement": + case "DoWhileStatement": + case "EmptyStatement": + case "ExpressionStatement": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "IfStatement": + case "LabeledStatement": + case "ReturnStatement": + case "SwitchStatement": + case "ThrowStatement": + case "TryStatement": + case "VariableDeclaration": + case "WhileStatement": + case "WithStatement": + case "ClassDeclaration": + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ForOfStatement": + case "ImportDeclaration": + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "InterfaceDeclaration": + case "OpaqueType": + case "TypeAlias": + case "EnumDeclaration": + case "TSDeclareFunction": + case "TSInterfaceDeclaration": + case "TSTypeAliasDeclaration": + case "TSEnumDeclaration": + case "TSModuleDeclaration": + case "TSImportEqualsDeclaration": + case "TSExportAssignment": + case "TSNamespaceExportDeclaration": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Statement": + case "Declaration": + case "BlockStatement": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTerminatorless(node, opts) { + if (!node) return false; + switch (node.type) { + case "BreakStatement": + case "ContinueStatement": + case "ReturnStatement": + case "ThrowStatement": + case "YieldExpression": + case "AwaitExpression": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isCompletionStatement(node, opts) { + if (!node) return false; + switch (node.type) { + case "BreakStatement": + case "ContinueStatement": + case "ReturnStatement": + case "ThrowStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isConditional(node, opts) { + if (!node) return false; + switch (node.type) { + case "ConditionalExpression": + case "IfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLoop(node, opts) { + if (!node) return false; + switch (node.type) { + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "WhileStatement": + case "ForOfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isWhile(node, opts) { + if (!node) return false; + switch (node.type) { + case "DoWhileStatement": + case "WhileStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExpressionWrapper(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExpressionStatement": + case "ParenthesizedExpression": + case "TypeCastExpression": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFor(node, opts) { + if (!node) return false; + switch (node.type) { + case "ForInStatement": + case "ForStatement": + case "ForOfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForXStatement(node, opts) { + if (!node) return false; + switch (node.type) { + case "ForInStatement": + case "ForOfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunction(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "FunctionExpression": + case "ObjectMethod": + case "ArrowFunctionExpression": + case "ClassMethod": + case "ClassPrivateMethod": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionParent(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "FunctionExpression": + case "ObjectMethod": + case "ArrowFunctionExpression": + case "ClassMethod": + case "ClassPrivateMethod": + case "StaticBlock": + case "TSModuleBlock": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPureish(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "FunctionExpression": + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "ArrowFunctionExpression": + case "BigIntLiteral": + case "DecimalLiteral": + break; + case "Placeholder": + if (node.expectedNode === "StringLiteral") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "VariableDeclaration": + case "ClassDeclaration": + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ImportDeclaration": + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "InterfaceDeclaration": + case "OpaqueType": + case "TypeAlias": + case "EnumDeclaration": + case "TSDeclareFunction": + case "TSInterfaceDeclaration": + case "TSTypeAliasDeclaration": + case "TSEnumDeclaration": + case "TSModuleDeclaration": + break; + case "Placeholder": + if (node.expectedNode === "Declaration") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPatternLike(node, opts) { + if (!node) return false; + switch (node.type) { + case "Identifier": + case "RestElement": + case "AssignmentPattern": + case "ArrayPattern": + case "ObjectPattern": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSNonNullExpression": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Pattern": + case "Identifier": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLVal(node, opts) { + if (!node) return false; + switch (node.type) { + case "Identifier": + case "MemberExpression": + case "RestElement": + case "AssignmentPattern": + case "ArrayPattern": + case "ObjectPattern": + case "TSParameterProperty": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSNonNullExpression": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Pattern": + case "Identifier": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSEntityName(node, opts) { + if (!node) return false; + switch (node.type) { + case "Identifier": + case "TSQualifiedName": + break; + case "Placeholder": + if (node.expectedNode === "Identifier") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLiteral(node, opts) { + if (!node) return false; + switch (node.type) { + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "TemplateLiteral": + case "BigIntLiteral": + case "DecimalLiteral": + break; + case "Placeholder": + if (node.expectedNode === "StringLiteral") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImmutable(node, opts) { + if (!node) return false; + switch (node.type) { + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "BigIntLiteral": + case "JSXAttribute": + case "JSXClosingElement": + case "JSXElement": + case "JSXExpressionContainer": + case "JSXSpreadChild": + case "JSXOpeningElement": + case "JSXText": + case "JSXFragment": + case "JSXOpeningFragment": + case "JSXClosingFragment": + case "DecimalLiteral": + break; + case "Placeholder": + if (node.expectedNode === "StringLiteral") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUserWhitespacable(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectMethod": + case "ObjectProperty": + case "ObjectTypeInternalSlot": + case "ObjectTypeCallProperty": + case "ObjectTypeIndexer": + case "ObjectTypeProperty": + case "ObjectTypeSpreadProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMethod(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectMethod": + case "ClassMethod": + case "ClassPrivateMethod": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectMember(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectMethod": + case "ObjectProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isProperty(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectProperty": + case "ClassProperty": + case "ClassAccessorProperty": + case "ClassPrivateProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUnaryLike(node, opts) { + if (!node) return false; + switch (node.type) { + case "UnaryExpression": + case "SpreadElement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPattern(node, opts) { + if (!node) return false; + switch (node.type) { + case "AssignmentPattern": + case "ArrayPattern": + case "ObjectPattern": + break; + case "Placeholder": + if (node.expectedNode === "Pattern") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClass(node, opts) { + if (!node) return false; + switch (node.type) { + case "ClassExpression": + case "ClassDeclaration": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportOrExportDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ImportDeclaration": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isModuleSpecifier(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExportSpecifier": + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + case "ExportNamespaceSpecifier": + case "ExportDefaultSpecifier": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAccessor(node, opts) { + if (!node) return false; + switch (node.type) { + case "ClassAccessorProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPrivate(node, opts) { + if (!node) return false; + switch (node.type) { + case "ClassPrivateProperty": + case "ClassPrivateMethod": + case "PrivateName": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlow(node, opts) { + if (!node) return false; + switch (node.type) { + case "AnyTypeAnnotation": + case "ArrayTypeAnnotation": + case "BooleanTypeAnnotation": + case "BooleanLiteralTypeAnnotation": + case "NullLiteralTypeAnnotation": + case "ClassImplements": + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "DeclaredPredicate": + case "ExistsTypeAnnotation": + case "FunctionTypeAnnotation": + case "FunctionTypeParam": + case "GenericTypeAnnotation": + case "InferredPredicate": + case "InterfaceExtends": + case "InterfaceDeclaration": + case "InterfaceTypeAnnotation": + case "IntersectionTypeAnnotation": + case "MixedTypeAnnotation": + case "EmptyTypeAnnotation": + case "NullableTypeAnnotation": + case "NumberLiteralTypeAnnotation": + case "NumberTypeAnnotation": + case "ObjectTypeAnnotation": + case "ObjectTypeInternalSlot": + case "ObjectTypeCallProperty": + case "ObjectTypeIndexer": + case "ObjectTypeProperty": + case "ObjectTypeSpreadProperty": + case "OpaqueType": + case "QualifiedTypeIdentifier": + case "StringLiteralTypeAnnotation": + case "StringTypeAnnotation": + case "SymbolTypeAnnotation": + case "ThisTypeAnnotation": + case "TupleTypeAnnotation": + case "TypeofTypeAnnotation": + case "TypeAlias": + case "TypeAnnotation": + case "TypeCastExpression": + case "TypeParameter": + case "TypeParameterDeclaration": + case "TypeParameterInstantiation": + case "UnionTypeAnnotation": + case "Variance": + case "VoidTypeAnnotation": + case "EnumDeclaration": + case "EnumBooleanBody": + case "EnumNumberBody": + case "EnumStringBody": + case "EnumSymbolBody": + case "EnumBooleanMember": + case "EnumNumberMember": + case "EnumStringMember": + case "EnumDefaultedMember": + case "IndexedAccessType": + case "OptionalIndexedAccessType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowType(node, opts) { + if (!node) return false; + switch (node.type) { + case "AnyTypeAnnotation": + case "ArrayTypeAnnotation": + case "BooleanTypeAnnotation": + case "BooleanLiteralTypeAnnotation": + case "NullLiteralTypeAnnotation": + case "ExistsTypeAnnotation": + case "FunctionTypeAnnotation": + case "GenericTypeAnnotation": + case "InterfaceTypeAnnotation": + case "IntersectionTypeAnnotation": + case "MixedTypeAnnotation": + case "EmptyTypeAnnotation": + case "NullableTypeAnnotation": + case "NumberLiteralTypeAnnotation": + case "NumberTypeAnnotation": + case "ObjectTypeAnnotation": + case "StringLiteralTypeAnnotation": + case "StringTypeAnnotation": + case "SymbolTypeAnnotation": + case "ThisTypeAnnotation": + case "TupleTypeAnnotation": + case "TypeofTypeAnnotation": + case "UnionTypeAnnotation": + case "VoidTypeAnnotation": + case "IndexedAccessType": + case "OptionalIndexedAccessType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowBaseAnnotation(node, opts) { + if (!node) return false; + switch (node.type) { + case "AnyTypeAnnotation": + case "BooleanTypeAnnotation": + case "NullLiteralTypeAnnotation": + case "MixedTypeAnnotation": + case "EmptyTypeAnnotation": + case "NumberTypeAnnotation": + case "StringTypeAnnotation": + case "SymbolTypeAnnotation": + case "ThisTypeAnnotation": + case "VoidTypeAnnotation": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "InterfaceDeclaration": + case "OpaqueType": + case "TypeAlias": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowPredicate(node, opts) { + if (!node) return false; + switch (node.type) { + case "DeclaredPredicate": + case "InferredPredicate": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumBody(node, opts) { + if (!node) return false; + switch (node.type) { + case "EnumBooleanBody": + case "EnumNumberBody": + case "EnumStringBody": + case "EnumSymbolBody": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumMember(node, opts) { + if (!node) return false; + switch (node.type) { + case "EnumBooleanMember": + case "EnumNumberMember": + case "EnumStringMember": + case "EnumDefaultedMember": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSX(node, opts) { + if (!node) return false; + switch (node.type) { + case "JSXAttribute": + case "JSXClosingElement": + case "JSXElement": + case "JSXEmptyExpression": + case "JSXExpressionContainer": + case "JSXSpreadChild": + case "JSXIdentifier": + case "JSXMemberExpression": + case "JSXNamespacedName": + case "JSXOpeningElement": + case "JSXSpreadAttribute": + case "JSXText": + case "JSXFragment": + case "JSXOpeningFragment": + case "JSXClosingFragment": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMiscellaneous(node, opts) { + if (!node) return false; + switch (node.type) { + case "Noop": + case "Placeholder": + case "V8IntrinsicIdentifier": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeScript(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSParameterProperty": + case "TSDeclareFunction": + case "TSDeclareMethod": + case "TSQualifiedName": + case "TSCallSignatureDeclaration": + case "TSConstructSignatureDeclaration": + case "TSPropertySignature": + case "TSMethodSignature": + case "TSIndexSignature": + case "TSAnyKeyword": + case "TSBooleanKeyword": + case "TSBigIntKeyword": + case "TSIntrinsicKeyword": + case "TSNeverKeyword": + case "TSNullKeyword": + case "TSNumberKeyword": + case "TSObjectKeyword": + case "TSStringKeyword": + case "TSSymbolKeyword": + case "TSUndefinedKeyword": + case "TSUnknownKeyword": + case "TSVoidKeyword": + case "TSThisType": + case "TSFunctionType": + case "TSConstructorType": + case "TSTypeReference": + case "TSTypePredicate": + case "TSTypeQuery": + case "TSTypeLiteral": + case "TSArrayType": + case "TSTupleType": + case "TSOptionalType": + case "TSRestType": + case "TSNamedTupleMember": + case "TSUnionType": + case "TSIntersectionType": + case "TSConditionalType": + case "TSInferType": + case "TSParenthesizedType": + case "TSTypeOperator": + case "TSIndexedAccessType": + case "TSMappedType": + case "TSLiteralType": + case "TSExpressionWithTypeArguments": + case "TSInterfaceDeclaration": + case "TSInterfaceBody": + case "TSTypeAliasDeclaration": + case "TSInstantiationExpression": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSEnumDeclaration": + case "TSEnumMember": + case "TSModuleDeclaration": + case "TSModuleBlock": + case "TSImportType": + case "TSImportEqualsDeclaration": + case "TSExternalModuleReference": + case "TSNonNullExpression": + case "TSExportAssignment": + case "TSNamespaceExportDeclaration": + case "TSTypeAnnotation": + case "TSTypeParameterInstantiation": + case "TSTypeParameterDeclaration": + case "TSTypeParameter": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeElement(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSCallSignatureDeclaration": + case "TSConstructSignatureDeclaration": + case "TSPropertySignature": + case "TSMethodSignature": + case "TSIndexSignature": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSType(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSAnyKeyword": + case "TSBooleanKeyword": + case "TSBigIntKeyword": + case "TSIntrinsicKeyword": + case "TSNeverKeyword": + case "TSNullKeyword": + case "TSNumberKeyword": + case "TSObjectKeyword": + case "TSStringKeyword": + case "TSSymbolKeyword": + case "TSUndefinedKeyword": + case "TSUnknownKeyword": + case "TSVoidKeyword": + case "TSThisType": + case "TSFunctionType": + case "TSConstructorType": + case "TSTypeReference": + case "TSTypePredicate": + case "TSTypeQuery": + case "TSTypeLiteral": + case "TSArrayType": + case "TSTupleType": + case "TSOptionalType": + case "TSRestType": + case "TSUnionType": + case "TSIntersectionType": + case "TSConditionalType": + case "TSInferType": + case "TSParenthesizedType": + case "TSTypeOperator": + case "TSIndexedAccessType": + case "TSMappedType": + case "TSLiteralType": + case "TSExpressionWithTypeArguments": + case "TSImportType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSBaseType(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSAnyKeyword": + case "TSBooleanKeyword": + case "TSBigIntKeyword": + case "TSIntrinsicKeyword": + case "TSNeverKeyword": + case "TSNullKeyword": + case "TSNumberKeyword": + case "TSObjectKeyword": + case "TSStringKeyword": + case "TSSymbolKeyword": + case "TSUndefinedKeyword": + case "TSUnknownKeyword": + case "TSVoidKeyword": + case "TSThisType": + case "TSLiteralType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumberLiteral(node, opts) { + (0, _deprecationWarning.default)("isNumberLiteral", "isNumericLiteral"); + if (!node) return false; + if (node.type !== "NumberLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRegexLiteral(node, opts) { + (0, _deprecationWarning.default)("isRegexLiteral", "isRegExpLiteral"); + if (!node) return false; + if (node.type !== "RegexLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRestProperty(node, opts) { + (0, _deprecationWarning.default)("isRestProperty", "isRestElement"); + if (!node) return false; + if (node.type !== "RestProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSpreadProperty(node, opts) { + (0, _deprecationWarning.default)("isSpreadProperty", "isSpreadElement"); + if (!node) return false; + if (node.type !== "SpreadProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isModuleDeclaration(node, opts) { + (0, _deprecationWarning.default)("isModuleDeclaration", "isImportOrExportDeclaration"); + return isImportOrExportDeclaration(node, opts); + } + + + return generated$3; +} + +var hasRequiredMatchesPattern; + +function requireMatchesPattern () { + if (hasRequiredMatchesPattern) return matchesPattern; + hasRequiredMatchesPattern = 1; + + Object.defineProperty(matchesPattern, "__esModule", { + value: true + }); + matchesPattern.default = matchesPattern$1; + var _index = requireGenerated$3(); + function matchesPattern$1(member, match, allowPartial) { + if (!(0, _index.isMemberExpression)(member)) return false; + const parts = Array.isArray(match) ? match : match.split("."); + const nodes = []; + let node; + for (node = member; (0, _index.isMemberExpression)(node); node = node.object) { + nodes.push(node.property); + } + nodes.push(node); + if (nodes.length < parts.length) return false; + if (!allowPartial && nodes.length > parts.length) return false; + for (let i = 0, j = nodes.length - 1; i < parts.length; i++, j--) { + const node = nodes[j]; + let value; + if ((0, _index.isIdentifier)(node)) { + value = node.name; + } else if ((0, _index.isStringLiteral)(node)) { + value = node.value; + } else if ((0, _index.isThisExpression)(node)) { + value = "this"; + } else { + return false; + } + if (parts[i] !== value) return false; + } + return true; + } + + + return matchesPattern; +} + +var hasRequiredBuildMatchMemberExpression; + +function requireBuildMatchMemberExpression () { + if (hasRequiredBuildMatchMemberExpression) return buildMatchMemberExpression; + hasRequiredBuildMatchMemberExpression = 1; + + Object.defineProperty(buildMatchMemberExpression, "__esModule", { + value: true + }); + buildMatchMemberExpression.default = buildMatchMemberExpression$1; + var _matchesPattern = requireMatchesPattern(); + function buildMatchMemberExpression$1(match, allowPartial) { + const parts = match.split("."); + return member => (0, _matchesPattern.default)(member, parts, allowPartial); + } + + + return buildMatchMemberExpression; +} + +var hasRequiredIsReactComponent; + +function requireIsReactComponent () { + if (hasRequiredIsReactComponent) return isReactComponent; + hasRequiredIsReactComponent = 1; + + Object.defineProperty(isReactComponent, "__esModule", { + value: true + }); + isReactComponent.default = void 0; + var _buildMatchMemberExpression = requireBuildMatchMemberExpression(); + const isReactComponent$1 = (0, _buildMatchMemberExpression.default)("React.Component"); + isReactComponent.default = isReactComponent$1; + + + return isReactComponent; +} + +var isCompatTag = {}; + +var hasRequiredIsCompatTag; + +function requireIsCompatTag () { + if (hasRequiredIsCompatTag) return isCompatTag; + hasRequiredIsCompatTag = 1; + + Object.defineProperty(isCompatTag, "__esModule", { + value: true + }); + isCompatTag.default = isCompatTag$1; + function isCompatTag$1(tagName) { + return !!tagName && /^[a-z]/.test(tagName); + } + + + return isCompatTag; +} + +var buildChildren = {}; + +var cleanJSXElementLiteralChild = {}; + +var generated$2 = {}; + +var validate$1 = {}; + +var definitions = {}; + +var core = {}; + +var is = {}; + +var isType = {}; + +var hasRequiredIsType; + +function requireIsType () { + if (hasRequiredIsType) return isType; + hasRequiredIsType = 1; + + Object.defineProperty(isType, "__esModule", { + value: true + }); + isType.default = isType$1; + var _index = requireDefinitions(); + function isType$1(nodeType, targetType) { + if (nodeType === targetType) return true; + if (nodeType == null) return false; + if (_index.ALIAS_KEYS[targetType]) return false; + const aliases = _index.FLIPPED_ALIAS_KEYS[targetType]; + if (aliases) { + if (aliases[0] === nodeType) return true; + for (const alias of aliases) { + if (nodeType === alias) return true; + } + } + return false; + } + + + return isType; +} + +var isPlaceholderType = {}; + +var hasRequiredIsPlaceholderType; + +function requireIsPlaceholderType () { + if (hasRequiredIsPlaceholderType) return isPlaceholderType; + hasRequiredIsPlaceholderType = 1; + + Object.defineProperty(isPlaceholderType, "__esModule", { + value: true + }); + isPlaceholderType.default = isPlaceholderType$1; + var _index = requireDefinitions(); + function isPlaceholderType$1(placeholderType, targetType) { + if (placeholderType === targetType) return true; + const aliases = _index.PLACEHOLDERS_ALIAS[placeholderType]; + if (aliases) { + for (const alias of aliases) { + if (targetType === alias) return true; + } + } + return false; + } + + + return isPlaceholderType; +} + +var hasRequiredIs; + +function requireIs () { + if (hasRequiredIs) return is; + hasRequiredIs = 1; + + Object.defineProperty(is, "__esModule", { + value: true + }); + is.default = is$1; + var _shallowEqual = requireShallowEqual(); + var _isType = requireIsType(); + var _isPlaceholderType = requireIsPlaceholderType(); + var _index = requireDefinitions(); + function is$1(type, node, opts) { + if (!node) return false; + const matches = (0, _isType.default)(node.type, type); + if (!matches) { + if (!opts && node.type === "Placeholder" && type in _index.FLIPPED_ALIAS_KEYS) { + return (0, _isPlaceholderType.default)(node.expectedNode, type); + } + return false; + } + if (opts === undefined) { + return true; + } else { + return (0, _shallowEqual.default)(node, opts); + } + } + + + return is; +} + +var isValidIdentifier = {}; + +var lib$2 = {}; + +var identifier = {}; + +var hasRequiredIdentifier; + +function requireIdentifier () { + if (hasRequiredIdentifier) return identifier; + hasRequiredIdentifier = 1; + + Object.defineProperty(identifier, "__esModule", { + value: true + }); + identifier.isIdentifierChar = isIdentifierChar; + identifier.isIdentifierName = isIdentifierName; + identifier.isIdentifierStart = isIdentifierStart; + let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; + const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; + const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + function isInAstralSet(code, set) { + let pos = 0x10000; + for (let i = 0, length = set.length; i < length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } + return false; + } + function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes); + } + function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); + } + function isIdentifierName(name) { + let isFirst = true; + for (let i = 0; i < name.length; i++) { + let cp = name.charCodeAt(i); + if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) { + const trail = name.charCodeAt(++i); + if ((trail & 0xfc00) === 0xdc00) { + cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff); + } + } + if (isFirst) { + isFirst = false; + if (!isIdentifierStart(cp)) { + return false; + } + } else if (!isIdentifierChar(cp)) { + return false; + } + } + return !isFirst; + } + + + return identifier; +} + +var keyword = {}; + +var hasRequiredKeyword; + +function requireKeyword () { + if (hasRequiredKeyword) return keyword; + hasRequiredKeyword = 1; + + Object.defineProperty(keyword, "__esModule", { + value: true + }); + keyword.isKeyword = isKeyword; + keyword.isReservedWord = isReservedWord; + keyword.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; + keyword.isStrictBindReservedWord = isStrictBindReservedWord; + keyword.isStrictReservedWord = isStrictReservedWord; + const reservedWords = { + keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], + strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], + strictBind: ["eval", "arguments"] + }; + const keywords = new Set(reservedWords.keyword); + const reservedWordsStrictSet = new Set(reservedWords.strict); + const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); + function isReservedWord(word, inModule) { + return inModule && word === "await" || word === "enum"; + } + function isStrictReservedWord(word, inModule) { + return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); + } + function isStrictBindOnlyReservedWord(word) { + return reservedWordsStrictBindSet.has(word); + } + function isStrictBindReservedWord(word, inModule) { + return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); + } + function isKeyword(word) { + return keywords.has(word); + } + + + return keyword; +} + +var hasRequiredLib$3; + +function requireLib$3 () { + if (hasRequiredLib$3) return lib$2; + hasRequiredLib$3 = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "isIdentifierChar", { + enumerable: true, + get: function () { + return _identifier.isIdentifierChar; + } + }); + Object.defineProperty(exports, "isIdentifierName", { + enumerable: true, + get: function () { + return _identifier.isIdentifierName; + } + }); + Object.defineProperty(exports, "isIdentifierStart", { + enumerable: true, + get: function () { + return _identifier.isIdentifierStart; + } + }); + Object.defineProperty(exports, "isKeyword", { + enumerable: true, + get: function () { + return _keyword.isKeyword; + } + }); + Object.defineProperty(exports, "isReservedWord", { + enumerable: true, + get: function () { + return _keyword.isReservedWord; + } + }); + Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindOnlyReservedWord; + } + }); + Object.defineProperty(exports, "isStrictBindReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindReservedWord; + } + }); + Object.defineProperty(exports, "isStrictReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictReservedWord; + } + }); + var _identifier = requireIdentifier(); + var _keyword = requireKeyword(); + + +} (lib$2)); + return lib$2; +} + +var hasRequiredIsValidIdentifier; + +function requireIsValidIdentifier () { + if (hasRequiredIsValidIdentifier) return isValidIdentifier; + hasRequiredIsValidIdentifier = 1; + + Object.defineProperty(isValidIdentifier, "__esModule", { + value: true + }); + isValidIdentifier.default = isValidIdentifier$1; + var _helperValidatorIdentifier = requireLib$3(); + function isValidIdentifier$1(name, reserved = true) { + if (typeof name !== "string") return false; + if (reserved) { + if ((0, _helperValidatorIdentifier.isKeyword)(name) || (0, _helperValidatorIdentifier.isStrictReservedWord)(name, true)) { + return false; + } + } + return (0, _helperValidatorIdentifier.isIdentifierName)(name); + } + + + return isValidIdentifier; +} + +var lib$1 = {}; + +var hasRequiredLib$2; + +function requireLib$2 () { + if (hasRequiredLib$2) return lib$1; + hasRequiredLib$2 = 1; + + Object.defineProperty(lib$1, "__esModule", { + value: true + }); + lib$1.readCodePoint = readCodePoint; + lib$1.readInt = readInt; + lib$1.readStringContents = readStringContents; + var _isDigit = function isDigit(code) { + return code >= 48 && code <= 57; + }; + const forbiddenNumericSeparatorSiblings = { + decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]), + hex: new Set([46, 88, 95, 120]) + }; + const isAllowedNumericSeparatorSibling = { + bin: ch => ch === 48 || ch === 49, + oct: ch => ch >= 48 && ch <= 55, + dec: ch => ch >= 48 && ch <= 57, + hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102 + }; + function readStringContents(type, input, pos, lineStart, curLine, errors) { + const initialPos = pos; + const initialLineStart = lineStart; + const initialCurLine = curLine; + let out = ""; + let firstInvalidLoc = null; + let chunkStart = pos; + const { + length + } = input; + for (;;) { + if (pos >= length) { + errors.unterminated(initialPos, initialLineStart, initialCurLine); + out += input.slice(chunkStart, pos); + break; + } + const ch = input.charCodeAt(pos); + if (isStringEnd(type, ch, input, pos)) { + out += input.slice(chunkStart, pos); + break; + } + if (ch === 92) { + out += input.slice(chunkStart, pos); + const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors); + if (res.ch === null && !firstInvalidLoc) { + firstInvalidLoc = { + pos, + lineStart, + curLine + }; + } else { + out += res.ch; + } + ({ + pos, + lineStart, + curLine + } = res); + chunkStart = pos; + } else if (ch === 8232 || ch === 8233) { + ++pos; + ++curLine; + lineStart = pos; + } else if (ch === 10 || ch === 13) { + if (type === "template") { + out += input.slice(chunkStart, pos) + "\n"; + ++pos; + if (ch === 13 && input.charCodeAt(pos) === 10) { + ++pos; + } + ++curLine; + chunkStart = lineStart = pos; + } else { + errors.unterminated(initialPos, initialLineStart, initialCurLine); + } + } else { + ++pos; + } + } + return { + pos, + str: out, + firstInvalidLoc, + lineStart, + curLine, + containsInvalid: !!firstInvalidLoc + }; + } + function isStringEnd(type, ch, input, pos) { + if (type === "template") { + return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123; + } + return ch === (type === "double" ? 34 : 39); + } + function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) { + const throwOnInvalid = !inTemplate; + pos++; + const res = ch => ({ + pos, + ch, + lineStart, + curLine + }); + const ch = input.charCodeAt(pos++); + switch (ch) { + case 110: + return res("\n"); + case 114: + return res("\r"); + case 120: + { + let code; + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors)); + return res(code === null ? null : String.fromCharCode(code)); + } + case 117: + { + let code; + ({ + code, + pos + } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors)); + return res(code === null ? null : String.fromCodePoint(code)); + } + case 116: + return res("\t"); + case 98: + return res("\b"); + case 118: + return res("\u000b"); + case 102: + return res("\f"); + case 13: + if (input.charCodeAt(pos) === 10) { + ++pos; + } + case 10: + lineStart = pos; + ++curLine; + case 8232: + case 8233: + return res(""); + case 56: + case 57: + if (inTemplate) { + return res(null); + } else { + errors.strictNumericEscape(pos - 1, lineStart, curLine); + } + default: + if (ch >= 48 && ch <= 55) { + const startPos = pos - 1; + const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2)); + let octalStr = match[0]; + let octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + pos += octalStr.length - 1; + const next = input.charCodeAt(pos); + if (octalStr !== "0" || next === 56 || next === 57) { + if (inTemplate) { + return res(null); + } else { + errors.strictNumericEscape(startPos, lineStart, curLine); + } + } + return res(String.fromCharCode(octal)); + } + return res(String.fromCharCode(ch)); + } + } + function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) { + const initialPos = pos; + let n; + ({ + n, + pos + } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid)); + if (n === null) { + if (throwOnInvalid) { + errors.invalidEscapeSequence(initialPos, lineStart, curLine); + } else { + pos = initialPos - 1; + } + } + return { + code: n, + pos + }; + } + function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) { + const start = pos; + const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct; + const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin; + let invalid = false; + let total = 0; + for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) { + const code = input.charCodeAt(pos); + let val; + if (code === 95 && allowNumSeparator !== "bail") { + const prev = input.charCodeAt(pos - 1); + const next = input.charCodeAt(pos + 1); + if (!allowNumSeparator) { + if (bailOnError) return { + n: null, + pos + }; + errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine); + } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) { + if (bailOnError) return { + n: null, + pos + }; + errors.unexpectedNumericSeparator(pos, lineStart, curLine); + } + ++pos; + continue; + } + if (code >= 97) { + val = code - 97 + 10; + } else if (code >= 65) { + val = code - 65 + 10; + } else if (_isDigit(code)) { + val = code - 48; + } else { + val = Infinity; + } + if (val >= radix) { + if (val <= 9 && bailOnError) { + return { + n: null, + pos + }; + } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) { + val = 0; + } else if (forceLen) { + val = 0; + invalid = true; + } else { + break; + } + } + ++pos; + total = total * radix + val; + } + if (pos === start || len != null && pos - start !== len || invalid) { + return { + n: null, + pos + }; + } + return { + n: total, + pos + }; + } + function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) { + const ch = input.charCodeAt(pos); + let code; + if (ch === 123) { + ++pos; + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors)); + ++pos; + if (code !== null && code > 0x10ffff) { + if (throwOnInvalid) { + errors.invalidCodePoint(pos, lineStart, curLine); + } else { + return { + code: null, + pos + }; + } + } + } else { + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors)); + } + return { + code, + pos + }; + } + + + return lib$1; +} + +var constants = {}; + +var hasRequiredConstants; + +function requireConstants () { + if (hasRequiredConstants) return constants; + hasRequiredConstants = 1; + + Object.defineProperty(constants, "__esModule", { + value: true + }); + constants.UPDATE_OPERATORS = constants.UNARY_OPERATORS = constants.STRING_UNARY_OPERATORS = constants.STATEMENT_OR_BLOCK_KEYS = constants.NUMBER_UNARY_OPERATORS = constants.NUMBER_BINARY_OPERATORS = constants.NOT_LOCAL_BINDING = constants.LOGICAL_OPERATORS = constants.INHERIT_KEYS = constants.FOR_INIT_KEYS = constants.FLATTENABLE_KEYS = constants.EQUALITY_BINARY_OPERATORS = constants.COMPARISON_BINARY_OPERATORS = constants.COMMENT_KEYS = constants.BOOLEAN_UNARY_OPERATORS = constants.BOOLEAN_NUMBER_BINARY_OPERATORS = constants.BOOLEAN_BINARY_OPERATORS = constants.BLOCK_SCOPED_SYMBOL = constants.BINARY_OPERATORS = constants.ASSIGNMENT_OPERATORS = void 0; + constants.STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"]; + constants.FLATTENABLE_KEYS = ["body", "expressions"]; + constants.FOR_INIT_KEYS = ["left", "init"]; + constants.COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"]; + const LOGICAL_OPERATORS = constants.LOGICAL_OPERATORS = ["||", "&&", "??"]; + constants.UPDATE_OPERATORS = ["++", "--"]; + const BOOLEAN_NUMBER_BINARY_OPERATORS = constants.BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="]; + const EQUALITY_BINARY_OPERATORS = constants.EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="]; + const COMPARISON_BINARY_OPERATORS = constants.COMPARISON_BINARY_OPERATORS = [...EQUALITY_BINARY_OPERATORS, "in", "instanceof"]; + const BOOLEAN_BINARY_OPERATORS = constants.BOOLEAN_BINARY_OPERATORS = [...COMPARISON_BINARY_OPERATORS, ...BOOLEAN_NUMBER_BINARY_OPERATORS]; + const NUMBER_BINARY_OPERATORS = constants.NUMBER_BINARY_OPERATORS = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"]; + constants.BINARY_OPERATORS = ["+", ...NUMBER_BINARY_OPERATORS, ...BOOLEAN_BINARY_OPERATORS, "|>"]; + constants.ASSIGNMENT_OPERATORS = ["=", "+=", ...NUMBER_BINARY_OPERATORS.map(op => op + "="), ...LOGICAL_OPERATORS.map(op => op + "=")]; + const BOOLEAN_UNARY_OPERATORS = constants.BOOLEAN_UNARY_OPERATORS = ["delete", "!"]; + const NUMBER_UNARY_OPERATORS = constants.NUMBER_UNARY_OPERATORS = ["+", "-", "~"]; + const STRING_UNARY_OPERATORS = constants.STRING_UNARY_OPERATORS = ["typeof"]; + constants.UNARY_OPERATORS = ["void", "throw", ...BOOLEAN_UNARY_OPERATORS, ...NUMBER_UNARY_OPERATORS, ...STRING_UNARY_OPERATORS]; + constants.INHERIT_KEYS = { + optional: ["typeAnnotation", "typeParameters", "returnType"], + force: ["start", "loc", "end"] + }; + constants.BLOCK_SCOPED_SYMBOL = Symbol.for("var used to be block scoped"); + constants.NOT_LOCAL_BINDING = Symbol.for("should not be considered a local binding"); + + + return constants; +} + +var utils = {}; + +var hasRequiredUtils; + +function requireUtils () { + if (hasRequiredUtils) return utils; + hasRequiredUtils = 1; + + Object.defineProperty(utils, "__esModule", { + value: true + }); + utils.VISITOR_KEYS = utils.NODE_PARENT_VALIDATIONS = utils.NODE_FIELDS = utils.FLIPPED_ALIAS_KEYS = utils.DEPRECATED_KEYS = utils.BUILDER_KEYS = utils.ALIAS_KEYS = void 0; + utils.arrayOf = arrayOf; + utils.arrayOfType = arrayOfType; + utils.assertEach = assertEach; + utils.assertNodeOrValueType = assertNodeOrValueType; + utils.assertNodeType = assertNodeType; + utils.assertOneOf = assertOneOf; + utils.assertOptionalChainStart = assertOptionalChainStart; + utils.assertShape = assertShape; + utils.assertValueType = assertValueType; + utils.chain = chain; + utils.default = defineType; + utils.defineAliasedType = defineAliasedType; + utils.validate = validate; + utils.validateArrayOfType = validateArrayOfType; + utils.validateOptional = validateOptional; + utils.validateOptionalType = validateOptionalType; + utils.validateType = validateType; + var _is = requireIs(); + var _validate = requireValidate(); + const VISITOR_KEYS = utils.VISITOR_KEYS = {}; + const ALIAS_KEYS = utils.ALIAS_KEYS = {}; + const FLIPPED_ALIAS_KEYS = utils.FLIPPED_ALIAS_KEYS = {}; + const NODE_FIELDS = utils.NODE_FIELDS = {}; + const BUILDER_KEYS = utils.BUILDER_KEYS = {}; + const DEPRECATED_KEYS = utils.DEPRECATED_KEYS = {}; + const NODE_PARENT_VALIDATIONS = utils.NODE_PARENT_VALIDATIONS = {}; + function getType(val) { + if (Array.isArray(val)) { + return "array"; + } else if (val === null) { + return "null"; + } else { + return typeof val; + } + } + function validate(validate) { + return { + validate + }; + } + function validateType(...typeNames) { + return validate(assertNodeType(...typeNames)); + } + function validateOptional(validate) { + return { + validate, + optional: true + }; + } + function validateOptionalType(...typeNames) { + return { + validate: assertNodeType(...typeNames), + optional: true + }; + } + function arrayOf(elementType) { + return chain(assertValueType("array"), assertEach(elementType)); + } + function arrayOfType(...typeNames) { + return arrayOf(assertNodeType(...typeNames)); + } + function validateArrayOfType(...typeNames) { + return validate(arrayOfType(...typeNames)); + } + function assertEach(callback) { + const childValidator = process.env.BABEL_TYPES_8_BREAKING ? _validate.validateChild : () => {}; + function validator(node, key, val) { + if (!Array.isArray(val)) return; + for (let i = 0; i < val.length; i++) { + const subkey = `${key}[${i}]`; + const v = val[i]; + callback(node, subkey, v); + childValidator(node, subkey, v); + } + } + validator.each = callback; + return validator; + } + function assertOneOf(...values) { + function validate(node, key, val) { + if (!values.includes(val)) { + throw new TypeError(`Property ${key} expected value to be one of ${JSON.stringify(values)} but got ${JSON.stringify(val)}`); + } + } + validate.oneOf = values; + return validate; + } + function assertNodeType(...types) { + function validate(node, key, val) { + for (const type of types) { + if ((0, _is.default)(type, val)) { + (0, _validate.validateChild)(node, key, val); + return; + } + } + throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val == null ? void 0 : val.type)}`); + } + validate.oneOfNodeTypes = types; + return validate; + } + function assertNodeOrValueType(...types) { + function validate(node, key, val) { + for (const type of types) { + if (getType(val) === type || (0, _is.default)(type, val)) { + (0, _validate.validateChild)(node, key, val); + return; + } + } + throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val == null ? void 0 : val.type)}`); + } + validate.oneOfNodeOrValueTypes = types; + return validate; + } + function assertValueType(type) { + function validate(node, key, val) { + const valid = getType(val) === type; + if (!valid) { + throw new TypeError(`Property ${key} expected type of ${type} but got ${getType(val)}`); + } + } + validate.type = type; + return validate; + } + function assertShape(shape) { + function validate(node, key, val) { + const errors = []; + for (const property of Object.keys(shape)) { + try { + (0, _validate.validateField)(node, property, val[property], shape[property]); + } catch (error) { + if (error instanceof TypeError) { + errors.push(error.message); + continue; + } + throw error; + } + } + if (errors.length) { + throw new TypeError(`Property ${key} of ${node.type} expected to have the following:\n${errors.join("\n")}`); + } + } + validate.shapeOf = shape; + return validate; + } + function assertOptionalChainStart() { + function validate(node) { + var _current; + let current = node; + while (node) { + const { + type + } = current; + if (type === "OptionalCallExpression") { + if (current.optional) return; + current = current.callee; + continue; + } + if (type === "OptionalMemberExpression") { + if (current.optional) return; + current = current.object; + continue; + } + break; + } + throw new TypeError(`Non-optional ${node.type} must chain from an optional OptionalMemberExpression or OptionalCallExpression. Found chain from ${(_current = current) == null ? void 0 : _current.type}`); + } + return validate; + } + function chain(...fns) { + function validate(...args) { + for (const fn of fns) { + fn(...args); + } + } + validate.chainOf = fns; + if (fns.length >= 2 && "type" in fns[0] && fns[0].type === "array" && !("each" in fns[1])) { + throw new Error(`An assertValueType("array") validator can only be followed by an assertEach(...) validator.`); + } + return validate; + } + const validTypeOpts = new Set(["aliases", "builder", "deprecatedAlias", "fields", "inherits", "visitor", "validate"]); + const validFieldKeys = new Set(["default", "optional", "deprecated", "validate"]); + const store = {}; + function defineAliasedType(...aliases) { + return (type, opts = {}) => { + let defined = opts.aliases; + if (!defined) { + var _store$opts$inherits$, _defined; + if (opts.inherits) defined = (_store$opts$inherits$ = store[opts.inherits].aliases) == null ? void 0 : _store$opts$inherits$.slice(); + (_defined = defined) != null ? _defined : defined = []; + opts.aliases = defined; + } + const additional = aliases.filter(a => !defined.includes(a)); + defined.unshift(...additional); + defineType(type, opts); + }; + } + function defineType(type, opts = {}) { + const inherits = opts.inherits && store[opts.inherits] || {}; + let fields = opts.fields; + if (!fields) { + fields = {}; + if (inherits.fields) { + const keys = Object.getOwnPropertyNames(inherits.fields); + for (const key of keys) { + const field = inherits.fields[key]; + const def = field.default; + if (Array.isArray(def) ? def.length > 0 : def && typeof def === "object") { + throw new Error("field defaults can only be primitives or empty arrays currently"); + } + fields[key] = { + default: Array.isArray(def) ? [] : def, + optional: field.optional, + deprecated: field.deprecated, + validate: field.validate + }; + } + } + } + const visitor = opts.visitor || inherits.visitor || []; + const aliases = opts.aliases || inherits.aliases || []; + const builder = opts.builder || inherits.builder || opts.visitor || []; + for (const k of Object.keys(opts)) { + if (!validTypeOpts.has(k)) { + throw new Error(`Unknown type option "${k}" on ${type}`); + } + } + if (opts.deprecatedAlias) { + DEPRECATED_KEYS[opts.deprecatedAlias] = type; + } + for (const key of visitor.concat(builder)) { + fields[key] = fields[key] || {}; + } + for (const key of Object.keys(fields)) { + const field = fields[key]; + if (field.default !== undefined && !builder.includes(key)) { + field.optional = true; + } + if (field.default === undefined) { + field.default = null; + } else if (!field.validate && field.default != null) { + field.validate = assertValueType(getType(field.default)); + } + for (const k of Object.keys(field)) { + if (!validFieldKeys.has(k)) { + throw new Error(`Unknown field key "${k}" on ${type}.${key}`); + } + } + } + VISITOR_KEYS[type] = opts.visitor = visitor; + BUILDER_KEYS[type] = opts.builder = builder; + NODE_FIELDS[type] = opts.fields = fields; + ALIAS_KEYS[type] = opts.aliases = aliases; + aliases.forEach(alias => { + FLIPPED_ALIAS_KEYS[alias] = FLIPPED_ALIAS_KEYS[alias] || []; + FLIPPED_ALIAS_KEYS[alias].push(type); + }); + if (opts.validate) { + NODE_PARENT_VALIDATIONS[type] = opts.validate; + } + store[type] = opts; + } + + + return utils; +} + +var hasRequiredCore; + +function requireCore () { + if (hasRequiredCore) return core; + hasRequiredCore = 1; + + Object.defineProperty(core, "__esModule", { + value: true + }); + core.patternLikeCommon = core.importAttributes = core.functionTypeAnnotationCommon = core.functionDeclarationCommon = core.functionCommon = core.classMethodOrPropertyCommon = core.classMethodOrDeclareMethodCommon = void 0; + var _is = requireIs(); + var _isValidIdentifier = requireIsValidIdentifier(); + var _helperValidatorIdentifier = requireLib$3(); + var _helperStringParser = requireLib$2(); + var _index = requireConstants(); + var _utils = requireUtils(); + const defineType = (0, _utils.defineAliasedType)("Standardized"); + defineType("ArrayExpression", { + fields: { + elements: { + validate: (0, _utils.arrayOf)((0, _utils.assertNodeOrValueType)("null", "Expression", "SpreadElement")), + default: !process.env.BABEL_TYPES_8_BREAKING ? [] : undefined + } + }, + visitor: ["elements"], + aliases: ["Expression"] + }); + defineType("AssignmentExpression", { + fields: { + operator: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("string") : Object.assign(function () { + const identifier = (0, _utils.assertOneOf)(..._index.ASSIGNMENT_OPERATORS); + const pattern = (0, _utils.assertOneOf)("="); + return function (node, key, val) { + const validator = (0, _is.default)("Pattern", node.left) ? pattern : identifier; + validator(node, key, val); + }; + }(), { + type: "string" + }) + }, + left: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal", "OptionalMemberExpression") : (0, _utils.assertNodeType)("Identifier", "MemberExpression", "OptionalMemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Expression"] + }); + defineType("BinaryExpression", { + builder: ["operator", "left", "right"], + fields: { + operator: { + validate: (0, _utils.assertOneOf)(..._index.BINARY_OPERATORS) + }, + left: { + validate: function () { + const expression = (0, _utils.assertNodeType)("Expression"); + const inOp = (0, _utils.assertNodeType)("Expression", "PrivateName"); + const validator = Object.assign(function (node, key, val) { + const validator = node.operator === "in" ? inOp : expression; + validator(node, key, val); + }, { + oneOfNodeTypes: ["Expression", "PrivateName"] + }); + return validator; + }() + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + visitor: ["left", "right"], + aliases: ["Binary", "Expression"] + }); + defineType("InterpreterDirective", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("Directive", { + visitor: ["value"], + fields: { + value: { + validate: (0, _utils.assertNodeType)("DirectiveLiteral") + } + } + }); + defineType("DirectiveLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("BlockStatement", { + builder: ["body", "directives"], + visitor: ["directives", "body"], + fields: { + directives: { + validate: (0, _utils.arrayOfType)("Directive"), + default: [] + }, + body: (0, _utils.validateArrayOfType)("Statement") + }, + aliases: ["Scopable", "BlockParent", "Block", "Statement"] + }); + defineType("BreakStatement", { + visitor: ["label"], + fields: { + label: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] + }); + defineType("CallExpression", { + visitor: ["callee", "arguments", "typeParameters", "typeArguments"], + builder: ["callee", "arguments"], + aliases: ["Expression"], + fields: Object.assign({ + callee: { + validate: (0, _utils.assertNodeType)("Expression", "Super", "V8IntrinsicIdentifier") + }, + arguments: (0, _utils.validateArrayOfType)("Expression", "SpreadElement", "ArgumentPlaceholder") + }, !process.env.BABEL_TYPES_8_BREAKING ? { + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + } : {}, { + typeArguments: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TSTypeParameterInstantiation"), + optional: true + } + }) + }); + defineType("CatchClause", { + visitor: ["param", "body"], + fields: { + param: { + validate: (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }, + aliases: ["Scopable", "BlockParent"] + }); + defineType("ConditionalExpression", { + visitor: ["test", "consequent", "alternate"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + consequent: { + validate: (0, _utils.assertNodeType)("Expression") + }, + alternate: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Expression", "Conditional"] + }); + defineType("ContinueStatement", { + visitor: ["label"], + fields: { + label: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] + }); + defineType("DebuggerStatement", { + aliases: ["Statement"] + }); + defineType("DoWhileStatement", { + builder: ["test", "body"], + visitor: ["body", "test"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + }, + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"] + }); + defineType("EmptyStatement", { + aliases: ["Statement"] + }); + defineType("ExpressionStatement", { + visitor: ["expression"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Statement", "ExpressionWrapper"] + }); + defineType("File", { + builder: ["program", "comments", "tokens"], + visitor: ["program"], + fields: { + program: { + validate: (0, _utils.assertNodeType)("Program") + }, + comments: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? Object.assign(() => {}, { + each: { + oneOfNodeTypes: ["CommentBlock", "CommentLine"] + } + }) : (0, _utils.assertEach)((0, _utils.assertNodeType)("CommentBlock", "CommentLine")), + optional: true + }, + tokens: { + validate: (0, _utils.assertEach)(Object.assign(() => {}, { + type: "any" + })), + optional: true + } + } + }); + defineType("ForInStatement", { + visitor: ["left", "right", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"], + fields: { + left: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("VariableDeclaration", "LVal") : (0, _utils.assertNodeType)("VariableDeclaration", "Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("ForStatement", { + visitor: ["init", "test", "update", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop"], + fields: { + init: { + validate: (0, _utils.assertNodeType)("VariableDeclaration", "Expression"), + optional: true + }, + test: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + update: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + const functionCommon = () => ({ + params: (0, _utils.validateArrayOfType)("Identifier", "Pattern", "RestElement"), + generator: { + default: false + }, + async: { + default: false + } + }); + core.functionCommon = functionCommon; + const functionTypeAnnotationCommon = () => ({ + returnType: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"), + optional: true + } + }); + core.functionTypeAnnotationCommon = functionTypeAnnotationCommon; + const functionDeclarationCommon = () => Object.assign({}, functionCommon(), { + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + } + }); + core.functionDeclarationCommon = functionDeclarationCommon; + defineType("FunctionDeclaration", { + builder: ["id", "params", "body", "generator", "async"], + visitor: ["id", "typeParameters", "params", "returnType", "body"], + fields: Object.assign({}, functionDeclarationCommon(), functionTypeAnnotationCommon(), { + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + }, + predicate: { + validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"), + optional: true + } + }), + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Statement", "Pureish", "Declaration"], + validate: !process.env.BABEL_TYPES_8_BREAKING ? undefined : function () { + const identifier = (0, _utils.assertNodeType)("Identifier"); + return function (parent, key, node) { + if (!(0, _is.default)("ExportDefaultDeclaration", parent)) { + identifier(node, "id", node.id); + } + }; + }() + }); + defineType("FunctionExpression", { + inherits: "FunctionDeclaration", + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"], + fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), { + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + }, + predicate: { + validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"), + optional: true + } + }) + }); + const patternLikeCommon = () => ({ + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }); + core.patternLikeCommon = patternLikeCommon; + defineType("Identifier", { + builder: ["name"], + visitor: ["typeAnnotation", "decorators"], + aliases: ["Expression", "PatternLike", "LVal", "TSEntityName"], + fields: Object.assign({}, patternLikeCommon(), { + name: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("string"), Object.assign(function (node, key, val) { + if (!(0, _isValidIdentifier.default)(val, false)) { + throw new TypeError(`"${val}" is not a valid identifier name`); + } + }, { + type: "string" + })) : (0, _utils.assertValueType)("string") + } + }), + validate: process.env.BABEL_TYPES_8_BREAKING ? function (parent, key, node) { + const match = /\.(\w+)$/.exec(key); + if (!match) return; + const [, parentKey] = match; + const nonComp = { + computed: false + }; + if (parentKey === "property") { + if ((0, _is.default)("MemberExpression", parent, nonComp)) return; + if ((0, _is.default)("OptionalMemberExpression", parent, nonComp)) return; + } else if (parentKey === "key") { + if ((0, _is.default)("Property", parent, nonComp)) return; + if ((0, _is.default)("Method", parent, nonComp)) return; + } else if (parentKey === "exported") { + if ((0, _is.default)("ExportSpecifier", parent)) return; + } else if (parentKey === "imported") { + if ((0, _is.default)("ImportSpecifier", parent, { + imported: node + })) return; + } else if (parentKey === "meta") { + if ((0, _is.default)("MetaProperty", parent, { + meta: node + })) return; + } + if (((0, _helperValidatorIdentifier.isKeyword)(node.name) || (0, _helperValidatorIdentifier.isReservedWord)(node.name, false)) && node.name !== "this") { + throw new TypeError(`"${node.name}" is not a valid identifier`); + } + } : undefined + }); + defineType("IfStatement", { + visitor: ["test", "consequent", "alternate"], + aliases: ["Statement", "Conditional"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + consequent: { + validate: (0, _utils.assertNodeType)("Statement") + }, + alternate: { + optional: true, + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("LabeledStatement", { + visitor: ["label", "body"], + aliases: ["Statement"], + fields: { + label: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("StringLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("NumericLiteral", { + builder: ["value"], + deprecatedAlias: "NumberLiteral", + fields: { + value: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("number"), Object.assign(function (node, key, val) { + }, { + type: "number" + })) + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("NullLiteral", { + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("BooleanLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("boolean") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("RegExpLiteral", { + builder: ["pattern", "flags"], + deprecatedAlias: "RegexLiteral", + aliases: ["Expression", "Pureish", "Literal"], + fields: { + pattern: { + validate: (0, _utils.assertValueType)("string") + }, + flags: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("string"), Object.assign(function (node, key, val) { + const invalid = /[^gimsuy]/.exec(val); + if (invalid) { + throw new TypeError(`"${invalid[0]}" is not a valid RegExp flag`); + } + }, { + type: "string" + })) : (0, _utils.assertValueType)("string"), + default: "" + } + } + }); + defineType("LogicalExpression", { + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Binary", "Expression"], + fields: { + operator: { + validate: (0, _utils.assertOneOf)(..._index.LOGICAL_OPERATORS) + }, + left: { + validate: (0, _utils.assertNodeType)("Expression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("MemberExpression", { + builder: ["object", "property", "computed", ...(!process.env.BABEL_TYPES_8_BREAKING ? ["optional"] : [])], + visitor: ["object", "property"], + aliases: ["Expression", "LVal"], + fields: Object.assign({ + object: { + validate: (0, _utils.assertNodeType)("Expression", "Super") + }, + property: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier", "PrivateName"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + validator.oneOfNodeTypes = ["Expression", "Identifier", "PrivateName"]; + return validator; + }() + }, + computed: { + default: false + } + }, !process.env.BABEL_TYPES_8_BREAKING ? { + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + } : {}) + }); + defineType("NewExpression", { + inherits: "CallExpression" + }); + defineType("Program", { + visitor: ["directives", "body"], + builder: ["body", "directives", "sourceType", "interpreter"], + fields: { + sourceType: { + validate: (0, _utils.assertOneOf)("script", "module"), + default: "script" + }, + interpreter: { + validate: (0, _utils.assertNodeType)("InterpreterDirective"), + default: null, + optional: true + }, + directives: { + validate: (0, _utils.arrayOfType)("Directive"), + default: [] + }, + body: (0, _utils.validateArrayOfType)("Statement") + }, + aliases: ["Scopable", "BlockParent", "Block"] + }); + defineType("ObjectExpression", { + visitor: ["properties"], + aliases: ["Expression"], + fields: { + properties: (0, _utils.validateArrayOfType)("ObjectMethod", "ObjectProperty", "SpreadElement") + } + }); + defineType("ObjectMethod", { + builder: ["kind", "key", "params", "body", "computed", "generator", "async"], + visitor: ["decorators", "key", "typeParameters", "params", "returnType", "body"], + fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), { + kind: Object.assign({ + validate: (0, _utils.assertOneOf)("method", "get", "set") + }, !process.env.BABEL_TYPES_8_BREAKING ? { + default: "method" + } : {}), + computed: { + default: false + }, + key: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + validator.oneOfNodeTypes = ["Expression", "Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"]; + return validator; + }() + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }), + aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method", "ObjectMember"] + }); + defineType("ObjectProperty", { + builder: ["key", "value", "computed", "shorthand", ...(!process.env.BABEL_TYPES_8_BREAKING ? ["decorators"] : [])], + fields: { + computed: { + default: false + }, + key: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "DecimalLiteral", "PrivateName"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = Object.assign(function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }, { + oneOfNodeTypes: ["Expression", "Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "DecimalLiteral", "PrivateName"] + }); + return validator; + }() + }, + value: { + validate: (0, _utils.assertNodeType)("Expression", "PatternLike") + }, + shorthand: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("boolean"), Object.assign(function (node, key, shorthand) { + if (!shorthand) return; + if (node.computed) { + throw new TypeError("Property shorthand of ObjectProperty cannot be true if computed is true"); + } + if (!(0, _is.default)("Identifier", node.key)) { + throw new TypeError("Property shorthand of ObjectProperty cannot be true if key is not an Identifier"); + } + }, { + type: "boolean" + })) : (0, _utils.assertValueType)("boolean"), + default: false + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }, + visitor: ["key", "value", "decorators"], + aliases: ["UserWhitespacable", "Property", "ObjectMember"], + validate: !process.env.BABEL_TYPES_8_BREAKING ? undefined : function () { + const pattern = (0, _utils.assertNodeType)("Identifier", "Pattern", "TSAsExpression", "TSSatisfiesExpression", "TSNonNullExpression", "TSTypeAssertion"); + const expression = (0, _utils.assertNodeType)("Expression"); + return function (parent, key, node) { + const validator = (0, _is.default)("ObjectPattern", parent) ? pattern : expression; + validator(node, "value", node.value); + }; + }() + }); + defineType("RestElement", { + visitor: ["argument", "typeAnnotation"], + builder: ["argument"], + aliases: ["LVal", "PatternLike"], + deprecatedAlias: "RestProperty", + fields: Object.assign({}, patternLikeCommon(), { + argument: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal") : (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern", "MemberExpression", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + } + }), + validate: process.env.BABEL_TYPES_8_BREAKING ? function (parent, key) { + const match = /(\w+)\[(\d+)\]/.exec(key); + if (!match) throw new Error("Internal Babel error: malformed key."); + const [, listKey, index] = match; + if (parent[listKey].length > +index + 1) { + throw new TypeError(`RestElement must be last element of ${listKey}`); + } + } : undefined + }); + defineType("ReturnStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + } + } + }); + defineType("SequenceExpression", { + visitor: ["expressions"], + fields: { + expressions: (0, _utils.validateArrayOfType)("Expression") + }, + aliases: ["Expression"] + }); + defineType("ParenthesizedExpression", { + visitor: ["expression"], + aliases: ["Expression", "ExpressionWrapper"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("SwitchCase", { + visitor: ["test", "consequent"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + consequent: (0, _utils.validateArrayOfType)("Statement") + } + }); + defineType("SwitchStatement", { + visitor: ["discriminant", "cases"], + aliases: ["Statement", "BlockParent", "Scopable"], + fields: { + discriminant: { + validate: (0, _utils.assertNodeType)("Expression") + }, + cases: (0, _utils.validateArrayOfType)("SwitchCase") + } + }); + defineType("ThisExpression", { + aliases: ["Expression"] + }); + defineType("ThrowStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("TryStatement", { + visitor: ["block", "handler", "finalizer"], + aliases: ["Statement"], + fields: { + block: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertNodeType)("BlockStatement"), Object.assign(function (node) { + if (!node.handler && !node.finalizer) { + throw new TypeError("TryStatement expects either a handler or finalizer, or both"); + } + }, { + oneOfNodeTypes: ["BlockStatement"] + })) : (0, _utils.assertNodeType)("BlockStatement") + }, + handler: { + optional: true, + validate: (0, _utils.assertNodeType)("CatchClause") + }, + finalizer: { + optional: true, + validate: (0, _utils.assertNodeType)("BlockStatement") + } + } + }); + defineType("UnaryExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { + default: true + }, + argument: { + validate: (0, _utils.assertNodeType)("Expression") + }, + operator: { + validate: (0, _utils.assertOneOf)(..._index.UNARY_OPERATORS) + } + }, + visitor: ["argument"], + aliases: ["UnaryLike", "Expression"] + }); + defineType("UpdateExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { + default: false + }, + argument: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("Expression") : (0, _utils.assertNodeType)("Identifier", "MemberExpression") + }, + operator: { + validate: (0, _utils.assertOneOf)(..._index.UPDATE_OPERATORS) + } + }, + visitor: ["argument"], + aliases: ["Expression"] + }); + defineType("VariableDeclaration", { + builder: ["kind", "declarations"], + visitor: ["declarations"], + aliases: ["Statement", "Declaration"], + fields: { + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + kind: { + validate: (0, _utils.assertOneOf)("var", "let", "const", "using", "await using") + }, + declarations: (0, _utils.validateArrayOfType)("VariableDeclarator") + }, + validate: process.env.BABEL_TYPES_8_BREAKING ? (() => { + const withoutInit = (0, _utils.assertNodeType)("Identifier"); + return function (parent, key, node) { + if ((0, _is.default)("ForXStatement", parent, { + left: node + })) { + if (node.declarations.length !== 1) { + throw new TypeError(`Exactly one VariableDeclarator is required in the VariableDeclaration of a ${parent.type}`); + } + } else { + node.declarations.forEach(decl => { + if (!decl.init) withoutInit(decl, "id", decl.id); + }); + } + }; + })() : undefined + }); + defineType("VariableDeclarator", { + visitor: ["id", "init"], + fields: { + id: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal") : (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern") + }, + definite: { + optional: true, + validate: (0, _utils.assertValueType)("boolean") + }, + init: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("WhileStatement", { + visitor: ["test", "body"], + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("WithStatement", { + visitor: ["object", "body"], + aliases: ["Statement"], + fields: { + object: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("AssignmentPattern", { + visitor: ["left", "right", "decorators"], + builder: ["left", "right"], + aliases: ["Pattern", "PatternLike", "LVal"], + fields: Object.assign({}, patternLikeCommon(), { + left: { + validate: (0, _utils.assertNodeType)("Identifier", "ObjectPattern", "ArrayPattern", "MemberExpression", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }) + }); + defineType("ArrayPattern", { + visitor: ["elements", "typeAnnotation"], + builder: ["elements"], + aliases: ["Pattern", "PatternLike", "LVal"], + fields: Object.assign({}, patternLikeCommon(), { + elements: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeOrValueType)("null", "PatternLike", "LVal"))) + } + }) + }); + defineType("ArrowFunctionExpression", { + builder: ["params", "body", "async"], + visitor: ["typeParameters", "params", "returnType", "body"], + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"], + fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), { + expression: { + validate: (0, _utils.assertValueType)("boolean") + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement", "Expression") + }, + predicate: { + validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"), + optional: true + } + }) + }); + defineType("ClassBody", { + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("ClassMethod", "ClassPrivateMethod", "ClassProperty", "ClassPrivateProperty", "ClassAccessorProperty", "TSDeclareMethod", "TSIndexSignature", "StaticBlock") + } + }); + defineType("ClassExpression", { + builder: ["id", "superClass", "body", "decorators"], + visitor: ["decorators", "id", "typeParameters", "superClass", "superTypeParameters", "mixins", "implements", "body"], + aliases: ["Scopable", "Class", "Expression"], + fields: { + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("ClassBody") + }, + superClass: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + }, + superTypeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + }, + implements: { + validate: (0, _utils.arrayOfType)("TSExpressionWithTypeArguments", "ClassImplements"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + mixins: { + validate: (0, _utils.assertNodeType)("InterfaceExtends"), + optional: true + } + } + }); + defineType("ClassDeclaration", { + inherits: "ClassExpression", + aliases: ["Scopable", "Class", "Statement", "Declaration"], + fields: { + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("ClassBody") + }, + superClass: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + }, + superTypeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + }, + implements: { + validate: (0, _utils.arrayOfType)("TSExpressionWithTypeArguments", "ClassImplements"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + mixins: { + validate: (0, _utils.assertNodeType)("InterfaceExtends"), + optional: true + }, + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + abstract: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + }, + validate: !process.env.BABEL_TYPES_8_BREAKING ? undefined : function () { + const identifier = (0, _utils.assertNodeType)("Identifier"); + return function (parent, key, node) { + if (!(0, _is.default)("ExportDefaultDeclaration", parent)) { + identifier(node, "id", node.id); + } + }; + }() + }); + const importAttributes = core.importAttributes = { + attributes: { + optional: true, + validate: (0, _utils.arrayOfType)("ImportAttribute") + }, + assertions: { + deprecated: true, + optional: true, + validate: (0, _utils.arrayOfType)("ImportAttribute") + } + }; + defineType("ExportAllDeclaration", { + builder: ["source"], + visitor: ["source", "attributes", "assertions"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"], + fields: Object.assign({ + source: { + validate: (0, _utils.assertNodeType)("StringLiteral") + }, + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")) + }, importAttributes) + }); + defineType("ExportDefaultDeclaration", { + visitor: ["declaration"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"], + fields: { + declaration: (0, _utils.validateType)("TSDeclareFunction", "FunctionDeclaration", "ClassDeclaration", "Expression"), + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("value")) + } + }); + defineType("ExportNamedDeclaration", { + builder: ["declaration", "specifiers", "source"], + visitor: process.env ? ["declaration", "specifiers", "source", "attributes"] : ["declaration", "specifiers", "source", "attributes", "assertions"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"], + fields: Object.assign({ + declaration: { + optional: true, + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertNodeType)("Declaration"), Object.assign(function (node, key, val) { + if (val && node.specifiers.length) { + throw new TypeError("Only declaration or specifiers is allowed on ExportNamedDeclaration"); + } + if (val && node.source) { + throw new TypeError("Cannot export a declaration from a source"); + } + }, { + oneOfNodeTypes: ["Declaration"] + })) : (0, _utils.assertNodeType)("Declaration") + } + }, importAttributes, { + specifiers: { + default: [], + validate: (0, _utils.arrayOf)(function () { + const sourced = (0, _utils.assertNodeType)("ExportSpecifier", "ExportDefaultSpecifier", "ExportNamespaceSpecifier"); + const sourceless = (0, _utils.assertNodeType)("ExportSpecifier"); + if (!process.env.BABEL_TYPES_8_BREAKING) return sourced; + return Object.assign(function (node, key, val) { + const validator = node.source ? sourced : sourceless; + validator(node, key, val); + }, { + oneOfNodeTypes: ["ExportSpecifier", "ExportDefaultSpecifier", "ExportNamespaceSpecifier"] + }); + }()) + }, + source: { + validate: (0, _utils.assertNodeType)("StringLiteral"), + optional: true + }, + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")) + }) + }); + defineType("ExportSpecifier", { + visitor: ["local", "exported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + exported: { + validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral") + }, + exportKind: { + validate: (0, _utils.assertOneOf)("type", "value"), + optional: true + } + } + }); + defineType("ForOfStatement", { + visitor: ["left", "right", "body"], + builder: ["left", "right", "body", "await"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"], + fields: { + left: { + validate: function () { + if (!process.env.BABEL_TYPES_8_BREAKING) { + return (0, _utils.assertNodeType)("VariableDeclaration", "LVal"); + } + const declaration = (0, _utils.assertNodeType)("VariableDeclaration"); + const lval = (0, _utils.assertNodeType)("Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression"); + return Object.assign(function (node, key, val) { + if ((0, _is.default)("VariableDeclaration", val)) { + declaration(node, key, val); + } else { + lval(node, key, val); + } + }, { + oneOfNodeTypes: ["VariableDeclaration", "Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression"] + }); + }() + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + }, + await: { + default: false + } + } + }); + defineType("ImportDeclaration", { + builder: ["specifiers", "source"], + visitor: ["specifiers", "source", "attributes", "assertions"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration"], + fields: Object.assign({}, importAttributes, { + module: { + optional: true, + validate: (0, _utils.assertValueType)("boolean") + }, + phase: { + default: null, + validate: (0, _utils.assertOneOf)("source", "defer") + }, + specifiers: (0, _utils.validateArrayOfType)("ImportSpecifier", "ImportDefaultSpecifier", "ImportNamespaceSpecifier"), + source: { + validate: (0, _utils.assertNodeType)("StringLiteral") + }, + importKind: { + validate: (0, _utils.assertOneOf)("type", "typeof", "value"), + optional: true + } + }) + }); + defineType("ImportDefaultSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("ImportNamespaceSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("ImportSpecifier", { + visitor: ["imported", "local"], + builder: ["local", "imported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + imported: { + validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral") + }, + importKind: { + validate: (0, _utils.assertOneOf)("type", "typeof", "value"), + optional: true + } + } + }); + defineType("ImportExpression", { + visitor: ["source", "options"], + aliases: ["Expression"], + fields: { + phase: { + default: null, + validate: (0, _utils.assertOneOf)("source", "defer") + }, + source: { + validate: (0, _utils.assertNodeType)("Expression") + }, + options: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + } + } + }); + defineType("MetaProperty", { + visitor: ["meta", "property"], + aliases: ["Expression"], + fields: { + meta: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertNodeType)("Identifier"), Object.assign(function (node, key, val) { + let property; + switch (val.name) { + case "function": + property = "sent"; + break; + case "new": + property = "target"; + break; + case "import": + property = "meta"; + break; + } + if (!(0, _is.default)("Identifier", node.property, { + name: property + })) { + throw new TypeError("Unrecognised MetaProperty"); + } + }, { + oneOfNodeTypes: ["Identifier"] + })) : (0, _utils.assertNodeType)("Identifier") + }, + property: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + const classMethodOrPropertyCommon = () => ({ + abstract: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + accessibility: { + validate: (0, _utils.assertOneOf)("public", "private", "protected"), + optional: true + }, + static: { + default: false + }, + override: { + default: false + }, + computed: { + default: false + }, + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + key: { + validate: (0, _utils.chain)(function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"); + const computed = (0, _utils.assertNodeType)("Expression"); + return function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + }(), (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "Expression")) + } + }); + core.classMethodOrPropertyCommon = classMethodOrPropertyCommon; + const classMethodOrDeclareMethodCommon = () => Object.assign({}, functionCommon(), classMethodOrPropertyCommon(), { + params: (0, _utils.validateArrayOfType)("Identifier", "Pattern", "RestElement", "TSParameterProperty"), + kind: { + validate: (0, _utils.assertOneOf)("get", "set", "method", "constructor"), + default: "method" + }, + access: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("string"), (0, _utils.assertOneOf)("public", "private", "protected")), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }); + core.classMethodOrDeclareMethodCommon = classMethodOrDeclareMethodCommon; + defineType("ClassMethod", { + aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method"], + builder: ["kind", "key", "params", "body", "computed", "static", "generator", "async"], + visitor: ["decorators", "key", "typeParameters", "params", "returnType", "body"], + fields: Object.assign({}, classMethodOrDeclareMethodCommon(), functionTypeAnnotationCommon(), { + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }) + }); + defineType("ObjectPattern", { + visitor: ["properties", "typeAnnotation", "decorators"], + builder: ["properties"], + aliases: ["Pattern", "PatternLike", "LVal"], + fields: Object.assign({}, patternLikeCommon(), { + properties: (0, _utils.validateArrayOfType)("RestElement", "ObjectProperty") + }) + }); + defineType("SpreadElement", { + visitor: ["argument"], + aliases: ["UnaryLike"], + deprecatedAlias: "SpreadProperty", + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("Super", { + aliases: ["Expression"] + }); + defineType("TaggedTemplateExpression", { + visitor: ["tag", "typeParameters", "quasi"], + builder: ["tag", "quasi"], + aliases: ["Expression"], + fields: { + tag: { + validate: (0, _utils.assertNodeType)("Expression") + }, + quasi: { + validate: (0, _utils.assertNodeType)("TemplateLiteral") + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + } + } + }); + defineType("TemplateElement", { + builder: ["value", "tail"], + fields: { + value: { + validate: (0, _utils.chain)((0, _utils.assertShape)({ + raw: { + validate: (0, _utils.assertValueType)("string") + }, + cooked: { + validate: (0, _utils.assertValueType)("string"), + optional: true + } + }), function templateElementCookedValidator(node) { + const raw = node.value.raw; + let unterminatedCalled = false; + const error = () => { + throw new Error("Internal @babel/types error."); + }; + const { + str, + firstInvalidLoc + } = (0, _helperStringParser.readStringContents)("template", raw, 0, 0, 0, { + unterminated() { + unterminatedCalled = true; + }, + strictNumericEscape: error, + invalidEscapeSequence: error, + numericSeparatorInEscapeSequence: error, + unexpectedNumericSeparator: error, + invalidDigit: error, + invalidCodePoint: error + }); + if (!unterminatedCalled) throw new Error("Invalid raw"); + node.value.cooked = firstInvalidLoc ? null : str; + }) + }, + tail: { + default: false + } + } + }); + defineType("TemplateLiteral", { + visitor: ["quasis", "expressions"], + aliases: ["Expression", "Literal"], + fields: { + quasis: (0, _utils.validateArrayOfType)("TemplateElement"), + expressions: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression", "TSType")), function (node, key, val) { + if (node.quasis.length !== val.length + 1) { + throw new TypeError(`Number of ${node.type} quasis should be exactly one more than the number of expressions.\nExpected ${val.length + 1} quasis but got ${node.quasis.length}`); + } + }) + } + } + }); + defineType("YieldExpression", { + builder: ["argument", "delegate"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + delegate: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("boolean"), Object.assign(function (node, key, val) { + if (val && !node.argument) { + throw new TypeError("Property delegate of YieldExpression cannot be true if there is no argument"); + } + }, { + type: "boolean" + })) : (0, _utils.assertValueType)("boolean"), + default: false + }, + argument: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("AwaitExpression", { + builder: ["argument"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("Import", { + aliases: ["Expression"] + }); + defineType("BigIntLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("ExportNamespaceSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { + exported: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("OptionalMemberExpression", { + builder: ["object", "property", "computed", "optional"], + visitor: ["object", "property"], + aliases: ["Expression"], + fields: { + object: { + validate: (0, _utils.assertNodeType)("Expression") + }, + property: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = Object.assign(function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }, { + oneOfNodeTypes: ["Expression", "Identifier"] + }); + return validator; + }() + }, + computed: { + default: false + }, + optional: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("boolean") : (0, _utils.chain)((0, _utils.assertValueType)("boolean"), (0, _utils.assertOptionalChainStart)()) + } + } + }); + defineType("OptionalCallExpression", { + visitor: ["callee", "arguments", "typeParameters", "typeArguments"], + builder: ["callee", "arguments", "optional"], + aliases: ["Expression"], + fields: { + callee: { + validate: (0, _utils.assertNodeType)("Expression") + }, + arguments: (0, _utils.validateArrayOfType)("Expression", "SpreadElement", "ArgumentPlaceholder"), + optional: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("boolean") : (0, _utils.chain)((0, _utils.assertValueType)("boolean"), (0, _utils.assertOptionalChainStart)()) + }, + typeArguments: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TSTypeParameterInstantiation"), + optional: true + } + } + }); + defineType("ClassProperty", { + visitor: ["decorators", "key", "typeAnnotation", "value"], + builder: ["key", "value", "typeAnnotation", "decorators", "computed", "static"], + aliases: ["Property"], + fields: Object.assign({}, classMethodOrPropertyCommon(), { + value: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + definite: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + variance: { + validate: (0, _utils.assertNodeType)("Variance"), + optional: true + } + }) + }); + defineType("ClassAccessorProperty", { + visitor: ["decorators", "key", "typeAnnotation", "value"], + builder: ["key", "value", "typeAnnotation", "decorators", "computed", "static"], + aliases: ["Property", "Accessor"], + fields: Object.assign({}, classMethodOrPropertyCommon(), { + key: { + validate: (0, _utils.chain)(function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "PrivateName"); + const computed = (0, _utils.assertNodeType)("Expression"); + return function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + }(), (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "Expression", "PrivateName")) + }, + value: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + definite: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + variance: { + validate: (0, _utils.assertNodeType)("Variance"), + optional: true + } + }) + }); + defineType("ClassPrivateProperty", { + visitor: ["decorators", "key", "typeAnnotation", "value"], + builder: ["key", "value", "decorators", "static"], + aliases: ["Property", "Private"], + fields: { + key: { + validate: (0, _utils.assertNodeType)("PrivateName") + }, + value: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + static: { + validate: (0, _utils.assertValueType)("boolean"), + default: false + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + definite: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + variance: { + validate: (0, _utils.assertNodeType)("Variance"), + optional: true + } + } + }); + defineType("ClassPrivateMethod", { + builder: ["kind", "key", "params", "body", "static"], + visitor: ["decorators", "key", "typeParameters", "params", "returnType", "body"], + aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method", "Private"], + fields: Object.assign({}, classMethodOrDeclareMethodCommon(), functionTypeAnnotationCommon(), { + kind: { + validate: (0, _utils.assertOneOf)("get", "set", "method"), + default: "method" + }, + key: { + validate: (0, _utils.assertNodeType)("PrivateName") + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }) + }); + defineType("PrivateName", { + visitor: ["id"], + aliases: ["Private"], + fields: { + id: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("StaticBlock", { + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("Statement") + }, + aliases: ["Scopable", "BlockParent", "FunctionParent"] + }); + + + return core; +} + +var flow = {}; + +var hasRequiredFlow; + +function requireFlow () { + if (hasRequiredFlow) return flow; + hasRequiredFlow = 1; + + var _core = requireCore(); + var _utils = requireUtils(); + const defineType = (0, _utils.defineAliasedType)("Flow"); + const defineInterfaceishType = name => { + const isDeclareClass = name === "DeclareClass"; + defineType(name, { + builder: ["id", "typeParameters", "extends", "body"], + visitor: ["id", "typeParameters", "extends", ...(isDeclareClass ? ["mixins", "implements"] : []), "body"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: Object.assign({ + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")) + }, isDeclareClass ? { + mixins: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")), + implements: (0, _utils.validateOptional)((0, _utils.arrayOfType)("ClassImplements")) + } : {}, { + body: (0, _utils.validateType)("ObjectTypeAnnotation") + }) + }); + }; + defineType("AnyTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ArrayTypeAnnotation", { + visitor: ["elementType"], + aliases: ["FlowType"], + fields: { + elementType: (0, _utils.validateType)("FlowType") + } + }); + defineType("BooleanTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("BooleanLiteralTypeAnnotation", { + builder: ["value"], + aliases: ["FlowType"], + fields: { + value: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("NullLiteralTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ClassImplements", { + visitor: ["id", "typeParameters"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation") + } + }); + defineInterfaceishType("DeclareClass"); + defineType("DeclareFunction", { + visitor: ["id"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + predicate: (0, _utils.validateOptionalType)("DeclaredPredicate") + } + }); + defineInterfaceishType("DeclareInterface"); + defineType("DeclareModule", { + builder: ["id", "body", "kind"], + visitor: ["id", "body"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier", "StringLiteral"), + body: (0, _utils.validateType)("BlockStatement"), + kind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("CommonJS", "ES")) + } + }); + defineType("DeclareModuleExports", { + visitor: ["typeAnnotation"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + typeAnnotation: (0, _utils.validateType)("TypeAnnotation") + } + }); + defineType("DeclareTypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + right: (0, _utils.validateType)("FlowType") + } + }); + defineType("DeclareOpaqueType", { + visitor: ["id", "typeParameters", "supertype"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + supertype: (0, _utils.validateOptionalType)("FlowType"), + impltype: (0, _utils.validateOptionalType)("FlowType") + } + }); + defineType("DeclareVariable", { + visitor: ["id"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier") + } + }); + defineType("DeclareExportDeclaration", { + visitor: ["declaration", "specifiers", "source", "attributes"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: Object.assign({ + declaration: (0, _utils.validateOptionalType)("Flow"), + specifiers: (0, _utils.validateOptional)((0, _utils.arrayOfType)("ExportSpecifier", "ExportNamespaceSpecifier")), + source: (0, _utils.validateOptionalType)("StringLiteral"), + default: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean")) + }, _core.importAttributes) + }); + defineType("DeclareExportAllDeclaration", { + visitor: ["source", "attributes"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: Object.assign({ + source: (0, _utils.validateType)("StringLiteral"), + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")) + }, _core.importAttributes) + }); + defineType("DeclaredPredicate", { + visitor: ["value"], + aliases: ["FlowPredicate"], + fields: { + value: (0, _utils.validateType)("Flow") + } + }); + defineType("ExistsTypeAnnotation", { + aliases: ["FlowType"] + }); + defineType("FunctionTypeAnnotation", { + visitor: ["typeParameters", "params", "rest", "returnType"], + aliases: ["FlowType"], + fields: { + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + params: (0, _utils.validateArrayOfType)("FunctionTypeParam"), + rest: (0, _utils.validateOptionalType)("FunctionTypeParam"), + this: (0, _utils.validateOptionalType)("FunctionTypeParam"), + returnType: (0, _utils.validateType)("FlowType") + } + }); + defineType("FunctionTypeParam", { + visitor: ["name", "typeAnnotation"], + fields: { + name: (0, _utils.validateOptionalType)("Identifier"), + typeAnnotation: (0, _utils.validateType)("FlowType"), + optional: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("GenericTypeAnnotation", { + visitor: ["id", "typeParameters"], + aliases: ["FlowType"], + fields: { + id: (0, _utils.validateType)("Identifier", "QualifiedTypeIdentifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation") + } + }); + defineType("InferredPredicate", { + aliases: ["FlowPredicate"] + }); + defineType("InterfaceExtends", { + visitor: ["id", "typeParameters"], + fields: { + id: (0, _utils.validateType)("Identifier", "QualifiedTypeIdentifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation") + } + }); + defineInterfaceishType("InterfaceDeclaration"); + defineType("InterfaceTypeAnnotation", { + visitor: ["extends", "body"], + aliases: ["FlowType"], + fields: { + extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")), + body: (0, _utils.validateType)("ObjectTypeAnnotation") + } + }); + defineType("IntersectionTypeAnnotation", { + visitor: ["types"], + aliases: ["FlowType"], + fields: { + types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("MixedTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("EmptyTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("NullableTypeAnnotation", { + visitor: ["typeAnnotation"], + aliases: ["FlowType"], + fields: { + typeAnnotation: (0, _utils.validateType)("FlowType") + } + }); + defineType("NumberLiteralTypeAnnotation", { + builder: ["value"], + aliases: ["FlowType"], + fields: { + value: (0, _utils.validate)((0, _utils.assertValueType)("number")) + } + }); + defineType("NumberTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ObjectTypeAnnotation", { + visitor: ["properties", "indexers", "callProperties", "internalSlots"], + aliases: ["FlowType"], + builder: ["properties", "indexers", "callProperties", "internalSlots", "exact"], + fields: { + properties: (0, _utils.validate)((0, _utils.arrayOfType)("ObjectTypeProperty", "ObjectTypeSpreadProperty")), + indexers: { + validate: (0, _utils.arrayOfType)("ObjectTypeIndexer"), + optional: true, + default: [] + }, + callProperties: { + validate: (0, _utils.arrayOfType)("ObjectTypeCallProperty"), + optional: true, + default: [] + }, + internalSlots: { + validate: (0, _utils.arrayOfType)("ObjectTypeInternalSlot"), + optional: true, + default: [] + }, + exact: { + validate: (0, _utils.assertValueType)("boolean"), + default: false + }, + inexact: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeInternalSlot", { + visitor: ["id", "value"], + builder: ["id", "value", "optional", "static", "method"], + aliases: ["UserWhitespacable"], + fields: { + id: (0, _utils.validateType)("Identifier"), + value: (0, _utils.validateType)("FlowType"), + optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + method: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeCallProperty", { + visitor: ["value"], + aliases: ["UserWhitespacable"], + fields: { + value: (0, _utils.validateType)("FlowType"), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeIndexer", { + visitor: ["variance", "id", "key", "value"], + builder: ["id", "key", "value", "variance"], + aliases: ["UserWhitespacable"], + fields: { + id: (0, _utils.validateOptionalType)("Identifier"), + key: (0, _utils.validateType)("FlowType"), + value: (0, _utils.validateType)("FlowType"), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + variance: (0, _utils.validateOptionalType)("Variance") + } + }); + defineType("ObjectTypeProperty", { + visitor: ["key", "value", "variance"], + aliases: ["UserWhitespacable"], + fields: { + key: (0, _utils.validateType)("Identifier", "StringLiteral"), + value: (0, _utils.validateType)("FlowType"), + kind: (0, _utils.validate)((0, _utils.assertOneOf)("init", "get", "set")), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + proto: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + variance: (0, _utils.validateOptionalType)("Variance"), + method: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeSpreadProperty", { + visitor: ["argument"], + aliases: ["UserWhitespacable"], + fields: { + argument: (0, _utils.validateType)("FlowType") + } + }); + defineType("OpaqueType", { + visitor: ["id", "typeParameters", "supertype", "impltype"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + supertype: (0, _utils.validateOptionalType)("FlowType"), + impltype: (0, _utils.validateType)("FlowType") + } + }); + defineType("QualifiedTypeIdentifier", { + visitor: ["qualification", "id"], + builder: ["id", "qualification"], + fields: { + id: (0, _utils.validateType)("Identifier"), + qualification: (0, _utils.validateType)("Identifier", "QualifiedTypeIdentifier") + } + }); + defineType("StringLiteralTypeAnnotation", { + builder: ["value"], + aliases: ["FlowType"], + fields: { + value: (0, _utils.validate)((0, _utils.assertValueType)("string")) + } + }); + defineType("StringTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("SymbolTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ThisTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("TupleTypeAnnotation", { + visitor: ["types"], + aliases: ["FlowType"], + fields: { + types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("TypeofTypeAnnotation", { + visitor: ["argument"], + aliases: ["FlowType"], + fields: { + argument: (0, _utils.validateType)("FlowType") + } + }); + defineType("TypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + right: (0, _utils.validateType)("FlowType") + } + }); + defineType("TypeAnnotation", { + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("FlowType") + } + }); + defineType("TypeCastExpression", { + visitor: ["expression", "typeAnnotation"], + aliases: ["ExpressionWrapper", "Expression"], + fields: { + expression: (0, _utils.validateType)("Expression"), + typeAnnotation: (0, _utils.validateType)("TypeAnnotation") + } + }); + defineType("TypeParameter", { + visitor: ["bound", "default", "variance"], + fields: { + name: (0, _utils.validate)((0, _utils.assertValueType)("string")), + bound: (0, _utils.validateOptionalType)("TypeAnnotation"), + default: (0, _utils.validateOptionalType)("FlowType"), + variance: (0, _utils.validateOptionalType)("Variance") + } + }); + defineType("TypeParameterDeclaration", { + visitor: ["params"], + fields: { + params: (0, _utils.validate)((0, _utils.arrayOfType)("TypeParameter")) + } + }); + defineType("TypeParameterInstantiation", { + visitor: ["params"], + fields: { + params: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("UnionTypeAnnotation", { + visitor: ["types"], + aliases: ["FlowType"], + fields: { + types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("Variance", { + builder: ["kind"], + fields: { + kind: (0, _utils.validate)((0, _utils.assertOneOf)("minus", "plus")) + } + }); + defineType("VoidTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("EnumDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "body"], + fields: { + id: (0, _utils.validateType)("Identifier"), + body: (0, _utils.validateType)("EnumBooleanBody", "EnumNumberBody", "EnumStringBody", "EnumSymbolBody") + } + }); + defineType("EnumBooleanBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + members: (0, _utils.validateArrayOfType)("EnumBooleanMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumNumberBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + members: (0, _utils.validateArrayOfType)("EnumNumberMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumStringBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + members: (0, _utils.validateArrayOfType)("EnumStringMember", "EnumDefaultedMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumSymbolBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + members: (0, _utils.validateArrayOfType)("EnumDefaultedMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumBooleanMember", { + aliases: ["EnumMember"], + visitor: ["id"], + fields: { + id: (0, _utils.validateType)("Identifier"), + init: (0, _utils.validateType)("BooleanLiteral") + } + }); + defineType("EnumNumberMember", { + aliases: ["EnumMember"], + visitor: ["id", "init"], + fields: { + id: (0, _utils.validateType)("Identifier"), + init: (0, _utils.validateType)("NumericLiteral") + } + }); + defineType("EnumStringMember", { + aliases: ["EnumMember"], + visitor: ["id", "init"], + fields: { + id: (0, _utils.validateType)("Identifier"), + init: (0, _utils.validateType)("StringLiteral") + } + }); + defineType("EnumDefaultedMember", { + aliases: ["EnumMember"], + visitor: ["id"], + fields: { + id: (0, _utils.validateType)("Identifier") + } + }); + defineType("IndexedAccessType", { + visitor: ["objectType", "indexType"], + aliases: ["FlowType"], + fields: { + objectType: (0, _utils.validateType)("FlowType"), + indexType: (0, _utils.validateType)("FlowType") + } + }); + defineType("OptionalIndexedAccessType", { + visitor: ["objectType", "indexType"], + aliases: ["FlowType"], + fields: { + objectType: (0, _utils.validateType)("FlowType"), + indexType: (0, _utils.validateType)("FlowType"), + optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + + + return flow; +} + +var jsx = {}; + +var hasRequiredJsx; + +function requireJsx () { + if (hasRequiredJsx) return jsx; + hasRequiredJsx = 1; + + var _utils = requireUtils(); + const defineType = (0, _utils.defineAliasedType)("JSX"); + defineType("JSXAttribute", { + visitor: ["name", "value"], + aliases: ["Immutable"], + fields: { + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXNamespacedName") + }, + value: { + optional: true, + validate: (0, _utils.assertNodeType)("JSXElement", "JSXFragment", "StringLiteral", "JSXExpressionContainer") + } + } + }); + defineType("JSXClosingElement", { + visitor: ["name"], + aliases: ["Immutable"], + fields: { + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXMemberExpression", "JSXNamespacedName") + } + } + }); + defineType("JSXElement", { + builder: ["openingElement", "closingElement", "children", "selfClosing"], + visitor: ["openingElement", "children", "closingElement"], + aliases: ["Immutable", "Expression"], + fields: Object.assign({ + openingElement: { + validate: (0, _utils.assertNodeType)("JSXOpeningElement") + }, + closingElement: { + optional: true, + validate: (0, _utils.assertNodeType)("JSXClosingElement") + }, + children: (0, _utils.validateArrayOfType)("JSXText", "JSXExpressionContainer", "JSXSpreadChild", "JSXElement", "JSXFragment") + }, { + selfClosing: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + }) + }); + defineType("JSXEmptyExpression", {}); + defineType("JSXExpressionContainer", { + visitor: ["expression"], + aliases: ["Immutable"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression", "JSXEmptyExpression") + } + } + }); + defineType("JSXSpreadChild", { + visitor: ["expression"], + aliases: ["Immutable"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("JSXIdentifier", { + builder: ["name"], + fields: { + name: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("JSXMemberExpression", { + visitor: ["object", "property"], + fields: { + object: { + validate: (0, _utils.assertNodeType)("JSXMemberExpression", "JSXIdentifier") + }, + property: { + validate: (0, _utils.assertNodeType)("JSXIdentifier") + } + } + }); + defineType("JSXNamespacedName", { + visitor: ["namespace", "name"], + fields: { + namespace: { + validate: (0, _utils.assertNodeType)("JSXIdentifier") + }, + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier") + } + } + }); + defineType("JSXOpeningElement", { + builder: ["name", "attributes", "selfClosing"], + visitor: ["name", "attributes"], + aliases: ["Immutable"], + fields: { + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXMemberExpression", "JSXNamespacedName") + }, + selfClosing: { + default: false + }, + attributes: (0, _utils.validateArrayOfType)("JSXAttribute", "JSXSpreadAttribute"), + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + } + } + }); + defineType("JSXSpreadAttribute", { + visitor: ["argument"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("JSXText", { + aliases: ["Immutable"], + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("JSXFragment", { + builder: ["openingFragment", "closingFragment", "children"], + visitor: ["openingFragment", "children", "closingFragment"], + aliases: ["Immutable", "Expression"], + fields: { + openingFragment: { + validate: (0, _utils.assertNodeType)("JSXOpeningFragment") + }, + closingFragment: { + validate: (0, _utils.assertNodeType)("JSXClosingFragment") + }, + children: (0, _utils.validateArrayOfType)("JSXText", "JSXExpressionContainer", "JSXSpreadChild", "JSXElement", "JSXFragment") + } + }); + defineType("JSXOpeningFragment", { + aliases: ["Immutable"] + }); + defineType("JSXClosingFragment", { + aliases: ["Immutable"] + }); + + + return jsx; +} + +var misc = {}; + +var placeholders = {}; + +var hasRequiredPlaceholders; + +function requirePlaceholders () { + if (hasRequiredPlaceholders) return placeholders; + hasRequiredPlaceholders = 1; + + Object.defineProperty(placeholders, "__esModule", { + value: true + }); + placeholders.PLACEHOLDERS_FLIPPED_ALIAS = placeholders.PLACEHOLDERS_ALIAS = placeholders.PLACEHOLDERS = void 0; + var _utils = requireUtils(); + const PLACEHOLDERS = placeholders.PLACEHOLDERS = ["Identifier", "StringLiteral", "Expression", "Statement", "Declaration", "BlockStatement", "ClassBody", "Pattern"]; + const PLACEHOLDERS_ALIAS = placeholders.PLACEHOLDERS_ALIAS = { + Declaration: ["Statement"], + Pattern: ["PatternLike", "LVal"] + }; + for (const type of PLACEHOLDERS) { + const alias = _utils.ALIAS_KEYS[type]; + if (alias != null && alias.length) PLACEHOLDERS_ALIAS[type] = alias; + } + const PLACEHOLDERS_FLIPPED_ALIAS = placeholders.PLACEHOLDERS_FLIPPED_ALIAS = {}; + Object.keys(PLACEHOLDERS_ALIAS).forEach(type => { + PLACEHOLDERS_ALIAS[type].forEach(alias => { + if (!hasOwnProperty.call(PLACEHOLDERS_FLIPPED_ALIAS, alias)) { + PLACEHOLDERS_FLIPPED_ALIAS[alias] = []; + } + PLACEHOLDERS_FLIPPED_ALIAS[alias].push(type); + }); + }); + + + return placeholders; +} + +var hasRequiredMisc; + +function requireMisc () { + if (hasRequiredMisc) return misc; + hasRequiredMisc = 1; + + var _utils = requireUtils(); + var _placeholders = requirePlaceholders(); + var _core = requireCore(); + const defineType = (0, _utils.defineAliasedType)("Miscellaneous"); + { + defineType("Noop", { + visitor: [] + }); + } + defineType("Placeholder", { + visitor: [], + builder: ["expectedNode", "name"], + fields: Object.assign({ + name: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + expectedNode: { + validate: (0, _utils.assertOneOf)(..._placeholders.PLACEHOLDERS) + } + }, (0, _core.patternLikeCommon)()) + }); + defineType("V8IntrinsicIdentifier", { + builder: ["name"], + fields: { + name: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + + + return misc; +} + +var experimental = {}; + +var hasRequiredExperimental; + +function requireExperimental () { + if (hasRequiredExperimental) return experimental; + hasRequiredExperimental = 1; + + var _utils = requireUtils(); + (0, _utils.default)("ArgumentPlaceholder", {}); + (0, _utils.default)("BindExpression", { + visitor: ["object", "callee"], + aliases: ["Expression"], + fields: !process.env.BABEL_TYPES_8_BREAKING ? { + object: { + validate: Object.assign(() => {}, { + oneOfNodeTypes: ["Expression"] + }) + }, + callee: { + validate: Object.assign(() => {}, { + oneOfNodeTypes: ["Expression"] + }) + } + } : { + object: { + validate: (0, _utils.assertNodeType)("Expression") + }, + callee: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + (0, _utils.default)("ImportAttribute", { + visitor: ["key", "value"], + fields: { + key: { + validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral") + }, + value: { + validate: (0, _utils.assertNodeType)("StringLiteral") + } + } + }); + (0, _utils.default)("Decorator", { + visitor: ["expression"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + (0, _utils.default)("DoExpression", { + visitor: ["body"], + builder: ["body", "async"], + aliases: ["Expression"], + fields: { + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + }, + async: { + validate: (0, _utils.assertValueType)("boolean"), + default: false + } + } + }); + (0, _utils.default)("ExportDefaultSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { + exported: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + (0, _utils.default)("RecordExpression", { + visitor: ["properties"], + aliases: ["Expression"], + fields: { + properties: (0, _utils.validateArrayOfType)("ObjectProperty", "SpreadElement") + } + }); + (0, _utils.default)("TupleExpression", { + fields: { + elements: { + validate: (0, _utils.arrayOfType)("Expression", "SpreadElement"), + default: [] + } + }, + visitor: ["elements"], + aliases: ["Expression"] + }); + { + (0, _utils.default)("DecimalLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + } + (0, _utils.default)("ModuleExpression", { + visitor: ["body"], + fields: { + body: { + validate: (0, _utils.assertNodeType)("Program") + } + }, + aliases: ["Expression"] + }); + (0, _utils.default)("TopicReference", { + aliases: ["Expression"] + }); + (0, _utils.default)("PipelineTopicExpression", { + builder: ["expression"], + visitor: ["expression"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Expression"] + }); + (0, _utils.default)("PipelineBareFunction", { + builder: ["callee"], + visitor: ["callee"], + fields: { + callee: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Expression"] + }); + (0, _utils.default)("PipelinePrimaryTopicReference", { + aliases: ["Expression"] + }); + + + return experimental; +} + +var typescript = {}; + +var hasRequiredTypescript; + +function requireTypescript () { + if (hasRequiredTypescript) return typescript; + hasRequiredTypescript = 1; + + var _utils = requireUtils(); + var _core = requireCore(); + var _is = requireIs(); + const defineType = (0, _utils.defineAliasedType)("TypeScript"); + const bool = (0, _utils.assertValueType)("boolean"); + const tSFunctionTypeAnnotationCommon = () => ({ + returnType: { + validate: (0, _utils.assertNodeType)("TSTypeAnnotation", "Noop"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TSTypeParameterDeclaration", "Noop"), + optional: true + } + }); + defineType("TSParameterProperty", { + aliases: ["LVal"], + visitor: ["parameter"], + fields: { + accessibility: { + validate: (0, _utils.assertOneOf)("public", "private", "protected"), + optional: true + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + parameter: { + validate: (0, _utils.assertNodeType)("Identifier", "AssignmentPattern") + }, + override: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + } + }); + defineType("TSDeclareFunction", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "typeParameters", "params", "returnType"], + fields: Object.assign({}, (0, _core.functionDeclarationCommon)(), tSFunctionTypeAnnotationCommon()) + }); + defineType("TSDeclareMethod", { + visitor: ["decorators", "key", "typeParameters", "params", "returnType"], + fields: Object.assign({}, (0, _core.classMethodOrDeclareMethodCommon)(), tSFunctionTypeAnnotationCommon()) + }); + defineType("TSQualifiedName", { + aliases: ["TSEntityName"], + visitor: ["left", "right"], + fields: { + left: (0, _utils.validateType)("TSEntityName"), + right: (0, _utils.validateType)("Identifier") + } + }); + const signatureDeclarationCommon = () => ({ + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"), + ["parameters"]: (0, _utils.validateArrayOfType)("ArrayPattern", "Identifier", "ObjectPattern", "RestElement"), + ["typeAnnotation"]: (0, _utils.validateOptionalType)("TSTypeAnnotation") + }); + const callConstructSignatureDeclaration = { + aliases: ["TSTypeElement"], + visitor: ["typeParameters", "parameters", "typeAnnotation"], + fields: signatureDeclarationCommon() + }; + defineType("TSCallSignatureDeclaration", callConstructSignatureDeclaration); + defineType("TSConstructSignatureDeclaration", callConstructSignatureDeclaration); + const namedTypeElementCommon = () => ({ + key: (0, _utils.validateType)("Expression"), + computed: { + default: false + }, + optional: (0, _utils.validateOptional)(bool) + }); + defineType("TSPropertySignature", { + aliases: ["TSTypeElement"], + visitor: ["key", "typeAnnotation"], + fields: Object.assign({}, namedTypeElementCommon(), { + readonly: (0, _utils.validateOptional)(bool), + typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"), + kind: { + validate: (0, _utils.assertOneOf)("get", "set") + } + }) + }); + defineType("TSMethodSignature", { + aliases: ["TSTypeElement"], + visitor: ["key", "typeParameters", "parameters", "typeAnnotation"], + fields: Object.assign({}, signatureDeclarationCommon(), namedTypeElementCommon(), { + kind: { + validate: (0, _utils.assertOneOf)("method", "get", "set") + } + }) + }); + defineType("TSIndexSignature", { + aliases: ["TSTypeElement"], + visitor: ["parameters", "typeAnnotation"], + fields: { + readonly: (0, _utils.validateOptional)(bool), + static: (0, _utils.validateOptional)(bool), + parameters: (0, _utils.validateArrayOfType)("Identifier"), + typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation") + } + }); + const tsKeywordTypes = ["TSAnyKeyword", "TSBooleanKeyword", "TSBigIntKeyword", "TSIntrinsicKeyword", "TSNeverKeyword", "TSNullKeyword", "TSNumberKeyword", "TSObjectKeyword", "TSStringKeyword", "TSSymbolKeyword", "TSUndefinedKeyword", "TSUnknownKeyword", "TSVoidKeyword"]; + for (const type of tsKeywordTypes) { + defineType(type, { + aliases: ["TSType", "TSBaseType"], + visitor: [], + fields: {} + }); + } + defineType("TSThisType", { + aliases: ["TSType", "TSBaseType"], + visitor: [], + fields: {} + }); + const fnOrCtrBase = { + aliases: ["TSType"], + visitor: ["typeParameters", "parameters", "typeAnnotation"] + }; + defineType("TSFunctionType", Object.assign({}, fnOrCtrBase, { + fields: signatureDeclarationCommon() + })); + defineType("TSConstructorType", Object.assign({}, fnOrCtrBase, { + fields: Object.assign({}, signatureDeclarationCommon(), { + abstract: (0, _utils.validateOptional)(bool) + }) + })); + defineType("TSTypeReference", { + aliases: ["TSType"], + visitor: ["typeName", "typeParameters"], + fields: { + typeName: (0, _utils.validateType)("TSEntityName"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }); + defineType("TSTypePredicate", { + aliases: ["TSType"], + visitor: ["parameterName", "typeAnnotation"], + builder: ["parameterName", "typeAnnotation", "asserts"], + fields: { + parameterName: (0, _utils.validateType)("Identifier", "TSThisType"), + typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"), + asserts: (0, _utils.validateOptional)(bool) + } + }); + defineType("TSTypeQuery", { + aliases: ["TSType"], + visitor: ["exprName", "typeParameters"], + fields: { + exprName: (0, _utils.validateType)("TSEntityName", "TSImportType"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }); + defineType("TSTypeLiteral", { + aliases: ["TSType"], + visitor: ["members"], + fields: { + members: (0, _utils.validateArrayOfType)("TSTypeElement") + } + }); + defineType("TSArrayType", { + aliases: ["TSType"], + visitor: ["elementType"], + fields: { + elementType: (0, _utils.validateType)("TSType") + } + }); + defineType("TSTupleType", { + aliases: ["TSType"], + visitor: ["elementTypes"], + fields: { + elementTypes: (0, _utils.validateArrayOfType)("TSType", "TSNamedTupleMember") + } + }); + defineType("TSOptionalType", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSRestType", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSNamedTupleMember", { + visitor: ["label", "elementType"], + builder: ["label", "elementType", "optional"], + fields: { + label: (0, _utils.validateType)("Identifier"), + optional: { + validate: bool, + default: false + }, + elementType: (0, _utils.validateType)("TSType") + } + }); + const unionOrIntersection = { + aliases: ["TSType"], + visitor: ["types"], + fields: { + types: (0, _utils.validateArrayOfType)("TSType") + } + }; + defineType("TSUnionType", unionOrIntersection); + defineType("TSIntersectionType", unionOrIntersection); + defineType("TSConditionalType", { + aliases: ["TSType"], + visitor: ["checkType", "extendsType", "trueType", "falseType"], + fields: { + checkType: (0, _utils.validateType)("TSType"), + extendsType: (0, _utils.validateType)("TSType"), + trueType: (0, _utils.validateType)("TSType"), + falseType: (0, _utils.validateType)("TSType") + } + }); + defineType("TSInferType", { + aliases: ["TSType"], + visitor: ["typeParameter"], + fields: { + typeParameter: (0, _utils.validateType)("TSTypeParameter") + } + }); + defineType("TSParenthesizedType", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSTypeOperator", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + operator: (0, _utils.validate)((0, _utils.assertValueType)("string")), + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSIndexedAccessType", { + aliases: ["TSType"], + visitor: ["objectType", "indexType"], + fields: { + objectType: (0, _utils.validateType)("TSType"), + indexType: (0, _utils.validateType)("TSType") + } + }); + defineType("TSMappedType", { + aliases: ["TSType"], + visitor: ["typeParameter", "nameType", "typeAnnotation"], + builder: ["typeParameter", "typeAnnotation", "nameType"], + fields: Object.assign({}, { + typeParameter: (0, _utils.validateType)("TSTypeParameter") + }, { + readonly: (0, _utils.validateOptional)((0, _utils.assertOneOf)(true, false, "+", "-")), + optional: (0, _utils.validateOptional)((0, _utils.assertOneOf)(true, false, "+", "-")), + typeAnnotation: (0, _utils.validateOptionalType)("TSType"), + nameType: (0, _utils.validateOptionalType)("TSType") + }) + }); + defineType("TSLiteralType", { + aliases: ["TSType", "TSBaseType"], + visitor: ["literal"], + fields: { + literal: { + validate: function () { + const unaryExpression = (0, _utils.assertNodeType)("NumericLiteral", "BigIntLiteral"); + const unaryOperator = (0, _utils.assertOneOf)("-"); + const literal = (0, _utils.assertNodeType)("NumericLiteral", "StringLiteral", "BooleanLiteral", "BigIntLiteral", "TemplateLiteral"); + function validator(parent, key, node) { + if ((0, _is.default)("UnaryExpression", node)) { + unaryOperator(node, "operator", node.operator); + unaryExpression(node, "argument", node.argument); + } else { + literal(parent, key, node); + } + } + validator.oneOfNodeTypes = ["NumericLiteral", "StringLiteral", "BooleanLiteral", "BigIntLiteral", "TemplateLiteral", "UnaryExpression"]; + return validator; + }() + } + } + }); + const expressionWithTypeArguments = { + aliases: ["TSType"], + visitor: ["expression", "typeParameters"], + fields: { + expression: (0, _utils.validateType)("TSEntityName"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }; + { + defineType("TSExpressionWithTypeArguments", expressionWithTypeArguments); + } + defineType("TSInterfaceDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "typeParameters", "extends", "body"], + fields: { + declare: (0, _utils.validateOptional)(bool), + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"), + extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("TSExpressionWithTypeArguments")), + body: (0, _utils.validateType)("TSInterfaceBody") + } + }); + defineType("TSInterfaceBody", { + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("TSTypeElement") + } + }); + defineType("TSTypeAliasDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "typeParameters", "typeAnnotation"], + fields: { + declare: (0, _utils.validateOptional)(bool), + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"), + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSInstantiationExpression", { + aliases: ["Expression"], + visitor: ["expression", "typeParameters"], + fields: { + expression: (0, _utils.validateType)("Expression"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }); + const TSTypeExpression = { + aliases: ["Expression", "LVal", "PatternLike"], + visitor: ["expression", "typeAnnotation"], + fields: { + expression: (0, _utils.validateType)("Expression"), + typeAnnotation: (0, _utils.validateType)("TSType") + } + }; + defineType("TSAsExpression", TSTypeExpression); + defineType("TSSatisfiesExpression", TSTypeExpression); + defineType("TSTypeAssertion", { + aliases: ["Expression", "LVal", "PatternLike"], + visitor: ["typeAnnotation", "expression"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType"), + expression: (0, _utils.validateType)("Expression") + } + }); + defineType("TSEnumDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "members"], + fields: { + declare: (0, _utils.validateOptional)(bool), + const: (0, _utils.validateOptional)(bool), + id: (0, _utils.validateType)("Identifier"), + members: (0, _utils.validateArrayOfType)("TSEnumMember"), + initializer: (0, _utils.validateOptionalType)("Expression") + } + }); + defineType("TSEnumMember", { + visitor: ["id", "initializer"], + fields: { + id: (0, _utils.validateType)("Identifier", "StringLiteral"), + initializer: (0, _utils.validateOptionalType)("Expression") + } + }); + defineType("TSModuleDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "body"], + fields: Object.assign({ + kind: { + validate: (0, _utils.assertOneOf)("global", "module", "namespace") + }, + declare: (0, _utils.validateOptional)(bool) + }, { + global: (0, _utils.validateOptional)(bool) + }, { + id: (0, _utils.validateType)("Identifier", "StringLiteral"), + body: (0, _utils.validateType)("TSModuleBlock", "TSModuleDeclaration") + }) + }); + defineType("TSModuleBlock", { + aliases: ["Scopable", "Block", "BlockParent", "FunctionParent"], + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("Statement") + } + }); + defineType("TSImportType", { + aliases: ["TSType"], + visitor: ["argument", "qualifier", "typeParameters"], + fields: { + argument: (0, _utils.validateType)("StringLiteral"), + qualifier: (0, _utils.validateOptionalType)("TSEntityName"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation"), + options: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + } + } + }); + defineType("TSImportEqualsDeclaration", { + aliases: ["Statement"], + visitor: ["id", "moduleReference"], + fields: { + isExport: (0, _utils.validate)(bool), + id: (0, _utils.validateType)("Identifier"), + moduleReference: (0, _utils.validateType)("TSEntityName", "TSExternalModuleReference"), + importKind: { + validate: (0, _utils.assertOneOf)("type", "value"), + optional: true + } + } + }); + defineType("TSExternalModuleReference", { + visitor: ["expression"], + fields: { + expression: (0, _utils.validateType)("StringLiteral") + } + }); + defineType("TSNonNullExpression", { + aliases: ["Expression", "LVal", "PatternLike"], + visitor: ["expression"], + fields: { + expression: (0, _utils.validateType)("Expression") + } + }); + defineType("TSExportAssignment", { + aliases: ["Statement"], + visitor: ["expression"], + fields: { + expression: (0, _utils.validateType)("Expression") + } + }); + defineType("TSNamespaceExportDeclaration", { + aliases: ["Statement"], + visitor: ["id"], + fields: { + id: (0, _utils.validateType)("Identifier") + } + }); + defineType("TSTypeAnnotation", { + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TSType") + } + } + }); + defineType("TSTypeParameterInstantiation", { + visitor: ["params"], + fields: { + params: (0, _utils.validateArrayOfType)("TSType") + } + }); + defineType("TSTypeParameterDeclaration", { + visitor: ["params"], + fields: { + params: (0, _utils.validateArrayOfType)("TSTypeParameter") + } + }); + defineType("TSTypeParameter", { + builder: ["constraint", "default", "name"], + visitor: ["constraint", "default"], + fields: { + name: { + validate: (0, _utils.assertValueType)("string") + }, + in: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + out: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + const: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + constraint: { + validate: (0, _utils.assertNodeType)("TSType"), + optional: true + }, + default: { + validate: (0, _utils.assertNodeType)("TSType"), + optional: true + } + } + }); + + + return typescript; +} + +var deprecatedAliases = {}; + +var hasRequiredDeprecatedAliases; + +function requireDeprecatedAliases () { + if (hasRequiredDeprecatedAliases) return deprecatedAliases; + hasRequiredDeprecatedAliases = 1; + + Object.defineProperty(deprecatedAliases, "__esModule", { + value: true + }); + deprecatedAliases.DEPRECATED_ALIASES = void 0; + deprecatedAliases.DEPRECATED_ALIASES = { + ModuleDeclaration: "ImportOrExportDeclaration" + }; + + + return deprecatedAliases; +} + +var hasRequiredDefinitions; + +function requireDefinitions () { + if (hasRequiredDefinitions) return definitions; + hasRequiredDefinitions = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "ALIAS_KEYS", { + enumerable: true, + get: function () { + return _utils.ALIAS_KEYS; + } + }); + Object.defineProperty(exports, "BUILDER_KEYS", { + enumerable: true, + get: function () { + return _utils.BUILDER_KEYS; + } + }); + Object.defineProperty(exports, "DEPRECATED_ALIASES", { + enumerable: true, + get: function () { + return _deprecatedAliases.DEPRECATED_ALIASES; + } + }); + Object.defineProperty(exports, "DEPRECATED_KEYS", { + enumerable: true, + get: function () { + return _utils.DEPRECATED_KEYS; + } + }); + Object.defineProperty(exports, "FLIPPED_ALIAS_KEYS", { + enumerable: true, + get: function () { + return _utils.FLIPPED_ALIAS_KEYS; + } + }); + Object.defineProperty(exports, "NODE_FIELDS", { + enumerable: true, + get: function () { + return _utils.NODE_FIELDS; + } + }); + Object.defineProperty(exports, "NODE_PARENT_VALIDATIONS", { + enumerable: true, + get: function () { + return _utils.NODE_PARENT_VALIDATIONS; + } + }); + Object.defineProperty(exports, "PLACEHOLDERS", { + enumerable: true, + get: function () { + return _placeholders.PLACEHOLDERS; + } + }); + Object.defineProperty(exports, "PLACEHOLDERS_ALIAS", { + enumerable: true, + get: function () { + return _placeholders.PLACEHOLDERS_ALIAS; + } + }); + Object.defineProperty(exports, "PLACEHOLDERS_FLIPPED_ALIAS", { + enumerable: true, + get: function () { + return _placeholders.PLACEHOLDERS_FLIPPED_ALIAS; + } + }); + exports.TYPES = void 0; + Object.defineProperty(exports, "VISITOR_KEYS", { + enumerable: true, + get: function () { + return _utils.VISITOR_KEYS; + } + }); + requireCore(); + requireFlow(); + requireJsx(); + requireMisc(); + requireExperimental(); + requireTypescript(); + var _utils = requireUtils(); + var _placeholders = requirePlaceholders(); + var _deprecatedAliases = requireDeprecatedAliases(); + Object.keys(_deprecatedAliases.DEPRECATED_ALIASES).forEach(deprecatedAlias => { + _utils.FLIPPED_ALIAS_KEYS[deprecatedAlias] = _utils.FLIPPED_ALIAS_KEYS[_deprecatedAliases.DEPRECATED_ALIASES[deprecatedAlias]]; + }); + exports.TYPES = [].concat(Object.keys(_utils.VISITOR_KEYS), Object.keys(_utils.FLIPPED_ALIAS_KEYS), Object.keys(_utils.DEPRECATED_KEYS)); + + +} (definitions)); + return definitions; +} + +var hasRequiredValidate; + +function requireValidate () { + if (hasRequiredValidate) return validate$1; + hasRequiredValidate = 1; + + Object.defineProperty(validate$1, "__esModule", { + value: true + }); + validate$1.default = validate; + validate$1.validateChild = validateChild; + validate$1.validateField = validateField; + validate$1.validateInternal = validateInternal; + var _index = requireDefinitions(); + function validate(node, key, val) { + if (!node) return; + const fields = _index.NODE_FIELDS[node.type]; + if (!fields) return; + const field = fields[key]; + validateField(node, key, val, field); + validateChild(node, key, val); + } + function validateInternal(field, node, key, val, maybeNode) { + if (!(field != null && field.validate)) return; + if (field.optional && val == null) return; + field.validate(node, key, val); + if (maybeNode) { + var _NODE_PARENT_VALIDATI; + const type = val.type; + if (type == null) return; + (_NODE_PARENT_VALIDATI = _index.NODE_PARENT_VALIDATIONS[type]) == null || _NODE_PARENT_VALIDATI.call(_index.NODE_PARENT_VALIDATIONS, node, key, val); + } + } + function validateField(node, key, val, field) { + if (!(field != null && field.validate)) return; + if (field.optional && val == null) return; + field.validate(node, key, val); + } + function validateChild(node, key, val) { + var _NODE_PARENT_VALIDATI2; + const type = val == null ? void 0 : val.type; + if (type == null) return; + (_NODE_PARENT_VALIDATI2 = _index.NODE_PARENT_VALIDATIONS[type]) == null || _NODE_PARENT_VALIDATI2.call(_index.NODE_PARENT_VALIDATIONS, node, key, val); + } + + + return validate$1; +} + +var hasRequiredGenerated$2; + +function requireGenerated$2 () { + if (hasRequiredGenerated$2) return generated$2; + hasRequiredGenerated$2 = 1; + + Object.defineProperty(generated$2, "__esModule", { + value: true + }); + generated$2.anyTypeAnnotation = anyTypeAnnotation; + generated$2.argumentPlaceholder = argumentPlaceholder; + generated$2.arrayExpression = arrayExpression; + generated$2.arrayPattern = arrayPattern; + generated$2.arrayTypeAnnotation = arrayTypeAnnotation; + generated$2.arrowFunctionExpression = arrowFunctionExpression; + generated$2.assignmentExpression = assignmentExpression; + generated$2.assignmentPattern = assignmentPattern; + generated$2.awaitExpression = awaitExpression; + generated$2.bigIntLiteral = bigIntLiteral; + generated$2.binaryExpression = binaryExpression; + generated$2.bindExpression = bindExpression; + generated$2.blockStatement = blockStatement; + generated$2.booleanLiteral = booleanLiteral; + generated$2.booleanLiteralTypeAnnotation = booleanLiteralTypeAnnotation; + generated$2.booleanTypeAnnotation = booleanTypeAnnotation; + generated$2.breakStatement = breakStatement; + generated$2.callExpression = callExpression; + generated$2.catchClause = catchClause; + generated$2.classAccessorProperty = classAccessorProperty; + generated$2.classBody = classBody; + generated$2.classDeclaration = classDeclaration; + generated$2.classExpression = classExpression; + generated$2.classImplements = classImplements; + generated$2.classMethod = classMethod; + generated$2.classPrivateMethod = classPrivateMethod; + generated$2.classPrivateProperty = classPrivateProperty; + generated$2.classProperty = classProperty; + generated$2.conditionalExpression = conditionalExpression; + generated$2.continueStatement = continueStatement; + generated$2.debuggerStatement = debuggerStatement; + generated$2.decimalLiteral = decimalLiteral; + generated$2.declareClass = declareClass; + generated$2.declareExportAllDeclaration = declareExportAllDeclaration; + generated$2.declareExportDeclaration = declareExportDeclaration; + generated$2.declareFunction = declareFunction; + generated$2.declareInterface = declareInterface; + generated$2.declareModule = declareModule; + generated$2.declareModuleExports = declareModuleExports; + generated$2.declareOpaqueType = declareOpaqueType; + generated$2.declareTypeAlias = declareTypeAlias; + generated$2.declareVariable = declareVariable; + generated$2.declaredPredicate = declaredPredicate; + generated$2.decorator = decorator; + generated$2.directive = directive; + generated$2.directiveLiteral = directiveLiteral; + generated$2.doExpression = doExpression; + generated$2.doWhileStatement = doWhileStatement; + generated$2.emptyStatement = emptyStatement; + generated$2.emptyTypeAnnotation = emptyTypeAnnotation; + generated$2.enumBooleanBody = enumBooleanBody; + generated$2.enumBooleanMember = enumBooleanMember; + generated$2.enumDeclaration = enumDeclaration; + generated$2.enumDefaultedMember = enumDefaultedMember; + generated$2.enumNumberBody = enumNumberBody; + generated$2.enumNumberMember = enumNumberMember; + generated$2.enumStringBody = enumStringBody; + generated$2.enumStringMember = enumStringMember; + generated$2.enumSymbolBody = enumSymbolBody; + generated$2.existsTypeAnnotation = existsTypeAnnotation; + generated$2.exportAllDeclaration = exportAllDeclaration; + generated$2.exportDefaultDeclaration = exportDefaultDeclaration; + generated$2.exportDefaultSpecifier = exportDefaultSpecifier; + generated$2.exportNamedDeclaration = exportNamedDeclaration; + generated$2.exportNamespaceSpecifier = exportNamespaceSpecifier; + generated$2.exportSpecifier = exportSpecifier; + generated$2.expressionStatement = expressionStatement; + generated$2.file = file; + generated$2.forInStatement = forInStatement; + generated$2.forOfStatement = forOfStatement; + generated$2.forStatement = forStatement; + generated$2.functionDeclaration = functionDeclaration; + generated$2.functionExpression = functionExpression; + generated$2.functionTypeAnnotation = functionTypeAnnotation; + generated$2.functionTypeParam = functionTypeParam; + generated$2.genericTypeAnnotation = genericTypeAnnotation; + generated$2.identifier = identifier; + generated$2.ifStatement = ifStatement; + generated$2.import = _import; + generated$2.importAttribute = importAttribute; + generated$2.importDeclaration = importDeclaration; + generated$2.importDefaultSpecifier = importDefaultSpecifier; + generated$2.importExpression = importExpression; + generated$2.importNamespaceSpecifier = importNamespaceSpecifier; + generated$2.importSpecifier = importSpecifier; + generated$2.indexedAccessType = indexedAccessType; + generated$2.inferredPredicate = inferredPredicate; + generated$2.interfaceDeclaration = interfaceDeclaration; + generated$2.interfaceExtends = interfaceExtends; + generated$2.interfaceTypeAnnotation = interfaceTypeAnnotation; + generated$2.interpreterDirective = interpreterDirective; + generated$2.intersectionTypeAnnotation = intersectionTypeAnnotation; + generated$2.jSXAttribute = generated$2.jsxAttribute = jsxAttribute; + generated$2.jSXClosingElement = generated$2.jsxClosingElement = jsxClosingElement; + generated$2.jSXClosingFragment = generated$2.jsxClosingFragment = jsxClosingFragment; + generated$2.jSXElement = generated$2.jsxElement = jsxElement; + generated$2.jSXEmptyExpression = generated$2.jsxEmptyExpression = jsxEmptyExpression; + generated$2.jSXExpressionContainer = generated$2.jsxExpressionContainer = jsxExpressionContainer; + generated$2.jSXFragment = generated$2.jsxFragment = jsxFragment; + generated$2.jSXIdentifier = generated$2.jsxIdentifier = jsxIdentifier; + generated$2.jSXMemberExpression = generated$2.jsxMemberExpression = jsxMemberExpression; + generated$2.jSXNamespacedName = generated$2.jsxNamespacedName = jsxNamespacedName; + generated$2.jSXOpeningElement = generated$2.jsxOpeningElement = jsxOpeningElement; + generated$2.jSXOpeningFragment = generated$2.jsxOpeningFragment = jsxOpeningFragment; + generated$2.jSXSpreadAttribute = generated$2.jsxSpreadAttribute = jsxSpreadAttribute; + generated$2.jSXSpreadChild = generated$2.jsxSpreadChild = jsxSpreadChild; + generated$2.jSXText = generated$2.jsxText = jsxText; + generated$2.labeledStatement = labeledStatement; + generated$2.logicalExpression = logicalExpression; + generated$2.memberExpression = memberExpression; + generated$2.metaProperty = metaProperty; + generated$2.mixedTypeAnnotation = mixedTypeAnnotation; + generated$2.moduleExpression = moduleExpression; + generated$2.newExpression = newExpression; + generated$2.noop = noop; + generated$2.nullLiteral = nullLiteral; + generated$2.nullLiteralTypeAnnotation = nullLiteralTypeAnnotation; + generated$2.nullableTypeAnnotation = nullableTypeAnnotation; + generated$2.numberLiteral = NumberLiteral; + generated$2.numberLiteralTypeAnnotation = numberLiteralTypeAnnotation; + generated$2.numberTypeAnnotation = numberTypeAnnotation; + generated$2.numericLiteral = numericLiteral; + generated$2.objectExpression = objectExpression; + generated$2.objectMethod = objectMethod; + generated$2.objectPattern = objectPattern; + generated$2.objectProperty = objectProperty; + generated$2.objectTypeAnnotation = objectTypeAnnotation; + generated$2.objectTypeCallProperty = objectTypeCallProperty; + generated$2.objectTypeIndexer = objectTypeIndexer; + generated$2.objectTypeInternalSlot = objectTypeInternalSlot; + generated$2.objectTypeProperty = objectTypeProperty; + generated$2.objectTypeSpreadProperty = objectTypeSpreadProperty; + generated$2.opaqueType = opaqueType; + generated$2.optionalCallExpression = optionalCallExpression; + generated$2.optionalIndexedAccessType = optionalIndexedAccessType; + generated$2.optionalMemberExpression = optionalMemberExpression; + generated$2.parenthesizedExpression = parenthesizedExpression; + generated$2.pipelineBareFunction = pipelineBareFunction; + generated$2.pipelinePrimaryTopicReference = pipelinePrimaryTopicReference; + generated$2.pipelineTopicExpression = pipelineTopicExpression; + generated$2.placeholder = placeholder; + generated$2.privateName = privateName; + generated$2.program = program; + generated$2.qualifiedTypeIdentifier = qualifiedTypeIdentifier; + generated$2.recordExpression = recordExpression; + generated$2.regExpLiteral = regExpLiteral; + generated$2.regexLiteral = RegexLiteral; + generated$2.restElement = restElement; + generated$2.restProperty = RestProperty; + generated$2.returnStatement = returnStatement; + generated$2.sequenceExpression = sequenceExpression; + generated$2.spreadElement = spreadElement; + generated$2.spreadProperty = SpreadProperty; + generated$2.staticBlock = staticBlock; + generated$2.stringLiteral = stringLiteral; + generated$2.stringLiteralTypeAnnotation = stringLiteralTypeAnnotation; + generated$2.stringTypeAnnotation = stringTypeAnnotation; + generated$2.super = _super; + generated$2.switchCase = switchCase; + generated$2.switchStatement = switchStatement; + generated$2.symbolTypeAnnotation = symbolTypeAnnotation; + generated$2.taggedTemplateExpression = taggedTemplateExpression; + generated$2.templateElement = templateElement; + generated$2.templateLiteral = templateLiteral; + generated$2.thisExpression = thisExpression; + generated$2.thisTypeAnnotation = thisTypeAnnotation; + generated$2.throwStatement = throwStatement; + generated$2.topicReference = topicReference; + generated$2.tryStatement = tryStatement; + generated$2.tSAnyKeyword = generated$2.tsAnyKeyword = tsAnyKeyword; + generated$2.tSArrayType = generated$2.tsArrayType = tsArrayType; + generated$2.tSAsExpression = generated$2.tsAsExpression = tsAsExpression; + generated$2.tSBigIntKeyword = generated$2.tsBigIntKeyword = tsBigIntKeyword; + generated$2.tSBooleanKeyword = generated$2.tsBooleanKeyword = tsBooleanKeyword; + generated$2.tSCallSignatureDeclaration = generated$2.tsCallSignatureDeclaration = tsCallSignatureDeclaration; + generated$2.tSConditionalType = generated$2.tsConditionalType = tsConditionalType; + generated$2.tSConstructSignatureDeclaration = generated$2.tsConstructSignatureDeclaration = tsConstructSignatureDeclaration; + generated$2.tSConstructorType = generated$2.tsConstructorType = tsConstructorType; + generated$2.tSDeclareFunction = generated$2.tsDeclareFunction = tsDeclareFunction; + generated$2.tSDeclareMethod = generated$2.tsDeclareMethod = tsDeclareMethod; + generated$2.tSEnumDeclaration = generated$2.tsEnumDeclaration = tsEnumDeclaration; + generated$2.tSEnumMember = generated$2.tsEnumMember = tsEnumMember; + generated$2.tSExportAssignment = generated$2.tsExportAssignment = tsExportAssignment; + generated$2.tSExpressionWithTypeArguments = generated$2.tsExpressionWithTypeArguments = tsExpressionWithTypeArguments; + generated$2.tSExternalModuleReference = generated$2.tsExternalModuleReference = tsExternalModuleReference; + generated$2.tSFunctionType = generated$2.tsFunctionType = tsFunctionType; + generated$2.tSImportEqualsDeclaration = generated$2.tsImportEqualsDeclaration = tsImportEqualsDeclaration; + generated$2.tSImportType = generated$2.tsImportType = tsImportType; + generated$2.tSIndexSignature = generated$2.tsIndexSignature = tsIndexSignature; + generated$2.tSIndexedAccessType = generated$2.tsIndexedAccessType = tsIndexedAccessType; + generated$2.tSInferType = generated$2.tsInferType = tsInferType; + generated$2.tSInstantiationExpression = generated$2.tsInstantiationExpression = tsInstantiationExpression; + generated$2.tSInterfaceBody = generated$2.tsInterfaceBody = tsInterfaceBody; + generated$2.tSInterfaceDeclaration = generated$2.tsInterfaceDeclaration = tsInterfaceDeclaration; + generated$2.tSIntersectionType = generated$2.tsIntersectionType = tsIntersectionType; + generated$2.tSIntrinsicKeyword = generated$2.tsIntrinsicKeyword = tsIntrinsicKeyword; + generated$2.tSLiteralType = generated$2.tsLiteralType = tsLiteralType; + generated$2.tSMappedType = generated$2.tsMappedType = tsMappedType; + generated$2.tSMethodSignature = generated$2.tsMethodSignature = tsMethodSignature; + generated$2.tSModuleBlock = generated$2.tsModuleBlock = tsModuleBlock; + generated$2.tSModuleDeclaration = generated$2.tsModuleDeclaration = tsModuleDeclaration; + generated$2.tSNamedTupleMember = generated$2.tsNamedTupleMember = tsNamedTupleMember; + generated$2.tSNamespaceExportDeclaration = generated$2.tsNamespaceExportDeclaration = tsNamespaceExportDeclaration; + generated$2.tSNeverKeyword = generated$2.tsNeverKeyword = tsNeverKeyword; + generated$2.tSNonNullExpression = generated$2.tsNonNullExpression = tsNonNullExpression; + generated$2.tSNullKeyword = generated$2.tsNullKeyword = tsNullKeyword; + generated$2.tSNumberKeyword = generated$2.tsNumberKeyword = tsNumberKeyword; + generated$2.tSObjectKeyword = generated$2.tsObjectKeyword = tsObjectKeyword; + generated$2.tSOptionalType = generated$2.tsOptionalType = tsOptionalType; + generated$2.tSParameterProperty = generated$2.tsParameterProperty = tsParameterProperty; + generated$2.tSParenthesizedType = generated$2.tsParenthesizedType = tsParenthesizedType; + generated$2.tSPropertySignature = generated$2.tsPropertySignature = tsPropertySignature; + generated$2.tSQualifiedName = generated$2.tsQualifiedName = tsQualifiedName; + generated$2.tSRestType = generated$2.tsRestType = tsRestType; + generated$2.tSSatisfiesExpression = generated$2.tsSatisfiesExpression = tsSatisfiesExpression; + generated$2.tSStringKeyword = generated$2.tsStringKeyword = tsStringKeyword; + generated$2.tSSymbolKeyword = generated$2.tsSymbolKeyword = tsSymbolKeyword; + generated$2.tSThisType = generated$2.tsThisType = tsThisType; + generated$2.tSTupleType = generated$2.tsTupleType = tsTupleType; + generated$2.tSTypeAliasDeclaration = generated$2.tsTypeAliasDeclaration = tsTypeAliasDeclaration; + generated$2.tSTypeAnnotation = generated$2.tsTypeAnnotation = tsTypeAnnotation; + generated$2.tSTypeAssertion = generated$2.tsTypeAssertion = tsTypeAssertion; + generated$2.tSTypeLiteral = generated$2.tsTypeLiteral = tsTypeLiteral; + generated$2.tSTypeOperator = generated$2.tsTypeOperator = tsTypeOperator; + generated$2.tSTypeParameter = generated$2.tsTypeParameter = tsTypeParameter; + generated$2.tSTypeParameterDeclaration = generated$2.tsTypeParameterDeclaration = tsTypeParameterDeclaration; + generated$2.tSTypeParameterInstantiation = generated$2.tsTypeParameterInstantiation = tsTypeParameterInstantiation; + generated$2.tSTypePredicate = generated$2.tsTypePredicate = tsTypePredicate; + generated$2.tSTypeQuery = generated$2.tsTypeQuery = tsTypeQuery; + generated$2.tSTypeReference = generated$2.tsTypeReference = tsTypeReference; + generated$2.tSUndefinedKeyword = generated$2.tsUndefinedKeyword = tsUndefinedKeyword; + generated$2.tSUnionType = generated$2.tsUnionType = tsUnionType; + generated$2.tSUnknownKeyword = generated$2.tsUnknownKeyword = tsUnknownKeyword; + generated$2.tSVoidKeyword = generated$2.tsVoidKeyword = tsVoidKeyword; + generated$2.tupleExpression = tupleExpression; + generated$2.tupleTypeAnnotation = tupleTypeAnnotation; + generated$2.typeAlias = typeAlias; + generated$2.typeAnnotation = typeAnnotation; + generated$2.typeCastExpression = typeCastExpression; + generated$2.typeParameter = typeParameter; + generated$2.typeParameterDeclaration = typeParameterDeclaration; + generated$2.typeParameterInstantiation = typeParameterInstantiation; + generated$2.typeofTypeAnnotation = typeofTypeAnnotation; + generated$2.unaryExpression = unaryExpression; + generated$2.unionTypeAnnotation = unionTypeAnnotation; + generated$2.updateExpression = updateExpression; + generated$2.v8IntrinsicIdentifier = v8IntrinsicIdentifier; + generated$2.variableDeclaration = variableDeclaration; + generated$2.variableDeclarator = variableDeclarator; + generated$2.variance = variance; + generated$2.voidTypeAnnotation = voidTypeAnnotation; + generated$2.whileStatement = whileStatement; + generated$2.withStatement = withStatement; + generated$2.yieldExpression = yieldExpression; + var _validate = requireValidate(); + var _deprecationWarning = requireDeprecationWarning(); + var utils = requireUtils(); + const { + validateInternal: validate + } = _validate; + const { + NODE_FIELDS + } = utils; + function arrayExpression(elements = []) { + const node = { + type: "ArrayExpression", + elements + }; + const defs = NODE_FIELDS.ArrayExpression; + validate(defs.elements, node, "elements", elements, 1); + return node; + } + function assignmentExpression(operator, left, right) { + const node = { + type: "AssignmentExpression", + operator, + left, + right + }; + const defs = NODE_FIELDS.AssignmentExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function binaryExpression(operator, left, right) { + const node = { + type: "BinaryExpression", + operator, + left, + right + }; + const defs = NODE_FIELDS.BinaryExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function interpreterDirective(value) { + const node = { + type: "InterpreterDirective", + value + }; + const defs = NODE_FIELDS.InterpreterDirective; + validate(defs.value, node, "value", value); + return node; + } + function directive(value) { + const node = { + type: "Directive", + value + }; + const defs = NODE_FIELDS.Directive; + validate(defs.value, node, "value", value, 1); + return node; + } + function directiveLiteral(value) { + const node = { + type: "DirectiveLiteral", + value + }; + const defs = NODE_FIELDS.DirectiveLiteral; + validate(defs.value, node, "value", value); + return node; + } + function blockStatement(body, directives = []) { + const node = { + type: "BlockStatement", + body, + directives + }; + const defs = NODE_FIELDS.BlockStatement; + validate(defs.body, node, "body", body, 1); + validate(defs.directives, node, "directives", directives, 1); + return node; + } + function breakStatement(label = null) { + const node = { + type: "BreakStatement", + label + }; + const defs = NODE_FIELDS.BreakStatement; + validate(defs.label, node, "label", label, 1); + return node; + } + function callExpression(callee, _arguments) { + const node = { + type: "CallExpression", + callee, + arguments: _arguments + }; + const defs = NODE_FIELDS.CallExpression; + validate(defs.callee, node, "callee", callee, 1); + validate(defs.arguments, node, "arguments", _arguments, 1); + return node; + } + function catchClause(param = null, body) { + const node = { + type: "CatchClause", + param, + body + }; + const defs = NODE_FIELDS.CatchClause; + validate(defs.param, node, "param", param, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function conditionalExpression(test, consequent, alternate) { + const node = { + type: "ConditionalExpression", + test, + consequent, + alternate + }; + const defs = NODE_FIELDS.ConditionalExpression; + validate(defs.test, node, "test", test, 1); + validate(defs.consequent, node, "consequent", consequent, 1); + validate(defs.alternate, node, "alternate", alternate, 1); + return node; + } + function continueStatement(label = null) { + const node = { + type: "ContinueStatement", + label + }; + const defs = NODE_FIELDS.ContinueStatement; + validate(defs.label, node, "label", label, 1); + return node; + } + function debuggerStatement() { + return { + type: "DebuggerStatement" + }; + } + function doWhileStatement(test, body) { + const node = { + type: "DoWhileStatement", + test, + body + }; + const defs = NODE_FIELDS.DoWhileStatement; + validate(defs.test, node, "test", test, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function emptyStatement() { + return { + type: "EmptyStatement" + }; + } + function expressionStatement(expression) { + const node = { + type: "ExpressionStatement", + expression + }; + const defs = NODE_FIELDS.ExpressionStatement; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function file(program, comments = null, tokens = null) { + const node = { + type: "File", + program, + comments, + tokens + }; + const defs = NODE_FIELDS.File; + validate(defs.program, node, "program", program, 1); + validate(defs.comments, node, "comments", comments, 1); + validate(defs.tokens, node, "tokens", tokens); + return node; + } + function forInStatement(left, right, body) { + const node = { + type: "ForInStatement", + left, + right, + body + }; + const defs = NODE_FIELDS.ForInStatement; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function forStatement(init = null, test = null, update = null, body) { + const node = { + type: "ForStatement", + init, + test, + update, + body + }; + const defs = NODE_FIELDS.ForStatement; + validate(defs.init, node, "init", init, 1); + validate(defs.test, node, "test", test, 1); + validate(defs.update, node, "update", update, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function functionDeclaration(id = null, params, body, generator = false, async = false) { + const node = { + type: "FunctionDeclaration", + id, + params, + body, + generator, + async + }; + const defs = NODE_FIELDS.FunctionDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function functionExpression(id = null, params, body, generator = false, async = false) { + const node = { + type: "FunctionExpression", + id, + params, + body, + generator, + async + }; + const defs = NODE_FIELDS.FunctionExpression; + validate(defs.id, node, "id", id, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function identifier(name) { + const node = { + type: "Identifier", + name + }; + const defs = NODE_FIELDS.Identifier; + validate(defs.name, node, "name", name); + return node; + } + function ifStatement(test, consequent, alternate = null) { + const node = { + type: "IfStatement", + test, + consequent, + alternate + }; + const defs = NODE_FIELDS.IfStatement; + validate(defs.test, node, "test", test, 1); + validate(defs.consequent, node, "consequent", consequent, 1); + validate(defs.alternate, node, "alternate", alternate, 1); + return node; + } + function labeledStatement(label, body) { + const node = { + type: "LabeledStatement", + label, + body + }; + const defs = NODE_FIELDS.LabeledStatement; + validate(defs.label, node, "label", label, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function stringLiteral(value) { + const node = { + type: "StringLiteral", + value + }; + const defs = NODE_FIELDS.StringLiteral; + validate(defs.value, node, "value", value); + return node; + } + function numericLiteral(value) { + const node = { + type: "NumericLiteral", + value + }; + const defs = NODE_FIELDS.NumericLiteral; + validate(defs.value, node, "value", value); + return node; + } + function nullLiteral() { + return { + type: "NullLiteral" + }; + } + function booleanLiteral(value) { + const node = { + type: "BooleanLiteral", + value + }; + const defs = NODE_FIELDS.BooleanLiteral; + validate(defs.value, node, "value", value); + return node; + } + function regExpLiteral(pattern, flags = "") { + const node = { + type: "RegExpLiteral", + pattern, + flags + }; + const defs = NODE_FIELDS.RegExpLiteral; + validate(defs.pattern, node, "pattern", pattern); + validate(defs.flags, node, "flags", flags); + return node; + } + function logicalExpression(operator, left, right) { + const node = { + type: "LogicalExpression", + operator, + left, + right + }; + const defs = NODE_FIELDS.LogicalExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function memberExpression(object, property, computed = false, optional = null) { + const node = { + type: "MemberExpression", + object, + property, + computed, + optional + }; + const defs = NODE_FIELDS.MemberExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.property, node, "property", property, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.optional, node, "optional", optional); + return node; + } + function newExpression(callee, _arguments) { + const node = { + type: "NewExpression", + callee, + arguments: _arguments + }; + const defs = NODE_FIELDS.NewExpression; + validate(defs.callee, node, "callee", callee, 1); + validate(defs.arguments, node, "arguments", _arguments, 1); + return node; + } + function program(body, directives = [], sourceType = "script", interpreter = null) { + const node = { + type: "Program", + body, + directives, + sourceType, + interpreter + }; + const defs = NODE_FIELDS.Program; + validate(defs.body, node, "body", body, 1); + validate(defs.directives, node, "directives", directives, 1); + validate(defs.sourceType, node, "sourceType", sourceType); + validate(defs.interpreter, node, "interpreter", interpreter, 1); + return node; + } + function objectExpression(properties) { + const node = { + type: "ObjectExpression", + properties + }; + const defs = NODE_FIELDS.ObjectExpression; + validate(defs.properties, node, "properties", properties, 1); + return node; + } + function objectMethod(kind = "method", key, params, body, computed = false, generator = false, async = false) { + const node = { + type: "ObjectMethod", + kind, + key, + params, + body, + computed, + generator, + async + }; + const defs = NODE_FIELDS.ObjectMethod; + validate(defs.kind, node, "kind", kind); + validate(defs.key, node, "key", key, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function objectProperty(key, value, computed = false, shorthand = false, decorators = null) { + const node = { + type: "ObjectProperty", + key, + value, + computed, + shorthand, + decorators + }; + const defs = NODE_FIELDS.ObjectProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.shorthand, node, "shorthand", shorthand); + validate(defs.decorators, node, "decorators", decorators, 1); + return node; + } + function restElement(argument) { + const node = { + type: "RestElement", + argument + }; + const defs = NODE_FIELDS.RestElement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function returnStatement(argument = null) { + const node = { + type: "ReturnStatement", + argument + }; + const defs = NODE_FIELDS.ReturnStatement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function sequenceExpression(expressions) { + const node = { + type: "SequenceExpression", + expressions + }; + const defs = NODE_FIELDS.SequenceExpression; + validate(defs.expressions, node, "expressions", expressions, 1); + return node; + } + function parenthesizedExpression(expression) { + const node = { + type: "ParenthesizedExpression", + expression + }; + const defs = NODE_FIELDS.ParenthesizedExpression; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function switchCase(test = null, consequent) { + const node = { + type: "SwitchCase", + test, + consequent + }; + const defs = NODE_FIELDS.SwitchCase; + validate(defs.test, node, "test", test, 1); + validate(defs.consequent, node, "consequent", consequent, 1); + return node; + } + function switchStatement(discriminant, cases) { + const node = { + type: "SwitchStatement", + discriminant, + cases + }; + const defs = NODE_FIELDS.SwitchStatement; + validate(defs.discriminant, node, "discriminant", discriminant, 1); + validate(defs.cases, node, "cases", cases, 1); + return node; + } + function thisExpression() { + return { + type: "ThisExpression" + }; + } + function throwStatement(argument) { + const node = { + type: "ThrowStatement", + argument + }; + const defs = NODE_FIELDS.ThrowStatement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function tryStatement(block, handler = null, finalizer = null) { + const node = { + type: "TryStatement", + block, + handler, + finalizer + }; + const defs = NODE_FIELDS.TryStatement; + validate(defs.block, node, "block", block, 1); + validate(defs.handler, node, "handler", handler, 1); + validate(defs.finalizer, node, "finalizer", finalizer, 1); + return node; + } + function unaryExpression(operator, argument, prefix = true) { + const node = { + type: "UnaryExpression", + operator, + argument, + prefix + }; + const defs = NODE_FIELDS.UnaryExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.argument, node, "argument", argument, 1); + validate(defs.prefix, node, "prefix", prefix); + return node; + } + function updateExpression(operator, argument, prefix = false) { + const node = { + type: "UpdateExpression", + operator, + argument, + prefix + }; + const defs = NODE_FIELDS.UpdateExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.argument, node, "argument", argument, 1); + validate(defs.prefix, node, "prefix", prefix); + return node; + } + function variableDeclaration(kind, declarations) { + const node = { + type: "VariableDeclaration", + kind, + declarations + }; + const defs = NODE_FIELDS.VariableDeclaration; + validate(defs.kind, node, "kind", kind); + validate(defs.declarations, node, "declarations", declarations, 1); + return node; + } + function variableDeclarator(id, init = null) { + const node = { + type: "VariableDeclarator", + id, + init + }; + const defs = NODE_FIELDS.VariableDeclarator; + validate(defs.id, node, "id", id, 1); + validate(defs.init, node, "init", init, 1); + return node; + } + function whileStatement(test, body) { + const node = { + type: "WhileStatement", + test, + body + }; + const defs = NODE_FIELDS.WhileStatement; + validate(defs.test, node, "test", test, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function withStatement(object, body) { + const node = { + type: "WithStatement", + object, + body + }; + const defs = NODE_FIELDS.WithStatement; + validate(defs.object, node, "object", object, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function assignmentPattern(left, right) { + const node = { + type: "AssignmentPattern", + left, + right + }; + const defs = NODE_FIELDS.AssignmentPattern; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function arrayPattern(elements) { + const node = { + type: "ArrayPattern", + elements + }; + const defs = NODE_FIELDS.ArrayPattern; + validate(defs.elements, node, "elements", elements, 1); + return node; + } + function arrowFunctionExpression(params, body, async = false) { + const node = { + type: "ArrowFunctionExpression", + params, + body, + async, + expression: null + }; + const defs = NODE_FIELDS.ArrowFunctionExpression; + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.async, node, "async", async); + return node; + } + function classBody(body) { + const node = { + type: "ClassBody", + body + }; + const defs = NODE_FIELDS.ClassBody; + validate(defs.body, node, "body", body, 1); + return node; + } + function classExpression(id = null, superClass = null, body, decorators = null) { + const node = { + type: "ClassExpression", + id, + superClass, + body, + decorators + }; + const defs = NODE_FIELDS.ClassExpression; + validate(defs.id, node, "id", id, 1); + validate(defs.superClass, node, "superClass", superClass, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + return node; + } + function classDeclaration(id = null, superClass = null, body, decorators = null) { + const node = { + type: "ClassDeclaration", + id, + superClass, + body, + decorators + }; + const defs = NODE_FIELDS.ClassDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.superClass, node, "superClass", superClass, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + return node; + } + function exportAllDeclaration(source) { + const node = { + type: "ExportAllDeclaration", + source + }; + const defs = NODE_FIELDS.ExportAllDeclaration; + validate(defs.source, node, "source", source, 1); + return node; + } + function exportDefaultDeclaration(declaration) { + const node = { + type: "ExportDefaultDeclaration", + declaration + }; + const defs = NODE_FIELDS.ExportDefaultDeclaration; + validate(defs.declaration, node, "declaration", declaration, 1); + return node; + } + function exportNamedDeclaration(declaration = null, specifiers = [], source = null) { + const node = { + type: "ExportNamedDeclaration", + declaration, + specifiers, + source + }; + const defs = NODE_FIELDS.ExportNamedDeclaration; + validate(defs.declaration, node, "declaration", declaration, 1); + validate(defs.specifiers, node, "specifiers", specifiers, 1); + validate(defs.source, node, "source", source, 1); + return node; + } + function exportSpecifier(local, exported) { + const node = { + type: "ExportSpecifier", + local, + exported + }; + const defs = NODE_FIELDS.ExportSpecifier; + validate(defs.local, node, "local", local, 1); + validate(defs.exported, node, "exported", exported, 1); + return node; + } + function forOfStatement(left, right, body, _await = false) { + const node = { + type: "ForOfStatement", + left, + right, + body, + await: _await + }; + const defs = NODE_FIELDS.ForOfStatement; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.await, node, "await", _await); + return node; + } + function importDeclaration(specifiers, source) { + const node = { + type: "ImportDeclaration", + specifiers, + source + }; + const defs = NODE_FIELDS.ImportDeclaration; + validate(defs.specifiers, node, "specifiers", specifiers, 1); + validate(defs.source, node, "source", source, 1); + return node; + } + function importDefaultSpecifier(local) { + const node = { + type: "ImportDefaultSpecifier", + local + }; + const defs = NODE_FIELDS.ImportDefaultSpecifier; + validate(defs.local, node, "local", local, 1); + return node; + } + function importNamespaceSpecifier(local) { + const node = { + type: "ImportNamespaceSpecifier", + local + }; + const defs = NODE_FIELDS.ImportNamespaceSpecifier; + validate(defs.local, node, "local", local, 1); + return node; + } + function importSpecifier(local, imported) { + const node = { + type: "ImportSpecifier", + local, + imported + }; + const defs = NODE_FIELDS.ImportSpecifier; + validate(defs.local, node, "local", local, 1); + validate(defs.imported, node, "imported", imported, 1); + return node; + } + function importExpression(source, options = null) { + const node = { + type: "ImportExpression", + source, + options + }; + const defs = NODE_FIELDS.ImportExpression; + validate(defs.source, node, "source", source, 1); + validate(defs.options, node, "options", options, 1); + return node; + } + function metaProperty(meta, property) { + const node = { + type: "MetaProperty", + meta, + property + }; + const defs = NODE_FIELDS.MetaProperty; + validate(defs.meta, node, "meta", meta, 1); + validate(defs.property, node, "property", property, 1); + return node; + } + function classMethod(kind = "method", key, params, body, computed = false, _static = false, generator = false, async = false) { + const node = { + type: "ClassMethod", + kind, + key, + params, + body, + computed, + static: _static, + generator, + async + }; + const defs = NODE_FIELDS.ClassMethod; + validate(defs.kind, node, "kind", kind); + validate(defs.key, node, "key", key, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.static, node, "static", _static); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function objectPattern(properties) { + const node = { + type: "ObjectPattern", + properties + }; + const defs = NODE_FIELDS.ObjectPattern; + validate(defs.properties, node, "properties", properties, 1); + return node; + } + function spreadElement(argument) { + const node = { + type: "SpreadElement", + argument + }; + const defs = NODE_FIELDS.SpreadElement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function _super() { + return { + type: "Super" + }; + } + function taggedTemplateExpression(tag, quasi) { + const node = { + type: "TaggedTemplateExpression", + tag, + quasi + }; + const defs = NODE_FIELDS.TaggedTemplateExpression; + validate(defs.tag, node, "tag", tag, 1); + validate(defs.quasi, node, "quasi", quasi, 1); + return node; + } + function templateElement(value, tail = false) { + const node = { + type: "TemplateElement", + value, + tail + }; + const defs = NODE_FIELDS.TemplateElement; + validate(defs.value, node, "value", value); + validate(defs.tail, node, "tail", tail); + return node; + } + function templateLiteral(quasis, expressions) { + const node = { + type: "TemplateLiteral", + quasis, + expressions + }; + const defs = NODE_FIELDS.TemplateLiteral; + validate(defs.quasis, node, "quasis", quasis, 1); + validate(defs.expressions, node, "expressions", expressions, 1); + return node; + } + function yieldExpression(argument = null, delegate = false) { + const node = { + type: "YieldExpression", + argument, + delegate + }; + const defs = NODE_FIELDS.YieldExpression; + validate(defs.argument, node, "argument", argument, 1); + validate(defs.delegate, node, "delegate", delegate); + return node; + } + function awaitExpression(argument) { + const node = { + type: "AwaitExpression", + argument + }; + const defs = NODE_FIELDS.AwaitExpression; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function _import() { + return { + type: "Import" + }; + } + function bigIntLiteral(value) { + const node = { + type: "BigIntLiteral", + value + }; + const defs = NODE_FIELDS.BigIntLiteral; + validate(defs.value, node, "value", value); + return node; + } + function exportNamespaceSpecifier(exported) { + const node = { + type: "ExportNamespaceSpecifier", + exported + }; + const defs = NODE_FIELDS.ExportNamespaceSpecifier; + validate(defs.exported, node, "exported", exported, 1); + return node; + } + function optionalMemberExpression(object, property, computed = false, optional) { + const node = { + type: "OptionalMemberExpression", + object, + property, + computed, + optional + }; + const defs = NODE_FIELDS.OptionalMemberExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.property, node, "property", property, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.optional, node, "optional", optional); + return node; + } + function optionalCallExpression(callee, _arguments, optional) { + const node = { + type: "OptionalCallExpression", + callee, + arguments: _arguments, + optional + }; + const defs = NODE_FIELDS.OptionalCallExpression; + validate(defs.callee, node, "callee", callee, 1); + validate(defs.arguments, node, "arguments", _arguments, 1); + validate(defs.optional, node, "optional", optional); + return node; + } + function classProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) { + const node = { + type: "ClassProperty", + key, + value, + typeAnnotation, + decorators, + computed, + static: _static + }; + const defs = NODE_FIELDS.ClassProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.static, node, "static", _static); + return node; + } + function classAccessorProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) { + const node = { + type: "ClassAccessorProperty", + key, + value, + typeAnnotation, + decorators, + computed, + static: _static + }; + const defs = NODE_FIELDS.ClassAccessorProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.static, node, "static", _static); + return node; + } + function classPrivateProperty(key, value = null, decorators = null, _static = false) { + const node = { + type: "ClassPrivateProperty", + key, + value, + decorators, + static: _static + }; + const defs = NODE_FIELDS.ClassPrivateProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.static, node, "static", _static); + return node; + } + function classPrivateMethod(kind = "method", key, params, body, _static = false) { + const node = { + type: "ClassPrivateMethod", + kind, + key, + params, + body, + static: _static + }; + const defs = NODE_FIELDS.ClassPrivateMethod; + validate(defs.kind, node, "kind", kind); + validate(defs.key, node, "key", key, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.static, node, "static", _static); + return node; + } + function privateName(id) { + const node = { + type: "PrivateName", + id + }; + const defs = NODE_FIELDS.PrivateName; + validate(defs.id, node, "id", id, 1); + return node; + } + function staticBlock(body) { + const node = { + type: "StaticBlock", + body + }; + const defs = NODE_FIELDS.StaticBlock; + validate(defs.body, node, "body", body, 1); + return node; + } + function anyTypeAnnotation() { + return { + type: "AnyTypeAnnotation" + }; + } + function arrayTypeAnnotation(elementType) { + const node = { + type: "ArrayTypeAnnotation", + elementType + }; + const defs = NODE_FIELDS.ArrayTypeAnnotation; + validate(defs.elementType, node, "elementType", elementType, 1); + return node; + } + function booleanTypeAnnotation() { + return { + type: "BooleanTypeAnnotation" + }; + } + function booleanLiteralTypeAnnotation(value) { + const node = { + type: "BooleanLiteralTypeAnnotation", + value + }; + const defs = NODE_FIELDS.BooleanLiteralTypeAnnotation; + validate(defs.value, node, "value", value); + return node; + } + function nullLiteralTypeAnnotation() { + return { + type: "NullLiteralTypeAnnotation" + }; + } + function classImplements(id, typeParameters = null) { + const node = { + type: "ClassImplements", + id, + typeParameters + }; + const defs = NODE_FIELDS.ClassImplements; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function declareClass(id, typeParameters = null, _extends = null, body) { + const node = { + type: "DeclareClass", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.DeclareClass; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function declareFunction(id) { + const node = { + type: "DeclareFunction", + id + }; + const defs = NODE_FIELDS.DeclareFunction; + validate(defs.id, node, "id", id, 1); + return node; + } + function declareInterface(id, typeParameters = null, _extends = null, body) { + const node = { + type: "DeclareInterface", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.DeclareInterface; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function declareModule(id, body, kind = null) { + const node = { + type: "DeclareModule", + id, + body, + kind + }; + const defs = NODE_FIELDS.DeclareModule; + validate(defs.id, node, "id", id, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.kind, node, "kind", kind); + return node; + } + function declareModuleExports(typeAnnotation) { + const node = { + type: "DeclareModuleExports", + typeAnnotation + }; + const defs = NODE_FIELDS.DeclareModuleExports; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function declareTypeAlias(id, typeParameters = null, right) { + const node = { + type: "DeclareTypeAlias", + id, + typeParameters, + right + }; + const defs = NODE_FIELDS.DeclareTypeAlias; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function declareOpaqueType(id, typeParameters = null, supertype = null) { + const node = { + type: "DeclareOpaqueType", + id, + typeParameters, + supertype + }; + const defs = NODE_FIELDS.DeclareOpaqueType; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.supertype, node, "supertype", supertype, 1); + return node; + } + function declareVariable(id) { + const node = { + type: "DeclareVariable", + id + }; + const defs = NODE_FIELDS.DeclareVariable; + validate(defs.id, node, "id", id, 1); + return node; + } + function declareExportDeclaration(declaration = null, specifiers = null, source = null, attributes = null) { + const node = { + type: "DeclareExportDeclaration", + declaration, + specifiers, + source, + attributes + }; + const defs = NODE_FIELDS.DeclareExportDeclaration; + validate(defs.declaration, node, "declaration", declaration, 1); + validate(defs.specifiers, node, "specifiers", specifiers, 1); + validate(defs.source, node, "source", source, 1); + validate(defs.attributes, node, "attributes", attributes, 1); + return node; + } + function declareExportAllDeclaration(source, attributes = null) { + const node = { + type: "DeclareExportAllDeclaration", + source, + attributes + }; + const defs = NODE_FIELDS.DeclareExportAllDeclaration; + validate(defs.source, node, "source", source, 1); + validate(defs.attributes, node, "attributes", attributes, 1); + return node; + } + function declaredPredicate(value) { + const node = { + type: "DeclaredPredicate", + value + }; + const defs = NODE_FIELDS.DeclaredPredicate; + validate(defs.value, node, "value", value, 1); + return node; + } + function existsTypeAnnotation() { + return { + type: "ExistsTypeAnnotation" + }; + } + function functionTypeAnnotation(typeParameters = null, params, rest = null, returnType) { + const node = { + type: "FunctionTypeAnnotation", + typeParameters, + params, + rest, + returnType + }; + const defs = NODE_FIELDS.FunctionTypeAnnotation; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.rest, node, "rest", rest, 1); + validate(defs.returnType, node, "returnType", returnType, 1); + return node; + } + function functionTypeParam(name = null, typeAnnotation) { + const node = { + type: "FunctionTypeParam", + name, + typeAnnotation + }; + const defs = NODE_FIELDS.FunctionTypeParam; + validate(defs.name, node, "name", name, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function genericTypeAnnotation(id, typeParameters = null) { + const node = { + type: "GenericTypeAnnotation", + id, + typeParameters + }; + const defs = NODE_FIELDS.GenericTypeAnnotation; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function inferredPredicate() { + return { + type: "InferredPredicate" + }; + } + function interfaceExtends(id, typeParameters = null) { + const node = { + type: "InterfaceExtends", + id, + typeParameters + }; + const defs = NODE_FIELDS.InterfaceExtends; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function interfaceDeclaration(id, typeParameters = null, _extends = null, body) { + const node = { + type: "InterfaceDeclaration", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.InterfaceDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function interfaceTypeAnnotation(_extends = null, body) { + const node = { + type: "InterfaceTypeAnnotation", + extends: _extends, + body + }; + const defs = NODE_FIELDS.InterfaceTypeAnnotation; + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function intersectionTypeAnnotation(types) { + const node = { + type: "IntersectionTypeAnnotation", + types + }; + const defs = NODE_FIELDS.IntersectionTypeAnnotation; + validate(defs.types, node, "types", types, 1); + return node; + } + function mixedTypeAnnotation() { + return { + type: "MixedTypeAnnotation" + }; + } + function emptyTypeAnnotation() { + return { + type: "EmptyTypeAnnotation" + }; + } + function nullableTypeAnnotation(typeAnnotation) { + const node = { + type: "NullableTypeAnnotation", + typeAnnotation + }; + const defs = NODE_FIELDS.NullableTypeAnnotation; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function numberLiteralTypeAnnotation(value) { + const node = { + type: "NumberLiteralTypeAnnotation", + value + }; + const defs = NODE_FIELDS.NumberLiteralTypeAnnotation; + validate(defs.value, node, "value", value); + return node; + } + function numberTypeAnnotation() { + return { + type: "NumberTypeAnnotation" + }; + } + function objectTypeAnnotation(properties, indexers = [], callProperties = [], internalSlots = [], exact = false) { + const node = { + type: "ObjectTypeAnnotation", + properties, + indexers, + callProperties, + internalSlots, + exact + }; + const defs = NODE_FIELDS.ObjectTypeAnnotation; + validate(defs.properties, node, "properties", properties, 1); + validate(defs.indexers, node, "indexers", indexers, 1); + validate(defs.callProperties, node, "callProperties", callProperties, 1); + validate(defs.internalSlots, node, "internalSlots", internalSlots, 1); + validate(defs.exact, node, "exact", exact); + return node; + } + function objectTypeInternalSlot(id, value, optional, _static, method) { + const node = { + type: "ObjectTypeInternalSlot", + id, + value, + optional, + static: _static, + method + }; + const defs = NODE_FIELDS.ObjectTypeInternalSlot; + validate(defs.id, node, "id", id, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.optional, node, "optional", optional); + validate(defs.static, node, "static", _static); + validate(defs.method, node, "method", method); + return node; + } + function objectTypeCallProperty(value) { + const node = { + type: "ObjectTypeCallProperty", + value, + static: null + }; + const defs = NODE_FIELDS.ObjectTypeCallProperty; + validate(defs.value, node, "value", value, 1); + return node; + } + function objectTypeIndexer(id = null, key, value, variance = null) { + const node = { + type: "ObjectTypeIndexer", + id, + key, + value, + variance, + static: null + }; + const defs = NODE_FIELDS.ObjectTypeIndexer; + validate(defs.id, node, "id", id, 1); + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.variance, node, "variance", variance, 1); + return node; + } + function objectTypeProperty(key, value, variance = null) { + const node = { + type: "ObjectTypeProperty", + key, + value, + variance, + kind: null, + method: null, + optional: null, + proto: null, + static: null + }; + const defs = NODE_FIELDS.ObjectTypeProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.variance, node, "variance", variance, 1); + return node; + } + function objectTypeSpreadProperty(argument) { + const node = { + type: "ObjectTypeSpreadProperty", + argument + }; + const defs = NODE_FIELDS.ObjectTypeSpreadProperty; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function opaqueType(id, typeParameters = null, supertype = null, impltype) { + const node = { + type: "OpaqueType", + id, + typeParameters, + supertype, + impltype + }; + const defs = NODE_FIELDS.OpaqueType; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.supertype, node, "supertype", supertype, 1); + validate(defs.impltype, node, "impltype", impltype, 1); + return node; + } + function qualifiedTypeIdentifier(id, qualification) { + const node = { + type: "QualifiedTypeIdentifier", + id, + qualification + }; + const defs = NODE_FIELDS.QualifiedTypeIdentifier; + validate(defs.id, node, "id", id, 1); + validate(defs.qualification, node, "qualification", qualification, 1); + return node; + } + function stringLiteralTypeAnnotation(value) { + const node = { + type: "StringLiteralTypeAnnotation", + value + }; + const defs = NODE_FIELDS.StringLiteralTypeAnnotation; + validate(defs.value, node, "value", value); + return node; + } + function stringTypeAnnotation() { + return { + type: "StringTypeAnnotation" + }; + } + function symbolTypeAnnotation() { + return { + type: "SymbolTypeAnnotation" + }; + } + function thisTypeAnnotation() { + return { + type: "ThisTypeAnnotation" + }; + } + function tupleTypeAnnotation(types) { + const node = { + type: "TupleTypeAnnotation", + types + }; + const defs = NODE_FIELDS.TupleTypeAnnotation; + validate(defs.types, node, "types", types, 1); + return node; + } + function typeofTypeAnnotation(argument) { + const node = { + type: "TypeofTypeAnnotation", + argument + }; + const defs = NODE_FIELDS.TypeofTypeAnnotation; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function typeAlias(id, typeParameters = null, right) { + const node = { + type: "TypeAlias", + id, + typeParameters, + right + }; + const defs = NODE_FIELDS.TypeAlias; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function typeAnnotation(typeAnnotation) { + const node = { + type: "TypeAnnotation", + typeAnnotation + }; + const defs = NODE_FIELDS.TypeAnnotation; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function typeCastExpression(expression, typeAnnotation) { + const node = { + type: "TypeCastExpression", + expression, + typeAnnotation + }; + const defs = NODE_FIELDS.TypeCastExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function typeParameter(bound = null, _default = null, variance = null) { + const node = { + type: "TypeParameter", + bound, + default: _default, + variance, + name: null + }; + const defs = NODE_FIELDS.TypeParameter; + validate(defs.bound, node, "bound", bound, 1); + validate(defs.default, node, "default", _default, 1); + validate(defs.variance, node, "variance", variance, 1); + return node; + } + function typeParameterDeclaration(params) { + const node = { + type: "TypeParameterDeclaration", + params + }; + const defs = NODE_FIELDS.TypeParameterDeclaration; + validate(defs.params, node, "params", params, 1); + return node; + } + function typeParameterInstantiation(params) { + const node = { + type: "TypeParameterInstantiation", + params + }; + const defs = NODE_FIELDS.TypeParameterInstantiation; + validate(defs.params, node, "params", params, 1); + return node; + } + function unionTypeAnnotation(types) { + const node = { + type: "UnionTypeAnnotation", + types + }; + const defs = NODE_FIELDS.UnionTypeAnnotation; + validate(defs.types, node, "types", types, 1); + return node; + } + function variance(kind) { + const node = { + type: "Variance", + kind + }; + const defs = NODE_FIELDS.Variance; + validate(defs.kind, node, "kind", kind); + return node; + } + function voidTypeAnnotation() { + return { + type: "VoidTypeAnnotation" + }; + } + function enumDeclaration(id, body) { + const node = { + type: "EnumDeclaration", + id, + body + }; + const defs = NODE_FIELDS.EnumDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function enumBooleanBody(members) { + const node = { + type: "EnumBooleanBody", + members, + explicitType: null, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumBooleanBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumNumberBody(members) { + const node = { + type: "EnumNumberBody", + members, + explicitType: null, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumNumberBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumStringBody(members) { + const node = { + type: "EnumStringBody", + members, + explicitType: null, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumStringBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumSymbolBody(members) { + const node = { + type: "EnumSymbolBody", + members, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumSymbolBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumBooleanMember(id) { + const node = { + type: "EnumBooleanMember", + id, + init: null + }; + const defs = NODE_FIELDS.EnumBooleanMember; + validate(defs.id, node, "id", id, 1); + return node; + } + function enumNumberMember(id, init) { + const node = { + type: "EnumNumberMember", + id, + init + }; + const defs = NODE_FIELDS.EnumNumberMember; + validate(defs.id, node, "id", id, 1); + validate(defs.init, node, "init", init, 1); + return node; + } + function enumStringMember(id, init) { + const node = { + type: "EnumStringMember", + id, + init + }; + const defs = NODE_FIELDS.EnumStringMember; + validate(defs.id, node, "id", id, 1); + validate(defs.init, node, "init", init, 1); + return node; + } + function enumDefaultedMember(id) { + const node = { + type: "EnumDefaultedMember", + id + }; + const defs = NODE_FIELDS.EnumDefaultedMember; + validate(defs.id, node, "id", id, 1); + return node; + } + function indexedAccessType(objectType, indexType) { + const node = { + type: "IndexedAccessType", + objectType, + indexType + }; + const defs = NODE_FIELDS.IndexedAccessType; + validate(defs.objectType, node, "objectType", objectType, 1); + validate(defs.indexType, node, "indexType", indexType, 1); + return node; + } + function optionalIndexedAccessType(objectType, indexType) { + const node = { + type: "OptionalIndexedAccessType", + objectType, + indexType, + optional: null + }; + const defs = NODE_FIELDS.OptionalIndexedAccessType; + validate(defs.objectType, node, "objectType", objectType, 1); + validate(defs.indexType, node, "indexType", indexType, 1); + return node; + } + function jsxAttribute(name, value = null) { + const node = { + type: "JSXAttribute", + name, + value + }; + const defs = NODE_FIELDS.JSXAttribute; + validate(defs.name, node, "name", name, 1); + validate(defs.value, node, "value", value, 1); + return node; + } + function jsxClosingElement(name) { + const node = { + type: "JSXClosingElement", + name + }; + const defs = NODE_FIELDS.JSXClosingElement; + validate(defs.name, node, "name", name, 1); + return node; + } + function jsxElement(openingElement, closingElement = null, children, selfClosing = null) { + const node = { + type: "JSXElement", + openingElement, + closingElement, + children, + selfClosing + }; + const defs = NODE_FIELDS.JSXElement; + validate(defs.openingElement, node, "openingElement", openingElement, 1); + validate(defs.closingElement, node, "closingElement", closingElement, 1); + validate(defs.children, node, "children", children, 1); + validate(defs.selfClosing, node, "selfClosing", selfClosing); + return node; + } + function jsxEmptyExpression() { + return { + type: "JSXEmptyExpression" + }; + } + function jsxExpressionContainer(expression) { + const node = { + type: "JSXExpressionContainer", + expression + }; + const defs = NODE_FIELDS.JSXExpressionContainer; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function jsxSpreadChild(expression) { + const node = { + type: "JSXSpreadChild", + expression + }; + const defs = NODE_FIELDS.JSXSpreadChild; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function jsxIdentifier(name) { + const node = { + type: "JSXIdentifier", + name + }; + const defs = NODE_FIELDS.JSXIdentifier; + validate(defs.name, node, "name", name); + return node; + } + function jsxMemberExpression(object, property) { + const node = { + type: "JSXMemberExpression", + object, + property + }; + const defs = NODE_FIELDS.JSXMemberExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.property, node, "property", property, 1); + return node; + } + function jsxNamespacedName(namespace, name) { + const node = { + type: "JSXNamespacedName", + namespace, + name + }; + const defs = NODE_FIELDS.JSXNamespacedName; + validate(defs.namespace, node, "namespace", namespace, 1); + validate(defs.name, node, "name", name, 1); + return node; + } + function jsxOpeningElement(name, attributes, selfClosing = false) { + const node = { + type: "JSXOpeningElement", + name, + attributes, + selfClosing + }; + const defs = NODE_FIELDS.JSXOpeningElement; + validate(defs.name, node, "name", name, 1); + validate(defs.attributes, node, "attributes", attributes, 1); + validate(defs.selfClosing, node, "selfClosing", selfClosing); + return node; + } + function jsxSpreadAttribute(argument) { + const node = { + type: "JSXSpreadAttribute", + argument + }; + const defs = NODE_FIELDS.JSXSpreadAttribute; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function jsxText(value) { + const node = { + type: "JSXText", + value + }; + const defs = NODE_FIELDS.JSXText; + validate(defs.value, node, "value", value); + return node; + } + function jsxFragment(openingFragment, closingFragment, children) { + const node = { + type: "JSXFragment", + openingFragment, + closingFragment, + children + }; + const defs = NODE_FIELDS.JSXFragment; + validate(defs.openingFragment, node, "openingFragment", openingFragment, 1); + validate(defs.closingFragment, node, "closingFragment", closingFragment, 1); + validate(defs.children, node, "children", children, 1); + return node; + } + function jsxOpeningFragment() { + return { + type: "JSXOpeningFragment" + }; + } + function jsxClosingFragment() { + return { + type: "JSXClosingFragment" + }; + } + function noop() { + return { + type: "Noop" + }; + } + function placeholder(expectedNode, name) { + const node = { + type: "Placeholder", + expectedNode, + name + }; + const defs = NODE_FIELDS.Placeholder; + validate(defs.expectedNode, node, "expectedNode", expectedNode); + validate(defs.name, node, "name", name, 1); + return node; + } + function v8IntrinsicIdentifier(name) { + const node = { + type: "V8IntrinsicIdentifier", + name + }; + const defs = NODE_FIELDS.V8IntrinsicIdentifier; + validate(defs.name, node, "name", name); + return node; + } + function argumentPlaceholder() { + return { + type: "ArgumentPlaceholder" + }; + } + function bindExpression(object, callee) { + const node = { + type: "BindExpression", + object, + callee + }; + const defs = NODE_FIELDS.BindExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.callee, node, "callee", callee, 1); + return node; + } + function importAttribute(key, value) { + const node = { + type: "ImportAttribute", + key, + value + }; + const defs = NODE_FIELDS.ImportAttribute; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + return node; + } + function decorator(expression) { + const node = { + type: "Decorator", + expression + }; + const defs = NODE_FIELDS.Decorator; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function doExpression(body, async = false) { + const node = { + type: "DoExpression", + body, + async + }; + const defs = NODE_FIELDS.DoExpression; + validate(defs.body, node, "body", body, 1); + validate(defs.async, node, "async", async); + return node; + } + function exportDefaultSpecifier(exported) { + const node = { + type: "ExportDefaultSpecifier", + exported + }; + const defs = NODE_FIELDS.ExportDefaultSpecifier; + validate(defs.exported, node, "exported", exported, 1); + return node; + } + function recordExpression(properties) { + const node = { + type: "RecordExpression", + properties + }; + const defs = NODE_FIELDS.RecordExpression; + validate(defs.properties, node, "properties", properties, 1); + return node; + } + function tupleExpression(elements = []) { + const node = { + type: "TupleExpression", + elements + }; + const defs = NODE_FIELDS.TupleExpression; + validate(defs.elements, node, "elements", elements, 1); + return node; + } + function decimalLiteral(value) { + const node = { + type: "DecimalLiteral", + value + }; + const defs = NODE_FIELDS.DecimalLiteral; + validate(defs.value, node, "value", value); + return node; + } + function moduleExpression(body) { + const node = { + type: "ModuleExpression", + body + }; + const defs = NODE_FIELDS.ModuleExpression; + validate(defs.body, node, "body", body, 1); + return node; + } + function topicReference() { + return { + type: "TopicReference" + }; + } + function pipelineTopicExpression(expression) { + const node = { + type: "PipelineTopicExpression", + expression + }; + const defs = NODE_FIELDS.PipelineTopicExpression; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function pipelineBareFunction(callee) { + const node = { + type: "PipelineBareFunction", + callee + }; + const defs = NODE_FIELDS.PipelineBareFunction; + validate(defs.callee, node, "callee", callee, 1); + return node; + } + function pipelinePrimaryTopicReference() { + return { + type: "PipelinePrimaryTopicReference" + }; + } + function tsParameterProperty(parameter) { + const node = { + type: "TSParameterProperty", + parameter + }; + const defs = NODE_FIELDS.TSParameterProperty; + validate(defs.parameter, node, "parameter", parameter, 1); + return node; + } + function tsDeclareFunction(id = null, typeParameters = null, params, returnType = null) { + const node = { + type: "TSDeclareFunction", + id, + typeParameters, + params, + returnType + }; + const defs = NODE_FIELDS.TSDeclareFunction; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.returnType, node, "returnType", returnType, 1); + return node; + } + function tsDeclareMethod(decorators = null, key, typeParameters = null, params, returnType = null) { + const node = { + type: "TSDeclareMethod", + decorators, + key, + typeParameters, + params, + returnType + }; + const defs = NODE_FIELDS.TSDeclareMethod; + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.key, node, "key", key, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.returnType, node, "returnType", returnType, 1); + return node; + } + function tsQualifiedName(left, right) { + const node = { + type: "TSQualifiedName", + left, + right + }; + const defs = NODE_FIELDS.TSQualifiedName; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function tsCallSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSCallSignatureDeclaration", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSCallSignatureDeclaration; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsConstructSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSConstructSignatureDeclaration", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSConstructSignatureDeclaration; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsPropertySignature(key, typeAnnotation = null) { + const node = { + type: "TSPropertySignature", + key, + typeAnnotation, + kind: null + }; + const defs = NODE_FIELDS.TSPropertySignature; + validate(defs.key, node, "key", key, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsMethodSignature(key, typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSMethodSignature", + key, + typeParameters, + parameters, + typeAnnotation, + kind: null + }; + const defs = NODE_FIELDS.TSMethodSignature; + validate(defs.key, node, "key", key, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsIndexSignature(parameters, typeAnnotation = null) { + const node = { + type: "TSIndexSignature", + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSIndexSignature; + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsAnyKeyword() { + return { + type: "TSAnyKeyword" + }; + } + function tsBooleanKeyword() { + return { + type: "TSBooleanKeyword" + }; + } + function tsBigIntKeyword() { + return { + type: "TSBigIntKeyword" + }; + } + function tsIntrinsicKeyword() { + return { + type: "TSIntrinsicKeyword" + }; + } + function tsNeverKeyword() { + return { + type: "TSNeverKeyword" + }; + } + function tsNullKeyword() { + return { + type: "TSNullKeyword" + }; + } + function tsNumberKeyword() { + return { + type: "TSNumberKeyword" + }; + } + function tsObjectKeyword() { + return { + type: "TSObjectKeyword" + }; + } + function tsStringKeyword() { + return { + type: "TSStringKeyword" + }; + } + function tsSymbolKeyword() { + return { + type: "TSSymbolKeyword" + }; + } + function tsUndefinedKeyword() { + return { + type: "TSUndefinedKeyword" + }; + } + function tsUnknownKeyword() { + return { + type: "TSUnknownKeyword" + }; + } + function tsVoidKeyword() { + return { + type: "TSVoidKeyword" + }; + } + function tsThisType() { + return { + type: "TSThisType" + }; + } + function tsFunctionType(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSFunctionType", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSFunctionType; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsConstructorType(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSConstructorType", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSConstructorType; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeReference(typeName, typeParameters = null) { + const node = { + type: "TSTypeReference", + typeName, + typeParameters + }; + const defs = NODE_FIELDS.TSTypeReference; + validate(defs.typeName, node, "typeName", typeName, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsTypePredicate(parameterName, typeAnnotation = null, asserts = null) { + const node = { + type: "TSTypePredicate", + parameterName, + typeAnnotation, + asserts + }; + const defs = NODE_FIELDS.TSTypePredicate; + validate(defs.parameterName, node, "parameterName", parameterName, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.asserts, node, "asserts", asserts); + return node; + } + function tsTypeQuery(exprName, typeParameters = null) { + const node = { + type: "TSTypeQuery", + exprName, + typeParameters + }; + const defs = NODE_FIELDS.TSTypeQuery; + validate(defs.exprName, node, "exprName", exprName, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsTypeLiteral(members) { + const node = { + type: "TSTypeLiteral", + members + }; + const defs = NODE_FIELDS.TSTypeLiteral; + validate(defs.members, node, "members", members, 1); + return node; + } + function tsArrayType(elementType) { + const node = { + type: "TSArrayType", + elementType + }; + const defs = NODE_FIELDS.TSArrayType; + validate(defs.elementType, node, "elementType", elementType, 1); + return node; + } + function tsTupleType(elementTypes) { + const node = { + type: "TSTupleType", + elementTypes + }; + const defs = NODE_FIELDS.TSTupleType; + validate(defs.elementTypes, node, "elementTypes", elementTypes, 1); + return node; + } + function tsOptionalType(typeAnnotation) { + const node = { + type: "TSOptionalType", + typeAnnotation + }; + const defs = NODE_FIELDS.TSOptionalType; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsRestType(typeAnnotation) { + const node = { + type: "TSRestType", + typeAnnotation + }; + const defs = NODE_FIELDS.TSRestType; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsNamedTupleMember(label, elementType, optional = false) { + const node = { + type: "TSNamedTupleMember", + label, + elementType, + optional + }; + const defs = NODE_FIELDS.TSNamedTupleMember; + validate(defs.label, node, "label", label, 1); + validate(defs.elementType, node, "elementType", elementType, 1); + validate(defs.optional, node, "optional", optional); + return node; + } + function tsUnionType(types) { + const node = { + type: "TSUnionType", + types + }; + const defs = NODE_FIELDS.TSUnionType; + validate(defs.types, node, "types", types, 1); + return node; + } + function tsIntersectionType(types) { + const node = { + type: "TSIntersectionType", + types + }; + const defs = NODE_FIELDS.TSIntersectionType; + validate(defs.types, node, "types", types, 1); + return node; + } + function tsConditionalType(checkType, extendsType, trueType, falseType) { + const node = { + type: "TSConditionalType", + checkType, + extendsType, + trueType, + falseType + }; + const defs = NODE_FIELDS.TSConditionalType; + validate(defs.checkType, node, "checkType", checkType, 1); + validate(defs.extendsType, node, "extendsType", extendsType, 1); + validate(defs.trueType, node, "trueType", trueType, 1); + validate(defs.falseType, node, "falseType", falseType, 1); + return node; + } + function tsInferType(typeParameter) { + const node = { + type: "TSInferType", + typeParameter + }; + const defs = NODE_FIELDS.TSInferType; + validate(defs.typeParameter, node, "typeParameter", typeParameter, 1); + return node; + } + function tsParenthesizedType(typeAnnotation) { + const node = { + type: "TSParenthesizedType", + typeAnnotation + }; + const defs = NODE_FIELDS.TSParenthesizedType; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeOperator(typeAnnotation) { + const node = { + type: "TSTypeOperator", + typeAnnotation, + operator: null + }; + const defs = NODE_FIELDS.TSTypeOperator; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsIndexedAccessType(objectType, indexType) { + const node = { + type: "TSIndexedAccessType", + objectType, + indexType + }; + const defs = NODE_FIELDS.TSIndexedAccessType; + validate(defs.objectType, node, "objectType", objectType, 1); + validate(defs.indexType, node, "indexType", indexType, 1); + return node; + } + function tsMappedType(typeParameter, typeAnnotation = null, nameType = null) { + const node = { + type: "TSMappedType", + typeParameter, + typeAnnotation, + nameType + }; + const defs = NODE_FIELDS.TSMappedType; + validate(defs.typeParameter, node, "typeParameter", typeParameter, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.nameType, node, "nameType", nameType, 1); + return node; + } + function tsLiteralType(literal) { + const node = { + type: "TSLiteralType", + literal + }; + const defs = NODE_FIELDS.TSLiteralType; + validate(defs.literal, node, "literal", literal, 1); + return node; + } + function tsExpressionWithTypeArguments(expression, typeParameters = null) { + const node = { + type: "TSExpressionWithTypeArguments", + expression, + typeParameters + }; + const defs = NODE_FIELDS.TSExpressionWithTypeArguments; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsInterfaceDeclaration(id, typeParameters = null, _extends = null, body) { + const node = { + type: "TSInterfaceDeclaration", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.TSInterfaceDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function tsInterfaceBody(body) { + const node = { + type: "TSInterfaceBody", + body + }; + const defs = NODE_FIELDS.TSInterfaceBody; + validate(defs.body, node, "body", body, 1); + return node; + } + function tsTypeAliasDeclaration(id, typeParameters = null, typeAnnotation) { + const node = { + type: "TSTypeAliasDeclaration", + id, + typeParameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSTypeAliasDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsInstantiationExpression(expression, typeParameters = null) { + const node = { + type: "TSInstantiationExpression", + expression, + typeParameters + }; + const defs = NODE_FIELDS.TSInstantiationExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsAsExpression(expression, typeAnnotation) { + const node = { + type: "TSAsExpression", + expression, + typeAnnotation + }; + const defs = NODE_FIELDS.TSAsExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsSatisfiesExpression(expression, typeAnnotation) { + const node = { + type: "TSSatisfiesExpression", + expression, + typeAnnotation + }; + const defs = NODE_FIELDS.TSSatisfiesExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeAssertion(typeAnnotation, expression) { + const node = { + type: "TSTypeAssertion", + typeAnnotation, + expression + }; + const defs = NODE_FIELDS.TSTypeAssertion; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsEnumDeclaration(id, members) { + const node = { + type: "TSEnumDeclaration", + id, + members + }; + const defs = NODE_FIELDS.TSEnumDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.members, node, "members", members, 1); + return node; + } + function tsEnumMember(id, initializer = null) { + const node = { + type: "TSEnumMember", + id, + initializer + }; + const defs = NODE_FIELDS.TSEnumMember; + validate(defs.id, node, "id", id, 1); + validate(defs.initializer, node, "initializer", initializer, 1); + return node; + } + function tsModuleDeclaration(id, body) { + const node = { + type: "TSModuleDeclaration", + id, + body, + kind: null + }; + const defs = NODE_FIELDS.TSModuleDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function tsModuleBlock(body) { + const node = { + type: "TSModuleBlock", + body + }; + const defs = NODE_FIELDS.TSModuleBlock; + validate(defs.body, node, "body", body, 1); + return node; + } + function tsImportType(argument, qualifier = null, typeParameters = null) { + const node = { + type: "TSImportType", + argument, + qualifier, + typeParameters + }; + const defs = NODE_FIELDS.TSImportType; + validate(defs.argument, node, "argument", argument, 1); + validate(defs.qualifier, node, "qualifier", qualifier, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsImportEqualsDeclaration(id, moduleReference) { + const node = { + type: "TSImportEqualsDeclaration", + id, + moduleReference, + isExport: null + }; + const defs = NODE_FIELDS.TSImportEqualsDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.moduleReference, node, "moduleReference", moduleReference, 1); + return node; + } + function tsExternalModuleReference(expression) { + const node = { + type: "TSExternalModuleReference", + expression + }; + const defs = NODE_FIELDS.TSExternalModuleReference; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsNonNullExpression(expression) { + const node = { + type: "TSNonNullExpression", + expression + }; + const defs = NODE_FIELDS.TSNonNullExpression; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsExportAssignment(expression) { + const node = { + type: "TSExportAssignment", + expression + }; + const defs = NODE_FIELDS.TSExportAssignment; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsNamespaceExportDeclaration(id) { + const node = { + type: "TSNamespaceExportDeclaration", + id + }; + const defs = NODE_FIELDS.TSNamespaceExportDeclaration; + validate(defs.id, node, "id", id, 1); + return node; + } + function tsTypeAnnotation(typeAnnotation) { + const node = { + type: "TSTypeAnnotation", + typeAnnotation + }; + const defs = NODE_FIELDS.TSTypeAnnotation; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeParameterInstantiation(params) { + const node = { + type: "TSTypeParameterInstantiation", + params + }; + const defs = NODE_FIELDS.TSTypeParameterInstantiation; + validate(defs.params, node, "params", params, 1); + return node; + } + function tsTypeParameterDeclaration(params) { + const node = { + type: "TSTypeParameterDeclaration", + params + }; + const defs = NODE_FIELDS.TSTypeParameterDeclaration; + validate(defs.params, node, "params", params, 1); + return node; + } + function tsTypeParameter(constraint = null, _default = null, name) { + const node = { + type: "TSTypeParameter", + constraint, + default: _default, + name + }; + const defs = NODE_FIELDS.TSTypeParameter; + validate(defs.constraint, node, "constraint", constraint, 1); + validate(defs.default, node, "default", _default, 1); + validate(defs.name, node, "name", name); + return node; + } + function NumberLiteral(value) { + (0, _deprecationWarning.default)("NumberLiteral", "NumericLiteral", "The node type "); + return numericLiteral(value); + } + function RegexLiteral(pattern, flags = "") { + (0, _deprecationWarning.default)("RegexLiteral", "RegExpLiteral", "The node type "); + return regExpLiteral(pattern, flags); + } + function RestProperty(argument) { + (0, _deprecationWarning.default)("RestProperty", "RestElement", "The node type "); + return restElement(argument); + } + function SpreadProperty(argument) { + (0, _deprecationWarning.default)("SpreadProperty", "SpreadElement", "The node type "); + return spreadElement(argument); + } + + + return generated$2; +} + +var hasRequiredCleanJSXElementLiteralChild; + +function requireCleanJSXElementLiteralChild () { + if (hasRequiredCleanJSXElementLiteralChild) return cleanJSXElementLiteralChild; + hasRequiredCleanJSXElementLiteralChild = 1; + + Object.defineProperty(cleanJSXElementLiteralChild, "__esModule", { + value: true + }); + cleanJSXElementLiteralChild.default = cleanJSXElementLiteralChild$1; + var _index = requireGenerated$2(); + var _index2 = requireLib$1(); + function cleanJSXElementLiteralChild$1(child, args) { + const lines = child.value.split(/\r\n|\n|\r/); + let lastNonEmptyLine = 0; + for (let i = 0; i < lines.length; i++) { + if (/[^ \t]/.exec(lines[i])) { + lastNonEmptyLine = i; + } + } + let str = ""; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const isFirstLine = i === 0; + const isLastLine = i === lines.length - 1; + const isLastNonEmptyLine = i === lastNonEmptyLine; + let trimmedLine = line.replace(/\t/g, " "); + if (!isFirstLine) { + trimmedLine = trimmedLine.replace(/^ +/, ""); + } + if (!isLastLine) { + trimmedLine = trimmedLine.replace(/ +$/, ""); + } + if (trimmedLine) { + if (!isLastNonEmptyLine) { + trimmedLine += " "; + } + str += trimmedLine; + } + } + if (str) args.push((0, _index2.inherits)((0, _index.stringLiteral)(str), child)); + } + + + return cleanJSXElementLiteralChild; +} + +var hasRequiredBuildChildren; + +function requireBuildChildren () { + if (hasRequiredBuildChildren) return buildChildren; + hasRequiredBuildChildren = 1; + + Object.defineProperty(buildChildren, "__esModule", { + value: true + }); + buildChildren.default = buildChildren$1; + var _index = requireGenerated$3(); + var _cleanJSXElementLiteralChild = requireCleanJSXElementLiteralChild(); + function buildChildren$1(node) { + const elements = []; + for (let i = 0; i < node.children.length; i++) { + let child = node.children[i]; + if ((0, _index.isJSXText)(child)) { + (0, _cleanJSXElementLiteralChild.default)(child, elements); + continue; + } + if ((0, _index.isJSXExpressionContainer)(child)) child = child.expression; + if ((0, _index.isJSXEmptyExpression)(child)) continue; + elements.push(child); + } + return elements; + } + + + return buildChildren; +} + +var assertNode = {}; + +var isNode = {}; + +var hasRequiredIsNode; + +function requireIsNode () { + if (hasRequiredIsNode) return isNode; + hasRequiredIsNode = 1; + + Object.defineProperty(isNode, "__esModule", { + value: true + }); + isNode.default = isNode$1; + var _index = requireDefinitions(); + function isNode$1(node) { + return !!(node && _index.VISITOR_KEYS[node.type]); + } + + + return isNode; +} + +var hasRequiredAssertNode; + +function requireAssertNode () { + if (hasRequiredAssertNode) return assertNode; + hasRequiredAssertNode = 1; + + Object.defineProperty(assertNode, "__esModule", { + value: true + }); + assertNode.default = assertNode$1; + var _isNode = requireIsNode(); + function assertNode$1(node) { + if (!(0, _isNode.default)(node)) { + var _node$type; + const type = (_node$type = node == null ? void 0 : node.type) != null ? _node$type : JSON.stringify(node); + throw new TypeError(`Not a valid node of type "${type}"`); + } + } + + + return assertNode; +} + +var generated$1 = {}; + +var hasRequiredGenerated$1; + +function requireGenerated$1 () { + if (hasRequiredGenerated$1) return generated$1; + hasRequiredGenerated$1 = 1; + + Object.defineProperty(generated$1, "__esModule", { + value: true + }); + generated$1.assertAccessor = assertAccessor; + generated$1.assertAnyTypeAnnotation = assertAnyTypeAnnotation; + generated$1.assertArgumentPlaceholder = assertArgumentPlaceholder; + generated$1.assertArrayExpression = assertArrayExpression; + generated$1.assertArrayPattern = assertArrayPattern; + generated$1.assertArrayTypeAnnotation = assertArrayTypeAnnotation; + generated$1.assertArrowFunctionExpression = assertArrowFunctionExpression; + generated$1.assertAssignmentExpression = assertAssignmentExpression; + generated$1.assertAssignmentPattern = assertAssignmentPattern; + generated$1.assertAwaitExpression = assertAwaitExpression; + generated$1.assertBigIntLiteral = assertBigIntLiteral; + generated$1.assertBinary = assertBinary; + generated$1.assertBinaryExpression = assertBinaryExpression; + generated$1.assertBindExpression = assertBindExpression; + generated$1.assertBlock = assertBlock; + generated$1.assertBlockParent = assertBlockParent; + generated$1.assertBlockStatement = assertBlockStatement; + generated$1.assertBooleanLiteral = assertBooleanLiteral; + generated$1.assertBooleanLiteralTypeAnnotation = assertBooleanLiteralTypeAnnotation; + generated$1.assertBooleanTypeAnnotation = assertBooleanTypeAnnotation; + generated$1.assertBreakStatement = assertBreakStatement; + generated$1.assertCallExpression = assertCallExpression; + generated$1.assertCatchClause = assertCatchClause; + generated$1.assertClass = assertClass; + generated$1.assertClassAccessorProperty = assertClassAccessorProperty; + generated$1.assertClassBody = assertClassBody; + generated$1.assertClassDeclaration = assertClassDeclaration; + generated$1.assertClassExpression = assertClassExpression; + generated$1.assertClassImplements = assertClassImplements; + generated$1.assertClassMethod = assertClassMethod; + generated$1.assertClassPrivateMethod = assertClassPrivateMethod; + generated$1.assertClassPrivateProperty = assertClassPrivateProperty; + generated$1.assertClassProperty = assertClassProperty; + generated$1.assertCompletionStatement = assertCompletionStatement; + generated$1.assertConditional = assertConditional; + generated$1.assertConditionalExpression = assertConditionalExpression; + generated$1.assertContinueStatement = assertContinueStatement; + generated$1.assertDebuggerStatement = assertDebuggerStatement; + generated$1.assertDecimalLiteral = assertDecimalLiteral; + generated$1.assertDeclaration = assertDeclaration; + generated$1.assertDeclareClass = assertDeclareClass; + generated$1.assertDeclareExportAllDeclaration = assertDeclareExportAllDeclaration; + generated$1.assertDeclareExportDeclaration = assertDeclareExportDeclaration; + generated$1.assertDeclareFunction = assertDeclareFunction; + generated$1.assertDeclareInterface = assertDeclareInterface; + generated$1.assertDeclareModule = assertDeclareModule; + generated$1.assertDeclareModuleExports = assertDeclareModuleExports; + generated$1.assertDeclareOpaqueType = assertDeclareOpaqueType; + generated$1.assertDeclareTypeAlias = assertDeclareTypeAlias; + generated$1.assertDeclareVariable = assertDeclareVariable; + generated$1.assertDeclaredPredicate = assertDeclaredPredicate; + generated$1.assertDecorator = assertDecorator; + generated$1.assertDirective = assertDirective; + generated$1.assertDirectiveLiteral = assertDirectiveLiteral; + generated$1.assertDoExpression = assertDoExpression; + generated$1.assertDoWhileStatement = assertDoWhileStatement; + generated$1.assertEmptyStatement = assertEmptyStatement; + generated$1.assertEmptyTypeAnnotation = assertEmptyTypeAnnotation; + generated$1.assertEnumBody = assertEnumBody; + generated$1.assertEnumBooleanBody = assertEnumBooleanBody; + generated$1.assertEnumBooleanMember = assertEnumBooleanMember; + generated$1.assertEnumDeclaration = assertEnumDeclaration; + generated$1.assertEnumDefaultedMember = assertEnumDefaultedMember; + generated$1.assertEnumMember = assertEnumMember; + generated$1.assertEnumNumberBody = assertEnumNumberBody; + generated$1.assertEnumNumberMember = assertEnumNumberMember; + generated$1.assertEnumStringBody = assertEnumStringBody; + generated$1.assertEnumStringMember = assertEnumStringMember; + generated$1.assertEnumSymbolBody = assertEnumSymbolBody; + generated$1.assertExistsTypeAnnotation = assertExistsTypeAnnotation; + generated$1.assertExportAllDeclaration = assertExportAllDeclaration; + generated$1.assertExportDeclaration = assertExportDeclaration; + generated$1.assertExportDefaultDeclaration = assertExportDefaultDeclaration; + generated$1.assertExportDefaultSpecifier = assertExportDefaultSpecifier; + generated$1.assertExportNamedDeclaration = assertExportNamedDeclaration; + generated$1.assertExportNamespaceSpecifier = assertExportNamespaceSpecifier; + generated$1.assertExportSpecifier = assertExportSpecifier; + generated$1.assertExpression = assertExpression; + generated$1.assertExpressionStatement = assertExpressionStatement; + generated$1.assertExpressionWrapper = assertExpressionWrapper; + generated$1.assertFile = assertFile; + generated$1.assertFlow = assertFlow; + generated$1.assertFlowBaseAnnotation = assertFlowBaseAnnotation; + generated$1.assertFlowDeclaration = assertFlowDeclaration; + generated$1.assertFlowPredicate = assertFlowPredicate; + generated$1.assertFlowType = assertFlowType; + generated$1.assertFor = assertFor; + generated$1.assertForInStatement = assertForInStatement; + generated$1.assertForOfStatement = assertForOfStatement; + generated$1.assertForStatement = assertForStatement; + generated$1.assertForXStatement = assertForXStatement; + generated$1.assertFunction = assertFunction; + generated$1.assertFunctionDeclaration = assertFunctionDeclaration; + generated$1.assertFunctionExpression = assertFunctionExpression; + generated$1.assertFunctionParent = assertFunctionParent; + generated$1.assertFunctionTypeAnnotation = assertFunctionTypeAnnotation; + generated$1.assertFunctionTypeParam = assertFunctionTypeParam; + generated$1.assertGenericTypeAnnotation = assertGenericTypeAnnotation; + generated$1.assertIdentifier = assertIdentifier; + generated$1.assertIfStatement = assertIfStatement; + generated$1.assertImmutable = assertImmutable; + generated$1.assertImport = assertImport; + generated$1.assertImportAttribute = assertImportAttribute; + generated$1.assertImportDeclaration = assertImportDeclaration; + generated$1.assertImportDefaultSpecifier = assertImportDefaultSpecifier; + generated$1.assertImportExpression = assertImportExpression; + generated$1.assertImportNamespaceSpecifier = assertImportNamespaceSpecifier; + generated$1.assertImportOrExportDeclaration = assertImportOrExportDeclaration; + generated$1.assertImportSpecifier = assertImportSpecifier; + generated$1.assertIndexedAccessType = assertIndexedAccessType; + generated$1.assertInferredPredicate = assertInferredPredicate; + generated$1.assertInterfaceDeclaration = assertInterfaceDeclaration; + generated$1.assertInterfaceExtends = assertInterfaceExtends; + generated$1.assertInterfaceTypeAnnotation = assertInterfaceTypeAnnotation; + generated$1.assertInterpreterDirective = assertInterpreterDirective; + generated$1.assertIntersectionTypeAnnotation = assertIntersectionTypeAnnotation; + generated$1.assertJSX = assertJSX; + generated$1.assertJSXAttribute = assertJSXAttribute; + generated$1.assertJSXClosingElement = assertJSXClosingElement; + generated$1.assertJSXClosingFragment = assertJSXClosingFragment; + generated$1.assertJSXElement = assertJSXElement; + generated$1.assertJSXEmptyExpression = assertJSXEmptyExpression; + generated$1.assertJSXExpressionContainer = assertJSXExpressionContainer; + generated$1.assertJSXFragment = assertJSXFragment; + generated$1.assertJSXIdentifier = assertJSXIdentifier; + generated$1.assertJSXMemberExpression = assertJSXMemberExpression; + generated$1.assertJSXNamespacedName = assertJSXNamespacedName; + generated$1.assertJSXOpeningElement = assertJSXOpeningElement; + generated$1.assertJSXOpeningFragment = assertJSXOpeningFragment; + generated$1.assertJSXSpreadAttribute = assertJSXSpreadAttribute; + generated$1.assertJSXSpreadChild = assertJSXSpreadChild; + generated$1.assertJSXText = assertJSXText; + generated$1.assertLVal = assertLVal; + generated$1.assertLabeledStatement = assertLabeledStatement; + generated$1.assertLiteral = assertLiteral; + generated$1.assertLogicalExpression = assertLogicalExpression; + generated$1.assertLoop = assertLoop; + generated$1.assertMemberExpression = assertMemberExpression; + generated$1.assertMetaProperty = assertMetaProperty; + generated$1.assertMethod = assertMethod; + generated$1.assertMiscellaneous = assertMiscellaneous; + generated$1.assertMixedTypeAnnotation = assertMixedTypeAnnotation; + generated$1.assertModuleDeclaration = assertModuleDeclaration; + generated$1.assertModuleExpression = assertModuleExpression; + generated$1.assertModuleSpecifier = assertModuleSpecifier; + generated$1.assertNewExpression = assertNewExpression; + generated$1.assertNoop = assertNoop; + generated$1.assertNullLiteral = assertNullLiteral; + generated$1.assertNullLiteralTypeAnnotation = assertNullLiteralTypeAnnotation; + generated$1.assertNullableTypeAnnotation = assertNullableTypeAnnotation; + generated$1.assertNumberLiteral = assertNumberLiteral; + generated$1.assertNumberLiteralTypeAnnotation = assertNumberLiteralTypeAnnotation; + generated$1.assertNumberTypeAnnotation = assertNumberTypeAnnotation; + generated$1.assertNumericLiteral = assertNumericLiteral; + generated$1.assertObjectExpression = assertObjectExpression; + generated$1.assertObjectMember = assertObjectMember; + generated$1.assertObjectMethod = assertObjectMethod; + generated$1.assertObjectPattern = assertObjectPattern; + generated$1.assertObjectProperty = assertObjectProperty; + generated$1.assertObjectTypeAnnotation = assertObjectTypeAnnotation; + generated$1.assertObjectTypeCallProperty = assertObjectTypeCallProperty; + generated$1.assertObjectTypeIndexer = assertObjectTypeIndexer; + generated$1.assertObjectTypeInternalSlot = assertObjectTypeInternalSlot; + generated$1.assertObjectTypeProperty = assertObjectTypeProperty; + generated$1.assertObjectTypeSpreadProperty = assertObjectTypeSpreadProperty; + generated$1.assertOpaqueType = assertOpaqueType; + generated$1.assertOptionalCallExpression = assertOptionalCallExpression; + generated$1.assertOptionalIndexedAccessType = assertOptionalIndexedAccessType; + generated$1.assertOptionalMemberExpression = assertOptionalMemberExpression; + generated$1.assertParenthesizedExpression = assertParenthesizedExpression; + generated$1.assertPattern = assertPattern; + generated$1.assertPatternLike = assertPatternLike; + generated$1.assertPipelineBareFunction = assertPipelineBareFunction; + generated$1.assertPipelinePrimaryTopicReference = assertPipelinePrimaryTopicReference; + generated$1.assertPipelineTopicExpression = assertPipelineTopicExpression; + generated$1.assertPlaceholder = assertPlaceholder; + generated$1.assertPrivate = assertPrivate; + generated$1.assertPrivateName = assertPrivateName; + generated$1.assertProgram = assertProgram; + generated$1.assertProperty = assertProperty; + generated$1.assertPureish = assertPureish; + generated$1.assertQualifiedTypeIdentifier = assertQualifiedTypeIdentifier; + generated$1.assertRecordExpression = assertRecordExpression; + generated$1.assertRegExpLiteral = assertRegExpLiteral; + generated$1.assertRegexLiteral = assertRegexLiteral; + generated$1.assertRestElement = assertRestElement; + generated$1.assertRestProperty = assertRestProperty; + generated$1.assertReturnStatement = assertReturnStatement; + generated$1.assertScopable = assertScopable; + generated$1.assertSequenceExpression = assertSequenceExpression; + generated$1.assertSpreadElement = assertSpreadElement; + generated$1.assertSpreadProperty = assertSpreadProperty; + generated$1.assertStandardized = assertStandardized; + generated$1.assertStatement = assertStatement; + generated$1.assertStaticBlock = assertStaticBlock; + generated$1.assertStringLiteral = assertStringLiteral; + generated$1.assertStringLiteralTypeAnnotation = assertStringLiteralTypeAnnotation; + generated$1.assertStringTypeAnnotation = assertStringTypeAnnotation; + generated$1.assertSuper = assertSuper; + generated$1.assertSwitchCase = assertSwitchCase; + generated$1.assertSwitchStatement = assertSwitchStatement; + generated$1.assertSymbolTypeAnnotation = assertSymbolTypeAnnotation; + generated$1.assertTSAnyKeyword = assertTSAnyKeyword; + generated$1.assertTSArrayType = assertTSArrayType; + generated$1.assertTSAsExpression = assertTSAsExpression; + generated$1.assertTSBaseType = assertTSBaseType; + generated$1.assertTSBigIntKeyword = assertTSBigIntKeyword; + generated$1.assertTSBooleanKeyword = assertTSBooleanKeyword; + generated$1.assertTSCallSignatureDeclaration = assertTSCallSignatureDeclaration; + generated$1.assertTSConditionalType = assertTSConditionalType; + generated$1.assertTSConstructSignatureDeclaration = assertTSConstructSignatureDeclaration; + generated$1.assertTSConstructorType = assertTSConstructorType; + generated$1.assertTSDeclareFunction = assertTSDeclareFunction; + generated$1.assertTSDeclareMethod = assertTSDeclareMethod; + generated$1.assertTSEntityName = assertTSEntityName; + generated$1.assertTSEnumDeclaration = assertTSEnumDeclaration; + generated$1.assertTSEnumMember = assertTSEnumMember; + generated$1.assertTSExportAssignment = assertTSExportAssignment; + generated$1.assertTSExpressionWithTypeArguments = assertTSExpressionWithTypeArguments; + generated$1.assertTSExternalModuleReference = assertTSExternalModuleReference; + generated$1.assertTSFunctionType = assertTSFunctionType; + generated$1.assertTSImportEqualsDeclaration = assertTSImportEqualsDeclaration; + generated$1.assertTSImportType = assertTSImportType; + generated$1.assertTSIndexSignature = assertTSIndexSignature; + generated$1.assertTSIndexedAccessType = assertTSIndexedAccessType; + generated$1.assertTSInferType = assertTSInferType; + generated$1.assertTSInstantiationExpression = assertTSInstantiationExpression; + generated$1.assertTSInterfaceBody = assertTSInterfaceBody; + generated$1.assertTSInterfaceDeclaration = assertTSInterfaceDeclaration; + generated$1.assertTSIntersectionType = assertTSIntersectionType; + generated$1.assertTSIntrinsicKeyword = assertTSIntrinsicKeyword; + generated$1.assertTSLiteralType = assertTSLiteralType; + generated$1.assertTSMappedType = assertTSMappedType; + generated$1.assertTSMethodSignature = assertTSMethodSignature; + generated$1.assertTSModuleBlock = assertTSModuleBlock; + generated$1.assertTSModuleDeclaration = assertTSModuleDeclaration; + generated$1.assertTSNamedTupleMember = assertTSNamedTupleMember; + generated$1.assertTSNamespaceExportDeclaration = assertTSNamespaceExportDeclaration; + generated$1.assertTSNeverKeyword = assertTSNeverKeyword; + generated$1.assertTSNonNullExpression = assertTSNonNullExpression; + generated$1.assertTSNullKeyword = assertTSNullKeyword; + generated$1.assertTSNumberKeyword = assertTSNumberKeyword; + generated$1.assertTSObjectKeyword = assertTSObjectKeyword; + generated$1.assertTSOptionalType = assertTSOptionalType; + generated$1.assertTSParameterProperty = assertTSParameterProperty; + generated$1.assertTSParenthesizedType = assertTSParenthesizedType; + generated$1.assertTSPropertySignature = assertTSPropertySignature; + generated$1.assertTSQualifiedName = assertTSQualifiedName; + generated$1.assertTSRestType = assertTSRestType; + generated$1.assertTSSatisfiesExpression = assertTSSatisfiesExpression; + generated$1.assertTSStringKeyword = assertTSStringKeyword; + generated$1.assertTSSymbolKeyword = assertTSSymbolKeyword; + generated$1.assertTSThisType = assertTSThisType; + generated$1.assertTSTupleType = assertTSTupleType; + generated$1.assertTSType = assertTSType; + generated$1.assertTSTypeAliasDeclaration = assertTSTypeAliasDeclaration; + generated$1.assertTSTypeAnnotation = assertTSTypeAnnotation; + generated$1.assertTSTypeAssertion = assertTSTypeAssertion; + generated$1.assertTSTypeElement = assertTSTypeElement; + generated$1.assertTSTypeLiteral = assertTSTypeLiteral; + generated$1.assertTSTypeOperator = assertTSTypeOperator; + generated$1.assertTSTypeParameter = assertTSTypeParameter; + generated$1.assertTSTypeParameterDeclaration = assertTSTypeParameterDeclaration; + generated$1.assertTSTypeParameterInstantiation = assertTSTypeParameterInstantiation; + generated$1.assertTSTypePredicate = assertTSTypePredicate; + generated$1.assertTSTypeQuery = assertTSTypeQuery; + generated$1.assertTSTypeReference = assertTSTypeReference; + generated$1.assertTSUndefinedKeyword = assertTSUndefinedKeyword; + generated$1.assertTSUnionType = assertTSUnionType; + generated$1.assertTSUnknownKeyword = assertTSUnknownKeyword; + generated$1.assertTSVoidKeyword = assertTSVoidKeyword; + generated$1.assertTaggedTemplateExpression = assertTaggedTemplateExpression; + generated$1.assertTemplateElement = assertTemplateElement; + generated$1.assertTemplateLiteral = assertTemplateLiteral; + generated$1.assertTerminatorless = assertTerminatorless; + generated$1.assertThisExpression = assertThisExpression; + generated$1.assertThisTypeAnnotation = assertThisTypeAnnotation; + generated$1.assertThrowStatement = assertThrowStatement; + generated$1.assertTopicReference = assertTopicReference; + generated$1.assertTryStatement = assertTryStatement; + generated$1.assertTupleExpression = assertTupleExpression; + generated$1.assertTupleTypeAnnotation = assertTupleTypeAnnotation; + generated$1.assertTypeAlias = assertTypeAlias; + generated$1.assertTypeAnnotation = assertTypeAnnotation; + generated$1.assertTypeCastExpression = assertTypeCastExpression; + generated$1.assertTypeParameter = assertTypeParameter; + generated$1.assertTypeParameterDeclaration = assertTypeParameterDeclaration; + generated$1.assertTypeParameterInstantiation = assertTypeParameterInstantiation; + generated$1.assertTypeScript = assertTypeScript; + generated$1.assertTypeofTypeAnnotation = assertTypeofTypeAnnotation; + generated$1.assertUnaryExpression = assertUnaryExpression; + generated$1.assertUnaryLike = assertUnaryLike; + generated$1.assertUnionTypeAnnotation = assertUnionTypeAnnotation; + generated$1.assertUpdateExpression = assertUpdateExpression; + generated$1.assertUserWhitespacable = assertUserWhitespacable; + generated$1.assertV8IntrinsicIdentifier = assertV8IntrinsicIdentifier; + generated$1.assertVariableDeclaration = assertVariableDeclaration; + generated$1.assertVariableDeclarator = assertVariableDeclarator; + generated$1.assertVariance = assertVariance; + generated$1.assertVoidTypeAnnotation = assertVoidTypeAnnotation; + generated$1.assertWhile = assertWhile; + generated$1.assertWhileStatement = assertWhileStatement; + generated$1.assertWithStatement = assertWithStatement; + generated$1.assertYieldExpression = assertYieldExpression; + var _is = requireIs(); + var _deprecationWarning = requireDeprecationWarning(); + function assert(type, node, opts) { + if (!(0, _is.default)(type, node, opts)) { + throw new Error(`Expected type "${type}" with option ${JSON.stringify(opts)}, ` + `but instead got "${node.type}".`); + } + } + function assertArrayExpression(node, opts) { + assert("ArrayExpression", node, opts); + } + function assertAssignmentExpression(node, opts) { + assert("AssignmentExpression", node, opts); + } + function assertBinaryExpression(node, opts) { + assert("BinaryExpression", node, opts); + } + function assertInterpreterDirective(node, opts) { + assert("InterpreterDirective", node, opts); + } + function assertDirective(node, opts) { + assert("Directive", node, opts); + } + function assertDirectiveLiteral(node, opts) { + assert("DirectiveLiteral", node, opts); + } + function assertBlockStatement(node, opts) { + assert("BlockStatement", node, opts); + } + function assertBreakStatement(node, opts) { + assert("BreakStatement", node, opts); + } + function assertCallExpression(node, opts) { + assert("CallExpression", node, opts); + } + function assertCatchClause(node, opts) { + assert("CatchClause", node, opts); + } + function assertConditionalExpression(node, opts) { + assert("ConditionalExpression", node, opts); + } + function assertContinueStatement(node, opts) { + assert("ContinueStatement", node, opts); + } + function assertDebuggerStatement(node, opts) { + assert("DebuggerStatement", node, opts); + } + function assertDoWhileStatement(node, opts) { + assert("DoWhileStatement", node, opts); + } + function assertEmptyStatement(node, opts) { + assert("EmptyStatement", node, opts); + } + function assertExpressionStatement(node, opts) { + assert("ExpressionStatement", node, opts); + } + function assertFile(node, opts) { + assert("File", node, opts); + } + function assertForInStatement(node, opts) { + assert("ForInStatement", node, opts); + } + function assertForStatement(node, opts) { + assert("ForStatement", node, opts); + } + function assertFunctionDeclaration(node, opts) { + assert("FunctionDeclaration", node, opts); + } + function assertFunctionExpression(node, opts) { + assert("FunctionExpression", node, opts); + } + function assertIdentifier(node, opts) { + assert("Identifier", node, opts); + } + function assertIfStatement(node, opts) { + assert("IfStatement", node, opts); + } + function assertLabeledStatement(node, opts) { + assert("LabeledStatement", node, opts); + } + function assertStringLiteral(node, opts) { + assert("StringLiteral", node, opts); + } + function assertNumericLiteral(node, opts) { + assert("NumericLiteral", node, opts); + } + function assertNullLiteral(node, opts) { + assert("NullLiteral", node, opts); + } + function assertBooleanLiteral(node, opts) { + assert("BooleanLiteral", node, opts); + } + function assertRegExpLiteral(node, opts) { + assert("RegExpLiteral", node, opts); + } + function assertLogicalExpression(node, opts) { + assert("LogicalExpression", node, opts); + } + function assertMemberExpression(node, opts) { + assert("MemberExpression", node, opts); + } + function assertNewExpression(node, opts) { + assert("NewExpression", node, opts); + } + function assertProgram(node, opts) { + assert("Program", node, opts); + } + function assertObjectExpression(node, opts) { + assert("ObjectExpression", node, opts); + } + function assertObjectMethod(node, opts) { + assert("ObjectMethod", node, opts); + } + function assertObjectProperty(node, opts) { + assert("ObjectProperty", node, opts); + } + function assertRestElement(node, opts) { + assert("RestElement", node, opts); + } + function assertReturnStatement(node, opts) { + assert("ReturnStatement", node, opts); + } + function assertSequenceExpression(node, opts) { + assert("SequenceExpression", node, opts); + } + function assertParenthesizedExpression(node, opts) { + assert("ParenthesizedExpression", node, opts); + } + function assertSwitchCase(node, opts) { + assert("SwitchCase", node, opts); + } + function assertSwitchStatement(node, opts) { + assert("SwitchStatement", node, opts); + } + function assertThisExpression(node, opts) { + assert("ThisExpression", node, opts); + } + function assertThrowStatement(node, opts) { + assert("ThrowStatement", node, opts); + } + function assertTryStatement(node, opts) { + assert("TryStatement", node, opts); + } + function assertUnaryExpression(node, opts) { + assert("UnaryExpression", node, opts); + } + function assertUpdateExpression(node, opts) { + assert("UpdateExpression", node, opts); + } + function assertVariableDeclaration(node, opts) { + assert("VariableDeclaration", node, opts); + } + function assertVariableDeclarator(node, opts) { + assert("VariableDeclarator", node, opts); + } + function assertWhileStatement(node, opts) { + assert("WhileStatement", node, opts); + } + function assertWithStatement(node, opts) { + assert("WithStatement", node, opts); + } + function assertAssignmentPattern(node, opts) { + assert("AssignmentPattern", node, opts); + } + function assertArrayPattern(node, opts) { + assert("ArrayPattern", node, opts); + } + function assertArrowFunctionExpression(node, opts) { + assert("ArrowFunctionExpression", node, opts); + } + function assertClassBody(node, opts) { + assert("ClassBody", node, opts); + } + function assertClassExpression(node, opts) { + assert("ClassExpression", node, opts); + } + function assertClassDeclaration(node, opts) { + assert("ClassDeclaration", node, opts); + } + function assertExportAllDeclaration(node, opts) { + assert("ExportAllDeclaration", node, opts); + } + function assertExportDefaultDeclaration(node, opts) { + assert("ExportDefaultDeclaration", node, opts); + } + function assertExportNamedDeclaration(node, opts) { + assert("ExportNamedDeclaration", node, opts); + } + function assertExportSpecifier(node, opts) { + assert("ExportSpecifier", node, opts); + } + function assertForOfStatement(node, opts) { + assert("ForOfStatement", node, opts); + } + function assertImportDeclaration(node, opts) { + assert("ImportDeclaration", node, opts); + } + function assertImportDefaultSpecifier(node, opts) { + assert("ImportDefaultSpecifier", node, opts); + } + function assertImportNamespaceSpecifier(node, opts) { + assert("ImportNamespaceSpecifier", node, opts); + } + function assertImportSpecifier(node, opts) { + assert("ImportSpecifier", node, opts); + } + function assertImportExpression(node, opts) { + assert("ImportExpression", node, opts); + } + function assertMetaProperty(node, opts) { + assert("MetaProperty", node, opts); + } + function assertClassMethod(node, opts) { + assert("ClassMethod", node, opts); + } + function assertObjectPattern(node, opts) { + assert("ObjectPattern", node, opts); + } + function assertSpreadElement(node, opts) { + assert("SpreadElement", node, opts); + } + function assertSuper(node, opts) { + assert("Super", node, opts); + } + function assertTaggedTemplateExpression(node, opts) { + assert("TaggedTemplateExpression", node, opts); + } + function assertTemplateElement(node, opts) { + assert("TemplateElement", node, opts); + } + function assertTemplateLiteral(node, opts) { + assert("TemplateLiteral", node, opts); + } + function assertYieldExpression(node, opts) { + assert("YieldExpression", node, opts); + } + function assertAwaitExpression(node, opts) { + assert("AwaitExpression", node, opts); + } + function assertImport(node, opts) { + assert("Import", node, opts); + } + function assertBigIntLiteral(node, opts) { + assert("BigIntLiteral", node, opts); + } + function assertExportNamespaceSpecifier(node, opts) { + assert("ExportNamespaceSpecifier", node, opts); + } + function assertOptionalMemberExpression(node, opts) { + assert("OptionalMemberExpression", node, opts); + } + function assertOptionalCallExpression(node, opts) { + assert("OptionalCallExpression", node, opts); + } + function assertClassProperty(node, opts) { + assert("ClassProperty", node, opts); + } + function assertClassAccessorProperty(node, opts) { + assert("ClassAccessorProperty", node, opts); + } + function assertClassPrivateProperty(node, opts) { + assert("ClassPrivateProperty", node, opts); + } + function assertClassPrivateMethod(node, opts) { + assert("ClassPrivateMethod", node, opts); + } + function assertPrivateName(node, opts) { + assert("PrivateName", node, opts); + } + function assertStaticBlock(node, opts) { + assert("StaticBlock", node, opts); + } + function assertAnyTypeAnnotation(node, opts) { + assert("AnyTypeAnnotation", node, opts); + } + function assertArrayTypeAnnotation(node, opts) { + assert("ArrayTypeAnnotation", node, opts); + } + function assertBooleanTypeAnnotation(node, opts) { + assert("BooleanTypeAnnotation", node, opts); + } + function assertBooleanLiteralTypeAnnotation(node, opts) { + assert("BooleanLiteralTypeAnnotation", node, opts); + } + function assertNullLiteralTypeAnnotation(node, opts) { + assert("NullLiteralTypeAnnotation", node, opts); + } + function assertClassImplements(node, opts) { + assert("ClassImplements", node, opts); + } + function assertDeclareClass(node, opts) { + assert("DeclareClass", node, opts); + } + function assertDeclareFunction(node, opts) { + assert("DeclareFunction", node, opts); + } + function assertDeclareInterface(node, opts) { + assert("DeclareInterface", node, opts); + } + function assertDeclareModule(node, opts) { + assert("DeclareModule", node, opts); + } + function assertDeclareModuleExports(node, opts) { + assert("DeclareModuleExports", node, opts); + } + function assertDeclareTypeAlias(node, opts) { + assert("DeclareTypeAlias", node, opts); + } + function assertDeclareOpaqueType(node, opts) { + assert("DeclareOpaqueType", node, opts); + } + function assertDeclareVariable(node, opts) { + assert("DeclareVariable", node, opts); + } + function assertDeclareExportDeclaration(node, opts) { + assert("DeclareExportDeclaration", node, opts); + } + function assertDeclareExportAllDeclaration(node, opts) { + assert("DeclareExportAllDeclaration", node, opts); + } + function assertDeclaredPredicate(node, opts) { + assert("DeclaredPredicate", node, opts); + } + function assertExistsTypeAnnotation(node, opts) { + assert("ExistsTypeAnnotation", node, opts); + } + function assertFunctionTypeAnnotation(node, opts) { + assert("FunctionTypeAnnotation", node, opts); + } + function assertFunctionTypeParam(node, opts) { + assert("FunctionTypeParam", node, opts); + } + function assertGenericTypeAnnotation(node, opts) { + assert("GenericTypeAnnotation", node, opts); + } + function assertInferredPredicate(node, opts) { + assert("InferredPredicate", node, opts); + } + function assertInterfaceExtends(node, opts) { + assert("InterfaceExtends", node, opts); + } + function assertInterfaceDeclaration(node, opts) { + assert("InterfaceDeclaration", node, opts); + } + function assertInterfaceTypeAnnotation(node, opts) { + assert("InterfaceTypeAnnotation", node, opts); + } + function assertIntersectionTypeAnnotation(node, opts) { + assert("IntersectionTypeAnnotation", node, opts); + } + function assertMixedTypeAnnotation(node, opts) { + assert("MixedTypeAnnotation", node, opts); + } + function assertEmptyTypeAnnotation(node, opts) { + assert("EmptyTypeAnnotation", node, opts); + } + function assertNullableTypeAnnotation(node, opts) { + assert("NullableTypeAnnotation", node, opts); + } + function assertNumberLiteralTypeAnnotation(node, opts) { + assert("NumberLiteralTypeAnnotation", node, opts); + } + function assertNumberTypeAnnotation(node, opts) { + assert("NumberTypeAnnotation", node, opts); + } + function assertObjectTypeAnnotation(node, opts) { + assert("ObjectTypeAnnotation", node, opts); + } + function assertObjectTypeInternalSlot(node, opts) { + assert("ObjectTypeInternalSlot", node, opts); + } + function assertObjectTypeCallProperty(node, opts) { + assert("ObjectTypeCallProperty", node, opts); + } + function assertObjectTypeIndexer(node, opts) { + assert("ObjectTypeIndexer", node, opts); + } + function assertObjectTypeProperty(node, opts) { + assert("ObjectTypeProperty", node, opts); + } + function assertObjectTypeSpreadProperty(node, opts) { + assert("ObjectTypeSpreadProperty", node, opts); + } + function assertOpaqueType(node, opts) { + assert("OpaqueType", node, opts); + } + function assertQualifiedTypeIdentifier(node, opts) { + assert("QualifiedTypeIdentifier", node, opts); + } + function assertStringLiteralTypeAnnotation(node, opts) { + assert("StringLiteralTypeAnnotation", node, opts); + } + function assertStringTypeAnnotation(node, opts) { + assert("StringTypeAnnotation", node, opts); + } + function assertSymbolTypeAnnotation(node, opts) { + assert("SymbolTypeAnnotation", node, opts); + } + function assertThisTypeAnnotation(node, opts) { + assert("ThisTypeAnnotation", node, opts); + } + function assertTupleTypeAnnotation(node, opts) { + assert("TupleTypeAnnotation", node, opts); + } + function assertTypeofTypeAnnotation(node, opts) { + assert("TypeofTypeAnnotation", node, opts); + } + function assertTypeAlias(node, opts) { + assert("TypeAlias", node, opts); + } + function assertTypeAnnotation(node, opts) { + assert("TypeAnnotation", node, opts); + } + function assertTypeCastExpression(node, opts) { + assert("TypeCastExpression", node, opts); + } + function assertTypeParameter(node, opts) { + assert("TypeParameter", node, opts); + } + function assertTypeParameterDeclaration(node, opts) { + assert("TypeParameterDeclaration", node, opts); + } + function assertTypeParameterInstantiation(node, opts) { + assert("TypeParameterInstantiation", node, opts); + } + function assertUnionTypeAnnotation(node, opts) { + assert("UnionTypeAnnotation", node, opts); + } + function assertVariance(node, opts) { + assert("Variance", node, opts); + } + function assertVoidTypeAnnotation(node, opts) { + assert("VoidTypeAnnotation", node, opts); + } + function assertEnumDeclaration(node, opts) { + assert("EnumDeclaration", node, opts); + } + function assertEnumBooleanBody(node, opts) { + assert("EnumBooleanBody", node, opts); + } + function assertEnumNumberBody(node, opts) { + assert("EnumNumberBody", node, opts); + } + function assertEnumStringBody(node, opts) { + assert("EnumStringBody", node, opts); + } + function assertEnumSymbolBody(node, opts) { + assert("EnumSymbolBody", node, opts); + } + function assertEnumBooleanMember(node, opts) { + assert("EnumBooleanMember", node, opts); + } + function assertEnumNumberMember(node, opts) { + assert("EnumNumberMember", node, opts); + } + function assertEnumStringMember(node, opts) { + assert("EnumStringMember", node, opts); + } + function assertEnumDefaultedMember(node, opts) { + assert("EnumDefaultedMember", node, opts); + } + function assertIndexedAccessType(node, opts) { + assert("IndexedAccessType", node, opts); + } + function assertOptionalIndexedAccessType(node, opts) { + assert("OptionalIndexedAccessType", node, opts); + } + function assertJSXAttribute(node, opts) { + assert("JSXAttribute", node, opts); + } + function assertJSXClosingElement(node, opts) { + assert("JSXClosingElement", node, opts); + } + function assertJSXElement(node, opts) { + assert("JSXElement", node, opts); + } + function assertJSXEmptyExpression(node, opts) { + assert("JSXEmptyExpression", node, opts); + } + function assertJSXExpressionContainer(node, opts) { + assert("JSXExpressionContainer", node, opts); + } + function assertJSXSpreadChild(node, opts) { + assert("JSXSpreadChild", node, opts); + } + function assertJSXIdentifier(node, opts) { + assert("JSXIdentifier", node, opts); + } + function assertJSXMemberExpression(node, opts) { + assert("JSXMemberExpression", node, opts); + } + function assertJSXNamespacedName(node, opts) { + assert("JSXNamespacedName", node, opts); + } + function assertJSXOpeningElement(node, opts) { + assert("JSXOpeningElement", node, opts); + } + function assertJSXSpreadAttribute(node, opts) { + assert("JSXSpreadAttribute", node, opts); + } + function assertJSXText(node, opts) { + assert("JSXText", node, opts); + } + function assertJSXFragment(node, opts) { + assert("JSXFragment", node, opts); + } + function assertJSXOpeningFragment(node, opts) { + assert("JSXOpeningFragment", node, opts); + } + function assertJSXClosingFragment(node, opts) { + assert("JSXClosingFragment", node, opts); + } + function assertNoop(node, opts) { + assert("Noop", node, opts); + } + function assertPlaceholder(node, opts) { + assert("Placeholder", node, opts); + } + function assertV8IntrinsicIdentifier(node, opts) { + assert("V8IntrinsicIdentifier", node, opts); + } + function assertArgumentPlaceholder(node, opts) { + assert("ArgumentPlaceholder", node, opts); + } + function assertBindExpression(node, opts) { + assert("BindExpression", node, opts); + } + function assertImportAttribute(node, opts) { + assert("ImportAttribute", node, opts); + } + function assertDecorator(node, opts) { + assert("Decorator", node, opts); + } + function assertDoExpression(node, opts) { + assert("DoExpression", node, opts); + } + function assertExportDefaultSpecifier(node, opts) { + assert("ExportDefaultSpecifier", node, opts); + } + function assertRecordExpression(node, opts) { + assert("RecordExpression", node, opts); + } + function assertTupleExpression(node, opts) { + assert("TupleExpression", node, opts); + } + function assertDecimalLiteral(node, opts) { + assert("DecimalLiteral", node, opts); + } + function assertModuleExpression(node, opts) { + assert("ModuleExpression", node, opts); + } + function assertTopicReference(node, opts) { + assert("TopicReference", node, opts); + } + function assertPipelineTopicExpression(node, opts) { + assert("PipelineTopicExpression", node, opts); + } + function assertPipelineBareFunction(node, opts) { + assert("PipelineBareFunction", node, opts); + } + function assertPipelinePrimaryTopicReference(node, opts) { + assert("PipelinePrimaryTopicReference", node, opts); + } + function assertTSParameterProperty(node, opts) { + assert("TSParameterProperty", node, opts); + } + function assertTSDeclareFunction(node, opts) { + assert("TSDeclareFunction", node, opts); + } + function assertTSDeclareMethod(node, opts) { + assert("TSDeclareMethod", node, opts); + } + function assertTSQualifiedName(node, opts) { + assert("TSQualifiedName", node, opts); + } + function assertTSCallSignatureDeclaration(node, opts) { + assert("TSCallSignatureDeclaration", node, opts); + } + function assertTSConstructSignatureDeclaration(node, opts) { + assert("TSConstructSignatureDeclaration", node, opts); + } + function assertTSPropertySignature(node, opts) { + assert("TSPropertySignature", node, opts); + } + function assertTSMethodSignature(node, opts) { + assert("TSMethodSignature", node, opts); + } + function assertTSIndexSignature(node, opts) { + assert("TSIndexSignature", node, opts); + } + function assertTSAnyKeyword(node, opts) { + assert("TSAnyKeyword", node, opts); + } + function assertTSBooleanKeyword(node, opts) { + assert("TSBooleanKeyword", node, opts); + } + function assertTSBigIntKeyword(node, opts) { + assert("TSBigIntKeyword", node, opts); + } + function assertTSIntrinsicKeyword(node, opts) { + assert("TSIntrinsicKeyword", node, opts); + } + function assertTSNeverKeyword(node, opts) { + assert("TSNeverKeyword", node, opts); + } + function assertTSNullKeyword(node, opts) { + assert("TSNullKeyword", node, opts); + } + function assertTSNumberKeyword(node, opts) { + assert("TSNumberKeyword", node, opts); + } + function assertTSObjectKeyword(node, opts) { + assert("TSObjectKeyword", node, opts); + } + function assertTSStringKeyword(node, opts) { + assert("TSStringKeyword", node, opts); + } + function assertTSSymbolKeyword(node, opts) { + assert("TSSymbolKeyword", node, opts); + } + function assertTSUndefinedKeyword(node, opts) { + assert("TSUndefinedKeyword", node, opts); + } + function assertTSUnknownKeyword(node, opts) { + assert("TSUnknownKeyword", node, opts); + } + function assertTSVoidKeyword(node, opts) { + assert("TSVoidKeyword", node, opts); + } + function assertTSThisType(node, opts) { + assert("TSThisType", node, opts); + } + function assertTSFunctionType(node, opts) { + assert("TSFunctionType", node, opts); + } + function assertTSConstructorType(node, opts) { + assert("TSConstructorType", node, opts); + } + function assertTSTypeReference(node, opts) { + assert("TSTypeReference", node, opts); + } + function assertTSTypePredicate(node, opts) { + assert("TSTypePredicate", node, opts); + } + function assertTSTypeQuery(node, opts) { + assert("TSTypeQuery", node, opts); + } + function assertTSTypeLiteral(node, opts) { + assert("TSTypeLiteral", node, opts); + } + function assertTSArrayType(node, opts) { + assert("TSArrayType", node, opts); + } + function assertTSTupleType(node, opts) { + assert("TSTupleType", node, opts); + } + function assertTSOptionalType(node, opts) { + assert("TSOptionalType", node, opts); + } + function assertTSRestType(node, opts) { + assert("TSRestType", node, opts); + } + function assertTSNamedTupleMember(node, opts) { + assert("TSNamedTupleMember", node, opts); + } + function assertTSUnionType(node, opts) { + assert("TSUnionType", node, opts); + } + function assertTSIntersectionType(node, opts) { + assert("TSIntersectionType", node, opts); + } + function assertTSConditionalType(node, opts) { + assert("TSConditionalType", node, opts); + } + function assertTSInferType(node, opts) { + assert("TSInferType", node, opts); + } + function assertTSParenthesizedType(node, opts) { + assert("TSParenthesizedType", node, opts); + } + function assertTSTypeOperator(node, opts) { + assert("TSTypeOperator", node, opts); + } + function assertTSIndexedAccessType(node, opts) { + assert("TSIndexedAccessType", node, opts); + } + function assertTSMappedType(node, opts) { + assert("TSMappedType", node, opts); + } + function assertTSLiteralType(node, opts) { + assert("TSLiteralType", node, opts); + } + function assertTSExpressionWithTypeArguments(node, opts) { + assert("TSExpressionWithTypeArguments", node, opts); + } + function assertTSInterfaceDeclaration(node, opts) { + assert("TSInterfaceDeclaration", node, opts); + } + function assertTSInterfaceBody(node, opts) { + assert("TSInterfaceBody", node, opts); + } + function assertTSTypeAliasDeclaration(node, opts) { + assert("TSTypeAliasDeclaration", node, opts); + } + function assertTSInstantiationExpression(node, opts) { + assert("TSInstantiationExpression", node, opts); + } + function assertTSAsExpression(node, opts) { + assert("TSAsExpression", node, opts); + } + function assertTSSatisfiesExpression(node, opts) { + assert("TSSatisfiesExpression", node, opts); + } + function assertTSTypeAssertion(node, opts) { + assert("TSTypeAssertion", node, opts); + } + function assertTSEnumDeclaration(node, opts) { + assert("TSEnumDeclaration", node, opts); + } + function assertTSEnumMember(node, opts) { + assert("TSEnumMember", node, opts); + } + function assertTSModuleDeclaration(node, opts) { + assert("TSModuleDeclaration", node, opts); + } + function assertTSModuleBlock(node, opts) { + assert("TSModuleBlock", node, opts); + } + function assertTSImportType(node, opts) { + assert("TSImportType", node, opts); + } + function assertTSImportEqualsDeclaration(node, opts) { + assert("TSImportEqualsDeclaration", node, opts); + } + function assertTSExternalModuleReference(node, opts) { + assert("TSExternalModuleReference", node, opts); + } + function assertTSNonNullExpression(node, opts) { + assert("TSNonNullExpression", node, opts); + } + function assertTSExportAssignment(node, opts) { + assert("TSExportAssignment", node, opts); + } + function assertTSNamespaceExportDeclaration(node, opts) { + assert("TSNamespaceExportDeclaration", node, opts); + } + function assertTSTypeAnnotation(node, opts) { + assert("TSTypeAnnotation", node, opts); + } + function assertTSTypeParameterInstantiation(node, opts) { + assert("TSTypeParameterInstantiation", node, opts); + } + function assertTSTypeParameterDeclaration(node, opts) { + assert("TSTypeParameterDeclaration", node, opts); + } + function assertTSTypeParameter(node, opts) { + assert("TSTypeParameter", node, opts); + } + function assertStandardized(node, opts) { + assert("Standardized", node, opts); + } + function assertExpression(node, opts) { + assert("Expression", node, opts); + } + function assertBinary(node, opts) { + assert("Binary", node, opts); + } + function assertScopable(node, opts) { + assert("Scopable", node, opts); + } + function assertBlockParent(node, opts) { + assert("BlockParent", node, opts); + } + function assertBlock(node, opts) { + assert("Block", node, opts); + } + function assertStatement(node, opts) { + assert("Statement", node, opts); + } + function assertTerminatorless(node, opts) { + assert("Terminatorless", node, opts); + } + function assertCompletionStatement(node, opts) { + assert("CompletionStatement", node, opts); + } + function assertConditional(node, opts) { + assert("Conditional", node, opts); + } + function assertLoop(node, opts) { + assert("Loop", node, opts); + } + function assertWhile(node, opts) { + assert("While", node, opts); + } + function assertExpressionWrapper(node, opts) { + assert("ExpressionWrapper", node, opts); + } + function assertFor(node, opts) { + assert("For", node, opts); + } + function assertForXStatement(node, opts) { + assert("ForXStatement", node, opts); + } + function assertFunction(node, opts) { + assert("Function", node, opts); + } + function assertFunctionParent(node, opts) { + assert("FunctionParent", node, opts); + } + function assertPureish(node, opts) { + assert("Pureish", node, opts); + } + function assertDeclaration(node, opts) { + assert("Declaration", node, opts); + } + function assertPatternLike(node, opts) { + assert("PatternLike", node, opts); + } + function assertLVal(node, opts) { + assert("LVal", node, opts); + } + function assertTSEntityName(node, opts) { + assert("TSEntityName", node, opts); + } + function assertLiteral(node, opts) { + assert("Literal", node, opts); + } + function assertImmutable(node, opts) { + assert("Immutable", node, opts); + } + function assertUserWhitespacable(node, opts) { + assert("UserWhitespacable", node, opts); + } + function assertMethod(node, opts) { + assert("Method", node, opts); + } + function assertObjectMember(node, opts) { + assert("ObjectMember", node, opts); + } + function assertProperty(node, opts) { + assert("Property", node, opts); + } + function assertUnaryLike(node, opts) { + assert("UnaryLike", node, opts); + } + function assertPattern(node, opts) { + assert("Pattern", node, opts); + } + function assertClass(node, opts) { + assert("Class", node, opts); + } + function assertImportOrExportDeclaration(node, opts) { + assert("ImportOrExportDeclaration", node, opts); + } + function assertExportDeclaration(node, opts) { + assert("ExportDeclaration", node, opts); + } + function assertModuleSpecifier(node, opts) { + assert("ModuleSpecifier", node, opts); + } + function assertAccessor(node, opts) { + assert("Accessor", node, opts); + } + function assertPrivate(node, opts) { + assert("Private", node, opts); + } + function assertFlow(node, opts) { + assert("Flow", node, opts); + } + function assertFlowType(node, opts) { + assert("FlowType", node, opts); + } + function assertFlowBaseAnnotation(node, opts) { + assert("FlowBaseAnnotation", node, opts); + } + function assertFlowDeclaration(node, opts) { + assert("FlowDeclaration", node, opts); + } + function assertFlowPredicate(node, opts) { + assert("FlowPredicate", node, opts); + } + function assertEnumBody(node, opts) { + assert("EnumBody", node, opts); + } + function assertEnumMember(node, opts) { + assert("EnumMember", node, opts); + } + function assertJSX(node, opts) { + assert("JSX", node, opts); + } + function assertMiscellaneous(node, opts) { + assert("Miscellaneous", node, opts); + } + function assertTypeScript(node, opts) { + assert("TypeScript", node, opts); + } + function assertTSTypeElement(node, opts) { + assert("TSTypeElement", node, opts); + } + function assertTSType(node, opts) { + assert("TSType", node, opts); + } + function assertTSBaseType(node, opts) { + assert("TSBaseType", node, opts); + } + function assertNumberLiteral(node, opts) { + (0, _deprecationWarning.default)("assertNumberLiteral", "assertNumericLiteral"); + assert("NumberLiteral", node, opts); + } + function assertRegexLiteral(node, opts) { + (0, _deprecationWarning.default)("assertRegexLiteral", "assertRegExpLiteral"); + assert("RegexLiteral", node, opts); + } + function assertRestProperty(node, opts) { + (0, _deprecationWarning.default)("assertRestProperty", "assertRestElement"); + assert("RestProperty", node, opts); + } + function assertSpreadProperty(node, opts) { + (0, _deprecationWarning.default)("assertSpreadProperty", "assertSpreadElement"); + assert("SpreadProperty", node, opts); + } + function assertModuleDeclaration(node, opts) { + (0, _deprecationWarning.default)("assertModuleDeclaration", "assertImportOrExportDeclaration"); + assert("ModuleDeclaration", node, opts); + } + + + return generated$1; +} + +var createTypeAnnotationBasedOnTypeof = {}; + +var hasRequiredCreateTypeAnnotationBasedOnTypeof; + +function requireCreateTypeAnnotationBasedOnTypeof () { + if (hasRequiredCreateTypeAnnotationBasedOnTypeof) return createTypeAnnotationBasedOnTypeof; + hasRequiredCreateTypeAnnotationBasedOnTypeof = 1; + + Object.defineProperty(createTypeAnnotationBasedOnTypeof, "__esModule", { + value: true + }); + createTypeAnnotationBasedOnTypeof.default = void 0; + var _index = requireGenerated$2(); + createTypeAnnotationBasedOnTypeof.default = createTypeAnnotationBasedOnTypeof$1; + function createTypeAnnotationBasedOnTypeof$1(type) { + switch (type) { + case "string": + return (0, _index.stringTypeAnnotation)(); + case "number": + return (0, _index.numberTypeAnnotation)(); + case "undefined": + return (0, _index.voidTypeAnnotation)(); + case "boolean": + return (0, _index.booleanTypeAnnotation)(); + case "function": + return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Function")); + case "object": + return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Object")); + case "symbol": + return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Symbol")); + case "bigint": + return (0, _index.anyTypeAnnotation)(); + } + throw new Error("Invalid typeof value: " + type); + } + + + return createTypeAnnotationBasedOnTypeof; +} + +var createFlowUnionType = {}; + +var removeTypeDuplicates$1 = {}; + +var hasRequiredRemoveTypeDuplicates$1; + +function requireRemoveTypeDuplicates$1 () { + if (hasRequiredRemoveTypeDuplicates$1) return removeTypeDuplicates$1; + hasRequiredRemoveTypeDuplicates$1 = 1; + + Object.defineProperty(removeTypeDuplicates$1, "__esModule", { + value: true + }); + removeTypeDuplicates$1.default = removeTypeDuplicates; + var _index = requireGenerated$3(); + function getQualifiedName(node) { + return (0, _index.isIdentifier)(node) ? node.name : `${node.id.name}.${getQualifiedName(node.qualification)}`; + } + function removeTypeDuplicates(nodesIn) { + const nodes = Array.from(nodesIn); + const generics = new Map(); + const bases = new Map(); + const typeGroups = new Set(); + const types = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node) continue; + if (types.includes(node)) { + continue; + } + if ((0, _index.isAnyTypeAnnotation)(node)) { + return [node]; + } + if ((0, _index.isFlowBaseAnnotation)(node)) { + bases.set(node.type, node); + continue; + } + if ((0, _index.isUnionTypeAnnotation)(node)) { + if (!typeGroups.has(node.types)) { + nodes.push(...node.types); + typeGroups.add(node.types); + } + continue; + } + if ((0, _index.isGenericTypeAnnotation)(node)) { + const name = getQualifiedName(node.id); + if (generics.has(name)) { + let existing = generics.get(name); + if (existing.typeParameters) { + if (node.typeParameters) { + existing.typeParameters.params.push(...node.typeParameters.params); + existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params); + } + } else { + existing = node.typeParameters; + } + } else { + generics.set(name, node); + } + continue; + } + types.push(node); + } + for (const [, baseType] of bases) { + types.push(baseType); + } + for (const [, genericName] of generics) { + types.push(genericName); + } + return types; + } + + + return removeTypeDuplicates$1; +} + +var hasRequiredCreateFlowUnionType; + +function requireCreateFlowUnionType () { + if (hasRequiredCreateFlowUnionType) return createFlowUnionType; + hasRequiredCreateFlowUnionType = 1; + + Object.defineProperty(createFlowUnionType, "__esModule", { + value: true + }); + createFlowUnionType.default = createFlowUnionType$1; + var _index = requireGenerated$2(); + var _removeTypeDuplicates = requireRemoveTypeDuplicates$1(); + function createFlowUnionType$1(types) { + const flattened = (0, _removeTypeDuplicates.default)(types); + if (flattened.length === 1) { + return flattened[0]; + } else { + return (0, _index.unionTypeAnnotation)(flattened); + } + } + + + return createFlowUnionType; +} + +var createTSUnionType = {}; + +var removeTypeDuplicates = {}; + +var hasRequiredRemoveTypeDuplicates; + +function requireRemoveTypeDuplicates () { + if (hasRequiredRemoveTypeDuplicates) return removeTypeDuplicates; + hasRequiredRemoveTypeDuplicates = 1; + + Object.defineProperty(removeTypeDuplicates, "__esModule", { + value: true + }); + removeTypeDuplicates.default = removeTypeDuplicates$1; + var _index = requireGenerated$3(); + function getQualifiedName(node) { + return (0, _index.isIdentifier)(node) ? node.name : `${node.right.name}.${getQualifiedName(node.left)}`; + } + function removeTypeDuplicates$1(nodesIn) { + const nodes = Array.from(nodesIn); + const generics = new Map(); + const bases = new Map(); + const typeGroups = new Set(); + const types = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node) continue; + if (types.includes(node)) { + continue; + } + if ((0, _index.isTSAnyKeyword)(node)) { + return [node]; + } + if ((0, _index.isTSBaseType)(node)) { + bases.set(node.type, node); + continue; + } + if ((0, _index.isTSUnionType)(node)) { + if (!typeGroups.has(node.types)) { + nodes.push(...node.types); + typeGroups.add(node.types); + } + continue; + } + if ((0, _index.isTSTypeReference)(node) && node.typeParameters) { + const name = getQualifiedName(node.typeName); + if (generics.has(name)) { + let existing = generics.get(name); + if (existing.typeParameters) { + if (node.typeParameters) { + existing.typeParameters.params.push(...node.typeParameters.params); + existing.typeParameters.params = removeTypeDuplicates$1(existing.typeParameters.params); + } + } else { + existing = node.typeParameters; + } + } else { + generics.set(name, node); + } + continue; + } + types.push(node); + } + for (const [, baseType] of bases) { + types.push(baseType); + } + for (const [, genericName] of generics) { + types.push(genericName); + } + return types; + } + + + return removeTypeDuplicates; +} + +var hasRequiredCreateTSUnionType; + +function requireCreateTSUnionType () { + if (hasRequiredCreateTSUnionType) return createTSUnionType; + hasRequiredCreateTSUnionType = 1; + + Object.defineProperty(createTSUnionType, "__esModule", { + value: true + }); + createTSUnionType.default = createTSUnionType$1; + var _index = requireGenerated$2(); + var _removeTypeDuplicates = requireRemoveTypeDuplicates(); + var _index2 = requireGenerated$3(); + function createTSUnionType$1(typeAnnotations) { + const types = typeAnnotations.map(type => { + return (0, _index2.isTSTypeAnnotation)(type) ? type.typeAnnotation : type; + }); + const flattened = (0, _removeTypeDuplicates.default)(types); + if (flattened.length === 1) { + return flattened[0]; + } else { + return (0, _index.tsUnionType)(flattened); + } + } + + + return createTSUnionType; +} + +var uppercase = {}; + +var hasRequiredUppercase; + +function requireUppercase () { + if (hasRequiredUppercase) return uppercase; + hasRequiredUppercase = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "AnyTypeAnnotation", { + enumerable: true, + get: function () { + return _index.anyTypeAnnotation; + } + }); + Object.defineProperty(exports, "ArgumentPlaceholder", { + enumerable: true, + get: function () { + return _index.argumentPlaceholder; + } + }); + Object.defineProperty(exports, "ArrayExpression", { + enumerable: true, + get: function () { + return _index.arrayExpression; + } + }); + Object.defineProperty(exports, "ArrayPattern", { + enumerable: true, + get: function () { + return _index.arrayPattern; + } + }); + Object.defineProperty(exports, "ArrayTypeAnnotation", { + enumerable: true, + get: function () { + return _index.arrayTypeAnnotation; + } + }); + Object.defineProperty(exports, "ArrowFunctionExpression", { + enumerable: true, + get: function () { + return _index.arrowFunctionExpression; + } + }); + Object.defineProperty(exports, "AssignmentExpression", { + enumerable: true, + get: function () { + return _index.assignmentExpression; + } + }); + Object.defineProperty(exports, "AssignmentPattern", { + enumerable: true, + get: function () { + return _index.assignmentPattern; + } + }); + Object.defineProperty(exports, "AwaitExpression", { + enumerable: true, + get: function () { + return _index.awaitExpression; + } + }); + Object.defineProperty(exports, "BigIntLiteral", { + enumerable: true, + get: function () { + return _index.bigIntLiteral; + } + }); + Object.defineProperty(exports, "BinaryExpression", { + enumerable: true, + get: function () { + return _index.binaryExpression; + } + }); + Object.defineProperty(exports, "BindExpression", { + enumerable: true, + get: function () { + return _index.bindExpression; + } + }); + Object.defineProperty(exports, "BlockStatement", { + enumerable: true, + get: function () { + return _index.blockStatement; + } + }); + Object.defineProperty(exports, "BooleanLiteral", { + enumerable: true, + get: function () { + return _index.booleanLiteral; + } + }); + Object.defineProperty(exports, "BooleanLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.booleanLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "BooleanTypeAnnotation", { + enumerable: true, + get: function () { + return _index.booleanTypeAnnotation; + } + }); + Object.defineProperty(exports, "BreakStatement", { + enumerable: true, + get: function () { + return _index.breakStatement; + } + }); + Object.defineProperty(exports, "CallExpression", { + enumerable: true, + get: function () { + return _index.callExpression; + } + }); + Object.defineProperty(exports, "CatchClause", { + enumerable: true, + get: function () { + return _index.catchClause; + } + }); + Object.defineProperty(exports, "ClassAccessorProperty", { + enumerable: true, + get: function () { + return _index.classAccessorProperty; + } + }); + Object.defineProperty(exports, "ClassBody", { + enumerable: true, + get: function () { + return _index.classBody; + } + }); + Object.defineProperty(exports, "ClassDeclaration", { + enumerable: true, + get: function () { + return _index.classDeclaration; + } + }); + Object.defineProperty(exports, "ClassExpression", { + enumerable: true, + get: function () { + return _index.classExpression; + } + }); + Object.defineProperty(exports, "ClassImplements", { + enumerable: true, + get: function () { + return _index.classImplements; + } + }); + Object.defineProperty(exports, "ClassMethod", { + enumerable: true, + get: function () { + return _index.classMethod; + } + }); + Object.defineProperty(exports, "ClassPrivateMethod", { + enumerable: true, + get: function () { + return _index.classPrivateMethod; + } + }); + Object.defineProperty(exports, "ClassPrivateProperty", { + enumerable: true, + get: function () { + return _index.classPrivateProperty; + } + }); + Object.defineProperty(exports, "ClassProperty", { + enumerable: true, + get: function () { + return _index.classProperty; + } + }); + Object.defineProperty(exports, "ConditionalExpression", { + enumerable: true, + get: function () { + return _index.conditionalExpression; + } + }); + Object.defineProperty(exports, "ContinueStatement", { + enumerable: true, + get: function () { + return _index.continueStatement; + } + }); + Object.defineProperty(exports, "DebuggerStatement", { + enumerable: true, + get: function () { + return _index.debuggerStatement; + } + }); + Object.defineProperty(exports, "DecimalLiteral", { + enumerable: true, + get: function () { + return _index.decimalLiteral; + } + }); + Object.defineProperty(exports, "DeclareClass", { + enumerable: true, + get: function () { + return _index.declareClass; + } + }); + Object.defineProperty(exports, "DeclareExportAllDeclaration", { + enumerable: true, + get: function () { + return _index.declareExportAllDeclaration; + } + }); + Object.defineProperty(exports, "DeclareExportDeclaration", { + enumerable: true, + get: function () { + return _index.declareExportDeclaration; + } + }); + Object.defineProperty(exports, "DeclareFunction", { + enumerable: true, + get: function () { + return _index.declareFunction; + } + }); + Object.defineProperty(exports, "DeclareInterface", { + enumerable: true, + get: function () { + return _index.declareInterface; + } + }); + Object.defineProperty(exports, "DeclareModule", { + enumerable: true, + get: function () { + return _index.declareModule; + } + }); + Object.defineProperty(exports, "DeclareModuleExports", { + enumerable: true, + get: function () { + return _index.declareModuleExports; + } + }); + Object.defineProperty(exports, "DeclareOpaqueType", { + enumerable: true, + get: function () { + return _index.declareOpaqueType; + } + }); + Object.defineProperty(exports, "DeclareTypeAlias", { + enumerable: true, + get: function () { + return _index.declareTypeAlias; + } + }); + Object.defineProperty(exports, "DeclareVariable", { + enumerable: true, + get: function () { + return _index.declareVariable; + } + }); + Object.defineProperty(exports, "DeclaredPredicate", { + enumerable: true, + get: function () { + return _index.declaredPredicate; + } + }); + Object.defineProperty(exports, "Decorator", { + enumerable: true, + get: function () { + return _index.decorator; + } + }); + Object.defineProperty(exports, "Directive", { + enumerable: true, + get: function () { + return _index.directive; + } + }); + Object.defineProperty(exports, "DirectiveLiteral", { + enumerable: true, + get: function () { + return _index.directiveLiteral; + } + }); + Object.defineProperty(exports, "DoExpression", { + enumerable: true, + get: function () { + return _index.doExpression; + } + }); + Object.defineProperty(exports, "DoWhileStatement", { + enumerable: true, + get: function () { + return _index.doWhileStatement; + } + }); + Object.defineProperty(exports, "EmptyStatement", { + enumerable: true, + get: function () { + return _index.emptyStatement; + } + }); + Object.defineProperty(exports, "EmptyTypeAnnotation", { + enumerable: true, + get: function () { + return _index.emptyTypeAnnotation; + } + }); + Object.defineProperty(exports, "EnumBooleanBody", { + enumerable: true, + get: function () { + return _index.enumBooleanBody; + } + }); + Object.defineProperty(exports, "EnumBooleanMember", { + enumerable: true, + get: function () { + return _index.enumBooleanMember; + } + }); + Object.defineProperty(exports, "EnumDeclaration", { + enumerable: true, + get: function () { + return _index.enumDeclaration; + } + }); + Object.defineProperty(exports, "EnumDefaultedMember", { + enumerable: true, + get: function () { + return _index.enumDefaultedMember; + } + }); + Object.defineProperty(exports, "EnumNumberBody", { + enumerable: true, + get: function () { + return _index.enumNumberBody; + } + }); + Object.defineProperty(exports, "EnumNumberMember", { + enumerable: true, + get: function () { + return _index.enumNumberMember; + } + }); + Object.defineProperty(exports, "EnumStringBody", { + enumerable: true, + get: function () { + return _index.enumStringBody; + } + }); + Object.defineProperty(exports, "EnumStringMember", { + enumerable: true, + get: function () { + return _index.enumStringMember; + } + }); + Object.defineProperty(exports, "EnumSymbolBody", { + enumerable: true, + get: function () { + return _index.enumSymbolBody; + } + }); + Object.defineProperty(exports, "ExistsTypeAnnotation", { + enumerable: true, + get: function () { + return _index.existsTypeAnnotation; + } + }); + Object.defineProperty(exports, "ExportAllDeclaration", { + enumerable: true, + get: function () { + return _index.exportAllDeclaration; + } + }); + Object.defineProperty(exports, "ExportDefaultDeclaration", { + enumerable: true, + get: function () { + return _index.exportDefaultDeclaration; + } + }); + Object.defineProperty(exports, "ExportDefaultSpecifier", { + enumerable: true, + get: function () { + return _index.exportDefaultSpecifier; + } + }); + Object.defineProperty(exports, "ExportNamedDeclaration", { + enumerable: true, + get: function () { + return _index.exportNamedDeclaration; + } + }); + Object.defineProperty(exports, "ExportNamespaceSpecifier", { + enumerable: true, + get: function () { + return _index.exportNamespaceSpecifier; + } + }); + Object.defineProperty(exports, "ExportSpecifier", { + enumerable: true, + get: function () { + return _index.exportSpecifier; + } + }); + Object.defineProperty(exports, "ExpressionStatement", { + enumerable: true, + get: function () { + return _index.expressionStatement; + } + }); + Object.defineProperty(exports, "File", { + enumerable: true, + get: function () { + return _index.file; + } + }); + Object.defineProperty(exports, "ForInStatement", { + enumerable: true, + get: function () { + return _index.forInStatement; + } + }); + Object.defineProperty(exports, "ForOfStatement", { + enumerable: true, + get: function () { + return _index.forOfStatement; + } + }); + Object.defineProperty(exports, "ForStatement", { + enumerable: true, + get: function () { + return _index.forStatement; + } + }); + Object.defineProperty(exports, "FunctionDeclaration", { + enumerable: true, + get: function () { + return _index.functionDeclaration; + } + }); + Object.defineProperty(exports, "FunctionExpression", { + enumerable: true, + get: function () { + return _index.functionExpression; + } + }); + Object.defineProperty(exports, "FunctionTypeAnnotation", { + enumerable: true, + get: function () { + return _index.functionTypeAnnotation; + } + }); + Object.defineProperty(exports, "FunctionTypeParam", { + enumerable: true, + get: function () { + return _index.functionTypeParam; + } + }); + Object.defineProperty(exports, "GenericTypeAnnotation", { + enumerable: true, + get: function () { + return _index.genericTypeAnnotation; + } + }); + Object.defineProperty(exports, "Identifier", { + enumerable: true, + get: function () { + return _index.identifier; + } + }); + Object.defineProperty(exports, "IfStatement", { + enumerable: true, + get: function () { + return _index.ifStatement; + } + }); + Object.defineProperty(exports, "Import", { + enumerable: true, + get: function () { + return _index.import; + } + }); + Object.defineProperty(exports, "ImportAttribute", { + enumerable: true, + get: function () { + return _index.importAttribute; + } + }); + Object.defineProperty(exports, "ImportDeclaration", { + enumerable: true, + get: function () { + return _index.importDeclaration; + } + }); + Object.defineProperty(exports, "ImportDefaultSpecifier", { + enumerable: true, + get: function () { + return _index.importDefaultSpecifier; + } + }); + Object.defineProperty(exports, "ImportExpression", { + enumerable: true, + get: function () { + return _index.importExpression; + } + }); + Object.defineProperty(exports, "ImportNamespaceSpecifier", { + enumerable: true, + get: function () { + return _index.importNamespaceSpecifier; + } + }); + Object.defineProperty(exports, "ImportSpecifier", { + enumerable: true, + get: function () { + return _index.importSpecifier; + } + }); + Object.defineProperty(exports, "IndexedAccessType", { + enumerable: true, + get: function () { + return _index.indexedAccessType; + } + }); + Object.defineProperty(exports, "InferredPredicate", { + enumerable: true, + get: function () { + return _index.inferredPredicate; + } + }); + Object.defineProperty(exports, "InterfaceDeclaration", { + enumerable: true, + get: function () { + return _index.interfaceDeclaration; + } + }); + Object.defineProperty(exports, "InterfaceExtends", { + enumerable: true, + get: function () { + return _index.interfaceExtends; + } + }); + Object.defineProperty(exports, "InterfaceTypeAnnotation", { + enumerable: true, + get: function () { + return _index.interfaceTypeAnnotation; + } + }); + Object.defineProperty(exports, "InterpreterDirective", { + enumerable: true, + get: function () { + return _index.interpreterDirective; + } + }); + Object.defineProperty(exports, "IntersectionTypeAnnotation", { + enumerable: true, + get: function () { + return _index.intersectionTypeAnnotation; + } + }); + Object.defineProperty(exports, "JSXAttribute", { + enumerable: true, + get: function () { + return _index.jsxAttribute; + } + }); + Object.defineProperty(exports, "JSXClosingElement", { + enumerable: true, + get: function () { + return _index.jsxClosingElement; + } + }); + Object.defineProperty(exports, "JSXClosingFragment", { + enumerable: true, + get: function () { + return _index.jsxClosingFragment; + } + }); + Object.defineProperty(exports, "JSXElement", { + enumerable: true, + get: function () { + return _index.jsxElement; + } + }); + Object.defineProperty(exports, "JSXEmptyExpression", { + enumerable: true, + get: function () { + return _index.jsxEmptyExpression; + } + }); + Object.defineProperty(exports, "JSXExpressionContainer", { + enumerable: true, + get: function () { + return _index.jsxExpressionContainer; + } + }); + Object.defineProperty(exports, "JSXFragment", { + enumerable: true, + get: function () { + return _index.jsxFragment; + } + }); + Object.defineProperty(exports, "JSXIdentifier", { + enumerable: true, + get: function () { + return _index.jsxIdentifier; + } + }); + Object.defineProperty(exports, "JSXMemberExpression", { + enumerable: true, + get: function () { + return _index.jsxMemberExpression; + } + }); + Object.defineProperty(exports, "JSXNamespacedName", { + enumerable: true, + get: function () { + return _index.jsxNamespacedName; + } + }); + Object.defineProperty(exports, "JSXOpeningElement", { + enumerable: true, + get: function () { + return _index.jsxOpeningElement; + } + }); + Object.defineProperty(exports, "JSXOpeningFragment", { + enumerable: true, + get: function () { + return _index.jsxOpeningFragment; + } + }); + Object.defineProperty(exports, "JSXSpreadAttribute", { + enumerable: true, + get: function () { + return _index.jsxSpreadAttribute; + } + }); + Object.defineProperty(exports, "JSXSpreadChild", { + enumerable: true, + get: function () { + return _index.jsxSpreadChild; + } + }); + Object.defineProperty(exports, "JSXText", { + enumerable: true, + get: function () { + return _index.jsxText; + } + }); + Object.defineProperty(exports, "LabeledStatement", { + enumerable: true, + get: function () { + return _index.labeledStatement; + } + }); + Object.defineProperty(exports, "LogicalExpression", { + enumerable: true, + get: function () { + return _index.logicalExpression; + } + }); + Object.defineProperty(exports, "MemberExpression", { + enumerable: true, + get: function () { + return _index.memberExpression; + } + }); + Object.defineProperty(exports, "MetaProperty", { + enumerable: true, + get: function () { + return _index.metaProperty; + } + }); + Object.defineProperty(exports, "MixedTypeAnnotation", { + enumerable: true, + get: function () { + return _index.mixedTypeAnnotation; + } + }); + Object.defineProperty(exports, "ModuleExpression", { + enumerable: true, + get: function () { + return _index.moduleExpression; + } + }); + Object.defineProperty(exports, "NewExpression", { + enumerable: true, + get: function () { + return _index.newExpression; + } + }); + Object.defineProperty(exports, "Noop", { + enumerable: true, + get: function () { + return _index.noop; + } + }); + Object.defineProperty(exports, "NullLiteral", { + enumerable: true, + get: function () { + return _index.nullLiteral; + } + }); + Object.defineProperty(exports, "NullLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.nullLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "NullableTypeAnnotation", { + enumerable: true, + get: function () { + return _index.nullableTypeAnnotation; + } + }); + Object.defineProperty(exports, "NumberLiteral", { + enumerable: true, + get: function () { + return _index.numberLiteral; + } + }); + Object.defineProperty(exports, "NumberLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.numberLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "NumberTypeAnnotation", { + enumerable: true, + get: function () { + return _index.numberTypeAnnotation; + } + }); + Object.defineProperty(exports, "NumericLiteral", { + enumerable: true, + get: function () { + return _index.numericLiteral; + } + }); + Object.defineProperty(exports, "ObjectExpression", { + enumerable: true, + get: function () { + return _index.objectExpression; + } + }); + Object.defineProperty(exports, "ObjectMethod", { + enumerable: true, + get: function () { + return _index.objectMethod; + } + }); + Object.defineProperty(exports, "ObjectPattern", { + enumerable: true, + get: function () { + return _index.objectPattern; + } + }); + Object.defineProperty(exports, "ObjectProperty", { + enumerable: true, + get: function () { + return _index.objectProperty; + } + }); + Object.defineProperty(exports, "ObjectTypeAnnotation", { + enumerable: true, + get: function () { + return _index.objectTypeAnnotation; + } + }); + Object.defineProperty(exports, "ObjectTypeCallProperty", { + enumerable: true, + get: function () { + return _index.objectTypeCallProperty; + } + }); + Object.defineProperty(exports, "ObjectTypeIndexer", { + enumerable: true, + get: function () { + return _index.objectTypeIndexer; + } + }); + Object.defineProperty(exports, "ObjectTypeInternalSlot", { + enumerable: true, + get: function () { + return _index.objectTypeInternalSlot; + } + }); + Object.defineProperty(exports, "ObjectTypeProperty", { + enumerable: true, + get: function () { + return _index.objectTypeProperty; + } + }); + Object.defineProperty(exports, "ObjectTypeSpreadProperty", { + enumerable: true, + get: function () { + return _index.objectTypeSpreadProperty; + } + }); + Object.defineProperty(exports, "OpaqueType", { + enumerable: true, + get: function () { + return _index.opaqueType; + } + }); + Object.defineProperty(exports, "OptionalCallExpression", { + enumerable: true, + get: function () { + return _index.optionalCallExpression; + } + }); + Object.defineProperty(exports, "OptionalIndexedAccessType", { + enumerable: true, + get: function () { + return _index.optionalIndexedAccessType; + } + }); + Object.defineProperty(exports, "OptionalMemberExpression", { + enumerable: true, + get: function () { + return _index.optionalMemberExpression; + } + }); + Object.defineProperty(exports, "ParenthesizedExpression", { + enumerable: true, + get: function () { + return _index.parenthesizedExpression; + } + }); + Object.defineProperty(exports, "PipelineBareFunction", { + enumerable: true, + get: function () { + return _index.pipelineBareFunction; + } + }); + Object.defineProperty(exports, "PipelinePrimaryTopicReference", { + enumerable: true, + get: function () { + return _index.pipelinePrimaryTopicReference; + } + }); + Object.defineProperty(exports, "PipelineTopicExpression", { + enumerable: true, + get: function () { + return _index.pipelineTopicExpression; + } + }); + Object.defineProperty(exports, "Placeholder", { + enumerable: true, + get: function () { + return _index.placeholder; + } + }); + Object.defineProperty(exports, "PrivateName", { + enumerable: true, + get: function () { + return _index.privateName; + } + }); + Object.defineProperty(exports, "Program", { + enumerable: true, + get: function () { + return _index.program; + } + }); + Object.defineProperty(exports, "QualifiedTypeIdentifier", { + enumerable: true, + get: function () { + return _index.qualifiedTypeIdentifier; + } + }); + Object.defineProperty(exports, "RecordExpression", { + enumerable: true, + get: function () { + return _index.recordExpression; + } + }); + Object.defineProperty(exports, "RegExpLiteral", { + enumerable: true, + get: function () { + return _index.regExpLiteral; + } + }); + Object.defineProperty(exports, "RegexLiteral", { + enumerable: true, + get: function () { + return _index.regexLiteral; + } + }); + Object.defineProperty(exports, "RestElement", { + enumerable: true, + get: function () { + return _index.restElement; + } + }); + Object.defineProperty(exports, "RestProperty", { + enumerable: true, + get: function () { + return _index.restProperty; + } + }); + Object.defineProperty(exports, "ReturnStatement", { + enumerable: true, + get: function () { + return _index.returnStatement; + } + }); + Object.defineProperty(exports, "SequenceExpression", { + enumerable: true, + get: function () { + return _index.sequenceExpression; + } + }); + Object.defineProperty(exports, "SpreadElement", { + enumerable: true, + get: function () { + return _index.spreadElement; + } + }); + Object.defineProperty(exports, "SpreadProperty", { + enumerable: true, + get: function () { + return _index.spreadProperty; + } + }); + Object.defineProperty(exports, "StaticBlock", { + enumerable: true, + get: function () { + return _index.staticBlock; + } + }); + Object.defineProperty(exports, "StringLiteral", { + enumerable: true, + get: function () { + return _index.stringLiteral; + } + }); + Object.defineProperty(exports, "StringLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.stringLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "StringTypeAnnotation", { + enumerable: true, + get: function () { + return _index.stringTypeAnnotation; + } + }); + Object.defineProperty(exports, "Super", { + enumerable: true, + get: function () { + return _index.super; + } + }); + Object.defineProperty(exports, "SwitchCase", { + enumerable: true, + get: function () { + return _index.switchCase; + } + }); + Object.defineProperty(exports, "SwitchStatement", { + enumerable: true, + get: function () { + return _index.switchStatement; + } + }); + Object.defineProperty(exports, "SymbolTypeAnnotation", { + enumerable: true, + get: function () { + return _index.symbolTypeAnnotation; + } + }); + Object.defineProperty(exports, "TSAnyKeyword", { + enumerable: true, + get: function () { + return _index.tsAnyKeyword; + } + }); + Object.defineProperty(exports, "TSArrayType", { + enumerable: true, + get: function () { + return _index.tsArrayType; + } + }); + Object.defineProperty(exports, "TSAsExpression", { + enumerable: true, + get: function () { + return _index.tsAsExpression; + } + }); + Object.defineProperty(exports, "TSBigIntKeyword", { + enumerable: true, + get: function () { + return _index.tsBigIntKeyword; + } + }); + Object.defineProperty(exports, "TSBooleanKeyword", { + enumerable: true, + get: function () { + return _index.tsBooleanKeyword; + } + }); + Object.defineProperty(exports, "TSCallSignatureDeclaration", { + enumerable: true, + get: function () { + return _index.tsCallSignatureDeclaration; + } + }); + Object.defineProperty(exports, "TSConditionalType", { + enumerable: true, + get: function () { + return _index.tsConditionalType; + } + }); + Object.defineProperty(exports, "TSConstructSignatureDeclaration", { + enumerable: true, + get: function () { + return _index.tsConstructSignatureDeclaration; + } + }); + Object.defineProperty(exports, "TSConstructorType", { + enumerable: true, + get: function () { + return _index.tsConstructorType; + } + }); + Object.defineProperty(exports, "TSDeclareFunction", { + enumerable: true, + get: function () { + return _index.tsDeclareFunction; + } + }); + Object.defineProperty(exports, "TSDeclareMethod", { + enumerable: true, + get: function () { + return _index.tsDeclareMethod; + } + }); + Object.defineProperty(exports, "TSEnumDeclaration", { + enumerable: true, + get: function () { + return _index.tsEnumDeclaration; + } + }); + Object.defineProperty(exports, "TSEnumMember", { + enumerable: true, + get: function () { + return _index.tsEnumMember; + } + }); + Object.defineProperty(exports, "TSExportAssignment", { + enumerable: true, + get: function () { + return _index.tsExportAssignment; + } + }); + Object.defineProperty(exports, "TSExpressionWithTypeArguments", { + enumerable: true, + get: function () { + return _index.tsExpressionWithTypeArguments; + } + }); + Object.defineProperty(exports, "TSExternalModuleReference", { + enumerable: true, + get: function () { + return _index.tsExternalModuleReference; + } + }); + Object.defineProperty(exports, "TSFunctionType", { + enumerable: true, + get: function () { + return _index.tsFunctionType; + } + }); + Object.defineProperty(exports, "TSImportEqualsDeclaration", { + enumerable: true, + get: function () { + return _index.tsImportEqualsDeclaration; + } + }); + Object.defineProperty(exports, "TSImportType", { + enumerable: true, + get: function () { + return _index.tsImportType; + } + }); + Object.defineProperty(exports, "TSIndexSignature", { + enumerable: true, + get: function () { + return _index.tsIndexSignature; + } + }); + Object.defineProperty(exports, "TSIndexedAccessType", { + enumerable: true, + get: function () { + return _index.tsIndexedAccessType; + } + }); + Object.defineProperty(exports, "TSInferType", { + enumerable: true, + get: function () { + return _index.tsInferType; + } + }); + Object.defineProperty(exports, "TSInstantiationExpression", { + enumerable: true, + get: function () { + return _index.tsInstantiationExpression; + } + }); + Object.defineProperty(exports, "TSInterfaceBody", { + enumerable: true, + get: function () { + return _index.tsInterfaceBody; + } + }); + Object.defineProperty(exports, "TSInterfaceDeclaration", { + enumerable: true, + get: function () { + return _index.tsInterfaceDeclaration; + } + }); + Object.defineProperty(exports, "TSIntersectionType", { + enumerable: true, + get: function () { + return _index.tsIntersectionType; + } + }); + Object.defineProperty(exports, "TSIntrinsicKeyword", { + enumerable: true, + get: function () { + return _index.tsIntrinsicKeyword; + } + }); + Object.defineProperty(exports, "TSLiteralType", { + enumerable: true, + get: function () { + return _index.tsLiteralType; + } + }); + Object.defineProperty(exports, "TSMappedType", { + enumerable: true, + get: function () { + return _index.tsMappedType; + } + }); + Object.defineProperty(exports, "TSMethodSignature", { + enumerable: true, + get: function () { + return _index.tsMethodSignature; + } + }); + Object.defineProperty(exports, "TSModuleBlock", { + enumerable: true, + get: function () { + return _index.tsModuleBlock; + } + }); + Object.defineProperty(exports, "TSModuleDeclaration", { + enumerable: true, + get: function () { + return _index.tsModuleDeclaration; + } + }); + Object.defineProperty(exports, "TSNamedTupleMember", { + enumerable: true, + get: function () { + return _index.tsNamedTupleMember; + } + }); + Object.defineProperty(exports, "TSNamespaceExportDeclaration", { + enumerable: true, + get: function () { + return _index.tsNamespaceExportDeclaration; + } + }); + Object.defineProperty(exports, "TSNeverKeyword", { + enumerable: true, + get: function () { + return _index.tsNeverKeyword; + } + }); + Object.defineProperty(exports, "TSNonNullExpression", { + enumerable: true, + get: function () { + return _index.tsNonNullExpression; + } + }); + Object.defineProperty(exports, "TSNullKeyword", { + enumerable: true, + get: function () { + return _index.tsNullKeyword; + } + }); + Object.defineProperty(exports, "TSNumberKeyword", { + enumerable: true, + get: function () { + return _index.tsNumberKeyword; + } + }); + Object.defineProperty(exports, "TSObjectKeyword", { + enumerable: true, + get: function () { + return _index.tsObjectKeyword; + } + }); + Object.defineProperty(exports, "TSOptionalType", { + enumerable: true, + get: function () { + return _index.tsOptionalType; + } + }); + Object.defineProperty(exports, "TSParameterProperty", { + enumerable: true, + get: function () { + return _index.tsParameterProperty; + } + }); + Object.defineProperty(exports, "TSParenthesizedType", { + enumerable: true, + get: function () { + return _index.tsParenthesizedType; + } + }); + Object.defineProperty(exports, "TSPropertySignature", { + enumerable: true, + get: function () { + return _index.tsPropertySignature; + } + }); + Object.defineProperty(exports, "TSQualifiedName", { + enumerable: true, + get: function () { + return _index.tsQualifiedName; + } + }); + Object.defineProperty(exports, "TSRestType", { + enumerable: true, + get: function () { + return _index.tsRestType; + } + }); + Object.defineProperty(exports, "TSSatisfiesExpression", { + enumerable: true, + get: function () { + return _index.tsSatisfiesExpression; + } + }); + Object.defineProperty(exports, "TSStringKeyword", { + enumerable: true, + get: function () { + return _index.tsStringKeyword; + } + }); + Object.defineProperty(exports, "TSSymbolKeyword", { + enumerable: true, + get: function () { + return _index.tsSymbolKeyword; + } + }); + Object.defineProperty(exports, "TSThisType", { + enumerable: true, + get: function () { + return _index.tsThisType; + } + }); + Object.defineProperty(exports, "TSTupleType", { + enumerable: true, + get: function () { + return _index.tsTupleType; + } + }); + Object.defineProperty(exports, "TSTypeAliasDeclaration", { + enumerable: true, + get: function () { + return _index.tsTypeAliasDeclaration; + } + }); + Object.defineProperty(exports, "TSTypeAnnotation", { + enumerable: true, + get: function () { + return _index.tsTypeAnnotation; + } + }); + Object.defineProperty(exports, "TSTypeAssertion", { + enumerable: true, + get: function () { + return _index.tsTypeAssertion; + } + }); + Object.defineProperty(exports, "TSTypeLiteral", { + enumerable: true, + get: function () { + return _index.tsTypeLiteral; + } + }); + Object.defineProperty(exports, "TSTypeOperator", { + enumerable: true, + get: function () { + return _index.tsTypeOperator; + } + }); + Object.defineProperty(exports, "TSTypeParameter", { + enumerable: true, + get: function () { + return _index.tsTypeParameter; + } + }); + Object.defineProperty(exports, "TSTypeParameterDeclaration", { + enumerable: true, + get: function () { + return _index.tsTypeParameterDeclaration; + } + }); + Object.defineProperty(exports, "TSTypeParameterInstantiation", { + enumerable: true, + get: function () { + return _index.tsTypeParameterInstantiation; + } + }); + Object.defineProperty(exports, "TSTypePredicate", { + enumerable: true, + get: function () { + return _index.tsTypePredicate; + } + }); + Object.defineProperty(exports, "TSTypeQuery", { + enumerable: true, + get: function () { + return _index.tsTypeQuery; + } + }); + Object.defineProperty(exports, "TSTypeReference", { + enumerable: true, + get: function () { + return _index.tsTypeReference; + } + }); + Object.defineProperty(exports, "TSUndefinedKeyword", { + enumerable: true, + get: function () { + return _index.tsUndefinedKeyword; + } + }); + Object.defineProperty(exports, "TSUnionType", { + enumerable: true, + get: function () { + return _index.tsUnionType; + } + }); + Object.defineProperty(exports, "TSUnknownKeyword", { + enumerable: true, + get: function () { + return _index.tsUnknownKeyword; + } + }); + Object.defineProperty(exports, "TSVoidKeyword", { + enumerable: true, + get: function () { + return _index.tsVoidKeyword; + } + }); + Object.defineProperty(exports, "TaggedTemplateExpression", { + enumerable: true, + get: function () { + return _index.taggedTemplateExpression; + } + }); + Object.defineProperty(exports, "TemplateElement", { + enumerable: true, + get: function () { + return _index.templateElement; + } + }); + Object.defineProperty(exports, "TemplateLiteral", { + enumerable: true, + get: function () { + return _index.templateLiteral; + } + }); + Object.defineProperty(exports, "ThisExpression", { + enumerable: true, + get: function () { + return _index.thisExpression; + } + }); + Object.defineProperty(exports, "ThisTypeAnnotation", { + enumerable: true, + get: function () { + return _index.thisTypeAnnotation; + } + }); + Object.defineProperty(exports, "ThrowStatement", { + enumerable: true, + get: function () { + return _index.throwStatement; + } + }); + Object.defineProperty(exports, "TopicReference", { + enumerable: true, + get: function () { + return _index.topicReference; + } + }); + Object.defineProperty(exports, "TryStatement", { + enumerable: true, + get: function () { + return _index.tryStatement; + } + }); + Object.defineProperty(exports, "TupleExpression", { + enumerable: true, + get: function () { + return _index.tupleExpression; + } + }); + Object.defineProperty(exports, "TupleTypeAnnotation", { + enumerable: true, + get: function () { + return _index.tupleTypeAnnotation; + } + }); + Object.defineProperty(exports, "TypeAlias", { + enumerable: true, + get: function () { + return _index.typeAlias; + } + }); + Object.defineProperty(exports, "TypeAnnotation", { + enumerable: true, + get: function () { + return _index.typeAnnotation; + } + }); + Object.defineProperty(exports, "TypeCastExpression", { + enumerable: true, + get: function () { + return _index.typeCastExpression; + } + }); + Object.defineProperty(exports, "TypeParameter", { + enumerable: true, + get: function () { + return _index.typeParameter; + } + }); + Object.defineProperty(exports, "TypeParameterDeclaration", { + enumerable: true, + get: function () { + return _index.typeParameterDeclaration; + } + }); + Object.defineProperty(exports, "TypeParameterInstantiation", { + enumerable: true, + get: function () { + return _index.typeParameterInstantiation; + } + }); + Object.defineProperty(exports, "TypeofTypeAnnotation", { + enumerable: true, + get: function () { + return _index.typeofTypeAnnotation; + } + }); + Object.defineProperty(exports, "UnaryExpression", { + enumerable: true, + get: function () { + return _index.unaryExpression; + } + }); + Object.defineProperty(exports, "UnionTypeAnnotation", { + enumerable: true, + get: function () { + return _index.unionTypeAnnotation; + } + }); + Object.defineProperty(exports, "UpdateExpression", { + enumerable: true, + get: function () { + return _index.updateExpression; + } + }); + Object.defineProperty(exports, "V8IntrinsicIdentifier", { + enumerable: true, + get: function () { + return _index.v8IntrinsicIdentifier; + } + }); + Object.defineProperty(exports, "VariableDeclaration", { + enumerable: true, + get: function () { + return _index.variableDeclaration; + } + }); + Object.defineProperty(exports, "VariableDeclarator", { + enumerable: true, + get: function () { + return _index.variableDeclarator; + } + }); + Object.defineProperty(exports, "Variance", { + enumerable: true, + get: function () { + return _index.variance; + } + }); + Object.defineProperty(exports, "VoidTypeAnnotation", { + enumerable: true, + get: function () { + return _index.voidTypeAnnotation; + } + }); + Object.defineProperty(exports, "WhileStatement", { + enumerable: true, + get: function () { + return _index.whileStatement; + } + }); + Object.defineProperty(exports, "WithStatement", { + enumerable: true, + get: function () { + return _index.withStatement; + } + }); + Object.defineProperty(exports, "YieldExpression", { + enumerable: true, + get: function () { + return _index.yieldExpression; + } + }); + var _index = requireGenerated$2(); + + +} (uppercase)); + return uppercase; +} + +var productions = {}; + +var hasRequiredProductions; + +function requireProductions () { + if (hasRequiredProductions) return productions; + hasRequiredProductions = 1; + + Object.defineProperty(productions, "__esModule", { + value: true + }); + productions.buildUndefinedNode = buildUndefinedNode; + var _index = requireGenerated$2(); + function buildUndefinedNode() { + return (0, _index.unaryExpression)("void", (0, _index.numericLiteral)(0), true); + } + + + return productions; +} + +var cloneNode = {}; + +var hasRequiredCloneNode; + +function requireCloneNode () { + if (hasRequiredCloneNode) return cloneNode; + hasRequiredCloneNode = 1; + + Object.defineProperty(cloneNode, "__esModule", { + value: true + }); + cloneNode.default = cloneNode$1; + var _index = requireDefinitions(); + var _index2 = requireGenerated$3(); + const { + hasOwn + } = { + hasOwn: Function.call.bind(Object.prototype.hasOwnProperty) + }; + function cloneIfNode(obj, deep, withoutLoc, commentsCache) { + if (obj && typeof obj.type === "string") { + return cloneNodeInternal(obj, deep, withoutLoc, commentsCache); + } + return obj; + } + function cloneIfNodeOrArray(obj, deep, withoutLoc, commentsCache) { + if (Array.isArray(obj)) { + return obj.map(node => cloneIfNode(node, deep, withoutLoc, commentsCache)); + } + return cloneIfNode(obj, deep, withoutLoc, commentsCache); + } + function cloneNode$1(node, deep = true, withoutLoc = false) { + return cloneNodeInternal(node, deep, withoutLoc, new Map()); + } + function cloneNodeInternal(node, deep = true, withoutLoc = false, commentsCache) { + if (!node) return node; + const { + type + } = node; + const newNode = { + type: node.type + }; + if ((0, _index2.isIdentifier)(node)) { + newNode.name = node.name; + if (hasOwn(node, "optional") && typeof node.optional === "boolean") { + newNode.optional = node.optional; + } + if (hasOwn(node, "typeAnnotation")) { + newNode.typeAnnotation = deep ? cloneIfNodeOrArray(node.typeAnnotation, true, withoutLoc, commentsCache) : node.typeAnnotation; + } + if (hasOwn(node, "decorators")) { + newNode.decorators = deep ? cloneIfNodeOrArray(node.decorators, true, withoutLoc, commentsCache) : node.decorators; + } + } else if (!hasOwn(_index.NODE_FIELDS, type)) { + throw new Error(`Unknown node type: "${type}"`); + } else { + for (const field of Object.keys(_index.NODE_FIELDS[type])) { + if (hasOwn(node, field)) { + if (deep) { + newNode[field] = (0, _index2.isFile)(node) && field === "comments" ? maybeCloneComments(node.comments, deep, withoutLoc, commentsCache) : cloneIfNodeOrArray(node[field], true, withoutLoc, commentsCache); + } else { + newNode[field] = node[field]; + } + } + } + } + if (hasOwn(node, "loc")) { + if (withoutLoc) { + newNode.loc = null; + } else { + newNode.loc = node.loc; + } + } + if (hasOwn(node, "leadingComments")) { + newNode.leadingComments = maybeCloneComments(node.leadingComments, deep, withoutLoc, commentsCache); + } + if (hasOwn(node, "innerComments")) { + newNode.innerComments = maybeCloneComments(node.innerComments, deep, withoutLoc, commentsCache); + } + if (hasOwn(node, "trailingComments")) { + newNode.trailingComments = maybeCloneComments(node.trailingComments, deep, withoutLoc, commentsCache); + } + if (hasOwn(node, "extra")) { + newNode.extra = Object.assign({}, node.extra); + } + return newNode; + } + function maybeCloneComments(comments, deep, withoutLoc, commentsCache) { + if (!comments || !deep) { + return comments; + } + return comments.map(comment => { + const cache = commentsCache.get(comment); + if (cache) return cache; + const { + type, + value, + loc + } = comment; + const ret = { + type, + value, + loc + }; + if (withoutLoc) { + ret.loc = null; + } + commentsCache.set(comment, ret); + return ret; + }); + } + + + return cloneNode; +} + +var clone = {}; + +var hasRequiredClone; + +function requireClone () { + if (hasRequiredClone) return clone; + hasRequiredClone = 1; + + Object.defineProperty(clone, "__esModule", { + value: true + }); + clone.default = clone$1; + var _cloneNode = requireCloneNode(); + function clone$1(node) { + return (0, _cloneNode.default)(node, false); + } + + + return clone; +} + +var cloneDeep = {}; + +var hasRequiredCloneDeep; + +function requireCloneDeep () { + if (hasRequiredCloneDeep) return cloneDeep; + hasRequiredCloneDeep = 1; + + Object.defineProperty(cloneDeep, "__esModule", { + value: true + }); + cloneDeep.default = cloneDeep$1; + var _cloneNode = requireCloneNode(); + function cloneDeep$1(node) { + return (0, _cloneNode.default)(node); + } + + + return cloneDeep; +} + +var cloneDeepWithoutLoc = {}; + +var hasRequiredCloneDeepWithoutLoc; + +function requireCloneDeepWithoutLoc () { + if (hasRequiredCloneDeepWithoutLoc) return cloneDeepWithoutLoc; + hasRequiredCloneDeepWithoutLoc = 1; + + Object.defineProperty(cloneDeepWithoutLoc, "__esModule", { + value: true + }); + cloneDeepWithoutLoc.default = cloneDeepWithoutLoc$1; + var _cloneNode = requireCloneNode(); + function cloneDeepWithoutLoc$1(node) { + return (0, _cloneNode.default)(node, true, true); + } + + + return cloneDeepWithoutLoc; +} + +var cloneWithoutLoc = {}; + +var hasRequiredCloneWithoutLoc; + +function requireCloneWithoutLoc () { + if (hasRequiredCloneWithoutLoc) return cloneWithoutLoc; + hasRequiredCloneWithoutLoc = 1; + + Object.defineProperty(cloneWithoutLoc, "__esModule", { + value: true + }); + cloneWithoutLoc.default = cloneWithoutLoc$1; + var _cloneNode = requireCloneNode(); + function cloneWithoutLoc$1(node) { + return (0, _cloneNode.default)(node, false, true); + } + + + return cloneWithoutLoc; +} + +var addComment = {}; + +var addComments = {}; + +var hasRequiredAddComments; + +function requireAddComments () { + if (hasRequiredAddComments) return addComments; + hasRequiredAddComments = 1; + + Object.defineProperty(addComments, "__esModule", { + value: true + }); + addComments.default = addComments$1; + function addComments$1(node, type, comments) { + if (!comments || !node) return node; + const key = `${type}Comments`; + if (node[key]) { + if (type === "leading") { + node[key] = comments.concat(node[key]); + } else { + node[key].push(...comments); + } + } else { + node[key] = comments; + } + return node; + } + + + return addComments; +} + +var hasRequiredAddComment; + +function requireAddComment () { + if (hasRequiredAddComment) return addComment; + hasRequiredAddComment = 1; + + Object.defineProperty(addComment, "__esModule", { + value: true + }); + addComment.default = addComment$1; + var _addComments = requireAddComments(); + function addComment$1(node, type, content, line) { + return (0, _addComments.default)(node, type, [{ + type: line ? "CommentLine" : "CommentBlock", + value: content + }]); + } + + + return addComment; +} + +var inheritInnerComments = {}; + +var inherit = {}; + +var hasRequiredInherit; + +function requireInherit () { + if (hasRequiredInherit) return inherit; + hasRequiredInherit = 1; + + Object.defineProperty(inherit, "__esModule", { + value: true + }); + inherit.default = inherit$1; + function inherit$1(key, child, parent) { + if (child && parent) { + child[key] = Array.from(new Set([].concat(child[key], parent[key]).filter(Boolean))); + } + } + + + return inherit; +} + +var hasRequiredInheritInnerComments; + +function requireInheritInnerComments () { + if (hasRequiredInheritInnerComments) return inheritInnerComments; + hasRequiredInheritInnerComments = 1; + + Object.defineProperty(inheritInnerComments, "__esModule", { + value: true + }); + inheritInnerComments.default = inheritInnerComments$1; + var _inherit = requireInherit(); + function inheritInnerComments$1(child, parent) { + (0, _inherit.default)("innerComments", child, parent); + } + + + return inheritInnerComments; +} + +var inheritLeadingComments = {}; + +var hasRequiredInheritLeadingComments; + +function requireInheritLeadingComments () { + if (hasRequiredInheritLeadingComments) return inheritLeadingComments; + hasRequiredInheritLeadingComments = 1; + + Object.defineProperty(inheritLeadingComments, "__esModule", { + value: true + }); + inheritLeadingComments.default = inheritLeadingComments$1; + var _inherit = requireInherit(); + function inheritLeadingComments$1(child, parent) { + (0, _inherit.default)("leadingComments", child, parent); + } + + + return inheritLeadingComments; +} + +var inheritsComments = {}; + +var inheritTrailingComments = {}; + +var hasRequiredInheritTrailingComments; + +function requireInheritTrailingComments () { + if (hasRequiredInheritTrailingComments) return inheritTrailingComments; + hasRequiredInheritTrailingComments = 1; + + Object.defineProperty(inheritTrailingComments, "__esModule", { + value: true + }); + inheritTrailingComments.default = inheritTrailingComments$1; + var _inherit = requireInherit(); + function inheritTrailingComments$1(child, parent) { + (0, _inherit.default)("trailingComments", child, parent); + } + + + return inheritTrailingComments; +} + +var hasRequiredInheritsComments; + +function requireInheritsComments () { + if (hasRequiredInheritsComments) return inheritsComments; + hasRequiredInheritsComments = 1; + + Object.defineProperty(inheritsComments, "__esModule", { + value: true + }); + inheritsComments.default = inheritsComments$1; + var _inheritTrailingComments = requireInheritTrailingComments(); + var _inheritLeadingComments = requireInheritLeadingComments(); + var _inheritInnerComments = requireInheritInnerComments(); + function inheritsComments$1(child, parent) { + (0, _inheritTrailingComments.default)(child, parent); + (0, _inheritLeadingComments.default)(child, parent); + (0, _inheritInnerComments.default)(child, parent); + return child; + } + + + return inheritsComments; +} + +var removeComments = {}; + +var hasRequiredRemoveComments; + +function requireRemoveComments () { + if (hasRequiredRemoveComments) return removeComments; + hasRequiredRemoveComments = 1; + + Object.defineProperty(removeComments, "__esModule", { + value: true + }); + removeComments.default = removeComments$1; + var _index = requireConstants(); + function removeComments$1(node) { + _index.COMMENT_KEYS.forEach(key => { + node[key] = null; + }); + return node; + } + + + return removeComments; +} + +var generated = {}; + +var hasRequiredGenerated; + +function requireGenerated () { + if (hasRequiredGenerated) return generated; + hasRequiredGenerated = 1; + + Object.defineProperty(generated, "__esModule", { + value: true + }); + generated.WHILE_TYPES = generated.USERWHITESPACABLE_TYPES = generated.UNARYLIKE_TYPES = generated.TYPESCRIPT_TYPES = generated.TSTYPE_TYPES = generated.TSTYPEELEMENT_TYPES = generated.TSENTITYNAME_TYPES = generated.TSBASETYPE_TYPES = generated.TERMINATORLESS_TYPES = generated.STATEMENT_TYPES = generated.STANDARDIZED_TYPES = generated.SCOPABLE_TYPES = generated.PUREISH_TYPES = generated.PROPERTY_TYPES = generated.PRIVATE_TYPES = generated.PATTERN_TYPES = generated.PATTERNLIKE_TYPES = generated.OBJECTMEMBER_TYPES = generated.MODULESPECIFIER_TYPES = generated.MODULEDECLARATION_TYPES = generated.MISCELLANEOUS_TYPES = generated.METHOD_TYPES = generated.LVAL_TYPES = generated.LOOP_TYPES = generated.LITERAL_TYPES = generated.JSX_TYPES = generated.IMPORTOREXPORTDECLARATION_TYPES = generated.IMMUTABLE_TYPES = generated.FUNCTION_TYPES = generated.FUNCTIONPARENT_TYPES = generated.FOR_TYPES = generated.FORXSTATEMENT_TYPES = generated.FLOW_TYPES = generated.FLOWTYPE_TYPES = generated.FLOWPREDICATE_TYPES = generated.FLOWDECLARATION_TYPES = generated.FLOWBASEANNOTATION_TYPES = generated.EXPRESSION_TYPES = generated.EXPRESSIONWRAPPER_TYPES = generated.EXPORTDECLARATION_TYPES = generated.ENUMMEMBER_TYPES = generated.ENUMBODY_TYPES = generated.DECLARATION_TYPES = generated.CONDITIONAL_TYPES = generated.COMPLETIONSTATEMENT_TYPES = generated.CLASS_TYPES = generated.BLOCK_TYPES = generated.BLOCKPARENT_TYPES = generated.BINARY_TYPES = generated.ACCESSOR_TYPES = void 0; + var _index = requireDefinitions(); + generated.STANDARDIZED_TYPES = _index.FLIPPED_ALIAS_KEYS["Standardized"]; + generated.EXPRESSION_TYPES = _index.FLIPPED_ALIAS_KEYS["Expression"]; + generated.BINARY_TYPES = _index.FLIPPED_ALIAS_KEYS["Binary"]; + generated.SCOPABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Scopable"]; + generated.BLOCKPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["BlockParent"]; + generated.BLOCK_TYPES = _index.FLIPPED_ALIAS_KEYS["Block"]; + generated.STATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["Statement"]; + generated.TERMINATORLESS_TYPES = _index.FLIPPED_ALIAS_KEYS["Terminatorless"]; + generated.COMPLETIONSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["CompletionStatement"]; + generated.CONDITIONAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Conditional"]; + generated.LOOP_TYPES = _index.FLIPPED_ALIAS_KEYS["Loop"]; + generated.WHILE_TYPES = _index.FLIPPED_ALIAS_KEYS["While"]; + generated.EXPRESSIONWRAPPER_TYPES = _index.FLIPPED_ALIAS_KEYS["ExpressionWrapper"]; + generated.FOR_TYPES = _index.FLIPPED_ALIAS_KEYS["For"]; + generated.FORXSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["ForXStatement"]; + generated.FUNCTION_TYPES = _index.FLIPPED_ALIAS_KEYS["Function"]; + generated.FUNCTIONPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["FunctionParent"]; + generated.PUREISH_TYPES = _index.FLIPPED_ALIAS_KEYS["Pureish"]; + generated.DECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["Declaration"]; + generated.PATTERNLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["PatternLike"]; + generated.LVAL_TYPES = _index.FLIPPED_ALIAS_KEYS["LVal"]; + generated.TSENTITYNAME_TYPES = _index.FLIPPED_ALIAS_KEYS["TSEntityName"]; + generated.LITERAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Literal"]; + generated.IMMUTABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Immutable"]; + generated.USERWHITESPACABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["UserWhitespacable"]; + generated.METHOD_TYPES = _index.FLIPPED_ALIAS_KEYS["Method"]; + generated.OBJECTMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["ObjectMember"]; + generated.PROPERTY_TYPES = _index.FLIPPED_ALIAS_KEYS["Property"]; + generated.UNARYLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["UnaryLike"]; + generated.PATTERN_TYPES = _index.FLIPPED_ALIAS_KEYS["Pattern"]; + generated.CLASS_TYPES = _index.FLIPPED_ALIAS_KEYS["Class"]; + const IMPORTOREXPORTDECLARATION_TYPES = generated.IMPORTOREXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ImportOrExportDeclaration"]; + generated.EXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ExportDeclaration"]; + generated.MODULESPECIFIER_TYPES = _index.FLIPPED_ALIAS_KEYS["ModuleSpecifier"]; + generated.ACCESSOR_TYPES = _index.FLIPPED_ALIAS_KEYS["Accessor"]; + generated.PRIVATE_TYPES = _index.FLIPPED_ALIAS_KEYS["Private"]; + generated.FLOW_TYPES = _index.FLIPPED_ALIAS_KEYS["Flow"]; + generated.FLOWTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowType"]; + generated.FLOWBASEANNOTATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowBaseAnnotation"]; + generated.FLOWDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowDeclaration"]; + generated.FLOWPREDICATE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowPredicate"]; + generated.ENUMBODY_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumBody"]; + generated.ENUMMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumMember"]; + generated.JSX_TYPES = _index.FLIPPED_ALIAS_KEYS["JSX"]; + generated.MISCELLANEOUS_TYPES = _index.FLIPPED_ALIAS_KEYS["Miscellaneous"]; + generated.TYPESCRIPT_TYPES = _index.FLIPPED_ALIAS_KEYS["TypeScript"]; + generated.TSTYPEELEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["TSTypeElement"]; + generated.TSTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSType"]; + generated.TSBASETYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSBaseType"]; + generated.MODULEDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES; + + + return generated; +} + +var ensureBlock = {}; + +var toBlock = {}; + +var hasRequiredToBlock; + +function requireToBlock () { + if (hasRequiredToBlock) return toBlock; + hasRequiredToBlock = 1; + + Object.defineProperty(toBlock, "__esModule", { + value: true + }); + toBlock.default = toBlock$1; + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + function toBlock$1(node, parent) { + if ((0, _index.isBlockStatement)(node)) { + return node; + } + let blockNodes = []; + if ((0, _index.isEmptyStatement)(node)) { + blockNodes = []; + } else { + if (!(0, _index.isStatement)(node)) { + if ((0, _index.isFunction)(parent)) { + node = (0, _index2.returnStatement)(node); + } else { + node = (0, _index2.expressionStatement)(node); + } + } + blockNodes = [node]; + } + return (0, _index2.blockStatement)(blockNodes); + } + + + return toBlock; +} + +var hasRequiredEnsureBlock; + +function requireEnsureBlock () { + if (hasRequiredEnsureBlock) return ensureBlock; + hasRequiredEnsureBlock = 1; + + Object.defineProperty(ensureBlock, "__esModule", { + value: true + }); + ensureBlock.default = ensureBlock$1; + var _toBlock = requireToBlock(); + function ensureBlock$1(node, key = "body") { + const result = (0, _toBlock.default)(node[key], node); + node[key] = result; + return result; + } + + + return ensureBlock; +} + +var toBindingIdentifierName = {}; + +var toIdentifier = {}; + +var hasRequiredToIdentifier; + +function requireToIdentifier () { + if (hasRequiredToIdentifier) return toIdentifier; + hasRequiredToIdentifier = 1; + + Object.defineProperty(toIdentifier, "__esModule", { + value: true + }); + toIdentifier.default = toIdentifier$1; + var _isValidIdentifier = requireIsValidIdentifier(); + var _helperValidatorIdentifier = requireLib$3(); + function toIdentifier$1(input) { + input = input + ""; + let name = ""; + for (const c of input) { + name += (0, _helperValidatorIdentifier.isIdentifierChar)(c.codePointAt(0)) ? c : "-"; + } + name = name.replace(/^[-0-9]+/, ""); + name = name.replace(/[-\s]+(.)?/g, function (match, c) { + return c ? c.toUpperCase() : ""; + }); + if (!(0, _isValidIdentifier.default)(name)) { + name = `_${name}`; + } + return name || "_"; + } + + + return toIdentifier; +} + +var hasRequiredToBindingIdentifierName; + +function requireToBindingIdentifierName () { + if (hasRequiredToBindingIdentifierName) return toBindingIdentifierName; + hasRequiredToBindingIdentifierName = 1; + + Object.defineProperty(toBindingIdentifierName, "__esModule", { + value: true + }); + toBindingIdentifierName.default = toBindingIdentifierName$1; + var _toIdentifier = requireToIdentifier(); + function toBindingIdentifierName$1(name) { + name = (0, _toIdentifier.default)(name); + if (name === "eval" || name === "arguments") name = "_" + name; + return name; + } + + + return toBindingIdentifierName; +} + +var toComputedKey = {}; + +var hasRequiredToComputedKey; + +function requireToComputedKey () { + if (hasRequiredToComputedKey) return toComputedKey; + hasRequiredToComputedKey = 1; + + Object.defineProperty(toComputedKey, "__esModule", { + value: true + }); + toComputedKey.default = toComputedKey$1; + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + function toComputedKey$1(node, key = node.key || node.property) { + if (!node.computed && (0, _index.isIdentifier)(key)) key = (0, _index2.stringLiteral)(key.name); + return key; + } + + + return toComputedKey; +} + +var toExpression = {}; + +var hasRequiredToExpression; + +function requireToExpression () { + if (hasRequiredToExpression) return toExpression; + hasRequiredToExpression = 1; + + Object.defineProperty(toExpression, "__esModule", { + value: true + }); + toExpression.default = void 0; + var _index = requireGenerated$3(); + toExpression.default = toExpression$1; + function toExpression$1(node) { + if ((0, _index.isExpressionStatement)(node)) { + node = node.expression; + } + if ((0, _index.isExpression)(node)) { + return node; + } + if ((0, _index.isClass)(node)) { + node.type = "ClassExpression"; + } else if ((0, _index.isFunction)(node)) { + node.type = "FunctionExpression"; + } + if (!(0, _index.isExpression)(node)) { + throw new Error(`cannot turn ${node.type} to an expression`); + } + return node; + } + + + return toExpression; +} + +var toKeyAlias = {}; + +var removePropertiesDeep = {}; + +var traverseFast = {}; + +var hasRequiredTraverseFast; + +function requireTraverseFast () { + if (hasRequiredTraverseFast) return traverseFast; + hasRequiredTraverseFast = 1; + + Object.defineProperty(traverseFast, "__esModule", { + value: true + }); + traverseFast.default = traverseFast$1; + var _index = requireDefinitions(); + function traverseFast$1(node, enter, opts) { + if (!node) return; + const keys = _index.VISITOR_KEYS[node.type]; + if (!keys) return; + opts = opts || {}; + enter(node, opts); + for (const key of keys) { + const subNode = node[key]; + if (Array.isArray(subNode)) { + for (const node of subNode) { + traverseFast$1(node, enter, opts); + } + } else { + traverseFast$1(subNode, enter, opts); + } + } + } + + + return traverseFast; +} + +var removeProperties = {}; + +var hasRequiredRemoveProperties; + +function requireRemoveProperties () { + if (hasRequiredRemoveProperties) return removeProperties; + hasRequiredRemoveProperties = 1; + + Object.defineProperty(removeProperties, "__esModule", { + value: true + }); + removeProperties.default = removeProperties$1; + var _index = requireConstants(); + const CLEAR_KEYS = ["tokens", "start", "end", "loc", "raw", "rawValue"]; + const CLEAR_KEYS_PLUS_COMMENTS = [..._index.COMMENT_KEYS, "comments", ...CLEAR_KEYS]; + function removeProperties$1(node, opts = {}) { + const map = opts.preserveComments ? CLEAR_KEYS : CLEAR_KEYS_PLUS_COMMENTS; + for (const key of map) { + if (node[key] != null) node[key] = undefined; + } + for (const key of Object.keys(node)) { + if (key[0] === "_" && node[key] != null) node[key] = undefined; + } + const symbols = Object.getOwnPropertySymbols(node); + for (const sym of symbols) { + node[sym] = null; + } + } + + + return removeProperties; +} + +var hasRequiredRemovePropertiesDeep; + +function requireRemovePropertiesDeep () { + if (hasRequiredRemovePropertiesDeep) return removePropertiesDeep; + hasRequiredRemovePropertiesDeep = 1; + + Object.defineProperty(removePropertiesDeep, "__esModule", { + value: true + }); + removePropertiesDeep.default = removePropertiesDeep$1; + var _traverseFast = requireTraverseFast(); + var _removeProperties = requireRemoveProperties(); + function removePropertiesDeep$1(tree, opts) { + (0, _traverseFast.default)(tree, _removeProperties.default, opts); + return tree; + } + + + return removePropertiesDeep; +} + +var hasRequiredToKeyAlias; + +function requireToKeyAlias () { + if (hasRequiredToKeyAlias) return toKeyAlias; + hasRequiredToKeyAlias = 1; + + Object.defineProperty(toKeyAlias, "__esModule", { + value: true + }); + toKeyAlias.default = toKeyAlias$1; + var _index = requireGenerated$3(); + var _cloneNode = requireCloneNode(); + var _removePropertiesDeep = requireRemovePropertiesDeep(); + function toKeyAlias$1(node, key = node.key) { + let alias; + if (node.kind === "method") { + return toKeyAlias$1.increment() + ""; + } else if ((0, _index.isIdentifier)(key)) { + alias = key.name; + } else if ((0, _index.isStringLiteral)(key)) { + alias = JSON.stringify(key.value); + } else { + alias = JSON.stringify((0, _removePropertiesDeep.default)((0, _cloneNode.default)(key))); + } + if (node.computed) { + alias = `[${alias}]`; + } + if (node.static) { + alias = `static:${alias}`; + } + return alias; + } + toKeyAlias$1.uid = 0; + toKeyAlias$1.increment = function () { + if (toKeyAlias$1.uid >= Number.MAX_SAFE_INTEGER) { + return toKeyAlias$1.uid = 0; + } else { + return toKeyAlias$1.uid++; + } + }; + + + return toKeyAlias; +} + +var toStatement = {}; + +var hasRequiredToStatement; + +function requireToStatement () { + if (hasRequiredToStatement) return toStatement; + hasRequiredToStatement = 1; + + Object.defineProperty(toStatement, "__esModule", { + value: true + }); + toStatement.default = void 0; + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + toStatement.default = toStatement$1; + function toStatement$1(node, ignore) { + if ((0, _index.isStatement)(node)) { + return node; + } + let mustHaveId = false; + let newType; + if ((0, _index.isClass)(node)) { + mustHaveId = true; + newType = "ClassDeclaration"; + } else if ((0, _index.isFunction)(node)) { + mustHaveId = true; + newType = "FunctionDeclaration"; + } else if ((0, _index.isAssignmentExpression)(node)) { + return (0, _index2.expressionStatement)(node); + } + if (mustHaveId && !node.id) { + newType = false; + } + if (!newType) { + if (ignore) { + return false; + } else { + throw new Error(`cannot turn ${node.type} to a statement`); + } + } + node.type = newType; + return node; + } + + + return toStatement; +} + +var valueToNode = {}; + +var hasRequiredValueToNode; + +function requireValueToNode () { + if (hasRequiredValueToNode) return valueToNode; + hasRequiredValueToNode = 1; + + Object.defineProperty(valueToNode, "__esModule", { + value: true + }); + valueToNode.default = void 0; + var _isValidIdentifier = requireIsValidIdentifier(); + var _index = requireGenerated$2(); + valueToNode.default = valueToNode$1; + const objectToString = Function.call.bind(Object.prototype.toString); + function isRegExp(value) { + return objectToString(value) === "[object RegExp]"; + } + function isPlainObject(value) { + if (typeof value !== "object" || value === null || Object.prototype.toString.call(value) !== "[object Object]") { + return false; + } + const proto = Object.getPrototypeOf(value); + return proto === null || Object.getPrototypeOf(proto) === null; + } + function valueToNode$1(value) { + if (value === undefined) { + return (0, _index.identifier)("undefined"); + } + if (value === true || value === false) { + return (0, _index.booleanLiteral)(value); + } + if (value === null) { + return (0, _index.nullLiteral)(); + } + if (typeof value === "string") { + return (0, _index.stringLiteral)(value); + } + if (typeof value === "number") { + let result; + if (Number.isFinite(value)) { + result = (0, _index.numericLiteral)(Math.abs(value)); + } else { + let numerator; + if (Number.isNaN(value)) { + numerator = (0, _index.numericLiteral)(0); + } else { + numerator = (0, _index.numericLiteral)(1); + } + result = (0, _index.binaryExpression)("/", numerator, (0, _index.numericLiteral)(0)); + } + if (value < 0 || Object.is(value, -0)) { + result = (0, _index.unaryExpression)("-", result); + } + return result; + } + if (isRegExp(value)) { + const pattern = value.source; + const flags = /\/([a-z]*)$/.exec(value.toString())[1]; + return (0, _index.regExpLiteral)(pattern, flags); + } + if (Array.isArray(value)) { + return (0, _index.arrayExpression)(value.map(valueToNode$1)); + } + if (isPlainObject(value)) { + const props = []; + for (const key of Object.keys(value)) { + let nodeKey; + if ((0, _isValidIdentifier.default)(key)) { + nodeKey = (0, _index.identifier)(key); + } else { + nodeKey = (0, _index.stringLiteral)(key); + } + props.push((0, _index.objectProperty)(nodeKey, valueToNode$1(value[key]))); + } + return (0, _index.objectExpression)(props); + } + throw new Error("don't know how to turn this value into a node"); + } + + + return valueToNode; +} + +var appendToMemberExpression = {}; + +var hasRequiredAppendToMemberExpression; + +function requireAppendToMemberExpression () { + if (hasRequiredAppendToMemberExpression) return appendToMemberExpression; + hasRequiredAppendToMemberExpression = 1; + + Object.defineProperty(appendToMemberExpression, "__esModule", { + value: true + }); + appendToMemberExpression.default = appendToMemberExpression$1; + var _index = requireGenerated$2(); + function appendToMemberExpression$1(member, append, computed = false) { + member.object = (0, _index.memberExpression)(member.object, member.property, member.computed); + member.property = append; + member.computed = !!computed; + return member; + } + + + return appendToMemberExpression; +} + +var inherits = {}; + +var hasRequiredInherits; + +function requireInherits () { + if (hasRequiredInherits) return inherits; + hasRequiredInherits = 1; + + Object.defineProperty(inherits, "__esModule", { + value: true + }); + inherits.default = inherits$1; + var _index = requireConstants(); + var _inheritsComments = requireInheritsComments(); + function inherits$1(child, parent) { + if (!child || !parent) return child; + for (const key of _index.INHERIT_KEYS.optional) { + if (child[key] == null) { + child[key] = parent[key]; + } + } + for (const key of Object.keys(parent)) { + if (key[0] === "_" && key !== "__clone") { + child[key] = parent[key]; + } + } + for (const key of _index.INHERIT_KEYS.force) { + child[key] = parent[key]; + } + (0, _inheritsComments.default)(child, parent); + return child; + } + + + return inherits; +} + +var prependToMemberExpression = {}; + +var hasRequiredPrependToMemberExpression; + +function requirePrependToMemberExpression () { + if (hasRequiredPrependToMemberExpression) return prependToMemberExpression; + hasRequiredPrependToMemberExpression = 1; + + Object.defineProperty(prependToMemberExpression, "__esModule", { + value: true + }); + prependToMemberExpression.default = prependToMemberExpression$1; + var _index = requireGenerated$2(); + var _index2 = requireLib$1(); + function prependToMemberExpression$1(member, prepend) { + if ((0, _index2.isSuper)(member.object)) { + throw new Error("Cannot prepend node to super property access (`super.foo`)."); + } + member.object = (0, _index.memberExpression)(prepend, member.object); + return member; + } + + + return prependToMemberExpression; +} + +var getAssignmentIdentifiers = {}; + +var hasRequiredGetAssignmentIdentifiers; + +function requireGetAssignmentIdentifiers () { + if (hasRequiredGetAssignmentIdentifiers) return getAssignmentIdentifiers; + hasRequiredGetAssignmentIdentifiers = 1; + + Object.defineProperty(getAssignmentIdentifiers, "__esModule", { + value: true + }); + getAssignmentIdentifiers.default = getAssignmentIdentifiers$1; + function getAssignmentIdentifiers$1(node) { + const search = [].concat(node); + const ids = Object.create(null); + while (search.length) { + const id = search.pop(); + if (!id) continue; + switch (id.type) { + case "ArrayPattern": + search.push(...id.elements); + break; + case "AssignmentExpression": + case "AssignmentPattern": + case "ForInStatement": + case "ForOfStatement": + search.push(id.left); + break; + case "ObjectPattern": + search.push(...id.properties); + break; + case "ObjectProperty": + search.push(id.value); + break; + case "RestElement": + case "UpdateExpression": + search.push(id.argument); + break; + case "UnaryExpression": + if (id.operator === "delete") { + search.push(id.argument); + } + break; + case "Identifier": + ids[id.name] = id; + break; + } + } + return ids; + } + + + return getAssignmentIdentifiers; +} + +var getBindingIdentifiers = {}; + +var hasRequiredGetBindingIdentifiers; + +function requireGetBindingIdentifiers () { + if (hasRequiredGetBindingIdentifiers) return getBindingIdentifiers; + hasRequiredGetBindingIdentifiers = 1; + + Object.defineProperty(getBindingIdentifiers, "__esModule", { + value: true + }); + getBindingIdentifiers.default = getBindingIdentifiers$1; + var _index = requireGenerated$3(); + function getBindingIdentifiers$1(node, duplicates, outerOnly, newBindingsOnly) { + const search = [].concat(node); + const ids = Object.create(null); + while (search.length) { + const id = search.shift(); + if (!id) continue; + if (newBindingsOnly && ((0, _index.isAssignmentExpression)(id) || (0, _index.isUnaryExpression)(id) || (0, _index.isUpdateExpression)(id))) { + continue; + } + if ((0, _index.isIdentifier)(id)) { + if (duplicates) { + const _ids = ids[id.name] = ids[id.name] || []; + _ids.push(id); + } else { + ids[id.name] = id; + } + continue; + } + if ((0, _index.isExportDeclaration)(id) && !(0, _index.isExportAllDeclaration)(id)) { + if ((0, _index.isDeclaration)(id.declaration)) { + search.push(id.declaration); + } + continue; + } + if (outerOnly) { + if ((0, _index.isFunctionDeclaration)(id)) { + search.push(id.id); + continue; + } + if ((0, _index.isFunctionExpression)(id)) { + continue; + } + } + const keys = getBindingIdentifiers$1.keys[id.type]; + if (keys) { + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const nodes = id[key]; + if (nodes) { + if (Array.isArray(nodes)) { + search.push(...nodes); + } else { + search.push(nodes); + } + } + } + } + } + return ids; + } + const keys = { + DeclareClass: ["id"], + DeclareFunction: ["id"], + DeclareModule: ["id"], + DeclareVariable: ["id"], + DeclareInterface: ["id"], + DeclareTypeAlias: ["id"], + DeclareOpaqueType: ["id"], + InterfaceDeclaration: ["id"], + TypeAlias: ["id"], + OpaqueType: ["id"], + CatchClause: ["param"], + LabeledStatement: ["label"], + UnaryExpression: ["argument"], + AssignmentExpression: ["left"], + ImportSpecifier: ["local"], + ImportNamespaceSpecifier: ["local"], + ImportDefaultSpecifier: ["local"], + ImportDeclaration: ["specifiers"], + ExportSpecifier: ["exported"], + ExportNamespaceSpecifier: ["exported"], + ExportDefaultSpecifier: ["exported"], + FunctionDeclaration: ["id", "params"], + FunctionExpression: ["id", "params"], + ArrowFunctionExpression: ["params"], + ObjectMethod: ["params"], + ClassMethod: ["params"], + ClassPrivateMethod: ["params"], + ForInStatement: ["left"], + ForOfStatement: ["left"], + ClassDeclaration: ["id"], + ClassExpression: ["id"], + RestElement: ["argument"], + UpdateExpression: ["argument"], + ObjectProperty: ["value"], + AssignmentPattern: ["left"], + ArrayPattern: ["elements"], + ObjectPattern: ["properties"], + VariableDeclaration: ["declarations"], + VariableDeclarator: ["id"] + }; + getBindingIdentifiers$1.keys = keys; + + + return getBindingIdentifiers; +} + +var getOuterBindingIdentifiers = {}; + +var hasRequiredGetOuterBindingIdentifiers; + +function requireGetOuterBindingIdentifiers () { + if (hasRequiredGetOuterBindingIdentifiers) return getOuterBindingIdentifiers; + hasRequiredGetOuterBindingIdentifiers = 1; + + Object.defineProperty(getOuterBindingIdentifiers, "__esModule", { + value: true + }); + getOuterBindingIdentifiers.default = void 0; + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + getOuterBindingIdentifiers.default = getOuterBindingIdentifiers$1; + function getOuterBindingIdentifiers$1(node, duplicates) { + return (0, _getBindingIdentifiers.default)(node, duplicates, true); + } + + + return getOuterBindingIdentifiers; +} + +var getFunctionName$3 = {}; + +var hasRequiredGetFunctionName; + +function requireGetFunctionName () { + if (hasRequiredGetFunctionName) return getFunctionName$3; + hasRequiredGetFunctionName = 1; + + Object.defineProperty(getFunctionName$3, "__esModule", { + value: true + }); + getFunctionName$3.default = getFunctionName; + var _index = requireGenerated$3(); + function getNameFromLiteralId(id) { + if ((0, _index.isNullLiteral)(id)) { + return "null"; + } + if ((0, _index.isRegExpLiteral)(id)) { + return `/${id.pattern}/${id.flags}`; + } + if ((0, _index.isTemplateLiteral)(id)) { + return id.quasis.map(quasi => quasi.value.raw).join(""); + } + if (id.value !== undefined) { + return String(id.value); + } + return null; + } + function getObjectMemberKey(node) { + if (!node.computed || (0, _index.isLiteral)(node.key)) { + return node.key; + } + } + function getFunctionName(node, parent) { + if ("id" in node && node.id) { + return { + name: node.id.name, + originalNode: node.id + }; + } + let prefix = ""; + let id; + if ((0, _index.isObjectProperty)(parent, { + value: node + })) { + id = getObjectMemberKey(parent); + } else if ((0, _index.isObjectMethod)(node) || (0, _index.isClassMethod)(node)) { + id = getObjectMemberKey(node); + if (node.kind === "get") prefix = "get ";else if (node.kind === "set") prefix = "set "; + } else if ((0, _index.isVariableDeclarator)(parent, { + init: node + })) { + id = parent.id; + } else if ((0, _index.isAssignmentExpression)(parent, { + operator: "=", + right: node + })) { + id = parent.left; + } + if (!id) return null; + const name = (0, _index.isLiteral)(id) ? getNameFromLiteralId(id) : (0, _index.isIdentifier)(id) ? id.name : (0, _index.isPrivateName)(id) ? id.id.name : null; + if (name == null) return null; + return { + name: prefix + name, + originalNode: id + }; + } + + + return getFunctionName$3; +} + +var traverse = {}; + +var hasRequiredTraverse; + +function requireTraverse () { + if (hasRequiredTraverse) return traverse; + hasRequiredTraverse = 1; + + Object.defineProperty(traverse, "__esModule", { + value: true + }); + traverse.default = traverse$1; + var _index = requireDefinitions(); + function traverse$1(node, handlers, state) { + if (typeof handlers === "function") { + handlers = { + enter: handlers + }; + } + const { + enter, + exit + } = handlers; + traverseSimpleImpl(node, enter, exit, state, []); + } + function traverseSimpleImpl(node, enter, exit, state, ancestors) { + const keys = _index.VISITOR_KEYS[node.type]; + if (!keys) return; + if (enter) enter(node, ancestors, state); + for (const key of keys) { + const subNode = node[key]; + if (Array.isArray(subNode)) { + for (let i = 0; i < subNode.length; i++) { + const child = subNode[i]; + if (!child) continue; + ancestors.push({ + node, + key, + index: i + }); + traverseSimpleImpl(child, enter, exit, state, ancestors); + ancestors.pop(); + } + } else if (subNode) { + ancestors.push({ + node, + key + }); + traverseSimpleImpl(subNode, enter, exit, state, ancestors); + ancestors.pop(); + } + } + if (exit) exit(node, ancestors, state); + } + + + return traverse; +} + +var isBinding = {}; + +var hasRequiredIsBinding; + +function requireIsBinding () { + if (hasRequiredIsBinding) return isBinding; + hasRequiredIsBinding = 1; + + Object.defineProperty(isBinding, "__esModule", { + value: true + }); + isBinding.default = isBinding$1; + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + function isBinding$1(node, parent, grandparent) { + if (grandparent && node.type === "Identifier" && parent.type === "ObjectProperty" && grandparent.type === "ObjectExpression") { + return false; + } + const keys = _getBindingIdentifiers.default.keys[parent.type]; + if (keys) { + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = parent[key]; + if (Array.isArray(val)) { + if (val.includes(node)) return true; + } else { + if (val === node) return true; + } + } + } + return false; + } + + + return isBinding; +} + +var isBlockScoped = {}; + +var isLet = {}; + +var hasRequiredIsLet; + +function requireIsLet () { + if (hasRequiredIsLet) return isLet; + hasRequiredIsLet = 1; + + Object.defineProperty(isLet, "__esModule", { + value: true + }); + isLet.default = isLet$1; + var _index = requireGenerated$3(); + var _index2 = requireConstants(); + function isLet$1(node) { + return (0, _index.isVariableDeclaration)(node) && (node.kind !== "var" || node[_index2.BLOCK_SCOPED_SYMBOL]); + } + + + return isLet; +} + +var hasRequiredIsBlockScoped; + +function requireIsBlockScoped () { + if (hasRequiredIsBlockScoped) return isBlockScoped; + hasRequiredIsBlockScoped = 1; + + Object.defineProperty(isBlockScoped, "__esModule", { + value: true + }); + isBlockScoped.default = isBlockScoped$1; + var _index = requireGenerated$3(); + var _isLet = requireIsLet(); + function isBlockScoped$1(node) { + return (0, _index.isFunctionDeclaration)(node) || (0, _index.isClassDeclaration)(node) || (0, _isLet.default)(node); + } + + + return isBlockScoped; +} + +var isImmutable = {}; + +var hasRequiredIsImmutable; + +function requireIsImmutable () { + if (hasRequiredIsImmutable) return isImmutable; + hasRequiredIsImmutable = 1; + + Object.defineProperty(isImmutable, "__esModule", { + value: true + }); + isImmutable.default = isImmutable$1; + var _isType = requireIsType(); + var _index = requireGenerated$3(); + function isImmutable$1(node) { + if ((0, _isType.default)(node.type, "Immutable")) return true; + if ((0, _index.isIdentifier)(node)) { + if (node.name === "undefined") { + return true; + } else { + return false; + } + } + return false; + } + + + return isImmutable; +} + +var isNodesEquivalent = {}; + +var hasRequiredIsNodesEquivalent; + +function requireIsNodesEquivalent () { + if (hasRequiredIsNodesEquivalent) return isNodesEquivalent; + hasRequiredIsNodesEquivalent = 1; + + Object.defineProperty(isNodesEquivalent, "__esModule", { + value: true + }); + isNodesEquivalent.default = isNodesEquivalent$1; + var _index = requireDefinitions(); + function isNodesEquivalent$1(a, b) { + if (typeof a !== "object" || typeof b !== "object" || a == null || b == null) { + return a === b; + } + if (a.type !== b.type) { + return false; + } + const fields = Object.keys(_index.NODE_FIELDS[a.type] || a.type); + const visitorKeys = _index.VISITOR_KEYS[a.type]; + for (const field of fields) { + const val_a = a[field]; + const val_b = b[field]; + if (typeof val_a !== typeof val_b) { + return false; + } + if (val_a == null && val_b == null) { + continue; + } else if (val_a == null || val_b == null) { + return false; + } + if (Array.isArray(val_a)) { + if (!Array.isArray(val_b)) { + return false; + } + if (val_a.length !== val_b.length) { + return false; + } + for (let i = 0; i < val_a.length; i++) { + if (!isNodesEquivalent$1(val_a[i], val_b[i])) { + return false; + } + } + continue; + } + if (typeof val_a === "object" && !(visitorKeys != null && visitorKeys.includes(field))) { + for (const key of Object.keys(val_a)) { + if (val_a[key] !== val_b[key]) { + return false; + } + } + continue; + } + if (!isNodesEquivalent$1(val_a, val_b)) { + return false; + } + } + return true; + } + + + return isNodesEquivalent; +} + +var isReferenced = {}; + +var hasRequiredIsReferenced; + +function requireIsReferenced () { + if (hasRequiredIsReferenced) return isReferenced; + hasRequiredIsReferenced = 1; + + Object.defineProperty(isReferenced, "__esModule", { + value: true + }); + isReferenced.default = isReferenced$1; + function isReferenced$1(node, parent, grandparent) { + switch (parent.type) { + case "MemberExpression": + case "OptionalMemberExpression": + if (parent.property === node) { + return !!parent.computed; + } + return parent.object === node; + case "JSXMemberExpression": + return parent.object === node; + case "VariableDeclarator": + return parent.init === node; + case "ArrowFunctionExpression": + return parent.body === node; + case "PrivateName": + return false; + case "ClassMethod": + case "ClassPrivateMethod": + case "ObjectMethod": + if (parent.key === node) { + return !!parent.computed; + } + return false; + case "ObjectProperty": + if (parent.key === node) { + return !!parent.computed; + } + return !grandparent || grandparent.type !== "ObjectPattern"; + case "ClassProperty": + case "ClassAccessorProperty": + if (parent.key === node) { + return !!parent.computed; + } + return true; + case "ClassPrivateProperty": + return parent.key !== node; + case "ClassDeclaration": + case "ClassExpression": + return parent.superClass === node; + case "AssignmentExpression": + return parent.right === node; + case "AssignmentPattern": + return parent.right === node; + case "LabeledStatement": + return false; + case "CatchClause": + return false; + case "RestElement": + return false; + case "BreakStatement": + case "ContinueStatement": + return false; + case "FunctionDeclaration": + case "FunctionExpression": + return false; + case "ExportNamespaceSpecifier": + case "ExportDefaultSpecifier": + return false; + case "ExportSpecifier": + if (grandparent != null && grandparent.source) { + return false; + } + return parent.local === node; + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + return false; + case "ImportAttribute": + return false; + case "JSXAttribute": + return false; + case "ObjectPattern": + case "ArrayPattern": + return false; + case "MetaProperty": + return false; + case "ObjectTypeProperty": + return parent.key !== node; + case "TSEnumMember": + return parent.id !== node; + case "TSPropertySignature": + if (parent.key === node) { + return !!parent.computed; + } + return true; + } + return true; + } + + + return isReferenced; +} + +var isScope = {}; + +var hasRequiredIsScope; + +function requireIsScope () { + if (hasRequiredIsScope) return isScope; + hasRequiredIsScope = 1; + + Object.defineProperty(isScope, "__esModule", { + value: true + }); + isScope.default = isScope$1; + var _index = requireGenerated$3(); + function isScope$1(node, parent) { + if ((0, _index.isBlockStatement)(node) && ((0, _index.isFunction)(parent) || (0, _index.isCatchClause)(parent))) { + return false; + } + if ((0, _index.isPattern)(node) && ((0, _index.isFunction)(parent) || (0, _index.isCatchClause)(parent))) { + return true; + } + return (0, _index.isScopable)(node); + } + + + return isScope; +} + +var isSpecifierDefault = {}; + +var hasRequiredIsSpecifierDefault; + +function requireIsSpecifierDefault () { + if (hasRequiredIsSpecifierDefault) return isSpecifierDefault; + hasRequiredIsSpecifierDefault = 1; + + Object.defineProperty(isSpecifierDefault, "__esModule", { + value: true + }); + isSpecifierDefault.default = isSpecifierDefault$1; + var _index = requireGenerated$3(); + function isSpecifierDefault$1(specifier) { + return (0, _index.isImportDefaultSpecifier)(specifier) || (0, _index.isIdentifier)(specifier.imported || specifier.exported, { + name: "default" + }); + } + + + return isSpecifierDefault; +} + +var isValidES3Identifier = {}; + +var hasRequiredIsValidES3Identifier; + +function requireIsValidES3Identifier () { + if (hasRequiredIsValidES3Identifier) return isValidES3Identifier; + hasRequiredIsValidES3Identifier = 1; + + Object.defineProperty(isValidES3Identifier, "__esModule", { + value: true + }); + isValidES3Identifier.default = isValidES3Identifier$1; + var _isValidIdentifier = requireIsValidIdentifier(); + const RESERVED_WORDS_ES3_ONLY = new Set(["abstract", "boolean", "byte", "char", "double", "enum", "final", "float", "goto", "implements", "int", "interface", "long", "native", "package", "private", "protected", "public", "short", "static", "synchronized", "throws", "transient", "volatile"]); + function isValidES3Identifier$1(name) { + return (0, _isValidIdentifier.default)(name) && !RESERVED_WORDS_ES3_ONLY.has(name); + } + + + return isValidES3Identifier; +} + +var isVar = {}; + +var hasRequiredIsVar; + +function requireIsVar () { + if (hasRequiredIsVar) return isVar; + hasRequiredIsVar = 1; + + Object.defineProperty(isVar, "__esModule", { + value: true + }); + isVar.default = isVar$1; + var _index = requireGenerated$3(); + var _index2 = requireConstants(); + function isVar$1(node) { + return (0, _index.isVariableDeclaration)(node, { + kind: "var" + }) && !node[_index2.BLOCK_SCOPED_SYMBOL]; + } + + + return isVar; +} + +var toSequenceExpression = {}; + +var gatherSequenceExpressions = {}; + +var hasRequiredGatherSequenceExpressions; + +function requireGatherSequenceExpressions () { + if (hasRequiredGatherSequenceExpressions) return gatherSequenceExpressions; + hasRequiredGatherSequenceExpressions = 1; + + Object.defineProperty(gatherSequenceExpressions, "__esModule", { + value: true + }); + gatherSequenceExpressions.default = gatherSequenceExpressions$1; + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + var _productions = requireProductions(); + var _cloneNode = requireCloneNode(); + function gatherSequenceExpressions$1(nodes, declars) { + const exprs = []; + let ensureLastUndefined = true; + for (const node of nodes) { + if (!(0, _index.isEmptyStatement)(node)) { + ensureLastUndefined = false; + } + if ((0, _index.isExpression)(node)) { + exprs.push(node); + } else if ((0, _index.isExpressionStatement)(node)) { + exprs.push(node.expression); + } else if ((0, _index.isVariableDeclaration)(node)) { + if (node.kind !== "var") return; + for (const declar of node.declarations) { + const bindings = (0, _getBindingIdentifiers.default)(declar); + for (const key of Object.keys(bindings)) { + declars.push({ + kind: node.kind, + id: (0, _cloneNode.default)(bindings[key]) + }); + } + if (declar.init) { + exprs.push((0, _index2.assignmentExpression)("=", declar.id, declar.init)); + } + } + ensureLastUndefined = true; + } else if ((0, _index.isIfStatement)(node)) { + const consequent = node.consequent ? gatherSequenceExpressions$1([node.consequent], declars) : (0, _productions.buildUndefinedNode)(); + const alternate = node.alternate ? gatherSequenceExpressions$1([node.alternate], declars) : (0, _productions.buildUndefinedNode)(); + if (!consequent || !alternate) return; + exprs.push((0, _index2.conditionalExpression)(node.test, consequent, alternate)); + } else if ((0, _index.isBlockStatement)(node)) { + const body = gatherSequenceExpressions$1(node.body, declars); + if (!body) return; + exprs.push(body); + } else if ((0, _index.isEmptyStatement)(node)) { + if (nodes.indexOf(node) === 0) { + ensureLastUndefined = true; + } + } else { + return; + } + } + if (ensureLastUndefined) { + exprs.push((0, _productions.buildUndefinedNode)()); + } + if (exprs.length === 1) { + return exprs[0]; + } else { + return (0, _index2.sequenceExpression)(exprs); + } + } + + + return gatherSequenceExpressions; +} + +var hasRequiredToSequenceExpression; + +function requireToSequenceExpression () { + if (hasRequiredToSequenceExpression) return toSequenceExpression; + hasRequiredToSequenceExpression = 1; + + Object.defineProperty(toSequenceExpression, "__esModule", { + value: true + }); + toSequenceExpression.default = toSequenceExpression$1; + var _gatherSequenceExpressions = requireGatherSequenceExpressions(); + function toSequenceExpression$1(nodes, scope) { + if (!(nodes != null && nodes.length)) return; + const declars = []; + const result = (0, _gatherSequenceExpressions.default)(nodes, declars); + if (!result) return; + for (const declar of declars) { + scope.push(declar); + } + return result; + } + + + return toSequenceExpression; +} + +var hasRequiredLib$1; + +function requireLib$1 () { + if (hasRequiredLib$1) return lib$3; + hasRequiredLib$1 = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + var _exportNames = { + react: true, + assertNode: true, + createTypeAnnotationBasedOnTypeof: true, + createUnionTypeAnnotation: true, + createFlowUnionType: true, + createTSUnionType: true, + cloneNode: true, + clone: true, + cloneDeep: true, + cloneDeepWithoutLoc: true, + cloneWithoutLoc: true, + addComment: true, + addComments: true, + inheritInnerComments: true, + inheritLeadingComments: true, + inheritsComments: true, + inheritTrailingComments: true, + removeComments: true, + ensureBlock: true, + toBindingIdentifierName: true, + toBlock: true, + toComputedKey: true, + toExpression: true, + toIdentifier: true, + toKeyAlias: true, + toStatement: true, + valueToNode: true, + appendToMemberExpression: true, + inherits: true, + prependToMemberExpression: true, + removeProperties: true, + removePropertiesDeep: true, + removeTypeDuplicates: true, + getAssignmentIdentifiers: true, + getBindingIdentifiers: true, + getOuterBindingIdentifiers: true, + getFunctionName: true, + traverse: true, + traverseFast: true, + shallowEqual: true, + is: true, + isBinding: true, + isBlockScoped: true, + isImmutable: true, + isLet: true, + isNode: true, + isNodesEquivalent: true, + isPlaceholderType: true, + isReferenced: true, + isScope: true, + isSpecifierDefault: true, + isType: true, + isValidES3Identifier: true, + isValidIdentifier: true, + isVar: true, + matchesPattern: true, + validate: true, + buildMatchMemberExpression: true, + __internal__deprecationWarning: true + }; + Object.defineProperty(exports, "__internal__deprecationWarning", { + enumerable: true, + get: function () { + return _deprecationWarning.default; + } + }); + Object.defineProperty(exports, "addComment", { + enumerable: true, + get: function () { + return _addComment.default; + } + }); + Object.defineProperty(exports, "addComments", { + enumerable: true, + get: function () { + return _addComments.default; + } + }); + Object.defineProperty(exports, "appendToMemberExpression", { + enumerable: true, + get: function () { + return _appendToMemberExpression.default; + } + }); + Object.defineProperty(exports, "assertNode", { + enumerable: true, + get: function () { + return _assertNode.default; + } + }); + Object.defineProperty(exports, "buildMatchMemberExpression", { + enumerable: true, + get: function () { + return _buildMatchMemberExpression.default; + } + }); + Object.defineProperty(exports, "clone", { + enumerable: true, + get: function () { + return _clone.default; + } + }); + Object.defineProperty(exports, "cloneDeep", { + enumerable: true, + get: function () { + return _cloneDeep.default; + } + }); + Object.defineProperty(exports, "cloneDeepWithoutLoc", { + enumerable: true, + get: function () { + return _cloneDeepWithoutLoc.default; + } + }); + Object.defineProperty(exports, "cloneNode", { + enumerable: true, + get: function () { + return _cloneNode.default; + } + }); + Object.defineProperty(exports, "cloneWithoutLoc", { + enumerable: true, + get: function () { + return _cloneWithoutLoc.default; + } + }); + Object.defineProperty(exports, "createFlowUnionType", { + enumerable: true, + get: function () { + return _createFlowUnionType.default; + } + }); + Object.defineProperty(exports, "createTSUnionType", { + enumerable: true, + get: function () { + return _createTSUnionType.default; + } + }); + Object.defineProperty(exports, "createTypeAnnotationBasedOnTypeof", { + enumerable: true, + get: function () { + return _createTypeAnnotationBasedOnTypeof.default; + } + }); + Object.defineProperty(exports, "createUnionTypeAnnotation", { + enumerable: true, + get: function () { + return _createFlowUnionType.default; + } + }); + Object.defineProperty(exports, "ensureBlock", { + enumerable: true, + get: function () { + return _ensureBlock.default; + } + }); + Object.defineProperty(exports, "getAssignmentIdentifiers", { + enumerable: true, + get: function () { + return _getAssignmentIdentifiers.default; + } + }); + Object.defineProperty(exports, "getBindingIdentifiers", { + enumerable: true, + get: function () { + return _getBindingIdentifiers.default; + } + }); + Object.defineProperty(exports, "getFunctionName", { + enumerable: true, + get: function () { + return _getFunctionName.default; + } + }); + Object.defineProperty(exports, "getOuterBindingIdentifiers", { + enumerable: true, + get: function () { + return _getOuterBindingIdentifiers.default; + } + }); + Object.defineProperty(exports, "inheritInnerComments", { + enumerable: true, + get: function () { + return _inheritInnerComments.default; + } + }); + Object.defineProperty(exports, "inheritLeadingComments", { + enumerable: true, + get: function () { + return _inheritLeadingComments.default; + } + }); + Object.defineProperty(exports, "inheritTrailingComments", { + enumerable: true, + get: function () { + return _inheritTrailingComments.default; + } + }); + Object.defineProperty(exports, "inherits", { + enumerable: true, + get: function () { + return _inherits.default; + } + }); + Object.defineProperty(exports, "inheritsComments", { + enumerable: true, + get: function () { + return _inheritsComments.default; + } + }); + Object.defineProperty(exports, "is", { + enumerable: true, + get: function () { + return _is.default; + } + }); + Object.defineProperty(exports, "isBinding", { + enumerable: true, + get: function () { + return _isBinding.default; + } + }); + Object.defineProperty(exports, "isBlockScoped", { + enumerable: true, + get: function () { + return _isBlockScoped.default; + } + }); + Object.defineProperty(exports, "isImmutable", { + enumerable: true, + get: function () { + return _isImmutable.default; + } + }); + Object.defineProperty(exports, "isLet", { + enumerable: true, + get: function () { + return _isLet.default; + } + }); + Object.defineProperty(exports, "isNode", { + enumerable: true, + get: function () { + return _isNode.default; + } + }); + Object.defineProperty(exports, "isNodesEquivalent", { + enumerable: true, + get: function () { + return _isNodesEquivalent.default; + } + }); + Object.defineProperty(exports, "isPlaceholderType", { + enumerable: true, + get: function () { + return _isPlaceholderType.default; + } + }); + Object.defineProperty(exports, "isReferenced", { + enumerable: true, + get: function () { + return _isReferenced.default; + } + }); + Object.defineProperty(exports, "isScope", { + enumerable: true, + get: function () { + return _isScope.default; + } + }); + Object.defineProperty(exports, "isSpecifierDefault", { + enumerable: true, + get: function () { + return _isSpecifierDefault.default; + } + }); + Object.defineProperty(exports, "isType", { + enumerable: true, + get: function () { + return _isType.default; + } + }); + Object.defineProperty(exports, "isValidES3Identifier", { + enumerable: true, + get: function () { + return _isValidES3Identifier.default; + } + }); + Object.defineProperty(exports, "isValidIdentifier", { + enumerable: true, + get: function () { + return _isValidIdentifier.default; + } + }); + Object.defineProperty(exports, "isVar", { + enumerable: true, + get: function () { + return _isVar.default; + } + }); + Object.defineProperty(exports, "matchesPattern", { + enumerable: true, + get: function () { + return _matchesPattern.default; + } + }); + Object.defineProperty(exports, "prependToMemberExpression", { + enumerable: true, + get: function () { + return _prependToMemberExpression.default; + } + }); + exports.react = void 0; + Object.defineProperty(exports, "removeComments", { + enumerable: true, + get: function () { + return _removeComments.default; + } + }); + Object.defineProperty(exports, "removeProperties", { + enumerable: true, + get: function () { + return _removeProperties.default; + } + }); + Object.defineProperty(exports, "removePropertiesDeep", { + enumerable: true, + get: function () { + return _removePropertiesDeep.default; + } + }); + Object.defineProperty(exports, "removeTypeDuplicates", { + enumerable: true, + get: function () { + return _removeTypeDuplicates.default; + } + }); + Object.defineProperty(exports, "shallowEqual", { + enumerable: true, + get: function () { + return _shallowEqual.default; + } + }); + Object.defineProperty(exports, "toBindingIdentifierName", { + enumerable: true, + get: function () { + return _toBindingIdentifierName.default; + } + }); + Object.defineProperty(exports, "toBlock", { + enumerable: true, + get: function () { + return _toBlock.default; + } + }); + Object.defineProperty(exports, "toComputedKey", { + enumerable: true, + get: function () { + return _toComputedKey.default; + } + }); + Object.defineProperty(exports, "toExpression", { + enumerable: true, + get: function () { + return _toExpression.default; + } + }); + Object.defineProperty(exports, "toIdentifier", { + enumerable: true, + get: function () { + return _toIdentifier.default; + } + }); + Object.defineProperty(exports, "toKeyAlias", { + enumerable: true, + get: function () { + return _toKeyAlias.default; + } + }); + Object.defineProperty(exports, "toStatement", { + enumerable: true, + get: function () { + return _toStatement.default; + } + }); + Object.defineProperty(exports, "traverse", { + enumerable: true, + get: function () { + return _traverse.default; + } + }); + Object.defineProperty(exports, "traverseFast", { + enumerable: true, + get: function () { + return _traverseFast.default; + } + }); + Object.defineProperty(exports, "validate", { + enumerable: true, + get: function () { + return _validate.default; + } + }); + Object.defineProperty(exports, "valueToNode", { + enumerable: true, + get: function () { + return _valueToNode.default; + } + }); + var _isReactComponent = requireIsReactComponent(); + var _isCompatTag = requireIsCompatTag(); + var _buildChildren = requireBuildChildren(); + var _assertNode = requireAssertNode(); + var _index = requireGenerated$1(); + Object.keys(_index).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index[key]; + } + }); + }); + var _createTypeAnnotationBasedOnTypeof = requireCreateTypeAnnotationBasedOnTypeof(); + var _createFlowUnionType = requireCreateFlowUnionType(); + var _createTSUnionType = requireCreateTSUnionType(); + var _index2 = requireGenerated$2(); + Object.keys(_index2).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index2[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index2[key]; + } + }); + }); + var _uppercase = requireUppercase(); + Object.keys(_uppercase).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _uppercase[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _uppercase[key]; + } + }); + }); + var _productions = requireProductions(); + Object.keys(_productions).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _productions[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _productions[key]; + } + }); + }); + var _cloneNode = requireCloneNode(); + var _clone = requireClone(); + var _cloneDeep = requireCloneDeep(); + var _cloneDeepWithoutLoc = requireCloneDeepWithoutLoc(); + var _cloneWithoutLoc = requireCloneWithoutLoc(); + var _addComment = requireAddComment(); + var _addComments = requireAddComments(); + var _inheritInnerComments = requireInheritInnerComments(); + var _inheritLeadingComments = requireInheritLeadingComments(); + var _inheritsComments = requireInheritsComments(); + var _inheritTrailingComments = requireInheritTrailingComments(); + var _removeComments = requireRemoveComments(); + var _index3 = requireGenerated(); + Object.keys(_index3).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index3[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index3[key]; + } + }); + }); + var _index4 = requireConstants(); + Object.keys(_index4).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index4[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index4[key]; + } + }); + }); + var _ensureBlock = requireEnsureBlock(); + var _toBindingIdentifierName = requireToBindingIdentifierName(); + var _toBlock = requireToBlock(); + var _toComputedKey = requireToComputedKey(); + var _toExpression = requireToExpression(); + var _toIdentifier = requireToIdentifier(); + var _toKeyAlias = requireToKeyAlias(); + var _toStatement = requireToStatement(); + var _valueToNode = requireValueToNode(); + var _index5 = requireDefinitions(); + Object.keys(_index5).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index5[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index5[key]; + } + }); + }); + var _appendToMemberExpression = requireAppendToMemberExpression(); + var _inherits = requireInherits(); + var _prependToMemberExpression = requirePrependToMemberExpression(); + var _removeProperties = requireRemoveProperties(); + var _removePropertiesDeep = requireRemovePropertiesDeep(); + var _removeTypeDuplicates = requireRemoveTypeDuplicates$1(); + var _getAssignmentIdentifiers = requireGetAssignmentIdentifiers(); + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + var _getOuterBindingIdentifiers = requireGetOuterBindingIdentifiers(); + var _getFunctionName = requireGetFunctionName(); + var _traverse = requireTraverse(); + Object.keys(_traverse).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _traverse[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _traverse[key]; + } + }); + }); + var _traverseFast = requireTraverseFast(); + var _shallowEqual = requireShallowEqual(); + var _is = requireIs(); + var _isBinding = requireIsBinding(); + var _isBlockScoped = requireIsBlockScoped(); + var _isImmutable = requireIsImmutable(); + var _isLet = requireIsLet(); + var _isNode = requireIsNode(); + var _isNodesEquivalent = requireIsNodesEquivalent(); + var _isPlaceholderType = requireIsPlaceholderType(); + var _isReferenced = requireIsReferenced(); + var _isScope = requireIsScope(); + var _isSpecifierDefault = requireIsSpecifierDefault(); + var _isType = requireIsType(); + var _isValidES3Identifier = requireIsValidES3Identifier(); + var _isValidIdentifier = requireIsValidIdentifier(); + var _isVar = requireIsVar(); + var _matchesPattern = requireMatchesPattern(); + var _validate = requireValidate(); + var _buildMatchMemberExpression = requireBuildMatchMemberExpression(); + var _index6 = requireGenerated$3(); + Object.keys(_index6).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index6[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index6[key]; + } + }); + }); + var _deprecationWarning = requireDeprecationWarning(); + exports.react = { + isReactComponent: _isReactComponent.default, + isCompatTag: _isCompatTag.default, + buildChildren: _buildChildren.default + }; + { + exports.toSequenceExpression = requireToSequenceExpression().default; + } + if (process.env.BABEL_TYPES_8_BREAKING) { + console.warn("BABEL_TYPES_8_BREAKING is not supported anymore. Use the latest Babel 8.0.0 pre-release instead!"); + } + + +} (lib$3)); + return lib$3; +} + +var libExports$1 = requireLib$1(); + +var lib = {}; + +var picocolorsExports = {}; +var picocolors = { + get exports(){ return picocolorsExports; }, + set exports(v){ picocolorsExports = v; }, +}; + +var hasRequiredPicocolors; + +function requirePicocolors () { + if (hasRequiredPicocolors) return picocolorsExports; + hasRequiredPicocolors = 1; + let p = process || {}, argv = p.argv || [], env = p.env || {}; + let isColorSupported = + !(!!env.NO_COLOR || argv.includes("--no-color")) && + (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI); + + let formatter = (open, close, replace = open) => + input => { + let string = "" + input, index = string.indexOf(close, open.length); + return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close + }; + + let replaceClose = (string, close, replace, index) => { + let result = "", cursor = 0; + do { + result += string.substring(cursor, index) + replace; + cursor = index + close.length; + index = string.indexOf(close, cursor); + } while (~index) + return result + string.substring(cursor) + }; + + let createColors = (enabled = isColorSupported) => { + let f = enabled ? formatter : () => String; + return { + isColorSupported: enabled, + reset: f("\x1b[0m", "\x1b[0m"), + bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), + dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), + italic: f("\x1b[3m", "\x1b[23m"), + underline: f("\x1b[4m", "\x1b[24m"), + inverse: f("\x1b[7m", "\x1b[27m"), + hidden: f("\x1b[8m", "\x1b[28m"), + strikethrough: f("\x1b[9m", "\x1b[29m"), + + black: f("\x1b[30m", "\x1b[39m"), + red: f("\x1b[31m", "\x1b[39m"), + green: f("\x1b[32m", "\x1b[39m"), + yellow: f("\x1b[33m", "\x1b[39m"), + blue: f("\x1b[34m", "\x1b[39m"), + magenta: f("\x1b[35m", "\x1b[39m"), + cyan: f("\x1b[36m", "\x1b[39m"), + white: f("\x1b[37m", "\x1b[39m"), + gray: f("\x1b[90m", "\x1b[39m"), + + bgBlack: f("\x1b[40m", "\x1b[49m"), + bgRed: f("\x1b[41m", "\x1b[49m"), + bgGreen: f("\x1b[42m", "\x1b[49m"), + bgYellow: f("\x1b[43m", "\x1b[49m"), + bgBlue: f("\x1b[44m", "\x1b[49m"), + bgMagenta: f("\x1b[45m", "\x1b[49m"), + bgCyan: f("\x1b[46m", "\x1b[49m"), + bgWhite: f("\x1b[47m", "\x1b[49m"), + + blackBright: f("\x1b[90m", "\x1b[39m"), + redBright: f("\x1b[91m", "\x1b[39m"), + greenBright: f("\x1b[92m", "\x1b[39m"), + yellowBright: f("\x1b[93m", "\x1b[39m"), + blueBright: f("\x1b[94m", "\x1b[39m"), + magentaBright: f("\x1b[95m", "\x1b[39m"), + cyanBright: f("\x1b[96m", "\x1b[39m"), + whiteBright: f("\x1b[97m", "\x1b[39m"), + + bgBlackBright: f("\x1b[100m", "\x1b[49m"), + bgRedBright: f("\x1b[101m", "\x1b[49m"), + bgGreenBright: f("\x1b[102m", "\x1b[49m"), + bgYellowBright: f("\x1b[103m", "\x1b[49m"), + bgBlueBright: f("\x1b[104m", "\x1b[49m"), + bgMagentaBright: f("\x1b[105m", "\x1b[49m"), + bgCyanBright: f("\x1b[106m", "\x1b[49m"), + bgWhiteBright: f("\x1b[107m", "\x1b[49m"), + } + }; + + picocolors.exports = createColors(); + picocolorsExports.createColors = createColors; + return picocolorsExports; +} + +var jsTokens = {}; + +var hasRequiredJsTokens; + +function requireJsTokens () { + if (hasRequiredJsTokens) return jsTokens; + hasRequiredJsTokens = 1; + // Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell + // License: MIT. (See LICENSE.) + + Object.defineProperty(jsTokens, "__esModule", { + value: true + }); + + // This regex comes from regex.coffee, and is inserted here by generate-index.js + // (run `npm run build`). + jsTokens.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g; + + jsTokens.matchToToken = function(match) { + var token = {type: "invalid", value: match[0], closed: undefined}; + if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]); + else if (match[ 5]) token.type = "comment"; + else if (match[ 6]) token.type = "comment", token.closed = !!match[7]; + else if (match[ 8]) token.type = "regex"; + else if (match[ 9]) token.type = "number"; + else if (match[10]) token.type = "name"; + else if (match[11]) token.type = "punctuator"; + else if (match[12]) token.type = "whitespace"; + return token + }; + return jsTokens; +} + +var hasRequiredLib; + +function requireLib () { + if (hasRequiredLib) return lib; + hasRequiredLib = 1; + + Object.defineProperty(lib, '__esModule', { value: true }); + + var picocolors = requirePicocolors(); + var jsTokens = requireJsTokens(); + var helperValidatorIdentifier = requireLib$3(); + + function isColorSupported() { + return (typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported + ); + } + const compose = (f, g) => v => f(g(v)); + function buildDefs(colors) { + return { + keyword: colors.cyan, + capitalized: colors.yellow, + jsxIdentifier: colors.yellow, + punctuator: colors.yellow, + number: colors.magenta, + string: colors.green, + regex: colors.magenta, + comment: colors.gray, + invalid: compose(compose(colors.white, colors.bgRed), colors.bold), + gutter: colors.gray, + marker: compose(colors.red, colors.bold), + message: compose(colors.red, colors.bold), + reset: colors.reset + }; + } + const defsOn = buildDefs(picocolors.createColors(true)); + const defsOff = buildDefs(picocolors.createColors(false)); + function getDefs(enabled) { + return enabled ? defsOn : defsOff; + } + + const sometimesKeywords = new Set(["as", "async", "from", "get", "of", "set"]); + const NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/; + const BRACKET = /^[()[\]{}]$/; + let tokenize; + { + const JSX_TAG = /^[a-z][\w-]*$/i; + const getTokenType = function (token, offset, text) { + if (token.type === "name") { + if (helperValidatorIdentifier.isKeyword(token.value) || helperValidatorIdentifier.isStrictReservedWord(token.value, true) || sometimesKeywords.has(token.value)) { + return "keyword"; + } + if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === " defs[type](str)).join("\n"); + } else { + highlighted += value; + } + } + return highlighted; + } + + let deprecationWarningShown = false; + const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; + function getMarkerLines(loc, source, opts) { + const startLoc = Object.assign({ + column: 0, + line: -1 + }, loc.start); + const endLoc = Object.assign({}, startLoc, loc.end); + const { + linesAbove = 2, + linesBelow = 3 + } = opts || {}; + const startLine = startLoc.line; + const startColumn = startLoc.column; + const endLine = endLoc.line; + const endColumn = endLoc.column; + let start = Math.max(startLine - (linesAbove + 1), 0); + let end = Math.min(source.length, endLine + linesBelow); + if (startLine === -1) { + start = 0; + } + if (endLine === -1) { + end = source.length; + } + const lineDiff = endLine - startLine; + const markerLines = {}; + if (lineDiff) { + for (let i = 0; i <= lineDiff; i++) { + const lineNumber = i + startLine; + if (!startColumn) { + markerLines[lineNumber] = true; + } else if (i === 0) { + const sourceLength = source[lineNumber - 1].length; + markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; + } else if (i === lineDiff) { + markerLines[lineNumber] = [0, endColumn]; + } else { + const sourceLength = source[lineNumber - i].length; + markerLines[lineNumber] = [0, sourceLength]; + } + } + } else { + if (startColumn === endColumn) { + if (startColumn) { + markerLines[startLine] = [startColumn, 0]; + } else { + markerLines[startLine] = true; + } + } else { + markerLines[startLine] = [startColumn, endColumn - startColumn]; + } + } + return { + start, + end, + markerLines + }; + } + function codeFrameColumns(rawLines, loc, opts = {}) { + const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode; + const defs = getDefs(shouldHighlight); + const lines = rawLines.split(NEWLINE); + const { + start, + end, + markerLines + } = getMarkerLines(loc, lines, opts); + const hasColumns = loc.start && typeof loc.start.column === "number"; + const numberMaxWidth = String(end).length; + const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines; + let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index) => { + const number = start + 1 + index; + const paddedNumber = ` ${number}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} |`; + const hasMarker = markerLines[number]; + const lastMarkerLine = !markerLines[number + 1]; + if (hasMarker) { + let markerLine = ""; + if (Array.isArray(hasMarker)) { + const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; + markerLine = ["\n ", defs.gutter(gutter.replace(/\d/g, " ")), " ", markerSpacing, defs.marker("^").repeat(numberOfMarkers)].join(""); + if (lastMarkerLine && opts.message) { + markerLine += " " + defs.message(opts.message); + } + } + return [defs.marker(">"), defs.gutter(gutter), line.length > 0 ? ` ${line}` : "", markerLine].join(""); + } else { + return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`; + } + }).join("\n"); + if (opts.message && !hasColumns) { + frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; + } + if (shouldHighlight) { + return defs.reset(frame); + } else { + return frame; + } + } + function index (rawLines, lineNumber, colNumber, opts = {}) { + if (!deprecationWarningShown) { + deprecationWarningShown = true; + const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; + if (process.emitWarning) { + process.emitWarning(message, "DeprecationWarning"); + } else { + const deprecationError = new Error(message); + deprecationError.name = "DeprecationWarning"; + console.warn(new Error(message)); + } + } + colNumber = Math.max(colNumber, 0); + const location = { + start: { + column: colNumber, + line: lineNumber + } + }; + return codeFrameColumns(rawLines, location, opts); + } + + lib.codeFrameColumns = codeFrameColumns; + lib.default = index; + lib.highlight = highlight; + + return lib; +} + +var libExports = requireLib(); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + + +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +var _OkImpl_val, _ErrImpl_val; +function Ok(val) { + return new OkImpl(val); +} +class OkImpl { + constructor(val) { + _OkImpl_val.set(this, void 0); + __classPrivateFieldSet(this, _OkImpl_val, val, "f"); + } + map(fn) { + return new OkImpl(fn(__classPrivateFieldGet(this, _OkImpl_val, "f"))); + } + mapErr(_fn) { + return this; + } + mapOr(_fallback, fn) { + return fn(__classPrivateFieldGet(this, _OkImpl_val, "f")); + } + mapOrElse(_fallback, fn) { + return fn(__classPrivateFieldGet(this, _OkImpl_val, "f")); + } + andThen(fn) { + return fn(__classPrivateFieldGet(this, _OkImpl_val, "f")); + } + and(res) { + return res; + } + or(_res) { + return this; + } + orElse(_fn) { + return this; + } + isOk() { + return true; + } + isErr() { + return false; + } + expect(_msg) { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + expectErr(msg) { + throw new Error(`${msg}: ${__classPrivateFieldGet(this, _OkImpl_val, "f")}`); + } + unwrap() { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + unwrapOr(_fallback) { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + unwrapOrElse(_fallback) { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + unwrapErr() { + if (__classPrivateFieldGet(this, _OkImpl_val, "f") instanceof Error) { + throw __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + throw new Error(`Can't unwrap \`Ok\` to \`Err\`: ${__classPrivateFieldGet(this, _OkImpl_val, "f")}`); + } +} +_OkImpl_val = new WeakMap(); +function Err(val) { + return new ErrImpl(val); +} +class ErrImpl { + constructor(val) { + _ErrImpl_val.set(this, void 0); + __classPrivateFieldSet(this, _ErrImpl_val, val, "f"); + } + map(_fn) { + return this; + } + mapErr(fn) { + return new ErrImpl(fn(__classPrivateFieldGet(this, _ErrImpl_val, "f"))); + } + mapOr(fallback, _fn) { + return fallback; + } + mapOrElse(fallback, _fn) { + return fallback(); + } + andThen(_fn) { + return this; + } + and(_res) { + return this; + } + or(res) { + return res; + } + orElse(fn) { + return fn(__classPrivateFieldGet(this, _ErrImpl_val, "f")); + } + isOk() { + return false; + } + isErr() { + return true; + } + expect(msg) { + throw new Error(`${msg}: ${__classPrivateFieldGet(this, _ErrImpl_val, "f")}`); + } + expectErr(_msg) { + return __classPrivateFieldGet(this, _ErrImpl_val, "f"); + } + unwrap() { + if (__classPrivateFieldGet(this, _ErrImpl_val, "f") instanceof Error) { + throw __classPrivateFieldGet(this, _ErrImpl_val, "f"); + } + throw new Error(`Can't unwrap \`Err\` to \`Ok\`: ${__classPrivateFieldGet(this, _ErrImpl_val, "f")}`); + } + unwrapOr(fallback) { + return fallback; + } + unwrapOrElse(fallback) { + return fallback(__classPrivateFieldGet(this, _ErrImpl_val, "f")); + } + unwrapErr() { + return __classPrivateFieldGet(this, _ErrImpl_val, "f"); + } +} +_ErrImpl_val = new WeakMap(); + +function assertExhaustive$1(_, errorMsg) { + throw new Error(errorMsg); +} +function retainWhere(array, predicate) { + let writeIndex = 0; + for (let readIndex = 0; readIndex < array.length; readIndex++) { + const item = array[readIndex]; + if (predicate(item, readIndex) === true) { + array[writeIndex++] = item; + } + } + array.length = writeIndex; +} +function retainWhere_Set(items, predicate) { + for (const item of items) { + if (!predicate(item)) { + items.delete(item); + } + } +} +function getOrInsertWith(m, key, makeDefault) { + if (m.has(key)) { + return m.get(key); + } + else { + const defaultValue = makeDefault(); + m.set(key, defaultValue); + return defaultValue; + } +} +function getOrInsertDefault(m, key, defaultValue) { + if (m.has(key)) { + return m.get(key); + } + else { + m.set(key, defaultValue); + return defaultValue; + } +} +function Set_equal(a, b) { + if (a.size !== b.size) { + return false; + } + for (const item of a) { + if (!b.has(item)) { + return false; + } + } + return true; +} +function Set_union(a, b) { + const union = new Set(a); + for (const item of b) { + union.add(item); + } + return union; +} +function Set_intersect(sets) { + if (sets.length === 0 || sets.some(s => s.size === 0)) { + return new Set(); + } + else if (sets.length === 1) { + return new Set(sets[0]); + } + const result = new Set(); + const first = sets[0]; + outer: for (const e of first) { + for (let i = 1; i < sets.length; i++) { + if (!sets[i].has(e)) { + continue outer; + } + } + result.add(e); + } + return result; +} +function Set_isSuperset(a, b) { + for (const v of b) { + if (!a.has(v)) { + return false; + } + } + return true; +} +function Iterable_some(iter, pred) { + for (const item of iter) { + if (pred(item)) { + return true; + } + } + return false; +} +function Set_filter(source, fn) { + const result = new Set(); + for (const entry of source) { + if (fn(entry)) { + result.add(entry); + } + } + return result; +} +function hasNode(input) { + return input.node != null; +} +function hasOwnProperty$1(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +var ErrorSeverity; +(function (ErrorSeverity) { + ErrorSeverity["Error"] = "Error"; + ErrorSeverity["Warning"] = "Warning"; + ErrorSeverity["Hint"] = "Hint"; + ErrorSeverity["Off"] = "Off"; +})(ErrorSeverity || (ErrorSeverity = {})); +var CompilerSuggestionOperation; +(function (CompilerSuggestionOperation) { + CompilerSuggestionOperation[CompilerSuggestionOperation["InsertBefore"] = 0] = "InsertBefore"; + CompilerSuggestionOperation[CompilerSuggestionOperation["InsertAfter"] = 1] = "InsertAfter"; + CompilerSuggestionOperation[CompilerSuggestionOperation["Remove"] = 2] = "Remove"; + CompilerSuggestionOperation[CompilerSuggestionOperation["Replace"] = 3] = "Replace"; +})(CompilerSuggestionOperation || (CompilerSuggestionOperation = {})); +class CompilerDiagnostic { + constructor(options) { + this.options = options; + } + static create(options) { + return new CompilerDiagnostic(Object.assign(Object.assign({}, options), { details: [] })); + } + get reason() { + return this.options.reason; + } + get description() { + return this.options.description; + } + get severity() { + return getRuleForCategory(this.category).severity; + } + get suggestions() { + return this.options.suggestions; + } + get category() { + return this.options.category; + } + withDetails(...details) { + this.options.details.push(...details); + return this; + } + primaryLocation() { + const firstErrorDetail = this.options.details.filter(d => d.kind === 'error')[0]; + return firstErrorDetail != null && firstErrorDetail.kind === 'error' + ? firstErrorDetail.loc + : null; + } + printErrorMessage(source, options) { + var _a, _b; + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push('\n\n', `${this.description}.`); + } + for (const detail of this.options.details) { + switch (detail.kind) { + case 'error': { + const loc = detail.loc; + if (loc == null || typeof loc === 'symbol') { + continue; + } + let codeFrame; + try { + codeFrame = printCodeFrame(source, loc, (_a = detail.message) !== null && _a !== void 0 ? _a : ''); + } + catch (e) { + codeFrame = (_b = detail.message) !== null && _b !== void 0 ? _b : ''; + } + buffer.push('\n\n'); + if (loc.filename != null) { + const line = loc.start.line; + const column = options.eslint + ? loc.start.column + 1 + : loc.start.column; + buffer.push(`${loc.filename}:${line}:${column}\n`); + } + buffer.push(codeFrame); + break; + } + case 'hint': { + buffer.push('\n\n'); + buffer.push(detail.message); + break; + } + default: { + assertExhaustive$1(detail, `Unexpected detail kind ${detail.kind}`); + } + } + } + return buffer.join(''); + } + toString() { + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push(`. ${this.description}.`); + } + const loc = this.primaryLocation(); + if (loc != null && typeof loc !== 'symbol') { + buffer.push(` (${loc.start.line}:${loc.start.column})`); + } + return buffer.join(''); + } +} +class CompilerErrorDetail { + constructor(options) { + this.options = options; + } + get reason() { + return this.options.reason; + } + get description() { + return this.options.description; + } + get severity() { + return getRuleForCategory(this.category).severity; + } + get loc() { + return this.options.loc; + } + get suggestions() { + return this.options.suggestions; + } + get category() { + return this.options.category; + } + primaryLocation() { + return this.loc; + } + printErrorMessage(source, options) { + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push(`\n\n${this.description}.`); + } + const loc = this.loc; + if (loc != null && typeof loc !== 'symbol') { + let codeFrame; + try { + codeFrame = printCodeFrame(source, loc, this.reason); + } + catch (e) { + codeFrame = ''; + } + buffer.push(`\n\n`); + if (loc.filename != null) { + const line = loc.start.line; + const column = options.eslint ? loc.start.column + 1 : loc.start.column; + buffer.push(`${loc.filename}:${line}:${column}\n`); + } + buffer.push(codeFrame); + buffer.push('\n\n'); + } + return buffer.join(''); + } + toString() { + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push(`. ${this.description}.`); + } + const loc = this.loc; + if (loc != null && typeof loc !== 'symbol') { + buffer.push(` (${loc.start.line}:${loc.start.column})`); + } + return buffer.join(''); + } +} +class CompilerError extends Error { + static invariant(condition, options) { + if (!condition) { + const errors = new CompilerError(); + errors.pushDiagnostic(CompilerDiagnostic.create({ + reason: options.reason, + description: options.description, + category: ErrorCategory.Invariant, + }).withDetails(...options.details)); + throw errors; + } + } + static throwDiagnostic(options) { + const errors = new CompilerError(); + errors.pushDiagnostic(new CompilerDiagnostic(options)); + throw errors; + } + static throwTodo(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(Object.assign(Object.assign({}, options), { category: ErrorCategory.Todo }))); + throw errors; + } + static throwInvalidJS(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(Object.assign(Object.assign({}, options), { category: ErrorCategory.Syntax }))); + throw errors; + } + static throwInvalidReact(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(options)); + throw errors; + } + static throwInvalidConfig(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(Object.assign(Object.assign({}, options), { category: ErrorCategory.Config }))); + throw errors; + } + static throw(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(options)); + throw errors; + } + constructor(...args) { + super(...args); + this.details = []; + this.disabledDetails = []; + this.printedMessage = null; + this.name = 'ReactCompilerError'; + this.details = []; + this.disabledDetails = []; + } + get message() { + var _a; + return (_a = this.printedMessage) !== null && _a !== void 0 ? _a : this.toString(); + } + set message(_message) { } + toString() { + if (this.printedMessage) { + return this.printedMessage; + } + if (Array.isArray(this.details)) { + return this.details.map(detail => detail.toString()).join('\n\n'); + } + return this.name; + } + withPrintedMessage(source, options) { + this.printedMessage = this.printErrorMessage(source, options); + return this; + } + printErrorMessage(source, options) { + if (options.eslint && this.details.length === 1) { + return this.details[0].printErrorMessage(source, options); + } + return (`Found ${this.details.length} error${this.details.length === 1 ? '' : 's'}:\n\n` + + this.details + .map(detail => detail.printErrorMessage(source, options).trim()) + .join('\n\n')); + } + merge(other) { + this.details.push(...other.details); + this.disabledDetails.push(...other.disabledDetails); + } + pushDiagnostic(diagnostic) { + if (diagnostic.severity === ErrorSeverity.Off) { + this.disabledDetails.push(diagnostic); + } + else { + this.details.push(diagnostic); + } + } + push(options) { + var _a; + const detail = new CompilerErrorDetail({ + category: options.category, + reason: options.reason, + description: (_a = options.description) !== null && _a !== void 0 ? _a : null, + suggestions: options.suggestions, + loc: typeof options.loc === 'symbol' ? null : options.loc, + }); + return this.pushErrorDetail(detail); + } + pushErrorDetail(detail) { + if (detail.severity === ErrorSeverity.Off) { + this.disabledDetails.push(detail); + } + else { + this.details.push(detail); + } + return detail; + } + hasAnyErrors() { + return this.details.length > 0; + } + asResult() { + return this.hasAnyErrors() ? Err(this) : Ok(undefined); + } + hasErrors() { + for (const detail of this.details) { + if (detail.severity === ErrorSeverity.Error) { + return true; + } + } + return false; + } + hasWarning() { + let res = false; + for (const detail of this.details) { + if (detail.severity === ErrorSeverity.Error) { + return false; + } + if (detail.severity === ErrorSeverity.Warning) { + res = true; + } + } + return res; + } + hasHints() { + let res = false; + for (const detail of this.details) { + if (detail.severity === ErrorSeverity.Error) { + return false; + } + if (detail.severity === ErrorSeverity.Warning) { + return false; + } + if (detail.severity === ErrorSeverity.Hint) { + res = true; + } + } + return res; + } +} +function printCodeFrame(source, loc, message) { + return libExports.codeFrameColumns(source, { + start: { + line: loc.start.line, + column: loc.start.column + 1, + }, + end: { + line: loc.end.line, + column: loc.end.column + 1, + }, + }, { + message, + }); +} +function printErrorSummary(category, message) { + let heading; + switch (category) { + case ErrorCategory.AutomaticEffectDependencies: + case ErrorCategory.CapitalizedCalls: + case ErrorCategory.Config: + case ErrorCategory.EffectDerivationsOfState: + case ErrorCategory.EffectSetState: + case ErrorCategory.ErrorBoundaries: + case ErrorCategory.Factories: + case ErrorCategory.FBT: + case ErrorCategory.Fire: + case ErrorCategory.Gating: + case ErrorCategory.Globals: + case ErrorCategory.Hooks: + case ErrorCategory.Immutability: + case ErrorCategory.Purity: + case ErrorCategory.Refs: + case ErrorCategory.RenderSetState: + case ErrorCategory.StaticComponents: + case ErrorCategory.Suppression: + case ErrorCategory.Syntax: + case ErrorCategory.UseMemo: { + heading = 'Error'; + break; + } + case ErrorCategory.EffectDependencies: + case ErrorCategory.IncompatibleLibrary: + case ErrorCategory.PreserveManualMemo: + case ErrorCategory.UnsupportedSyntax: { + heading = 'Compilation Skipped'; + break; + } + case ErrorCategory.Invariant: { + heading = 'Invariant'; + break; + } + case ErrorCategory.Todo: { + heading = 'Todo'; + break; + } + default: { + assertExhaustive$1(category, `Unhandled category '${category}'`); + } + } + return `${heading}: ${message}`; +} +var ErrorCategory; +(function (ErrorCategory) { + ErrorCategory["Hooks"] = "Hooks"; + ErrorCategory["CapitalizedCalls"] = "CapitalizedCalls"; + ErrorCategory["StaticComponents"] = "StaticComponents"; + ErrorCategory["UseMemo"] = "UseMemo"; + ErrorCategory["Factories"] = "Factories"; + ErrorCategory["PreserveManualMemo"] = "PreserveManualMemo"; + ErrorCategory["IncompatibleLibrary"] = "IncompatibleLibrary"; + ErrorCategory["Immutability"] = "Immutability"; + ErrorCategory["Globals"] = "Globals"; + ErrorCategory["Refs"] = "Refs"; + ErrorCategory["EffectDependencies"] = "EffectDependencies"; + ErrorCategory["EffectSetState"] = "EffectSetState"; + ErrorCategory["EffectDerivationsOfState"] = "EffectDerivationsOfState"; + ErrorCategory["ErrorBoundaries"] = "ErrorBoundaries"; + ErrorCategory["Purity"] = "Purity"; + ErrorCategory["RenderSetState"] = "RenderSetState"; + ErrorCategory["Invariant"] = "Invariant"; + ErrorCategory["Todo"] = "Todo"; + ErrorCategory["Syntax"] = "Syntax"; + ErrorCategory["UnsupportedSyntax"] = "UnsupportedSyntax"; + ErrorCategory["Config"] = "Config"; + ErrorCategory["Gating"] = "Gating"; + ErrorCategory["Suppression"] = "Suppression"; + ErrorCategory["AutomaticEffectDependencies"] = "AutomaticEffectDependencies"; + ErrorCategory["Fire"] = "Fire"; + ErrorCategory["FBT"] = "FBT"; +})(ErrorCategory || (ErrorCategory = {})); +const RULE_NAME_PATTERN = /^[a-z]+(-[a-z]+)*$/; +function getRuleForCategory(category) { + const rule = getRuleForCategoryImpl(category); + invariant(RULE_NAME_PATTERN.test(rule.name), `Invalid rule name, got '${rule.name}' but rules must match ${RULE_NAME_PATTERN.toString()}`); + return rule; +} +function getRuleForCategoryImpl(category) { + switch (category) { + case ErrorCategory.AutomaticEffectDependencies: { + return { + category, + severity: ErrorSeverity.Error, + name: 'automatic-effect-dependencies', + description: 'Verifies that automatic effect dependencies are compiled if opted-in', + recommended: false, + }; + } + case ErrorCategory.CapitalizedCalls: { + return { + category, + severity: ErrorSeverity.Error, + name: 'capitalized-calls', + description: 'Validates against calling capitalized functions/methods instead of using JSX', + recommended: false, + }; + } + case ErrorCategory.Config: { + return { + category, + severity: ErrorSeverity.Error, + name: 'config', + description: 'Validates the compiler configuration options', + recommended: true, + }; + } + case ErrorCategory.EffectDependencies: { + return { + category, + severity: ErrorSeverity.Error, + name: 'memoized-effect-dependencies', + description: 'Validates that effect dependencies are memoized', + recommended: false, + }; + } + case ErrorCategory.EffectDerivationsOfState: { + return { + category, + severity: ErrorSeverity.Error, + name: 'no-deriving-state-in-effects', + description: 'Validates against deriving values from state in an effect', + recommended: false, + }; + } + case ErrorCategory.EffectSetState: { + return { + category, + severity: ErrorSeverity.Error, + name: 'set-state-in-effect', + description: 'Validates against calling setState synchronously in an effect, which can lead to re-renders that degrade performance', + recommended: true, + }; + } + case ErrorCategory.ErrorBoundaries: { + return { + category, + severity: ErrorSeverity.Error, + name: 'error-boundaries', + description: 'Validates usage of error boundaries instead of try/catch for errors in child components', + recommended: true, + }; + } + case ErrorCategory.Factories: { + return { + category, + severity: ErrorSeverity.Error, + name: 'component-hook-factories', + description: 'Validates against higher order functions defining nested components or hooks. ' + + 'Components and hooks should be defined at the module level', + recommended: true, + }; + } + case ErrorCategory.FBT: { + return { + category, + severity: ErrorSeverity.Error, + name: 'fbt', + description: 'Validates usage of fbt', + recommended: false, + }; + } + case ErrorCategory.Fire: { + return { + category, + severity: ErrorSeverity.Error, + name: 'fire', + description: 'Validates usage of `fire`', + recommended: false, + }; + } + case ErrorCategory.Gating: { + return { + category, + severity: ErrorSeverity.Error, + name: 'gating', + description: 'Validates configuration of [gating mode](https://react.dev/reference/react-compiler/gating)', + recommended: true, + }; + } + case ErrorCategory.Globals: { + return { + category, + severity: ErrorSeverity.Error, + name: 'globals', + description: 'Validates against assignment/mutation of globals during render, part of ensuring that ' + + '[side effects must render outside of render](https://react.dev/reference/rules/components-and-hooks-must-be-pure#side-effects-must-run-outside-of-render)', + recommended: true, + }; + } + case ErrorCategory.Hooks: { + return { + category, + severity: ErrorSeverity.Error, + name: 'hooks', + description: 'Validates the rules of hooks', + recommended: false, + }; + } + case ErrorCategory.Immutability: { + return { + category, + severity: ErrorSeverity.Error, + name: 'immutability', + description: 'Validates against mutating props, state, and other values that [are immutable](https://react.dev/reference/rules/components-and-hooks-must-be-pure#props-and-state-are-immutable)', + recommended: true, + }; + } + case ErrorCategory.Invariant: { + return { + category, + severity: ErrorSeverity.Error, + name: 'invariant', + description: 'Internal invariants', + recommended: false, + }; + } + case ErrorCategory.PreserveManualMemo: { + return { + category, + severity: ErrorSeverity.Error, + name: 'preserve-manual-memoization', + description: 'Validates that existing manual memoized is preserved by the compiler. ' + + 'React Compiler will only compile components and hooks if its inference ' + + '[matches or exceeds the existing manual memoization](https://react.dev/learn/react-compiler/introduction#what-should-i-do-about-usememo-usecallback-and-reactmemo)', + recommended: true, + }; + } + case ErrorCategory.Purity: { + return { + category, + severity: ErrorSeverity.Error, + name: 'purity', + description: 'Validates that [components/hooks are pure](https://react.dev/reference/rules/components-and-hooks-must-be-pure) by checking that they do not call known-impure functions', + recommended: true, + }; + } + case ErrorCategory.Refs: { + return { + category, + severity: ErrorSeverity.Error, + name: 'refs', + description: 'Validates correct usage of refs, not reading/writing during render. See the "pitfalls" section in [`useRef()` usage](https://react.dev/reference/react/useRef#usage)', + recommended: true, + }; + } + case ErrorCategory.RenderSetState: { + return { + category, + severity: ErrorSeverity.Error, + name: 'set-state-in-render', + description: 'Validates against setting state during render, which can trigger additional renders and potential infinite render loops', + recommended: true, + }; + } + case ErrorCategory.StaticComponents: { + return { + category, + severity: ErrorSeverity.Error, + name: 'static-components', + description: 'Validates that components are static, not recreated every render. Components that are recreated dynamically can reset state and trigger excessive re-rendering', + recommended: true, + }; + } + case ErrorCategory.Suppression: { + return { + category, + severity: ErrorSeverity.Error, + name: 'rule-suppression', + description: 'Validates against suppression of other rules', + recommended: false, + }; + } + case ErrorCategory.Syntax: { + return { + category, + severity: ErrorSeverity.Error, + name: 'syntax', + description: 'Validates against invalid syntax', + recommended: false, + }; + } + case ErrorCategory.Todo: { + return { + category, + severity: ErrorSeverity.Hint, + name: 'todo', + description: 'Unimplemented features', + recommended: false, + }; + } + case ErrorCategory.UnsupportedSyntax: { + return { + category, + severity: ErrorSeverity.Warning, + name: 'unsupported-syntax', + description: 'Validates against syntax that we do not plan to support in React Compiler', + recommended: true, + }; + } + case ErrorCategory.UseMemo: { + return { + category, + severity: ErrorSeverity.Error, + name: 'use-memo', + description: 'Validates usage of the useMemo() hook against common mistakes. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.', + recommended: true, + }; + } + case ErrorCategory.IncompatibleLibrary: { + return { + category, + severity: ErrorSeverity.Warning, + name: 'incompatible-library', + description: 'Validates against usage of libraries which are incompatible with memoization (manual or automatic)', + recommended: true, + }; + } + default: { + assertExhaustive$1(category, `Unsupported category ${category}`); + } + } +} +const LintRules = Object.keys(ErrorCategory).map(category => getRuleForCategory(category)); + +function insertAdditionalFunctionDeclaration(fnPath, compiled, programContext, gatingFunctionIdentifierName) { + var _a, _b; + const originalFnName = fnPath.node.id; + const originalFnParams = fnPath.node.params; + const compiledParams = fnPath.node.params; + CompilerError.invariant(originalFnName != null && compiled.id != null, { + reason: 'Expected function declarations that are referenced elsewhere to have a named identifier', + description: null, + details: [ + { + kind: 'error', + loc: (_a = fnPath.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + CompilerError.invariant(originalFnParams.length === compiledParams.length, { + reason: 'Expected React Compiler optimized function declarations to have the same number of parameters as source', + description: null, + details: [ + { + kind: 'error', + loc: (_b = fnPath.node.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + }); + const gatingCondition = libExports$1.identifier(programContext.newUid(`${gatingFunctionIdentifierName}_result`)); + const unoptimizedFnName = libExports$1.identifier(programContext.newUid(`${originalFnName.name}_unoptimized`)); + const optimizedFnName = libExports$1.identifier(programContext.newUid(`${originalFnName.name}_optimized`)); + compiled.id.name = optimizedFnName.name; + fnPath.get('id').replaceInline(unoptimizedFnName); + const newParams = []; + const genNewArgs = []; + for (let i = 0; i < originalFnParams.length; i++) { + const argName = `arg${i}`; + if (originalFnParams[i].type === 'RestElement') { + newParams.push(libExports$1.restElement(libExports$1.identifier(argName))); + genNewArgs.push(() => libExports$1.spreadElement(libExports$1.identifier(argName))); + } + else { + newParams.push(libExports$1.identifier(argName)); + genNewArgs.push(() => libExports$1.identifier(argName)); + } + } + fnPath.insertAfter(libExports$1.functionDeclaration(originalFnName, newParams, libExports$1.blockStatement([ + libExports$1.ifStatement(gatingCondition, libExports$1.returnStatement(libExports$1.callExpression(compiled.id, genNewArgs.map(fn => fn()))), libExports$1.returnStatement(libExports$1.callExpression(unoptimizedFnName, genNewArgs.map(fn => fn())))), + ]))); + fnPath.insertBefore(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(gatingCondition, libExports$1.callExpression(libExports$1.identifier(gatingFunctionIdentifierName), [])), + ])); + fnPath.insertBefore(compiled); +} +function insertGatedFunctionDeclaration(fnPath, compiled, programContext, gating, referencedBeforeDeclaration) { + var _a; + const gatingImportedName = programContext.addImportSpecifier(gating).name; + if (referencedBeforeDeclaration && fnPath.isFunctionDeclaration()) { + CompilerError.invariant(compiled.type === 'FunctionDeclaration', { + reason: 'Expected compiled node type to match input type', + description: `Got ${compiled.type} but expected FunctionDeclaration`, + details: [ + { + kind: 'error', + loc: (_a = fnPath.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + insertAdditionalFunctionDeclaration(fnPath, compiled, programContext, gatingImportedName); + } + else { + const gatingExpression = libExports$1.conditionalExpression(libExports$1.callExpression(libExports$1.identifier(gatingImportedName), []), buildFunctionExpression(compiled), buildFunctionExpression(fnPath.node)); + if (fnPath.parentPath.node.type !== 'ExportDefaultDeclaration' && + fnPath.node.type === 'FunctionDeclaration' && + fnPath.node.id != null) { + fnPath.replaceWith(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(fnPath.node.id, gatingExpression), + ])); + } + else if (fnPath.parentPath.node.type === 'ExportDefaultDeclaration' && + fnPath.node.type !== 'ArrowFunctionExpression' && + fnPath.node.id != null) { + fnPath.insertAfter(libExports$1.exportDefaultDeclaration(libExports$1.identifier(fnPath.node.id.name))); + fnPath.parentPath.replaceWith(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(libExports$1.identifier(fnPath.node.id.name), gatingExpression), + ])); + } + else { + fnPath.replaceWith(gatingExpression); + } + } +} +function buildFunctionExpression(node) { + var _a, _b; + if (node.type === 'ArrowFunctionExpression' || + node.type === 'FunctionExpression') { + return node; + } + else { + const fn = { + type: 'FunctionExpression', + async: node.async, + generator: node.generator, + loc: (_a = node.loc) !== null && _a !== void 0 ? _a : null, + id: (_b = node.id) !== null && _b !== void 0 ? _b : null, + params: node.params, + body: node.body, + }; + return fn; + } +} + +function makeTypeId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected instruction id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +let typeCounter = 0; +function makeType() { + return { + kind: 'Type', + id: makeTypeId(typeCounter++), + }; +} +function typeEquals(tA, tB) { + if (tA.kind !== tB.kind) + return false; + return (typeVarEquals(tA, tB) || + funcTypeEquals(tA, tB) || + objectTypeEquals(tA, tB) || + primitiveTypeEquals(tA, tB) || + polyTypeEquals(tA, tB) || + phiTypeEquals(tA, tB) || + propTypeEquals(tA, tB) || + objectMethodTypeEquals(tA, tB)); +} +function typeVarEquals(tA, tB) { + if (tA.kind === 'Type' && tB.kind === 'Type') { + return tA.id === tB.id; + } + return false; +} +function typeKindCheck(tA, tb, type) { + return tA.kind === type && tb.kind === type; +} +function objectMethodTypeEquals(tA, tB) { + return typeKindCheck(tA, tB, 'ObjectMethod'); +} +function propTypeEquals(tA, tB) { + if (tA.kind === 'Property' && tB.kind === 'Property') { + if (!typeEquals(tA.objectType, tB.objectType)) { + return false; + } + return (tA.propertyName === tB.propertyName && tA.objectName === tB.objectName); + } + return false; +} +function primitiveTypeEquals(tA, tB) { + return typeKindCheck(tA, tB, 'Primitive'); +} +function polyTypeEquals(tA, tB) { + return typeKindCheck(tA, tB, 'Poly'); +} +function objectTypeEquals(tA, tB) { + if (tA.kind === 'Object' && tB.kind == 'Object') { + return tA.shapeId === tB.shapeId; + } + return false; +} +function funcTypeEquals(tA, tB) { + if (tA.kind !== 'Function' || tB.kind !== 'Function') { + return false; + } + return typeEquals(tA.return, tB.return); +} +function phiTypeEquals(tA, tB) { + if (tA.kind === 'Phi' && tB.kind === 'Phi') { + if (tA.operands.length !== tB.operands.length) { + return false; + } + let operands = new Set(tA.operands); + for (let i = 0; i < tB.operands.length; i++) { + if (!operands.has(tB.operands[i])) { + return false; + } + } + } + return false; +} + +const RESERVED_WORDS = new Set([ + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'debugger', + 'default', + 'delete', + 'do', + 'else', + 'enum', + 'export', + 'extends', + 'false', + 'finally', + 'for', + 'function', + 'if', + 'import', + 'in', + 'instanceof', + 'new', + 'null', + 'return', + 'super', + 'switch', + 'this', + 'throw', + 'true', + 'try', + 'typeof', + 'var', + 'void', + 'while', + 'with', +]); +const STRICT_MODE_RESERVED_WORDS = new Set([ + 'let', + 'static', + 'implements', + 'interface', + 'package', + 'private', + 'protected', + 'public', +]); +const STRICT_MODE_RESTRICTED_WORDS = new Set(['eval', 'arguments']); +function isReservedWord(identifierName) { + return (RESERVED_WORDS.has(identifierName) || + STRICT_MODE_RESERVED_WORDS.has(identifierName) || + STRICT_MODE_RESTRICTED_WORDS.has(identifierName)); +} + +const GeneratedSource = Symbol(); +function isStatementBlockKind(kind) { + return kind === 'block' || kind === 'catch'; +} +function isExpressionBlockKind(kind) { + return !isStatementBlockKind(kind); +} +var GotoVariant; +(function (GotoVariant) { + GotoVariant["Break"] = "Break"; + GotoVariant["Continue"] = "Continue"; + GotoVariant["Try"] = "Try"; +})(GotoVariant || (GotoVariant = {})); +var InstructionKind; +(function (InstructionKind) { + InstructionKind["Const"] = "Const"; + InstructionKind["Let"] = "Let"; + InstructionKind["Reassign"] = "Reassign"; + InstructionKind["Catch"] = "Catch"; + InstructionKind["HoistedConst"] = "HoistedConst"; + InstructionKind["HoistedLet"] = "HoistedLet"; + InstructionKind["HoistedFunction"] = "HoistedFunction"; + InstructionKind["Function"] = "Function"; +})(InstructionKind || (InstructionKind = {})); +function convertHoistedLValueKind(kind) { + switch (kind) { + case InstructionKind.HoistedLet: + return InstructionKind.Let; + case InstructionKind.HoistedConst: + return InstructionKind.Const; + case InstructionKind.HoistedFunction: + return InstructionKind.Function; + case InstructionKind.Let: + case InstructionKind.Const: + case InstructionKind.Function: + case InstructionKind.Reassign: + case InstructionKind.Catch: + return null; + default: + assertExhaustive$1(kind, 'Unexpected lvalue kind'); + } +} +function makeTemporaryIdentifier(id, loc) { + return { + id, + name: null, + declarationId: makeDeclarationId(id), + mutableRange: { start: makeInstructionId(0), end: makeInstructionId(0) }, + scope: null, + type: makeType(), + loc, + }; +} +function forkTemporaryIdentifier(id, source) { + return Object.assign(Object.assign({}, source), { mutableRange: { start: makeInstructionId(0), end: makeInstructionId(0) }, id }); +} +function validateIdentifierName(name) { + if (isReservedWord(name)) { + const error = new CompilerError(); + error.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Syntax, + reason: 'Expected a non-reserved identifier name', + description: `\`${name}\` is a reserved word in JavaScript and cannot be used as an identifier name`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: GeneratedSource, + message: 'reserved word', + })); + return Err(error); + } + else if (!libExports$1.isValidIdentifier(name)) { + const error = new CompilerError(); + error.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Syntax, + reason: `Expected a valid identifier name`, + description: `\`${name}\` is not a valid JavaScript identifier`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: GeneratedSource, + message: 'reserved word', + })); + } + return Ok({ + kind: 'named', + value: name, + }); +} +function makeIdentifierName(name) { + return validateIdentifierName(name).unwrap(); +} +function promoteTemporary(identifier) { + CompilerError.invariant(identifier.name === null, { + reason: `Expected a temporary (unnamed) identifier`, + description: `Identifier already has a name, \`${identifier.name}\``, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + identifier.name = { + kind: 'promoted', + value: `#t${identifier.declarationId}`, + }; +} +function isPromotedTemporary(name) { + return name.startsWith('#t'); +} +function promoteTemporaryJsxTag(identifier) { + CompilerError.invariant(identifier.name === null, { + reason: `Expected a temporary (unnamed) identifier`, + description: `Identifier already has a name, \`${identifier.name}\``, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + identifier.name = { + kind: 'promoted', + value: `#T${identifier.declarationId}`, + }; +} +function isPromotedJsxTemporary(name) { + return name.startsWith('#T'); +} +var ValueReason; +(function (ValueReason) { + ValueReason["Global"] = "global"; + ValueReason["JsxCaptured"] = "jsx-captured"; + ValueReason["HookCaptured"] = "hook-captured"; + ValueReason["HookReturn"] = "hook-return"; + ValueReason["Effect"] = "effect"; + ValueReason["KnownReturnSignature"] = "known-return-signature"; + ValueReason["Context"] = "context"; + ValueReason["State"] = "state"; + ValueReason["ReducerState"] = "reducer-state"; + ValueReason["ReactiveFunctionArgument"] = "reactive-function-argument"; + ValueReason["Other"] = "other"; +})(ValueReason || (ValueReason = {})); +var ValueKind; +(function (ValueKind) { + ValueKind["MaybeFrozen"] = "maybefrozen"; + ValueKind["Frozen"] = "frozen"; + ValueKind["Primitive"] = "primitive"; + ValueKind["Global"] = "global"; + ValueKind["Mutable"] = "mutable"; + ValueKind["Context"] = "context"; +})(ValueKind || (ValueKind = {})); +const ValueKindSchema = zod.z.enum([ + ValueKind.MaybeFrozen, + ValueKind.Frozen, + ValueKind.Primitive, + ValueKind.Global, + ValueKind.Mutable, + ValueKind.Context, +]); +const ValueReasonSchema = zod.z.enum([ + ValueReason.Context, + ValueReason.Effect, + ValueReason.Global, + ValueReason.HookCaptured, + ValueReason.HookReturn, + ValueReason.JsxCaptured, + ValueReason.KnownReturnSignature, + ValueReason.Other, + ValueReason.ReactiveFunctionArgument, + ValueReason.ReducerState, + ValueReason.State, +]); +var Effect; +(function (Effect) { + Effect["Unknown"] = ""; + Effect["Freeze"] = "freeze"; + Effect["Read"] = "read"; + Effect["Capture"] = "capture"; + Effect["ConditionallyMutateIterator"] = "mutate-iterator?"; + Effect["ConditionallyMutate"] = "mutate?"; + Effect["Mutate"] = "mutate"; + Effect["Store"] = "store"; +})(Effect || (Effect = {})); +const EffectSchema = zod.z.enum([ + Effect.Read, + Effect.Mutate, + Effect.ConditionallyMutate, + Effect.ConditionallyMutateIterator, + Effect.Capture, + Effect.Store, + Effect.Freeze, +]); +function isMutableEffect(effect, location) { + switch (effect) { + case Effect.Capture: + case Effect.Store: + case Effect.ConditionallyMutate: + case Effect.ConditionallyMutateIterator: + case Effect.Mutate: { + return true; + } + case Effect.Unknown: { + CompilerError.invariant(false, { + reason: 'Unexpected unknown effect', + description: null, + details: [ + { + kind: 'error', + loc: location, + message: null, + }, + ], + suggestions: null, + }); + } + case Effect.Read: + case Effect.Freeze: { + return false; + } + default: { + assertExhaustive$1(effect, `Unexpected effect \`${effect}\``); + } + } +} +function makePropertyLiteral(value) { + return value; +} +function areEqualPaths(a, b) { + return (a.length === b.length && + a.every((item, ix) => item.property === b[ix].property && item.optional === b[ix].optional)); +} +function getPlaceScope(id, place) { + const scope = place.identifier.scope; + if (scope !== null && isScopeActive(scope, id)) { + return scope; + } + return null; +} +function isScopeActive(scope, id) { + return id >= scope.range.start && id < scope.range.end; +} +function makeBlockId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected block id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeScopeId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected block id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeIdentifierId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected identifier id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeDeclarationId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected declaration id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeInstructionId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected instruction id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function isObjectMethodType(id) { + return id.type.kind == 'ObjectMethod'; +} +function isPrimitiveType(id) { + return id.type.kind === 'Primitive'; +} +function isArrayType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInArray'; +} +function isMapType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInMap'; +} +function isSetType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInSet'; +} +function isPropsType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInProps'; +} +function isRefValueType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInRefValue'; +} +function isUseRefType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInUseRefId'; +} +function isUseStateType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInUseState'; +} +function isJsxType(type) { + return type.kind === 'Object' && type.shapeId === 'BuiltInJsx'; +} +function isRefOrRefValue(id) { + return isUseRefType(id) || isRefValueType(id); +} +function isRefOrRefLikeMutableType(type) { + return (type.kind === 'Object' && + (type.shapeId === 'BuiltInUseRefId' || + type.shapeId == 'ReanimatedSharedValueId')); +} +function isSetStateType(id) { + return id.type.kind === 'Function' && id.type.shapeId === 'BuiltInSetState'; +} +function isStartTransitionType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInStartTransition'); +} +function isSetActionStateType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInSetActionState'); +} +function isUseReducerType(id) { + return id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseReducer'; +} +function isDispatcherType(id) { + return id.type.kind === 'Function' && id.type.shapeId === 'BuiltInDispatch'; +} +function isFireFunctionType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInFireFunction'); +} +function isEffectEventFunctionType(id) { + return (id.type.kind === 'Function' && + id.type.shapeId === 'BuiltInEffectEventFunction'); +} +function isStableType(id) { + return (isSetStateType(id) || + isSetActionStateType(id) || + isDispatcherType(id) || + isUseRefType(id) || + isStartTransitionType(id)); +} +function isStableTypeContainer(id) { + const type_ = id.type; + if (type_.kind !== 'Object') { + return false; + } + return (isUseStateType(id) || + type_.shapeId === 'BuiltInUseActionState' || + isUseReducerType(id) || + type_.shapeId === 'BuiltInUseTransition'); +} +function evaluatesToStableTypeOrContainer(env, { value }) { + if (value.kind === 'CallExpression' || value.kind === 'MethodCall') { + const callee = value.kind === 'CallExpression' ? value.callee : value.property; + const calleeHookKind = getHookKind(env, callee.identifier); + switch (calleeHookKind) { + case 'useState': + case 'useReducer': + case 'useActionState': + case 'useRef': + case 'useTransition': + return true; + } + } + return false; +} +function isUseEffectHookType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseEffectHook'); +} +function isUseLayoutEffectHookType(id) { + return (id.type.kind === 'Function' && + id.type.shapeId === 'BuiltInUseLayoutEffectHook'); +} +function isUseInsertionEffectHookType(id) { + return (id.type.kind === 'Function' && + id.type.shapeId === 'BuiltInUseInsertionEffectHook'); +} +function isUseContextHookType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseContextHook'); +} +function getHookKind(env, id) { + return getHookKindForType(env, id.type); +} +function isUseOperator(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseOperator'); +} +function getHookKindForType(env, type) { + var _a; + if (type.kind === 'Function') { + const signature = env.getFunctionSignature(type); + return (_a = signature === null || signature === void 0 ? void 0 : signature.hookKind) !== null && _a !== void 0 ? _a : null; + } + return null; +} + +function printReactiveScopeSummary(scope) { + const items = []; + items.push('scope'); + items.push(`@${scope.id}`); + items.push(`[${scope.range.start}:${scope.range.end}]`); + items.push(`dependencies=[${Array.from(scope.dependencies) + .map(dep => printDependency(dep)) + .join(', ')}]`); + items.push(`declarations=[${Array.from(scope.declarations) + .map(([, decl]) => printIdentifier(Object.assign(Object.assign({}, decl.identifier), { scope: decl.scope }))) + .join(', ')}]`); + items.push(`reassignments=[${Array.from(scope.reassignments).map(reassign => printIdentifier(reassign))}]`); + if (scope.earlyReturnValue !== null) { + items.push(`earlyReturn={id: ${printIdentifier(scope.earlyReturnValue.value)}, label: ${scope.earlyReturnValue.label}}}`); + } + return items.join(' '); +} +function printDependency(dependency) { + const identifier = printIdentifier(dependency.identifier) + + printType(dependency.identifier.type); + return `${identifier}${dependency.path.map(token => `${token.optional ? '?.' : '.'}${token.property}`).join('')}`; +} + +function printFunction(fn) { + const output = []; + let definition = ''; + if (fn.id !== null) { + definition += fn.id; + } + else { + definition += '<>'; + } + if (fn.nameHint != null) { + definition += ` ${fn.nameHint}`; + } + if (fn.params.length !== 0) { + definition += + '(' + + fn.params + .map(param => { + if (param.kind === 'Identifier') { + return printPlace(param); + } + else { + return `...${printPlace(param.place)}`; + } + }) + .join(', ') + + ')'; + } + else { + definition += '()'; + } + definition += `: ${printPlace(fn.returns)}`; + output.push(definition); + output.push(...fn.directives); + output.push(printHIR(fn.body)); + return output.join('\n'); +} +function printHIR(ir, options = null) { + var _a; + let output = []; + let indent = ' '.repeat((_a = options === null || options === void 0 ? void 0 : options.indent) !== null && _a !== void 0 ? _a : 0); + const push = (text, indent = ' ') => { + output.push(`${indent}${text}`); + }; + for (const [blockId, block] of ir.blocks) { + output.push(`bb${blockId} (${block.kind}):`); + if (block.preds.size > 0) { + const preds = ['predecessor blocks:']; + for (const pred of block.preds) { + preds.push(`bb${pred}`); + } + push(preds.join(' ')); + } + for (const phi of block.phis) { + push(printPhi(phi)); + } + for (const instr of block.instructions) { + push(printInstruction(instr)); + } + const terminal = printTerminal(block.terminal); + if (Array.isArray(terminal)) { + terminal.forEach(line => push(line)); + } + else { + push(terminal); + } + } + return output.map(line => indent + line).join('\n'); +} +function printInstruction(instr) { + const id = `[${instr.id}]`; + let value = printInstructionValue(instr.value); + if (instr.effects != null) { + value += `\n ${instr.effects.map(printAliasingEffect).join('\n ')}`; + } + if (instr.lvalue !== null) { + return `${id} ${printPlace(instr.lvalue)} = ${value}`; + } + else { + return `${id} ${value}`; + } +} +function printPhi(phi) { + const items = []; + items.push(printPlace(phi.place)); + items.push(printMutableRange(phi.place.identifier)); + items.push(printType(phi.place.identifier.type)); + items.push(': phi('); + const phis = []; + for (const [blockId, place] of phi.operands) { + phis.push(`bb${blockId}: ${printPlace(place)}`); + } + items.push(phis.join(', ')); + items.push(')'); + return items.join(''); +} +function printTerminal(terminal) { + let value; + switch (terminal.kind) { + case 'if': { + value = `[${terminal.id}] If (${printPlace(terminal.test)}) then:bb${terminal.consequent} else:bb${terminal.alternate}${terminal.fallthrough ? ` fallthrough=bb${terminal.fallthrough}` : ''}`; + break; + } + case 'branch': { + value = `[${terminal.id}] Branch (${printPlace(terminal.test)}) then:bb${terminal.consequent} else:bb${terminal.alternate} fallthrough:bb${terminal.fallthrough}`; + break; + } + case 'logical': { + value = `[${terminal.id}] Logical ${terminal.operator} test:bb${terminal.test} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'ternary': { + value = `[${terminal.id}] Ternary test:bb${terminal.test} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'optional': { + value = `[${terminal.id}] Optional (optional=${terminal.optional}) test:bb${terminal.test} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'throw': { + value = `[${terminal.id}] Throw ${printPlace(terminal.value)}`; + break; + } + case 'return': { + value = `[${terminal.id}] Return ${terminal.returnVariant}${terminal.value != null ? ' ' + printPlace(terminal.value) : ''}`; + if (terminal.effects != null) { + value += `\n ${terminal.effects.map(printAliasingEffect).join('\n ')}`; + } + break; + } + case 'goto': { + value = `[${terminal.id}] Goto${terminal.variant === GotoVariant.Continue ? '(Continue)' : ''} bb${terminal.block}`; + break; + } + case 'switch': { + const output = []; + output.push(`[${terminal.id}] Switch (${printPlace(terminal.test)})`); + terminal.cases.forEach(case_ => { + if (case_.test !== null) { + output.push(` Case ${printPlace(case_.test)}: bb${case_.block}`); + } + else { + output.push(` Default: bb${case_.block}`); + } + }); + if (terminal.fallthrough) { + output.push(` Fallthrough: bb${terminal.fallthrough}`); + } + value = output; + break; + } + case 'do-while': { + value = `[${terminal.id}] DoWhile loop=${`bb${terminal.loop}`} test=bb${terminal.test} fallthrough=${`bb${terminal.fallthrough}`}`; + break; + } + case 'while': { + value = `[${terminal.id}] While test=bb${terminal.test} loop=${terminal.loop !== null ? `bb${terminal.loop}` : ''} fallthrough=${terminal.fallthrough ? `bb${terminal.fallthrough}` : ''}`; + break; + } + case 'for': { + value = `[${terminal.id}] For init=bb${terminal.init} test=bb${terminal.test} loop=bb${terminal.loop} update=bb${terminal.update} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'for-of': { + value = `[${terminal.id}] ForOf init=bb${terminal.init} test=bb${terminal.test} loop=bb${terminal.loop} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'for-in': { + value = `[${terminal.id}] ForIn init=bb${terminal.init} loop=bb${terminal.loop} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'label': { + value = `[${terminal.id}] Label block=bb${terminal.block} fallthrough=${terminal.fallthrough ? `bb${terminal.fallthrough}` : ''}`; + break; + } + case 'sequence': { + value = `[${terminal.id}] Sequence block=bb${terminal.block} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'unreachable': { + value = `[${terminal.id}] Unreachable`; + break; + } + case 'unsupported': { + value = `[${terminal.id}] Unsupported`; + break; + } + case 'maybe-throw': { + value = `[${terminal.id}] MaybeThrow continuation=bb${terminal.continuation} handler=bb${terminal.handler}`; + if (terminal.effects != null) { + value += `\n ${terminal.effects.map(printAliasingEffect).join('\n ')}`; + } + break; + } + case 'scope': { + value = `[${terminal.id}] Scope ${printReactiveScopeSummary(terminal.scope)} block=bb${terminal.block} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'pruned-scope': { + value = `[${terminal.id}] Scope ${printReactiveScopeSummary(terminal.scope)} block=bb${terminal.block} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'try': { + value = `[${terminal.id}] Try block=bb${terminal.block} handler=bb${terminal.handler}${terminal.handlerBinding !== null + ? ` handlerBinding=(${printPlace(terminal.handlerBinding)})` + : ''} fallthrough=${terminal.fallthrough != null ? `bb${terminal.fallthrough}` : ''}`; + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal}\``); + } + } + return value; +} +function printHole() { + return ''; +} +function printObjectPropertyKey(key) { + switch (key.kind) { + case 'identifier': + return key.name; + case 'string': + return `"${key.name}"`; + case 'computed': { + return `[${printPlace(key.name)}]`; + } + case 'number': { + return String(key.name); + } + } +} +function printInstructionValue(instrValue) { + var _a, _b, _c, _d, _e; + let value = ''; + switch (instrValue.kind) { + case 'ArrayExpression': { + value = `Array [${instrValue.elements + .map(element => { + if (element.kind === 'Identifier') { + return printPlace(element); + } + else if (element.kind === 'Hole') { + return printHole(); + } + else { + return `...${printPlace(element.place)}`; + } + }) + .join(', ')}]`; + break; + } + case 'ObjectExpression': { + const properties = []; + if (instrValue.properties !== null) { + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty') { + properties.push(`${printObjectPropertyKey(property.key)}: ${printPlace(property.place)}`); + } + else { + properties.push(`...${printPlace(property.place)}`); + } + } + } + value = `Object { ${properties.join(', ')} }`; + break; + } + case 'UnaryExpression': { + value = `Unary ${printPlace(instrValue.value)}`; + break; + } + case 'BinaryExpression': { + value = `Binary ${printPlace(instrValue.left)} ${instrValue.operator} ${printPlace(instrValue.right)}`; + break; + } + case 'NewExpression': { + value = `New ${printPlace(instrValue.callee)}(${instrValue.args + .map(arg => printPattern(arg)) + .join(', ')})`; + break; + } + case 'CallExpression': { + value = `Call ${printPlace(instrValue.callee)}(${instrValue.args + .map(arg => printPattern(arg)) + .join(', ')})`; + break; + } + case 'MethodCall': { + value = `MethodCall ${printPlace(instrValue.receiver)}.${printPlace(instrValue.property)}(${instrValue.args.map(arg => printPattern(arg)).join(', ')})`; + break; + } + case 'JSXText': { + value = `JSXText ${JSON.stringify(instrValue.value)}`; + break; + } + case 'Primitive': { + if (instrValue.value === undefined) { + value = ''; + } + else { + value = JSON.stringify(instrValue.value); + } + break; + } + case 'TypeCastExpression': { + value = `TypeCast ${printPlace(instrValue.value)}: ${printType(instrValue.type)}`; + break; + } + case 'JsxExpression': { + const propItems = []; + for (const attribute of instrValue.props) { + if (attribute.kind === 'JsxAttribute') { + propItems.push(`${attribute.name}={${attribute.place !== null ? printPlace(attribute.place) : ''}}`); + } + else { + propItems.push(`...${printPlace(attribute.argument)}`); + } + } + const tag = instrValue.tag.kind === 'Identifier' + ? printPlace(instrValue.tag) + : instrValue.tag.name; + const props = propItems.length !== 0 ? ' ' + propItems.join(' ') : ''; + if (instrValue.children !== null) { + const children = instrValue.children.map(child => { + return `{${printPlace(child)}}`; + }); + value = `JSX <${tag}${props}${props.length > 0 ? ' ' : ''}>${children.join('')}`; + } + else { + value = `JSX <${tag}${props}${props.length > 0 ? ' ' : ''}/>`; + } + break; + } + case 'JsxFragment': { + value = `JsxFragment [${instrValue.children + .map(child => printPlace(child)) + .join(', ')}]`; + break; + } + case 'UnsupportedNode': { + value = `UnsupportedNode ${instrValue.node.type}`; + break; + } + case 'LoadLocal': { + value = `LoadLocal ${printPlace(instrValue.place)}`; + break; + } + case 'DeclareLocal': { + value = `DeclareLocal ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)}`; + break; + } + case 'DeclareContext': { + value = `DeclareContext ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)}`; + break; + } + case 'StoreLocal': { + value = `StoreLocal ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)} = ${printPlace(instrValue.value)}`; + break; + } + case 'LoadContext': { + value = `LoadContext ${printPlace(instrValue.place)}`; + break; + } + case 'StoreContext': { + value = `StoreContext ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)} = ${printPlace(instrValue.value)}`; + break; + } + case 'Destructure': { + value = `Destructure ${instrValue.lvalue.kind} ${printPattern(instrValue.lvalue.pattern)} = ${printPlace(instrValue.value)}`; + break; + } + case 'PropertyLoad': { + value = `PropertyLoad ${printPlace(instrValue.object)}.${instrValue.property}`; + break; + } + case 'PropertyStore': { + value = `PropertyStore ${printPlace(instrValue.object)}.${instrValue.property} = ${printPlace(instrValue.value)}`; + break; + } + case 'PropertyDelete': { + value = `PropertyDelete ${printPlace(instrValue.object)}.${instrValue.property}`; + break; + } + case 'ComputedLoad': { + value = `ComputedLoad ${printPlace(instrValue.object)}[${printPlace(instrValue.property)}]`; + break; + } + case 'ComputedStore': { + value = `ComputedStore ${printPlace(instrValue.object)}[${printPlace(instrValue.property)}] = ${printPlace(instrValue.value)}`; + break; + } + case 'ComputedDelete': { + value = `ComputedDelete ${printPlace(instrValue.object)}[${printPlace(instrValue.property)}]`; + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + const kind = instrValue.kind === 'FunctionExpression' ? 'Function' : 'ObjectMethod'; + const name = getFunctionName$2(instrValue, ''); + const fn = printFunction(instrValue.loweredFunc.func) + .split('\n') + .map(line => ` ${line}`) + .join('\n'); + const context = instrValue.loweredFunc.func.context + .map(dep => printPlace(dep)) + .join(','); + const aliasingEffects = (_c = (_b = (_a = instrValue.loweredFunc.func.aliasingEffects) === null || _a === void 0 ? void 0 : _a.map(printAliasingEffect)) === null || _b === void 0 ? void 0 : _b.join(', ')) !== null && _c !== void 0 ? _c : ''; + value = `${kind} ${name} @context[${context}] @aliasingEffects=[${aliasingEffects}]\n${fn}`; + break; + } + case 'TaggedTemplateExpression': { + value = `${printPlace(instrValue.tag)}\`${instrValue.value.raw}\``; + break; + } + case 'LogicalExpression': { + value = `Logical ${printInstructionValue(instrValue.left)} ${instrValue.operator} ${printInstructionValue(instrValue.right)}`; + break; + } + case 'SequenceExpression': { + value = [ + `Sequence`, + ...instrValue.instructions.map(instr => ` ${printInstruction(instr)}`), + ` ${printInstructionValue(instrValue.value)}`, + ].join('\n'); + break; + } + case 'ConditionalExpression': { + value = `Ternary ${printInstructionValue(instrValue.test)} ? ${printInstructionValue(instrValue.consequent)} : ${printInstructionValue(instrValue.alternate)}`; + break; + } + case 'TemplateLiteral': { + value = '`'; + CompilerError.invariant(instrValue.subexprs.length === instrValue.quasis.length - 1, { + reason: 'Bad assumption about quasi length.', + description: null, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + for (let i = 0; i < instrValue.subexprs.length; i++) { + value += instrValue.quasis[i].raw; + value += `\${${printPlace(instrValue.subexprs[i])}}`; + } + value += instrValue.quasis.at(-1).raw + '`'; + break; + } + case 'LoadGlobal': { + switch (instrValue.binding.kind) { + case 'Global': { + value = `LoadGlobal(global) ${instrValue.binding.name}`; + break; + } + case 'ModuleLocal': { + value = `LoadGlobal(module) ${instrValue.binding.name}`; + break; + } + case 'ImportDefault': { + value = `LoadGlobal import ${instrValue.binding.name} from '${instrValue.binding.module}'`; + break; + } + case 'ImportNamespace': { + value = `LoadGlobal import * as ${instrValue.binding.name} from '${instrValue.binding.module}'`; + break; + } + case 'ImportSpecifier': { + if (instrValue.binding.imported !== instrValue.binding.name) { + value = `LoadGlobal import { ${instrValue.binding.imported} as ${instrValue.binding.name} } from '${instrValue.binding.module}'`; + } + else { + value = `LoadGlobal import { ${instrValue.binding.name} } from '${instrValue.binding.module}'`; + } + break; + } + default: { + assertExhaustive$1(instrValue.binding, `Unexpected binding kind \`${instrValue.binding.kind}\``); + } + } + break; + } + case 'StoreGlobal': { + value = `StoreGlobal ${instrValue.name} = ${printPlace(instrValue.value)}`; + break; + } + case 'OptionalExpression': { + value = `OptionalExpression ${printInstructionValue(instrValue.value)}`; + break; + } + case 'RegExpLiteral': { + value = `RegExp /${instrValue.pattern}/${instrValue.flags}`; + break; + } + case 'MetaProperty': { + value = `MetaProperty ${instrValue.meta}.${instrValue.property}`; + break; + } + case 'Await': { + value = `Await ${printPlace(instrValue.value)}`; + break; + } + case 'GetIterator': { + value = `GetIterator collection=${printPlace(instrValue.collection)}`; + break; + } + case 'IteratorNext': { + value = `IteratorNext iterator=${printPlace(instrValue.iterator)} collection=${printPlace(instrValue.collection)}`; + break; + } + case 'NextPropertyOf': { + value = `NextPropertyOf ${printPlace(instrValue.value)}`; + break; + } + case 'Debugger': { + value = `Debugger`; + break; + } + case 'PostfixUpdate': { + value = `PostfixUpdate ${printPlace(instrValue.lvalue)} = ${printPlace(instrValue.value)} ${instrValue.operation}`; + break; + } + case 'PrefixUpdate': { + value = `PrefixUpdate ${printPlace(instrValue.lvalue)} = ${instrValue.operation} ${printPlace(instrValue.value)}`; + break; + } + case 'StartMemoize': { + value = `StartMemoize deps=${(_e = (_d = instrValue.deps) === null || _d === void 0 ? void 0 : _d.map(dep => printManualMemoDependency(dep, false))) !== null && _e !== void 0 ? _e : '(none)'}`; + break; + } + case 'FinishMemoize': { + value = `FinishMemoize decl=${printPlace(instrValue.decl)}${instrValue.pruned ? ' pruned' : ''}`; + break; + } + default: { + assertExhaustive$1(instrValue, `Unexpected instruction kind '${instrValue.kind}'`); + } + } + return value; +} +function isMutable$1(range) { + return range.end > range.start + 1; +} +function printMutableRange(identifier) { + var _b, _c; + const range = (_c = (_b = identifier.scope) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : identifier.mutableRange; + return isMutable$1(range) ? `[${range.start}:${range.end}]` : ''; +} +function printPattern(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + return ('[ ' + + pattern.items + .map(item => { + if (item.kind === 'Hole') { + return ''; + } + return printPattern(item); + }) + .join(', ') + + ' ]'); + } + case 'ObjectPattern': { + return ('{ ' + + pattern.properties + .map(item => { + switch (item.kind) { + case 'ObjectProperty': { + return `${printObjectPropertyKey(item.key)}: ${printPattern(item.place)}`; + } + case 'Spread': { + return printPattern(item); + } + default: { + assertExhaustive$1(item, 'Unexpected object property kind'); + } + } + }) + .join(', ') + + ' }'); + } + case 'Spread': { + return `...${printPlace(pattern.place)}`; + } + case 'Identifier': { + return printPlace(pattern); + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function printPlace(place) { + const items = [ + place.effect, + ' ', + printIdentifier(place.identifier), + printMutableRange(place.identifier), + printType(place.identifier.type), + place.reactive ? '{reactive}' : null, + ]; + return items.filter(x => x != null).join(''); +} +function printIdentifier(id) { + return `${printName(id.name)}\$${id.id}${printScope(id.scope)}`; +} +function printName(name) { + if (name === null) { + return ''; + } + return name.value; +} +function printScope(scope) { + return `${scope !== null ? `_@${scope.id}` : ''}`; +} +function printManualMemoDependency(val, nameOnly) { + var _a; + let rootStr; + if (val.root.kind === 'Global') { + rootStr = val.root.identifierName; + } + else { + CompilerError.invariant(((_a = val.root.value.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named', { + reason: 'DepsValidation: expected named local variable in depslist', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: val.root.value.loc, + message: null, + }, + ], + }); + rootStr = nameOnly + ? val.root.value.identifier.name.value + : printIdentifier(val.root.value.identifier); + } + return `${rootStr}${val.path.map(v => `${v.optional ? '?.' : '.'}${v.property}`).join('')}`; +} +function printType(type) { + if (type.kind === 'Type') + return ''; + if (type.kind === 'Object' && type.shapeId != null) { + return `:T${type.kind}<${type.shapeId}>`; + } + else if (type.kind === 'Function' && type.shapeId != null) { + const returnType = printType(type.return); + return `:T${type.kind}<${type.shapeId}>()${returnType !== '' ? `: ${returnType}` : ''}`; + } + else { + return `:T${type.kind}`; + } +} +function printSourceLocation(loc) { + if (typeof loc === 'symbol') { + return 'generated'; + } + else { + return `${loc.start.line}:${loc.start.column}:${loc.end.line}:${loc.end.column}`; + } +} +function printSourceLocationLine(loc) { + if (typeof loc === 'symbol') { + return 'generated'; + } + else { + return `${loc.start.line}:${loc.end.line}`; + } +} +function getFunctionName$2(instrValue, defaultValue) { + var _a; + switch (instrValue.kind) { + case 'FunctionExpression': + return (_a = instrValue.name) !== null && _a !== void 0 ? _a : defaultValue; + case 'ObjectMethod': + return defaultValue; + } +} +function printAliasingEffect(effect) { + var _a; + switch (effect.kind) { + case 'Assign': { + return `Assign ${printPlaceForAliasEffect(effect.into)} = ${printPlaceForAliasEffect(effect.from)}`; + } + case 'Alias': { + return `Alias ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'MaybeAlias': { + return `MaybeAlias ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'Capture': { + return `Capture ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'ImmutableCapture': { + return `ImmutableCapture ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'Create': { + return `Create ${printPlaceForAliasEffect(effect.into)} = ${effect.value}`; + } + case 'CreateFrom': { + return `Create ${printPlaceForAliasEffect(effect.into)} = kindOf(${printPlaceForAliasEffect(effect.from)})`; + } + case 'CreateFunction': { + return `Function ${printPlaceForAliasEffect(effect.into)} = Function captures=[${effect.captures.map(printPlaceForAliasEffect).join(', ')}]`; + } + case 'Apply': { + const receiverCallee = effect.receiver.identifier.id === effect.function.identifier.id + ? printPlaceForAliasEffect(effect.receiver) + : `${printPlaceForAliasEffect(effect.receiver)}.${printPlaceForAliasEffect(effect.function)}`; + const args = effect.args + .map(arg => { + if (arg.kind === 'Identifier') { + return printPlaceForAliasEffect(arg); + } + else if (arg.kind === 'Hole') { + return ' '; + } + return `...${printPlaceForAliasEffect(arg.place)}`; + }) + .join(', '); + let signature = ''; + if (effect.signature != null) { + if (effect.signature.aliasing != null) { + signature = printAliasingSignature(effect.signature.aliasing); + } + else { + signature = JSON.stringify(effect.signature, null, 2); + } + } + return `Apply ${printPlaceForAliasEffect(effect.into)} = ${receiverCallee}(${args})${signature != '' ? '\n ' : ''}${signature}`; + } + case 'Freeze': { + return `Freeze ${printPlaceForAliasEffect(effect.value)} ${effect.reason}`; + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + return `${effect.kind} ${printPlaceForAliasEffect(effect.value)}${effect.kind === 'Mutate' && ((_a = effect.reason) === null || _a === void 0 ? void 0 : _a.kind) === 'AssignCurrentProperty' ? ' (assign `.current`)' : ''}`; + } + case 'MutateFrozen': { + return `MutateFrozen ${printPlaceForAliasEffect(effect.place)} reason=${JSON.stringify(effect.error.reason)}`; + } + case 'MutateGlobal': { + return `MutateGlobal ${printPlaceForAliasEffect(effect.place)} reason=${JSON.stringify(effect.error.reason)}`; + } + case 'Impure': { + return `Impure ${printPlaceForAliasEffect(effect.place)} reason=${JSON.stringify(effect.error.reason)}`; + } + case 'Render': { + return `Render ${printPlaceForAliasEffect(effect.place)}`; + } + default: { + assertExhaustive$1(effect, `Unexpected kind '${effect.kind}'`); + } + } +} +function printPlaceForAliasEffect(place) { + return printIdentifier(place.identifier); +} +function printAliasingSignature(signature) { + const tokens = ['function ']; + if (signature.temporaries.length !== 0) { + tokens.push('<'); + tokens.push(signature.temporaries.map(temp => `$${temp.identifier.id}`).join(', ')); + tokens.push('>'); + } + tokens.push('('); + tokens.push('this=$' + String(signature.receiver)); + for (const param of signature.params) { + tokens.push(', $' + String(param)); + } + if (signature.rest != null) { + tokens.push(`, ...$${String(signature.rest)}`); + } + tokens.push('): '); + tokens.push('$' + String(signature.returns) + ':'); + for (const effect of signature.effects) { + tokens.push('\n ' + printAliasingEffect(effect)); + } + return tokens.join(''); +} + +var _ScopeBlockTraversal_activeScopes; +function* eachInstructionLValue(instr) { + if (instr.lvalue !== null) { + yield instr.lvalue; + } + yield* eachInstructionValueLValue(instr.value); +} +function* eachInstructionValueLValue(value) { + switch (value.kind) { + case 'DeclareContext': + case 'StoreContext': + case 'DeclareLocal': + case 'StoreLocal': { + yield value.lvalue.place; + break; + } + case 'Destructure': { + yield* eachPatternOperand(value.lvalue.pattern); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + yield value.lvalue; + break; + } + } +} +function* eachInstructionOperand(instr) { + yield* eachInstructionValueOperand(instr.value); +} +function* eachInstructionValueOperand(instrValue) { + switch (instrValue.kind) { + case 'NewExpression': + case 'CallExpression': { + yield instrValue.callee; + yield* eachCallArgument(instrValue.args); + break; + } + case 'BinaryExpression': { + yield instrValue.left; + yield instrValue.right; + break; + } + case 'MethodCall': { + yield instrValue.receiver; + yield instrValue.property; + yield* eachCallArgument(instrValue.args); + break; + } + case 'DeclareContext': + case 'DeclareLocal': { + break; + } + case 'LoadLocal': + case 'LoadContext': { + yield instrValue.place; + break; + } + case 'StoreLocal': { + yield instrValue.value; + break; + } + case 'StoreContext': { + yield instrValue.lvalue.place; + yield instrValue.value; + break; + } + case 'StoreGlobal': { + yield instrValue.value; + break; + } + case 'Destructure': { + yield instrValue.value; + break; + } + case 'PropertyLoad': { + yield instrValue.object; + break; + } + case 'PropertyDelete': { + yield instrValue.object; + break; + } + case 'PropertyStore': { + yield instrValue.object; + yield instrValue.value; + break; + } + case 'ComputedLoad': { + yield instrValue.object; + yield instrValue.property; + break; + } + case 'ComputedDelete': { + yield instrValue.object; + yield instrValue.property; + break; + } + case 'ComputedStore': { + yield instrValue.object; + yield instrValue.property; + yield instrValue.value; + break; + } + case 'UnaryExpression': { + yield instrValue.value; + break; + } + case 'JsxExpression': { + if (instrValue.tag.kind === 'Identifier') { + yield instrValue.tag; + } + for (const attribute of instrValue.props) { + switch (attribute.kind) { + case 'JsxAttribute': { + yield attribute.place; + break; + } + case 'JsxSpreadAttribute': { + yield attribute.argument; + break; + } + default: { + assertExhaustive$1(attribute, `Unexpected attribute kind \`${attribute.kind}\``); + } + } + } + if (instrValue.children) { + yield* instrValue.children; + } + break; + } + case 'JsxFragment': { + yield* instrValue.children; + break; + } + case 'ObjectExpression': { + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty' && + property.key.kind === 'computed') { + yield property.key.name; + } + yield property.place; + } + break; + } + case 'ArrayExpression': { + for (const element of instrValue.elements) { + if (element.kind === 'Identifier') { + yield element; + } + else if (element.kind === 'Spread') { + yield element.place; + } + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + yield* instrValue.loweredFunc.func.context; + break; + } + case 'TaggedTemplateExpression': { + yield instrValue.tag; + break; + } + case 'TypeCastExpression': { + yield instrValue.value; + break; + } + case 'TemplateLiteral': { + yield* instrValue.subexprs; + break; + } + case 'Await': { + yield instrValue.value; + break; + } + case 'GetIterator': { + yield instrValue.collection; + break; + } + case 'IteratorNext': { + yield instrValue.iterator; + yield instrValue.collection; + break; + } + case 'NextPropertyOf': { + yield instrValue.value; + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + yield instrValue.value; + break; + } + case 'StartMemoize': { + if (instrValue.deps != null) { + for (const dep of instrValue.deps) { + if (dep.root.kind === 'NamedLocal') { + yield dep.root.value; + } + } + } + break; + } + case 'FinishMemoize': { + yield instrValue.decl; + break; + } + case 'Debugger': + case 'RegExpLiteral': + case 'MetaProperty': + case 'LoadGlobal': + case 'UnsupportedNode': + case 'Primitive': + case 'JSXText': { + break; + } + default: { + assertExhaustive$1(instrValue, `Unexpected instruction kind \`${instrValue.kind}\``); + } + } +} +function* eachCallArgument(args) { + for (const arg of args) { + if (arg.kind === 'Identifier') { + yield arg; + } + else { + yield arg.place; + } + } +} +function doesPatternContainSpreadElement(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Spread') { + return true; + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'Spread') { + return true; + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } + return false; +} +function* eachPatternOperand(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Identifier') { + yield item; + } + else if (item.kind === 'Spread') { + yield item.place; + } + else if (item.kind === 'Hole') { + continue; + } + else { + assertExhaustive$1(item, `Unexpected item kind \`${item.kind}\``); + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + yield property.place; + } + else if (property.kind === 'Spread') { + yield property.place; + } + else { + assertExhaustive$1(property, `Unexpected item kind \`${property.kind}\``); + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function* eachPatternItem(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Identifier') { + yield item; + } + else if (item.kind === 'Spread') { + yield item; + } + else if (item.kind === 'Hole') { + continue; + } + else { + assertExhaustive$1(item, `Unexpected item kind \`${item.kind}\``); + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + yield property.place; + } + else if (property.kind === 'Spread') { + yield property; + } + else { + assertExhaustive$1(property, `Unexpected item kind \`${property.kind}\``); + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function mapInstructionLValues(instr, fn) { + switch (instr.value.kind) { + case 'DeclareLocal': + case 'StoreLocal': { + const lvalue = instr.value.lvalue; + lvalue.place = fn(lvalue.place); + break; + } + case 'Destructure': { + mapPatternOperands(instr.value.lvalue.pattern, fn); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + instr.value.lvalue = fn(instr.value.lvalue); + break; + } + } + if (instr.lvalue !== null) { + instr.lvalue = fn(instr.lvalue); + } +} +function mapInstructionOperands(instr, fn) { + mapInstructionValueOperands(instr.value, fn); +} +function mapInstructionValueOperands(instrValue, fn) { + switch (instrValue.kind) { + case 'BinaryExpression': { + instrValue.left = fn(instrValue.left); + instrValue.right = fn(instrValue.right); + break; + } + case 'PropertyLoad': { + instrValue.object = fn(instrValue.object); + break; + } + case 'PropertyDelete': { + instrValue.object = fn(instrValue.object); + break; + } + case 'PropertyStore': { + instrValue.object = fn(instrValue.object); + instrValue.value = fn(instrValue.value); + break; + } + case 'ComputedLoad': { + instrValue.object = fn(instrValue.object); + instrValue.property = fn(instrValue.property); + break; + } + case 'ComputedDelete': { + instrValue.object = fn(instrValue.object); + instrValue.property = fn(instrValue.property); + break; + } + case 'ComputedStore': { + instrValue.object = fn(instrValue.object); + instrValue.property = fn(instrValue.property); + instrValue.value = fn(instrValue.value); + break; + } + case 'DeclareContext': + case 'DeclareLocal': { + break; + } + case 'LoadLocal': + case 'LoadContext': { + instrValue.place = fn(instrValue.place); + break; + } + case 'StoreLocal': { + instrValue.value = fn(instrValue.value); + break; + } + case 'StoreContext': { + instrValue.lvalue.place = fn(instrValue.lvalue.place); + instrValue.value = fn(instrValue.value); + break; + } + case 'StoreGlobal': { + instrValue.value = fn(instrValue.value); + break; + } + case 'Destructure': { + instrValue.value = fn(instrValue.value); + break; + } + case 'NewExpression': + case 'CallExpression': { + instrValue.callee = fn(instrValue.callee); + instrValue.args = mapCallArguments(instrValue.args, fn); + break; + } + case 'MethodCall': { + instrValue.receiver = fn(instrValue.receiver); + instrValue.property = fn(instrValue.property); + instrValue.args = mapCallArguments(instrValue.args, fn); + break; + } + case 'UnaryExpression': { + instrValue.value = fn(instrValue.value); + break; + } + case 'JsxExpression': { + if (instrValue.tag.kind === 'Identifier') { + instrValue.tag = fn(instrValue.tag); + } + for (const attribute of instrValue.props) { + switch (attribute.kind) { + case 'JsxAttribute': { + attribute.place = fn(attribute.place); + break; + } + case 'JsxSpreadAttribute': { + attribute.argument = fn(attribute.argument); + break; + } + default: { + assertExhaustive$1(attribute, `Unexpected attribute kind \`${attribute.kind}\``); + } + } + } + if (instrValue.children) { + instrValue.children = instrValue.children.map(p => fn(p)); + } + break; + } + case 'ObjectExpression': { + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty' && + property.key.kind === 'computed') { + property.key.name = fn(property.key.name); + } + property.place = fn(property.place); + } + break; + } + case 'ArrayExpression': { + instrValue.elements = instrValue.elements.map(element => { + if (element.kind === 'Identifier') { + return fn(element); + } + else if (element.kind === 'Spread') { + element.place = fn(element.place); + return element; + } + else { + return element; + } + }); + break; + } + case 'JsxFragment': { + instrValue.children = instrValue.children.map(e => fn(e)); + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + instrValue.loweredFunc.func.context = + instrValue.loweredFunc.func.context.map(d => fn(d)); + break; + } + case 'TaggedTemplateExpression': { + instrValue.tag = fn(instrValue.tag); + break; + } + case 'TypeCastExpression': { + instrValue.value = fn(instrValue.value); + break; + } + case 'TemplateLiteral': { + instrValue.subexprs = instrValue.subexprs.map(fn); + break; + } + case 'Await': { + instrValue.value = fn(instrValue.value); + break; + } + case 'GetIterator': { + instrValue.collection = fn(instrValue.collection); + break; + } + case 'IteratorNext': { + instrValue.iterator = fn(instrValue.iterator); + instrValue.collection = fn(instrValue.collection); + break; + } + case 'NextPropertyOf': { + instrValue.value = fn(instrValue.value); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + instrValue.value = fn(instrValue.value); + break; + } + case 'StartMemoize': { + if (instrValue.deps != null) { + for (const dep of instrValue.deps) { + if (dep.root.kind === 'NamedLocal') { + dep.root.value = fn(dep.root.value); + } + } + } + break; + } + case 'FinishMemoize': { + instrValue.decl = fn(instrValue.decl); + break; + } + case 'Debugger': + case 'RegExpLiteral': + case 'MetaProperty': + case 'LoadGlobal': + case 'UnsupportedNode': + case 'Primitive': + case 'JSXText': { + break; + } + default: { + assertExhaustive$1(instrValue, 'Unexpected instruction kind'); + } + } +} +function mapCallArguments(args, fn) { + return args.map(arg => { + if (arg.kind === 'Identifier') { + return fn(arg); + } + else { + arg.place = fn(arg.place); + return arg; + } + }); +} +function mapPatternOperands(pattern, fn) { + switch (pattern.kind) { + case 'ArrayPattern': { + pattern.items = pattern.items.map(item => { + if (item.kind === 'Identifier') { + return fn(item); + } + else if (item.kind === 'Spread') { + item.place = fn(item.place); + return item; + } + else { + return item; + } + }); + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + property.place = fn(property.place); + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function mapTerminalSuccessors(terminal, fn) { + switch (terminal.kind) { + case 'goto': { + const target = fn(terminal.block); + return { + kind: 'goto', + block: target, + variant: terminal.variant, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'if': { + const consequent = fn(terminal.consequent); + const alternate = fn(terminal.alternate); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'if', + test: terminal.test, + consequent, + alternate, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'branch': { + const consequent = fn(terminal.consequent); + const alternate = fn(terminal.alternate); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'branch', + test: terminal.test, + consequent, + alternate, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'switch': { + const cases = terminal.cases.map(case_ => { + const target = fn(case_.block); + return { + test: case_.test, + block: target, + }; + }); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'switch', + test: terminal.test, + cases, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'logical': { + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'logical', + test, + fallthrough, + operator: terminal.operator, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'ternary': { + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'ternary', + test, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'optional': { + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'optional', + optional: terminal.optional, + test, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'return': { + return { + kind: 'return', + returnVariant: terminal.returnVariant, + loc: terminal.loc, + value: terminal.value, + id: makeInstructionId(0), + effects: terminal.effects, + }; + } + case 'throw': { + return terminal; + } + case 'do-while': { + const loop = fn(terminal.loop); + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'do-while', + loc: terminal.loc, + test, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'while': { + const test = fn(terminal.test); + const loop = fn(terminal.loop); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'while', + loc: terminal.loc, + test, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'for': { + const init = fn(terminal.init); + const test = fn(terminal.test); + const update = terminal.update !== null ? fn(terminal.update) : null; + const loop = fn(terminal.loop); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'for', + loc: terminal.loc, + init, + test, + update, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'for-of': { + const init = fn(terminal.init); + const loop = fn(terminal.loop); + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'for-of', + loc: terminal.loc, + init, + test, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'for-in': { + const init = fn(terminal.init); + const loop = fn(terminal.loop); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'for-in', + loc: terminal.loc, + init, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'label': { + const block = fn(terminal.block); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'label', + block, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'sequence': { + const block = fn(terminal.block); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'sequence', + block, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'maybe-throw': { + const continuation = fn(terminal.continuation); + const handler = fn(terminal.handler); + return { + kind: 'maybe-throw', + continuation, + handler, + id: makeInstructionId(0), + loc: terminal.loc, + effects: terminal.effects, + }; + } + case 'try': { + const block = fn(terminal.block); + const handler = fn(terminal.handler); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'try', + block, + handlerBinding: terminal.handlerBinding, + handler, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'scope': + case 'pruned-scope': { + const block = fn(terminal.block); + const fallthrough = fn(terminal.fallthrough); + return { + kind: terminal.kind, + scope: terminal.scope, + block, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'unreachable': + case 'unsupported': { + return terminal; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function terminalHasFallthrough(terminal) { + switch (terminal.kind) { + case 'maybe-throw': + case 'goto': + case 'return': + case 'throw': + case 'unreachable': + case 'unsupported': { + return false; + } + case 'branch': + case 'try': + case 'do-while': + case 'for-of': + case 'for-in': + case 'for': + case 'if': + case 'label': + case 'logical': + case 'optional': + case 'sequence': + case 'switch': + case 'ternary': + case 'while': + case 'scope': + case 'pruned-scope': { + return true; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function terminalFallthrough(terminal) { + if (terminalHasFallthrough(terminal)) { + return terminal.fallthrough; + } + else { + return null; + } +} +function* eachTerminalSuccessor(terminal) { + switch (terminal.kind) { + case 'goto': { + yield terminal.block; + break; + } + case 'if': { + yield terminal.consequent; + yield terminal.alternate; + break; + } + case 'branch': { + yield terminal.consequent; + yield terminal.alternate; + break; + } + case 'switch': { + for (const case_ of terminal.cases) { + yield case_.block; + } + break; + } + case 'optional': + case 'ternary': + case 'logical': { + yield terminal.test; + break; + } + case 'return': { + break; + } + case 'throw': { + break; + } + case 'do-while': { + yield terminal.loop; + break; + } + case 'while': { + yield terminal.test; + break; + } + case 'for': { + yield terminal.init; + break; + } + case 'for-of': { + yield terminal.init; + break; + } + case 'for-in': { + yield terminal.init; + break; + } + case 'label': { + yield terminal.block; + break; + } + case 'sequence': { + yield terminal.block; + break; + } + case 'maybe-throw': { + yield terminal.continuation; + yield terminal.handler; + break; + } + case 'try': { + yield terminal.block; + break; + } + case 'scope': + case 'pruned-scope': { + yield terminal.block; + break; + } + case 'unreachable': + case 'unsupported': + break; + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function mapTerminalOperands(terminal, fn) { + switch (terminal.kind) { + case 'if': { + terminal.test = fn(terminal.test); + break; + } + case 'branch': { + terminal.test = fn(terminal.test); + break; + } + case 'switch': { + terminal.test = fn(terminal.test); + for (const case_ of terminal.cases) { + if (case_.test === null) { + continue; + } + case_.test = fn(case_.test); + } + break; + } + case 'return': + case 'throw': { + terminal.value = fn(terminal.value); + break; + } + case 'try': { + if (terminal.handlerBinding !== null) { + terminal.handlerBinding = fn(terminal.handlerBinding); + } + else { + terminal.handlerBinding = null; + } + break; + } + case 'maybe-throw': + case 'sequence': + case 'label': + case 'optional': + case 'ternary': + case 'logical': + case 'do-while': + case 'while': + case 'for': + case 'for-of': + case 'for-in': + case 'goto': + case 'unreachable': + case 'unsupported': + case 'scope': + case 'pruned-scope': { + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function* eachTerminalOperand(terminal) { + switch (terminal.kind) { + case 'if': { + yield terminal.test; + break; + } + case 'branch': { + yield terminal.test; + break; + } + case 'switch': { + yield terminal.test; + for (const case_ of terminal.cases) { + if (case_.test === null) { + continue; + } + yield case_.test; + } + break; + } + case 'return': + case 'throw': { + yield terminal.value; + break; + } + case 'try': { + if (terminal.handlerBinding !== null) { + yield terminal.handlerBinding; + } + break; + } + case 'maybe-throw': + case 'sequence': + case 'label': + case 'optional': + case 'ternary': + case 'logical': + case 'do-while': + case 'while': + case 'for': + case 'for-of': + case 'for-in': + case 'goto': + case 'unreachable': + case 'unsupported': + case 'scope': + case 'pruned-scope': { + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +class ScopeBlockTraversal { + constructor() { + _ScopeBlockTraversal_activeScopes.set(this, []); + this.blockInfos = new Map(); + } + recordScopes(block) { + var _a, _b; + const blockInfo = this.blockInfos.get(block.id); + if ((blockInfo === null || blockInfo === void 0 ? void 0 : blockInfo.kind) === 'begin') { + __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").push(blockInfo.scope.id); + } + else if ((blockInfo === null || blockInfo === void 0 ? void 0 : blockInfo.kind) === 'end') { + const top = __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").at(-1); + CompilerError.invariant(blockInfo.scope.id === top, { + reason: 'Expected traversed block fallthrough to match top-most active scope', + description: null, + details: [ + { + kind: 'error', + loc: (_b = (_a = block.instructions[0]) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : block.terminal.id, + message: null, + }, + ], + }); + __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").pop(); + } + if (block.terminal.kind === 'scope' || + block.terminal.kind === 'pruned-scope') { + CompilerError.invariant(!this.blockInfos.has(block.terminal.block) && + !this.blockInfos.has(block.terminal.fallthrough), { + reason: 'Expected unique scope blocks and fallthroughs', + description: null, + details: [ + { + kind: 'error', + loc: block.terminal.loc, + message: null, + }, + ], + }); + this.blockInfos.set(block.terminal.block, { + kind: 'begin', + scope: block.terminal.scope, + pruned: block.terminal.kind === 'pruned-scope', + fallthrough: block.terminal.fallthrough, + }); + this.blockInfos.set(block.terminal.fallthrough, { + kind: 'end', + scope: block.terminal.scope, + pruned: block.terminal.kind === 'pruned-scope', + }); + } + } + isScopeActive(scopeId) { + return __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").indexOf(scopeId) !== -1; + } + get currentScope() { + var _a; + return (_a = __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").at(-1)) !== null && _a !== void 0 ? _a : null; + } +} +_ScopeBlockTraversal_activeScopes = new WeakMap(); + +function assertConsistentIdentifiers(fn) { + const identifiers = new Map(); + const assignments = new Set(); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + validate(identifiers, phi.place.identifier); + for (const [, operand] of phi.operands) { + validate(identifiers, operand.identifier); + } + } + for (const instr of block.instructions) { + CompilerError.invariant(instr.lvalue.identifier.name === null, { + reason: `Expected all lvalues to be temporaries`, + description: `Found named lvalue \`${instr.lvalue.identifier.name}\``, + details: [ + { + kind: 'error', + loc: instr.lvalue.loc, + message: null, + }, + ], + suggestions: null, + }); + CompilerError.invariant(!assignments.has(instr.lvalue.identifier.id), { + reason: `Expected lvalues to be assigned exactly once`, + description: `Found duplicate assignment of '${printPlace(instr.lvalue)}'`, + details: [ + { + kind: 'error', + loc: instr.lvalue.loc, + message: null, + }, + ], + suggestions: null, + }); + assignments.add(instr.lvalue.identifier.id); + for (const operand of eachInstructionLValue(instr)) { + validate(identifiers, operand.identifier, operand.loc); + } + for (const operand of eachInstructionValueOperand(instr.value)) { + validate(identifiers, operand.identifier, operand.loc); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + validate(identifiers, operand.identifier, operand.loc); + } + } +} +function validate(identifiers, identifier, loc = null) { + const previous = identifiers.get(identifier.id); + if (previous === undefined) { + identifiers.set(identifier.id, identifier); + } + else { + CompilerError.invariant(identifier === previous, { + reason: `Duplicate identifier object`, + description: `Found duplicate identifier object for id ${identifier.id}`, + details: [ + { + kind: 'error', + loc: loc !== null && loc !== void 0 ? loc : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + } +} + +function assertTerminalSuccessorsExist(fn) { + for (const [, block] of fn.body.blocks) { + mapTerminalSuccessors(block.terminal, successor => { + var _a; + CompilerError.invariant(fn.body.blocks.has(successor), { + reason: `Terminal successor references unknown block`, + description: `Block bb${successor} does not exist for terminal '${printTerminal(block.terminal)}'`, + details: [ + { + kind: 'error', + loc: (_a = block.terminal.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + return successor; + }); + } +} +function assertTerminalPredsExist(fn) { + for (const [, block] of fn.body.blocks) { + for (const pred of block.preds) { + const predBlock = fn.body.blocks.get(pred); + CompilerError.invariant(predBlock != null, { + reason: 'Expected predecessor block to exist', + description: `Block ${block.id} references non-existent ${pred}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + CompilerError.invariant([...eachTerminalSuccessor(predBlock.terminal)].includes(block.id), { + reason: 'Terminal successor does not reference correct predecessor', + description: `Block bb${block.id} has bb${predBlock.id} as a predecessor, but bb${predBlock.id}'s successors do not include bb${block.id}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } +} + +function getScopes(fn) { + const scopes = new Set(); + function visitPlace(place) { + const scope = place.identifier.scope; + if (scope != null) { + if (scope.range.start !== scope.range.end) { + scopes.add(scope); + } + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + visitPlace(operand); + } + for (const operand of eachInstructionOperand(instr)) { + visitPlace(operand); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visitPlace(operand); + } + } + return scopes; +} +function rangePreOrderComparator(a, b) { + const startDiff = a.start - b.start; + if (startDiff !== 0) + return startDiff; + return b.end - a.end; +} +function recursivelyTraverseItems(items, getRange, context, enter, exit) { + items.sort((a, b) => rangePreOrderComparator(getRange(a), getRange(b))); + let activeItems = []; + const ranges = items.map(getRange); + for (let i = 0; i < items.length; i++) { + const curr = items[i]; + const currRange = ranges[i]; + for (let i = activeItems.length - 1; i >= 0; i--) { + const maybeParent = activeItems[i]; + const maybeParentRange = getRange(maybeParent); + const disjoint = currRange.start >= maybeParentRange.end; + const nested = currRange.end <= maybeParentRange.end; + CompilerError.invariant(disjoint || nested, { + reason: 'Invalid nesting in program blocks or scopes', + description: `Items overlap but are not nested: ${maybeParentRange.start}:${maybeParentRange.end}(${currRange.start}:${currRange.end})`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + if (disjoint) { + exit(maybeParent, context); + activeItems.length = i; + } + else { + break; + } + } + enter(curr, context); + activeItems.push(curr); + } + let curr = activeItems.pop(); + while (curr != null) { + exit(curr, context); + curr = activeItems.pop(); + } +} +const no_op = () => { }; +function assertValidBlockNesting(fn) { + var _a, _b; + const scopes = getScopes(fn); + const blocks = [...scopes].map(scope => (Object.assign({ kind: 'Scope', id: scope.id }, scope.range))); + for (const [, block] of fn.body.blocks) { + const fallthroughId = terminalFallthrough(block.terminal); + if (fallthroughId != null) { + const fallthrough = fn.body.blocks.get(fallthroughId); + const end = (_b = (_a = fallthrough.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : fallthrough.terminal.id; + blocks.push({ + kind: 'ProgramBlockSubtree', + id: block.id, + start: block.terminal.id, + end, + }); + } + } + recursivelyTraverseItems(blocks, block => block, null, no_op, no_op); +} + +function assertValidMutableRanges(fn) { + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + visit$2(phi.place, `phi for block bb${block.id}`); + for (const [pred, operand] of phi.operands) { + visit$2(operand, `phi predecessor bb${pred} for block bb${block.id}`); + } + } + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + visit$2(operand, `instruction [${instr.id}]`); + } + for (const operand of eachInstructionOperand(instr)) { + visit$2(operand, `instruction [${instr.id}]`); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visit$2(operand, `terminal [${block.terminal.id}]`); + } + } +} +function visit$2(place, description) { + validateMutableRange(place, place.identifier.mutableRange, description); + if (place.identifier.scope !== null) { + validateMutableRange(place, place.identifier.scope.range, description); + } +} +function validateMutableRange(place, range, description) { + CompilerError.invariant((range.start === 0 && range.end === 0) || range.end > range.start, { + reason: `Invalid mutable range: [${range.start}:${range.end}]`, + description: `${printPlace(place)} in ${description}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + }); +} + +var _HIRBuilder_instances, _HIRBuilder_completed, _HIRBuilder_current, _HIRBuilder_entry, _HIRBuilder_scopes, _HIRBuilder_context, _HIRBuilder_bindings, _HIRBuilder_env, _HIRBuilder_exceptionHandlerStack, _HIRBuilder_resolveBabelBinding; +function newBlock(id, kind) { + return { id, kind, instructions: [] }; +} +class HIRBuilder { + get nextIdentifierId() { + return __classPrivateFieldGet(this, _HIRBuilder_env, "f").nextIdentifierId; + } + get context() { + return __classPrivateFieldGet(this, _HIRBuilder_context, "f"); + } + get bindings() { + return __classPrivateFieldGet(this, _HIRBuilder_bindings, "f"); + } + get environment() { + return __classPrivateFieldGet(this, _HIRBuilder_env, "f"); + } + constructor(env, options) { + var _a, _b, _c; + _HIRBuilder_instances.add(this); + _HIRBuilder_completed.set(this, new Map()); + _HIRBuilder_current.set(this, void 0); + _HIRBuilder_entry.set(this, void 0); + _HIRBuilder_scopes.set(this, []); + _HIRBuilder_context.set(this, void 0); + _HIRBuilder_bindings.set(this, void 0); + _HIRBuilder_env.set(this, void 0); + _HIRBuilder_exceptionHandlerStack.set(this, []); + this.errors = new CompilerError(); + this.fbtDepth = 0; + __classPrivateFieldSet(this, _HIRBuilder_env, env, "f"); + __classPrivateFieldSet(this, _HIRBuilder_bindings, (_a = options === null || options === void 0 ? void 0 : options.bindings) !== null && _a !== void 0 ? _a : new Map(), "f"); + __classPrivateFieldSet(this, _HIRBuilder_context, (_b = options === null || options === void 0 ? void 0 : options.context) !== null && _b !== void 0 ? _b : new Map(), "f"); + __classPrivateFieldSet(this, _HIRBuilder_entry, makeBlockId(env.nextBlockId), "f"); + __classPrivateFieldSet(this, _HIRBuilder_current, newBlock(__classPrivateFieldGet(this, _HIRBuilder_entry, "f"), (_c = options === null || options === void 0 ? void 0 : options.entryBlockKind) !== null && _c !== void 0 ? _c : 'block'), "f"); + } + currentBlockKind() { + return __classPrivateFieldGet(this, _HIRBuilder_current, "f").kind; + } + push(instruction) { + __classPrivateFieldGet(this, _HIRBuilder_current, "f").instructions.push(instruction); + const exceptionHandler = __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").at(-1); + if (exceptionHandler !== undefined) { + const continuationBlock = this.reserve(this.currentBlockKind()); + this.terminateWithContinuation({ + kind: 'maybe-throw', + continuation: continuationBlock.id, + handler: exceptionHandler, + id: makeInstructionId(0), + loc: instruction.loc, + effects: null, + }, continuationBlock); + } + } + enterTryCatch(handler, fn) { + __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").push(handler); + fn(); + __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").pop(); + } + resolveThrowHandler() { + const handler = __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").at(-1); + return handler !== null && handler !== void 0 ? handler : null; + } + makeTemporary(loc) { + const id = this.nextIdentifierId; + return makeTemporaryIdentifier(id, loc); + } + resolveIdentifier(path) { + const originalName = path.node.name; + const babelBinding = __classPrivateFieldGet(this, _HIRBuilder_instances, "m", _HIRBuilder_resolveBabelBinding).call(this, path); + if (babelBinding == null) { + return { kind: 'Global', name: originalName }; + } + const outerBinding = __classPrivateFieldGet(this, _HIRBuilder_env, "f").parentFunction.scope.parent.getBinding(originalName); + if (babelBinding === outerBinding) { + const path = babelBinding.path; + if (path.isImportDefaultSpecifier()) { + const importDeclaration = path.parentPath; + return { + kind: 'ImportDefault', + name: originalName, + module: importDeclaration.node.source.value, + }; + } + else if (path.isImportSpecifier()) { + const importDeclaration = path.parentPath; + return { + kind: 'ImportSpecifier', + name: originalName, + module: importDeclaration.node.source.value, + imported: path.node.imported.type === 'Identifier' + ? path.node.imported.name + : path.node.imported.value, + }; + } + else if (path.isImportNamespaceSpecifier()) { + const importDeclaration = path.parentPath; + return { + kind: 'ImportNamespace', + name: originalName, + module: importDeclaration.node.source.value, + }; + } + else { + return { + kind: 'ModuleLocal', + name: originalName, + }; + } + } + const resolvedBinding = this.resolveBinding(babelBinding.identifier); + if (resolvedBinding.name && resolvedBinding.name.value !== originalName) { + babelBinding.scope.rename(originalName, resolvedBinding.name.value); + } + return { + kind: 'Identifier', + identifier: resolvedBinding, + bindingKind: babelBinding.kind, + }; + } + isContextIdentifier(path) { + const binding = __classPrivateFieldGet(this, _HIRBuilder_instances, "m", _HIRBuilder_resolveBabelBinding).call(this, path); + if (binding) { + const outerBinding = __classPrivateFieldGet(this, _HIRBuilder_env, "f").parentFunction.scope.parent.getBinding(path.node.name); + if (binding === outerBinding) { + return false; + } + return __classPrivateFieldGet(this, _HIRBuilder_env, "f").isContextIdentifier(binding.identifier); + } + else { + return false; + } + } + resolveBinding(node) { + var _a, _b, _c; + if (node.name === 'fbt') { + CompilerError.throwDiagnostic({ + category: ErrorCategory.Todo, + reason: 'Support local variables named `fbt`', + description: 'Local variables named `fbt` may conflict with the fbt plugin and are not yet supported', + details: [ + { + kind: 'error', + message: 'Rename to avoid conflict with fbt plugin', + loc: (_a = node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }, + ], + }); + } + if (node.name === 'this') { + CompilerError.throwDiagnostic({ + category: ErrorCategory.UnsupportedSyntax, + reason: '`this` is not supported syntax', + description: 'React Compiler does not support compiling functions that use `this`', + details: [ + { + kind: 'error', + message: '`this` was used here', + loc: (_b = node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }, + ], + }); + } + const originalName = node.name; + let name = originalName; + let index = 0; + while (true) { + const mapping = __classPrivateFieldGet(this, _HIRBuilder_bindings, "f").get(name); + if (mapping === undefined) { + const id = this.nextIdentifierId; + const identifier = { + id, + declarationId: makeDeclarationId(id), + name: makeIdentifierName(name), + mutableRange: { + start: makeInstructionId(0), + end: makeInstructionId(0), + }, + scope: null, + type: makeType(), + loc: (_c = node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + }; + __classPrivateFieldGet(this, _HIRBuilder_env, "f").programContext.addNewReference(name); + __classPrivateFieldGet(this, _HIRBuilder_bindings, "f").set(name, { node, identifier }); + return identifier; + } + else if (mapping.node === node) { + return mapping.identifier; + } + else { + name = `${originalName}_${index++}`; + } + } + } + build() { + var _a, _b; + let ir = { + blocks: __classPrivateFieldGet(this, _HIRBuilder_completed, "f"), + entry: __classPrivateFieldGet(this, _HIRBuilder_entry, "f"), + }; + const rpoBlocks = getReversePostorderedBlocks(ir); + for (const [id, block] of ir.blocks) { + if (!rpoBlocks.has(id) && + block.instructions.some(instr => instr.value.kind === 'FunctionExpression')) { + CompilerError.throwTodo({ + reason: `Support functions with unreachable code that may contain hoisted declarations`, + loc: (_b = (_a = block.instructions[0]) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : block.terminal.loc, + description: null, + suggestions: null, + }); + } + } + ir.blocks = rpoBlocks; + removeUnreachableForUpdates(ir); + removeDeadDoWhileStatements(ir); + removeUnnecessaryTryCatch(ir); + markInstructionIds(ir); + markPredecessors(ir); + return ir; + } + terminate(terminal, nextBlockKind) { + const { id: blockId, kind, instructions } = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind, + id: blockId, + instructions, + terminal, + preds: new Set(), + phis: new Set(), + }); + if (nextBlockKind) { + const nextId = __classPrivateFieldGet(this, _HIRBuilder_env, "f").nextBlockId; + __classPrivateFieldSet(this, _HIRBuilder_current, newBlock(nextId, nextBlockKind), "f"); + } + return blockId; + } + terminateWithContinuation(terminal, continuation) { + const { id: blockId, kind, instructions } = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind: kind, + id: blockId, + instructions, + terminal: terminal, + preds: new Set(), + phis: new Set(), + }); + __classPrivateFieldSet(this, _HIRBuilder_current, continuation, "f"); + } + reserve(kind) { + return newBlock(makeBlockId(__classPrivateFieldGet(this, _HIRBuilder_env, "f").nextBlockId), kind); + } + complete(block, terminal) { + const { id: blockId, kind, instructions } = block; + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind, + id: blockId, + instructions, + terminal, + preds: new Set(), + phis: new Set(), + }); + } + enterReserved(wip, fn) { + const current = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldSet(this, _HIRBuilder_current, wip, "f"); + const terminal = fn(); + const { id: blockId, kind, instructions } = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind, + id: blockId, + instructions, + terminal, + preds: new Set(), + phis: new Set(), + }); + __classPrivateFieldSet(this, _HIRBuilder_current, current, "f"); + } + enter(nextBlockKind, fn) { + const wip = this.reserve(nextBlockKind); + this.enterReserved(wip, () => { + return fn(wip.id); + }); + return wip.id; + } + label(label, breakBlock, fn) { + __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").push({ + kind: 'label', + breakBlock, + label, + }); + const value = fn(); + const last = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").pop(); + CompilerError.invariant(last != null && + last.kind === 'label' && + last.label === label && + last.breakBlock === breakBlock, { + reason: 'Mismatched label', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return value; + } + switch(label, breakBlock, fn) { + __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").push({ + kind: 'switch', + breakBlock, + label, + }); + const value = fn(); + const last = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").pop(); + CompilerError.invariant(last != null && + last.kind === 'switch' && + last.label === label && + last.breakBlock === breakBlock, { + reason: 'Mismatched label', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return value; + } + loop(label, continueBlock, breakBlock, fn) { + __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").push({ + kind: 'loop', + label, + continueBlock, + breakBlock, + }); + const value = fn(); + const last = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").pop(); + CompilerError.invariant(last != null && + last.kind === 'loop' && + last.label === label && + last.continueBlock === continueBlock && + last.breakBlock === breakBlock, { + reason: 'Mismatched loops', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return value; + } + lookupBreak(label) { + for (let ii = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").length - 1; ii >= 0; ii--) { + const scope = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f")[ii]; + if ((label === null && + (scope.kind === 'loop' || scope.kind === 'switch')) || + label === scope.label) { + return scope.breakBlock; + } + } + CompilerError.invariant(false, { + reason: 'Expected a loop or switch to be in scope', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + lookupContinue(label) { + for (let ii = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").length - 1; ii >= 0; ii--) { + const scope = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f")[ii]; + if (scope.kind === 'loop') { + if (label === null || label === scope.label) { + return scope.continueBlock; + } + } + else if (label !== null && scope.label === label) { + CompilerError.invariant(false, { + reason: 'Continue may only refer to a labeled loop', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + } + CompilerError.invariant(false, { + reason: 'Expected a loop to be in scope', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } +} +_HIRBuilder_completed = new WeakMap(), _HIRBuilder_current = new WeakMap(), _HIRBuilder_entry = new WeakMap(), _HIRBuilder_scopes = new WeakMap(), _HIRBuilder_context = new WeakMap(), _HIRBuilder_bindings = new WeakMap(), _HIRBuilder_env = new WeakMap(), _HIRBuilder_exceptionHandlerStack = new WeakMap(), _HIRBuilder_instances = new WeakSet(), _HIRBuilder_resolveBabelBinding = function _HIRBuilder_resolveBabelBinding(path) { + const originalName = path.node.name; + const binding = path.scope.getBinding(originalName); + if (binding == null) { + return null; + } + return binding; +}; +function removeUnreachableForUpdates(fn) { + for (const [, block] of fn.blocks) { + if (block.terminal.kind === 'for' && + block.terminal.update !== null && + !fn.blocks.has(block.terminal.update)) { + block.terminal.update = null; + } + } +} +function removeDeadDoWhileStatements(func) { + const visited = new Set(); + for (const [_, block] of func.blocks) { + visited.add(block.id); + } + for (const [_, block] of func.blocks) { + if (block.terminal.kind === 'do-while') { + if (!visited.has(block.terminal.test)) { + block.terminal = { + kind: 'goto', + block: block.terminal.loop, + variant: GotoVariant.Break, + id: block.terminal.id, + loc: block.terminal.loc, + }; + } + } + } +} +function reversePostorderBlocks(func) { + const rpoBlocks = getReversePostorderedBlocks(func); + func.blocks = rpoBlocks; +} +function getReversePostorderedBlocks(func) { + const visited = new Set(); + const used = new Set(); + const usedFallthroughs = new Set(); + const postorder = []; + function visit(blockId, isUsed) { + const wasUsed = used.has(blockId); + const wasVisited = visited.has(blockId); + visited.add(blockId); + if (isUsed) { + used.add(blockId); + } + if (wasVisited && (wasUsed || !isUsed)) { + return; + } + const block = func.blocks.get(blockId); + CompilerError.invariant(block != null, { + reason: '[HIRBuilder] Unexpected null block', + description: `expected block ${blockId} to exist`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + const successors = [...eachTerminalSuccessor(block.terminal)].reverse(); + const fallthrough = terminalFallthrough(block.terminal); + if (fallthrough != null) { + if (isUsed) { + usedFallthroughs.add(fallthrough); + } + visit(fallthrough, false); + } + for (const successor of successors) { + visit(successor, isUsed); + } + if (!wasVisited) { + postorder.push(blockId); + } + } + visit(func.entry, true); + const blocks = new Map(); + for (const blockId of postorder.reverse()) { + const block = func.blocks.get(blockId); + if (used.has(blockId)) { + blocks.set(blockId, func.blocks.get(blockId)); + } + else if (usedFallthroughs.has(blockId)) { + blocks.set(blockId, Object.assign(Object.assign({}, block), { instructions: [], terminal: { + kind: 'unreachable', + id: block.terminal.id, + loc: block.terminal.loc, + } })); + } + } + return blocks; +} +function markInstructionIds(func) { + let id = 0; + const visited = new Set(); + for (const [_, block] of func.blocks) { + for (const instr of block.instructions) { + CompilerError.invariant(!visited.has(instr), { + reason: `${printInstruction(instr)} already visited!`, + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + suggestions: null, + }); + visited.add(instr); + instr.id = makeInstructionId(++id); + } + block.terminal.id = makeInstructionId(++id); + } +} +function markPredecessors(func) { + for (const [, block] of func.blocks) { + block.preds.clear(); + } + const visited = new Set(); + function visit(blockId, prevBlock) { + const block = func.blocks.get(blockId); + if (block == null) { + return; + } + CompilerError.invariant(block != null, { + reason: 'unexpected missing block', + description: `block ${blockId}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + if (prevBlock) { + block.preds.add(prevBlock.id); + } + if (visited.has(blockId)) { + return; + } + visited.add(blockId); + const { terminal } = block; + for (const successor of eachTerminalSuccessor(terminal)) { + visit(successor, block); + } + } + visit(func.entry, null); +} +function removeUnnecessaryTryCatch(fn) { + for (const [, block] of fn.blocks) { + if (block.terminal.kind === 'try' && + !fn.blocks.has(block.terminal.handler)) { + const handlerId = block.terminal.handler; + const fallthroughId = block.terminal.fallthrough; + const fallthrough = fn.blocks.get(fallthroughId); + block.terminal = { + kind: 'goto', + block: block.terminal.block, + id: makeInstructionId(0), + loc: block.terminal.loc, + variant: GotoVariant.Break, + }; + if (fallthrough != null) { + if (fallthrough.preds.size === 1 && fallthrough.preds.has(handlerId)) { + fn.blocks.delete(fallthroughId); + } + else { + fallthrough.preds.delete(handlerId); + } + } + } + } +} +function createTemporaryPlace(env, loc) { + return { + kind: 'Identifier', + identifier: makeTemporaryIdentifier(env.nextIdentifierId, loc), + reactive: false, + effect: Effect.Unknown, + loc: GeneratedSource, + }; +} +function clonePlaceToTemporary(env, place) { + const temp = createTemporaryPlace(env, place.loc); + temp.effect = place.effect; + temp.identifier.type = place.identifier.type; + temp.reactive = place.reactive; + return temp; +} +function fixScopeAndIdentifierRanges(func) { + var _a, _b; + for (const [, block] of func.blocks) { + const terminal = block.terminal; + if (terminal.kind === 'scope' || terminal.kind === 'pruned-scope') { + const fallthroughBlock = func.blocks.get(terminal.fallthrough); + const firstId = (_b = (_a = fallthroughBlock.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : fallthroughBlock.terminal.id; + terminal.scope.range.start = terminal.id; + terminal.scope.range.end = firstId; + } + } +} + +const PRIMITIVE_TYPE = { + kind: 'Primitive', +}; +let nextAnonId = 0; +function createAnonId() { + return ``; +} +function addFunction(registry, properties, fn, id = null, isConstructor = false) { + const shapeId = id !== null && id !== void 0 ? id : createAnonId(); + const aliasing = fn.aliasing != null + ? parseAliasingSignatureConfig(fn.aliasing, '', GeneratedSource) + : null; + addShape(registry, shapeId, properties, Object.assign(Object.assign({}, fn), { aliasing, hookKind: null })); + return { + kind: 'Function', + return: fn.returnType, + shapeId, + isConstructor, + }; +} +function addHook(registry, fn, id = null) { + const shapeId = id !== null && id !== void 0 ? id : createAnonId(); + const aliasing = fn.aliasing != null + ? parseAliasingSignatureConfig(fn.aliasing, '', GeneratedSource) + : null; + addShape(registry, shapeId, [], Object.assign(Object.assign({}, fn), { aliasing })); + return { + kind: 'Function', + return: fn.returnType, + shapeId, + isConstructor: false, + }; +} +function parseAliasingSignatureConfig(typeConfig, moduleName, loc) { + const lifetimes = new Map(); + function define(temp) { + CompilerError.invariant(!lifetimes.has(temp), { + reason: `Invalid type configuration for module`, + description: `Expected aliasing signature to have unique names for receiver, params, rest, returns, and temporaries in module '${moduleName}'`, + details: [ + { + kind: 'error', + loc, + message: null, + }, + ], + }); + const place = signatureArgument(lifetimes.size); + lifetimes.set(temp, place); + return place; + } + function lookup(temp) { + const place = lifetimes.get(temp); + CompilerError.invariant(place != null, { + reason: `Invalid type configuration for module`, + description: `Expected aliasing signature effects to reference known names from receiver/params/rest/returns/temporaries, but '${temp}' is not a known name in '${moduleName}'`, + details: [ + { + kind: 'error', + loc, + message: null, + }, + ], + }); + return place; + } + const receiver = define(typeConfig.receiver); + const params = typeConfig.params.map(define); + const rest = typeConfig.rest != null ? define(typeConfig.rest) : null; + const returns = define(typeConfig.returns); + const temporaries = typeConfig.temporaries.map(define); + const effects = typeConfig.effects.map((effect) => { + switch (effect.kind) { + case 'ImmutableCapture': + case 'CreateFrom': + case 'Capture': + case 'Alias': + case 'Assign': { + const from = lookup(effect.from); + const into = lookup(effect.into); + return { + kind: effect.kind, + from, + into, + }; + } + case 'Mutate': + case 'MutateTransitiveConditionally': { + const value = lookup(effect.value); + return { kind: effect.kind, value }; + } + case 'Create': { + const into = lookup(effect.into); + return { + kind: 'Create', + into, + reason: effect.reason, + value: effect.value, + }; + } + case 'Freeze': { + const value = lookup(effect.value); + return { + kind: 'Freeze', + value, + reason: effect.reason, + }; + } + case 'Impure': { + const place = lookup(effect.place); + return { + kind: 'Impure', + place, + error: CompilerError.throwTodo({ + reason: 'Support impure effect declarations', + loc: GeneratedSource, + }), + }; + } + case 'Apply': { + const receiver = lookup(effect.receiver); + const fn = lookup(effect.function); + const args = effect.args.map(arg => { + if (typeof arg === 'string') { + return lookup(arg); + } + else if (arg.kind === 'Spread') { + return { kind: 'Spread', place: lookup(arg.place) }; + } + else { + return arg; + } + }); + const into = lookup(effect.into); + return { + kind: 'Apply', + receiver, + function: fn, + mutatesFunction: effect.mutatesFunction, + args, + into, + loc, + signature: null, + }; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind '${effect.kind}'`); + } + } + }); + return { + receiver: receiver.identifier.id, + params: params.map(p => p.identifier.id), + rest: rest != null ? rest.identifier.id : null, + returns: returns.identifier.id, + temporaries, + effects, + }; +} +function addObject(registry, id, properties) { + const shapeId = id !== null && id !== void 0 ? id : createAnonId(); + addShape(registry, shapeId, properties, null); + return { + kind: 'Object', + shapeId, + }; +} +function addShape(registry, id, properties, functionType) { + const shape = { + properties: new Map(properties), + functionType, + }; + CompilerError.invariant(!registry.has(id), { + reason: `[ObjectShape] Could not add shape to registry: name ${id} already exists.`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + registry.set(id, shape); + return shape; +} +const BuiltInPropsId = 'BuiltInProps'; +const BuiltInArrayId = 'BuiltInArray'; +const BuiltInSetId = 'BuiltInSet'; +const BuiltInMapId = 'BuiltInMap'; +const BuiltInWeakSetId = 'BuiltInWeakSet'; +const BuiltInWeakMapId = 'BuiltInWeakMap'; +const BuiltInFunctionId = 'BuiltInFunction'; +const BuiltInJsxId = 'BuiltInJsx'; +const BuiltInObjectId = 'BuiltInObject'; +const BuiltInUseStateId = 'BuiltInUseState'; +const BuiltInSetStateId = 'BuiltInSetState'; +const BuiltInUseActionStateId = 'BuiltInUseActionState'; +const BuiltInSetActionStateId = 'BuiltInSetActionState'; +const BuiltInUseRefId = 'BuiltInUseRefId'; +const BuiltInRefValueId = 'BuiltInRefValue'; +const BuiltInMixedReadonlyId = 'BuiltInMixedReadonly'; +const BuiltInUseEffectHookId = 'BuiltInUseEffectHook'; +const BuiltInUseLayoutEffectHookId = 'BuiltInUseLayoutEffectHook'; +const BuiltInUseInsertionEffectHookId = 'BuiltInUseInsertionEffectHook'; +const BuiltInUseOperatorId = 'BuiltInUseOperator'; +const BuiltInUseReducerId = 'BuiltInUseReducer'; +const BuiltInDispatchId = 'BuiltInDispatch'; +const BuiltInUseContextHookId = 'BuiltInUseContextHook'; +const BuiltInUseTransitionId = 'BuiltInUseTransition'; +const BuiltInStartTransitionId = 'BuiltInStartTransition'; +const BuiltInFireId = 'BuiltInFire'; +const BuiltInFireFunctionId = 'BuiltInFireFunction'; +const BuiltInUseEffectEventId = 'BuiltInUseEffectEvent'; +const BuiltinEffectEventId = 'BuiltInEffectEventFunction'; +const BuiltInAutodepsId = 'BuiltInAutoDepsId'; +const ReanimatedSharedValueId = 'ReanimatedSharedValueId'; +const BUILTIN_SHAPES = new Map(); +addObject(BUILTIN_SHAPES, BuiltInPropsId, [ + ['ref', { kind: 'Object', shapeId: BuiltInUseRefId }], +]); +addObject(BUILTIN_SHAPES, BuiltInArrayId, [ + [ + 'indexOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'includes', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'pop', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'at', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'concat', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + ['length', PRIMITIVE_TYPE], + [ + 'push', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: [], + effects: [ + { kind: 'Mutate', value: '@receiver' }, + { + kind: 'Capture', + from: '@rest', + into: '@receiver', + }, + { + kind: 'Create', + into: '@returns', + value: ValueKind.Primitive, + reason: ValueReason.KnownReturnSignature, + }, + ], + }, + }), + ], + [ + 'slice', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'map', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + aliasing: { + receiver: '@receiver', + params: ['@callback'], + rest: null, + returns: '@returns', + temporaries: [ + '@item', + '@callbackReturn', + '@thisArg', + ], + effects: [ + { + kind: 'Create', + into: '@returns', + value: ValueKind.Mutable, + reason: ValueReason.KnownReturnSignature, + }, + { + kind: 'CreateFrom', + from: '@receiver', + into: '@item', + }, + { + kind: 'Create', + into: '@thisArg', + value: ValueKind.Primitive, + reason: ValueReason.KnownReturnSignature, + }, + { + kind: 'Apply', + receiver: '@thisArg', + args: ['@item', { kind: 'Hole' }, '@receiver'], + function: '@callback', + into: '@callbackReturn', + mutatesFunction: false, + }, + { + kind: 'Capture', + from: '@callbackReturn', + into: '@returns', + }, + ], + }, + }), + ], + [ + 'flatMap', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'filter', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'every', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'some', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'find', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'findIndex', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'join', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInObjectId, [ + [ + 'toString', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInSetId, [ + [ + 'add', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Assign', + from: '@receiver', + into: '@returns', + }, + { + kind: 'Mutate', + value: '@receiver', + }, + { + kind: 'Capture', + from: '@rest', + into: '@receiver', + }, + ], + }, + }), + ], + [ + 'clear', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + ['size', PRIMITIVE_TYPE], + [ + 'difference', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'union', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'symmetricalDifference', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'isSubsetOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'isSupersetOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'forEach', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'entries', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'keys', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'values', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInMapId, [ + [ + 'clear', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'get', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'set', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture, Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInMapId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], + ['size', PRIMITIVE_TYPE], + [ + 'forEach', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'entries', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'keys', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'values', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInWeakSetId, [ + [ + 'add', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakSetId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInWeakMapId, [ + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'get', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'set', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture, Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakMapId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseStateId, [ + ['0', { kind: 'Poly' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInSetStateId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseTransitionId, [ + ['0', { kind: 'Primitive' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInStartTransitionId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseActionStateId, [ + ['0', { kind: 'Poly' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInSetActionStateId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseReducerId, [ + ['0', { kind: 'Poly' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInDispatchId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseRefId, [ + ['current', { kind: 'Object', shapeId: BuiltInRefValueId }], +]); +addObject(BUILTIN_SHAPES, BuiltInRefValueId, [ + ['*', { kind: 'Object', shapeId: BuiltInRefValueId }], +]); +addObject(BUILTIN_SHAPES, ReanimatedSharedValueId, []); +addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, +}, BuiltinEffectEventId); +addObject(BUILTIN_SHAPES, BuiltInMixedReadonlyId, [ + [ + 'toString', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'indexOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'includes', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'at', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInMixedReadonlyId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'map', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ], + [ + 'flatMap', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ], + [ + 'filter', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ], + [ + 'concat', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'slice', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'every', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'some', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'find', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInMixedReadonlyId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Frozen, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'findIndex', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'join', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + ['*', { kind: 'Object', shapeId: BuiltInMixedReadonlyId }], +]); +addObject(BUILTIN_SHAPES, BuiltInJsxId, []); +addObject(BUILTIN_SHAPES, BuiltInFunctionId, []); +const DefaultMutatingHook = addHook(BUILTIN_SHAPES, { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'Custom', + returnValueKind: ValueKind.Mutable, +}, 'DefaultMutatingHook'); +const DefaultNonmutatingHook = addHook(BUILTIN_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'Custom', + returnValueKind: ValueKind.Frozen, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Freeze', + value: '@rest', + reason: ValueReason.HookCaptured, + }, + { + kind: 'Create', + into: '@returns', + value: ValueKind.Frozen, + reason: ValueReason.HookReturn, + }, + { + kind: 'Alias', + from: '@rest', + into: '@returns', + }, + ], + }, +}, 'DefaultNonmutatingHook'); +function signatureArgument(id) { + const place = { + kind: 'Identifier', + effect: Effect.Unknown, + loc: GeneratedSource, + reactive: false, + identifier: { + declarationId: makeDeclarationId(id), + id: makeIdentifierId(id), + loc: GeneratedSource, + mutableRange: { start: makeInstructionId(0), end: makeInstructionId(0) }, + name: null, + scope: null, + type: makeType(), + }, + }; + return place; +} + +function lower(func, env, bindings = null, capturedRefs = new Map()) { + var _a, _b, _c; + const builder = new HIRBuilder(env, { + bindings, + context: capturedRefs, + }); + const context = []; + for (const [ref, loc] of capturedRefs !== null && capturedRefs !== void 0 ? capturedRefs : []) { + context.push({ + kind: 'Identifier', + identifier: builder.resolveBinding(ref), + effect: Effect.Unknown, + reactive: false, + loc, + }); + } + let id = null; + if (func.isFunctionDeclaration() || func.isFunctionExpression()) { + const idNode = func.get('id'); + if (hasNode(idNode)) { + id = idNode.node.name; + } + } + const params = []; + func.get('params').forEach(param => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + if (param.isIdentifier()) { + const binding = builder.resolveIdentifier(param); + if (binding.kind !== 'Identifier') { + builder.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Invariant, + reason: 'Could not find binding', + description: `[BuildHIR] Could not find binding for param \`${param.node.name}\``, + }).withDetails({ + kind: 'error', + loc: (_a = param.node.loc) !== null && _a !== void 0 ? _a : null, + message: 'Could not find binding', + })); + return; + } + const place = { + kind: 'Identifier', + identifier: binding.identifier, + effect: Effect.Unknown, + reactive: false, + loc: (_b = param.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + params.push(place); + } + else if (param.isObjectPattern() || + param.isArrayPattern() || + param.isAssignmentPattern()) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary((_c = param.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource), + effect: Effect.Unknown, + reactive: false, + loc: (_d = param.node.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }; + promoteTemporary(place.identifier); + params.push(place); + lowerAssignment(builder, (_e = param.node.loc) !== null && _e !== void 0 ? _e : GeneratedSource, InstructionKind.Let, param, place, 'Assignment'); + } + else if (param.isRestElement()) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary((_f = param.node.loc) !== null && _f !== void 0 ? _f : GeneratedSource), + effect: Effect.Unknown, + reactive: false, + loc: (_g = param.node.loc) !== null && _g !== void 0 ? _g : GeneratedSource, + }; + params.push({ + kind: 'Spread', + place, + }); + lowerAssignment(builder, (_h = param.node.loc) !== null && _h !== void 0 ? _h : GeneratedSource, InstructionKind.Let, param.get('argument'), place, 'Assignment'); + } + else { + builder.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Todo, + reason: `Handle ${param.node.type} parameters`, + description: `[BuildHIR] Add support for ${param.node.type} parameters`, + }).withDetails({ + kind: 'error', + loc: (_j = param.node.loc) !== null && _j !== void 0 ? _j : null, + message: 'Unsupported parameter type', + })); + } + }); + let directives = []; + const body = func.get('body'); + if (body.isExpression()) { + const fallthrough = builder.reserve('block'); + const terminal = { + kind: 'return', + returnVariant: 'Implicit', + loc: GeneratedSource, + value: lowerExpressionToTemporary(builder, body), + id: makeInstructionId(0), + effects: null, + }; + builder.terminateWithContinuation(terminal, fallthrough); + } + else if (body.isBlockStatement()) { + lowerStatement(builder, body); + directives = body.get('directives').map(d => d.node.value.value); + } + else { + builder.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Syntax, + reason: `Unexpected function body kind`, + description: `Expected function body to be an expression or a block statement, got \`${body.type}\``, + }).withDetails({ + kind: 'error', + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : null, + message: 'Expected a block statement or expression', + })); + } + let validatedId = null; + if (id != null) { + const idResult = validateIdentifierName(id); + if (idResult.isErr()) { + builder.errors.merge(idResult.unwrapErr()); + } + else { + validatedId = idResult.unwrap().value; + } + } + if (builder.errors.hasAnyErrors()) { + return Err(builder.errors); + } + builder.terminate({ + kind: 'return', + returnVariant: 'Void', + loc: GeneratedSource, + value: lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc: GeneratedSource, + }), + id: makeInstructionId(0), + effects: null, + }, null); + return Ok({ + id: validatedId, + nameHint: null, + params, + fnType: bindings == null ? env.fnType : 'Other', + returnTypeAnnotation: null, + returns: createTemporaryPlace(env, (_b = func.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource), + body: builder.build(), + context, + generator: func.node.generator === true, + async: func.node.async === true, + loc: (_c = func.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + env, + effects: null, + aliasingEffects: null, + directives, + }); +} +function lowerStatement(builder, stmtPath, label = null) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36; + const stmtNode = stmtPath.node; + switch (stmtNode.type) { + case 'ThrowStatement': { + const stmt = stmtPath; + const value = lowerExpressionToTemporary(builder, stmt.get('argument')); + const handler = builder.resolveThrowHandler(); + if (handler != null) { + builder.errors.push({ + reason: '(BuildHIR::lowerStatement) Support ThrowStatement inside of try/catch', + category: ErrorCategory.Todo, + loc: (_a = stmt.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + const terminal = { + kind: 'throw', + value, + id: makeInstructionId(0), + loc: (_b = stmt.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + builder.terminate(terminal, 'block'); + return; + } + case 'ReturnStatement': { + const stmt = stmtPath; + const argument = stmt.get('argument'); + let value; + if (argument.node === null) { + value = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc: GeneratedSource, + }); + } + else { + value = lowerExpressionToTemporary(builder, argument); + } + const terminal = { + kind: 'return', + returnVariant: 'Explicit', + loc: (_c = stmt.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + value, + id: makeInstructionId(0), + effects: null, + }; + builder.terminate(terminal, 'block'); + return; + } + case 'IfStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const consequentBlock = builder.enter('block', _blockId => { + var _a; + const consequent = stmt.get('consequent'); + lowerStatement(builder, consequent); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = consequent.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + let alternateBlock; + const alternate = stmt.get('alternate'); + if (hasNode(alternate)) { + alternateBlock = builder.enter('block', _blockId => { + var _a, _b; + lowerStatement(builder, alternate); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_b = (_a = alternate.node) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + }); + } + else { + alternateBlock = continuationBlock.id; + } + const test = lowerExpressionToTemporary(builder, stmt.get('test')); + const terminal = { + kind: 'if', + test, + consequent: consequentBlock, + alternate: alternateBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_d = stmt.node.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }; + builder.terminateWithContinuation(terminal, continuationBlock); + return; + } + case 'BlockStatement': { + const stmt = stmtPath; + const statements = stmt.get('body'); + const hoistableIdentifiers = new Set(); + for (const [, binding] of Object.entries(stmt.scope.bindings)) { + if (binding.kind !== 'param') { + hoistableIdentifiers.add(binding.identifier); + } + } + for (const s of statements) { + const willHoist = new Set(); + let fnDepth = s.isFunctionDeclaration() ? 1 : 0; + const withFunctionContext = { + enter: () => { + fnDepth++; + }, + exit: () => { + fnDepth--; + }, + }; + s.traverse({ + FunctionExpression: withFunctionContext, + FunctionDeclaration: withFunctionContext, + ArrowFunctionExpression: withFunctionContext, + ObjectMethod: withFunctionContext, + Identifier(id) { + const id2 = id; + if (!id2.isReferencedIdentifier() && + id.parent.type !== 'AssignmentExpression') { + return; + } + const binding = id.scope.getBinding(id.node.name); + if (binding != null && + hoistableIdentifiers.has(binding.identifier) && + (fnDepth > 0 || binding.kind === 'hoisted')) { + willHoist.add(id); + } + }, + }); + s.traverse({ + Identifier(path) { + if (hoistableIdentifiers.has(path.node)) { + hoistableIdentifiers.delete(path.node); + } + }, + }); + for (const id of willHoist) { + const binding = stmt.scope.getBinding(id.node.name); + CompilerError.invariant(binding != null, { + reason: 'Expected to find binding for hoisted identifier', + description: `Could not find a binding for ${id.node.name}`, + suggestions: null, + details: [ + { + kind: 'error', + loc: (_e = id.node.loc) !== null && _e !== void 0 ? _e : GeneratedSource, + message: null, + }, + ], + }); + if (builder.environment.isHoistedIdentifier(binding.identifier)) { + continue; + } + let kind; + if (binding.kind === 'const' || binding.kind === 'var') { + kind = InstructionKind.HoistedConst; + } + else if (binding.kind === 'let') { + kind = InstructionKind.HoistedLet; + } + else if (binding.path.isFunctionDeclaration()) { + kind = InstructionKind.HoistedFunction; + } + else if (!binding.path.isVariableDeclarator()) { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Unsupported declaration type for hoisting', + description: `variable "${binding.identifier.name}" declared with ${binding.path.type}`, + suggestions: null, + loc: (_f = id.parentPath.node.loc) !== null && _f !== void 0 ? _f : GeneratedSource, + }); + continue; + } + else { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Handle non-const declarations for hoisting', + description: `variable "${binding.identifier.name}" declared with ${binding.kind}`, + suggestions: null, + loc: (_g = id.parentPath.node.loc) !== null && _g !== void 0 ? _g : GeneratedSource, + }); + continue; + } + const identifier = builder.resolveIdentifier(id); + CompilerError.invariant(identifier.kind === 'Identifier', { + reason: 'Expected hoisted binding to be a local identifier, not a global', + description: null, + details: [ + { + kind: 'error', + loc: (_h = id.node.loc) !== null && _h !== void 0 ? _h : GeneratedSource, + message: null, + }, + ], + }); + const place = { + effect: Effect.Unknown, + identifier: identifier.identifier, + kind: 'Identifier', + reactive: false, + loc: (_j = id.node.loc) !== null && _j !== void 0 ? _j : GeneratedSource, + }; + lowerValueToTemporary(builder, { + kind: 'DeclareContext', + lvalue: { + kind, + place, + }, + loc: (_k = id.node.loc) !== null && _k !== void 0 ? _k : GeneratedSource, + }); + builder.environment.addHoistedIdentifier(binding.identifier); + } + lowerStatement(builder, s); + } + return; + } + case 'BreakStatement': { + const stmt = stmtPath; + const block = builder.lookupBreak((_m = (_l = stmt.node.label) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : null); + builder.terminate({ + kind: 'goto', + block, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_o = stmt.node.loc) !== null && _o !== void 0 ? _o : GeneratedSource, + }, 'block'); + return; + } + case 'ContinueStatement': { + const stmt = stmtPath; + const block = builder.lookupContinue((_q = (_p = stmt.node.label) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : null); + builder.terminate({ + kind: 'goto', + block, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_r = stmt.node.loc) !== null && _r !== void 0 ? _r : GeneratedSource, + }, 'block'); + return; + } + case 'ForStatement': { + const stmt = stmtPath; + const testBlock = builder.reserve('loop'); + const continuationBlock = builder.reserve('block'); + const initBlock = builder.enter('loop', _blockId => { + var _a, _b, _c, _d; + const init = stmt.get('init'); + if (!init.isVariableDeclaration()) { + builder.errors.push({ + reason: '(BuildHIR::lowerStatement) Handle non-variable initialization in ForStatement', + category: ErrorCategory.Todo, + loc: (_a = stmt.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return { + kind: 'unsupported', + id: makeInstructionId(0), + loc: (_c = (_b = init.node) === null || _b === void 0 ? void 0 : _b.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + }; + } + lowerStatement(builder, init); + return { + kind: 'goto', + block: testBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_d = init.node.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }; + }); + let updateBlock = null; + const update = stmt.get('update'); + if (hasNode(update)) { + updateBlock = builder.enter('loop', _blockId => { + var _a, _b; + lowerExpressionToTemporary(builder, update); + return { + kind: 'goto', + block: testBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_b = (_a = update.node) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + }); + } + const bodyBlock = builder.enter('block', _blockId => { + return builder.loop(label, updateBlock !== null && updateBlock !== void 0 ? updateBlock : testBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: updateBlock !== null && updateBlock !== void 0 ? updateBlock : testBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + builder.terminateWithContinuation({ + kind: 'for', + loc: (_s = stmtNode.loc) !== null && _s !== void 0 ? _s : GeneratedSource, + init: initBlock, + test: testBlock.id, + update: updateBlock, + loop: bodyBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, testBlock); + const test = stmt.get('test'); + if (test.node == null) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle empty test in ForStatement`, + category: ErrorCategory.Todo, + loc: (_t = stmt.node.loc) !== null && _t !== void 0 ? _t : null, + suggestions: null, + }); + } + else { + builder.terminateWithContinuation({ + kind: 'branch', + test: lowerExpressionToTemporary(builder, test), + consequent: bodyBlock, + alternate: continuationBlock.id, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_u = stmt.node.loc) !== null && _u !== void 0 ? _u : GeneratedSource, + }, continuationBlock); + } + return; + } + case 'WhileStatement': { + const stmt = stmtPath; + const conditionalBlock = builder.reserve('loop'); + const continuationBlock = builder.reserve('block'); + const loopBlock = builder.enter('block', _blockId => { + return builder.loop(label, conditionalBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: conditionalBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_v = stmt.node.loc) !== null && _v !== void 0 ? _v : GeneratedSource; + builder.terminateWithContinuation({ + kind: 'while', + loc, + test: conditionalBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, conditionalBlock); + const test = lowerExpressionToTemporary(builder, stmt.get('test')); + const terminal = { + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + fallthrough: conditionalBlock.id, + id: makeInstructionId(0), + loc: (_w = stmt.node.loc) !== null && _w !== void 0 ? _w : GeneratedSource, + }; + builder.terminateWithContinuation(terminal, continuationBlock); + return; + } + case 'LabeledStatement': { + const stmt = stmtPath; + const label = stmt.node.label.name; + const body = stmt.get('body'); + switch (body.node.type) { + case 'ForInStatement': + case 'ForOfStatement': + case 'ForStatement': + case 'WhileStatement': + case 'DoWhileStatement': { + lowerStatement(builder, stmt.get('body'), label); + break; + } + default: { + const continuationBlock = builder.reserve('block'); + const block = builder.enter('block', () => { + var _a; + const body = stmt.get('body'); + builder.label(label, continuationBlock.id, () => { + lowerStatement(builder, body); + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'label', + block, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_x = stmt.node.loc) !== null && _x !== void 0 ? _x : GeneratedSource, + }, continuationBlock); + } + } + return; + } + case 'SwitchStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + let fallthrough = continuationBlock.id; + const cases = []; + let hasDefault = false; + for (let ii = stmt.get('cases').length - 1; ii >= 0; ii--) { + const case_ = stmt.get('cases')[ii]; + const testExpr = case_.get('test'); + if (testExpr.node == null) { + if (hasDefault) { + builder.errors.push({ + reason: `Expected at most one \`default\` branch in a switch statement, this code should have failed to parse`, + category: ErrorCategory.Syntax, + loc: (_y = case_.node.loc) !== null && _y !== void 0 ? _y : null, + suggestions: null, + }); + break; + } + hasDefault = true; + } + const block = builder.enter('block', _blockId => { + return builder.switch(label, continuationBlock.id, () => { + var _a; + case_ + .get('consequent') + .forEach(consequent => lowerStatement(builder, consequent)); + return { + kind: 'goto', + block: fallthrough, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = case_.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + let test = null; + if (hasNode(testExpr)) { + test = lowerReorderableExpression(builder, testExpr); + } + cases.push({ + test, + block, + }); + fallthrough = block; + } + cases.reverse(); + if (!hasDefault) { + cases.push({ test: null, block: continuationBlock.id }); + } + const test = lowerExpressionToTemporary(builder, stmt.get('discriminant')); + builder.terminateWithContinuation({ + kind: 'switch', + test, + cases, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_z = stmt.node.loc) !== null && _z !== void 0 ? _z : GeneratedSource, + }, continuationBlock); + return; + } + case 'VariableDeclaration': { + const stmt = stmtPath; + const nodeKind = stmt.node.kind; + if (nodeKind === 'var') { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle ${nodeKind} kinds in VariableDeclaration`, + category: ErrorCategory.Todo, + loc: (_0 = stmt.node.loc) !== null && _0 !== void 0 ? _0 : null, + suggestions: null, + }); + return; + } + const kind = nodeKind === 'let' ? InstructionKind.Let : InstructionKind.Const; + for (const declaration of stmt.get('declarations')) { + const id = declaration.get('id'); + const init = declaration.get('init'); + if (hasNode(init)) { + const value = lowerExpressionToTemporary(builder, init); + lowerAssignment(builder, (_1 = stmt.node.loc) !== null && _1 !== void 0 ? _1 : GeneratedSource, kind, id, value, id.isObjectPattern() || id.isArrayPattern() + ? 'Destructure' + : 'Assignment'); + } + else if (id.isIdentifier()) { + const binding = builder.resolveIdentifier(id); + if (binding.kind !== 'Identifier') { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Could not find binding for declaration.`, + category: ErrorCategory.Invariant, + loc: (_2 = id.node.loc) !== null && _2 !== void 0 ? _2 : null, + suggestions: null, + }); + } + else { + const place = { + effect: Effect.Unknown, + identifier: binding.identifier, + kind: 'Identifier', + reactive: false, + loc: (_3 = id.node.loc) !== null && _3 !== void 0 ? _3 : GeneratedSource, + }; + if (builder.isContextIdentifier(id)) { + if (kind === InstructionKind.Const) { + const declRangeStart = declaration.parentPath.node.start; + builder.errors.push({ + reason: `Expect \`const\` declaration not to be reassigned`, + category: ErrorCategory.Syntax, + loc: (_4 = id.node.loc) !== null && _4 !== void 0 ? _4 : null, + suggestions: [ + { + description: 'Change to a `let` declaration', + op: CompilerSuggestionOperation.Replace, + range: [declRangeStart, declRangeStart + 5], + text: 'let', + }, + ], + }); + } + lowerValueToTemporary(builder, { + kind: 'DeclareContext', + lvalue: { + kind: InstructionKind.Let, + place, + }, + loc: (_5 = id.node.loc) !== null && _5 !== void 0 ? _5 : GeneratedSource, + }); + } + else { + const typeAnnotation = id.get('typeAnnotation'); + let type; + if (typeAnnotation.isTSTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else if (typeAnnotation.isTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else { + type = null; + } + lowerValueToTemporary(builder, { + kind: 'DeclareLocal', + lvalue: { + kind, + place, + }, + type, + loc: (_6 = id.node.loc) !== null && _6 !== void 0 ? _6 : GeneratedSource, + }); + } + } + } + else { + builder.errors.push({ + reason: `Expected variable declaration to be an identifier if no initializer was provided`, + description: `Got a \`${id.type}\``, + category: ErrorCategory.Syntax, + loc: (_7 = stmt.node.loc) !== null && _7 !== void 0 ? _7 : null, + suggestions: null, + }); + } + } + return; + } + case 'ExpressionStatement': { + const stmt = stmtPath; + const expression = stmt.get('expression'); + lowerExpressionToTemporary(builder, expression); + return; + } + case 'DoWhileStatement': { + const stmt = stmtPath; + const conditionalBlock = builder.reserve('loop'); + const continuationBlock = builder.reserve('block'); + const loopBlock = builder.enter('block', _loopBlockId => { + return builder.loop(label, conditionalBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: conditionalBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_8 = stmt.node.loc) !== null && _8 !== void 0 ? _8 : GeneratedSource; + builder.terminateWithContinuation({ + kind: 'do-while', + loc, + test: conditionalBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, conditionalBlock); + const test = lowerExpressionToTemporary(builder, stmt.get('test')); + const terminal = { + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + fallthrough: conditionalBlock.id, + id: makeInstructionId(0), + loc, + }; + builder.terminateWithContinuation(terminal, continuationBlock); + return; + } + case 'FunctionDeclaration': { + const stmt = stmtPath; + stmt.skip(); + CompilerError.invariant(stmt.get('id').type === 'Identifier', { + reason: 'function declarations must have a name', + description: null, + details: [ + { + kind: 'error', + loc: (_9 = stmt.node.loc) !== null && _9 !== void 0 ? _9 : null, + message: null, + }, + ], + suggestions: null, + }); + const id = stmt.get('id'); + const fn = lowerValueToTemporary(builder, lowerFunctionToValue(builder, stmt)); + lowerAssignment(builder, (_10 = stmt.node.loc) !== null && _10 !== void 0 ? _10 : GeneratedSource, InstructionKind.Function, id, fn, 'Assignment'); + return; + } + case 'ForOfStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const initBlock = builder.reserve('loop'); + const testBlock = builder.reserve('loop'); + if (stmt.node.await) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle for-await loops`, + category: ErrorCategory.Todo, + loc: (_11 = stmt.node.loc) !== null && _11 !== void 0 ? _11 : null, + suggestions: null, + }); + return; + } + const loopBlock = builder.enter('block', _blockId => { + return builder.loop(label, initBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: initBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_12 = stmt.node.loc) !== null && _12 !== void 0 ? _12 : GeneratedSource; + const value = lowerExpressionToTemporary(builder, stmt.get('right')); + builder.terminateWithContinuation({ + kind: 'for-of', + loc, + init: initBlock.id, + test: testBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, initBlock); + const iterator = lowerValueToTemporary(builder, { + kind: 'GetIterator', + loc: value.loc, + collection: Object.assign({}, value), + }); + builder.terminateWithContinuation({ + id: makeInstructionId(0), + kind: 'goto', + block: testBlock.id, + variant: GotoVariant.Break, + loc: (_13 = stmt.node.loc) !== null && _13 !== void 0 ? _13 : GeneratedSource, + }, testBlock); + const left = stmt.get('left'); + const leftLoc = (_14 = left.node.loc) !== null && _14 !== void 0 ? _14 : GeneratedSource; + let test; + const advanceIterator = lowerValueToTemporary(builder, { + kind: 'IteratorNext', + loc: leftLoc, + iterator: Object.assign({}, iterator), + collection: Object.assign({}, value), + }); + if (left.isVariableDeclaration()) { + const declarations = left.get('declarations'); + CompilerError.invariant(declarations.length === 1, { + reason: `Expected only one declaration in the init of a ForOfStatement, got ${declarations.length}`, + description: null, + details: [ + { + kind: 'error', + loc: (_15 = left.node.loc) !== null && _15 !== void 0 ? _15 : null, + message: null, + }, + ], + suggestions: null, + }); + const id = declarations[0].get('id'); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Let, id, advanceIterator, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + else { + CompilerError.invariant(left.isLVal(), { + reason: 'Expected ForOf init to be a variable declaration or lval', + description: null, + details: [ + { + kind: 'error', + loc: leftLoc, + message: null, + }, + ], + }); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Reassign, left, advanceIterator, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + builder.terminateWithContinuation({ + id: makeInstructionId(0), + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + loc: (_16 = stmt.node.loc) !== null && _16 !== void 0 ? _16 : GeneratedSource, + fallthrough: continuationBlock.id, + }, continuationBlock); + return; + } + case 'ForInStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const initBlock = builder.reserve('loop'); + const loopBlock = builder.enter('block', _blockId => { + return builder.loop(label, initBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: initBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_17 = stmt.node.loc) !== null && _17 !== void 0 ? _17 : GeneratedSource; + const value = lowerExpressionToTemporary(builder, stmt.get('right')); + builder.terminateWithContinuation({ + kind: 'for-in', + loc, + init: initBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, initBlock); + const left = stmt.get('left'); + const leftLoc = (_18 = left.node.loc) !== null && _18 !== void 0 ? _18 : GeneratedSource; + let test; + const nextPropertyTemp = lowerValueToTemporary(builder, { + kind: 'NextPropertyOf', + loc: leftLoc, + value, + }); + if (left.isVariableDeclaration()) { + const declarations = left.get('declarations'); + CompilerError.invariant(declarations.length === 1, { + reason: `Expected only one declaration in the init of a ForInStatement, got ${declarations.length}`, + description: null, + details: [ + { + kind: 'error', + loc: (_19 = left.node.loc) !== null && _19 !== void 0 ? _19 : null, + message: null, + }, + ], + suggestions: null, + }); + const id = declarations[0].get('id'); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Let, id, nextPropertyTemp, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + else { + CompilerError.invariant(left.isLVal(), { + reason: 'Expected ForIn init to be a variable declaration or lval', + description: null, + details: [ + { + kind: 'error', + loc: leftLoc, + message: null, + }, + ], + }); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Reassign, left, nextPropertyTemp, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + builder.terminateWithContinuation({ + id: makeInstructionId(0), + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + fallthrough: continuationBlock.id, + loc: (_20 = stmt.node.loc) !== null && _20 !== void 0 ? _20 : GeneratedSource, + }, continuationBlock); + return; + } + case 'DebuggerStatement': { + const stmt = stmtPath; + const loc = (_21 = stmt.node.loc) !== null && _21 !== void 0 ? _21 : GeneratedSource; + builder.push({ + id: makeInstructionId(0), + lvalue: buildTemporaryPlace(builder, loc), + value: { + kind: 'Debugger', + loc, + }, + effects: null, + loc, + }); + return; + } + case 'EmptyStatement': { + return; + } + case 'TryStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const handlerPath = stmt.get('handler'); + if (!hasNode(handlerPath)) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle TryStatement without a catch clause`, + category: ErrorCategory.Todo, + loc: (_22 = stmt.node.loc) !== null && _22 !== void 0 ? _22 : null, + suggestions: null, + }); + return; + } + if (hasNode(stmt.get('finalizer'))) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle TryStatement with a finalizer ('finally') clause`, + category: ErrorCategory.Todo, + loc: (_23 = stmt.node.loc) !== null && _23 !== void 0 ? _23 : null, + suggestions: null, + }); + } + const handlerBindingPath = handlerPath.get('param'); + let handlerBinding = null; + if (hasNode(handlerBindingPath)) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary((_24 = handlerBindingPath.node.loc) !== null && _24 !== void 0 ? _24 : GeneratedSource), + effect: Effect.Unknown, + reactive: false, + loc: (_25 = handlerBindingPath.node.loc) !== null && _25 !== void 0 ? _25 : GeneratedSource, + }; + promoteTemporary(place.identifier); + lowerValueToTemporary(builder, { + kind: 'DeclareLocal', + lvalue: { + kind: InstructionKind.Catch, + place: Object.assign({}, place), + }, + type: null, + loc: (_26 = handlerBindingPath.node.loc) !== null && _26 !== void 0 ? _26 : GeneratedSource, + }); + handlerBinding = { + path: handlerBindingPath, + place, + }; + } + const handler = builder.enter('catch', _blockId => { + var _a, _b; + if (handlerBinding !== null) { + lowerAssignment(builder, (_a = handlerBinding.path.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, InstructionKind.Catch, handlerBinding.path, Object.assign({}, handlerBinding.place), 'Assignment'); + } + lowerStatement(builder, handlerPath.get('body')); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_b = handlerPath.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + }); + const block = builder.enter('block', _blockId => { + var _a; + const block = stmt.get('block'); + builder.enterTryCatch(handler, () => { + lowerStatement(builder, block); + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Try, + id: makeInstructionId(0), + loc: (_a = block.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'try', + block, + handlerBinding: handlerBinding !== null ? Object.assign({}, handlerBinding.place) : null, + handler, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_27 = stmt.node.loc) !== null && _27 !== void 0 ? _27 : GeneratedSource, + }, continuationBlock); + return; + } + case 'WithStatement': { + builder.errors.push({ + reason: `JavaScript 'with' syntax is not supported`, + description: `'with' syntax is considered deprecated and removed from JavaScript standards, consider alternatives`, + category: ErrorCategory.UnsupportedSyntax, + loc: (_28 = stmtPath.node.loc) !== null && _28 !== void 0 ? _28 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_29 = stmtPath.node.loc) !== null && _29 !== void 0 ? _29 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'ClassDeclaration': { + builder.errors.push({ + reason: 'Inline `class` declarations are not supported', + description: `Move class declarations outside of components/hooks`, + category: ErrorCategory.UnsupportedSyntax, + loc: (_30 = stmtPath.node.loc) !== null && _30 !== void 0 ? _30 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_31 = stmtPath.node.loc) !== null && _31 !== void 0 ? _31 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'EnumDeclaration': + case 'TSEnumDeclaration': { + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_32 = stmtPath.node.loc) !== null && _32 !== void 0 ? _32 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'ExportAllDeclaration': + case 'ExportDefaultDeclaration': + case 'ExportNamedDeclaration': + case 'ImportDeclaration': + case 'TSExportAssignment': + case 'TSImportEqualsDeclaration': { + builder.errors.push({ + reason: 'JavaScript `import` and `export` statements may only appear at the top level of a module', + category: ErrorCategory.Syntax, + loc: (_33 = stmtPath.node.loc) !== null && _33 !== void 0 ? _33 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_34 = stmtPath.node.loc) !== null && _34 !== void 0 ? _34 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'TSNamespaceExportDeclaration': { + builder.errors.push({ + reason: 'TypeScript `namespace` statements may only appear at the top level of a module', + category: ErrorCategory.Syntax, + loc: (_35 = stmtPath.node.loc) !== null && _35 !== void 0 ? _35 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_36 = stmtPath.node.loc) !== null && _36 !== void 0 ? _36 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'DeclareClass': + case 'DeclareExportAllDeclaration': + case 'DeclareExportDeclaration': + case 'DeclareFunction': + case 'DeclareInterface': + case 'DeclareModule': + case 'DeclareModuleExports': + case 'DeclareOpaqueType': + case 'DeclareTypeAlias': + case 'DeclareVariable': + case 'InterfaceDeclaration': + case 'OpaqueType': + case 'TSDeclareFunction': + case 'TSInterfaceDeclaration': + case 'TSModuleDeclaration': + case 'TSTypeAliasDeclaration': + case 'TypeAlias': { + return; + } + default: { + return assertExhaustive$1(stmtNode, `Unsupported statement kind '${stmtNode.type}'`); + } + } +} +function lowerObjectMethod(builder, property) { + var _a; + const loc = (_a = property.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const loweredFunc = lowerFunction(builder, property); + if (!loweredFunc) { + return { kind: 'UnsupportedNode', node: property.node, loc: loc }; + } + return { + kind: 'ObjectMethod', + loc, + loweredFunc, + }; +} +function lowerObjectPropertyKey(builder, property) { + var _a, _b; + const key = property.get('key'); + if (key.isStringLiteral()) { + return { + kind: 'string', + name: key.node.value, + }; + } + else if (property.node.computed && key.isExpression()) { + if (!key.isIdentifier() && !key.isMemberExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Identifier, got ${key.type} key in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_a = key.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return null; + } + const place = lowerExpressionToTemporary(builder, key); + return { + kind: 'computed', + name: place, + }; + } + else if (key.isIdentifier()) { + return { + kind: 'identifier', + name: key.node.name, + }; + } + else if (key.isNumericLiteral()) { + return { + kind: 'identifier', + name: String(key.node.value), + }; + } + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Identifier, got ${key.type} key in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_b = key.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return null; +} +function lowerExpression(builder, exprPath) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + switch (exprNode.type) { + case 'Identifier': { + const expr = exprPath; + const place = lowerIdentifier(builder, expr); + return { + kind: getLoadKind(builder, expr), + place, + loc: exprLoc, + }; + } + case 'NullLiteral': { + return { + kind: 'Primitive', + value: null, + loc: exprLoc, + }; + } + case 'BooleanLiteral': + case 'NumericLiteral': + case 'StringLiteral': { + const expr = exprPath; + const value = expr.node.value; + return { + kind: 'Primitive', + value, + loc: exprLoc, + }; + } + case 'ObjectExpression': { + const expr = exprPath; + const propertyPaths = expr.get('properties'); + const properties = []; + for (const propertyPath of propertyPaths) { + if (propertyPath.isObjectProperty()) { + const loweredKey = lowerObjectPropertyKey(builder, propertyPath); + if (!loweredKey) { + continue; + } + const valuePath = propertyPath.get('value'); + if (!valuePath.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${valuePath.type} values in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_b = valuePath.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + continue; + } + const value = lowerExpressionToTemporary(builder, valuePath); + properties.push({ + kind: 'ObjectProperty', + type: 'property', + place: value, + key: loweredKey, + }); + } + else if (propertyPath.isSpreadElement()) { + const place = lowerExpressionToTemporary(builder, propertyPath.get('argument')); + properties.push({ + kind: 'Spread', + place, + }); + } + else if (propertyPath.isObjectMethod()) { + if (propertyPath.node.kind !== 'method') { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${propertyPath.node.kind} functions in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_c = propertyPath.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + continue; + } + const method = lowerObjectMethod(builder, propertyPath); + const place = lowerValueToTemporary(builder, method); + const loweredKey = lowerObjectPropertyKey(builder, propertyPath); + if (!loweredKey) { + continue; + } + properties.push({ + kind: 'ObjectProperty', + type: 'method', + place, + key: loweredKey, + }); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${propertyPath.type} properties in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_d = propertyPath.node.loc) !== null && _d !== void 0 ? _d : null, + suggestions: null, + }); + continue; + } + } + return { + kind: 'ObjectExpression', + properties, + loc: exprLoc, + }; + } + case 'ArrayExpression': { + const expr = exprPath; + let elements = []; + for (const element of expr.get('elements')) { + if (element.node == null) { + elements.push({ + kind: 'Hole', + }); + continue; + } + else if (element.isExpression()) { + elements.push(lowerExpressionToTemporary(builder, element)); + } + else if (element.isSpreadElement()) { + const place = lowerExpressionToTemporary(builder, element.get('argument')); + elements.push({ kind: 'Spread', place }); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${element.type} elements in ArrayExpression`, + category: ErrorCategory.Todo, + loc: (_e = element.node.loc) !== null && _e !== void 0 ? _e : null, + suggestions: null, + }); + continue; + } + } + return { + kind: 'ArrayExpression', + elements, + loc: exprLoc, + }; + } + case 'NewExpression': { + const expr = exprPath; + const calleePath = expr.get('callee'); + if (!calleePath.isExpression()) { + builder.errors.push({ + reason: `Expected an expression as the \`new\` expression receiver (v8 intrinsics are not supported)`, + description: `Got a \`${calleePath.node.type}\``, + category: ErrorCategory.Syntax, + loc: (_f = calleePath.node.loc) !== null && _f !== void 0 ? _f : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const callee = lowerExpressionToTemporary(builder, calleePath); + const args = lowerArguments(builder, expr.get('arguments')); + return { + kind: 'NewExpression', + callee, + args, + loc: exprLoc, + }; + } + case 'OptionalCallExpression': { + const expr = exprPath; + return lowerOptionalCallExpression(builder, expr, null); + } + case 'CallExpression': { + const expr = exprPath; + const calleePath = expr.get('callee'); + if (!calleePath.isExpression()) { + builder.errors.push({ + reason: `Expected Expression, got ${calleePath.type} in CallExpression (v8 intrinsics not supported). This error is likely caused by a bug in React Compiler. Please file an issue`, + category: ErrorCategory.Todo, + loc: (_g = calleePath.node.loc) !== null && _g !== void 0 ? _g : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + if (calleePath.isMemberExpression()) { + const memberExpr = lowerMemberExpression(builder, calleePath); + const propertyPlace = lowerValueToTemporary(builder, memberExpr.value); + const args = lowerArguments(builder, expr.get('arguments')); + return { + kind: 'MethodCall', + receiver: memberExpr.object, + property: Object.assign({}, propertyPlace), + args, + loc: exprLoc, + }; + } + else { + const callee = lowerExpressionToTemporary(builder, calleePath); + const args = lowerArguments(builder, expr.get('arguments')); + return { + kind: 'CallExpression', + callee, + args, + loc: exprLoc, + }; + } + } + case 'BinaryExpression': { + const expr = exprPath; + const leftPath = expr.get('left'); + if (!leftPath.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Expression, got ${leftPath.type} lval in BinaryExpression`, + category: ErrorCategory.Todo, + loc: (_h = leftPath.node.loc) !== null && _h !== void 0 ? _h : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const left = lowerExpressionToTemporary(builder, leftPath); + const right = lowerExpressionToTemporary(builder, expr.get('right')); + const operator = expr.node.operator; + if (operator === '|>') { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Pipe operator not supported`, + category: ErrorCategory.Todo, + loc: (_j = leftPath.node.loc) !== null && _j !== void 0 ? _j : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + return { + kind: 'BinaryExpression', + operator, + left, + right, + loc: exprLoc, + }; + } + case 'SequenceExpression': { + const expr = exprPath; + const exprLoc = (_k = expr.node.loc) !== null && _k !== void 0 ? _k : GeneratedSource; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const place = buildTemporaryPlace(builder, exprLoc); + const sequenceBlock = builder.enter('sequence', _ => { + var _a; + let last = null; + for (const item of expr.get('expressions')) { + last = lowerExpressionToTemporary(builder, item); + } + if (last === null) { + builder.errors.push({ + reason: `Expected sequence expression to have at least one expression`, + category: ErrorCategory.Syntax, + loc: (_a = expr.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + else { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: last, + type: null, + loc: exprLoc, + }); + } + return { + kind: 'goto', + id: makeInstructionId(0), + block: continuationBlock.id, + loc: exprLoc, + variant: GotoVariant.Break, + }; + }); + builder.terminateWithContinuation({ + kind: 'sequence', + block: sequenceBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: exprLoc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'ConditionalExpression': { + const expr = exprPath; + const exprLoc = (_l = expr.node.loc) !== null && _l !== void 0 ? _l : GeneratedSource; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const testBlock = builder.reserve('value'); + const place = buildTemporaryPlace(builder, exprLoc); + const consequentBlock = builder.enter('value', _blockId => { + var _a; + const consequentPath = expr.get('consequent'); + const consequent = lowerExpressionToTemporary(builder, consequentPath); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: consequent, + type: null, + loc: exprLoc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = consequentPath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + const alternateBlock = builder.enter('value', _blockId => { + var _a; + const alternatePath = expr.get('alternate'); + const alternate = lowerExpressionToTemporary(builder, alternatePath); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: alternate, + type: null, + loc: exprLoc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = alternatePath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'ternary', + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + test: testBlock.id, + loc: exprLoc, + }, testBlock); + const testPlace = lowerExpressionToTemporary(builder, expr.get('test')); + builder.terminateWithContinuation({ + kind: 'branch', + test: Object.assign({}, testPlace), + consequent: consequentBlock, + alternate: alternateBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: exprLoc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'LogicalExpression': { + const expr = exprPath; + const exprLoc = (_m = expr.node.loc) !== null && _m !== void 0 ? _m : GeneratedSource; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const testBlock = builder.reserve('value'); + const place = buildTemporaryPlace(builder, exprLoc); + const leftPlace = buildTemporaryPlace(builder, (_o = expr.get('left').node.loc) !== null && _o !== void 0 ? _o : GeneratedSource); + const consequent = builder.enter('value', () => { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, leftPlace), + type: null, + loc: leftPlace.loc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: leftPlace.loc, + }; + }); + const alternate = builder.enter('value', () => { + const right = lowerExpressionToTemporary(builder, expr.get('right')); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, right), + type: null, + loc: right.loc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: right.loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'logical', + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + test: testBlock.id, + operator: expr.node.operator, + loc: exprLoc, + }, testBlock); + const leftValue = lowerExpressionToTemporary(builder, expr.get('left')); + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, leftPlace), + value: { + kind: 'LoadLocal', + place: leftValue, + loc: exprLoc, + }, + effects: null, + loc: exprLoc, + }); + builder.terminateWithContinuation({ + kind: 'branch', + test: Object.assign({}, leftPlace), + consequent, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: exprLoc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'AssignmentExpression': { + const expr = exprPath; + const operator = expr.node.operator; + if (operator === '=') { + const left = expr.get('left'); + if (left.isLVal()) { + return lowerAssignment(builder, (_p = left.node.loc) !== null && _p !== void 0 ? _p : GeneratedSource, InstructionKind.Reassign, left, lowerExpressionToTemporary(builder, expr.get('right')), left.isArrayPattern() || left.isObjectPattern() + ? 'Destructure' + : 'Assignment'); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Unsupported syntax on the left side of an AssignmentExpression`, + description: `Expected an LVal, got: ${left.type}`, + category: ErrorCategory.Todo, + loc: (_q = left.node.loc) !== null && _q !== void 0 ? _q : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + } + const operators = { + '+=': '+', + '-=': '-', + '/=': '/', + '%=': '%', + '*=': '*', + '**=': '**', + '&=': '&', + '|=': '|', + '>>=': '>>', + '>>>=': '>>>', + '<<=': '<<', + '^=': '^', + }; + const binaryOperator = operators[operator]; + if (binaryOperator == null) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${operator} operators in AssignmentExpression`, + category: ErrorCategory.Todo, + loc: (_r = expr.node.loc) !== null && _r !== void 0 ? _r : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const left = expr.get('left'); + const leftNode = left.node; + switch (leftNode.type) { + case 'Identifier': { + const leftExpr = left; + const leftPlace = lowerExpressionToTemporary(builder, leftExpr); + const right = lowerExpressionToTemporary(builder, expr.get('right')); + const binaryPlace = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + operator: binaryOperator, + left: leftPlace, + right, + loc: exprLoc, + }); + const binding = builder.resolveIdentifier(leftExpr); + if (binding.kind === 'Identifier') { + const identifier = lowerIdentifier(builder, leftExpr); + const kind = getStoreKind(builder, leftExpr); + if (kind === 'StoreLocal') { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { + place: Object.assign({}, identifier), + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, binaryPlace), + type: null, + loc: exprLoc, + }); + return { kind: 'LoadLocal', place: identifier, loc: exprLoc }; + } + else { + lowerValueToTemporary(builder, { + kind: 'StoreContext', + lvalue: { + place: Object.assign({}, identifier), + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, binaryPlace), + loc: exprLoc, + }); + return { kind: 'LoadContext', place: identifier, loc: exprLoc }; + } + } + else { + const temporary = lowerValueToTemporary(builder, { + kind: 'StoreGlobal', + name: leftExpr.node.name, + value: Object.assign({}, binaryPlace), + loc: exprLoc, + }); + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + } + case 'MemberExpression': { + const leftExpr = left; + const { object, property, value } = lowerMemberExpression(builder, leftExpr); + const previousValuePlace = lowerValueToTemporary(builder, value); + const newValuePlace = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + operator: binaryOperator, + left: Object.assign({}, previousValuePlace), + right: lowerExpressionToTemporary(builder, expr.get('right')), + loc: (_s = leftExpr.node.loc) !== null && _s !== void 0 ? _s : GeneratedSource, + }); + if (typeof property === 'string' || typeof property === 'number') { + return { + kind: 'PropertyStore', + object: Object.assign({}, object), + property: makePropertyLiteral(property), + value: Object.assign({}, newValuePlace), + loc: (_t = leftExpr.node.loc) !== null && _t !== void 0 ? _t : GeneratedSource, + }; + } + else { + return { + kind: 'ComputedStore', + object: Object.assign({}, object), + property: Object.assign({}, property), + value: Object.assign({}, newValuePlace), + loc: (_u = leftExpr.node.loc) !== null && _u !== void 0 ? _u : GeneratedSource, + }; + } + } + default: { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Identifier or MemberExpression, got ${expr.type} lval in AssignmentExpression`, + category: ErrorCategory.Todo, + loc: (_v = expr.node.loc) !== null && _v !== void 0 ? _v : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + } + } + case 'OptionalMemberExpression': { + const expr = exprPath; + const { value } = lowerOptionalMemberExpression(builder, expr, null); + return { kind: 'LoadLocal', place: value, loc: value.loc }; + } + case 'MemberExpression': { + const expr = exprPath; + const { value } = lowerMemberExpression(builder, expr); + const place = lowerValueToTemporary(builder, value); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'JSXElement': { + const expr = exprPath; + const opening = expr.get('openingElement'); + const openingLoc = (_w = opening.node.loc) !== null && _w !== void 0 ? _w : GeneratedSource; + const tag = lowerJsxElementName(builder, opening.get('name')); + const props = []; + for (const attribute of opening.get('attributes')) { + if (attribute.isJSXSpreadAttribute()) { + const argument = lowerExpressionToTemporary(builder, attribute.get('argument')); + props.push({ kind: 'JsxSpreadAttribute', argument }); + continue; + } + if (!attribute.isJSXAttribute()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${attribute.type} attributes in JSXElement`, + category: ErrorCategory.Todo, + loc: (_x = attribute.node.loc) !== null && _x !== void 0 ? _x : null, + suggestions: null, + }); + continue; + } + const namePath = attribute.get('name'); + let propName; + if (namePath.isJSXIdentifier()) { + propName = namePath.node.name; + if (propName.indexOf(':') !== -1) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Unexpected colon in attribute name \`${propName}\``, + category: ErrorCategory.Todo, + loc: (_y = namePath.node.loc) !== null && _y !== void 0 ? _y : null, + suggestions: null, + }); + } + } + else { + CompilerError.invariant(namePath.isJSXNamespacedName(), { + reason: 'Refinement', + description: null, + details: [ + { + kind: 'error', + loc: (_z = namePath.node.loc) !== null && _z !== void 0 ? _z : null, + message: null, + }, + ], + suggestions: null, + }); + const namespace = namePath.node.namespace.name; + const name = namePath.node.name.name; + propName = `${namespace}:${name}`; + } + const valueExpr = attribute.get('value'); + let value; + if (valueExpr.isJSXElement() || valueExpr.isStringLiteral()) { + value = lowerExpressionToTemporary(builder, valueExpr); + } + else if (valueExpr.type == null) { + value = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: true, + loc: (_0 = attribute.node.loc) !== null && _0 !== void 0 ? _0 : GeneratedSource, + }); + } + else { + if (!valueExpr.isJSXExpressionContainer()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${valueExpr.type} attribute values in JSXElement`, + category: ErrorCategory.Todo, + loc: (_2 = (_1 = valueExpr.node) === null || _1 === void 0 ? void 0 : _1.loc) !== null && _2 !== void 0 ? _2 : null, + suggestions: null, + }); + continue; + } + const expression = valueExpr.get('expression'); + if (!expression.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${expression.type} expressions in JSXExpressionContainer within JSXElement`, + category: ErrorCategory.Todo, + loc: (_3 = valueExpr.node.loc) !== null && _3 !== void 0 ? _3 : null, + suggestions: null, + }); + continue; + } + value = lowerExpressionToTemporary(builder, expression); + } + props.push({ kind: 'JsxAttribute', name: propName, place: value }); + } + const isFbt = tag.kind === 'BuiltinTag' && (tag.name === 'fbt' || tag.name === 'fbs'); + if (isFbt) { + const tagName = tag.name; + const openingIdentifier = opening.get('name'); + const tagIdentifier = openingIdentifier.isJSXIdentifier() + ? builder.resolveIdentifier(openingIdentifier) + : null; + if (tagIdentifier != null) { + CompilerError.invariant(tagIdentifier.kind !== 'Identifier', { + reason: `<${tagName}> tags should be module-level imports`, + description: null, + details: [ + { + kind: 'error', + loc: (_4 = openingIdentifier.node.loc) !== null && _4 !== void 0 ? _4 : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + } + const fbtLocations = { + enum: new Array(), + plural: new Array(), + pronoun: new Array(), + }; + expr.traverse({ + JSXClosingElement(path) { + path.skip(); + }, + JSXNamespacedName(path) { + var _a, _b, _c; + if (path.node.namespace.name === tagName) { + switch (path.node.name.name) { + case 'enum': + fbtLocations.enum.push((_a = path.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource); + break; + case 'plural': + fbtLocations.plural.push((_b = path.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource); + break; + case 'pronoun': + fbtLocations.pronoun.push((_c = path.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource); + break; + } + } + }, + }); + for (const [name, locations] of Object.entries(fbtLocations)) { + if (locations.length > 1) { + CompilerError.throwDiagnostic({ + category: ErrorCategory.Todo, + reason: 'Support duplicate fbt tags', + description: `Support \`<${tagName}>\` tags with multiple \`<${tagName}:${name}>\` values`, + details: locations.map(loc => { + return { + kind: 'error', + message: `Multiple \`<${tagName}:${name}>\` tags found`, + loc, + }; + }), + }); + } + } + } + isFbt && builder.fbtDepth++; + const children = expr + .get('children') + .map(child => lowerJsxElement(builder, child)) + .filter(notNull); + isFbt && builder.fbtDepth--; + return { + kind: 'JsxExpression', + tag, + props, + children: children.length === 0 ? null : children, + loc: exprLoc, + openingLoc: openingLoc, + closingLoc: (_6 = (_5 = expr.get('closingElement').node) === null || _5 === void 0 ? void 0 : _5.loc) !== null && _6 !== void 0 ? _6 : GeneratedSource, + }; + } + case 'JSXFragment': { + const expr = exprPath; + const children = expr + .get('children') + .map(child => lowerJsxElement(builder, child)) + .filter(notNull); + return { + kind: 'JsxFragment', + children, + loc: exprLoc, + }; + } + case 'ArrowFunctionExpression': + case 'FunctionExpression': { + const expr = exprPath; + return lowerFunctionToValue(builder, expr); + } + case 'TaggedTemplateExpression': { + const expr = exprPath; + if (expr.get('quasi').get('expressions').length !== 0) { + builder.errors.push({ + reason: '(BuildHIR::lowerExpression) Handle tagged template with interpolations', + category: ErrorCategory.Todo, + loc: (_7 = exprPath.node.loc) !== null && _7 !== void 0 ? _7 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + CompilerError.invariant(expr.get('quasi').get('quasis').length == 1, { + reason: "there should be only one quasi as we don't support interpolations yet", + description: null, + details: [ + { + kind: 'error', + loc: (_8 = expr.node.loc) !== null && _8 !== void 0 ? _8 : null, + message: null, + }, + ], + suggestions: null, + }); + const value = expr.get('quasi').get('quasis').at(0).node.value; + if (value.raw !== value.cooked) { + builder.errors.push({ + reason: '(BuildHIR::lowerExpression) Handle tagged template where cooked value is different from raw value', + category: ErrorCategory.Todo, + loc: (_9 = exprPath.node.loc) !== null && _9 !== void 0 ? _9 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + return { + kind: 'TaggedTemplateExpression', + tag: lowerExpressionToTemporary(builder, expr.get('tag')), + value, + loc: exprLoc, + }; + } + case 'TemplateLiteral': { + const expr = exprPath; + const subexprs = expr.get('expressions'); + const quasis = expr.get('quasis'); + if (subexprs.length !== quasis.length - 1) { + builder.errors.push({ + reason: `Unexpected quasi and subexpression lengths in template literal`, + category: ErrorCategory.Syntax, + loc: (_10 = exprPath.node.loc) !== null && _10 !== void 0 ? _10 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + if (subexprs.some(e => !e.isExpression())) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle TSType in TemplateLiteral.`, + category: ErrorCategory.Todo, + loc: (_11 = exprPath.node.loc) !== null && _11 !== void 0 ? _11 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const subexprPlaces = subexprs.map(e => lowerExpressionToTemporary(builder, e)); + return { + kind: 'TemplateLiteral', + subexprs: subexprPlaces, + quasis: expr.get('quasis').map(q => q.node.value), + loc: exprLoc, + }; + } + case 'UnaryExpression': { + let expr = exprPath; + if (expr.node.operator === 'delete') { + const argument = expr.get('argument'); + if (argument.isMemberExpression()) { + const { object, property } = lowerMemberExpression(builder, argument); + if (typeof property === 'string' || typeof property === 'number') { + return { + kind: 'PropertyDelete', + object, + property: makePropertyLiteral(property), + loc: exprLoc, + }; + } + else { + return { + kind: 'ComputedDelete', + object, + property, + loc: exprLoc, + }; + } + } + else { + builder.errors.push({ + reason: `Only object properties can be deleted`, + category: ErrorCategory.Syntax, + loc: (_12 = expr.node.loc) !== null && _12 !== void 0 ? _12 : null, + suggestions: [ + { + description: 'Remove this line', + range: [expr.node.start, expr.node.end], + op: CompilerSuggestionOperation.Remove, + }, + ], + }); + return { kind: 'UnsupportedNode', node: expr.node, loc: exprLoc }; + } + } + else if (expr.node.operator === 'throw') { + builder.errors.push({ + reason: `Throw expressions are not supported`, + category: ErrorCategory.Syntax, + loc: (_13 = expr.node.loc) !== null && _13 !== void 0 ? _13 : null, + suggestions: [ + { + description: 'Remove this line', + range: [expr.node.start, expr.node.end], + op: CompilerSuggestionOperation.Remove, + }, + ], + }); + return { kind: 'UnsupportedNode', node: expr.node, loc: exprLoc }; + } + else { + return { + kind: 'UnaryExpression', + operator: expr.node.operator, + value: lowerExpressionToTemporary(builder, expr.get('argument')), + loc: exprLoc, + }; + } + } + case 'AwaitExpression': { + let expr = exprPath; + return { + kind: 'Await', + value: lowerExpressionToTemporary(builder, expr.get('argument')), + loc: exprLoc, + }; + } + case 'TypeCastExpression': { + let expr = exprPath; + const typeAnnotation = expr.get('typeAnnotation').get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'cast', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'TSSatisfiesExpression': { + let expr = exprPath; + const typeAnnotation = expr.get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'satisfies', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'TSAsExpression': { + let expr = exprPath; + const typeAnnotation = expr.get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'as', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'UpdateExpression': { + let expr = exprPath; + const argument = expr.get('argument'); + if (argument.isMemberExpression()) { + const binaryOperator = expr.node.operator === '++' ? '+' : '-'; + const leftExpr = argument; + const { object, property, value } = lowerMemberExpression(builder, leftExpr); + const previousValuePlace = lowerValueToTemporary(builder, value); + const updatedValue = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + operator: binaryOperator, + left: Object.assign({}, previousValuePlace), + right: lowerValueToTemporary(builder, { + kind: 'Primitive', + value: 1, + loc: GeneratedSource, + }), + loc: (_14 = leftExpr.node.loc) !== null && _14 !== void 0 ? _14 : GeneratedSource, + }); + let newValuePlace; + if (typeof property === 'string' || typeof property === 'number') { + newValuePlace = lowerValueToTemporary(builder, { + kind: 'PropertyStore', + object: Object.assign({}, object), + property: makePropertyLiteral(property), + value: Object.assign({}, updatedValue), + loc: (_15 = leftExpr.node.loc) !== null && _15 !== void 0 ? _15 : GeneratedSource, + }); + } + else { + newValuePlace = lowerValueToTemporary(builder, { + kind: 'ComputedStore', + object: Object.assign({}, object), + property: Object.assign({}, property), + value: Object.assign({}, updatedValue), + loc: (_16 = leftExpr.node.loc) !== null && _16 !== void 0 ? _16 : GeneratedSource, + }); + } + return { + kind: 'LoadLocal', + place: expr.node.prefix + ? Object.assign({}, newValuePlace) : Object.assign({}, previousValuePlace), + loc: exprLoc, + }; + } + if (!argument.isIdentifier()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle UpdateExpression with ${argument.type} argument`, + category: ErrorCategory.Todo, + loc: (_17 = exprPath.node.loc) !== null && _17 !== void 0 ? _17 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + else if (builder.isContextIdentifier(argument)) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle UpdateExpression to variables captured within lambdas.`, + category: ErrorCategory.Todo, + loc: (_18 = exprPath.node.loc) !== null && _18 !== void 0 ? _18 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const lvalue = lowerIdentifierForAssignment(builder, (_19 = argument.node.loc) !== null && _19 !== void 0 ? _19 : GeneratedSource, InstructionKind.Reassign, argument); + if (lvalue === null) { + if (!builder.errors.hasAnyErrors()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Found an invalid UpdateExpression without a previously reported error`, + category: ErrorCategory.Invariant, + loc: exprLoc, + suggestions: null, + }); + } + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + else if (lvalue.kind === 'Global') { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Support UpdateExpression where argument is a global`, + category: ErrorCategory.Todo, + loc: exprLoc, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const value = lowerIdentifier(builder, argument); + if (expr.node.prefix) { + return { + kind: 'PrefixUpdate', + lvalue, + operation: expr.node.operator, + value, + loc: exprLoc, + }; + } + else { + return { + kind: 'PostfixUpdate', + lvalue, + operation: expr.node.operator, + value, + loc: exprLoc, + }; + } + } + case 'RegExpLiteral': { + let expr = exprPath; + return { + kind: 'RegExpLiteral', + pattern: expr.node.pattern, + flags: expr.node.flags, + loc: (_20 = expr.node.loc) !== null && _20 !== void 0 ? _20 : GeneratedSource, + }; + } + case 'TSInstantiationExpression': + case 'TSNonNullExpression': { + let expr = exprPath; + return lowerExpression(builder, expr.get('expression')); + } + case 'MetaProperty': { + let expr = exprPath; + if (expr.node.meta.name === 'import' && + expr.node.property.name === 'meta') { + return { + kind: 'MetaProperty', + meta: expr.node.meta.name, + property: expr.node.property.name, + loc: (_21 = expr.node.loc) !== null && _21 !== void 0 ? _21 : GeneratedSource, + }; + } + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle MetaProperty expressions other than import.meta`, + category: ErrorCategory.Todo, + loc: (_22 = exprPath.node.loc) !== null && _22 !== void 0 ? _22 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + default: { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${exprPath.type} expressions`, + category: ErrorCategory.Todo, + loc: (_23 = exprPath.node.loc) !== null && _23 !== void 0 ? _23 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + } +} +function lowerOptionalMemberExpression(builder, expr, parentAlternate) { + var _a; + const optional = expr.node.optional; + const loc = (_a = expr.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const place = buildTemporaryPlace(builder, loc); + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const consequent = builder.reserve('value'); + const alternate = parentAlternate !== null + ? parentAlternate + : builder.enter('value', () => { + const temp = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + let object = null; + const testBlock = builder.enter('value', () => { + const objectPath = expr.get('object'); + if (objectPath.isOptionalMemberExpression()) { + const { value } = lowerOptionalMemberExpression(builder, objectPath, alternate); + object = value; + } + else if (objectPath.isOptionalCallExpression()) { + const value = lowerOptionalCallExpression(builder, objectPath, alternate); + object = lowerValueToTemporary(builder, value); + } + else { + object = lowerExpressionToTemporary(builder, objectPath); + } + return { + kind: 'branch', + test: Object.assign({}, object), + consequent: consequent.id, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + CompilerError.invariant(object !== null, { + reason: 'Satisfy type checker', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + builder.enterReserved(consequent, () => { + const { value } = lowerMemberExpression(builder, expr, object); + const temp = lowerValueToTemporary(builder, value); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'optional', + optional, + test: testBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, continuationBlock); + return { object, value: place }; +} +function lowerOptionalCallExpression(builder, expr, parentAlternate) { + var _a; + const optional = expr.node.optional; + const calleePath = expr.get('callee'); + const loc = (_a = expr.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const place = buildTemporaryPlace(builder, loc); + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const consequent = builder.reserve('value'); + const alternate = parentAlternate !== null + ? parentAlternate + : builder.enter('value', () => { + const temp = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + let callee; + const testBlock = builder.enter('value', () => { + if (calleePath.isOptionalCallExpression()) { + const value = lowerOptionalCallExpression(builder, calleePath, alternate); + const valuePlace = lowerValueToTemporary(builder, value); + callee = { + kind: 'CallExpression', + callee: valuePlace, + }; + } + else if (calleePath.isOptionalMemberExpression()) { + const { object, value } = lowerOptionalMemberExpression(builder, calleePath, alternate); + callee = { + kind: 'MethodCall', + receiver: object, + property: value, + }; + } + else if (calleePath.isMemberExpression()) { + const memberExpr = lowerMemberExpression(builder, calleePath); + const propertyPlace = lowerValueToTemporary(builder, memberExpr.value); + callee = { + kind: 'MethodCall', + receiver: memberExpr.object, + property: propertyPlace, + }; + } + else { + callee = { + kind: 'CallExpression', + callee: lowerExpressionToTemporary(builder, calleePath), + }; + } + const testPlace = callee.kind === 'CallExpression' ? callee.callee : callee.property; + return { + kind: 'branch', + test: Object.assign({}, testPlace), + consequent: consequent.id, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.enterReserved(consequent, () => { + const args = lowerArguments(builder, expr.get('arguments')); + const temp = buildTemporaryPlace(builder, loc); + if (callee.kind === 'CallExpression') { + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, temp), + value: { + kind: 'CallExpression', + callee: Object.assign({}, callee.callee), + args, + loc, + }, + effects: null, + loc, + }); + } + else { + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, temp), + value: { + kind: 'MethodCall', + receiver: Object.assign({}, callee.receiver), + property: Object.assign({}, callee.property), + args, + loc, + }, + effects: null, + loc, + }); + } + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'optional', + optional, + test: testBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; +} +function lowerReorderableExpression(builder, expr) { + var _a; + if (!isReorderableExpression(builder, expr, true)) { + builder.errors.push({ + reason: `(BuildHIR::node.lowerReorderableExpression) Expression type \`${expr.type}\` cannot be safely reordered`, + category: ErrorCategory.Todo, + loc: (_a = expr.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + return lowerExpressionToTemporary(builder, expr); +} +function isReorderableExpression(builder, expr, allowLocalIdentifiers) { + switch (expr.node.type) { + case 'Identifier': { + const binding = builder.resolveIdentifier(expr); + if (binding.kind === 'Identifier') { + return allowLocalIdentifiers; + } + else { + return true; + } + } + case 'TSInstantiationExpression': { + const innerExpr = expr.get('expression'); + return isReorderableExpression(builder, innerExpr, allowLocalIdentifiers); + } + case 'RegExpLiteral': + case 'StringLiteral': + case 'NumericLiteral': + case 'NullLiteral': + case 'BooleanLiteral': + case 'BigIntLiteral': { + return true; + } + case 'UnaryExpression': { + const unary = expr; + switch (expr.node.operator) { + case '!': + case '+': + case '-': { + return isReorderableExpression(builder, unary.get('argument'), allowLocalIdentifiers); + } + default: { + return false; + } + } + } + case 'TSAsExpression': + case 'TSNonNullExpression': + case 'TypeCastExpression': { + return isReorderableExpression(builder, expr.get('expression'), allowLocalIdentifiers); + } + case 'LogicalExpression': { + const logical = expr; + return (isReorderableExpression(builder, logical.get('left'), allowLocalIdentifiers) && + isReorderableExpression(builder, logical.get('right'), allowLocalIdentifiers)); + } + case 'ConditionalExpression': { + const conditional = expr; + return (isReorderableExpression(builder, conditional.get('test'), allowLocalIdentifiers) && + isReorderableExpression(builder, conditional.get('consequent'), allowLocalIdentifiers) && + isReorderableExpression(builder, conditional.get('alternate'), allowLocalIdentifiers)); + } + case 'ArrayExpression': { + return expr + .get('elements') + .every(element => element.isExpression() && + isReorderableExpression(builder, element, allowLocalIdentifiers)); + } + case 'ObjectExpression': { + return expr + .get('properties') + .every(property => { + if (!property.isObjectProperty() || property.node.computed) { + return false; + } + const value = property.get('value'); + return (value.isExpression() && + isReorderableExpression(builder, value, allowLocalIdentifiers)); + }); + } + case 'MemberExpression': { + const test = expr; + let innerObject = test; + while (innerObject.isMemberExpression()) { + innerObject = innerObject.get('object'); + } + if (innerObject.isIdentifier() && + builder.resolveIdentifier(innerObject).kind !== 'Identifier') { + return true; + } + else { + return false; + } + } + case 'ArrowFunctionExpression': { + const fn = expr; + const body = fn.get('body'); + if (body.node.type === 'BlockStatement') { + return body.node.body.length === 0; + } + else { + invariant(body.isExpression(), 'Expected an expression'); + return isReorderableExpression(builder, body, false); + } + } + case 'CallExpression': { + const call = expr; + const callee = call.get('callee'); + return (callee.isExpression() && + isReorderableExpression(builder, callee, allowLocalIdentifiers) && + call + .get('arguments') + .every(arg => arg.isExpression() && + isReorderableExpression(builder, arg, allowLocalIdentifiers))); + } + default: { + return false; + } + } +} +function lowerArguments(builder, expr) { + var _a; + let args = []; + for (const argPath of expr) { + if (argPath.isSpreadElement()) { + args.push({ + kind: 'Spread', + place: lowerExpressionToTemporary(builder, argPath.get('argument')), + }); + } + else if (argPath.isExpression()) { + args.push(lowerExpressionToTemporary(builder, argPath)); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${argPath.type} arguments in CallExpression`, + category: ErrorCategory.Todo, + loc: (_a = argPath.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + } + return args; +} +function lowerMemberExpression(builder, expr, loweredObject = null) { + var _a, _b, _c; + const exprNode = expr.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const objectNode = expr.get('object'); + const propertyNode = expr.get('property'); + const object = loweredObject !== null && loweredObject !== void 0 ? loweredObject : lowerExpressionToTemporary(builder, objectNode); + if (!expr.node.computed || expr.node.property.type === 'NumericLiteral') { + let property; + if (propertyNode.isIdentifier()) { + property = makePropertyLiteral(propertyNode.node.name); + } + else if (propertyNode.isNumericLiteral()) { + property = makePropertyLiteral(propertyNode.node.value); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerMemberExpression) Handle ${propertyNode.type} property`, + category: ErrorCategory.Todo, + loc: (_b = propertyNode.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return { + object, + property: propertyNode.toString(), + value: { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }, + }; + } + const value = { + kind: 'PropertyLoad', + object: Object.assign({}, object), + property, + loc: exprLoc, + }; + return { object, property, value }; + } + else { + if (!propertyNode.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerMemberExpression) Expected Expression, got ${propertyNode.type} property`, + category: ErrorCategory.Todo, + loc: (_c = propertyNode.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + return { + object, + property: propertyNode.toString(), + value: { + kind: 'UnsupportedNode', + node: exprNode, + loc: exprLoc, + }, + }; + } + const property = lowerExpressionToTemporary(builder, propertyNode); + const value = { + kind: 'ComputedLoad', + object: Object.assign({}, object), + property: Object.assign({}, property), + loc: exprLoc, + }; + return { object, property, value }; + } +} +function lowerJsxElementName(builder, exprPath) { + var _a, _b, _c; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + if (exprPath.isJSXIdentifier()) { + const tag = exprPath.node.name; + if (tag.match(/^[A-Z]/)) { + const kind = getLoadKind(builder, exprPath); + return lowerValueToTemporary(builder, { + kind: kind, + place: lowerIdentifier(builder, exprPath), + loc: exprLoc, + }); + } + else { + return { + kind: 'BuiltinTag', + name: tag, + loc: exprLoc, + }; + } + } + else if (exprPath.isJSXMemberExpression()) { + return lowerJsxMemberExpression(builder, exprPath); + } + else if (exprPath.isJSXNamespacedName()) { + const namespace = exprPath.node.namespace.name; + const name = exprPath.node.name.name; + const tag = `${namespace}:${name}`; + if (namespace.indexOf(':') !== -1 || name.indexOf(':') !== -1) { + builder.errors.push({ + reason: `Expected JSXNamespacedName to have no colons in the namespace or name`, + description: `Got \`${namespace}\` : \`${name}\``, + category: ErrorCategory.Syntax, + loc: (_b = exprPath.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + } + const place = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: tag, + loc: exprLoc, + }); + return place; + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerJsxElementName) Handle ${exprPath.type} tags`, + category: ErrorCategory.Todo, + loc: (_c = exprPath.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + return lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + node: exprNode, + loc: exprLoc, + }); + } +} +function lowerJsxMemberExpression(builder, exprPath) { + var _a, _b, _c; + const loc = (_a = exprPath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const object = exprPath.get('object'); + let objectPlace; + if (object.isJSXMemberExpression()) { + objectPlace = lowerJsxMemberExpression(builder, object); + } + else { + CompilerError.invariant(object.isJSXIdentifier(), { + reason: `TypeScript refinement fail: expected 'JsxIdentifier', got \`${object.node.type}\``, + description: null, + details: [ + { + kind: 'error', + loc: (_b = object.node.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + const kind = getLoadKind(builder, object); + objectPlace = lowerValueToTemporary(builder, { + kind: kind, + place: lowerIdentifier(builder, object), + loc: (_c = exprPath.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + }); + } + const property = exprPath.get('property').node.name; + return lowerValueToTemporary(builder, { + kind: 'PropertyLoad', + object: objectPlace, + property: makePropertyLiteral(property), + loc, + }); +} +function lowerJsxElement(builder, exprPath) { + var _a, _b, _c; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + if (exprPath.isJSXElement() || exprPath.isJSXFragment()) { + return lowerExpressionToTemporary(builder, exprPath); + } + else if (exprPath.isJSXExpressionContainer()) { + const expression = exprPath.get('expression'); + if (expression.isJSXEmptyExpression()) { + return null; + } + else { + CompilerError.invariant(expression.isExpression(), { + reason: `(BuildHIR::lowerJsxElement) Expected Expression but found ${expression.type}!`, + description: null, + details: [ + { + kind: 'error', + loc: (_b = expression.node.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + return lowerExpressionToTemporary(builder, expression); + } + } + else if (exprPath.isJSXText()) { + let text; + if (builder.fbtDepth > 0) { + text = exprPath.node.value; + } + else { + text = trimJsxText(exprPath.node.value); + } + if (text === null) { + return null; + } + const place = lowerValueToTemporary(builder, { + kind: 'JSXText', + value: text, + loc: exprLoc, + }); + return place; + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerJsxElement) Unhandled JsxElement, got: ${exprPath.type}`, + category: ErrorCategory.Todo, + loc: (_c = exprPath.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + const place = lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + node: exprNode, + loc: exprLoc, + }); + return place; + } +} +function trimJsxText(original) { + const lines = original.split(/\r\n|\n|\r/); + let lastNonEmptyLine = 0; + for (let i = 0; i < lines.length; i++) { + if (lines[i].match(/[^ \t]/)) { + lastNonEmptyLine = i; + } + } + let str = ''; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const isFirstLine = i === 0; + const isLastLine = i === lines.length - 1; + const isLastNonEmptyLine = i === lastNonEmptyLine; + let trimmedLine = line.replace(/\t/g, ' '); + if (!isFirstLine) { + trimmedLine = trimmedLine.replace(/^[ ]+/, ''); + } + if (!isLastLine) { + trimmedLine = trimmedLine.replace(/[ ]+$/, ''); + } + if (trimmedLine) { + if (!isLastNonEmptyLine) { + trimmedLine += ' '; + } + str += trimmedLine; + } + } + if (str.length !== 0) { + return str; + } + else { + return null; + } +} +function lowerFunctionToValue(builder, expr) { + var _a; + const exprNode = expr.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const loweredFunc = lowerFunction(builder, expr); + if (!loweredFunc) { + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + return { + kind: 'FunctionExpression', + name: loweredFunc.func.id, + nameHint: null, + type: expr.node.type, + loc: exprLoc, + loweredFunc, + }; +} +function lowerFunction(builder, expr) { + const componentScope = builder.environment.parentFunction.scope; + const capturedContext = gatherCapturedContext(expr, componentScope); + const lowering = lower(expr, builder.environment, builder.bindings, new Map([...builder.context, ...capturedContext])); + let loweredFunc; + if (lowering.isErr()) { + const functionErrors = lowering.unwrapErr(); + builder.errors.merge(functionErrors); + return null; + } + loweredFunc = lowering.unwrap(); + return { + func: loweredFunc, + }; +} +function lowerExpressionToTemporary(builder, exprPath) { + const value = lowerExpression(builder, exprPath); + return lowerValueToTemporary(builder, value); +} +function lowerValueToTemporary(builder, value) { + if (value.kind === 'LoadLocal' && value.place.identifier.name === null) { + return value.place; + } + const place = buildTemporaryPlace(builder, value.loc); + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, place), + value: value, + effects: null, + loc: value.loc, + }); + return place; +} +function lowerIdentifier(builder, exprPath) { + var _a, _b; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const binding = builder.resolveIdentifier(exprPath); + switch (binding.kind) { + case 'Identifier': { + const place = { + kind: 'Identifier', + identifier: binding.identifier, + effect: Effect.Unknown, + reactive: false, + loc: exprLoc, + }; + return place; + } + default: { + if (binding.kind === 'Global' && binding.name === 'eval') { + builder.errors.push({ + reason: `The 'eval' function is not supported`, + description: 'Eval is an anti-pattern in JavaScript, and the code executed cannot be evaluated by React Compiler', + category: ErrorCategory.UnsupportedSyntax, + loc: (_b = exprPath.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + } + return lowerValueToTemporary(builder, { + kind: 'LoadGlobal', + binding, + loc: exprLoc, + }); + } + } +} +function buildTemporaryPlace(builder, loc) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary(loc), + effect: Effect.Unknown, + reactive: false, + loc, + }; + return place; +} +function getStoreKind(builder, identifier) { + const isContext = builder.isContextIdentifier(identifier); + return isContext ? 'StoreContext' : 'StoreLocal'; +} +function getLoadKind(builder, identifier) { + const isContext = builder.isContextIdentifier(identifier); + return isContext ? 'LoadContext' : 'LoadLocal'; +} +function lowerIdentifierForAssignment(builder, loc, kind, path) { + var _a, _b; + const binding = builder.resolveIdentifier(path); + if (binding.kind !== 'Identifier') { + if (kind === InstructionKind.Reassign) { + return { kind: 'Global', name: path.node.name }; + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Could not find binding for declaration.`, + category: ErrorCategory.Invariant, + loc: (_a = path.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return null; + } + } + else if (binding.bindingKind === 'const' && + kind === InstructionKind.Reassign) { + builder.errors.push({ + reason: `Cannot reassign a \`const\` variable`, + category: ErrorCategory.Syntax, + loc: (_b = path.node.loc) !== null && _b !== void 0 ? _b : null, + description: binding.identifier.name != null + ? `\`${binding.identifier.name.value}\` is declared as const` + : null, + }); + return null; + } + const place = { + kind: 'Identifier', + identifier: binding.identifier, + effect: Effect.Unknown, + reactive: false, + loc, + }; + return place; +} +function lowerAssignment(builder, loc, kind, lvaluePath, value, assignmentKind) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2; + const lvalueNode = lvaluePath.node; + switch (lvalueNode.type) { + case 'Identifier': { + const lvalue = lvaluePath; + const place = lowerIdentifierForAssignment(builder, loc, kind, lvalue); + if (place === null) { + return { + kind: 'UnsupportedNode', + loc: (_a = lvalue.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + node: lvalue.node, + }; + } + else if (place.kind === 'Global') { + const temporary = lowerValueToTemporary(builder, { + kind: 'StoreGlobal', + name: place.name, + value, + loc, + }); + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + const isHoistedIdentifier = builder.environment.isHoistedIdentifier(lvalue.node); + let temporary; + if (builder.isContextIdentifier(lvalue)) { + if (kind === InstructionKind.Const && !isHoistedIdentifier) { + builder.errors.push({ + reason: `Expected \`const\` declaration not to be reassigned`, + category: ErrorCategory.Syntax, + loc: (_b = lvalue.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + } + if (kind !== InstructionKind.Const && + kind !== InstructionKind.Reassign && + kind !== InstructionKind.Let && + kind !== InstructionKind.Function) { + builder.errors.push({ + reason: `Unexpected context variable kind`, + category: ErrorCategory.Syntax, + loc: (_c = lvalue.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + temporary = lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + node: lvalueNode, + loc: (_d = lvalueNode.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }); + } + else { + temporary = lowerValueToTemporary(builder, { + kind: 'StoreContext', + lvalue: { place: Object.assign({}, place), kind }, + value, + loc, + }); + } + } + else { + const typeAnnotation = lvalue.get('typeAnnotation'); + let type; + if (typeAnnotation.isTSTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else if (typeAnnotation.isTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else { + type = null; + } + temporary = lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { place: Object.assign({}, place), kind }, + value, + type, + loc, + }); + } + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + case 'MemberExpression': { + CompilerError.invariant(kind === InstructionKind.Reassign, { + reason: 'MemberExpression may only appear in an assignment expression', + description: null, + details: [ + { + kind: 'error', + loc: (_e = lvaluePath.node.loc) !== null && _e !== void 0 ? _e : null, + message: null, + }, + ], + suggestions: null, + }); + const lvalue = lvaluePath; + const property = lvalue.get('property'); + const object = lowerExpressionToTemporary(builder, lvalue.get('object')); + if (!lvalue.node.computed || lvalue.get('property').isNumericLiteral()) { + let temporary; + if (property.isIdentifier()) { + temporary = lowerValueToTemporary(builder, { + kind: 'PropertyStore', + object, + property: makePropertyLiteral(property.node.name), + value, + loc, + }); + } + else if (property.isNumericLiteral()) { + temporary = lowerValueToTemporary(builder, { + kind: 'PropertyStore', + object, + property: makePropertyLiteral(property.node.value), + value, + loc, + }); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${property.type} properties in MemberExpression`, + category: ErrorCategory.Todo, + loc: (_f = property.node.loc) !== null && _f !== void 0 ? _f : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: lvalueNode, loc }; + } + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + else { + if (!property.isExpression()) { + builder.errors.push({ + reason: '(BuildHIR::lowerAssignment) Expected private name to appear as a non-computed property', + category: ErrorCategory.Todo, + loc: (_g = property.node.loc) !== null && _g !== void 0 ? _g : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: lvalueNode, loc }; + } + const propertyPlace = lowerExpressionToTemporary(builder, property); + const temporary = lowerValueToTemporary(builder, { + kind: 'ComputedStore', + object, + property: propertyPlace, + value, + loc, + }); + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + } + case 'ArrayPattern': { + const lvalue = lvaluePath; + const elements = lvalue.get('elements'); + const items = []; + const followups = []; + const forceTemporaries = kind === InstructionKind.Reassign && + (elements.some(element => !element.isIdentifier()) || + elements.some(element => element.isIdentifier() && + (getStoreKind(builder, element) !== 'StoreLocal' || + builder.resolveIdentifier(element).kind !== 'Identifier'))); + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + if (element.node == null) { + items.push({ + kind: 'Hole', + }); + continue; + } + if (element.isRestElement()) { + const argument = element.get('argument'); + if (argument.isIdentifier() && + !forceTemporaries && + (assignmentKind === 'Assignment' || + getStoreKind(builder, argument) === 'StoreLocal')) { + const identifier = lowerIdentifierForAssignment(builder, (_h = element.node.loc) !== null && _h !== void 0 ? _h : GeneratedSource, kind, argument); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_j = element.node.loc) !== null && _j !== void 0 ? _j : GeneratedSource, + }); + continue; + } + items.push({ + kind: 'Spread', + place: identifier, + }); + } + else { + const temp = buildTemporaryPlace(builder, (_k = element.node.loc) !== null && _k !== void 0 ? _k : GeneratedSource); + promoteTemporary(temp.identifier); + items.push({ + kind: 'Spread', + place: Object.assign({}, temp), + }); + followups.push({ place: temp, path: argument }); + } + } + else if (element.isIdentifier() && + !forceTemporaries && + (assignmentKind === 'Assignment' || + getStoreKind(builder, element) === 'StoreLocal')) { + const identifier = lowerIdentifierForAssignment(builder, (_l = element.node.loc) !== null && _l !== void 0 ? _l : GeneratedSource, kind, element); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_m = element.node.loc) !== null && _m !== void 0 ? _m : GeneratedSource, + }); + continue; + } + items.push(identifier); + } + else { + const temp = buildTemporaryPlace(builder, (_o = element.node.loc) !== null && _o !== void 0 ? _o : GeneratedSource); + promoteTemporary(temp.identifier); + items.push(Object.assign({}, temp)); + followups.push({ place: temp, path: element }); + } + } + const temporary = lowerValueToTemporary(builder, { + kind: 'Destructure', + lvalue: { + kind, + pattern: { + kind: 'ArrayPattern', + items, + }, + }, + value, + loc, + }); + for (const { place, path } of followups) { + lowerAssignment(builder, (_p = path.node.loc) !== null && _p !== void 0 ? _p : loc, kind, path, place, assignmentKind); + } + return { kind: 'LoadLocal', place: temporary, loc: value.loc }; + } + case 'ObjectPattern': { + const lvalue = lvaluePath; + const propertiesPaths = lvalue.get('properties'); + const properties = []; + const followups = []; + const forceTemporaries = kind === InstructionKind.Reassign && + propertiesPaths.some(property => property.isRestElement() || + (property.isObjectProperty() && + (!property.get('value').isIdentifier() || + builder.resolveIdentifier(property.get('value')).kind !== 'Identifier'))); + for (let i = 0; i < propertiesPaths.length; i++) { + const property = propertiesPaths[i]; + if (property.isRestElement()) { + const argument = property.get('argument'); + if (!argument.isIdentifier()) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${argument.node.type} rest element in ObjectPattern`, + category: ErrorCategory.Todo, + loc: (_q = argument.node.loc) !== null && _q !== void 0 ? _q : null, + suggestions: null, + }); + continue; + } + if (forceTemporaries || + getStoreKind(builder, argument) === 'StoreContext') { + const temp = buildTemporaryPlace(builder, (_r = property.node.loc) !== null && _r !== void 0 ? _r : GeneratedSource); + promoteTemporary(temp.identifier); + properties.push({ + kind: 'Spread', + place: Object.assign({}, temp), + }); + followups.push({ place: temp, path: argument }); + } + else { + const identifier = lowerIdentifierForAssignment(builder, (_s = property.node.loc) !== null && _s !== void 0 ? _s : GeneratedSource, kind, argument); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_t = property.node.loc) !== null && _t !== void 0 ? _t : GeneratedSource, + }); + continue; + } + properties.push({ + kind: 'Spread', + place: identifier, + }); + } + } + else { + if (!property.isObjectProperty()) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${property.type} properties in ObjectPattern`, + category: ErrorCategory.Todo, + loc: (_u = property.node.loc) !== null && _u !== void 0 ? _u : null, + suggestions: null, + }); + continue; + } + if (property.node.computed) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle computed properties in ObjectPattern`, + category: ErrorCategory.Todo, + loc: (_v = property.node.loc) !== null && _v !== void 0 ? _v : null, + suggestions: null, + }); + continue; + } + const loweredKey = lowerObjectPropertyKey(builder, property); + if (!loweredKey) { + continue; + } + const element = property.get('value'); + if (!element.isLVal()) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Expected object property value to be an LVal, got: ${element.type}`, + category: ErrorCategory.Todo, + loc: (_w = element.node.loc) !== null && _w !== void 0 ? _w : null, + suggestions: null, + }); + continue; + } + if (element.isIdentifier() && + !forceTemporaries && + (assignmentKind === 'Assignment' || + getStoreKind(builder, element) === 'StoreLocal')) { + const identifier = lowerIdentifierForAssignment(builder, (_x = element.node.loc) !== null && _x !== void 0 ? _x : GeneratedSource, kind, element); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_y = element.node.loc) !== null && _y !== void 0 ? _y : GeneratedSource, + }); + continue; + } + properties.push({ + kind: 'ObjectProperty', + type: 'property', + place: identifier, + key: loweredKey, + }); + } + else { + const temp = buildTemporaryPlace(builder, (_z = element.node.loc) !== null && _z !== void 0 ? _z : GeneratedSource); + promoteTemporary(temp.identifier); + properties.push({ + kind: 'ObjectProperty', + type: 'property', + place: Object.assign({}, temp), + key: loweredKey, + }); + followups.push({ place: temp, path: element }); + } + } + } + const temporary = lowerValueToTemporary(builder, { + kind: 'Destructure', + lvalue: { + kind, + pattern: { + kind: 'ObjectPattern', + properties, + }, + }, + value, + loc, + }); + for (const { place, path } of followups) { + lowerAssignment(builder, (_0 = path.node.loc) !== null && _0 !== void 0 ? _0 : loc, kind, path, place, assignmentKind); + } + return { kind: 'LoadLocal', place: temporary, loc: value.loc }; + } + case 'AssignmentPattern': { + const lvalue = lvaluePath; + const loc = (_1 = lvalue.node.loc) !== null && _1 !== void 0 ? _1 : GeneratedSource; + const temp = buildTemporaryPlace(builder, loc); + const testBlock = builder.reserve('value'); + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const consequent = builder.enter('value', () => { + const defaultValue = lowerReorderableExpression(builder, lvalue.get('right')); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, temp) }, + value: Object.assign({}, defaultValue), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + const alternate = builder.enter('value', () => { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, temp) }, + value: Object.assign({}, value), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'ternary', + test: testBlock.id, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, testBlock); + const undef = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc, + }); + const test = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + left: Object.assign({}, value), + operator: '===', + right: Object.assign({}, undef), + loc, + }); + builder.terminateWithContinuation({ + kind: 'branch', + test: Object.assign({}, test), + consequent, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, continuationBlock); + return lowerAssignment(builder, loc, kind, lvalue.get('left'), temp, assignmentKind); + } + default: { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${lvaluePath.type} assignments`, + category: ErrorCategory.Todo, + loc: (_2 = lvaluePath.node.loc) !== null && _2 !== void 0 ? _2 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: lvalueNode, loc }; + } + } +} +function captureScopes({ from, to }) { + let scopes = new Set(); + while (from) { + scopes.add(from); + if (from === to) { + break; + } + from = from.parent; + } + return scopes; +} +function gatherCapturedContext(fn, componentScope) { + const capturedIds = new Map(); + const pureScopes = captureScopes({ + from: fn.scope.parent, + to: componentScope, + }); + function handleMaybeDependency(path) { + var _a, _b; + let baseIdentifier; + if (path.isJSXOpeningElement()) { + const name = path.get('name'); + if (!(name.isJSXMemberExpression() || name.isJSXIdentifier())) { + return; + } + let current = name; + while (current.isJSXMemberExpression()) { + current = current.get('object'); + } + invariant(current.isJSXIdentifier(), 'Invalid logic in gatherCapturedDeps'); + baseIdentifier = current; + } + else { + baseIdentifier = path; + } + path.skip(); + const binding = baseIdentifier.scope.getBinding(baseIdentifier.node.name); + if (binding !== undefined && + pureScopes.has(binding.scope) && + !capturedIds.has(binding.identifier)) { + capturedIds.set(binding.identifier, (_b = (_a = path.node.loc) !== null && _a !== void 0 ? _a : binding.identifier.loc) !== null && _b !== void 0 ? _b : GeneratedSource); + } + } + fn.traverse({ + TypeAnnotation(path) { + path.skip(); + }, + TSTypeAnnotation(path) { + path.skip(); + }, + TypeAlias(path) { + path.skip(); + }, + TSTypeAliasDeclaration(path) { + path.skip(); + }, + Expression(path) { + if (path.isAssignmentExpression()) { + const left = path.get('left'); + if (left.isIdentifier()) { + handleMaybeDependency(left); + } + return; + } + else if (path.isJSXElement()) { + handleMaybeDependency(path.get('openingElement')); + } + else if (path.isIdentifier()) { + handleMaybeDependency(path); + } + }, + }); + return capturedIds; +} +function notNull(value) { + return value !== null; +} +function lowerType(node) { + switch (node.type) { + case 'GenericTypeAnnotation': { + const id = node.id; + if (id.type === 'Identifier' && id.name === 'Array') { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + return makeType(); + } + case 'TSTypeReference': { + const typeName = node.typeName; + if (typeName.type === 'Identifier' && typeName.name === 'Array') { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + return makeType(); + } + case 'ArrayTypeAnnotation': + case 'TSArrayType': { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + case 'BooleanLiteralTypeAnnotation': + case 'BooleanTypeAnnotation': + case 'NullLiteralTypeAnnotation': + case 'NumberLiteralTypeAnnotation': + case 'NumberTypeAnnotation': + case 'StringLiteralTypeAnnotation': + case 'StringTypeAnnotation': + case 'TSBooleanKeyword': + case 'TSNullKeyword': + case 'TSNumberKeyword': + case 'TSStringKeyword': + case 'TSSymbolKeyword': + case 'TSUndefinedKeyword': + case 'TSVoidKeyword': + case 'VoidTypeAnnotation': { + return { kind: 'Primitive' }; + } + default: { + return makeType(); + } + } +} + +function buildReactiveScopeTerminalsHIR(fn) { + const queuedRewrites = []; + recursivelyTraverseItems([...getScopes(fn)], scope => scope.range, { + fallthroughs: new Map(), + rewrites: queuedRewrites, + env: fn.env, + }, pushStartScopeTerminal, pushEndScopeTerminal); + const rewrittenFinalBlocks = new Map(); + const nextBlocks = new Map(); + queuedRewrites.reverse(); + for (const [, block] of fn.body.blocks) { + const context = { + nextBlockId: block.id, + rewrites: [], + nextPreds: block.preds, + instrSliceIdx: 0, + source: block, + }; + for (let i = 0; i < block.instructions.length + 1; i++) { + const instrId = i < block.instructions.length + ? block.instructions[i].id + : block.terminal.id; + let rewrite = queuedRewrites.at(-1); + while (rewrite != null && rewrite.instrId <= instrId) { + handleRewrite(rewrite, i, context); + queuedRewrites.pop(); + rewrite = queuedRewrites.at(-1); + } + } + if (context.rewrites.length > 0) { + const finalBlock = { + id: context.nextBlockId, + kind: block.kind, + preds: context.nextPreds, + terminal: block.terminal, + instructions: block.instructions.slice(context.instrSliceIdx), + phis: new Set(), + }; + context.rewrites.push(finalBlock); + for (const b of context.rewrites) { + nextBlocks.set(b.id, b); + } + rewrittenFinalBlocks.set(block.id, finalBlock.id); + } + else { + nextBlocks.set(block.id, block); + } + } + const originalBlocks = fn.body.blocks; + fn.body.blocks = nextBlocks; + for (const [, block] of originalBlocks) { + for (const phi of block.phis) { + for (const [originalId, value] of phi.operands) { + const newId = rewrittenFinalBlocks.get(originalId); + if (newId != null) { + phi.operands.delete(originalId); + phi.operands.set(newId, value); + } + } + } + } + reversePostorderBlocks(fn.body); + markPredecessors(fn.body); + markInstructionIds(fn.body); + fixScopeAndIdentifierRanges(fn.body); +} +function pushStartScopeTerminal(scope, context) { + const blockId = context.env.nextBlockId; + const fallthroughId = context.env.nextBlockId; + context.rewrites.push({ + kind: 'StartScope', + blockId, + fallthroughId, + instrId: scope.range.start, + scope, + }); + context.fallthroughs.set(scope.id, fallthroughId); +} +function pushEndScopeTerminal(scope, context) { + const fallthroughId = context.fallthroughs.get(scope.id); + CompilerError.invariant(fallthroughId != null, { + reason: 'Expected scope to exist', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + context.rewrites.push({ + kind: 'EndScope', + fallthroughId, + instrId: scope.range.end, + }); +} +function handleRewrite(terminalInfo, idx, context) { + const terminal = terminalInfo.kind === 'StartScope' + ? { + kind: 'scope', + fallthrough: terminalInfo.fallthroughId, + block: terminalInfo.blockId, + scope: terminalInfo.scope, + id: terminalInfo.instrId, + loc: GeneratedSource, + } + : { + kind: 'goto', + variant: GotoVariant.Break, + block: terminalInfo.fallthroughId, + id: terminalInfo.instrId, + loc: GeneratedSource, + }; + const currBlockId = context.nextBlockId; + context.rewrites.push({ + kind: context.source.kind, + id: currBlockId, + instructions: context.source.instructions.slice(context.instrSliceIdx, idx), + preds: context.nextPreds, + phis: context.rewrites.length === 0 ? context.source.phis : new Set(), + terminal, + }); + context.nextPreds = new Set([currBlockId]); + context.nextBlockId = + terminalInfo.kind === 'StartScope' + ? terminalInfo.blockId + : terminalInfo.fallthroughId; + context.instrSliceIdx = idx; +} + +var ansiStylesExports = {}; +var ansiStyles = { + get exports(){ return ansiStylesExports; }, + set exports(v){ ansiStylesExports = v; }, +}; + +var conversionsExports = {}; +var conversions = { + get exports(){ return conversionsExports; }, + set exports(v){ conversionsExports = v; }, +}; + +var colorName; +var hasRequiredColorName; + +function requireColorName () { + if (hasRequiredColorName) return colorName; + hasRequiredColorName = 1; + + colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] + }; + return colorName; +} + +var hasRequiredConversions; + +function requireConversions () { + if (hasRequiredConversions) return conversionsExports; + hasRequiredConversions = 1; + var cssKeywords = requireColorName(); + + // NOTE: conversions should only return primitive values (i.e. arrays, or + // values that give correct `typeof` results). + // do not use box values types (i.e. Number(), String(), etc.) + + var reverseKeywords = {}; + for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; + } + } + + var convert = conversions.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} + }; + + // hide .channels and .labels properties + for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } + + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } + + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } + + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } + } + + convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } + + h = Math.min(h * 60, 360); + + if (h < 0) { + h += 360; + } + + l = (min + max) / 2; + + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + + return [h, s * 100, l * 100]; + }; + + convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; + + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; + + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } + + return [ + h * 360, + s * 100, + v * 100 + ]; + }; + + convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); + + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; + }; + + convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + + return [c * 100, m * 100, y * 100, k * 100]; + }; + + /** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ + function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); + } + + convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + + var currentClosestDistance = Infinity; + var currentClosestKeyword; + + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; + + // Compute comparative distance + var distance = comparativeDistance(rgb, value); + + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } + + return currentClosestKeyword; + }; + + convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; + }; + + convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y * 100, z * 100]; + }; + + convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; + }; + + convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; + + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } + + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + + rgb[i] = val * 255; + } + + return rgb; + }; + + convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + + return [h, sv * 100, v * 100]; + }; + + convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; + + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; + + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } + }; + + convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; + + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + + return [h, sl * 100, l * 100]; + }; + + // http://dev.w3.org/csswg/css-color/#hwb-to-rgb + convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + + if ((i & 0x01) !== 0) { + f = 1 - f; + } + + n = wh + f * (v - wh); // linear interpolation + + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; + }; + + convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + + return [r * 255, g * 255, b * 255]; + }; + + convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; + + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; + + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; + }; + + convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; + }; + + convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; + + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; + + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + + x *= 95.047; + y *= 100; + z *= 108.883; + + return [x, y, z]; + }; + + convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + + if (h < 0) { + h += 360; + } + + c = Math.sqrt(a * a + b * b); + + return [l, c, h]; + }; + + convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + + return [l, a, b]; + }; + + convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + + value = Math.round(value / 50); + + if (value === 0) { + return 30; + } + + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + + if (value === 2) { + ansi += 60; + } + + return ansi; + }; + + convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); + }; + + convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } + + if (r > 248) { + return 231; + } + + return Math.round(((r - 8) / 247) * 24) + 232; + } + + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); + + return ansi; + }; + + convert.ansi16.rgb = function (args) { + var color = args % 10; + + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } + + color = color / 10.5 * 255; + + return [color, color, color]; + } + + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; + + return [r, g, b]; + }; + + convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } + + args -= 16; + + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; + + return [r, g, b]; + }; + + convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; + }; + + convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + + var colorString = match[0]; + + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } + + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; + + return [r, g, b]; + }; + + convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; + + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } + + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } + + hue /= 6; + hue %= 1; + + return [hue * 360, chroma * 100, grayscale * 100]; + }; + + convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; + + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } + + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } + + return [hsl[0], c * 100, f * 100]; + }; + + convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; + + var c = s * v; + var f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); + } + + return [hsv[0], c * 100, f * 100]; + }; + + convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } + + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; + + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + + mg = (1.0 - c) * g; + + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; + }; + + convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var v = c + g * (1.0 - c); + var f = 0; + + if (v > 0.0) { + f = c / v; + } + + return [hcg[0], f * 100, v * 100]; + }; + + convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; + + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + + return [hcg[0], s * 100, l * 100]; + }; + + convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; + }; + + convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; + + if (c < 1) { + g = (v - c) / (1 - c); + } + + return [hwb[0], c * 100, g * 100]; + }; + + convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; + }; + + convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; + }; + + convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; + }; + + convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; + }; + + convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; + }; + + convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; + }; + + convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; + }; + + convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; + }; + + convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; + }; + return conversionsExports; +} + +var route; +var hasRequiredRoute; + +function requireRoute () { + if (hasRequiredRoute) return route; + hasRequiredRoute = 1; + var conversions = requireConversions(); + + /* + this function routes a model to all other models. + + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). + + conversions that are not possible simply are not included. + */ + + function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; + } + + // https://en.wikipedia.org/wiki/Breadth-first_search + function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop + + graph[fromModel].distance = 0; + + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); + + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; + } + + function link(from, to) { + return function (args) { + return to(from(args)); + }; + } + + function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; + + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } + + fn.conversion = path; + return fn; + } + + route = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; + + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; + + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; + }; + return route; +} + +var colorConvert; +var hasRequiredColorConvert; + +function requireColorConvert () { + if (hasRequiredColorConvert) return colorConvert; + hasRequiredColorConvert = 1; + var conversions = requireConversions(); + var route = requireRoute(); + + var convert = {}; + + var models = Object.keys(conversions); + + function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + return fn(args); + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; + } + + function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + var result = fn(args); + + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; + } + + models.forEach(function (fromModel) { + convert[fromModel] = {}; + + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); + + var routes = route(fromModel); + var routeModels = Object.keys(routes); + + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); + }); + + colorConvert = convert; + return colorConvert; +} + +var hasRequiredAnsiStyles; + +function requireAnsiStyles () { + if (hasRequiredAnsiStyles) return ansiStylesExports; + hasRequiredAnsiStyles = 1; + (function (module) { + const colorConvert = requireColorConvert(); + + const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; + }; + + const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; + }; + + const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + }; + + function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Fix humans + styles.color.grey = styles.color.gray; + + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; + + for (const styleName of Object.keys(group)) { + const style = group[styleName]; + + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } + + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; + + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; + + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } + + const suite = colorConvert[key]; + + if (key === 'ansi16') { + key = 'ansi'; + } + + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } + + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } + + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + + return styles; + } + + // Make the export immutable + Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles + }); +} (ansiStyles)); + return ansiStylesExports; +} + +var collections = {}; + +var hasRequiredCollections; + +function requireCollections () { + if (hasRequiredCollections) return collections; + hasRequiredCollections = 1; + + Object.defineProperty(collections, '__esModule', { + value: true + }); + collections.printIteratorEntries = printIteratorEntries; + collections.printIteratorValues = printIteratorValues; + collections.printListItems = printListItems; + collections.printObjectProperties = printObjectProperties; + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + * + */ + const getKeysOfEnumerableProperties = object => { + const keys = Object.keys(object).sort(); + + if (Object.getOwnPropertySymbols) { + Object.getOwnPropertySymbols(object).forEach(symbol => { + if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) { + keys.push(symbol); + } + }); + } + + return keys; + }; + /** + * Return entries (for example, of a map) + * with spacing, indentation, and comma + * without surrounding punctuation (for example, braces) + */ + + function printIteratorEntries( // Flow 0.51.0: property `@@iterator` of $Iterator not found in Object + // To allow simplistic getRecordIterator in immutable.js + iterator, + config, + indentation, + depth, + refs, + printer, // Too bad, so sad that separator for ECMAScript Map has been ' => ' + // What a distracting diff if you change a data structure to/from + separator = ': ' + ) { + let result = ''; + let current = iterator.next(); + + if (!current.done) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + while (!current.done) { + const name = printer( + current.value[0], + config, + indentationNext, + depth, + refs + ); + const value = printer( + current.value[1], + config, + indentationNext, + depth, + refs + ); + result += indentationNext + name + separator + value; + current = iterator.next(); + + if (!current.done) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + /** + * Return values (for example, of a set) + * with spacing, indentation, and comma + * without surrounding punctuation (braces or brackets) + */ + + function printIteratorValues( + iterator, + config, + indentation, + depth, + refs, + printer + ) { + let result = ''; + let current = iterator.next(); + + if (!current.done) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + while (!current.done) { + result += + indentationNext + + printer(current.value, config, indentationNext, depth, refs); + current = iterator.next(); + + if (!current.done) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + /** + * Return items (for example, of an array) + * with spacing, indentation, and comma + * without surrounding punctuation (for example, brackets) + **/ + + function printListItems(list, config, indentation, depth, refs, printer) { + let result = ''; + + if (list.length) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + for (let i = 0; i < list.length; i++) { + result += + indentationNext + + printer(list[i], config, indentationNext, depth, refs); + + if (i < list.length - 1) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + /** + * Return properties of an object + * with spacing, indentation, and comma + * without surrounding punctuation (for example, braces) + */ + + function printObjectProperties(val, config, indentation, depth, refs, printer) { + let result = ''; + const keys = getKeysOfEnumerableProperties(val); + + if (keys.length) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const name = printer(key, config, indentationNext, depth, refs); + const value = printer(val[key], config, indentationNext, depth, refs); + result += indentationNext + name + ': ' + value; + + if (i < keys.length - 1) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + return collections; +} + +var AsymmetricMatcher = {}; + +var hasRequiredAsymmetricMatcher; + +function requireAsymmetricMatcher () { + if (hasRequiredAsymmetricMatcher) return AsymmetricMatcher; + hasRequiredAsymmetricMatcher = 1; + + Object.defineProperty(AsymmetricMatcher, '__esModule', { + value: true + }); + AsymmetricMatcher.default = AsymmetricMatcher.test = AsymmetricMatcher.serialize = void 0; + + var _collections = requireCollections(); + + var Symbol = commonjsGlobal['jest-symbol-do-not-touch'] || commonjsGlobal.Symbol; + const asymmetricMatcher = Symbol.for('jest.asymmetricMatcher'); + const SPACE = ' '; + + const serialize = (val, config, indentation, depth, refs, printer) => { + const stringedValue = val.toString(); + + if ( + stringedValue === 'ArrayContaining' || + stringedValue === 'ArrayNotContaining' + ) { + if (++depth > config.maxDepth) { + return '[' + stringedValue + ']'; + } + + return ( + stringedValue + + SPACE + + '[' + + (0, _collections.printListItems)( + val.sample, + config, + indentation, + depth, + refs, + printer + ) + + ']' + ); + } + + if ( + stringedValue === 'ObjectContaining' || + stringedValue === 'ObjectNotContaining' + ) { + if (++depth > config.maxDepth) { + return '[' + stringedValue + ']'; + } + + return ( + stringedValue + + SPACE + + '{' + + (0, _collections.printObjectProperties)( + val.sample, + config, + indentation, + depth, + refs, + printer + ) + + '}' + ); + } + + if ( + stringedValue === 'StringMatching' || + stringedValue === 'StringNotMatching' + ) { + return ( + stringedValue + + SPACE + + printer(val.sample, config, indentation, depth, refs) + ); + } + + if ( + stringedValue === 'StringContaining' || + stringedValue === 'StringNotContaining' + ) { + return ( + stringedValue + + SPACE + + printer(val.sample, config, indentation, depth, refs) + ); + } + + return val.toAsymmetricMatcher(); + }; + + AsymmetricMatcher.serialize = serialize; + + const test = val => val && val.$$typeof === asymmetricMatcher; + + AsymmetricMatcher.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + AsymmetricMatcher.default = _default; + return AsymmetricMatcher; +} + +var ConvertAnsi = {}; + +var ansiRegex; +var hasRequiredAnsiRegex; + +function requireAnsiRegex () { + if (hasRequiredAnsiRegex) return ansiRegex; + hasRequiredAnsiRegex = 1; + + ansiRegex = options => { + options = Object.assign({ + onlyFirst: false + }, options); + + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, options.onlyFirst ? undefined : 'g'); + }; + return ansiRegex; +} + +var hasRequiredConvertAnsi; + +function requireConvertAnsi () { + if (hasRequiredConvertAnsi) return ConvertAnsi; + hasRequiredConvertAnsi = 1; + + Object.defineProperty(ConvertAnsi, '__esModule', { + value: true + }); + ConvertAnsi.default = ConvertAnsi.serialize = ConvertAnsi.test = void 0; + + var _ansiRegex = _interopRequireDefault(requireAnsiRegex()); + + var _ansiStyles = _interopRequireDefault(requireAnsiStyles()); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {default: obj}; + } + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + */ + const toHumanReadableAnsi = text => + text.replace((0, _ansiRegex.default)(), match => { + switch (match) { + case _ansiStyles.default.red.close: + case _ansiStyles.default.green.close: + case _ansiStyles.default.cyan.close: + case _ansiStyles.default.gray.close: + case _ansiStyles.default.white.close: + case _ansiStyles.default.yellow.close: + case _ansiStyles.default.bgRed.close: + case _ansiStyles.default.bgGreen.close: + case _ansiStyles.default.bgYellow.close: + case _ansiStyles.default.inverse.close: + case _ansiStyles.default.dim.close: + case _ansiStyles.default.bold.close: + case _ansiStyles.default.reset.open: + case _ansiStyles.default.reset.close: + return ''; + + case _ansiStyles.default.red.open: + return ''; + + case _ansiStyles.default.green.open: + return ''; + + case _ansiStyles.default.cyan.open: + return ''; + + case _ansiStyles.default.gray.open: + return ''; + + case _ansiStyles.default.white.open: + return ''; + + case _ansiStyles.default.yellow.open: + return ''; + + case _ansiStyles.default.bgRed.open: + return ''; + + case _ansiStyles.default.bgGreen.open: + return ''; + + case _ansiStyles.default.bgYellow.open: + return ''; + + case _ansiStyles.default.inverse.open: + return ''; + + case _ansiStyles.default.dim.open: + return ''; + + case _ansiStyles.default.bold.open: + return ''; + + default: + return ''; + } + }); + + const test = val => + typeof val === 'string' && !!val.match((0, _ansiRegex.default)()); + + ConvertAnsi.test = test; + + const serialize = (val, config, indentation, depth, refs, printer) => + printer(toHumanReadableAnsi(val), config, indentation, depth, refs); + + ConvertAnsi.serialize = serialize; + const plugin = { + serialize, + test + }; + var _default = plugin; + ConvertAnsi.default = _default; + return ConvertAnsi; +} + +var DOMCollection = {}; + +var hasRequiredDOMCollection; + +function requireDOMCollection () { + if (hasRequiredDOMCollection) return DOMCollection; + hasRequiredDOMCollection = 1; + + Object.defineProperty(DOMCollection, '__esModule', { + value: true + }); + DOMCollection.default = DOMCollection.serialize = DOMCollection.test = void 0; + + var _collections = requireCollections(); + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat( + Object.getOwnPropertySymbols(source).filter(function(sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + }) + ); + } + ownKeys.forEach(function(key) { + _defineProperty(target, key, source[key]); + }); + } + return target; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + const SPACE = ' '; + const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap']; + const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/; + + const testName = name => + OBJECT_NAMES.indexOf(name) !== -1 || ARRAY_REGEXP.test(name); + + const test = val => + val && + val.constructor && + val.constructor.name && + testName(val.constructor.name); // Convert array of attribute objects to props object. + + DOMCollection.test = test; + + const propsReducer = (props, attribute) => { + props[attribute.name] = attribute.value; + return props; + }; + + const serialize = (collection, config, indentation, depth, refs, printer) => { + const name = collection.constructor.name; + + if (++depth > config.maxDepth) { + return '[' + name + ']'; + } + + return ( + (config.min ? '' : name + SPACE) + + (OBJECT_NAMES.indexOf(name) !== -1 + ? '{' + + (0, _collections.printObjectProperties)( + name === 'NamedNodeMap' + ? Array.prototype.reduce.call(collection, propsReducer, {}) + : _objectSpread({}, collection), + config, + indentation, + depth, + refs, + printer + ) + + '}' + : '[' + + (0, _collections.printListItems)( + Array.from(collection), + config, + indentation, + depth, + refs, + printer + ) + + ']') + ); + }; + + DOMCollection.serialize = serialize; + const plugin = { + serialize, + test + }; + var _default = plugin; + DOMCollection.default = _default; + return DOMCollection; +} + +var DOMElement = {}; + +var markup = {}; + +var escapeHTML = {}; + +var hasRequiredEscapeHTML; + +function requireEscapeHTML () { + if (hasRequiredEscapeHTML) return escapeHTML; + hasRequiredEscapeHTML = 1; + + Object.defineProperty(escapeHTML, '__esModule', { + value: true + }); + escapeHTML.default = escapeHTML$1; + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + */ + function escapeHTML$1(str) { + return str.replace(//g, '>'); + } + return escapeHTML; +} + +var hasRequiredMarkup; + +function requireMarkup () { + if (hasRequiredMarkup) return markup; + hasRequiredMarkup = 1; + + Object.defineProperty(markup, '__esModule', { + value: true + }); + markup.printElementAsLeaf = markup.printElement = markup.printComment = markup.printText = markup.printChildren = markup.printProps = void 0; + + var _escapeHTML = _interopRequireDefault(requireEscapeHTML()); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {default: obj}; + } + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + */ + // Return empty string if keys is empty. + const printProps = (keys, props, config, indentation, depth, refs, printer) => { + const indentationNext = indentation + config.indent; + const colors = config.colors; + return keys + .map(key => { + const value = props[key]; + let printed = printer(value, config, indentationNext, depth, refs); + + if (typeof value !== 'string') { + if (printed.indexOf('\n') !== -1) { + printed = + config.spacingOuter + + indentationNext + + printed + + config.spacingOuter + + indentation; + } + + printed = '{' + printed + '}'; + } + + return ( + config.spacingInner + + indentation + + colors.prop.open + + key + + colors.prop.close + + '=' + + colors.value.open + + printed + + colors.value.close + ); + }) + .join(''); + }; // Return empty string if children is empty. + + markup.printProps = printProps; + + const printChildren = (children, config, indentation, depth, refs, printer) => + children + .map( + child => + config.spacingOuter + + indentation + + (typeof child === 'string' + ? printText(child, config) + : printer(child, config, indentation, depth, refs)) + ) + .join(''); + + markup.printChildren = printChildren; + + const printText = (text, config) => { + const contentColor = config.colors.content; + return ( + contentColor.open + (0, _escapeHTML.default)(text) + contentColor.close + ); + }; + + markup.printText = printText; + + const printComment = (comment, config) => { + const commentColor = config.colors.comment; + return ( + commentColor.open + + '' + + commentColor.close + ); + }; // Separate the functions to format props, children, and element, + // so a plugin could override a particular function, if needed. + // Too bad, so sad: the traditional (but unnecessary) space + // in a self-closing tagColor requires a second test of printedProps. + + markup.printComment = printComment; + + const printElement = ( + type, + printedProps, + printedChildren, + config, + indentation + ) => { + const tagColor = config.colors.tag; + return ( + tagColor.open + + '<' + + type + + (printedProps && + tagColor.close + + printedProps + + config.spacingOuter + + indentation + + tagColor.open) + + (printedChildren + ? '>' + + tagColor.close + + printedChildren + + config.spacingOuter + + indentation + + tagColor.open + + '' + + tagColor.close + ); + }; + + markup.printElement = printElement; + + const printElementAsLeaf = (type, config) => { + const tagColor = config.colors.tag; + return ( + tagColor.open + + '<' + + type + + tagColor.close + + ' …' + + tagColor.open + + ' />' + + tagColor.close + ); + }; + + markup.printElementAsLeaf = printElementAsLeaf; + return markup; +} + +var hasRequiredDOMElement; + +function requireDOMElement () { + if (hasRequiredDOMElement) return DOMElement; + hasRequiredDOMElement = 1; + + Object.defineProperty(DOMElement, '__esModule', { + value: true + }); + DOMElement.default = DOMElement.serialize = DOMElement.test = void 0; + + var _markup = requireMarkup(); + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + */ + const ELEMENT_NODE = 1; + const TEXT_NODE = 3; + const COMMENT_NODE = 8; + const FRAGMENT_NODE = 11; + const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/; + + const testNode = (nodeType, name) => + (nodeType === ELEMENT_NODE && ELEMENT_REGEXP.test(name)) || + (nodeType === TEXT_NODE && name === 'Text') || + (nodeType === COMMENT_NODE && name === 'Comment') || + (nodeType === FRAGMENT_NODE && name === 'DocumentFragment'); + + const test = val => + val && + val.constructor && + val.constructor.name && + testNode(val.nodeType, val.constructor.name); + + DOMElement.test = test; + + function nodeIsText(node) { + return node.nodeType === TEXT_NODE; + } + + function nodeIsComment(node) { + return node.nodeType === COMMENT_NODE; + } + + function nodeIsFragment(node) { + return node.nodeType === FRAGMENT_NODE; + } + + const serialize = (node, config, indentation, depth, refs, printer) => { + if (nodeIsText(node)) { + return (0, _markup.printText)(node.data, config); + } + + if (nodeIsComment(node)) { + return (0, _markup.printComment)(node.data, config); + } + + const type = nodeIsFragment(node) + ? `DocumentFragment` + : node.tagName.toLowerCase(); + + if (++depth > config.maxDepth) { + return (0, _markup.printElementAsLeaf)(type, config); + } + + return (0, _markup.printElement)( + type, + (0, _markup.printProps)( + nodeIsFragment(node) + ? [] + : Array.from(node.attributes) + .map(attr => attr.name) + .sort(), + nodeIsFragment(node) + ? [] + : Array.from(node.attributes).reduce((props, attribute) => { + props[attribute.name] = attribute.value; + return props; + }, {}), + config, + indentation + config.indent, + depth, + refs, + printer + ), + (0, _markup.printChildren)( + Array.prototype.slice.call(node.childNodes || node.children), + config, + indentation + config.indent, + depth, + refs, + printer + ), + config, + indentation + ); + }; + + DOMElement.serialize = serialize; + const plugin = { + serialize, + test + }; + var _default = plugin; + DOMElement.default = _default; + return DOMElement; +} + +var Immutable = {}; + +var hasRequiredImmutable; + +function requireImmutable () { + if (hasRequiredImmutable) return Immutable; + hasRequiredImmutable = 1; + + Object.defineProperty(Immutable, '__esModule', { + value: true + }); + Immutable.default = Immutable.test = Immutable.serialize = void 0; + + var _collections = requireCollections(); + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + */ + // SENTINEL constants are from https://github.com/facebook/immutable-js + const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; + const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; + const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; + const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; + const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4 + + const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; + const IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; + const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; + + const getImmutableName = name => 'Immutable.' + name; + + const printAsLeaf = name => '[' + name + ']'; + + const SPACE = ' '; + const LAZY = '…'; // Seq is lazy if it calls a method like filter + + const printImmutableEntries = ( + val, + config, + indentation, + depth, + refs, + printer, + type + ) => + ++depth > config.maxDepth + ? printAsLeaf(getImmutableName(type)) + : getImmutableName(type) + + SPACE + + '{' + + (0, _collections.printIteratorEntries)( + val.entries(), + config, + indentation, + depth, + refs, + printer + ) + + '}'; // Record has an entries method because it is a collection in immutable v3. + // Return an iterator for Immutable Record from version v3 or v4. + + const getRecordEntries = val => { + let i = 0; + return { + next() { + if (i < val._keys.length) { + const key = val._keys[i++]; + return { + done: false, + value: [key, val.get(key)] + }; + } + + return { + done: true + }; + } + }; + }; + + const printImmutableRecord = ( + val, + config, + indentation, + depth, + refs, + printer + ) => { + // _name property is defined only for an Immutable Record instance + // which was constructed with a second optional descriptive name arg + const name = getImmutableName(val._name || 'Record'); + return ++depth > config.maxDepth + ? printAsLeaf(name) + : name + + SPACE + + '{' + + (0, _collections.printIteratorEntries)( + getRecordEntries(val), + config, + indentation, + depth, + refs, + printer + ) + + '}'; + }; + + const printImmutableSeq = (val, config, indentation, depth, refs, printer) => { + const name = getImmutableName('Seq'); + + if (++depth > config.maxDepth) { + return printAsLeaf(name); + } + + if (val[IS_KEYED_SENTINEL]) { + return ( + name + + SPACE + + '{' + // from Immutable collection of entries or from ECMAScript object + (val._iter || val._object + ? (0, _collections.printIteratorEntries)( + val.entries(), + config, + indentation, + depth, + refs, + printer + ) + : LAZY) + + '}' + ); + } + + return ( + name + + SPACE + + '[' + + (val._iter || // from Immutable collection of values + val._array || // from ECMAScript array + val._collection || // from ECMAScript collection in immutable v4 + val._iterable // from ECMAScript collection in immutable v3 + ? (0, _collections.printIteratorValues)( + val.values(), + config, + indentation, + depth, + refs, + printer + ) + : LAZY) + + ']' + ); + }; + + const printImmutableValues = ( + val, + config, + indentation, + depth, + refs, + printer, + type + ) => + ++depth > config.maxDepth + ? printAsLeaf(getImmutableName(type)) + : getImmutableName(type) + + SPACE + + '[' + + (0, _collections.printIteratorValues)( + val.values(), + config, + indentation, + depth, + refs, + printer + ) + + ']'; + + const serialize = (val, config, indentation, depth, refs, printer) => { + if (val[IS_MAP_SENTINEL]) { + return printImmutableEntries( + val, + config, + indentation, + depth, + refs, + printer, + val[IS_ORDERED_SENTINEL] ? 'OrderedMap' : 'Map' + ); + } + + if (val[IS_LIST_SENTINEL]) { + return printImmutableValues( + val, + config, + indentation, + depth, + refs, + printer, + 'List' + ); + } + + if (val[IS_SET_SENTINEL]) { + return printImmutableValues( + val, + config, + indentation, + depth, + refs, + printer, + val[IS_ORDERED_SENTINEL] ? 'OrderedSet' : 'Set' + ); + } + + if (val[IS_STACK_SENTINEL]) { + return printImmutableValues( + val, + config, + indentation, + depth, + refs, + printer, + 'Stack' + ); + } + + if (val[IS_SEQ_SENTINEL]) { + return printImmutableSeq(val, config, indentation, depth, refs, printer); + } // For compatibility with immutable v3 and v4, let record be the default. + + return printImmutableRecord(val, config, indentation, depth, refs, printer); + }; // Explicitly comparing sentinel properties to true avoids false positive + // when mock identity-obj-proxy returns the key as the value for any key. + + Immutable.serialize = serialize; + + const test = val => + val && + (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true); + + Immutable.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + Immutable.default = _default; + return Immutable; +} + +var ReactElement = {}; + +var reactIsExports = {}; +var reactIs = { + get exports(){ return reactIsExports; }, + set exports(v){ reactIsExports = v; }, +}; + +var reactIs_development = {}; + +var hasRequiredReactIs_development; + +function requireReactIs_development () { + if (hasRequiredReactIs_development) return reactIs_development; + hasRequiredReactIs_development = 1; + + + + { + (function() { + + // The Symbol used to tag the ReactElement-like types. If there is no native Symbol + // nor polyfill, then a plain number is used for performance. + var hasSymbol = typeof Symbol === 'function' && Symbol.for; + var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; + var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; + var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; + var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; + var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; + var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; + var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary + // (unstable) APIs that have been removed. Can we remove the symbols? + + var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; + var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; + var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; + var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; + var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; + var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; + var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; + var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; + var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; + var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; + var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + + function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); + } + + function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; + } // AsyncMode is deprecated along with isAsyncMode + + var AsyncMode = REACT_ASYNC_MODE_TYPE; + var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; + var ContextConsumer = REACT_CONTEXT_TYPE; + var ContextProvider = REACT_PROVIDER_TYPE; + var Element = REACT_ELEMENT_TYPE; + var ForwardRef = REACT_FORWARD_REF_TYPE; + var Fragment = REACT_FRAGMENT_TYPE; + var Lazy = REACT_LAZY_TYPE; + var Memo = REACT_MEMO_TYPE; + var Portal = REACT_PORTAL_TYPE; + var Profiler = REACT_PROFILER_TYPE; + var StrictMode = REACT_STRICT_MODE_TYPE; + var Suspense = REACT_SUSPENSE_TYPE; + var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + + function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; + } + function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; + } + function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; + } + function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; + } + function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; + } + function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; + } + function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; + } + function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; + } + function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; + } + function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; + } + function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; + } + function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; + } + + reactIs_development.AsyncMode = AsyncMode; + reactIs_development.ConcurrentMode = ConcurrentMode; + reactIs_development.ContextConsumer = ContextConsumer; + reactIs_development.ContextProvider = ContextProvider; + reactIs_development.Element = Element; + reactIs_development.ForwardRef = ForwardRef; + reactIs_development.Fragment = Fragment; + reactIs_development.Lazy = Lazy; + reactIs_development.Memo = Memo; + reactIs_development.Portal = Portal; + reactIs_development.Profiler = Profiler; + reactIs_development.StrictMode = StrictMode; + reactIs_development.Suspense = Suspense; + reactIs_development.isAsyncMode = isAsyncMode; + reactIs_development.isConcurrentMode = isConcurrentMode; + reactIs_development.isContextConsumer = isContextConsumer; + reactIs_development.isContextProvider = isContextProvider; + reactIs_development.isElement = isElement; + reactIs_development.isForwardRef = isForwardRef; + reactIs_development.isFragment = isFragment; + reactIs_development.isLazy = isLazy; + reactIs_development.isMemo = isMemo; + reactIs_development.isPortal = isPortal; + reactIs_development.isProfiler = isProfiler; + reactIs_development.isStrictMode = isStrictMode; + reactIs_development.isSuspense = isSuspense; + reactIs_development.isValidElementType = isValidElementType; + reactIs_development.typeOf = typeOf; + })(); + } + return reactIs_development; +} + +var hasRequiredReactIs; + +function requireReactIs () { + if (hasRequiredReactIs) return reactIsExports; + hasRequiredReactIs = 1; + (function (module) { + + { + module.exports = requireReactIs_development(); + } +} (reactIs)); + return reactIsExports; +} + +var hasRequiredReactElement; + +function requireReactElement () { + if (hasRequiredReactElement) return ReactElement; + hasRequiredReactElement = 1; + + Object.defineProperty(ReactElement, '__esModule', { + value: true + }); + ReactElement.default = ReactElement.test = ReactElement.serialize = void 0; + + var ReactIs = _interopRequireWildcard(requireReactIs()); + + var _markup = requireMarkup(); + + function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = + Object.defineProperty && Object.getOwnPropertyDescriptor + ? Object.getOwnPropertyDescriptor(obj, key) + : {}; + if (desc.get || desc.set) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + } + newObj.default = obj; + return newObj; + } + } + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @noformat + * @nolint + * @lightSyntaxTransform + * @preventMunge + * @oncall react_core + */ + // Given element.props.children, or subtree during recursive traversal, + // return flattened array of children. + const getChildren = (arg, children = []) => { + if (Array.isArray(arg)) { + arg.forEach(item => { + getChildren(item, children); + }); + } else if (arg != null && arg !== false) { + children.push(arg); + } + + return children; + }; + + const getType = element => { + const type = element.type; + + if (typeof type === 'string') { + return type; + } + + if (typeof type === 'function') { + return type.displayName || type.name || 'Unknown'; + } + + if (ReactIs.isFragment(element)) { + return 'React.Fragment'; + } + + if (ReactIs.isSuspense(element)) { + return 'React.Suspense'; + } + + if (typeof type === 'object' && type !== null) { + if (ReactIs.isContextProvider(element)) { + return 'Context.Provider'; + } + + if (ReactIs.isContextConsumer(element)) { + return 'Context.Consumer'; + } + + if (ReactIs.isForwardRef(element)) { + const functionName = type.render.displayName || type.render.name || ''; + return functionName !== '' + ? 'ForwardRef(' + functionName + ')' + : 'ForwardRef'; + } + + if (ReactIs.isMemo(type)) { + const functionName = + type.displayName || type.type.displayName || type.type.name || ''; + return functionName !== '' ? 'Memo(' + functionName + ')' : 'Memo'; + } + } + + return 'UNDEFINED'; + }; + + const getPropKeys = element => { + const props = element.props; + return Object.keys(props) + .filter(key => key !== 'children' && props[key] !== undefined) + .sort(); + }; + + const serialize = (element, config, indentation, depth, refs, printer) => + ++depth > config.maxDepth + ? (0, _markup.printElementAsLeaf)(getType(element), config) + : (0, _markup.printElement)( + getType(element), + (0, _markup.printProps)( + getPropKeys(element), + element.props, + config, + indentation + config.indent, + depth, + refs, + printer + ), + (0, _markup.printChildren)( + getChildren(element.props.children), + config, + indentation + config.indent, + depth, + refs, + printer + ), + config, + indentation + ); + + ReactElement.serialize = serialize; + + const test = val => val && ReactIs.isElement(val); + + ReactElement.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + ReactElement.default = _default; + return ReactElement; +} + +var ReactTestComponent = {}; + +var hasRequiredReactTestComponent; + +function requireReactTestComponent () { + if (hasRequiredReactTestComponent) return ReactTestComponent; + hasRequiredReactTestComponent = 1; + + Object.defineProperty(ReactTestComponent, '__esModule', { + value: true + }); + ReactTestComponent.default = ReactTestComponent.test = ReactTestComponent.serialize = void 0; + + var _markup = requireMarkup(); + + var Symbol = commonjsGlobal['jest-symbol-do-not-touch'] || commonjsGlobal.Symbol; + const testSymbol = Symbol.for('react.test.json'); + + const getPropKeys = object => { + const props = object.props; + return props + ? Object.keys(props) + .filter(key => props[key] !== undefined) + .sort() + : []; + }; + + const serialize = (object, config, indentation, depth, refs, printer) => + ++depth > config.maxDepth + ? (0, _markup.printElementAsLeaf)(object.type, config) + : (0, _markup.printElement)( + object.type, + object.props + ? (0, _markup.printProps)( + getPropKeys(object), + object.props, + config, + indentation + config.indent, + depth, + refs, + printer + ) + : '', + object.children + ? (0, _markup.printChildren)( + object.children, + config, + indentation + config.indent, + depth, + refs, + printer + ) + : '', + config, + indentation + ); + + ReactTestComponent.serialize = serialize; + + const test = val => val && val.$$typeof === testSymbol; + + ReactTestComponent.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + ReactTestComponent.default = _default; + return ReactTestComponent; +} + +var build; +var hasRequiredBuild; + +function requireBuild () { + if (hasRequiredBuild) return build; + hasRequiredBuild = 1; + + var _ansiStyles = _interopRequireDefault(requireAnsiStyles()); + + var _collections = requireCollections(); + + var _AsymmetricMatcher = _interopRequireDefault( + requireAsymmetricMatcher() + ); + + var _ConvertAnsi = _interopRequireDefault(requireConvertAnsi()); + + var _DOMCollection = _interopRequireDefault(requireDOMCollection()); + + var _DOMElement = _interopRequireDefault(requireDOMElement()); + + var _Immutable = _interopRequireDefault(requireImmutable()); + + var _ReactElement = _interopRequireDefault(requireReactElement()); + + var _ReactTestComponent = _interopRequireDefault( + requireReactTestComponent() + ); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {default: obj}; + } + + var Symbol = commonjsGlobal['jest-symbol-do-not-touch'] || commonjsGlobal.Symbol; + const toString = Object.prototype.toString; + const toISOString = Date.prototype.toISOString; + const errorToString = Error.prototype.toString; + const regExpToString = RegExp.prototype.toString; + const symbolToString = Symbol.prototype.toString; + /** + * Explicitly comparing typeof constructor to function avoids undefined as name + * when mock identity-obj-proxy returns the key as the value for any key. + */ + + const getConstructorName = val => + (typeof val.constructor === 'function' && val.constructor.name) || 'Object'; + /* global window */ + + /** Is val is equal to global window object? Works even if it does not exist :) */ + + const isWindow = val => typeof window !== 'undefined' && val === window; + + const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/; + const NEWLINE_REGEXP = /\n/gi; + + class PrettyFormatPluginError extends Error { + constructor(message, stack) { + super(message); + this.stack = stack; + this.name = this.constructor.name; + } + } + + function isToStringedArrayType(toStringed) { + return ( + toStringed === '[object Array]' || + toStringed === '[object ArrayBuffer]' || + toStringed === '[object DataView]' || + toStringed === '[object Float32Array]' || + toStringed === '[object Float64Array]' || + toStringed === '[object Int8Array]' || + toStringed === '[object Int16Array]' || + toStringed === '[object Int32Array]' || + toStringed === '[object Uint8Array]' || + toStringed === '[object Uint8ClampedArray]' || + toStringed === '[object Uint16Array]' || + toStringed === '[object Uint32Array]' + ); + } + + function printNumber(val) { + return Object.is(val, -0) ? '-0' : String(val); + } + + function printBigInt(val) { + return String(`${val}n`); + } + + function printFunction(val, printFunctionName) { + if (!printFunctionName) { + return '[Function]'; + } + + return '[Function ' + (val.name || 'anonymous') + ']'; + } + + function printSymbol(val) { + return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)'); + } + + function printError(val) { + return '[' + errorToString.call(val) + ']'; + } + /** + * The first port of call for printing an object, handles most of the + * data-types in JS. + */ + + function printBasicValue(val, printFunctionName, escapeRegex, escapeString) { + if (val === true || val === false) { + return '' + val; + } + + if (val === undefined) { + return 'undefined'; + } + + if (val === null) { + return 'null'; + } + + const typeOf = typeof val; + + if (typeOf === 'number') { + return printNumber(val); + } + + if (typeOf === 'bigint') { + return printBigInt(val); + } + + if (typeOf === 'string') { + if (escapeString) { + return '"' + val.replace(/"|\\/g, '\\$&') + '"'; + } + + return '"' + val + '"'; + } + + if (typeOf === 'function') { + return printFunction(val, printFunctionName); + } + + if (typeOf === 'symbol') { + return printSymbol(val); + } + + const toStringed = toString.call(val); + + if (toStringed === '[object WeakMap]') { + return 'WeakMap {}'; + } + + if (toStringed === '[object WeakSet]') { + return 'WeakSet {}'; + } + + if ( + toStringed === '[object Function]' || + toStringed === '[object GeneratorFunction]' + ) { + return printFunction(val, printFunctionName); + } + + if (toStringed === '[object Symbol]') { + return printSymbol(val); + } + + if (toStringed === '[object Date]') { + return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val); + } + + if (toStringed === '[object Error]') { + return printError(val); + } + + if (toStringed === '[object RegExp]') { + if (escapeRegex) { + // https://github.com/benjamingr/RegExp.escape/blob/master/polyfill.js + return regExpToString.call(val).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + return regExpToString.call(val); + } + + if (val instanceof Error) { + return printError(val); + } + + return null; + } + /** + * Handles more complex objects ( such as objects with circular references. + * maps and sets etc ) + */ + + function printComplexValue( + val, + config, + indentation, + depth, + refs, + hasCalledToJSON + ) { + if (refs.indexOf(val) !== -1) { + return '[Circular]'; + } + + refs = refs.slice(); + refs.push(val); + const hitMaxDepth = ++depth > config.maxDepth; + const min = config.min; + + if ( + config.callToJSON && + !hitMaxDepth && + val.toJSON && + typeof val.toJSON === 'function' && + !hasCalledToJSON + ) { + return printer(val.toJSON(), config, indentation, depth, refs, true); + } + + const toStringed = toString.call(val); + + if (toStringed === '[object Arguments]') { + return hitMaxDepth + ? '[Arguments]' + : (min ? '' : 'Arguments ') + + '[' + + (0, _collections.printListItems)( + val, + config, + indentation, + depth, + refs, + printer + ) + + ']'; + } + + if (isToStringedArrayType(toStringed)) { + return hitMaxDepth + ? '[' + val.constructor.name + ']' + : (min ? '' : val.constructor.name + ' ') + + '[' + + (0, _collections.printListItems)( + val, + config, + indentation, + depth, + refs, + printer + ) + + ']'; + } + + if (toStringed === '[object Map]') { + return hitMaxDepth + ? '[Map]' + : 'Map {' + + (0, _collections.printIteratorEntries)( + val.entries(), + config, + indentation, + depth, + refs, + printer, + ' => ' + ) + + '}'; + } + + if (toStringed === '[object Set]') { + return hitMaxDepth + ? '[Set]' + : 'Set {' + + (0, _collections.printIteratorValues)( + val.values(), + config, + indentation, + depth, + refs, + printer + ) + + '}'; + } // Avoid failure to serialize global window object in jsdom test environment. + // For example, not even relevant if window is prop of React element. + + return hitMaxDepth || isWindow(val) + ? '[' + getConstructorName(val) + ']' + : (min ? '' : getConstructorName(val) + ' ') + + '{' + + (0, _collections.printObjectProperties)( + val, + config, + indentation, + depth, + refs, + printer + ) + + '}'; + } + + function isNewPlugin(plugin) { + return plugin.serialize != null; + } + + function printPlugin(plugin, val, config, indentation, depth, refs) { + let printed; + + try { + printed = isNewPlugin(plugin) + ? plugin.serialize(val, config, indentation, depth, refs, printer) + : plugin.print( + val, + valChild => printer(valChild, config, indentation, depth, refs), + str => { + const indentationNext = indentation + config.indent; + return ( + indentationNext + + str.replace(NEWLINE_REGEXP, '\n' + indentationNext) + ); + }, + { + edgeSpacing: config.spacingOuter, + min: config.min, + spacing: config.spacingInner + }, + config.colors + ); + } catch (error) { + throw new PrettyFormatPluginError(error.message, error.stack); + } + + if (typeof printed !== 'string') { + throw new Error( + `pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".` + ); + } + + return printed; + } + + function findPlugin(plugins, val) { + for (let p = 0; p < plugins.length; p++) { + try { + if (plugins[p].test(val)) { + return plugins[p]; + } + } catch (error) { + throw new PrettyFormatPluginError(error.message, error.stack); + } + } + + return null; + } + + function printer(val, config, indentation, depth, refs, hasCalledToJSON) { + const plugin = findPlugin(config.plugins, val); + + if (plugin !== null) { + return printPlugin(plugin, val, config, indentation, depth, refs); + } + + const basicResult = printBasicValue( + val, + config.printFunctionName, + config.escapeRegex, + config.escapeString + ); + + if (basicResult !== null) { + return basicResult; + } + + return printComplexValue( + val, + config, + indentation, + depth, + refs, + hasCalledToJSON + ); + } + + const DEFAULT_THEME = { + comment: 'gray', + content: 'reset', + prop: 'yellow', + tag: 'cyan', + value: 'green' + }; + const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME); + const DEFAULT_OPTIONS = { + callToJSON: true, + escapeRegex: false, + escapeString: true, + highlight: false, + indent: 2, + maxDepth: Infinity, + min: false, + plugins: [], + printFunctionName: true, + theme: DEFAULT_THEME + }; + + function validateOptions(options) { + Object.keys(options).forEach(key => { + if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { + throw new Error(`pretty-format: Unknown option "${key}".`); + } + }); + + if (options.min && options.indent !== undefined && options.indent !== 0) { + throw new Error( + 'pretty-format: Options "min" and "indent" cannot be used together.' + ); + } + + if (options.theme !== undefined) { + if (options.theme === null) { + throw new Error(`pretty-format: Option "theme" must not be null.`); + } + + if (typeof options.theme !== 'object') { + throw new Error( + `pretty-format: Option "theme" must be of type "object" but instead received "${typeof options.theme}".` + ); + } + } + } + + const getColorsHighlight = options => + DEFAULT_THEME_KEYS.reduce((colors, key) => { + const value = + options.theme && options.theme[key] !== undefined + ? options.theme[key] + : DEFAULT_THEME[key]; + const color = value && _ansiStyles.default[value]; + + if ( + color && + typeof color.close === 'string' && + typeof color.open === 'string' + ) { + colors[key] = color; + } else { + throw new Error( + `pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.` + ); + } + + return colors; + }, Object.create(null)); + + const getColorsEmpty = () => + DEFAULT_THEME_KEYS.reduce((colors, key) => { + colors[key] = { + close: '', + open: '' + }; + return colors; + }, Object.create(null)); + + const getPrintFunctionName = options => + options && options.printFunctionName !== undefined + ? options.printFunctionName + : DEFAULT_OPTIONS.printFunctionName; + + const getEscapeRegex = options => + options && options.escapeRegex !== undefined + ? options.escapeRegex + : DEFAULT_OPTIONS.escapeRegex; + + const getEscapeString = options => + options && options.escapeString !== undefined + ? options.escapeString + : DEFAULT_OPTIONS.escapeString; + + const getConfig = options => ({ + callToJSON: + options && options.callToJSON !== undefined + ? options.callToJSON + : DEFAULT_OPTIONS.callToJSON, + colors: + options && options.highlight + ? getColorsHighlight(options) + : getColorsEmpty(), + escapeRegex: getEscapeRegex(options), + escapeString: getEscapeString(options), + indent: + options && options.min + ? '' + : createIndent( + options && options.indent !== undefined + ? options.indent + : DEFAULT_OPTIONS.indent + ), + maxDepth: + options && options.maxDepth !== undefined + ? options.maxDepth + : DEFAULT_OPTIONS.maxDepth, + min: options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min, + plugins: + options && options.plugins !== undefined + ? options.plugins + : DEFAULT_OPTIONS.plugins, + printFunctionName: getPrintFunctionName(options), + spacingInner: options && options.min ? ' ' : '\n', + spacingOuter: options && options.min ? '' : '\n' + }); + + function createIndent(indent) { + return new Array(indent + 1).join(' '); + } + /** + * Returns a presentation string of your `val` object + * @param val any potential JavaScript object + * @param options Custom settings + */ + + function prettyFormat(val, options) { + if (options) { + validateOptions(options); + + if (options.plugins) { + const plugin = findPlugin(options.plugins, val); + + if (plugin !== null) { + return printPlugin(plugin, val, getConfig(options), '', 0, []); + } + } + } + + const basicResult = printBasicValue( + val, + getPrintFunctionName(options), + getEscapeRegex(options), + getEscapeString(options) + ); + + if (basicResult !== null) { + return basicResult; + } + + return printComplexValue(val, getConfig(options), '', 0, []); + } + + prettyFormat.plugins = { + AsymmetricMatcher: _AsymmetricMatcher.default, + ConvertAnsi: _ConvertAnsi.default, + DOMCollection: _DOMCollection.default, + DOMElement: _DOMElement.default, + Immutable: _Immutable.default, + ReactElement: _ReactElement.default, + ReactTestComponent: _ReactTestComponent.default + }; + /* eslint-disable-next-line no-redeclare */ + + build = prettyFormat; + return build; +} + +var buildExports = requireBuild(); +var prettyFormat = /*@__PURE__*/getDefaultExportFromCjs(buildExports); + +var _PostDominator_exit, _PostDominator_nodes; +function computePostDominatorTree(fn, options) { + const graph = buildReverseGraph(fn, options.includeThrowsAsExitNode); + const nodes = computeImmediateDominators(graph); + if (!options.includeThrowsAsExitNode) { + for (const [id] of fn.body.blocks) { + if (!nodes.has(id)) { + nodes.set(id, id); + } + } + } + return new PostDominator(graph.entry, nodes); +} +class PostDominator { + constructor(exit, nodes) { + _PostDominator_exit.set(this, void 0); + _PostDominator_nodes.set(this, void 0); + __classPrivateFieldSet(this, _PostDominator_exit, exit, "f"); + __classPrivateFieldSet(this, _PostDominator_nodes, nodes, "f"); + } + get exit() { + return __classPrivateFieldGet(this, _PostDominator_exit, "f"); + } + get(id) { + const dominator = __classPrivateFieldGet(this, _PostDominator_nodes, "f").get(id); + CompilerError.invariant(dominator !== undefined, { + reason: 'Unknown node', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return dominator === id ? null : dominator; + } + debug() { + const postDominators = new Map(); + for (const [key, value] of __classPrivateFieldGet(this, _PostDominator_nodes, "f")) { + postDominators.set(`bb${key}`, `bb${value}`); + } + return prettyFormat({ + exit: `bb${this.exit}`, + postDominators, + }); + } +} +_PostDominator_exit = new WeakMap(), _PostDominator_nodes = new WeakMap(); +function computeImmediateDominators(graph) { + const nodes = new Map(); + nodes.set(graph.entry, graph.entry); + let changed = true; + while (changed) { + changed = false; + for (const [id, node] of graph.nodes) { + if (node.id === graph.entry) { + continue; + } + let newIdom = null; + for (const pred of node.preds) { + if (nodes.has(pred)) { + newIdom = pred; + break; + } + } + CompilerError.invariant(newIdom !== null, { + reason: `At least one predecessor must have been visited for block ${id}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + for (const pred of node.preds) { + if (pred === newIdom) { + continue; + } + const predDom = nodes.get(pred); + if (predDom !== undefined) { + newIdom = intersect(pred, newIdom, graph, nodes); + } + } + if (nodes.get(id) !== newIdom) { + nodes.set(id, newIdom); + changed = true; + } + } + } + return nodes; +} +function intersect(a, b, graph, nodes) { + let block1 = graph.nodes.get(a); + let block2 = graph.nodes.get(b); + while (block1 !== block2) { + while (block1.index > block2.index) { + const dom = nodes.get(block1.id); + block1 = graph.nodes.get(dom); + } + while (block2.index > block1.index) { + const dom = nodes.get(block2.id); + block2 = graph.nodes.get(dom); + } + } + return block1.id; +} +function buildReverseGraph(fn, includeThrowsAsExitNode) { + const nodes = new Map(); + const exitId = fn.env.nextBlockId; + const exit = { + id: exitId, + index: 0, + preds: new Set(), + succs: new Set(), + }; + nodes.set(exitId, exit); + for (const [id, block] of fn.body.blocks) { + const node = { + id, + index: 0, + preds: new Set(eachTerminalSuccessor(block.terminal)), + succs: new Set(block.preds), + }; + if (block.terminal.kind === 'return') { + node.preds.add(exitId); + exit.succs.add(id); + } + else if (block.terminal.kind === 'throw' && includeThrowsAsExitNode) { + node.preds.add(exitId); + exit.succs.add(id); + } + nodes.set(id, node); + } + const visited = new Set(); + const postorder = []; + function visit(id) { + if (visited.has(id)) { + return; + } + visited.add(id); + const node = nodes.get(id); + for (const successor of node.succs) { + visit(successor); + } + postorder.push(id); + } + visit(exitId); + const rpo = { entry: exitId, nodes: new Map() }; + let index = 0; + for (const id of postorder.reverse()) { + const node = nodes.get(id); + node.index = index++; + rpo.nodes.set(id, node); + } + return rpo; +} + +const DEFAULT_SHAPES = new Map(BUILTIN_SHAPES); +const UNTYPED_GLOBALS = new Set([ + 'Object', + 'Function', + 'RegExp', + 'Date', + 'Error', + 'TypeError', + 'RangeError', + 'ReferenceError', + 'SyntaxError', + 'URIError', + 'EvalError', + 'DataView', + 'Float32Array', + 'Float64Array', + 'Int8Array', + 'Int16Array', + 'Int32Array', + 'WeakMap', + 'Uint8Array', + 'Uint8ClampedArray', + 'Uint16Array', + 'Uint32Array', + 'ArrayBuffer', + 'JSON', + 'console', + 'eval', +]); +const TYPED_GLOBALS = [ + [ + 'Object', + addObject(DEFAULT_SHAPES, 'Object', [ + [ + 'keys', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'fromEntries', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutate], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInObjectId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'entries', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@object'], + rest: null, + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@returns', + reason: ValueReason.KnownReturnSignature, + value: ValueKind.Mutable, + }, + { + kind: 'Capture', + from: '@object', + into: '@returns', + }, + ], + }, + }), + ], + [ + 'keys', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@object'], + rest: null, + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@returns', + reason: ValueReason.KnownReturnSignature, + value: ValueKind.Mutable, + }, + { + kind: 'ImmutableCapture', + from: '@object', + into: '@returns', + }, + ], + }, + }), + ], + [ + 'values', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@object'], + rest: null, + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@returns', + reason: ValueReason.KnownReturnSignature, + value: ValueKind.Mutable, + }, + { + kind: 'Capture', + from: '@object', + into: '@returns', + }, + ], + }, + }), + ], + ]), + ], + [ + 'Array', + addObject(DEFAULT_SHAPES, 'Array', [ + [ + 'isArray', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'from', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [ + Effect.ConditionallyMutateIterator, + Effect.ConditionallyMutate, + Effect.ConditionallyMutate, + ], + restParam: Effect.Read, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'of', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + ]), + ], + [ + 'performance', + addObject(DEFAULT_SHAPES, 'performance', [ + [ + 'now', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + impure: true, + canonicalName: 'performance.now', + }), + ], + ]), + ], + [ + 'Date', + addObject(DEFAULT_SHAPES, 'Date', [ + [ + 'now', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + impure: true, + canonicalName: 'Date.now', + }), + ], + ]), + ], + [ + 'Math', + addObject(DEFAULT_SHAPES, 'Math', [ + ['PI', { kind: 'Primitive' }], + [ + 'max', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'min', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'trunc', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'ceil', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'floor', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'pow', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'random', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + impure: true, + canonicalName: 'Math.random', + }), + ], + ]), + ], + ['Infinity', { kind: 'Primitive' }], + ['NaN', { kind: 'Primitive' }], + [ + 'console', + addObject(DEFAULT_SHAPES, 'console', [ + [ + 'error', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'info', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'log', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'table', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'trace', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'warn', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + ]), + ], + [ + 'Boolean', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'Number', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'String', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'parseInt', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'parseFloat', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'isNaN', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'isFinite', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'encodeURI', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'encodeURIComponent', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'decodeURI', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'decodeURIComponent', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'Map', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInMapId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], + [ + 'Set', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], + [ + 'WeakMap', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakMapId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], + [ + 'WeakSet', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakSetId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], +]; +const REACT_APIS = [ + [ + 'useContext', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useContext', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.Context, + }, BuiltInUseContextHookId), + ], + [ + 'useState', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: BuiltInUseStateId }, + calleeEffect: Effect.Read, + hookKind: 'useState', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.State, + }), + ], + [ + 'useActionState', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: BuiltInUseActionStateId }, + calleeEffect: Effect.Read, + hookKind: 'useActionState', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.State, + }), + ], + [ + 'useReducer', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: BuiltInUseReducerId }, + calleeEffect: Effect.Read, + hookKind: 'useReducer', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.ReducerState, + }), + ], + [ + 'useRef', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Capture, + returnType: { kind: 'Object', shapeId: BuiltInUseRefId }, + calleeEffect: Effect.Read, + hookKind: 'useRef', + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'useImperativeHandle', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + hookKind: 'useImperativeHandle', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'useMemo', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useMemo', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'useCallback', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useCallback', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'useEffect', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + hookKind: 'useEffect', + returnValueKind: ValueKind.Frozen, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: ['@effect'], + effects: [ + { + kind: 'Freeze', + value: '@rest', + reason: ValueReason.Effect, + }, + { + kind: 'Create', + into: '@effect', + value: ValueKind.Frozen, + reason: ValueReason.KnownReturnSignature, + }, + { + kind: 'Capture', + from: '@rest', + into: '@effect', + }, + { + kind: 'Create', + into: '@returns', + value: ValueKind.Primitive, + reason: ValueReason.KnownReturnSignature, + }, + ], + }, + }, BuiltInUseEffectHookId), + ], + [ + 'useLayoutEffect', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useLayoutEffect', + returnValueKind: ValueKind.Frozen, + }, BuiltInUseLayoutEffectHookId), + ], + [ + 'useInsertionEffect', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useInsertionEffect', + returnValueKind: ValueKind.Frozen, + }, BuiltInUseInsertionEffectHookId), + ], + [ + 'useTransition', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInUseTransitionId }, + calleeEffect: Effect.Read, + hookKind: 'useTransition', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'use', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }, BuiltInUseOperatorId), + ], + [ + 'fire', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { + kind: 'Function', + return: { kind: 'Poly' }, + shapeId: BuiltInFireFunctionId, + isConstructor: false, + }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }, BuiltInFireId), + ], + [ + 'useEffectEvent', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { + kind: 'Function', + return: { kind: 'Poly' }, + shapeId: BuiltinEffectEventId, + isConstructor: false, + }, + calleeEffect: Effect.Read, + hookKind: 'useEffectEvent', + returnValueKind: ValueKind.Frozen, + }, BuiltInUseEffectEventId), + ], + ['AUTODEPS', addObject(DEFAULT_SHAPES, BuiltInAutodepsId, [])], +]; +TYPED_GLOBALS.push([ + 'React', + addObject(DEFAULT_SHAPES, null, [ + ...REACT_APIS, + [ + 'createElement', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'cloneElement', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'createRef', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: { kind: 'Object', shapeId: BuiltInUseRefId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + ]), +], [ + '_jsx', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }), +]); +const DEFAULT_GLOBALS = new Map(REACT_APIS); +for (const name of UNTYPED_GLOBALS) { + DEFAULT_GLOBALS.set(name, { + kind: 'Poly', + }); +} +for (const [name, type_] of TYPED_GLOBALS) { + DEFAULT_GLOBALS.set(name, type_); +} +DEFAULT_GLOBALS.set('globalThis', addObject(DEFAULT_SHAPES, 'globalThis', TYPED_GLOBALS)); +DEFAULT_GLOBALS.set('global', addObject(DEFAULT_SHAPES, 'global', TYPED_GLOBALS)); +function installTypeConfig(globals, shapes, typeConfig, moduleName, loc) { + var _a, _b, _c, _d, _e, _f; + switch (typeConfig.kind) { + case 'type': { + switch (typeConfig.name) { + case 'Array': { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + case 'MixedReadonly': { + return { kind: 'Object', shapeId: BuiltInMixedReadonlyId }; + } + case 'Primitive': { + return { kind: 'Primitive' }; + } + case 'Ref': { + return { kind: 'Object', shapeId: BuiltInUseRefId }; + } + case 'Any': { + return { kind: 'Poly' }; + } + default: { + assertExhaustive$1(typeConfig.name, `Unexpected type '${typeConfig.name}'`); + } + } + } + case 'function': { + return addFunction(shapes, [], { + positionalParams: typeConfig.positionalParams, + restParam: typeConfig.restParam, + calleeEffect: typeConfig.calleeEffect, + returnType: installTypeConfig(globals, shapes, typeConfig.returnType, moduleName, loc), + returnValueKind: typeConfig.returnValueKind, + noAlias: typeConfig.noAlias === true, + mutableOnlyIfOperandsAreMutable: typeConfig.mutableOnlyIfOperandsAreMutable === true, + aliasing: typeConfig.aliasing, + knownIncompatible: (_a = typeConfig.knownIncompatible) !== null && _a !== void 0 ? _a : null, + }); + } + case 'hook': { + return addHook(shapes, { + hookKind: 'Custom', + positionalParams: (_b = typeConfig.positionalParams) !== null && _b !== void 0 ? _b : [], + restParam: (_c = typeConfig.restParam) !== null && _c !== void 0 ? _c : Effect.Freeze, + calleeEffect: Effect.Read, + returnType: installTypeConfig(globals, shapes, typeConfig.returnType, moduleName, loc), + returnValueKind: (_d = typeConfig.returnValueKind) !== null && _d !== void 0 ? _d : ValueKind.Frozen, + noAlias: typeConfig.noAlias === true, + aliasing: typeConfig.aliasing, + knownIncompatible: (_e = typeConfig.knownIncompatible) !== null && _e !== void 0 ? _e : null, + }); + } + case 'object': { + return addObject(shapes, null, Object.entries((_f = typeConfig.properties) !== null && _f !== void 0 ? _f : {}).map(([key, value]) => { + var _a; + const type = installTypeConfig(globals, shapes, value, moduleName, loc); + const expectHook = isHookName$2(key); + let isHook = false; + if (type.kind === 'Function' && type.shapeId !== null) { + const functionType = shapes.get(type.shapeId); + if (((_a = functionType === null || functionType === void 0 ? void 0 : functionType.functionType) === null || _a === void 0 ? void 0 : _a.hookKind) !== null) { + isHook = true; + } + } + if (expectHook !== isHook) { + CompilerError.throwInvalidConfig({ + reason: `Invalid type configuration for module`, + description: `Expected type for object property '${key}' from module '${moduleName}' ${expectHook ? 'to be a hook' : 'not to be a hook'} based on the property name`, + loc, + }); + } + return [key, type]; + })); + } + default: { + assertExhaustive$1(typeConfig, `Unexpected type kind '${typeConfig.kind}'`); + } + } +} +function getReanimatedModuleType(registry) { + const frozenHooks = [ + 'useFrameCallback', + 'useAnimatedStyle', + 'useAnimatedProps', + 'useAnimatedScrollHandler', + 'useAnimatedReaction', + 'useWorkletCallback', + ]; + const reanimatedType = []; + for (const hook of frozenHooks) { + reanimatedType.push([ + hook, + addHook(registry, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + returnValueKind: ValueKind.Frozen, + noAlias: true, + calleeEffect: Effect.Read, + hookKind: 'Custom', + }), + ]); + } + const mutableHooks = ['useSharedValue', 'useDerivedValue']; + for (const hook of mutableHooks) { + reanimatedType.push([ + hook, + addHook(registry, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: ReanimatedSharedValueId }, + returnValueKind: ValueKind.Mutable, + noAlias: true, + calleeEffect: Effect.Read, + hookKind: 'Custom', + }), + ]); + } + const funcs = [ + 'withTiming', + 'withSpring', + 'createAnimatedPropAdapter', + 'withDecay', + 'withRepeat', + 'runOnUI', + 'executeOnUIRuntimeSync', + ]; + for (const fn of funcs) { + reanimatedType.push([ + fn, + addFunction(registry, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ]); + } + return addObject(registry, null, reanimatedType); +} + +const ObjectPropertiesSchema = zod.z + .record(zod.z.string(), zod.z.lazy(() => TypeSchema)) + .refine(record => { + return Object.keys(record).every(key => key === '*' || key === 'default' || libExports$1.isValidIdentifier(key)); +}, 'Expected all "object" property names to be valid identifier, `*` to match any property, of `default` to define a module default export'); +const ObjectTypeSchema = zod.z.object({ + kind: zod.z.literal('object'), + properties: ObjectPropertiesSchema.nullable(), +}); +const LifetimeIdSchema = zod.z.string().refine(id => id.startsWith('@'), { + message: "Placeholder names must start with '@'", +}); +const FreezeEffectSchema = zod.z.object({ + kind: zod.z.literal('Freeze'), + value: LifetimeIdSchema, + reason: ValueReasonSchema, +}); +const MutateEffectSchema = zod.z.object({ + kind: zod.z.literal('Mutate'), + value: LifetimeIdSchema, +}); +const MutateTransitiveConditionallySchema = zod.z.object({ + kind: zod.z.literal('MutateTransitiveConditionally'), + value: LifetimeIdSchema, +}); +const CreateEffectSchema = zod.z.object({ + kind: zod.z.literal('Create'), + into: LifetimeIdSchema, + value: ValueKindSchema, + reason: ValueReasonSchema, +}); +const AssignEffectSchema = zod.z.object({ + kind: zod.z.literal('Assign'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const AliasEffectSchema = zod.z.object({ + kind: zod.z.literal('Alias'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const ImmutableCaptureEffectSchema = zod.z.object({ + kind: zod.z.literal('ImmutableCapture'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const CaptureEffectSchema = zod.z.object({ + kind: zod.z.literal('Capture'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const CreateFromEffectSchema = zod.z.object({ + kind: zod.z.literal('CreateFrom'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const ApplyArgSchema = zod.z.union([ + LifetimeIdSchema, + zod.z.object({ + kind: zod.z.literal('Spread'), + place: LifetimeIdSchema, + }), + zod.z.object({ + kind: zod.z.literal('Hole'), + }), +]); +const ApplyEffectSchema = zod.z.object({ + kind: zod.z.literal('Apply'), + receiver: LifetimeIdSchema, + function: LifetimeIdSchema, + mutatesFunction: zod.z.boolean(), + args: zod.z.array(ApplyArgSchema), + into: LifetimeIdSchema, +}); +const ImpureEffectSchema = zod.z.object({ + kind: zod.z.literal('Impure'), + place: LifetimeIdSchema, +}); +const AliasingEffectSchema = zod.z.union([ + FreezeEffectSchema, + CreateEffectSchema, + CreateFromEffectSchema, + AssignEffectSchema, + AliasEffectSchema, + CaptureEffectSchema, + ImmutableCaptureEffectSchema, + ImpureEffectSchema, + MutateEffectSchema, + MutateTransitiveConditionallySchema, + ApplyEffectSchema, +]); +const AliasingSignatureSchema = zod.z.object({ + receiver: LifetimeIdSchema, + params: zod.z.array(LifetimeIdSchema), + rest: LifetimeIdSchema.nullable(), + returns: LifetimeIdSchema, + effects: zod.z.array(AliasingEffectSchema), + temporaries: zod.z.array(LifetimeIdSchema), +}); +const FunctionTypeSchema = zod.z.object({ + kind: zod.z.literal('function'), + positionalParams: zod.z.array(EffectSchema), + restParam: EffectSchema.nullable(), + calleeEffect: EffectSchema, + returnType: zod.z.lazy(() => TypeSchema), + returnValueKind: ValueKindSchema, + noAlias: zod.z.boolean().nullable().optional(), + mutableOnlyIfOperandsAreMutable: zod.z.boolean().nullable().optional(), + impure: zod.z.boolean().nullable().optional(), + canonicalName: zod.z.string().nullable().optional(), + aliasing: AliasingSignatureSchema.nullable().optional(), + knownIncompatible: zod.z.string().nullable().optional(), +}); +const HookTypeSchema = zod.z.object({ + kind: zod.z.literal('hook'), + positionalParams: zod.z.array(EffectSchema).nullable().optional(), + restParam: EffectSchema.nullable().optional(), + returnType: zod.z.lazy(() => TypeSchema), + returnValueKind: ValueKindSchema.nullable().optional(), + noAlias: zod.z.boolean().nullable().optional(), + aliasing: AliasingSignatureSchema.nullable().optional(), + knownIncompatible: zod.z.string().nullable().optional(), +}); +const BuiltInTypeSchema = zod.z.union([ + zod.z.literal('Any'), + zod.z.literal('Ref'), + zod.z.literal('Array'), + zod.z.literal('Primitive'), + zod.z.literal('MixedReadonly'), +]); +const TypeReferenceSchema = zod.z.object({ + kind: zod.z.literal('type'), + name: BuiltInTypeSchema, +}); +const TypeSchema = zod.z.union([ + ObjectTypeSchema, + FunctionTypeSchema, + HookTypeSchema, + TypeReferenceSchema, +]); + +function unsupportedTypeAnnotation(desc, loc) { + CompilerError.throwInvalidJS({ + reason: `Typedchecker does not currently support type annotation: ${desc}`, + loc, + }); +} + +var _FlowTypeEnv_nextNominalId, _FlowTypeEnv_nextTypeParameterId, _FlowTypeEnv_types, _FlowTypeEnv_bindings, _FlowTypeEnv_generics, _FlowTypeEnv_flowTypes; +function makeTypeParameterId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected TypeParameterId to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeNominalId(id) { + return id; +} +const DUMMY_NOMINAL = makeNominalId(0); +function convertFlowType(flowType, loc) { + let nextGenericId = 0; + function convertFlowTypeImpl(flowType, loc, genericEnv, platform, poly = null) { + var _a, _b, _c; + switch (flowType.kind) { + case 'TypeApp': { + if (flowType.type.kind === 'Def' && + flowType.type.def.kind === 'Poly' && + flowType.type.def.t_out.kind === 'Def' && + flowType.type.def.t_out.def.kind === 'Type' && + flowType.type.def.t_out.def.type.kind === 'Opaque' && + flowType.type.def.t_out.def.type.opaquetype.opaque_name === + 'Client' && + flowType.targs.length === 1) { + return convertFlowTypeImpl(flowType.targs[0], loc, genericEnv, 'client'); + } + else if (flowType.type.kind === 'Def' && + flowType.type.def.kind === 'Poly' && + flowType.type.def.t_out.kind === 'Def' && + flowType.type.def.t_out.def.kind === 'Type' && + flowType.type.def.t_out.def.type.kind === 'Opaque' && + flowType.type.def.t_out.def.type.opaquetype.opaque_name === + 'Server' && + flowType.targs.length === 1) { + return convertFlowTypeImpl(flowType.targs[0], loc, genericEnv, 'server'); + } + return Resolved.todo(platform); + } + case 'Open': + return Resolved.mixed(platform); + case 'Any': + return Resolved.todo(platform); + case 'Annot': + return convertFlowTypeImpl(flowType.type, loc, genericEnv, platform, poly); + case 'Opaque': { + if (flowType.opaquetype.opaque_name === 'Client' && + flowType.opaquetype.super_t != null) { + return convertFlowTypeImpl(flowType.opaquetype.super_t, loc, genericEnv, 'client'); + } + if (flowType.opaquetype.opaque_name === 'Server' && + flowType.opaquetype.super_t != null) { + return convertFlowTypeImpl(flowType.opaquetype.super_t, loc, genericEnv, 'server'); + } + const t = (_a = flowType.opaquetype.underlying_t) !== null && _a !== void 0 ? _a : flowType.opaquetype.super_t; + if (t != null) { + return convertFlowTypeImpl(t, loc, genericEnv, platform, poly); + } + else { + return Resolved.todo(platform); + } + } + case 'Def': { + switch (flowType.def.kind) { + case 'EnumValue': + return convertFlowTypeImpl(flowType.def.enum_info.representation_t, loc, genericEnv, platform, poly); + case 'EnumObject': + return Resolved.enum(platform); + case 'Empty': + return Resolved.todo(platform); + case 'Instance': { + const members = new Map(); + for (const key in flowType.def.instance.inst.own_props) { + const prop = flowType.def.instance.inst.own_props[key]; + if (prop.kind === 'Field') { + members.set(key, convertFlowTypeImpl(prop.type, loc, genericEnv, platform)); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported property kind ${prop.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } + return Resolved.class((_b = flowType.def.instance.inst.class_name) !== null && _b !== void 0 ? _b : '[anonymous class]', members, platform); + } + case 'Type': + return convertFlowTypeImpl(flowType.def.type, loc, genericEnv, platform, poly); + case 'NumGeneral': + case 'SingletonNum': + return Resolved.number(platform); + case 'StrGeneral': + case 'SingletonStr': + return Resolved.string(platform); + case 'BoolGeneral': + case 'SingletonBool': + return Resolved.boolean(platform); + case 'Void': + return Resolved.void(platform); + case 'Null': + return Resolved.void(platform); + case 'Mixed': + return Resolved.mixed(platform); + case 'Arr': { + if (flowType.def.arrtype.kind === 'ArrayAT' || + flowType.def.arrtype.kind === 'ROArrayAT') { + return Resolved.array(convertFlowTypeImpl(flowType.def.arrtype.elem_t, loc, genericEnv, platform), platform); + } + else { + return Resolved.tuple(DUMMY_NOMINAL, flowType.def.arrtype.elements.map(t => convertFlowTypeImpl(t.t, loc, genericEnv, platform)), platform); + } + } + case 'Obj': { + const members = new Map(); + for (const key in flowType.def.objtype.props) { + const prop = flowType.def.objtype.props[key]; + if (prop.kind === 'Field') { + members.set(key, convertFlowTypeImpl(prop.type, loc, genericEnv, platform)); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported property kind ${prop.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } + return Resolved.object(DUMMY_NOMINAL, members, platform); + } + case 'Class': { + if (flowType.def.type.kind === 'ThisInstance') { + const members = new Map(); + for (const key in flowType.def.type.instance.inst.own_props) { + const prop = flowType.def.type.instance.inst.own_props[key]; + if (prop.kind === 'Field') { + members.set(key, convertFlowTypeImpl(prop.type, loc, genericEnv, platform)); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported property kind ${prop.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } + return Resolved.class((_c = flowType.def.type.instance.inst.class_name) !== null && _c !== void 0 ? _c : '[anonymous class]', members, platform); + } + CompilerError.invariant(false, { + reason: `Unsupported class instance type ${flowType.def.type.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + case 'Fun': + return Resolved.function(poly, flowType.def.funtype.params.map(p => convertFlowTypeImpl(p.type, loc, genericEnv, platform)), convertFlowTypeImpl(flowType.def.funtype.return_t, loc, genericEnv, platform), platform); + case 'Poly': { + let newEnv = genericEnv; + const poly = flowType.def.tparams.map(p => { + const id = makeTypeParameterId(nextGenericId++); + const bound = convertFlowTypeImpl(p.bound, loc, newEnv, platform); + newEnv = new Map(newEnv); + newEnv.set(p.name, id); + return { + name: p.name, + id, + bound, + }; + }); + return convertFlowTypeImpl(flowType.def.t_out, loc, newEnv, platform, poly); + } + case 'ReactAbstractComponent': { + const props = new Map(); + let children = null; + const propsType = convertFlowTypeImpl(flowType.def.config, loc, genericEnv, platform); + if (propsType.type.kind === 'Object') { + propsType.type.members.forEach((v, k) => { + if (k === 'children') { + children = v; + } + else { + props.set(k, v); + } + }); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported component props type ${propsType.type.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + return Resolved.component(props, children, platform); + } + case 'Renders': + return Resolved.todo(platform); + default: + unsupportedTypeAnnotation('Renders', GeneratedSource); + } + } + case 'Generic': { + const id = genericEnv.get(flowType.name); + if (id == null) { + unsupportedTypeAnnotation(flowType.name, GeneratedSource); + } + return Resolved.generic(id, platform, convertFlowTypeImpl(flowType.bound, loc, genericEnv, platform)); + } + case 'Union': { + const members = flowType.members.map(t => convertFlowTypeImpl(t, loc, genericEnv, platform)); + if (members.length === 1) { + return members[0]; + } + if (members[0].type.kind === 'Number' || + members[0].type.kind === 'String' || + members[0].type.kind === 'Boolean') { + const dupes = members.filter(t => t.type.kind === members[0].type.kind); + if (dupes.length === members.length) { + return members[0]; + } + } + if (members[0].type.kind === 'Array' && + (members[0].type.element.type.kind === 'Number' || + members[0].type.element.type.kind === 'String' || + members[0].type.element.type.kind === 'Boolean')) { + const first = members[0].type.element; + const dupes = members.filter(t => t.type.kind === 'Array' && + t.type.element.type.kind === first.type.kind); + if (dupes.length === members.length) { + return members[0]; + } + } + return Resolved.union(members, platform); + } + case 'Eval': { + if (flowType.destructor.kind === 'ReactDRO' || + flowType.destructor.kind === 'ReactCheckComponentConfig') { + return convertFlowTypeImpl(flowType.type, loc, genericEnv, platform, poly); + } + unsupportedTypeAnnotation(`EvalT(${flowType.destructor.kind})`, GeneratedSource); + } + case 'Optional': { + return Resolved.union([ + convertFlowTypeImpl(flowType.type, loc, genericEnv, platform), + Resolved.void(platform), + ], platform); + } + default: + unsupportedTypeAnnotation(flowType.kind, GeneratedSource); + } + } + return convertFlowTypeImpl(flowType, loc, new Map(), 'shared'); +} +function serializeLoc(location) { + return `${location.start.line}:${location.start.column}-${location.end.line}:${location.end.column}`; +} +function buildTypeEnvironment(flowOutput) { + const result = new Map(); + for (const item of flowOutput) { + const loc = { + start: { + line: item.loc.start.line, + column: item.loc.start.column - 1, + index: item.loc.start.index, + }, + end: item.loc.end, + filename: item.loc.filename, + identifierName: item.loc.identifierName, + }; + result.set(serializeLoc(loc), item.type); + } + return result; +} +let lastFlowSource = null; +let lastFlowResult = null; +class FlowTypeEnv { + constructor() { + this.moduleEnv = new Map(); + _FlowTypeEnv_nextNominalId.set(this, 0); + _FlowTypeEnv_nextTypeParameterId.set(this, 0); + _FlowTypeEnv_types.set(this, new Map()); + _FlowTypeEnv_bindings.set(this, new Map()); + _FlowTypeEnv_generics.set(this, []); + _FlowTypeEnv_flowTypes.set(this, new Map()); + } + init(env, source) { + CompilerError.invariant(env.config.flowTypeProvider != null, { + reason: 'Expected flowDumpTypes to be defined in environment config', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + let stdout; + if (source === lastFlowSource) { + stdout = lastFlowResult; + } + else { + lastFlowSource = source; + lastFlowResult = env.config.flowTypeProvider(source); + stdout = lastFlowResult; + } + const flowTypes = buildTypeEnvironment(stdout); + const resolvedFlowTypes = new Map(); + for (const [loc, type] of flowTypes) { + if (typeof loc === 'symbol') + continue; + resolvedFlowTypes.set(loc, convertFlowType(JSON.parse(type), loc)); + } + __classPrivateFieldSet(this, _FlowTypeEnv_flowTypes, resolvedFlowTypes, "f"); + } + setType(identifier, type) { + if (typeof identifier.loc !== 'symbol' && + __classPrivateFieldGet(this, _FlowTypeEnv_flowTypes, "f").has(serializeLoc(identifier.loc))) { + return; + } + __classPrivateFieldGet(this, _FlowTypeEnv_types, "f").set(identifier.id, type); + } + getType(identifier) { + const result = this.getTypeOrNull(identifier); + if (result == null) { + throw new Error(`Type not found for ${identifier.id}, ${typeof identifier.loc === 'symbol' ? 'generated loc' : serializeLoc(identifier.loc)}`); + } + return result; + } + getTypeOrNull(identifier) { + var _a; + const result = (_a = __classPrivateFieldGet(this, _FlowTypeEnv_types, "f").get(identifier.id)) !== null && _a !== void 0 ? _a : null; + if (result == null && typeof identifier.loc !== 'symbol') { + const flowType = __classPrivateFieldGet(this, _FlowTypeEnv_flowTypes, "f").get(serializeLoc(identifier.loc)); + return flowType !== null && flowType !== void 0 ? flowType : null; + } + return result; + } + getTypeByLoc(loc) { + if (typeof loc === 'symbol') { + return null; + } + const flowType = __classPrivateFieldGet(this, _FlowTypeEnv_flowTypes, "f").get(serializeLoc(loc)); + return flowType !== null && flowType !== void 0 ? flowType : null; + } + nextNominalId() { + var _a, _b; + return makeNominalId((__classPrivateFieldSet(this, _FlowTypeEnv_nextNominalId, (_b = __classPrivateFieldGet(this, _FlowTypeEnv_nextNominalId, "f"), _a = _b++, _b), "f"), _a)); + } + nextTypeParameterId() { + var _a, _b; + return makeTypeParameterId((__classPrivateFieldSet(this, _FlowTypeEnv_nextTypeParameterId, (_b = __classPrivateFieldGet(this, _FlowTypeEnv_nextTypeParameterId, "f"), _a = _b++, _b), "f"), _a)); + } + addBinding(bindingIdentifier, type) { + __classPrivateFieldGet(this, _FlowTypeEnv_bindings, "f").set(bindingIdentifier, type); + } + resolveBinding(bindingIdentifier) { + var _a; + return (_a = __classPrivateFieldGet(this, _FlowTypeEnv_bindings, "f").get(bindingIdentifier)) !== null && _a !== void 0 ? _a : null; + } + pushGeneric(name, generic) { + __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f").unshift([name, generic]); + } + popGeneric(name) { + for (let i = 0; i < __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f").length; i++) { + if (__classPrivateFieldGet(this, _FlowTypeEnv_generics, "f")[i][0] === name) { + __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f").splice(i, 1); + return; + } + } + } + getGeneric(name) { + for (const [eltName, param] of __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f")) { + if (name === eltName) { + return param; + } + } + return null; + } +} +_FlowTypeEnv_nextNominalId = new WeakMap(), _FlowTypeEnv_nextTypeParameterId = new WeakMap(), _FlowTypeEnv_types = new WeakMap(), _FlowTypeEnv_bindings = new WeakMap(), _FlowTypeEnv_generics = new WeakMap(), _FlowTypeEnv_flowTypes = new WeakMap(); +const Primitives = { + number(platform) { + return { kind: 'Concrete', type: { kind: 'Number' }, platform }; + }, + string(platform) { + return { kind: 'Concrete', type: { kind: 'String' }, platform }; + }, + boolean(platform) { + return { kind: 'Concrete', type: { kind: 'Boolean' }, platform }; + }, + void(platform) { + return { kind: 'Concrete', type: { kind: 'Void' }, platform }; + }, + mixed(platform) { + return { kind: 'Concrete', type: { kind: 'Mixed' }, platform }; + }, + enum(platform) { + return { kind: 'Concrete', type: { kind: 'Enum' }, platform }; + }, + todo(platform) { + return { kind: 'Concrete', type: { kind: 'Mixed' }, platform }; + }, +}; +const Resolved = Object.assign(Object.assign({}, Primitives), { nullable(type, platform) { + return { kind: 'Concrete', type: { kind: 'Nullable', type }, platform }; + }, + array(element, platform) { + return { kind: 'Concrete', type: { kind: 'Array', element }, platform }; + }, + set(element, platform) { + return { kind: 'Concrete', type: { kind: 'Set', element }, platform }; + }, + map(key, value, platform) { + return { kind: 'Concrete', type: { kind: 'Map', key, value }, platform }; + }, + function(typeParameters, params, returnType, platform) { + return { + kind: 'Concrete', + type: { kind: 'Function', typeParameters, params, returnType }, + platform, + }; + }, + component(props, children, platform) { + return { + kind: 'Concrete', + type: { kind: 'Component', props, children }, + platform, + }; + }, + object(id, members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Object', + id, + members, + }, + platform, + }; + }, + class(name, members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Instance', + name, + members, + }, + platform, + }; + }, + tuple(id, members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Tuple', + id, + members, + }, + platform, + }; + }, + generic(id, platform, bound = Primitives.mixed(platform)) { + return { + kind: 'Concrete', + type: { + kind: 'Generic', + id, + bound, + }, + platform, + }; + }, + union(members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Union', + members, + }, + platform, + }; + } }); + +function defaultModuleTypeProvider(moduleName) { + switch (moduleName) { + case 'react-hook-form': { + return { + kind: 'object', + properties: { + useForm: { + kind: 'hook', + returnType: { + kind: 'object', + properties: { + watch: { + kind: 'function', + positionalParams: [], + restParam: Effect.Read, + calleeEffect: Effect.Read, + returnType: { kind: 'type', name: 'Any' }, + returnValueKind: ValueKind.Mutable, + knownIncompatible: `React Hook Form's \`useForm()\` API returns a \`watch()\` function which cannot be memoized safely.`, + }, + }, + }, + }, + }, + }; + } + case '@tanstack/react-table': { + return { + kind: 'object', + properties: { + useReactTable: { + kind: 'hook', + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'type', name: 'Any' }, + knownIncompatible: `TanStack Table's \`useReactTable()\` API returns functions that cannot be memoized safely`, + }, + }, + }; + } + case '@tanstack/react-virtual': { + return { + kind: 'object', + properties: { + useVirtualizer: { + kind: 'hook', + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'type', name: 'Any' }, + knownIncompatible: `TanStack Virtual's \`useVirtualizer()\` API returns functions that cannot be memoized safely`, + }, + }, + }; + } + } + return null; +} + +var _Environment_instances, _Environment_globals, _Environment_shapes, _Environment_moduleTypes, _Environment_nextIdentifer, _Environment_nextBlock, _Environment_nextScope, _Environment_scope, _Environment_outlinedFunctions, _Environment_contextIdentifiers, _Environment_hoistedIdentifiers, _Environment_flowTypeEnvironment, _Environment_resolveModuleType, _Environment_isKnownReactModule, _Environment_getCustomHookType; +const ReactElementSymbolSchema = zod.z.object({ + elementSymbol: zod.z.union([ + zod.z.literal('react.element'), + zod.z.literal('react.transitional.element'), + ]), + globalDevVar: zod.z.string(), +}); +const ExternalFunctionSchema = zod.z.object({ + source: zod.z.string(), + importSpecifierName: zod.z.string(), +}); +const InstrumentationSchema = zod.z + .object({ + fn: ExternalFunctionSchema, + gating: ExternalFunctionSchema.nullable(), + globalGating: zod.z.string().nullable(), +}) + .refine(opts => opts.gating != null || opts.globalGating != null, 'Expected at least one of gating or globalGating'); +const USE_FIRE_FUNCTION_NAME = 'useFire'; +const EMIT_FREEZE_GLOBAL_GATING = 'true'; +const MacroMethodSchema = zod.z.union([ + zod.z.object({ type: zod.z.literal('wildcard') }), + zod.z.object({ type: zod.z.literal('name'), name: zod.z.string() }), +]); +const MacroSchema = zod.z.union([ + zod.z.string(), + zod.z.tuple([zod.z.string(), zod.z.array(MacroMethodSchema)]), +]); +const HookSchema = zod.z.object({ + effectKind: zod.z.nativeEnum(Effect), + valueKind: zod.z.nativeEnum(ValueKind), + noAlias: zod.z.boolean().default(false), + transitiveMixedData: zod.z.boolean().default(false), +}); +const EnvironmentConfigSchema = zod.z.object({ + customHooks: zod.z.map(zod.z.string(), HookSchema).default(new Map()), + moduleTypeProvider: zod.z.nullable(zod.z.function().args(zod.z.string())).default(null), + customMacros: zod.z.nullable(zod.z.array(MacroSchema)).default(null), + enableResetCacheOnSourceFileChanges: zod.z.nullable(zod.z.boolean()).default(null), + enablePreserveExistingMemoizationGuarantees: zod.z.boolean().default(false), + validatePreserveExistingMemoizationGuarantees: zod.z.boolean().default(true), + enablePreserveExistingManualUseMemo: zod.z.boolean().default(false), + enableForest: zod.z.boolean().default(false), + enableUseTypeAnnotations: zod.z.boolean().default(false), + flowTypeProvider: zod.z.nullable(zod.z.function().args(zod.z.string())).default(null), + enableOptionalDependencies: zod.z.boolean().default(true), + enableFire: zod.z.boolean().default(false), + enableNameAnonymousFunctions: zod.z.boolean().default(false), + inferEffectDependencies: zod.z + .nullable(zod.z.array(zod.z.object({ + function: ExternalFunctionSchema, + autodepsIndex: zod.z.number().min(1, 'autodepsIndex must be > 0'), + }))) + .default(null), + inlineJsxTransform: ReactElementSymbolSchema.nullable().default(null), + validateHooksUsage: zod.z.boolean().default(true), + validateRefAccessDuringRender: zod.z.boolean().default(true), + validateNoSetStateInRender: zod.z.boolean().default(true), + validateNoSetStateInEffects: zod.z.boolean().default(false), + validateNoDerivedComputationsInEffects: zod.z.boolean().default(false), + validateNoJSXInTryStatements: zod.z.boolean().default(false), + validateStaticComponents: zod.z.boolean().default(false), + validateMemoizedEffectDependencies: zod.z.boolean().default(false), + validateNoCapitalizedCalls: zod.z.nullable(zod.z.array(zod.z.string())).default(null), + validateBlocklistedImports: zod.z.nullable(zod.z.array(zod.z.string())).default(null), + validateNoImpureFunctionsInRender: zod.z.boolean().default(false), + validateNoFreezingKnownMutableFunctions: zod.z.boolean().default(false), + enableAssumeHooksFollowRulesOfReact: zod.z.boolean().default(true), + enableTransitivelyFreezeFunctionExpressions: zod.z.boolean().default(true), + enableEmitFreeze: ExternalFunctionSchema.nullable().default(null), + enableEmitHookGuards: ExternalFunctionSchema.nullable().default(null), + enableInstructionReordering: zod.z.boolean().default(false), + enableFunctionOutlining: zod.z.boolean().default(true), + enableJsxOutlining: zod.z.boolean().default(false), + enableEmitInstrumentForget: InstrumentationSchema.nullable().default(null), + assertValidMutableRanges: zod.z.boolean().default(false), + enableChangeVariableCodegen: zod.z.boolean().default(false), + enableMemoizationComments: zod.z.boolean().default(false), + throwUnknownException__testonly: zod.z.boolean().default(false), + enableTreatFunctionDepsAsConditional: zod.z.boolean().default(false), + disableMemoizationForDebugging: zod.z.boolean().default(false), + enableChangeDetectionForDebugging: ExternalFunctionSchema.nullable().default(null), + enableCustomTypeDefinitionForReanimated: zod.z.boolean().default(false), + hookPattern: zod.z.string().nullable().default(null), + enableTreatRefLikeIdentifiersAsRefs: zod.z.boolean().default(true), + enableTreatSetIdentifiersAsStateSetters: zod.z.boolean().default(false), + lowerContextAccess: ExternalFunctionSchema.nullable().default(null), + validateNoVoidUseMemo: zod.z.boolean().default(false), + validateNoDynamicallyCreatedComponentsOrHooks: zod.z.boolean().default(false), + enableAllowSetStateFromRefsInEffects: zod.z.boolean().default(true), +}); +class Environment { + constructor(scope, fnType, compilerMode, config, contextIdentifiers, parentFunction, logger, filename, code, programContext) { + _Environment_instances.add(this); + _Environment_globals.set(this, void 0); + _Environment_shapes.set(this, void 0); + _Environment_moduleTypes.set(this, new Map()); + _Environment_nextIdentifer.set(this, 0); + _Environment_nextBlock.set(this, 0); + _Environment_nextScope.set(this, 0); + _Environment_scope.set(this, void 0); + _Environment_outlinedFunctions.set(this, []); + this.inferredEffectLocations = new Set(); + _Environment_contextIdentifiers.set(this, void 0); + _Environment_hoistedIdentifiers.set(this, void 0); + _Environment_flowTypeEnvironment.set(this, void 0); + __classPrivateFieldSet(this, _Environment_scope, scope, "f"); + this.fnType = fnType; + this.compilerMode = compilerMode; + this.config = config; + this.filename = filename; + this.code = code; + this.logger = logger; + this.programContext = programContext; + __classPrivateFieldSet(this, _Environment_shapes, new Map(DEFAULT_SHAPES), "f"); + __classPrivateFieldSet(this, _Environment_globals, new Map(DEFAULT_GLOBALS), "f"); + this.hasFireRewrite = false; + this.hasInferredEffect = false; + if (config.disableMemoizationForDebugging && + config.enableChangeDetectionForDebugging != null) { + CompilerError.throwInvalidConfig({ + reason: `Invalid environment config: the 'disableMemoizationForDebugging' and 'enableChangeDetectionForDebugging' options cannot be used together`, + description: null, + loc: null, + suggestions: null, + }); + } + for (const [hookName, hook] of this.config.customHooks) { + CompilerError.invariant(!__classPrivateFieldGet(this, _Environment_globals, "f").has(hookName), { + reason: `[Globals] Found existing definition in global registry for custom hook ${hookName}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _Environment_globals, "f").set(hookName, addHook(__classPrivateFieldGet(this, _Environment_shapes, "f"), { + positionalParams: [], + restParam: hook.effectKind, + returnType: hook.transitiveMixedData + ? { kind: 'Object', shapeId: BuiltInMixedReadonlyId } + : { kind: 'Poly' }, + returnValueKind: hook.valueKind, + calleeEffect: Effect.Read, + hookKind: 'Custom', + noAlias: hook.noAlias, + })); + } + if (config.enableCustomTypeDefinitionForReanimated) { + const reanimatedModuleType = getReanimatedModuleType(__classPrivateFieldGet(this, _Environment_shapes, "f")); + __classPrivateFieldGet(this, _Environment_moduleTypes, "f").set(REANIMATED_MODULE_NAME, reanimatedModuleType); + } + this.parentFunction = parentFunction; + __classPrivateFieldSet(this, _Environment_contextIdentifiers, contextIdentifiers, "f"); + __classPrivateFieldSet(this, _Environment_hoistedIdentifiers, new Set(), "f"); + if (config.flowTypeProvider != null) { + __classPrivateFieldSet(this, _Environment_flowTypeEnvironment, new FlowTypeEnv(), "f"); + CompilerError.invariant(code != null, { + reason: 'Expected Environment to be initialized with source code when a Flow type provider is specified', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + __classPrivateFieldGet(this, _Environment_flowTypeEnvironment, "f").init(this, code); + } + else { + __classPrivateFieldSet(this, _Environment_flowTypeEnvironment, null, "f"); + } + } + get typeContext() { + CompilerError.invariant(__classPrivateFieldGet(this, _Environment_flowTypeEnvironment, "f") != null, { + reason: 'Flow type environment not initialized', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return __classPrivateFieldGet(this, _Environment_flowTypeEnvironment, "f"); + } + get isInferredMemoEnabled() { + return this.compilerMode !== 'no_inferred_memo'; + } + get nextIdentifierId() { + var _a, _b; + return makeIdentifierId((__classPrivateFieldSet(this, _Environment_nextIdentifer, (_b = __classPrivateFieldGet(this, _Environment_nextIdentifer, "f"), _a = _b++, _b), "f"), _a)); + } + get nextBlockId() { + var _a, _b; + return makeBlockId((__classPrivateFieldSet(this, _Environment_nextBlock, (_b = __classPrivateFieldGet(this, _Environment_nextBlock, "f"), _a = _b++, _b), "f"), _a)); + } + get nextScopeId() { + var _a, _b; + return makeScopeId((__classPrivateFieldSet(this, _Environment_nextScope, (_b = __classPrivateFieldGet(this, _Environment_nextScope, "f"), _a = _b++, _b), "f"), _a)); + } + get scope() { + return __classPrivateFieldGet(this, _Environment_scope, "f"); + } + logErrors(errors) { + if (errors.isOk() || this.logger == null) { + return; + } + for (const error of errors.unwrapErr().details) { + this.logger.logEvent(this.filename, { + kind: 'CompileError', + detail: error, + fnLoc: null, + }); + } + } + isContextIdentifier(node) { + return __classPrivateFieldGet(this, _Environment_contextIdentifiers, "f").has(node); + } + isHoistedIdentifier(node) { + return __classPrivateFieldGet(this, _Environment_hoistedIdentifiers, "f").has(node); + } + generateGloballyUniqueIdentifierName(name) { + const identifierNode = __classPrivateFieldGet(this, _Environment_scope, "f").generateUidIdentifier(name !== null && name !== void 0 ? name : undefined); + return makeIdentifierName(identifierNode.name); + } + outlineFunction(fn, type) { + __classPrivateFieldGet(this, _Environment_outlinedFunctions, "f").push({ fn, type }); + } + getOutlinedFunctions() { + return __classPrivateFieldGet(this, _Environment_outlinedFunctions, "f"); + } + getGlobalDeclaration(binding, loc) { + var _a, _b, _c, _d; + if (this.config.hookPattern != null) { + const match = new RegExp(this.config.hookPattern).exec(binding.name); + if (match != null && + typeof match[1] === 'string' && + isHookName$2(match[1])) { + const resolvedName = match[1]; + return (_a = __classPrivateFieldGet(this, _Environment_globals, "f").get(resolvedName)) !== null && _a !== void 0 ? _a : __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this); + } + } + switch (binding.kind) { + case 'ModuleLocal': { + return isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null; + } + case 'Global': { + return ((_b = __classPrivateFieldGet(this, _Environment_globals, "f").get(binding.name)) !== null && _b !== void 0 ? _b : (isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null)); + } + case 'ImportSpecifier': { + if (__classPrivateFieldGet(this, _Environment_instances, "m", _Environment_isKnownReactModule).call(this, binding.module)) { + return ((_c = __classPrivateFieldGet(this, _Environment_globals, "f").get(binding.imported)) !== null && _c !== void 0 ? _c : (isHookName$2(binding.imported) || isHookName$2(binding.name) + ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) + : null)); + } + else { + const moduleType = __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_resolveModuleType).call(this, binding.module, loc); + if (moduleType !== null) { + const importedType = this.getPropertyType(moduleType, binding.imported); + if (importedType != null) { + const expectHook = isHookName$2(binding.imported); + const isHook = getHookKindForType(this, importedType) != null; + if (expectHook !== isHook) { + CompilerError.throwInvalidConfig({ + reason: `Invalid type configuration for module`, + description: `Expected type for \`import {${binding.imported}} from '${binding.module}'\` ${expectHook ? 'to be a hook' : 'not to be a hook'} based on the exported name`, + loc, + }); + } + return importedType; + } + } + return isHookName$2(binding.imported) || isHookName$2(binding.name) + ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) + : null; + } + } + case 'ImportDefault': + case 'ImportNamespace': { + if (__classPrivateFieldGet(this, _Environment_instances, "m", _Environment_isKnownReactModule).call(this, binding.module)) { + return ((_d = __classPrivateFieldGet(this, _Environment_globals, "f").get(binding.name)) !== null && _d !== void 0 ? _d : (isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null)); + } + else { + const moduleType = __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_resolveModuleType).call(this, binding.module, loc); + if (moduleType !== null) { + let importedType = null; + if (binding.kind === 'ImportDefault') { + const defaultType = this.getPropertyType(moduleType, 'default'); + if (defaultType !== null) { + importedType = defaultType; + } + } + else { + importedType = moduleType; + } + if (importedType !== null) { + const expectHook = isHookName$2(binding.module); + const isHook = getHookKindForType(this, importedType) != null; + if (expectHook !== isHook) { + CompilerError.throwInvalidConfig({ + reason: `Invalid type configuration for module`, + description: `Expected type for \`import ... from '${binding.module}'\` ${expectHook ? 'to be a hook' : 'not to be a hook'} based on the module name`, + loc, + }); + } + return importedType; + } + } + return isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null; + } + } + } + } + getFallthroughPropertyType(receiver, _property) { + var _a; + let shapeId = null; + if (receiver.kind === 'Object' || receiver.kind === 'Function') { + shapeId = receiver.shapeId; + } + if (shapeId !== null) { + const shape = __classPrivateFieldGet(this, _Environment_shapes, "f").get(shapeId); + CompilerError.invariant(shape !== undefined, { + reason: `[HIR] Forget internal error: cannot resolve shape ${shapeId}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return (_a = shape.properties.get('*')) !== null && _a !== void 0 ? _a : null; + } + return null; + } + getPropertyType(receiver, property) { + var _a, _b, _c; + let shapeId = null; + if (receiver.kind === 'Object' || receiver.kind === 'Function') { + shapeId = receiver.shapeId; + } + if (shapeId !== null) { + const shape = __classPrivateFieldGet(this, _Environment_shapes, "f").get(shapeId); + CompilerError.invariant(shape !== undefined, { + reason: `[HIR] Forget internal error: cannot resolve shape ${shapeId}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (typeof property === 'string') { + return ((_b = (_a = shape.properties.get(property)) !== null && _a !== void 0 ? _a : shape.properties.get('*')) !== null && _b !== void 0 ? _b : (isHookName$2(property) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null)); + } + else { + return (_c = shape.properties.get('*')) !== null && _c !== void 0 ? _c : null; + } + } + else if (typeof property === 'string' && isHookName$2(property)) { + return __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this); + } + return null; + } + getFunctionSignature(type) { + const { shapeId } = type; + if (shapeId !== null) { + const shape = __classPrivateFieldGet(this, _Environment_shapes, "f").get(shapeId); + CompilerError.invariant(shape !== undefined, { + reason: `[HIR] Forget internal error: cannot resolve shape ${shapeId}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return shape.functionType; + } + return null; + } + addHoistedIdentifier(node) { + __classPrivateFieldGet(this, _Environment_contextIdentifiers, "f").add(node); + __classPrivateFieldGet(this, _Environment_hoistedIdentifiers, "f").add(node); + } +} +_Environment_globals = new WeakMap(), _Environment_shapes = new WeakMap(), _Environment_moduleTypes = new WeakMap(), _Environment_nextIdentifer = new WeakMap(), _Environment_nextBlock = new WeakMap(), _Environment_nextScope = new WeakMap(), _Environment_scope = new WeakMap(), _Environment_outlinedFunctions = new WeakMap(), _Environment_contextIdentifiers = new WeakMap(), _Environment_hoistedIdentifiers = new WeakMap(), _Environment_flowTypeEnvironment = new WeakMap(), _Environment_instances = new WeakSet(), _Environment_resolveModuleType = function _Environment_resolveModuleType(moduleName, loc) { + var _a; + let moduleType = __classPrivateFieldGet(this, _Environment_moduleTypes, "f").get(moduleName); + if (moduleType === undefined) { + const moduleTypeProvider = (_a = this.config.moduleTypeProvider) !== null && _a !== void 0 ? _a : defaultModuleTypeProvider; + if (moduleTypeProvider == null) { + return null; + } + const unparsedModuleConfig = moduleTypeProvider(moduleName); + if (unparsedModuleConfig != null) { + const parsedModuleConfig = TypeSchema.safeParse(unparsedModuleConfig); + if (!parsedModuleConfig.success) { + CompilerError.throwInvalidConfig({ + reason: `Could not parse module type, the configured \`moduleTypeProvider\` function returned an invalid module description`, + description: parsedModuleConfig.error.toString(), + loc, + }); + } + const moduleConfig = parsedModuleConfig.data; + moduleType = installTypeConfig(__classPrivateFieldGet(this, _Environment_globals, "f"), __classPrivateFieldGet(this, _Environment_shapes, "f"), moduleConfig, moduleName, loc); + } + else { + moduleType = null; + } + __classPrivateFieldGet(this, _Environment_moduleTypes, "f").set(moduleName, moduleType); + } + return moduleType; +}, _Environment_isKnownReactModule = function _Environment_isKnownReactModule(moduleName) { + return (moduleName.toLowerCase() === 'react' || + moduleName.toLowerCase() === 'react-dom'); +}, _Environment_getCustomHookType = function _Environment_getCustomHookType() { + if (this.config.enableAssumeHooksFollowRulesOfReact) { + return DefaultNonmutatingHook; + } + else { + return DefaultMutatingHook; + } +}; +Environment.knownReactModules = ['react', 'react-dom']; +const REANIMATED_MODULE_NAME = 'react-native-reanimated'; +function isHookName$2(name) { + return /^use[A-Z0-9]/.test(name); +} +function parseEnvironmentConfig(partialConfig) { + const config = EnvironmentConfigSchema.safeParse(partialConfig); + if (config.success) { + return Ok(config.data); + } + else { + return Err(config.error); + } +} +function validateEnvironmentConfig(partialConfig) { + const config = EnvironmentConfigSchema.safeParse(partialConfig); + if (config.success) { + return config.data; + } + CompilerError.throwInvalidConfig({ + reason: 'Could not validate environment config. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(config.error)}`, + loc: null, + suggestions: null, + }); +} +function tryParseExternalFunction(maybeExternalFunction) { + const externalFunction = ExternalFunctionSchema.safeParse(maybeExternalFunction); + if (externalFunction.success) { + return externalFunction.data; + } + CompilerError.throwInvalidConfig({ + reason: 'Could not parse external function. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(externalFunction.error)}`, + loc: null, + suggestions: null, + }); +} +const DEFAULT_EXPORT = 'default'; + +var _MergedBlocks_map; +function mergeConsecutiveBlocks(fn) { + const merged = new MergedBlocks(); + const fallthroughBlocks = new Set(); + for (const [, block] of fn.body.blocks) { + const fallthrough = terminalFallthrough(block.terminal); + if (fallthrough !== null) { + fallthroughBlocks.add(fallthrough); + } + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + mergeConsecutiveBlocks(instr.value.loweredFunc.func); + } + } + if (block.preds.size !== 1 || + block.kind !== 'block' || + fallthroughBlocks.has(block.id)) { + continue; + } + const originalPredecessorId = Array.from(block.preds)[0]; + const predecessorId = merged.get(originalPredecessorId); + const predecessor = fn.body.blocks.get(predecessorId); + CompilerError.invariant(predecessor !== undefined, { + reason: `Expected predecessor ${predecessorId} to exist`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (predecessor.terminal.kind !== 'goto' || predecessor.kind !== 'block') { + continue; + } + for (const phi of block.phis) { + CompilerError.invariant(phi.operands.size === 1, { + reason: `Found a block with a single predecessor but where a phi has multiple (${phi.operands.size}) operands`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + const operand = Array.from(phi.operands.values())[0]; + const lvalue = { + kind: 'Identifier', + identifier: phi.place.identifier, + effect: Effect.ConditionallyMutate, + reactive: false, + loc: GeneratedSource, + }; + const instr = { + id: predecessor.terminal.id, + lvalue: Object.assign({}, lvalue), + value: { + kind: 'LoadLocal', + place: Object.assign({}, operand), + loc: GeneratedSource, + }, + effects: [{ kind: 'Alias', from: Object.assign({}, operand), into: Object.assign({}, lvalue) }], + loc: GeneratedSource, + }; + predecessor.instructions.push(instr); + } + predecessor.instructions.push(...block.instructions); + predecessor.terminal = block.terminal; + merged.merge(block.id, predecessorId); + fn.body.blocks.delete(block.id); + } + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const [predecessorId, operand] of phi.operands) { + const mapped = merged.get(predecessorId); + if (mapped !== predecessorId) { + phi.operands.delete(predecessorId); + phi.operands.set(mapped, operand); + } + } + } + } + markPredecessors(fn.body); + for (const [, { terminal }] of fn.body.blocks) { + if (terminalHasFallthrough(terminal)) { + terminal.fallthrough = merged.get(terminal.fallthrough); + } + } +} +class MergedBlocks { + constructor() { + _MergedBlocks_map.set(this, new Map()); + } + merge(block, into) { + const target = this.get(into); + __classPrivateFieldGet(this, _MergedBlocks_map, "f").set(block, target); + } + get(block) { + var _a; + let current = block; + while (__classPrivateFieldGet(this, _MergedBlocks_map, "f").has(current)) { + current = (_a = __classPrivateFieldGet(this, _MergedBlocks_map, "f").get(current)) !== null && _a !== void 0 ? _a : current; + } + return current; + } +} +_MergedBlocks_map = new WeakMap(); + +var _DisjointSet_entries; +class DisjointSet { + constructor() { + _DisjointSet_entries.set(this, new Map()); + } + union(items) { + const first = items.shift(); + CompilerError.invariant(first != null, { + reason: 'Expected set to be non-empty', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + let root = this.find(first); + if (root == null) { + root = first; + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(first, first); + } + for (const item of items) { + let itemParent = __classPrivateFieldGet(this, _DisjointSet_entries, "f").get(item); + if (itemParent == null) { + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(item, root); + continue; + } + else if (itemParent === root) { + continue; + } + else { + let current = item; + while (itemParent !== root) { + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(current, root); + current = itemParent; + itemParent = __classPrivateFieldGet(this, _DisjointSet_entries, "f").get(current); + } + } + } + } + find(item) { + if (!__classPrivateFieldGet(this, _DisjointSet_entries, "f").has(item)) { + return null; + } + const parent = __classPrivateFieldGet(this, _DisjointSet_entries, "f").get(item); + if (parent === item) { + return item; + } + const root = this.find(parent); + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(item, root); + return root; + } + has(item) { + return __classPrivateFieldGet(this, _DisjointSet_entries, "f").has(item); + } + canonicalize() { + const entries = new Map(); + for (const item of __classPrivateFieldGet(this, _DisjointSet_entries, "f").keys()) { + const root = this.find(item); + entries.set(item, root); + } + return entries; + } + forEach(fn) { + for (const item of __classPrivateFieldGet(this, _DisjointSet_entries, "f").keys()) { + const group = this.find(item); + fn(item, group); + } + } + buildSets() { + const ids = new Map(); + const sets = new Map(); + this.forEach((identifier, groupIdentifier) => { + let id = ids.get(groupIdentifier); + if (id == null) { + id = ids.size; + ids.set(groupIdentifier, id); + } + let set = sets.get(id); + if (set === undefined) { + set = new Set(); + sets.set(id, set); + } + set.add(identifier); + }); + return [...sets.values()]; + } + get size() { + return __classPrivateFieldGet(this, _DisjointSet_entries, "f").size; + } +} +_DisjointSet_entries = new WeakMap(); + +function inferReactiveScopeVariables(fn) { + var _a, _b; + const scopeIdentifiers = findDisjointMutableValues(fn); + const scopes = new Map(); + scopeIdentifiers.forEach((identifier, groupIdentifier) => { + let scope = scopes.get(groupIdentifier); + if (scope === undefined) { + scope = { + id: fn.env.nextScopeId, + range: identifier.mutableRange, + dependencies: new Set(), + declarations: new Map(), + reassignments: new Set(), + earlyReturnValue: null, + merged: new Set(), + loc: identifier.loc, + }; + scopes.set(groupIdentifier, scope); + } + else { + if (scope.range.start === 0) { + scope.range.start = identifier.mutableRange.start; + } + else if (identifier.mutableRange.start !== 0) { + scope.range.start = makeInstructionId(Math.min(scope.range.start, identifier.mutableRange.start)); + } + scope.range.end = makeInstructionId(Math.max(scope.range.end, identifier.mutableRange.end)); + scope.loc = mergeLocation(scope.loc, identifier.loc); + } + identifier.scope = scope; + identifier.mutableRange = scope.range; + }); + let maxInstruction = 0; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + maxInstruction = makeInstructionId(Math.max(maxInstruction, instr.id)); + } + maxInstruction = makeInstructionId(Math.max(maxInstruction, block.terminal.id)); + } + for (const [, scope] of scopes) { + if (scope.range.start === 0 || + scope.range.end === 0 || + maxInstruction === 0 || + scope.range.end > maxInstruction + 1) { + (_b = (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, { + kind: 'hir', + name: 'InferReactiveScopeVariables (invalid scope)', + value: fn, + }); + CompilerError.invariant(false, { + reason: `Invalid mutable range for scope`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + description: `Scope @${scope.id} has range [${scope.range.start}:${scope.range.end}] but the valid range is [1:${maxInstruction + 1}]`, + }); + } + } +} +function mergeLocation(l, r) { + if (l === GeneratedSource) { + return r; + } + else if (r === GeneratedSource) { + return l; + } + else { + return { + filename: l.filename, + identifierName: l.identifierName, + start: { + index: Math.min(l.start.index, r.start.index), + line: Math.min(l.start.line, r.start.line), + column: Math.min(l.start.column, r.start.column), + }, + end: { + index: Math.max(l.end.index, r.end.index), + line: Math.max(l.end.line, r.end.line), + column: Math.max(l.end.column, r.end.column), + }, + }; + } +} +function isMutable(instr, place) { + return inRange(instr, place.identifier.mutableRange); +} +function inRange({ id }, range) { + return id >= range.start && id < range.end; +} +function mayAllocate(_env, instruction) { + const { value } = instruction; + switch (value.kind) { + case 'Destructure': { + return doesPatternContainSpreadElement(value.lvalue.pattern); + } + case 'PostfixUpdate': + case 'PrefixUpdate': + case 'Await': + case 'DeclareLocal': + case 'DeclareContext': + case 'StoreLocal': + case 'LoadGlobal': + case 'MetaProperty': + case 'TypeCastExpression': + case 'LoadLocal': + case 'LoadContext': + case 'StoreContext': + case 'PropertyDelete': + case 'ComputedLoad': + case 'ComputedDelete': + case 'JSXText': + case 'TemplateLiteral': + case 'Primitive': + case 'GetIterator': + case 'IteratorNext': + case 'NextPropertyOf': + case 'Debugger': + case 'StartMemoize': + case 'FinishMemoize': + case 'UnaryExpression': + case 'BinaryExpression': + case 'PropertyLoad': + case 'StoreGlobal': { + return false; + } + case 'TaggedTemplateExpression': + case 'CallExpression': + case 'MethodCall': { + return instruction.lvalue.identifier.type.kind !== 'Primitive'; + } + case 'RegExpLiteral': + case 'PropertyStore': + case 'ComputedStore': + case 'ArrayExpression': + case 'JsxExpression': + case 'JsxFragment': + case 'NewExpression': + case 'ObjectExpression': + case 'UnsupportedNode': + case 'ObjectMethod': + case 'FunctionExpression': { + return true; + } + default: { + assertExhaustive$1(value, `Unexpected value kind \`${value.kind}\``); + } + } +} +function findDisjointMutableValues(fn) { + var _a, _b; + const scopeIdentifiers = new DisjointSet(); + const declarations = new Map(); + function declareIdentifier(lvalue) { + if (!declarations.has(lvalue.identifier.declarationId)) { + declarations.set(lvalue.identifier.declarationId, lvalue.identifier); + } + } + for (const [_, block] of fn.body.blocks) { + for (const phi of block.phis) { + if (phi.place.identifier.mutableRange.start + 1 !== + phi.place.identifier.mutableRange.end && + phi.place.identifier.mutableRange.end > + ((_b = (_a = block.instructions.at(0)) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : block.terminal.id)) { + const operands = [phi.place.identifier]; + const declaration = declarations.get(phi.place.identifier.declarationId); + if (declaration !== undefined) { + operands.push(declaration); + } + for (const [_, phiId] of phi.operands) { + operands.push(phiId.identifier); + } + scopeIdentifiers.union(operands); + } + else if (fn.env.config.enableForest) { + for (const [, phiId] of phi.operands) { + scopeIdentifiers.union([phi.place.identifier, phiId.identifier]); + } + } + } + for (const instr of block.instructions) { + const operands = []; + const range = instr.lvalue.identifier.mutableRange; + if (range.end > range.start + 1 || mayAllocate(fn.env, instr)) { + operands.push(instr.lvalue.identifier); + } + if (instr.value.kind === 'DeclareLocal' || + instr.value.kind === 'DeclareContext') { + declareIdentifier(instr.value.lvalue.place); + } + else if (instr.value.kind === 'StoreLocal' || + instr.value.kind === 'StoreContext') { + declareIdentifier(instr.value.lvalue.place); + if (instr.value.lvalue.place.identifier.mutableRange.end > + instr.value.lvalue.place.identifier.mutableRange.start + 1) { + operands.push(instr.value.lvalue.place.identifier); + } + if (isMutable(instr, instr.value.value) && + instr.value.value.identifier.mutableRange.start > 0) { + operands.push(instr.value.value.identifier); + } + } + else if (instr.value.kind === 'Destructure') { + for (const place of eachPatternOperand(instr.value.lvalue.pattern)) { + declareIdentifier(place); + if (place.identifier.mutableRange.end > + place.identifier.mutableRange.start + 1) { + operands.push(place.identifier); + } + } + if (isMutable(instr, instr.value.value) && + instr.value.value.identifier.mutableRange.start > 0) { + operands.push(instr.value.value.identifier); + } + } + else if (instr.value.kind === 'MethodCall') { + for (const operand of eachInstructionOperand(instr)) { + if (isMutable(instr, operand) && + operand.identifier.mutableRange.start > 0) { + operands.push(operand.identifier); + } + } + operands.push(instr.value.property.identifier); + } + else { + for (const operand of eachInstructionOperand(instr)) { + if (isMutable(instr, operand) && + operand.identifier.mutableRange.start > 0) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + if (operand.identifier.type.kind === 'Primitive') { + continue; + } + } + operands.push(operand.identifier); + } + } + } + if (operands.length !== 0) { + scopeIdentifiers.union(operands); + } + } + } + return scopeIdentifiers; +} + +function mergeOverlappingReactiveScopesHIR(fn) { + const scopesInfo = collectScopeInfo(fn); + const joinedScopes = getOverlappingReactiveScopes(fn, scopesInfo); + joinedScopes.forEach((scope, groupScope) => { + if (scope !== groupScope) { + groupScope.range.start = makeInstructionId(Math.min(groupScope.range.start, scope.range.start)); + groupScope.range.end = makeInstructionId(Math.max(groupScope.range.end, scope.range.end)); + } + }); + for (const [place, originalScope] of scopesInfo.placeScopes) { + const nextScope = joinedScopes.find(originalScope); + if (nextScope !== null && nextScope !== originalScope) { + place.identifier.scope = nextScope; + } + } +} +function collectScopeInfo(fn) { + const scopeStarts = new Map(); + const scopeEnds = new Map(); + const placeScopes = new Map(); + function collectPlaceScope(place) { + const scope = place.identifier.scope; + if (scope != null) { + placeScopes.set(place, scope); + if (scope.range.start !== scope.range.end) { + getOrInsertDefault(scopeStarts, scope.range.start, new Set()).add(scope); + getOrInsertDefault(scopeEnds, scope.range.end, new Set()).add(scope); + } + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + collectPlaceScope(operand); + } + for (const operand of eachInstructionOperand(instr)) { + collectPlaceScope(operand); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + collectPlaceScope(operand); + } + } + return { + scopeStarts: [...scopeStarts.entries()] + .map(([id, scopes]) => ({ id, scopes })) + .sort((a, b) => b.id - a.id), + scopeEnds: [...scopeEnds.entries()] + .map(([id, scopes]) => ({ id, scopes })) + .sort((a, b) => b.id - a.id), + placeScopes, + }; +} +function visitInstructionId(id, { scopeEnds, scopeStarts }, { activeScopes, joined }) { + const scopeEndTop = scopeEnds.at(-1); + if (scopeEndTop != null && scopeEndTop.id <= id) { + scopeEnds.pop(); + const scopesSortedStartDescending = [...scopeEndTop.scopes].sort((a, b) => b.range.start - a.range.start); + for (const scope of scopesSortedStartDescending) { + const idx = activeScopes.indexOf(scope); + if (idx !== -1) { + if (idx !== activeScopes.length - 1) { + joined.union([scope, ...activeScopes.slice(idx + 1)]); + } + activeScopes.splice(idx, 1); + } + } + } + const scopeStartTop = scopeStarts.at(-1); + if (scopeStartTop != null && scopeStartTop.id <= id) { + scopeStarts.pop(); + const scopesSortedEndDescending = [...scopeStartTop.scopes].sort((a, b) => b.range.end - a.range.end); + activeScopes.push(...scopesSortedEndDescending); + for (let i = 1; i < scopesSortedEndDescending.length; i++) { + const prev = scopesSortedEndDescending[i - 1]; + const curr = scopesSortedEndDescending[i]; + if (prev.range.end === curr.range.end) { + joined.union([prev, curr]); + } + } + } +} +function visitPlace(id, place, { activeScopes, joined }) { + const placeScope = getPlaceScope(id, place); + if (placeScope != null && isMutable({ id }, place)) { + const placeScopeIdx = activeScopes.indexOf(placeScope); + if (placeScopeIdx !== -1 && placeScopeIdx !== activeScopes.length - 1) { + joined.union([placeScope, ...activeScopes.slice(placeScopeIdx + 1)]); + } + } +} +function getOverlappingReactiveScopes(fn, context) { + const state = { + joined: new DisjointSet(), + activeScopes: [], + }; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + visitInstructionId(instr.id, context, state); + for (const place of eachInstructionOperand(instr)) { + if ((instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') && + place.identifier.type.kind === 'Primitive') { + continue; + } + visitPlace(instr.id, place, state); + } + for (const place of eachInstructionLValue(instr)) { + visitPlace(instr.id, place, state); + } + } + visitInstructionId(block.terminal.id, context, state); + for (const place of eachTerminalOperand(block.terminal)) { + visitPlace(block.terminal.id, place, state); + } + } + return state.joined; +} + +function pruneUnusedLabelsHIR(fn) { + var _a; + const merged = []; + const rewrites = new Map(); + for (const [blockId, block] of fn.body.blocks) { + const terminal = block.terminal; + if (terminal.kind === 'label') { + const { block: nextId, fallthrough: fallthroughId } = terminal; + const next = fn.body.blocks.get(nextId); + const fallthrough = fn.body.blocks.get(fallthroughId); + if (next.terminal.kind === 'goto' && + next.terminal.variant === GotoVariant.Break && + next.terminal.block === fallthroughId) { + if (next.kind === 'block' && fallthrough.kind === 'block') { + merged.push({ + label: blockId, + next: nextId, + fallthrough: fallthroughId, + }); + } + } + } + } + for (const { label: originalLabelId, next: nextId, fallthrough: fallthroughId, } of merged) { + const labelId = (_a = rewrites.get(originalLabelId)) !== null && _a !== void 0 ? _a : originalLabelId; + const label = fn.body.blocks.get(labelId); + const next = fn.body.blocks.get(nextId); + const fallthrough = fn.body.blocks.get(fallthroughId); + CompilerError.invariant(next.phis.size === 0 && fallthrough.phis.size === 0, { + reason: 'Unexpected phis when merging label blocks', + description: null, + details: [ + { + kind: 'error', + loc: label.terminal.loc, + message: null, + }, + ], + }); + CompilerError.invariant(next.preds.size === 1 && + fallthrough.preds.size === 1 && + next.preds.has(originalLabelId) && + fallthrough.preds.has(nextId), { + reason: 'Unexpected block predecessors when merging label blocks', + description: null, + details: [ + { + kind: 'error', + loc: label.terminal.loc, + message: null, + }, + ], + }); + label.instructions.push(...next.instructions, ...fallthrough.instructions); + label.terminal = fallthrough.terminal; + fn.body.blocks.delete(nextId); + fn.body.blocks.delete(fallthroughId); + rewrites.set(fallthroughId, labelId); + } + for (const [_, block] of fn.body.blocks) { + for (const pred of block.preds) { + const rewritten = rewrites.get(pred); + if (rewritten != null) { + block.preds.delete(pred); + block.preds.add(rewritten); + } + } + } +} + +function isComponentDeclaration(node) { + return Object.prototype.hasOwnProperty.call(node, '__componentDeclaration'); +} + +function isHookDeclaration(node) { + return Object.prototype.hasOwnProperty.call(node, '__hookDeclaration'); +} + +const DEFAULT_IDENTIFIER_INFO = { + reassigned: false, + reassignedByInnerFn: false, + referencedByInnerFn: false, +}; +const withFunctionScope = { + enter: function (path, state) { + state.currentFn.push(path); + }, + exit: function (_, state) { + state.currentFn.pop(); + }, +}; +function findContextIdentifiers(func) { + const state = { + currentFn: [], + identifiers: new Map(), + }; + func.traverse({ + FunctionDeclaration: withFunctionScope, + FunctionExpression: withFunctionScope, + ArrowFunctionExpression: withFunctionScope, + ObjectMethod: withFunctionScope, + AssignmentExpression(path, state) { + var _a, _b; + const left = path.get('left'); + if (left.isLVal()) { + const currentFn = (_a = state.currentFn.at(-1)) !== null && _a !== void 0 ? _a : null; + handleAssignment(currentFn, state.identifiers, left); + } + else { + CompilerError.throwTodo({ + reason: `Unsupported syntax on the left side of an AssignmentExpression`, + description: `Expected an LVal, got: ${left.type}`, + loc: (_b = left.node.loc) !== null && _b !== void 0 ? _b : null, + }); + } + }, + UpdateExpression(path, state) { + var _a; + const argument = path.get('argument'); + const currentFn = (_a = state.currentFn.at(-1)) !== null && _a !== void 0 ? _a : null; + if (argument.isLVal()) { + handleAssignment(currentFn, state.identifiers, argument); + } + }, + Identifier(path, state) { + var _a; + const currentFn = (_a = state.currentFn.at(-1)) !== null && _a !== void 0 ? _a : null; + if (path.isReferencedIdentifier()) { + handleIdentifier$1(currentFn, state.identifiers, path); + } + }, + }, state); + const result = new Set(); + for (const [id, info] of state.identifiers.entries()) { + if (info.reassignedByInnerFn) { + result.add(id); + } + else if (info.reassigned && info.referencedByInnerFn) { + result.add(id); + } + } + return result; +} +function handleIdentifier$1(currentFn, identifiers, path) { + const name = path.node.name; + const binding = path.scope.getBinding(name); + if (binding == null) { + return; + } + const identifier = getOrInsertDefault(identifiers, binding.identifier, Object.assign({}, DEFAULT_IDENTIFIER_INFO)); + if (currentFn != null) { + const bindingAboveLambdaScope = currentFn.scope.parent.getBinding(name); + if (binding === bindingAboveLambdaScope) { + identifier.referencedByInnerFn = true; + } + } +} +function handleAssignment(currentFn, identifiers, lvalPath) { + var _a, _b, _c; + const lvalNode = lvalPath.node; + switch (lvalNode.type) { + case 'Identifier': { + const path = lvalPath; + const name = path.node.name; + const binding = path.scope.getBinding(name); + if (binding == null) { + break; + } + const state = getOrInsertDefault(identifiers, binding.identifier, Object.assign({}, DEFAULT_IDENTIFIER_INFO)); + state.reassigned = true; + if (currentFn != null) { + const bindingAboveLambdaScope = currentFn.scope.parent.getBinding(name); + if (binding === bindingAboveLambdaScope) { + state.reassignedByInnerFn = true; + } + } + break; + } + case 'ArrayPattern': { + const path = lvalPath; + for (const element of path.get('elements')) { + if (nonNull(element)) { + handleAssignment(currentFn, identifiers, element); + } + } + break; + } + case 'ObjectPattern': { + const path = lvalPath; + for (const property of path.get('properties')) { + if (property.isObjectProperty()) { + const valuePath = property.get('value'); + CompilerError.invariant(valuePath.isLVal(), { + reason: `[FindContextIdentifiers] Expected object property value to be an LVal, got: ${valuePath.type}`, + description: null, + details: [ + { + kind: 'error', + loc: (_a = valuePath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + handleAssignment(currentFn, identifiers, valuePath); + } + else { + CompilerError.invariant(property.isRestElement(), { + reason: `[FindContextIdentifiers] Invalid assumptions for babel types.`, + description: null, + details: [ + { + kind: 'error', + loc: (_b = property.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + handleAssignment(currentFn, identifiers, property); + } + } + break; + } + case 'AssignmentPattern': { + const path = lvalPath; + const left = path.get('left'); + handleAssignment(currentFn, identifiers, left); + break; + } + case 'RestElement': { + const path = lvalPath; + handleAssignment(currentFn, identifiers, path.get('argument')); + break; + } + case 'MemberExpression': { + break; + } + default: { + CompilerError.throwTodo({ + reason: `[FindContextIdentifiers] Cannot handle Object destructuring assignment target ${lvalNode.type}`, + description: null, + loc: (_c = lvalNode.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + suggestions: null, + }); + } + } +} +function nonNull(t) { + return t.node != null; +} + +function eliminateRedundantPhi(fn, sharedRewrites) { + const ir = fn.body; + const rewrites = sharedRewrites != null ? sharedRewrites : new Map(); + let hasBackEdge = false; + const visited = new Set(); + let size = rewrites.size; + do { + size = rewrites.size; + for (const [blockId, block] of ir.blocks) { + if (!hasBackEdge) { + for (const predId of block.preds) { + if (!visited.has(predId)) { + hasBackEdge = true; + } + } + } + visited.add(blockId); + phis: for (const phi of block.phis) { + phi.operands.forEach((place, _) => rewritePlace(place, rewrites)); + let same = null; + for (const [_, operand] of phi.operands) { + if ((same !== null && operand.identifier.id === same.id) || + operand.identifier.id === phi.place.identifier.id) { + continue; + } + else if (same !== null) { + continue phis; + } + else { + same = operand.identifier; + } + } + CompilerError.invariant(same !== null, { + reason: 'Expected phis to be non-empty', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + rewrites.set(phi.place.identifier, same); + block.phis.delete(phi); + } + for (const instr of block.instructions) { + for (const place of eachInstructionLValue(instr)) { + rewritePlace(place, rewrites); + } + for (const place of eachInstructionOperand(instr)) { + rewritePlace(place, rewrites); + } + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + const { context } = instr.value.loweredFunc.func; + for (const place of context) { + rewritePlace(place, rewrites); + } + eliminateRedundantPhi(instr.value.loweredFunc.func, rewrites); + } + } + const { terminal } = block; + for (const place of eachTerminalOperand(terminal)) { + rewritePlace(place, rewrites); + } + } + } while (rewrites.size > size && hasBackEdge); +} +function rewritePlace(place, rewrites) { + const rewrite = rewrites.get(place.identifier); + if (rewrite != null) { + place.identifier = rewrite; + } +} + +var _SSABuilder_states, _SSABuilder_current, _SSABuilder_blocks, _SSABuilder_env, _SSABuilder_unknown, _SSABuilder_context; +class SSABuilder { + constructor(env, blocks) { + _SSABuilder_states.set(this, new Map()); + _SSABuilder_current.set(this, null); + this.unsealedPreds = new Map(); + _SSABuilder_blocks.set(this, void 0); + _SSABuilder_env.set(this, void 0); + _SSABuilder_unknown.set(this, new Set()); + _SSABuilder_context.set(this, new Set()); + __classPrivateFieldSet(this, _SSABuilder_blocks, new Map(blocks), "f"); + __classPrivateFieldSet(this, _SSABuilder_env, env, "f"); + } + get nextSsaId() { + return __classPrivateFieldGet(this, _SSABuilder_env, "f").nextIdentifierId; + } + defineFunction(func) { + for (const [id, block] of func.body.blocks) { + __classPrivateFieldGet(this, _SSABuilder_blocks, "f").set(id, block); + } + } + enter(fn) { + const current = __classPrivateFieldGet(this, _SSABuilder_current, "f"); + fn(); + __classPrivateFieldSet(this, _SSABuilder_current, current, "f"); + } + state() { + CompilerError.invariant(__classPrivateFieldGet(this, _SSABuilder_current, "f") !== null, { + reason: 'we need to be in a block to access state!', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return __classPrivateFieldGet(this, _SSABuilder_states, "f").get(__classPrivateFieldGet(this, _SSABuilder_current, "f")); + } + makeId(oldId) { + return { + id: this.nextSsaId, + declarationId: oldId.declarationId, + name: oldId.name, + mutableRange: { + start: makeInstructionId(0), + end: makeInstructionId(0), + }, + scope: null, + type: makeType(), + loc: oldId.loc, + }; + } + defineContext(oldPlace) { + const newPlace = this.definePlace(oldPlace); + __classPrivateFieldGet(this, _SSABuilder_context, "f").add(oldPlace.identifier); + return newPlace; + } + definePlace(oldPlace) { + const oldId = oldPlace.identifier; + if (__classPrivateFieldGet(this, _SSABuilder_unknown, "f").has(oldId)) { + CompilerError.throwTodo({ + reason: `[hoisting] EnterSSA: Expected identifier to be defined before being used`, + description: `Identifier ${printIdentifier(oldId)} is undefined`, + loc: oldPlace.loc, + suggestions: null, + }); + } + if (__classPrivateFieldGet(this, _SSABuilder_context, "f").has(oldId)) { + return this.getPlace(oldPlace); + } + const newId = this.makeId(oldId); + this.state().defs.set(oldId, newId); + return Object.assign(Object.assign({}, oldPlace), { identifier: newId }); + } + getPlace(oldPlace) { + const newId = this.getIdAt(oldPlace, __classPrivateFieldGet(this, _SSABuilder_current, "f").id); + return Object.assign(Object.assign({}, oldPlace), { identifier: newId }); + } + getIdAt(oldPlace, blockId) { + const block = __classPrivateFieldGet(this, _SSABuilder_blocks, "f").get(blockId); + const state = __classPrivateFieldGet(this, _SSABuilder_states, "f").get(block); + if (state.defs.has(oldPlace.identifier)) { + return state.defs.get(oldPlace.identifier); + } + if (block.preds.size == 0) { + __classPrivateFieldGet(this, _SSABuilder_unknown, "f").add(oldPlace.identifier); + return oldPlace.identifier; + } + if (this.unsealedPreds.get(block) > 0) { + const newId = this.makeId(oldPlace.identifier); + state.incompletePhis.push({ + oldPlace, + newPlace: Object.assign(Object.assign({}, oldPlace), { identifier: newId }), + }); + state.defs.set(oldPlace.identifier, newId); + return newId; + } + if (block.preds.size == 1) { + const [pred] = block.preds; + const newId = this.getIdAt(oldPlace, pred); + state.defs.set(oldPlace.identifier, newId); + return newId; + } + const newId = this.makeId(oldPlace.identifier); + state.defs.set(oldPlace.identifier, newId); + return this.addPhi(block, oldPlace, Object.assign(Object.assign({}, oldPlace), { identifier: newId })); + } + addPhi(block, oldPlace, newPlace) { + const predDefs = new Map(); + for (const predBlockId of block.preds) { + const predId = this.getIdAt(oldPlace, predBlockId); + predDefs.set(predBlockId, Object.assign(Object.assign({}, oldPlace), { identifier: predId })); + } + const phi = { + kind: 'Phi', + place: newPlace, + operands: predDefs, + }; + block.phis.add(phi); + return newPlace.identifier; + } + fixIncompletePhis(block) { + const state = __classPrivateFieldGet(this, _SSABuilder_states, "f").get(block); + for (const phi of state.incompletePhis) { + this.addPhi(block, phi.oldPlace, phi.newPlace); + } + } + startBlock(block) { + __classPrivateFieldSet(this, _SSABuilder_current, block, "f"); + __classPrivateFieldGet(this, _SSABuilder_states, "f").set(block, { + defs: new Map(), + incompletePhis: [], + }); + } + print() { + var _a; + const text = []; + for (const [block, state] of __classPrivateFieldGet(this, _SSABuilder_states, "f")) { + text.push(`bb${block.id}:`); + for (const [oldId, newId] of state.defs) { + text.push(` \$${printIdentifier(oldId)}: \$${printIdentifier(newId)}`); + } + for (const incompletePhi of state.incompletePhis) { + text.push(` iphi \$${printPlace(incompletePhi.newPlace)} = \$${printPlace(incompletePhi.oldPlace)}`); + } + } + text.push(`current block: bb${(_a = __classPrivateFieldGet(this, _SSABuilder_current, "f")) === null || _a === void 0 ? void 0 : _a.id}`); + console.log(text.join('\n')); + } +} +_SSABuilder_states = new WeakMap(), _SSABuilder_current = new WeakMap(), _SSABuilder_blocks = new WeakMap(), _SSABuilder_env = new WeakMap(), _SSABuilder_unknown = new WeakMap(), _SSABuilder_context = new WeakMap(); +function enterSSA(func) { + const builder = new SSABuilder(func.env, func.body.blocks); + enterSSAImpl(func, builder, func.body.entry); +} +function enterSSAImpl(func, builder, rootEntry) { + const visitedBlocks = new Set(); + for (const [blockId, block] of func.body.blocks) { + CompilerError.invariant(!visitedBlocks.has(block), { + reason: `found a cycle! visiting bb${block.id} again`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + visitedBlocks.add(block); + builder.startBlock(block); + if (blockId === rootEntry) { + CompilerError.invariant(func.context.length === 0, { + reason: `Expected function context to be empty for outer function declarations`, + description: null, + details: [ + { + kind: 'error', + loc: func.loc, + message: null, + }, + ], + suggestions: null, + }); + func.params = func.params.map(param => { + if (param.kind === 'Identifier') { + return builder.definePlace(param); + } + else { + return { + kind: 'Spread', + place: builder.definePlace(param.place), + }; + } + }); + } + for (const instr of block.instructions) { + mapInstructionOperands(instr, place => builder.getPlace(place)); + mapInstructionLValues(instr, lvalue => builder.definePlace(lvalue)); + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + const loweredFunc = instr.value.loweredFunc.func; + const entry = loweredFunc.body.blocks.get(loweredFunc.body.entry); + CompilerError.invariant(entry.preds.size === 0, { + reason: 'Expected function expression entry block to have zero predecessors', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + entry.preds.add(blockId); + builder.defineFunction(loweredFunc); + builder.enter(() => { + loweredFunc.params = loweredFunc.params.map(param => { + if (param.kind === 'Identifier') { + return builder.definePlace(param); + } + else { + return { + kind: 'Spread', + place: builder.definePlace(param.place), + }; + } + }); + enterSSAImpl(loweredFunc, builder, rootEntry); + }); + entry.preds.clear(); + } + } + mapTerminalOperands(block.terminal, place => builder.getPlace(place)); + for (const outputId of eachTerminalSuccessor(block.terminal)) { + const output = func.body.blocks.get(outputId); + let count; + if (builder.unsealedPreds.has(output)) { + count = builder.unsealedPreds.get(output) - 1; + } + else { + count = output.preds.size - 1; + } + builder.unsealedPreds.set(output, count); + if (count === 0 && visitedBlocks.has(output)) { + builder.fixIncompletePhis(output); + } + } + } +} + +function rewriteInstructionKindsBasedOnReassignment(fn) { + const declarations = new Map(); + for (const param of fn.params) { + let place = param.kind === 'Identifier' ? param : param.place; + if (place.identifier.name !== null) { + declarations.set(place.identifier.declarationId, { + kind: InstructionKind.Let, + place, + }); + } + } + for (const place of fn.context) { + if (place.identifier.name !== null) { + declarations.set(place.identifier.declarationId, { + kind: InstructionKind.Let, + place, + }); + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'DeclareLocal': { + const lvalue = value.lvalue; + CompilerError.invariant(!declarations.has(lvalue.place.identifier.declarationId), { + reason: `Expected variable not to be defined prior to declaration`, + description: `${printPlace(lvalue.place)} was already defined`, + details: [ + { + kind: 'error', + loc: lvalue.place.loc, + message: null, + }, + ], + }); + declarations.set(lvalue.place.identifier.declarationId, lvalue); + break; + } + case 'StoreLocal': { + const lvalue = value.lvalue; + if (lvalue.place.identifier.name !== null) { + const declaration = declarations.get(lvalue.place.identifier.declarationId); + if (declaration === undefined) { + CompilerError.invariant(!declarations.has(lvalue.place.identifier.declarationId), { + reason: `Expected variable not to be defined prior to declaration`, + description: `${printPlace(lvalue.place)} was already defined`, + details: [ + { + kind: 'error', + loc: lvalue.place.loc, + message: null, + }, + ], + }); + declarations.set(lvalue.place.identifier.declarationId, lvalue); + lvalue.kind = InstructionKind.Const; + } + else { + declaration.kind = InstructionKind.Let; + lvalue.kind = InstructionKind.Reassign; + } + } + break; + } + case 'Destructure': { + const lvalue = value.lvalue; + let kind = null; + for (const place of eachPatternOperand(lvalue.pattern)) { + if (place.identifier.name === null) { + CompilerError.invariant(kind === null || kind === InstructionKind.Const, { + reason: `Expected consistent kind for destructuring`, + description: `other places were \`${kind}\` but '${printPlace(place)}' is const`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'Expected consistent kind for destructuring', + }, + ], + suggestions: null, + }); + kind = InstructionKind.Const; + } + else { + const declaration = declarations.get(place.identifier.declarationId); + if (declaration === undefined) { + CompilerError.invariant(block.kind !== 'value', { + reason: `TODO: Handle reassignment in a value block where the original declaration was removed by dead code elimination (DCE)`, + description: null, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + declarations.set(place.identifier.declarationId, lvalue); + CompilerError.invariant(kind === null || kind === InstructionKind.Const, { + reason: `Expected consistent kind for destructuring`, + description: `Other places were \`${kind}\` but '${printPlace(place)}' is const`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'Expected consistent kind for destructuring', + }, + ], + suggestions: null, + }); + kind = InstructionKind.Const; + } + else { + CompilerError.invariant(kind === null || kind === InstructionKind.Reassign, { + reason: `Expected consistent kind for destructuring`, + description: `Other places were \`${kind}\` but '${printPlace(place)}' is reassigned`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'Expected consistent kind for destructuring', + }, + ], + suggestions: null, + }); + kind = InstructionKind.Reassign; + declaration.kind = InstructionKind.Let; + } + } + } + CompilerError.invariant(kind !== null, { + reason: 'Expected at least one operand', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + lvalue.kind = kind; + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + const lvalue = value.lvalue; + const declaration = declarations.get(lvalue.identifier.declarationId); + CompilerError.invariant(declaration !== undefined, { + reason: `Expected variable to have been defined`, + description: `No declaration for ${printPlace(lvalue)}`, + details: [ + { + kind: 'error', + loc: lvalue.loc, + message: null, + }, + ], + }); + declaration.kind = InstructionKind.Let; + break; + } + } + } + } +} + +function constantPropagation(fn) { + const constants = new Map(); + constantPropagationImpl(fn, constants); +} +function constantPropagationImpl(fn, constants) { + while (true) { + const haveTerminalsChanged = applyConstantPropagation(fn, constants); + if (!haveTerminalsChanged) { + break; + } + reversePostorderBlocks(fn.body); + removeUnreachableForUpdates(fn.body); + removeDeadDoWhileStatements(fn.body); + removeUnnecessaryTryCatch(fn.body); + markInstructionIds(fn.body); + markPredecessors(fn.body); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const [predecessor] of phi.operands) { + if (!block.preds.has(predecessor)) { + phi.operands.delete(predecessor); + } + } + } + } + eliminateRedundantPhi(fn); + mergeConsecutiveBlocks(fn); + assertConsistentIdentifiers(fn); + assertTerminalSuccessorsExist(fn); + } +} +function applyConstantPropagation(fn, constants) { + let hasChanges = false; + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + let value = evaluatePhi(phi, constants); + if (value !== null) { + constants.set(phi.place.identifier.id, value); + } + } + for (let i = 0; i < block.instructions.length; i++) { + if (block.kind === 'sequence' && i === block.instructions.length - 1) { + continue; + } + const instr = block.instructions[i]; + const value = evaluateInstruction(constants, instr); + if (value !== null) { + constants.set(instr.lvalue.identifier.id, value); + } + } + const terminal = block.terminal; + switch (terminal.kind) { + case 'if': { + const testValue = read(constants, terminal.test); + if (testValue !== null && testValue.kind === 'Primitive') { + hasChanges = true; + const targetBlockId = testValue.value + ? terminal.consequent + : terminal.alternate; + block.terminal = { + kind: 'goto', + variant: GotoVariant.Break, + block: targetBlockId, + id: terminal.id, + loc: terminal.loc, + }; + } + break; + } + } + } + return hasChanges; +} +function evaluatePhi(phi, constants) { + var _a; + let value = null; + for (const [, operand] of phi.operands) { + const operandValue = (_a = constants.get(operand.identifier.id)) !== null && _a !== void 0 ? _a : null; + if (operandValue === null) { + return null; + } + if (value === null) { + value = operandValue; + continue; + } + if (operandValue.kind !== value.kind) { + return null; + } + switch (operandValue.kind) { + case 'Primitive': { + CompilerError.invariant(value.kind === 'Primitive', { + reason: 'value kind expected to be Primitive', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (operandValue.value !== value.value) { + return null; + } + break; + } + case 'LoadGlobal': { + CompilerError.invariant(value.kind === 'LoadGlobal', { + reason: 'value kind expected to be LoadGlobal', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (operandValue.binding.name !== value.binding.name) { + return null; + } + break; + } + default: + return null; + } + } + return value; +} +function evaluateInstruction(constants, instr) { + const value = instr.value; + switch (value.kind) { + case 'Primitive': { + return value; + } + case 'LoadGlobal': { + return value; + } + case 'ComputedLoad': { + const property = read(constants, value.property); + if (property !== null && + property.kind === 'Primitive' && + ((typeof property.value === 'string' && + libExports$1.isValidIdentifier(property.value)) || + typeof property.value === 'number')) { + const nextValue = { + kind: 'PropertyLoad', + loc: value.loc, + property: makePropertyLiteral(property.value), + object: value.object, + }; + instr.value = nextValue; + } + return null; + } + case 'ComputedStore': { + const property = read(constants, value.property); + if (property !== null && + property.kind === 'Primitive' && + ((typeof property.value === 'string' && + libExports$1.isValidIdentifier(property.value)) || + typeof property.value === 'number')) { + const nextValue = { + kind: 'PropertyStore', + loc: value.loc, + property: makePropertyLiteral(property.value), + object: value.object, + value: value.value, + }; + instr.value = nextValue; + } + return null; + } + case 'PostfixUpdate': { + const previous = read(constants, value.value); + if (previous !== null && + previous.kind === 'Primitive' && + typeof previous.value === 'number') { + const next = value.operation === '++' ? previous.value + 1 : previous.value - 1; + constants.set(value.lvalue.identifier.id, { + kind: 'Primitive', + value: next, + loc: value.loc, + }); + return previous; + } + return null; + } + case 'PrefixUpdate': { + const previous = read(constants, value.value); + if (previous !== null && + previous.kind === 'Primitive' && + typeof previous.value === 'number') { + const next = { + kind: 'Primitive', + value: value.operation === '++' ? previous.value + 1 : previous.value - 1, + loc: value.loc, + }; + constants.set(value.lvalue.identifier.id, next); + return next; + } + return null; + } + case 'UnaryExpression': { + switch (value.operator) { + case '!': { + const operand = read(constants, value.value); + if (operand !== null && operand.kind === 'Primitive') { + const result = { + kind: 'Primitive', + value: !operand.value, + loc: value.loc, + }; + instr.value = result; + return result; + } + return null; + } + case '-': { + const operand = read(constants, value.value); + if (operand !== null && + operand.kind === 'Primitive' && + typeof operand.value === 'number') { + const result = { + kind: 'Primitive', + value: operand.value * -1, + loc: value.loc, + }; + instr.value = result; + return result; + } + return null; + } + default: + return null; + } + } + case 'BinaryExpression': { + const lhsValue = read(constants, value.left); + const rhsValue = read(constants, value.right); + if (lhsValue !== null && + rhsValue !== null && + lhsValue.kind === 'Primitive' && + rhsValue.kind === 'Primitive') { + const lhs = lhsValue.value; + const rhs = rhsValue.value; + let result = null; + switch (value.operator) { + case '+': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs + rhs, loc: value.loc }; + } + else if (typeof lhs === 'string' && typeof rhs === 'string') { + result = { kind: 'Primitive', value: lhs + rhs, loc: value.loc }; + } + break; + } + case '-': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs - rhs, loc: value.loc }; + } + break; + } + case '*': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs * rhs, loc: value.loc }; + } + break; + } + case '/': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs / rhs, loc: value.loc }; + } + break; + } + case '|': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs | rhs, loc: value.loc }; + } + break; + } + case '&': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs & rhs, loc: value.loc }; + } + break; + } + case '^': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs ^ rhs, loc: value.loc }; + } + break; + } + case '<<': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs << rhs, loc: value.loc }; + } + break; + } + case '>>': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs >> rhs, loc: value.loc }; + } + break; + } + case '>>>': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { + kind: 'Primitive', + value: lhs >>> rhs, + loc: value.loc, + }; + } + break; + } + case '%': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs % rhs, loc: value.loc }; + } + break; + } + case '**': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: Math.pow(lhs, rhs), loc: value.loc }; + } + break; + } + case '<': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs < rhs, loc: value.loc }; + } + break; + } + case '<=': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs <= rhs, loc: value.loc }; + } + break; + } + case '>': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs > rhs, loc: value.loc }; + } + break; + } + case '>=': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs >= rhs, loc: value.loc }; + } + break; + } + case '==': { + result = { kind: 'Primitive', value: lhs == rhs, loc: value.loc }; + break; + } + case '===': { + result = { kind: 'Primitive', value: lhs === rhs, loc: value.loc }; + break; + } + case '!=': { + result = { kind: 'Primitive', value: lhs != rhs, loc: value.loc }; + break; + } + case '!==': { + result = { kind: 'Primitive', value: lhs !== rhs, loc: value.loc }; + break; + } + } + if (result !== null) { + instr.value = result; + return result; + } + } + return null; + } + case 'PropertyLoad': { + const objectValue = read(constants, value.object); + if (objectValue !== null) { + if (objectValue.kind === 'Primitive' && + typeof objectValue.value === 'string' && + value.property === 'length') { + const result = { + kind: 'Primitive', + value: objectValue.value.length, + loc: value.loc, + }; + instr.value = result; + return result; + } + } + return null; + } + case 'TemplateLiteral': { + if (value.subexprs.length === 0) { + const result = { + kind: 'Primitive', + value: value.quasis.map(q => q.cooked).join(''), + loc: value.loc, + }; + instr.value = result; + return result; + } + if (value.subexprs.length !== value.quasis.length - 1) { + return null; + } + if (value.quasis.some(q => q.cooked === undefined)) { + return null; + } + let quasiIndex = 0; + let resultString = value.quasis[quasiIndex].cooked; + ++quasiIndex; + for (const subExpr of value.subexprs) { + const subExprValue = read(constants, subExpr); + if (!subExprValue || subExprValue.kind !== 'Primitive') { + return null; + } + const expressionValue = subExprValue.value; + if (typeof expressionValue !== 'number' && + typeof expressionValue !== 'string' && + typeof expressionValue !== 'boolean' && + !(typeof expressionValue === 'object' && expressionValue === null)) { + return null; + } + const suffix = value.quasis[quasiIndex].cooked; + ++quasiIndex; + if (suffix === undefined) { + return null; + } + resultString = resultString.concat(expressionValue, suffix); + } + const result = { + kind: 'Primitive', + value: resultString, + loc: value.loc, + }; + instr.value = result; + return result; + } + case 'LoadLocal': { + const placeValue = read(constants, value.place); + if (placeValue !== null) { + instr.value = placeValue; + } + return placeValue; + } + case 'StoreLocal': { + const placeValue = read(constants, value.value); + if (placeValue !== null) { + constants.set(value.lvalue.place.identifier.id, placeValue); + } + return placeValue; + } + case 'ObjectMethod': + case 'FunctionExpression': { + constantPropagationImpl(value.loweredFunc.func, constants); + return null; + } + default: { + return null; + } + } +} +function read(constants, place) { + var _a; + return (_a = constants.get(place.identifier.id)) !== null && _a !== void 0 ? _a : null; +} + +function deadCodeElimination(fn) { + const state = findReferencedIdentifiers(fn); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + if (!state.isIdOrNameUsed(phi.place.identifier)) { + block.phis.delete(phi); + } + } + retainWhere(block.instructions, instr => state.isIdOrNameUsed(instr.lvalue.identifier)); + for (let i = 0; i < block.instructions.length; i++) { + const isBlockValue = block.kind !== 'block' && i === block.instructions.length - 1; + if (!isBlockValue) { + rewriteInstruction(block.instructions[i], state); + } + } + } + retainWhere(fn.context, contextVar => state.isIdOrNameUsed(contextVar.identifier)); +} +let State$2 = class State { + constructor() { + this.named = new Set(); + this.identifiers = new Set(); + } + reference(identifier) { + this.identifiers.add(identifier.id); + if (identifier.name !== null) { + this.named.add(identifier.name.value); + } + } + isIdOrNameUsed(identifier) { + return (this.identifiers.has(identifier.id) || + (identifier.name !== null && this.named.has(identifier.name.value))); + } + isIdUsed(identifier) { + return this.identifiers.has(identifier.id); + } + get count() { + return this.identifiers.size; + } +}; +function findReferencedIdentifiers(fn) { + const hasLoop = hasBackEdge(fn); + const reversedBlocks = [...fn.body.blocks.values()].reverse(); + const state = new State$2(); + let size = state.count; + do { + size = state.count; + for (const block of reversedBlocks) { + for (const operand of eachTerminalOperand(block.terminal)) { + state.reference(operand.identifier); + } + for (let i = block.instructions.length - 1; i >= 0; i--) { + const instr = block.instructions[i]; + const isBlockValue = block.kind !== 'block' && i === block.instructions.length - 1; + if (isBlockValue) { + state.reference(instr.lvalue.identifier); + for (const place of eachInstructionValueOperand(instr.value)) { + state.reference(place.identifier); + } + } + else if (state.isIdOrNameUsed(instr.lvalue.identifier) || + !pruneableValue(instr.value, state)) { + state.reference(instr.lvalue.identifier); + if (instr.value.kind === 'StoreLocal') { + if (instr.value.lvalue.kind === InstructionKind.Reassign || + state.isIdUsed(instr.value.lvalue.place.identifier)) { + state.reference(instr.value.value.identifier); + } + } + else { + for (const operand of eachInstructionValueOperand(instr.value)) { + state.reference(operand.identifier); + } + } + } + } + for (const phi of block.phis) { + if (state.isIdOrNameUsed(phi.place.identifier)) { + for (const [_pred, operand] of phi.operands) { + state.reference(operand.identifier); + } + } + } + } + } while (state.count > size && hasLoop); + return state; +} +function rewriteInstruction(instr, state) { + if (instr.value.kind === 'Destructure') { + switch (instr.value.lvalue.pattern.kind) { + case 'ArrayPattern': { + let lastEntryIndex = 0; + const items = instr.value.lvalue.pattern.items; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (item.kind === 'Identifier') { + if (!state.isIdOrNameUsed(item.identifier)) { + items[i] = { kind: 'Hole' }; + } + else { + lastEntryIndex = i; + } + } + else if (item.kind === 'Spread') { + if (!state.isIdOrNameUsed(item.place.identifier)) { + items[i] = { kind: 'Hole' }; + } + else { + lastEntryIndex = i; + } + } + } + items.length = lastEntryIndex + 1; + break; + } + case 'ObjectPattern': { + let nextProperties = null; + for (const property of instr.value.lvalue.pattern.properties) { + if (property.kind === 'ObjectProperty') { + if (state.isIdOrNameUsed(property.place.identifier)) { + nextProperties !== null && nextProperties !== void 0 ? nextProperties : (nextProperties = []); + nextProperties.push(property); + } + } + else { + if (state.isIdOrNameUsed(property.place.identifier)) { + nextProperties = null; + break; + } + } + } + if (nextProperties !== null) { + instr.value.lvalue.pattern.properties = nextProperties; + } + break; + } + default: { + assertExhaustive$1(instr.value.lvalue.pattern, `Unexpected pattern kind '${instr.value.lvalue.pattern.kind}'`); + } + } + } + else if (instr.value.kind === 'StoreLocal') { + if (instr.value.lvalue.kind !== InstructionKind.Reassign && + !state.isIdUsed(instr.value.lvalue.place.identifier)) { + instr.value = { + kind: 'DeclareLocal', + lvalue: instr.value.lvalue, + type: instr.value.type, + loc: instr.value.loc, + }; + } + } +} +function pruneableValue(value, state) { + switch (value.kind) { + case 'DeclareLocal': { + return !state.isIdOrNameUsed(value.lvalue.place.identifier); + } + case 'StoreLocal': { + if (value.lvalue.kind === InstructionKind.Reassign) { + return !state.isIdUsed(value.lvalue.place.identifier); + } + return !state.isIdOrNameUsed(value.lvalue.place.identifier); + } + case 'Destructure': { + let isIdOrNameUsed = false; + let isIdUsed = false; + for (const place of eachPatternOperand(value.lvalue.pattern)) { + if (state.isIdUsed(place.identifier)) { + isIdOrNameUsed = true; + isIdUsed = true; + } + else if (state.isIdOrNameUsed(place.identifier)) { + isIdOrNameUsed = true; + } + } + if (value.lvalue.kind === InstructionKind.Reassign) { + return !isIdUsed; + } + else { + return !isIdOrNameUsed; + } + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + return !state.isIdUsed(value.lvalue.identifier); + } + case 'Debugger': { + return false; + } + case 'Await': + case 'CallExpression': + case 'ComputedDelete': + case 'ComputedStore': + case 'PropertyDelete': + case 'MethodCall': + case 'PropertyStore': + case 'StoreGlobal': { + return false; + } + case 'NewExpression': + case 'UnsupportedNode': + case 'TaggedTemplateExpression': { + return false; + } + case 'GetIterator': + case 'NextPropertyOf': + case 'IteratorNext': { + return false; + } + case 'LoadContext': + case 'DeclareContext': + case 'StoreContext': { + return false; + } + case 'StartMemoize': + case 'FinishMemoize': { + return false; + } + case 'RegExpLiteral': + case 'MetaProperty': + case 'LoadGlobal': + case 'ArrayExpression': + case 'BinaryExpression': + case 'ComputedLoad': + case 'ObjectMethod': + case 'FunctionExpression': + case 'LoadLocal': + case 'JsxExpression': + case 'JsxFragment': + case 'JSXText': + case 'ObjectExpression': + case 'Primitive': + case 'PropertyLoad': + case 'TemplateLiteral': + case 'TypeCastExpression': + case 'UnaryExpression': { + return true; + } + default: { + assertExhaustive$1(value, `Unexepcted value kind \`${value.kind}\``); + } + } +} +function hasBackEdge(fn) { + return findBlocksWithBackEdges(fn).size > 0; +} +function findBlocksWithBackEdges(fn) { + const visited = new Set(); + const blocks = new Set(); + for (const [blockId, block] of fn.body.blocks) { + for (const predId of block.preds) { + if (!visited.has(predId)) { + blocks.add(blockId); + } + } + visited.add(blockId); + } + return blocks; +} + +function pruneMaybeThrows(fn) { + const terminalMapping = pruneMaybeThrowsImpl(fn); + if (terminalMapping) { + reversePostorderBlocks(fn.body); + removeUnreachableForUpdates(fn.body); + removeDeadDoWhileStatements(fn.body); + removeUnnecessaryTryCatch(fn.body); + markInstructionIds(fn.body); + mergeConsecutiveBlocks(fn); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const [predecessor, operand] of phi.operands) { + if (!block.preds.has(predecessor)) { + const mappedTerminal = terminalMapping.get(predecessor); + CompilerError.invariant(mappedTerminal != null, { + reason: `Expected non-existing phi operand's predecessor to have been mapped to a new terminal`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + description: `Could not find mapping for predecessor bb${predecessor} in block bb${block.id} for phi ${printPlace(phi.place)}`, + suggestions: null, + }); + phi.operands.delete(predecessor); + phi.operands.set(mappedTerminal, operand); + } + } + } + } + assertConsistentIdentifiers(fn); + assertTerminalSuccessorsExist(fn); + } +} +function pruneMaybeThrowsImpl(fn) { + var _a; + const terminalMapping = new Map(); + for (const [_, block] of fn.body.blocks) { + const terminal = block.terminal; + if (terminal.kind !== 'maybe-throw') { + continue; + } + const canThrow = block.instructions.some(instr => instructionMayThrow(instr)); + if (!canThrow) { + const source = (_a = terminalMapping.get(block.id)) !== null && _a !== void 0 ? _a : block.id; + terminalMapping.set(terminal.continuation, source); + block.terminal = { + kind: 'goto', + block: terminal.continuation, + variant: GotoVariant.Break, + id: terminal.id, + loc: terminal.loc, + }; + } + } + return terminalMapping.size > 0 ? terminalMapping : null; +} +function instructionMayThrow(instr) { + switch (instr.value.kind) { + case 'Primitive': + case 'ArrayExpression': + case 'ObjectExpression': { + return false; + } + default: { + return true; + } + } +} + +function inlineJsxTransform(fn, inlineJsxTransformConfig) { + var _a; + const inlinedJsxDeclarations = new Map(); + for (const [_, currentBlock] of [...fn.body.blocks]) { + let fallthroughBlockInstructions = null; + const instructionCount = currentBlock.instructions.length; + for (let i = 0; i < instructionCount; i++) { + const instr = currentBlock.instructions[i]; + if (currentBlock.kind === 'value') { + (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.logEvent(fn.env.filename, { + kind: 'CompileDiagnostic', + fnLoc: null, + detail: { + category: ErrorCategory.Todo, + reason: 'JSX Inlining is not supported on value blocks', + loc: instr.loc, + }, + }); + continue; + } + switch (instr.value.kind) { + case 'JsxExpression': + case 'JsxFragment': { + const currentBlockInstructions = currentBlock.instructions.slice(0, i); + const thenBlockInstructions = currentBlock.instructions.slice(i, i + 1); + const elseBlockInstructions = []; + fallthroughBlockInstructions !== null && fallthroughBlockInstructions !== void 0 ? fallthroughBlockInstructions : (fallthroughBlockInstructions = currentBlock.instructions.slice(i + 1)); + const fallthroughBlockId = fn.env.nextBlockId; + const fallthroughBlock = { + kind: currentBlock.kind, + id: fallthroughBlockId, + instructions: fallthroughBlockInstructions, + terminal: currentBlock.terminal, + preds: new Set(), + phis: new Set(), + }; + const varPlace = createTemporaryPlace(fn.env, instr.value.loc); + promoteTemporary(varPlace.identifier); + const varLValuePlace = createTemporaryPlace(fn.env, instr.value.loc); + const thenVarPlace = Object.assign(Object.assign({}, varPlace), { identifier: forkTemporaryIdentifier(fn.env.nextIdentifierId, varPlace.identifier) }); + const elseVarPlace = Object.assign(Object.assign({}, varPlace), { identifier: forkTemporaryIdentifier(fn.env.nextIdentifierId, varPlace.identifier) }); + const varInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign({}, varLValuePlace), + value: { + kind: 'DeclareLocal', + lvalue: { place: Object.assign({}, varPlace), kind: InstructionKind.Let }, + type: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + currentBlockInstructions.push(varInstruction); + const devGlobalPlace = createTemporaryPlace(fn.env, instr.value.loc); + const devGlobalInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, devGlobalPlace), { effect: Effect.Mutate }), + value: { + kind: 'LoadGlobal', + binding: { + kind: 'Global', + name: inlineJsxTransformConfig.globalDevVar, + }, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + currentBlockInstructions.push(devGlobalInstruction); + const thenBlockId = fn.env.nextBlockId; + const elseBlockId = fn.env.nextBlockId; + const ifTerminal = { + kind: 'if', + test: Object.assign(Object.assign({}, devGlobalPlace), { effect: Effect.Read }), + consequent: thenBlockId, + alternate: elseBlockId, + fallthrough: fallthroughBlockId, + loc: instr.loc, + id: makeInstructionId(0), + }; + currentBlock.instructions = currentBlockInstructions; + currentBlock.terminal = ifTerminal; + const thenBlock = { + id: thenBlockId, + instructions: thenBlockInstructions, + kind: 'block', + phis: new Set(), + preds: new Set(), + terminal: { + kind: 'goto', + block: fallthroughBlockId, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: instr.loc, + }, + }; + fn.body.blocks.set(thenBlockId, thenBlock); + const resassignElsePlace = createTemporaryPlace(fn.env, instr.value.loc); + const reassignElseInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign({}, resassignElsePlace), + value: { + kind: 'StoreLocal', + lvalue: { + place: elseVarPlace, + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, instr.lvalue), + type: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + thenBlockInstructions.push(reassignElseInstruction); + const elseBlockTerminal = { + kind: 'goto', + block: fallthroughBlockId, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: instr.loc, + }; + const elseBlock = { + id: elseBlockId, + instructions: elseBlockInstructions, + kind: 'block', + phis: new Set(), + preds: new Set(), + terminal: elseBlockTerminal, + }; + fn.body.blocks.set(elseBlockId, elseBlock); + const { refProperty, keyProperty, propsProperty } = createPropsProperties(fn, instr, elseBlockInstructions, instr.value.kind === 'JsxExpression' ? instr.value.props : [], instr.value.children); + const reactElementInstructionPlace = createTemporaryPlace(fn.env, instr.value.loc); + const reactElementInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, reactElementInstructionPlace), { effect: Effect.Store }), + value: { + kind: 'ObjectExpression', + properties: [ + createSymbolProperty(fn, instr, elseBlockInstructions, '$$typeof', inlineJsxTransformConfig.elementSymbol), + instr.value.kind === 'JsxExpression' + ? createTagProperty(fn, instr, elseBlockInstructions, instr.value.tag) + : createSymbolProperty(fn, instr, elseBlockInstructions, 'type', 'react.fragment'), + refProperty, + keyProperty, + propsProperty, + ], + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + elseBlockInstructions.push(reactElementInstruction); + const reassignConditionalInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign({}, createTemporaryPlace(fn.env, instr.value.loc)), + value: { + kind: 'StoreLocal', + lvalue: { + place: Object.assign({}, elseVarPlace), + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, reactElementInstruction.lvalue), + type: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + elseBlockInstructions.push(reassignConditionalInstruction); + const operands = new Map(); + operands.set(thenBlockId, Object.assign({}, elseVarPlace)); + operands.set(elseBlockId, Object.assign({}, thenVarPlace)); + const phiIdentifier = forkTemporaryIdentifier(fn.env.nextIdentifierId, varPlace.identifier); + const phiPlace = Object.assign(Object.assign({}, createTemporaryPlace(fn.env, instr.value.loc)), { identifier: phiIdentifier }); + const phis = new Set([ + { + kind: 'Phi', + operands, + place: phiPlace, + }, + ]); + fallthroughBlock.phis = phis; + fn.body.blocks.set(fallthroughBlockId, fallthroughBlock); + inlinedJsxDeclarations.set(instr.lvalue.identifier.declarationId, { + identifier: phiIdentifier, + blockIdsToIgnore: new Set([thenBlockId, elseBlockId]), + }); + break; + } + case 'FunctionExpression': + case 'ObjectMethod': { + inlineJsxTransform(instr.value.loweredFunc.func, inlineJsxTransformConfig); + break; + } + } + } + } + for (const [blockId, block] of fn.body.blocks) { + for (const instr of block.instructions) { + mapInstructionOperands(instr, place => handlePlace(place, blockId, inlinedJsxDeclarations)); + mapInstructionLValues(instr, lvalue => handlelValue(lvalue, blockId, inlinedJsxDeclarations)); + mapInstructionValueOperands(instr.value, place => handlePlace(place, blockId, inlinedJsxDeclarations)); + } + mapTerminalOperands(block.terminal, place => handlePlace(place, blockId, inlinedJsxDeclarations)); + if (block.terminal.kind === 'scope') { + const scope = block.terminal.scope; + for (const dep of scope.dependencies) { + dep.identifier = handleIdentifier(dep.identifier, inlinedJsxDeclarations); + } + for (const [origId, decl] of [...scope.declarations]) { + const newDecl = handleIdentifier(decl.identifier, inlinedJsxDeclarations); + if (newDecl.id !== origId) { + scope.declarations.delete(origId); + scope.declarations.set(decl.identifier.id, { + identifier: newDecl, + scope: decl.scope, + }); + } + } + } + } + reversePostorderBlocks(fn.body); + markPredecessors(fn.body); + markInstructionIds(fn.body); + fixScopeAndIdentifierRanges(fn.body); +} +function createSymbolProperty(fn, instr, nextInstructions, propertyName, symbolName) { + const symbolPlace = createTemporaryPlace(fn.env, instr.value.loc); + const symbolInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, symbolPlace), { effect: Effect.Mutate }), + value: { + kind: 'LoadGlobal', + binding: { kind: 'Global', name: 'Symbol' }, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(symbolInstruction); + const symbolForPlace = createTemporaryPlace(fn.env, instr.value.loc); + const symbolForInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, symbolForPlace), { effect: Effect.Read }), + value: { + kind: 'PropertyLoad', + object: Object.assign({}, symbolInstruction.lvalue), + property: makePropertyLiteral('for'), + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(symbolForInstruction); + const symbolValuePlace = createTemporaryPlace(fn.env, instr.value.loc); + const symbolValueInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, symbolValuePlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: symbolName, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(symbolValueInstruction); + const $$typeofPlace = createTemporaryPlace(fn.env, instr.value.loc); + const $$typeofInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, $$typeofPlace), { effect: Effect.Mutate }), + value: { + kind: 'MethodCall', + receiver: symbolInstruction.lvalue, + property: symbolForInstruction.lvalue, + args: [symbolValueInstruction.lvalue], + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + const $$typeofProperty = { + kind: 'ObjectProperty', + key: { name: propertyName, kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, $$typeofPlace), { effect: Effect.Capture }), + }; + nextInstructions.push($$typeofInstruction); + return $$typeofProperty; +} +function createTagProperty(fn, instr, nextInstructions, componentTag) { + let tagProperty; + switch (componentTag.kind) { + case 'BuiltinTag': { + const tagPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const tagInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, tagPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: componentTag.name, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + tagProperty = { + kind: 'ObjectProperty', + key: { name: 'type', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, tagPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(tagInstruction); + break; + } + case 'Identifier': { + tagProperty = { + kind: 'ObjectProperty', + key: { name: 'type', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, componentTag), { effect: Effect.Capture }), + }; + break; + } + } + return tagProperty; +} +function createPropsProperties(fn, instr, nextInstructions, propAttributes, children) { + let refProperty; + let keyProperty; + const props = []; + const jsxAttributesWithoutKey = propAttributes.filter(p => p.kind === 'JsxAttribute' && p.name !== 'key'); + const jsxSpreadAttributes = propAttributes.filter(p => p.kind === 'JsxSpreadAttribute'); + const spreadPropsOnly = jsxAttributesWithoutKey.length === 0 && jsxSpreadAttributes.length === 1; + propAttributes.forEach(prop => { + switch (prop.kind) { + case 'JsxAttribute': { + switch (prop.name) { + case 'key': { + keyProperty = { + kind: 'ObjectProperty', + key: { name: 'key', kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + break; + } + case 'ref': { + refProperty = { + kind: 'ObjectProperty', + key: { name: 'ref', kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + const refPropProperty = { + kind: 'ObjectProperty', + key: { name: 'ref', kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + props.push(refPropProperty); + break; + } + default: { + const attributeProperty = { + kind: 'ObjectProperty', + key: { name: prop.name, kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + props.push(attributeProperty); + } + } + break; + } + case 'JsxSpreadAttribute': { + props.push({ + kind: 'Spread', + place: Object.assign({}, prop.argument), + }); + break; + } + } + }); + const propsPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + if (children) { + let childrenPropProperty; + if (children.length === 1) { + childrenPropProperty = { + kind: 'ObjectProperty', + key: { name: 'children', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, children[0]), { effect: Effect.Capture }), + }; + } + else { + const childrenPropPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const childrenPropInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, childrenPropPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'ArrayExpression', + elements: [...children], + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(childrenPropInstruction); + childrenPropProperty = { + kind: 'ObjectProperty', + key: { name: 'children', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, childrenPropPropertyPlace), { effect: Effect.Capture }), + }; + } + props.push(childrenPropProperty); + } + if (refProperty == null) { + const refPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const refInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, refPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + refProperty = { + kind: 'ObjectProperty', + key: { name: 'ref', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, refPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(refInstruction); + } + if (keyProperty == null) { + const keyPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const keyInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, keyPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + keyProperty = { + kind: 'ObjectProperty', + key: { name: 'key', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, keyPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(keyInstruction); + } + let propsProperty; + if (spreadPropsOnly) { + const spreadProp = jsxSpreadAttributes[0]; + CompilerError.invariant(spreadProp.kind === 'JsxSpreadAttribute', { + reason: 'Spread prop attribute must be of kind JSXSpreadAttribute', + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + }); + propsProperty = { + kind: 'ObjectProperty', + key: { name: 'props', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, spreadProp.argument), { effect: Effect.Mutate }), + }; + } + else { + const propsInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, propsPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'ObjectExpression', + properties: props, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + propsProperty = { + kind: 'ObjectProperty', + key: { name: 'props', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, propsPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(propsInstruction); + } + return { refProperty, keyProperty, propsProperty }; +} +function handlePlace(place, blockId, inlinedJsxDeclarations) { + const inlinedJsxDeclaration = inlinedJsxDeclarations.get(place.identifier.declarationId); + if (inlinedJsxDeclaration == null || + inlinedJsxDeclaration.blockIdsToIgnore.has(blockId)) { + return place; + } + return Object.assign(Object.assign({}, place), { identifier: inlinedJsxDeclaration.identifier }); +} +function handlelValue(lvalue, blockId, inlinedJsxDeclarations) { + const inlinedJsxDeclaration = inlinedJsxDeclarations.get(lvalue.identifier.declarationId); + if (inlinedJsxDeclaration == null || + inlinedJsxDeclaration.blockIdsToIgnore.has(blockId)) { + return lvalue; + } + return Object.assign(Object.assign({}, lvalue), { identifier: inlinedJsxDeclaration.identifier }); +} +function handleIdentifier(identifier, inlinedJsxDeclarations) { + const inlinedJsxDeclaration = inlinedJsxDeclarations.get(identifier.declarationId); + return inlinedJsxDeclaration == null + ? identifier + : inlinedJsxDeclaration.identifier; +} + +function findScopesToMerge(fn) { + const objectMethodDecls = new Set(); + const mergeScopesBuilder = new DisjointSet(); + for (const [_, block] of fn.body.blocks) { + for (const { lvalue, value } of block.instructions) { + if (value.kind === 'ObjectMethod') { + objectMethodDecls.add(lvalue.identifier); + } + else if (value.kind === 'ObjectExpression') { + for (const operand of eachInstructionValueOperand(value)) { + if (objectMethodDecls.has(operand.identifier)) { + const operandScope = operand.identifier.scope; + const lvalueScope = lvalue.identifier.scope; + CompilerError.invariant(operandScope != null && lvalueScope != null, { + reason: 'Internal error: Expected all ObjectExpressions and ObjectMethods to have non-null scope.', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + mergeScopesBuilder.union([operandScope, lvalueScope]); + } + } + } + } + } + return mergeScopesBuilder; +} +function alignObjectMethodScopes(fn) { + for (const [_, block] of fn.body.blocks) { + for (const { value } of block.instructions) { + if (value.kind === 'ObjectMethod' || + value.kind === 'FunctionExpression') { + alignObjectMethodScopes(value.loweredFunc.func); + } + } + } + const scopeGroupsMap = findScopesToMerge(fn).canonicalize(); + for (const [scope, root] of scopeGroupsMap) { + if (scope !== root) { + root.range.start = makeInstructionId(Math.min(scope.range.start, root.range.start)); + root.range.end = makeInstructionId(Math.max(scope.range.end, root.range.end)); + } + } + for (const [_, block] of fn.body.blocks) { + for (const { lvalue: { identifier }, } of block.instructions) { + if (identifier.scope != null) { + const root = scopeGroupsMap.get(identifier.scope); + if (root != null) { + identifier.scope = root; + } + } + } + } +} + +function visitReactiveFunction(fn, visitor, state) { + visitor.visitBlock(fn.body, state); +} +class ReactiveFunctionVisitor { + visitID(_id, _state) { } + visitParam(_place, _state) { } + visitLValue(_id, _lvalue, _state) { } + visitPlace(_id, _place, _state) { } + visitReactiveFunctionValue(_id, _dependencies, _fn, _state) { } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + } + traverseValue(id, value, state) { + switch (value.kind) { + case 'OptionalExpression': { + this.visitValue(id, value.value, state); + break; + } + case 'LogicalExpression': { + this.visitValue(id, value.left, state); + this.visitValue(id, value.right, state); + break; + } + case 'ConditionalExpression': { + this.visitValue(id, value.test, state); + this.visitValue(id, value.consequent, state); + this.visitValue(id, value.alternate, state); + break; + } + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitInstruction(instr, state); + } + this.visitValue(value.id, value.value, state); + break; + } + default: { + for (const place of eachInstructionValueOperand(value)) { + this.visitPlace(id, place, state); + } + } + } + } + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + } + traverseInstruction(instruction, state) { + this.visitID(instruction.id, state); + for (const operand of eachInstructionLValue(instruction)) { + this.visitLValue(instruction.id, operand, state); + } + this.visitValue(instruction.id, instruction.value, state); + } + visitTerminal(stmt, state) { + this.traverseTerminal(stmt, state); + } + traverseTerminal(stmt, state) { + const { terminal } = stmt; + if (terminal.id !== null) { + this.visitID(terminal.id, state); + } + switch (terminal.kind) { + case 'break': + case 'continue': { + break; + } + case 'return': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'throw': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'for': { + this.visitValue(terminal.id, terminal.init, state); + this.visitValue(terminal.id, terminal.test, state); + this.visitBlock(terminal.loop, state); + if (terminal.update !== null) { + this.visitValue(terminal.id, terminal.update, state); + } + break; + } + case 'for-of': { + this.visitValue(terminal.id, terminal.init, state); + this.visitValue(terminal.id, terminal.test, state); + this.visitBlock(terminal.loop, state); + break; + } + case 'for-in': { + this.visitValue(terminal.id, terminal.init, state); + this.visitBlock(terminal.loop, state); + break; + } + case 'do-while': { + this.visitBlock(terminal.loop, state); + this.visitValue(terminal.id, terminal.test, state); + break; + } + case 'while': { + this.visitValue(terminal.id, terminal.test, state); + this.visitBlock(terminal.loop, state); + break; + } + case 'if': { + this.visitPlace(terminal.id, terminal.test, state); + this.visitBlock(terminal.consequent, state); + if (terminal.alternate !== null) { + this.visitBlock(terminal.alternate, state); + } + break; + } + case 'switch': { + this.visitPlace(terminal.id, terminal.test, state); + for (const case_ of terminal.cases) { + if (case_.test !== null) { + this.visitPlace(terminal.id, case_.test, state); + } + if (case_.block !== undefined) { + this.visitBlock(case_.block, state); + } + } + break; + } + case 'label': { + this.visitBlock(terminal.block, state); + break; + } + case 'try': { + this.visitBlock(terminal.block, state); + this.visitBlock(terminal.handler, state); + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } + } + visitScope(scope, state) { + this.traverseScope(scope, state); + } + traverseScope(scope, state) { + this.visitBlock(scope.instructions, state); + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + } + traversePrunedScope(scopeBlock, state) { + this.visitBlock(scopeBlock.instructions, state); + } + visitBlock(block, state) { + this.traverseBlock(block, state); + } + traverseBlock(block, state) { + for (const instr of block) { + switch (instr.kind) { + case 'instruction': { + this.visitInstruction(instr.instruction, state); + break; + } + case 'scope': { + this.visitScope(instr, state); + break; + } + case 'pruned-scope': { + this.visitPrunedScope(instr, state); + break; + } + case 'terminal': { + this.visitTerminal(instr, state); + break; + } + default: { + assertExhaustive$1(instr, `Unexpected instruction kind \`${instr.kind}\``); + } + } + } + } + visitHirFunction(fn, state) { + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + this.visitParam(place, state); + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + this.visitInstruction(instr, state); + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + this.visitHirFunction(instr.value.loweredFunc.func, state); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + this.visitPlace(block.terminal.id, operand, state); + } + } + } +} +class ReactiveFunctionTransform extends ReactiveFunctionVisitor { + traverseBlock(block, state) { + let nextBlock = null; + for (let i = 0; i < block.length; i++) { + const instr = block[i]; + let transformed; + switch (instr.kind) { + case 'instruction': { + transformed = this.transformInstruction(instr.instruction, state); + break; + } + case 'scope': { + transformed = this.transformScope(instr, state); + break; + } + case 'pruned-scope': { + transformed = this.transformPrunedScope(instr, state); + break; + } + case 'terminal': { + transformed = this.transformTerminal(instr, state); + break; + } + default: { + assertExhaustive$1(instr, `Unexpected instruction kind \`${instr.kind}\``); + } + } + switch (transformed.kind) { + case 'keep': { + if (nextBlock !== null) { + nextBlock.push(instr); + } + break; + } + case 'remove': { + if (nextBlock === null) { + nextBlock = block.slice(0, i); + } + break; + } + case 'replace': { + nextBlock !== null && nextBlock !== void 0 ? nextBlock : (nextBlock = block.slice(0, i)); + nextBlock.push(transformed.value); + break; + } + case 'replace-many': { + nextBlock !== null && nextBlock !== void 0 ? nextBlock : (nextBlock = block.slice(0, i)); + nextBlock.push(...transformed.value); + break; + } + } + } + if (nextBlock !== null) { + block.length = 0; + block.push(...nextBlock); + } + } + transformInstruction(instruction, state) { + this.visitInstruction(instruction, state); + return { kind: 'keep' }; + } + transformTerminal(stmt, state) { + this.visitTerminal(stmt, state); + return { kind: 'keep' }; + } + transformScope(scope, state) { + this.visitScope(scope, state); + return { kind: 'keep' }; + } + transformPrunedScope(scope, state) { + this.visitPrunedScope(scope, state); + return { kind: 'keep' }; + } + transformValue(id, value, state) { + this.visitValue(id, value, state); + return { kind: 'keep' }; + } + transformReactiveFunctionValue(id, dependencies, fn, state) { + this.visitReactiveFunctionValue(id, dependencies, fn, state); + return { kind: 'keep' }; + } + traverseValue(id, value, state) { + switch (value.kind) { + case 'OptionalExpression': { + const nextValue = this.transformValue(id, value.value, state); + if (nextValue.kind === 'replace') { + value.value = nextValue.value; + } + break; + } + case 'LogicalExpression': { + const left = this.transformValue(id, value.left, state); + if (left.kind === 'replace') { + value.left = left.value; + } + const right = this.transformValue(id, value.right, state); + if (right.kind === 'replace') { + value.right = right.value; + } + break; + } + case 'ConditionalExpression': { + const test = this.transformValue(id, value.test, state); + if (test.kind === 'replace') { + value.test = test.value; + } + const consequent = this.transformValue(id, value.consequent, state); + if (consequent.kind === 'replace') { + value.consequent = consequent.value; + } + const alternate = this.transformValue(id, value.alternate, state); + if (alternate.kind === 'replace') { + value.alternate = alternate.value; + } + break; + } + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitInstruction(instr, state); + } + const nextValue = this.transformValue(value.id, value.value, state); + if (nextValue.kind === 'replace') { + value.value = nextValue.value; + } + break; + } + default: { + for (const place of eachInstructionValueOperand(value)) { + this.visitPlace(id, place, state); + } + } + } + } + traverseInstruction(instruction, state) { + this.visitID(instruction.id, state); + for (const operand of eachInstructionLValue(instruction)) { + this.visitLValue(instruction.id, operand, state); + } + const nextValue = this.transformValue(instruction.id, instruction.value, state); + if (nextValue.kind === 'replace') { + instruction.value = nextValue.value; + } + } + traverseTerminal(stmt, state) { + const { terminal } = stmt; + if (terminal.id !== null) { + this.visitID(terminal.id, state); + } + switch (terminal.kind) { + case 'break': + case 'continue': { + break; + } + case 'return': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'throw': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'for': { + const init = this.transformValue(terminal.id, terminal.init, state); + if (init.kind === 'replace') { + terminal.init = init.value; + } + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + if (terminal.update !== null) { + const update = this.transformValue(terminal.id, terminal.update, state); + if (update.kind === 'replace') { + terminal.update = update.value; + } + } + this.visitBlock(terminal.loop, state); + break; + } + case 'for-of': { + const init = this.transformValue(terminal.id, terminal.init, state); + if (init.kind === 'replace') { + terminal.init = init.value; + } + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + this.visitBlock(terminal.loop, state); + break; + } + case 'for-in': { + const init = this.transformValue(terminal.id, terminal.init, state); + if (init.kind === 'replace') { + terminal.init = init.value; + } + this.visitBlock(terminal.loop, state); + break; + } + case 'do-while': { + this.visitBlock(terminal.loop, state); + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + break; + } + case 'while': { + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + this.visitBlock(terminal.loop, state); + break; + } + case 'if': { + this.visitPlace(terminal.id, terminal.test, state); + this.visitBlock(terminal.consequent, state); + if (terminal.alternate !== null) { + this.visitBlock(terminal.alternate, state); + } + break; + } + case 'switch': { + this.visitPlace(terminal.id, terminal.test, state); + for (const case_ of terminal.cases) { + if (case_.test !== null) { + this.visitPlace(terminal.id, case_.test, state); + } + if (case_.block !== undefined) { + this.visitBlock(case_.block, state); + } + } + break; + } + case 'label': { + this.visitBlock(terminal.block, state); + break; + } + case 'try': { + this.visitBlock(terminal.block, state); + if (terminal.handlerBinding !== null) { + this.visitPlace(terminal.id, terminal.handlerBinding, state); + } + this.visitBlock(terminal.handler, state); + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } + } +} +function* eachReactiveValueOperand(instrValue) { + switch (instrValue.kind) { + case 'OptionalExpression': { + yield* eachReactiveValueOperand(instrValue.value); + break; + } + case 'LogicalExpression': { + yield* eachReactiveValueOperand(instrValue.left); + yield* eachReactiveValueOperand(instrValue.right); + break; + } + case 'SequenceExpression': { + for (const instr of instrValue.instructions) { + yield* eachReactiveValueOperand(instr.value); + } + yield* eachReactiveValueOperand(instrValue.value); + break; + } + case 'ConditionalExpression': { + yield* eachReactiveValueOperand(instrValue.test); + yield* eachReactiveValueOperand(instrValue.consequent); + yield* eachReactiveValueOperand(instrValue.alternate); + break; + } + default: { + yield* eachInstructionValueOperand(instrValue); + } + } +} + +function assertScopeInstructionsWithinScopes(fn) { + const existingScopes = new Set(); + visitReactiveFunction(fn, new FindAllScopesVisitor(), existingScopes); + visitReactiveFunction(fn, new CheckInstructionsAgainstScopesVisitor(), existingScopes); +} +class FindAllScopesVisitor extends ReactiveFunctionVisitor { + visitScope(block, state) { + this.traverseScope(block, state); + state.add(block.scope.id); + } +} +class CheckInstructionsAgainstScopesVisitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.activeScopes = new Set(); + } + visitPlace(id, place, state) { + const scope = getPlaceScope(id, place); + if (scope !== null && + state.has(scope.id) && + !this.activeScopes.has(scope.id)) { + CompilerError.invariant(false, { + reason: 'Encountered an instruction that should be part of a scope, but where that scope has already completed', + description: `Instruction [${id}] is part of scope @${scope.id}, but that scope has already completed`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + } + } + visitScope(block, state) { + this.activeScopes.add(block.scope.id); + this.traverseScope(block, state); + this.activeScopes.delete(block.scope.id); + } +} + +function assertWellFormedBreakTargets(fn) { + visitReactiveFunction(fn, new Visitor$a(), new Set()); +} +let Visitor$a = class Visitor extends ReactiveFunctionVisitor { + visitTerminal(stmt, seenLabels) { + if (stmt.label != null) { + seenLabels.add(stmt.label.id); + } + const terminal = stmt.terminal; + if (terminal.kind === 'break' || terminal.kind === 'continue') { + CompilerError.invariant(seenLabels.has(terminal.target), { + reason: 'Unexpected break to invalid label', + description: null, + details: [ + { + kind: 'error', + loc: stmt.terminal.loc, + message: null, + }, + ], + }); + } + } +}; + +var _Context_nextScheduleId, _Context_scheduled, _Context_catchHandlers, _Context_controlFlowStack; +function buildReactiveFunction(fn) { + const cx = new Context$3(fn.body); + const driver = new Driver(cx); + const body = driver.traverseBlock(cx.block(fn.body.entry)); + return { + loc: fn.loc, + id: fn.id, + nameHint: fn.nameHint, + params: fn.params, + generator: fn.generator, + async: fn.async, + body, + env: fn.env, + directives: fn.directives, + }; +} +class Driver { + constructor(cx) { + this.cx = cx; + } + traverseBlock(block) { + const blockValue = []; + this.visitBlock(block, blockValue); + return blockValue; + } + visitBlock(block, blockValue) { + var _a; + CompilerError.invariant(!this.cx.emitted.has(block.id), { + reason: `Cannot emit the same block twice: bb${block.id}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + this.cx.emitted.add(block.id); + for (const instruction of block.instructions) { + blockValue.push({ + kind: 'instruction', + instruction, + }); + } + const terminal = block.terminal; + const scheduleIds = []; + switch (terminal.kind) { + case 'return': { + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'return', + loc: terminal.loc, + value: terminal.value, + id: terminal.id, + }, + label: null, + }); + break; + } + case 'throw': { + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'throw', + loc: terminal.loc, + value: terminal.value, + id: terminal.id, + }, + label: null, + }); + break; + } + case 'if': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const alternateId = terminal.alternate !== terminal.fallthrough + ? terminal.alternate + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + let consequent = null; + if (this.cx.isScheduled(terminal.consequent)) { + CompilerError.invariant(false, { + reason: `Unexpected 'if' where the consequent is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + consequent = this.traverseBlock(this.cx.ir.blocks.get(terminal.consequent)); + } + let alternate = null; + if (alternateId !== null) { + if (this.cx.isScheduled(alternateId)) { + CompilerError.invariant(false, { + reason: `Unexpected 'if' where the alternate is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + alternate = this.traverseBlock(this.cx.ir.blocks.get(alternateId)); + } + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'if', + loc: terminal.loc, + test: terminal.test, + consequent: consequent !== null && consequent !== void 0 ? consequent : this.emptyBlock(), + alternate: alternate, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'switch': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'switch'); + scheduleIds.push(scheduleId); + } + const cases = []; + [...terminal.cases].reverse().forEach((case_, _index) => { + const test = case_.test; + let consequent; + if (this.cx.isScheduled(case_.block)) { + CompilerError.invariant(case_.block === terminal.fallthrough, { + reason: `Unexpected 'switch' where a case is already scheduled and block is not the fallthrough`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + return; + } + else { + consequent = this.traverseBlock(this.cx.ir.blocks.get(case_.block)); + const scheduleId = this.cx.schedule(case_.block, 'case'); + scheduleIds.push(scheduleId); + } + cases.push({ test, block: consequent }); + }); + cases.reverse(); + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'switch', + loc: terminal.loc, + test: terminal.test, + cases, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'do-while': { + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.test, terminal.loop); + scheduleIds.push(scheduleId); + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'do-while' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + const testValue = this.visitValueBlock(terminal.test, terminal.loc).value; + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'do-while', + loc: terminal.loc, + test: testValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'while': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.test, terminal.loop); + scheduleIds.push(scheduleId); + const testValue = this.visitValueBlock(terminal.test, terminal.loc).value; + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'while' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'while', + loc: terminal.loc, + test: testValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'for': { + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, (_a = terminal.update) !== null && _a !== void 0 ? _a : terminal.test, terminal.loop); + scheduleIds.push(scheduleId); + const init = this.visitValueBlock(terminal.init, terminal.loc); + const initBlock = this.cx.ir.blocks.get(init.block); + let initValue = init.value; + if (initValue.kind === 'SequenceExpression') { + const last = initBlock.instructions.at(-1); + initValue.instructions.push(last); + initValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + initValue = { + kind: 'SequenceExpression', + instructions: [initBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + const testValue = this.visitValueBlock(terminal.test, terminal.loc).value; + const updateValue = terminal.update !== null + ? this.visitValueBlock(terminal.update, terminal.loc).value + : null; + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'for' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'for', + loc: terminal.loc, + init: initValue, + test: testValue, + update: updateValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'for-of': { + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.init, terminal.loop); + scheduleIds.push(scheduleId); + const init = this.visitValueBlock(terminal.init, terminal.loc); + const initBlock = this.cx.ir.blocks.get(init.block); + let initValue = init.value; + if (initValue.kind === 'SequenceExpression') { + const last = initBlock.instructions.at(-1); + initValue.instructions.push(last); + initValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + initValue = { + kind: 'SequenceExpression', + instructions: [initBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + let testValue = test.value; + if (testValue.kind === 'SequenceExpression') { + const last = testBlock.instructions.at(-1); + testValue.instructions.push(last); + testValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + testValue = { + kind: 'SequenceExpression', + instructions: [testBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'for-of' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'for-of', + loc: terminal.loc, + init: initValue, + test: testValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'for-in': { + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.init, terminal.loop); + scheduleIds.push(scheduleId); + const init = this.visitValueBlock(terminal.init, terminal.loc); + const initBlock = this.cx.ir.blocks.get(init.block); + let initValue = init.value; + if (initValue.kind === 'SequenceExpression') { + const last = initBlock.instructions.at(-1); + initValue.instructions.push(last); + initValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + initValue = { + kind: 'SequenceExpression', + instructions: [initBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'for-in' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'for-in', + loc: terminal.loc, + init: initValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'branch': { + let consequent = null; + if (this.cx.isScheduled(terminal.consequent)) { + const break_ = this.visitBreak(terminal.consequent, terminal.id, terminal.loc); + if (break_ !== null) { + consequent = [break_]; + } + } + else { + consequent = this.traverseBlock(this.cx.ir.blocks.get(terminal.consequent)); + } + let alternate = null; + if (this.cx.isScheduled(terminal.alternate)) { + CompilerError.invariant(false, { + reason: `Unexpected 'branch' where the alternate is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + alternate = this.traverseBlock(this.cx.ir.blocks.get(terminal.alternate)); + } + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'if', + loc: terminal.loc, + test: terminal.test, + consequent: consequent !== null && consequent !== void 0 ? consequent : this.emptyBlock(), + alternate: alternate, + id: terminal.id, + }, + label: null, + }); + break; + } + case 'label': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + let block; + if (this.cx.isScheduled(terminal.block)) { + CompilerError.invariant(false, { + reason: `Unexpected 'label' where the block is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + block = this.traverseBlock(this.cx.ir.blocks.get(terminal.block)); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'label', + loc: terminal.loc, + block, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'sequence': + case 'optional': + case 'ternary': + case 'logical': { + const fallthroughId = terminal.fallthrough !== null && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + const { place, value } = this.visitValueBlockTerminal(terminal); + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'instruction', + instruction: { + id: terminal.id, + lvalue: place, + value, + loc: terminal.loc, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'goto': { + switch (terminal.variant) { + case GotoVariant.Break: { + const break_ = this.visitBreak(terminal.block, terminal.id, terminal.loc); + if (break_ !== null) { + blockValue.push(break_); + } + break; + } + case GotoVariant.Continue: { + const continue_ = this.visitContinue(terminal.block, terminal.id, terminal.loc); + if (continue_ !== null) { + blockValue.push(continue_); + } + break; + } + case GotoVariant.Try: { + break; + } + default: { + assertExhaustive$1(terminal.variant, `Unexpected goto variant \`${terminal.variant}\``); + } + } + break; + } + case 'maybe-throw': { + if (!this.cx.isScheduled(terminal.continuation)) { + this.visitBlock(this.cx.ir.blocks.get(terminal.continuation), blockValue); + } + break; + } + case 'try': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + this.cx.scheduleCatchHandler(terminal.handler); + const block = this.traverseBlock(this.cx.ir.blocks.get(terminal.block)); + const handler = this.traverseBlock(this.cx.ir.blocks.get(terminal.handler)); + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + terminal: { + kind: 'try', + loc: terminal.loc, + block, + handlerBinding: terminal.handlerBinding, + handler, + id: terminal.id, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'pruned-scope': + case 'scope': { + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + this.cx.scopeFallthroughs.add(fallthroughId); + } + let block; + if (this.cx.isScheduled(terminal.block)) { + CompilerError.invariant(false, { + reason: `Unexpected 'scope' where the block is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + block = this.traverseBlock(this.cx.ir.blocks.get(terminal.block)); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: terminal.kind, + instructions: block, + scope: terminal.scope, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'unreachable': { + break; + } + case 'unsupported': { + CompilerError.invariant(false, { + reason: 'Unexpected unsupported terminal', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(terminal, 'Unexpected terminal'); + } + } + } + visitValueBlock(id, loc) { + const defaultBlock = this.cx.ir.blocks.get(id); + if (defaultBlock.terminal.kind === 'branch') { + const instructions = defaultBlock.instructions; + if (instructions.length === 0) { + return { + block: defaultBlock.id, + place: defaultBlock.terminal.test, + value: { + kind: 'LoadLocal', + place: defaultBlock.terminal.test, + loc: defaultBlock.terminal.test.loc, + }, + id: defaultBlock.terminal.id, + }; + } + else if (defaultBlock.instructions.length === 1) { + const instr = defaultBlock.instructions[0]; + CompilerError.invariant(instr.lvalue.identifier.id === + defaultBlock.terminal.test.identifier.id, { + reason: 'Expected branch block to end in an instruction that sets the test value', + description: null, + details: [ + { + kind: 'error', + loc: instr.lvalue.loc, + message: null, + }, + ], + suggestions: null, + }); + return { + block: defaultBlock.id, + place: instr.lvalue, + value: instr.value, + id: instr.id, + }; + } + else { + const instr = defaultBlock.instructions.at(-1); + const sequence = { + kind: 'SequenceExpression', + instructions: defaultBlock.instructions.slice(0, -1), + id: instr.id, + value: instr.value, + loc: loc, + }; + return { + block: defaultBlock.id, + place: defaultBlock.terminal.test, + value: sequence, + id: defaultBlock.terminal.id, + }; + } + } + else if (defaultBlock.terminal.kind === 'goto') { + const instructions = defaultBlock.instructions; + if (instructions.length === 0) { + CompilerError.invariant(false, { + reason: 'Expected goto value block to have at least one instruction', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + else if (defaultBlock.instructions.length === 1) { + const instr = defaultBlock.instructions[0]; + let place = instr.lvalue; + let value = instr.value; + if (value.kind === 'StoreLocal' && + value.lvalue.place.identifier.name === null) { + place = value.lvalue.place; + value = { + kind: 'LoadLocal', + place: value.value, + loc: value.value.loc, + }; + } + return { + block: defaultBlock.id, + place, + value, + id: instr.id, + }; + } + else { + const instr = defaultBlock.instructions.at(-1); + let place = instr.lvalue; + let value = instr.value; + if (value.kind === 'StoreLocal' && + value.lvalue.place.identifier.name === null) { + place = value.lvalue.place; + value = { + kind: 'LoadLocal', + place: value.value, + loc: value.value.loc, + }; + } + const sequence = { + kind: 'SequenceExpression', + instructions: defaultBlock.instructions.slice(0, -1), + id: instr.id, + value, + loc: loc, + }; + return { + block: defaultBlock.id, + place, + value: sequence, + id: instr.id, + }; + } + } + else { + const init = this.visitValueBlockTerminal(defaultBlock.terminal); + const final = this.visitValueBlock(init.fallthrough, loc); + const sequence = { + kind: 'SequenceExpression', + instructions: [ + ...defaultBlock.instructions, + { + id: init.id, + loc, + lvalue: init.place, + value: init.value, + }, + ], + id: final.id, + value: final.value, + loc, + }; + return { + block: init.fallthrough, + value: sequence, + place: final.place, + id: final.id, + }; + } + } + visitValueBlockTerminal(terminal) { + switch (terminal.kind) { + case 'sequence': { + const block = this.visitValueBlock(terminal.block, terminal.loc); + return { + value: block.value, + place: block.place, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'optional': { + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for optional test block`, + description: null, + loc: testBlock.terminal.loc, + suggestions: null, + }); + } + const consequent = this.visitValueBlock(testBlock.terminal.consequent, terminal.loc); + const call = { + kind: 'SequenceExpression', + instructions: [ + { + id: test.id, + loc: testBlock.terminal.loc, + lvalue: test.place, + value: test.value, + }, + ], + id: consequent.id, + value: consequent.value, + loc: terminal.loc, + }; + return { + place: Object.assign({}, consequent.place), + value: { + kind: 'OptionalExpression', + optional: terminal.optional, + value: call, + id: terminal.id, + loc: terminal.loc, + }, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'logical': { + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for logical test block`, + description: null, + loc: testBlock.terminal.loc, + suggestions: null, + }); + } + const leftFinal = this.visitValueBlock(testBlock.terminal.consequent, terminal.loc); + const left = { + kind: 'SequenceExpression', + instructions: [ + { + id: test.id, + loc: terminal.loc, + lvalue: test.place, + value: test.value, + }, + ], + id: leftFinal.id, + value: leftFinal.value, + loc: terminal.loc, + }; + const right = this.visitValueBlock(testBlock.terminal.alternate, terminal.loc); + const value = { + kind: 'LogicalExpression', + operator: terminal.operator, + left: left, + right: right.value, + loc: terminal.loc, + }; + return { + place: Object.assign({}, leftFinal.place), + value, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'ternary': { + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for ternary test block`, + description: null, + loc: testBlock.terminal.loc, + suggestions: null, + }); + } + const consequent = this.visitValueBlock(testBlock.terminal.consequent, terminal.loc); + const alternate = this.visitValueBlock(testBlock.terminal.alternate, terminal.loc); + const value = { + kind: 'ConditionalExpression', + test: test.value, + consequent: consequent.value, + alternate: alternate.value, + loc: terminal.loc, + }; + return { + place: Object.assign({}, consequent.place), + value, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'maybe-throw': { + CompilerError.throwTodo({ + reason: `Support value blocks (conditional, logical, optional chaining, etc) within a try/catch statement`, + description: null, + loc: terminal.loc, + suggestions: null, + }); + } + case 'label': { + CompilerError.throwTodo({ + reason: `Support labeled statements combined with value blocks (conditional, logical, optional chaining, etc)`, + description: null, + loc: terminal.loc, + suggestions: null, + }); + } + default: { + CompilerError.throwTodo({ + reason: `Support \`${terminal.kind}\` as a value block terminal (conditional, logical, optional chaining, etc)`, + description: null, + loc: terminal.loc, + suggestions: null, + }); + } + } + } + emptyBlock() { + return []; + } + visitBreak(block, id, loc) { + const target = this.cx.getBreakTarget(block); + if (target === null) { + CompilerError.invariant(false, { + reason: 'Expected a break target', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + if (this.cx.scopeFallthroughs.has(target.block)) { + CompilerError.invariant(target.type === 'implicit', { + reason: 'Expected reactive scope to implicitly break to fallthrough', + description: null, + details: [ + { + kind: 'error', + loc, + message: null, + }, + ], + }); + return null; + } + return { + kind: 'terminal', + terminal: { + kind: 'break', + loc, + target: target.block, + id, + targetKind: target.type, + }, + label: null, + }; + } + visitContinue(block, id, loc) { + const target = this.cx.getContinueTarget(block); + CompilerError.invariant(target !== null, { + reason: `Expected continue target to be scheduled for bb${block}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return { + kind: 'terminal', + terminal: { + kind: 'continue', + loc, + target: target.block, + id, + targetKind: target.type, + }, + label: null, + }; + } +} +let Context$3 = class Context { + constructor(ir) { + _Context_nextScheduleId.set(this, 0); + this.emitted = new Set(); + this.scopeFallthroughs = new Set(); + _Context_scheduled.set(this, new Set()); + _Context_catchHandlers.set(this, new Set()); + _Context_controlFlowStack.set(this, []); + this.ir = ir; + } + block(id) { + return this.ir.blocks.get(id); + } + scheduleCatchHandler(block) { + __classPrivateFieldGet(this, _Context_catchHandlers, "f").add(block); + } + reachable(id) { + const block = this.ir.blocks.get(id); + return block.terminal.kind !== 'unreachable'; + } + schedule(block, type) { + var _a, _b; + const id = (__classPrivateFieldSet(this, _Context_nextScheduleId, (_b = __classPrivateFieldGet(this, _Context_nextScheduleId, "f"), _a = _b++, _b), "f"), _a); + CompilerError.invariant(!__classPrivateFieldGet(this, _Context_scheduled, "f").has(block), { + reason: `Break block is already scheduled: bb${block}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(block); + __classPrivateFieldGet(this, _Context_controlFlowStack, "f").push({ block, id, type }); + return id; + } + scheduleLoop(fallthroughBlock, continueBlock, loopBlock) { + var _a, _b; + const id = (__classPrivateFieldSet(this, _Context_nextScheduleId, (_b = __classPrivateFieldGet(this, _Context_nextScheduleId, "f"), _a = _b++, _b), "f"), _a); + const ownsBlock = !__classPrivateFieldGet(this, _Context_scheduled, "f").has(fallthroughBlock); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(fallthroughBlock); + CompilerError.invariant(!__classPrivateFieldGet(this, _Context_scheduled, "f").has(continueBlock), { + reason: `Continue block is already scheduled: bb${continueBlock}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(continueBlock); + let ownsLoop = false; + if (loopBlock !== null) { + ownsLoop = !__classPrivateFieldGet(this, _Context_scheduled, "f").has(loopBlock); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(loopBlock); + } + __classPrivateFieldGet(this, _Context_controlFlowStack, "f").push({ + block: fallthroughBlock, + ownsBlock, + id, + type: 'loop', + continueBlock, + loopBlock, + ownsLoop, + }); + return id; + } + unschedule(scheduleId) { + const last = __classPrivateFieldGet(this, _Context_controlFlowStack, "f").pop(); + CompilerError.invariant(last !== undefined && last.id === scheduleId, { + reason: 'Can only unschedule the last target', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (last.type !== 'loop' || last.ownsBlock !== null) { + __classPrivateFieldGet(this, _Context_scheduled, "f").delete(last.block); + } + if (last.type === 'loop') { + __classPrivateFieldGet(this, _Context_scheduled, "f").delete(last.continueBlock); + if (last.ownsLoop && last.loopBlock !== null) { + __classPrivateFieldGet(this, _Context_scheduled, "f").delete(last.loopBlock); + } + } + } + unscheduleAll(scheduleIds) { + for (let i = scheduleIds.length - 1; i >= 0; i--) { + this.unschedule(scheduleIds[i]); + } + } + isScheduled(block) { + return __classPrivateFieldGet(this, _Context_scheduled, "f").has(block) || __classPrivateFieldGet(this, _Context_catchHandlers, "f").has(block); + } + getBreakTarget(block) { + let hasPrecedingLoop = false; + for (let i = __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1; i >= 0; i--) { + const target = __classPrivateFieldGet(this, _Context_controlFlowStack, "f")[i]; + if (target.block === block) { + let type; + if (target.type === 'loop') { + type = hasPrecedingLoop ? 'labeled' : 'unlabeled'; + } + else if (i === __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1) { + type = 'implicit'; + } + else { + type = 'labeled'; + } + return { + block: target.block, + type, + }; + } + hasPrecedingLoop || (hasPrecedingLoop = target.type === 'loop'); + } + CompilerError.invariant(false, { + reason: 'Expected a break target', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + getContinueTarget(block) { + let hasPrecedingLoop = false; + for (let i = __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1; i >= 0; i--) { + const target = __classPrivateFieldGet(this, _Context_controlFlowStack, "f")[i]; + if (target.type == 'loop' && target.continueBlock === block) { + let type; + if (hasPrecedingLoop) { + type = 'labeled'; + } + else if (i === __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1) { + type = 'implicit'; + } + else { + type = 'unlabeled'; + } + return { + block: target.block, + type, + }; + } + hasPrecedingLoop || (hasPrecedingLoop = target.type === 'loop'); + } + return null; + } + debugBreakTargets() { + return __classPrivateFieldGet(this, _Context_controlFlowStack, "f").map(target => (Object.assign({}, target))); + } +}; +_Context_nextScheduleId = new WeakMap(), _Context_scheduled = new WeakMap(), _Context_catchHandlers = new WeakMap(), _Context_controlFlowStack = new WeakMap(); + +var GuardKind; +(function (GuardKind) { + GuardKind[GuardKind["PushHookGuard"] = 0] = "PushHookGuard"; + GuardKind[GuardKind["PopHookGuard"] = 1] = "PopHookGuard"; + GuardKind[GuardKind["AllowHook"] = 2] = "AllowHook"; + GuardKind[GuardKind["DisallowHook"] = 3] = "DisallowHook"; +})(GuardKind || (GuardKind = {})); + +function memoizeFbtAndMacroOperandsInSameScope(fn) { + var _a; + const fbtMacroTags = new Set([ + ...Array.from(FBT_TAGS).map((tag) => [tag, []]), + ...((_a = fn.env.config.customMacros) !== null && _a !== void 0 ? _a : []), + ]); + const fbtValues = new Set(); + const macroMethods = new Map(); + while (true) { + let vsize = fbtValues.size; + let msize = macroMethods.size; + visit$1(fn, fbtMacroTags, fbtValues, macroMethods); + if (vsize === fbtValues.size && msize === macroMethods.size) { + break; + } + } + return fbtValues; +} +const FBT_TAGS = new Set([ + 'fbt', + 'fbt:param', + 'fbs', + 'fbs:param', +]); +const SINGLE_CHILD_FBT_TAGS = new Set([ + 'fbt:param', + 'fbs:param', +]); +function visit$1(fn, fbtMacroTags, fbtValues, macroMethods) { + for (const [, block] of fn.body.blocks) { + for (const instruction of block.instructions) { + const { lvalue, value } = instruction; + if (lvalue === null) { + continue; + } + if (value.kind === 'Primitive' && + typeof value.value === 'string' && + matchesExactTag(value.value, fbtMacroTags)) { + fbtValues.add(lvalue.identifier.id); + } + else if (value.kind === 'LoadGlobal' && + matchesExactTag(value.binding.name, fbtMacroTags)) { + fbtValues.add(lvalue.identifier.id); + } + else if (value.kind === 'LoadGlobal' && + matchTagRoot(value.binding.name, fbtMacroTags) !== null) { + const methods = matchTagRoot(value.binding.name, fbtMacroTags); + macroMethods.set(lvalue.identifier.id, methods); + } + else if (value.kind === 'PropertyLoad' && + macroMethods.has(value.object.identifier.id)) { + const methods = macroMethods.get(value.object.identifier.id); + const newMethods = []; + for (const method of methods) { + if (method.length > 0 && + (method[0].type === 'wildcard' || + (method[0].type === 'name' && method[0].name === value.property))) { + if (method.length > 1) { + newMethods.push(method.slice(1)); + } + else { + fbtValues.add(lvalue.identifier.id); + } + } + } + if (newMethods.length > 0) { + macroMethods.set(lvalue.identifier.id, newMethods); + } + } + else if (isFbtCallExpression(fbtValues, value)) { + const fbtScope = lvalue.identifier.scope; + if (fbtScope === null) { + continue; + } + for (const operand of eachReactiveValueOperand(value)) { + operand.identifier.scope = fbtScope; + expandFbtScopeRange(fbtScope.range, operand.identifier.mutableRange); + fbtValues.add(operand.identifier.id); + } + } + else if (isFbtJsxExpression(fbtMacroTags, fbtValues, value) || + isFbtJsxChild(fbtValues, lvalue, value)) { + const fbtScope = lvalue.identifier.scope; + if (fbtScope === null) { + continue; + } + for (const operand of eachReactiveValueOperand(value)) { + operand.identifier.scope = fbtScope; + expandFbtScopeRange(fbtScope.range, operand.identifier.mutableRange); + fbtValues.add(operand.identifier.id); + } + } + else if (fbtValues.has(lvalue.identifier.id)) { + const fbtScope = lvalue.identifier.scope; + if (fbtScope === null) { + return; + } + for (const operand of eachReactiveValueOperand(value)) { + if (operand.identifier.name !== null && + operand.identifier.name.kind === 'named') { + continue; + } + operand.identifier.scope = fbtScope; + expandFbtScopeRange(fbtScope.range, operand.identifier.mutableRange); + } + } + } + } +} +function matchesExactTag(s, tags) { + return Array.from(tags).some(macro => typeof macro === 'string' + ? s === macro + : macro[1].length === 0 && macro[0] === s); +} +function matchTagRoot(s, tags) { + const methods = []; + for (const macro of tags) { + if (typeof macro === 'string') { + continue; + } + const [tag, rest] = macro; + if (tag === s && rest.length > 0) { + methods.push(rest); + } + } + if (methods.length > 0) { + return methods; + } + else { + return null; + } +} +function isFbtCallExpression(fbtValues, value) { + return ((value.kind === 'CallExpression' && + fbtValues.has(value.callee.identifier.id)) || + (value.kind === 'MethodCall' && fbtValues.has(value.property.identifier.id))); +} +function isFbtJsxExpression(fbtMacroTags, fbtValues, value) { + return (value.kind === 'JsxExpression' && + ((value.tag.kind === 'Identifier' && + fbtValues.has(value.tag.identifier.id)) || + (value.tag.kind === 'BuiltinTag' && + matchesExactTag(value.tag.name, fbtMacroTags)))); +} +function isFbtJsxChild(fbtValues, lvalue, value) { + return ((value.kind === 'JsxExpression' || value.kind === 'JsxFragment') && + lvalue !== null && + fbtValues.has(lvalue.identifier.id)); +} +function expandFbtScopeRange(fbtRange, extendWith) { + if (extendWith.start !== 0) { + fbtRange.start = makeInstructionId(Math.min(fbtRange.start, extendWith.start)); + } +} + +var _Context_nextCacheIndex, _Context_declarations; +const MEMO_CACHE_SENTINEL = 'react.memo_cache_sentinel'; +const EARLY_RETURN_SENTINEL = 'react.early_return_sentinel'; +function codegenFunction(fn, { uniqueIdentifiers, fbtOperands, }) { + var _a, _b, _c; + const cx = new Context$2(fn.env, (_a = fn.id) !== null && _a !== void 0 ? _a : '[[ anonymous ]]', uniqueIdentifiers, fbtOperands, null); + let fastRefreshState = null; + if (fn.env.config.enableResetCacheOnSourceFileChanges && + fn.env.code !== null) { + const hash = crypto.createHmac('sha256', fn.env.code).digest('hex'); + fastRefreshState = { + cacheIndex: cx.nextCacheIndex, + hash, + }; + } + const compileResult = codegenReactiveFunction(cx, fn); + if (compileResult.isErr()) { + return compileResult; + } + const compiled = compileResult.unwrap(); + const hookGuard = fn.env.config.enableEmitHookGuards; + if (hookGuard != null && fn.env.isInferredMemoEnabled) { + compiled.body = libExports$1.blockStatement([ + createHookGuard(hookGuard, fn.env.programContext, compiled.body.body, GuardKind.PushHookGuard, GuardKind.PopHookGuard), + ]); + } + const cacheCount = compiled.memoSlotsUsed; + if (cacheCount !== 0) { + const preface = []; + const useMemoCacheIdentifier = fn.env.programContext.addMemoCacheImport().name; + preface.push(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.callExpression(libExports$1.identifier(useMemoCacheIdentifier), [ + libExports$1.numericLiteral(cacheCount), + ])), + ])); + if (fastRefreshState !== null) { + const index = cx.synthesizeName('$i'); + preface.push(libExports$1.ifStatement(libExports$1.binaryExpression('!==', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(fastRefreshState.cacheIndex), true), libExports$1.stringLiteral(fastRefreshState.hash)), libExports$1.blockStatement([ + libExports$1.forStatement(libExports$1.variableDeclaration('let', [ + libExports$1.variableDeclarator(libExports$1.identifier(index), libExports$1.numericLiteral(0)), + ]), libExports$1.binaryExpression('<', libExports$1.identifier(index), libExports$1.numericLiteral(cacheCount)), libExports$1.assignmentExpression('+=', libExports$1.identifier(index), libExports$1.numericLiteral(1)), libExports$1.blockStatement([ + libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.identifier(index), true), libExports$1.callExpression(libExports$1.memberExpression(libExports$1.identifier('Symbol'), libExports$1.identifier('for')), [libExports$1.stringLiteral(MEMO_CACHE_SENTINEL)]))), + ])), + libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(fastRefreshState.cacheIndex), true), libExports$1.stringLiteral(fastRefreshState.hash))), + ]))); + } + compiled.body.body.unshift(...preface); + } + const emitInstrumentForget = fn.env.config.enableEmitInstrumentForget; + if (emitInstrumentForget != null && + fn.id != null && + fn.env.isInferredMemoEnabled) { + const gating = emitInstrumentForget.gating != null + ? libExports$1.identifier(fn.env.programContext.addImportSpecifier(emitInstrumentForget.gating).name) + : null; + const globalGating = emitInstrumentForget.globalGating != null + ? libExports$1.identifier(emitInstrumentForget.globalGating) + : null; + if (emitInstrumentForget.globalGating != null) { + const assertResult = fn.env.programContext.assertGlobalBinding(emitInstrumentForget.globalGating); + if (assertResult.isErr()) { + return assertResult; + } + } + let ifTest; + if (gating != null && globalGating != null) { + ifTest = libExports$1.logicalExpression('&&', globalGating, gating); + } + else if (gating != null) { + ifTest = gating; + } + else { + CompilerError.invariant(globalGating != null, { + reason: 'Bad config not caught! Expected at least one of gating or globalGating', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + ifTest = globalGating; + } + const instrumentFnIdentifier = fn.env.programContext.addImportSpecifier(emitInstrumentForget.fn).name; + const test = libExports$1.ifStatement(ifTest, libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(instrumentFnIdentifier), [ + libExports$1.stringLiteral(fn.id), + libExports$1.stringLiteral((_b = fn.env.filename) !== null && _b !== void 0 ? _b : ''), + ]))); + compiled.body.body.unshift(test); + } + const outlined = []; + for (const { fn: outlinedFunction, type } of cx.env.getOutlinedFunctions()) { + const reactiveFunction = buildReactiveFunction(outlinedFunction); + pruneUnusedLabels(reactiveFunction); + pruneUnusedLValues(reactiveFunction); + pruneHoistedContexts(reactiveFunction); + const identifiers = renameVariables(reactiveFunction); + const codegen = codegenReactiveFunction(new Context$2(cx.env, (_c = reactiveFunction.id) !== null && _c !== void 0 ? _c : '[[ anonymous ]]', identifiers, cx.fbtOperands), reactiveFunction); + if (codegen.isErr()) { + return codegen; + } + outlined.push({ fn: codegen.unwrap(), type }); + } + compiled.outlined = outlined; + return compileResult; +} +function codegenReactiveFunction(cx, fn) { + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + cx.temp.set(place.identifier.declarationId, null); + cx.declare(place.identifier); + } + const params = fn.params.map(param => convertParameter(param)); + const body = codegenBlock(cx, fn.body); + body.directives = fn.directives.map(d => libExports$1.directive(libExports$1.directiveLiteral(d))); + const statements = body.body; + if (statements.length !== 0) { + const last = statements[statements.length - 1]; + if (last.type === 'ReturnStatement' && last.argument == null) { + statements.pop(); + } + } + if (cx.errors.hasAnyErrors()) { + return Err(cx.errors); + } + const countMemoBlockVisitor = new CountMemoBlockVisitor(fn.env); + visitReactiveFunction(fn, countMemoBlockVisitor, undefined); + return Ok({ + type: 'CodegenFunction', + loc: fn.loc, + id: fn.id !== null ? libExports$1.identifier(fn.id) : null, + nameHint: fn.nameHint, + params, + body, + generator: fn.generator, + async: fn.async, + memoSlotsUsed: cx.nextCacheIndex, + memoBlocks: countMemoBlockVisitor.memoBlocks, + memoValues: countMemoBlockVisitor.memoValues, + prunedMemoBlocks: countMemoBlockVisitor.prunedMemoBlocks, + prunedMemoValues: countMemoBlockVisitor.prunedMemoValues, + outlined: [], + hasFireRewrite: fn.env.hasFireRewrite, + hasInferredEffect: fn.env.hasInferredEffect, + inferredEffectLocations: fn.env.inferredEffectLocations, + }); +} +class CountMemoBlockVisitor extends ReactiveFunctionVisitor { + constructor(env) { + super(); + this.memoBlocks = 0; + this.memoValues = 0; + this.prunedMemoBlocks = 0; + this.prunedMemoValues = 0; + this.env = env; + } + visitScope(scopeBlock, state) { + this.memoBlocks += 1; + this.memoValues += scopeBlock.scope.declarations.size; + this.traverseScope(scopeBlock, state); + } + visitPrunedScope(scopeBlock, state) { + this.prunedMemoBlocks += 1; + this.prunedMemoValues += scopeBlock.scope.declarations.size; + this.traversePrunedScope(scopeBlock, state); + } +} +function convertParameter(param) { + if (param.kind === 'Identifier') { + return convertIdentifier(param.identifier); + } + else { + return libExports$1.restElement(convertIdentifier(param.place.identifier)); + } +} +let Context$2 = class Context { + constructor(env, fnName, uniqueIdentifiers, fbtOperands, temporaries = null) { + _Context_nextCacheIndex.set(this, 0); + _Context_declarations.set(this, new Set()); + this.errors = new CompilerError(); + this.objectMethods = new Map(); + this.synthesizedNames = new Map(); + this.env = env; + this.fnName = fnName; + this.uniqueIdentifiers = uniqueIdentifiers; + this.fbtOperands = fbtOperands; + this.temp = temporaries !== null ? new Map(temporaries) : new Map(); + } + get nextCacheIndex() { + var _a, _b; + return __classPrivateFieldSet(this, _Context_nextCacheIndex, (_b = __classPrivateFieldGet(this, _Context_nextCacheIndex, "f"), _a = _b++, _b), "f"), _a; + } + declare(identifier) { + __classPrivateFieldGet(this, _Context_declarations, "f").add(identifier.declarationId); + } + hasDeclared(identifier) { + return __classPrivateFieldGet(this, _Context_declarations, "f").has(identifier.declarationId); + } + synthesizeName(name) { + const previous = this.synthesizedNames.get(name); + if (previous !== undefined) { + return previous; + } + let validated = makeIdentifierName(name).value; + let index = 0; + while (this.uniqueIdentifiers.has(validated)) { + validated = makeIdentifierName(`${name}${index++}`).value; + } + this.uniqueIdentifiers.add(validated); + this.synthesizedNames.set(name, validated); + return validated; + } +}; +_Context_nextCacheIndex = new WeakMap(), _Context_declarations = new WeakMap(); +function codegenBlock(cx, block) { + const temp = new Map(cx.temp); + const result = codegenBlockNoReset(cx, block); + for (const [key, value] of cx.temp) { + if (!temp.has(key)) { + continue; + } + CompilerError.invariant(temp.get(key) === value, { + reason: 'Expected temporary value to be unchanged', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + } + cx.temp = temp; + return result; +} +function codegenBlockNoReset(cx, block) { + const statements = []; + for (const item of block) { + switch (item.kind) { + case 'instruction': { + const statement = codegenInstructionNullable(cx, item.instruction); + if (statement !== null) { + statements.push(statement); + } + break; + } + case 'pruned-scope': { + const scopeBlock = codegenBlockNoReset(cx, item.instructions); + statements.push(...scopeBlock.body); + break; + } + case 'scope': { + const temp = new Map(cx.temp); + codegenReactiveScope(cx, statements, item.scope, item.instructions); + cx.temp = temp; + break; + } + case 'terminal': { + const statement = codegenTerminal(cx, item.terminal); + if (statement === null) { + break; + } + if (item.label !== null && !item.label.implicit) { + const block = statement.type === 'BlockStatement' && statement.body.length === 1 + ? statement.body[0] + : statement; + statements.push(libExports$1.labeledStatement(libExports$1.identifier(codegenLabel(item.label.id)), block)); + } + else if (statement.type === 'BlockStatement') { + statements.push(...statement.body); + } + else { + statements.push(statement); + } + break; + } + default: { + assertExhaustive$1(item, `Unexpected item kind \`${item.kind}\``); + } + } + } + return libExports$1.blockStatement(statements); +} +function wrapCacheDep(cx, value) { + if (cx.env.config.enableEmitFreeze != null && cx.env.isInferredMemoEnabled) { + const emitFreezeIdentifier = cx.env.programContext.addImportSpecifier(cx.env.config.enableEmitFreeze).name; + cx.env.programContext + .assertGlobalBinding(EMIT_FREEZE_GLOBAL_GATING, cx.env.scope) + .unwrap(); + return libExports$1.conditionalExpression(libExports$1.identifier(EMIT_FREEZE_GLOBAL_GATING), libExports$1.callExpression(libExports$1.identifier(emitFreezeIdentifier), [ + value, + libExports$1.stringLiteral(cx.fnName), + ]), value); + } + else { + return value; + } +} +function codegenReactiveScope(cx, statements, scope, block) { + const cacheStoreStatements = []; + const cacheLoadStatements = []; + const cacheLoads = []; + const changeExpressions = []; + const changeExpressionComments = []; + const outputComments = []; + for (const dep of [...scope.dependencies].sort(compareScopeDependency)) { + const index = cx.nextCacheIndex; + changeExpressionComments.push(printDependencyComment(dep)); + const comparison = libExports$1.binaryExpression('!==', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true), codegenDependency(cx, dep)); + if (cx.env.config.enableChangeVariableCodegen) { + const changeIdentifier = libExports$1.identifier(cx.synthesizeName(`c_${index}`)); + statements.push(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(changeIdentifier, comparison), + ])); + changeExpressions.push(changeIdentifier); + } + else { + changeExpressions.push(comparison); + } + cacheStoreStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true), codegenDependency(cx, dep)))); + } + let firstOutputIndex = null; + for (const [, { identifier }] of [...scope.declarations].sort(([, a], [, b]) => compareScopeDeclaration(a, b))) { + const index = cx.nextCacheIndex; + if (firstOutputIndex === null) { + firstOutputIndex = index; + } + CompilerError.invariant(identifier.name != null, { + reason: `Expected scope declaration identifier to be named`, + description: `Declaration \`${printIdentifier(identifier)}\` is unnamed in scope @${scope.id}`, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + const name = convertIdentifier(identifier); + outputComments.push(name.name); + if (!cx.hasDeclared(identifier)) { + statements.push(libExports$1.variableDeclaration('let', [libExports$1.variableDeclarator(name)])); + } + cacheLoads.push({ name, index, value: wrapCacheDep(cx, name) }); + cx.declare(identifier); + } + for (const reassignment of scope.reassignments) { + const index = cx.nextCacheIndex; + if (firstOutputIndex === null) { + firstOutputIndex = index; + } + const name = convertIdentifier(reassignment); + outputComments.push(name.name); + cacheLoads.push({ name, index, value: wrapCacheDep(cx, name) }); + } + let testCondition = changeExpressions.reduce((acc, ident) => { + if (acc == null) { + return ident; + } + return libExports$1.logicalExpression('||', acc, ident); + }, null); + if (testCondition === null) { + CompilerError.invariant(firstOutputIndex !== null, { + reason: `Expected scope to have at least one declaration`, + description: `Scope '@${scope.id}' has no declarations`, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + testCondition = libExports$1.binaryExpression('===', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(firstOutputIndex), true), libExports$1.callExpression(libExports$1.memberExpression(libExports$1.identifier('Symbol'), libExports$1.identifier('for')), [libExports$1.stringLiteral(MEMO_CACHE_SENTINEL)])); + } + if (cx.env.config.disableMemoizationForDebugging) { + CompilerError.invariant(cx.env.config.enableChangeDetectionForDebugging == null, { + reason: `Expected to not have both change detection enabled and memoization disabled`, + description: `Incompatible config options`, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + testCondition = libExports$1.logicalExpression('||', testCondition, libExports$1.booleanLiteral(true)); + } + let computationBlock = codegenBlock(cx, block); + let memoStatement; + const detectionFunction = cx.env.config.enableChangeDetectionForDebugging; + if (detectionFunction != null && changeExpressions.length > 0) { + const loc = typeof scope.loc === 'symbol' + ? 'unknown location' + : `(${scope.loc.start.line}:${scope.loc.end.line})`; + const importedDetectionFunctionIdentifier = cx.env.programContext.addImportSpecifier(detectionFunction).name; + const cacheLoadOldValueStatements = []; + const changeDetectionStatements = []; + const idempotenceDetectionStatements = []; + for (const { name, index, value } of cacheLoads) { + const loadName = cx.synthesizeName(`old$${name.name}`); + const slot = libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true); + cacheStoreStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', slot, value))); + cacheLoadOldValueStatements.push(libExports$1.variableDeclaration('let', [ + libExports$1.variableDeclarator(libExports$1.identifier(loadName), slot), + ])); + changeDetectionStatements.push(libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(importedDetectionFunctionIdentifier), [ + libExports$1.identifier(loadName), + libExports$1.cloneNode(name, true), + libExports$1.stringLiteral(name.name), + libExports$1.stringLiteral(cx.fnName), + libExports$1.stringLiteral('cached'), + libExports$1.stringLiteral(loc), + ]))); + idempotenceDetectionStatements.push(libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(importedDetectionFunctionIdentifier), [ + libExports$1.cloneNode(slot, true), + libExports$1.cloneNode(name, true), + libExports$1.stringLiteral(name.name), + libExports$1.stringLiteral(cx.fnName), + libExports$1.stringLiteral('recomputed'), + libExports$1.stringLiteral(loc), + ]))); + idempotenceDetectionStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', name, slot))); + } + const condition = cx.synthesizeName('condition'); + const recomputationBlock = libExports$1.cloneNode(computationBlock, true); + memoStatement = libExports$1.blockStatement([ + ...computationBlock.body, + libExports$1.variableDeclaration('let', [ + libExports$1.variableDeclarator(libExports$1.identifier(condition), testCondition), + ]), + libExports$1.ifStatement(libExports$1.unaryExpression('!', libExports$1.identifier(condition)), libExports$1.blockStatement([ + ...cacheLoadOldValueStatements, + ...changeDetectionStatements, + ])), + ...cacheStoreStatements, + libExports$1.ifStatement(libExports$1.identifier(condition), libExports$1.blockStatement([ + ...recomputationBlock.body, + ...idempotenceDetectionStatements, + ])), + ]); + } + else { + for (const { name, index, value } of cacheLoads) { + cacheStoreStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true), value))); + cacheLoadStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', name, libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true)))); + } + computationBlock.body.push(...cacheStoreStatements); + memoStatement = libExports$1.ifStatement(testCondition, computationBlock, libExports$1.blockStatement(cacheLoadStatements)); + } + if (cx.env.config.enableMemoizationComments) { + if (changeExpressionComments.length) { + libExports$1.addComment(memoStatement, 'leading', ` check if ${printDelimitedCommentList(changeExpressionComments, 'or')} changed`, true); + libExports$1.addComment(memoStatement, 'leading', ` "useMemo" for ${printDelimitedCommentList(outputComments, 'and')}:`, true); + } + else { + libExports$1.addComment(memoStatement, 'leading', ' cache value with no dependencies', true); + libExports$1.addComment(memoStatement, 'leading', ` "useMemo" for ${printDelimitedCommentList(outputComments, 'and')}:`, true); + } + if (computationBlock.body.length > 0) { + libExports$1.addComment(computationBlock.body[0], 'leading', ` Inputs changed, recompute`, true); + } + if (cacheLoadStatements.length > 0) { + libExports$1.addComment(cacheLoadStatements[0], 'leading', ` Inputs did not change, use cached value`, true); + } + } + statements.push(memoStatement); + const earlyReturnValue = scope.earlyReturnValue; + if (earlyReturnValue !== null) { + CompilerError.invariant(earlyReturnValue.value.name !== null && + earlyReturnValue.value.name.kind === 'named', { + reason: `Expected early return value to be promoted to a named variable`, + description: null, + details: [ + { + kind: 'error', + loc: earlyReturnValue.loc, + message: null, + }, + ], + suggestions: null, + }); + const name = earlyReturnValue.value.name.value; + statements.push(libExports$1.ifStatement(libExports$1.binaryExpression('!==', libExports$1.identifier(name), libExports$1.callExpression(libExports$1.memberExpression(libExports$1.identifier('Symbol'), libExports$1.identifier('for')), [libExports$1.stringLiteral(EARLY_RETURN_SENTINEL)])), libExports$1.blockStatement([libExports$1.returnStatement(libExports$1.identifier(name))]))); + } +} +function codegenTerminal(cx, terminal) { + switch (terminal.kind) { + case 'break': { + if (terminal.targetKind === 'implicit') { + return null; + } + return createBreakStatement(terminal.loc, terminal.targetKind === 'labeled' + ? libExports$1.identifier(codegenLabel(terminal.target)) + : null); + } + case 'continue': { + if (terminal.targetKind === 'implicit') { + return null; + } + return createContinueStatement(terminal.loc, terminal.targetKind === 'labeled' + ? libExports$1.identifier(codegenLabel(terminal.target)) + : null); + } + case 'for': { + return createForStatement(terminal.loc, codegenForInit(cx, terminal.init), codegenInstructionValueToExpression(cx, terminal.test), terminal.update !== null + ? codegenInstructionValueToExpression(cx, terminal.update) + : null, codegenBlock(cx, terminal.loop)); + } + case 'for-in': { + CompilerError.invariant(terminal.init.kind === 'SequenceExpression', { + reason: `Expected a sequence expression init for for..in`, + description: `Got \`${terminal.init.kind}\` expression instead`, + details: [ + { + kind: 'error', + loc: terminal.init.loc, + message: null, + }, + ], + suggestions: null, + }); + if (terminal.init.instructions.length !== 2) { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..in inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + const iterableCollection = terminal.init.instructions[0]; + const iterableItem = terminal.init.instructions[1]; + let lval; + switch (iterableItem.value.kind) { + case 'StoreLocal': { + lval = codegenLValue(cx, iterableItem.value.lvalue.place); + break; + } + case 'Destructure': { + lval = codegenLValue(cx, iterableItem.value.lvalue.pattern); + break; + } + case 'StoreContext': { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..in inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + default: + CompilerError.invariant(false, { + reason: `Expected a StoreLocal or Destructure to be assigned to the collection`, + description: `Found ${iterableItem.value.kind}`, + details: [ + { + kind: 'error', + loc: iterableItem.value.loc, + message: null, + }, + ], + suggestions: null, + }); + } + let varDeclKind; + switch (iterableItem.value.lvalue.kind) { + case InstructionKind.Const: + varDeclKind = 'const'; + break; + case InstructionKind.Let: + varDeclKind = 'let'; + break; + case InstructionKind.Reassign: + CompilerError.invariant(false, { + reason: 'Destructure should never be Reassign as it would be an Object/ArrayPattern', + description: null, + details: [ + { + kind: 'error', + loc: iterableItem.loc, + message: null, + }, + ], + suggestions: null, + }); + case InstructionKind.Catch: + case InstructionKind.HoistedConst: + case InstructionKind.HoistedLet: + case InstructionKind.HoistedFunction: + case InstructionKind.Function: + CompilerError.invariant(false, { + reason: `Unexpected ${iterableItem.value.lvalue.kind} variable in for..in collection`, + description: null, + details: [ + { + kind: 'error', + loc: iterableItem.loc, + message: null, + }, + ], + suggestions: null, + }); + default: + assertExhaustive$1(iterableItem.value.lvalue.kind, `Unhandled lvalue kind: ${iterableItem.value.lvalue.kind}`); + } + return createForInStatement(terminal.loc, createVariableDeclaration(iterableItem.value.loc, varDeclKind, [ + libExports$1.variableDeclarator(lval, null), + ]), codegenInstructionValueToExpression(cx, iterableCollection.value), codegenBlock(cx, terminal.loop)); + } + case 'for-of': { + CompilerError.invariant(terminal.init.kind === 'SequenceExpression' && + terminal.init.instructions.length === 1 && + terminal.init.instructions[0].value.kind === 'GetIterator', { + reason: `Expected a single-expression sequence expression init for for..of`, + description: `Got \`${terminal.init.kind}\` expression instead`, + details: [ + { + kind: 'error', + loc: terminal.init.loc, + message: null, + }, + ], + suggestions: null, + }); + const iterableCollection = terminal.init.instructions[0].value; + CompilerError.invariant(terminal.test.kind === 'SequenceExpression', { + reason: `Expected a sequence expression test for for..of`, + description: `Got \`${terminal.init.kind}\` expression instead`, + details: [ + { + kind: 'error', + loc: terminal.test.loc, + message: null, + }, + ], + suggestions: null, + }); + if (terminal.test.instructions.length !== 2) { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..of inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + const iterableItem = terminal.test.instructions[1]; + let lval; + switch (iterableItem.value.kind) { + case 'StoreLocal': { + lval = codegenLValue(cx, iterableItem.value.lvalue.place); + break; + } + case 'Destructure': { + lval = codegenLValue(cx, iterableItem.value.lvalue.pattern); + break; + } + case 'StoreContext': { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..of inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + default: + CompilerError.invariant(false, { + reason: `Expected a StoreLocal or Destructure to be assigned to the collection`, + description: `Found ${iterableItem.value.kind}`, + details: [ + { + kind: 'error', + loc: iterableItem.value.loc, + message: null, + }, + ], + suggestions: null, + }); + } + let varDeclKind; + switch (iterableItem.value.lvalue.kind) { + case InstructionKind.Const: + varDeclKind = 'const'; + break; + case InstructionKind.Let: + varDeclKind = 'let'; + break; + case InstructionKind.Reassign: + case InstructionKind.Catch: + case InstructionKind.HoistedConst: + case InstructionKind.HoistedLet: + case InstructionKind.HoistedFunction: + case InstructionKind.Function: + CompilerError.invariant(false, { + reason: `Unexpected ${iterableItem.value.lvalue.kind} variable in for..of collection`, + description: null, + details: [ + { + kind: 'error', + loc: iterableItem.loc, + message: null, + }, + ], + suggestions: null, + }); + default: + assertExhaustive$1(iterableItem.value.lvalue.kind, `Unhandled lvalue kind: ${iterableItem.value.lvalue.kind}`); + } + return createForOfStatement(terminal.loc, createVariableDeclaration(iterableItem.value.loc, varDeclKind, [ + libExports$1.variableDeclarator(lval, null), + ]), codegenInstructionValueToExpression(cx, iterableCollection), codegenBlock(cx, terminal.loop)); + } + case 'if': { + const test = codegenPlaceToExpression(cx, terminal.test); + const consequent = codegenBlock(cx, terminal.consequent); + let alternate = null; + if (terminal.alternate !== null) { + const block = codegenBlock(cx, terminal.alternate); + if (block.body.length !== 0) { + alternate = block; + } + } + return createIfStatement(terminal.loc, test, consequent, alternate); + } + case 'return': { + const value = codegenPlaceToExpression(cx, terminal.value); + if (value.type === 'Identifier' && value.name === 'undefined') { + return libExports$1.returnStatement(); + } + return libExports$1.returnStatement(value); + } + case 'switch': { + return createSwitchStatement(terminal.loc, codegenPlaceToExpression(cx, terminal.test), terminal.cases.map(case_ => { + const test = case_.test !== null + ? codegenPlaceToExpression(cx, case_.test) + : null; + const block = codegenBlock(cx, case_.block); + return libExports$1.switchCase(test, block.body.length === 0 ? [] : [block]); + })); + } + case 'throw': { + return createThrowStatement(terminal.loc, codegenPlaceToExpression(cx, terminal.value)); + } + case 'do-while': { + const test = codegenInstructionValueToExpression(cx, terminal.test); + return createDoWhileStatement(terminal.loc, test, codegenBlock(cx, terminal.loop)); + } + case 'while': { + const test = codegenInstructionValueToExpression(cx, terminal.test); + return createWhileStatement(terminal.loc, test, codegenBlock(cx, terminal.loop)); + } + case 'label': { + return codegenBlock(cx, terminal.block); + } + case 'try': { + let catchParam = null; + if (terminal.handlerBinding !== null) { + catchParam = convertIdentifier(terminal.handlerBinding.identifier); + cx.temp.set(terminal.handlerBinding.identifier.declarationId, null); + } + return createTryStatement(terminal.loc, codegenBlock(cx, terminal.block), libExports$1.catchClause(catchParam, codegenBlock(cx, terminal.handler))); + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function codegenInstructionNullable(cx, instr) { + if (instr.value.kind === 'StoreLocal' || + instr.value.kind === 'StoreContext' || + instr.value.kind === 'Destructure' || + instr.value.kind === 'DeclareLocal' || + instr.value.kind === 'DeclareContext') { + let kind = instr.value.lvalue.kind; + let lvalue; + let value; + if (instr.value.kind === 'StoreLocal') { + kind = cx.hasDeclared(instr.value.lvalue.place.identifier) + ? InstructionKind.Reassign + : kind; + lvalue = instr.value.lvalue.place; + value = codegenPlaceToExpression(cx, instr.value.value); + } + else if (instr.value.kind === 'StoreContext') { + lvalue = instr.value.lvalue.place; + value = codegenPlaceToExpression(cx, instr.value.value); + } + else if (instr.value.kind === 'DeclareLocal' || + instr.value.kind === 'DeclareContext') { + if (cx.hasDeclared(instr.value.lvalue.place.identifier)) { + return null; + } + kind = instr.value.lvalue.kind; + lvalue = instr.value.lvalue.place; + value = null; + } + else { + lvalue = instr.value.lvalue.pattern; + let hasReassign = false; + let hasDeclaration = false; + for (const place of eachPatternOperand(lvalue)) { + if (kind !== InstructionKind.Reassign && + place.identifier.name === null) { + cx.temp.set(place.identifier.declarationId, null); + } + const isDeclared = cx.hasDeclared(place.identifier); + hasReassign || (hasReassign = isDeclared); + hasDeclaration || (hasDeclaration = !isDeclared); + } + if (hasReassign && hasDeclaration) { + CompilerError.invariant(false, { + reason: 'Encountered a destructuring operation where some identifiers are already declared (reassignments) but others are not (declarations)', + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + suggestions: null, + }); + } + else if (hasReassign) { + kind = InstructionKind.Reassign; + } + value = codegenPlaceToExpression(cx, instr.value.value); + } + switch (kind) { + case InstructionKind.Const: { + CompilerError.invariant(instr.lvalue === null, { + reason: `Const declaration cannot be referenced as an expression`, + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: `this is ${kind}`, + }, + ], + suggestions: null, + }); + return createVariableDeclaration(instr.loc, 'const', [ + libExports$1.variableDeclarator(codegenLValue(cx, lvalue), value), + ]); + } + case InstructionKind.Function: { + CompilerError.invariant(instr.lvalue === null, { + reason: `Function declaration cannot be referenced as an expression`, + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: `this is ${kind}`, + }, + ], + suggestions: null, + }); + const genLvalue = codegenLValue(cx, lvalue); + CompilerError.invariant(genLvalue.type === 'Identifier', { + reason: 'Expected an identifier as a function declaration lvalue', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + suggestions: null, + }); + CompilerError.invariant((value === null || value === void 0 ? void 0 : value.type) === 'FunctionExpression', { + reason: 'Expected a function as a function declaration value', + description: `Got ${value == null ? String(value) : value.type} at ${printInstruction(instr)}`, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + suggestions: null, + }); + return createFunctionDeclaration(instr.loc, genLvalue, value.params, value.body, value.generator, value.async); + } + case InstructionKind.Let: { + CompilerError.invariant(instr.lvalue === null, { + reason: `Const declaration cannot be referenced as an expression`, + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: 'this is const', + }, + ], + suggestions: null, + }); + return createVariableDeclaration(instr.loc, 'let', [ + libExports$1.variableDeclarator(codegenLValue(cx, lvalue), value), + ]); + } + case InstructionKind.Reassign: { + CompilerError.invariant(value !== null, { + reason: 'Expected a value for reassignment', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + suggestions: null, + }); + const expr = libExports$1.assignmentExpression('=', codegenLValue(cx, lvalue), value); + if (instr.lvalue !== null) { + if (instr.value.kind !== 'StoreContext') { + cx.temp.set(instr.lvalue.identifier.declarationId, expr); + return null; + } + else { + const statement = codegenInstruction(cx, instr, expr); + if (statement.type === 'EmptyStatement') { + return null; + } + return statement; + } + } + else { + return createExpressionStatement(instr.loc, expr); + } + } + case InstructionKind.Catch: { + return libExports$1.emptyStatement(); + } + case InstructionKind.HoistedLet: + case InstructionKind.HoistedConst: + case InstructionKind.HoistedFunction: { + CompilerError.invariant(false, { + reason: `Expected ${kind} to have been pruned in PruneHoistedContexts`, + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(kind, `Unexpected instruction kind \`${kind}\``); + } + } + } + else if (instr.value.kind === 'StartMemoize' || + instr.value.kind === 'FinishMemoize') { + return null; + } + else if (instr.value.kind === 'Debugger') { + return libExports$1.debuggerStatement(); + } + else if (instr.value.kind === 'ObjectMethod') { + CompilerError.invariant(instr.lvalue, { + reason: 'Expected object methods to have a temp lvalue', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + cx.objectMethods.set(instr.lvalue.identifier.id, instr.value); + return null; + } + else { + const value = codegenInstructionValue(cx, instr.value); + const statement = codegenInstruction(cx, instr, value); + if (statement.type === 'EmptyStatement') { + return null; + } + return statement; + } +} +function codegenForInit(cx, init) { + if (init.kind === 'SequenceExpression') { + const body = codegenBlock(cx, init.instructions.map(instruction => ({ + kind: 'instruction', + instruction, + }))).body; + const declarators = []; + let kind = 'const'; + body.forEach(instr => { + var _a; + let top = undefined; + if (instr.type === 'ExpressionStatement' && + instr.expression.type === 'AssignmentExpression' && + instr.expression.operator === '=' && + instr.expression.left.type === 'Identifier' && + ((_a = (top = declarators.at(-1))) === null || _a === void 0 ? void 0 : _a.id.type) === 'Identifier' && + (top === null || top === void 0 ? void 0 : top.id.name) === instr.expression.left.name && + (top === null || top === void 0 ? void 0 : top.init) == null) { + top.init = instr.expression.right; + } + else { + CompilerError.invariant(instr.type === 'VariableDeclaration' && + (instr.kind === 'let' || instr.kind === 'const'), { + reason: 'Expected a variable declaration', + details: [ + { + kind: 'error', + loc: init.loc, + message: null, + }, + ], + description: `Got ${instr.type}`, + suggestions: null, + }); + if (instr.kind === 'let') { + kind = 'let'; + } + declarators.push(...instr.declarations); + } + }); + CompilerError.invariant(declarators.length > 0, { + reason: 'Expected a variable declaration', + details: [ + { + kind: 'error', + loc: init.loc, + message: null, + }, + ], + description: null, + suggestions: null, + }); + return libExports$1.variableDeclaration(kind, declarators); + } + else { + return codegenInstructionValueToExpression(cx, init); + } +} +function printDependencyComment(dependency) { + const identifier = convertIdentifier(dependency.identifier); + let name = identifier.name; + if (dependency.path !== null) { + for (const path of dependency.path) { + name += `.${path.property}`; + } + } + return name; +} +function printDelimitedCommentList(items, finalCompletion) { + if (items.length === 2) { + return items.join(` ${finalCompletion} `); + } + else if (items.length <= 1) { + return items.join(''); + } + let output = []; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (i < items.length - 2) { + output.push(`${item}, `); + } + else if (i === items.length - 2) { + output.push(`${item}, ${finalCompletion} `); + } + else { + output.push(item); + } + } + return output.join(''); +} +function codegenDependency(cx, dependency) { + let object = convertIdentifier(dependency.identifier); + if (dependency.path.length !== 0) { + const hasOptional = dependency.path.some(path => path.optional); + for (const path of dependency.path) { + const property = typeof path.property === 'string' + ? libExports$1.identifier(path.property) + : libExports$1.numericLiteral(path.property); + const isComputed = typeof path.property !== 'string'; + if (hasOptional) { + object = libExports$1.optionalMemberExpression(object, property, isComputed, path.optional); + } + else { + object = libExports$1.memberExpression(object, property, isComputed); + } + } + } + return object; +} +function withLoc(fn) { + return (loc, ...args) => { + const node = fn(...args); + if (loc != null && loc != GeneratedSource) { + node.loc = loc; + } + return node; + }; +} +const createBinaryExpression = withLoc(libExports$1.binaryExpression); +const createExpressionStatement = withLoc(libExports$1.expressionStatement); +const createVariableDeclaration = withLoc(libExports$1.variableDeclaration); +const createFunctionDeclaration = withLoc(libExports$1.functionDeclaration); +const createWhileStatement = withLoc(libExports$1.whileStatement); +const createDoWhileStatement = withLoc(libExports$1.doWhileStatement); +const createSwitchStatement = withLoc(libExports$1.switchStatement); +const createIfStatement = withLoc(libExports$1.ifStatement); +const createForStatement = withLoc(libExports$1.forStatement); +const createForOfStatement = withLoc(libExports$1.forOfStatement); +const createForInStatement = withLoc(libExports$1.forInStatement); +const createTaggedTemplateExpression = withLoc(libExports$1.taggedTemplateExpression); +const createLogicalExpression = withLoc(libExports$1.logicalExpression); +const createSequenceExpression = withLoc(libExports$1.sequenceExpression); +const createConditionalExpression = withLoc(libExports$1.conditionalExpression); +const createTemplateLiteral = withLoc(libExports$1.templateLiteral); +const createJsxNamespacedName = withLoc(libExports$1.jsxNamespacedName); +const createJsxElement = withLoc(libExports$1.jsxElement); +const createJsxAttribute = withLoc(libExports$1.jsxAttribute); +const createJsxIdentifier = withLoc(libExports$1.jsxIdentifier); +const createJsxExpressionContainer = withLoc(libExports$1.jsxExpressionContainer); +const createJsxText = withLoc(libExports$1.jsxText); +const createJsxClosingElement = withLoc(libExports$1.jsxClosingElement); +const createJsxOpeningElement = withLoc(libExports$1.jsxOpeningElement); +const createStringLiteral = withLoc(libExports$1.stringLiteral); +const createThrowStatement = withLoc(libExports$1.throwStatement); +const createTryStatement = withLoc(libExports$1.tryStatement); +const createBreakStatement = withLoc(libExports$1.breakStatement); +const createContinueStatement = withLoc(libExports$1.continueStatement); +function createHookGuard(guard, context, stmts, before, after) { + const guardFnName = context.addImportSpecifier(guard).name; + function createHookGuardImpl(kind) { + return libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(guardFnName), [libExports$1.numericLiteral(kind)])); + } + return libExports$1.tryStatement(libExports$1.blockStatement([createHookGuardImpl(before), ...stmts]), null, libExports$1.blockStatement([createHookGuardImpl(after)])); +} +function createCallExpression(env, callee, args, loc, isHook) { + const callExpr = libExports$1.callExpression(callee, args); + if (loc != null && loc != GeneratedSource) { + callExpr.loc = loc; + } + const hookGuard = env.config.enableEmitHookGuards; + if (hookGuard != null && isHook && env.isInferredMemoEnabled) { + const iife = libExports$1.functionExpression(null, [], libExports$1.blockStatement([ + createHookGuard(hookGuard, env.programContext, [libExports$1.returnStatement(callExpr)], GuardKind.AllowHook, GuardKind.DisallowHook), + ])); + return libExports$1.callExpression(iife, []); + } + else { + return callExpr; + } +} +function codegenLabel(id) { + return `bb${id}`; +} +function codegenInstruction(cx, instr, value) { + if (libExports$1.isStatement(value)) { + return value; + } + if (instr.lvalue === null) { + return libExports$1.expressionStatement(convertValueToExpression(value)); + } + if (instr.lvalue.identifier.name === null) { + cx.temp.set(instr.lvalue.identifier.declarationId, value); + return libExports$1.emptyStatement(); + } + else { + const expressionValue = convertValueToExpression(value); + if (cx.hasDeclared(instr.lvalue.identifier)) { + return createExpressionStatement(instr.loc, libExports$1.assignmentExpression('=', convertIdentifier(instr.lvalue.identifier), expressionValue)); + } + else { + return createVariableDeclaration(instr.loc, 'const', [ + libExports$1.variableDeclarator(convertIdentifier(instr.lvalue.identifier), expressionValue), + ]); + } + } +} +function convertValueToExpression(value) { + if (value.type === 'JSXText') { + return createStringLiteral(value.loc, value.value); + } + return value; +} +function codegenInstructionValueToExpression(cx, instrValue) { + const value = codegenInstructionValue(cx, instrValue); + return convertValueToExpression(value); +} +function codegenInstructionValue(cx, instrValue) { + var _a, _b, _c, _d, _e, _f, _g; + let value; + switch (instrValue.kind) { + case 'ArrayExpression': { + const elements = instrValue.elements.map(element => { + if (element.kind === 'Identifier') { + return codegenPlaceToExpression(cx, element); + } + else if (element.kind === 'Spread') { + return libExports$1.spreadElement(codegenPlaceToExpression(cx, element.place)); + } + else { + return null; + } + }); + value = libExports$1.arrayExpression(elements); + break; + } + case 'BinaryExpression': { + const left = codegenPlaceToExpression(cx, instrValue.left); + const right = codegenPlaceToExpression(cx, instrValue.right); + value = createBinaryExpression(instrValue.loc, instrValue.operator, left, right); + break; + } + case 'UnaryExpression': { + value = libExports$1.unaryExpression(instrValue.operator, codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'Primitive': { + value = codegenValue(cx, instrValue.loc, instrValue.value); + break; + } + case 'CallExpression': { + if (cx.env.config.enableForest) { + const callee = codegenPlaceToExpression(cx, instrValue.callee); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = libExports$1.callExpression(callee, args); + if (instrValue.typeArguments != null) { + value.typeArguments = libExports$1.typeParameterInstantiation(instrValue.typeArguments); + } + break; + } + const isHook = getHookKind(cx.env, instrValue.callee.identifier) != null; + const callee = codegenPlaceToExpression(cx, instrValue.callee); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = createCallExpression(cx.env, callee, args, instrValue.loc, isHook); + break; + } + case 'OptionalExpression': { + const optionalValue = codegenInstructionValueToExpression(cx, instrValue.value); + switch (optionalValue.type) { + case 'OptionalCallExpression': + case 'CallExpression': { + CompilerError.invariant(libExports$1.isExpression(optionalValue.callee), { + reason: 'v8 intrinsics are validated during lowering', + description: null, + details: [ + { + kind: 'error', + loc: (_a = optionalValue.callee.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + suggestions: null, + }); + value = libExports$1.optionalCallExpression(optionalValue.callee, optionalValue.arguments, instrValue.optional); + break; + } + case 'OptionalMemberExpression': + case 'MemberExpression': { + const property = optionalValue.property; + CompilerError.invariant(libExports$1.isExpression(property), { + reason: 'Private names are validated during lowering', + description: null, + details: [ + { + kind: 'error', + loc: (_b = property.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + value = libExports$1.optionalMemberExpression(optionalValue.object, property, optionalValue.computed, instrValue.optional); + break; + } + default: { + CompilerError.invariant(false, { + reason: 'Expected an optional value to resolve to a call expression or member expression', + description: `Got a \`${optionalValue.type}\``, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + } + } + break; + } + case 'MethodCall': { + const isHook = getHookKind(cx.env, instrValue.property.identifier) != null; + const memberExpr = codegenPlaceToExpression(cx, instrValue.property); + CompilerError.invariant(libExports$1.isMemberExpression(memberExpr) || + libExports$1.isOptionalMemberExpression(memberExpr), { + reason: '[Codegen] Internal error: MethodCall::property must be an unpromoted + unmemoized MemberExpression', + description: null, + details: [ + { + kind: 'error', + loc: (_c = memberExpr.loc) !== null && _c !== void 0 ? _c : null, + message: `Got: '${memberExpr.type}'`, + }, + ], + suggestions: null, + }); + CompilerError.invariant(libExports$1.isNodesEquivalent(memberExpr.object, codegenPlaceToExpression(cx, instrValue.receiver)), { + reason: '[Codegen] Internal error: Forget should always generate MethodCall::property ' + + 'as a MemberExpression of MethodCall::receiver', + description: null, + details: [ + { + kind: 'error', + loc: (_d = memberExpr.loc) !== null && _d !== void 0 ? _d : null, + message: null, + }, + ], + suggestions: null, + }); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = createCallExpression(cx.env, memberExpr, args, instrValue.loc, isHook); + break; + } + case 'NewExpression': { + const callee = codegenPlaceToExpression(cx, instrValue.callee); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = libExports$1.newExpression(callee, args); + break; + } + case 'ObjectExpression': { + const properties = []; + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty') { + const key = codegenObjectPropertyKey(cx, property.key); + switch (property.type) { + case 'property': { + const value = codegenPlaceToExpression(cx, property.place); + properties.push(libExports$1.objectProperty(key, value, property.key.kind === 'computed', key.type === 'Identifier' && + value.type === 'Identifier' && + value.name === key.name)); + break; + } + case 'method': { + const method = cx.objectMethods.get(property.place.identifier.id); + CompilerError.invariant(method, { + reason: 'Expected ObjectMethod instruction', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + const loweredFunc = method.loweredFunc; + const reactiveFunction = buildReactiveFunction(loweredFunc.func); + pruneUnusedLabels(reactiveFunction); + pruneUnusedLValues(reactiveFunction); + const fn = codegenReactiveFunction(new Context$2(cx.env, (_e = reactiveFunction.id) !== null && _e !== void 0 ? _e : '[[ anonymous ]]', cx.uniqueIdentifiers, cx.fbtOperands, cx.temp), reactiveFunction).unwrap(); + const babelNode = libExports$1.objectMethod('method', key, fn.params, fn.body, false); + babelNode.async = fn.async; + babelNode.generator = fn.generator; + properties.push(babelNode); + break; + } + default: + assertExhaustive$1(property.type, `Unexpected property type: ${property.type}`); + } + } + else { + properties.push(libExports$1.spreadElement(codegenPlaceToExpression(cx, property.place))); + } + } + value = libExports$1.objectExpression(properties); + break; + } + case 'JSXText': { + value = createJsxText(instrValue.loc, instrValue.value); + break; + } + case 'JsxExpression': { + const attributes = []; + for (const attribute of instrValue.props) { + attributes.push(codegenJsxAttribute(cx, attribute)); + } + let tagValue = instrValue.tag.kind === 'Identifier' + ? codegenPlaceToExpression(cx, instrValue.tag) + : libExports$1.stringLiteral(instrValue.tag.name); + let tag; + if (tagValue.type === 'Identifier') { + tag = createJsxIdentifier(instrValue.tag.loc, tagValue.name); + } + else if (tagValue.type === 'MemberExpression') { + tag = convertMemberExpressionToJsx(tagValue); + } + else { + CompilerError.invariant(tagValue.type === 'StringLiteral', { + reason: `Expected JSX tag to be an identifier or string, got \`${tagValue.type}\``, + description: null, + details: [ + { + kind: 'error', + loc: (_f = tagValue.loc) !== null && _f !== void 0 ? _f : null, + message: null, + }, + ], + suggestions: null, + }); + if (tagValue.value.indexOf(':') >= 0) { + const [namespace, name] = tagValue.value.split(':', 2); + tag = createJsxNamespacedName(instrValue.tag.loc, createJsxIdentifier(instrValue.tag.loc, namespace), createJsxIdentifier(instrValue.tag.loc, name)); + } + else { + tag = createJsxIdentifier(instrValue.loc, tagValue.value); + } + } + let children; + if (tagValue.type === 'StringLiteral' && + SINGLE_CHILD_FBT_TAGS.has(tagValue.value)) { + CompilerError.invariant(instrValue.children != null, { + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + reason: 'Expected fbt element to have children', + suggestions: null, + description: null, + }); + children = instrValue.children.map(child => codegenJsxFbtChildElement(cx, child)); + } + else { + children = + instrValue.children !== null + ? instrValue.children.map(child => codegenJsxElement(cx, child)) + : []; + } + value = createJsxElement(instrValue.loc, createJsxOpeningElement(instrValue.openingLoc, tag, attributes, instrValue.children === null), instrValue.children !== null + ? createJsxClosingElement(instrValue.closingLoc, tag) + : null, children, instrValue.children === null); + break; + } + case 'JsxFragment': { + value = libExports$1.jsxFragment(libExports$1.jsxOpeningFragment(), libExports$1.jsxClosingFragment(), instrValue.children.map(child => codegenJsxElement(cx, child))); + break; + } + case 'UnsupportedNode': { + const node = instrValue.node; + if (!libExports$1.isExpression(node)) { + return node; + } + value = node; + break; + } + case 'PropertyStore': + case 'PropertyLoad': + case 'PropertyDelete': { + let memberExpr; + if (typeof instrValue.property === 'string') { + memberExpr = libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), libExports$1.identifier(instrValue.property)); + } + else { + memberExpr = libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), libExports$1.numericLiteral(instrValue.property), true); + } + if (instrValue.kind === 'PropertyStore') { + value = libExports$1.assignmentExpression('=', memberExpr, codegenPlaceToExpression(cx, instrValue.value)); + } + else if (instrValue.kind === 'PropertyLoad') { + value = memberExpr; + } + else { + value = libExports$1.unaryExpression('delete', memberExpr); + } + break; + } + case 'ComputedStore': { + value = libExports$1.assignmentExpression('=', libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), codegenPlaceToExpression(cx, instrValue.property), true), codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'ComputedLoad': { + const object = codegenPlaceToExpression(cx, instrValue.object); + const property = codegenPlaceToExpression(cx, instrValue.property); + value = libExports$1.memberExpression(object, property, true); + break; + } + case 'ComputedDelete': { + value = libExports$1.unaryExpression('delete', libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), codegenPlaceToExpression(cx, instrValue.property), true)); + break; + } + case 'LoadLocal': + case 'LoadContext': { + value = codegenPlaceToExpression(cx, instrValue.place); + break; + } + case 'FunctionExpression': { + const loweredFunc = instrValue.loweredFunc.func; + const reactiveFunction = buildReactiveFunction(loweredFunc); + pruneUnusedLabels(reactiveFunction); + pruneUnusedLValues(reactiveFunction); + pruneHoistedContexts(reactiveFunction); + const fn = codegenReactiveFunction(new Context$2(cx.env, (_g = reactiveFunction.id) !== null && _g !== void 0 ? _g : '[[ anonymous ]]', cx.uniqueIdentifiers, cx.fbtOperands, cx.temp), reactiveFunction).unwrap(); + if (instrValue.type === 'ArrowFunctionExpression') { + let body = fn.body; + if (body.body.length === 1 && loweredFunc.directives.length == 0) { + const stmt = body.body[0]; + if (stmt.type === 'ReturnStatement' && stmt.argument != null) { + body = stmt.argument; + } + } + value = libExports$1.arrowFunctionExpression(fn.params, body, fn.async); + } + else { + value = libExports$1.functionExpression(instrValue.name != null ? libExports$1.identifier(instrValue.name) : null, fn.params, fn.body, fn.generator, fn.async); + } + if (cx.env.config.enableNameAnonymousFunctions && + instrValue.name == null && + instrValue.nameHint != null) { + const name = instrValue.nameHint; + value = libExports$1.memberExpression(libExports$1.objectExpression([libExports$1.objectProperty(libExports$1.stringLiteral(name), value)]), libExports$1.stringLiteral(name), true, false); + } + break; + } + case 'TaggedTemplateExpression': { + value = createTaggedTemplateExpression(instrValue.loc, codegenPlaceToExpression(cx, instrValue.tag), libExports$1.templateLiteral([libExports$1.templateElement(instrValue.value)], [])); + break; + } + case 'TypeCastExpression': { + if (libExports$1.isTSType(instrValue.typeAnnotation)) { + if (instrValue.typeAnnotationKind === 'satisfies') { + value = libExports$1.tsSatisfiesExpression(codegenPlaceToExpression(cx, instrValue.value), instrValue.typeAnnotation); + } + else { + value = libExports$1.tsAsExpression(codegenPlaceToExpression(cx, instrValue.value), instrValue.typeAnnotation); + } + } + else { + value = libExports$1.typeCastExpression(codegenPlaceToExpression(cx, instrValue.value), libExports$1.typeAnnotation(instrValue.typeAnnotation)); + } + break; + } + case 'LogicalExpression': { + value = createLogicalExpression(instrValue.loc, instrValue.operator, codegenInstructionValueToExpression(cx, instrValue.left), codegenInstructionValueToExpression(cx, instrValue.right)); + break; + } + case 'ConditionalExpression': { + value = createConditionalExpression(instrValue.loc, codegenInstructionValueToExpression(cx, instrValue.test), codegenInstructionValueToExpression(cx, instrValue.consequent), codegenInstructionValueToExpression(cx, instrValue.alternate)); + break; + } + case 'SequenceExpression': { + const body = codegenBlockNoReset(cx, instrValue.instructions.map(instruction => ({ + kind: 'instruction', + instruction, + }))).body; + const expressions = body.map(stmt => { + var _a, _b; + if (stmt.type === 'ExpressionStatement') { + return stmt.expression; + } + else { + if (libExports$1.isVariableDeclaration(stmt)) { + const declarator = stmt.declarations[0]; + cx.errors.push({ + reason: `(CodegenReactiveFunction::codegenInstructionValue) Cannot declare variables in a value block, tried to declare '${declarator.id.name}'`, + category: ErrorCategory.Todo, + loc: (_a = declarator.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return libExports$1.stringLiteral(`TODO handle ${declarator.id}`); + } + else { + cx.errors.push({ + reason: `(CodegenReactiveFunction::codegenInstructionValue) Handle conversion of ${stmt.type} to expression`, + category: ErrorCategory.Todo, + loc: (_b = stmt.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return libExports$1.stringLiteral(`TODO handle ${stmt.type}`); + } + } + }); + if (expressions.length === 0) { + value = codegenInstructionValueToExpression(cx, instrValue.value); + } + else { + value = createSequenceExpression(instrValue.loc, [ + ...expressions, + codegenInstructionValueToExpression(cx, instrValue.value), + ]); + } + break; + } + case 'TemplateLiteral': { + value = createTemplateLiteral(instrValue.loc, instrValue.quasis.map(q => libExports$1.templateElement(q)), instrValue.subexprs.map(p => codegenPlaceToExpression(cx, p))); + break; + } + case 'LoadGlobal': { + value = libExports$1.identifier(instrValue.binding.name); + break; + } + case 'RegExpLiteral': { + value = libExports$1.regExpLiteral(instrValue.pattern, instrValue.flags); + break; + } + case 'MetaProperty': { + value = libExports$1.metaProperty(libExports$1.identifier(instrValue.meta), libExports$1.identifier(instrValue.property)); + break; + } + case 'Await': { + value = libExports$1.awaitExpression(codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'GetIterator': { + value = codegenPlaceToExpression(cx, instrValue.collection); + break; + } + case 'IteratorNext': { + value = codegenPlaceToExpression(cx, instrValue.iterator); + break; + } + case 'NextPropertyOf': { + value = codegenPlaceToExpression(cx, instrValue.value); + break; + } + case 'PostfixUpdate': { + value = libExports$1.updateExpression(instrValue.operation, codegenPlaceToExpression(cx, instrValue.lvalue), false); + break; + } + case 'PrefixUpdate': { + value = libExports$1.updateExpression(instrValue.operation, codegenPlaceToExpression(cx, instrValue.lvalue), true); + break; + } + case 'StoreLocal': { + CompilerError.invariant(instrValue.lvalue.kind === InstructionKind.Reassign, { + reason: `Unexpected StoreLocal in codegenInstructionValue`, + description: null, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + value = libExports$1.assignmentExpression('=', codegenLValue(cx, instrValue.lvalue.place), codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'StoreGlobal': { + value = libExports$1.assignmentExpression('=', libExports$1.identifier(instrValue.name), codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'StartMemoize': + case 'FinishMemoize': + case 'Debugger': + case 'DeclareLocal': + case 'DeclareContext': + case 'Destructure': + case 'ObjectMethod': + case 'StoreContext': { + CompilerError.invariant(false, { + reason: `Unexpected ${instrValue.kind} in codegenInstructionValue`, + description: null, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(instrValue, `Unexpected instruction value kind \`${instrValue.kind}\``); + } + } + if (instrValue.loc != null && instrValue.loc != GeneratedSource) { + value.loc = instrValue.loc; + } + return value; +} +const STRING_REQUIRES_EXPR_CONTAINER_PATTERN = /[\u{0000}-\u{001F}\u{007F}\u{0080}-\u{FFFF}\u{010000}-\u{10FFFF}]|"|\\/u; +function codegenJsxAttribute(cx, attribute) { + switch (attribute.kind) { + case 'JsxAttribute': { + let propName; + if (attribute.name.indexOf(':') === -1) { + propName = createJsxIdentifier(attribute.place.loc, attribute.name); + } + else { + const [namespace, name] = attribute.name.split(':', 2); + propName = createJsxNamespacedName(attribute.place.loc, createJsxIdentifier(attribute.place.loc, namespace), createJsxIdentifier(attribute.place.loc, name)); + } + const innerValue = codegenPlaceToExpression(cx, attribute.place); + let value; + switch (innerValue.type) { + case 'StringLiteral': { + value = innerValue; + if (STRING_REQUIRES_EXPR_CONTAINER_PATTERN.test(value.value) && + !cx.fbtOperands.has(attribute.place.identifier.id)) { + value = createJsxExpressionContainer(value.loc, value); + } + break; + } + default: { + value = createJsxExpressionContainer(attribute.place.loc, innerValue); + break; + } + } + return createJsxAttribute(attribute.place.loc, propName, value); + } + case 'JsxSpreadAttribute': { + return libExports$1.jsxSpreadAttribute(codegenPlaceToExpression(cx, attribute.argument)); + } + default: { + assertExhaustive$1(attribute, `Unexpected attribute kind \`${attribute.kind}\``); + } + } +} +const JSX_TEXT_CHILD_REQUIRES_EXPR_CONTAINER_PATTERN = /[<>&{}]/; +function codegenJsxElement(cx, place) { + const value = codegenPlace(cx, place); + switch (value.type) { + case 'JSXText': { + if (JSX_TEXT_CHILD_REQUIRES_EXPR_CONTAINER_PATTERN.test(value.value)) { + return createJsxExpressionContainer(place.loc, createStringLiteral(place.loc, value.value)); + } + return createJsxText(place.loc, value.value); + } + case 'JSXElement': + case 'JSXFragment': { + return value; + } + default: { + return createJsxExpressionContainer(place.loc, value); + } + } +} +function codegenJsxFbtChildElement(cx, place) { + const value = codegenPlace(cx, place); + switch (value.type) { + case 'JSXText': + case 'JSXElement': { + return value; + } + default: { + return createJsxExpressionContainer(place.loc, value); + } + } +} +function convertMemberExpressionToJsx(expr) { + var _a, _b; + CompilerError.invariant(expr.property.type === 'Identifier', { + reason: 'Expected JSX member expression property to be a string', + description: null, + details: [ + { + kind: 'error', + loc: (_a = expr.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + suggestions: null, + }); + const property = libExports$1.jsxIdentifier(expr.property.name); + if (expr.object.type === 'Identifier') { + return libExports$1.jsxMemberExpression(libExports$1.jsxIdentifier(expr.object.name), property); + } + else { + CompilerError.invariant(expr.object.type === 'MemberExpression', { + reason: 'Expected JSX member expression to be an identifier or nested member expression', + description: null, + details: [ + { + kind: 'error', + loc: (_b = expr.object.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + const object = convertMemberExpressionToJsx(expr.object); + return libExports$1.jsxMemberExpression(object, property); + } +} +function codegenObjectPropertyKey(cx, key) { + switch (key.kind) { + case 'string': { + return libExports$1.stringLiteral(key.name); + } + case 'identifier': { + return libExports$1.identifier(key.name); + } + case 'computed': { + const expr = codegenPlace(cx, key.name); + CompilerError.invariant(libExports$1.isExpression(expr), { + reason: 'Expected object property key to be an expression', + description: null, + details: [ + { + kind: 'error', + loc: key.name.loc, + message: null, + }, + ], + suggestions: null, + }); + return expr; + } + case 'number': { + return libExports$1.numericLiteral(key.name); + } + } +} +function codegenArrayPattern(cx, pattern) { + const hasHoles = !pattern.items.every(e => e.kind !== 'Hole'); + if (hasHoles) { + const result = libExports$1.arrayPattern([]); + for (const item of pattern.items) { + if (item.kind === 'Hole') { + result.elements.push(null); + } + else { + result.elements.push(codegenLValue(cx, item)); + } + } + return result; + } + else { + return libExports$1.arrayPattern(pattern.items.map(item => { + if (item.kind === 'Hole') { + return null; + } + return codegenLValue(cx, item); + })); + } +} +function codegenLValue(cx, pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + return codegenArrayPattern(cx, pattern); + } + case 'ObjectPattern': { + return libExports$1.objectPattern(pattern.properties.map(property => { + if (property.kind === 'ObjectProperty') { + const key = codegenObjectPropertyKey(cx, property.key); + const value = codegenLValue(cx, property.place); + return libExports$1.objectProperty(key, value, property.key.kind === 'computed', key.type === 'Identifier' && + value.type === 'Identifier' && + value.name === key.name); + } + else { + return libExports$1.restElement(codegenLValue(cx, property.place)); + } + })); + } + case 'Spread': { + return libExports$1.restElement(codegenLValue(cx, pattern.place)); + } + case 'Identifier': { + return convertIdentifier(pattern.identifier); + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function codegenValue(cx, loc, value) { + if (typeof value === 'number') { + if (value < 0) { + return libExports$1.unaryExpression('-', libExports$1.numericLiteral(-value), false); + } + else { + return libExports$1.numericLiteral(value); + } + } + else if (typeof value === 'boolean') { + return libExports$1.booleanLiteral(value); + } + else if (typeof value === 'string') { + return createStringLiteral(loc, value); + } + else if (value === null) { + return libExports$1.nullLiteral(); + } + else if (value === undefined) { + return libExports$1.identifier('undefined'); + } + else { + assertExhaustive$1(value, 'Unexpected primitive value kind'); + } +} +function codegenArgument(cx, arg) { + if (arg.kind === 'Identifier') { + return codegenPlaceToExpression(cx, arg); + } + else { + return libExports$1.spreadElement(codegenPlaceToExpression(cx, arg.place)); + } +} +function codegenPlaceToExpression(cx, place) { + const value = codegenPlace(cx, place); + return convertValueToExpression(value); +} +function codegenPlace(cx, place) { + let tmp = cx.temp.get(place.identifier.declarationId); + if (tmp != null) { + return tmp; + } + CompilerError.invariant(place.identifier.name !== null || tmp !== undefined, { + reason: `[Codegen] No value found for temporary`, + description: `Value for '${printPlace(place)}' was not set in the codegen context`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + const identifier = convertIdentifier(place.identifier); + identifier.loc = place.loc; + return identifier; +} +function convertIdentifier(identifier) { + CompilerError.invariant(identifier.name !== null && identifier.name.kind === 'named', { + reason: `Expected temporaries to be promoted to named identifiers in an earlier pass`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + description: `identifier ${identifier.id} is unnamed`, + suggestions: null, + }); + return libExports$1.identifier(identifier.name.value); +} +function compareScopeDependency(a, b) { + var _a, _b; + CompilerError.invariant(((_a = a.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named' && ((_b = b.identifier.name) === null || _b === void 0 ? void 0 : _b.kind) === 'named', { + reason: '[Codegen] Expected named identifier for dependency', + description: null, + details: [ + { + kind: 'error', + loc: a.identifier.loc, + message: null, + }, + ], + }); + const aName = [ + a.identifier.name.value, + ...a.path.map(entry => `${entry.optional ? '?' : ''}${entry.property}`), + ].join('.'); + const bName = [ + b.identifier.name.value, + ...b.path.map(entry => `${entry.optional ? '?' : ''}${entry.property}`), + ].join('.'); + if (aName < bName) + return -1; + else if (aName > bName) + return 1; + else + return 0; +} +function compareScopeDeclaration(a, b) { + var _a, _b; + CompilerError.invariant(((_a = a.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named' && ((_b = b.identifier.name) === null || _b === void 0 ? void 0 : _b.kind) === 'named', { + reason: '[Codegen] Expected named identifier for declaration', + description: null, + details: [ + { + kind: 'error', + loc: a.identifier.loc, + message: null, + }, + ], + }); + const aName = a.identifier.name.value; + const bName = b.identifier.name.value; + if (aName < bName) + return -1; + else if (aName > bName) + return 1; + else + return 0; +} + +function extractScopeDeclarationsFromDestructuring(fn) { + const state = new State$1(fn.env); + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + state.declared.add(place.identifier.declarationId); + } + visitReactiveFunction(fn, new Visitor$9(), state); +} +let State$1 = class State { + constructor(env) { + this.declared = new Set(); + this.env = env; + } +}; +let Visitor$9 = class Visitor extends ReactiveFunctionTransform { + visitScope(scope, state) { + for (const [, declaration] of scope.scope.declarations) { + state.declared.add(declaration.identifier.declarationId); + } + this.traverseScope(scope, state); + } + transformInstruction(instruction, state) { + this.visitInstruction(instruction, state); + if (instruction.value.kind === 'Destructure') { + const transformed = transformDestructuring(state, instruction, instruction.value); + if (transformed) { + return { + kind: 'replace-many', + value: transformed.map(instruction => ({ + kind: 'instruction', + instruction, + })), + }; + } + } + return { kind: 'keep' }; + } +}; +function transformDestructuring(state, instr, destructure) { + let reassigned = new Set(); + let hasDeclaration = false; + for (const place of eachPatternOperand(destructure.lvalue.pattern)) { + const isDeclared = state.declared.has(place.identifier.declarationId); + if (isDeclared) { + reassigned.add(place.identifier.id); + } + hasDeclaration || (hasDeclaration = !isDeclared); + } + if (reassigned.size === 0 || !hasDeclaration) { + return null; + } + const instructions = []; + const renamed = new Map(); + mapPatternOperands(destructure.lvalue.pattern, place => { + if (!reassigned.has(place.identifier.id)) { + return place; + } + const temporary = clonePlaceToTemporary(state.env, place); + promoteTemporary(temporary.identifier); + renamed.set(place, temporary); + return temporary; + }); + instructions.push(instr); + for (const [original, temporary] of renamed) { + instructions.push({ + id: instr.id, + lvalue: null, + value: { + kind: 'StoreLocal', + lvalue: { + kind: InstructionKind.Reassign, + place: original, + }, + value: temporary, + type: null, + loc: destructure.loc, + }, + loc: instr.loc, + }); + } + return instructions; +} + +function mergeReactiveScopesThatInvalidateTogether(fn) { + const lastUsageVisitor = new FindLastUsageVisitor(); + visitReactiveFunction(fn, lastUsageVisitor, undefined); + visitReactiveFunction(fn, new Transform$4(lastUsageVisitor.lastUsage), null); +} +function log(msg) { +} +class FindLastUsageVisitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.lastUsage = new Map(); + } + visitPlace(id, place, _state) { + const previousUsage = this.lastUsage.get(place.identifier.declarationId); + const lastUsage = previousUsage !== undefined + ? makeInstructionId(Math.max(previousUsage, id)) + : id; + this.lastUsage.set(place.identifier.declarationId, lastUsage); + } +} +let Transform$4 = class Transform extends ReactiveFunctionTransform { + constructor(lastUsage) { + super(); + this.temporaries = new Map(); + this.lastUsage = lastUsage; + } + transformScope(scopeBlock, state) { + this.visitScope(scopeBlock, scopeBlock.scope.dependencies); + if (state !== null && + areEqualDependencies(state, scopeBlock.scope.dependencies)) { + return { kind: 'replace-many', value: scopeBlock.instructions }; + } + else { + return { kind: 'keep' }; + } + } + visitBlock(block, state) { + var _a; + this.traverseBlock(block, state); + let current = null; + const merged = []; + function reset() { + CompilerError.invariant(current !== null, { + reason: 'MergeConsecutiveScopes: expected current scope to be non-null if reset()', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (current.to > current.from + 1) { + merged.push(current); + } + current = null; + } + for (let i = 0; i < block.length; i++) { + const instr = block[i]; + switch (instr.kind) { + case 'terminal': { + if (current !== null) { + reset(); + } + break; + } + case 'pruned-scope': { + if (current !== null) { + reset(); + } + break; + } + case 'instruction': { + switch (instr.instruction.value.kind) { + case 'BinaryExpression': + case 'ComputedLoad': + case 'JSXText': + case 'LoadGlobal': + case 'LoadLocal': + case 'Primitive': + case 'PropertyLoad': + case 'TemplateLiteral': + case 'UnaryExpression': { + if (current !== null && instr.instruction.lvalue !== null) { + current.lvalues.add(instr.instruction.lvalue.identifier.declarationId); + if (instr.instruction.value.kind === 'LoadLocal') { + this.temporaries.set(instr.instruction.lvalue.identifier.declarationId, instr.instruction.value.place.identifier.declarationId); + } + } + break; + } + case 'StoreLocal': { + if (current !== null) { + if (instr.instruction.value.lvalue.kind === InstructionKind.Const) { + for (const lvalue of eachInstructionLValue(instr.instruction)) { + current.lvalues.add(lvalue.identifier.declarationId); + } + this.temporaries.set(instr.instruction.value.lvalue.place.identifier + .declarationId, (_a = this.temporaries.get(instr.instruction.value.value.identifier.declarationId)) !== null && _a !== void 0 ? _a : instr.instruction.value.value.identifier.declarationId); + } + else { + reset(); + } + } + break; + } + default: { + if (current !== null) { + reset(); + } + } + } + break; + } + case 'scope': { + if (current !== null && + canMergeScopes(current.block, instr, this.temporaries) && + areLValuesLastUsedByScope(instr.scope, current.lvalues, this.lastUsage)) { + current.block.scope.range.end = makeInstructionId(Math.max(current.block.scope.range.end, instr.scope.range.end)); + for (const [key, value] of instr.scope.declarations) { + current.block.scope.declarations.set(key, value); + } + updateScopeDeclarations(current.block.scope, this.lastUsage); + current.to = i + 1; + current.lvalues.clear(); + if (!scopeIsEligibleForMerging(instr)) { + reset(); + } + } + else { + if (current !== null) { + reset(); + } + if (scopeIsEligibleForMerging(instr)) { + current = { + block: instr, + from: i, + to: i + 1, + lvalues: new Set(), + }; + } + } + break; + } + default: { + assertExhaustive$1(instr, `Unexpected instruction kind \`${instr.kind}\``); + } + } + } + if (current !== null) { + reset(); + } + if (merged.length) { + for (const entry of merged) { + log(printReactiveScopeSummary(entry.block.scope) + + ` from=${entry.from} to=${entry.to}`); + } + } + if (merged.length === 0) { + return; + } + const nextInstructions = []; + let index = 0; + for (const entry of merged) { + if (index < entry.from) { + nextInstructions.push(...block.slice(index, entry.from)); + index = entry.from; + } + const mergedScope = block[entry.from]; + CompilerError.invariant(mergedScope.kind === 'scope', { + reason: 'MergeConsecutiveScopes: Expected scope starting index to be a scope', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + nextInstructions.push(mergedScope); + index++; + while (index < entry.to) { + const instr = block[index++]; + if (instr.kind === 'scope') { + mergedScope.instructions.push(...instr.instructions); + mergedScope.scope.merged.add(instr.scope.id); + } + else { + mergedScope.instructions.push(instr); + } + } + } + while (index < block.length) { + nextInstructions.push(block[index++]); + } + block.length = 0; + block.push(...nextInstructions); + } +}; +function updateScopeDeclarations(scope, lastUsage) { + for (const [id, decl] of scope.declarations) { + const lastUsedAt = lastUsage.get(decl.identifier.declarationId); + if (lastUsedAt < scope.range.end) { + scope.declarations.delete(id); + } + } +} +function areLValuesLastUsedByScope(scope, lvalues, lastUsage) { + for (const lvalue of lvalues) { + const lastUsedAt = lastUsage.get(lvalue); + if (lastUsedAt >= scope.range.end) { + return false; + } + } + return true; +} +function canMergeScopes(current, next, temporaries) { + if (current.scope.reassignments.size !== 0 || + next.scope.reassignments.size !== 0) { + return false; + } + if (areEqualDependencies(current.scope.dependencies, next.scope.dependencies)) { + return true; + } + if (areEqualDependencies(new Set([...current.scope.declarations.values()].map(declaration => ({ + identifier: declaration.identifier, + reactive: true, + path: [], + }))), next.scope.dependencies) || + (next.scope.dependencies.size !== 0 && + [...next.scope.dependencies].every(dep => dep.path.length === 0 && + isAlwaysInvalidatingType(dep.identifier.type) && + Iterable_some(current.scope.declarations.values(), decl => decl.identifier.declarationId === dep.identifier.declarationId || + decl.identifier.declarationId === + temporaries.get(dep.identifier.declarationId))))) { + return true; + } + log(` ${printReactiveScopeSummary(current.scope)} ${[...current.scope.declarations.values()].map(decl => decl.identifier.declarationId)}`); + log(` ${printReactiveScopeSummary(next.scope)} ${[...next.scope.dependencies].map(dep => { var _a; return `${dep.identifier.declarationId} ${(_a = temporaries.get(dep.identifier.declarationId)) !== null && _a !== void 0 ? _a : dep.identifier.declarationId}`; })}`); + return false; +} +function isAlwaysInvalidatingType(type) { + switch (type.kind) { + case 'Object': { + switch (type.shapeId) { + case BuiltInArrayId: + case BuiltInObjectId: + case BuiltInFunctionId: + case BuiltInJsxId: { + return true; + } + } + break; + } + case 'Function': { + return true; + } + } + return false; +} +function areEqualDependencies(a, b) { + if (a.size !== b.size) { + return false; + } + for (const aValue of a) { + let found = false; + for (const bValue of b) { + if (aValue.identifier.declarationId === bValue.identifier.declarationId && + areEqualPaths(aValue.path, bValue.path)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + return true; +} +function scopeIsEligibleForMerging(scopeBlock) { + if (scopeBlock.scope.dependencies.size === 0) { + return true; + } + return [...scopeBlock.scope.declarations].some(([, decl]) => isAlwaysInvalidatingType(decl.identifier.type)); +} + +var _PromoteInterposedTemporaries_promotable, _PromoteInterposedTemporaries_consts, _PromoteInterposedTemporaries_globals; +class PromoteTemporaries extends ReactiveFunctionVisitor { + visitScope(scopeBlock, state) { + for (const dep of scopeBlock.scope.dependencies) { + const { identifier } = dep; + if (identifier.name == null) { + promoteIdentifier(identifier, state); + } + } + for (const [, declaration] of scopeBlock.scope.declarations) { + if (declaration.identifier.name == null) { + promoteIdentifier(declaration.identifier, state); + } + } + this.traverseScope(scopeBlock, state); + } + visitPrunedScope(scopeBlock, state) { + var _a; + for (const [, declaration] of scopeBlock.scope.declarations) { + if (declaration.identifier.name == null && + ((_a = state.pruned.get(declaration.identifier.declarationId)) === null || _a === void 0 ? void 0 : _a.usedOutsideScope) === true) { + promoteIdentifier(declaration.identifier, state); + } + } + this.traversePrunedScope(scopeBlock, state); + } + visitParam(place, state) { + if (place.identifier.name === null) { + promoteIdentifier(place.identifier, state); + } + } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') { + this.visitHirFunction(value.loweredFunc.func, state); + } + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + for (const operand of fn.params) { + const place = operand.kind === 'Identifier' ? operand : operand.place; + if (place.identifier.name === null) { + promoteIdentifier(place.identifier, state); + } + } + visitReactiveFunction(fn, this, state); + } +} +class PromoteAllInstancedOfPromotedTemporaries extends ReactiveFunctionVisitor { + visitPlace(_id, place, state) { + if (place.identifier.name === null && + state.promoted.has(place.identifier.declarationId)) { + promoteIdentifier(place.identifier, state); + } + } + visitLValue(_id, _lvalue, _state) { + this.visitPlace(_id, _lvalue, _state); + } + traverseScopeIdentifiers(scope, state) { + for (const [, decl] of scope.declarations) { + if (decl.identifier.name === null && + state.promoted.has(decl.identifier.declarationId)) { + promoteIdentifier(decl.identifier, state); + } + } + for (const dep of scope.dependencies) { + if (dep.identifier.name === null && + state.promoted.has(dep.identifier.declarationId)) { + promoteIdentifier(dep.identifier, state); + } + } + for (const reassignment of scope.reassignments) { + if (reassignment.name === null && + state.promoted.has(reassignment.declarationId)) { + promoteIdentifier(reassignment, state); + } + } + } + visitScope(scope, state) { + this.traverseScope(scope, state); + this.traverseScopeIdentifiers(scope.scope, state); + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + this.traverseScopeIdentifiers(scopeBlock.scope, state); + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + visitReactiveFunction(fn, this, state); + } +} +class CollectPromotableTemporaries extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.activeScopes = []; + } + visitPlace(_id, place, state) { + if (this.activeScopes.length !== 0 && + state.pruned.has(place.identifier.declarationId)) { + const prunedPlace = state.pruned.get(place.identifier.declarationId); + if (prunedPlace.activeScopes.indexOf(this.activeScopes.at(-1)) === -1) { + prunedPlace.usedOutsideScope = true; + } + } + } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'JsxExpression' && value.tag.kind === 'Identifier') { + state.tags.add(value.tag.identifier.declarationId); + } + } + visitPrunedScope(scopeBlock, state) { + for (const [_id, decl] of scopeBlock.scope.declarations) { + state.pruned.set(decl.identifier.declarationId, { + activeScopes: [...this.activeScopes], + usedOutsideScope: false, + }); + } + this.visitBlock(scopeBlock.instructions, state); + } + visitScope(scopeBlock, state) { + this.activeScopes.push(scopeBlock.scope.id); + this.traverseScope(scopeBlock, state); + this.activeScopes.pop(); + } +} +class PromoteInterposedTemporaries extends ReactiveFunctionVisitor { + constructor(promotable, params) { + super(); + _PromoteInterposedTemporaries_promotable.set(this, void 0); + _PromoteInterposedTemporaries_consts.set(this, new Set()); + _PromoteInterposedTemporaries_globals.set(this, new Set()); + params.forEach(param => { + switch (param.kind) { + case 'Identifier': + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(param.identifier.id); + break; + case 'Spread': + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(param.place.identifier.id); + break; + } + }); + __classPrivateFieldSet(this, _PromoteInterposedTemporaries_promotable, promotable, "f"); + } + visitPlace(_id, place, state) { + const promo = state.get(place.identifier.id); + if (promo) { + const [identifier, needsPromotion] = promo; + if (needsPromotion && + identifier.name === null && + !__classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").has(identifier.id)) { + promoteIdentifier(identifier, __classPrivateFieldGet(this, _PromoteInterposedTemporaries_promotable, "f")); + } + } + } + visitInstruction(instruction, state) { + for (const lval of eachInstructionValueLValue(instruction.value)) { + CompilerError.invariant(lval.identifier.name != null, { + reason: 'PromoteInterposedTemporaries: Assignment targets not expected to be temporaries', + description: null, + details: [ + { + kind: 'error', + loc: instruction.loc, + message: null, + }, + ], + }); + } + switch (instruction.value.kind) { + case 'CallExpression': + case 'MethodCall': + case 'Await': + case 'PropertyStore': + case 'PropertyDelete': + case 'ComputedStore': + case 'ComputedDelete': + case 'PostfixUpdate': + case 'PrefixUpdate': + case 'StoreLocal': + case 'StoreContext': + case 'StoreGlobal': + case 'Destructure': { + let constStore = false; + if ((instruction.value.kind === 'StoreContext' || + instruction.value.kind === 'StoreLocal') && + (instruction.value.lvalue.kind === 'Const' || + instruction.value.lvalue.kind === 'HoistedConst')) { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.value.lvalue.place.identifier.id); + constStore = true; + } + if (instruction.value.kind === 'Destructure' && + (instruction.value.lvalue.kind === 'Const' || + instruction.value.lvalue.kind === 'HoistedConst')) { + [...eachPatternOperand(instruction.value.lvalue.pattern)].forEach(ident => __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(ident.identifier.id)); + constStore = true; + } + if (instruction.value.kind === 'MethodCall') { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.value.property.identifier.id); + } + super.visitInstruction(instruction, state); + if (!constStore && + (instruction.lvalue == null || + instruction.lvalue.identifier.name != null)) { + for (const [key, [ident, _]] of state.entries()) { + state.set(key, [ident, true]); + } + } + if (instruction.lvalue && instruction.lvalue.identifier.name === null) { + state.set(instruction.lvalue.identifier.id, [ + instruction.lvalue.identifier, + false, + ]); + } + break; + } + case 'DeclareContext': + case 'DeclareLocal': { + if (instruction.value.lvalue.kind === 'Const' || + instruction.value.lvalue.kind === 'HoistedConst') { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.value.lvalue.place.identifier.id); + } + super.visitInstruction(instruction, state); + break; + } + case 'LoadContext': + case 'LoadLocal': { + if (instruction.lvalue && instruction.lvalue.identifier.name === null) { + if (__classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").has(instruction.value.place.identifier.id)) { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.lvalue.identifier.id); + } + state.set(instruction.lvalue.identifier.id, [ + instruction.lvalue.identifier, + false, + ]); + } + super.visitInstruction(instruction, state); + break; + } + case 'PropertyLoad': + case 'ComputedLoad': { + if (instruction.lvalue) { + if (__classPrivateFieldGet(this, _PromoteInterposedTemporaries_globals, "f").has(instruction.value.object.identifier.id)) { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_globals, "f").add(instruction.lvalue.identifier.id); + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.lvalue.identifier.id); + } + if (instruction.lvalue.identifier.name === null) { + state.set(instruction.lvalue.identifier.id, [ + instruction.lvalue.identifier, + false, + ]); + } + } + super.visitInstruction(instruction, state); + break; + } + case 'LoadGlobal': { + instruction.lvalue && + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_globals, "f").add(instruction.lvalue.identifier.id); + super.visitInstruction(instruction, state); + break; + } + default: { + super.visitInstruction(instruction, state); + } + } + } +} +_PromoteInterposedTemporaries_promotable = new WeakMap(), _PromoteInterposedTemporaries_consts = new WeakMap(), _PromoteInterposedTemporaries_globals = new WeakMap(); +function promoteUsedTemporaries(fn) { + const state = { + tags: new Set(), + promoted: new Set(), + pruned: new Map(), + }; + visitReactiveFunction(fn, new CollectPromotableTemporaries(), state); + for (const operand of fn.params) { + const place = operand.kind === 'Identifier' ? operand : operand.place; + if (place.identifier.name === null) { + promoteIdentifier(place.identifier, state); + } + } + visitReactiveFunction(fn, new PromoteTemporaries(), state); + visitReactiveFunction(fn, new PromoteInterposedTemporaries(state, fn.params), new Map()); + visitReactiveFunction(fn, new PromoteAllInstancedOfPromotedTemporaries(), state); +} +function promoteIdentifier(identifier, state) { + CompilerError.invariant(identifier.name === null, { + reason: 'promoteTemporary: Expected to be called only for temporary variables', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + if (state.tags.has(identifier.declarationId)) { + promoteTemporaryJsxTag(identifier); + } + else { + promoteTemporary(identifier); + } + state.promoted.add(identifier.declarationId); +} + +function propagateEarlyReturns(fn) { + visitReactiveFunction(fn, new Transform$3(fn.env), { + withinReactiveScope: false, + earlyReturnValue: null, + }); +} +let Transform$3 = class Transform extends ReactiveFunctionTransform { + constructor(env) { + super(); + this.env = env; + } + visitScope(scopeBlock, parentState) { + if (scopeBlock.scope.earlyReturnValue !== null) { + return; + } + const innerState = { + withinReactiveScope: true, + earlyReturnValue: parentState.earlyReturnValue, + }; + this.traverseScope(scopeBlock, innerState); + const earlyReturnValue = innerState.earlyReturnValue; + if (earlyReturnValue !== null) { + if (!parentState.withinReactiveScope) { + scopeBlock.scope.earlyReturnValue = earlyReturnValue; + scopeBlock.scope.declarations.set(earlyReturnValue.value.id, { + identifier: earlyReturnValue.value, + scope: scopeBlock.scope, + }); + const instructions = scopeBlock.instructions; + const loc = earlyReturnValue.loc; + const sentinelTemp = createTemporaryPlace(this.env, loc); + const symbolTemp = createTemporaryPlace(this.env, loc); + const forTemp = createTemporaryPlace(this.env, loc); + const argTemp = createTemporaryPlace(this.env, loc); + scopeBlock.instructions = [ + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, symbolTemp), + value: { + kind: 'LoadGlobal', + binding: { + kind: 'Global', + name: 'Symbol', + }, + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, forTemp), + value: { + kind: 'PropertyLoad', + object: Object.assign({}, symbolTemp), + property: makePropertyLiteral('for'), + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, argTemp), + value: { + kind: 'Primitive', + value: EARLY_RETURN_SENTINEL, + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, sentinelTemp), + value: { + kind: 'MethodCall', + receiver: symbolTemp, + property: forTemp, + args: [argTemp], + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: null, + value: { + kind: 'StoreLocal', + loc, + type: null, + lvalue: { + kind: InstructionKind.Let, + place: { + kind: 'Identifier', + effect: Effect.ConditionallyMutate, + loc, + reactive: true, + identifier: earlyReturnValue.value, + }, + }, + value: Object.assign({}, sentinelTemp), + }, + }, + }, + { + kind: 'terminal', + label: { + id: earlyReturnValue.label, + implicit: false, + }, + terminal: { + kind: 'label', + id: makeInstructionId(0), + loc: GeneratedSource, + block: instructions, + }, + }, + ]; + } + else { + parentState.earlyReturnValue = earlyReturnValue; + } + } + } + transformTerminal(stmt, state) { + if (state.withinReactiveScope && stmt.terminal.kind === 'return') { + const loc = stmt.terminal.value.loc; + let earlyReturnValue; + if (state.earlyReturnValue !== null) { + earlyReturnValue = state.earlyReturnValue; + } + else { + const identifier = createTemporaryPlace(this.env, loc).identifier; + promoteTemporary(identifier); + earlyReturnValue = { + label: this.env.nextBlockId, + loc, + value: identifier, + }; + } + state.earlyReturnValue = earlyReturnValue; + return { + kind: 'replace-many', + value: [ + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: null, + value: { + kind: 'StoreLocal', + loc, + type: null, + lvalue: { + kind: InstructionKind.Reassign, + place: { + kind: 'Identifier', + identifier: earlyReturnValue.value, + effect: Effect.Capture, + loc, + reactive: true, + }, + }, + value: stmt.terminal.value, + }, + }, + }, + { + kind: 'terminal', + label: null, + terminal: { + kind: 'break', + id: makeInstructionId(0), + loc, + targetKind: 'labeled', + target: earlyReturnValue.label, + }, + }, + ], + }; + } + this.traverseTerminal(stmt, state); + return { kind: 'keep' }; + } +}; + +var _Node_value, _Node_next; +function empty() { + return EMPTY; +} +class Node { + constructor(value, next = EMPTY) { + _Node_value.set(this, void 0); + _Node_next.set(this, void 0); + __classPrivateFieldSet(this, _Node_value, value, "f"); + __classPrivateFieldSet(this, _Node_next, next, "f"); + } + push(value) { + return new Node(value, this); + } + pop() { + return __classPrivateFieldGet(this, _Node_next, "f"); + } + find(fn) { + return fn(__classPrivateFieldGet(this, _Node_value, "f")) ? true : __classPrivateFieldGet(this, _Node_next, "f").find(fn); + } + contains(value) { + return (value === __classPrivateFieldGet(this, _Node_value, "f") || + (__classPrivateFieldGet(this, _Node_next, "f") !== null && __classPrivateFieldGet(this, _Node_next, "f").contains(value))); + } + each(fn) { + fn(__classPrivateFieldGet(this, _Node_value, "f")); + __classPrivateFieldGet(this, _Node_next, "f").each(fn); + } + get value() { + return __classPrivateFieldGet(this, _Node_value, "f"); + } + print(fn) { + return fn(__classPrivateFieldGet(this, _Node_value, "f")) + __classPrivateFieldGet(this, _Node_next, "f").print(fn); + } +} +_Node_value = new WeakMap(), _Node_next = new WeakMap(); +class Empty { + push(value) { + return new Node(value, this); + } + pop() { + return this; + } + find(_fn) { + return false; + } + contains(_value) { + return false; + } + each(_fn) { + return; + } + get value() { + return null; + } + print(_) { + return ''; + } +} +const EMPTY = new Empty(); + +function pruneHoistedContexts(fn) { + visitReactiveFunction(fn, new Visitor$8(), { + activeScopes: empty(), + uninitialized: new Map(), + }); +} +let Visitor$8 = class Visitor extends ReactiveFunctionTransform { + visitScope(scope, state) { + state.activeScopes = state.activeScopes.push(new Set(scope.scope.declarations.keys())); + for (const decl of scope.scope.declarations.values()) { + state.uninitialized.set(decl.identifier.id, { kind: 'unknown-kind' }); + } + this.traverseScope(scope, state); + state.activeScopes.pop(); + for (const decl of scope.scope.declarations.values()) { + state.uninitialized.delete(decl.identifier.id); + } + } + visitPlace(_id, place, state) { + const maybeHoistedFn = state.uninitialized.get(place.identifier.id); + if ((maybeHoistedFn === null || maybeHoistedFn === void 0 ? void 0 : maybeHoistedFn.kind) === 'func' && + maybeHoistedFn.definition !== place) { + CompilerError.throwTodo({ + reason: '[PruneHoistedContexts] Rewrite hoisted function references', + loc: place.loc, + }); + } + } + transformInstruction(instruction, state) { + if (instruction.value.kind === 'DeclareContext') { + const maybeNonHoisted = convertHoistedLValueKind(instruction.value.lvalue.kind); + if (maybeNonHoisted != null) { + if (maybeNonHoisted === InstructionKind.Function && + state.uninitialized.has(instruction.value.lvalue.place.identifier.id)) { + state.uninitialized.set(instruction.value.lvalue.place.identifier.id, { + kind: 'func', + definition: null, + }); + } + return { kind: 'remove' }; + } + } + if (instruction.value.kind === 'StoreContext' && + instruction.value.lvalue.kind !== InstructionKind.Reassign) { + const lvalueId = instruction.value.lvalue.place.identifier.id; + const isDeclaredByScope = state.activeScopes.find(scope => scope.has(lvalueId)); + if (isDeclaredByScope) { + if (instruction.value.lvalue.kind === InstructionKind.Let || + instruction.value.lvalue.kind === InstructionKind.Const) { + instruction.value.lvalue.kind = InstructionKind.Reassign; + } + else if (instruction.value.lvalue.kind === InstructionKind.Function) { + const maybeHoistedFn = state.uninitialized.get(lvalueId); + if (maybeHoistedFn != null) { + CompilerError.invariant(maybeHoistedFn.kind === 'func', { + reason: '[PruneHoistedContexts] Unexpected hoisted function', + description: null, + details: [ + { + kind: 'error', + loc: instruction.loc, + message: null, + }, + ], + }); + maybeHoistedFn.definition = instruction.value.lvalue.place; + state.uninitialized.delete(lvalueId); + } + } + else { + CompilerError.throwTodo({ + reason: '[PruneHoistedContexts] Unexpected kind', + description: `(${instruction.value.lvalue.kind})`, + loc: instruction.loc, + }); + } + } + } + this.visitInstruction(instruction, state); + return { kind: 'keep' }; + } +}; + +function hashEffect(effect) { + var _a; + switch (effect.kind) { + case 'Apply': { + return [ + effect.kind, + effect.receiver.identifier.id, + effect.function.identifier.id, + effect.mutatesFunction, + effect.args + .map(a => { + if (a.kind === 'Hole') { + return ''; + } + else if (a.kind === 'Identifier') { + return a.identifier.id; + } + else { + return `...${a.place.identifier.id}`; + } + }) + .join(','), + effect.into.identifier.id, + ].join(':'); + } + case 'CreateFrom': + case 'ImmutableCapture': + case 'Assign': + case 'Alias': + case 'Capture': + case 'MaybeAlias': { + return [ + effect.kind, + effect.from.identifier.id, + effect.into.identifier.id, + ].join(':'); + } + case 'Create': { + return [ + effect.kind, + effect.into.identifier.id, + effect.value, + effect.reason, + ].join(':'); + } + case 'Freeze': { + return [effect.kind, effect.value.identifier.id, effect.reason].join(':'); + } + case 'Impure': + case 'Render': { + return [effect.kind, effect.place.identifier.id].join(':'); + } + case 'MutateFrozen': + case 'MutateGlobal': { + return [ + effect.kind, + effect.place.identifier.id, + effect.error.severity, + effect.error.reason, + effect.error.description, + printSourceLocation((_a = effect.error.primaryLocation()) !== null && _a !== void 0 ? _a : GeneratedSource), + ].join(':'); + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + return [effect.kind, effect.value.identifier.id].join(':'); + } + case 'CreateFunction': { + return [ + effect.kind, + effect.into.identifier.id, + effect.function.loweredFunc.func.returns.identifier.id, + effect.captures.map(p => p.identifier.id).join(','), + ].join(':'); + } + } +} + +var _InferenceState_isFunctionExpression, _InferenceState_values, _InferenceState_variables; +function inferMutationAliasingEffects(fn, { isFunctionExpression } = { + isFunctionExpression: false, +}) { + const initialState = InferenceState.empty(fn.env, isFunctionExpression); + const statesByBlock = new Map(); + for (const ref of fn.context) { + const value = { + kind: 'ObjectExpression', + properties: [], + loc: ref.loc, + }; + initialState.initialize(value, { + kind: ValueKind.Context, + reason: new Set([ValueReason.Other]), + }); + initialState.define(ref, value); + } + const paramKind = isFunctionExpression + ? { + kind: ValueKind.Mutable, + reason: new Set([ValueReason.Other]), + } + : { + kind: ValueKind.Frozen, + reason: new Set([ValueReason.ReactiveFunctionArgument]), + }; + if (fn.fnType === 'Component') { + CompilerError.invariant(fn.params.length <= 2, { + reason: 'Expected React component to have not more than two parameters: one for props and for ref', + description: null, + details: [ + { + kind: 'error', + loc: fn.loc, + message: null, + }, + ], + suggestions: null, + }); + const [props, ref] = fn.params; + if (props != null) { + inferParam(props, initialState, paramKind); + } + if (ref != null) { + const place = ref.kind === 'Identifier' ? ref : ref.place; + const value = { + kind: 'ObjectExpression', + properties: [], + loc: place.loc, + }; + initialState.initialize(value, { + kind: ValueKind.Mutable, + reason: new Set([ValueReason.Other]), + }); + initialState.define(place, value); + } + } + else { + for (const param of fn.params) { + inferParam(param, initialState, paramKind); + } + } + const queuedStates = new Map(); + function queue(blockId, state) { + var _a; + let queuedState = queuedStates.get(blockId); + if (queuedState != null) { + state = (_a = queuedState.merge(state)) !== null && _a !== void 0 ? _a : queuedState; + queuedStates.set(blockId, state); + } + else { + const prevState = statesByBlock.get(blockId); + const nextState = prevState != null ? prevState.merge(state) : state; + if (nextState != null) { + queuedStates.set(blockId, nextState); + } + } + } + queue(fn.body.entry, initialState); + const hoistedContextDeclarations = findHoistedContextDeclarations(fn); + const context = new Context$1(isFunctionExpression, fn, hoistedContextDeclarations); + let iterationCount = 0; + while (queuedStates.size !== 0) { + iterationCount++; + if (iterationCount > 100) { + CompilerError.invariant(false, { + reason: `[InferMutationAliasingEffects] Potential infinite loop`, + description: `A value, temporary place, or effect was not cached properly`, + details: [ + { + kind: 'error', + loc: fn.loc, + message: null, + }, + ], + }); + } + for (const [blockId, block] of fn.body.blocks) { + const incomingState = queuedStates.get(blockId); + queuedStates.delete(blockId); + if (incomingState == null) { + continue; + } + statesByBlock.set(blockId, incomingState); + const state = incomingState.clone(); + inferBlock(context, state, block); + for (const nextBlockId of eachTerminalSuccessor(block.terminal)) { + queue(nextBlockId, state); + } + } + } + return Ok(undefined); +} +function findHoistedContextDeclarations(fn) { + const hoisted = new Map(); + function visit(place) { + if (hoisted.has(place.identifier.declarationId) && + hoisted.get(place.identifier.declarationId) == null) { + hoisted.set(place.identifier.declarationId, place); + } + } + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + if (instr.value.kind === 'DeclareContext') { + const kind = instr.value.lvalue.kind; + if (kind == InstructionKind.HoistedConst || + kind == InstructionKind.HoistedFunction || + kind == InstructionKind.HoistedLet) { + hoisted.set(instr.value.lvalue.place.identifier.declarationId, null); + } + } + else { + for (const operand of eachInstructionValueOperand(instr.value)) { + visit(operand); + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visit(operand); + } + } + return hoisted; +} +let Context$1 = class Context { + constructor(isFunctionExpression, fn, hoistedContextDeclarations) { + this.internedEffects = new Map(); + this.instructionSignatureCache = new Map(); + this.effectInstructionValueCache = new Map(); + this.applySignatureCache = new Map(); + this.catchHandlers = new Map(); + this.functionSignatureCache = new Map(); + this.isFuctionExpression = isFunctionExpression; + this.fn = fn; + this.hoistedContextDeclarations = hoistedContextDeclarations; + } + cacheApplySignature(signature, effect, f) { + const inner = getOrInsertDefault(this.applySignatureCache, signature, new Map()); + return getOrInsertWith(inner, effect, f); + } + internEffect(effect) { + const hash = hashEffect(effect); + let interned = this.internedEffects.get(hash); + if (interned == null) { + this.internedEffects.set(hash, effect); + interned = effect; + } + return interned; + } +}; +function inferParam(param, initialState, paramKind) { + const place = param.kind === 'Identifier' ? param : param.place; + const value = { + kind: 'Primitive', + loc: place.loc, + value: undefined, + }; + initialState.initialize(value, paramKind); + initialState.define(place, value); +} +function inferBlock(context, state, block) { + for (const phi of block.phis) { + state.inferPhi(phi); + } + for (const instr of block.instructions) { + let instructionSignature = context.instructionSignatureCache.get(instr); + if (instructionSignature == null) { + instructionSignature = computeSignatureForInstruction(context, state.env, instr); + context.instructionSignatureCache.set(instr, instructionSignature); + } + const effects = applySignature(context, state, instructionSignature, instr); + instr.effects = effects; + } + const terminal = block.terminal; + if (terminal.kind === 'try' && terminal.handlerBinding != null) { + context.catchHandlers.set(terminal.handler, terminal.handlerBinding); + } + else if (terminal.kind === 'maybe-throw') { + const handlerParam = context.catchHandlers.get(terminal.handler); + if (handlerParam != null) { + CompilerError.invariant(state.kind(handlerParam) != null, { + reason: 'Expected catch binding to be intialized with a DeclareLocal Catch instruction', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + const effects = []; + for (const instr of block.instructions) { + if (instr.value.kind === 'CallExpression' || + instr.value.kind === 'MethodCall') { + state.appendAlias(handlerParam, instr.lvalue); + const kind = state.kind(instr.lvalue).kind; + if (kind === ValueKind.Mutable || kind == ValueKind.Context) { + effects.push(context.internEffect({ + kind: 'Alias', + from: instr.lvalue, + into: handlerParam, + })); + } + } + } + terminal.effects = effects.length !== 0 ? effects : null; + } + } + else if (terminal.kind === 'return') { + if (!context.isFuctionExpression) { + terminal.effects = [ + context.internEffect({ + kind: 'Freeze', + value: terminal.value, + reason: ValueReason.JsxCaptured, + }), + ]; + } + } +} +function applySignature(context, state, signature, instruction) { + var _a, _b; + const effects = []; + if (instruction.value.kind === 'FunctionExpression' || + instruction.value.kind === 'ObjectMethod') { + const aliasingEffects = (_a = instruction.value.loweredFunc.func.aliasingEffects) !== null && _a !== void 0 ? _a : []; + const context = new Set(instruction.value.loweredFunc.func.context.map(p => p.identifier.id)); + for (const effect of aliasingEffects) { + if (effect.kind === 'Mutate' || effect.kind === 'MutateTransitive') { + if (!context.has(effect.value.identifier.id)) { + continue; + } + const value = state.kind(effect.value); + switch (value.kind) { + case ValueKind.Frozen: { + const reason = getWriteErrorReason({ + kind: value.kind, + reason: value.reason, + }); + const variable = effect.value.identifier.name !== null && + effect.value.identifier.name.kind === 'named' + ? `\`${effect.value.identifier.name.value}\`` + : 'value'; + const diagnostic = CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'This value cannot be modified', + description: reason, + }).withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `${variable} cannot be modified`, + }); + if (effect.kind === 'Mutate' && + ((_b = effect.reason) === null || _b === void 0 ? void 0 : _b.kind) === 'AssignCurrentProperty') { + diagnostic.withDetails({ + kind: 'hint', + message: `Hint: If this value is a Ref (value returned by \`useRef()\`), rename the variable to end in "Ref".`, + }); + } + effects.push({ + kind: 'MutateFrozen', + place: effect.value, + error: diagnostic, + }); + } + } + } + } + } + const initialized = new Set(); + for (const effect of signature.effects) { + applyEffect(context, state, effect, initialized, effects); + } + if (!(state.isDefined(instruction.lvalue) && state.kind(instruction.lvalue))) { + CompilerError.invariant(false, { + reason: `Expected instruction lvalue to be initialized`, + description: null, + details: [ + { + kind: 'error', + loc: instruction.loc, + message: null, + }, + ], + }); + } + return effects.length !== 0 ? effects : null; +} +function applyEffect(context, state, _effect, initialized, effects) { + var _a, _b, _c, _d, _e; + const effect = context.internEffect(_effect); + switch (effect.kind) { + case 'Freeze': { + const didFreeze = state.freeze(effect.value, effect.reason); + if (didFreeze) { + effects.push(effect); + } + break; + } + case 'Create': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'ObjectExpression', + properties: [], + loc: effect.into.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: effect.value, + reason: new Set([effect.reason]), + }); + state.define(effect.into, value); + effects.push(effect); + break; + } + case 'ImmutableCapture': { + const kind = state.kind(effect.from).kind; + switch (kind) { + case ValueKind.Global: + case ValueKind.Primitive: { + break; + } + default: { + effects.push(effect); + } + } + break; + } + case 'CreateFrom': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + const fromValue = state.kind(effect.from); + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'ObjectExpression', + properties: [], + loc: effect.into.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: fromValue.kind, + reason: new Set(fromValue.reason), + }); + state.define(effect.into, value); + switch (fromValue.kind) { + case ValueKind.Primitive: + case ValueKind.Global: { + effects.push({ + kind: 'Create', + value: fromValue.kind, + into: effect.into, + reason: (_a = [...fromValue.reason][0]) !== null && _a !== void 0 ? _a : ValueReason.Other, + }); + break; + } + case ValueKind.Frozen: { + effects.push({ + kind: 'Create', + value: fromValue.kind, + into: effect.into, + reason: (_b = [...fromValue.reason][0]) !== null && _b !== void 0 ? _b : ValueReason.Other, + }); + applyEffect(context, state, { + kind: 'ImmutableCapture', + from: effect.from, + into: effect.into, + }, initialized, effects); + break; + } + default: { + effects.push(effect); + } + } + break; + } + case 'CreateFunction': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + effects.push(effect); + const hasCaptures = effect.captures.some(capture => { + switch (state.kind(capture).kind) { + case ValueKind.Context: + case ValueKind.Mutable: { + return true; + } + default: { + return false; + } + } + }); + const hasTrackedSideEffects = (_c = effect.function.loweredFunc.func.aliasingEffects) === null || _c === void 0 ? void 0 : _c.some(effect => effect.kind === 'MutateFrozen' || + effect.kind === 'MutateGlobal' || + effect.kind === 'Impure'); + const capturesRef = effect.function.loweredFunc.func.context.some(operand => isRefOrRefValue(operand.identifier)); + const isMutable = hasCaptures || hasTrackedSideEffects || capturesRef; + for (const operand of effect.function.loweredFunc.func.context) { + if (operand.effect !== Effect.Capture) { + continue; + } + const kind = state.kind(operand).kind; + if (kind === ValueKind.Primitive || + kind == ValueKind.Frozen || + kind == ValueKind.Global) { + operand.effect = Effect.Read; + } + } + state.initialize(effect.function, { + kind: isMutable ? ValueKind.Mutable : ValueKind.Frozen, + reason: new Set([]), + }); + state.define(effect.into, effect.function); + for (const capture of effect.captures) { + applyEffect(context, state, { + kind: 'Capture', + from: capture, + into: effect.into, + }, initialized, effects); + } + break; + } + case 'MaybeAlias': + case 'Alias': + case 'Capture': { + CompilerError.invariant(effect.kind === 'Capture' || + effect.kind === 'MaybeAlias' || + initialized.has(effect.into.identifier.id), { + reason: `Expected destination to already be initialized within this instruction`, + description: `Destination ${printPlace(effect.into)} is not initialized in this ` + + `instruction for effect ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + const intoKind = state.kind(effect.into).kind; + let destinationType = null; + switch (intoKind) { + case ValueKind.Context: { + destinationType = 'context'; + break; + } + case ValueKind.Mutable: + case ValueKind.MaybeFrozen: { + destinationType = 'mutable'; + break; + } + } + const fromKind = state.kind(effect.from).kind; + let sourceType = null; + switch (fromKind) { + case ValueKind.Context: { + sourceType = 'context'; + break; + } + case ValueKind.Global: + case ValueKind.Primitive: { + break; + } + case ValueKind.Frozen: { + sourceType = 'frozen'; + break; + } + default: { + sourceType = 'mutable'; + break; + } + } + if (sourceType === 'frozen') { + applyEffect(context, state, { + kind: 'ImmutableCapture', + from: effect.from, + into: effect.into, + }, initialized, effects); + } + else if ((sourceType === 'mutable' && destinationType === 'mutable') || + effect.kind === 'MaybeAlias') { + effects.push(effect); + } + else if ((sourceType === 'context' && destinationType != null) || + (sourceType === 'mutable' && destinationType === 'context')) { + applyEffect(context, state, { kind: 'MaybeAlias', from: effect.from, into: effect.into }, initialized, effects); + } + break; + } + case 'Assign': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + const fromValue = state.kind(effect.from); + const fromKind = fromValue.kind; + switch (fromKind) { + case ValueKind.Frozen: { + applyEffect(context, state, { + kind: 'ImmutableCapture', + from: effect.from, + into: effect.into, + }, initialized, effects); + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'Primitive', + value: undefined, + loc: effect.from.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: fromKind, + reason: new Set(fromValue.reason), + }); + state.define(effect.into, value); + break; + } + case ValueKind.Global: + case ValueKind.Primitive: { + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'Primitive', + value: undefined, + loc: effect.from.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: fromKind, + reason: new Set(fromValue.reason), + }); + state.define(effect.into, value); + break; + } + default: { + state.assign(effect.into, effect.from); + effects.push(effect); + break; + } + } + break; + } + case 'Apply': { + const functionValues = state.values(effect.function); + if (functionValues.length === 1 && + functionValues[0].kind === 'FunctionExpression' && + functionValues[0].loweredFunc.func.aliasingEffects != null) { + const functionExpr = functionValues[0]; + let signature = context.functionSignatureCache.get(functionExpr); + if (signature == null) { + signature = buildSignatureFromFunctionExpression(state.env, functionExpr); + context.functionSignatureCache.set(functionExpr, signature); + } + const signatureEffects = context.cacheApplySignature(signature, effect, () => computeEffectsForSignature(state.env, signature, effect.into, effect.receiver, effect.args, functionExpr.loweredFunc.func.context, effect.loc)); + if (signatureEffects != null) { + applyEffect(context, state, { kind: 'MutateTransitiveConditionally', value: effect.function }, initialized, effects); + for (const signatureEffect of signatureEffects) { + applyEffect(context, state, signatureEffect, initialized, effects); + } + break; + } + } + let signatureEffects = null; + if (((_d = effect.signature) === null || _d === void 0 ? void 0 : _d.aliasing) != null) { + const signature = effect.signature.aliasing; + signatureEffects = context.cacheApplySignature(effect.signature.aliasing, effect, () => computeEffectsForSignature(state.env, signature, effect.into, effect.receiver, effect.args, [], effect.loc)); + } + if (signatureEffects != null) { + for (const signatureEffect of signatureEffects) { + applyEffect(context, state, signatureEffect, initialized, effects); + } + } + else if (effect.signature != null) { + const legacyEffects = computeEffectsForLegacySignature(state, effect.signature, effect.into, effect.receiver, effect.args, effect.loc); + for (const legacyEffect of legacyEffects) { + applyEffect(context, state, legacyEffect, initialized, effects); + } + } + else { + applyEffect(context, state, { + kind: 'Create', + into: effect.into, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }, initialized, effects); + for (const arg of [effect.receiver, effect.function, ...effect.args]) { + if (arg.kind === 'Hole') { + continue; + } + const operand = arg.kind === 'Identifier' ? arg : arg.place; + if (operand !== effect.function || effect.mutatesFunction) { + applyEffect(context, state, { + kind: 'MutateTransitiveConditionally', + value: operand, + }, initialized, effects); + } + const mutateIterator = arg.kind === 'Spread' ? conditionallyMutateIterator(operand) : null; + if (mutateIterator) { + applyEffect(context, state, mutateIterator, initialized, effects); + } + applyEffect(context, state, { kind: 'MaybeAlias', from: operand, into: effect.into }, initialized, effects); + for (const otherArg of [ + effect.receiver, + effect.function, + ...effect.args, + ]) { + if (otherArg.kind === 'Hole') { + continue; + } + const other = otherArg.kind === 'Identifier' ? otherArg : otherArg.place; + if (other === arg) { + continue; + } + applyEffect(context, state, { + kind: 'Capture', + from: operand, + into: other, + }, initialized, effects); + } + } + } + break; + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + const mutationKind = state.mutate(effect.kind, effect.value); + if (mutationKind === 'mutate') { + effects.push(effect); + } + else if (mutationKind === 'mutate-ref') ; + else if (mutationKind !== 'none' && + (effect.kind === 'Mutate' || effect.kind === 'MutateTransitive')) { + const value = state.kind(effect.value); + if (mutationKind === 'mutate-frozen' && + context.hoistedContextDeclarations.has(effect.value.identifier.declarationId)) { + const variable = effect.value.identifier.name !== null && + effect.value.identifier.name.kind === 'named' + ? `\`${effect.value.identifier.name.value}\`` + : null; + const hoistedAccess = context.hoistedContextDeclarations.get(effect.value.identifier.declarationId); + const diagnostic = CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot access variable before it is declared', + description: `${variable !== null && variable !== void 0 ? variable : 'This variable'} is accessed before it is declared, which prevents the earlier access from updating when this value changes over time`, + }); + if (hoistedAccess != null && hoistedAccess.loc != effect.value.loc) { + diagnostic.withDetails({ + kind: 'error', + loc: hoistedAccess.loc, + message: `${variable !== null && variable !== void 0 ? variable : 'variable'} accessed before it is declared`, + }); + } + diagnostic.withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `${variable !== null && variable !== void 0 ? variable : 'variable'} is declared here`, + }); + applyEffect(context, state, { + kind: 'MutateFrozen', + place: effect.value, + error: diagnostic, + }, initialized, effects); + } + else { + const reason = getWriteErrorReason({ + kind: value.kind, + reason: value.reason, + }); + const variable = effect.value.identifier.name !== null && + effect.value.identifier.name.kind === 'named' + ? `\`${effect.value.identifier.name.value}\`` + : 'value'; + const diagnostic = CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'This value cannot be modified', + description: reason, + }).withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `${variable} cannot be modified`, + }); + if (effect.kind === 'Mutate' && + ((_e = effect.reason) === null || _e === void 0 ? void 0 : _e.kind) === 'AssignCurrentProperty') { + diagnostic.withDetails({ + kind: 'hint', + message: `Hint: If this value is a Ref (value returned by \`useRef()\`), rename the variable to end in "Ref".`, + }); + } + applyEffect(context, state, { + kind: value.kind === ValueKind.Frozen + ? 'MutateFrozen' + : 'MutateGlobal', + place: effect.value, + error: diagnostic, + }, initialized, effects); + } + } + break; + } + case 'Impure': + case 'Render': + case 'MutateFrozen': + case 'MutateGlobal': { + effects.push(effect); + break; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind '${effect.kind}'`); + } + } +} +class InferenceState { + constructor(env, isFunctionExpression, values, variables) { + _InferenceState_isFunctionExpression.set(this, void 0); + _InferenceState_values.set(this, void 0); + _InferenceState_variables.set(this, void 0); + this.env = env; + __classPrivateFieldSet(this, _InferenceState_isFunctionExpression, isFunctionExpression, "f"); + __classPrivateFieldSet(this, _InferenceState_values, values, "f"); + __classPrivateFieldSet(this, _InferenceState_variables, variables, "f"); + } + static empty(env, isFunctionExpression) { + return new InferenceState(env, isFunctionExpression, new Map(), new Map()); + } + get isFunctionExpression() { + return __classPrivateFieldGet(this, _InferenceState_isFunctionExpression, "f"); + } + initialize(value, kind) { + CompilerError.invariant(value.kind !== 'LoadLocal', { + reason: '[InferMutationAliasingEffects] Expected all top-level identifiers to be defined as variables, not values', + description: null, + details: [ + { + kind: 'error', + loc: value.loc, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _InferenceState_values, "f").set(value, kind); + } + values(place) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(place.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value kind to be initialized`, + description: `${printPlace(place)}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'this is uninitialized', + }, + ], + suggestions: null, + }); + return Array.from(values); + } + kind(place) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(place.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value kind to be initialized`, + description: `${printPlace(place)}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'this is uninitialized', + }, + ], + suggestions: null, + }); + let mergedKind = null; + for (const value of values) { + const kind = __classPrivateFieldGet(this, _InferenceState_values, "f").get(value); + mergedKind = + mergedKind !== null ? mergeAbstractValues(mergedKind, kind) : kind; + } + CompilerError.invariant(mergedKind !== null, { + reason: `[InferMutationAliasingEffects] Expected at least one value`, + description: `No value found at \`${printPlace(place)}\``, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + return mergedKind; + } + assign(place, value) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(value.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value for identifier to be initialized`, + description: `${printIdentifier(value.identifier)}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: 'Expected value for identifier to be initialized', + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(place.identifier.id, new Set(values)); + } + appendAlias(place, value) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(value.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value for identifier to be initialized`, + description: `${printIdentifier(value.identifier)}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: 'Expected value for identifier to be initialized', + }, + ], + suggestions: null, + }); + const prevValues = this.values(place); + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(place.identifier.id, new Set([...prevValues, ...values])); + } + define(place, value) { + CompilerError.invariant(__classPrivateFieldGet(this, _InferenceState_values, "f").has(value), { + reason: `[InferMutationAliasingEffects] Expected value to be initialized`, + description: printInstructionValue(value), + details: [ + { + kind: 'error', + loc: value.loc, + message: 'Expected value for identifier to be initialized', + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(place.identifier.id, new Set([value])); + } + isDefined(place) { + return __classPrivateFieldGet(this, _InferenceState_variables, "f").has(place.identifier.id); + } + freeze(place, reason) { + const value = this.kind(place); + switch (value.kind) { + case ValueKind.Context: + case ValueKind.Mutable: + case ValueKind.MaybeFrozen: { + const values = this.values(place); + for (const instrValue of values) { + this.freezeValue(instrValue, reason); + } + return true; + } + case ValueKind.Frozen: + case ValueKind.Global: + case ValueKind.Primitive: { + return false; + } + default: { + assertExhaustive$1(value.kind, `Unexpected value kind '${value.kind}'`); + } + } + } + freezeValue(value, reason) { + __classPrivateFieldGet(this, _InferenceState_values, "f").set(value, { + kind: ValueKind.Frozen, + reason: new Set([reason]), + }); + if (value.kind === 'FunctionExpression' && + (this.env.config.enablePreserveExistingMemoizationGuarantees || + this.env.config.enableTransitivelyFreezeFunctionExpressions)) { + for (const place of value.loweredFunc.func.context) { + this.freeze(place, reason); + } + } + } + mutate(variant, place) { + if (isRefOrRefValue(place.identifier)) { + return 'mutate-ref'; + } + const kind = this.kind(place).kind; + switch (variant) { + case 'MutateConditionally': + case 'MutateTransitiveConditionally': { + switch (kind) { + case ValueKind.Mutable: + case ValueKind.Context: { + return 'mutate'; + } + default: { + return 'none'; + } + } + } + case 'Mutate': + case 'MutateTransitive': { + switch (kind) { + case ValueKind.Mutable: + case ValueKind.Context: { + return 'mutate'; + } + case ValueKind.Primitive: { + return 'none'; + } + case ValueKind.Frozen: { + return 'mutate-frozen'; + } + case ValueKind.Global: { + return 'mutate-global'; + } + case ValueKind.MaybeFrozen: { + return 'mutate-frozen'; + } + default: { + assertExhaustive$1(kind, `Unexpected kind ${kind}`); + } + } + } + default: { + assertExhaustive$1(variant, `Unexpected mutation variant ${variant}`); + } + } + } + merge(other) { + let nextValues = null; + let nextVariables = null; + for (const [id, thisValue] of __classPrivateFieldGet(this, _InferenceState_values, "f")) { + const otherValue = __classPrivateFieldGet(other, _InferenceState_values, "f").get(id); + if (otherValue !== undefined) { + const mergedValue = mergeAbstractValues(thisValue, otherValue); + if (mergedValue !== thisValue) { + nextValues = nextValues !== null && nextValues !== void 0 ? nextValues : new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")); + nextValues.set(id, mergedValue); + } + } + } + for (const [id, otherValue] of __classPrivateFieldGet(other, _InferenceState_values, "f")) { + if (__classPrivateFieldGet(this, _InferenceState_values, "f").has(id)) { + continue; + } + nextValues = nextValues !== null && nextValues !== void 0 ? nextValues : new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")); + nextValues.set(id, otherValue); + } + for (const [id, thisValues] of __classPrivateFieldGet(this, _InferenceState_variables, "f")) { + const otherValues = __classPrivateFieldGet(other, _InferenceState_variables, "f").get(id); + if (otherValues !== undefined) { + let mergedValues = null; + for (const otherValue of otherValues) { + if (!thisValues.has(otherValue)) { + mergedValues = mergedValues !== null && mergedValues !== void 0 ? mergedValues : new Set(thisValues); + mergedValues.add(otherValue); + } + } + if (mergedValues !== null) { + nextVariables = nextVariables !== null && nextVariables !== void 0 ? nextVariables : new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f")); + nextVariables.set(id, mergedValues); + } + } + } + for (const [id, otherValues] of __classPrivateFieldGet(other, _InferenceState_variables, "f")) { + if (__classPrivateFieldGet(this, _InferenceState_variables, "f").has(id)) { + continue; + } + nextVariables = nextVariables !== null && nextVariables !== void 0 ? nextVariables : new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f")); + nextVariables.set(id, new Set(otherValues)); + } + if (nextVariables === null && nextValues === null) { + return null; + } + else { + return new InferenceState(this.env, __classPrivateFieldGet(this, _InferenceState_isFunctionExpression, "f"), nextValues !== null && nextValues !== void 0 ? nextValues : new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")), nextVariables !== null && nextVariables !== void 0 ? nextVariables : new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f"))); + } + } + clone() { + return new InferenceState(this.env, __classPrivateFieldGet(this, _InferenceState_isFunctionExpression, "f"), new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")), new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f"))); + } + debug() { + const result = { values: {}, variables: {} }; + const objects = new Map(); + function identify(value) { + let id = objects.get(value); + if (id == null) { + id = objects.size; + objects.set(value, id); + } + return id; + } + for (const [value, kind] of __classPrivateFieldGet(this, _InferenceState_values, "f")) { + const id = identify(value); + result.values[id] = { + abstract: this.debugAbstractValue(kind), + value: printInstructionValue(value), + }; + } + for (const [variable, values] of __classPrivateFieldGet(this, _InferenceState_variables, "f")) { + result.variables[`$${variable}`] = [...values].map(identify); + } + return result; + } + debugAbstractValue(value) { + return { + kind: value.kind, + reason: [...value.reason], + }; + } + inferPhi(phi) { + const values = new Set(); + for (const [_, operand] of phi.operands) { + const operandValues = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(operand.identifier.id); + if (operandValues === undefined) + continue; + for (const v of operandValues) { + values.add(v); + } + } + if (values.size > 0) { + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(phi.place.identifier.id, values); + } + } +} +_InferenceState_isFunctionExpression = new WeakMap(), _InferenceState_values = new WeakMap(), _InferenceState_variables = new WeakMap(); +function mergeAbstractValues(a, b) { + const kind = mergeValueKinds(a.kind, b.kind); + if (kind === a.kind && + kind === b.kind && + Set_isSuperset(a.reason, b.reason)) { + return a; + } + const reason = new Set(a.reason); + for (const r of b.reason) { + reason.add(r); + } + return { kind, reason }; +} +function conditionallyMutateIterator(place) { + if (!(isArrayType(place.identifier) || + isSetType(place.identifier) || + isMapType(place.identifier))) { + return { + kind: 'MutateTransitiveConditionally', + value: place, + }; + } + return null; +} +function computeSignatureForInstruction(context, env, instr) { + const { lvalue, value } = instr; + const effects = []; + switch (value.kind) { + case 'ArrayExpression': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + for (const element of value.elements) { + if (element.kind === 'Identifier') { + effects.push({ + kind: 'Capture', + from: element, + into: lvalue, + }); + } + else if (element.kind === 'Spread') { + const mutateIterator = conditionallyMutateIterator(element.place); + if (mutateIterator != null) { + effects.push(mutateIterator); + } + effects.push({ + kind: 'Capture', + from: element.place, + into: lvalue, + }); + } + else { + continue; + } + } + break; + } + case 'ObjectExpression': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + for (const property of value.properties) { + if (property.kind === 'ObjectProperty') { + effects.push({ + kind: 'Capture', + from: property.place, + into: lvalue, + }); + } + else { + effects.push({ + kind: 'Capture', + from: property.place, + into: lvalue, + }); + } + } + break; + } + case 'Await': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + effects.push({ kind: 'MutateTransitiveConditionally', value: value.value }); + effects.push({ + kind: 'Capture', + from: value.value, + into: lvalue, + }); + break; + } + case 'NewExpression': + case 'CallExpression': + case 'MethodCall': { + let callee; + let receiver; + let mutatesCallee; + if (value.kind === 'NewExpression') { + callee = value.callee; + receiver = value.callee; + mutatesCallee = false; + } + else if (value.kind === 'CallExpression') { + callee = value.callee; + receiver = value.callee; + mutatesCallee = true; + } + else if (value.kind === 'MethodCall') { + callee = value.property; + receiver = value.receiver; + mutatesCallee = false; + } + else { + assertExhaustive$1(value, `Unexpected value kind '${value.kind}'`); + } + const signature = getFunctionCallSignature(env, callee.identifier.type); + effects.push({ + kind: 'Apply', + receiver, + function: callee, + mutatesFunction: mutatesCallee, + args: value.args, + into: lvalue, + signature, + loc: value.loc, + }); + break; + } + case 'PropertyDelete': + case 'ComputedDelete': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + effects.push({ kind: 'Mutate', value: value.object }); + break; + } + case 'PropertyLoad': + case 'ComputedLoad': { + if (isPrimitiveType(lvalue.identifier)) { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + } + else { + effects.push({ + kind: 'CreateFrom', + from: value.object, + into: lvalue, + }); + } + break; + } + case 'PropertyStore': + case 'ComputedStore': { + const mutationReason = value.kind === 'PropertyStore' && + value.property === 'current' && + value.object.identifier.type.kind === 'Type' + ? { kind: 'AssignCurrentProperty' } + : null; + effects.push({ + kind: 'Mutate', + value: value.object, + reason: mutationReason, + }); + effects.push({ + kind: 'Capture', + from: value.value, + into: value.object, + }); + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + effects.push({ + kind: 'CreateFunction', + into: lvalue, + function: value, + captures: value.loweredFunc.func.context.filter(operand => operand.effect === Effect.Capture), + }); + break; + } + case 'GetIterator': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + if (isArrayType(value.collection.identifier) || + isMapType(value.collection.identifier) || + isSetType(value.collection.identifier)) { + effects.push({ + kind: 'Capture', + from: value.collection, + into: lvalue, + }); + } + else { + effects.push({ kind: 'Alias', from: value.collection, into: lvalue }); + effects.push({ + kind: 'MutateTransitiveConditionally', + value: value.collection, + }); + } + break; + } + case 'IteratorNext': { + effects.push({ kind: 'MutateConditionally', value: value.iterator }); + effects.push({ + kind: 'CreateFrom', + from: value.collection, + into: lvalue, + }); + break; + } + case 'NextPropertyOf': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'JsxExpression': + case 'JsxFragment': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Frozen, + reason: ValueReason.JsxCaptured, + }); + for (const operand of eachInstructionValueOperand(value)) { + effects.push({ + kind: 'Freeze', + value: operand, + reason: ValueReason.JsxCaptured, + }); + effects.push({ + kind: 'Capture', + from: operand, + into: lvalue, + }); + } + if (value.kind === 'JsxExpression') { + if (value.tag.kind === 'Identifier') { + effects.push({ + kind: 'Render', + place: value.tag, + }); + } + if (value.children != null) { + for (const child of value.children) { + effects.push({ + kind: 'Render', + place: child, + }); + } + } + for (const prop of value.props) { + if (prop.kind === 'JsxAttribute' && + prop.place.identifier.type.kind === 'Function' && + (isJsxType(prop.place.identifier.type.return) || + (prop.place.identifier.type.return.kind === 'Phi' && + prop.place.identifier.type.return.operands.some(operand => isJsxType(operand))))) { + effects.push({ + kind: 'Render', + place: prop.place, + }); + } + } + } + break; + } + case 'DeclareLocal': { + effects.push({ + kind: 'Create', + into: value.lvalue.place, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'Destructure': { + for (const patternItem of eachPatternItem(value.lvalue.pattern)) { + const place = patternItem.kind === 'Identifier' ? patternItem : patternItem.place; + if (isPrimitiveType(place.identifier)) { + effects.push({ + kind: 'Create', + into: place, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + } + else if (patternItem.kind === 'Identifier') { + effects.push({ + kind: 'CreateFrom', + from: value.value, + into: place, + }); + } + else { + effects.push({ + kind: 'Create', + into: place, + reason: ValueReason.Other, + value: ValueKind.Mutable, + }); + effects.push({ + kind: 'Capture', + from: value.value, + into: place, + }); + } + } + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'LoadContext': { + effects.push({ kind: 'CreateFrom', from: value.place, into: lvalue }); + break; + } + case 'DeclareContext': { + const kind = value.lvalue.kind; + if (!context.hoistedContextDeclarations.has(value.lvalue.place.identifier.declarationId) || + kind === InstructionKind.HoistedConst || + kind === InstructionKind.HoistedFunction || + kind === InstructionKind.HoistedLet) { + effects.push({ + kind: 'Create', + into: value.lvalue.place, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + } + else { + effects.push({ kind: 'Mutate', value: value.lvalue.place }); + } + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'StoreContext': { + if (value.lvalue.kind === InstructionKind.Reassign || + context.hoistedContextDeclarations.has(value.lvalue.place.identifier.declarationId)) { + effects.push({ kind: 'Mutate', value: value.lvalue.place }); + } + else { + effects.push({ + kind: 'Create', + into: value.lvalue.place, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + } + effects.push({ + kind: 'Capture', + from: value.value, + into: value.lvalue.place, + }); + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'LoadLocal': { + effects.push({ kind: 'Assign', from: value.place, into: lvalue }); + break; + } + case 'StoreLocal': { + effects.push({ + kind: 'Assign', + from: value.value, + into: value.lvalue.place, + }); + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + effects.push({ + kind: 'Create', + into: value.lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'StoreGlobal': { + const variable = `\`${value.name}\``; + effects.push({ + kind: 'MutateGlobal', + place: value.value, + error: CompilerDiagnostic.create({ + category: ErrorCategory.Globals, + reason: 'Cannot reassign variables declared outside of the component/hook', + description: `Variable ${variable} is declared outside of the component/hook. Reassigning this value during render is a form of side effect, which can cause unpredictable behavior depending on when the component happens to re-render. If this variable is used in rendering, use useState instead. Otherwise, consider updating it in an effect. (https://react.dev/reference/rules/components-and-hooks-must-be-pure#side-effects-must-run-outside-of-render)`, + }).withDetails({ + kind: 'error', + loc: instr.loc, + message: `${variable} cannot be reassigned`, + }), + }); + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'TypeCastExpression': { + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'LoadGlobal': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Global, + reason: ValueReason.Global, + }); + break; + } + case 'StartMemoize': + case 'FinishMemoize': { + if (env.config.enablePreserveExistingMemoizationGuarantees) { + for (const operand of eachInstructionValueOperand(value)) { + effects.push({ + kind: 'Freeze', + value: operand, + reason: ValueReason.HookCaptured, + }); + } + } + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'TaggedTemplateExpression': + case 'BinaryExpression': + case 'Debugger': + case 'JSXText': + case 'MetaProperty': + case 'Primitive': + case 'RegExpLiteral': + case 'TemplateLiteral': + case 'UnaryExpression': + case 'UnsupportedNode': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + } + return { + effects, + }; +} +function computeEffectsForLegacySignature(state, signature, lvalue, receiver, args, loc) { + var _a, _b; + const returnValueReason = (_a = signature.returnValueReason) !== null && _a !== void 0 ? _a : ValueReason.Other; + const effects = []; + effects.push({ + kind: 'Create', + into: lvalue, + value: signature.returnValueKind, + reason: returnValueReason, + }); + if (signature.impure && state.env.config.validateNoImpureFunctionsInRender) { + effects.push({ + kind: 'Impure', + place: receiver, + error: CompilerDiagnostic.create({ + category: ErrorCategory.Purity, + reason: 'Cannot call impure function during render', + description: (signature.canonicalName != null + ? `\`${signature.canonicalName}\` is an impure function. ` + : '') + + 'Calling an impure function can produce unstable results that update unpredictably when the component happens to re-render. (https://react.dev/reference/rules/components-and-hooks-must-be-pure#components-and-hooks-must-be-idempotent)', + }).withDetails({ + kind: 'error', + loc, + message: 'Cannot call impure function', + }), + }); + } + if (signature.knownIncompatible != null && state.env.isInferredMemoEnabled) { + const errors = new CompilerError(); + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.IncompatibleLibrary, + reason: 'Use of incompatible library', + description: [ + 'This API returns functions which cannot be memoized without leading to stale UI. ' + + 'To prevent this, by default React Compiler will skip memoizing this component/hook. ' + + 'However, you may see issues if values from this API are passed to other components/hooks that are ' + + 'memoized', + ].join(''), + }).withDetails({ + kind: 'error', + loc: receiver.loc, + message: signature.knownIncompatible, + })); + throw errors; + } + const stores = []; + const captures = []; + function visit(place, effect) { + switch (effect) { + case Effect.Store: { + effects.push({ + kind: 'Mutate', + value: place, + }); + stores.push(place); + break; + } + case Effect.Capture: { + captures.push(place); + break; + } + case Effect.ConditionallyMutate: { + effects.push({ + kind: 'MutateTransitiveConditionally', + value: place, + }); + break; + } + case Effect.ConditionallyMutateIterator: { + const mutateIterator = conditionallyMutateIterator(place); + if (mutateIterator != null) { + effects.push(mutateIterator); + } + effects.push({ + kind: 'Capture', + from: place, + into: lvalue, + }); + break; + } + case Effect.Freeze: { + effects.push({ + kind: 'Freeze', + value: place, + reason: returnValueReason, + }); + break; + } + case Effect.Mutate: { + effects.push({ kind: 'MutateTransitive', value: place }); + break; + } + case Effect.Read: { + effects.push({ + kind: 'ImmutableCapture', + from: place, + into: lvalue, + }); + break; + } + } + } + if (signature.mutableOnlyIfOperandsAreMutable && + areArgumentsImmutableAndNonMutating(state, args)) { + effects.push({ + kind: 'Alias', + from: receiver, + into: lvalue, + }); + for (const arg of args) { + if (arg.kind === 'Hole') { + continue; + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + effects.push({ + kind: 'ImmutableCapture', + from: place, + into: lvalue, + }); + } + return effects; + } + if (signature.calleeEffect !== Effect.Capture) { + effects.push({ + kind: 'Alias', + from: receiver, + into: lvalue, + }); + } + visit(receiver, signature.calleeEffect); + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg.kind === 'Hole') { + continue; + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + const signatureEffect = arg.kind === 'Identifier' && i < signature.positionalParams.length + ? signature.positionalParams[i] + : ((_b = signature.restParam) !== null && _b !== void 0 ? _b : Effect.ConditionallyMutate); + const effect = getArgumentEffect(signatureEffect, arg); + visit(place, effect); + } + if (captures.length !== 0) { + if (stores.length === 0) { + for (const capture of captures) { + effects.push({ kind: 'Alias', from: capture, into: lvalue }); + } + } + else { + for (const capture of captures) { + for (const store of stores) { + effects.push({ kind: 'Capture', from: capture, into: store }); + } + } + } + } + return effects; +} +function areArgumentsImmutableAndNonMutating(state, args) { + for (const arg of args) { + if (arg.kind === 'Hole') { + continue; + } + if (arg.kind === 'Identifier' && arg.identifier.type.kind === 'Function') { + const fnShape = state.env.getFunctionSignature(arg.identifier.type); + if (fnShape != null) { + return (!fnShape.positionalParams.some(isKnownMutableEffect) && + (fnShape.restParam == null || + !isKnownMutableEffect(fnShape.restParam))); + } + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + const kind = state.kind(place).kind; + switch (kind) { + case ValueKind.Primitive: + case ValueKind.Frozen: { + break; + } + default: { + return false; + } + } + const values = state.values(place); + for (const value of values) { + if (value.kind === 'FunctionExpression' && + value.loweredFunc.func.params.some(param => { + const place = param.kind === 'Identifier' ? param : param.place; + const range = place.identifier.mutableRange; + return range.end > range.start + 1; + })) { + return false; + } + } + } + return true; +} +function computeEffectsForSignature(env, signature, lvalue, receiver, args, context = [], loc) { + var _a, _b, _c, _d, _e, _f, _g; + if (signature.params.length > args.length || + (args.length > signature.params.length && signature.rest == null)) { + return null; + } + const mutableSpreads = new Set(); + const substitutions = new Map(); + substitutions.set(signature.receiver, [receiver]); + substitutions.set(signature.returns, [lvalue]); + const params = signature.params; + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg.kind === 'Hole') { + continue; + } + else if (params == null || i >= params.length || arg.kind === 'Spread') { + if (signature.rest == null) { + return null; + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + getOrInsertWith(substitutions, signature.rest, () => []).push(place); + if (arg.kind === 'Spread') { + const mutateIterator = conditionallyMutateIterator(arg.place); + if (mutateIterator != null) { + mutableSpreads.add(arg.place.identifier.id); + } + } + } + else { + const param = params[i]; + substitutions.set(param, [arg]); + } + } + for (const operand of context) { + substitutions.set(operand.identifier.id, [operand]); + } + const effects = []; + for (const signatureTemporary of signature.temporaries) { + const temp = createTemporaryPlace(env, receiver.loc); + substitutions.set(signatureTemporary.identifier.id, [temp]); + } + for (const effect of signature.effects) { + switch (effect.kind) { + case 'MaybeAlias': + case 'Assign': + case 'ImmutableCapture': + case 'Alias': + case 'CreateFrom': + case 'Capture': { + const from = (_a = substitutions.get(effect.from.identifier.id)) !== null && _a !== void 0 ? _a : []; + const to = (_b = substitutions.get(effect.into.identifier.id)) !== null && _b !== void 0 ? _b : []; + for (const fromId of from) { + for (const toId of to) { + effects.push({ + kind: effect.kind, + from: fromId, + into: toId, + }); + } + } + break; + } + case 'Impure': + case 'MutateFrozen': + case 'MutateGlobal': { + const values = (_c = substitutions.get(effect.place.identifier.id)) !== null && _c !== void 0 ? _c : []; + for (const value of values) { + effects.push({ kind: effect.kind, place: value, error: effect.error }); + } + break; + } + case 'Render': { + const values = (_d = substitutions.get(effect.place.identifier.id)) !== null && _d !== void 0 ? _d : []; + for (const value of values) { + effects.push({ kind: effect.kind, place: value }); + } + break; + } + case 'Mutate': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': + case 'MutateConditionally': { + const values = (_e = substitutions.get(effect.value.identifier.id)) !== null && _e !== void 0 ? _e : []; + for (const id of values) { + effects.push({ kind: effect.kind, value: id }); + } + break; + } + case 'Freeze': { + const values = (_f = substitutions.get(effect.value.identifier.id)) !== null && _f !== void 0 ? _f : []; + for (const value of values) { + if (mutableSpreads.has(value.identifier.id)) { + CompilerError.throwTodo({ + reason: 'Support spread syntax for hook arguments', + loc: value.loc, + }); + } + effects.push({ kind: 'Freeze', value, reason: effect.reason }); + } + break; + } + case 'Create': { + const into = (_g = substitutions.get(effect.into.identifier.id)) !== null && _g !== void 0 ? _g : []; + for (const value of into) { + effects.push({ + kind: 'Create', + into: value, + value: effect.value, + reason: effect.reason, + }); + } + break; + } + case 'Apply': { + const applyReceiver = substitutions.get(effect.receiver.identifier.id); + if (applyReceiver == null || applyReceiver.length !== 1) { + return null; + } + const applyFunction = substitutions.get(effect.function.identifier.id); + if (applyFunction == null || applyFunction.length !== 1) { + return null; + } + const applyInto = substitutions.get(effect.into.identifier.id); + if (applyInto == null || applyInto.length !== 1) { + return null; + } + const applyArgs = []; + for (const arg of effect.args) { + if (arg.kind === 'Hole') { + applyArgs.push(arg); + } + else if (arg.kind === 'Identifier') { + const applyArg = substitutions.get(arg.identifier.id); + if (applyArg == null || applyArg.length !== 1) { + return null; + } + applyArgs.push(applyArg[0]); + } + else { + const applyArg = substitutions.get(arg.place.identifier.id); + if (applyArg == null || applyArg.length !== 1) { + return null; + } + applyArgs.push({ kind: 'Spread', place: applyArg[0] }); + } + } + effects.push({ + kind: 'Apply', + mutatesFunction: effect.mutatesFunction, + receiver: applyReceiver[0], + args: applyArgs, + function: applyFunction[0], + into: applyInto[0], + signature: effect.signature, + loc, + }); + break; + } + case 'CreateFunction': { + CompilerError.throwTodo({ + reason: `Support CreateFrom effects in signatures`, + loc: receiver.loc, + }); + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind '${effect.kind}'`); + } + } + } + return effects; +} +function buildSignatureFromFunctionExpression(env, fn) { + var _a; + let rest = null; + const params = []; + for (const param of fn.loweredFunc.func.params) { + if (param.kind === 'Identifier') { + params.push(param.identifier.id); + } + else { + rest = param.place.identifier.id; + } + } + return { + receiver: makeIdentifierId(0), + params, + rest: rest !== null && rest !== void 0 ? rest : createTemporaryPlace(env, fn.loc).identifier.id, + returns: fn.loweredFunc.func.returns.identifier.id, + effects: (_a = fn.loweredFunc.func.aliasingEffects) !== null && _a !== void 0 ? _a : [], + temporaries: [], + }; +} +function getWriteErrorReason(abstractValue) { + if (abstractValue.reason.has(ValueReason.Global)) { + return 'Modifying a variable defined outside a component or hook is not allowed. Consider using an effect'; + } + else if (abstractValue.reason.has(ValueReason.JsxCaptured)) { + return 'Modifying a value used previously in JSX is not allowed. Consider moving the modification before the JSX'; + } + else if (abstractValue.reason.has(ValueReason.Context)) { + return `Modifying a value returned from 'useContext()' is not allowed.`; + } + else if (abstractValue.reason.has(ValueReason.KnownReturnSignature)) { + return 'Modifying a value returned from a function whose return value should not be mutated'; + } + else if (abstractValue.reason.has(ValueReason.ReactiveFunctionArgument)) { + return 'Modifying component props or hook arguments is not allowed. Consider using a local variable instead'; + } + else if (abstractValue.reason.has(ValueReason.State)) { + return "Modifying a value returned from 'useState()', which should not be modified directly. Use the setter function to update instead"; + } + else if (abstractValue.reason.has(ValueReason.ReducerState)) { + return "Modifying a value returned from 'useReducer()', which should not be modified directly. Use the dispatch function to update instead"; + } + else if (abstractValue.reason.has(ValueReason.Effect)) { + return 'Modifying a value used previously in an effect function or as an effect dependency is not allowed. Consider moving the modification before calling useEffect()'; + } + else if (abstractValue.reason.has(ValueReason.HookCaptured)) { + return 'Modifying a value previously passed as an argument to a hook is not allowed. Consider moving the modification before calling the hook'; + } + else if (abstractValue.reason.has(ValueReason.HookReturn)) { + return 'Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed'; + } + else { + return 'This modifies a variable that React considers immutable'; + } +} +function getArgumentEffect(signatureEffect, arg) { + if (signatureEffect != null) { + if (arg.kind === 'Identifier') { + return signatureEffect; + } + else if (signatureEffect === Effect.Mutate || + signatureEffect === Effect.ConditionallyMutate) { + return signatureEffect; + } + else { + if (signatureEffect === Effect.Freeze) { + CompilerError.throwTodo({ + reason: 'Support spread syntax for hook arguments', + loc: arg.place.loc, + }); + } + return Effect.ConditionallyMutateIterator; + } + } + else { + return Effect.ConditionallyMutate; + } +} +function getFunctionCallSignature(env, type) { + if (type.kind !== 'Function') { + return null; + } + return env.getFunctionSignature(type); +} +function isKnownMutableEffect(effect) { + switch (effect) { + case Effect.Store: + case Effect.ConditionallyMutate: + case Effect.ConditionallyMutateIterator: + case Effect.Mutate: { + return true; + } + case Effect.Unknown: { + CompilerError.invariant(false, { + reason: 'Unexpected unknown effect', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + } + case Effect.Read: + case Effect.Capture: + case Effect.Freeze: { + return false; + } + default: { + assertExhaustive$1(effect, `Unexpected effect \`${effect}\``); + } + } +} +function mergeValueKinds(a, b) { + if (a === b) { + return a; + } + else if (a === ValueKind.MaybeFrozen || b === ValueKind.MaybeFrozen) { + return ValueKind.MaybeFrozen; + } + else if (a === ValueKind.Mutable || b === ValueKind.Mutable) { + if (a === ValueKind.Frozen || b === ValueKind.Frozen) { + return ValueKind.MaybeFrozen; + } + else if (a === ValueKind.Context || b === ValueKind.Context) { + return ValueKind.Context; + } + else { + return ValueKind.Mutable; + } + } + else if (a === ValueKind.Context || b === ValueKind.Context) { + if (a === ValueKind.Frozen || b === ValueKind.Frozen) { + return ValueKind.MaybeFrozen; + } + else { + return ValueKind.Context; + } + } + else if (a === ValueKind.Frozen || b === ValueKind.Frozen) { + return ValueKind.Frozen; + } + else if (a === ValueKind.Global || b === ValueKind.Global) { + return ValueKind.Global; + } + else { + CompilerError.invariant(a === ValueKind.Primitive && b == ValueKind.Primitive, { + reason: `Unexpected value kind in mergeValues()`, + description: `Found kinds ${a} and ${b}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + return ValueKind.Primitive; + } +} + +function pruneNonEscapingScopes(fn) { + const state = new State(fn.env); + for (const param of fn.params) { + if (param.kind === 'Identifier') { + state.declare(param.identifier.declarationId); + } + else { + state.declare(param.place.identifier.declarationId); + } + } + visitReactiveFunction(fn, new CollectDependenciesVisitor(fn.env, state), []); + const memoized = computeMemoizedIdentifiers(state); + visitReactiveFunction(fn, new PruneScopesTransform(), memoized); +} +var MemoizationLevel; +(function (MemoizationLevel) { + MemoizationLevel["Memoized"] = "Memoized"; + MemoizationLevel["Conditional"] = "Conditional"; + MemoizationLevel["Unmemoized"] = "Unmemoized"; + MemoizationLevel["Never"] = "Never"; +})(MemoizationLevel || (MemoizationLevel = {})); +function joinAliases(kind1, kind2) { + if (kind1 === MemoizationLevel.Memoized || + kind2 === MemoizationLevel.Memoized) { + return MemoizationLevel.Memoized; + } + else if (kind1 === MemoizationLevel.Conditional || + kind2 === MemoizationLevel.Conditional) { + return MemoizationLevel.Conditional; + } + else if (kind1 === MemoizationLevel.Unmemoized || + kind2 === MemoizationLevel.Unmemoized) { + return MemoizationLevel.Unmemoized; + } + else { + return MemoizationLevel.Never; + } +} +class State { + constructor(env) { + this.definitions = new Map(); + this.identifiers = new Map(); + this.scopes = new Map(); + this.escapingValues = new Set(); + this.env = env; + } + declare(id) { + this.identifiers.set(id, { + level: MemoizationLevel.Never, + memoized: false, + dependencies: new Set(), + scopes: new Set(), + seen: false, + }); + } + visitOperand(id, place, identifier) { + const scope = getPlaceScope(id, place); + if (scope !== null) { + let node = this.scopes.get(scope.id); + if (node === undefined) { + node = { + dependencies: [...scope.dependencies].map(dep => dep.identifier.declarationId), + seen: false, + }; + this.scopes.set(scope.id, node); + } + const identifierNode = this.identifiers.get(identifier); + CompilerError.invariant(identifierNode !== undefined, { + reason: 'Expected identifier to be initialized', + description: `[${id}] operand=${printPlace(place)} for identifier declaration ${identifier}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + identifierNode.scopes.add(scope.id); + } + } +} +function computeMemoizedIdentifiers(state) { + const memoized = new Set(); + function visit(id, forceMemoize = false) { + const node = state.identifiers.get(id); + CompilerError.invariant(node !== undefined, { + reason: `Expected a node for all identifiers, none found for \`${id}\``, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (node.seen) { + return node.memoized; + } + node.seen = true; + node.memoized = false; + let hasMemoizedDependency = false; + for (const dep of node.dependencies) { + const isDepMemoized = visit(dep); + hasMemoizedDependency || (hasMemoizedDependency = isDepMemoized); + } + if (node.level === MemoizationLevel.Memoized || + (node.level === MemoizationLevel.Conditional && + (hasMemoizedDependency || forceMemoize)) || + (node.level === MemoizationLevel.Unmemoized && forceMemoize)) { + node.memoized = true; + memoized.add(id); + for (const scope of node.scopes) { + forceMemoizeScopeDependencies(scope); + } + } + return node.memoized; + } + function forceMemoizeScopeDependencies(id) { + const node = state.scopes.get(id); + CompilerError.invariant(node !== undefined, { + reason: 'Expected a node for all scopes', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (node.seen) { + return; + } + node.seen = true; + for (const dep of node.dependencies) { + visit(dep, true); + } + return; + } + for (const value of state.escapingValues) { + visit(value); + } + return memoized; +} +function computePatternLValues(pattern) { + const lvalues = []; + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Identifier') { + lvalues.push({ place: item, level: MemoizationLevel.Conditional }); + } + else if (item.kind === 'Spread') { + lvalues.push({ place: item.place, level: MemoizationLevel.Memoized }); + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + lvalues.push({ + place: property.place, + level: MemoizationLevel.Conditional, + }); + } + else { + lvalues.push({ + place: property.place, + level: MemoizationLevel.Memoized, + }); + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } + return lvalues; +} +class CollectDependenciesVisitor extends ReactiveFunctionVisitor { + constructor(env, state) { + super(); + this.env = env; + this.state = state; + this.options = { + memoizeJsxElements: !this.env.config.enableForest, + forceMemoizePrimitives: this.env.config.enableForest || + this.env.config.enablePreserveExistingMemoizationGuarantees, + }; + } + computeMemoizationInputs(value, lvalue) { + const env = this.env; + const options = this.options; + switch (value.kind) { + case 'ConditionalExpression': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [ + ...this.computeMemoizationInputs(value.consequent, null).rvalues, + ...this.computeMemoizationInputs(value.alternate, null).rvalues, + ], + }; + } + case 'LogicalExpression': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [ + ...this.computeMemoizationInputs(value.left, null).rvalues, + ...this.computeMemoizationInputs(value.right, null).rvalues, + ], + }; + } + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitValueForMemoization(instr.id, instr.value, instr.lvalue); + } + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: this.computeMemoizationInputs(value.value, null).rvalues, + }; + } + case 'JsxExpression': { + const operands = []; + if (value.tag.kind === 'Identifier') { + operands.push(value.tag); + } + for (const prop of value.props) { + if (prop.kind === 'JsxAttribute') { + operands.push(prop.place); + } + else { + operands.push(prop.argument); + } + } + if (value.children !== null) { + for (const child of value.children) { + operands.push(child); + } + } + const level = options.memoizeJsxElements + ? MemoizationLevel.Memoized + : MemoizationLevel.Unmemoized; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: operands, + }; + } + case 'JsxFragment': { + const level = options.memoizeJsxElements + ? MemoizationLevel.Memoized + : MemoizationLevel.Unmemoized; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: value.children, + }; + } + case 'NextPropertyOf': + case 'StartMemoize': + case 'FinishMemoize': + case 'Debugger': + case 'ComputedDelete': + case 'PropertyDelete': + case 'LoadGlobal': + case 'MetaProperty': + case 'TemplateLiteral': + case 'Primitive': + case 'JSXText': + case 'BinaryExpression': + case 'UnaryExpression': { + if (options.forceMemoizePrimitives) { + const level = MemoizationLevel.Conditional; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: [...eachReactiveValueOperand(value)], + }; + } + const level = MemoizationLevel.Never; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: [], + }; + } + case 'Await': + case 'TypeCastExpression': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.value], + }; + } + case 'IteratorNext': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.iterator, value.collection], + }; + } + case 'GetIterator': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.collection], + }; + } + case 'LoadLocal': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.place], + }; + } + case 'LoadContext': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.place], + }; + } + case 'DeclareContext': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Memoized }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Unmemoized }); + } + return { + lvalues, + rvalues: [], + }; + } + case 'DeclareLocal': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Unmemoized }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Unmemoized }); + } + return { + lvalues, + rvalues: [], + }; + } + case 'PrefixUpdate': + case 'PostfixUpdate': { + const lvalues = [ + { place: value.lvalue, level: MemoizationLevel.Conditional }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'StoreLocal': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Conditional }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'StoreContext': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Memoized }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'StoreGlobal': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Unmemoized }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'Destructure': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + lvalues.push(...computePatternLValues(value.lvalue.pattern)); + return { + lvalues: lvalues, + rvalues: [value.value], + }; + } + case 'ComputedLoad': + case 'PropertyLoad': { + const level = MemoizationLevel.Conditional; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: [value.object], + }; + } + case 'ComputedStore': { + const lvalues = [ + { place: value.object, level: MemoizationLevel.Conditional }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'OptionalExpression': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues: lvalues, + rvalues: [ + ...this.computeMemoizationInputs(value.value, null).rvalues, + ], + }; + } + case 'TaggedTemplateExpression': { + const signature = getFunctionCallSignature(env, value.tag.identifier.type); + let lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + if ((signature === null || signature === void 0 ? void 0 : signature.noAlias) === true) { + return { + lvalues, + rvalues: [], + }; + } + const operands = [...eachReactiveValueOperand(value)]; + lvalues.push(...operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized }))); + return { + lvalues, + rvalues: operands, + }; + } + case 'CallExpression': { + const signature = getFunctionCallSignature(env, value.callee.identifier.type); + let lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + if ((signature === null || signature === void 0 ? void 0 : signature.noAlias) === true) { + return { + lvalues, + rvalues: [], + }; + } + const operands = [...eachReactiveValueOperand(value)]; + lvalues.push(...operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized }))); + return { + lvalues, + rvalues: operands, + }; + } + case 'MethodCall': { + const signature = getFunctionCallSignature(env, value.property.identifier.type); + let lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + if ((signature === null || signature === void 0 ? void 0 : signature.noAlias) === true) { + return { + lvalues, + rvalues: [], + }; + } + const operands = [...eachReactiveValueOperand(value)]; + lvalues.push(...operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized }))); + return { + lvalues, + rvalues: operands, + }; + } + case 'RegExpLiteral': + case 'ObjectMethod': + case 'FunctionExpression': + case 'ArrayExpression': + case 'NewExpression': + case 'ObjectExpression': + case 'PropertyStore': { + const operands = [...eachReactiveValueOperand(value)]; + const lvalues = operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized })); + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + return { + lvalues, + rvalues: operands, + }; + } + case 'UnsupportedNode': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Never }); + } + return { + lvalues, + rvalues: [], + }; + } + default: { + assertExhaustive$1(value, `Unexpected value kind \`${value.kind}\``); + } + } + } + visitValueForMemoization(id, value, lvalue) { + var _a, _b, _c; + const state = this.state; + const aliasing = this.computeMemoizationInputs(value, lvalue); + for (const operand of aliasing.rvalues) { + const operandId = (_a = state.definitions.get(operand.identifier.declarationId)) !== null && _a !== void 0 ? _a : operand.identifier.declarationId; + state.visitOperand(id, operand, operandId); + } + for (const { place: lvalue, level } of aliasing.lvalues) { + const lvalueId = (_b = state.definitions.get(lvalue.identifier.declarationId)) !== null && _b !== void 0 ? _b : lvalue.identifier.declarationId; + let node = state.identifiers.get(lvalueId); + if (node === undefined) { + node = { + level: MemoizationLevel.Never, + memoized: false, + dependencies: new Set(), + scopes: new Set(), + seen: false, + }; + state.identifiers.set(lvalueId, node); + } + node.level = joinAliases(node.level, level); + for (const operand of aliasing.rvalues) { + const operandId = (_c = state.definitions.get(operand.identifier.declarationId)) !== null && _c !== void 0 ? _c : operand.identifier.declarationId; + if (operandId === lvalueId) { + continue; + } + node.dependencies.add(operandId); + } + state.visitOperand(id, lvalue, lvalueId); + } + if (value.kind === 'LoadLocal' && lvalue !== null) { + state.definitions.set(lvalue.identifier.declarationId, value.place.identifier.declarationId); + } + else if (value.kind === 'CallExpression' || value.kind === 'MethodCall') { + let callee = value.kind === 'CallExpression' ? value.callee : value.property; + if (getHookKind(state.env, callee.identifier) != null) { + const signature = getFunctionCallSignature(this.env, callee.identifier.type); + if (signature && signature.noAlias === true) { + return; + } + for (const operand of value.args) { + const place = operand.kind === 'Spread' ? operand.place : operand; + state.escapingValues.add(place.identifier.declarationId); + } + } + } + } + visitInstruction(instruction, _scopes) { + this.visitValueForMemoization(instruction.id, instruction.value, instruction.lvalue); + } + visitTerminal(stmt, scopes) { + this.traverseTerminal(stmt, scopes); + if (stmt.terminal.kind === 'return') { + this.state.escapingValues.add(stmt.terminal.value.identifier.declarationId); + const identifierNode = this.state.identifiers.get(stmt.terminal.value.identifier.declarationId); + CompilerError.invariant(identifierNode !== undefined, { + reason: 'Expected identifier to be initialized', + description: null, + details: [ + { + kind: 'error', + loc: stmt.terminal.loc, + message: null, + }, + ], + suggestions: null, + }); + for (const scope of scopes) { + identifierNode.scopes.add(scope.id); + } + } + } + visitScope(scope, scopes) { + for (const reassignment of scope.scope.reassignments) { + const identifierNode = this.state.identifiers.get(reassignment.declarationId); + CompilerError.invariant(identifierNode !== undefined, { + reason: 'Expected identifier to be initialized', + description: null, + details: [ + { + kind: 'error', + loc: reassignment.loc, + message: null, + }, + ], + suggestions: null, + }); + for (const scope of scopes) { + identifierNode.scopes.add(scope.id); + } + identifierNode.scopes.add(scope.scope.id); + } + this.traverseScope(scope, [...scopes, scope.scope]); + } +} +class PruneScopesTransform extends ReactiveFunctionTransform { + constructor() { + super(...arguments); + this.prunedScopes = new Set(); + this.reassignments = new Map(); + } + transformScope(scopeBlock, state) { + this.visitScope(scopeBlock, state); + if ((scopeBlock.scope.declarations.size === 0 && + scopeBlock.scope.reassignments.size === 0) || + scopeBlock.scope.earlyReturnValue !== null) { + return { kind: 'keep' }; + } + const hasMemoizedOutput = Array.from(scopeBlock.scope.declarations.values()).some(decl => state.has(decl.identifier.declarationId)) || + Array.from(scopeBlock.scope.reassignments).some(identifier => state.has(identifier.declarationId)); + if (hasMemoizedOutput) { + return { kind: 'keep' }; + } + else { + this.prunedScopes.add(scopeBlock.scope.id); + return { + kind: 'replace-many', + value: scopeBlock.instructions, + }; + } + } + transformInstruction(instruction, state) { + var _a; + this.traverseInstruction(instruction, state); + const value = instruction.value; + if (value.kind === 'StoreLocal' && value.lvalue.kind === 'Reassign') { + const ids = getOrInsertDefault(this.reassignments, value.lvalue.place.identifier.declarationId, new Set()); + ids.add(value.value.identifier); + } + else if (value.kind === 'LoadLocal' && + value.place.identifier.scope != null && + instruction.lvalue != null && + instruction.lvalue.identifier.scope == null) { + const ids = getOrInsertDefault(this.reassignments, instruction.lvalue.identifier.declarationId, new Set()); + ids.add(value.place.identifier); + } + else if (value.kind === 'FinishMemoize') { + let decls; + if (value.decl.identifier.scope == null) { + decls = (_a = this.reassignments.get(value.decl.identifier.declarationId)) !== null && _a !== void 0 ? _a : [ + value.decl.identifier, + ]; + } + else { + decls = [value.decl.identifier]; + } + if ([...decls].every(decl => decl.scope == null || this.prunedScopes.has(decl.scope.id))) { + value.pruned = true; + } + } + return { kind: 'keep' }; + } +} + +let Visitor$7 = class Visitor extends ReactiveFunctionVisitor { + visitLValue(id, lvalue, state) { + this.visitPlace(id, lvalue, state); + } + visitPlace(_id, place, state) { + if (place.reactive) { + state.add(place.identifier.id); + } + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + for (const [id, decl] of scopeBlock.scope.declarations) { + if (!isPrimitiveType(decl.identifier) && + !isStableRefType(decl.identifier, state)) { + state.add(id); + } + } + } +}; +function isStableRefType(identifier, reactiveIdentifiers) { + return isUseRefType(identifier) && !reactiveIdentifiers.has(identifier.id); +} +function collectReactiveIdentifiers(fn) { + const visitor = new Visitor$7(); + const state = new Set(); + visitReactiveFunction(fn, visitor, state); + return state; +} + +function pruneNonReactiveDependencies(fn) { + const reactiveIdentifiers = collectReactiveIdentifiers(fn); + visitReactiveFunction(fn, new Visitor$6(), reactiveIdentifiers); +} +let Visitor$6 = class Visitor extends ReactiveFunctionVisitor { + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + const { lvalue, value } = instruction; + switch (value.kind) { + case 'LoadLocal': { + if (lvalue !== null && state.has(value.place.identifier.id)) { + state.add(lvalue.identifier.id); + } + break; + } + case 'StoreLocal': { + if (state.has(value.value.identifier.id)) { + state.add(value.lvalue.place.identifier.id); + if (lvalue !== null) { + state.add(lvalue.identifier.id); + } + } + break; + } + case 'Destructure': { + if (state.has(value.value.identifier.id)) { + for (const lvalue of eachPatternOperand(value.lvalue.pattern)) { + if (isStableType(lvalue.identifier)) { + continue; + } + state.add(lvalue.identifier.id); + } + if (lvalue !== null) { + state.add(lvalue.identifier.id); + } + } + break; + } + case 'PropertyLoad': { + if (lvalue !== null && + state.has(value.object.identifier.id) && + !isStableType(lvalue.identifier)) { + state.add(lvalue.identifier.id); + } + break; + } + case 'ComputedLoad': { + if (lvalue !== null && + (state.has(value.object.identifier.id) || + state.has(value.property.identifier.id))) { + state.add(lvalue.identifier.id); + } + break; + } + } + } + visitScope(scopeBlock, state) { + this.traverseScope(scopeBlock, state); + for (const dep of scopeBlock.scope.dependencies) { + const isReactive = state.has(dep.identifier.id); + if (!isReactive) { + scopeBlock.scope.dependencies.delete(dep); + } + } + if (scopeBlock.scope.dependencies.size !== 0) { + for (const [, declaration] of scopeBlock.scope.declarations) { + state.add(declaration.identifier.id); + } + for (const reassignment of scopeBlock.scope.reassignments) { + state.add(reassignment.id); + } + } + } +}; + +function pruneUnusedLValues(fn) { + const lvalues = new Map(); + visitReactiveFunction(fn, new Visitor$5(), lvalues); + for (const [, instr] of lvalues) { + instr.lvalue = null; + } +} +let Visitor$5 = class Visitor extends ReactiveFunctionVisitor { + visitPlace(id, place, state) { + state.delete(place.identifier.declarationId); + } + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + if (instruction.lvalue !== null && + instruction.lvalue.identifier.name === null) { + state.set(instruction.lvalue.identifier.declarationId, instruction); + } + } +}; + +function pruneUnusedLabels(fn) { + const labels = new Set(); + visitReactiveFunction(fn, new Transform$2(), labels); +} +let Transform$2 = class Transform extends ReactiveFunctionTransform { + transformTerminal(stmt, state) { + this.traverseTerminal(stmt, state); + const { terminal } = stmt; + if ((terminal.kind === 'break' || terminal.kind === 'continue') && + terminal.targetKind === 'labeled') { + state.add(terminal.target); + } + const isReachableLabel = stmt.label !== null && state.has(stmt.label.id); + if (stmt.terminal.kind === 'label' && !isReachableLabel) { + const block = [...stmt.terminal.block]; + const last = block.at(-1); + if (last !== undefined && + last.kind === 'terminal' && + last.terminal.kind === 'break' && + last.terminal.target === null) { + block.pop(); + } + return { kind: 'replace-many', value: block }; + } + else { + if (!isReachableLabel && stmt.label != null) { + stmt.label.implicit = true; + } + return { kind: 'keep' }; + } + } +}; + +function pruneUnusedScopes(fn) { + visitReactiveFunction(fn, new Transform$1(), { + hasReturnStatement: false, + }); +} +let Transform$1 = class Transform extends ReactiveFunctionTransform { + visitTerminal(stmt, state) { + this.traverseTerminal(stmt, state); + if (stmt.terminal.kind === 'return') { + state.hasReturnStatement = true; + } + } + transformScope(scopeBlock, _state) { + const scopeState = { hasReturnStatement: false }; + this.visitScope(scopeBlock, scopeState); + if (!scopeState.hasReturnStatement && + scopeBlock.scope.reassignments.size === 0 && + (scopeBlock.scope.declarations.size === 0 || + !hasOwnDeclaration(scopeBlock))) { + return { + kind: 'replace', + value: { + kind: 'pruned-scope', + scope: scopeBlock.scope, + instructions: scopeBlock.instructions, + }, + }; + } + else { + return { kind: 'keep' }; + } + } +}; +function hasOwnDeclaration(block) { + for (const declaration of block.scope.declarations.values()) { + if (declaration.scope.id === block.scope.id) { + return true; + } + } + return false; +} + +function collectReferencedGlobals(fn) { + const identifiers = new Set(); + visitReactiveFunction(fn, new Visitor$4(), identifiers); + return identifiers; +} +let Visitor$4 = class Visitor extends ReactiveFunctionVisitor { + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') { + this.visitHirFunction(value.loweredFunc.func, state); + } + else if (value.kind === 'LoadGlobal') { + state.add(value.binding.name); + } + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + visitReactiveFunction(fn, this, state); + } +}; + +var _Scopes_instances, _Scopes_seen, _Scopes_stack, _Scopes_globals, _Scopes_programContext, _Scopes_lookup; +function renameVariables(fn) { + const globals = collectReferencedGlobals(fn); + const scopes = new Scopes(globals, fn.env.programContext); + renameVariablesImpl(fn, new Visitor$3(), scopes); + return new Set([...scopes.names, ...globals]); +} +function renameVariablesImpl(fn, visitor, scopes) { + scopes.enter(() => { + for (const param of fn.params) { + if (param.kind === 'Identifier') { + scopes.visit(param.identifier); + } + else { + scopes.visit(param.place.identifier); + } + } + visitReactiveFunction(fn, visitor, scopes); + }); +} +let Visitor$3 = class Visitor extends ReactiveFunctionVisitor { + visitParam(place, state) { + state.visit(place.identifier); + } + visitLValue(_id, lvalue, state) { + state.visit(lvalue.identifier); + } + visitPlace(id, place, state) { + state.visit(place.identifier); + } + visitBlock(block, state) { + state.enter(() => { + this.traverseBlock(block, state); + }); + } + visitPrunedScope(scopeBlock, state) { + this.traverseBlock(scopeBlock.instructions, state); + } + visitScope(scope, state) { + for (const [_, declaration] of scope.scope.declarations) { + state.visit(declaration.identifier); + } + this.traverseScope(scope, state); + } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') { + this.visitHirFunction(value.loweredFunc.func, state); + } + } + visitReactiveFunctionValue(_id, _dependencies, _fn, _state) { + renameVariablesImpl(_fn, this, _state); + } +}; +class Scopes { + constructor(globals, programContext) { + _Scopes_instances.add(this); + _Scopes_seen.set(this, new Map()); + _Scopes_stack.set(this, [new Map()]); + _Scopes_globals.set(this, void 0); + _Scopes_programContext.set(this, void 0); + this.names = new Set(); + __classPrivateFieldSet(this, _Scopes_globals, globals, "f"); + __classPrivateFieldSet(this, _Scopes_programContext, programContext, "f"); + } + visit(identifier) { + const originalName = identifier.name; + if (originalName === null) { + return; + } + const mappedName = __classPrivateFieldGet(this, _Scopes_seen, "f").get(identifier.declarationId); + if (mappedName !== undefined) { + identifier.name = mappedName; + return; + } + let name = originalName.value; + let id = 0; + if (isPromotedTemporary(originalName.value)) { + name = `t${id++}`; + } + else if (isPromotedJsxTemporary(originalName.value)) { + name = `T${id++}`; + } + while (__classPrivateFieldGet(this, _Scopes_instances, "m", _Scopes_lookup).call(this, name) !== null || __classPrivateFieldGet(this, _Scopes_globals, "f").has(name)) { + if (isPromotedTemporary(originalName.value)) { + name = `t${id++}`; + } + else if (isPromotedJsxTemporary(originalName.value)) { + name = `T${id++}`; + } + else { + name = `${originalName.value}$${id++}`; + } + } + __classPrivateFieldGet(this, _Scopes_programContext, "f").addNewReference(name); + const identifierName = makeIdentifierName(name); + identifier.name = identifierName; + __classPrivateFieldGet(this, _Scopes_seen, "f").set(identifier.declarationId, identifierName); + __classPrivateFieldGet(this, _Scopes_stack, "f").at(-1).set(identifierName.value, identifier.declarationId); + this.names.add(identifierName.value); + } + enter(fn) { + const next = new Map(); + __classPrivateFieldGet(this, _Scopes_stack, "f").push(next); + fn(); + const last = __classPrivateFieldGet(this, _Scopes_stack, "f").pop(); + CompilerError.invariant(last === next, { + reason: 'Mismatch push/pop calls', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } +} +_Scopes_seen = new WeakMap(), _Scopes_stack = new WeakMap(), _Scopes_globals = new WeakMap(), _Scopes_programContext = new WeakMap(), _Scopes_instances = new WeakSet(), _Scopes_lookup = function _Scopes_lookup(name) { + for (let i = __classPrivateFieldGet(this, _Scopes_stack, "f").length - 1; i >= 0; i--) { + const scope = __classPrivateFieldGet(this, _Scopes_stack, "f")[i]; + const entry = scope.get(name); + if (entry !== undefined) { + return entry; + } + } + return null; +}; + +function stabilizeBlockIds(fn) { + const referenced = new Set(); + visitReactiveFunction(fn, new CollectReferencedLabels(), referenced); + const mappings = new Map(); + for (const blockId of referenced) { + mappings.set(blockId, makeBlockId(mappings.size)); + } + visitReactiveFunction(fn, new RewriteBlockIds(), mappings); +} +class CollectReferencedLabels extends ReactiveFunctionVisitor { + visitScope(scope, state) { + const { earlyReturnValue } = scope.scope; + if (earlyReturnValue != null) { + state.add(earlyReturnValue.label); + } + this.traverseScope(scope, state); + } + visitTerminal(stmt, state) { + if (stmt.label != null) { + if (!stmt.label.implicit) { + state.add(stmt.label.id); + } + } + this.traverseTerminal(stmt, state); + } +} +class RewriteBlockIds extends ReactiveFunctionVisitor { + visitScope(scope, state) { + const { earlyReturnValue } = scope.scope; + if (earlyReturnValue != null) { + const rewrittenId = getOrInsertDefault(state, earlyReturnValue.label, state.size); + earlyReturnValue.label = makeBlockId(rewrittenId); + } + this.traverseScope(scope, state); + } + visitTerminal(stmt, state) { + if (stmt.label != null) { + const rewrittenId = getOrInsertDefault(state, stmt.label.id, state.size); + stmt.label.id = makeBlockId(rewrittenId); + } + const terminal = stmt.terminal; + if (terminal.kind === 'break' || terminal.kind === 'continue') { + const rewrittenId = getOrInsertDefault(state, terminal.target, state.size); + terminal.target = makeBlockId(rewrittenId); + } + this.traverseTerminal(stmt, state); + } +} + +function inferMutationAliasingRanges(fn, { isFunctionExpression }) { + var _a, _b, _c, _d, _e, _f, _g; + const functionEffects = []; + const state = new AliasingState(); + const pendingPhis = new Map(); + const mutations = []; + const renders = []; + let index = 0; + const errors = new CompilerError(); + for (const param of [...fn.params, ...fn.context, fn.returns]) { + const place = param.kind === 'Identifier' ? param : param.place; + state.create(place, { kind: 'Object' }); + } + const seenBlocks = new Set(); + for (const block of fn.body.blocks.values()) { + for (const phi of block.phis) { + state.create(phi.place, { kind: 'Phi' }); + for (const [pred, operand] of phi.operands) { + if (!seenBlocks.has(pred)) { + const blockPhis = getOrInsertWith(pendingPhis, pred, () => []); + blockPhis.push({ from: operand, into: phi.place, index: index++ }); + } + else { + state.assign(index++, operand, phi.place); + } + } + } + seenBlocks.add(block.id); + for (const instr of block.instructions) { + if (instr.effects == null) + continue; + for (const effect of instr.effects) { + if (effect.kind === 'Create') { + state.create(effect.into, { kind: 'Object' }); + } + else if (effect.kind === 'CreateFunction') { + state.create(effect.into, { + kind: 'Function', + function: effect.function.loweredFunc.func, + }); + } + else if (effect.kind === 'CreateFrom') { + state.createFrom(index++, effect.from, effect.into); + } + else if (effect.kind === 'Assign') { + if (!state.nodes.has(effect.into.identifier)) { + state.create(effect.into, { kind: 'Object' }); + } + state.assign(index++, effect.from, effect.into); + } + else if (effect.kind === 'Alias') { + state.assign(index++, effect.from, effect.into); + } + else if (effect.kind === 'MaybeAlias') { + state.maybeAlias(index++, effect.from, effect.into); + } + else if (effect.kind === 'Capture') { + state.capture(index++, effect.from, effect.into); + } + else if (effect.kind === 'MutateTransitive' || + effect.kind === 'MutateTransitiveConditionally') { + mutations.push({ + index: index++, + id: instr.id, + transitive: true, + kind: effect.kind === 'MutateTransitive' + ? MutationKind.Definite + : MutationKind.Conditional, + reason: null, + place: effect.value, + }); + } + else if (effect.kind === 'Mutate' || + effect.kind === 'MutateConditionally') { + mutations.push({ + index: index++, + id: instr.id, + transitive: false, + kind: effect.kind === 'Mutate' + ? MutationKind.Definite + : MutationKind.Conditional, + reason: effect.kind === 'Mutate' ? ((_a = effect.reason) !== null && _a !== void 0 ? _a : null) : null, + place: effect.value, + }); + } + else if (effect.kind === 'MutateFrozen' || + effect.kind === 'MutateGlobal' || + effect.kind === 'Impure') { + errors.pushDiagnostic(effect.error); + functionEffects.push(effect); + } + else if (effect.kind === 'Render') { + renders.push({ index: index++, place: effect.place }); + functionEffects.push(effect); + } + } + } + const blockPhis = pendingPhis.get(block.id); + if (blockPhis != null) { + for (const { from, into, index } of blockPhis) { + state.assign(index, from, into); + } + } + if (block.terminal.kind === 'return') { + state.assign(index++, block.terminal.value, fn.returns); + } + if ((block.terminal.kind === 'maybe-throw' || + block.terminal.kind === 'return') && + block.terminal.effects != null) { + for (const effect of block.terminal.effects) { + if (effect.kind === 'Alias') { + state.assign(index++, effect.from, effect.into); + } + else { + CompilerError.invariant(effect.kind === 'Freeze', { + reason: `Unexpected '${effect.kind}' effect for MaybeThrow terminal`, + description: null, + details: [ + { + kind: 'error', + loc: block.terminal.loc, + message: null, + }, + ], + }); + } + } + } + } + for (const mutation of mutations) { + state.mutate(mutation.index, mutation.place.identifier, makeInstructionId(mutation.id + 1), mutation.transitive, mutation.kind, mutation.place.loc, mutation.reason, errors); + } + for (const render of renders) { + state.render(render.index, render.place.identifier, errors); + } + for (const param of [...fn.context, ...fn.params]) { + const place = param.kind === 'Identifier' ? param : param.place; + const node = state.nodes.get(place.identifier); + if (node == null) { + continue; + } + let mutated = false; + if (node.local != null) { + if (node.local.kind === MutationKind.Conditional) { + mutated = true; + functionEffects.push({ + kind: 'MutateConditionally', + value: Object.assign(Object.assign({}, place), { loc: node.local.loc }), + }); + } + else if (node.local.kind === MutationKind.Definite) { + mutated = true; + functionEffects.push({ + kind: 'Mutate', + value: Object.assign(Object.assign({}, place), { loc: node.local.loc }), + reason: node.mutationReason, + }); + } + } + if (node.transitive != null) { + if (node.transitive.kind === MutationKind.Conditional) { + mutated = true; + functionEffects.push({ + kind: 'MutateTransitiveConditionally', + value: Object.assign(Object.assign({}, place), { loc: node.transitive.loc }), + }); + } + else if (node.transitive.kind === MutationKind.Definite) { + mutated = true; + functionEffects.push({ + kind: 'MutateTransitive', + value: Object.assign(Object.assign({}, place), { loc: node.transitive.loc }), + }); + } + } + if (mutated) { + place.effect = Effect.Capture; + } + } + for (const block of fn.body.blocks.values()) { + for (const phi of block.phis) { + phi.place.effect = Effect.Store; + const isPhiMutatedAfterCreation = phi.place.identifier.mutableRange.end > + ((_c = (_b = block.instructions.at(0)) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : block.terminal.id); + for (const operand of phi.operands.values()) { + operand.effect = isPhiMutatedAfterCreation + ? Effect.Capture + : Effect.Read; + } + if (isPhiMutatedAfterCreation && + phi.place.identifier.mutableRange.start === 0) { + const firstInstructionIdOfBlock = (_e = (_d = block.instructions.at(0)) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : block.terminal.id; + phi.place.identifier.mutableRange.start = makeInstructionId(firstInstructionIdOfBlock - 1); + } + } + for (const instr of block.instructions) { + for (const lvalue of eachInstructionLValue(instr)) { + lvalue.effect = Effect.ConditionallyMutate; + if (lvalue.identifier.mutableRange.start === 0) { + lvalue.identifier.mutableRange.start = instr.id; + } + if (lvalue.identifier.mutableRange.end === 0) { + lvalue.identifier.mutableRange.end = makeInstructionId(Math.max(instr.id + 1, lvalue.identifier.mutableRange.end)); + } + } + for (const operand of eachInstructionValueOperand(instr.value)) { + operand.effect = Effect.Read; + } + if (instr.effects == null) { + continue; + } + const operandEffects = new Map(); + for (const effect of instr.effects) { + switch (effect.kind) { + case 'Assign': + case 'Alias': + case 'Capture': + case 'CreateFrom': + case 'MaybeAlias': { + const isMutatedOrReassigned = effect.into.identifier.mutableRange.end > instr.id; + if (isMutatedOrReassigned) { + operandEffects.set(effect.from.identifier.id, Effect.Capture); + operandEffects.set(effect.into.identifier.id, Effect.Store); + } + else { + operandEffects.set(effect.from.identifier.id, Effect.Read); + operandEffects.set(effect.into.identifier.id, Effect.Store); + } + break; + } + case 'CreateFunction': + case 'Create': { + break; + } + case 'Mutate': { + operandEffects.set(effect.value.identifier.id, Effect.Store); + break; + } + case 'Apply': { + CompilerError.invariant(false, { + reason: `[AnalyzeFunctions] Expected Apply effects to be replaced with more precise effects`, + description: null, + details: [ + { + kind: 'error', + loc: effect.function.loc, + message: null, + }, + ], + }); + } + case 'MutateTransitive': + case 'MutateConditionally': + case 'MutateTransitiveConditionally': { + operandEffects.set(effect.value.identifier.id, Effect.ConditionallyMutate); + break; + } + case 'Freeze': { + operandEffects.set(effect.value.identifier.id, Effect.Freeze); + break; + } + case 'ImmutableCapture': { + break; + } + case 'Impure': + case 'Render': + case 'MutateFrozen': + case 'MutateGlobal': { + break; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind ${effect.kind}`); + } + } + } + for (const lvalue of eachInstructionLValue(instr)) { + const effect = (_f = operandEffects.get(lvalue.identifier.id)) !== null && _f !== void 0 ? _f : Effect.ConditionallyMutate; + lvalue.effect = effect; + } + for (const operand of eachInstructionValueOperand(instr.value)) { + if (operand.identifier.mutableRange.end > instr.id && + operand.identifier.mutableRange.start === 0) { + operand.identifier.mutableRange.start = instr.id; + } + const effect = (_g = operandEffects.get(operand.identifier.id)) !== null && _g !== void 0 ? _g : Effect.Read; + operand.effect = effect; + } + if (instr.value.kind === 'StoreContext' && + instr.value.value.identifier.mutableRange.end <= instr.id) { + instr.value.value.identifier.mutableRange.end = makeInstructionId(instr.id + 1); + } + } + if (block.terminal.kind === 'return') { + block.terminal.value.effect = isFunctionExpression + ? Effect.Read + : Effect.Freeze; + } + else { + for (const operand of eachTerminalOperand(block.terminal)) { + operand.effect = Effect.Read; + } + } + } + const returns = fn.returns.identifier; + functionEffects.push({ + kind: 'Create', + into: fn.returns, + value: isPrimitiveType(returns) + ? ValueKind.Primitive + : isJsxType(returns.type) + ? ValueKind.Frozen + : ValueKind.Mutable, + reason: ValueReason.KnownReturnSignature, + }); + const tracked = []; + const ignoredErrors = new CompilerError(); + for (const param of [...fn.params, ...fn.context, fn.returns]) { + const place = param.kind === 'Identifier' ? param : param.place; + tracked.push(place); + } + for (const into of tracked) { + const mutationIndex = index++; + state.mutate(mutationIndex, into.identifier, null, true, MutationKind.Conditional, into.loc, null, ignoredErrors); + for (const from of tracked) { + if (from.identifier.id === into.identifier.id || + from.identifier.id === fn.returns.identifier.id) { + continue; + } + const fromNode = state.nodes.get(from.identifier); + CompilerError.invariant(fromNode != null, { + reason: `Expected a node to exist for all parameters and context variables`, + description: null, + details: [ + { + kind: 'error', + loc: into.loc, + message: null, + }, + ], + }); + if (fromNode.lastMutated === mutationIndex) { + if (into.identifier.id === fn.returns.identifier.id) { + functionEffects.push({ + kind: 'Alias', + from, + into, + }); + } + else { + functionEffects.push({ + kind: 'Capture', + from, + into, + }); + } + } + } + } + if (errors.hasAnyErrors() && !isFunctionExpression) { + return Err(errors); + } + return Ok(functionEffects); +} +function appendFunctionErrors(errors, fn) { + var _a; + for (const effect of (_a = fn.aliasingEffects) !== null && _a !== void 0 ? _a : []) { + switch (effect.kind) { + case 'Impure': + case 'MutateFrozen': + case 'MutateGlobal': { + errors.pushDiagnostic(effect.error); + break; + } + } + } +} +var MutationKind; +(function (MutationKind) { + MutationKind[MutationKind["None"] = 0] = "None"; + MutationKind[MutationKind["Conditional"] = 1] = "Conditional"; + MutationKind[MutationKind["Definite"] = 2] = "Definite"; +})(MutationKind || (MutationKind = {})); +class AliasingState { + constructor() { + this.nodes = new Map(); + } + create(place, value) { + this.nodes.set(place.identifier, { + id: place.identifier, + createdFrom: new Map(), + captures: new Map(), + aliases: new Map(), + maybeAliases: new Map(), + edges: [], + transitive: null, + local: null, + lastMutated: 0, + mutationReason: null, + value, + }); + } + createFrom(index, from, into) { + this.create(into, { kind: 'Object' }); + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'alias' }); + if (!toNode.createdFrom.has(from.identifier)) { + toNode.createdFrom.set(from.identifier, index); + } + } + capture(index, from, into) { + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'capture' }); + if (!toNode.captures.has(from.identifier)) { + toNode.captures.set(from.identifier, index); + } + } + assign(index, from, into) { + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'alias' }); + if (!toNode.aliases.has(from.identifier)) { + toNode.aliases.set(from.identifier, index); + } + } + maybeAlias(index, from, into) { + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'maybeAlias' }); + if (!toNode.maybeAliases.has(from.identifier)) { + toNode.maybeAliases.set(from.identifier, index); + } + } + render(index, start, errors) { + const seen = new Set(); + const queue = [start]; + while (queue.length !== 0) { + const current = queue.pop(); + if (seen.has(current)) { + continue; + } + seen.add(current); + const node = this.nodes.get(current); + if (node == null || node.transitive != null || node.local != null) { + continue; + } + if (node.value.kind === 'Function') { + appendFunctionErrors(errors, node.value.function); + } + for (const [alias, when] of node.createdFrom) { + if (when >= index) { + continue; + } + queue.push(alias); + } + for (const [alias, when] of node.aliases) { + if (when >= index) { + continue; + } + queue.push(alias); + } + for (const [capture, when] of node.captures) { + if (when >= index) { + continue; + } + queue.push(capture); + } + } + } + mutate(index, start, end, transitive, startKind, loc, reason, errors) { + var _a; + const seen = new Map(); + const queue = [{ place: start, transitive, direction: 'backwards', kind: startKind }]; + while (queue.length !== 0) { + const { place: current, transitive, direction, kind } = queue.pop(); + const previousKind = seen.get(current); + if (previousKind != null && previousKind >= kind) { + continue; + } + seen.set(current, kind); + const node = this.nodes.get(current); + if (node == null) { + continue; + } + (_a = node.mutationReason) !== null && _a !== void 0 ? _a : (node.mutationReason = reason); + node.lastMutated = Math.max(node.lastMutated, index); + if (end != null) { + node.id.mutableRange.end = makeInstructionId(Math.max(node.id.mutableRange.end, end)); + } + if (node.value.kind === 'Function' && + node.transitive == null && + node.local == null) { + appendFunctionErrors(errors, node.value.function); + } + if (transitive) { + if (node.transitive == null || node.transitive.kind < kind) { + node.transitive = { kind, loc }; + } + } + else { + if (node.local == null || node.local.kind < kind) { + node.local = { kind, loc }; + } + } + for (const edge of node.edges) { + if (edge.index >= index) { + break; + } + queue.push({ + place: edge.node, + transitive, + direction: 'forwards', + kind: edge.kind === 'maybeAlias' ? MutationKind.Conditional : kind, + }); + } + for (const [alias, when] of node.createdFrom) { + if (when >= index) { + continue; + } + queue.push({ + place: alias, + transitive: true, + direction: 'backwards', + kind, + }); + } + if (direction === 'backwards' || node.value.kind !== 'Phi') { + for (const [alias, when] of node.aliases) { + if (when >= index) { + continue; + } + queue.push({ + place: alias, + transitive, + direction: 'backwards', + kind, + }); + } + for (const [alias, when] of node.maybeAliases) { + if (when >= index) { + continue; + } + queue.push({ + place: alias, + transitive, + direction: 'backwards', + kind: MutationKind.Conditional, + }); + } + } + if (transitive) { + for (const [capture, when] of node.captures) { + if (when >= index) { + continue; + } + queue.push({ + place: capture, + transitive, + direction: 'backwards', + kind, + }); + } + } + } + } +} + +function analyseFunctions(func) { + for (const [_, block] of func.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'ObjectMethod': + case 'FunctionExpression': { + lowerWithMutationAliasing(instr.value.loweredFunc.func); + for (const operand of instr.value.loweredFunc.func.context) { + operand.identifier.mutableRange = { + start: makeInstructionId(0), + end: makeInstructionId(0), + }; + operand.identifier.scope = null; + } + break; + } + } + } + } +} +function lowerWithMutationAliasing(fn) { + var _a, _b; + analyseFunctions(fn); + inferMutationAliasingEffects(fn, { isFunctionExpression: true }); + deadCodeElimination(fn); + const functionEffects = inferMutationAliasingRanges(fn, { + isFunctionExpression: true, + }).unwrap(); + rewriteInstructionKindsBasedOnReassignment(fn); + inferReactiveScopeVariables(fn); + fn.aliasingEffects = functionEffects; + const capturedOrMutated = new Set(); + for (const effect of functionEffects) { + switch (effect.kind) { + case 'Assign': + case 'Alias': + case 'Capture': + case 'CreateFrom': + case 'MaybeAlias': { + capturedOrMutated.add(effect.from.identifier.id); + break; + } + case 'Apply': { + CompilerError.invariant(false, { + reason: `[AnalyzeFunctions] Expected Apply effects to be replaced with more precise effects`, + description: null, + details: [ + { + kind: 'error', + loc: effect.function.loc, + message: null, + }, + ], + }); + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + capturedOrMutated.add(effect.value.identifier.id); + break; + } + case 'Impure': + case 'Render': + case 'MutateFrozen': + case 'MutateGlobal': + case 'CreateFunction': + case 'Create': + case 'Freeze': + case 'ImmutableCapture': { + break; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind ${effect.kind}`); + } + } + } + for (const operand of fn.context) { + if (capturedOrMutated.has(operand.identifier.id) || + operand.effect === Effect.Capture) { + operand.effect = Effect.Capture; + } + else { + operand.effect = Effect.Read; + } + } + (_b = (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, { + kind: 'hir', + name: 'AnalyseFunction (inner)', + value: fn, + }); +} + +function collectMaybeMemoDependencies(value, maybeDeps, optional) { + var _a; + switch (value.kind) { + case 'LoadGlobal': { + return { + root: { + kind: 'Global', + identifierName: value.binding.name, + }, + path: [], + }; + } + case 'PropertyLoad': { + const object = maybeDeps.get(value.object.identifier.id); + if (object != null) { + return { + root: object.root, + path: [...object.path, { property: value.property, optional }], + }; + } + break; + } + case 'LoadLocal': + case 'LoadContext': { + const source = maybeDeps.get(value.place.identifier.id); + if (source != null) { + return source; + } + else if (value.place.identifier.name != null && + value.place.identifier.name.kind === 'named') { + return { + root: { + kind: 'NamedLocal', + value: Object.assign({}, value.place), + }, + path: [], + }; + } + break; + } + case 'StoreLocal': { + const lvalue = value.lvalue.place.identifier; + const rvalue = value.value.identifier.id; + const aliased = maybeDeps.get(rvalue); + if (aliased != null && ((_a = lvalue.name) === null || _a === void 0 ? void 0 : _a.kind) !== 'named') { + maybeDeps.set(lvalue.id, aliased); + return aliased; + } + break; + } + } + return null; +} +function collectTemporaries(instr, env, sidemap) { + const { value, lvalue } = instr; + switch (value.kind) { + case 'FunctionExpression': { + sidemap.functions.set(instr.lvalue.identifier.id, instr); + break; + } + case 'LoadGlobal': { + const global = env.getGlobalDeclaration(value.binding, value.loc); + const hookKind = global !== null ? getHookKindForType(env, global) : null; + const lvalId = instr.lvalue.identifier.id; + if (hookKind === 'useMemo' || hookKind === 'useCallback') { + sidemap.manualMemos.set(lvalId, { + kind: hookKind, + loadInstr: instr, + }); + } + else if (value.binding.name === 'React') { + sidemap.react.add(lvalId); + } + break; + } + case 'PropertyLoad': { + if (sidemap.react.has(value.object.identifier.id)) { + const property = value.property; + if (property === 'useMemo' || property === 'useCallback') { + sidemap.manualMemos.set(instr.lvalue.identifier.id, { + kind: property, + loadInstr: instr, + }); + } + } + break; + } + case 'ArrayExpression': { + if (value.elements.every(e => e.kind === 'Identifier')) { + sidemap.maybeDepsLists.set(instr.lvalue.identifier.id, value.elements); + } + break; + } + } + const maybeDep = collectMaybeMemoDependencies(value, sidemap.maybeDeps, sidemap.optionals.has(lvalue.identifier.id)); + if (maybeDep != null) { + sidemap.maybeDeps.set(lvalue.identifier.id, maybeDep); + } +} +function makeManualMemoizationMarkers(fnExpr, env, depsList, memoDecl, manualMemoId) { + return [ + { + id: makeInstructionId(0), + lvalue: createTemporaryPlace(env, fnExpr.loc), + value: { + kind: 'StartMemoize', + manualMemoId, + deps: depsList, + loc: fnExpr.loc, + }, + effects: null, + loc: fnExpr.loc, + }, + { + id: makeInstructionId(0), + lvalue: createTemporaryPlace(env, fnExpr.loc), + value: { + kind: 'FinishMemoize', + manualMemoId, + decl: Object.assign({}, memoDecl), + loc: fnExpr.loc, + }, + effects: null, + loc: fnExpr.loc, + }, + ]; +} +function getManualMemoizationReplacement(fn, loc, kind) { + if (kind === 'useMemo') { + return { + kind: 'CallExpression', + callee: fn, + args: [], + loc, + }; + } + else { + return { + kind: 'LoadLocal', + place: { + kind: 'Identifier', + identifier: fn.identifier, + effect: Effect.Unknown, + reactive: false, + loc, + }, + loc, + }; + } +} +function extractManualMemoizationArgs(instr, kind, sidemap, errors) { + const [fnPlace, depsListPlace] = instr.value.args; + if (fnPlace == null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected a callback function to be passed to ${kind}`, + description: `Expected a callback function to be passed to ${kind}`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: instr.value.loc, + message: `Expected a callback function to be passed to ${kind}`, + })); + return { fnPlace: null, depsList: null }; + } + if (fnPlace.kind === 'Spread' || (depsListPlace === null || depsListPlace === void 0 ? void 0 : depsListPlace.kind) === 'Spread') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Unexpected spread argument to ${kind}`, + description: `Unexpected spread argument to ${kind}`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: instr.value.loc, + message: `Unexpected spread argument to ${kind}`, + })); + return { fnPlace: null, depsList: null }; + } + let depsList = null; + if (depsListPlace != null) { + const maybeDepsList = sidemap.maybeDepsLists.get(depsListPlace.identifier.id); + if (maybeDepsList == null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected the dependency list for ${kind} to be an array literal`, + description: `Expected the dependency list for ${kind} to be an array literal`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: depsListPlace.loc, + message: `Expected the dependency list for ${kind} to be an array literal`, + })); + return { fnPlace, depsList: null }; + } + depsList = []; + for (const dep of maybeDepsList) { + const maybeDep = sidemap.maybeDeps.get(dep.identifier.id); + if (maybeDep == null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected the dependency list to be an array of simple expressions (e.g. \`x\`, \`x.y.z\`, \`x?.y?.z\`)`, + description: `Expected the dependency list to be an array of simple expressions (e.g. \`x\`, \`x.y.z\`, \`x?.y?.z\`)`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: dep.loc, + message: `Expected the dependency list to be an array of simple expressions (e.g. \`x\`, \`x.y.z\`, \`x?.y?.z\`)`, + })); + } + else { + depsList.push(maybeDep); + } + } + } + return { + fnPlace, + depsList, + }; +} +function dropManualMemoization(func) { + var _a; + const errors = new CompilerError(); + const isValidationEnabled = func.env.config.validatePreserveExistingMemoizationGuarantees || + func.env.config.validateNoSetStateInRender || + func.env.config.enablePreserveExistingMemoizationGuarantees; + const optionals = findOptionalPlaces(func); + const sidemap = { + functions: new Map(), + manualMemos: new Map(), + react: new Set(), + maybeDeps: new Map(), + maybeDepsLists: new Map(), + optionals, + }; + let nextManualMemoId = 0; + const queuedInserts = new Map(); + for (const [_, block] of func.body.blocks) { + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + if (instr.value.kind === 'CallExpression' || + instr.value.kind === 'MethodCall') { + const id = instr.value.kind === 'CallExpression' + ? instr.value.callee.identifier.id + : instr.value.property.identifier.id; + const manualMemo = sidemap.manualMemos.get(id); + if (manualMemo != null) { + const { fnPlace, depsList } = extractManualMemoizationArgs(instr, manualMemo.kind, sidemap, errors); + if (fnPlace == null) { + continue; + } + if (func.env.config.validateNoVoidUseMemo && + manualMemo.kind === 'useMemo') { + const funcToCheck = (_a = sidemap.functions.get(fnPlace.identifier.id)) === null || _a === void 0 ? void 0 : _a.value; + if (funcToCheck !== undefined && funcToCheck.loweredFunc.func) { + if (!hasNonVoidReturn(funcToCheck.loweredFunc.func)) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: 'useMemo() callbacks must return a value', + description: `This ${manualMemo.loadInstr.value.kind === 'PropertyLoad' + ? 'React.useMemo' + : 'useMemo'} callback doesn't return a value. useMemo is for computing and caching values, not for arbitrary side effects`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: instr.value.loc, + message: 'useMemo() callbacks must return a value', + })); + } + } + } + instr.value = getManualMemoizationReplacement(fnPlace, instr.value.loc, manualMemo.kind); + if (isValidationEnabled) { + if (!sidemap.functions.has(fnPlace.identifier.id)) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected the first argument to be an inline function expression`, + description: `Expected the first argument to be an inline function expression`, + suggestions: [], + }).withDetails({ + kind: 'error', + loc: fnPlace.loc, + message: `Expected the first argument to be an inline function expression`, + })); + continue; + } + const memoDecl = manualMemo.kind === 'useMemo' + ? instr.lvalue + : { + kind: 'Identifier', + identifier: fnPlace.identifier, + effect: Effect.Unknown, + reactive: false, + loc: fnPlace.loc, + }; + const [startMarker, finishMarker] = makeManualMemoizationMarkers(fnPlace, func.env, depsList, memoDecl, nextManualMemoId++); + queuedInserts.set(manualMemo.loadInstr.id, startMarker); + queuedInserts.set(instr.id, finishMarker); + } + } + } + else { + collectTemporaries(instr, func.env, sidemap); + } + } + } + if (queuedInserts.size > 0) { + let hasChanges = false; + for (const [_, block] of func.body.blocks) { + let nextInstructions = null; + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + const insertInstr = queuedInserts.get(instr.id); + if (insertInstr != null) { + nextInstructions = nextInstructions !== null && nextInstructions !== void 0 ? nextInstructions : block.instructions.slice(0, i); + nextInstructions.push(instr); + nextInstructions.push(insertInstr); + } + else if (nextInstructions != null) { + nextInstructions.push(instr); + } + } + if (nextInstructions !== null) { + block.instructions = nextInstructions; + hasChanges = true; + } + } + if (hasChanges) { + markInstructionIds(func.body); + } + } + return errors.asResult(); +} +function findOptionalPlaces(fn) { + const optionals = new Set(); + for (const [, block] of fn.body.blocks) { + if (block.terminal.kind === 'optional' && block.terminal.optional) { + const optionalTerminal = block.terminal; + let testBlock = fn.body.blocks.get(block.terminal.test); + loop: while (true) { + const terminal = testBlock.terminal; + switch (terminal.kind) { + case 'branch': { + if (terminal.fallthrough === optionalTerminal.fallthrough) { + const consequent = fn.body.blocks.get(terminal.consequent); + const last = consequent.instructions.at(-1); + if (last !== undefined && last.value.kind === 'StoreLocal') { + optionals.add(last.value.value.identifier.id); + } + break loop; + } + else { + testBlock = fn.body.blocks.get(terminal.fallthrough); + } + break; + } + case 'optional': + case 'logical': + case 'sequence': + case 'ternary': { + testBlock = fn.body.blocks.get(terminal.fallthrough); + break; + } + default: { + CompilerError.invariant(false, { + reason: `Unexpected terminal in optional`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: `Unexpected ${terminal.kind} in optional`, + }, + ], + }); + } + } + } + } + } + return optionals; +} +function hasNonVoidReturn(func) { + for (const [, block] of func.body.blocks) { + if (block.terminal.kind === 'return') { + if (block.terminal.returnVariant === 'Explicit' || + block.terminal.returnVariant === 'Implicit') { + return true; + } + } + } + return false; +} + +class StableSidemap { + constructor(env) { + this.map = new Map(); + this.env = env; + } + handleInstruction(instr) { + const { value, lvalue } = instr; + switch (value.kind) { + case 'CallExpression': + case 'MethodCall': { + if (evaluatesToStableTypeOrContainer(this.env, instr)) { + if (isStableType(lvalue.identifier)) { + this.map.set(lvalue.identifier.id, { + isStable: true, + }); + } + else { + this.map.set(lvalue.identifier.id, { + isStable: false, + }); + } + } + break; + } + case 'Destructure': + case 'PropertyLoad': { + const source = value.kind === 'Destructure' + ? value.value.identifier.id + : value.object.identifier.id; + const entry = this.map.get(source); + if (entry) { + for (const lvalue of eachInstructionLValue(instr)) { + if (isStableTypeContainer(lvalue.identifier)) { + this.map.set(lvalue.identifier.id, { + isStable: false, + }); + } + else if (isStableType(lvalue.identifier)) { + this.map.set(lvalue.identifier.id, { + isStable: true, + }); + } + } + } + break; + } + case 'StoreLocal': { + const entry = this.map.get(value.value.identifier.id); + if (entry) { + this.map.set(lvalue.identifier.id, entry); + this.map.set(value.lvalue.place.identifier.id, entry); + } + break; + } + case 'LoadLocal': { + const entry = this.map.get(value.place.identifier.id); + if (entry) { + this.map.set(lvalue.identifier.id, entry); + } + break; + } + } + } + isStable(id) { + const entry = this.map.get(id); + return entry != null ? entry.isStable : false; + } +} +function inferReactivePlaces(fn) { + const reactiveIdentifiers = new ReactivityMap(findDisjointMutableValues(fn)); + const stableIdentifierSources = new StableSidemap(fn.env); + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + reactiveIdentifiers.markReactive(place); + } + const postDominators = computePostDominatorTree(fn, { + includeThrowsAsExitNode: false, + }); + const postDominatorFrontierCache = new Map(); + function isReactiveControlledBlock(id) { + let controlBlocks = postDominatorFrontierCache.get(id); + if (controlBlocks === undefined) { + controlBlocks = postDominatorFrontier(fn, postDominators, id); + postDominatorFrontierCache.set(id, controlBlocks); + } + for (const blockId of controlBlocks) { + const controlBlock = fn.body.blocks.get(blockId); + switch (controlBlock.terminal.kind) { + case 'if': + case 'branch': { + if (reactiveIdentifiers.isReactive(controlBlock.terminal.test)) { + return true; + } + break; + } + case 'switch': { + if (reactiveIdentifiers.isReactive(controlBlock.terminal.test)) { + return true; + } + for (const case_ of controlBlock.terminal.cases) { + if (case_.test !== null && + reactiveIdentifiers.isReactive(case_.test)) { + return true; + } + } + break; + } + } + } + return false; + } + do { + for (const [, block] of fn.body.blocks) { + let hasReactiveControl = isReactiveControlledBlock(block.id); + for (const phi of block.phis) { + if (reactiveIdentifiers.isReactive(phi.place)) { + continue; + } + let isPhiReactive = false; + for (const [, operand] of phi.operands) { + if (reactiveIdentifiers.isReactive(operand)) { + isPhiReactive = true; + break; + } + } + if (isPhiReactive) { + reactiveIdentifiers.markReactive(phi.place); + } + else { + for (const [pred] of phi.operands) { + if (isReactiveControlledBlock(pred)) { + reactiveIdentifiers.markReactive(phi.place); + break; + } + } + } + } + for (const instruction of block.instructions) { + stableIdentifierSources.handleInstruction(instruction); + const { value } = instruction; + let hasReactiveInput = false; + for (const operand of eachInstructionValueOperand(value)) { + const reactive = reactiveIdentifiers.isReactive(operand); + hasReactiveInput || (hasReactiveInput = reactive); + } + if (value.kind === 'CallExpression' && + (getHookKind(fn.env, value.callee.identifier) != null || + isUseOperator(value.callee.identifier))) { + hasReactiveInput = true; + } + else if (value.kind === 'MethodCall' && + (getHookKind(fn.env, value.property.identifier) != null || + isUseOperator(value.property.identifier))) { + hasReactiveInput = true; + } + if (hasReactiveInput) { + for (const lvalue of eachInstructionLValue(instruction)) { + if (stableIdentifierSources.isStable(lvalue.identifier.id)) { + continue; + } + reactiveIdentifiers.markReactive(lvalue); + } + } + if (hasReactiveInput || hasReactiveControl) { + for (const operand of eachInstructionValueOperand(value)) { + switch (operand.effect) { + case Effect.Capture: + case Effect.Store: + case Effect.ConditionallyMutate: + case Effect.ConditionallyMutateIterator: + case Effect.Mutate: { + if (isMutable(instruction, operand)) { + reactiveIdentifiers.markReactive(operand); + } + break; + } + case Effect.Freeze: + case Effect.Read: { + break; + } + case Effect.Unknown: { + CompilerError.invariant(false, { + reason: 'Unexpected unknown effect', + description: null, + details: [ + { + kind: 'error', + loc: operand.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(operand.effect, `Unexpected effect kind \`${operand.effect}\``); + } + } + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + reactiveIdentifiers.isReactive(operand); + } + } + } while (reactiveIdentifiers.snapshot()); + function propagateReactivityToInnerFunctions(fn, isOutermost) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (!isOutermost) { + for (const operand of eachInstructionOperand(instr)) { + reactiveIdentifiers.isReactive(operand); + } + } + if (instr.value.kind === 'ObjectMethod' || + instr.value.kind === 'FunctionExpression') { + propagateReactivityToInnerFunctions(instr.value.loweredFunc.func, false); + } + } + if (!isOutermost) { + for (const operand of eachTerminalOperand(block.terminal)) { + reactiveIdentifiers.isReactive(operand); + } + } + } + } + propagateReactivityToInnerFunctions(fn, true); +} +function postDominatorFrontier(fn, postDominators, targetId) { + const visited = new Set(); + const frontier = new Set(); + const targetPostDominators = postDominatorsOf(fn, postDominators, targetId); + for (const blockId of [...targetPostDominators, targetId]) { + if (visited.has(blockId)) { + continue; + } + visited.add(blockId); + const block = fn.body.blocks.get(blockId); + for (const pred of block.preds) { + if (!targetPostDominators.has(pred)) { + frontier.add(pred); + } + } + } + return frontier; +} +function postDominatorsOf(fn, postDominators, targetId) { + var _a; + const result = new Set(); + const visited = new Set(); + const queue = [targetId]; + while (queue.length) { + const currentId = queue.shift(); + if (visited.has(currentId)) { + continue; + } + visited.add(currentId); + const current = fn.body.blocks.get(currentId); + for (const pred of current.preds) { + const predPostDominator = (_a = postDominators.get(pred)) !== null && _a !== void 0 ? _a : pred; + if (predPostDominator === targetId || result.has(predPostDominator)) { + result.add(pred); + } + queue.push(pred); + } + } + return result; +} +class ReactivityMap { + constructor(aliasedIdentifiers) { + this.hasChanges = false; + this.reactive = new Set(); + this.aliasedIdentifiers = aliasedIdentifiers; + } + isReactive(place) { + var _a; + const identifier = (_a = this.aliasedIdentifiers.find(place.identifier)) !== null && _a !== void 0 ? _a : place.identifier; + const reactive = this.reactive.has(identifier.id); + if (reactive) { + place.reactive = true; + } + return reactive; + } + markReactive(place) { + var _a; + place.reactive = true; + const identifier = (_a = this.aliasedIdentifiers.find(place.identifier)) !== null && _a !== void 0 ? _a : place.identifier; + if (!this.reactive.has(identifier.id)) { + this.hasChanges = true; + this.reactive.add(identifier.id); + } + } + snapshot() { + const hasChanges = this.hasChanges; + this.hasChanges = false; + return hasChanges; + } +} + +function inlineImmediatelyInvokedFunctionExpressions(fn) { + const functions = new Map(); + const inlinedFunctions = new Set(); + const queue = Array.from(fn.body.blocks.values()); + queue: for (const block of queue) { + if (isStatementBlockKind(block.kind)) { + for (let ii = 0; ii < block.instructions.length; ii++) { + const instr = block.instructions[ii]; + switch (instr.value.kind) { + case 'FunctionExpression': { + if (instr.lvalue.identifier.name === null) { + functions.set(instr.lvalue.identifier.id, instr.value); + } + break; + } + case 'CallExpression': { + if (instr.value.args.length !== 0) { + continue; + } + const body = functions.get(instr.value.callee.identifier.id); + if (body === undefined) { + continue; + } + if (body.loweredFunc.func.params.length > 0 || + body.loweredFunc.func.async || + body.loweredFunc.func.generator) { + continue; + } + inlinedFunctions.add(instr.value.callee.identifier.id); + const continuationBlockId = fn.env.nextBlockId; + const continuationBlock = { + id: continuationBlockId, + instructions: block.instructions.slice(ii + 1), + kind: block.kind, + phis: new Set(), + preds: new Set(), + terminal: block.terminal, + }; + fn.body.blocks.set(continuationBlockId, continuationBlock); + block.instructions.length = ii; + if (hasSingleExitReturnTerminal(body.loweredFunc.func)) { + block.terminal = { + kind: 'goto', + block: body.loweredFunc.func.body.entry, + id: block.terminal.id, + loc: block.terminal.loc, + variant: GotoVariant.Break, + }; + for (const block of body.loweredFunc.func.body.blocks.values()) { + if (block.terminal.kind === 'return') { + block.instructions.push({ + id: makeInstructionId(0), + loc: block.terminal.loc, + lvalue: instr.lvalue, + value: { + kind: 'LoadLocal', + loc: block.terminal.loc, + place: block.terminal.value, + }, + effects: null, + }); + block.terminal = { + kind: 'goto', + block: continuationBlockId, + id: block.terminal.id, + loc: block.terminal.loc, + variant: GotoVariant.Break, + }; + } + } + for (const [id, block] of body.loweredFunc.func.body.blocks) { + block.preds.clear(); + fn.body.blocks.set(id, block); + } + } + else { + const newTerminal = { + block: body.loweredFunc.func.body.entry, + id: makeInstructionId(0), + kind: 'label', + fallthrough: continuationBlockId, + loc: block.terminal.loc, + }; + block.terminal = newTerminal; + const result = instr.lvalue; + declareTemporary(fn.env, block, result); + if (result.identifier.name == null) { + promoteTemporary(result.identifier); + } + for (const [id, block] of body.loweredFunc.func.body.blocks) { + block.preds.clear(); + rewriteBlock(fn.env, block, continuationBlockId, result); + fn.body.blocks.set(id, block); + } + } + queue.push(continuationBlock); + continue queue; + } + default: { + for (const place of eachInstructionValueOperand(instr.value)) { + functions.delete(place.identifier.id); + } + } + } + } + } + } + if (inlinedFunctions.size !== 0) { + for (const block of fn.body.blocks.values()) { + retainWhere(block.instructions, instr => !inlinedFunctions.has(instr.lvalue.identifier.id)); + } + reversePostorderBlocks(fn.body); + markInstructionIds(fn.body); + markPredecessors(fn.body); + mergeConsecutiveBlocks(fn); + } +} +function hasSingleExitReturnTerminal(fn) { + let hasReturn = false; + let exitCount = 0; + for (const [, block] of fn.body.blocks) { + if (block.terminal.kind === 'return' || block.terminal.kind === 'throw') { + hasReturn || (hasReturn = block.terminal.kind === 'return'); + exitCount++; + } + } + return exitCount === 1 && hasReturn; +} +function rewriteBlock(env, block, returnTarget, returnValue) { + const { terminal } = block; + if (terminal.kind !== 'return') { + return; + } + block.instructions.push({ + id: makeInstructionId(0), + loc: terminal.loc, + lvalue: createTemporaryPlace(env, terminal.loc), + value: { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Reassign, place: Object.assign({}, returnValue) }, + value: terminal.value, + type: null, + loc: terminal.loc, + }, + effects: null, + }); + block.terminal = { + kind: 'goto', + block: returnTarget, + id: makeInstructionId(0), + variant: GotoVariant.Break, + loc: block.terminal.loc, + }; +} +function declareTemporary(env, block, result) { + block.instructions.push({ + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: createTemporaryPlace(env, result.loc), + value: { + kind: 'DeclareLocal', + lvalue: { + place: result, + kind: InstructionKind.Let, + }, + type: null, + loc: result.loc, + }, + effects: null, + }); +} + +function collectHoistablePropertyLoads(fn, temporaries, hoistableFromOptionals) { + const registry = new PropertyPathRegistry(); + const knownImmutableIdentifiers = new Set(); + if (fn.fnType === 'Component' || fn.fnType === 'Hook') { + for (const p of fn.params) { + if (p.kind === 'Identifier') { + knownImmutableIdentifiers.add(p.identifier.id); + } + } + } + return collectHoistablePropertyLoadsImpl(fn, { + temporaries, + knownImmutableIdentifiers, + hoistableFromOptionals, + registry, + nestedFnImmutableContext: null, + assumedInvokedFns: fn.env.config.enableTreatFunctionDepsAsConditional + ? new Set() + : getAssumedInvokedFunctions(fn), + }); +} +function collectHoistablePropertyLoadsInInnerFn(fnInstr, temporaries, hoistableFromOptionals) { + const fn = fnInstr.value.loweredFunc.func; + const initialContext = { + temporaries, + knownImmutableIdentifiers: new Set(), + hoistableFromOptionals, + registry: new PropertyPathRegistry(), + nestedFnImmutableContext: null, + assumedInvokedFns: fn.env.config.enableTreatFunctionDepsAsConditional + ? new Set() + : getAssumedInvokedFunctions(fn), + }; + const nestedFnImmutableContext = new Set(fn.context + .filter(place => isImmutableAtInstr(place.identifier, fnInstr.id, initialContext)) + .map(place => place.identifier.id)); + initialContext.nestedFnImmutableContext = nestedFnImmutableContext; + return collectHoistablePropertyLoadsImpl(fn, initialContext); +} +function collectHoistablePropertyLoadsImpl(fn, context) { + const nodes = collectNonNullsInBlocks(fn, context); + propagateNonNull(fn, nodes, context.registry); + return nodes; +} +function keyByScopeId(fn, source) { + const keyedByScopeId = new Map(); + for (const [_, block] of fn.body.blocks) { + if (block.terminal.kind === 'scope') { + keyedByScopeId.set(block.terminal.scope.id, source.get(block.terminal.block)); + } + } + return keyedByScopeId; +} +class PropertyPathRegistry { + constructor() { + this.roots = new Map(); + } + getOrCreateIdentifier(identifier, reactive) { + let rootNode = this.roots.get(identifier.id); + if (rootNode === undefined) { + rootNode = { + root: identifier.id, + properties: new Map(), + optionalProperties: new Map(), + fullPath: { + identifier, + reactive, + path: [], + }, + hasOptional: false, + parent: null, + }; + this.roots.set(identifier.id, rootNode); + } + else { + CompilerError.invariant(reactive === rootNode.fullPath.reactive, { + reason: '[HoistablePropertyLoads] Found inconsistencies in `reactive` flag when deduping identifier reads within the same scope', + description: null, + details: [ + { + kind: 'error', + loc: identifier.loc, + message: null, + }, + ], + }); + } + return rootNode; + } + static getOrCreatePropertyEntry(parent, entry) { + const map = entry.optional ? parent.optionalProperties : parent.properties; + let child = map.get(entry.property); + if (child == null) { + child = { + properties: new Map(), + optionalProperties: new Map(), + parent: parent, + fullPath: { + identifier: parent.fullPath.identifier, + reactive: parent.fullPath.reactive, + path: parent.fullPath.path.concat(entry), + }, + hasOptional: parent.hasOptional || entry.optional, + }; + map.set(entry.property, child); + } + return child; + } + getOrCreateProperty(n) { + let currNode = this.getOrCreateIdentifier(n.identifier, n.reactive); + if (n.path.length === 0) { + return currNode; + } + for (let i = 0; i < n.path.length - 1; i++) { + currNode = PropertyPathRegistry.getOrCreatePropertyEntry(currNode, n.path[i]); + } + return PropertyPathRegistry.getOrCreatePropertyEntry(currNode, n.path.at(-1)); + } +} +function getMaybeNonNullInInstruction(instr, context) { + var _a, _b, _c; + let path = null; + if (instr.kind === 'PropertyLoad') { + path = (_a = context.temporaries.get(instr.object.identifier.id)) !== null && _a !== void 0 ? _a : { + identifier: instr.object.identifier, + reactive: instr.object.reactive, + path: [], + }; + } + else if (instr.kind === 'Destructure') { + path = (_b = context.temporaries.get(instr.value.identifier.id)) !== null && _b !== void 0 ? _b : null; + } + else if (instr.kind === 'ComputedLoad') { + path = (_c = context.temporaries.get(instr.object.identifier.id)) !== null && _c !== void 0 ? _c : null; + } + return path != null ? context.registry.getOrCreateProperty(path) : null; +} +function isImmutableAtInstr(identifier, instr, context) { + if (context.nestedFnImmutableContext != null) { + return context.nestedFnImmutableContext.has(identifier.id); + } + else { + const mutableAtInstr = identifier.mutableRange.end > identifier.mutableRange.start + 1 && + identifier.scope != null && + inRange({ + id: instr, + }, identifier.scope.range); + return (!mutableAtInstr || context.knownImmutableIdentifiers.has(identifier.id)); + } +} +function collectNonNullsInBlocks(fn, context) { + var _a; + const knownNonNullIdentifiers = new Set(); + if (fn.fnType === 'Component' && + fn.params.length > 0 && + fn.params[0].kind === 'Identifier') { + const identifier = fn.params[0].identifier; + knownNonNullIdentifiers.add(context.registry.getOrCreateIdentifier(identifier, true)); + } + const nodes = new Map(); + for (const [_, block] of fn.body.blocks) { + const assumedNonNullObjects = new Set(knownNonNullIdentifiers); + const maybeOptionalChain = context.hoistableFromOptionals.get(block.id); + if (maybeOptionalChain != null) { + assumedNonNullObjects.add(context.registry.getOrCreateProperty(maybeOptionalChain)); + } + for (const instr of block.instructions) { + const maybeNonNull = getMaybeNonNullInInstruction(instr.value, context); + if (maybeNonNull != null && + isImmutableAtInstr(maybeNonNull.fullPath.identifier, instr.id, context)) { + assumedNonNullObjects.add(maybeNonNull); + } + if (instr.value.kind === 'FunctionExpression') { + const innerFn = instr.value.loweredFunc; + if (context.assumedInvokedFns.has(innerFn)) { + const innerHoistableMap = collectHoistablePropertyLoadsImpl(innerFn.func, Object.assign(Object.assign({}, context), { nestedFnImmutableContext: (_a = context.nestedFnImmutableContext) !== null && _a !== void 0 ? _a : new Set(innerFn.func.context + .filter(place => isImmutableAtInstr(place.identifier, instr.id, context)) + .map(place => place.identifier.id)) })); + const innerHoistables = assertNonNull(innerHoistableMap.get(innerFn.func.body.entry)); + for (const entry of innerHoistables.assumedNonNullObjects) { + assumedNonNullObjects.add(entry); + } + } + } + } + nodes.set(block.id, { + block, + assumedNonNullObjects, + }); + } + return nodes; +} +function propagateNonNull(fn, nodes, registry) { + const blockSuccessors = new Map(); + const terminalPreds = new Set(); + for (const [blockId, block] of fn.body.blocks) { + for (const pred of block.preds) { + getOrInsertDefault(blockSuccessors, pred, new Set()).add(blockId); + } + if (block.terminal.kind === 'throw' || block.terminal.kind === 'return') { + terminalPreds.add(blockId); + } + } + function recursivelyPropagateNonNull(nodeId, direction, traversalState) { + var _a; + if (traversalState.has(nodeId)) { + return false; + } + traversalState.set(nodeId, 'active'); + const node = nodes.get(nodeId); + if (node == null) { + CompilerError.invariant(false, { + reason: `Bad node ${nodeId}, kind: ${direction}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + const neighbors = Array.from(direction === 'backward' + ? ((_a = blockSuccessors.get(nodeId)) !== null && _a !== void 0 ? _a : []) + : node.block.preds); + let changed = false; + for (const pred of neighbors) { + if (!traversalState.has(pred)) { + const neighborChanged = recursivelyPropagateNonNull(pred, direction, traversalState); + changed || (changed = neighborChanged); + } + } + const neighborAccesses = Set_intersect(Array.from(neighbors) + .filter(n => traversalState.get(n) === 'done') + .map(n => assertNonNull(nodes.get(n)).assumedNonNullObjects)); + const prevObjects = assertNonNull(nodes.get(nodeId)).assumedNonNullObjects; + const mergedObjects = Set_union(prevObjects, neighborAccesses); + reduceMaybeOptionalChains(mergedObjects, registry); + assertNonNull(nodes.get(nodeId)).assumedNonNullObjects = mergedObjects; + traversalState.set(nodeId, 'done'); + changed || (changed = !Set_equal(prevObjects, mergedObjects)); + return changed; + } + const traversalState = new Map(); + const reversedBlocks = [...fn.body.blocks]; + reversedBlocks.reverse(); + let changed; + let i = 0; + do { + CompilerError.invariant(i++ < 100, { + reason: '[CollectHoistablePropertyLoads] fixed point iteration did not terminate after 100 loops', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + changed = false; + for (const [blockId] of fn.body.blocks) { + const forwardChanged = recursivelyPropagateNonNull(blockId, 'forward', traversalState); + changed || (changed = forwardChanged); + } + traversalState.clear(); + for (const [blockId] of reversedBlocks) { + const backwardChanged = recursivelyPropagateNonNull(blockId, 'backward', traversalState); + changed || (changed = backwardChanged); + } + traversalState.clear(); + } while (changed); +} +function assertNonNull(value, source) { + CompilerError.invariant(value != null, { + reason: 'Unexpected null', + description: source != null ? `(from ${source})` : null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + return value; +} +function reduceMaybeOptionalChains(nodes, registry) { + let optionalChainNodes = Set_filter(nodes, n => n.hasOptional); + if (optionalChainNodes.size === 0) { + return; + } + let changed; + do { + changed = false; + for (const original of optionalChainNodes) { + let { identifier, path: origPath, reactive } = original.fullPath; + let currNode = registry.getOrCreateIdentifier(identifier, reactive); + for (let i = 0; i < origPath.length; i++) { + const entry = origPath[i]; + const nextEntry = entry.optional && nodes.has(currNode) + ? { property: entry.property, optional: false } + : entry; + currNode = PropertyPathRegistry.getOrCreatePropertyEntry(currNode, nextEntry); + } + if (currNode !== original) { + changed = true; + optionalChainNodes.delete(original); + optionalChainNodes.add(currNode); + nodes.delete(original); + nodes.add(currNode); + } + } + } while (changed); +} +function getAssumedInvokedFunctions(fn, temporaries = new Map()) { + var _a; + const hoistableFunctions = new Set(); + for (const block of fn.body.blocks.values()) { + for (const { lvalue, value } of block.instructions) { + if (value.kind === 'FunctionExpression') { + temporaries.set(lvalue.identifier.id, { + fn: value.loweredFunc, + mayInvoke: new Set(), + }); + } + else if (value.kind === 'StoreLocal') { + const lvalue = value.lvalue.place.identifier; + const maybeLoweredFunc = temporaries.get(value.value.identifier.id); + if (maybeLoweredFunc != null) { + temporaries.set(lvalue.id, maybeLoweredFunc); + } + } + else if (value.kind === 'LoadLocal') { + const maybeLoweredFunc = temporaries.get(value.place.identifier.id); + if (maybeLoweredFunc != null) { + temporaries.set(lvalue.identifier.id, maybeLoweredFunc); + } + } + } + } + for (const block of fn.body.blocks.values()) { + for (const { lvalue, value } of block.instructions) { + if (value.kind === 'CallExpression') { + const callee = value.callee; + const maybeHook = getHookKind(fn.env, callee.identifier); + const maybeLoweredFunc = temporaries.get(callee.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + else if (maybeHook != null) { + for (const arg of value.args) { + if (arg.kind === 'Identifier') { + const maybeLoweredFunc = temporaries.get(arg.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + } + } + } + else if (value.kind === 'JsxExpression') { + for (const attr of value.props) { + if (attr.kind === 'JsxSpreadAttribute') { + continue; + } + const maybeLoweredFunc = temporaries.get(attr.place.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + for (const child of (_a = value.children) !== null && _a !== void 0 ? _a : []) { + const maybeLoweredFunc = temporaries.get(child.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + } + else if (value.kind === 'FunctionExpression') { + const loweredFunc = value.loweredFunc.func; + const lambdasCalled = getAssumedInvokedFunctions(loweredFunc, temporaries); + const maybeLoweredFunc = temporaries.get(lvalue.identifier.id); + if (maybeLoweredFunc != null) { + for (const called of lambdasCalled) { + maybeLoweredFunc.mayInvoke.add(called); + } + } + } + } + if (block.terminal.kind === 'return') { + const maybeLoweredFunc = temporaries.get(block.terminal.value.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + } + for (const [_, { fn, mayInvoke }] of temporaries) { + if (hoistableFunctions.has(fn)) { + for (const called of mayInvoke) { + hoistableFunctions.add(called); + } + } + } + return hoistableFunctions; +} + +function collectOptionalChainSidemap(fn) { + const context = { + currFn: fn, + blocks: fn.body.blocks, + seenOptionals: new Set(), + processedInstrsInOptional: new Set(), + temporariesReadInOptional: new Map(), + hoistableObjects: new Map(), + }; + traverseFunction(fn, context); + return { + temporariesReadInOptional: context.temporariesReadInOptional, + processedInstrsInOptional: context.processedInstrsInOptional, + hoistableObjects: context.hoistableObjects, + }; +} +function traverseFunction(fn, context) { + for (const [_, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + traverseFunction(instr.value.loweredFunc.func, Object.assign(Object.assign({}, context), { currFn: instr.value.loweredFunc.func, blocks: instr.value.loweredFunc.func.body.blocks })); + } + } + if (block.terminal.kind === 'optional' && + !context.seenOptionals.has(block.id)) { + traverseOptionalBlock(block, context, null); + } + } +} +function matchOptionalTestBlock(terminal, blocks) { + const consequentBlock = assertNonNull(blocks.get(terminal.consequent)); + if (consequentBlock.instructions.length === 2 && + consequentBlock.instructions[0].value.kind === 'PropertyLoad' && + consequentBlock.instructions[1].value.kind === 'StoreLocal') { + const propertyLoad = consequentBlock + .instructions[0]; + const storeLocal = consequentBlock.instructions[1].value; + const storeLocalInstr = consequentBlock.instructions[1]; + CompilerError.invariant(propertyLoad.value.object.identifier.id === terminal.test.identifier.id, { + reason: '[OptionalChainDeps] Inconsistent optional chaining property load', + description: `Test=${printIdentifier(terminal.test.identifier)} PropertyLoad base=${printIdentifier(propertyLoad.value.object.identifier)}`, + details: [ + { + kind: 'error', + loc: propertyLoad.loc, + message: null, + }, + ], + }); + CompilerError.invariant(storeLocal.value.identifier.id === propertyLoad.lvalue.identifier.id, { + reason: '[OptionalChainDeps] Unexpected storeLocal', + description: null, + details: [ + { + kind: 'error', + loc: propertyLoad.loc, + message: null, + }, + ], + }); + if (consequentBlock.terminal.kind !== 'goto' || + consequentBlock.terminal.variant !== GotoVariant.Break) { + return null; + } + const alternate = assertNonNull(blocks.get(terminal.alternate)); + CompilerError.invariant(alternate.instructions.length === 2 && + alternate.instructions[0].value.kind === 'Primitive' && + alternate.instructions[1].value.kind === 'StoreLocal', { + reason: 'Unexpected alternate structure', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + return { + consequentId: storeLocal.lvalue.place.identifier.id, + property: propertyLoad.value.property, + propertyId: propertyLoad.lvalue.identifier.id, + storeLocalInstr, + consequentGoto: consequentBlock.terminal.block, + }; + } + return null; +} +function traverseOptionalBlock(optional, context, outerAlternate) { + context.seenOptionals.add(optional.id); + const maybeTest = context.blocks.get(optional.terminal.test); + let test; + let baseObject; + if (maybeTest.terminal.kind === 'branch') { + CompilerError.invariant(optional.terminal.optional, { + reason: '[OptionalChainDeps] Expect base case to be always optional', + description: null, + details: [ + { + kind: 'error', + loc: optional.terminal.loc, + message: null, + }, + ], + }); + if (maybeTest.instructions.length === 0 || + maybeTest.instructions[0].value.kind !== 'LoadLocal') { + return null; + } + const path = []; + for (let i = 1; i < maybeTest.instructions.length; i++) { + const instrVal = maybeTest.instructions[i].value; + const prevInstr = maybeTest.instructions[i - 1]; + if (instrVal.kind === 'PropertyLoad' && + instrVal.object.identifier.id === prevInstr.lvalue.identifier.id) { + path.push({ property: instrVal.property, optional: false }); + } + else { + return null; + } + } + CompilerError.invariant(maybeTest.terminal.test.identifier.id === + maybeTest.instructions.at(-1).lvalue.identifier.id, { + reason: '[OptionalChainDeps] Unexpected test expression', + description: null, + details: [ + { + kind: 'error', + loc: maybeTest.terminal.loc, + message: null, + }, + ], + }); + baseObject = { + identifier: maybeTest.instructions[0].value.place.identifier, + reactive: maybeTest.instructions[0].value.place.reactive, + path, + }; + test = maybeTest.terminal; + } + else if (maybeTest.terminal.kind === 'optional') { + const testBlock = context.blocks.get(maybeTest.terminal.fallthrough); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for optional fallthrough block`, + loc: maybeTest.terminal.loc, + }); + } + const innerOptional = traverseOptionalBlock(maybeTest, context, testBlock.terminal.alternate); + if (innerOptional == null) { + return null; + } + if (testBlock.terminal.test.identifier.id !== innerOptional) { + return null; + } + if (!optional.terminal.optional) { + context.hoistableObjects.set(optional.id, assertNonNull(context.temporariesReadInOptional.get(innerOptional))); + } + baseObject = assertNonNull(context.temporariesReadInOptional.get(innerOptional)); + test = testBlock.terminal; + } + else { + return null; + } + if (test.alternate === outerAlternate) { + CompilerError.invariant(optional.instructions.length === 0, { + reason: '[OptionalChainDeps] Unexpected instructions an inner optional block. ' + + 'This indicates that the compiler may be incorrectly concatenating two unrelated optional chains', + description: null, + details: [ + { + kind: 'error', + loc: optional.terminal.loc, + message: null, + }, + ], + }); + } + const matchConsequentResult = matchOptionalTestBlock(test, context.blocks); + if (!matchConsequentResult) { + return null; + } + CompilerError.invariant(matchConsequentResult.consequentGoto === optional.terminal.fallthrough, { + reason: '[OptionalChainDeps] Unexpected optional goto-fallthrough', + description: `${matchConsequentResult.consequentGoto} != ${optional.terminal.fallthrough}`, + details: [ + { + kind: 'error', + loc: optional.terminal.loc, + message: null, + }, + ], + }); + const load = { + identifier: baseObject.identifier, + reactive: baseObject.reactive, + path: [ + ...baseObject.path, + { + property: matchConsequentResult.property, + optional: optional.terminal.optional, + }, + ], + }; + context.processedInstrsInOptional.add(matchConsequentResult.storeLocalInstr); + context.processedInstrsInOptional.add(test); + context.temporariesReadInOptional.set(matchConsequentResult.consequentId, load); + context.temporariesReadInOptional.set(matchConsequentResult.propertyId, load); + return matchConsequentResult.consequentId; +} + +var _a, _ReactiveScopeDependencyTreeHIR_hoistableObjects, _ReactiveScopeDependencyTreeHIR_deps, _ReactiveScopeDependencyTreeHIR_getOrCreateRoot, _ReactiveScopeDependencyTreeHIR_debugImpl; +class ReactiveScopeDependencyTreeHIR { + constructor(hoistableObjects) { + var _b; + _ReactiveScopeDependencyTreeHIR_hoistableObjects.set(this, new Map()); + _ReactiveScopeDependencyTreeHIR_deps.set(this, new Map()); + for (const { path, identifier, reactive } of hoistableObjects) { + let currNode = __classPrivateFieldGet(_a, _a, "m", _ReactiveScopeDependencyTreeHIR_getOrCreateRoot).call(_a, identifier, reactive, __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_hoistableObjects, "f"), path.length > 0 && path[0].optional ? 'Optional' : 'NonNull'); + for (let i = 0; i < path.length; i++) { + const prevAccessType = (_b = currNode.properties.get(path[i].property)) === null || _b === void 0 ? void 0 : _b.accessType; + const accessType = i + 1 < path.length && path[i + 1].optional ? 'Optional' : 'NonNull'; + CompilerError.invariant(prevAccessType == null || prevAccessType === accessType, { + reason: 'Conflicting access types', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + let nextNode = currNode.properties.get(path[i].property); + if (nextNode == null) { + nextNode = { + properties: new Map(), + accessType, + }; + currNode.properties.set(path[i].property, nextNode); + } + currNode = nextNode; + } + } + } + addDependency(dep) { + const { identifier, reactive, path } = dep; + let depCursor = __classPrivateFieldGet(_a, _a, "m", _ReactiveScopeDependencyTreeHIR_getOrCreateRoot).call(_a, identifier, reactive, __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_deps, "f"), PropertyAccessType.UnconditionalAccess); + let hoistableCursor = __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_hoistableObjects, "f").get(identifier); + for (const entry of path) { + let nextHoistableCursor; + let nextDepCursor; + if (entry.optional) { + if (hoistableCursor != null) { + nextHoistableCursor = hoistableCursor === null || hoistableCursor === void 0 ? void 0 : hoistableCursor.properties.get(entry.property); + } + let accessType; + if (hoistableCursor != null && + hoistableCursor.accessType === 'NonNull') { + accessType = PropertyAccessType.UnconditionalAccess; + } + else { + accessType = PropertyAccessType.OptionalAccess; + } + nextDepCursor = makeOrMergeProperty(depCursor, entry.property, accessType); + } + else if (hoistableCursor != null && + hoistableCursor.accessType === 'NonNull') { + nextHoistableCursor = hoistableCursor.properties.get(entry.property); + nextDepCursor = makeOrMergeProperty(depCursor, entry.property, PropertyAccessType.UnconditionalAccess); + } + else { + break; + } + depCursor = nextDepCursor; + hoistableCursor = nextHoistableCursor; + } + depCursor.accessType = merge$1(depCursor.accessType, PropertyAccessType.OptionalDependency); + } + deriveMinimalDependencies() { + const results = new Set(); + for (const [rootId, rootNode] of __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_deps, "f").entries()) { + collectMinimalDependenciesInSubtree(rootNode, rootNode.reactive, rootId, [], results); + } + return results; + } + printDeps(includeAccesses) { + let res = []; + for (const [rootId, rootNode] of __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_deps, "f").entries()) { + const rootResults = printSubtree(rootNode, includeAccesses).map(result => `${printIdentifier(rootId)}.${result}`); + res.push(rootResults); + } + return res.flat().join('\n'); + } + static debug(roots) { + const buf = [`tree() [`]; + for (const [rootId, rootNode] of roots) { + buf.push(`${printIdentifier(rootId)} (${rootNode.accessType}):`); + __classPrivateFieldGet(this, _a, "m", _ReactiveScopeDependencyTreeHIR_debugImpl).call(this, buf, rootNode, 1); + } + buf.push(']'); + return buf.length > 2 ? buf.join('\n') : buf.join(''); + } +} +_a = ReactiveScopeDependencyTreeHIR, _ReactiveScopeDependencyTreeHIR_hoistableObjects = new WeakMap(), _ReactiveScopeDependencyTreeHIR_deps = new WeakMap(), _ReactiveScopeDependencyTreeHIR_getOrCreateRoot = function _ReactiveScopeDependencyTreeHIR_getOrCreateRoot(identifier, reactive, roots, defaultAccessType) { + let rootNode = roots.get(identifier); + if (rootNode === undefined) { + rootNode = { + properties: new Map(), + reactive, + accessType: defaultAccessType, + }; + roots.set(identifier, rootNode); + } + else { + CompilerError.invariant(reactive === rootNode.reactive, { + reason: '[DeriveMinimalDependenciesHIR] Conflicting reactive root flag', + description: `Identifier ${printIdentifier(identifier)}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + return rootNode; +}, _ReactiveScopeDependencyTreeHIR_debugImpl = function _ReactiveScopeDependencyTreeHIR_debugImpl(buf, node, depth = 0) { + for (const [property, childNode] of node.properties) { + buf.push(`${' '.repeat(depth)}.${property} (${childNode.accessType}):`); + __classPrivateFieldGet(this, _a, "m", _ReactiveScopeDependencyTreeHIR_debugImpl).call(this, buf, childNode, depth + 1); + } +}; +var PropertyAccessType; +(function (PropertyAccessType) { + PropertyAccessType["OptionalAccess"] = "OptionalAccess"; + PropertyAccessType["UnconditionalAccess"] = "UnconditionalAccess"; + PropertyAccessType["OptionalDependency"] = "OptionalDependency"; + PropertyAccessType["UnconditionalDependency"] = "UnconditionalDependency"; +})(PropertyAccessType || (PropertyAccessType = {})); +function isOptional(access) { + return (access === PropertyAccessType.OptionalAccess || + access === PropertyAccessType.OptionalDependency); +} +function isDependency(access) { + return (access === PropertyAccessType.OptionalDependency || + access === PropertyAccessType.UnconditionalDependency); +} +function merge$1(access1, access2) { + const resultIsUnconditional = !(isOptional(access1) && isOptional(access2)); + const resultIsDependency = isDependency(access1) || isDependency(access2); + if (resultIsUnconditional) { + if (resultIsDependency) { + return PropertyAccessType.UnconditionalDependency; + } + else { + return PropertyAccessType.UnconditionalAccess; + } + } + else { + if (resultIsDependency) { + return PropertyAccessType.OptionalDependency; + } + else { + return PropertyAccessType.OptionalAccess; + } + } +} +function collectMinimalDependenciesInSubtree(node, reactive, rootIdentifier, path, results) { + if (isDependency(node.accessType)) { + results.add({ identifier: rootIdentifier, reactive, path }); + } + else { + for (const [childName, childNode] of node.properties) { + collectMinimalDependenciesInSubtree(childNode, reactive, rootIdentifier, [ + ...path, + { + property: childName, + optional: isOptional(childNode.accessType), + }, + ], results); + } + } +} +function printSubtree(node, includeAccesses) { + const results = []; + for (const [propertyName, propertyNode] of node.properties) { + if (includeAccesses || isDependency(propertyNode.accessType)) { + results.push(`${propertyName} (${propertyNode.accessType})`); + } + const propertyResults = printSubtree(propertyNode, includeAccesses); + results.push(...propertyResults.map(result => `${propertyName}.${result}`)); + } + return results; +} +function makeOrMergeProperty(node, property, accessType) { + let child = node.properties.get(property); + if (child == null) { + child = { + properties: new Map(), + accessType, + }; + node.properties.set(property, child); + } + else { + child.accessType = merge$1(child.accessType, accessType); + } + return child; +} + +var _DependencyCollectionContext_instances, _DependencyCollectionContext_declarations, _DependencyCollectionContext_reassignments, _DependencyCollectionContext_scopes, _DependencyCollectionContext_dependencies, _DependencyCollectionContext_temporaries, _DependencyCollectionContext_temporariesUsedOutsideScope, _DependencyCollectionContext_processedInstrsInOptional, _DependencyCollectionContext_innerFnContext, _DependencyCollectionContext_checkValidDependency, _DependencyCollectionContext_isScopeActive; +function propagateScopeDependenciesHIR(fn) { + const usedOutsideDeclaringScope = findTemporariesUsedOutsideDeclaringScope(fn); + const temporaries = collectTemporariesSidemap$1(fn, usedOutsideDeclaringScope); + const { temporariesReadInOptional, processedInstrsInOptional, hoistableObjects, } = collectOptionalChainSidemap(fn); + const hoistablePropertyLoads = keyByScopeId(fn, collectHoistablePropertyLoads(fn, temporaries, hoistableObjects)); + const scopeDeps = collectDependencies(fn, usedOutsideDeclaringScope, new Map([...temporaries, ...temporariesReadInOptional]), processedInstrsInOptional); + for (const [scope, deps] of scopeDeps) { + if (deps.length === 0) { + continue; + } + const hoistables = hoistablePropertyLoads.get(scope.id); + CompilerError.invariant(hoistables != null, { + reason: '[PropagateScopeDependencies] Scope not found in tracked blocks', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + const tree = new ReactiveScopeDependencyTreeHIR([...hoistables.assumedNonNullObjects].map(o => o.fullPath)); + for (const dep of deps) { + tree.addDependency(Object.assign({}, dep)); + } + const candidates = tree.deriveMinimalDependencies(); + for (const candidateDep of candidates) { + if (!Iterable_some(scope.dependencies, existingDep => existingDep.identifier.declarationId === + candidateDep.identifier.declarationId && + areEqualPaths(existingDep.path, candidateDep.path))) + scope.dependencies.add(candidateDep); + } + } +} +function findTemporariesUsedOutsideDeclaringScope(fn) { + const declarations = new Map(); + const prunedScopes = new Set(); + const scopeTraversal = new ScopeBlockTraversal(); + const usedOutsideDeclaringScope = new Set(); + function handlePlace(place) { + const declaringScope = declarations.get(place.identifier.declarationId); + if (declaringScope != null && + !scopeTraversal.isScopeActive(declaringScope) && + !prunedScopes.has(declaringScope)) { + usedOutsideDeclaringScope.add(place.identifier.declarationId); + } + } + function handleInstruction(instr) { + const scope = scopeTraversal.currentScope; + if (scope == null || prunedScopes.has(scope)) { + return; + } + switch (instr.value.kind) { + case 'LoadLocal': + case 'LoadContext': + case 'PropertyLoad': { + declarations.set(instr.lvalue.identifier.declarationId, scope); + break; + } + } + } + for (const [blockId, block] of fn.body.blocks) { + scopeTraversal.recordScopes(block); + const scopeStartInfo = scopeTraversal.blockInfos.get(blockId); + if ((scopeStartInfo === null || scopeStartInfo === void 0 ? void 0 : scopeStartInfo.kind) === 'begin' && scopeStartInfo.pruned) { + prunedScopes.add(scopeStartInfo.scope.id); + } + for (const instr of block.instructions) { + for (const place of eachInstructionOperand(instr)) { + handlePlace(place); + } + handleInstruction(instr); + } + for (const place of eachTerminalOperand(block.terminal)) { + handlePlace(place); + } + } + return usedOutsideDeclaringScope; +} +function collectTemporariesSidemap$1(fn, usedOutsideDeclaringScope) { + const temporaries = new Map(); + collectTemporariesSidemapImpl(fn, usedOutsideDeclaringScope, temporaries, null); + return temporaries; +} +function isLoadContextMutable(instrValue, id) { + if (instrValue.kind === 'LoadContext') { + return (instrValue.place.identifier.scope != null && + id >= instrValue.place.identifier.scope.range.end); + } + return false; +} +function collectTemporariesSidemapImpl(fn, usedOutsideDeclaringScope, temporaries, innerFnContext) { + for (const [_, block] of fn.body.blocks) { + for (const { value, lvalue, id: origInstrId } of block.instructions) { + const instrId = innerFnContext != null ? innerFnContext.instrId : origInstrId; + const usedOutside = usedOutsideDeclaringScope.has(lvalue.identifier.declarationId); + if (value.kind === 'PropertyLoad' && !usedOutside) { + if (innerFnContext == null || + temporaries.has(value.object.identifier.id)) { + const property = getProperty(value.object, value.property, false, temporaries); + temporaries.set(lvalue.identifier.id, property); + } + } + else if ((value.kind === 'LoadLocal' || isLoadContextMutable(value, instrId)) && + lvalue.identifier.name == null && + value.place.identifier.name !== null && + !usedOutside) { + if (innerFnContext == null || + fn.context.some(context => context.identifier.id === value.place.identifier.id)) { + temporaries.set(lvalue.identifier.id, { + identifier: value.place.identifier, + reactive: value.place.reactive, + path: [], + }); + } + } + else if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + collectTemporariesSidemapImpl(value.loweredFunc.func, usedOutsideDeclaringScope, temporaries, innerFnContext !== null && innerFnContext !== void 0 ? innerFnContext : { instrId }); + } + } + } +} +function getProperty(object, propertyName, optional, temporaries) { + const resolvedDependency = temporaries.get(object.identifier.id); + let property; + if (resolvedDependency == null) { + property = { + identifier: object.identifier, + reactive: object.reactive, + path: [{ property: propertyName, optional }], + }; + } + else { + property = { + identifier: resolvedDependency.identifier, + reactive: resolvedDependency.reactive, + path: [...resolvedDependency.path, { property: propertyName, optional }], + }; + } + return property; +} +class DependencyCollectionContext { + constructor(temporariesUsedOutsideScope, temporaries, processedInstrsInOptional) { + _DependencyCollectionContext_instances.add(this); + _DependencyCollectionContext_declarations.set(this, new Map()); + _DependencyCollectionContext_reassignments.set(this, new Map()); + _DependencyCollectionContext_scopes.set(this, empty()); + _DependencyCollectionContext_dependencies.set(this, empty()); + this.deps = new Map(); + _DependencyCollectionContext_temporaries.set(this, void 0); + _DependencyCollectionContext_temporariesUsedOutsideScope.set(this, void 0); + _DependencyCollectionContext_processedInstrsInOptional.set(this, void 0); + _DependencyCollectionContext_innerFnContext.set(this, null); + __classPrivateFieldSet(this, _DependencyCollectionContext_temporariesUsedOutsideScope, temporariesUsedOutsideScope, "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_temporaries, temporaries, "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_processedInstrsInOptional, processedInstrsInOptional, "f"); + } + enterScope(scope) { + __classPrivateFieldSet(this, _DependencyCollectionContext_dependencies, __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").push([]), "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_scopes, __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f").push(scope), "f"); + } + exitScope(scope, pruned) { + var _a; + const scopedDependencies = __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").value; + CompilerError.invariant(scopedDependencies != null, { + reason: '[PropagateScopeDeps]: Unexpected scope mismatch', + description: null, + details: [ + { + kind: 'error', + loc: scope.loc, + message: null, + }, + ], + }); + __classPrivateFieldSet(this, _DependencyCollectionContext_scopes, __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f").pop(), "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_dependencies, __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").pop(), "f"); + for (const dep of scopedDependencies) { + if (__classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_checkValidDependency).call(this, dep)) { + (_a = __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").value) === null || _a === void 0 ? void 0 : _a.push(dep); + } + } + if (!pruned) { + this.deps.set(scope, scopedDependencies); + } + } + isUsedOutsideDeclaringScope(place) { + return __classPrivateFieldGet(this, _DependencyCollectionContext_temporariesUsedOutsideScope, "f").has(place.identifier.declarationId); + } + declare(identifier, decl) { + if (__classPrivateFieldGet(this, _DependencyCollectionContext_innerFnContext, "f") != null) + return; + if (!__classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").has(identifier.declarationId)) { + __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").set(identifier.declarationId, decl); + } + __classPrivateFieldGet(this, _DependencyCollectionContext_reassignments, "f").set(identifier, decl); + } + hasDeclared(identifier) { + return __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").has(identifier.declarationId); + } + get currentScope() { + return __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f"); + } + visitOperand(place) { + var _a; + this.visitDependency((_a = __classPrivateFieldGet(this, _DependencyCollectionContext_temporaries, "f").get(place.identifier.id)) !== null && _a !== void 0 ? _a : { + identifier: place.identifier, + reactive: place.reactive, + path: [], + }); + } + visitProperty(object, property, optional) { + const nextDependency = getProperty(object, property, optional, __classPrivateFieldGet(this, _DependencyCollectionContext_temporaries, "f")); + this.visitDependency(nextDependency); + } + visitDependency(maybeDependency) { + var _a; + const originalDeclaration = __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").get(maybeDependency.identifier.declarationId); + if (originalDeclaration !== undefined && + originalDeclaration.scope.value !== null) { + originalDeclaration.scope.each(scope => { + if (!__classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_isScopeActive).call(this, scope) && + !Iterable_some(scope.declarations.values(), decl => decl.identifier.declarationId === + maybeDependency.identifier.declarationId)) { + scope.declarations.set(maybeDependency.identifier.id, { + identifier: maybeDependency.identifier, + scope: originalDeclaration.scope.value, + }); + } + }); + } + if (isUseRefType(maybeDependency.identifier) && + ((_a = maybeDependency.path.at(0)) === null || _a === void 0 ? void 0 : _a.property) === 'current') { + maybeDependency = { + identifier: maybeDependency.identifier, + reactive: maybeDependency.reactive, + path: [], + }; + } + if (__classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_checkValidDependency).call(this, maybeDependency)) { + __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").value.push(maybeDependency); + } + } + visitReassignment(place) { + const currentScope = this.currentScope.value; + if (currentScope != null && + !Iterable_some(currentScope.reassignments, identifier => identifier.declarationId === place.identifier.declarationId) && + __classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_checkValidDependency).call(this, { + identifier: place.identifier, + reactive: place.reactive, + path: [], + })) { + currentScope.reassignments.add(place.identifier); + } + } + enterInnerFn(innerFn, cb) { + var _a; + const prevContext = __classPrivateFieldGet(this, _DependencyCollectionContext_innerFnContext, "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_innerFnContext, (_a = __classPrivateFieldGet(this, _DependencyCollectionContext_innerFnContext, "f")) !== null && _a !== void 0 ? _a : { outerInstrId: innerFn.id }, "f"); + const result = cb(); + __classPrivateFieldSet(this, _DependencyCollectionContext_innerFnContext, prevContext, "f"); + return result; + } + isDeferredDependency(instr) { + return (__classPrivateFieldGet(this, _DependencyCollectionContext_processedInstrsInOptional, "f").has(instr.value) || + (instr.kind === HIRValue.Instruction && + __classPrivateFieldGet(this, _DependencyCollectionContext_temporaries, "f").has(instr.value.lvalue.identifier.id))); + } +} +_DependencyCollectionContext_declarations = new WeakMap(), _DependencyCollectionContext_reassignments = new WeakMap(), _DependencyCollectionContext_scopes = new WeakMap(), _DependencyCollectionContext_dependencies = new WeakMap(), _DependencyCollectionContext_temporaries = new WeakMap(), _DependencyCollectionContext_temporariesUsedOutsideScope = new WeakMap(), _DependencyCollectionContext_processedInstrsInOptional = new WeakMap(), _DependencyCollectionContext_innerFnContext = new WeakMap(), _DependencyCollectionContext_instances = new WeakSet(), _DependencyCollectionContext_checkValidDependency = function _DependencyCollectionContext_checkValidDependency(maybeDependency) { + var _a; + if (isRefValueType(maybeDependency.identifier)) { + return false; + } + if (isObjectMethodType(maybeDependency.identifier)) { + return false; + } + const identifier = maybeDependency.identifier; + const currentDeclaration = (_a = __classPrivateFieldGet(this, _DependencyCollectionContext_reassignments, "f").get(identifier)) !== null && _a !== void 0 ? _a : __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").get(identifier.declarationId); + const currentScope = this.currentScope.value; + return (currentScope != null && + currentDeclaration !== undefined && + currentDeclaration.id < currentScope.range.start); +}, _DependencyCollectionContext_isScopeActive = function _DependencyCollectionContext_isScopeActive(scope) { + if (__classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f") === null) { + return false; + } + return __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f").find(state => state === scope); +}; +var HIRValue; +(function (HIRValue) { + HIRValue[HIRValue["Instruction"] = 1] = "Instruction"; + HIRValue[HIRValue["Terminal"] = 2] = "Terminal"; +})(HIRValue || (HIRValue = {})); +function handleInstruction(instr, context) { + const { id, value, lvalue } = instr; + context.declare(lvalue.identifier, { + id, + scope: context.currentScope, + }); + if (context.isDeferredDependency({ kind: HIRValue.Instruction, value: instr })) { + return; + } + if (value.kind === 'PropertyLoad') { + context.visitProperty(value.object, value.property, false); + } + else if (value.kind === 'StoreLocal') { + context.visitOperand(value.value); + if (value.lvalue.kind === InstructionKind.Reassign) { + context.visitReassignment(value.lvalue.place); + } + context.declare(value.lvalue.place.identifier, { + id, + scope: context.currentScope, + }); + } + else if (value.kind === 'DeclareLocal' || value.kind === 'DeclareContext') { + if (convertHoistedLValueKind(value.lvalue.kind) === null) { + context.declare(value.lvalue.place.identifier, { + id, + scope: context.currentScope, + }); + } + } + else if (value.kind === 'Destructure') { + context.visitOperand(value.value); + for (const place of eachPatternOperand(value.lvalue.pattern)) { + if (value.lvalue.kind === InstructionKind.Reassign) { + context.visitReassignment(place); + } + context.declare(place.identifier, { + id, + scope: context.currentScope, + }); + } + } + else if (value.kind === 'StoreContext') { + if (!context.hasDeclared(value.lvalue.place.identifier) || + value.lvalue.kind !== InstructionKind.Reassign) { + context.declare(value.lvalue.place.identifier, { + id, + scope: context.currentScope, + }); + } + for (const operand of eachInstructionValueOperand(value)) { + context.visitOperand(operand); + } + } + else { + for (const operand of eachInstructionValueOperand(value)) { + context.visitOperand(operand); + } + } +} +function collectDependencies(fn, usedOutsideDeclaringScope, temporaries, processedInstrsInOptional) { + const context = new DependencyCollectionContext(usedOutsideDeclaringScope, temporaries, processedInstrsInOptional); + for (const param of fn.params) { + if (param.kind === 'Identifier') { + context.declare(param.identifier, { + id: makeInstructionId(0), + scope: empty(), + }); + } + else { + context.declare(param.place.identifier, { + id: makeInstructionId(0), + scope: empty(), + }); + } + } + const scopeTraversal = new ScopeBlockTraversal(); + const handleFunction = (fn) => { + for (const [blockId, block] of fn.body.blocks) { + scopeTraversal.recordScopes(block); + const scopeBlockInfo = scopeTraversal.blockInfos.get(blockId); + if ((scopeBlockInfo === null || scopeBlockInfo === void 0 ? void 0 : scopeBlockInfo.kind) === 'begin') { + context.enterScope(scopeBlockInfo.scope); + } + else if ((scopeBlockInfo === null || scopeBlockInfo === void 0 ? void 0 : scopeBlockInfo.kind) === 'end') { + context.exitScope(scopeBlockInfo.scope, scopeBlockInfo.pruned); + } + for (const phi of block.phis) { + for (const operand of phi.operands) { + const maybeOptionalChain = temporaries.get(operand[1].identifier.id); + if (maybeOptionalChain) { + context.visitDependency(maybeOptionalChain); + } + } + } + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + context.declare(instr.lvalue.identifier, { + id: instr.id, + scope: context.currentScope, + }); + const innerFn = instr.value.loweredFunc.func; + context.enterInnerFn(instr, () => { + handleFunction(innerFn); + }); + } + else { + handleInstruction(instr, context); + } + } + if (!context.isDeferredDependency({ + kind: HIRValue.Terminal, + value: block.terminal, + })) { + for (const place of eachTerminalOperand(block.terminal)) { + context.visitOperand(place); + } + } + } + }; + handleFunction(fn); + return context.deps; +} + +function buildDependencyInstructions(dep, env) { + const builder = new HIRBuilder(env, { + entryBlockKind: 'value', + }); + let dependencyValue; + if (dep.path.every(path => !path.optional)) { + dependencyValue = writeNonOptionalDependency(dep, env, builder); + } + else { + dependencyValue = writeOptionalDependency(dep, builder, null); + } + const exitBlockId = builder.terminate({ + kind: 'unsupported', + loc: GeneratedSource, + id: makeInstructionId(0), + }, null); + return { + place: { + kind: 'Identifier', + identifier: dependencyValue, + effect: Effect.Freeze, + reactive: dep.reactive, + loc: GeneratedSource, + }, + value: builder.build(), + exitBlockId, + }; +} +function writeNonOptionalDependency(dep, env, builder) { + const loc = dep.identifier.loc; + let curr = makeTemporaryIdentifier(env.nextIdentifierId, loc); + builder.push({ + lvalue: { + identifier: curr, + kind: 'Identifier', + effect: Effect.Mutate, + reactive: dep.reactive, + loc, + }, + value: { + kind: 'LoadLocal', + place: { + identifier: dep.identifier, + kind: 'Identifier', + effect: Effect.Freeze, + reactive: dep.reactive, + loc, + }, + loc, + }, + id: makeInstructionId(1), + loc: loc, + effects: null, + }); + for (const path of dep.path) { + const next = makeTemporaryIdentifier(env.nextIdentifierId, loc); + builder.push({ + lvalue: { + identifier: next, + kind: 'Identifier', + effect: Effect.Mutate, + reactive: dep.reactive, + loc, + }, + value: { + kind: 'PropertyLoad', + object: { + identifier: curr, + kind: 'Identifier', + effect: Effect.Freeze, + reactive: dep.reactive, + loc, + }, + property: path.property, + loc, + }, + id: makeInstructionId(1), + loc: loc, + effects: null, + }); + curr = next; + } + return curr; +} +function writeOptionalDependency(dep, builder, parentAlternate) { + const env = builder.environment; + const dependencyValue = { + kind: 'Identifier', + identifier: makeTemporaryIdentifier(env.nextIdentifierId, GeneratedSource), + effect: Effect.Mutate, + reactive: dep.reactive, + loc: GeneratedSource, + }; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + let alternate; + if (parentAlternate != null) { + alternate = parentAlternate; + } + else { + alternate = builder.enter('value', () => { + const temp = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc: GeneratedSource, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, dependencyValue) }, + value: Object.assign({}, temp), + type: null, + loc: GeneratedSource, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc: GeneratedSource, + }; + }); + } + const consequent = builder.reserve('value'); + let testIdentifier = null; + const testBlock = builder.enter('value', () => { + const testDependency = Object.assign(Object.assign({}, dep), { path: dep.path.slice(0, dep.path.length - 1) }); + const firstOptional = dep.path.findIndex(path => path.optional); + CompilerError.invariant(firstOptional !== -1, { + reason: '[ScopeDependencyUtils] Internal invariant broken: expected optional path', + description: null, + details: [ + { + kind: 'error', + loc: dep.identifier.loc, + message: null, + }, + ], + suggestions: null, + }); + if (firstOptional === dep.path.length - 1) { + testIdentifier = writeNonOptionalDependency(testDependency, env, builder); + } + else { + testIdentifier = writeOptionalDependency(testDependency, builder, alternate); + } + return { + kind: 'branch', + test: { + identifier: testIdentifier, + effect: Effect.Freeze, + kind: 'Identifier', + loc: GeneratedSource, + reactive: dep.reactive, + }, + consequent: consequent.id, + alternate, + id: makeInstructionId(0), + loc: GeneratedSource, + fallthrough: continuationBlock.id, + }; + }); + builder.enterReserved(consequent, () => { + CompilerError.invariant(testIdentifier !== null, { + reason: 'Satisfy type checker', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, dependencyValue) }, + value: lowerValueToTemporary(builder, { + kind: 'PropertyLoad', + object: { + identifier: testIdentifier, + kind: 'Identifier', + effect: Effect.Freeze, + reactive: dep.reactive, + loc: GeneratedSource, + }, + property: dep.path.at(-1).property, + loc: GeneratedSource, + }), + type: null, + loc: GeneratedSource, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc: GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'optional', + optional: dep.path.at(-1).optional, + test: testBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: GeneratedSource, + }, continuationBlock); + return dependencyValue.identifier; +} + +function inferEffectDependencies(fn) { + var _a, _b; + const fnExpressions = new Map(); + const autodepFnConfigs = new Map(); + for (const effectTarget of fn.env.config.inferEffectDependencies) { + const moduleTargets = getOrInsertWith(autodepFnConfigs, effectTarget.function.source, () => new Map()); + moduleTargets.set(effectTarget.function.importSpecifierName, effectTarget.autodepsIndex); + } + const autodepFnLoads = new Map(); + const autodepModuleLoads = new Map(); + const scopeInfos = new Map(); + const loadGlobals = new Set(); + const reactiveIds = inferReactiveIdentifiers(fn); + const rewriteBlocks = []; + for (const [, block] of fn.body.blocks) { + if (block.terminal.kind === 'scope') { + const scopeBlock = fn.body.blocks.get(block.terminal.block); + if (scopeBlock.instructions.length === 1 && + scopeBlock.terminal.kind === 'goto' && + scopeBlock.terminal.block === block.terminal.fallthrough) { + scopeInfos.set(block.terminal.scope.id, block.terminal.scope.dependencies); + } + } + const rewriteInstrs = []; + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'FunctionExpression') { + fnExpressions.set(lvalue.identifier.id, instr); + } + else if (value.kind === 'PropertyLoad') { + if (typeof value.property === 'string' && + autodepModuleLoads.has(value.object.identifier.id)) { + const moduleTargets = autodepModuleLoads.get(value.object.identifier.id); + const propertyName = value.property; + const numRequiredArgs = moduleTargets.get(propertyName); + if (numRequiredArgs != null) { + autodepFnLoads.set(lvalue.identifier.id, numRequiredArgs); + } + } + } + else if (value.kind === 'LoadGlobal') { + loadGlobals.add(lvalue.identifier.id); + if (value.binding.kind === 'ImportNamespace') { + const moduleTargets = autodepFnConfigs.get(value.binding.module); + if (moduleTargets != null) { + autodepModuleLoads.set(lvalue.identifier.id, moduleTargets); + } + } + if (value.binding.kind === 'ImportSpecifier' || + value.binding.kind === 'ImportDefault') { + const moduleTargets = autodepFnConfigs.get(value.binding.module); + if (moduleTargets != null) { + const importSpecifierName = value.binding.kind === 'ImportSpecifier' + ? value.binding.imported + : DEFAULT_EXPORT; + const numRequiredArgs = moduleTargets.get(importSpecifierName); + if (numRequiredArgs != null) { + autodepFnLoads.set(lvalue.identifier.id, numRequiredArgs); + } + } + } + } + else if (value.kind === 'CallExpression' || + value.kind === 'MethodCall') { + const callee = value.kind === 'CallExpression' ? value.callee : value.property; + const autodepsArgIndex = value.args.findIndex(arg => arg.kind === 'Identifier' && + arg.identifier.type.kind === 'Object' && + arg.identifier.type.shapeId === BuiltInAutodepsId); + const autodepsArgExpectedIndex = autodepFnLoads.get(callee.identifier.id); + if (value.args.length > 0 && + autodepsArgExpectedIndex != null && + autodepsArgIndex === autodepsArgExpectedIndex && + autodepFnLoads.has(callee.identifier.id) && + value.args[0].kind === 'Identifier') { + const effectDeps = []; + const deps = { + kind: 'ArrayExpression', + elements: effectDeps, + loc: GeneratedSource, + }; + const depsPlace = createTemporaryPlace(fn.env, GeneratedSource); + depsPlace.effect = Effect.Read; + const fnExpr = fnExpressions.get(value.args[0].identifier.id); + if (fnExpr != null) { + const scopeInfo = fnExpr.lvalue.identifier.scope != null + ? scopeInfos.get(fnExpr.lvalue.identifier.scope.id) + : null; + let minimalDeps; + if (scopeInfo != null) { + minimalDeps = new Set(scopeInfo); + } + else { + minimalDeps = inferMinimalDependencies(fnExpr); + } + const usedDeps = []; + for (const maybeDep of minimalDeps) { + if (((isUseRefType(maybeDep.identifier) || + isSetStateType(maybeDep.identifier)) && + !reactiveIds.has(maybeDep.identifier.id)) || + isFireFunctionType(maybeDep.identifier) || + isEffectEventFunctionType(maybeDep.identifier)) { + continue; + } + const dep = truncateDepAtCurrent(maybeDep); + const { place, value, exitBlockId } = buildDependencyInstructions(dep, fn.env); + rewriteInstrs.push({ + kind: 'block', + location: instr.id, + value, + exitBlockId: exitBlockId, + }); + effectDeps.push(place); + usedDeps.push(dep); + } + const decorations = []; + for (const loc of collectDepUsages(usedDeps, fnExpr.value)) { + if (typeof loc === 'symbol') { + continue; + } + decorations.push(loc); + } + if (typeof value.loc !== 'symbol') { + (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.logEvent(fn.env.filename, { + kind: 'AutoDepsDecorations', + fnLoc: value.loc, + decorations, + }); + } + rewriteInstrs.push({ + kind: 'instr', + location: instr.id, + value: { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: Object.assign(Object.assign({}, depsPlace), { effect: Effect.Mutate }), + value: deps, + effects: null, + }, + }); + value.args[autodepsArgIndex] = Object.assign(Object.assign({}, depsPlace), { effect: Effect.Freeze }); + fn.env.inferredEffectLocations.add(callee.loc); + } + else if (loadGlobals.has(value.args[0].identifier.id)) { + rewriteInstrs.push({ + kind: 'instr', + location: instr.id, + value: { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: Object.assign(Object.assign({}, depsPlace), { effect: Effect.Mutate }), + value: deps, + effects: null, + }, + }); + value.args[autodepsArgIndex] = Object.assign(Object.assign({}, depsPlace), { effect: Effect.Freeze }); + fn.env.inferredEffectLocations.add(callee.loc); + } + } + else if (value.args.length >= 2 && + value.args.length - 1 === autodepFnLoads.get(callee.identifier.id) && + value.args[0] != null && + value.args[0].kind === 'Identifier') { + const penultimateArg = value.args[value.args.length - 2]; + const depArrayArg = value.args[value.args.length - 1]; + if (depArrayArg.kind !== 'Spread' && + penultimateArg.kind !== 'Spread' && + typeof depArrayArg.loc !== 'symbol' && + typeof penultimateArg.loc !== 'symbol' && + typeof value.loc !== 'symbol') { + (_b = fn.env.logger) === null || _b === void 0 ? void 0 : _b.logEvent(fn.env.filename, { + kind: 'AutoDepsEligible', + fnLoc: value.loc, + depArrayLoc: Object.assign(Object.assign({}, depArrayArg.loc), { start: penultimateArg.loc.end, end: depArrayArg.loc.end }), + }); + } + } + } + } + rewriteSplices(block, rewriteInstrs, rewriteBlocks); + } + if (rewriteBlocks.length > 0) { + for (const block of rewriteBlocks) { + fn.body.blocks.set(block.id, block); + } + reversePostorderBlocks(fn.body); + markPredecessors(fn.body); + markInstructionIds(fn.body); + fixScopeAndIdentifierRanges(fn.body); + deadCodeElimination(fn); + fn.env.hasInferredEffect = true; + } +} +function truncateDepAtCurrent(dep) { + const idx = dep.path.findIndex(path => path.property === 'current'); + if (idx === -1) { + return dep; + } + else { + return Object.assign(Object.assign({}, dep), { path: dep.path.slice(0, idx) }); + } +} +function rewriteSplices(originalBlock, splices, rewriteBlocks) { + if (splices.length === 0) { + return; + } + const originalInstrs = originalBlock.instructions; + let currBlock = Object.assign(Object.assign({}, originalBlock), { instructions: [] }); + rewriteBlocks.push(currBlock); + let cursor = 0; + for (const rewrite of splices) { + while (originalInstrs[cursor].id < rewrite.location) { + CompilerError.invariant(originalInstrs[cursor].id < originalInstrs[cursor + 1].id, { + reason: '[InferEffectDependencies] Internal invariant broken: expected block instructions to be sorted', + description: null, + details: [ + { + kind: 'error', + loc: originalInstrs[cursor].loc, + message: null, + }, + ], + }); + currBlock.instructions.push(originalInstrs[cursor]); + cursor++; + } + CompilerError.invariant(originalInstrs[cursor].id === rewrite.location, { + reason: '[InferEffectDependencies] Internal invariant broken: splice location not found', + description: null, + details: [ + { + kind: 'error', + loc: originalInstrs[cursor].loc, + message: null, + }, + ], + }); + if (rewrite.kind === 'instr') { + currBlock.instructions.push(rewrite.value); + } + else if (rewrite.kind === 'block') { + const { entry, blocks } = rewrite.value; + const entryBlock = blocks.get(entry); + currBlock.instructions.push(...entryBlock.instructions); + if (blocks.size > 1) { + CompilerError.invariant(terminalFallthrough(entryBlock.terminal) === rewrite.exitBlockId, { + reason: '[InferEffectDependencies] Internal invariant broken: expected entry block to have a fallthrough', + description: null, + details: [ + { + kind: 'error', + loc: entryBlock.terminal.loc, + message: null, + }, + ], + }); + const originalTerminal = currBlock.terminal; + currBlock.terminal = entryBlock.terminal; + for (const [id, block] of blocks) { + if (id === entry) { + continue; + } + if (id === rewrite.exitBlockId) { + block.terminal = originalTerminal; + currBlock = block; + } + rewriteBlocks.push(block); + } + } + } + } + currBlock.instructions.push(...originalInstrs.slice(cursor)); +} +function inferReactiveIdentifiers(fn) { + const reactiveIds = new Set(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const place of eachInstructionOperand(instr)) { + if (place.reactive) { + reactiveIds.add(place.identifier.id); + } + } + } + for (const place of eachTerminalOperand(block.terminal)) { + if (place.reactive) { + reactiveIds.add(place.identifier.id); + } + } + } + return reactiveIds; +} +function collectDepUsages(deps, fnExpr) { + const identifiers = new Map(); + const loadedDeps = new Set(); + const sourceLocations = []; + for (const dep of deps) { + identifiers.set(dep.identifier.id, dep); + } + for (const [, block] of fnExpr.loweredFunc.func.body.blocks) { + for (const instr of block.instructions) { + if (instr.value.kind === 'LoadLocal' && + identifiers.has(instr.value.place.identifier.id)) { + loadedDeps.add(instr.lvalue.identifier.id); + } + for (const place of eachInstructionOperand(instr)) { + if (loadedDeps.has(place.identifier.id)) { + sourceLocations.push(place.identifier.loc); + } + } + } + } + return sourceLocations; +} +function inferMinimalDependencies(fnInstr) { + const fn = fnInstr.value.loweredFunc.func; + const temporaries = collectTemporariesSidemap$1(fn, new Set()); + const { hoistableObjects, processedInstrsInOptional, temporariesReadInOptional, } = collectOptionalChainSidemap(fn); + const hoistablePropertyLoads = collectHoistablePropertyLoadsInInnerFn(fnInstr, temporaries, hoistableObjects); + const hoistableToFnEntry = hoistablePropertyLoads.get(fn.body.entry); + CompilerError.invariant(hoistableToFnEntry != null, { + reason: '[InferEffectDependencies] Internal invariant broken: missing entry block', + description: null, + details: [ + { + kind: 'error', + loc: fnInstr.loc, + message: null, + }, + ], + }); + const dependencies = inferDependencies(fnInstr, new Map([...temporaries, ...temporariesReadInOptional]), processedInstrsInOptional); + const tree = new ReactiveScopeDependencyTreeHIR([...hoistableToFnEntry.assumedNonNullObjects].map(o => o.fullPath)); + for (const dep of dependencies) { + tree.addDependency(Object.assign({}, dep)); + } + return tree.deriveMinimalDependencies(); +} +function inferDependencies(fnInstr, temporaries, processedInstrsInOptional) { + const fn = fnInstr.value.loweredFunc.func; + const context = new DependencyCollectionContext(new Set(), temporaries, processedInstrsInOptional); + for (const dep of fn.context) { + context.declare(dep.identifier, { + id: makeInstructionId(0), + scope: empty(), + }); + } + const placeholderScope = { + id: makeScopeId(0), + range: { + start: fnInstr.id, + end: makeInstructionId(fnInstr.id + 1), + }, + dependencies: new Set(), + reassignments: new Set(), + declarations: new Map(), + earlyReturnValue: null, + merged: new Set(), + loc: GeneratedSource, + }; + context.enterScope(placeholderScope); + inferDependenciesInFn(fn, context, temporaries); + context.exitScope(placeholderScope, false); + const resultUnfiltered = context.deps.get(placeholderScope); + CompilerError.invariant(resultUnfiltered != null, { + reason: '[InferEffectDependencies] Internal invariant broken: missing scope dependencies', + description: null, + details: [ + { + kind: 'error', + loc: fn.loc, + message: null, + }, + ], + }); + const fnContext = new Set(fn.context.map(dep => dep.identifier.id)); + const result = new Set(); + for (const dep of resultUnfiltered) { + if (fnContext.has(dep.identifier.id)) { + result.add(dep); + } + } + return result; +} +function inferDependenciesInFn(fn, context, temporaries) { + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const operand of phi.operands) { + const maybeOptionalChain = temporaries.get(operand[1].identifier.id); + if (maybeOptionalChain) { + context.visitDependency(maybeOptionalChain); + } + } + } + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + context.declare(instr.lvalue.identifier, { + id: instr.id, + scope: context.currentScope, + }); + const innerFn = instr.value.loweredFunc.func; + context.enterInnerFn(instr, () => { + inferDependenciesInFn(innerFn, context, temporaries); + }); + } + else { + handleInstruction(instr, context); + } + } + } +} + +function instructionReordering(fn) { + var _a; + const shared = new Map(); + const references = findReferencedRangeOfTemporaries(fn); + for (const [, block] of fn.body.blocks) { + reorderBlock(fn.env, block, shared, references); + } + CompilerError.invariant(shared.size === 0, { + reason: `InstructionReordering: expected all reorderable nodes to have been emitted`, + description: null, + details: [ + { + kind: 'error', + loc: (_a = [...shared.values()] + .map(node => { var _a; return (_a = node.instruction) === null || _a === void 0 ? void 0 : _a.loc; }) + .filter(loc => loc != null)[0]) !== null && _a !== void 0 ? _a : GeneratedSource, + message: null, + }, + ], + }); + markInstructionIds(fn.body); +} +var ReferenceKind; +(function (ReferenceKind) { + ReferenceKind[ReferenceKind["Read"] = 0] = "Read"; + ReferenceKind[ReferenceKind["Write"] = 1] = "Write"; +})(ReferenceKind || (ReferenceKind = {})); +function findReferencedRangeOfTemporaries(fn) { + const singleUseIdentifiers = new Map(); + const lastAssignments = new Map(); + function reference(instr, place, kind) { + var _a; + if (place.identifier.name !== null && + place.identifier.name.kind === 'named') { + if (kind === ReferenceKind.Write) { + const name = place.identifier.name.value; + const previous = lastAssignments.get(name); + if (previous === undefined) { + lastAssignments.set(name, instr); + } + else { + lastAssignments.set(name, makeInstructionId(Math.max(previous, instr))); + } + } + return; + } + else if (kind === ReferenceKind.Read) { + const previousCount = (_a = singleUseIdentifiers.get(place.identifier.id)) !== null && _a !== void 0 ? _a : 0; + singleUseIdentifiers.set(place.identifier.id, previousCount + 1); + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const operand of eachInstructionValueLValue(instr.value)) { + reference(instr.id, operand, ReferenceKind.Read); + } + for (const lvalue of eachInstructionLValue(instr)) { + reference(instr.id, lvalue, ReferenceKind.Write); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + reference(block.terminal.id, operand, ReferenceKind.Read); + } + } + return { + singleUseIdentifiers: new Set([...singleUseIdentifiers] + .filter(([, count]) => count === 1) + .map(([id]) => id)), + lastAssignments, + }; +} +function reorderBlock(env, block, shared, references) { + var _a, _b; + const locals = new Map(); + const named = new Map(); + let previous = null; + for (const instr of block.instructions) { + const { lvalue, value } = instr; + const reorderability = getReorderability(instr, references); + const node = getOrInsertWith(locals, lvalue.identifier.id, () => ({ + instruction: instr, + dependencies: new Set(), + reorderability, + depth: null, + })); + if (reorderability === Reorderability.Nonreorderable) { + if (previous !== null) { + node.dependencies.add(previous); + } + previous = lvalue.identifier.id; + } + for (const operand of eachInstructionValueOperand(value)) { + const { name, id } = operand.identifier; + if (name !== null && name.kind === 'named') { + const previous = named.get(name.value); + if (previous !== undefined) { + node.dependencies.add(previous); + } + named.set(name.value, lvalue.identifier.id); + } + else if (locals.has(id) || shared.has(id)) { + node.dependencies.add(id); + } + } + for (const lvalueOperand of eachInstructionValueLValue(value)) { + const lvalueNode = getOrInsertWith(locals, lvalueOperand.identifier.id, () => ({ + instruction: null, + dependencies: new Set(), + depth: null, + })); + lvalueNode.dependencies.add(lvalue.identifier.id); + const name = lvalueOperand.identifier.name; + if (name !== null && name.kind === 'named') { + const previous = named.get(name.value); + if (previous !== undefined) { + node.dependencies.add(previous); + } + named.set(name.value, lvalue.identifier.id); + } + } + } + const nextInstructions = []; + if (isExpressionBlockKind(block.kind)) { + if (previous !== null) { + emit(env, locals, shared, nextInstructions, previous); + } + if (block.instructions.length !== 0) { + emit(env, locals, shared, nextInstructions, block.instructions.at(-1).lvalue.identifier.id); + } + for (const operand of eachTerminalOperand(block.terminal)) { + emit(env, locals, shared, nextInstructions, operand.identifier.id); + } + for (const [id, node] of locals) { + if (node.instruction == null) { + continue; + } + CompilerError.invariant(node.reorderability === Reorderability.Reorderable, { + reason: `Expected all remaining instructions to be reorderable`, + details: [ + { + kind: 'error', + loc: (_b = (_a = node.instruction) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : block.terminal.loc, + message: null, + }, + ], + description: node.instruction != null + ? `Instruction [${node.instruction.id}] was not emitted yet but is not reorderable` + : `Lvalue $${id} was not emitted yet but is not reorderable`, + }); + shared.set(id, node); + } + } + else { + for (const operand of eachTerminalOperand(block.terminal)) { + emit(env, locals, shared, nextInstructions, operand.identifier.id); + } + for (const id of Array.from(locals.keys()).reverse()) { + const node = locals.get(id); + if (node === undefined) { + continue; + } + if (node.reorderability === Reorderability.Reorderable) { + shared.set(id, node); + } + else { + emit(env, locals, shared, nextInstructions, id); + } + } + } + block.instructions = nextInstructions; +} +function getDepth(env, nodes, id) { + const node = nodes.get(id); + if (node == null) { + return 0; + } + if (node.depth != null) { + return node.depth; + } + node.depth = 0; + let depth = node.reorderability === Reorderability.Reorderable ? 1 : 10; + for (const dep of node.dependencies) { + depth += getDepth(env, nodes, dep); + } + node.depth = depth; + return depth; +} +function emit(env, locals, shared, instructions, id) { + var _a; + const node = (_a = locals.get(id)) !== null && _a !== void 0 ? _a : shared.get(id); + if (node == null) { + return; + } + locals.delete(id); + shared.delete(id); + const deps = [...node.dependencies]; + deps.sort((a, b) => { + const aDepth = getDepth(env, locals, a); + const bDepth = getDepth(env, locals, b); + return bDepth - aDepth; + }); + for (const dep of deps) { + emit(env, locals, shared, instructions, dep); + } + if (node.instruction !== null) { + instructions.push(node.instruction); + } +} +var Reorderability; +(function (Reorderability) { + Reorderability[Reorderability["Reorderable"] = 0] = "Reorderable"; + Reorderability[Reorderability["Nonreorderable"] = 1] = "Nonreorderable"; +})(Reorderability || (Reorderability = {})); +function getReorderability(instr, references) { + switch (instr.value.kind) { + case 'JsxExpression': + case 'JsxFragment': + case 'JSXText': + case 'LoadGlobal': + case 'Primitive': + case 'TemplateLiteral': + case 'BinaryExpression': + case 'UnaryExpression': { + return Reorderability.Reorderable; + } + case 'LoadLocal': { + const name = instr.value.place.identifier.name; + if (name !== null && name.kind === 'named') { + const lastAssignment = references.lastAssignments.get(name.value); + if (lastAssignment !== undefined && + lastAssignment < instr.id && + references.singleUseIdentifiers.has(instr.lvalue.identifier.id)) { + return Reorderability.Reorderable; + } + } + return Reorderability.Nonreorderable; + } + default: { + return Reorderability.Nonreorderable; + } + } +} + +function alignMethodCallScopes(fn) { + const scopeMapping = new Map(); + const mergedScopes = new DisjointSet(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + if (value.kind === 'MethodCall') { + const lvalueScope = lvalue.identifier.scope; + const propertyScope = value.property.identifier.scope; + if (lvalueScope !== null) { + if (propertyScope !== null) { + mergedScopes.union([lvalueScope, propertyScope]); + } + else { + scopeMapping.set(value.property.identifier.id, lvalueScope); + } + } + else if (propertyScope !== null) { + scopeMapping.set(value.property.identifier.id, null); + } + } + else if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + alignMethodCallScopes(value.loweredFunc.func); + } + } + } + mergedScopes.forEach((scope, root) => { + if (scope === root) { + return; + } + root.range.start = makeInstructionId(Math.min(scope.range.start, root.range.start)); + root.range.end = makeInstructionId(Math.max(scope.range.end, root.range.end)); + }); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const mappedScope = scopeMapping.get(instr.lvalue.identifier.id); + if (mappedScope !== undefined) { + instr.lvalue.identifier.scope = mappedScope; + } + else if (instr.lvalue.identifier.scope !== null) { + const mergedScope = mergedScopes.find(instr.lvalue.identifier.scope); + if (mergedScope != null) { + instr.lvalue.identifier.scope = mergedScope; + } + } + } + } +} + +function alignReactiveScopesToBlockScopesHIR(fn) { + var _a, _b, _c, _d, _e, _f, _g; + const activeBlockFallthroughRanges = []; + const activeScopes = new Set(); + const seen = new Set(); + const valueBlockNodes = new Map(); + const placeScopes = new Map(); + function recordPlace(id, place, node) { + if (place.identifier.scope !== null) { + placeScopes.set(place, place.identifier.scope); + } + const scope = getPlaceScope(id, place); + if (scope == null) { + return; + } + activeScopes.add(scope); + node === null || node === void 0 ? void 0 : node.children.push({ kind: 'scope', scope, id }); + if (seen.has(scope)) { + return; + } + seen.add(scope); + if (node != null && node.valueRange !== null) { + scope.range.start = makeInstructionId(Math.min(node.valueRange.start, scope.range.start)); + scope.range.end = makeInstructionId(Math.max(node.valueRange.end, scope.range.end)); + } + } + for (const [, block] of fn.body.blocks) { + const startingId = (_b = (_a = block.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : block.terminal.id; + retainWhere_Set(activeScopes, scope => scope.range.end > startingId); + const top = activeBlockFallthroughRanges.at(-1); + if ((top === null || top === void 0 ? void 0 : top.fallthrough) === block.id) { + activeBlockFallthroughRanges.pop(); + for (const scope of activeScopes) { + scope.range.start = makeInstructionId(Math.min(scope.range.start, top.range.start)); + } + } + const { instructions, terminal } = block; + const node = (_c = valueBlockNodes.get(block.id)) !== null && _c !== void 0 ? _c : null; + for (const instr of instructions) { + for (const lvalue of eachInstructionLValue(instr)) { + recordPlace(instr.id, lvalue, node); + } + for (const operand of eachInstructionValueOperand(instr.value)) { + recordPlace(instr.id, operand, node); + } + } + for (const operand of eachTerminalOperand(terminal)) { + recordPlace(terminal.id, operand, node); + } + const fallthrough = terminalFallthrough(terminal); + if (fallthrough !== null && terminal.kind !== 'branch') { + const fallthroughBlock = fn.body.blocks.get(fallthrough); + const nextId = (_e = (_d = fallthroughBlock.instructions[0]) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : fallthroughBlock.terminal.id; + for (const scope of activeScopes) { + if (scope.range.end > terminal.id) { + scope.range.end = makeInstructionId(Math.max(scope.range.end, nextId)); + } + } + activeBlockFallthroughRanges.push({ + fallthrough, + range: { + start: terminal.id, + end: nextId, + }, + }); + CompilerError.invariant(!valueBlockNodes.has(fallthrough), { + reason: 'Expect hir blocks to have unique fallthroughs', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + if (node != null) { + valueBlockNodes.set(fallthrough, node); + } + } + else if (terminal.kind === 'goto') { + const start = activeBlockFallthroughRanges.find(range => range.fallthrough === terminal.block); + if (start != null && start !== activeBlockFallthroughRanges.at(-1)) { + const fallthroughBlock = fn.body.blocks.get(start.fallthrough); + const firstId = (_g = (_f = fallthroughBlock.instructions[0]) === null || _f === void 0 ? void 0 : _f.id) !== null && _g !== void 0 ? _g : fallthroughBlock.terminal.id; + for (const scope of activeScopes) { + if (scope.range.end <= terminal.id) { + continue; + } + scope.range.start = makeInstructionId(Math.min(start.range.start, scope.range.start)); + scope.range.end = makeInstructionId(Math.max(firstId, scope.range.end)); + } + } + } + mapTerminalSuccessors(terminal, successor => { + var _a, _b; + if (valueBlockNodes.has(successor)) { + return successor; + } + const successorBlock = fn.body.blocks.get(successor); + if (successorBlock.kind === 'block' || successorBlock.kind === 'catch') ; + else if (node == null || + terminal.kind === 'ternary' || + terminal.kind === 'logical' || + terminal.kind === 'optional') { + let valueRange; + if (node == null) { + CompilerError.invariant(fallthrough !== null, { + reason: `Expected a fallthrough for value block`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + const fallthroughBlock = fn.body.blocks.get(fallthrough); + const nextId = (_b = (_a = fallthroughBlock.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : fallthroughBlock.terminal.id; + valueRange = { + start: terminal.id, + end: nextId, + }; + } + else { + valueRange = node.valueRange; + } + const childNode = { + kind: 'node', + id: terminal.id, + children: [], + valueRange, + }; + node === null || node === void 0 ? void 0 : node.children.push(childNode); + valueBlockNodes.set(successor, childNode); + } + else { + valueBlockNodes.set(successor, node); + } + return successor; + }); + } +} + +function flattenReactiveLoopsHIR(fn) { + const activeLoops = Array(); + for (const [, block] of fn.body.blocks) { + retainWhere(activeLoops, id => id !== block.id); + const { terminal } = block; + switch (terminal.kind) { + case 'do-while': + case 'for': + case 'for-in': + case 'for-of': + case 'while': { + activeLoops.push(terminal.fallthrough); + break; + } + case 'scope': { + if (activeLoops.length !== 0) { + block.terminal = { + kind: 'pruned-scope', + block: terminal.block, + fallthrough: terminal.fallthrough, + id: terminal.id, + loc: terminal.loc, + scope: terminal.scope, + }; + } + break; + } + case 'branch': + case 'goto': + case 'if': + case 'label': + case 'logical': + case 'maybe-throw': + case 'optional': + case 'pruned-scope': + case 'return': + case 'sequence': + case 'switch': + case 'ternary': + case 'throw': + case 'try': + case 'unreachable': + case 'unsupported': { + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } + } +} + +function flattenScopesWithHooksOrUseHIR(fn) { + const activeScopes = []; + const prune = []; + for (const [, block] of fn.body.blocks) { + retainWhere(activeScopes, current => current.fallthrough !== block.id); + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'MethodCall': + case 'CallExpression': { + const callee = value.kind === 'MethodCall' ? value.property : value.callee; + if (getHookKind(fn.env, callee.identifier) != null || + isUseOperator(callee.identifier)) { + prune.push(...activeScopes.map(entry => entry.block)); + activeScopes.length = 0; + } + } + } + } + if (block.terminal.kind === 'scope') { + activeScopes.push({ + block: block.id, + fallthrough: block.terminal.fallthrough, + }); + } + } + for (const id of prune) { + const block = fn.body.blocks.get(id); + const terminal = block.terminal; + CompilerError.invariant(terminal.kind === 'scope', { + reason: `Expected block to have a scope terminal`, + description: `Expected block bb${block.id} to end in a scope terminal`, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + const body = fn.body.blocks.get(terminal.block); + if (body.instructions.length === 1 && + body.terminal.kind === 'goto' && + body.terminal.block === terminal.fallthrough) { + block.terminal = { + kind: 'label', + block: terminal.block, + fallthrough: terminal.fallthrough, + id: terminal.id, + loc: terminal.loc, + }; + continue; + } + block.terminal = { + kind: 'pruned-scope', + block: terminal.block, + fallthrough: terminal.fallthrough, + id: terminal.id, + loc: terminal.loc, + scope: terminal.scope, + }; + } +} + +function pruneAlwaysInvalidatingScopes(fn) { + visitReactiveFunction(fn, new Transform(), false); +} +class Transform extends ReactiveFunctionTransform { + constructor() { + super(...arguments); + this.alwaysInvalidatingValues = new Set(); + this.unmemoizedValues = new Set(); + } + transformInstruction(instruction, withinScope) { + this.visitInstruction(instruction, withinScope); + const { lvalue, value } = instruction; + switch (value.kind) { + case 'ArrayExpression': + case 'ObjectExpression': + case 'JsxExpression': + case 'JsxFragment': + case 'NewExpression': { + if (lvalue !== null) { + this.alwaysInvalidatingValues.add(lvalue.identifier); + if (!withinScope) { + this.unmemoizedValues.add(lvalue.identifier); + } + } + break; + } + case 'StoreLocal': { + if (this.alwaysInvalidatingValues.has(value.value.identifier)) { + this.alwaysInvalidatingValues.add(value.lvalue.place.identifier); + } + if (this.unmemoizedValues.has(value.value.identifier)) { + this.unmemoizedValues.add(value.lvalue.place.identifier); + } + break; + } + case 'LoadLocal': { + if (lvalue !== null && + this.alwaysInvalidatingValues.has(value.place.identifier)) { + this.alwaysInvalidatingValues.add(lvalue.identifier); + } + if (lvalue !== null && + this.unmemoizedValues.has(value.place.identifier)) { + this.unmemoizedValues.add(lvalue.identifier); + } + break; + } + } + return { kind: 'keep' }; + } + transformScope(scopeBlock, _withinScope) { + this.visitScope(scopeBlock, true); + for (const dep of scopeBlock.scope.dependencies) { + if (this.unmemoizedValues.has(dep.identifier)) { + for (const [_, decl] of scopeBlock.scope.declarations) { + if (this.alwaysInvalidatingValues.has(decl.identifier)) { + this.unmemoizedValues.add(decl.identifier); + } + } + for (const identifier of scopeBlock.scope.reassignments) { + if (this.alwaysInvalidatingValues.has(identifier)) { + this.unmemoizedValues.add(identifier); + } + } + return { + kind: 'replace', + value: { + kind: 'pruned-scope', + scope: scopeBlock.scope, + instructions: scopeBlock.instructions, + }, + }; + } + } + return { kind: 'keep' }; + } +} + +let Visitor$2 = class Visitor extends ReactiveFunctionVisitor { + constructor(env, aliases, paths) { + super(); + this.map = new Map(); + this.aliases = aliases; + this.paths = paths; + this.env = env; + } + join(values) { + function join2(l, r) { + if (l === 'Update' || r === 'Update') { + return 'Update'; + } + else if (l === 'Create' || r === 'Create') { + return 'Create'; + } + else if (l === 'Unknown' || r === 'Unknown') { + return 'Unknown'; + } + assertExhaustive$1(r, `Unhandled variable kind ${r}`); + } + return values.reduce(join2, 'Unknown'); + } + isCreateOnlyHook(id) { + return isUseStateType(id) || isUseRefType(id); + } + visitPlace(_, place, state) { + var _a; + this.map.set(place.identifier.id, this.join([state, (_a = this.map.get(place.identifier.id)) !== null && _a !== void 0 ? _a : 'Unknown'])); + } + visitBlock(block, state) { + super.visitBlock([...block].reverse(), state); + } + visitInstruction(instruction) { + const state = this.join([...eachInstructionLValue(instruction)].map(operand => { var _a; return (_a = this.map.get(operand.identifier.id)) !== null && _a !== void 0 ? _a : 'Unknown'; })); + const visitCallOrMethodNonArgs = () => { + switch (instruction.value.kind) { + case 'CallExpression': { + this.visitPlace(instruction.id, instruction.value.callee, state); + break; + } + case 'MethodCall': { + this.visitPlace(instruction.id, instruction.value.property, state); + this.visitPlace(instruction.id, instruction.value.receiver, state); + break; + } + } + }; + const isHook = () => { + let callee = null; + switch (instruction.value.kind) { + case 'CallExpression': { + callee = instruction.value.callee.identifier; + break; + } + case 'MethodCall': { + callee = instruction.value.property.identifier; + break; + } + } + return callee != null && getHookKind(this.env, callee) != null; + }; + switch (instruction.value.kind) { + case 'CallExpression': + case 'MethodCall': { + if (instruction.lvalue && + this.isCreateOnlyHook(instruction.lvalue.identifier)) { + [...eachCallArgument(instruction.value.args)].forEach(operand => this.visitPlace(instruction.id, operand, 'Create')); + visitCallOrMethodNonArgs(); + } + else { + this.traverseInstruction(instruction, isHook() ? 'Update' : state); + } + break; + } + default: { + this.traverseInstruction(instruction, state); + } + } + } + visitScope(scope) { + const state = this.join([ + ...scope.scope.declarations.keys(), + ...[...scope.scope.reassignments.values()].map(ident => ident.id), + ].map(id => { var _a; return (_a = this.map.get(id)) !== null && _a !== void 0 ? _a : 'Unknown'; })); + super.visitScope(scope, state); + [...scope.scope.dependencies].forEach(ident => { + var _a; + let target = (_a = this.aliases.find(ident.identifier.id)) !== null && _a !== void 0 ? _a : ident.identifier.id; + ident.path.forEach(token => { + var _a; + target && (target = (_a = this.paths.get(target)) === null || _a === void 0 ? void 0 : _a.get(token.property)); + }); + if (target && this.map.get(target) === 'Create') { + scope.scope.dependencies.delete(ident); + } + }); + } + visitTerminal(stmt, state) { + CompilerError.invariant(state !== 'Create', { + reason: "Visiting a terminal statement with state 'Create'", + description: null, + details: [ + { + kind: 'error', + loc: stmt.terminal.loc, + message: null, + }, + ], + }); + super.visitTerminal(stmt, state); + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + visitReactiveFunction(fn, this, state); + } +}; +function pruneInitializationDependencies(fn) { + const [aliases, paths] = getAliases(fn); + visitReactiveFunction(fn, new Visitor$2(fn.env, aliases, paths), 'Update'); +} +function update(map, key, path, value) { + var _a; + const inner = (_a = map.get(key)) !== null && _a !== void 0 ? _a : new Map(); + inner.set(path, value); + map.set(key, inner); +} +class AliasVisitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.scopeIdentifiers = new DisjointSet(); + this.scopePaths = new Map(); + } + visitInstruction(instr) { + if (instr.value.kind === 'StoreLocal' || + instr.value.kind === 'StoreContext') { + this.scopeIdentifiers.union([ + instr.value.lvalue.place.identifier.id, + instr.value.value.identifier.id, + ]); + } + else if (instr.value.kind === 'LoadLocal' || + instr.value.kind === 'LoadContext') { + instr.lvalue && + this.scopeIdentifiers.union([ + instr.lvalue.identifier.id, + instr.value.place.identifier.id, + ]); + } + else if (instr.value.kind === 'PropertyLoad') { + instr.lvalue && + update(this.scopePaths, instr.value.object.identifier.id, instr.value.property, instr.lvalue.identifier.id); + } + else if (instr.value.kind === 'PropertyStore') { + update(this.scopePaths, instr.value.object.identifier.id, instr.value.property, instr.value.value.identifier.id); + } + } +} +function getAliases(fn) { + var _a, _b; + const visitor = new AliasVisitor(); + visitReactiveFunction(fn, visitor, null); + let disjoint = visitor.scopeIdentifiers; + let scopePaths = new Map(); + for (const [key, value] of visitor.scopePaths) { + for (const [path, id] of value) { + update(scopePaths, (_a = disjoint.find(key)) !== null && _a !== void 0 ? _a : key, path, (_b = disjoint.find(id)) !== null && _b !== void 0 ? _b : id); + } + } + return [disjoint, scopePaths]; +} + +function isPrimitiveBinaryOp(op) { + switch (op) { + case '+': + case '-': + case '/': + case '%': + case '*': + case '**': + case '&': + case '|': + case '>>': + case '<<': + case '^': + case '>': + case '<': + case '>=': + case '<=': + case '|>': + return true; + default: + return false; + } +} +function inferTypes(func) { + const unifier = new Unifier(func.env); + for (const e of generate(func)) { + unifier.unify(e.left, e.right); + } + apply(func, unifier); +} +function apply(func, unifier) { + for (const [_, block] of func.body.blocks) { + for (const phi of block.phis) { + phi.place.identifier.type = unifier.get(phi.place.identifier.type); + } + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + operand.identifier.type = unifier.get(operand.identifier.type); + } + for (const place of eachInstructionOperand(instr)) { + place.identifier.type = unifier.get(place.identifier.type); + } + const { lvalue, value } = instr; + lvalue.identifier.type = unifier.get(lvalue.identifier.type); + if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + apply(value.loweredFunc.func, unifier); + } + } + } + const returns = func.returns.identifier; + returns.type = unifier.get(returns.type); +} +function equation(left, right) { + return { + left, + right, + }; +} +function* generate(func) { + if (func.fnType === 'Component') { + const [props, ref] = func.params; + if (props && props.kind === 'Identifier') { + yield equation(props.identifier.type, { + kind: 'Object', + shapeId: BuiltInPropsId, + }); + } + if (ref && ref.kind === 'Identifier') { + yield equation(ref.identifier.type, { + kind: 'Object', + shapeId: BuiltInUseRefId, + }); + } + } + const names = new Map(); + const returnTypes = []; + for (const [_, block] of func.body.blocks) { + for (const phi of block.phis) { + yield equation(phi.place.identifier.type, { + kind: 'Phi', + operands: [...phi.operands.values()].map(id => id.identifier.type), + }); + } + for (const instr of block.instructions) { + yield* generateInstructionTypes(func.env, names, instr); + } + const terminal = block.terminal; + if (terminal.kind === 'return') { + returnTypes.push(terminal.value.identifier.type); + } + } + if (returnTypes.length > 1) { + yield equation(func.returns.identifier.type, { + kind: 'Phi', + operands: returnTypes, + }); + } + else if (returnTypes.length === 1) { + yield equation(func.returns.identifier.type, returnTypes[0]); + } +} +function setName(names, id, name) { + var _a; + if (((_a = name.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named') { + names.set(id, name.name.value); + } +} +function getName(names, id) { + var _a; + return (_a = names.get(id)) !== null && _a !== void 0 ? _a : ''; +} +function* generateInstructionTypes(env, names, instr) { + const { lvalue, value } = instr; + const left = lvalue.identifier.type; + switch (value.kind) { + case 'TemplateLiteral': + case 'JSXText': + case 'Primitive': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'UnaryExpression': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'LoadLocal': { + setName(names, lvalue.identifier.id, value.place.identifier); + yield equation(left, value.place.identifier.type); + break; + } + case 'DeclareContext': + case 'LoadContext': { + break; + } + case 'StoreContext': { + if (value.lvalue.kind === InstructionKind.Const) { + yield equation(value.lvalue.place.identifier.type, value.value.identifier.type); + } + break; + } + case 'StoreLocal': { + if (env.config.enableUseTypeAnnotations) { + yield equation(value.lvalue.place.identifier.type, value.value.identifier.type); + const valueType = value.type === null ? makeType() : lowerType(value.type); + yield equation(valueType, value.lvalue.place.identifier.type); + yield equation(left, valueType); + } + else { + yield equation(left, value.value.identifier.type); + yield equation(value.lvalue.place.identifier.type, value.value.identifier.type); + } + break; + } + case 'StoreGlobal': { + yield equation(left, value.value.identifier.type); + break; + } + case 'BinaryExpression': { + if (isPrimitiveBinaryOp(value.operator)) { + yield equation(value.left.identifier.type, { kind: 'Primitive' }); + yield equation(value.right.identifier.type, { kind: 'Primitive' }); + } + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + yield equation(value.value.identifier.type, { kind: 'Primitive' }); + yield equation(value.lvalue.identifier.type, { kind: 'Primitive' }); + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'LoadGlobal': { + const globalType = env.getGlobalDeclaration(value.binding, value.loc); + if (globalType) { + yield equation(left, globalType); + } + break; + } + case 'CallExpression': { + const returnType = makeType(); + let shapeId = null; + if (env.config.enableTreatSetIdentifiersAsStateSetters) { + const name = getName(names, value.callee.identifier.id); + if (name.startsWith('set')) { + shapeId = BuiltInSetStateId; + } + } + yield equation(value.callee.identifier.type, { + kind: 'Function', + shapeId, + return: returnType, + isConstructor: false, + }); + yield equation(left, returnType); + break; + } + case 'TaggedTemplateExpression': { + const returnType = makeType(); + yield equation(value.tag.identifier.type, { + kind: 'Function', + shapeId: null, + return: returnType, + isConstructor: false, + }); + yield equation(left, returnType); + break; + } + case 'ObjectExpression': { + for (const property of value.properties) { + if (property.kind === 'ObjectProperty' && + property.key.kind === 'computed') { + yield equation(property.key.name.identifier.type, { + kind: 'Primitive', + }); + } + } + yield equation(left, { kind: 'Object', shapeId: BuiltInObjectId }); + break; + } + case 'ArrayExpression': { + yield equation(left, { kind: 'Object', shapeId: BuiltInArrayId }); + break; + } + case 'PropertyLoad': { + yield equation(left, { + kind: 'Property', + objectType: value.object.identifier.type, + objectName: getName(names, value.object.identifier.id), + propertyName: { + kind: 'literal', + value: value.property, + }, + }); + break; + } + case 'ComputedLoad': { + yield equation(left, { + kind: 'Property', + objectType: value.object.identifier.type, + objectName: getName(names, value.object.identifier.id), + propertyName: { + kind: 'computed', + value: value.property.identifier.type, + }, + }); + break; + } + case 'MethodCall': { + const returnType = makeType(); + yield equation(value.property.identifier.type, { + kind: 'Function', + return: returnType, + shapeId: null, + isConstructor: false, + }); + yield equation(left, returnType); + break; + } + case 'Destructure': { + const pattern = value.lvalue.pattern; + if (pattern.kind === 'ArrayPattern') { + for (let i = 0; i < pattern.items.length; i++) { + const item = pattern.items[i]; + if (item.kind === 'Identifier') { + const propertyName = String(i); + yield equation(item.identifier.type, { + kind: 'Property', + objectType: value.value.identifier.type, + objectName: getName(names, value.value.identifier.id), + propertyName: { + kind: 'literal', + value: makePropertyLiteral(propertyName), + }, + }); + } + else if (item.kind === 'Spread') { + yield equation(item.place.identifier.type, { + kind: 'Object', + shapeId: BuiltInArrayId, + }); + } + else { + break; + } + } + } + else { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + if (property.key.kind === 'identifier' || + property.key.kind === 'string') { + yield equation(property.place.identifier.type, { + kind: 'Property', + objectType: value.value.identifier.type, + objectName: getName(names, value.value.identifier.id), + propertyName: { + kind: 'literal', + value: makePropertyLiteral(property.key.name), + }, + }); + } + } + } + } + break; + } + case 'TypeCastExpression': { + if (env.config.enableUseTypeAnnotations) { + yield equation(value.type, value.value.identifier.type); + yield equation(left, value.type); + } + else { + yield equation(left, value.value.identifier.type); + } + break; + } + case 'PropertyDelete': + case 'ComputedDelete': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'FunctionExpression': { + yield* generate(value.loweredFunc.func); + yield equation(left, { + kind: 'Function', + shapeId: BuiltInFunctionId, + return: value.loweredFunc.func.returns.identifier.type, + isConstructor: false, + }); + break; + } + case 'NextPropertyOf': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'ObjectMethod': { + yield* generate(value.loweredFunc.func); + yield equation(left, { kind: 'ObjectMethod' }); + break; + } + case 'JsxExpression': + case 'JsxFragment': { + if (env.config.enableTreatRefLikeIdentifiersAsRefs) { + if (value.kind === 'JsxExpression') { + for (const prop of value.props) { + if (prop.kind === 'JsxAttribute' && prop.name === 'ref') { + yield equation(prop.place.identifier.type, { + kind: 'Object', + shapeId: BuiltInUseRefId, + }); + } + } + } + } + yield equation(left, { kind: 'Object', shapeId: BuiltInJsxId }); + break; + } + case 'NewExpression': { + const returnType = makeType(); + yield equation(value.callee.identifier.type, { + kind: 'Function', + return: returnType, + shapeId: null, + isConstructor: true, + }); + yield equation(left, returnType); + break; + } + case 'PropertyStore': { + yield equation(makeType(), { + kind: 'Property', + objectType: value.object.identifier.type, + objectName: getName(names, value.object.identifier.id), + propertyName: { + kind: 'literal', + value: value.property, + }, + }); + break; + } + case 'DeclareLocal': + case 'RegExpLiteral': + case 'MetaProperty': + case 'ComputedStore': + case 'Await': + case 'GetIterator': + case 'IteratorNext': + case 'UnsupportedNode': + case 'Debugger': + case 'FinishMemoize': + case 'StartMemoize': { + break; + } + default: + assertExhaustive$1(value, `Unhandled instruction value kind: ${value.kind}`); + } +} +class Unifier { + constructor(env) { + this.substitutions = new Map(); + this.env = env; + } + unify(tA, tB) { + if (tB.kind === 'Property') { + if (this.env.config.enableTreatRefLikeIdentifiersAsRefs && + isRefLikeName(tB)) { + this.unify(tB.objectType, { + kind: 'Object', + shapeId: BuiltInUseRefId, + }); + this.unify(tA, { + kind: 'Object', + shapeId: BuiltInRefValueId, + }); + return; + } + const objectType = this.get(tB.objectType); + const propertyType = tB.propertyName.kind === 'literal' + ? this.env.getPropertyType(objectType, tB.propertyName.value) + : this.env.getFallthroughPropertyType(objectType, tB.propertyName.value); + if (propertyType !== null) { + this.unify(tA, propertyType); + } + return; + } + if (typeEquals(tA, tB)) { + return; + } + if (tA.kind === 'Type') { + this.bindVariableTo(tA, tB); + return; + } + if (tB.kind === 'Type') { + this.bindVariableTo(tB, tA); + return; + } + if (tB.kind === 'Function' && + tA.kind === 'Function' && + tA.isConstructor === tB.isConstructor) { + this.unify(tA.return, tB.return); + return; + } + } + bindVariableTo(v, type) { + if (type.kind === 'Poly') { + return; + } + if (this.substitutions.has(v.id)) { + this.unify(this.substitutions.get(v.id), type); + return; + } + if (type.kind === 'Type' && this.substitutions.has(type.id)) { + this.unify(v, this.substitutions.get(type.id)); + return; + } + if (type.kind === 'Phi') { + CompilerError.invariant(type.operands.length > 0, { + reason: 'there should be at least one operand', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + let candidateType = null; + for (const operand of type.operands) { + const resolved = this.get(operand); + if (candidateType === null) { + candidateType = resolved; + } + else if (!typeEquals(resolved, candidateType)) { + const unionType = tryUnionTypes(resolved, candidateType); + if (unionType === null) { + candidateType = null; + break; + } + else { + candidateType = unionType; + } + } + } + if (candidateType !== null) { + this.unify(v, candidateType); + return; + } + } + if (this.occursCheck(v, type)) { + const resolvedType = this.tryResolveType(v, type); + if (resolvedType !== null) { + this.substitutions.set(v.id, resolvedType); + return; + } + throw new Error('cycle detected'); + } + this.substitutions.set(v.id, type); + } + tryResolveType(v, type) { + switch (type.kind) { + case 'Phi': { + const operands = []; + for (const operand of type.operands) { + if (operand.kind === 'Type' && operand.id === v.id) { + continue; + } + const resolved = this.tryResolveType(v, operand); + if (resolved === null) { + return null; + } + operands.push(resolved); + } + return { kind: 'Phi', operands }; + } + case 'Type': { + const substitution = this.get(type); + if (substitution !== type) { + const resolved = this.tryResolveType(v, substitution); + if (resolved !== null) { + this.substitutions.set(type.id, resolved); + } + return resolved; + } + return type; + } + case 'Property': { + const objectType = this.tryResolveType(v, this.get(type.objectType)); + if (objectType === null) { + return null; + } + return { + kind: 'Property', + objectName: type.objectName, + objectType, + propertyName: type.propertyName, + }; + } + case 'Function': { + const returnType = this.tryResolveType(v, this.get(type.return)); + if (returnType === null) { + return null; + } + return { + kind: 'Function', + return: returnType, + shapeId: type.shapeId, + isConstructor: type.isConstructor, + }; + } + case 'ObjectMethod': + case 'Object': + case 'Primitive': + case 'Poly': { + return type; + } + default: { + assertExhaustive$1(type, `Unexpected type kind '${type.kind}'`); + } + } + } + occursCheck(v, type) { + if (typeEquals(v, type)) + return true; + if (type.kind === 'Type' && this.substitutions.has(type.id)) { + return this.occursCheck(v, this.substitutions.get(type.id)); + } + if (type.kind === 'Phi') { + return type.operands.some(o => this.occursCheck(v, o)); + } + if (type.kind === 'Function') { + return this.occursCheck(v, type.return); + } + return false; + } + get(type) { + if (type.kind === 'Type') { + if (this.substitutions.has(type.id)) { + return this.get(this.substitutions.get(type.id)); + } + } + if (type.kind === 'Phi') { + return { kind: 'Phi', operands: type.operands.map(o => this.get(o)) }; + } + if (type.kind === 'Function') { + return { + kind: 'Function', + isConstructor: type.isConstructor, + shapeId: type.shapeId, + return: this.get(type.return), + }; + } + return type; + } +} +const RefLikeNameRE = /^(?:[a-zA-Z$_][a-zA-Z$_0-9]*)Ref$|^ref$/; +function isRefLikeName(t) { + return (t.propertyName.kind === 'literal' && + RefLikeNameRE.test(t.objectName) && + t.propertyName.value === 'current'); +} +function tryUnionTypes(ty1, ty2) { + let readonlyType; + let otherType; + if (ty1.kind === 'Object' && ty1.shapeId === BuiltInMixedReadonlyId) { + readonlyType = ty1; + otherType = ty2; + } + else if (ty2.kind === 'Object' && ty2.shapeId === BuiltInMixedReadonlyId) { + readonlyType = ty2; + otherType = ty1; + } + else { + return null; + } + if (otherType.kind === 'Primitive') { + return readonlyType; + } + else if (otherType.kind === 'Object' && + otherType.shapeId === BuiltInArrayId) { + return otherType; + } + return null; +} + +function validateContextVariableLValues(fn) { + const identifierKinds = new Map(); + validateContextVariableLValuesImpl(fn, identifierKinds); +} +function validateContextVariableLValuesImpl(fn, identifierKinds) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'DeclareContext': + case 'StoreContext': { + visit(identifierKinds, value.lvalue.place, 'context'); + break; + } + case 'LoadContext': { + visit(identifierKinds, value.place, 'context'); + break; + } + case 'StoreLocal': + case 'DeclareLocal': { + visit(identifierKinds, value.lvalue.place, 'local'); + break; + } + case 'LoadLocal': { + visit(identifierKinds, value.place, 'local'); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + visit(identifierKinds, value.lvalue, 'local'); + break; + } + case 'Destructure': { + for (const lvalue of eachPatternOperand(value.lvalue.pattern)) { + visit(identifierKinds, lvalue, 'destructure'); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + validateContextVariableLValuesImpl(value.loweredFunc.func, identifierKinds); + break; + } + default: { + for (const _ of eachInstructionValueLValue(value)) { + CompilerError.throwTodo({ + reason: 'ValidateContextVariableLValues: unhandled instruction variant', + loc: value.loc, + description: `Handle '${value.kind} lvalues`, + suggestions: null, + }); + } + } + } + } + } +} +function visit(identifiers, place, kind) { + const prev = identifiers.get(place.identifier.id); + if (prev !== undefined) { + const wasContext = prev.kind === 'context'; + const isContext = kind === 'context'; + if (wasContext !== isContext) { + if (prev.kind === 'destructure' || kind === 'destructure') { + CompilerError.throwTodo({ + reason: `Support destructuring of context variables`, + loc: kind === 'destructure' ? place.loc : prev.place.loc, + description: null, + suggestions: null, + }); + } + CompilerError.invariant(false, { + reason: 'Expected all references to a variable to be consistently local or context references', + description: `Identifier ${printPlace(place)} is referenced as a ${kind} variable, but was previously referenced as a ${prev.kind} variable`, + suggestions: null, + details: [ + { + kind: 'error', + loc: place.loc, + message: `this is ${prev.kind}`, + }, + ], + }); + } + } + identifiers.set(place.identifier.id, { place, kind }); +} + +function computeUnconditionalBlocks(fn) { + const unconditionalBlocks = new Set(); + const dominators = computePostDominatorTree(fn, { + includeThrowsAsExitNode: false, + }); + const exit = dominators.exit; + let current = fn.body.entry; + while (current !== null && current !== exit) { + CompilerError.invariant(!unconditionalBlocks.has(current), { + reason: 'Internal error: non-terminating loop in ComputeUnconditionalBlocks', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + unconditionalBlocks.add(current); + current = dominators.get(current); + } + return unconditionalBlocks; +} + +var Kind; +(function (Kind) { + Kind["Error"] = "Error"; + Kind["KnownHook"] = "KnownHook"; + Kind["PotentialHook"] = "PotentialHook"; + Kind["Global"] = "Global"; + Kind["Local"] = "Local"; +})(Kind || (Kind = {})); +function joinKinds(a, b) { + if (a === Kind.Error || b === Kind.Error) { + return Kind.Error; + } + else if (a === Kind.KnownHook || b === Kind.KnownHook) { + return Kind.KnownHook; + } + else if (a === Kind.PotentialHook || b === Kind.PotentialHook) { + return Kind.PotentialHook; + } + else if (a === Kind.Global || b === Kind.Global) { + return Kind.Global; + } + else { + return Kind.Local; + } +} +function validateHooksUsage(fn) { + const unconditionalBlocks = computeUnconditionalBlocks(fn); + const errors = new CompilerError(); + const errorsByPlace = new Map(); + function recordError(loc, errorDetail) { + if (typeof loc === 'symbol') { + errors.pushErrorDetail(errorDetail); + } + else { + errorsByPlace.set(loc, errorDetail); + } + } + function recordConditionalHookError(place) { + setKind(place, Kind.Error); + const reason = 'Hooks must always be called in a consistent order, and may not be called conditionally. See the Rules of Hooks (https://react.dev/warnings/invalid-hook-call-warning)'; + const previousError = typeof place.loc !== 'symbol' ? errorsByPlace.get(place.loc) : undefined; + if (previousError === undefined || previousError.reason !== reason) { + recordError(place.loc, new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + description: null, + reason, + loc: place.loc, + suggestions: null, + })); + } + } + function recordInvalidHookUsageError(place) { + const previousError = typeof place.loc !== 'symbol' ? errorsByPlace.get(place.loc) : undefined; + if (previousError === undefined) { + recordError(place.loc, new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + description: null, + reason: 'Hooks may not be referenced as normal values, they must be called. See https://react.dev/reference/rules/react-calls-components-and-hooks#never-pass-around-hooks-as-regular-values', + loc: place.loc, + suggestions: null, + })); + } + } + function recordDynamicHookUsageError(place) { + const previousError = typeof place.loc !== 'symbol' ? errorsByPlace.get(place.loc) : undefined; + if (previousError === undefined) { + recordError(place.loc, new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + description: null, + reason: 'Hooks must be the same function on every render, but this value may change over time to a different function. See https://react.dev/reference/rules/react-calls-components-and-hooks#dont-dynamically-use-hooks', + loc: place.loc, + suggestions: null, + })); + } + } + const valueKinds = new Map(); + function getKindForPlace(place) { + const knownKind = valueKinds.get(place.identifier.id); + if (place.identifier.name !== null && + isHookName$2(place.identifier.name.value)) { + return joinKinds(knownKind !== null && knownKind !== void 0 ? knownKind : Kind.Local, Kind.PotentialHook); + } + else { + return knownKind !== null && knownKind !== void 0 ? knownKind : Kind.Local; + } + } + function visitPlace(place) { + const kind = valueKinds.get(place.identifier.id); + if (kind === Kind.KnownHook) { + recordInvalidHookUsageError(place); + } + } + function setKind(place, kind) { + valueKinds.set(place.identifier.id, kind); + } + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + const kind = getKindForPlace(place); + setKind(place, kind); + } + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + let kind = phi.place.identifier.name !== null && + isHookName$2(phi.place.identifier.name.value) + ? Kind.PotentialHook + : Kind.Local; + for (const [, operand] of phi.operands) { + const operandKind = valueKinds.get(operand.identifier.id); + if (operandKind !== undefined) { + kind = joinKinds(kind, operandKind); + } + } + valueKinds.set(phi.place.identifier.id, kind); + } + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'LoadGlobal': { + if (getHookKind(fn.env, instr.lvalue.identifier) != null) { + setKind(instr.lvalue, Kind.KnownHook); + } + else { + setKind(instr.lvalue, Kind.Global); + } + break; + } + case 'LoadContext': + case 'LoadLocal': { + visitPlace(instr.value.place); + const kind = getKindForPlace(instr.value.place); + setKind(instr.lvalue, kind); + break; + } + case 'StoreLocal': + case 'StoreContext': { + visitPlace(instr.value.value); + const kind = joinKinds(getKindForPlace(instr.value.value), getKindForPlace(instr.value.lvalue.place)); + setKind(instr.value.lvalue.place, kind); + setKind(instr.lvalue, kind); + break; + } + case 'ComputedLoad': { + visitPlace(instr.value.object); + const kind = getKindForPlace(instr.value.object); + setKind(instr.lvalue, joinKinds(getKindForPlace(instr.lvalue), kind)); + break; + } + case 'PropertyLoad': { + const objectKind = getKindForPlace(instr.value.object); + const isHookProperty = typeof instr.value.property === 'string' && + isHookName$2(instr.value.property); + let kind; + switch (objectKind) { + case Kind.Error: { + kind = Kind.Error; + break; + } + case Kind.KnownHook: { + kind = isHookProperty ? Kind.KnownHook : Kind.Local; + break; + } + case Kind.PotentialHook: { + kind = Kind.PotentialHook; + break; + } + case Kind.Global: { + kind = isHookProperty ? Kind.KnownHook : Kind.Global; + break; + } + case Kind.Local: { + kind = isHookProperty ? Kind.PotentialHook : Kind.Local; + break; + } + default: { + assertExhaustive$1(objectKind, `Unexpected kind \`${objectKind}\``); + } + } + setKind(instr.lvalue, kind); + break; + } + case 'CallExpression': { + const calleeKind = getKindForPlace(instr.value.callee); + const isHookCallee = calleeKind === Kind.KnownHook || calleeKind === Kind.PotentialHook; + if (isHookCallee && !unconditionalBlocks.has(block.id)) { + recordConditionalHookError(instr.value.callee); + } + else if (calleeKind === Kind.PotentialHook) { + recordDynamicHookUsageError(instr.value.callee); + } + for (const operand of eachInstructionOperand(instr)) { + if (operand === instr.value.callee) { + continue; + } + visitPlace(operand); + } + break; + } + case 'MethodCall': { + const calleeKind = getKindForPlace(instr.value.property); + const isHookCallee = calleeKind === Kind.KnownHook || calleeKind === Kind.PotentialHook; + if (isHookCallee && !unconditionalBlocks.has(block.id)) { + recordConditionalHookError(instr.value.property); + } + else if (calleeKind === Kind.PotentialHook) { + recordDynamicHookUsageError(instr.value.property); + } + for (const operand of eachInstructionOperand(instr)) { + if (operand === instr.value.property) { + continue; + } + visitPlace(operand); + } + break; + } + case 'Destructure': { + visitPlace(instr.value.value); + const objectKind = getKindForPlace(instr.value.value); + for (const lvalue of eachInstructionLValue(instr)) { + const isHookProperty = lvalue.identifier.name !== null && + isHookName$2(lvalue.identifier.name.value); + let kind; + switch (objectKind) { + case Kind.Error: { + kind = Kind.Error; + break; + } + case Kind.KnownHook: { + kind = Kind.KnownHook; + break; + } + case Kind.PotentialHook: { + kind = Kind.PotentialHook; + break; + } + case Kind.Global: { + kind = isHookProperty ? Kind.KnownHook : Kind.Global; + break; + } + case Kind.Local: { + kind = isHookProperty ? Kind.PotentialHook : Kind.Local; + break; + } + default: { + assertExhaustive$1(objectKind, `Unexpected kind \`${objectKind}\``); + } + } + setKind(lvalue, kind); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + visitFunctionExpression(errors, instr.value.loweredFunc.func); + break; + } + default: { + for (const operand of eachInstructionOperand(instr)) { + visitPlace(operand); + } + for (const lvalue of eachInstructionLValue(instr)) { + const kind = getKindForPlace(lvalue); + setKind(lvalue, kind); + } + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visitPlace(operand); + } + } + for (const [, error] of errorsByPlace) { + errors.pushErrorDetail(error); + } + return errors.asResult(); +} +function visitFunctionExpression(errors, fn) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'ObjectMethod': + case 'FunctionExpression': { + visitFunctionExpression(errors, instr.value.loweredFunc.func); + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = instr.value.kind === 'CallExpression' + ? instr.value.callee + : instr.value.property; + const hookKind = getHookKind(fn.env, callee.identifier); + if (hookKind != null) { + errors.pushErrorDetail(new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + reason: 'Hooks must be called at the top level in the body of a function component or custom hook, and may not be called within function expressions. See the Rules of Hooks (https://react.dev/warnings/invalid-hook-call-warning)', + loc: callee.loc, + description: `Cannot call ${hookKind === 'Custom' ? 'hook' : hookKind} within a function expression`, + suggestions: null, + })); + } + break; + } + } + } + } +} + +function validateMemoizedEffectDependencies(fn) { + const errors = new CompilerError(); + visitReactiveFunction(fn, new Visitor$1(), errors); + return errors.asResult(); +} +let Visitor$1 = class Visitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.scopes = new Set(); + } + visitScope(scopeBlock, state) { + this.traverseScope(scopeBlock, state); + let areDependenciesMemoized = true; + for (const dep of scopeBlock.scope.dependencies) { + if (isUnmemoized$1(dep.identifier, this.scopes)) { + areDependenciesMemoized = false; + break; + } + } + if (areDependenciesMemoized) { + this.scopes.add(scopeBlock.scope.id); + for (const id of scopeBlock.scope.merged) { + this.scopes.add(id); + } + } + } + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + if (instruction.value.kind === 'CallExpression' && + isEffectHook(instruction.value.callee.identifier) && + instruction.value.args.length >= 2) { + const deps = instruction.value.args[1]; + if (deps.kind === 'Identifier' && + (isMutable(instruction, deps) || + isUnmemoized$1(deps.identifier, this.scopes))) { + state.push({ + category: ErrorCategory.EffectDependencies, + reason: 'React Compiler has skipped optimizing this component because the effect dependencies could not be memoized. Unmemoized effect dependencies can trigger an infinite loop or other unexpected behavior', + description: null, + loc: typeof instruction.loc !== 'symbol' ? instruction.loc : null, + suggestions: null, + }); + } + } + } +}; +function isUnmemoized$1(operand, scopes) { + return operand.scope != null && !scopes.has(operand.scope.id); +} +function isEffectHook(identifier) { + return (isUseEffectHookType(identifier) || + isUseLayoutEffectHookType(identifier) || + isUseInsertionEffectHookType(identifier)); +} + +function validateNoCapitalizedCalls(fn) { + var _a; + const envConfig = fn.env.config; + const ALLOW_LIST = new Set([ + ...DEFAULT_GLOBALS.keys(), + ...((_a = envConfig.validateNoCapitalizedCalls) !== null && _a !== void 0 ? _a : []), + ]); + const hookPattern = envConfig.hookPattern != null ? new RegExp(envConfig.hookPattern) : null; + const isAllowed = (name) => { + return (ALLOW_LIST.has(name) || (hookPattern != null && hookPattern.test(name))); + }; + const errors = new CompilerError(); + const capitalLoadGlobals = new Map(); + const capitalizedProperties = new Map(); + const reason = 'Capitalized functions are reserved for components, which must be invoked with JSX. If this is a component, render it with JSX. Otherwise, ensure that it has no hook calls and rename it to begin with a lowercase letter. Alternatively, if you know for a fact that this function is not a component, you can allowlist it via the compiler config'; + for (const [, block] of fn.body.blocks) { + for (const { lvalue, value } of block.instructions) { + switch (value.kind) { + case 'LoadGlobal': { + if (value.binding.name != '' && + /^[A-Z]/.test(value.binding.name) && + !(value.binding.name.toUpperCase() === value.binding.name) && + !isAllowed(value.binding.name)) { + capitalLoadGlobals.set(lvalue.identifier.id, value.binding.name); + } + break; + } + case 'CallExpression': { + const calleeIdentifier = value.callee.identifier.id; + const calleeName = capitalLoadGlobals.get(calleeIdentifier); + if (calleeName != null) { + CompilerError.throwInvalidReact({ + category: ErrorCategory.CapitalizedCalls, + reason, + description: `${calleeName} may be a component`, + loc: value.loc, + suggestions: null, + }); + } + break; + } + case 'PropertyLoad': { + if (typeof value.property === 'string' && + /^[A-Z]/.test(value.property)) { + capitalizedProperties.set(lvalue.identifier.id, value.property); + } + break; + } + case 'MethodCall': { + const propertyIdentifier = value.property.identifier.id; + const propertyName = capitalizedProperties.get(propertyIdentifier); + if (propertyName != null) { + errors.push({ + category: ErrorCategory.CapitalizedCalls, + reason, + description: `${propertyName} may be a component`, + loc: value.loc, + suggestions: null, + }); + } + break; + } + } + } + } + return errors.asResult(); +} + +var _Env_changed, _Env_data, _Env_temporaries; +function makeRefId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected identifier id to be a non-negative integer', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return id; +} +let _refId = 0; +function nextRefId() { + return makeRefId(_refId++); +} +class Env { + constructor() { + _Env_changed.set(this, false); + _Env_data.set(this, new Map()); + _Env_temporaries.set(this, new Map()); + } + lookup(place) { + var _a; + return (_a = __classPrivateFieldGet(this, _Env_temporaries, "f").get(place.identifier.id)) !== null && _a !== void 0 ? _a : place; + } + define(place, value) { + __classPrivateFieldGet(this, _Env_temporaries, "f").set(place.identifier.id, value); + } + resetChanged() { + __classPrivateFieldSet(this, _Env_changed, false, "f"); + } + hasChanged() { + return __classPrivateFieldGet(this, _Env_changed, "f"); + } + get(key) { + var _a, _b; + const operandId = (_b = (_a = __classPrivateFieldGet(this, _Env_temporaries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.identifier.id) !== null && _b !== void 0 ? _b : key; + return __classPrivateFieldGet(this, _Env_data, "f").get(operandId); + } + set(key, value) { + var _a, _b; + const operandId = (_b = (_a = __classPrivateFieldGet(this, _Env_temporaries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.identifier.id) !== null && _b !== void 0 ? _b : key; + const cur = __classPrivateFieldGet(this, _Env_data, "f").get(operandId); + const widenedValue = joinRefAccessTypes(value, cur !== null && cur !== void 0 ? cur : { kind: 'None' }); + if (!(cur == null && widenedValue.kind === 'None') && + (cur == null || !tyEqual(cur, widenedValue))) { + __classPrivateFieldSet(this, _Env_changed, true, "f"); + } + __classPrivateFieldGet(this, _Env_data, "f").set(operandId, widenedValue); + return this; + } +} +_Env_changed = new WeakMap(), _Env_data = new WeakMap(), _Env_temporaries = new WeakMap(); +function validateNoRefAccessInRender(fn) { + const env = new Env(); + collectTemporariesSidemap(fn, env); + return validateNoRefAccessInRenderImpl(fn, env).map(_ => undefined); +} +function collectTemporariesSidemap(fn, env) { + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'LoadLocal': { + const temp = env.lookup(value.place); + if (temp != null) { + env.define(lvalue, temp); + } + break; + } + case 'StoreLocal': { + const temp = env.lookup(value.value); + if (temp != null) { + env.define(lvalue, temp); + env.define(value.lvalue.place, temp); + } + break; + } + case 'PropertyLoad': { + if (isUseRefType(value.object.identifier) && + value.property === 'current') { + continue; + } + const temp = env.lookup(value.object); + if (temp != null) { + env.define(lvalue, temp); + } + break; + } + } + } + } +} +function refTypeOfType(place) { + if (isRefValueType(place.identifier)) { + return { kind: 'RefValue' }; + } + else if (isUseRefType(place.identifier)) { + return { kind: 'Ref', refId: nextRefId() }; + } + else { + return { kind: 'None' }; + } +} +function tyEqual(a, b) { + if (a.kind !== b.kind) { + return false; + } + switch (a.kind) { + case 'None': + return true; + case 'Ref': + return true; + case 'Nullable': + return true; + case 'Guard': + CompilerError.invariant(b.kind === 'Guard', { + reason: 'Expected ref value', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return a.refId === b.refId; + case 'RefValue': + CompilerError.invariant(b.kind === 'RefValue', { + reason: 'Expected ref value', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return a.loc == b.loc; + case 'Structure': { + CompilerError.invariant(b.kind === 'Structure', { + reason: 'Expected structure', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + const fnTypesEqual = (a.fn === null && b.fn === null) || + (a.fn !== null && + b.fn !== null && + a.fn.readRefEffect === b.fn.readRefEffect && + tyEqual(a.fn.returnType, b.fn.returnType)); + return (fnTypesEqual && + (a.value === b.value || + (a.value !== null && b.value !== null && tyEqual(a.value, b.value)))); + } + } +} +function joinRefAccessTypes(...types) { + function joinRefAccessRefTypes(a, b) { + if (a.kind === 'RefValue') { + if (b.kind === 'RefValue' && a.refId === b.refId) { + return a; + } + return { kind: 'RefValue' }; + } + else if (b.kind === 'RefValue') { + return b; + } + else if (a.kind === 'Ref' || b.kind === 'Ref') { + if (a.kind === 'Ref' && b.kind === 'Ref' && a.refId === b.refId) { + return a; + } + return { kind: 'Ref', refId: nextRefId() }; + } + else { + CompilerError.invariant(a.kind === 'Structure' && b.kind === 'Structure', { + reason: 'Expected structure', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + const fn = a.fn === null + ? b.fn + : b.fn === null + ? a.fn + : { + readRefEffect: a.fn.readRefEffect || b.fn.readRefEffect, + returnType: joinRefAccessTypes(a.fn.returnType, b.fn.returnType), + }; + const value = a.value === null + ? b.value + : b.value === null + ? a.value + : joinRefAccessRefTypes(a.value, b.value); + return { + kind: 'Structure', + fn, + value, + }; + } + } + return types.reduce((a, b) => { + if (a.kind === 'None') { + return b; + } + else if (b.kind === 'None') { + return a; + } + else if (a.kind === 'Guard') { + if (b.kind === 'Guard' && a.refId === b.refId) { + return a; + } + else if (b.kind === 'Nullable' || b.kind === 'Guard') { + return { kind: 'None' }; + } + else { + return b; + } + } + else if (b.kind === 'Guard') { + if (a.kind === 'Nullable') { + return { kind: 'None' }; + } + else { + return b; + } + } + else if (a.kind === 'Nullable') { + return b; + } + else if (b.kind === 'Nullable') { + return a; + } + else { + return joinRefAccessRefTypes(a, b); + } + }, { kind: 'None' }); +} +function validateNoRefAccessInRenderImpl(fn, env) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + let returnValues = []; + let place; + for (const param of fn.params) { + if (param.kind === 'Identifier') { + place = param; + } + else { + place = param.place; + } + const type = refTypeOfType(place); + env.set(place.identifier.id, type); + } + const interpolatedAsJsx = new Set(); + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { value } = instr; + if (value.kind === 'JsxExpression' || value.kind === 'JsxFragment') { + if (value.children != null) { + for (const child of value.children) { + interpolatedAsJsx.add(child.identifier.id); + } + } + } + } + } + for (let i = 0; (i == 0 || env.hasChanged()) && i < 10; i++) { + env.resetChanged(); + returnValues = []; + const safeBlocks = []; + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + retainWhere(safeBlocks, entry => entry.block !== block.id); + for (const phi of block.phis) { + env.set(phi.place.identifier.id, joinRefAccessTypes(...Array(...phi.operands.values()).map(operand => { var _a; return (_a = env.get(operand.identifier.id)) !== null && _a !== void 0 ? _a : { kind: 'None' }; }))); + } + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'JsxExpression': + case 'JsxFragment': { + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoDirectRefValueAccess(errors, operand, env); + } + break; + } + case 'ComputedLoad': + case 'PropertyLoad': { + if (instr.value.kind === 'ComputedLoad') { + validateNoDirectRefValueAccess(errors, instr.value.property, env); + } + const objType = env.get(instr.value.object.identifier.id); + let lookupType = null; + if ((objType === null || objType === void 0 ? void 0 : objType.kind) === 'Structure') { + lookupType = objType.value; + } + else if ((objType === null || objType === void 0 ? void 0 : objType.kind) === 'Ref') { + lookupType = { + kind: 'RefValue', + loc: instr.loc, + refId: objType.refId, + }; + } + env.set(instr.lvalue.identifier.id, lookupType !== null && lookupType !== void 0 ? lookupType : refTypeOfType(instr.lvalue)); + break; + } + case 'TypeCastExpression': { + env.set(instr.lvalue.identifier.id, (_a = env.get(instr.value.value.identifier.id)) !== null && _a !== void 0 ? _a : refTypeOfType(instr.lvalue)); + break; + } + case 'LoadContext': + case 'LoadLocal': { + env.set(instr.lvalue.identifier.id, (_b = env.get(instr.value.place.identifier.id)) !== null && _b !== void 0 ? _b : refTypeOfType(instr.lvalue)); + break; + } + case 'StoreContext': + case 'StoreLocal': { + env.set(instr.value.lvalue.place.identifier.id, (_c = env.get(instr.value.value.identifier.id)) !== null && _c !== void 0 ? _c : refTypeOfType(instr.value.lvalue.place)); + env.set(instr.lvalue.identifier.id, (_d = env.get(instr.value.value.identifier.id)) !== null && _d !== void 0 ? _d : refTypeOfType(instr.lvalue)); + break; + } + case 'Destructure': { + const objType = env.get(instr.value.value.identifier.id); + let lookupType = null; + if ((objType === null || objType === void 0 ? void 0 : objType.kind) === 'Structure') { + lookupType = objType.value; + } + env.set(instr.lvalue.identifier.id, lookupType !== null && lookupType !== void 0 ? lookupType : refTypeOfType(instr.lvalue)); + for (const lval of eachPatternOperand(instr.value.lvalue.pattern)) { + env.set(lval.identifier.id, lookupType !== null && lookupType !== void 0 ? lookupType : refTypeOfType(lval)); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + let returnType = { kind: 'None' }; + let readRefEffect = false; + const result = validateNoRefAccessInRenderImpl(instr.value.loweredFunc.func, env); + if (result.isOk()) { + returnType = result.unwrap(); + } + else if (result.isErr()) { + readRefEffect = true; + } + env.set(instr.lvalue.identifier.id, { + kind: 'Structure', + fn: { + readRefEffect, + returnType, + }, + value: null, + }); + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = instr.value.kind === 'CallExpression' + ? instr.value.callee + : instr.value.property; + const hookKind = getHookKindForType(fn.env, callee.identifier.type); + let returnType = { kind: 'None' }; + const fnType = env.get(callee.identifier.id); + let didError = false; + if ((fnType === null || fnType === void 0 ? void 0 : fnType.kind) === 'Structure' && fnType.fn !== null) { + returnType = fnType.fn.returnType; + if (fnType.fn.readRefEffect) { + didError = true; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: `This function accesses a ref value`, + })); + } + } + if (!didError) { + const isRefLValue = isUseRefType(instr.lvalue.identifier); + for (const operand of eachInstructionValueOperand(instr.value)) { + if (isRefLValue || + (hookKind != null && + hookKind !== 'useState' && + hookKind !== 'useReducer')) { + validateNoDirectRefValueAccess(errors, operand, env); + } + else if (interpolatedAsJsx.has(instr.lvalue.identifier.id)) { + validateNoRefValueAccess(errors, env, operand); + } + else { + validateNoRefPassedToFunction(errors, env, operand, operand.loc); + } + } + } + env.set(instr.lvalue.identifier.id, returnType); + break; + } + case 'ObjectExpression': + case 'ArrayExpression': { + const types = []; + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoDirectRefValueAccess(errors, operand, env); + types.push((_e = env.get(operand.identifier.id)) !== null && _e !== void 0 ? _e : { kind: 'None' }); + } + const value = joinRefAccessTypes(...types); + if (value.kind === 'None' || + value.kind === 'Guard' || + value.kind === 'Nullable') { + env.set(instr.lvalue.identifier.id, { kind: 'None' }); + } + else { + env.set(instr.lvalue.identifier.id, { + kind: 'Structure', + value, + fn: null, + }); + } + break; + } + case 'PropertyDelete': + case 'PropertyStore': + case 'ComputedDelete': + case 'ComputedStore': { + const target = env.get(instr.value.object.identifier.id); + let safe = null; + if (instr.value.kind === 'PropertyStore' && + target != null && + target.kind === 'Ref') { + safe = safeBlocks.find(entry => entry.ref === target.refId); + } + if (safe != null) { + retainWhere(safeBlocks, entry => entry !== safe); + } + else { + validateNoRefUpdate(errors, env, instr.value.object, instr.loc); + } + if (instr.value.kind === 'ComputedDelete' || + instr.value.kind === 'ComputedStore') { + validateNoRefValueAccess(errors, env, instr.value.property); + } + if (instr.value.kind === 'ComputedStore' || + instr.value.kind === 'PropertyStore') { + validateNoDirectRefValueAccess(errors, instr.value.value, env); + const type = env.get(instr.value.value.identifier.id); + if (type != null && type.kind === 'Structure') { + let objectType = type; + if (target != null) { + objectType = joinRefAccessTypes(objectType, target); + } + env.set(instr.value.object.identifier.id, objectType); + } + } + break; + } + case 'StartMemoize': + case 'FinishMemoize': + break; + case 'LoadGlobal': { + if (instr.value.binding.name === 'undefined') { + env.set(instr.lvalue.identifier.id, { kind: 'Nullable' }); + } + break; + } + case 'Primitive': { + if (instr.value.value == null) { + env.set(instr.lvalue.identifier.id, { kind: 'Nullable' }); + } + break; + } + case 'UnaryExpression': { + if (instr.value.operator === '!') { + const value = env.get(instr.value.value.identifier.id); + const refId = (value === null || value === void 0 ? void 0 : value.kind) === 'RefValue' && value.refId != null + ? value.refId + : null; + if (refId !== null) { + env.set(instr.lvalue.identifier.id, { kind: 'Guard', refId }); + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }) + .withDetails({ + kind: 'error', + loc: instr.value.value.loc, + message: `Cannot access ref value during render`, + }) + .withDetails({ + kind: 'hint', + message: 'To initialize a ref only once, check that the ref is null with the pattern `if (ref.current == null) { ref.current = ... }`', + })); + break; + } + } + validateNoRefValueAccess(errors, env, instr.value.value); + break; + } + case 'BinaryExpression': { + const left = env.get(instr.value.left.identifier.id); + const right = env.get(instr.value.right.identifier.id); + let nullish = false; + let refId = null; + if ((left === null || left === void 0 ? void 0 : left.kind) === 'RefValue' && left.refId != null) { + refId = left.refId; + } + else if ((right === null || right === void 0 ? void 0 : right.kind) === 'RefValue' && right.refId != null) { + refId = right.refId; + } + if ((left === null || left === void 0 ? void 0 : left.kind) === 'Nullable') { + nullish = true; + } + else if ((right === null || right === void 0 ? void 0 : right.kind) === 'Nullable') { + nullish = true; + } + if (refId !== null && nullish) { + env.set(instr.lvalue.identifier.id, { kind: 'Guard', refId }); + } + else { + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoRefValueAccess(errors, env, operand); + } + } + break; + } + default: { + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoRefValueAccess(errors, env, operand); + } + break; + } + } + for (const operand of eachInstructionOperand(instr)) { + guardCheck(errors, operand, env); + } + if (isUseRefType(instr.lvalue.identifier) && + ((_f = env.get(instr.lvalue.identifier.id)) === null || _f === void 0 ? void 0 : _f.kind) !== 'Ref') { + env.set(instr.lvalue.identifier.id, joinRefAccessTypes((_g = env.get(instr.lvalue.identifier.id)) !== null && _g !== void 0 ? _g : { kind: 'None' }, { kind: 'Ref', refId: nextRefId() })); + } + if (isRefValueType(instr.lvalue.identifier) && + ((_h = env.get(instr.lvalue.identifier.id)) === null || _h === void 0 ? void 0 : _h.kind) !== 'RefValue') { + env.set(instr.lvalue.identifier.id, joinRefAccessTypes((_j = env.get(instr.lvalue.identifier.id)) !== null && _j !== void 0 ? _j : { kind: 'None' }, { kind: 'RefValue', loc: instr.loc })); + } + } + if (block.terminal.kind === 'if') { + const test = env.get(block.terminal.test.identifier.id); + if ((test === null || test === void 0 ? void 0 : test.kind) === 'Guard' && + safeBlocks.find(entry => entry.ref === test.refId) == null) { + safeBlocks.push({ block: block.terminal.fallthrough, ref: test.refId }); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + if (block.terminal.kind !== 'return') { + validateNoRefValueAccess(errors, env, operand); + if (block.terminal.kind !== 'if') { + guardCheck(errors, operand, env); + } + } + else { + validateNoDirectRefValueAccess(errors, operand, env); + guardCheck(errors, operand, env); + returnValues.push(env.get(operand.identifier.id)); + } + } + } + if (errors.hasAnyErrors()) { + return Err(errors); + } + } + CompilerError.invariant(!env.hasChanged(), { + reason: 'Ref type environment did not converge', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return Ok(joinRefAccessTypes(...returnValues.filter((env) => env !== undefined))); +} +function destructure(type) { + if ((type === null || type === void 0 ? void 0 : type.kind) === 'Structure' && type.value !== null) { + return destructure(type.value); + } + return type; +} +function guardCheck(errors, operand, env) { + var _a; + if (((_a = env.get(operand.identifier.id)) === null || _a === void 0 ? void 0 : _a.kind) === 'Guard') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: operand.loc, + message: `Cannot access ref value during render`, + })); + } +} +function validateNoRefValueAccess(errors, env, operand) { + var _a; + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'RefValue' || + ((type === null || type === void 0 ? void 0 : type.kind) === 'Structure' && ((_a = type.fn) === null || _a === void 0 ? void 0 : _a.readRefEffect))) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (type.kind === 'RefValue' && type.loc) || operand.loc, + message: `Cannot access ref value during render`, + })); + } +} +function validateNoRefPassedToFunction(errors, env, operand, loc) { + var _a; + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'Ref' || + (type === null || type === void 0 ? void 0 : type.kind) === 'RefValue' || + ((type === null || type === void 0 ? void 0 : type.kind) === 'Structure' && ((_a = type.fn) === null || _a === void 0 ? void 0 : _a.readRefEffect))) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (type.kind === 'RefValue' && type.loc) || loc, + message: `Passing a ref to a function may read its value during render`, + })); + } +} +function validateNoRefUpdate(errors, env, operand, loc) { + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'Ref' || (type === null || type === void 0 ? void 0 : type.kind) === 'RefValue') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (type.kind === 'RefValue' && type.loc) || loc, + message: `Cannot update ref during render`, + })); + } +} +function validateNoDirectRefValueAccess(errors, operand, env) { + var _a; + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'RefValue') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (_a = type.loc) !== null && _a !== void 0 ? _a : operand.loc, + message: `Cannot access ref value during render`, + })); + } +} +const ERROR_DESCRIPTION = 'React refs are values that are not needed for rendering. Refs should only be accessed ' + + 'outside of render, such as in event handlers or effects. ' + + 'Accessing a ref value (the `current` property) during render can cause your component ' + + 'not to update as expected (https://react.dev/reference/react/useRef)'; + +function validateNoSetStateInRender(fn) { + const unconditionalSetStateFunctions = new Set(); + return validateNoSetStateInRenderImpl(fn, unconditionalSetStateFunctions); +} +function validateNoSetStateInRenderImpl(fn, unconditionalSetStateFunctions) { + const unconditionalBlocks = computeUnconditionalBlocks(fn); + let activeManualMemoId = null; + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'LoadLocal': { + if (unconditionalSetStateFunctions.has(instr.value.place.identifier.id)) { + unconditionalSetStateFunctions.add(instr.lvalue.identifier.id); + } + break; + } + case 'StoreLocal': { + if (unconditionalSetStateFunctions.has(instr.value.value.identifier.id)) { + unconditionalSetStateFunctions.add(instr.value.lvalue.place.identifier.id); + unconditionalSetStateFunctions.add(instr.lvalue.identifier.id); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + if ([...eachInstructionValueOperand(instr.value)].some(operand => isSetStateType(operand.identifier) || + unconditionalSetStateFunctions.has(operand.identifier.id)) && + validateNoSetStateInRenderImpl(instr.value.loweredFunc.func, unconditionalSetStateFunctions).isErr()) { + unconditionalSetStateFunctions.add(instr.lvalue.identifier.id); + } + break; + } + case 'StartMemoize': { + CompilerError.invariant(activeManualMemoId === null, { + reason: 'Unexpected nested StartMemoize instructions', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + }); + activeManualMemoId = instr.value.manualMemoId; + break; + } + case 'FinishMemoize': { + CompilerError.invariant(activeManualMemoId === instr.value.manualMemoId, { + reason: 'Expected FinishMemoize to align with previous StartMemoize instruction', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + }); + activeManualMemoId = null; + break; + } + case 'CallExpression': { + const callee = instr.value.callee; + if (isSetStateType(callee.identifier) || + unconditionalSetStateFunctions.has(callee.identifier.id)) { + if (activeManualMemoId !== null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.RenderSetState, + reason: 'Calling setState from useMemo may trigger an infinite loop', + description: 'Each time the memo callback is evaluated it will change state. This can cause a memoization dependency to change, running the memo function again and causing an infinite loop. Instead of setting state in useMemo(), prefer deriving the value during render. (https://react.dev/reference/react/useState)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: 'Found setState() within useMemo()', + })); + } + else if (unconditionalBlocks.has(block.id)) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.RenderSetState, + reason: 'Calling setState during render may trigger an infinite loop', + description: 'Calling setState during render will trigger another render, and can lead to infinite loops. (https://react.dev/reference/react/useState)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: 'Found setState() in render', + })); + } + } + break; + } + } + } + } + return errors.asResult(); +} + +function validatePreservedManualMemoization(fn) { + const state = { + errors: new CompilerError(), + manualMemoState: null, + }; + visitReactiveFunction(fn, new Visitor(), state); + return state.errors.asResult(); +} +function prettyPrintScopeDependency(val) { + var _a; + let rootStr; + if (((_a = val.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named') { + rootStr = val.identifier.name.value; + } + else { + rootStr = '[unnamed]'; + } + return `${rootStr}${val.path.map(v => `${v.optional ? '?.' : '.'}${v.property}`).join('')}`; +} +var CompareDependencyResult; +(function (CompareDependencyResult) { + CompareDependencyResult[CompareDependencyResult["Ok"] = 0] = "Ok"; + CompareDependencyResult[CompareDependencyResult["RootDifference"] = 1] = "RootDifference"; + CompareDependencyResult[CompareDependencyResult["PathDifference"] = 2] = "PathDifference"; + CompareDependencyResult[CompareDependencyResult["Subpath"] = 3] = "Subpath"; + CompareDependencyResult[CompareDependencyResult["RefAccessDifference"] = 4] = "RefAccessDifference"; +})(CompareDependencyResult || (CompareDependencyResult = {})); +function merge(a, b) { + return Math.max(a, b); +} +function getCompareDependencyResultDescription(result) { + switch (result) { + case CompareDependencyResult.Ok: + return 'Dependencies equal'; + case CompareDependencyResult.RootDifference: + case CompareDependencyResult.PathDifference: + return 'Inferred different dependency than source'; + case CompareDependencyResult.RefAccessDifference: + return 'Differences in ref.current access'; + case CompareDependencyResult.Subpath: + return 'Inferred less specific property than source'; + } +} +function compareDeps(inferred, source) { + const rootsEqual = (inferred.root.kind === 'Global' && + source.root.kind === 'Global' && + inferred.root.identifierName === source.root.identifierName) || + (inferred.root.kind === 'NamedLocal' && + source.root.kind === 'NamedLocal' && + inferred.root.value.identifier.id === source.root.value.identifier.id); + if (!rootsEqual) { + return CompareDependencyResult.RootDifference; + } + let isSubpath = true; + for (let i = 0; i < Math.min(inferred.path.length, source.path.length); i++) { + if (inferred.path[i].property !== source.path[i].property) { + isSubpath = false; + break; + } + else if (inferred.path[i].optional !== source.path[i].optional) { + return CompareDependencyResult.PathDifference; + } + } + if (isSubpath && + (source.path.length === inferred.path.length || + (inferred.path.length >= source.path.length && + !inferred.path.some(token => token.property === 'current')))) { + return CompareDependencyResult.Ok; + } + else { + if (isSubpath) { + if (source.path.some(token => token.property === 'current') || + inferred.path.some(token => token.property === 'current')) { + return CompareDependencyResult.RefAccessDifference; + } + else { + return CompareDependencyResult.Subpath; + } + } + else { + return CompareDependencyResult.PathDifference; + } + } +} +function validateInferredDep(dep, temporaries, declsWithinMemoBlock, validDepsInMemoBlock, errorState, memoLocation) { + var _a; + let normalizedDep; + const maybeNormalizedRoot = temporaries.get(dep.identifier.id); + if (maybeNormalizedRoot != null) { + normalizedDep = { + root: maybeNormalizedRoot.root, + path: [...maybeNormalizedRoot.path, ...dep.path], + }; + } + else { + CompilerError.invariant(((_a = dep.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named', { + reason: 'ValidatePreservedManualMemoization: expected scope dependency to be named', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + normalizedDep = { + root: { + kind: 'NamedLocal', + value: { + kind: 'Identifier', + identifier: dep.identifier, + loc: GeneratedSource, + effect: Effect.Read, + reactive: false, + }, + }, + path: [...dep.path], + }; + } + for (const decl of declsWithinMemoBlock) { + if (normalizedDep.root.kind === 'NamedLocal' && + decl === normalizedDep.root.value.identifier.declarationId) { + return; + } + } + let errorDiagnostic = null; + for (const originalDep of validDepsInMemoBlock) { + const compareResult = compareDeps(normalizedDep, originalDep); + if (compareResult === CompareDependencyResult.Ok) { + return; + } + else { + errorDiagnostic = merge(errorDiagnostic !== null && errorDiagnostic !== void 0 ? errorDiagnostic : compareResult, compareResult); + } + } + errorState.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.PreserveManualMemo, + reason: 'Existing memoization could not be preserved', + description: [ + 'React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. ', + 'The inferred dependencies did not match the manually specified dependencies, which could cause the value to change more or less frequently than expected. ', + (dep.identifier.name != null && dep.identifier.name.kind === 'named') + ? `The inferred dependency was \`${prettyPrintScopeDependency(dep)}\`, but the source dependencies were [${validDepsInMemoBlock + .map(dep => printManualMemoDependency(dep, true)) + .join(', ')}]. ${errorDiagnostic + ? getCompareDependencyResultDescription(errorDiagnostic) + : 'Inferred dependency not present in source'}` + : '', + ] + .join('') + .trim(), + suggestions: null, + }).withDetails({ + kind: 'error', + loc: memoLocation, + message: 'Could not preserve existing manual memoization', + })); +} +class Visitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.scopes = new Set(); + this.prunedScopes = new Set(); + this.temporaries = new Map(); + } + recordDepsInValue(value, state) { + var _a, _b; + switch (value.kind) { + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitInstruction(instr, state); + } + this.recordDepsInValue(value.value, state); + break; + } + case 'OptionalExpression': { + this.recordDepsInValue(value.value, state); + break; + } + case 'ConditionalExpression': { + this.recordDepsInValue(value.test, state); + this.recordDepsInValue(value.consequent, state); + this.recordDepsInValue(value.alternate, state); + break; + } + case 'LogicalExpression': { + this.recordDepsInValue(value.left, state); + this.recordDepsInValue(value.right, state); + break; + } + default: { + collectMaybeMemoDependencies(value, this.temporaries, false); + if (value.kind === 'StoreLocal' || + value.kind === 'StoreContext' || + value.kind === 'Destructure') { + for (const storeTarget of eachInstructionValueLValue(value)) { + (_a = state.manualMemoState) === null || _a === void 0 ? void 0 : _a.decls.add(storeTarget.identifier.declarationId); + if (((_b = storeTarget.identifier.name) === null || _b === void 0 ? void 0 : _b.kind) === 'named') { + this.temporaries.set(storeTarget.identifier.id, { + root: { + kind: 'NamedLocal', + value: storeTarget, + }, + path: [], + }); + } + } + } + break; + } + } + } + recordTemporaries(instr, state) { + var _a; + const temporaries = this.temporaries; + const { lvalue, value } = instr; + const lvalId = lvalue === null || lvalue === void 0 ? void 0 : lvalue.identifier.id; + if (lvalId != null && temporaries.has(lvalId)) { + return; + } + const isNamedLocal = ((_a = lvalue === null || lvalue === void 0 ? void 0 : lvalue.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named'; + if (lvalue !== null && isNamedLocal && state.manualMemoState != null) { + state.manualMemoState.decls.add(lvalue.identifier.declarationId); + } + this.recordDepsInValue(value, state); + if (lvalue != null) { + temporaries.set(lvalue.identifier.id, { + root: { + kind: 'NamedLocal', + value: Object.assign({}, lvalue), + }, + path: [], + }); + } + } + visitScope(scopeBlock, state) { + this.traverseScope(scopeBlock, state); + if (state.manualMemoState != null && + state.manualMemoState.depsFromSource != null) { + for (const dep of scopeBlock.scope.dependencies) { + validateInferredDep(dep, this.temporaries, state.manualMemoState.decls, state.manualMemoState.depsFromSource, state.errors, state.manualMemoState.loc); + } + } + this.scopes.add(scopeBlock.scope.id); + for (const id of scopeBlock.scope.merged) { + this.scopes.add(id); + } + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + this.prunedScopes.add(scopeBlock.scope.id); + } + visitInstruction(instruction, state) { + var _a, _b, _c; + this.recordTemporaries(instruction, state); + const value = instruction.value; + if (value.kind === 'StoreLocal' && + value.lvalue.kind === 'Reassign' && + state.manualMemoState != null) { + const ids = getOrInsertDefault(state.manualMemoState.reassignments, value.lvalue.place.identifier.declarationId, new Set()); + ids.add(value.value.identifier); + } + if (value.kind === 'LoadLocal' && + value.place.identifier.scope != null && + instruction.lvalue != null && + instruction.lvalue.identifier.scope == null && + state.manualMemoState != null) { + const ids = getOrInsertDefault(state.manualMemoState.reassignments, instruction.lvalue.identifier.declarationId, new Set()); + ids.add(value.place.identifier); + } + if (value.kind === 'StartMemoize') { + let depsFromSource = null; + if (value.deps != null) { + depsFromSource = value.deps; + } + CompilerError.invariant(state.manualMemoState == null, { + reason: 'Unexpected nested StartMemoize instructions', + description: `Bad manual memoization ids: ${(_a = state.manualMemoState) === null || _a === void 0 ? void 0 : _a.manualMemoId}, ${value.manualMemoId}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: null, + }, + ], + suggestions: null, + }); + state.manualMemoState = { + loc: instruction.loc, + decls: new Set(), + depsFromSource, + manualMemoId: value.manualMemoId, + reassignments: new Map(), + }; + for (const { identifier, loc } of eachInstructionValueOperand(value)) { + if (identifier.scope != null && + !this.scopes.has(identifier.scope.id) && + !this.prunedScopes.has(identifier.scope.id)) { + state.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.PreserveManualMemo, + reason: 'Existing memoization could not be preserved', + description: [ + 'React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. ', + 'This dependency may be mutated later, which could cause the value to change unexpectedly', + ].join(''), + }).withDetails({ + kind: 'error', + loc, + message: 'This dependency may be modified later', + })); + } + } + } + if (value.kind === 'FinishMemoize') { + CompilerError.invariant(state.manualMemoState != null && + state.manualMemoState.manualMemoId === value.manualMemoId, { + reason: 'Unexpected mismatch between StartMemoize and FinishMemoize', + description: `Encountered StartMemoize id=${(_b = state.manualMemoState) === null || _b === void 0 ? void 0 : _b.manualMemoId} followed by FinishMemoize id=${value.manualMemoId}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: null, + }, + ], + suggestions: null, + }); + const reassignments = state.manualMemoState.reassignments; + state.manualMemoState = null; + if (!value.pruned) { + for (const { identifier, loc } of eachInstructionValueOperand(value)) { + let decls; + if (identifier.scope == null) { + decls = (_c = reassignments.get(identifier.declarationId)) !== null && _c !== void 0 ? _c : [identifier]; + } + else { + decls = [identifier]; + } + for (const identifier of decls) { + if (isUnmemoized(identifier, this.scopes)) { + state.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.PreserveManualMemo, + reason: 'Existing memoization could not be preserved', + description: [ + 'React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. This value was memoized in source but not in compilation output', + '', + ] + .join('') + .trim(), + }).withDetails({ + kind: 'error', + loc, + message: 'Could not preserve existing memoization', + })); + } + } + } + } + } + } +} +function isUnmemoized(operand, scopes) { + return operand.scope != null && !scopes.has(operand.scope.id); +} + +function validateUseMemo(fn) { + const errors = new CompilerError(); + const useMemos = new Set(); + const react = new Set(); + const functions = new Map(); + for (const [, block] of fn.body.blocks) { + for (const { lvalue, value } of block.instructions) { + switch (value.kind) { + case 'LoadGlobal': { + if (value.binding.name === 'useMemo') { + useMemos.add(lvalue.identifier.id); + } + else if (value.binding.name === 'React') { + react.add(lvalue.identifier.id); + } + break; + } + case 'PropertyLoad': { + if (react.has(value.object.identifier.id)) { + if (value.property === 'useMemo') { + useMemos.add(lvalue.identifier.id); + } + } + break; + } + case 'FunctionExpression': { + functions.set(lvalue.identifier.id, value); + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = value.kind === 'CallExpression' + ? value.callee.identifier.id + : value.property.identifier.id; + const isUseMemo = useMemos.has(callee); + if (!isUseMemo || value.args.length === 0) { + continue; + } + const [arg] = value.args; + if (arg.kind !== 'Identifier') { + continue; + } + const body = functions.get(arg.identifier.id); + if (body === undefined) { + continue; + } + if (body.loweredFunc.func.params.length > 0) { + const firstParam = body.loweredFunc.func.params[0]; + const loc = firstParam.kind === 'Identifier' + ? firstParam.loc + : firstParam.place.loc; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: 'useMemo() callbacks may not accept parameters', + description: 'useMemo() callbacks are called by React to cache calculations across re-renders. They should not take parameters. Instead, directly reference the props, state, or local variables needed for the computation', + suggestions: null, + }).withDetails({ + kind: 'error', + loc, + message: 'Callbacks with parameters are not supported', + })); + } + if (body.loweredFunc.func.async || body.loweredFunc.func.generator) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: 'useMemo() callbacks may not be async or generator functions', + description: 'useMemo() callbacks are called once and must synchronously return a value', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: body.loc, + message: 'Async and generator functions are not supported', + })); + } + break; + } + } + } + } + return errors.asResult(); +} + +function validateLocalsNotReassignedAfterRender(fn) { + const contextVariables = new Set(); + const reassignment = getContextReassignment(fn, contextVariables, false, false); + if (reassignment !== null) { + const errors = new CompilerError(); + const variable = reassignment.identifier.name != null && + reassignment.identifier.name.kind === 'named' + ? `\`${reassignment.identifier.name.value}\`` + : 'variable'; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot reassign variable after render completes', + description: `Reassigning ${variable} after render has completed can cause inconsistent behavior on subsequent renders. Consider using state instead`, + }).withDetails({ + kind: 'error', + loc: reassignment.loc, + message: `Cannot reassign ${variable} after render completes`, + })); + throw errors; + } +} +function getContextReassignment(fn, contextVariables, isFunctionExpression, isAsync) { + const reassigningFunctions = new Map(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'FunctionExpression': + case 'ObjectMethod': { + let reassignment = getContextReassignment(value.loweredFunc.func, contextVariables, true, isAsync || value.loweredFunc.func.async); + if (reassignment === null) { + for (const operand of eachInstructionValueOperand(value)) { + const reassignmentFromOperand = reassigningFunctions.get(operand.identifier.id); + if (reassignmentFromOperand !== undefined) { + reassignment = reassignmentFromOperand; + break; + } + } + } + if (reassignment !== null) { + if (isAsync || value.loweredFunc.func.async) { + const errors = new CompilerError(); + const variable = reassignment.identifier.name !== null && + reassignment.identifier.name.kind === 'named' + ? `\`${reassignment.identifier.name.value}\`` + : 'variable'; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot reassign variable in async function', + description: 'Reassigning a variable in an async function can cause inconsistent behavior on subsequent renders. Consider using state instead', + }).withDetails({ + kind: 'error', + loc: reassignment.loc, + message: `Cannot reassign ${variable}`, + })); + throw errors; + } + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + case 'StoreLocal': { + const reassignment = reassigningFunctions.get(value.value.identifier.id); + if (reassignment !== undefined) { + reassigningFunctions.set(value.lvalue.place.identifier.id, reassignment); + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + case 'LoadLocal': { + const reassignment = reassigningFunctions.get(value.place.identifier.id); + if (reassignment !== undefined) { + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + case 'DeclareContext': { + if (!isFunctionExpression) { + contextVariables.add(value.lvalue.place.identifier.id); + } + break; + } + case 'StoreContext': { + if (isFunctionExpression) { + if (contextVariables.has(value.lvalue.place.identifier.id)) { + return value.lvalue.place; + } + } + else { + contextVariables.add(value.lvalue.place.identifier.id); + } + const reassignment = reassigningFunctions.get(value.value.identifier.id); + if (reassignment !== undefined) { + reassigningFunctions.set(value.lvalue.place.identifier.id, reassignment); + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + default: { + let operands = eachInstructionValueOperand(value); + if (value.kind === 'CallExpression') { + const signature = getFunctionCallSignature(fn.env, value.callee.identifier.type); + if (signature === null || signature === void 0 ? void 0 : signature.noAlias) { + operands = [value.callee]; + } + } + else if (value.kind === 'MethodCall') { + const signature = getFunctionCallSignature(fn.env, value.property.identifier.type); + if (signature === null || signature === void 0 ? void 0 : signature.noAlias) { + operands = [value.receiver, value.property]; + } + } + else if (value.kind === 'TaggedTemplateExpression') { + const signature = getFunctionCallSignature(fn.env, value.tag.identifier.type); + if (signature === null || signature === void 0 ? void 0 : signature.noAlias) { + operands = [value.tag]; + } + } + for (const operand of operands) { + CompilerError.invariant(operand.effect !== Effect.Unknown, { + reason: `Expected effects to be inferred prior to ValidateLocalsNotReassignedAfterRender`, + description: null, + details: [ + { + kind: 'error', + loc: operand.loc, + message: '', + }, + ], + }); + const reassignment = reassigningFunctions.get(operand.identifier.id); + if (reassignment !== undefined) { + if (operand.effect === Effect.Freeze) { + return reassignment; + } + else { + for (const lval of eachInstructionLValue(instr)) { + reassigningFunctions.set(lval.identifier.id, reassignment); + } + } + } + } + break; + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + const reassignment = reassigningFunctions.get(operand.identifier.id); + if (reassignment !== undefined) { + return reassignment; + } + } + } + return null; +} + +function outlineFunctions(fn, fbtOperands) { + var _a; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + outlineFunctions(value.loweredFunc.func, fbtOperands); + } + if (value.kind === 'FunctionExpression' && + value.loweredFunc.func.context.length === 0 && + value.loweredFunc.func.id === null && + !fbtOperands.has(lvalue.identifier.id)) { + const loweredFunc = value.loweredFunc.func; + const id = fn.env.generateGloballyUniqueIdentifierName((_a = loweredFunc.id) !== null && _a !== void 0 ? _a : loweredFunc.nameHint); + loweredFunc.id = id.value; + fn.env.outlineFunction(loweredFunc, null); + instr.value = { + kind: 'LoadGlobal', + binding: { + kind: 'Global', + name: id.value, + }, + loc: value.loc, + }; + } + } + } +} + +function lowerContextAccess(fn, loweredContextCalleeConfig) { + const contextAccess = new Map(); + const contextKeys = new Map(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'CallExpression' && + isUseContextHookType(value.callee.identifier)) { + contextAccess.set(lvalue.identifier.id, value); + continue; + } + if (value.kind !== 'Destructure') { + continue; + } + const destructureId = value.value.identifier.id; + if (!contextAccess.has(destructureId)) { + continue; + } + const keys = getContextKeys(value); + if (keys === null) { + return; + } + if (contextKeys.has(destructureId)) { + return; + } + else { + contextKeys.set(destructureId, keys); + } + } + } + let importLoweredContextCallee = null; + if (contextAccess.size > 0 && contextKeys.size > 0) { + for (const [, block] of fn.body.blocks) { + let nextInstructions = null; + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + const { lvalue, value } = instr; + if (value.kind === 'CallExpression' && + isUseContextHookType(value.callee.identifier) && + contextKeys.has(lvalue.identifier.id)) { + importLoweredContextCallee !== null && importLoweredContextCallee !== void 0 ? importLoweredContextCallee : (importLoweredContextCallee = fn.env.programContext.addImportSpecifier(loweredContextCalleeConfig)); + const loweredContextCalleeInstr = emitLoadLoweredContextCallee(fn.env, importLoweredContextCallee); + if (nextInstructions === null) { + nextInstructions = block.instructions.slice(0, i); + } + nextInstructions.push(loweredContextCalleeInstr); + const keys = contextKeys.get(lvalue.identifier.id); + const selectorFnInstr = emitSelectorFn(fn.env, keys); + nextInstructions.push(selectorFnInstr); + const lowerContextCallId = loweredContextCalleeInstr.lvalue; + value.callee = lowerContextCallId; + const selectorFn = selectorFnInstr.lvalue; + value.args.push(selectorFn); + } + if (nextInstructions) { + nextInstructions.push(instr); + } + } + if (nextInstructions) { + block.instructions = nextInstructions; + } + } + markInstructionIds(fn.body); + inferTypes(fn); + } +} +function emitLoadLoweredContextCallee(env, importedLowerContextCallee) { + const loadGlobal = { + kind: 'LoadGlobal', + binding: Object.assign({}, importedLowerContextCallee), + loc: GeneratedSource, + }; + return { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: createTemporaryPlace(env, GeneratedSource), + effects: null, + value: loadGlobal, + }; +} +function getContextKeys(value) { + const keys = []; + const pattern = value.lvalue.pattern; + switch (pattern.kind) { + case 'ArrayPattern': { + return null; + } + case 'ObjectPattern': { + for (const place of pattern.properties) { + if (place.kind !== 'ObjectProperty' || + place.type !== 'property' || + place.key.kind !== 'identifier' || + place.place.identifier.name === null || + place.place.identifier.name.kind !== 'named') { + return null; + } + keys.push(place.key.name); + } + return keys; + } + } +} +function emitPropertyLoad(env, obj, property) { + const loadObj = { + kind: 'LoadLocal', + place: obj, + loc: GeneratedSource, + }; + const object = createTemporaryPlace(env, GeneratedSource); + const loadLocalInstr = { + lvalue: object, + value: loadObj, + id: makeInstructionId(0), + effects: null, + loc: GeneratedSource, + }; + const loadProp = { + kind: 'PropertyLoad', + object, + property: makePropertyLiteral(property), + loc: GeneratedSource, + }; + const element = createTemporaryPlace(env, GeneratedSource); + const loadPropInstr = { + lvalue: element, + value: loadProp, + id: makeInstructionId(0), + effects: null, + loc: GeneratedSource, + }; + return { + instructions: [loadLocalInstr, loadPropInstr], + element: element, + }; +} +function emitSelectorFn(env, keys) { + const obj = createTemporaryPlace(env, GeneratedSource); + promoteTemporary(obj.identifier); + const instr = []; + const elements = []; + for (const key of keys) { + const { instructions, element: prop } = emitPropertyLoad(env, obj, key); + instr.push(...instructions); + elements.push(prop); + } + const arrayInstr = emitArrayInstr(elements, env); + instr.push(arrayInstr); + const block = { + kind: 'block', + id: makeBlockId(0), + instructions: instr, + terminal: { + id: makeInstructionId(0), + kind: 'return', + returnVariant: 'Explicit', + loc: GeneratedSource, + value: arrayInstr.lvalue, + effects: null, + }, + preds: new Set(), + phis: new Set(), + }; + const fn = { + loc: GeneratedSource, + id: null, + nameHint: null, + fnType: 'Other', + env, + params: [obj], + returnTypeAnnotation: null, + returns: createTemporaryPlace(env, GeneratedSource), + context: [], + body: { + entry: block.id, + blocks: new Map([[block.id, block]]), + }, + generator: false, + async: false, + directives: [], + aliasingEffects: [], + }; + reversePostorderBlocks(fn.body); + markInstructionIds(fn.body); + enterSSA(fn); + inferTypes(fn); + const fnInstr = { + id: makeInstructionId(0), + value: { + kind: 'FunctionExpression', + name: null, + nameHint: null, + loweredFunc: { + func: fn, + }, + type: 'ArrowFunctionExpression', + loc: GeneratedSource, + }, + lvalue: createTemporaryPlace(env, GeneratedSource), + effects: null, + loc: GeneratedSource, + }; + return fnInstr; +} +function emitArrayInstr(elements, env) { + const array = { + kind: 'ArrayExpression', + elements, + loc: GeneratedSource, + }; + const arrayLvalue = createTemporaryPlace(env, GeneratedSource); + const arrayInstr = { + id: makeInstructionId(0), + value: array, + lvalue: arrayLvalue, + effects: null, + loc: GeneratedSource, + }; + return arrayInstr; +} + +function validateNoSetStateInEffects(fn, env) { + const setStateFunctions = new Map(); + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'LoadLocal': { + if (setStateFunctions.has(instr.value.place.identifier.id)) { + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.place); + } + break; + } + case 'StoreLocal': { + if (setStateFunctions.has(instr.value.value.identifier.id)) { + setStateFunctions.set(instr.value.lvalue.place.identifier.id, instr.value.value); + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.value); + } + break; + } + case 'FunctionExpression': { + if ([...eachInstructionValueOperand(instr.value)].some(operand => isSetStateType(operand.identifier) || + setStateFunctions.has(operand.identifier.id))) { + const callee = getSetStateCall(instr.value.loweredFunc.func, setStateFunctions, env); + if (callee !== null) { + setStateFunctions.set(instr.lvalue.identifier.id, callee); + } + } + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = instr.value.kind === 'MethodCall' + ? instr.value.receiver + : instr.value.callee; + if (isUseEffectHookType(callee.identifier) || + isUseLayoutEffectHookType(callee.identifier) || + isUseInsertionEffectHookType(callee.identifier)) { + const arg = instr.value.args[0]; + if (arg !== undefined && arg.kind === 'Identifier') { + const setState = setStateFunctions.get(arg.identifier.id); + if (setState !== undefined) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.EffectSetState, + reason: 'Calling setState synchronously within an effect can trigger cascading renders', + description: 'Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. ' + + 'In general, the body of an effect should do one or both of the following:\n' + + '* Update external systems with the latest state from React.\n' + + '* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\n' + + 'Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. ' + + '(https://react.dev/learn/you-might-not-need-an-effect)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: setState.loc, + message: 'Avoid calling setState() directly within an effect', + })); + } + } + } + break; + } + } + } + } + return errors.asResult(); +} +function getSetStateCall(fn, setStateFunctions, env) { + const refDerivedValues = new Set(); + const isDerivedFromRef = (place) => { + return (refDerivedValues.has(place.identifier.id) || + isUseRefType(place.identifier) || + isRefValueType(place.identifier)); + }; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (env.config.enableAllowSetStateFromRefsInEffects) { + const hasRefOperand = Iterable_some(eachInstructionValueOperand(instr.value), isDerivedFromRef); + if (hasRefOperand) { + for (const lvalue of eachInstructionLValue(instr)) { + refDerivedValues.add(lvalue.identifier.id); + } + } + if (instr.value.kind === 'PropertyLoad' && + instr.value.property === 'current' && + (isUseRefType(instr.value.object.identifier) || + isRefValueType(instr.value.object.identifier))) { + refDerivedValues.add(instr.lvalue.identifier.id); + } + } + switch (instr.value.kind) { + case 'LoadLocal': { + if (setStateFunctions.has(instr.value.place.identifier.id)) { + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.place); + } + break; + } + case 'StoreLocal': { + if (setStateFunctions.has(instr.value.value.identifier.id)) { + setStateFunctions.set(instr.value.lvalue.place.identifier.id, instr.value.value); + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.value); + } + break; + } + case 'CallExpression': { + const callee = instr.value.callee; + if (isSetStateType(callee.identifier) || + setStateFunctions.has(callee.identifier.id)) { + if (env.config.enableAllowSetStateFromRefsInEffects) { + const arg = instr.value.args.at(0); + if (arg !== undefined && + arg.kind === 'Identifier' && + refDerivedValues.has(arg.identifier.id)) { + return null; + } + } + return callee; + } + } + } + } + } + return null; +} + +function validateNoJSXInTryStatement(fn) { + const activeTryBlocks = []; + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + retainWhere(activeTryBlocks, id => id !== block.id); + if (activeTryBlocks.length !== 0) { + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'JsxExpression': + case 'JsxFragment': { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.ErrorBoundaries, + reason: 'Avoid constructing JSX within try/catch', + description: `React does not immediately render components when JSX is rendered, so any errors from this component will not be caught by the try/catch. To catch errors in rendering a given component, wrap that component in an error boundary. (https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary)`, + }).withDetails({ + kind: 'error', + loc: value.loc, + message: 'Avoid constructing JSX within try/catch', + })); + break; + } + } + } + } + if (block.terminal.kind === 'try') { + activeTryBlocks.push(block.terminal.handler); + } + } + return errors.asResult(); +} + +function outlineJSX(fn) { + const outlinedFns = []; + outlineJsxImpl(fn, outlinedFns); + for (const outlinedFn of outlinedFns) { + fn.env.outlineFunction(outlinedFn, 'Component'); + } +} +function outlineJsxImpl(fn, outlinedFns) { + const globals = new Map(); + function processAndOutlineJSX(state, rewriteInstr) { + if (state.jsx.length <= 1) { + return; + } + const result = process$1(fn, [...state.jsx].sort((a, b) => a.id - b.id), globals); + if (result) { + outlinedFns.push(result.fn); + rewriteInstr.set(state.jsx.at(0).id, result.instrs); + } + } + for (const [, block] of fn.body.blocks) { + const rewriteInstr = new Map(); + let state = { + jsx: [], + children: new Set(), + }; + for (let i = block.instructions.length - 1; i >= 0; i--) { + const instr = block.instructions[i]; + const { value, lvalue } = instr; + switch (value.kind) { + case 'LoadGlobal': { + globals.set(lvalue.identifier.id, instr); + break; + } + case 'FunctionExpression': { + outlineJsxImpl(value.loweredFunc.func, outlinedFns); + break; + } + case 'JsxExpression': { + if (!state.children.has(lvalue.identifier.id)) { + processAndOutlineJSX(state, rewriteInstr); + state = { + jsx: [], + children: new Set(), + }; + } + state.jsx.push(instr); + if (value.children) { + for (const child of value.children) { + state.children.add(child.identifier.id); + } + } + break; + } + case 'ArrayExpression': + case 'Await': + case 'BinaryExpression': + case 'CallExpression': + case 'ComputedDelete': + case 'ComputedLoad': + case 'ComputedStore': + case 'Debugger': + case 'DeclareContext': + case 'DeclareLocal': + case 'Destructure': + case 'FinishMemoize': + case 'GetIterator': + case 'IteratorNext': + case 'JSXText': + case 'JsxFragment': + case 'LoadContext': + case 'LoadLocal': + case 'MetaProperty': + case 'MethodCall': + case 'NewExpression': + case 'NextPropertyOf': + case 'ObjectExpression': + case 'ObjectMethod': + case 'PostfixUpdate': + case 'PrefixUpdate': + case 'Primitive': + case 'PropertyDelete': + case 'PropertyLoad': + case 'PropertyStore': + case 'RegExpLiteral': + case 'StartMemoize': + case 'StoreContext': + case 'StoreGlobal': + case 'StoreLocal': + case 'TaggedTemplateExpression': + case 'TemplateLiteral': + case 'TypeCastExpression': + case 'UnsupportedNode': + case 'UnaryExpression': { + break; + } + default: { + assertExhaustive$1(value, `Unexpected instruction: ${value}`); + } + } + } + processAndOutlineJSX(state, rewriteInstr); + if (rewriteInstr.size > 0) { + const newInstrs = []; + for (let i = 0; i < block.instructions.length; i++) { + const id = i + 1; + if (rewriteInstr.has(id)) { + const instrs = rewriteInstr.get(id); + newInstrs.push(...instrs); + } + else { + newInstrs.push(block.instructions[i]); + } + } + block.instructions = newInstrs; + } + deadCodeElimination(fn); + } +} +function process$1(fn, jsx, globals) { + if (fn.fnType === 'Component') { + return null; + } + const props = collectProps(fn.env, jsx); + if (!props) + return null; + const outlinedTag = fn.env.generateGloballyUniqueIdentifierName(null).value; + const newInstrs = emitOutlinedJsx(fn.env, jsx, props, outlinedTag); + if (!newInstrs) + return null; + const outlinedFn = emitOutlinedFn(fn.env, jsx, props, globals); + if (!outlinedFn) + return null; + outlinedFn.id = outlinedTag; + return { instrs: newInstrs, fn: outlinedFn }; +} +function collectProps(env, instructions) { + let id = 1; + function generateName(oldName) { + let newName = oldName; + while (seen.has(newName)) { + newName = `${oldName}${id++}`; + } + seen.add(newName); + env.programContext.addNewReference(newName); + return newName; + } + const attributes = []; + const jsxIds = new Set(instructions.map(i => i.lvalue.identifier.id)); + const seen = new Set(); + for (const instr of instructions) { + const { value } = instr; + for (const at of value.props) { + if (at.kind === 'JsxSpreadAttribute') { + return null; + } + if (at.kind === 'JsxAttribute') { + const newName = generateName(at.name); + attributes.push({ + originalName: at.name, + newName, + place: at.place, + }); + } + } + if (value.children) { + for (const child of value.children) { + if (jsxIds.has(child.identifier.id)) { + continue; + } + promoteTemporary(child.identifier); + const newName = generateName('t'); + attributes.push({ + originalName: child.identifier.name.value, + newName: newName, + place: child, + }); + } + } + } + return attributes; +} +function emitOutlinedJsx(env, instructions, outlinedProps, outlinedTag) { + const props = outlinedProps.map(p => ({ + kind: 'JsxAttribute', + name: p.newName, + place: p.place, + })); + const loadJsx = { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: createTemporaryPlace(env, GeneratedSource), + value: { + kind: 'LoadGlobal', + binding: { + kind: 'ModuleLocal', + name: outlinedTag, + }, + loc: GeneratedSource, + }, + effects: null, + }; + promoteTemporaryJsxTag(loadJsx.lvalue.identifier); + const jsxExpr = { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: instructions.at(-1).lvalue, + value: { + kind: 'JsxExpression', + tag: Object.assign({}, loadJsx.lvalue), + props, + children: null, + loc: GeneratedSource, + openingLoc: GeneratedSource, + closingLoc: GeneratedSource, + }, + effects: null, + }; + return [loadJsx, jsxExpr]; +} +function emitOutlinedFn(env, jsx, oldProps, globals) { + const instructions = []; + const oldToNewProps = createOldToNewPropsMapping(env, oldProps); + const propsObj = createTemporaryPlace(env, GeneratedSource); + promoteTemporary(propsObj.identifier); + const destructurePropsInstr = emitDestructureProps(env, propsObj, oldToNewProps); + instructions.push(destructurePropsInstr); + const updatedJsxInstructions = emitUpdatedJsx(jsx, oldToNewProps); + const loadGlobalInstrs = emitLoadGlobals(jsx, globals); + if (!loadGlobalInstrs) { + return null; + } + instructions.push(...loadGlobalInstrs); + instructions.push(...updatedJsxInstructions); + const block = { + kind: 'block', + id: makeBlockId(0), + instructions, + terminal: { + id: makeInstructionId(0), + kind: 'return', + returnVariant: 'Explicit', + loc: GeneratedSource, + value: instructions.at(-1).lvalue, + effects: null, + }, + preds: new Set(), + phis: new Set(), + }; + const fn = { + loc: GeneratedSource, + id: null, + nameHint: null, + fnType: 'Other', + env, + params: [propsObj], + returnTypeAnnotation: null, + returns: createTemporaryPlace(env, GeneratedSource), + context: [], + body: { + entry: block.id, + blocks: new Map([[block.id, block]]), + }, + generator: false, + async: false, + directives: [], + aliasingEffects: [], + }; + return fn; +} +function emitLoadGlobals(jsx, globals) { + const instructions = []; + for (const { value } of jsx) { + if (value.tag.kind === 'Identifier') { + const loadGlobalInstr = globals.get(value.tag.identifier.id); + if (!loadGlobalInstr) { + return null; + } + instructions.push(loadGlobalInstr); + } + } + return instructions; +} +function emitUpdatedJsx(jsx, oldToNewProps) { + const newInstrs = []; + const jsxIds = new Set(jsx.map(i => i.lvalue.identifier.id)); + for (const instr of jsx) { + const { value } = instr; + const newProps = []; + for (const prop of value.props) { + invariant(prop.kind === 'JsxAttribute', `Expected only attributes but found ${prop.kind}`); + if (prop.name === 'key') { + continue; + } + const newProp = oldToNewProps.get(prop.place.identifier.id); + invariant(newProp !== undefined, `Expected a new property for ${printIdentifier(prop.place.identifier)}`); + newProps.push({ + kind: 'JsxAttribute', + name: newProp.originalName, + place: newProp.place, + }); + } + let newChildren = null; + if (value.children) { + newChildren = []; + for (const child of value.children) { + if (jsxIds.has(child.identifier.id)) { + newChildren.push(Object.assign({}, child)); + continue; + } + const newChild = oldToNewProps.get(child.identifier.id); + invariant(newChild !== undefined, `Expected a new prop for ${printIdentifier(child.identifier)}`); + newChildren.push(Object.assign({}, newChild.place)); + } + } + newInstrs.push(Object.assign(Object.assign({}, instr), { value: Object.assign(Object.assign({}, value), { props: newProps, children: newChildren }) })); + } + return newInstrs; +} +function createOldToNewPropsMapping(env, oldProps) { + const oldToNewProps = new Map(); + for (const oldProp of oldProps) { + if (oldProp.originalName === 'key') { + continue; + } + const newProp = Object.assign(Object.assign({}, oldProp), { place: createTemporaryPlace(env, GeneratedSource) }); + newProp.place.identifier.name = makeIdentifierName(oldProp.newName); + oldToNewProps.set(oldProp.place.identifier.id, newProp); + } + return oldToNewProps; +} +function emitDestructureProps(env, propsObj, oldToNewProps) { + const properties = []; + for (const [_, prop] of oldToNewProps) { + properties.push({ + kind: 'ObjectProperty', + key: { + kind: 'string', + name: prop.newName, + }, + type: 'property', + place: prop.place, + }); + } + const destructurePropsInstr = { + id: makeInstructionId(0), + lvalue: createTemporaryPlace(env, GeneratedSource), + loc: GeneratedSource, + value: { + kind: 'Destructure', + lvalue: { + pattern: { + kind: 'ObjectPattern', + properties, + }, + kind: InstructionKind.Let, + }, + loc: GeneratedSource, + value: propsObj, + }, + effects: null, + }; + return destructurePropsInstr; +} + +function optimizePropsMethodCalls(fn) { + for (const [, block] of fn.body.blocks) { + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + if (instr.value.kind === 'MethodCall' && + isPropsType(instr.value.receiver.identifier)) { + instr.value = { + kind: 'CallExpression', + callee: instr.value.property, + args: instr.value.args, + loc: instr.value.loc, + }; + } + } + } +} + +var _Context_env, _Context_errors, _Context_callExpressions, _Context_functionExpressions, _Context_loadLocals, _Context_fireCalleesToFireFunctions, _Context_calleesWithInsertedFire, _Context_capturedCalleeIdentifierIds, _Context_inUseEffectLambda, _Context_loadGlobalInstructionIds, _Context_arrayExpressions; +const CANNOT_COMPILE_FIRE = 'Cannot compile `fire`'; +function transformFire(fn) { + const context = new Context(fn.env); + replaceFireFunctions(fn, context); + if (!context.hasErrors()) { + ensureNoMoreFireUses(fn, context); + } + context.throwIfErrorsFound(); +} +function replaceFireFunctions(fn, context) { + let importedUseFire = null; + let hasRewrite = false; + for (const [, block] of fn.body.blocks) { + const rewriteInstrs = new Map(); + const deleteInstrs = new Set(); + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'CallExpression' && + isUseEffectHookType(value.callee.identifier) && + value.args.length > 0 && + value.args[0].kind === 'Identifier') { + const lambda = context.getFunctionExpression(value.args[0].identifier.id); + if (lambda != null) { + const capturedCallees = visitFunctionExpressionAndPropagateFireDependencies(lambda, context, true); + const newInstrs = []; + for (const [fireCalleePlace, fireCalleeInfo,] of capturedCallees.entries()) { + if (!context.hasCalleeWithInsertedFire(fireCalleePlace)) { + context.addCalleeWithInsertedFire(fireCalleePlace); + importedUseFire !== null && importedUseFire !== void 0 ? importedUseFire : (importedUseFire = fn.env.programContext.addImportSpecifier({ + source: fn.env.programContext.reactRuntimeModule, + importSpecifierName: USE_FIRE_FUNCTION_NAME, + })); + const loadUseFireInstr = makeLoadUseFireInstruction(fn.env, importedUseFire); + const loadFireCalleeInstr = makeLoadFireCalleeInstruction(fn.env, fireCalleeInfo.capturedCalleeIdentifier); + const callUseFireInstr = makeCallUseFireInstruction(fn.env, loadUseFireInstr.lvalue, loadFireCalleeInstr.lvalue); + const storeUseFireInstr = makeStoreUseFireInstruction(fn.env, callUseFireInstr.lvalue, fireCalleeInfo.fireFunctionBinding); + newInstrs.push(loadUseFireInstr, loadFireCalleeInstr, callUseFireInstr, storeUseFireInstr); + const loadUseEffectInstrId = context.getLoadGlobalInstrId(value.callee.identifier.id); + if (loadUseEffectInstrId == null) { + context.pushError({ + loc: value.loc, + description: null, + category: ErrorCategory.Invariant, + reason: '[InsertFire] No LoadGlobal found for useEffect call', + suggestions: null, + }); + continue; + } + rewriteInstrs.set(loadUseEffectInstrId, newInstrs); + } + } + ensureNoRemainingCalleeCaptures(lambda.loweredFunc.func, context, capturedCallees); + if (value.args.length > 1 && + value.args[1] != null && + value.args[1].kind === 'Identifier') { + const depArray = value.args[1]; + const depArrayExpression = context.getArrayExpression(depArray.identifier.id); + if (depArrayExpression != null) { + for (const dependency of depArrayExpression.elements) { + if (dependency.kind === 'Identifier') { + const loadOfDependency = context.getLoadLocalInstr(dependency.identifier.id); + if (loadOfDependency != null) { + const replacedDepArrayItem = capturedCallees.get(loadOfDependency.place.identifier.id); + if (replacedDepArrayItem != null) { + loadOfDependency.place = + replacedDepArrayItem.fireFunctionBinding; + } + } + } + } + } + else { + context.pushError({ + loc: value.args[1].loc, + description: 'You must use an array literal for an effect dependency array when that effect uses `fire()`', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + else if (value.args.length > 1 && value.args[1].kind === 'Spread') { + context.pushError({ + loc: value.args[1].place.loc, + description: 'You must use an array literal for an effect dependency array when that effect uses `fire()`', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + } + else if (value.kind === 'CallExpression' && + value.callee.identifier.type.kind === 'Function' && + value.callee.identifier.type.shapeId === BuiltInFireId && + context.inUseEffectLambda()) { + if (value.args.length === 1 && value.args[0].kind === 'Identifier') { + const callExpr = context.getCallExpression(value.args[0].identifier.id); + if (callExpr != null) { + const calleeId = callExpr.callee.identifier.id; + const loadLocal = context.getLoadLocalInstr(calleeId); + if (loadLocal == null) { + context.pushError({ + loc: value.loc, + description: null, + category: ErrorCategory.Invariant, + reason: '[InsertFire] No loadLocal found for fire call argument', + suggestions: null, + }); + continue; + } + const fireFunctionBinding = context.getOrGenerateFireFunctionBinding(loadLocal.place, value.loc); + loadLocal.place = Object.assign({}, fireFunctionBinding); + deleteInstrs.add(instr.id); + } + else { + context.pushError({ + loc: value.loc, + description: '`fire()` can only receive a function call such as `fire(fn(a,b)). Method calls and other expressions are not allowed', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + else { + let description = 'fire() can only take in a single call expression as an argument'; + if (value.args.length === 0) { + description += ' but received none'; + } + else if (value.args.length > 1) { + description += ' but received multiple arguments'; + } + else if (value.args[0].kind === 'Spread') { + description += ' but received a spread argument'; + } + context.pushError({ + loc: value.loc, + description, + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + else if (value.kind === 'CallExpression') { + context.addCallExpression(lvalue.identifier.id, value); + } + else if (value.kind === 'FunctionExpression' && + context.inUseEffectLambda()) { + visitFunctionExpressionAndPropagateFireDependencies(value, context, false); + } + else if (value.kind === 'FunctionExpression') { + context.addFunctionExpression(lvalue.identifier.id, value); + } + else if (value.kind === 'LoadLocal') { + context.addLoadLocalInstr(lvalue.identifier.id, value); + } + else if (value.kind === 'LoadGlobal' && + value.binding.kind === 'ImportSpecifier' && + value.binding.module === 'react' && + value.binding.imported === 'fire' && + context.inUseEffectLambda()) { + deleteInstrs.add(instr.id); + } + else if (value.kind === 'LoadGlobal') { + context.addLoadGlobalInstrId(lvalue.identifier.id, instr.id); + } + else if (value.kind === 'ArrayExpression') { + context.addArrayExpression(lvalue.identifier.id, value); + } + } + block.instructions = rewriteInstructions(rewriteInstrs, block.instructions); + block.instructions = deleteInstructions(deleteInstrs, block.instructions); + if (rewriteInstrs.size > 0 || deleteInstrs.size > 0) { + hasRewrite = true; + fn.env.hasFireRewrite = true; + } + } + if (hasRewrite) { + markInstructionIds(fn.body); + } +} +function visitFunctionExpressionAndPropagateFireDependencies(fnExpr, context, enteringUseEffect) { + let withScope = enteringUseEffect + ? context.withUseEffectLambdaScope.bind(context) + : context.withFunctionScope.bind(context); + const calleesCapturedByFnExpression = withScope(() => replaceFireFunctions(fnExpr.loweredFunc.func, context)); + for (let contextIdx = 0; contextIdx < fnExpr.loweredFunc.func.context.length; contextIdx++) { + const contextItem = fnExpr.loweredFunc.func.context[contextIdx]; + const replacedCallee = calleesCapturedByFnExpression.get(contextItem.identifier.id); + if (replacedCallee != null) { + fnExpr.loweredFunc.func.context[contextIdx] = Object.assign({}, replacedCallee.fireFunctionBinding); + } + } + context.mergeCalleesFromInnerScope(calleesCapturedByFnExpression); + return calleesCapturedByFnExpression; +} +function* eachReachablePlace(fn) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + yield* eachReachablePlace(instr.value.loweredFunc.func); + } + else { + yield* eachInstructionOperand(instr); + } + } + } +} +function ensureNoRemainingCalleeCaptures(fn, context, capturedCallees) { + var _a; + for (const place of eachReachablePlace(fn)) { + const calleeInfo = capturedCallees.get(place.identifier.id); + if (calleeInfo != null) { + const calleeName = ((_a = calleeInfo.capturedCalleeIdentifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named' + ? calleeInfo.capturedCalleeIdentifier.name.value + : ''; + context.pushError({ + loc: place.loc, + description: `All uses of ${calleeName} must be either used with a fire() call in \ +this effect or not used with a fire() call at all. ${calleeName} was used with fire() on line \ +${printSourceLocationLine(calleeInfo.fireLoc)} in this effect`, + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } +} +function ensureNoMoreFireUses(fn, context) { + for (const place of eachReachablePlace(fn)) { + if (place.identifier.type.kind === 'Function' && + place.identifier.type.shapeId === BuiltInFireId) { + context.pushError({ + loc: place.identifier.loc, + description: 'Cannot use `fire` outside of a useEffect function', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } +} +function makeLoadUseFireInstruction(env, importedLoadUseFire) { + const useFirePlace = createTemporaryPlace(env, GeneratedSource); + useFirePlace.effect = Effect.Read; + useFirePlace.identifier.type = DefaultNonmutatingHook; + const instrValue = { + kind: 'LoadGlobal', + binding: Object.assign({}, importedLoadUseFire), + loc: GeneratedSource, + }; + return { + id: makeInstructionId(0), + value: instrValue, + lvalue: Object.assign({}, useFirePlace), + loc: GeneratedSource, + effects: null, + }; +} +function makeLoadFireCalleeInstruction(env, fireCalleeIdentifier) { + const loadedFireCallee = createTemporaryPlace(env, GeneratedSource); + const fireCallee = { + kind: 'Identifier', + identifier: fireCalleeIdentifier, + reactive: false, + effect: Effect.Unknown, + loc: fireCalleeIdentifier.loc, + }; + return { + id: makeInstructionId(0), + value: { + kind: 'LoadLocal', + loc: GeneratedSource, + place: Object.assign({}, fireCallee), + }, + lvalue: Object.assign({}, loadedFireCallee), + loc: GeneratedSource, + effects: null, + }; +} +function makeCallUseFireInstruction(env, useFirePlace, argPlace) { + const useFireCallResultPlace = createTemporaryPlace(env, GeneratedSource); + useFireCallResultPlace.effect = Effect.Read; + const useFireCall = { + kind: 'CallExpression', + callee: Object.assign({}, useFirePlace), + args: [argPlace], + loc: GeneratedSource, + }; + return { + id: makeInstructionId(0), + value: useFireCall, + lvalue: Object.assign({}, useFireCallResultPlace), + loc: GeneratedSource, + effects: null, + }; +} +function makeStoreUseFireInstruction(env, useFireCallResultPlace, fireFunctionBindingPlace) { + promoteTemporary(fireFunctionBindingPlace.identifier); + const fireFunctionBindingLValuePlace = createTemporaryPlace(env, GeneratedSource); + return { + id: makeInstructionId(0), + value: { + kind: 'StoreLocal', + lvalue: { + kind: InstructionKind.Const, + place: Object.assign({}, fireFunctionBindingPlace), + }, + value: Object.assign({}, useFireCallResultPlace), + type: null, + loc: GeneratedSource, + }, + lvalue: fireFunctionBindingLValuePlace, + loc: GeneratedSource, + effects: null, + }; +} +class Context { + constructor(env) { + _Context_env.set(this, void 0); + _Context_errors.set(this, new CompilerError()); + _Context_callExpressions.set(this, new Map()); + _Context_functionExpressions.set(this, new Map()); + _Context_loadLocals.set(this, new Map()); + _Context_fireCalleesToFireFunctions.set(this, new Map()); + _Context_calleesWithInsertedFire.set(this, new Set()); + _Context_capturedCalleeIdentifierIds.set(this, new Map()); + _Context_inUseEffectLambda.set(this, false); + _Context_loadGlobalInstructionIds.set(this, new Map()); + _Context_arrayExpressions.set(this, new Map()); + __classPrivateFieldSet(this, _Context_env, env, "f"); + } + pushError(error) { + __classPrivateFieldGet(this, _Context_errors, "f").push(error); + } + withFunctionScope(fn) { + fn(); + return __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f"); + } + withUseEffectLambdaScope(fn) { + const capturedCalleeIdentifierIds = __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f"); + const inUseEffectLambda = __classPrivateFieldGet(this, _Context_inUseEffectLambda, "f"); + __classPrivateFieldSet(this, _Context_capturedCalleeIdentifierIds, new Map(), "f"); + __classPrivateFieldSet(this, _Context_inUseEffectLambda, true, "f"); + const resultCapturedCalleeIdentifierIds = this.withFunctionScope(fn); + __classPrivateFieldSet(this, _Context_capturedCalleeIdentifierIds, capturedCalleeIdentifierIds, "f"); + __classPrivateFieldSet(this, _Context_inUseEffectLambda, inUseEffectLambda, "f"); + return resultCapturedCalleeIdentifierIds; + } + addCallExpression(id, callExpr) { + __classPrivateFieldGet(this, _Context_callExpressions, "f").set(id, callExpr); + } + getCallExpression(id) { + return __classPrivateFieldGet(this, _Context_callExpressions, "f").get(id); + } + addLoadLocalInstr(id, loadLocal) { + __classPrivateFieldGet(this, _Context_loadLocals, "f").set(id, loadLocal); + } + getLoadLocalInstr(id) { + return __classPrivateFieldGet(this, _Context_loadLocals, "f").get(id); + } + getOrGenerateFireFunctionBinding(callee, fireLoc) { + const fireFunctionBinding = getOrInsertWith(__classPrivateFieldGet(this, _Context_fireCalleesToFireFunctions, "f"), callee.identifier.id, () => createTemporaryPlace(__classPrivateFieldGet(this, _Context_env, "f"), GeneratedSource)); + fireFunctionBinding.identifier.type = { + kind: 'Function', + shapeId: BuiltInFireFunctionId, + return: { kind: 'Poly' }, + isConstructor: false, + }; + __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f").set(callee.identifier.id, { + fireFunctionBinding, + capturedCalleeIdentifier: callee.identifier, + fireLoc, + }); + return fireFunctionBinding; + } + mergeCalleesFromInnerScope(innerCallees) { + for (const [id, calleeInfo] of innerCallees.entries()) { + __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f").set(id, calleeInfo); + } + } + addCalleeWithInsertedFire(id) { + __classPrivateFieldGet(this, _Context_calleesWithInsertedFire, "f").add(id); + } + hasCalleeWithInsertedFire(id) { + return __classPrivateFieldGet(this, _Context_calleesWithInsertedFire, "f").has(id); + } + inUseEffectLambda() { + return __classPrivateFieldGet(this, _Context_inUseEffectLambda, "f"); + } + addFunctionExpression(id, fn) { + __classPrivateFieldGet(this, _Context_functionExpressions, "f").set(id, fn); + } + getFunctionExpression(id) { + return __classPrivateFieldGet(this, _Context_functionExpressions, "f").get(id); + } + addLoadGlobalInstrId(id, instrId) { + __classPrivateFieldGet(this, _Context_loadGlobalInstructionIds, "f").set(id, instrId); + } + getLoadGlobalInstrId(id) { + return __classPrivateFieldGet(this, _Context_loadGlobalInstructionIds, "f").get(id); + } + addArrayExpression(id, array) { + __classPrivateFieldGet(this, _Context_arrayExpressions, "f").set(id, array); + } + getArrayExpression(id) { + return __classPrivateFieldGet(this, _Context_arrayExpressions, "f").get(id); + } + hasErrors() { + return __classPrivateFieldGet(this, _Context_errors, "f").hasAnyErrors(); + } + throwIfErrorsFound() { + if (this.hasErrors()) + throw __classPrivateFieldGet(this, _Context_errors, "f"); + } +} +_Context_env = new WeakMap(), _Context_errors = new WeakMap(), _Context_callExpressions = new WeakMap(), _Context_functionExpressions = new WeakMap(), _Context_loadLocals = new WeakMap(), _Context_fireCalleesToFireFunctions = new WeakMap(), _Context_calleesWithInsertedFire = new WeakMap(), _Context_capturedCalleeIdentifierIds = new WeakMap(), _Context_inUseEffectLambda = new WeakMap(), _Context_loadGlobalInstructionIds = new WeakMap(), _Context_arrayExpressions = new WeakMap(); +function deleteInstructions(deleteInstrs, instructions) { + if (deleteInstrs.size > 0) { + const newInstrs = instructions.filter(instr => !deleteInstrs.has(instr.id)); + return newInstrs; + } + return instructions; +} +function rewriteInstructions(rewriteInstrs, instructions) { + if (rewriteInstrs.size > 0) { + const newInstrs = []; + for (const instr of instructions) { + const newInstrsAtId = rewriteInstrs.get(instr.id); + if (newInstrsAtId != null) { + newInstrs.push(...newInstrsAtId, instr); + } + else { + newInstrs.push(instr); + } + } + return newInstrs; + } + return instructions; +} + +function validateNoImpureFunctionsInRender(fn) { + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const value = instr.value; + if (value.kind === 'MethodCall' || value.kind == 'CallExpression') { + const callee = value.kind === 'MethodCall' ? value.property : value.callee; + const signature = getFunctionCallSignature(fn.env, callee.identifier.type); + if (signature != null && signature.impure === true) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Purity, + reason: 'Cannot call impure function during render', + description: (signature.canonicalName != null + ? `\`${signature.canonicalName}\` is an impure function. ` + : '') + + 'Calling an impure function can produce unstable results that update unpredictably when the component happens to re-render. (https://react.dev/reference/rules/components-and-hooks-must-be-pure#components-and-hooks-must-be-idempotent)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: 'Cannot call impure function', + })); + } + } + } + } + return errors.asResult(); +} + +function validateStaticComponents(fn) { + const error = new CompilerError(); + const knownDynamicComponents = new Map(); + for (const block of fn.body.blocks.values()) { + phis: for (const phi of block.phis) { + for (const operand of phi.operands.values()) { + const loc = knownDynamicComponents.get(operand.identifier.id); + if (loc != null) { + knownDynamicComponents.set(phi.place.identifier.id, loc); + continue phis; + } + } + } + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'FunctionExpression': + case 'NewExpression': + case 'MethodCall': + case 'CallExpression': { + knownDynamicComponents.set(lvalue.identifier.id, value.loc); + break; + } + case 'LoadLocal': { + const loc = knownDynamicComponents.get(value.place.identifier.id); + if (loc != null) { + knownDynamicComponents.set(lvalue.identifier.id, loc); + } + break; + } + case 'StoreLocal': { + const loc = knownDynamicComponents.get(value.value.identifier.id); + if (loc != null) { + knownDynamicComponents.set(lvalue.identifier.id, loc); + knownDynamicComponents.set(value.lvalue.place.identifier.id, loc); + } + break; + } + case 'JsxExpression': { + if (value.tag.kind === 'Identifier') { + const location = knownDynamicComponents.get(value.tag.identifier.id); + if (location != null) { + error.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.StaticComponents, + reason: 'Cannot create components during render', + description: `Components created during render will reset their state each time they are created. Declare components outside of render`, + }) + .withDetails({ + kind: 'error', + loc: value.tag.loc, + message: 'This component is created during render', + }) + .withDetails({ + kind: 'error', + loc: location, + message: 'The component is created during render here', + })); + } + } + } + } + } + } + return error.asResult(); +} + +function validateNoFreezingKnownMutableFunctions(fn) { + const errors = new CompilerError(); + const contextMutationEffects = new Map(); + function visitOperand(operand) { + if (operand.effect === Effect.Freeze) { + const effect = contextMutationEffects.get(operand.identifier.id); + if (effect != null) { + const place = effect.value; + const variable = place != null && + place.identifier.name != null && + place.identifier.name.kind === 'named' + ? `\`${place.identifier.name.value}\`` + : 'a local variable'; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot modify local variables after render completes', + description: `This argument is a function which may reassign or mutate ${variable} after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead`, + }) + .withDetails({ + kind: 'error', + loc: operand.loc, + message: `This function may (indirectly) reassign or modify ${variable} after render`, + }) + .withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `This modifies ${variable}`, + })); + } + } + } + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'LoadLocal': { + const effect = contextMutationEffects.get(value.place.identifier.id); + if (effect != null) { + contextMutationEffects.set(lvalue.identifier.id, effect); + } + break; + } + case 'StoreLocal': { + const effect = contextMutationEffects.get(value.value.identifier.id); + if (effect != null) { + contextMutationEffects.set(lvalue.identifier.id, effect); + contextMutationEffects.set(value.lvalue.place.identifier.id, effect); + } + break; + } + case 'FunctionExpression': { + if (value.loweredFunc.func.aliasingEffects != null) { + const context = new Set(value.loweredFunc.func.context.map(p => p.identifier.id)); + effects: for (const effect of value.loweredFunc.func + .aliasingEffects) { + switch (effect.kind) { + case 'Mutate': + case 'MutateTransitive': { + const knownMutation = contextMutationEffects.get(effect.value.identifier.id); + if (knownMutation != null) { + contextMutationEffects.set(lvalue.identifier.id, knownMutation); + } + else if (context.has(effect.value.identifier.id) && + !isRefOrRefLikeMutableType(effect.value.identifier.type)) { + contextMutationEffects.set(lvalue.identifier.id, effect); + break effects; + } + break; + } + case 'MutateConditionally': + case 'MutateTransitiveConditionally': { + const knownMutation = contextMutationEffects.get(effect.value.identifier.id); + if (knownMutation != null) { + contextMutationEffects.set(lvalue.identifier.id, knownMutation); + } + break; + } + } + } + } + break; + } + default: { + for (const operand of eachInstructionValueOperand(value)) { + visitOperand(operand); + } + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visitOperand(operand); + } + } + return errors.asResult(); +} + +function validateNoDerivedComputationsInEffects(fn) { + const candidateDependencies = new Map(); + const functions = new Map(); + const locals = new Map(); + const errors = new CompilerError(); + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + if (value.kind === 'LoadLocal') { + locals.set(lvalue.identifier.id, value.place.identifier.id); + } + else if (value.kind === 'ArrayExpression') { + candidateDependencies.set(lvalue.identifier.id, value); + } + else if (value.kind === 'FunctionExpression') { + functions.set(lvalue.identifier.id, value); + } + else if (value.kind === 'CallExpression' || + value.kind === 'MethodCall') { + const callee = value.kind === 'CallExpression' ? value.callee : value.property; + if (isUseEffectHookType(callee.identifier) && + value.args.length === 2 && + value.args[0].kind === 'Identifier' && + value.args[1].kind === 'Identifier') { + const effectFunction = functions.get(value.args[0].identifier.id); + const deps = candidateDependencies.get(value.args[1].identifier.id); + if (effectFunction != null && + deps != null && + deps.elements.length !== 0 && + deps.elements.every(element => element.kind === 'Identifier')) { + const dependencies = deps.elements.map(dep => { + var _a; + CompilerError.invariant(dep.kind === 'Identifier', { + reason: `Dependency is checked as a place above`, + description: null, + details: [ + { + kind: 'error', + loc: value.loc, + message: 'this is checked as a place above', + }, + ], + }); + return (_a = locals.get(dep.identifier.id)) !== null && _a !== void 0 ? _a : dep.identifier.id; + }); + validateEffect(effectFunction.loweredFunc.func, dependencies, errors); + } + } + } + } + } + if (errors.hasAnyErrors()) { + throw errors; + } +} +function validateEffect(effectFunction, effectDeps, errors) { + for (const operand of effectFunction.context) { + if (isSetStateType(operand.identifier)) { + continue; + } + else if (effectDeps.find(dep => dep === operand.identifier.id) != null) { + continue; + } + else { + return; + } + } + for (const dep of effectDeps) { + if (effectFunction.context.find(operand => operand.identifier.id === dep) == + null) { + return; + } + } + const seenBlocks = new Set(); + const values = new Map(); + for (const dep of effectDeps) { + values.set(dep, [dep]); + } + const setStateLocations = []; + for (const block of effectFunction.body.blocks.values()) { + for (const pred of block.preds) { + if (!seenBlocks.has(pred)) { + return; + } + } + for (const phi of block.phis) { + const aggregateDeps = new Set(); + for (const operand of phi.operands.values()) { + const deps = values.get(operand.identifier.id); + if (deps != null) { + for (const dep of deps) { + aggregateDeps.add(dep); + } + } + } + if (aggregateDeps.size !== 0) { + values.set(phi.place.identifier.id, Array.from(aggregateDeps)); + } + } + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'Primitive': + case 'JSXText': + case 'LoadGlobal': { + break; + } + case 'LoadLocal': { + const deps = values.get(instr.value.place.identifier.id); + if (deps != null) { + values.set(instr.lvalue.identifier.id, deps); + } + break; + } + case 'ComputedLoad': + case 'PropertyLoad': + case 'BinaryExpression': + case 'TemplateLiteral': + case 'CallExpression': + case 'MethodCall': { + const aggregateDeps = new Set(); + for (const operand of eachInstructionValueOperand(instr.value)) { + const deps = values.get(operand.identifier.id); + if (deps != null) { + for (const dep of deps) { + aggregateDeps.add(dep); + } + } + } + if (aggregateDeps.size !== 0) { + values.set(instr.lvalue.identifier.id, Array.from(aggregateDeps)); + } + if (instr.value.kind === 'CallExpression' && + isSetStateType(instr.value.callee.identifier) && + instr.value.args.length === 1 && + instr.value.args[0].kind === 'Identifier') { + const deps = values.get(instr.value.args[0].identifier.id); + if (deps != null && new Set(deps).size === effectDeps.length) { + setStateLocations.push(instr.value.callee.loc); + } + else { + return; + } + } + break; + } + default: { + return; + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + if (values.has(operand.identifier.id)) { + return; + } + } + seenBlocks.add(block.id); + } + for (const loc of setStateLocations) { + errors.push({ + category: ErrorCategory.EffectDerivationsOfState, + reason: 'Values derived from props and state should be calculated during render, not in an effect. (https://react.dev/learn/you-might-not-need-an-effect#updating-state-based-on-props-or-state)', + description: null, + loc, + suggestions: null, + }); + } +} + +function nameAnonymousFunctions(fn) { + if (fn.id == null) { + return; + } + const parentName = fn.id; + const functions = nameAnonymousFunctionsImpl(fn); + function visit(node, prefix) { + var _a, _b; + if (node.generatedName != null && node.fn.nameHint == null) { + const name = `${prefix}${node.generatedName}]`; + node.fn.nameHint = name; + node.fn.loweredFunc.func.nameHint = name; + } + const nextPrefix = `${prefix}${(_b = (_a = node.generatedName) !== null && _a !== void 0 ? _a : node.fn.name) !== null && _b !== void 0 ? _b : ''} > `; + for (const inner of node.inner) { + visit(inner, nextPrefix); + } + } + for (const node of functions) { + visit(node, `${parentName}[`); + } +} +function nameAnonymousFunctionsImpl(fn) { + var _a, _b; + const functions = new Map(); + const names = new Map(); + const nodes = []; + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'LoadGlobal': { + names.set(lvalue.identifier.id, value.binding.name); + break; + } + case 'LoadContext': + case 'LoadLocal': { + const name = value.place.identifier.name; + if (name != null && name.kind === 'named') { + names.set(lvalue.identifier.id, name.value); + } + const func = functions.get(value.place.identifier.id); + if (func != null) { + functions.set(lvalue.identifier.id, func); + } + break; + } + case 'PropertyLoad': { + const objectName = names.get(value.object.identifier.id); + if (objectName != null) { + names.set(lvalue.identifier.id, `${objectName}.${String(value.property)}`); + } + break; + } + case 'FunctionExpression': { + const inner = nameAnonymousFunctionsImpl(value.loweredFunc.func); + const node = { + fn: value, + generatedName: null, + inner, + }; + nodes.push(node); + if (value.name == null) { + functions.set(lvalue.identifier.id, node); + } + break; + } + case 'StoreContext': + case 'StoreLocal': { + const node = functions.get(value.value.identifier.id); + const variableName = value.lvalue.place.identifier.name; + if (node != null && + node.generatedName == null && + variableName != null && + variableName.kind === 'named') { + node.generatedName = variableName.value; + functions.delete(value.value.identifier.id); + } + break; + } + case 'CallExpression': + case 'MethodCall': { + const callee = value.kind === 'MethodCall' ? value.property : value.callee; + const hookKind = getHookKind(fn.env, callee.identifier); + let calleeName = null; + if (hookKind != null && hookKind !== 'Custom') { + calleeName = hookKind; + } + else { + calleeName = (_a = names.get(callee.identifier.id)) !== null && _a !== void 0 ? _a : '(anonymous)'; + } + let fnArgCount = 0; + for (const arg of value.args) { + if (arg.kind === 'Identifier' && functions.has(arg.identifier.id)) { + fnArgCount++; + } + } + for (let i = 0; i < value.args.length; i++) { + const arg = value.args[i]; + if (arg.kind === 'Spread') { + continue; + } + const node = functions.get(arg.identifier.id); + if (node != null && node.generatedName == null) { + const generatedName = fnArgCount > 1 ? `${calleeName}(arg${i})` : `${calleeName}()`; + node.generatedName = generatedName; + functions.delete(arg.identifier.id); + } + } + break; + } + case 'JsxExpression': { + for (const attr of value.props) { + if (attr.kind === 'JsxSpreadAttribute') { + continue; + } + const node = functions.get(attr.place.identifier.id); + if (node != null && node.generatedName == null) { + const elementName = value.tag.kind === 'BuiltinTag' + ? value.tag.name + : ((_b = names.get(value.tag.identifier.id)) !== null && _b !== void 0 ? _b : null); + const propName = elementName == null + ? attr.name + : `<${elementName}>.${attr.name}`; + node.generatedName = `${propName}`; + functions.delete(attr.place.identifier.id); + } + } + break; + } + } + } + } + return nodes; +} + +function run(func, config, fnType, mode, programContext, logger, filename, code) { + var _a, _b; + const contextIdentifiers = findContextIdentifiers(func); + const env = new Environment(func.scope, fnType, mode, config, contextIdentifiers, func, logger, filename, code, programContext); + (_b = (_a = env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, { + kind: 'debug', + name: 'EnvironmentConfig', + value: prettyFormat(env.config), + }); + return runWithEnvironment(func, env); +} +function runWithEnvironment(func, env) { + const log = (value) => { + var _a, _b; + (_b = (_a = env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, value); + }; + const hir = lower(func, env).unwrap(); + log({ kind: 'hir', name: 'HIR', value: hir }); + pruneMaybeThrows(hir); + log({ kind: 'hir', name: 'PruneMaybeThrows', value: hir }); + validateContextVariableLValues(hir); + validateUseMemo(hir).unwrap(); + if (env.isInferredMemoEnabled && + !env.config.enablePreserveExistingManualUseMemo && + !env.config.disableMemoizationForDebugging && + !env.config.enableChangeDetectionForDebugging) { + dropManualMemoization(hir).unwrap(); + log({ kind: 'hir', name: 'DropManualMemoization', value: hir }); + } + inlineImmediatelyInvokedFunctionExpressions(hir); + log({ + kind: 'hir', + name: 'InlineImmediatelyInvokedFunctionExpressions', + value: hir, + }); + mergeConsecutiveBlocks(hir); + log({ kind: 'hir', name: 'MergeConsecutiveBlocks', value: hir }); + assertConsistentIdentifiers(hir); + assertTerminalSuccessorsExist(hir); + enterSSA(hir); + log({ kind: 'hir', name: 'SSA', value: hir }); + eliminateRedundantPhi(hir); + log({ kind: 'hir', name: 'EliminateRedundantPhi', value: hir }); + assertConsistentIdentifiers(hir); + constantPropagation(hir); + log({ kind: 'hir', name: 'ConstantPropagation', value: hir }); + inferTypes(hir); + log({ kind: 'hir', name: 'InferTypes', value: hir }); + if (env.isInferredMemoEnabled) { + if (env.config.validateHooksUsage) { + validateHooksUsage(hir).unwrap(); + } + if (env.config.validateNoCapitalizedCalls) { + validateNoCapitalizedCalls(hir).unwrap(); + } + } + if (env.config.enableFire) { + transformFire(hir); + log({ kind: 'hir', name: 'TransformFire', value: hir }); + } + if (env.config.lowerContextAccess) { + lowerContextAccess(hir, env.config.lowerContextAccess); + } + optimizePropsMethodCalls(hir); + log({ kind: 'hir', name: 'OptimizePropsMethodCalls', value: hir }); + analyseFunctions(hir); + log({ kind: 'hir', name: 'AnalyseFunctions', value: hir }); + const mutabilityAliasingErrors = inferMutationAliasingEffects(hir); + log({ kind: 'hir', name: 'InferMutationAliasingEffects', value: hir }); + if (env.isInferredMemoEnabled) { + if (mutabilityAliasingErrors.isErr()) { + throw mutabilityAliasingErrors.unwrapErr(); + } + } + deadCodeElimination(hir); + log({ kind: 'hir', name: 'DeadCodeElimination', value: hir }); + if (env.config.enableInstructionReordering) { + instructionReordering(hir); + log({ kind: 'hir', name: 'InstructionReordering', value: hir }); + } + pruneMaybeThrows(hir); + log({ kind: 'hir', name: 'PruneMaybeThrows', value: hir }); + const mutabilityAliasingRangeErrors = inferMutationAliasingRanges(hir, { + isFunctionExpression: false, + }); + log({ kind: 'hir', name: 'InferMutationAliasingRanges', value: hir }); + if (env.isInferredMemoEnabled) { + if (mutabilityAliasingRangeErrors.isErr()) { + throw mutabilityAliasingRangeErrors.unwrapErr(); + } + validateLocalsNotReassignedAfterRender(hir); + } + if (env.isInferredMemoEnabled) { + if (env.config.assertValidMutableRanges) { + assertValidMutableRanges(hir); + } + if (env.config.validateRefAccessDuringRender) { + validateNoRefAccessInRender(hir).unwrap(); + } + if (env.config.validateNoSetStateInRender) { + validateNoSetStateInRender(hir).unwrap(); + } + if (env.config.validateNoDerivedComputationsInEffects) { + validateNoDerivedComputationsInEffects(hir); + } + if (env.config.validateNoSetStateInEffects) { + env.logErrors(validateNoSetStateInEffects(hir, env)); + } + if (env.config.validateNoJSXInTryStatements) { + env.logErrors(validateNoJSXInTryStatement(hir)); + } + if (env.config.validateNoImpureFunctionsInRender) { + validateNoImpureFunctionsInRender(hir).unwrap(); + } + validateNoFreezingKnownMutableFunctions(hir).unwrap(); + } + inferReactivePlaces(hir); + log({ kind: 'hir', name: 'InferReactivePlaces', value: hir }); + rewriteInstructionKindsBasedOnReassignment(hir); + log({ + kind: 'hir', + name: 'RewriteInstructionKindsBasedOnReassignment', + value: hir, + }); + if (env.isInferredMemoEnabled) { + if (env.config.validateStaticComponents) { + env.logErrors(validateStaticComponents(hir)); + } + inferReactiveScopeVariables(hir); + log({ kind: 'hir', name: 'InferReactiveScopeVariables', value: hir }); + } + const fbtOperands = memoizeFbtAndMacroOperandsInSameScope(hir); + log({ + kind: 'hir', + name: 'MemoizeFbtAndMacroOperandsInSameScope', + value: hir, + }); + if (env.config.enableJsxOutlining) { + outlineJSX(hir); + } + if (env.config.enableNameAnonymousFunctions) { + nameAnonymousFunctions(hir); + log({ + kind: 'hir', + name: 'NameAnonymousFunctions', + value: hir, + }); + } + if (env.config.enableFunctionOutlining) { + outlineFunctions(hir, fbtOperands); + log({ kind: 'hir', name: 'OutlineFunctions', value: hir }); + } + alignMethodCallScopes(hir); + log({ + kind: 'hir', + name: 'AlignMethodCallScopes', + value: hir, + }); + alignObjectMethodScopes(hir); + log({ + kind: 'hir', + name: 'AlignObjectMethodScopes', + value: hir, + }); + pruneUnusedLabelsHIR(hir); + log({ + kind: 'hir', + name: 'PruneUnusedLabelsHIR', + value: hir, + }); + alignReactiveScopesToBlockScopesHIR(hir); + log({ + kind: 'hir', + name: 'AlignReactiveScopesToBlockScopesHIR', + value: hir, + }); + mergeOverlappingReactiveScopesHIR(hir); + log({ + kind: 'hir', + name: 'MergeOverlappingReactiveScopesHIR', + value: hir, + }); + assertValidBlockNesting(hir); + buildReactiveScopeTerminalsHIR(hir); + log({ + kind: 'hir', + name: 'BuildReactiveScopeTerminalsHIR', + value: hir, + }); + assertValidBlockNesting(hir); + flattenReactiveLoopsHIR(hir); + log({ + kind: 'hir', + name: 'FlattenReactiveLoopsHIR', + value: hir, + }); + flattenScopesWithHooksOrUseHIR(hir); + log({ + kind: 'hir', + name: 'FlattenScopesWithHooksOrUseHIR', + value: hir, + }); + assertTerminalSuccessorsExist(hir); + assertTerminalPredsExist(hir); + propagateScopeDependenciesHIR(hir); + log({ + kind: 'hir', + name: 'PropagateScopeDependenciesHIR', + value: hir, + }); + if (env.config.inferEffectDependencies) { + inferEffectDependencies(hir); + log({ + kind: 'hir', + name: 'InferEffectDependencies', + value: hir, + }); + } + if (env.config.inlineJsxTransform) { + inlineJsxTransform(hir, env.config.inlineJsxTransform); + log({ + kind: 'hir', + name: 'inlineJsxTransform', + value: hir, + }); + } + const reactiveFunction = buildReactiveFunction(hir); + log({ + kind: 'reactive', + name: 'BuildReactiveFunction', + value: reactiveFunction, + }); + assertWellFormedBreakTargets(reactiveFunction); + pruneUnusedLabels(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneUnusedLabels', + value: reactiveFunction, + }); + assertScopeInstructionsWithinScopes(reactiveFunction); + pruneNonEscapingScopes(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneNonEscapingScopes', + value: reactiveFunction, + }); + pruneNonReactiveDependencies(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneNonReactiveDependencies', + value: reactiveFunction, + }); + pruneUnusedScopes(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneUnusedScopes', + value: reactiveFunction, + }); + mergeReactiveScopesThatInvalidateTogether(reactiveFunction); + log({ + kind: 'reactive', + name: 'MergeReactiveScopesThatInvalidateTogether', + value: reactiveFunction, + }); + pruneAlwaysInvalidatingScopes(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneAlwaysInvalidatingScopes', + value: reactiveFunction, + }); + if (env.config.enableChangeDetectionForDebugging != null) { + pruneInitializationDependencies(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneInitializationDependencies', + value: reactiveFunction, + }); + } + propagateEarlyReturns(reactiveFunction); + log({ + kind: 'reactive', + name: 'PropagateEarlyReturns', + value: reactiveFunction, + }); + pruneUnusedLValues(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneUnusedLValues', + value: reactiveFunction, + }); + promoteUsedTemporaries(reactiveFunction); + log({ + kind: 'reactive', + name: 'PromoteUsedTemporaries', + value: reactiveFunction, + }); + extractScopeDeclarationsFromDestructuring(reactiveFunction); + log({ + kind: 'reactive', + name: 'ExtractScopeDeclarationsFromDestructuring', + value: reactiveFunction, + }); + stabilizeBlockIds(reactiveFunction); + log({ + kind: 'reactive', + name: 'StabilizeBlockIds', + value: reactiveFunction, + }); + const uniqueIdentifiers = renameVariables(reactiveFunction); + log({ + kind: 'reactive', + name: 'RenameVariables', + value: reactiveFunction, + }); + pruneHoistedContexts(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneHoistedContexts', + value: reactiveFunction, + }); + if (env.config.validateMemoizedEffectDependencies) { + validateMemoizedEffectDependencies(reactiveFunction).unwrap(); + } + if (env.config.enablePreserveExistingMemoizationGuarantees || + env.config.validatePreserveExistingMemoizationGuarantees) { + validatePreservedManualMemoization(reactiveFunction).unwrap(); + } + const ast = codegenFunction(reactiveFunction, { + uniqueIdentifiers, + fbtOperands, + }).unwrap(); + log({ kind: 'ast', name: 'Codegen', value: ast }); + for (const outlined of ast.outlined) { + log({ kind: 'ast', name: 'Codegen (outlined)', value: outlined.fn }); + } + if (env.config.throwUnknownException__testonly) { + throw new Error('unexpected error'); + } + return ast; +} +function compileFn(func, config, fnType, mode, programContext, logger, filename, code) { + return run(func, config, fnType, mode, programContext, logger, filename, code); +} + +function filterSuppressionsThatAffectFunction(suppressionRanges, fn) { + const suppressionsInScope = []; + const fnNode = fn.node; + for (const suppressionRange of suppressionRanges) { + if (suppressionRange.disableComment.start == null || + fnNode.start == null || + fnNode.end == null) { + continue; + } + if (suppressionRange.disableComment.start > fnNode.start && + (suppressionRange.enableComment === null || + (suppressionRange.enableComment.end != null && + suppressionRange.enableComment.end < fnNode.end))) { + suppressionsInScope.push(suppressionRange); + } + if (suppressionRange.disableComment.start < fnNode.start && + (suppressionRange.enableComment === null || + (suppressionRange.enableComment.end != null && + suppressionRange.enableComment.end > fnNode.end))) { + suppressionsInScope.push(suppressionRange); + } + } + return suppressionsInScope; +} +function findProgramSuppressions(programComments, ruleNames, flowSuppressions) { + const suppressionRanges = []; + let disableComment = null; + let enableComment = null; + let source = null; + let disableNextLinePattern = null; + let disablePattern = null; + let enablePattern = null; + if (ruleNames.length !== 0) { + const rulePattern = `(${ruleNames.join('|')})`; + disableNextLinePattern = new RegExp(`eslint-disable-next-line ${rulePattern}`); + disablePattern = new RegExp(`eslint-disable ${rulePattern}`); + enablePattern = new RegExp(`eslint-enable ${rulePattern}`); + } + const flowSuppressionPattern = new RegExp('\\$(FlowFixMe\\w*|FlowExpectedError|FlowIssue)\\[react\\-rule'); + for (const comment of programComments) { + if (comment.start == null || comment.end == null) { + continue; + } + if (disableComment == null && + disableNextLinePattern != null && + disableNextLinePattern.test(comment.value)) { + disableComment = comment; + enableComment = comment; + source = 'Eslint'; + } + if (flowSuppressions && + disableComment == null && + flowSuppressionPattern.test(comment.value)) { + disableComment = comment; + enableComment = comment; + source = 'Flow'; + } + if (disablePattern != null && disablePattern.test(comment.value)) { + disableComment = comment; + source = 'Eslint'; + } + if (enablePattern != null && + enablePattern.test(comment.value) && + source === 'Eslint') { + enableComment = comment; + } + if (disableComment != null && source != null) { + suppressionRanges.push({ + disableComment: disableComment, + enableComment: enableComment, + source, + }); + disableComment = null; + enableComment = null; + source = null; + } + } + return suppressionRanges; +} +function suppressionsToCompilerError(suppressionRanges) { + var _a; + CompilerError.invariant(suppressionRanges.length !== 0, { + reason: `Expected at least suppression comment source range`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + const error = new CompilerError(); + for (const suppressionRange of suppressionRanges) { + if (suppressionRange.disableComment.start == null || + suppressionRange.disableComment.end == null) { + continue; + } + let reason, suggestion; + switch (suppressionRange.source) { + case 'Eslint': + reason = + 'React Compiler has skipped optimizing this component because one or more React ESLint rules were disabled'; + suggestion = + 'Remove the ESLint suppression and address the React error'; + break; + case 'Flow': + reason = + 'React Compiler has skipped optimizing this component because one or more React rule violations were reported by Flow'; + suggestion = 'Remove the Flow suppression and address the React error'; + break; + default: + assertExhaustive$1(suppressionRange.source, 'Unhandled suppression source'); + } + error.pushDiagnostic(CompilerDiagnostic.create({ + reason: reason, + description: `React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression \`${suppressionRange.disableComment.value.trim()}\``, + category: ErrorCategory.Suppression, + suggestions: [ + { + description: suggestion, + range: [ + suppressionRange.disableComment.start, + suppressionRange.disableComment.end, + ], + op: CompilerSuggestionOperation.Remove, + }, + ], + }).withDetails({ + kind: 'error', + loc: (_a = suppressionRange.disableComment.loc) !== null && _a !== void 0 ? _a : null, + message: 'Found React rule suppression', + })); + } + return error; +} + +const OPT_IN_DIRECTIVES = new Set(['use forget', 'use memo']); +const OPT_OUT_DIRECTIVES = new Set(['use no forget', 'use no memo']); +const DYNAMIC_GATING_DIRECTIVE = new RegExp('^use memo if\\(([^\\)]*)\\)$'); +function tryFindDirectiveEnablingMemoization(directives, opts) { + var _a, _b; + const optIn = directives.find(directive => OPT_IN_DIRECTIVES.has(directive.value.value)); + if (optIn != null) { + return Ok(optIn); + } + const dynamicGating = findDirectivesDynamicGating(directives, opts); + if (dynamicGating.isOk()) { + return Ok((_b = (_a = dynamicGating.unwrap()) === null || _a === void 0 ? void 0 : _a.directive) !== null && _b !== void 0 ? _b : null); + } + else { + return Err(dynamicGating.unwrapErr()); + } +} +function findDirectiveDisablingMemoization(directives, { customOptOutDirectives }) { + var _a, _b; + if (customOptOutDirectives != null) { + return ((_a = directives.find(directive => customOptOutDirectives.indexOf(directive.value.value) !== -1)) !== null && _a !== void 0 ? _a : null); + } + return ((_b = directives.find(directive => OPT_OUT_DIRECTIVES.has(directive.value.value))) !== null && _b !== void 0 ? _b : null); +} +function findDirectivesDynamicGating(directives, opts) { + var _a, _b; + if (opts.dynamicGating === null) { + return Ok(null); + } + const errors = new CompilerError(); + const result = []; + for (const directive of directives) { + const maybeMatch = DYNAMIC_GATING_DIRECTIVE.exec(directive.value.value); + if (maybeMatch != null && maybeMatch[1] != null) { + if (libExports$1.isValidIdentifier(maybeMatch[1])) { + result.push({ directive, match: maybeMatch[1] }); + } + else { + errors.push({ + reason: `Dynamic gating directive is not a valid JavaScript identifier`, + description: `Found '${directive.value.value}'`, + category: ErrorCategory.Gating, + loc: (_a = directive.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + } + } + if (errors.hasAnyErrors()) { + return Err(errors); + } + else if (result.length > 1) { + const error = new CompilerError(); + error.push({ + reason: `Multiple dynamic gating directives found`, + description: `Expected a single directive but found [${result + .map(r => r.directive.value.value) + .join(', ')}]`, + category: ErrorCategory.Gating, + loc: (_b = result[0].directive.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return Err(error); + } + else if (result.length === 1) { + return Ok({ + gating: { + source: opts.dynamicGating.source, + importSpecifierName: result[0].match, + }, + directive: result[0].directive, + }); + } + else { + return Ok(null); + } +} +function isError(err) { + return !(err instanceof CompilerError) || err.hasErrors(); +} +function isConfigError(err) { + if (err instanceof CompilerError) { + return err.details.some(detail => detail.category === ErrorCategory.Config); + } + return false; +} +function logError(err, context, fnLoc) { + var _a, _b; + if (context.opts.logger) { + if (err instanceof CompilerError) { + for (const detail of err.details) { + context.opts.logger.logEvent(context.filename, { + kind: 'CompileError', + fnLoc, + detail, + }); + } + } + else { + let stringifiedError; + if (err instanceof Error) { + stringifiedError = (_a = err.stack) !== null && _a !== void 0 ? _a : err.message; + } + else { + stringifiedError = (_b = err === null || err === void 0 ? void 0 : err.toString()) !== null && _b !== void 0 ? _b : '[ null ]'; + } + context.opts.logger.logEvent(context.filename, { + kind: 'PipelineError', + fnLoc, + data: stringifiedError, + }); + } + } +} +function handleError(err, context, fnLoc) { + logError(err, context, fnLoc); + if (context.opts.panicThreshold === 'all_errors' || + (context.opts.panicThreshold === 'critical_errors' && isError(err)) || + isConfigError(err)) { + throw err; + } +} +function createNewFunctionNode(originalFn, compiledFn) { + var _a, _b, _c; + let transformedFn; + switch (originalFn.node.type) { + case 'FunctionDeclaration': { + const fn = { + type: 'FunctionDeclaration', + id: compiledFn.id, + loc: (_a = originalFn.node.loc) !== null && _a !== void 0 ? _a : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + body: compiledFn.body, + }; + transformedFn = fn; + break; + } + case 'ArrowFunctionExpression': { + const fn = { + type: 'ArrowFunctionExpression', + loc: (_b = originalFn.node.loc) !== null && _b !== void 0 ? _b : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + expression: originalFn.node.expression, + body: compiledFn.body, + }; + transformedFn = fn; + break; + } + case 'FunctionExpression': { + const fn = { + type: 'FunctionExpression', + id: compiledFn.id, + loc: (_c = originalFn.node.loc) !== null && _c !== void 0 ? _c : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + body: compiledFn.body, + }; + transformedFn = fn; + break; + } + default: { + assertExhaustive$1(originalFn.node, `Creating unhandled function: ${originalFn.node}`); + } + } + return transformedFn; +} +function insertNewOutlinedFunctionNode(program, originalFn, compiledFn) { + var _a, _b, _c; + switch (originalFn.type) { + case 'FunctionDeclaration': { + return originalFn.insertAfter(createNewFunctionNode(originalFn, compiledFn))[0]; + } + case 'ArrowFunctionExpression': + case 'FunctionExpression': { + const fn = { + type: 'FunctionDeclaration', + id: compiledFn.id, + loc: (_a = originalFn.node.loc) !== null && _a !== void 0 ? _a : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + body: compiledFn.body, + }; + const insertedFuncDecl = program.pushContainer('body', [fn])[0]; + CompilerError.invariant(insertedFuncDecl.isFunctionDeclaration(), { + reason: 'Expected inserted function declaration', + description: `Got: ${insertedFuncDecl}`, + details: [ + { + kind: 'error', + loc: (_c = (_b = insertedFuncDecl.node) === null || _b === void 0 ? void 0 : _b.loc) !== null && _c !== void 0 ? _c : null, + message: null, + }, + ], + }); + return insertedFuncDecl; + } + default: { + assertExhaustive$1(originalFn, `Inserting unhandled function: ${originalFn}`); + } + } +} +const DEFAULT_ESLINT_SUPPRESSIONS = [ + 'react-hooks/exhaustive-deps', + 'react-hooks/rules-of-hooks', +]; +function isFilePartOfSources(sources, filename) { + if (typeof sources === 'function') { + return sources(filename); + } + for (const prefix of sources) { + if (filename.indexOf(prefix) !== -1) { + return true; + } + } + return false; +} +function compileProgram(program, pass) { + var _a; + if (shouldSkipCompilation(program, pass)) { + return null; + } + const restrictedImportsErr = validateRestrictedImports(program, pass.opts.environment); + if (restrictedImportsErr) { + handleError(restrictedImportsErr, pass, null); + return null; + } + const suppressions = findProgramSuppressions(pass.comments, (_a = pass.opts.eslintSuppressionRules) !== null && _a !== void 0 ? _a : DEFAULT_ESLINT_SUPPRESSIONS, pass.opts.flowSuppressions); + const programContext = new ProgramContext({ + program: program, + opts: pass.opts, + filename: pass.filename, + code: pass.code, + suppressions, + hasModuleScopeOptOut: findDirectiveDisablingMemoization(program.node.directives, pass.opts) != + null, + }); + const queue = findFunctionsToCompile(program, pass, programContext); + const compiledFns = []; + while (queue.length !== 0) { + const current = queue.shift(); + const compiled = processFn(current.fn, current.fnType, programContext); + if (compiled != null) { + for (const outlined of compiled.outlined) { + CompilerError.invariant(outlined.fn.outlined.length === 0, { + reason: 'Unexpected nested outlined functions', + description: null, + details: [ + { + kind: 'error', + loc: outlined.fn.loc, + message: null, + }, + ], + }); + const fn = insertNewOutlinedFunctionNode(program, current.fn, outlined.fn); + fn.skip(); + programContext.alreadyCompiled.add(fn.node); + if (outlined.type !== null) { + queue.push({ + kind: 'outlined', + fn, + fnType: outlined.type, + }); + } + } + compiledFns.push({ + kind: current.kind, + originalFn: current.fn, + compiledFn: compiled, + }); + } + } + if (programContext.hasModuleScopeOptOut) { + if (compiledFns.length > 0) { + const error = new CompilerError(); + error.pushErrorDetail(new CompilerErrorDetail({ + reason: 'Unexpected compiled functions when module scope opt-out is present', + category: ErrorCategory.Invariant, + loc: null, + })); + handleError(error, programContext, null); + } + return null; + } + applyCompiledFunctions(program, compiledFns, pass, programContext); + return { + retryErrors: programContext.retryErrors, + inferredEffectLocations: programContext.inferredEffectLocations, + }; +} +function findFunctionsToCompile(program, pass, programContext) { + var _a; + const queue = []; + const traverseFunction = (fn, pass) => { + if (pass.opts.compilationMode === 'all' && + fn.scope.getProgramParent() !== fn.scope.parent) { + return; + } + const fnType = getReactFunctionType(fn, pass); + if (pass.opts.environment.validateNoDynamicallyCreatedComponentsOrHooks) { + validateNoDynamicallyCreatedComponentsOrHooks(fn, pass, programContext); + } + if (fnType === null || programContext.alreadyCompiled.has(fn.node)) { + return; + } + programContext.alreadyCompiled.add(fn.node); + fn.skip(); + queue.push({ kind: 'original', fn, fnType }); + }; + program.traverse({ + ClassDeclaration(node) { + node.skip(); + }, + ClassExpression(node) { + node.skip(); + }, + FunctionDeclaration: traverseFunction, + FunctionExpression: traverseFunction, + ArrowFunctionExpression: traverseFunction, + }, Object.assign(Object.assign({}, pass), { opts: Object.assign(Object.assign({}, pass.opts), pass.opts), filename: (_a = pass.filename) !== null && _a !== void 0 ? _a : null })); + return queue; +} +function processFn(fn, fnType, programContext) { + var _a, _b, _c, _d, _e, _f, _g, _h; + let directives; + if (fn.node.body.type !== 'BlockStatement') { + directives = { + optIn: null, + optOut: null, + }; + } + else { + const optIn = tryFindDirectiveEnablingMemoization(fn.node.body.directives, programContext.opts); + if (optIn.isErr()) { + handleError(optIn.unwrapErr(), programContext, (_a = fn.node.loc) !== null && _a !== void 0 ? _a : null); + return null; + } + directives = { + optIn: optIn.unwrapOr(null), + optOut: findDirectiveDisablingMemoization(fn.node.body.directives, programContext.opts), + }; + } + let compiledFn; + const compileResult = tryCompileFunction(fn, fnType, programContext); + if (compileResult.kind === 'error') { + if (directives.optOut != null) { + logError(compileResult.error, programContext, (_b = fn.node.loc) !== null && _b !== void 0 ? _b : null); + } + else { + handleError(compileResult.error, programContext, (_c = fn.node.loc) !== null && _c !== void 0 ? _c : null); + } + const retryResult = retryCompileFunction(fn, fnType, programContext); + if (retryResult == null) { + return null; + } + compiledFn = retryResult; + } + else { + compiledFn = compileResult.compiledFn; + } + if (programContext.opts.ignoreUseNoForget === false && + directives.optOut != null) { + programContext.logEvent({ + kind: 'CompileSkip', + fnLoc: (_d = fn.node.body.loc) !== null && _d !== void 0 ? _d : null, + reason: `Skipped due to '${directives.optOut.value}' directive.`, + loc: (_e = directives.optOut.loc) !== null && _e !== void 0 ? _e : null, + }); + return null; + } + programContext.logEvent({ + kind: 'CompileSuccess', + fnLoc: (_f = fn.node.loc) !== null && _f !== void 0 ? _f : null, + fnName: (_h = (_g = compiledFn.id) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : null, + memoSlots: compiledFn.memoSlotsUsed, + memoBlocks: compiledFn.memoBlocks, + memoValues: compiledFn.memoValues, + prunedMemoBlocks: compiledFn.prunedMemoBlocks, + prunedMemoValues: compiledFn.prunedMemoValues, + }); + if (programContext.hasModuleScopeOptOut) { + return null; + } + else if (programContext.opts.noEmit) { + for (const loc of compiledFn.inferredEffectLocations) { + if (loc !== GeneratedSource) { + programContext.inferredEffectLocations.add(loc); + } + } + return null; + } + else if (programContext.opts.compilationMode === 'annotation' && + directives.optIn == null) { + return null; + } + else { + return compiledFn; + } +} +function tryCompileFunction(fn, fnType, programContext) { + const suppressionsInFunction = filterSuppressionsThatAffectFunction(programContext.suppressions, fn); + if (suppressionsInFunction.length > 0) { + return { + kind: 'error', + error: suppressionsToCompilerError(suppressionsInFunction), + }; + } + try { + return { + kind: 'compile', + compiledFn: compileFn(fn, programContext.opts.environment, fnType, 'all_features', programContext, programContext.opts.logger, programContext.filename, programContext.code), + }; + } + catch (err) { + return { kind: 'error', error: err }; + } +} +function retryCompileFunction(fn, fnType, programContext) { + const environment = programContext.opts.environment; + if (!(environment.enableFire || environment.inferEffectDependencies != null)) { + return null; + } + try { + const retryResult = compileFn(fn, environment, fnType, 'no_inferred_memo', programContext, programContext.opts.logger, programContext.filename, programContext.code); + if (!retryResult.hasFireRewrite && !retryResult.hasInferredEffect) { + return null; + } + return retryResult; + } + catch (err) { + if (err instanceof CompilerError) { + programContext.retryErrors.push({ fn, error: err }); + } + return null; + } +} +function applyCompiledFunctions(program, compiledFns, pass, programContext) { + var _a, _b; + let referencedBeforeDeclared = null; + for (const result of compiledFns) { + const { kind, originalFn, compiledFn } = result; + const transformedFn = createNewFunctionNode(originalFn, compiledFn); + programContext.alreadyCompiled.add(transformedFn); + let dynamicGating = null; + if (originalFn.node.body.type === 'BlockStatement') { + const result = findDirectivesDynamicGating(originalFn.node.body.directives, pass.opts); + if (result.isOk()) { + dynamicGating = (_b = (_a = result.unwrap()) === null || _a === void 0 ? void 0 : _a.gating) !== null && _b !== void 0 ? _b : null; + } + } + const functionGating = dynamicGating !== null && dynamicGating !== void 0 ? dynamicGating : pass.opts.gating; + if (kind === 'original' && functionGating != null) { + referencedBeforeDeclared !== null && referencedBeforeDeclared !== void 0 ? referencedBeforeDeclared : (referencedBeforeDeclared = getFunctionReferencedBeforeDeclarationAtTopLevel(program, compiledFns)); + insertGatedFunctionDeclaration(originalFn, transformedFn, programContext, functionGating, referencedBeforeDeclared.has(result)); + } + else { + originalFn.replaceWith(transformedFn); + } + } + if (compiledFns.length > 0) { + addImportsToProgram(program, programContext); + } +} +function shouldSkipCompilation(program, pass) { + if (pass.opts.sources) { + if (pass.filename === null) { + const error = new CompilerError(); + error.pushErrorDetail(new CompilerErrorDetail({ + reason: `Expected a filename but found none.`, + description: "When the 'sources' config options is specified, the React compiler will only compile files with a name", + category: ErrorCategory.Config, + loc: null, + })); + handleError(error, pass, null); + return true; + } + if (!isFilePartOfSources(pass.opts.sources, pass.filename)) { + return true; + } + } + if (hasMemoCacheFunctionImport(program, getReactCompilerRuntimeModule(pass.opts.target))) { + return true; + } + return false; +} +function validateNoDynamicallyCreatedComponentsOrHooks(fn, pass, programContext) { + const parentNameExpr = getFunctionName$1(fn); + const parentName = parentNameExpr !== null && parentNameExpr.isIdentifier() + ? parentNameExpr.node.name + : ''; + const validateNestedFunction = (nestedFn) => { + var _a, _b, _c, _d; + if (nestedFn.node === fn.node || + programContext.alreadyCompiled.has(nestedFn.node)) { + return; + } + if (nestedFn.scope.getProgramParent() !== nestedFn.scope.parent) { + const nestedFnType = getReactFunctionType(nestedFn, pass); + const nestedFnNameExpr = getFunctionName$1(nestedFn); + const nestedName = nestedFnNameExpr !== null && nestedFnNameExpr.isIdentifier() + ? nestedFnNameExpr.node.name + : ''; + if (nestedFnType === 'Component' || nestedFnType === 'Hook') { + CompilerError.throwDiagnostic({ + category: ErrorCategory.Factories, + reason: `Components and hooks cannot be created dynamically`, + description: `The function \`${nestedName}\` appears to be a React ${nestedFnType.toLowerCase()}, but it's defined inside \`${parentName}\`. Components and Hooks should always be declared at module scope`, + details: [ + { + kind: 'error', + message: 'this function dynamically created a component/hook', + loc: (_b = (_a = parentNameExpr === null || parentNameExpr === void 0 ? void 0 : parentNameExpr.node.loc) !== null && _a !== void 0 ? _a : fn.node.loc) !== null && _b !== void 0 ? _b : null, + }, + { + kind: 'error', + message: 'the component is created here', + loc: (_d = (_c = nestedFnNameExpr === null || nestedFnNameExpr === void 0 ? void 0 : nestedFnNameExpr.node.loc) !== null && _c !== void 0 ? _c : nestedFn.node.loc) !== null && _d !== void 0 ? _d : null, + }, + ], + }); + } + } + nestedFn.skip(); + }; + fn.traverse({ + FunctionDeclaration: validateNestedFunction, + FunctionExpression: validateNestedFunction, + ArrowFunctionExpression: validateNestedFunction, + }); +} +function getReactFunctionType(fn, pass) { + var _a, _b; + const hookPattern = pass.opts.environment.hookPattern; + if (fn.node.body.type === 'BlockStatement') { + const optInDirectives = tryFindDirectiveEnablingMemoization(fn.node.body.directives, pass.opts); + if (optInDirectives.unwrapOr(null) != null) { + return (_a = getComponentOrHookLike(fn, hookPattern)) !== null && _a !== void 0 ? _a : 'Other'; + } + } + let componentSyntaxType = null; + if (fn.isFunctionDeclaration()) { + if (isComponentDeclaration(fn.node)) { + componentSyntaxType = 'Component'; + } + else if (isHookDeclaration(fn.node)) { + componentSyntaxType = 'Hook'; + } + } + switch (pass.opts.compilationMode) { + case 'annotation': { + return null; + } + case 'infer': { + return componentSyntaxType !== null && componentSyntaxType !== void 0 ? componentSyntaxType : getComponentOrHookLike(fn, hookPattern); + } + case 'syntax': { + return componentSyntaxType; + } + case 'all': { + return (_b = getComponentOrHookLike(fn, hookPattern)) !== null && _b !== void 0 ? _b : 'Other'; + } + default: { + assertExhaustive$1(pass.opts.compilationMode, `Unexpected compilationMode \`${pass.opts.compilationMode}\``); + } + } +} +function hasMemoCacheFunctionImport(program, moduleName) { + let hasUseMemoCache = false; + program.traverse({ + ImportSpecifier(path) { + const imported = path.get('imported'); + let importedName = null; + if (imported.isIdentifier()) { + importedName = imported.node.name; + } + else if (imported.isStringLiteral()) { + importedName = imported.node.value; + } + if (importedName === 'c' && + path.parentPath.isImportDeclaration() && + path.parentPath.get('source').node.value === moduleName) { + hasUseMemoCache = true; + } + }, + }); + return hasUseMemoCache; +} +function isHookName$1(s, hookPattern) { + if (hookPattern !== null) { + return new RegExp(hookPattern).test(s); + } + return /^use[A-Z0-9]/.test(s); +} +function isHook$1(path, hookPattern) { + if (path.isIdentifier()) { + return isHookName$1(path.node.name, hookPattern); + } + else if (path.isMemberExpression() && + !path.node.computed && + isHook$1(path.get('property'), hookPattern)) { + const obj = path.get('object').node; + const isPascalCaseNameSpace = /^[A-Z].*/; + return obj.type === 'Identifier' && isPascalCaseNameSpace.test(obj.name); + } + else { + return false; + } +} +function isComponentName$1(path) { + return path.isIdentifier() && /^[A-Z]/.test(path.node.name); +} +function isReactAPI(path, functionName) { + const node = path.node; + return ((node.type === 'Identifier' && node.name === functionName) || + (node.type === 'MemberExpression' && + node.object.type === 'Identifier' && + node.object.name === 'React' && + node.property.type === 'Identifier' && + node.property.name === functionName)); +} +function isForwardRefCallback$1(path) { + return !!(path.parentPath.isCallExpression() && + path.parentPath.get('callee').isExpression() && + isReactAPI(path.parentPath.get('callee'), 'forwardRef')); +} +function isMemoCallback$1(path) { + return (path.parentPath.isCallExpression() && + path.parentPath.get('callee').isExpression() && + isReactAPI(path.parentPath.get('callee'), 'memo')); +} +function isValidPropsAnnotation(annot) { + if (annot == null) { + return true; + } + else if (annot.type === 'TSTypeAnnotation') { + switch (annot.typeAnnotation.type) { + case 'TSArrayType': + case 'TSBigIntKeyword': + case 'TSBooleanKeyword': + case 'TSConstructorType': + case 'TSFunctionType': + case 'TSLiteralType': + case 'TSNeverKeyword': + case 'TSNumberKeyword': + case 'TSStringKeyword': + case 'TSSymbolKeyword': + case 'TSTupleType': + return false; + } + return true; + } + else if (annot.type === 'TypeAnnotation') { + switch (annot.typeAnnotation.type) { + case 'ArrayTypeAnnotation': + case 'BooleanLiteralTypeAnnotation': + case 'BooleanTypeAnnotation': + case 'EmptyTypeAnnotation': + case 'FunctionTypeAnnotation': + case 'NumberLiteralTypeAnnotation': + case 'NumberTypeAnnotation': + case 'StringLiteralTypeAnnotation': + case 'StringTypeAnnotation': + case 'SymbolTypeAnnotation': + case 'ThisTypeAnnotation': + case 'TupleTypeAnnotation': + return false; + } + return true; + } + else if (annot.type === 'Noop') { + return true; + } + else { + assertExhaustive$1(annot, `Unexpected annotation node \`${annot}\``); + } +} +function isValidComponentParams(params) { + if (params.length === 0) { + return true; + } + else if (params.length > 0 && params.length <= 2) { + if (!isValidPropsAnnotation(params[0].node.typeAnnotation)) { + return false; + } + if (params.length === 1) { + return !params[0].isRestElement(); + } + else if (params[1].isIdentifier()) { + const { name } = params[1].node; + return name.includes('ref') || name.includes('Ref'); + } + else { + return false; + } + } + return false; +} +function getComponentOrHookLike(node, hookPattern) { + const functionName = getFunctionName$1(node); + if (functionName !== null && isComponentName$1(functionName)) { + let isComponent = callsHooksOrCreatesJsx(node, hookPattern) && + isValidComponentParams(node.get('params')) && + !returnsNonNode(node); + return isComponent ? 'Component' : null; + } + else if (functionName !== null && isHook$1(functionName, hookPattern)) { + return callsHooksOrCreatesJsx(node, hookPattern) ? 'Hook' : null; + } + if (node.isFunctionExpression() || node.isArrowFunctionExpression()) { + if (isForwardRefCallback$1(node) || isMemoCallback$1(node)) { + return callsHooksOrCreatesJsx(node, hookPattern) ? 'Component' : null; + } + } + return null; +} +function skipNestedFunctions(node) { + return (fn) => { + if (fn.node !== node.node) { + fn.skip(); + } + }; +} +function callsHooksOrCreatesJsx(node, hookPattern) { + let invokesHooks = false; + let createsJsx = false; + node.traverse({ + JSX() { + createsJsx = true; + }, + CallExpression(call) { + const callee = call.get('callee'); + if (callee.isExpression() && isHook$1(callee, hookPattern)) { + invokesHooks = true; + } + }, + ArrowFunctionExpression: skipNestedFunctions(node), + FunctionExpression: skipNestedFunctions(node), + FunctionDeclaration: skipNestedFunctions(node), + }); + return invokesHooks || createsJsx; +} +function isNonNode(node) { + if (!node) { + return true; + } + switch (node.type) { + case 'ObjectExpression': + case 'ArrowFunctionExpression': + case 'FunctionExpression': + case 'BigIntLiteral': + case 'ClassExpression': + case 'NewExpression': + return true; + } + return false; +} +function returnsNonNode(node) { + let returnsNonNode = false; + if (node.type === 'ArrowFunctionExpression' && + node.node.body.type !== 'BlockStatement') { + returnsNonNode = isNonNode(node.node.body); + } + node.traverse({ + ReturnStatement(ret) { + returnsNonNode = isNonNode(ret.node.argument); + }, + ArrowFunctionExpression: skipNestedFunctions(node), + FunctionExpression: skipNestedFunctions(node), + FunctionDeclaration: skipNestedFunctions(node), + ObjectMethod: node => node.skip(), + }); + return returnsNonNode; +} +function getFunctionName$1(path) { + if (path.isFunctionDeclaration()) { + const id = path.get('id'); + if (id.isIdentifier()) { + return id; + } + return null; + } + let id = null; + const parent = path.parentPath; + if (parent.isVariableDeclarator() && parent.get('init').node === path.node) { + id = parent.get('id'); + } + else if (parent.isAssignmentExpression() && + parent.get('right').node === path.node && + parent.get('operator') === '=') { + id = parent.get('left'); + } + else if (parent.isProperty() && + parent.get('value').node === path.node && + !parent.get('computed') && + parent.get('key').isLVal()) { + id = parent.get('key'); + } + else if (parent.isAssignmentPattern() && + parent.get('right').node === path.node && + !parent.get('computed')) { + id = parent.get('left'); + } + if (id !== null && (id.isIdentifier() || id.isMemberExpression())) { + return id; + } + else { + return null; + } +} +function getFunctionReferencedBeforeDeclarationAtTopLevel(program, fns) { + const fnNames = new Map(fns + .map(fn => [ + getFunctionName$1(fn.originalFn), + fn, + ]) + .filter((entry) => !!entry[0] && entry[0].isIdentifier()) + .map(entry => [entry[0].node.name, { id: entry[0].node, fn: entry[1] }])); + const referencedBeforeDeclaration = new Set(); + program.traverse({ + TypeAnnotation(path) { + path.skip(); + }, + TSTypeAnnotation(path) { + path.skip(); + }, + TypeAlias(path) { + path.skip(); + }, + TSTypeAliasDeclaration(path) { + path.skip(); + }, + Identifier(id) { + const fn = fnNames.get(id.node.name); + if (!fn) { + return; + } + if (id.node === fn.id) { + fnNames.delete(id.node.name); + return; + } + const scope = id.scope.getFunctionParent(); + if (scope === null && id.isReferencedIdentifier()) { + referencedBeforeDeclaration.add(fn.fn); + } + }, + }); + return referencedBeforeDeclaration; +} +function getReactCompilerRuntimeModule(target) { + if (target === '19') { + return 'react/compiler-runtime'; + } + else if (target === '17' || target === '18') { + return 'react-compiler-runtime'; + } + else { + CompilerError.invariant(target != null && + target.kind === 'donotuse_meta_internal' && + typeof target.runtimeModule === 'string', { + reason: 'Expected target to already be validated', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return target.runtimeModule; + } +} + +function validateRestrictedImports(path, { validateBlocklistedImports }) { + if (validateBlocklistedImports == null || + validateBlocklistedImports.length === 0) { + return null; + } + const error = new CompilerError(); + const restrictedImports = new Set(validateBlocklistedImports); + path.traverse({ + ImportDeclaration(importDeclPath) { + var _a; + if (restrictedImports.has(importDeclPath.node.source.value)) { + error.push({ + category: ErrorCategory.Todo, + reason: 'Bailing out due to blocklisted import', + description: `Import from module ${importDeclPath.node.source.value}`, + loc: (_a = importDeclPath.node.loc) !== null && _a !== void 0 ? _a : null, + }); + } + }, + }); + if (error.hasAnyErrors()) { + return error; + } + else { + return null; + } +} +class ProgramContext { + constructor({ program, suppressions, opts, filename, code, hasModuleScopeOptOut, }) { + this.alreadyCompiled = new (WeakSet !== null && WeakSet !== void 0 ? WeakSet : Set)(); + this.knownReferencedNames = new Set(); + this.imports = new Map(); + this.retryErrors = []; + this.inferredEffectLocations = new Set(); + this.scope = program.scope; + this.opts = opts; + this.filename = filename; + this.code = code; + this.reactRuntimeModule = getReactCompilerRuntimeModule(opts.target); + this.suppressions = suppressions; + this.hasModuleScopeOptOut = hasModuleScopeOptOut; + } + isHookName(name) { + if (this.opts.environment.hookPattern == null) { + return isHookName$2(name); + } + else { + const match = new RegExp(this.opts.environment.hookPattern).exec(name); + return (match != null && typeof match[1] === 'string' && isHookName$2(match[1])); + } + } + hasReference(name) { + return (this.knownReferencedNames.has(name) || + this.scope.hasBinding(name) || + this.scope.hasGlobal(name) || + this.scope.hasReference(name)); + } + newUid(name) { + let uid; + if (this.isHookName(name)) { + uid = name; + let i = 0; + while (this.hasReference(uid)) { + this.knownReferencedNames.add(uid); + uid = `${name}_${i++}`; + } + } + else if (!this.hasReference(name)) { + uid = name; + } + else { + uid = this.scope.generateUid(name); + } + this.knownReferencedNames.add(uid); + return uid; + } + addMemoCacheImport() { + return this.addImportSpecifier({ + source: this.reactRuntimeModule, + importSpecifierName: 'c', + }, '_c'); + } + addImportSpecifier({ source: module, importSpecifierName: specifier }, nameHint) { + var _a; + const maybeBinding = (_a = this.imports.get(module)) === null || _a === void 0 ? void 0 : _a.get(specifier); + if (maybeBinding != null) { + return Object.assign({}, maybeBinding); + } + const binding = { + kind: 'ImportSpecifier', + name: this.newUid(nameHint !== null && nameHint !== void 0 ? nameHint : specifier), + module, + imported: specifier, + }; + getOrInsertWith(this.imports, module, () => new Map()).set(specifier, Object.assign({}, binding)); + return binding; + } + addNewReference(name) { + this.knownReferencedNames.add(name); + } + assertGlobalBinding(name, localScope) { + var _a, _b; + const scope = localScope !== null && localScope !== void 0 ? localScope : this.scope; + if (!scope.hasReference(name) && !scope.hasBinding(name)) { + return Ok(undefined); + } + const error = new CompilerError(); + error.push({ + category: ErrorCategory.Todo, + reason: 'Encountered conflicting global in generated program', + description: `Conflict from local binding ${name}`, + loc: (_b = (_a = scope.getBinding(name)) === null || _a === void 0 ? void 0 : _a.path.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return Err(error); + } + logEvent(event) { + if (this.opts.logger != null) { + this.opts.logger.logEvent(this.filename, event); + } + } +} +function getExistingImports(program) { + const existingImports = new Map(); + program.traverse({ + ImportDeclaration(path) { + if (isNonNamespacedImport(path)) { + existingImports.set(path.node.source.value, path); + } + }, + }); + return existingImports; +} +function addImportsToProgram(path, programContext) { + const existingImports = getExistingImports(path); + const stmts = []; + const sortedModules = [...programContext.imports.entries()].sort(([a], [b]) => a.localeCompare(b)); + for (const [moduleName, importsMap] of sortedModules) { + for (const [specifierName, loweredImport] of importsMap) { + CompilerError.invariant(path.scope.getBinding(loweredImport.name) == null, { + reason: 'Encountered conflicting import specifiers in generated program', + description: `Conflict from import ${loweredImport.module}:(${loweredImport.imported} as ${loweredImport.name})`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + CompilerError.invariant(loweredImport.module === moduleName && + loweredImport.imported === specifierName, { + reason: 'Found inconsistent import specifier. This is an internal bug.', + description: `Expected import ${moduleName}:${specifierName} but found ${loweredImport.module}:${loweredImport.imported}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + const sortedImport = [ + ...importsMap.values(), + ].sort(({ imported: a }, { imported: b }) => a.localeCompare(b)); + const importSpecifiers = sortedImport.map(specifier => { + return libExports$1.importSpecifier(libExports$1.identifier(specifier.name), libExports$1.identifier(specifier.imported)); + }); + const maybeExistingImports = existingImports.get(moduleName); + if (maybeExistingImports != null) { + maybeExistingImports.pushContainer('specifiers', importSpecifiers); + } + else { + if (path.node.sourceType === 'module') { + stmts.push(libExports$1.importDeclaration(importSpecifiers, libExports$1.stringLiteral(moduleName))); + } + else { + stmts.push(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(libExports$1.objectPattern(sortedImport.map(specifier => { + return libExports$1.objectProperty(libExports$1.identifier(specifier.imported), libExports$1.identifier(specifier.name)); + })), libExports$1.callExpression(libExports$1.identifier('require'), [ + libExports$1.stringLiteral(moduleName), + ])), + ])); + } + } + } + path.unshiftContainer('body', stmts); +} +function isNonNamespacedImport(importDeclPath) { + return (importDeclPath + .get('specifiers') + .every(specifier => specifier.isImportSpecifier()) && + importDeclPath.node.importKind !== 'type' && + importDeclPath.node.importKind !== 'typeof'); +} + +zod.z.enum([ + 'all_errors', + 'critical_errors', + 'none', +]); +const DynamicGatingOptionsSchema = zod.z.object({ + source: zod.z.string(), +}); +const CustomOptOutDirectiveSchema = zod.z + .nullable(zod.z.array(zod.z.string())) + .default(null); +const CompilerReactTargetSchema = zod.z.union([ + zod.z.literal('17'), + zod.z.literal('18'), + zod.z.literal('19'), + zod.z.object({ + kind: zod.z.literal('donotuse_meta_internal'), + runtimeModule: zod.z.string().default('react'), + }), +]); +zod.z.enum([ + 'infer', + 'syntax', + 'annotation', + 'all', +]); +const defaultOptions = { + compilationMode: 'infer', + panicThreshold: 'none', + environment: parseEnvironmentConfig({}).unwrap(), + logger: null, + gating: null, + noEmit: false, + dynamicGating: null, + eslintSuppressionRules: null, + flowSuppressions: true, + ignoreUseNoForget: false, + sources: filename => { + return filename.indexOf('node_modules') === -1; + }, + enableReanimatedCheck: true, + customOptOutDirectives: null, + target: '19', +}; +function parsePluginOptions(obj) { + if (obj == null || typeof obj !== 'object') { + return defaultOptions; + } + const parsedOptions = Object.create(null); + for (let [key, value] of Object.entries(obj)) { + if (typeof value === 'string') { + value = value.toLowerCase(); + } + if (isCompilerFlag(key)) { + switch (key) { + case 'environment': { + const environmentResult = parseEnvironmentConfig(value); + if (environmentResult.isErr()) { + CompilerError.throwInvalidConfig({ + reason: 'Error in validating environment config. This is an advanced setting and not meant to be used directly', + description: environmentResult.unwrapErr().toString(), + suggestions: null, + loc: null, + }); + } + parsedOptions[key] = environmentResult.unwrap(); + break; + } + case 'target': { + parsedOptions[key] = parseTargetConfig(value); + break; + } + case 'gating': { + if (value == null) { + parsedOptions[key] = null; + } + else { + parsedOptions[key] = tryParseExternalFunction(value); + } + break; + } + case 'dynamicGating': { + if (value == null) { + parsedOptions[key] = null; + } + else { + const result = DynamicGatingOptionsSchema.safeParse(value); + if (result.success) { + parsedOptions[key] = result.data; + } + else { + CompilerError.throwInvalidConfig({ + reason: 'Could not parse dynamic gating. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(result.error)}`, + loc: null, + suggestions: null, + }); + } + } + break; + } + case 'customOptOutDirectives': { + const result = CustomOptOutDirectiveSchema.safeParse(value); + if (result.success) { + parsedOptions[key] = result.data; + } + else { + CompilerError.throwInvalidConfig({ + reason: 'Could not parse custom opt out directives. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(result.error)}`, + loc: null, + suggestions: null, + }); + } + break; + } + default: { + parsedOptions[key] = value; + } + } + } + } + return Object.assign(Object.assign({}, defaultOptions), parsedOptions); +} +function parseTargetConfig(value) { + const parsed = CompilerReactTargetSchema.safeParse(value); + if (parsed.success) { + return parsed.data; + } + else { + CompilerError.throwInvalidConfig({ + reason: 'Not a valid target', + description: `${zodValidationError.fromZodError(parsed.error)}`, + suggestions: null, + loc: null, + }); + } +} +function isCompilerFlag(s) { + return hasOwnProperty$1(defaultOptions, s); +} + +function hasModule(name) { + if (typeof require === 'undefined') { + return false; + } + try { + return !!require.resolve(name); + } + catch (error) { + if (error.code === 'MODULE_NOT_FOUND' && + error.message.indexOf(name) !== -1) { + return false; + } + throw error; + } +} +function pipelineUsesReanimatedPlugin(plugins) { + if (Array.isArray(plugins)) { + for (const plugin of plugins) { + if (hasOwnProperty$1(plugin, 'key')) { + const key = plugin.key; + if (typeof key === 'string' && + key.indexOf('react-native-reanimated') !== -1) { + return true; + } + } + } + } + return hasModule('react-native-reanimated'); +} +function injectReanimatedFlag(options) { + return Object.assign(Object.assign({}, options), { environment: Object.assign(Object.assign({}, options.environment), { enableCustomTypeDefinitionForReanimated: true }) }); +} + +function throwInvalidReact(options, { logger, filename }) { + logger === null || logger === void 0 ? void 0 : logger.logEvent(filename, { + kind: 'CompileError', + fnLoc: null, + detail: new CompilerDiagnostic(options), + }); + CompilerError.throwDiagnostic(options); +} +function isAutodepsSigil(arg) { + if (arg.isIdentifier() && arg.node.name === 'AUTODEPS') { + const binding = arg.scope.getBinding(arg.node.name); + if (binding && binding.path.isImportSpecifier()) { + const importSpecifier = binding.path.node; + if (importSpecifier.imported.type === 'Identifier') { + return importSpecifier.imported.name === 'AUTODEPS'; + } + } + return false; + } + if (arg.isMemberExpression() && !arg.node.computed) { + const object = arg.get('object'); + const property = arg.get('property'); + if (object.isIdentifier() && + object.node.name === 'React' && + property.isIdentifier() && + property.node.name === 'AUTODEPS') { + return true; + } + } + return false; +} +function assertValidEffectImportReference(autodepsIndex, paths, context) { + var _a; + for (const path of paths) { + const parent = path.parentPath; + if (parent != null && parent.isCallExpression()) { + const args = parent.get('arguments'); + const maybeCalleeLoc = path.node.loc; + const hasInferredEffect = maybeCalleeLoc != null && + context.inferredEffectLocations.has(maybeCalleeLoc); + const hasAutodepsArg = args.some(isAutodepsSigil); + if (hasAutodepsArg && !hasInferredEffect) { + const maybeErrorDiagnostic = matchCompilerDiagnostic(path, context.transformErrors); + throwInvalidReact({ + category: ErrorCategory.AutomaticEffectDependencies, + reason: 'Cannot infer dependencies of this effect. This will break your build!', + description: 'To resolve, either pass a dependency array or fix reported compiler bailout diagnostics' + + (maybeErrorDiagnostic ? ` ${maybeErrorDiagnostic}` : ''), + details: [ + { + kind: 'error', + message: 'Cannot infer dependencies', + loc: (_a = parent.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }, + ], + }, context); + } + } + } +} +function assertValidFireImportReference(paths, context) { + var _a; + if (paths.length > 0) { + const maybeErrorDiagnostic = matchCompilerDiagnostic(paths[0], context.transformErrors); + throwInvalidReact({ + category: ErrorCategory.Fire, + reason: '[Fire] Untransformed reference to compiler-required feature.', + description: 'Either remove this `fire` call or ensure it is successfully transformed by the compiler' + + (maybeErrorDiagnostic != null ? ` ${maybeErrorDiagnostic}` : ''), + details: [ + { + kind: 'error', + message: 'Untransformed `fire` call', + loc: (_a = paths[0].node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }, + ], + }, context); + } +} +function validateNoUntransformedReferences(path, filename, logger, env, compileResult) { + const moduleLoadChecks = new Map(); + if (env.enableFire) { + for (const module of Environment.knownReactModules) { + const react = getOrInsertWith(moduleLoadChecks, module, () => new Map()); + react.set('fire', assertValidFireImportReference); + } + } + if (env.inferEffectDependencies) { + for (const { function: { source, importSpecifierName }, autodepsIndex, } of env.inferEffectDependencies) { + const module = getOrInsertWith(moduleLoadChecks, source, () => new Map()); + module.set(importSpecifierName, assertValidEffectImportReference.bind(null, autodepsIndex)); + } + } + if (moduleLoadChecks.size > 0) { + transformProgram(path, moduleLoadChecks, filename, logger, compileResult); + } +} +function validateImportSpecifier(specifier, importSpecifierChecks, state) { + var _a; + const imported = specifier.get('imported'); + const specifierName = imported.node.type === 'Identifier' + ? imported.node.name + : imported.node.value; + const checkFn = importSpecifierChecks.get(specifierName); + if (checkFn == null) { + return; + } + if (state.shouldInvalidateScopes) { + state.shouldInvalidateScopes = false; + state.program.scope.crawl(); + } + const local = specifier.get('local'); + const binding = local.scope.getBinding(local.node.name); + CompilerError.invariant(binding != null, { + reason: 'Expected binding to be found for import specifier', + description: null, + details: [ + { + kind: 'error', + loc: (_a = local.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + checkFn(binding.referencePaths, state); +} +function validateNamespacedImport(specifier, importSpecifierChecks, state) { + var _a; + if (state.shouldInvalidateScopes) { + state.shouldInvalidateScopes = false; + state.program.scope.crawl(); + } + const local = specifier.get('local'); + const binding = local.scope.getBinding(local.node.name); + const defaultCheckFn = importSpecifierChecks.get(DEFAULT_EXPORT); + CompilerError.invariant(binding != null, { + reason: 'Expected binding to be found for import specifier', + description: null, + details: [ + { + kind: 'error', + loc: (_a = local.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + const filteredReferences = new Map(); + for (const reference of binding.referencePaths) { + if (defaultCheckFn != null) { + getOrInsertWith(filteredReferences, defaultCheckFn, () => []).push(reference); + } + const parent = reference.parentPath; + if (parent != null && + parent.isMemberExpression() && + parent.get('object') === reference) { + if (parent.node.computed || parent.node.property.type !== 'Identifier') { + continue; + } + const checkFn = importSpecifierChecks.get(parent.node.property.name); + if (checkFn != null) { + getOrInsertWith(filteredReferences, checkFn, () => []).push(parent); + } + } + } + for (const [checkFn, references] of filteredReferences) { + checkFn(references, state); + } +} +function transformProgram(path, moduleLoadChecks, filename, logger, compileResult) { + var _a, _b; + const traversalState = { + shouldInvalidateScopes: true, + program: path, + filename, + logger, + transformErrors: (_a = compileResult === null || compileResult === void 0 ? void 0 : compileResult.retryErrors) !== null && _a !== void 0 ? _a : [], + inferredEffectLocations: (_b = compileResult === null || compileResult === void 0 ? void 0 : compileResult.inferredEffectLocations) !== null && _b !== void 0 ? _b : new Set(), + }; + path.traverse({ + ImportDeclaration(path) { + const importSpecifierChecks = moduleLoadChecks.get(path.node.source.value); + if (importSpecifierChecks == null) { + return; + } + const specifiers = path.get('specifiers'); + for (const specifier of specifiers) { + if (specifier.isImportSpecifier()) { + validateImportSpecifier(specifier, importSpecifierChecks, traversalState); + } + else { + validateNamespacedImport(specifier, importSpecifierChecks, traversalState); + } + } + }, + }); +} +function matchCompilerDiagnostic(badReference, transformErrors) { + for (const { fn, error } of transformErrors) { + if (fn.isAncestor(badReference)) { + return error.toString(); + } + } + return null; +} + +const ENABLE_REACT_COMPILER_TIMINGS = process.env['ENABLE_REACT_COMPILER_TIMINGS'] === '1'; +function BabelPluginReactCompiler(_babel) { + return { + name: 'react-forget', + visitor: { + Program: { + enter(prog, pass) { + var _a, _b, _c, _d; + try { + const filename = (_a = pass.filename) !== null && _a !== void 0 ? _a : 'unknown'; + if (ENABLE_REACT_COMPILER_TIMINGS === true) { + performance.mark(`${filename}:start`, { + detail: 'BabelPlugin:Program:start', + }); + } + let opts = parsePluginOptions(pass.opts); + const isDev = (typeof true !== 'undefined' && true === true) || + process.env['NODE_ENV'] === 'development'; + if (opts.enableReanimatedCheck === true && + pipelineUsesReanimatedPlugin(pass.file.opts.plugins)) { + opts = injectReanimatedFlag(opts); + } + if (opts.environment.enableResetCacheOnSourceFileChanges !== false && + isDev) { + opts = Object.assign(Object.assign({}, opts), { environment: Object.assign(Object.assign({}, opts.environment), { enableResetCacheOnSourceFileChanges: true }) }); + } + const result = compileProgram(prog, { + opts, + filename: (_b = pass.filename) !== null && _b !== void 0 ? _b : null, + comments: (_c = pass.file.ast.comments) !== null && _c !== void 0 ? _c : [], + code: pass.file.code, + }); + validateNoUntransformedReferences(prog, (_d = pass.filename) !== null && _d !== void 0 ? _d : null, opts.logger, opts.environment, result); + if (ENABLE_REACT_COMPILER_TIMINGS === true) { + performance.mark(`${filename}:end`, { + detail: 'BabelPlugin:Program:end', + }); + } + } + catch (e) { + if (e instanceof CompilerError) { + throw e.withPrintedMessage(pass.file.code, { eslint: false }); + } + throw e; + } + }, + exit(_, pass) { + var _a; + if (ENABLE_REACT_COMPILER_TIMINGS === true) { + const filename = (_a = pass.filename) !== null && _a !== void 0 ? _a : 'unknown'; + const measurement = performance.measure(filename, { + start: `${filename}:start`, + end: `${filename}:end`, + detail: 'BabelPlugin:Program', + }); + if ('logger' in pass.opts && pass.opts.logger != null) { + const logger = pass.opts.logger; + logger.logEvent(filename, { + kind: 'Timing', + measurement, + }); + } + } + }, + }, + }, + }; +} + +var _LRUCache_values, _LRUCache_headIdx; +const COMPILER_OPTIONS = { + noEmit: true, + panicThreshold: 'none', + flowSuppressions: false, + environment: { + validateRefAccessDuringRender: true, + validateNoSetStateInRender: true, + validateNoSetStateInEffects: true, + validateNoJSXInTryStatements: true, + validateNoImpureFunctionsInRender: true, + validateStaticComponents: true, + validateNoFreezingKnownMutableFunctions: true, + validateNoVoidUseMemo: true, + validateNoCapitalizedCalls: [], + validateHooksUsage: true, + validateNoDerivedComputationsInEffects: true, + }, +}; +const FLOW_SUPPRESSION_REGEX = /\$FlowFixMe\[([^\]]*)\]/g; +function getFlowSuppressions(sourceCode) { + const comments = sourceCode.getAllComments(); + const results = []; + for (const commentNode of comments) { + const matches = commentNode.value.matchAll(FLOW_SUPPRESSION_REGEX); + for (const match of matches) { + if (match.index != null && commentNode.loc != null) { + const code = match[1]; + results.push({ + line: commentNode.loc.end.line, + code, + }); + } + } + } + return results; +} +function filterUnusedOptOutDirectives(directives) { + const results = []; + for (const directive of directives) { + if (OPT_OUT_DIRECTIVES.has(directive.value.value) && + directive.loc != null) { + results.push({ + loc: directive.loc, + directive: directive.value.value, + range: [directive.start, directive.end], + }); + } + } + return results; +} +function runReactCompilerImpl({ sourceCode, filename, userOpts, }) { + var _a, _b; + const options = parsePluginOptions(Object.assign(Object.assign(Object.assign({}, COMPILER_OPTIONS), userOpts), { environment: Object.assign(Object.assign({}, COMPILER_OPTIONS.environment), userOpts.environment) })); + const results = { + sourceCode: sourceCode.text, + filename, + userOpts, + flowSuppressions: [], + unusedOptOutDirectives: [], + events: [], + }; + const userLogger = options.logger; + options.logger = { + logEvent: (eventFilename, event) => { + userLogger === null || userLogger === void 0 ? void 0 : userLogger.logEvent(eventFilename, event); + results.events.push(event); + }, + }; + try { + options.environment = validateEnvironmentConfig((_a = options.environment) !== null && _a !== void 0 ? _a : {}); + } + catch (err) { + (_b = options.logger) === null || _b === void 0 ? void 0 : _b.logEvent(filename, err); + } + let babelAST = null; + if (filename.endsWith('.tsx') || filename.endsWith('.ts')) { + try { + babelAST = BabelParser.parse(sourceCode.text, { + sourceFilename: filename, + sourceType: 'unambiguous', + plugins: ['typescript', 'jsx'], + }); + } + catch (_c) { + } + } + else { + try { + babelAST = HermesParser.parse(sourceCode.text, { + babel: true, + enableExperimentalComponentSyntax: true, + sourceFilename: filename, + sourceType: 'module', + }); + } + catch (_d) { + } + } + if (babelAST != null) { + results.flowSuppressions = getFlowSuppressions(sourceCode); + try { + core$1.transformFromAstSync(babelAST, sourceCode.text, { + filename, + highlightCode: false, + retainLines: true, + plugins: [ + [PluginProposalPrivateMethods.default, { loose: true }], + [BabelPluginReactCompiler, options], + ], + sourceType: 'module', + configFile: false, + babelrc: false, + }); + if (results.events.filter(e => e.kind === 'CompileError').length === 0) { + core$1.traverse(babelAST, { + FunctionDeclaration(path) { + results.unusedOptOutDirectives.push(...filterUnusedOptOutDirectives(path.node.body.directives)); + }, + ArrowFunctionExpression(path) { + if (path.node.body.type === 'BlockStatement') { + results.unusedOptOutDirectives.push(...filterUnusedOptOutDirectives(path.node.body.directives)); + } + }, + FunctionExpression(path) { + results.unusedOptOutDirectives.push(...filterUnusedOptOutDirectives(path.node.body.directives)); + }, + }); + } + } + catch (err) { + } + } + return results; +} +const SENTINEL = Symbol(); +class LRUCache { + constructor(size) { + _LRUCache_values.set(this, void 0); + _LRUCache_headIdx.set(this, 0); + __classPrivateFieldSet(this, _LRUCache_values, new Array(size).fill(SENTINEL), "f"); + } + get(key) { + const idx = __classPrivateFieldGet(this, _LRUCache_values, "f").findIndex(entry => entry[0] === key); + if (idx === __classPrivateFieldGet(this, _LRUCache_headIdx, "f")) { + return __classPrivateFieldGet(this, _LRUCache_values, "f")[__classPrivateFieldGet(this, _LRUCache_headIdx, "f")][1]; + } + else if (idx < 0) { + return null; + } + const entry = __classPrivateFieldGet(this, _LRUCache_values, "f")[idx]; + const len = __classPrivateFieldGet(this, _LRUCache_values, "f").length; + for (let i = 0; i < Math.min(idx, len - 1); i++) { + __classPrivateFieldGet(this, _LRUCache_values, "f")[(__classPrivateFieldGet(this, _LRUCache_headIdx, "f") + i + 1) % len] = + __classPrivateFieldGet(this, _LRUCache_values, "f")[(__classPrivateFieldGet(this, _LRUCache_headIdx, "f") + i) % len]; + } + __classPrivateFieldGet(this, _LRUCache_values, "f")[__classPrivateFieldGet(this, _LRUCache_headIdx, "f")] = entry; + return entry[1]; + } + push(key, value) { + __classPrivateFieldSet(this, _LRUCache_headIdx, (__classPrivateFieldGet(this, _LRUCache_headIdx, "f") - 1 + __classPrivateFieldGet(this, _LRUCache_values, "f").length) % __classPrivateFieldGet(this, _LRUCache_values, "f").length, "f"); + __classPrivateFieldGet(this, _LRUCache_values, "f")[__classPrivateFieldGet(this, _LRUCache_headIdx, "f")] = [key, value]; + } +} +_LRUCache_values = new WeakMap(), _LRUCache_headIdx = new WeakMap(); +const cache = new LRUCache(10); +function runReactCompiler({ sourceCode, filename, userOpts, }) { + const entry = cache.get(filename); + if (entry != null && + entry.sourceCode === sourceCode.text && + util.isDeepStrictEqual(entry.userOpts, userOpts)) { + return entry; + } + const runEntry = runReactCompilerImpl({ + sourceCode, + filename, + userOpts, + }); + if (entry != null) { + Object.assign(entry, runEntry); + } + else { + cache.push(filename, runEntry); + } + return Object.assign({}, runEntry); +} + +function assertExhaustive(_, errorMsg) { + throw new Error(errorMsg); +} +function makeSuggestions(detail) { + const suggest = []; + if (Array.isArray(detail.suggestions)) { + for (const suggestion of detail.suggestions) { + switch (suggestion.op) { + case CompilerSuggestionOperation.InsertBefore: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.insertTextBeforeRange(suggestion.range, suggestion.text); + }, + }); + break; + case CompilerSuggestionOperation.InsertAfter: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.insertTextAfterRange(suggestion.range, suggestion.text); + }, + }); + break; + case CompilerSuggestionOperation.Replace: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.replaceTextRange(suggestion.range, suggestion.text); + }, + }); + break; + case CompilerSuggestionOperation.Remove: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.removeRange(suggestion.range); + }, + }); + break; + default: + assertExhaustive(suggestion, 'Unhandled suggestion operation'); + } + } + } + return suggest; +} +function getReactCompilerResult(context) { + var _a, _b, _c; + const sourceCode = (_a = context.sourceCode) !== null && _a !== void 0 ? _a : context.getSourceCode(); + const filename = (_b = context.filename) !== null && _b !== void 0 ? _b : context.getFilename(); + const userOpts = (_c = context.options[0]) !== null && _c !== void 0 ? _c : {}; + const results = runReactCompiler({ + sourceCode, + filename, + userOpts, + }); + return results; +} +function hasFlowSuppression(program, nodeLoc, suppressions) { + for (const commentNode of program.flowSuppressions) { + if (suppressions.includes(commentNode.code) && + commentNode.line === nodeLoc.start.line - 1) { + return true; + } + } + return false; +} +function makeRule(rule) { + const create = (context) => { + const result = getReactCompilerResult(context); + for (const event of result.events) { + if (event.kind === 'CompileError') { + const detail = event.detail; + if (detail.category === rule.category) { + const loc = detail.primaryLocation(); + if (loc == null || typeof loc === 'symbol') { + continue; + } + if (hasFlowSuppression(result, loc, [ + 'react-rule-hook', + 'react-rule-unsafe-ref', + ])) { + continue; + } + context.report({ + message: detail.printErrorMessage(result.sourceCode, { + eslint: true, + }), + loc, + suggest: makeSuggestions(detail.options), + }); + } + } + } + return {}; + }; + return { + meta: { + type: 'problem', + docs: { + description: rule.description, + recommended: rule.recommended, + }, + fixable: 'code', + hasSuggestions: true, + schema: [{ type: 'object', additionalProperties: true }], + }, + create, + }; +} +const NoUnusedDirectivesRule = { + meta: { + type: 'suggestion', + docs: { + recommended: true, + }, + fixable: 'code', + hasSuggestions: true, + schema: [{ type: 'object', additionalProperties: true }], + }, + create(context) { + const results = getReactCompilerResult(context); + for (const directive of results.unusedOptOutDirectives) { + context.report({ + message: `Unused '${directive.directive}' directive`, + loc: directive.loc, + suggest: [ + { + desc: 'Remove the directive', + fix(fixer) { + return fixer.removeRange(directive.range); + }, + }, + ], + }); + } + return {}; + }, +}; +const allRules = LintRules.reduce((acc, rule) => { + acc[rule.name] = { rule: makeRule(rule), severity: rule.severity }; + return acc; +}, { + 'no-unused-directives': { + rule: NoUnusedDirectivesRule, + severity: ErrorSeverity.Error, + }, +}); +LintRules.filter(rule => rule.recommended).reduce((acc, rule) => { + acc[rule.name] = { rule: makeRule(rule), severity: rule.severity }; + return acc; +}, { + 'no-unused-directives': { + rule: NoUnusedDirectivesRule, + severity: ErrorSeverity.Error, + }, +}); + var assert_1; var hasRequiredAssert; function requireAssert() { @@ -4746,10 +57770,7 @@ function last(array) { return array[array.length - 1]; } -const rules = { - 'exhaustive-deps': rule$1, - 'rules-of-hooks': rule, -}; +const rules = Object.assign({ 'exhaustive-deps': rule$1, 'rules-of-hooks': rule }, Object.fromEntries(Object.entries(allRules).map(([name, config]) => [name, config.rule]))); const ruleConfigs = { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', diff --git a/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js b/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js index cb0de2bdf3..625b0dd9bc 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js +++ b/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js @@ -6,11 +6,20 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - * @generated SignedSource<<59888f8e65b7469b480663f28d9e6581>> + * @generated SignedSource<> */ 'use strict'; +var core$1 = require('@babel/core'); +var BabelParser = require('@babel/parser'); +var zod = require('zod'); +var zodValidationError = require('zod-validation-error'); +var crypto = require('crypto'); +var PluginProposalPrivateMethods = require('@babel/plugin-proposal-private-methods'); +var HermesParser = require('hermes-parser'); +var util = require('util'); + const SETTINGS_KEY = 'react-hooks'; const SETTINGS_ADDITIONAL_EFFECT_HOOKS_KEY = 'additionalEffectHooks'; function getAdditionalEffectHooksFromSettings(settings) { @@ -1447,10 +1456,52814 @@ function getUnknownDependenciesMessage(reactiveHookName) { `are unknown. Pass an inline function instead.`); } +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } +var invariant_1; +var hasRequiredInvariant; + +function requireInvariant () { + if (hasRequiredInvariant) return invariant_1; + hasRequiredInvariant = 1; + + var invariant = function(condition, format, a, b, c, d, e, f) { + + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } + }; + + invariant_1 = invariant; + return invariant_1; +} + +var invariantExports = requireInvariant(); +var invariant = /*@__PURE__*/getDefaultExportFromCjs(invariantExports); + +var lib$3 = {}; + +var isReactComponent = {}; + +var buildMatchMemberExpression = {}; + +var matchesPattern = {}; + +var generated$3 = {}; + +var shallowEqual = {}; + +var hasRequiredShallowEqual; + +function requireShallowEqual () { + if (hasRequiredShallowEqual) return shallowEqual; + hasRequiredShallowEqual = 1; + + Object.defineProperty(shallowEqual, "__esModule", { + value: true + }); + shallowEqual.default = shallowEqual$1; + function shallowEqual$1(actual, expected) { + const keys = Object.keys(expected); + for (const key of keys) { + if (actual[key] !== expected[key]) { + return false; + } + } + return true; + } + + + return shallowEqual; +} + +var deprecationWarning = {}; + +var hasRequiredDeprecationWarning; + +function requireDeprecationWarning () { + if (hasRequiredDeprecationWarning) return deprecationWarning; + hasRequiredDeprecationWarning = 1; + + Object.defineProperty(deprecationWarning, "__esModule", { + value: true + }); + deprecationWarning.default = deprecationWarning$1; + const warnings = new Set(); + function deprecationWarning$1(oldName, newName, prefix = "") { + if (warnings.has(oldName)) return; + warnings.add(oldName); + const { + internal, + trace + } = captureShortStackTrace(1, 2); + if (internal) { + return; + } + console.warn(`${prefix}\`${oldName}\` has been deprecated, please migrate to \`${newName}\`\n${trace}`); + } + function captureShortStackTrace(skip, length) { + const { + stackTraceLimit, + prepareStackTrace + } = Error; + let stackTrace; + Error.stackTraceLimit = 1 + skip + length; + Error.prepareStackTrace = function (err, stack) { + stackTrace = stack; + }; + Error.stackTraceLimit = stackTraceLimit; + Error.prepareStackTrace = prepareStackTrace; + if (!stackTrace) return { + internal: false, + trace: "" + }; + const shortStackTrace = stackTrace.slice(1 + skip, 1 + skip + length); + return { + internal: /[\\/]@babel[\\/]/.test(shortStackTrace[1].getFileName()), + trace: shortStackTrace.map(frame => ` at ${frame}`).join("\n") + }; + } + + + return deprecationWarning; +} + +var hasRequiredGenerated$3; + +function requireGenerated$3 () { + if (hasRequiredGenerated$3) return generated$3; + hasRequiredGenerated$3 = 1; + + Object.defineProperty(generated$3, "__esModule", { + value: true + }); + generated$3.isAccessor = isAccessor; + generated$3.isAnyTypeAnnotation = isAnyTypeAnnotation; + generated$3.isArgumentPlaceholder = isArgumentPlaceholder; + generated$3.isArrayExpression = isArrayExpression; + generated$3.isArrayPattern = isArrayPattern; + generated$3.isArrayTypeAnnotation = isArrayTypeAnnotation; + generated$3.isArrowFunctionExpression = isArrowFunctionExpression; + generated$3.isAssignmentExpression = isAssignmentExpression; + generated$3.isAssignmentPattern = isAssignmentPattern; + generated$3.isAwaitExpression = isAwaitExpression; + generated$3.isBigIntLiteral = isBigIntLiteral; + generated$3.isBinary = isBinary; + generated$3.isBinaryExpression = isBinaryExpression; + generated$3.isBindExpression = isBindExpression; + generated$3.isBlock = isBlock; + generated$3.isBlockParent = isBlockParent; + generated$3.isBlockStatement = isBlockStatement; + generated$3.isBooleanLiteral = isBooleanLiteral; + generated$3.isBooleanLiteralTypeAnnotation = isBooleanLiteralTypeAnnotation; + generated$3.isBooleanTypeAnnotation = isBooleanTypeAnnotation; + generated$3.isBreakStatement = isBreakStatement; + generated$3.isCallExpression = isCallExpression; + generated$3.isCatchClause = isCatchClause; + generated$3.isClass = isClass; + generated$3.isClassAccessorProperty = isClassAccessorProperty; + generated$3.isClassBody = isClassBody; + generated$3.isClassDeclaration = isClassDeclaration; + generated$3.isClassExpression = isClassExpression; + generated$3.isClassImplements = isClassImplements; + generated$3.isClassMethod = isClassMethod; + generated$3.isClassPrivateMethod = isClassPrivateMethod; + generated$3.isClassPrivateProperty = isClassPrivateProperty; + generated$3.isClassProperty = isClassProperty; + generated$3.isCompletionStatement = isCompletionStatement; + generated$3.isConditional = isConditional; + generated$3.isConditionalExpression = isConditionalExpression; + generated$3.isContinueStatement = isContinueStatement; + generated$3.isDebuggerStatement = isDebuggerStatement; + generated$3.isDecimalLiteral = isDecimalLiteral; + generated$3.isDeclaration = isDeclaration; + generated$3.isDeclareClass = isDeclareClass; + generated$3.isDeclareExportAllDeclaration = isDeclareExportAllDeclaration; + generated$3.isDeclareExportDeclaration = isDeclareExportDeclaration; + generated$3.isDeclareFunction = isDeclareFunction; + generated$3.isDeclareInterface = isDeclareInterface; + generated$3.isDeclareModule = isDeclareModule; + generated$3.isDeclareModuleExports = isDeclareModuleExports; + generated$3.isDeclareOpaqueType = isDeclareOpaqueType; + generated$3.isDeclareTypeAlias = isDeclareTypeAlias; + generated$3.isDeclareVariable = isDeclareVariable; + generated$3.isDeclaredPredicate = isDeclaredPredicate; + generated$3.isDecorator = isDecorator; + generated$3.isDirective = isDirective; + generated$3.isDirectiveLiteral = isDirectiveLiteral; + generated$3.isDoExpression = isDoExpression; + generated$3.isDoWhileStatement = isDoWhileStatement; + generated$3.isEmptyStatement = isEmptyStatement; + generated$3.isEmptyTypeAnnotation = isEmptyTypeAnnotation; + generated$3.isEnumBody = isEnumBody; + generated$3.isEnumBooleanBody = isEnumBooleanBody; + generated$3.isEnumBooleanMember = isEnumBooleanMember; + generated$3.isEnumDeclaration = isEnumDeclaration; + generated$3.isEnumDefaultedMember = isEnumDefaultedMember; + generated$3.isEnumMember = isEnumMember; + generated$3.isEnumNumberBody = isEnumNumberBody; + generated$3.isEnumNumberMember = isEnumNumberMember; + generated$3.isEnumStringBody = isEnumStringBody; + generated$3.isEnumStringMember = isEnumStringMember; + generated$3.isEnumSymbolBody = isEnumSymbolBody; + generated$3.isExistsTypeAnnotation = isExistsTypeAnnotation; + generated$3.isExportAllDeclaration = isExportAllDeclaration; + generated$3.isExportDeclaration = isExportDeclaration; + generated$3.isExportDefaultDeclaration = isExportDefaultDeclaration; + generated$3.isExportDefaultSpecifier = isExportDefaultSpecifier; + generated$3.isExportNamedDeclaration = isExportNamedDeclaration; + generated$3.isExportNamespaceSpecifier = isExportNamespaceSpecifier; + generated$3.isExportSpecifier = isExportSpecifier; + generated$3.isExpression = isExpression; + generated$3.isExpressionStatement = isExpressionStatement; + generated$3.isExpressionWrapper = isExpressionWrapper; + generated$3.isFile = isFile; + generated$3.isFlow = isFlow; + generated$3.isFlowBaseAnnotation = isFlowBaseAnnotation; + generated$3.isFlowDeclaration = isFlowDeclaration; + generated$3.isFlowPredicate = isFlowPredicate; + generated$3.isFlowType = isFlowType; + generated$3.isFor = isFor; + generated$3.isForInStatement = isForInStatement; + generated$3.isForOfStatement = isForOfStatement; + generated$3.isForStatement = isForStatement; + generated$3.isForXStatement = isForXStatement; + generated$3.isFunction = isFunction; + generated$3.isFunctionDeclaration = isFunctionDeclaration; + generated$3.isFunctionExpression = isFunctionExpression; + generated$3.isFunctionParent = isFunctionParent; + generated$3.isFunctionTypeAnnotation = isFunctionTypeAnnotation; + generated$3.isFunctionTypeParam = isFunctionTypeParam; + generated$3.isGenericTypeAnnotation = isGenericTypeAnnotation; + generated$3.isIdentifier = isIdentifier; + generated$3.isIfStatement = isIfStatement; + generated$3.isImmutable = isImmutable; + generated$3.isImport = isImport; + generated$3.isImportAttribute = isImportAttribute; + generated$3.isImportDeclaration = isImportDeclaration; + generated$3.isImportDefaultSpecifier = isImportDefaultSpecifier; + generated$3.isImportExpression = isImportExpression; + generated$3.isImportNamespaceSpecifier = isImportNamespaceSpecifier; + generated$3.isImportOrExportDeclaration = isImportOrExportDeclaration; + generated$3.isImportSpecifier = isImportSpecifier; + generated$3.isIndexedAccessType = isIndexedAccessType; + generated$3.isInferredPredicate = isInferredPredicate; + generated$3.isInterfaceDeclaration = isInterfaceDeclaration; + generated$3.isInterfaceExtends = isInterfaceExtends; + generated$3.isInterfaceTypeAnnotation = isInterfaceTypeAnnotation; + generated$3.isInterpreterDirective = isInterpreterDirective; + generated$3.isIntersectionTypeAnnotation = isIntersectionTypeAnnotation; + generated$3.isJSX = isJSX; + generated$3.isJSXAttribute = isJSXAttribute; + generated$3.isJSXClosingElement = isJSXClosingElement; + generated$3.isJSXClosingFragment = isJSXClosingFragment; + generated$3.isJSXElement = isJSXElement; + generated$3.isJSXEmptyExpression = isJSXEmptyExpression; + generated$3.isJSXExpressionContainer = isJSXExpressionContainer; + generated$3.isJSXFragment = isJSXFragment; + generated$3.isJSXIdentifier = isJSXIdentifier; + generated$3.isJSXMemberExpression = isJSXMemberExpression; + generated$3.isJSXNamespacedName = isJSXNamespacedName; + generated$3.isJSXOpeningElement = isJSXOpeningElement; + generated$3.isJSXOpeningFragment = isJSXOpeningFragment; + generated$3.isJSXSpreadAttribute = isJSXSpreadAttribute; + generated$3.isJSXSpreadChild = isJSXSpreadChild; + generated$3.isJSXText = isJSXText; + generated$3.isLVal = isLVal; + generated$3.isLabeledStatement = isLabeledStatement; + generated$3.isLiteral = isLiteral; + generated$3.isLogicalExpression = isLogicalExpression; + generated$3.isLoop = isLoop; + generated$3.isMemberExpression = isMemberExpression; + generated$3.isMetaProperty = isMetaProperty; + generated$3.isMethod = isMethod; + generated$3.isMiscellaneous = isMiscellaneous; + generated$3.isMixedTypeAnnotation = isMixedTypeAnnotation; + generated$3.isModuleDeclaration = isModuleDeclaration; + generated$3.isModuleExpression = isModuleExpression; + generated$3.isModuleSpecifier = isModuleSpecifier; + generated$3.isNewExpression = isNewExpression; + generated$3.isNoop = isNoop; + generated$3.isNullLiteral = isNullLiteral; + generated$3.isNullLiteralTypeAnnotation = isNullLiteralTypeAnnotation; + generated$3.isNullableTypeAnnotation = isNullableTypeAnnotation; + generated$3.isNumberLiteral = isNumberLiteral; + generated$3.isNumberLiteralTypeAnnotation = isNumberLiteralTypeAnnotation; + generated$3.isNumberTypeAnnotation = isNumberTypeAnnotation; + generated$3.isNumericLiteral = isNumericLiteral; + generated$3.isObjectExpression = isObjectExpression; + generated$3.isObjectMember = isObjectMember; + generated$3.isObjectMethod = isObjectMethod; + generated$3.isObjectPattern = isObjectPattern; + generated$3.isObjectProperty = isObjectProperty; + generated$3.isObjectTypeAnnotation = isObjectTypeAnnotation; + generated$3.isObjectTypeCallProperty = isObjectTypeCallProperty; + generated$3.isObjectTypeIndexer = isObjectTypeIndexer; + generated$3.isObjectTypeInternalSlot = isObjectTypeInternalSlot; + generated$3.isObjectTypeProperty = isObjectTypeProperty; + generated$3.isObjectTypeSpreadProperty = isObjectTypeSpreadProperty; + generated$3.isOpaqueType = isOpaqueType; + generated$3.isOptionalCallExpression = isOptionalCallExpression; + generated$3.isOptionalIndexedAccessType = isOptionalIndexedAccessType; + generated$3.isOptionalMemberExpression = isOptionalMemberExpression; + generated$3.isParenthesizedExpression = isParenthesizedExpression; + generated$3.isPattern = isPattern; + generated$3.isPatternLike = isPatternLike; + generated$3.isPipelineBareFunction = isPipelineBareFunction; + generated$3.isPipelinePrimaryTopicReference = isPipelinePrimaryTopicReference; + generated$3.isPipelineTopicExpression = isPipelineTopicExpression; + generated$3.isPlaceholder = isPlaceholder; + generated$3.isPrivate = isPrivate; + generated$3.isPrivateName = isPrivateName; + generated$3.isProgram = isProgram; + generated$3.isProperty = isProperty; + generated$3.isPureish = isPureish; + generated$3.isQualifiedTypeIdentifier = isQualifiedTypeIdentifier; + generated$3.isRecordExpression = isRecordExpression; + generated$3.isRegExpLiteral = isRegExpLiteral; + generated$3.isRegexLiteral = isRegexLiteral; + generated$3.isRestElement = isRestElement; + generated$3.isRestProperty = isRestProperty; + generated$3.isReturnStatement = isReturnStatement; + generated$3.isScopable = isScopable; + generated$3.isSequenceExpression = isSequenceExpression; + generated$3.isSpreadElement = isSpreadElement; + generated$3.isSpreadProperty = isSpreadProperty; + generated$3.isStandardized = isStandardized; + generated$3.isStatement = isStatement; + generated$3.isStaticBlock = isStaticBlock; + generated$3.isStringLiteral = isStringLiteral; + generated$3.isStringLiteralTypeAnnotation = isStringLiteralTypeAnnotation; + generated$3.isStringTypeAnnotation = isStringTypeAnnotation; + generated$3.isSuper = isSuper; + generated$3.isSwitchCase = isSwitchCase; + generated$3.isSwitchStatement = isSwitchStatement; + generated$3.isSymbolTypeAnnotation = isSymbolTypeAnnotation; + generated$3.isTSAnyKeyword = isTSAnyKeyword; + generated$3.isTSArrayType = isTSArrayType; + generated$3.isTSAsExpression = isTSAsExpression; + generated$3.isTSBaseType = isTSBaseType; + generated$3.isTSBigIntKeyword = isTSBigIntKeyword; + generated$3.isTSBooleanKeyword = isTSBooleanKeyword; + generated$3.isTSCallSignatureDeclaration = isTSCallSignatureDeclaration; + generated$3.isTSConditionalType = isTSConditionalType; + generated$3.isTSConstructSignatureDeclaration = isTSConstructSignatureDeclaration; + generated$3.isTSConstructorType = isTSConstructorType; + generated$3.isTSDeclareFunction = isTSDeclareFunction; + generated$3.isTSDeclareMethod = isTSDeclareMethod; + generated$3.isTSEntityName = isTSEntityName; + generated$3.isTSEnumDeclaration = isTSEnumDeclaration; + generated$3.isTSEnumMember = isTSEnumMember; + generated$3.isTSExportAssignment = isTSExportAssignment; + generated$3.isTSExpressionWithTypeArguments = isTSExpressionWithTypeArguments; + generated$3.isTSExternalModuleReference = isTSExternalModuleReference; + generated$3.isTSFunctionType = isTSFunctionType; + generated$3.isTSImportEqualsDeclaration = isTSImportEqualsDeclaration; + generated$3.isTSImportType = isTSImportType; + generated$3.isTSIndexSignature = isTSIndexSignature; + generated$3.isTSIndexedAccessType = isTSIndexedAccessType; + generated$3.isTSInferType = isTSInferType; + generated$3.isTSInstantiationExpression = isTSInstantiationExpression; + generated$3.isTSInterfaceBody = isTSInterfaceBody; + generated$3.isTSInterfaceDeclaration = isTSInterfaceDeclaration; + generated$3.isTSIntersectionType = isTSIntersectionType; + generated$3.isTSIntrinsicKeyword = isTSIntrinsicKeyword; + generated$3.isTSLiteralType = isTSLiteralType; + generated$3.isTSMappedType = isTSMappedType; + generated$3.isTSMethodSignature = isTSMethodSignature; + generated$3.isTSModuleBlock = isTSModuleBlock; + generated$3.isTSModuleDeclaration = isTSModuleDeclaration; + generated$3.isTSNamedTupleMember = isTSNamedTupleMember; + generated$3.isTSNamespaceExportDeclaration = isTSNamespaceExportDeclaration; + generated$3.isTSNeverKeyword = isTSNeverKeyword; + generated$3.isTSNonNullExpression = isTSNonNullExpression; + generated$3.isTSNullKeyword = isTSNullKeyword; + generated$3.isTSNumberKeyword = isTSNumberKeyword; + generated$3.isTSObjectKeyword = isTSObjectKeyword; + generated$3.isTSOptionalType = isTSOptionalType; + generated$3.isTSParameterProperty = isTSParameterProperty; + generated$3.isTSParenthesizedType = isTSParenthesizedType; + generated$3.isTSPropertySignature = isTSPropertySignature; + generated$3.isTSQualifiedName = isTSQualifiedName; + generated$3.isTSRestType = isTSRestType; + generated$3.isTSSatisfiesExpression = isTSSatisfiesExpression; + generated$3.isTSStringKeyword = isTSStringKeyword; + generated$3.isTSSymbolKeyword = isTSSymbolKeyword; + generated$3.isTSThisType = isTSThisType; + generated$3.isTSTupleType = isTSTupleType; + generated$3.isTSType = isTSType; + generated$3.isTSTypeAliasDeclaration = isTSTypeAliasDeclaration; + generated$3.isTSTypeAnnotation = isTSTypeAnnotation; + generated$3.isTSTypeAssertion = isTSTypeAssertion; + generated$3.isTSTypeElement = isTSTypeElement; + generated$3.isTSTypeLiteral = isTSTypeLiteral; + generated$3.isTSTypeOperator = isTSTypeOperator; + generated$3.isTSTypeParameter = isTSTypeParameter; + generated$3.isTSTypeParameterDeclaration = isTSTypeParameterDeclaration; + generated$3.isTSTypeParameterInstantiation = isTSTypeParameterInstantiation; + generated$3.isTSTypePredicate = isTSTypePredicate; + generated$3.isTSTypeQuery = isTSTypeQuery; + generated$3.isTSTypeReference = isTSTypeReference; + generated$3.isTSUndefinedKeyword = isTSUndefinedKeyword; + generated$3.isTSUnionType = isTSUnionType; + generated$3.isTSUnknownKeyword = isTSUnknownKeyword; + generated$3.isTSVoidKeyword = isTSVoidKeyword; + generated$3.isTaggedTemplateExpression = isTaggedTemplateExpression; + generated$3.isTemplateElement = isTemplateElement; + generated$3.isTemplateLiteral = isTemplateLiteral; + generated$3.isTerminatorless = isTerminatorless; + generated$3.isThisExpression = isThisExpression; + generated$3.isThisTypeAnnotation = isThisTypeAnnotation; + generated$3.isThrowStatement = isThrowStatement; + generated$3.isTopicReference = isTopicReference; + generated$3.isTryStatement = isTryStatement; + generated$3.isTupleExpression = isTupleExpression; + generated$3.isTupleTypeAnnotation = isTupleTypeAnnotation; + generated$3.isTypeAlias = isTypeAlias; + generated$3.isTypeAnnotation = isTypeAnnotation; + generated$3.isTypeCastExpression = isTypeCastExpression; + generated$3.isTypeParameter = isTypeParameter; + generated$3.isTypeParameterDeclaration = isTypeParameterDeclaration; + generated$3.isTypeParameterInstantiation = isTypeParameterInstantiation; + generated$3.isTypeScript = isTypeScript; + generated$3.isTypeofTypeAnnotation = isTypeofTypeAnnotation; + generated$3.isUnaryExpression = isUnaryExpression; + generated$3.isUnaryLike = isUnaryLike; + generated$3.isUnionTypeAnnotation = isUnionTypeAnnotation; + generated$3.isUpdateExpression = isUpdateExpression; + generated$3.isUserWhitespacable = isUserWhitespacable; + generated$3.isV8IntrinsicIdentifier = isV8IntrinsicIdentifier; + generated$3.isVariableDeclaration = isVariableDeclaration; + generated$3.isVariableDeclarator = isVariableDeclarator; + generated$3.isVariance = isVariance; + generated$3.isVoidTypeAnnotation = isVoidTypeAnnotation; + generated$3.isWhile = isWhile; + generated$3.isWhileStatement = isWhileStatement; + generated$3.isWithStatement = isWithStatement; + generated$3.isYieldExpression = isYieldExpression; + var _shallowEqual = requireShallowEqual(); + var _deprecationWarning = requireDeprecationWarning(); + function isArrayExpression(node, opts) { + if (!node) return false; + if (node.type !== "ArrayExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAssignmentExpression(node, opts) { + if (!node) return false; + if (node.type !== "AssignmentExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBinaryExpression(node, opts) { + if (!node) return false; + if (node.type !== "BinaryExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterpreterDirective(node, opts) { + if (!node) return false; + if (node.type !== "InterpreterDirective") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDirective(node, opts) { + if (!node) return false; + if (node.type !== "Directive") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDirectiveLiteral(node, opts) { + if (!node) return false; + if (node.type !== "DirectiveLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBlockStatement(node, opts) { + if (!node) return false; + if (node.type !== "BlockStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBreakStatement(node, opts) { + if (!node) return false; + if (node.type !== "BreakStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isCallExpression(node, opts) { + if (!node) return false; + if (node.type !== "CallExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isCatchClause(node, opts) { + if (!node) return false; + if (node.type !== "CatchClause") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isConditionalExpression(node, opts) { + if (!node) return false; + if (node.type !== "ConditionalExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isContinueStatement(node, opts) { + if (!node) return false; + if (node.type !== "ContinueStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDebuggerStatement(node, opts) { + if (!node) return false; + if (node.type !== "DebuggerStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDoWhileStatement(node, opts) { + if (!node) return false; + if (node.type !== "DoWhileStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEmptyStatement(node, opts) { + if (!node) return false; + if (node.type !== "EmptyStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExpressionStatement(node, opts) { + if (!node) return false; + if (node.type !== "ExpressionStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFile(node, opts) { + if (!node) return false; + if (node.type !== "File") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForInStatement(node, opts) { + if (!node) return false; + if (node.type !== "ForInStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForStatement(node, opts) { + if (!node) return false; + if (node.type !== "ForStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "FunctionDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionExpression(node, opts) { + if (!node) return false; + if (node.type !== "FunctionExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "Identifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIfStatement(node, opts) { + if (!node) return false; + if (node.type !== "IfStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLabeledStatement(node, opts) { + if (!node) return false; + if (node.type !== "LabeledStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStringLiteral(node, opts) { + if (!node) return false; + if (node.type !== "StringLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumericLiteral(node, opts) { + if (!node) return false; + if (node.type !== "NumericLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNullLiteral(node, opts) { + if (!node) return false; + if (node.type !== "NullLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBooleanLiteral(node, opts) { + if (!node) return false; + if (node.type !== "BooleanLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRegExpLiteral(node, opts) { + if (!node) return false; + if (node.type !== "RegExpLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLogicalExpression(node, opts) { + if (!node) return false; + if (node.type !== "LogicalExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMemberExpression(node, opts) { + if (!node) return false; + if (node.type !== "MemberExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNewExpression(node, opts) { + if (!node) return false; + if (node.type !== "NewExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isProgram(node, opts) { + if (!node) return false; + if (node.type !== "Program") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectExpression(node, opts) { + if (!node) return false; + if (node.type !== "ObjectExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectMethod(node, opts) { + if (!node) return false; + if (node.type !== "ObjectMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRestElement(node, opts) { + if (!node) return false; + if (node.type !== "RestElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isReturnStatement(node, opts) { + if (!node) return false; + if (node.type !== "ReturnStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSequenceExpression(node, opts) { + if (!node) return false; + if (node.type !== "SequenceExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isParenthesizedExpression(node, opts) { + if (!node) return false; + if (node.type !== "ParenthesizedExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSwitchCase(node, opts) { + if (!node) return false; + if (node.type !== "SwitchCase") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSwitchStatement(node, opts) { + if (!node) return false; + if (node.type !== "SwitchStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isThisExpression(node, opts) { + if (!node) return false; + if (node.type !== "ThisExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isThrowStatement(node, opts) { + if (!node) return false; + if (node.type !== "ThrowStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTryStatement(node, opts) { + if (!node) return false; + if (node.type !== "TryStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUnaryExpression(node, opts) { + if (!node) return false; + if (node.type !== "UnaryExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUpdateExpression(node, opts) { + if (!node) return false; + if (node.type !== "UpdateExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVariableDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "VariableDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVariableDeclarator(node, opts) { + if (!node) return false; + if (node.type !== "VariableDeclarator") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isWhileStatement(node, opts) { + if (!node) return false; + if (node.type !== "WhileStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isWithStatement(node, opts) { + if (!node) return false; + if (node.type !== "WithStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAssignmentPattern(node, opts) { + if (!node) return false; + if (node.type !== "AssignmentPattern") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArrayPattern(node, opts) { + if (!node) return false; + if (node.type !== "ArrayPattern") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArrowFunctionExpression(node, opts) { + if (!node) return false; + if (node.type !== "ArrowFunctionExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassBody(node, opts) { + if (!node) return false; + if (node.type !== "ClassBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassExpression(node, opts) { + if (!node) return false; + if (node.type !== "ClassExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ClassDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportAllDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ExportAllDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportDefaultDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ExportDefaultDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportNamedDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ExportNamedDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ExportSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForOfStatement(node, opts) { + if (!node) return false; + if (node.type !== "ForOfStatement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "ImportDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportDefaultSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ImportDefaultSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportNamespaceSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ImportNamespaceSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ImportSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportExpression(node, opts) { + if (!node) return false; + if (node.type !== "ImportExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMetaProperty(node, opts) { + if (!node) return false; + if (node.type !== "MetaProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassMethod(node, opts) { + if (!node) return false; + if (node.type !== "ClassMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectPattern(node, opts) { + if (!node) return false; + if (node.type !== "ObjectPattern") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSpreadElement(node, opts) { + if (!node) return false; + if (node.type !== "SpreadElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSuper(node, opts) { + if (!node) return false; + if (node.type !== "Super") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTaggedTemplateExpression(node, opts) { + if (!node) return false; + if (node.type !== "TaggedTemplateExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTemplateElement(node, opts) { + if (!node) return false; + if (node.type !== "TemplateElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTemplateLiteral(node, opts) { + if (!node) return false; + if (node.type !== "TemplateLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isYieldExpression(node, opts) { + if (!node) return false; + if (node.type !== "YieldExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAwaitExpression(node, opts) { + if (!node) return false; + if (node.type !== "AwaitExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImport(node, opts) { + if (!node) return false; + if (node.type !== "Import") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBigIntLiteral(node, opts) { + if (!node) return false; + if (node.type !== "BigIntLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportNamespaceSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ExportNamespaceSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOptionalMemberExpression(node, opts) { + if (!node) return false; + if (node.type !== "OptionalMemberExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOptionalCallExpression(node, opts) { + if (!node) return false; + if (node.type !== "OptionalCallExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassProperty(node, opts) { + if (!node) return false; + if (node.type !== "ClassProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassAccessorProperty(node, opts) { + if (!node) return false; + if (node.type !== "ClassAccessorProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassPrivateProperty(node, opts) { + if (!node) return false; + if (node.type !== "ClassPrivateProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassPrivateMethod(node, opts) { + if (!node) return false; + if (node.type !== "ClassPrivateMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPrivateName(node, opts) { + if (!node) return false; + if (node.type !== "PrivateName") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStaticBlock(node, opts) { + if (!node) return false; + if (node.type !== "StaticBlock") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAnyTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "AnyTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArrayTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ArrayTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBooleanTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "BooleanTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBooleanLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "BooleanLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNullLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NullLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClassImplements(node, opts) { + if (!node) return false; + if (node.type !== "ClassImplements") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareClass(node, opts) { + if (!node) return false; + if (node.type !== "DeclareClass") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareFunction(node, opts) { + if (!node) return false; + if (node.type !== "DeclareFunction") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareInterface(node, opts) { + if (!node) return false; + if (node.type !== "DeclareInterface") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareModule(node, opts) { + if (!node) return false; + if (node.type !== "DeclareModule") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareModuleExports(node, opts) { + if (!node) return false; + if (node.type !== "DeclareModuleExports") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareTypeAlias(node, opts) { + if (!node) return false; + if (node.type !== "DeclareTypeAlias") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareOpaqueType(node, opts) { + if (!node) return false; + if (node.type !== "DeclareOpaqueType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareVariable(node, opts) { + if (!node) return false; + if (node.type !== "DeclareVariable") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareExportDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "DeclareExportDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclareExportAllDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "DeclareExportAllDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclaredPredicate(node, opts) { + if (!node) return false; + if (node.type !== "DeclaredPredicate") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExistsTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ExistsTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "FunctionTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionTypeParam(node, opts) { + if (!node) return false; + if (node.type !== "FunctionTypeParam") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isGenericTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "GenericTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInferredPredicate(node, opts) { + if (!node) return false; + if (node.type !== "InferredPredicate") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterfaceExtends(node, opts) { + if (!node) return false; + if (node.type !== "InterfaceExtends") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterfaceDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "InterfaceDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isInterfaceTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "InterfaceTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIntersectionTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "IntersectionTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMixedTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "MixedTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEmptyTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "EmptyTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNullableTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NullableTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumberLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NumberLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumberTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "NumberTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeInternalSlot(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeInternalSlot") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeCallProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeCallProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeIndexer(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeIndexer") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectTypeSpreadProperty(node, opts) { + if (!node) return false; + if (node.type !== "ObjectTypeSpreadProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOpaqueType(node, opts) { + if (!node) return false; + if (node.type !== "OpaqueType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isQualifiedTypeIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "QualifiedTypeIdentifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStringLiteralTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "StringLiteralTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStringTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "StringTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSymbolTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "SymbolTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isThisTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "ThisTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTupleTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TupleTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeofTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TypeofTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeAlias(node, opts) { + if (!node) return false; + if (node.type !== "TypeAlias") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeCastExpression(node, opts) { + if (!node) return false; + if (node.type !== "TypeCastExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeParameter(node, opts) { + if (!node) return false; + if (node.type !== "TypeParameter") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeParameterDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TypeParameterDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeParameterInstantiation(node, opts) { + if (!node) return false; + if (node.type !== "TypeParameterInstantiation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUnionTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "UnionTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVariance(node, opts) { + if (!node) return false; + if (node.type !== "Variance") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isVoidTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "VoidTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "EnumDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumBooleanBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumBooleanBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumNumberBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumNumberBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumStringBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumStringBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumSymbolBody(node, opts) { + if (!node) return false; + if (node.type !== "EnumSymbolBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumBooleanMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumBooleanMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumNumberMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumNumberMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumStringMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumStringMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumDefaultedMember(node, opts) { + if (!node) return false; + if (node.type !== "EnumDefaultedMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isIndexedAccessType(node, opts) { + if (!node) return false; + if (node.type !== "IndexedAccessType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isOptionalIndexedAccessType(node, opts) { + if (!node) return false; + if (node.type !== "OptionalIndexedAccessType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXAttribute(node, opts) { + if (!node) return false; + if (node.type !== "JSXAttribute") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXClosingElement(node, opts) { + if (!node) return false; + if (node.type !== "JSXClosingElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXElement(node, opts) { + if (!node) return false; + if (node.type !== "JSXElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXEmptyExpression(node, opts) { + if (!node) return false; + if (node.type !== "JSXEmptyExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXExpressionContainer(node, opts) { + if (!node) return false; + if (node.type !== "JSXExpressionContainer") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXSpreadChild(node, opts) { + if (!node) return false; + if (node.type !== "JSXSpreadChild") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "JSXIdentifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXMemberExpression(node, opts) { + if (!node) return false; + if (node.type !== "JSXMemberExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXNamespacedName(node, opts) { + if (!node) return false; + if (node.type !== "JSXNamespacedName") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXOpeningElement(node, opts) { + if (!node) return false; + if (node.type !== "JSXOpeningElement") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXSpreadAttribute(node, opts) { + if (!node) return false; + if (node.type !== "JSXSpreadAttribute") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXText(node, opts) { + if (!node) return false; + if (node.type !== "JSXText") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXFragment(node, opts) { + if (!node) return false; + if (node.type !== "JSXFragment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXOpeningFragment(node, opts) { + if (!node) return false; + if (node.type !== "JSXOpeningFragment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSXClosingFragment(node, opts) { + if (!node) return false; + if (node.type !== "JSXClosingFragment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNoop(node, opts) { + if (!node) return false; + if (node.type !== "Noop") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPlaceholder(node, opts) { + if (!node) return false; + if (node.type !== "Placeholder") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isV8IntrinsicIdentifier(node, opts) { + if (!node) return false; + if (node.type !== "V8IntrinsicIdentifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isArgumentPlaceholder(node, opts) { + if (!node) return false; + if (node.type !== "ArgumentPlaceholder") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBindExpression(node, opts) { + if (!node) return false; + if (node.type !== "BindExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportAttribute(node, opts) { + if (!node) return false; + if (node.type !== "ImportAttribute") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDecorator(node, opts) { + if (!node) return false; + if (node.type !== "Decorator") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDoExpression(node, opts) { + if (!node) return false; + if (node.type !== "DoExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportDefaultSpecifier(node, opts) { + if (!node) return false; + if (node.type !== "ExportDefaultSpecifier") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRecordExpression(node, opts) { + if (!node) return false; + if (node.type !== "RecordExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTupleExpression(node, opts) { + if (!node) return false; + if (node.type !== "TupleExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDecimalLiteral(node, opts) { + if (!node) return false; + if (node.type !== "DecimalLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isModuleExpression(node, opts) { + if (!node) return false; + if (node.type !== "ModuleExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTopicReference(node, opts) { + if (!node) return false; + if (node.type !== "TopicReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPipelineTopicExpression(node, opts) { + if (!node) return false; + if (node.type !== "PipelineTopicExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPipelineBareFunction(node, opts) { + if (!node) return false; + if (node.type !== "PipelineBareFunction") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPipelinePrimaryTopicReference(node, opts) { + if (!node) return false; + if (node.type !== "PipelinePrimaryTopicReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSParameterProperty(node, opts) { + if (!node) return false; + if (node.type !== "TSParameterProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSDeclareFunction(node, opts) { + if (!node) return false; + if (node.type !== "TSDeclareFunction") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSDeclareMethod(node, opts) { + if (!node) return false; + if (node.type !== "TSDeclareMethod") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSQualifiedName(node, opts) { + if (!node) return false; + if (node.type !== "TSQualifiedName") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSCallSignatureDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSCallSignatureDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSConstructSignatureDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSConstructSignatureDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSPropertySignature(node, opts) { + if (!node) return false; + if (node.type !== "TSPropertySignature") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSMethodSignature(node, opts) { + if (!node) return false; + if (node.type !== "TSMethodSignature") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIndexSignature(node, opts) { + if (!node) return false; + if (node.type !== "TSIndexSignature") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSAnyKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSAnyKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSBooleanKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSBooleanKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSBigIntKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSBigIntKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIntrinsicKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSIntrinsicKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNeverKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSNeverKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNullKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSNullKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNumberKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSNumberKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSObjectKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSObjectKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSStringKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSStringKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSSymbolKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSSymbolKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSUndefinedKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSUndefinedKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSUnknownKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSUnknownKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSVoidKeyword(node, opts) { + if (!node) return false; + if (node.type !== "TSVoidKeyword") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSThisType(node, opts) { + if (!node) return false; + if (node.type !== "TSThisType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSFunctionType(node, opts) { + if (!node) return false; + if (node.type !== "TSFunctionType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSConstructorType(node, opts) { + if (!node) return false; + if (node.type !== "TSConstructorType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeReference(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypePredicate(node, opts) { + if (!node) return false; + if (node.type !== "TSTypePredicate") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeQuery(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeQuery") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeLiteral(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSArrayType(node, opts) { + if (!node) return false; + if (node.type !== "TSArrayType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTupleType(node, opts) { + if (!node) return false; + if (node.type !== "TSTupleType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSOptionalType(node, opts) { + if (!node) return false; + if (node.type !== "TSOptionalType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSRestType(node, opts) { + if (!node) return false; + if (node.type !== "TSRestType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNamedTupleMember(node, opts) { + if (!node) return false; + if (node.type !== "TSNamedTupleMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSUnionType(node, opts) { + if (!node) return false; + if (node.type !== "TSUnionType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIntersectionType(node, opts) { + if (!node) return false; + if (node.type !== "TSIntersectionType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSConditionalType(node, opts) { + if (!node) return false; + if (node.type !== "TSConditionalType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInferType(node, opts) { + if (!node) return false; + if (node.type !== "TSInferType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSParenthesizedType(node, opts) { + if (!node) return false; + if (node.type !== "TSParenthesizedType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeOperator(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeOperator") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSIndexedAccessType(node, opts) { + if (!node) return false; + if (node.type !== "TSIndexedAccessType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSMappedType(node, opts) { + if (!node) return false; + if (node.type !== "TSMappedType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSLiteralType(node, opts) { + if (!node) return false; + if (node.type !== "TSLiteralType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSExpressionWithTypeArguments(node, opts) { + if (!node) return false; + if (node.type !== "TSExpressionWithTypeArguments") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInterfaceDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSInterfaceDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInterfaceBody(node, opts) { + if (!node) return false; + if (node.type !== "TSInterfaceBody") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeAliasDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeAliasDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSInstantiationExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSInstantiationExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSAsExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSAsExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSSatisfiesExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSSatisfiesExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeAssertion(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeAssertion") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSEnumDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSEnumDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSEnumMember(node, opts) { + if (!node) return false; + if (node.type !== "TSEnumMember") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSModuleDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSModuleDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSModuleBlock(node, opts) { + if (!node) return false; + if (node.type !== "TSModuleBlock") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSImportType(node, opts) { + if (!node) return false; + if (node.type !== "TSImportType") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSImportEqualsDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSImportEqualsDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSExternalModuleReference(node, opts) { + if (!node) return false; + if (node.type !== "TSExternalModuleReference") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNonNullExpression(node, opts) { + if (!node) return false; + if (node.type !== "TSNonNullExpression") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSExportAssignment(node, opts) { + if (!node) return false; + if (node.type !== "TSExportAssignment") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSNamespaceExportDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSNamespaceExportDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeAnnotation(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeAnnotation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeParameterInstantiation(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeParameterInstantiation") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeParameterDeclaration(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeParameterDeclaration") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeParameter(node, opts) { + if (!node) return false; + if (node.type !== "TSTypeParameter") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStandardized(node, opts) { + if (!node) return false; + switch (node.type) { + case "ArrayExpression": + case "AssignmentExpression": + case "BinaryExpression": + case "InterpreterDirective": + case "Directive": + case "DirectiveLiteral": + case "BlockStatement": + case "BreakStatement": + case "CallExpression": + case "CatchClause": + case "ConditionalExpression": + case "ContinueStatement": + case "DebuggerStatement": + case "DoWhileStatement": + case "EmptyStatement": + case "ExpressionStatement": + case "File": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "FunctionExpression": + case "Identifier": + case "IfStatement": + case "LabeledStatement": + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "LogicalExpression": + case "MemberExpression": + case "NewExpression": + case "Program": + case "ObjectExpression": + case "ObjectMethod": + case "ObjectProperty": + case "RestElement": + case "ReturnStatement": + case "SequenceExpression": + case "ParenthesizedExpression": + case "SwitchCase": + case "SwitchStatement": + case "ThisExpression": + case "ThrowStatement": + case "TryStatement": + case "UnaryExpression": + case "UpdateExpression": + case "VariableDeclaration": + case "VariableDeclarator": + case "WhileStatement": + case "WithStatement": + case "AssignmentPattern": + case "ArrayPattern": + case "ArrowFunctionExpression": + case "ClassBody": + case "ClassExpression": + case "ClassDeclaration": + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ExportSpecifier": + case "ForOfStatement": + case "ImportDeclaration": + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + case "ImportExpression": + case "MetaProperty": + case "ClassMethod": + case "ObjectPattern": + case "SpreadElement": + case "Super": + case "TaggedTemplateExpression": + case "TemplateElement": + case "TemplateLiteral": + case "YieldExpression": + case "AwaitExpression": + case "Import": + case "BigIntLiteral": + case "ExportNamespaceSpecifier": + case "OptionalMemberExpression": + case "OptionalCallExpression": + case "ClassProperty": + case "ClassAccessorProperty": + case "ClassPrivateProperty": + case "ClassPrivateMethod": + case "PrivateName": + case "StaticBlock": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Identifier": + case "StringLiteral": + case "BlockStatement": + case "ClassBody": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExpression(node, opts) { + if (!node) return false; + switch (node.type) { + case "ArrayExpression": + case "AssignmentExpression": + case "BinaryExpression": + case "CallExpression": + case "ConditionalExpression": + case "FunctionExpression": + case "Identifier": + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "LogicalExpression": + case "MemberExpression": + case "NewExpression": + case "ObjectExpression": + case "SequenceExpression": + case "ParenthesizedExpression": + case "ThisExpression": + case "UnaryExpression": + case "UpdateExpression": + case "ArrowFunctionExpression": + case "ClassExpression": + case "ImportExpression": + case "MetaProperty": + case "Super": + case "TaggedTemplateExpression": + case "TemplateLiteral": + case "YieldExpression": + case "AwaitExpression": + case "Import": + case "BigIntLiteral": + case "OptionalMemberExpression": + case "OptionalCallExpression": + case "TypeCastExpression": + case "JSXElement": + case "JSXFragment": + case "BindExpression": + case "DoExpression": + case "RecordExpression": + case "TupleExpression": + case "DecimalLiteral": + case "ModuleExpression": + case "TopicReference": + case "PipelineTopicExpression": + case "PipelineBareFunction": + case "PipelinePrimaryTopicReference": + case "TSInstantiationExpression": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSNonNullExpression": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Expression": + case "Identifier": + case "StringLiteral": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBinary(node, opts) { + if (!node) return false; + switch (node.type) { + case "BinaryExpression": + case "LogicalExpression": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isScopable(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "CatchClause": + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "FunctionExpression": + case "Program": + case "ObjectMethod": + case "SwitchStatement": + case "WhileStatement": + case "ArrowFunctionExpression": + case "ClassExpression": + case "ClassDeclaration": + case "ForOfStatement": + case "ClassMethod": + case "ClassPrivateMethod": + case "StaticBlock": + case "TSModuleBlock": + break; + case "Placeholder": + if (node.expectedNode === "BlockStatement") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBlockParent(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "CatchClause": + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "FunctionExpression": + case "Program": + case "ObjectMethod": + case "SwitchStatement": + case "WhileStatement": + case "ArrowFunctionExpression": + case "ForOfStatement": + case "ClassMethod": + case "ClassPrivateMethod": + case "StaticBlock": + case "TSModuleBlock": + break; + case "Placeholder": + if (node.expectedNode === "BlockStatement") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isBlock(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "Program": + case "TSModuleBlock": + break; + case "Placeholder": + if (node.expectedNode === "BlockStatement") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isStatement(node, opts) { + if (!node) return false; + switch (node.type) { + case "BlockStatement": + case "BreakStatement": + case "ContinueStatement": + case "DebuggerStatement": + case "DoWhileStatement": + case "EmptyStatement": + case "ExpressionStatement": + case "ForInStatement": + case "ForStatement": + case "FunctionDeclaration": + case "IfStatement": + case "LabeledStatement": + case "ReturnStatement": + case "SwitchStatement": + case "ThrowStatement": + case "TryStatement": + case "VariableDeclaration": + case "WhileStatement": + case "WithStatement": + case "ClassDeclaration": + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ForOfStatement": + case "ImportDeclaration": + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "InterfaceDeclaration": + case "OpaqueType": + case "TypeAlias": + case "EnumDeclaration": + case "TSDeclareFunction": + case "TSInterfaceDeclaration": + case "TSTypeAliasDeclaration": + case "TSEnumDeclaration": + case "TSModuleDeclaration": + case "TSImportEqualsDeclaration": + case "TSExportAssignment": + case "TSNamespaceExportDeclaration": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Statement": + case "Declaration": + case "BlockStatement": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTerminatorless(node, opts) { + if (!node) return false; + switch (node.type) { + case "BreakStatement": + case "ContinueStatement": + case "ReturnStatement": + case "ThrowStatement": + case "YieldExpression": + case "AwaitExpression": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isCompletionStatement(node, opts) { + if (!node) return false; + switch (node.type) { + case "BreakStatement": + case "ContinueStatement": + case "ReturnStatement": + case "ThrowStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isConditional(node, opts) { + if (!node) return false; + switch (node.type) { + case "ConditionalExpression": + case "IfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLoop(node, opts) { + if (!node) return false; + switch (node.type) { + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "WhileStatement": + case "ForOfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isWhile(node, opts) { + if (!node) return false; + switch (node.type) { + case "DoWhileStatement": + case "WhileStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExpressionWrapper(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExpressionStatement": + case "ParenthesizedExpression": + case "TypeCastExpression": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFor(node, opts) { + if (!node) return false; + switch (node.type) { + case "ForInStatement": + case "ForStatement": + case "ForOfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isForXStatement(node, opts) { + if (!node) return false; + switch (node.type) { + case "ForInStatement": + case "ForOfStatement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunction(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "FunctionExpression": + case "ObjectMethod": + case "ArrowFunctionExpression": + case "ClassMethod": + case "ClassPrivateMethod": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFunctionParent(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "FunctionExpression": + case "ObjectMethod": + case "ArrowFunctionExpression": + case "ClassMethod": + case "ClassPrivateMethod": + case "StaticBlock": + case "TSModuleBlock": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPureish(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "FunctionExpression": + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "ArrowFunctionExpression": + case "BigIntLiteral": + case "DecimalLiteral": + break; + case "Placeholder": + if (node.expectedNode === "StringLiteral") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "FunctionDeclaration": + case "VariableDeclaration": + case "ClassDeclaration": + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ImportDeclaration": + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "InterfaceDeclaration": + case "OpaqueType": + case "TypeAlias": + case "EnumDeclaration": + case "TSDeclareFunction": + case "TSInterfaceDeclaration": + case "TSTypeAliasDeclaration": + case "TSEnumDeclaration": + case "TSModuleDeclaration": + break; + case "Placeholder": + if (node.expectedNode === "Declaration") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPatternLike(node, opts) { + if (!node) return false; + switch (node.type) { + case "Identifier": + case "RestElement": + case "AssignmentPattern": + case "ArrayPattern": + case "ObjectPattern": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSNonNullExpression": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Pattern": + case "Identifier": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLVal(node, opts) { + if (!node) return false; + switch (node.type) { + case "Identifier": + case "MemberExpression": + case "RestElement": + case "AssignmentPattern": + case "ArrayPattern": + case "ObjectPattern": + case "TSParameterProperty": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSNonNullExpression": + break; + case "Placeholder": + switch (node.expectedNode) { + case "Pattern": + case "Identifier": + break; + default: + return false; + } + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSEntityName(node, opts) { + if (!node) return false; + switch (node.type) { + case "Identifier": + case "TSQualifiedName": + break; + case "Placeholder": + if (node.expectedNode === "Identifier") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isLiteral(node, opts) { + if (!node) return false; + switch (node.type) { + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "RegExpLiteral": + case "TemplateLiteral": + case "BigIntLiteral": + case "DecimalLiteral": + break; + case "Placeholder": + if (node.expectedNode === "StringLiteral") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImmutable(node, opts) { + if (!node) return false; + switch (node.type) { + case "StringLiteral": + case "NumericLiteral": + case "NullLiteral": + case "BooleanLiteral": + case "BigIntLiteral": + case "JSXAttribute": + case "JSXClosingElement": + case "JSXElement": + case "JSXExpressionContainer": + case "JSXSpreadChild": + case "JSXOpeningElement": + case "JSXText": + case "JSXFragment": + case "JSXOpeningFragment": + case "JSXClosingFragment": + case "DecimalLiteral": + break; + case "Placeholder": + if (node.expectedNode === "StringLiteral") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUserWhitespacable(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectMethod": + case "ObjectProperty": + case "ObjectTypeInternalSlot": + case "ObjectTypeCallProperty": + case "ObjectTypeIndexer": + case "ObjectTypeProperty": + case "ObjectTypeSpreadProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMethod(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectMethod": + case "ClassMethod": + case "ClassPrivateMethod": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isObjectMember(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectMethod": + case "ObjectProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isProperty(node, opts) { + if (!node) return false; + switch (node.type) { + case "ObjectProperty": + case "ClassProperty": + case "ClassAccessorProperty": + case "ClassPrivateProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isUnaryLike(node, opts) { + if (!node) return false; + switch (node.type) { + case "UnaryExpression": + case "SpreadElement": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPattern(node, opts) { + if (!node) return false; + switch (node.type) { + case "AssignmentPattern": + case "ArrayPattern": + case "ObjectPattern": + break; + case "Placeholder": + if (node.expectedNode === "Pattern") break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isClass(node, opts) { + if (!node) return false; + switch (node.type) { + case "ClassExpression": + case "ClassDeclaration": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isImportOrExportDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + case "ImportDeclaration": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isExportDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExportAllDeclaration": + case "ExportDefaultDeclaration": + case "ExportNamedDeclaration": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isModuleSpecifier(node, opts) { + if (!node) return false; + switch (node.type) { + case "ExportSpecifier": + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + case "ExportNamespaceSpecifier": + case "ExportDefaultSpecifier": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isAccessor(node, opts) { + if (!node) return false; + switch (node.type) { + case "ClassAccessorProperty": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isPrivate(node, opts) { + if (!node) return false; + switch (node.type) { + case "ClassPrivateProperty": + case "ClassPrivateMethod": + case "PrivateName": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlow(node, opts) { + if (!node) return false; + switch (node.type) { + case "AnyTypeAnnotation": + case "ArrayTypeAnnotation": + case "BooleanTypeAnnotation": + case "BooleanLiteralTypeAnnotation": + case "NullLiteralTypeAnnotation": + case "ClassImplements": + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "DeclaredPredicate": + case "ExistsTypeAnnotation": + case "FunctionTypeAnnotation": + case "FunctionTypeParam": + case "GenericTypeAnnotation": + case "InferredPredicate": + case "InterfaceExtends": + case "InterfaceDeclaration": + case "InterfaceTypeAnnotation": + case "IntersectionTypeAnnotation": + case "MixedTypeAnnotation": + case "EmptyTypeAnnotation": + case "NullableTypeAnnotation": + case "NumberLiteralTypeAnnotation": + case "NumberTypeAnnotation": + case "ObjectTypeAnnotation": + case "ObjectTypeInternalSlot": + case "ObjectTypeCallProperty": + case "ObjectTypeIndexer": + case "ObjectTypeProperty": + case "ObjectTypeSpreadProperty": + case "OpaqueType": + case "QualifiedTypeIdentifier": + case "StringLiteralTypeAnnotation": + case "StringTypeAnnotation": + case "SymbolTypeAnnotation": + case "ThisTypeAnnotation": + case "TupleTypeAnnotation": + case "TypeofTypeAnnotation": + case "TypeAlias": + case "TypeAnnotation": + case "TypeCastExpression": + case "TypeParameter": + case "TypeParameterDeclaration": + case "TypeParameterInstantiation": + case "UnionTypeAnnotation": + case "Variance": + case "VoidTypeAnnotation": + case "EnumDeclaration": + case "EnumBooleanBody": + case "EnumNumberBody": + case "EnumStringBody": + case "EnumSymbolBody": + case "EnumBooleanMember": + case "EnumNumberMember": + case "EnumStringMember": + case "EnumDefaultedMember": + case "IndexedAccessType": + case "OptionalIndexedAccessType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowType(node, opts) { + if (!node) return false; + switch (node.type) { + case "AnyTypeAnnotation": + case "ArrayTypeAnnotation": + case "BooleanTypeAnnotation": + case "BooleanLiteralTypeAnnotation": + case "NullLiteralTypeAnnotation": + case "ExistsTypeAnnotation": + case "FunctionTypeAnnotation": + case "GenericTypeAnnotation": + case "InterfaceTypeAnnotation": + case "IntersectionTypeAnnotation": + case "MixedTypeAnnotation": + case "EmptyTypeAnnotation": + case "NullableTypeAnnotation": + case "NumberLiteralTypeAnnotation": + case "NumberTypeAnnotation": + case "ObjectTypeAnnotation": + case "StringLiteralTypeAnnotation": + case "StringTypeAnnotation": + case "SymbolTypeAnnotation": + case "ThisTypeAnnotation": + case "TupleTypeAnnotation": + case "TypeofTypeAnnotation": + case "UnionTypeAnnotation": + case "VoidTypeAnnotation": + case "IndexedAccessType": + case "OptionalIndexedAccessType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowBaseAnnotation(node, opts) { + if (!node) return false; + switch (node.type) { + case "AnyTypeAnnotation": + case "BooleanTypeAnnotation": + case "NullLiteralTypeAnnotation": + case "MixedTypeAnnotation": + case "EmptyTypeAnnotation": + case "NumberTypeAnnotation": + case "StringTypeAnnotation": + case "SymbolTypeAnnotation": + case "ThisTypeAnnotation": + case "VoidTypeAnnotation": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowDeclaration(node, opts) { + if (!node) return false; + switch (node.type) { + case "DeclareClass": + case "DeclareFunction": + case "DeclareInterface": + case "DeclareModule": + case "DeclareModuleExports": + case "DeclareTypeAlias": + case "DeclareOpaqueType": + case "DeclareVariable": + case "DeclareExportDeclaration": + case "DeclareExportAllDeclaration": + case "InterfaceDeclaration": + case "OpaqueType": + case "TypeAlias": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isFlowPredicate(node, opts) { + if (!node) return false; + switch (node.type) { + case "DeclaredPredicate": + case "InferredPredicate": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumBody(node, opts) { + if (!node) return false; + switch (node.type) { + case "EnumBooleanBody": + case "EnumNumberBody": + case "EnumStringBody": + case "EnumSymbolBody": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isEnumMember(node, opts) { + if (!node) return false; + switch (node.type) { + case "EnumBooleanMember": + case "EnumNumberMember": + case "EnumStringMember": + case "EnumDefaultedMember": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isJSX(node, opts) { + if (!node) return false; + switch (node.type) { + case "JSXAttribute": + case "JSXClosingElement": + case "JSXElement": + case "JSXEmptyExpression": + case "JSXExpressionContainer": + case "JSXSpreadChild": + case "JSXIdentifier": + case "JSXMemberExpression": + case "JSXNamespacedName": + case "JSXOpeningElement": + case "JSXSpreadAttribute": + case "JSXText": + case "JSXFragment": + case "JSXOpeningFragment": + case "JSXClosingFragment": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isMiscellaneous(node, opts) { + if (!node) return false; + switch (node.type) { + case "Noop": + case "Placeholder": + case "V8IntrinsicIdentifier": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTypeScript(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSParameterProperty": + case "TSDeclareFunction": + case "TSDeclareMethod": + case "TSQualifiedName": + case "TSCallSignatureDeclaration": + case "TSConstructSignatureDeclaration": + case "TSPropertySignature": + case "TSMethodSignature": + case "TSIndexSignature": + case "TSAnyKeyword": + case "TSBooleanKeyword": + case "TSBigIntKeyword": + case "TSIntrinsicKeyword": + case "TSNeverKeyword": + case "TSNullKeyword": + case "TSNumberKeyword": + case "TSObjectKeyword": + case "TSStringKeyword": + case "TSSymbolKeyword": + case "TSUndefinedKeyword": + case "TSUnknownKeyword": + case "TSVoidKeyword": + case "TSThisType": + case "TSFunctionType": + case "TSConstructorType": + case "TSTypeReference": + case "TSTypePredicate": + case "TSTypeQuery": + case "TSTypeLiteral": + case "TSArrayType": + case "TSTupleType": + case "TSOptionalType": + case "TSRestType": + case "TSNamedTupleMember": + case "TSUnionType": + case "TSIntersectionType": + case "TSConditionalType": + case "TSInferType": + case "TSParenthesizedType": + case "TSTypeOperator": + case "TSIndexedAccessType": + case "TSMappedType": + case "TSLiteralType": + case "TSExpressionWithTypeArguments": + case "TSInterfaceDeclaration": + case "TSInterfaceBody": + case "TSTypeAliasDeclaration": + case "TSInstantiationExpression": + case "TSAsExpression": + case "TSSatisfiesExpression": + case "TSTypeAssertion": + case "TSEnumDeclaration": + case "TSEnumMember": + case "TSModuleDeclaration": + case "TSModuleBlock": + case "TSImportType": + case "TSImportEqualsDeclaration": + case "TSExternalModuleReference": + case "TSNonNullExpression": + case "TSExportAssignment": + case "TSNamespaceExportDeclaration": + case "TSTypeAnnotation": + case "TSTypeParameterInstantiation": + case "TSTypeParameterDeclaration": + case "TSTypeParameter": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSTypeElement(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSCallSignatureDeclaration": + case "TSConstructSignatureDeclaration": + case "TSPropertySignature": + case "TSMethodSignature": + case "TSIndexSignature": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSType(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSAnyKeyword": + case "TSBooleanKeyword": + case "TSBigIntKeyword": + case "TSIntrinsicKeyword": + case "TSNeverKeyword": + case "TSNullKeyword": + case "TSNumberKeyword": + case "TSObjectKeyword": + case "TSStringKeyword": + case "TSSymbolKeyword": + case "TSUndefinedKeyword": + case "TSUnknownKeyword": + case "TSVoidKeyword": + case "TSThisType": + case "TSFunctionType": + case "TSConstructorType": + case "TSTypeReference": + case "TSTypePredicate": + case "TSTypeQuery": + case "TSTypeLiteral": + case "TSArrayType": + case "TSTupleType": + case "TSOptionalType": + case "TSRestType": + case "TSUnionType": + case "TSIntersectionType": + case "TSConditionalType": + case "TSInferType": + case "TSParenthesizedType": + case "TSTypeOperator": + case "TSIndexedAccessType": + case "TSMappedType": + case "TSLiteralType": + case "TSExpressionWithTypeArguments": + case "TSImportType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isTSBaseType(node, opts) { + if (!node) return false; + switch (node.type) { + case "TSAnyKeyword": + case "TSBooleanKeyword": + case "TSBigIntKeyword": + case "TSIntrinsicKeyword": + case "TSNeverKeyword": + case "TSNullKeyword": + case "TSNumberKeyword": + case "TSObjectKeyword": + case "TSStringKeyword": + case "TSSymbolKeyword": + case "TSUndefinedKeyword": + case "TSUnknownKeyword": + case "TSVoidKeyword": + case "TSThisType": + case "TSLiteralType": + break; + default: + return false; + } + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isNumberLiteral(node, opts) { + (0, _deprecationWarning.default)("isNumberLiteral", "isNumericLiteral"); + if (!node) return false; + if (node.type !== "NumberLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRegexLiteral(node, opts) { + (0, _deprecationWarning.default)("isRegexLiteral", "isRegExpLiteral"); + if (!node) return false; + if (node.type !== "RegexLiteral") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isRestProperty(node, opts) { + (0, _deprecationWarning.default)("isRestProperty", "isRestElement"); + if (!node) return false; + if (node.type !== "RestProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isSpreadProperty(node, opts) { + (0, _deprecationWarning.default)("isSpreadProperty", "isSpreadElement"); + if (!node) return false; + if (node.type !== "SpreadProperty") return false; + return opts == null || (0, _shallowEqual.default)(node, opts); + } + function isModuleDeclaration(node, opts) { + (0, _deprecationWarning.default)("isModuleDeclaration", "isImportOrExportDeclaration"); + return isImportOrExportDeclaration(node, opts); + } + + + return generated$3; +} + +var hasRequiredMatchesPattern; + +function requireMatchesPattern () { + if (hasRequiredMatchesPattern) return matchesPattern; + hasRequiredMatchesPattern = 1; + + Object.defineProperty(matchesPattern, "__esModule", { + value: true + }); + matchesPattern.default = matchesPattern$1; + var _index = requireGenerated$3(); + function matchesPattern$1(member, match, allowPartial) { + if (!(0, _index.isMemberExpression)(member)) return false; + const parts = Array.isArray(match) ? match : match.split("."); + const nodes = []; + let node; + for (node = member; (0, _index.isMemberExpression)(node); node = node.object) { + nodes.push(node.property); + } + nodes.push(node); + if (nodes.length < parts.length) return false; + if (!allowPartial && nodes.length > parts.length) return false; + for (let i = 0, j = nodes.length - 1; i < parts.length; i++, j--) { + const node = nodes[j]; + let value; + if ((0, _index.isIdentifier)(node)) { + value = node.name; + } else if ((0, _index.isStringLiteral)(node)) { + value = node.value; + } else if ((0, _index.isThisExpression)(node)) { + value = "this"; + } else { + return false; + } + if (parts[i] !== value) return false; + } + return true; + } + + + return matchesPattern; +} + +var hasRequiredBuildMatchMemberExpression; + +function requireBuildMatchMemberExpression () { + if (hasRequiredBuildMatchMemberExpression) return buildMatchMemberExpression; + hasRequiredBuildMatchMemberExpression = 1; + + Object.defineProperty(buildMatchMemberExpression, "__esModule", { + value: true + }); + buildMatchMemberExpression.default = buildMatchMemberExpression$1; + var _matchesPattern = requireMatchesPattern(); + function buildMatchMemberExpression$1(match, allowPartial) { + const parts = match.split("."); + return member => (0, _matchesPattern.default)(member, parts, allowPartial); + } + + + return buildMatchMemberExpression; +} + +var hasRequiredIsReactComponent; + +function requireIsReactComponent () { + if (hasRequiredIsReactComponent) return isReactComponent; + hasRequiredIsReactComponent = 1; + + Object.defineProperty(isReactComponent, "__esModule", { + value: true + }); + isReactComponent.default = void 0; + var _buildMatchMemberExpression = requireBuildMatchMemberExpression(); + const isReactComponent$1 = (0, _buildMatchMemberExpression.default)("React.Component"); + isReactComponent.default = isReactComponent$1; + + + return isReactComponent; +} + +var isCompatTag = {}; + +var hasRequiredIsCompatTag; + +function requireIsCompatTag () { + if (hasRequiredIsCompatTag) return isCompatTag; + hasRequiredIsCompatTag = 1; + + Object.defineProperty(isCompatTag, "__esModule", { + value: true + }); + isCompatTag.default = isCompatTag$1; + function isCompatTag$1(tagName) { + return !!tagName && /^[a-z]/.test(tagName); + } + + + return isCompatTag; +} + +var buildChildren = {}; + +var cleanJSXElementLiteralChild = {}; + +var generated$2 = {}; + +var validate$1 = {}; + +var definitions = {}; + +var core = {}; + +var is = {}; + +var isType = {}; + +var hasRequiredIsType; + +function requireIsType () { + if (hasRequiredIsType) return isType; + hasRequiredIsType = 1; + + Object.defineProperty(isType, "__esModule", { + value: true + }); + isType.default = isType$1; + var _index = requireDefinitions(); + function isType$1(nodeType, targetType) { + if (nodeType === targetType) return true; + if (nodeType == null) return false; + if (_index.ALIAS_KEYS[targetType]) return false; + const aliases = _index.FLIPPED_ALIAS_KEYS[targetType]; + if (aliases) { + if (aliases[0] === nodeType) return true; + for (const alias of aliases) { + if (nodeType === alias) return true; + } + } + return false; + } + + + return isType; +} + +var isPlaceholderType = {}; + +var hasRequiredIsPlaceholderType; + +function requireIsPlaceholderType () { + if (hasRequiredIsPlaceholderType) return isPlaceholderType; + hasRequiredIsPlaceholderType = 1; + + Object.defineProperty(isPlaceholderType, "__esModule", { + value: true + }); + isPlaceholderType.default = isPlaceholderType$1; + var _index = requireDefinitions(); + function isPlaceholderType$1(placeholderType, targetType) { + if (placeholderType === targetType) return true; + const aliases = _index.PLACEHOLDERS_ALIAS[placeholderType]; + if (aliases) { + for (const alias of aliases) { + if (targetType === alias) return true; + } + } + return false; + } + + + return isPlaceholderType; +} + +var hasRequiredIs; + +function requireIs () { + if (hasRequiredIs) return is; + hasRequiredIs = 1; + + Object.defineProperty(is, "__esModule", { + value: true + }); + is.default = is$1; + var _shallowEqual = requireShallowEqual(); + var _isType = requireIsType(); + var _isPlaceholderType = requireIsPlaceholderType(); + var _index = requireDefinitions(); + function is$1(type, node, opts) { + if (!node) return false; + const matches = (0, _isType.default)(node.type, type); + if (!matches) { + if (!opts && node.type === "Placeholder" && type in _index.FLIPPED_ALIAS_KEYS) { + return (0, _isPlaceholderType.default)(node.expectedNode, type); + } + return false; + } + if (opts === undefined) { + return true; + } else { + return (0, _shallowEqual.default)(node, opts); + } + } + + + return is; +} + +var isValidIdentifier = {}; + +var lib$2 = {}; + +var identifier = {}; + +var hasRequiredIdentifier; + +function requireIdentifier () { + if (hasRequiredIdentifier) return identifier; + hasRequiredIdentifier = 1; + + Object.defineProperty(identifier, "__esModule", { + value: true + }); + identifier.isIdentifierChar = isIdentifierChar; + identifier.isIdentifierName = isIdentifierName; + identifier.isIdentifierStart = isIdentifierStart; + let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; + const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; + const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + function isInAstralSet(code, set) { + let pos = 0x10000; + for (let i = 0, length = set.length; i < length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } + return false; + } + function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes); + } + function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); + } + function isIdentifierName(name) { + let isFirst = true; + for (let i = 0; i < name.length; i++) { + let cp = name.charCodeAt(i); + if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) { + const trail = name.charCodeAt(++i); + if ((trail & 0xfc00) === 0xdc00) { + cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff); + } + } + if (isFirst) { + isFirst = false; + if (!isIdentifierStart(cp)) { + return false; + } + } else if (!isIdentifierChar(cp)) { + return false; + } + } + return !isFirst; + } + + + return identifier; +} + +var keyword = {}; + +var hasRequiredKeyword; + +function requireKeyword () { + if (hasRequiredKeyword) return keyword; + hasRequiredKeyword = 1; + + Object.defineProperty(keyword, "__esModule", { + value: true + }); + keyword.isKeyword = isKeyword; + keyword.isReservedWord = isReservedWord; + keyword.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; + keyword.isStrictBindReservedWord = isStrictBindReservedWord; + keyword.isStrictReservedWord = isStrictReservedWord; + const reservedWords = { + keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], + strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], + strictBind: ["eval", "arguments"] + }; + const keywords = new Set(reservedWords.keyword); + const reservedWordsStrictSet = new Set(reservedWords.strict); + const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); + function isReservedWord(word, inModule) { + return inModule && word === "await" || word === "enum"; + } + function isStrictReservedWord(word, inModule) { + return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); + } + function isStrictBindOnlyReservedWord(word) { + return reservedWordsStrictBindSet.has(word); + } + function isStrictBindReservedWord(word, inModule) { + return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); + } + function isKeyword(word) { + return keywords.has(word); + } + + + return keyword; +} + +var hasRequiredLib$3; + +function requireLib$3 () { + if (hasRequiredLib$3) return lib$2; + hasRequiredLib$3 = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "isIdentifierChar", { + enumerable: true, + get: function () { + return _identifier.isIdentifierChar; + } + }); + Object.defineProperty(exports, "isIdentifierName", { + enumerable: true, + get: function () { + return _identifier.isIdentifierName; + } + }); + Object.defineProperty(exports, "isIdentifierStart", { + enumerable: true, + get: function () { + return _identifier.isIdentifierStart; + } + }); + Object.defineProperty(exports, "isKeyword", { + enumerable: true, + get: function () { + return _keyword.isKeyword; + } + }); + Object.defineProperty(exports, "isReservedWord", { + enumerable: true, + get: function () { + return _keyword.isReservedWord; + } + }); + Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindOnlyReservedWord; + } + }); + Object.defineProperty(exports, "isStrictBindReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindReservedWord; + } + }); + Object.defineProperty(exports, "isStrictReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictReservedWord; + } + }); + var _identifier = requireIdentifier(); + var _keyword = requireKeyword(); + + +} (lib$2)); + return lib$2; +} + +var hasRequiredIsValidIdentifier; + +function requireIsValidIdentifier () { + if (hasRequiredIsValidIdentifier) return isValidIdentifier; + hasRequiredIsValidIdentifier = 1; + + Object.defineProperty(isValidIdentifier, "__esModule", { + value: true + }); + isValidIdentifier.default = isValidIdentifier$1; + var _helperValidatorIdentifier = requireLib$3(); + function isValidIdentifier$1(name, reserved = true) { + if (typeof name !== "string") return false; + if (reserved) { + if ((0, _helperValidatorIdentifier.isKeyword)(name) || (0, _helperValidatorIdentifier.isStrictReservedWord)(name, true)) { + return false; + } + } + return (0, _helperValidatorIdentifier.isIdentifierName)(name); + } + + + return isValidIdentifier; +} + +var lib$1 = {}; + +var hasRequiredLib$2; + +function requireLib$2 () { + if (hasRequiredLib$2) return lib$1; + hasRequiredLib$2 = 1; + + Object.defineProperty(lib$1, "__esModule", { + value: true + }); + lib$1.readCodePoint = readCodePoint; + lib$1.readInt = readInt; + lib$1.readStringContents = readStringContents; + var _isDigit = function isDigit(code) { + return code >= 48 && code <= 57; + }; + const forbiddenNumericSeparatorSiblings = { + decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]), + hex: new Set([46, 88, 95, 120]) + }; + const isAllowedNumericSeparatorSibling = { + bin: ch => ch === 48 || ch === 49, + oct: ch => ch >= 48 && ch <= 55, + dec: ch => ch >= 48 && ch <= 57, + hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102 + }; + function readStringContents(type, input, pos, lineStart, curLine, errors) { + const initialPos = pos; + const initialLineStart = lineStart; + const initialCurLine = curLine; + let out = ""; + let firstInvalidLoc = null; + let chunkStart = pos; + const { + length + } = input; + for (;;) { + if (pos >= length) { + errors.unterminated(initialPos, initialLineStart, initialCurLine); + out += input.slice(chunkStart, pos); + break; + } + const ch = input.charCodeAt(pos); + if (isStringEnd(type, ch, input, pos)) { + out += input.slice(chunkStart, pos); + break; + } + if (ch === 92) { + out += input.slice(chunkStart, pos); + const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors); + if (res.ch === null && !firstInvalidLoc) { + firstInvalidLoc = { + pos, + lineStart, + curLine + }; + } else { + out += res.ch; + } + ({ + pos, + lineStart, + curLine + } = res); + chunkStart = pos; + } else if (ch === 8232 || ch === 8233) { + ++pos; + ++curLine; + lineStart = pos; + } else if (ch === 10 || ch === 13) { + if (type === "template") { + out += input.slice(chunkStart, pos) + "\n"; + ++pos; + if (ch === 13 && input.charCodeAt(pos) === 10) { + ++pos; + } + ++curLine; + chunkStart = lineStart = pos; + } else { + errors.unterminated(initialPos, initialLineStart, initialCurLine); + } + } else { + ++pos; + } + } + return { + pos, + str: out, + firstInvalidLoc, + lineStart, + curLine, + containsInvalid: !!firstInvalidLoc + }; + } + function isStringEnd(type, ch, input, pos) { + if (type === "template") { + return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123; + } + return ch === (type === "double" ? 34 : 39); + } + function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) { + const throwOnInvalid = !inTemplate; + pos++; + const res = ch => ({ + pos, + ch, + lineStart, + curLine + }); + const ch = input.charCodeAt(pos++); + switch (ch) { + case 110: + return res("\n"); + case 114: + return res("\r"); + case 120: + { + let code; + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors)); + return res(code === null ? null : String.fromCharCode(code)); + } + case 117: + { + let code; + ({ + code, + pos + } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors)); + return res(code === null ? null : String.fromCodePoint(code)); + } + case 116: + return res("\t"); + case 98: + return res("\b"); + case 118: + return res("\u000b"); + case 102: + return res("\f"); + case 13: + if (input.charCodeAt(pos) === 10) { + ++pos; + } + case 10: + lineStart = pos; + ++curLine; + case 8232: + case 8233: + return res(""); + case 56: + case 57: + if (inTemplate) { + return res(null); + } else { + errors.strictNumericEscape(pos - 1, lineStart, curLine); + } + default: + if (ch >= 48 && ch <= 55) { + const startPos = pos - 1; + const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2)); + let octalStr = match[0]; + let octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + pos += octalStr.length - 1; + const next = input.charCodeAt(pos); + if (octalStr !== "0" || next === 56 || next === 57) { + if (inTemplate) { + return res(null); + } else { + errors.strictNumericEscape(startPos, lineStart, curLine); + } + } + return res(String.fromCharCode(octal)); + } + return res(String.fromCharCode(ch)); + } + } + function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) { + const initialPos = pos; + let n; + ({ + n, + pos + } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid)); + if (n === null) { + if (throwOnInvalid) { + errors.invalidEscapeSequence(initialPos, lineStart, curLine); + } else { + pos = initialPos - 1; + } + } + return { + code: n, + pos + }; + } + function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) { + const start = pos; + const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct; + const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin; + let invalid = false; + let total = 0; + for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) { + const code = input.charCodeAt(pos); + let val; + if (code === 95 && allowNumSeparator !== "bail") { + const prev = input.charCodeAt(pos - 1); + const next = input.charCodeAt(pos + 1); + if (!allowNumSeparator) { + if (bailOnError) return { + n: null, + pos + }; + errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine); + } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) { + if (bailOnError) return { + n: null, + pos + }; + errors.unexpectedNumericSeparator(pos, lineStart, curLine); + } + ++pos; + continue; + } + if (code >= 97) { + val = code - 97 + 10; + } else if (code >= 65) { + val = code - 65 + 10; + } else if (_isDigit(code)) { + val = code - 48; + } else { + val = Infinity; + } + if (val >= radix) { + if (val <= 9 && bailOnError) { + return { + n: null, + pos + }; + } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) { + val = 0; + } else if (forceLen) { + val = 0; + invalid = true; + } else { + break; + } + } + ++pos; + total = total * radix + val; + } + if (pos === start || len != null && pos - start !== len || invalid) { + return { + n: null, + pos + }; + } + return { + n: total, + pos + }; + } + function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) { + const ch = input.charCodeAt(pos); + let code; + if (ch === 123) { + ++pos; + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors)); + ++pos; + if (code !== null && code > 0x10ffff) { + if (throwOnInvalid) { + errors.invalidCodePoint(pos, lineStart, curLine); + } else { + return { + code: null, + pos + }; + } + } + } else { + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors)); + } + return { + code, + pos + }; + } + + + return lib$1; +} + +var constants = {}; + +var hasRequiredConstants; + +function requireConstants () { + if (hasRequiredConstants) return constants; + hasRequiredConstants = 1; + + Object.defineProperty(constants, "__esModule", { + value: true + }); + constants.UPDATE_OPERATORS = constants.UNARY_OPERATORS = constants.STRING_UNARY_OPERATORS = constants.STATEMENT_OR_BLOCK_KEYS = constants.NUMBER_UNARY_OPERATORS = constants.NUMBER_BINARY_OPERATORS = constants.NOT_LOCAL_BINDING = constants.LOGICAL_OPERATORS = constants.INHERIT_KEYS = constants.FOR_INIT_KEYS = constants.FLATTENABLE_KEYS = constants.EQUALITY_BINARY_OPERATORS = constants.COMPARISON_BINARY_OPERATORS = constants.COMMENT_KEYS = constants.BOOLEAN_UNARY_OPERATORS = constants.BOOLEAN_NUMBER_BINARY_OPERATORS = constants.BOOLEAN_BINARY_OPERATORS = constants.BLOCK_SCOPED_SYMBOL = constants.BINARY_OPERATORS = constants.ASSIGNMENT_OPERATORS = void 0; + constants.STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"]; + constants.FLATTENABLE_KEYS = ["body", "expressions"]; + constants.FOR_INIT_KEYS = ["left", "init"]; + constants.COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"]; + const LOGICAL_OPERATORS = constants.LOGICAL_OPERATORS = ["||", "&&", "??"]; + constants.UPDATE_OPERATORS = ["++", "--"]; + const BOOLEAN_NUMBER_BINARY_OPERATORS = constants.BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="]; + const EQUALITY_BINARY_OPERATORS = constants.EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="]; + const COMPARISON_BINARY_OPERATORS = constants.COMPARISON_BINARY_OPERATORS = [...EQUALITY_BINARY_OPERATORS, "in", "instanceof"]; + const BOOLEAN_BINARY_OPERATORS = constants.BOOLEAN_BINARY_OPERATORS = [...COMPARISON_BINARY_OPERATORS, ...BOOLEAN_NUMBER_BINARY_OPERATORS]; + const NUMBER_BINARY_OPERATORS = constants.NUMBER_BINARY_OPERATORS = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"]; + constants.BINARY_OPERATORS = ["+", ...NUMBER_BINARY_OPERATORS, ...BOOLEAN_BINARY_OPERATORS, "|>"]; + constants.ASSIGNMENT_OPERATORS = ["=", "+=", ...NUMBER_BINARY_OPERATORS.map(op => op + "="), ...LOGICAL_OPERATORS.map(op => op + "=")]; + const BOOLEAN_UNARY_OPERATORS = constants.BOOLEAN_UNARY_OPERATORS = ["delete", "!"]; + const NUMBER_UNARY_OPERATORS = constants.NUMBER_UNARY_OPERATORS = ["+", "-", "~"]; + const STRING_UNARY_OPERATORS = constants.STRING_UNARY_OPERATORS = ["typeof"]; + constants.UNARY_OPERATORS = ["void", "throw", ...BOOLEAN_UNARY_OPERATORS, ...NUMBER_UNARY_OPERATORS, ...STRING_UNARY_OPERATORS]; + constants.INHERIT_KEYS = { + optional: ["typeAnnotation", "typeParameters", "returnType"], + force: ["start", "loc", "end"] + }; + constants.BLOCK_SCOPED_SYMBOL = Symbol.for("var used to be block scoped"); + constants.NOT_LOCAL_BINDING = Symbol.for("should not be considered a local binding"); + + + return constants; +} + +var utils = {}; + +var hasRequiredUtils; + +function requireUtils () { + if (hasRequiredUtils) return utils; + hasRequiredUtils = 1; + + Object.defineProperty(utils, "__esModule", { + value: true + }); + utils.VISITOR_KEYS = utils.NODE_PARENT_VALIDATIONS = utils.NODE_FIELDS = utils.FLIPPED_ALIAS_KEYS = utils.DEPRECATED_KEYS = utils.BUILDER_KEYS = utils.ALIAS_KEYS = void 0; + utils.arrayOf = arrayOf; + utils.arrayOfType = arrayOfType; + utils.assertEach = assertEach; + utils.assertNodeOrValueType = assertNodeOrValueType; + utils.assertNodeType = assertNodeType; + utils.assertOneOf = assertOneOf; + utils.assertOptionalChainStart = assertOptionalChainStart; + utils.assertShape = assertShape; + utils.assertValueType = assertValueType; + utils.chain = chain; + utils.default = defineType; + utils.defineAliasedType = defineAliasedType; + utils.validate = validate; + utils.validateArrayOfType = validateArrayOfType; + utils.validateOptional = validateOptional; + utils.validateOptionalType = validateOptionalType; + utils.validateType = validateType; + var _is = requireIs(); + var _validate = requireValidate(); + const VISITOR_KEYS = utils.VISITOR_KEYS = {}; + const ALIAS_KEYS = utils.ALIAS_KEYS = {}; + const FLIPPED_ALIAS_KEYS = utils.FLIPPED_ALIAS_KEYS = {}; + const NODE_FIELDS = utils.NODE_FIELDS = {}; + const BUILDER_KEYS = utils.BUILDER_KEYS = {}; + const DEPRECATED_KEYS = utils.DEPRECATED_KEYS = {}; + const NODE_PARENT_VALIDATIONS = utils.NODE_PARENT_VALIDATIONS = {}; + function getType(val) { + if (Array.isArray(val)) { + return "array"; + } else if (val === null) { + return "null"; + } else { + return typeof val; + } + } + function validate(validate) { + return { + validate + }; + } + function validateType(...typeNames) { + return validate(assertNodeType(...typeNames)); + } + function validateOptional(validate) { + return { + validate, + optional: true + }; + } + function validateOptionalType(...typeNames) { + return { + validate: assertNodeType(...typeNames), + optional: true + }; + } + function arrayOf(elementType) { + return chain(assertValueType("array"), assertEach(elementType)); + } + function arrayOfType(...typeNames) { + return arrayOf(assertNodeType(...typeNames)); + } + function validateArrayOfType(...typeNames) { + return validate(arrayOfType(...typeNames)); + } + function assertEach(callback) { + const childValidator = process.env.BABEL_TYPES_8_BREAKING ? _validate.validateChild : () => {}; + function validator(node, key, val) { + if (!Array.isArray(val)) return; + for (let i = 0; i < val.length; i++) { + const subkey = `${key}[${i}]`; + const v = val[i]; + callback(node, subkey, v); + childValidator(node, subkey, v); + } + } + validator.each = callback; + return validator; + } + function assertOneOf(...values) { + function validate(node, key, val) { + if (!values.includes(val)) { + throw new TypeError(`Property ${key} expected value to be one of ${JSON.stringify(values)} but got ${JSON.stringify(val)}`); + } + } + validate.oneOf = values; + return validate; + } + function assertNodeType(...types) { + function validate(node, key, val) { + for (const type of types) { + if ((0, _is.default)(type, val)) { + (0, _validate.validateChild)(node, key, val); + return; + } + } + throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val == null ? void 0 : val.type)}`); + } + validate.oneOfNodeTypes = types; + return validate; + } + function assertNodeOrValueType(...types) { + function validate(node, key, val) { + for (const type of types) { + if (getType(val) === type || (0, _is.default)(type, val)) { + (0, _validate.validateChild)(node, key, val); + return; + } + } + throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val == null ? void 0 : val.type)}`); + } + validate.oneOfNodeOrValueTypes = types; + return validate; + } + function assertValueType(type) { + function validate(node, key, val) { + const valid = getType(val) === type; + if (!valid) { + throw new TypeError(`Property ${key} expected type of ${type} but got ${getType(val)}`); + } + } + validate.type = type; + return validate; + } + function assertShape(shape) { + function validate(node, key, val) { + const errors = []; + for (const property of Object.keys(shape)) { + try { + (0, _validate.validateField)(node, property, val[property], shape[property]); + } catch (error) { + if (error instanceof TypeError) { + errors.push(error.message); + continue; + } + throw error; + } + } + if (errors.length) { + throw new TypeError(`Property ${key} of ${node.type} expected to have the following:\n${errors.join("\n")}`); + } + } + validate.shapeOf = shape; + return validate; + } + function assertOptionalChainStart() { + function validate(node) { + var _current; + let current = node; + while (node) { + const { + type + } = current; + if (type === "OptionalCallExpression") { + if (current.optional) return; + current = current.callee; + continue; + } + if (type === "OptionalMemberExpression") { + if (current.optional) return; + current = current.object; + continue; + } + break; + } + throw new TypeError(`Non-optional ${node.type} must chain from an optional OptionalMemberExpression or OptionalCallExpression. Found chain from ${(_current = current) == null ? void 0 : _current.type}`); + } + return validate; + } + function chain(...fns) { + function validate(...args) { + for (const fn of fns) { + fn(...args); + } + } + validate.chainOf = fns; + if (fns.length >= 2 && "type" in fns[0] && fns[0].type === "array" && !("each" in fns[1])) { + throw new Error(`An assertValueType("array") validator can only be followed by an assertEach(...) validator.`); + } + return validate; + } + const validTypeOpts = new Set(["aliases", "builder", "deprecatedAlias", "fields", "inherits", "visitor", "validate"]); + const validFieldKeys = new Set(["default", "optional", "deprecated", "validate"]); + const store = {}; + function defineAliasedType(...aliases) { + return (type, opts = {}) => { + let defined = opts.aliases; + if (!defined) { + var _store$opts$inherits$, _defined; + if (opts.inherits) defined = (_store$opts$inherits$ = store[opts.inherits].aliases) == null ? void 0 : _store$opts$inherits$.slice(); + (_defined = defined) != null ? _defined : defined = []; + opts.aliases = defined; + } + const additional = aliases.filter(a => !defined.includes(a)); + defined.unshift(...additional); + defineType(type, opts); + }; + } + function defineType(type, opts = {}) { + const inherits = opts.inherits && store[opts.inherits] || {}; + let fields = opts.fields; + if (!fields) { + fields = {}; + if (inherits.fields) { + const keys = Object.getOwnPropertyNames(inherits.fields); + for (const key of keys) { + const field = inherits.fields[key]; + const def = field.default; + if (Array.isArray(def) ? def.length > 0 : def && typeof def === "object") { + throw new Error("field defaults can only be primitives or empty arrays currently"); + } + fields[key] = { + default: Array.isArray(def) ? [] : def, + optional: field.optional, + deprecated: field.deprecated, + validate: field.validate + }; + } + } + } + const visitor = opts.visitor || inherits.visitor || []; + const aliases = opts.aliases || inherits.aliases || []; + const builder = opts.builder || inherits.builder || opts.visitor || []; + for (const k of Object.keys(opts)) { + if (!validTypeOpts.has(k)) { + throw new Error(`Unknown type option "${k}" on ${type}`); + } + } + if (opts.deprecatedAlias) { + DEPRECATED_KEYS[opts.deprecatedAlias] = type; + } + for (const key of visitor.concat(builder)) { + fields[key] = fields[key] || {}; + } + for (const key of Object.keys(fields)) { + const field = fields[key]; + if (field.default !== undefined && !builder.includes(key)) { + field.optional = true; + } + if (field.default === undefined) { + field.default = null; + } else if (!field.validate && field.default != null) { + field.validate = assertValueType(getType(field.default)); + } + for (const k of Object.keys(field)) { + if (!validFieldKeys.has(k)) { + throw new Error(`Unknown field key "${k}" on ${type}.${key}`); + } + } + } + VISITOR_KEYS[type] = opts.visitor = visitor; + BUILDER_KEYS[type] = opts.builder = builder; + NODE_FIELDS[type] = opts.fields = fields; + ALIAS_KEYS[type] = opts.aliases = aliases; + aliases.forEach(alias => { + FLIPPED_ALIAS_KEYS[alias] = FLIPPED_ALIAS_KEYS[alias] || []; + FLIPPED_ALIAS_KEYS[alias].push(type); + }); + if (opts.validate) { + NODE_PARENT_VALIDATIONS[type] = opts.validate; + } + store[type] = opts; + } + + + return utils; +} + +var hasRequiredCore; + +function requireCore () { + if (hasRequiredCore) return core; + hasRequiredCore = 1; + + Object.defineProperty(core, "__esModule", { + value: true + }); + core.patternLikeCommon = core.importAttributes = core.functionTypeAnnotationCommon = core.functionDeclarationCommon = core.functionCommon = core.classMethodOrPropertyCommon = core.classMethodOrDeclareMethodCommon = void 0; + var _is = requireIs(); + var _isValidIdentifier = requireIsValidIdentifier(); + var _helperValidatorIdentifier = requireLib$3(); + var _helperStringParser = requireLib$2(); + var _index = requireConstants(); + var _utils = requireUtils(); + const defineType = (0, _utils.defineAliasedType)("Standardized"); + defineType("ArrayExpression", { + fields: { + elements: { + validate: (0, _utils.arrayOf)((0, _utils.assertNodeOrValueType)("null", "Expression", "SpreadElement")), + default: !process.env.BABEL_TYPES_8_BREAKING ? [] : undefined + } + }, + visitor: ["elements"], + aliases: ["Expression"] + }); + defineType("AssignmentExpression", { + fields: { + operator: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("string") : Object.assign(function () { + const identifier = (0, _utils.assertOneOf)(..._index.ASSIGNMENT_OPERATORS); + const pattern = (0, _utils.assertOneOf)("="); + return function (node, key, val) { + const validator = (0, _is.default)("Pattern", node.left) ? pattern : identifier; + validator(node, key, val); + }; + }(), { + type: "string" + }) + }, + left: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal", "OptionalMemberExpression") : (0, _utils.assertNodeType)("Identifier", "MemberExpression", "OptionalMemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Expression"] + }); + defineType("BinaryExpression", { + builder: ["operator", "left", "right"], + fields: { + operator: { + validate: (0, _utils.assertOneOf)(..._index.BINARY_OPERATORS) + }, + left: { + validate: function () { + const expression = (0, _utils.assertNodeType)("Expression"); + const inOp = (0, _utils.assertNodeType)("Expression", "PrivateName"); + const validator = Object.assign(function (node, key, val) { + const validator = node.operator === "in" ? inOp : expression; + validator(node, key, val); + }, { + oneOfNodeTypes: ["Expression", "PrivateName"] + }); + return validator; + }() + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + visitor: ["left", "right"], + aliases: ["Binary", "Expression"] + }); + defineType("InterpreterDirective", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("Directive", { + visitor: ["value"], + fields: { + value: { + validate: (0, _utils.assertNodeType)("DirectiveLiteral") + } + } + }); + defineType("DirectiveLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("BlockStatement", { + builder: ["body", "directives"], + visitor: ["directives", "body"], + fields: { + directives: { + validate: (0, _utils.arrayOfType)("Directive"), + default: [] + }, + body: (0, _utils.validateArrayOfType)("Statement") + }, + aliases: ["Scopable", "BlockParent", "Block", "Statement"] + }); + defineType("BreakStatement", { + visitor: ["label"], + fields: { + label: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] + }); + defineType("CallExpression", { + visitor: ["callee", "arguments", "typeParameters", "typeArguments"], + builder: ["callee", "arguments"], + aliases: ["Expression"], + fields: Object.assign({ + callee: { + validate: (0, _utils.assertNodeType)("Expression", "Super", "V8IntrinsicIdentifier") + }, + arguments: (0, _utils.validateArrayOfType)("Expression", "SpreadElement", "ArgumentPlaceholder") + }, !process.env.BABEL_TYPES_8_BREAKING ? { + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + } : {}, { + typeArguments: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TSTypeParameterInstantiation"), + optional: true + } + }) + }); + defineType("CatchClause", { + visitor: ["param", "body"], + fields: { + param: { + validate: (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }, + aliases: ["Scopable", "BlockParent"] + }); + defineType("ConditionalExpression", { + visitor: ["test", "consequent", "alternate"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + consequent: { + validate: (0, _utils.assertNodeType)("Expression") + }, + alternate: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Expression", "Conditional"] + }); + defineType("ContinueStatement", { + visitor: ["label"], + fields: { + label: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] + }); + defineType("DebuggerStatement", { + aliases: ["Statement"] + }); + defineType("DoWhileStatement", { + builder: ["test", "body"], + visitor: ["body", "test"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + }, + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"] + }); + defineType("EmptyStatement", { + aliases: ["Statement"] + }); + defineType("ExpressionStatement", { + visitor: ["expression"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Statement", "ExpressionWrapper"] + }); + defineType("File", { + builder: ["program", "comments", "tokens"], + visitor: ["program"], + fields: { + program: { + validate: (0, _utils.assertNodeType)("Program") + }, + comments: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? Object.assign(() => {}, { + each: { + oneOfNodeTypes: ["CommentBlock", "CommentLine"] + } + }) : (0, _utils.assertEach)((0, _utils.assertNodeType)("CommentBlock", "CommentLine")), + optional: true + }, + tokens: { + validate: (0, _utils.assertEach)(Object.assign(() => {}, { + type: "any" + })), + optional: true + } + } + }); + defineType("ForInStatement", { + visitor: ["left", "right", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"], + fields: { + left: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("VariableDeclaration", "LVal") : (0, _utils.assertNodeType)("VariableDeclaration", "Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("ForStatement", { + visitor: ["init", "test", "update", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop"], + fields: { + init: { + validate: (0, _utils.assertNodeType)("VariableDeclaration", "Expression"), + optional: true + }, + test: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + update: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + const functionCommon = () => ({ + params: (0, _utils.validateArrayOfType)("Identifier", "Pattern", "RestElement"), + generator: { + default: false + }, + async: { + default: false + } + }); + core.functionCommon = functionCommon; + const functionTypeAnnotationCommon = () => ({ + returnType: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"), + optional: true + } + }); + core.functionTypeAnnotationCommon = functionTypeAnnotationCommon; + const functionDeclarationCommon = () => Object.assign({}, functionCommon(), { + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + } + }); + core.functionDeclarationCommon = functionDeclarationCommon; + defineType("FunctionDeclaration", { + builder: ["id", "params", "body", "generator", "async"], + visitor: ["id", "typeParameters", "params", "returnType", "body"], + fields: Object.assign({}, functionDeclarationCommon(), functionTypeAnnotationCommon(), { + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + }, + predicate: { + validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"), + optional: true + } + }), + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Statement", "Pureish", "Declaration"], + validate: !process.env.BABEL_TYPES_8_BREAKING ? undefined : function () { + const identifier = (0, _utils.assertNodeType)("Identifier"); + return function (parent, key, node) { + if (!(0, _is.default)("ExportDefaultDeclaration", parent)) { + identifier(node, "id", node.id); + } + }; + }() + }); + defineType("FunctionExpression", { + inherits: "FunctionDeclaration", + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"], + fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), { + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + }, + predicate: { + validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"), + optional: true + } + }) + }); + const patternLikeCommon = () => ({ + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }); + core.patternLikeCommon = patternLikeCommon; + defineType("Identifier", { + builder: ["name"], + visitor: ["typeAnnotation", "decorators"], + aliases: ["Expression", "PatternLike", "LVal", "TSEntityName"], + fields: Object.assign({}, patternLikeCommon(), { + name: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("string"), Object.assign(function (node, key, val) { + if (!(0, _isValidIdentifier.default)(val, false)) { + throw new TypeError(`"${val}" is not a valid identifier name`); + } + }, { + type: "string" + })) : (0, _utils.assertValueType)("string") + } + }), + validate: process.env.BABEL_TYPES_8_BREAKING ? function (parent, key, node) { + const match = /\.(\w+)$/.exec(key); + if (!match) return; + const [, parentKey] = match; + const nonComp = { + computed: false + }; + if (parentKey === "property") { + if ((0, _is.default)("MemberExpression", parent, nonComp)) return; + if ((0, _is.default)("OptionalMemberExpression", parent, nonComp)) return; + } else if (parentKey === "key") { + if ((0, _is.default)("Property", parent, nonComp)) return; + if ((0, _is.default)("Method", parent, nonComp)) return; + } else if (parentKey === "exported") { + if ((0, _is.default)("ExportSpecifier", parent)) return; + } else if (parentKey === "imported") { + if ((0, _is.default)("ImportSpecifier", parent, { + imported: node + })) return; + } else if (parentKey === "meta") { + if ((0, _is.default)("MetaProperty", parent, { + meta: node + })) return; + } + if (((0, _helperValidatorIdentifier.isKeyword)(node.name) || (0, _helperValidatorIdentifier.isReservedWord)(node.name, false)) && node.name !== "this") { + throw new TypeError(`"${node.name}" is not a valid identifier`); + } + } : undefined + }); + defineType("IfStatement", { + visitor: ["test", "consequent", "alternate"], + aliases: ["Statement", "Conditional"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + consequent: { + validate: (0, _utils.assertNodeType)("Statement") + }, + alternate: { + optional: true, + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("LabeledStatement", { + visitor: ["label", "body"], + aliases: ["Statement"], + fields: { + label: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("StringLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("NumericLiteral", { + builder: ["value"], + deprecatedAlias: "NumberLiteral", + fields: { + value: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("number"), Object.assign(function (node, key, val) { + }, { + type: "number" + })) + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("NullLiteral", { + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("BooleanLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("boolean") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("RegExpLiteral", { + builder: ["pattern", "flags"], + deprecatedAlias: "RegexLiteral", + aliases: ["Expression", "Pureish", "Literal"], + fields: { + pattern: { + validate: (0, _utils.assertValueType)("string") + }, + flags: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("string"), Object.assign(function (node, key, val) { + const invalid = /[^gimsuy]/.exec(val); + if (invalid) { + throw new TypeError(`"${invalid[0]}" is not a valid RegExp flag`); + } + }, { + type: "string" + })) : (0, _utils.assertValueType)("string"), + default: "" + } + } + }); + defineType("LogicalExpression", { + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Binary", "Expression"], + fields: { + operator: { + validate: (0, _utils.assertOneOf)(..._index.LOGICAL_OPERATORS) + }, + left: { + validate: (0, _utils.assertNodeType)("Expression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("MemberExpression", { + builder: ["object", "property", "computed", ...(!process.env.BABEL_TYPES_8_BREAKING ? ["optional"] : [])], + visitor: ["object", "property"], + aliases: ["Expression", "LVal"], + fields: Object.assign({ + object: { + validate: (0, _utils.assertNodeType)("Expression", "Super") + }, + property: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier", "PrivateName"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + validator.oneOfNodeTypes = ["Expression", "Identifier", "PrivateName"]; + return validator; + }() + }, + computed: { + default: false + } + }, !process.env.BABEL_TYPES_8_BREAKING ? { + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + } : {}) + }); + defineType("NewExpression", { + inherits: "CallExpression" + }); + defineType("Program", { + visitor: ["directives", "body"], + builder: ["body", "directives", "sourceType", "interpreter"], + fields: { + sourceType: { + validate: (0, _utils.assertOneOf)("script", "module"), + default: "script" + }, + interpreter: { + validate: (0, _utils.assertNodeType)("InterpreterDirective"), + default: null, + optional: true + }, + directives: { + validate: (0, _utils.arrayOfType)("Directive"), + default: [] + }, + body: (0, _utils.validateArrayOfType)("Statement") + }, + aliases: ["Scopable", "BlockParent", "Block"] + }); + defineType("ObjectExpression", { + visitor: ["properties"], + aliases: ["Expression"], + fields: { + properties: (0, _utils.validateArrayOfType)("ObjectMethod", "ObjectProperty", "SpreadElement") + } + }); + defineType("ObjectMethod", { + builder: ["kind", "key", "params", "body", "computed", "generator", "async"], + visitor: ["decorators", "key", "typeParameters", "params", "returnType", "body"], + fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), { + kind: Object.assign({ + validate: (0, _utils.assertOneOf)("method", "get", "set") + }, !process.env.BABEL_TYPES_8_BREAKING ? { + default: "method" + } : {}), + computed: { + default: false + }, + key: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + validator.oneOfNodeTypes = ["Expression", "Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"]; + return validator; + }() + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }), + aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method", "ObjectMember"] + }); + defineType("ObjectProperty", { + builder: ["key", "value", "computed", "shorthand", ...(!process.env.BABEL_TYPES_8_BREAKING ? ["decorators"] : [])], + fields: { + computed: { + default: false + }, + key: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "DecimalLiteral", "PrivateName"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = Object.assign(function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }, { + oneOfNodeTypes: ["Expression", "Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "DecimalLiteral", "PrivateName"] + }); + return validator; + }() + }, + value: { + validate: (0, _utils.assertNodeType)("Expression", "PatternLike") + }, + shorthand: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("boolean"), Object.assign(function (node, key, shorthand) { + if (!shorthand) return; + if (node.computed) { + throw new TypeError("Property shorthand of ObjectProperty cannot be true if computed is true"); + } + if (!(0, _is.default)("Identifier", node.key)) { + throw new TypeError("Property shorthand of ObjectProperty cannot be true if key is not an Identifier"); + } + }, { + type: "boolean" + })) : (0, _utils.assertValueType)("boolean"), + default: false + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }, + visitor: ["key", "value", "decorators"], + aliases: ["UserWhitespacable", "Property", "ObjectMember"], + validate: !process.env.BABEL_TYPES_8_BREAKING ? undefined : function () { + const pattern = (0, _utils.assertNodeType)("Identifier", "Pattern", "TSAsExpression", "TSSatisfiesExpression", "TSNonNullExpression", "TSTypeAssertion"); + const expression = (0, _utils.assertNodeType)("Expression"); + return function (parent, key, node) { + const validator = (0, _is.default)("ObjectPattern", parent) ? pattern : expression; + validator(node, "value", node.value); + }; + }() + }); + defineType("RestElement", { + visitor: ["argument", "typeAnnotation"], + builder: ["argument"], + aliases: ["LVal", "PatternLike"], + deprecatedAlias: "RestProperty", + fields: Object.assign({}, patternLikeCommon(), { + argument: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal") : (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern", "MemberExpression", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + } + }), + validate: process.env.BABEL_TYPES_8_BREAKING ? function (parent, key) { + const match = /(\w+)\[(\d+)\]/.exec(key); + if (!match) throw new Error("Internal Babel error: malformed key."); + const [, listKey, index] = match; + if (parent[listKey].length > +index + 1) { + throw new TypeError(`RestElement must be last element of ${listKey}`); + } + } : undefined + }); + defineType("ReturnStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + } + } + }); + defineType("SequenceExpression", { + visitor: ["expressions"], + fields: { + expressions: (0, _utils.validateArrayOfType)("Expression") + }, + aliases: ["Expression"] + }); + defineType("ParenthesizedExpression", { + visitor: ["expression"], + aliases: ["Expression", "ExpressionWrapper"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("SwitchCase", { + visitor: ["test", "consequent"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + consequent: (0, _utils.validateArrayOfType)("Statement") + } + }); + defineType("SwitchStatement", { + visitor: ["discriminant", "cases"], + aliases: ["Statement", "BlockParent", "Scopable"], + fields: { + discriminant: { + validate: (0, _utils.assertNodeType)("Expression") + }, + cases: (0, _utils.validateArrayOfType)("SwitchCase") + } + }); + defineType("ThisExpression", { + aliases: ["Expression"] + }); + defineType("ThrowStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("TryStatement", { + visitor: ["block", "handler", "finalizer"], + aliases: ["Statement"], + fields: { + block: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertNodeType)("BlockStatement"), Object.assign(function (node) { + if (!node.handler && !node.finalizer) { + throw new TypeError("TryStatement expects either a handler or finalizer, or both"); + } + }, { + oneOfNodeTypes: ["BlockStatement"] + })) : (0, _utils.assertNodeType)("BlockStatement") + }, + handler: { + optional: true, + validate: (0, _utils.assertNodeType)("CatchClause") + }, + finalizer: { + optional: true, + validate: (0, _utils.assertNodeType)("BlockStatement") + } + } + }); + defineType("UnaryExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { + default: true + }, + argument: { + validate: (0, _utils.assertNodeType)("Expression") + }, + operator: { + validate: (0, _utils.assertOneOf)(..._index.UNARY_OPERATORS) + } + }, + visitor: ["argument"], + aliases: ["UnaryLike", "Expression"] + }); + defineType("UpdateExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { + default: false + }, + argument: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("Expression") : (0, _utils.assertNodeType)("Identifier", "MemberExpression") + }, + operator: { + validate: (0, _utils.assertOneOf)(..._index.UPDATE_OPERATORS) + } + }, + visitor: ["argument"], + aliases: ["Expression"] + }); + defineType("VariableDeclaration", { + builder: ["kind", "declarations"], + visitor: ["declarations"], + aliases: ["Statement", "Declaration"], + fields: { + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + kind: { + validate: (0, _utils.assertOneOf)("var", "let", "const", "using", "await using") + }, + declarations: (0, _utils.validateArrayOfType)("VariableDeclarator") + }, + validate: process.env.BABEL_TYPES_8_BREAKING ? (() => { + const withoutInit = (0, _utils.assertNodeType)("Identifier"); + return function (parent, key, node) { + if ((0, _is.default)("ForXStatement", parent, { + left: node + })) { + if (node.declarations.length !== 1) { + throw new TypeError(`Exactly one VariableDeclarator is required in the VariableDeclaration of a ${parent.type}`); + } + } else { + node.declarations.forEach(decl => { + if (!decl.init) withoutInit(decl, "id", decl.id); + }); + } + }; + })() : undefined + }); + defineType("VariableDeclarator", { + visitor: ["id", "init"], + fields: { + id: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal") : (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern") + }, + definite: { + optional: true, + validate: (0, _utils.assertValueType)("boolean") + }, + init: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("WhileStatement", { + visitor: ["test", "body"], + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"], + fields: { + test: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("WithStatement", { + visitor: ["object", "body"], + aliases: ["Statement"], + fields: { + object: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + } + } + }); + defineType("AssignmentPattern", { + visitor: ["left", "right", "decorators"], + builder: ["left", "right"], + aliases: ["Pattern", "PatternLike", "LVal"], + fields: Object.assign({}, patternLikeCommon(), { + left: { + validate: (0, _utils.assertNodeType)("Identifier", "ObjectPattern", "ArrayPattern", "MemberExpression", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression") + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }) + }); + defineType("ArrayPattern", { + visitor: ["elements", "typeAnnotation"], + builder: ["elements"], + aliases: ["Pattern", "PatternLike", "LVal"], + fields: Object.assign({}, patternLikeCommon(), { + elements: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeOrValueType)("null", "PatternLike", "LVal"))) + } + }) + }); + defineType("ArrowFunctionExpression", { + builder: ["params", "body", "async"], + visitor: ["typeParameters", "params", "returnType", "body"], + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"], + fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), { + expression: { + validate: (0, _utils.assertValueType)("boolean") + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement", "Expression") + }, + predicate: { + validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"), + optional: true + } + }) + }); + defineType("ClassBody", { + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("ClassMethod", "ClassPrivateMethod", "ClassProperty", "ClassPrivateProperty", "ClassAccessorProperty", "TSDeclareMethod", "TSIndexSignature", "StaticBlock") + } + }); + defineType("ClassExpression", { + builder: ["id", "superClass", "body", "decorators"], + visitor: ["decorators", "id", "typeParameters", "superClass", "superTypeParameters", "mixins", "implements", "body"], + aliases: ["Scopable", "Class", "Expression"], + fields: { + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("ClassBody") + }, + superClass: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + }, + superTypeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + }, + implements: { + validate: (0, _utils.arrayOfType)("TSExpressionWithTypeArguments", "ClassImplements"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + mixins: { + validate: (0, _utils.assertNodeType)("InterfaceExtends"), + optional: true + } + } + }); + defineType("ClassDeclaration", { + inherits: "ClassExpression", + aliases: ["Scopable", "Class", "Statement", "Declaration"], + fields: { + id: { + validate: (0, _utils.assertNodeType)("Identifier"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"), + optional: true + }, + body: { + validate: (0, _utils.assertNodeType)("ClassBody") + }, + superClass: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + }, + superTypeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + }, + implements: { + validate: (0, _utils.arrayOfType)("TSExpressionWithTypeArguments", "ClassImplements"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + mixins: { + validate: (0, _utils.assertNodeType)("InterfaceExtends"), + optional: true + }, + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + abstract: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + }, + validate: !process.env.BABEL_TYPES_8_BREAKING ? undefined : function () { + const identifier = (0, _utils.assertNodeType)("Identifier"); + return function (parent, key, node) { + if (!(0, _is.default)("ExportDefaultDeclaration", parent)) { + identifier(node, "id", node.id); + } + }; + }() + }); + const importAttributes = core.importAttributes = { + attributes: { + optional: true, + validate: (0, _utils.arrayOfType)("ImportAttribute") + }, + assertions: { + deprecated: true, + optional: true, + validate: (0, _utils.arrayOfType)("ImportAttribute") + } + }; + defineType("ExportAllDeclaration", { + builder: ["source"], + visitor: ["source", "attributes", "assertions"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"], + fields: Object.assign({ + source: { + validate: (0, _utils.assertNodeType)("StringLiteral") + }, + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")) + }, importAttributes) + }); + defineType("ExportDefaultDeclaration", { + visitor: ["declaration"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"], + fields: { + declaration: (0, _utils.validateType)("TSDeclareFunction", "FunctionDeclaration", "ClassDeclaration", "Expression"), + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("value")) + } + }); + defineType("ExportNamedDeclaration", { + builder: ["declaration", "specifiers", "source"], + visitor: process.env ? ["declaration", "specifiers", "source", "attributes"] : ["declaration", "specifiers", "source", "attributes", "assertions"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"], + fields: Object.assign({ + declaration: { + optional: true, + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertNodeType)("Declaration"), Object.assign(function (node, key, val) { + if (val && node.specifiers.length) { + throw new TypeError("Only declaration or specifiers is allowed on ExportNamedDeclaration"); + } + if (val && node.source) { + throw new TypeError("Cannot export a declaration from a source"); + } + }, { + oneOfNodeTypes: ["Declaration"] + })) : (0, _utils.assertNodeType)("Declaration") + } + }, importAttributes, { + specifiers: { + default: [], + validate: (0, _utils.arrayOf)(function () { + const sourced = (0, _utils.assertNodeType)("ExportSpecifier", "ExportDefaultSpecifier", "ExportNamespaceSpecifier"); + const sourceless = (0, _utils.assertNodeType)("ExportSpecifier"); + if (!process.env.BABEL_TYPES_8_BREAKING) return sourced; + return Object.assign(function (node, key, val) { + const validator = node.source ? sourced : sourceless; + validator(node, key, val); + }, { + oneOfNodeTypes: ["ExportSpecifier", "ExportDefaultSpecifier", "ExportNamespaceSpecifier"] + }); + }()) + }, + source: { + validate: (0, _utils.assertNodeType)("StringLiteral"), + optional: true + }, + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")) + }) + }); + defineType("ExportSpecifier", { + visitor: ["local", "exported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + exported: { + validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral") + }, + exportKind: { + validate: (0, _utils.assertOneOf)("type", "value"), + optional: true + } + } + }); + defineType("ForOfStatement", { + visitor: ["left", "right", "body"], + builder: ["left", "right", "body", "await"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"], + fields: { + left: { + validate: function () { + if (!process.env.BABEL_TYPES_8_BREAKING) { + return (0, _utils.assertNodeType)("VariableDeclaration", "LVal"); + } + const declaration = (0, _utils.assertNodeType)("VariableDeclaration"); + const lval = (0, _utils.assertNodeType)("Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression"); + return Object.assign(function (node, key, val) { + if ((0, _is.default)("VariableDeclaration", val)) { + declaration(node, key, val); + } else { + lval(node, key, val); + } + }, { + oneOfNodeTypes: ["VariableDeclaration", "Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression"] + }); + }() + }, + right: { + validate: (0, _utils.assertNodeType)("Expression") + }, + body: { + validate: (0, _utils.assertNodeType)("Statement") + }, + await: { + default: false + } + } + }); + defineType("ImportDeclaration", { + builder: ["specifiers", "source"], + visitor: ["specifiers", "source", "attributes", "assertions"], + aliases: ["Statement", "Declaration", "ImportOrExportDeclaration"], + fields: Object.assign({}, importAttributes, { + module: { + optional: true, + validate: (0, _utils.assertValueType)("boolean") + }, + phase: { + default: null, + validate: (0, _utils.assertOneOf)("source", "defer") + }, + specifiers: (0, _utils.validateArrayOfType)("ImportSpecifier", "ImportDefaultSpecifier", "ImportNamespaceSpecifier"), + source: { + validate: (0, _utils.assertNodeType)("StringLiteral") + }, + importKind: { + validate: (0, _utils.assertOneOf)("type", "typeof", "value"), + optional: true + } + }) + }); + defineType("ImportDefaultSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("ImportNamespaceSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("ImportSpecifier", { + visitor: ["imported", "local"], + builder: ["local", "imported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + imported: { + validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral") + }, + importKind: { + validate: (0, _utils.assertOneOf)("type", "typeof", "value"), + optional: true + } + } + }); + defineType("ImportExpression", { + visitor: ["source", "options"], + aliases: ["Expression"], + fields: { + phase: { + default: null, + validate: (0, _utils.assertOneOf)("source", "defer") + }, + source: { + validate: (0, _utils.assertNodeType)("Expression") + }, + options: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + } + } + }); + defineType("MetaProperty", { + visitor: ["meta", "property"], + aliases: ["Expression"], + fields: { + meta: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertNodeType)("Identifier"), Object.assign(function (node, key, val) { + let property; + switch (val.name) { + case "function": + property = "sent"; + break; + case "new": + property = "target"; + break; + case "import": + property = "meta"; + break; + } + if (!(0, _is.default)("Identifier", node.property, { + name: property + })) { + throw new TypeError("Unrecognised MetaProperty"); + } + }, { + oneOfNodeTypes: ["Identifier"] + })) : (0, _utils.assertNodeType)("Identifier") + }, + property: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + const classMethodOrPropertyCommon = () => ({ + abstract: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + accessibility: { + validate: (0, _utils.assertOneOf)("public", "private", "protected"), + optional: true + }, + static: { + default: false + }, + override: { + default: false + }, + computed: { + default: false + }, + optional: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + key: { + validate: (0, _utils.chain)(function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"); + const computed = (0, _utils.assertNodeType)("Expression"); + return function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + }(), (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "Expression")) + } + }); + core.classMethodOrPropertyCommon = classMethodOrPropertyCommon; + const classMethodOrDeclareMethodCommon = () => Object.assign({}, functionCommon(), classMethodOrPropertyCommon(), { + params: (0, _utils.validateArrayOfType)("Identifier", "Pattern", "RestElement", "TSParameterProperty"), + kind: { + validate: (0, _utils.assertOneOf)("get", "set", "method", "constructor"), + default: "method" + }, + access: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("string"), (0, _utils.assertOneOf)("public", "private", "protected")), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + }); + core.classMethodOrDeclareMethodCommon = classMethodOrDeclareMethodCommon; + defineType("ClassMethod", { + aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method"], + builder: ["kind", "key", "params", "body", "computed", "static", "generator", "async"], + visitor: ["decorators", "key", "typeParameters", "params", "returnType", "body"], + fields: Object.assign({}, classMethodOrDeclareMethodCommon(), functionTypeAnnotationCommon(), { + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }) + }); + defineType("ObjectPattern", { + visitor: ["properties", "typeAnnotation", "decorators"], + builder: ["properties"], + aliases: ["Pattern", "PatternLike", "LVal"], + fields: Object.assign({}, patternLikeCommon(), { + properties: (0, _utils.validateArrayOfType)("RestElement", "ObjectProperty") + }) + }); + defineType("SpreadElement", { + visitor: ["argument"], + aliases: ["UnaryLike"], + deprecatedAlias: "SpreadProperty", + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("Super", { + aliases: ["Expression"] + }); + defineType("TaggedTemplateExpression", { + visitor: ["tag", "typeParameters", "quasi"], + builder: ["tag", "quasi"], + aliases: ["Expression"], + fields: { + tag: { + validate: (0, _utils.assertNodeType)("Expression") + }, + quasi: { + validate: (0, _utils.assertNodeType)("TemplateLiteral") + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + } + } + }); + defineType("TemplateElement", { + builder: ["value", "tail"], + fields: { + value: { + validate: (0, _utils.chain)((0, _utils.assertShape)({ + raw: { + validate: (0, _utils.assertValueType)("string") + }, + cooked: { + validate: (0, _utils.assertValueType)("string"), + optional: true + } + }), function templateElementCookedValidator(node) { + const raw = node.value.raw; + let unterminatedCalled = false; + const error = () => { + throw new Error("Internal @babel/types error."); + }; + const { + str, + firstInvalidLoc + } = (0, _helperStringParser.readStringContents)("template", raw, 0, 0, 0, { + unterminated() { + unterminatedCalled = true; + }, + strictNumericEscape: error, + invalidEscapeSequence: error, + numericSeparatorInEscapeSequence: error, + unexpectedNumericSeparator: error, + invalidDigit: error, + invalidCodePoint: error + }); + if (!unterminatedCalled) throw new Error("Invalid raw"); + node.value.cooked = firstInvalidLoc ? null : str; + }) + }, + tail: { + default: false + } + } + }); + defineType("TemplateLiteral", { + visitor: ["quasis", "expressions"], + aliases: ["Expression", "Literal"], + fields: { + quasis: (0, _utils.validateArrayOfType)("TemplateElement"), + expressions: { + validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression", "TSType")), function (node, key, val) { + if (node.quasis.length !== val.length + 1) { + throw new TypeError(`Number of ${node.type} quasis should be exactly one more than the number of expressions.\nExpected ${val.length + 1} quasis but got ${node.quasis.length}`); + } + }) + } + } + }); + defineType("YieldExpression", { + builder: ["argument", "delegate"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + delegate: { + validate: process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.chain)((0, _utils.assertValueType)("boolean"), Object.assign(function (node, key, val) { + if (val && !node.argument) { + throw new TypeError("Property delegate of YieldExpression cannot be true if there is no argument"); + } + }, { + type: "boolean" + })) : (0, _utils.assertValueType)("boolean"), + default: false + }, + argument: { + optional: true, + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("AwaitExpression", { + builder: ["argument"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("Import", { + aliases: ["Expression"] + }); + defineType("BigIntLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + defineType("ExportNamespaceSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { + exported: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("OptionalMemberExpression", { + builder: ["object", "property", "computed", "optional"], + visitor: ["object", "property"], + aliases: ["Expression"], + fields: { + object: { + validate: (0, _utils.assertNodeType)("Expression") + }, + property: { + validate: function () { + const normal = (0, _utils.assertNodeType)("Identifier"); + const computed = (0, _utils.assertNodeType)("Expression"); + const validator = Object.assign(function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }, { + oneOfNodeTypes: ["Expression", "Identifier"] + }); + return validator; + }() + }, + computed: { + default: false + }, + optional: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("boolean") : (0, _utils.chain)((0, _utils.assertValueType)("boolean"), (0, _utils.assertOptionalChainStart)()) + } + } + }); + defineType("OptionalCallExpression", { + visitor: ["callee", "arguments", "typeParameters", "typeArguments"], + builder: ["callee", "arguments", "optional"], + aliases: ["Expression"], + fields: { + callee: { + validate: (0, _utils.assertNodeType)("Expression") + }, + arguments: (0, _utils.validateArrayOfType)("Expression", "SpreadElement", "ArgumentPlaceholder"), + optional: { + validate: !process.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("boolean") : (0, _utils.chain)((0, _utils.assertValueType)("boolean"), (0, _utils.assertOptionalChainStart)()) + }, + typeArguments: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TSTypeParameterInstantiation"), + optional: true + } + } + }); + defineType("ClassProperty", { + visitor: ["decorators", "key", "typeAnnotation", "value"], + builder: ["key", "value", "typeAnnotation", "decorators", "computed", "static"], + aliases: ["Property"], + fields: Object.assign({}, classMethodOrPropertyCommon(), { + value: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + definite: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + variance: { + validate: (0, _utils.assertNodeType)("Variance"), + optional: true + } + }) + }); + defineType("ClassAccessorProperty", { + visitor: ["decorators", "key", "typeAnnotation", "value"], + builder: ["key", "value", "typeAnnotation", "decorators", "computed", "static"], + aliases: ["Property", "Accessor"], + fields: Object.assign({}, classMethodOrPropertyCommon(), { + key: { + validate: (0, _utils.chain)(function () { + const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "PrivateName"); + const computed = (0, _utils.assertNodeType)("Expression"); + return function (node, key, val) { + const validator = node.computed ? computed : normal; + validator(node, key, val); + }; + }(), (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "Expression", "PrivateName")) + }, + value: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + definite: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + declare: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + variance: { + validate: (0, _utils.assertNodeType)("Variance"), + optional: true + } + }) + }); + defineType("ClassPrivateProperty", { + visitor: ["decorators", "key", "typeAnnotation", "value"], + builder: ["key", "value", "decorators", "static"], + aliases: ["Property", "Private"], + fields: { + key: { + validate: (0, _utils.assertNodeType)("PrivateName") + }, + value: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + }, + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + }, + static: { + validate: (0, _utils.assertValueType)("boolean"), + default: false + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + definite: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + variance: { + validate: (0, _utils.assertNodeType)("Variance"), + optional: true + } + } + }); + defineType("ClassPrivateMethod", { + builder: ["kind", "key", "params", "body", "static"], + visitor: ["decorators", "key", "typeParameters", "params", "returnType", "body"], + aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method", "Private"], + fields: Object.assign({}, classMethodOrDeclareMethodCommon(), functionTypeAnnotationCommon(), { + kind: { + validate: (0, _utils.assertOneOf)("get", "set", "method"), + default: "method" + }, + key: { + validate: (0, _utils.assertNodeType)("PrivateName") + }, + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + } + }) + }); + defineType("PrivateName", { + visitor: ["id"], + aliases: ["Private"], + fields: { + id: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + defineType("StaticBlock", { + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("Statement") + }, + aliases: ["Scopable", "BlockParent", "FunctionParent"] + }); + + + return core; +} + +var flow = {}; + +var hasRequiredFlow; + +function requireFlow () { + if (hasRequiredFlow) return flow; + hasRequiredFlow = 1; + + var _core = requireCore(); + var _utils = requireUtils(); + const defineType = (0, _utils.defineAliasedType)("Flow"); + const defineInterfaceishType = name => { + const isDeclareClass = name === "DeclareClass"; + defineType(name, { + builder: ["id", "typeParameters", "extends", "body"], + visitor: ["id", "typeParameters", "extends", ...(isDeclareClass ? ["mixins", "implements"] : []), "body"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: Object.assign({ + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")) + }, isDeclareClass ? { + mixins: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")), + implements: (0, _utils.validateOptional)((0, _utils.arrayOfType)("ClassImplements")) + } : {}, { + body: (0, _utils.validateType)("ObjectTypeAnnotation") + }) + }); + }; + defineType("AnyTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ArrayTypeAnnotation", { + visitor: ["elementType"], + aliases: ["FlowType"], + fields: { + elementType: (0, _utils.validateType)("FlowType") + } + }); + defineType("BooleanTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("BooleanLiteralTypeAnnotation", { + builder: ["value"], + aliases: ["FlowType"], + fields: { + value: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("NullLiteralTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ClassImplements", { + visitor: ["id", "typeParameters"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation") + } + }); + defineInterfaceishType("DeclareClass"); + defineType("DeclareFunction", { + visitor: ["id"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + predicate: (0, _utils.validateOptionalType)("DeclaredPredicate") + } + }); + defineInterfaceishType("DeclareInterface"); + defineType("DeclareModule", { + builder: ["id", "body", "kind"], + visitor: ["id", "body"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier", "StringLiteral"), + body: (0, _utils.validateType)("BlockStatement"), + kind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("CommonJS", "ES")) + } + }); + defineType("DeclareModuleExports", { + visitor: ["typeAnnotation"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + typeAnnotation: (0, _utils.validateType)("TypeAnnotation") + } + }); + defineType("DeclareTypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + right: (0, _utils.validateType)("FlowType") + } + }); + defineType("DeclareOpaqueType", { + visitor: ["id", "typeParameters", "supertype"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + supertype: (0, _utils.validateOptionalType)("FlowType"), + impltype: (0, _utils.validateOptionalType)("FlowType") + } + }); + defineType("DeclareVariable", { + visitor: ["id"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier") + } + }); + defineType("DeclareExportDeclaration", { + visitor: ["declaration", "specifiers", "source", "attributes"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: Object.assign({ + declaration: (0, _utils.validateOptionalType)("Flow"), + specifiers: (0, _utils.validateOptional)((0, _utils.arrayOfType)("ExportSpecifier", "ExportNamespaceSpecifier")), + source: (0, _utils.validateOptionalType)("StringLiteral"), + default: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean")) + }, _core.importAttributes) + }); + defineType("DeclareExportAllDeclaration", { + visitor: ["source", "attributes"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: Object.assign({ + source: (0, _utils.validateType)("StringLiteral"), + exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")) + }, _core.importAttributes) + }); + defineType("DeclaredPredicate", { + visitor: ["value"], + aliases: ["FlowPredicate"], + fields: { + value: (0, _utils.validateType)("Flow") + } + }); + defineType("ExistsTypeAnnotation", { + aliases: ["FlowType"] + }); + defineType("FunctionTypeAnnotation", { + visitor: ["typeParameters", "params", "rest", "returnType"], + aliases: ["FlowType"], + fields: { + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + params: (0, _utils.validateArrayOfType)("FunctionTypeParam"), + rest: (0, _utils.validateOptionalType)("FunctionTypeParam"), + this: (0, _utils.validateOptionalType)("FunctionTypeParam"), + returnType: (0, _utils.validateType)("FlowType") + } + }); + defineType("FunctionTypeParam", { + visitor: ["name", "typeAnnotation"], + fields: { + name: (0, _utils.validateOptionalType)("Identifier"), + typeAnnotation: (0, _utils.validateType)("FlowType"), + optional: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("GenericTypeAnnotation", { + visitor: ["id", "typeParameters"], + aliases: ["FlowType"], + fields: { + id: (0, _utils.validateType)("Identifier", "QualifiedTypeIdentifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation") + } + }); + defineType("InferredPredicate", { + aliases: ["FlowPredicate"] + }); + defineType("InterfaceExtends", { + visitor: ["id", "typeParameters"], + fields: { + id: (0, _utils.validateType)("Identifier", "QualifiedTypeIdentifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation") + } + }); + defineInterfaceishType("InterfaceDeclaration"); + defineType("InterfaceTypeAnnotation", { + visitor: ["extends", "body"], + aliases: ["FlowType"], + fields: { + extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")), + body: (0, _utils.validateType)("ObjectTypeAnnotation") + } + }); + defineType("IntersectionTypeAnnotation", { + visitor: ["types"], + aliases: ["FlowType"], + fields: { + types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("MixedTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("EmptyTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("NullableTypeAnnotation", { + visitor: ["typeAnnotation"], + aliases: ["FlowType"], + fields: { + typeAnnotation: (0, _utils.validateType)("FlowType") + } + }); + defineType("NumberLiteralTypeAnnotation", { + builder: ["value"], + aliases: ["FlowType"], + fields: { + value: (0, _utils.validate)((0, _utils.assertValueType)("number")) + } + }); + defineType("NumberTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ObjectTypeAnnotation", { + visitor: ["properties", "indexers", "callProperties", "internalSlots"], + aliases: ["FlowType"], + builder: ["properties", "indexers", "callProperties", "internalSlots", "exact"], + fields: { + properties: (0, _utils.validate)((0, _utils.arrayOfType)("ObjectTypeProperty", "ObjectTypeSpreadProperty")), + indexers: { + validate: (0, _utils.arrayOfType)("ObjectTypeIndexer"), + optional: true, + default: [] + }, + callProperties: { + validate: (0, _utils.arrayOfType)("ObjectTypeCallProperty"), + optional: true, + default: [] + }, + internalSlots: { + validate: (0, _utils.arrayOfType)("ObjectTypeInternalSlot"), + optional: true, + default: [] + }, + exact: { + validate: (0, _utils.assertValueType)("boolean"), + default: false + }, + inexact: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeInternalSlot", { + visitor: ["id", "value"], + builder: ["id", "value", "optional", "static", "method"], + aliases: ["UserWhitespacable"], + fields: { + id: (0, _utils.validateType)("Identifier"), + value: (0, _utils.validateType)("FlowType"), + optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + method: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeCallProperty", { + visitor: ["value"], + aliases: ["UserWhitespacable"], + fields: { + value: (0, _utils.validateType)("FlowType"), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeIndexer", { + visitor: ["variance", "id", "key", "value"], + builder: ["id", "key", "value", "variance"], + aliases: ["UserWhitespacable"], + fields: { + id: (0, _utils.validateOptionalType)("Identifier"), + key: (0, _utils.validateType)("FlowType"), + value: (0, _utils.validateType)("FlowType"), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + variance: (0, _utils.validateOptionalType)("Variance") + } + }); + defineType("ObjectTypeProperty", { + visitor: ["key", "value", "variance"], + aliases: ["UserWhitespacable"], + fields: { + key: (0, _utils.validateType)("Identifier", "StringLiteral"), + value: (0, _utils.validateType)("FlowType"), + kind: (0, _utils.validate)((0, _utils.assertOneOf)("init", "get", "set")), + static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + proto: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + variance: (0, _utils.validateOptionalType)("Variance"), + method: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("ObjectTypeSpreadProperty", { + visitor: ["argument"], + aliases: ["UserWhitespacable"], + fields: { + argument: (0, _utils.validateType)("FlowType") + } + }); + defineType("OpaqueType", { + visitor: ["id", "typeParameters", "supertype", "impltype"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + supertype: (0, _utils.validateOptionalType)("FlowType"), + impltype: (0, _utils.validateType)("FlowType") + } + }); + defineType("QualifiedTypeIdentifier", { + visitor: ["qualification", "id"], + builder: ["id", "qualification"], + fields: { + id: (0, _utils.validateType)("Identifier"), + qualification: (0, _utils.validateType)("Identifier", "QualifiedTypeIdentifier") + } + }); + defineType("StringLiteralTypeAnnotation", { + builder: ["value"], + aliases: ["FlowType"], + fields: { + value: (0, _utils.validate)((0, _utils.assertValueType)("string")) + } + }); + defineType("StringTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("SymbolTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("ThisTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("TupleTypeAnnotation", { + visitor: ["types"], + aliases: ["FlowType"], + fields: { + types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("TypeofTypeAnnotation", { + visitor: ["argument"], + aliases: ["FlowType"], + fields: { + argument: (0, _utils.validateType)("FlowType") + } + }); + defineType("TypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["FlowDeclaration", "Statement", "Declaration"], + fields: { + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"), + right: (0, _utils.validateType)("FlowType") + } + }); + defineType("TypeAnnotation", { + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("FlowType") + } + }); + defineType("TypeCastExpression", { + visitor: ["expression", "typeAnnotation"], + aliases: ["ExpressionWrapper", "Expression"], + fields: { + expression: (0, _utils.validateType)("Expression"), + typeAnnotation: (0, _utils.validateType)("TypeAnnotation") + } + }); + defineType("TypeParameter", { + visitor: ["bound", "default", "variance"], + fields: { + name: (0, _utils.validate)((0, _utils.assertValueType)("string")), + bound: (0, _utils.validateOptionalType)("TypeAnnotation"), + default: (0, _utils.validateOptionalType)("FlowType"), + variance: (0, _utils.validateOptionalType)("Variance") + } + }); + defineType("TypeParameterDeclaration", { + visitor: ["params"], + fields: { + params: (0, _utils.validate)((0, _utils.arrayOfType)("TypeParameter")) + } + }); + defineType("TypeParameterInstantiation", { + visitor: ["params"], + fields: { + params: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("UnionTypeAnnotation", { + visitor: ["types"], + aliases: ["FlowType"], + fields: { + types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType")) + } + }); + defineType("Variance", { + builder: ["kind"], + fields: { + kind: (0, _utils.validate)((0, _utils.assertOneOf)("minus", "plus")) + } + }); + defineType("VoidTypeAnnotation", { + aliases: ["FlowType", "FlowBaseAnnotation"] + }); + defineType("EnumDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "body"], + fields: { + id: (0, _utils.validateType)("Identifier"), + body: (0, _utils.validateType)("EnumBooleanBody", "EnumNumberBody", "EnumStringBody", "EnumSymbolBody") + } + }); + defineType("EnumBooleanBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + members: (0, _utils.validateArrayOfType)("EnumBooleanMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumNumberBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + members: (0, _utils.validateArrayOfType)("EnumNumberMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumStringBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")), + members: (0, _utils.validateArrayOfType)("EnumStringMember", "EnumDefaultedMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumSymbolBody", { + aliases: ["EnumBody"], + visitor: ["members"], + fields: { + members: (0, _utils.validateArrayOfType)("EnumDefaultedMember"), + hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + defineType("EnumBooleanMember", { + aliases: ["EnumMember"], + visitor: ["id"], + fields: { + id: (0, _utils.validateType)("Identifier"), + init: (0, _utils.validateType)("BooleanLiteral") + } + }); + defineType("EnumNumberMember", { + aliases: ["EnumMember"], + visitor: ["id", "init"], + fields: { + id: (0, _utils.validateType)("Identifier"), + init: (0, _utils.validateType)("NumericLiteral") + } + }); + defineType("EnumStringMember", { + aliases: ["EnumMember"], + visitor: ["id", "init"], + fields: { + id: (0, _utils.validateType)("Identifier"), + init: (0, _utils.validateType)("StringLiteral") + } + }); + defineType("EnumDefaultedMember", { + aliases: ["EnumMember"], + visitor: ["id"], + fields: { + id: (0, _utils.validateType)("Identifier") + } + }); + defineType("IndexedAccessType", { + visitor: ["objectType", "indexType"], + aliases: ["FlowType"], + fields: { + objectType: (0, _utils.validateType)("FlowType"), + indexType: (0, _utils.validateType)("FlowType") + } + }); + defineType("OptionalIndexedAccessType", { + visitor: ["objectType", "indexType"], + aliases: ["FlowType"], + fields: { + objectType: (0, _utils.validateType)("FlowType"), + indexType: (0, _utils.validateType)("FlowType"), + optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")) + } + }); + + + return flow; +} + +var jsx = {}; + +var hasRequiredJsx; + +function requireJsx () { + if (hasRequiredJsx) return jsx; + hasRequiredJsx = 1; + + var _utils = requireUtils(); + const defineType = (0, _utils.defineAliasedType)("JSX"); + defineType("JSXAttribute", { + visitor: ["name", "value"], + aliases: ["Immutable"], + fields: { + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXNamespacedName") + }, + value: { + optional: true, + validate: (0, _utils.assertNodeType)("JSXElement", "JSXFragment", "StringLiteral", "JSXExpressionContainer") + } + } + }); + defineType("JSXClosingElement", { + visitor: ["name"], + aliases: ["Immutable"], + fields: { + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXMemberExpression", "JSXNamespacedName") + } + } + }); + defineType("JSXElement", { + builder: ["openingElement", "closingElement", "children", "selfClosing"], + visitor: ["openingElement", "children", "closingElement"], + aliases: ["Immutable", "Expression"], + fields: Object.assign({ + openingElement: { + validate: (0, _utils.assertNodeType)("JSXOpeningElement") + }, + closingElement: { + optional: true, + validate: (0, _utils.assertNodeType)("JSXClosingElement") + }, + children: (0, _utils.validateArrayOfType)("JSXText", "JSXExpressionContainer", "JSXSpreadChild", "JSXElement", "JSXFragment") + }, { + selfClosing: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + } + }) + }); + defineType("JSXEmptyExpression", {}); + defineType("JSXExpressionContainer", { + visitor: ["expression"], + aliases: ["Immutable"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression", "JSXEmptyExpression") + } + } + }); + defineType("JSXSpreadChild", { + visitor: ["expression"], + aliases: ["Immutable"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("JSXIdentifier", { + builder: ["name"], + fields: { + name: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("JSXMemberExpression", { + visitor: ["object", "property"], + fields: { + object: { + validate: (0, _utils.assertNodeType)("JSXMemberExpression", "JSXIdentifier") + }, + property: { + validate: (0, _utils.assertNodeType)("JSXIdentifier") + } + } + }); + defineType("JSXNamespacedName", { + visitor: ["namespace", "name"], + fields: { + namespace: { + validate: (0, _utils.assertNodeType)("JSXIdentifier") + }, + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier") + } + } + }); + defineType("JSXOpeningElement", { + builder: ["name", "attributes", "selfClosing"], + visitor: ["name", "attributes"], + aliases: ["Immutable"], + fields: { + name: { + validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXMemberExpression", "JSXNamespacedName") + }, + selfClosing: { + default: false + }, + attributes: (0, _utils.validateArrayOfType)("JSXAttribute", "JSXSpreadAttribute"), + typeParameters: { + validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"), + optional: true + } + } + }); + defineType("JSXSpreadAttribute", { + visitor: ["argument"], + fields: { + argument: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + defineType("JSXText", { + aliases: ["Immutable"], + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + defineType("JSXFragment", { + builder: ["openingFragment", "closingFragment", "children"], + visitor: ["openingFragment", "children", "closingFragment"], + aliases: ["Immutable", "Expression"], + fields: { + openingFragment: { + validate: (0, _utils.assertNodeType)("JSXOpeningFragment") + }, + closingFragment: { + validate: (0, _utils.assertNodeType)("JSXClosingFragment") + }, + children: (0, _utils.validateArrayOfType)("JSXText", "JSXExpressionContainer", "JSXSpreadChild", "JSXElement", "JSXFragment") + } + }); + defineType("JSXOpeningFragment", { + aliases: ["Immutable"] + }); + defineType("JSXClosingFragment", { + aliases: ["Immutable"] + }); + + + return jsx; +} + +var misc = {}; + +var placeholders = {}; + +var hasRequiredPlaceholders; + +function requirePlaceholders () { + if (hasRequiredPlaceholders) return placeholders; + hasRequiredPlaceholders = 1; + + Object.defineProperty(placeholders, "__esModule", { + value: true + }); + placeholders.PLACEHOLDERS_FLIPPED_ALIAS = placeholders.PLACEHOLDERS_ALIAS = placeholders.PLACEHOLDERS = void 0; + var _utils = requireUtils(); + const PLACEHOLDERS = placeholders.PLACEHOLDERS = ["Identifier", "StringLiteral", "Expression", "Statement", "Declaration", "BlockStatement", "ClassBody", "Pattern"]; + const PLACEHOLDERS_ALIAS = placeholders.PLACEHOLDERS_ALIAS = { + Declaration: ["Statement"], + Pattern: ["PatternLike", "LVal"] + }; + for (const type of PLACEHOLDERS) { + const alias = _utils.ALIAS_KEYS[type]; + if (alias != null && alias.length) PLACEHOLDERS_ALIAS[type] = alias; + } + const PLACEHOLDERS_FLIPPED_ALIAS = placeholders.PLACEHOLDERS_FLIPPED_ALIAS = {}; + Object.keys(PLACEHOLDERS_ALIAS).forEach(type => { + PLACEHOLDERS_ALIAS[type].forEach(alias => { + if (!hasOwnProperty.call(PLACEHOLDERS_FLIPPED_ALIAS, alias)) { + PLACEHOLDERS_FLIPPED_ALIAS[alias] = []; + } + PLACEHOLDERS_FLIPPED_ALIAS[alias].push(type); + }); + }); + + + return placeholders; +} + +var hasRequiredMisc; + +function requireMisc () { + if (hasRequiredMisc) return misc; + hasRequiredMisc = 1; + + var _utils = requireUtils(); + var _placeholders = requirePlaceholders(); + var _core = requireCore(); + const defineType = (0, _utils.defineAliasedType)("Miscellaneous"); + { + defineType("Noop", { + visitor: [] + }); + } + defineType("Placeholder", { + visitor: [], + builder: ["expectedNode", "name"], + fields: Object.assign({ + name: { + validate: (0, _utils.assertNodeType)("Identifier") + }, + expectedNode: { + validate: (0, _utils.assertOneOf)(..._placeholders.PLACEHOLDERS) + } + }, (0, _core.patternLikeCommon)()) + }); + defineType("V8IntrinsicIdentifier", { + builder: ["name"], + fields: { + name: { + validate: (0, _utils.assertValueType)("string") + } + } + }); + + + return misc; +} + +var experimental = {}; + +var hasRequiredExperimental; + +function requireExperimental () { + if (hasRequiredExperimental) return experimental; + hasRequiredExperimental = 1; + + var _utils = requireUtils(); + (0, _utils.default)("ArgumentPlaceholder", {}); + (0, _utils.default)("BindExpression", { + visitor: ["object", "callee"], + aliases: ["Expression"], + fields: !process.env.BABEL_TYPES_8_BREAKING ? { + object: { + validate: Object.assign(() => {}, { + oneOfNodeTypes: ["Expression"] + }) + }, + callee: { + validate: Object.assign(() => {}, { + oneOfNodeTypes: ["Expression"] + }) + } + } : { + object: { + validate: (0, _utils.assertNodeType)("Expression") + }, + callee: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + (0, _utils.default)("ImportAttribute", { + visitor: ["key", "value"], + fields: { + key: { + validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral") + }, + value: { + validate: (0, _utils.assertNodeType)("StringLiteral") + } + } + }); + (0, _utils.default)("Decorator", { + visitor: ["expression"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + } + }); + (0, _utils.default)("DoExpression", { + visitor: ["body"], + builder: ["body", "async"], + aliases: ["Expression"], + fields: { + body: { + validate: (0, _utils.assertNodeType)("BlockStatement") + }, + async: { + validate: (0, _utils.assertValueType)("boolean"), + default: false + } + } + }); + (0, _utils.default)("ExportDefaultSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { + exported: { + validate: (0, _utils.assertNodeType)("Identifier") + } + } + }); + (0, _utils.default)("RecordExpression", { + visitor: ["properties"], + aliases: ["Expression"], + fields: { + properties: (0, _utils.validateArrayOfType)("ObjectProperty", "SpreadElement") + } + }); + (0, _utils.default)("TupleExpression", { + fields: { + elements: { + validate: (0, _utils.arrayOfType)("Expression", "SpreadElement"), + default: [] + } + }, + visitor: ["elements"], + aliases: ["Expression"] + }); + { + (0, _utils.default)("DecimalLiteral", { + builder: ["value"], + fields: { + value: { + validate: (0, _utils.assertValueType)("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }); + } + (0, _utils.default)("ModuleExpression", { + visitor: ["body"], + fields: { + body: { + validate: (0, _utils.assertNodeType)("Program") + } + }, + aliases: ["Expression"] + }); + (0, _utils.default)("TopicReference", { + aliases: ["Expression"] + }); + (0, _utils.default)("PipelineTopicExpression", { + builder: ["expression"], + visitor: ["expression"], + fields: { + expression: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Expression"] + }); + (0, _utils.default)("PipelineBareFunction", { + builder: ["callee"], + visitor: ["callee"], + fields: { + callee: { + validate: (0, _utils.assertNodeType)("Expression") + } + }, + aliases: ["Expression"] + }); + (0, _utils.default)("PipelinePrimaryTopicReference", { + aliases: ["Expression"] + }); + + + return experimental; +} + +var typescript = {}; + +var hasRequiredTypescript; + +function requireTypescript () { + if (hasRequiredTypescript) return typescript; + hasRequiredTypescript = 1; + + var _utils = requireUtils(); + var _core = requireCore(); + var _is = requireIs(); + const defineType = (0, _utils.defineAliasedType)("TypeScript"); + const bool = (0, _utils.assertValueType)("boolean"); + const tSFunctionTypeAnnotationCommon = () => ({ + returnType: { + validate: (0, _utils.assertNodeType)("TSTypeAnnotation", "Noop"), + optional: true + }, + typeParameters: { + validate: (0, _utils.assertNodeType)("TSTypeParameterDeclaration", "Noop"), + optional: true + } + }); + defineType("TSParameterProperty", { + aliases: ["LVal"], + visitor: ["parameter"], + fields: { + accessibility: { + validate: (0, _utils.assertOneOf)("public", "private", "protected"), + optional: true + }, + readonly: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + parameter: { + validate: (0, _utils.assertNodeType)("Identifier", "AssignmentPattern") + }, + override: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + decorators: { + validate: (0, _utils.arrayOfType)("Decorator"), + optional: true + } + } + }); + defineType("TSDeclareFunction", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "typeParameters", "params", "returnType"], + fields: Object.assign({}, (0, _core.functionDeclarationCommon)(), tSFunctionTypeAnnotationCommon()) + }); + defineType("TSDeclareMethod", { + visitor: ["decorators", "key", "typeParameters", "params", "returnType"], + fields: Object.assign({}, (0, _core.classMethodOrDeclareMethodCommon)(), tSFunctionTypeAnnotationCommon()) + }); + defineType("TSQualifiedName", { + aliases: ["TSEntityName"], + visitor: ["left", "right"], + fields: { + left: (0, _utils.validateType)("TSEntityName"), + right: (0, _utils.validateType)("Identifier") + } + }); + const signatureDeclarationCommon = () => ({ + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"), + ["parameters"]: (0, _utils.validateArrayOfType)("ArrayPattern", "Identifier", "ObjectPattern", "RestElement"), + ["typeAnnotation"]: (0, _utils.validateOptionalType)("TSTypeAnnotation") + }); + const callConstructSignatureDeclaration = { + aliases: ["TSTypeElement"], + visitor: ["typeParameters", "parameters", "typeAnnotation"], + fields: signatureDeclarationCommon() + }; + defineType("TSCallSignatureDeclaration", callConstructSignatureDeclaration); + defineType("TSConstructSignatureDeclaration", callConstructSignatureDeclaration); + const namedTypeElementCommon = () => ({ + key: (0, _utils.validateType)("Expression"), + computed: { + default: false + }, + optional: (0, _utils.validateOptional)(bool) + }); + defineType("TSPropertySignature", { + aliases: ["TSTypeElement"], + visitor: ["key", "typeAnnotation"], + fields: Object.assign({}, namedTypeElementCommon(), { + readonly: (0, _utils.validateOptional)(bool), + typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"), + kind: { + validate: (0, _utils.assertOneOf)("get", "set") + } + }) + }); + defineType("TSMethodSignature", { + aliases: ["TSTypeElement"], + visitor: ["key", "typeParameters", "parameters", "typeAnnotation"], + fields: Object.assign({}, signatureDeclarationCommon(), namedTypeElementCommon(), { + kind: { + validate: (0, _utils.assertOneOf)("method", "get", "set") + } + }) + }); + defineType("TSIndexSignature", { + aliases: ["TSTypeElement"], + visitor: ["parameters", "typeAnnotation"], + fields: { + readonly: (0, _utils.validateOptional)(bool), + static: (0, _utils.validateOptional)(bool), + parameters: (0, _utils.validateArrayOfType)("Identifier"), + typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation") + } + }); + const tsKeywordTypes = ["TSAnyKeyword", "TSBooleanKeyword", "TSBigIntKeyword", "TSIntrinsicKeyword", "TSNeverKeyword", "TSNullKeyword", "TSNumberKeyword", "TSObjectKeyword", "TSStringKeyword", "TSSymbolKeyword", "TSUndefinedKeyword", "TSUnknownKeyword", "TSVoidKeyword"]; + for (const type of tsKeywordTypes) { + defineType(type, { + aliases: ["TSType", "TSBaseType"], + visitor: [], + fields: {} + }); + } + defineType("TSThisType", { + aliases: ["TSType", "TSBaseType"], + visitor: [], + fields: {} + }); + const fnOrCtrBase = { + aliases: ["TSType"], + visitor: ["typeParameters", "parameters", "typeAnnotation"] + }; + defineType("TSFunctionType", Object.assign({}, fnOrCtrBase, { + fields: signatureDeclarationCommon() + })); + defineType("TSConstructorType", Object.assign({}, fnOrCtrBase, { + fields: Object.assign({}, signatureDeclarationCommon(), { + abstract: (0, _utils.validateOptional)(bool) + }) + })); + defineType("TSTypeReference", { + aliases: ["TSType"], + visitor: ["typeName", "typeParameters"], + fields: { + typeName: (0, _utils.validateType)("TSEntityName"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }); + defineType("TSTypePredicate", { + aliases: ["TSType"], + visitor: ["parameterName", "typeAnnotation"], + builder: ["parameterName", "typeAnnotation", "asserts"], + fields: { + parameterName: (0, _utils.validateType)("Identifier", "TSThisType"), + typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"), + asserts: (0, _utils.validateOptional)(bool) + } + }); + defineType("TSTypeQuery", { + aliases: ["TSType"], + visitor: ["exprName", "typeParameters"], + fields: { + exprName: (0, _utils.validateType)("TSEntityName", "TSImportType"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }); + defineType("TSTypeLiteral", { + aliases: ["TSType"], + visitor: ["members"], + fields: { + members: (0, _utils.validateArrayOfType)("TSTypeElement") + } + }); + defineType("TSArrayType", { + aliases: ["TSType"], + visitor: ["elementType"], + fields: { + elementType: (0, _utils.validateType)("TSType") + } + }); + defineType("TSTupleType", { + aliases: ["TSType"], + visitor: ["elementTypes"], + fields: { + elementTypes: (0, _utils.validateArrayOfType)("TSType", "TSNamedTupleMember") + } + }); + defineType("TSOptionalType", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSRestType", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSNamedTupleMember", { + visitor: ["label", "elementType"], + builder: ["label", "elementType", "optional"], + fields: { + label: (0, _utils.validateType)("Identifier"), + optional: { + validate: bool, + default: false + }, + elementType: (0, _utils.validateType)("TSType") + } + }); + const unionOrIntersection = { + aliases: ["TSType"], + visitor: ["types"], + fields: { + types: (0, _utils.validateArrayOfType)("TSType") + } + }; + defineType("TSUnionType", unionOrIntersection); + defineType("TSIntersectionType", unionOrIntersection); + defineType("TSConditionalType", { + aliases: ["TSType"], + visitor: ["checkType", "extendsType", "trueType", "falseType"], + fields: { + checkType: (0, _utils.validateType)("TSType"), + extendsType: (0, _utils.validateType)("TSType"), + trueType: (0, _utils.validateType)("TSType"), + falseType: (0, _utils.validateType)("TSType") + } + }); + defineType("TSInferType", { + aliases: ["TSType"], + visitor: ["typeParameter"], + fields: { + typeParameter: (0, _utils.validateType)("TSTypeParameter") + } + }); + defineType("TSParenthesizedType", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSTypeOperator", { + aliases: ["TSType"], + visitor: ["typeAnnotation"], + fields: { + operator: (0, _utils.validate)((0, _utils.assertValueType)("string")), + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSIndexedAccessType", { + aliases: ["TSType"], + visitor: ["objectType", "indexType"], + fields: { + objectType: (0, _utils.validateType)("TSType"), + indexType: (0, _utils.validateType)("TSType") + } + }); + defineType("TSMappedType", { + aliases: ["TSType"], + visitor: ["typeParameter", "nameType", "typeAnnotation"], + builder: ["typeParameter", "typeAnnotation", "nameType"], + fields: Object.assign({}, { + typeParameter: (0, _utils.validateType)("TSTypeParameter") + }, { + readonly: (0, _utils.validateOptional)((0, _utils.assertOneOf)(true, false, "+", "-")), + optional: (0, _utils.validateOptional)((0, _utils.assertOneOf)(true, false, "+", "-")), + typeAnnotation: (0, _utils.validateOptionalType)("TSType"), + nameType: (0, _utils.validateOptionalType)("TSType") + }) + }); + defineType("TSLiteralType", { + aliases: ["TSType", "TSBaseType"], + visitor: ["literal"], + fields: { + literal: { + validate: function () { + const unaryExpression = (0, _utils.assertNodeType)("NumericLiteral", "BigIntLiteral"); + const unaryOperator = (0, _utils.assertOneOf)("-"); + const literal = (0, _utils.assertNodeType)("NumericLiteral", "StringLiteral", "BooleanLiteral", "BigIntLiteral", "TemplateLiteral"); + function validator(parent, key, node) { + if ((0, _is.default)("UnaryExpression", node)) { + unaryOperator(node, "operator", node.operator); + unaryExpression(node, "argument", node.argument); + } else { + literal(parent, key, node); + } + } + validator.oneOfNodeTypes = ["NumericLiteral", "StringLiteral", "BooleanLiteral", "BigIntLiteral", "TemplateLiteral", "UnaryExpression"]; + return validator; + }() + } + } + }); + const expressionWithTypeArguments = { + aliases: ["TSType"], + visitor: ["expression", "typeParameters"], + fields: { + expression: (0, _utils.validateType)("TSEntityName"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }; + { + defineType("TSExpressionWithTypeArguments", expressionWithTypeArguments); + } + defineType("TSInterfaceDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "typeParameters", "extends", "body"], + fields: { + declare: (0, _utils.validateOptional)(bool), + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"), + extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("TSExpressionWithTypeArguments")), + body: (0, _utils.validateType)("TSInterfaceBody") + } + }); + defineType("TSInterfaceBody", { + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("TSTypeElement") + } + }); + defineType("TSTypeAliasDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "typeParameters", "typeAnnotation"], + fields: { + declare: (0, _utils.validateOptional)(bool), + id: (0, _utils.validateType)("Identifier"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"), + typeAnnotation: (0, _utils.validateType)("TSType") + } + }); + defineType("TSInstantiationExpression", { + aliases: ["Expression"], + visitor: ["expression", "typeParameters"], + fields: { + expression: (0, _utils.validateType)("Expression"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation") + } + }); + const TSTypeExpression = { + aliases: ["Expression", "LVal", "PatternLike"], + visitor: ["expression", "typeAnnotation"], + fields: { + expression: (0, _utils.validateType)("Expression"), + typeAnnotation: (0, _utils.validateType)("TSType") + } + }; + defineType("TSAsExpression", TSTypeExpression); + defineType("TSSatisfiesExpression", TSTypeExpression); + defineType("TSTypeAssertion", { + aliases: ["Expression", "LVal", "PatternLike"], + visitor: ["typeAnnotation", "expression"], + fields: { + typeAnnotation: (0, _utils.validateType)("TSType"), + expression: (0, _utils.validateType)("Expression") + } + }); + defineType("TSEnumDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "members"], + fields: { + declare: (0, _utils.validateOptional)(bool), + const: (0, _utils.validateOptional)(bool), + id: (0, _utils.validateType)("Identifier"), + members: (0, _utils.validateArrayOfType)("TSEnumMember"), + initializer: (0, _utils.validateOptionalType)("Expression") + } + }); + defineType("TSEnumMember", { + visitor: ["id", "initializer"], + fields: { + id: (0, _utils.validateType)("Identifier", "StringLiteral"), + initializer: (0, _utils.validateOptionalType)("Expression") + } + }); + defineType("TSModuleDeclaration", { + aliases: ["Statement", "Declaration"], + visitor: ["id", "body"], + fields: Object.assign({ + kind: { + validate: (0, _utils.assertOneOf)("global", "module", "namespace") + }, + declare: (0, _utils.validateOptional)(bool) + }, { + global: (0, _utils.validateOptional)(bool) + }, { + id: (0, _utils.validateType)("Identifier", "StringLiteral"), + body: (0, _utils.validateType)("TSModuleBlock", "TSModuleDeclaration") + }) + }); + defineType("TSModuleBlock", { + aliases: ["Scopable", "Block", "BlockParent", "FunctionParent"], + visitor: ["body"], + fields: { + body: (0, _utils.validateArrayOfType)("Statement") + } + }); + defineType("TSImportType", { + aliases: ["TSType"], + visitor: ["argument", "qualifier", "typeParameters"], + fields: { + argument: (0, _utils.validateType)("StringLiteral"), + qualifier: (0, _utils.validateOptionalType)("TSEntityName"), + typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation"), + options: { + validate: (0, _utils.assertNodeType)("Expression"), + optional: true + } + } + }); + defineType("TSImportEqualsDeclaration", { + aliases: ["Statement"], + visitor: ["id", "moduleReference"], + fields: { + isExport: (0, _utils.validate)(bool), + id: (0, _utils.validateType)("Identifier"), + moduleReference: (0, _utils.validateType)("TSEntityName", "TSExternalModuleReference"), + importKind: { + validate: (0, _utils.assertOneOf)("type", "value"), + optional: true + } + } + }); + defineType("TSExternalModuleReference", { + visitor: ["expression"], + fields: { + expression: (0, _utils.validateType)("StringLiteral") + } + }); + defineType("TSNonNullExpression", { + aliases: ["Expression", "LVal", "PatternLike"], + visitor: ["expression"], + fields: { + expression: (0, _utils.validateType)("Expression") + } + }); + defineType("TSExportAssignment", { + aliases: ["Statement"], + visitor: ["expression"], + fields: { + expression: (0, _utils.validateType)("Expression") + } + }); + defineType("TSNamespaceExportDeclaration", { + aliases: ["Statement"], + visitor: ["id"], + fields: { + id: (0, _utils.validateType)("Identifier") + } + }); + defineType("TSTypeAnnotation", { + visitor: ["typeAnnotation"], + fields: { + typeAnnotation: { + validate: (0, _utils.assertNodeType)("TSType") + } + } + }); + defineType("TSTypeParameterInstantiation", { + visitor: ["params"], + fields: { + params: (0, _utils.validateArrayOfType)("TSType") + } + }); + defineType("TSTypeParameterDeclaration", { + visitor: ["params"], + fields: { + params: (0, _utils.validateArrayOfType)("TSTypeParameter") + } + }); + defineType("TSTypeParameter", { + builder: ["constraint", "default", "name"], + visitor: ["constraint", "default"], + fields: { + name: { + validate: (0, _utils.assertValueType)("string") + }, + in: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + out: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + const: { + validate: (0, _utils.assertValueType)("boolean"), + optional: true + }, + constraint: { + validate: (0, _utils.assertNodeType)("TSType"), + optional: true + }, + default: { + validate: (0, _utils.assertNodeType)("TSType"), + optional: true + } + } + }); + + + return typescript; +} + +var deprecatedAliases = {}; + +var hasRequiredDeprecatedAliases; + +function requireDeprecatedAliases () { + if (hasRequiredDeprecatedAliases) return deprecatedAliases; + hasRequiredDeprecatedAliases = 1; + + Object.defineProperty(deprecatedAliases, "__esModule", { + value: true + }); + deprecatedAliases.DEPRECATED_ALIASES = void 0; + deprecatedAliases.DEPRECATED_ALIASES = { + ModuleDeclaration: "ImportOrExportDeclaration" + }; + + + return deprecatedAliases; +} + +var hasRequiredDefinitions; + +function requireDefinitions () { + if (hasRequiredDefinitions) return definitions; + hasRequiredDefinitions = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "ALIAS_KEYS", { + enumerable: true, + get: function () { + return _utils.ALIAS_KEYS; + } + }); + Object.defineProperty(exports, "BUILDER_KEYS", { + enumerable: true, + get: function () { + return _utils.BUILDER_KEYS; + } + }); + Object.defineProperty(exports, "DEPRECATED_ALIASES", { + enumerable: true, + get: function () { + return _deprecatedAliases.DEPRECATED_ALIASES; + } + }); + Object.defineProperty(exports, "DEPRECATED_KEYS", { + enumerable: true, + get: function () { + return _utils.DEPRECATED_KEYS; + } + }); + Object.defineProperty(exports, "FLIPPED_ALIAS_KEYS", { + enumerable: true, + get: function () { + return _utils.FLIPPED_ALIAS_KEYS; + } + }); + Object.defineProperty(exports, "NODE_FIELDS", { + enumerable: true, + get: function () { + return _utils.NODE_FIELDS; + } + }); + Object.defineProperty(exports, "NODE_PARENT_VALIDATIONS", { + enumerable: true, + get: function () { + return _utils.NODE_PARENT_VALIDATIONS; + } + }); + Object.defineProperty(exports, "PLACEHOLDERS", { + enumerable: true, + get: function () { + return _placeholders.PLACEHOLDERS; + } + }); + Object.defineProperty(exports, "PLACEHOLDERS_ALIAS", { + enumerable: true, + get: function () { + return _placeholders.PLACEHOLDERS_ALIAS; + } + }); + Object.defineProperty(exports, "PLACEHOLDERS_FLIPPED_ALIAS", { + enumerable: true, + get: function () { + return _placeholders.PLACEHOLDERS_FLIPPED_ALIAS; + } + }); + exports.TYPES = void 0; + Object.defineProperty(exports, "VISITOR_KEYS", { + enumerable: true, + get: function () { + return _utils.VISITOR_KEYS; + } + }); + requireCore(); + requireFlow(); + requireJsx(); + requireMisc(); + requireExperimental(); + requireTypescript(); + var _utils = requireUtils(); + var _placeholders = requirePlaceholders(); + var _deprecatedAliases = requireDeprecatedAliases(); + Object.keys(_deprecatedAliases.DEPRECATED_ALIASES).forEach(deprecatedAlias => { + _utils.FLIPPED_ALIAS_KEYS[deprecatedAlias] = _utils.FLIPPED_ALIAS_KEYS[_deprecatedAliases.DEPRECATED_ALIASES[deprecatedAlias]]; + }); + exports.TYPES = [].concat(Object.keys(_utils.VISITOR_KEYS), Object.keys(_utils.FLIPPED_ALIAS_KEYS), Object.keys(_utils.DEPRECATED_KEYS)); + + +} (definitions)); + return definitions; +} + +var hasRequiredValidate; + +function requireValidate () { + if (hasRequiredValidate) return validate$1; + hasRequiredValidate = 1; + + Object.defineProperty(validate$1, "__esModule", { + value: true + }); + validate$1.default = validate; + validate$1.validateChild = validateChild; + validate$1.validateField = validateField; + validate$1.validateInternal = validateInternal; + var _index = requireDefinitions(); + function validate(node, key, val) { + if (!node) return; + const fields = _index.NODE_FIELDS[node.type]; + if (!fields) return; + const field = fields[key]; + validateField(node, key, val, field); + validateChild(node, key, val); + } + function validateInternal(field, node, key, val, maybeNode) { + if (!(field != null && field.validate)) return; + if (field.optional && val == null) return; + field.validate(node, key, val); + if (maybeNode) { + var _NODE_PARENT_VALIDATI; + const type = val.type; + if (type == null) return; + (_NODE_PARENT_VALIDATI = _index.NODE_PARENT_VALIDATIONS[type]) == null || _NODE_PARENT_VALIDATI.call(_index.NODE_PARENT_VALIDATIONS, node, key, val); + } + } + function validateField(node, key, val, field) { + if (!(field != null && field.validate)) return; + if (field.optional && val == null) return; + field.validate(node, key, val); + } + function validateChild(node, key, val) { + var _NODE_PARENT_VALIDATI2; + const type = val == null ? void 0 : val.type; + if (type == null) return; + (_NODE_PARENT_VALIDATI2 = _index.NODE_PARENT_VALIDATIONS[type]) == null || _NODE_PARENT_VALIDATI2.call(_index.NODE_PARENT_VALIDATIONS, node, key, val); + } + + + return validate$1; +} + +var hasRequiredGenerated$2; + +function requireGenerated$2 () { + if (hasRequiredGenerated$2) return generated$2; + hasRequiredGenerated$2 = 1; + + Object.defineProperty(generated$2, "__esModule", { + value: true + }); + generated$2.anyTypeAnnotation = anyTypeAnnotation; + generated$2.argumentPlaceholder = argumentPlaceholder; + generated$2.arrayExpression = arrayExpression; + generated$2.arrayPattern = arrayPattern; + generated$2.arrayTypeAnnotation = arrayTypeAnnotation; + generated$2.arrowFunctionExpression = arrowFunctionExpression; + generated$2.assignmentExpression = assignmentExpression; + generated$2.assignmentPattern = assignmentPattern; + generated$2.awaitExpression = awaitExpression; + generated$2.bigIntLiteral = bigIntLiteral; + generated$2.binaryExpression = binaryExpression; + generated$2.bindExpression = bindExpression; + generated$2.blockStatement = blockStatement; + generated$2.booleanLiteral = booleanLiteral; + generated$2.booleanLiteralTypeAnnotation = booleanLiteralTypeAnnotation; + generated$2.booleanTypeAnnotation = booleanTypeAnnotation; + generated$2.breakStatement = breakStatement; + generated$2.callExpression = callExpression; + generated$2.catchClause = catchClause; + generated$2.classAccessorProperty = classAccessorProperty; + generated$2.classBody = classBody; + generated$2.classDeclaration = classDeclaration; + generated$2.classExpression = classExpression; + generated$2.classImplements = classImplements; + generated$2.classMethod = classMethod; + generated$2.classPrivateMethod = classPrivateMethod; + generated$2.classPrivateProperty = classPrivateProperty; + generated$2.classProperty = classProperty; + generated$2.conditionalExpression = conditionalExpression; + generated$2.continueStatement = continueStatement; + generated$2.debuggerStatement = debuggerStatement; + generated$2.decimalLiteral = decimalLiteral; + generated$2.declareClass = declareClass; + generated$2.declareExportAllDeclaration = declareExportAllDeclaration; + generated$2.declareExportDeclaration = declareExportDeclaration; + generated$2.declareFunction = declareFunction; + generated$2.declareInterface = declareInterface; + generated$2.declareModule = declareModule; + generated$2.declareModuleExports = declareModuleExports; + generated$2.declareOpaqueType = declareOpaqueType; + generated$2.declareTypeAlias = declareTypeAlias; + generated$2.declareVariable = declareVariable; + generated$2.declaredPredicate = declaredPredicate; + generated$2.decorator = decorator; + generated$2.directive = directive; + generated$2.directiveLiteral = directiveLiteral; + generated$2.doExpression = doExpression; + generated$2.doWhileStatement = doWhileStatement; + generated$2.emptyStatement = emptyStatement; + generated$2.emptyTypeAnnotation = emptyTypeAnnotation; + generated$2.enumBooleanBody = enumBooleanBody; + generated$2.enumBooleanMember = enumBooleanMember; + generated$2.enumDeclaration = enumDeclaration; + generated$2.enumDefaultedMember = enumDefaultedMember; + generated$2.enumNumberBody = enumNumberBody; + generated$2.enumNumberMember = enumNumberMember; + generated$2.enumStringBody = enumStringBody; + generated$2.enumStringMember = enumStringMember; + generated$2.enumSymbolBody = enumSymbolBody; + generated$2.existsTypeAnnotation = existsTypeAnnotation; + generated$2.exportAllDeclaration = exportAllDeclaration; + generated$2.exportDefaultDeclaration = exportDefaultDeclaration; + generated$2.exportDefaultSpecifier = exportDefaultSpecifier; + generated$2.exportNamedDeclaration = exportNamedDeclaration; + generated$2.exportNamespaceSpecifier = exportNamespaceSpecifier; + generated$2.exportSpecifier = exportSpecifier; + generated$2.expressionStatement = expressionStatement; + generated$2.file = file; + generated$2.forInStatement = forInStatement; + generated$2.forOfStatement = forOfStatement; + generated$2.forStatement = forStatement; + generated$2.functionDeclaration = functionDeclaration; + generated$2.functionExpression = functionExpression; + generated$2.functionTypeAnnotation = functionTypeAnnotation; + generated$2.functionTypeParam = functionTypeParam; + generated$2.genericTypeAnnotation = genericTypeAnnotation; + generated$2.identifier = identifier; + generated$2.ifStatement = ifStatement; + generated$2.import = _import; + generated$2.importAttribute = importAttribute; + generated$2.importDeclaration = importDeclaration; + generated$2.importDefaultSpecifier = importDefaultSpecifier; + generated$2.importExpression = importExpression; + generated$2.importNamespaceSpecifier = importNamespaceSpecifier; + generated$2.importSpecifier = importSpecifier; + generated$2.indexedAccessType = indexedAccessType; + generated$2.inferredPredicate = inferredPredicate; + generated$2.interfaceDeclaration = interfaceDeclaration; + generated$2.interfaceExtends = interfaceExtends; + generated$2.interfaceTypeAnnotation = interfaceTypeAnnotation; + generated$2.interpreterDirective = interpreterDirective; + generated$2.intersectionTypeAnnotation = intersectionTypeAnnotation; + generated$2.jSXAttribute = generated$2.jsxAttribute = jsxAttribute; + generated$2.jSXClosingElement = generated$2.jsxClosingElement = jsxClosingElement; + generated$2.jSXClosingFragment = generated$2.jsxClosingFragment = jsxClosingFragment; + generated$2.jSXElement = generated$2.jsxElement = jsxElement; + generated$2.jSXEmptyExpression = generated$2.jsxEmptyExpression = jsxEmptyExpression; + generated$2.jSXExpressionContainer = generated$2.jsxExpressionContainer = jsxExpressionContainer; + generated$2.jSXFragment = generated$2.jsxFragment = jsxFragment; + generated$2.jSXIdentifier = generated$2.jsxIdentifier = jsxIdentifier; + generated$2.jSXMemberExpression = generated$2.jsxMemberExpression = jsxMemberExpression; + generated$2.jSXNamespacedName = generated$2.jsxNamespacedName = jsxNamespacedName; + generated$2.jSXOpeningElement = generated$2.jsxOpeningElement = jsxOpeningElement; + generated$2.jSXOpeningFragment = generated$2.jsxOpeningFragment = jsxOpeningFragment; + generated$2.jSXSpreadAttribute = generated$2.jsxSpreadAttribute = jsxSpreadAttribute; + generated$2.jSXSpreadChild = generated$2.jsxSpreadChild = jsxSpreadChild; + generated$2.jSXText = generated$2.jsxText = jsxText; + generated$2.labeledStatement = labeledStatement; + generated$2.logicalExpression = logicalExpression; + generated$2.memberExpression = memberExpression; + generated$2.metaProperty = metaProperty; + generated$2.mixedTypeAnnotation = mixedTypeAnnotation; + generated$2.moduleExpression = moduleExpression; + generated$2.newExpression = newExpression; + generated$2.noop = noop; + generated$2.nullLiteral = nullLiteral; + generated$2.nullLiteralTypeAnnotation = nullLiteralTypeAnnotation; + generated$2.nullableTypeAnnotation = nullableTypeAnnotation; + generated$2.numberLiteral = NumberLiteral; + generated$2.numberLiteralTypeAnnotation = numberLiteralTypeAnnotation; + generated$2.numberTypeAnnotation = numberTypeAnnotation; + generated$2.numericLiteral = numericLiteral; + generated$2.objectExpression = objectExpression; + generated$2.objectMethod = objectMethod; + generated$2.objectPattern = objectPattern; + generated$2.objectProperty = objectProperty; + generated$2.objectTypeAnnotation = objectTypeAnnotation; + generated$2.objectTypeCallProperty = objectTypeCallProperty; + generated$2.objectTypeIndexer = objectTypeIndexer; + generated$2.objectTypeInternalSlot = objectTypeInternalSlot; + generated$2.objectTypeProperty = objectTypeProperty; + generated$2.objectTypeSpreadProperty = objectTypeSpreadProperty; + generated$2.opaqueType = opaqueType; + generated$2.optionalCallExpression = optionalCallExpression; + generated$2.optionalIndexedAccessType = optionalIndexedAccessType; + generated$2.optionalMemberExpression = optionalMemberExpression; + generated$2.parenthesizedExpression = parenthesizedExpression; + generated$2.pipelineBareFunction = pipelineBareFunction; + generated$2.pipelinePrimaryTopicReference = pipelinePrimaryTopicReference; + generated$2.pipelineTopicExpression = pipelineTopicExpression; + generated$2.placeholder = placeholder; + generated$2.privateName = privateName; + generated$2.program = program; + generated$2.qualifiedTypeIdentifier = qualifiedTypeIdentifier; + generated$2.recordExpression = recordExpression; + generated$2.regExpLiteral = regExpLiteral; + generated$2.regexLiteral = RegexLiteral; + generated$2.restElement = restElement; + generated$2.restProperty = RestProperty; + generated$2.returnStatement = returnStatement; + generated$2.sequenceExpression = sequenceExpression; + generated$2.spreadElement = spreadElement; + generated$2.spreadProperty = SpreadProperty; + generated$2.staticBlock = staticBlock; + generated$2.stringLiteral = stringLiteral; + generated$2.stringLiteralTypeAnnotation = stringLiteralTypeAnnotation; + generated$2.stringTypeAnnotation = stringTypeAnnotation; + generated$2.super = _super; + generated$2.switchCase = switchCase; + generated$2.switchStatement = switchStatement; + generated$2.symbolTypeAnnotation = symbolTypeAnnotation; + generated$2.taggedTemplateExpression = taggedTemplateExpression; + generated$2.templateElement = templateElement; + generated$2.templateLiteral = templateLiteral; + generated$2.thisExpression = thisExpression; + generated$2.thisTypeAnnotation = thisTypeAnnotation; + generated$2.throwStatement = throwStatement; + generated$2.topicReference = topicReference; + generated$2.tryStatement = tryStatement; + generated$2.tSAnyKeyword = generated$2.tsAnyKeyword = tsAnyKeyword; + generated$2.tSArrayType = generated$2.tsArrayType = tsArrayType; + generated$2.tSAsExpression = generated$2.tsAsExpression = tsAsExpression; + generated$2.tSBigIntKeyword = generated$2.tsBigIntKeyword = tsBigIntKeyword; + generated$2.tSBooleanKeyword = generated$2.tsBooleanKeyword = tsBooleanKeyword; + generated$2.tSCallSignatureDeclaration = generated$2.tsCallSignatureDeclaration = tsCallSignatureDeclaration; + generated$2.tSConditionalType = generated$2.tsConditionalType = tsConditionalType; + generated$2.tSConstructSignatureDeclaration = generated$2.tsConstructSignatureDeclaration = tsConstructSignatureDeclaration; + generated$2.tSConstructorType = generated$2.tsConstructorType = tsConstructorType; + generated$2.tSDeclareFunction = generated$2.tsDeclareFunction = tsDeclareFunction; + generated$2.tSDeclareMethod = generated$2.tsDeclareMethod = tsDeclareMethod; + generated$2.tSEnumDeclaration = generated$2.tsEnumDeclaration = tsEnumDeclaration; + generated$2.tSEnumMember = generated$2.tsEnumMember = tsEnumMember; + generated$2.tSExportAssignment = generated$2.tsExportAssignment = tsExportAssignment; + generated$2.tSExpressionWithTypeArguments = generated$2.tsExpressionWithTypeArguments = tsExpressionWithTypeArguments; + generated$2.tSExternalModuleReference = generated$2.tsExternalModuleReference = tsExternalModuleReference; + generated$2.tSFunctionType = generated$2.tsFunctionType = tsFunctionType; + generated$2.tSImportEqualsDeclaration = generated$2.tsImportEqualsDeclaration = tsImportEqualsDeclaration; + generated$2.tSImportType = generated$2.tsImportType = tsImportType; + generated$2.tSIndexSignature = generated$2.tsIndexSignature = tsIndexSignature; + generated$2.tSIndexedAccessType = generated$2.tsIndexedAccessType = tsIndexedAccessType; + generated$2.tSInferType = generated$2.tsInferType = tsInferType; + generated$2.tSInstantiationExpression = generated$2.tsInstantiationExpression = tsInstantiationExpression; + generated$2.tSInterfaceBody = generated$2.tsInterfaceBody = tsInterfaceBody; + generated$2.tSInterfaceDeclaration = generated$2.tsInterfaceDeclaration = tsInterfaceDeclaration; + generated$2.tSIntersectionType = generated$2.tsIntersectionType = tsIntersectionType; + generated$2.tSIntrinsicKeyword = generated$2.tsIntrinsicKeyword = tsIntrinsicKeyword; + generated$2.tSLiteralType = generated$2.tsLiteralType = tsLiteralType; + generated$2.tSMappedType = generated$2.tsMappedType = tsMappedType; + generated$2.tSMethodSignature = generated$2.tsMethodSignature = tsMethodSignature; + generated$2.tSModuleBlock = generated$2.tsModuleBlock = tsModuleBlock; + generated$2.tSModuleDeclaration = generated$2.tsModuleDeclaration = tsModuleDeclaration; + generated$2.tSNamedTupleMember = generated$2.tsNamedTupleMember = tsNamedTupleMember; + generated$2.tSNamespaceExportDeclaration = generated$2.tsNamespaceExportDeclaration = tsNamespaceExportDeclaration; + generated$2.tSNeverKeyword = generated$2.tsNeverKeyword = tsNeverKeyword; + generated$2.tSNonNullExpression = generated$2.tsNonNullExpression = tsNonNullExpression; + generated$2.tSNullKeyword = generated$2.tsNullKeyword = tsNullKeyword; + generated$2.tSNumberKeyword = generated$2.tsNumberKeyword = tsNumberKeyword; + generated$2.tSObjectKeyword = generated$2.tsObjectKeyword = tsObjectKeyword; + generated$2.tSOptionalType = generated$2.tsOptionalType = tsOptionalType; + generated$2.tSParameterProperty = generated$2.tsParameterProperty = tsParameterProperty; + generated$2.tSParenthesizedType = generated$2.tsParenthesizedType = tsParenthesizedType; + generated$2.tSPropertySignature = generated$2.tsPropertySignature = tsPropertySignature; + generated$2.tSQualifiedName = generated$2.tsQualifiedName = tsQualifiedName; + generated$2.tSRestType = generated$2.tsRestType = tsRestType; + generated$2.tSSatisfiesExpression = generated$2.tsSatisfiesExpression = tsSatisfiesExpression; + generated$2.tSStringKeyword = generated$2.tsStringKeyword = tsStringKeyword; + generated$2.tSSymbolKeyword = generated$2.tsSymbolKeyword = tsSymbolKeyword; + generated$2.tSThisType = generated$2.tsThisType = tsThisType; + generated$2.tSTupleType = generated$2.tsTupleType = tsTupleType; + generated$2.tSTypeAliasDeclaration = generated$2.tsTypeAliasDeclaration = tsTypeAliasDeclaration; + generated$2.tSTypeAnnotation = generated$2.tsTypeAnnotation = tsTypeAnnotation; + generated$2.tSTypeAssertion = generated$2.tsTypeAssertion = tsTypeAssertion; + generated$2.tSTypeLiteral = generated$2.tsTypeLiteral = tsTypeLiteral; + generated$2.tSTypeOperator = generated$2.tsTypeOperator = tsTypeOperator; + generated$2.tSTypeParameter = generated$2.tsTypeParameter = tsTypeParameter; + generated$2.tSTypeParameterDeclaration = generated$2.tsTypeParameterDeclaration = tsTypeParameterDeclaration; + generated$2.tSTypeParameterInstantiation = generated$2.tsTypeParameterInstantiation = tsTypeParameterInstantiation; + generated$2.tSTypePredicate = generated$2.tsTypePredicate = tsTypePredicate; + generated$2.tSTypeQuery = generated$2.tsTypeQuery = tsTypeQuery; + generated$2.tSTypeReference = generated$2.tsTypeReference = tsTypeReference; + generated$2.tSUndefinedKeyword = generated$2.tsUndefinedKeyword = tsUndefinedKeyword; + generated$2.tSUnionType = generated$2.tsUnionType = tsUnionType; + generated$2.tSUnknownKeyword = generated$2.tsUnknownKeyword = tsUnknownKeyword; + generated$2.tSVoidKeyword = generated$2.tsVoidKeyword = tsVoidKeyword; + generated$2.tupleExpression = tupleExpression; + generated$2.tupleTypeAnnotation = tupleTypeAnnotation; + generated$2.typeAlias = typeAlias; + generated$2.typeAnnotation = typeAnnotation; + generated$2.typeCastExpression = typeCastExpression; + generated$2.typeParameter = typeParameter; + generated$2.typeParameterDeclaration = typeParameterDeclaration; + generated$2.typeParameterInstantiation = typeParameterInstantiation; + generated$2.typeofTypeAnnotation = typeofTypeAnnotation; + generated$2.unaryExpression = unaryExpression; + generated$2.unionTypeAnnotation = unionTypeAnnotation; + generated$2.updateExpression = updateExpression; + generated$2.v8IntrinsicIdentifier = v8IntrinsicIdentifier; + generated$2.variableDeclaration = variableDeclaration; + generated$2.variableDeclarator = variableDeclarator; + generated$2.variance = variance; + generated$2.voidTypeAnnotation = voidTypeAnnotation; + generated$2.whileStatement = whileStatement; + generated$2.withStatement = withStatement; + generated$2.yieldExpression = yieldExpression; + var _validate = requireValidate(); + var _deprecationWarning = requireDeprecationWarning(); + var utils = requireUtils(); + const { + validateInternal: validate + } = _validate; + const { + NODE_FIELDS + } = utils; + function arrayExpression(elements = []) { + const node = { + type: "ArrayExpression", + elements + }; + const defs = NODE_FIELDS.ArrayExpression; + validate(defs.elements, node, "elements", elements, 1); + return node; + } + function assignmentExpression(operator, left, right) { + const node = { + type: "AssignmentExpression", + operator, + left, + right + }; + const defs = NODE_FIELDS.AssignmentExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function binaryExpression(operator, left, right) { + const node = { + type: "BinaryExpression", + operator, + left, + right + }; + const defs = NODE_FIELDS.BinaryExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function interpreterDirective(value) { + const node = { + type: "InterpreterDirective", + value + }; + const defs = NODE_FIELDS.InterpreterDirective; + validate(defs.value, node, "value", value); + return node; + } + function directive(value) { + const node = { + type: "Directive", + value + }; + const defs = NODE_FIELDS.Directive; + validate(defs.value, node, "value", value, 1); + return node; + } + function directiveLiteral(value) { + const node = { + type: "DirectiveLiteral", + value + }; + const defs = NODE_FIELDS.DirectiveLiteral; + validate(defs.value, node, "value", value); + return node; + } + function blockStatement(body, directives = []) { + const node = { + type: "BlockStatement", + body, + directives + }; + const defs = NODE_FIELDS.BlockStatement; + validate(defs.body, node, "body", body, 1); + validate(defs.directives, node, "directives", directives, 1); + return node; + } + function breakStatement(label = null) { + const node = { + type: "BreakStatement", + label + }; + const defs = NODE_FIELDS.BreakStatement; + validate(defs.label, node, "label", label, 1); + return node; + } + function callExpression(callee, _arguments) { + const node = { + type: "CallExpression", + callee, + arguments: _arguments + }; + const defs = NODE_FIELDS.CallExpression; + validate(defs.callee, node, "callee", callee, 1); + validate(defs.arguments, node, "arguments", _arguments, 1); + return node; + } + function catchClause(param = null, body) { + const node = { + type: "CatchClause", + param, + body + }; + const defs = NODE_FIELDS.CatchClause; + validate(defs.param, node, "param", param, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function conditionalExpression(test, consequent, alternate) { + const node = { + type: "ConditionalExpression", + test, + consequent, + alternate + }; + const defs = NODE_FIELDS.ConditionalExpression; + validate(defs.test, node, "test", test, 1); + validate(defs.consequent, node, "consequent", consequent, 1); + validate(defs.alternate, node, "alternate", alternate, 1); + return node; + } + function continueStatement(label = null) { + const node = { + type: "ContinueStatement", + label + }; + const defs = NODE_FIELDS.ContinueStatement; + validate(defs.label, node, "label", label, 1); + return node; + } + function debuggerStatement() { + return { + type: "DebuggerStatement" + }; + } + function doWhileStatement(test, body) { + const node = { + type: "DoWhileStatement", + test, + body + }; + const defs = NODE_FIELDS.DoWhileStatement; + validate(defs.test, node, "test", test, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function emptyStatement() { + return { + type: "EmptyStatement" + }; + } + function expressionStatement(expression) { + const node = { + type: "ExpressionStatement", + expression + }; + const defs = NODE_FIELDS.ExpressionStatement; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function file(program, comments = null, tokens = null) { + const node = { + type: "File", + program, + comments, + tokens + }; + const defs = NODE_FIELDS.File; + validate(defs.program, node, "program", program, 1); + validate(defs.comments, node, "comments", comments, 1); + validate(defs.tokens, node, "tokens", tokens); + return node; + } + function forInStatement(left, right, body) { + const node = { + type: "ForInStatement", + left, + right, + body + }; + const defs = NODE_FIELDS.ForInStatement; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function forStatement(init = null, test = null, update = null, body) { + const node = { + type: "ForStatement", + init, + test, + update, + body + }; + const defs = NODE_FIELDS.ForStatement; + validate(defs.init, node, "init", init, 1); + validate(defs.test, node, "test", test, 1); + validate(defs.update, node, "update", update, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function functionDeclaration(id = null, params, body, generator = false, async = false) { + const node = { + type: "FunctionDeclaration", + id, + params, + body, + generator, + async + }; + const defs = NODE_FIELDS.FunctionDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function functionExpression(id = null, params, body, generator = false, async = false) { + const node = { + type: "FunctionExpression", + id, + params, + body, + generator, + async + }; + const defs = NODE_FIELDS.FunctionExpression; + validate(defs.id, node, "id", id, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function identifier(name) { + const node = { + type: "Identifier", + name + }; + const defs = NODE_FIELDS.Identifier; + validate(defs.name, node, "name", name); + return node; + } + function ifStatement(test, consequent, alternate = null) { + const node = { + type: "IfStatement", + test, + consequent, + alternate + }; + const defs = NODE_FIELDS.IfStatement; + validate(defs.test, node, "test", test, 1); + validate(defs.consequent, node, "consequent", consequent, 1); + validate(defs.alternate, node, "alternate", alternate, 1); + return node; + } + function labeledStatement(label, body) { + const node = { + type: "LabeledStatement", + label, + body + }; + const defs = NODE_FIELDS.LabeledStatement; + validate(defs.label, node, "label", label, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function stringLiteral(value) { + const node = { + type: "StringLiteral", + value + }; + const defs = NODE_FIELDS.StringLiteral; + validate(defs.value, node, "value", value); + return node; + } + function numericLiteral(value) { + const node = { + type: "NumericLiteral", + value + }; + const defs = NODE_FIELDS.NumericLiteral; + validate(defs.value, node, "value", value); + return node; + } + function nullLiteral() { + return { + type: "NullLiteral" + }; + } + function booleanLiteral(value) { + const node = { + type: "BooleanLiteral", + value + }; + const defs = NODE_FIELDS.BooleanLiteral; + validate(defs.value, node, "value", value); + return node; + } + function regExpLiteral(pattern, flags = "") { + const node = { + type: "RegExpLiteral", + pattern, + flags + }; + const defs = NODE_FIELDS.RegExpLiteral; + validate(defs.pattern, node, "pattern", pattern); + validate(defs.flags, node, "flags", flags); + return node; + } + function logicalExpression(operator, left, right) { + const node = { + type: "LogicalExpression", + operator, + left, + right + }; + const defs = NODE_FIELDS.LogicalExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function memberExpression(object, property, computed = false, optional = null) { + const node = { + type: "MemberExpression", + object, + property, + computed, + optional + }; + const defs = NODE_FIELDS.MemberExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.property, node, "property", property, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.optional, node, "optional", optional); + return node; + } + function newExpression(callee, _arguments) { + const node = { + type: "NewExpression", + callee, + arguments: _arguments + }; + const defs = NODE_FIELDS.NewExpression; + validate(defs.callee, node, "callee", callee, 1); + validate(defs.arguments, node, "arguments", _arguments, 1); + return node; + } + function program(body, directives = [], sourceType = "script", interpreter = null) { + const node = { + type: "Program", + body, + directives, + sourceType, + interpreter + }; + const defs = NODE_FIELDS.Program; + validate(defs.body, node, "body", body, 1); + validate(defs.directives, node, "directives", directives, 1); + validate(defs.sourceType, node, "sourceType", sourceType); + validate(defs.interpreter, node, "interpreter", interpreter, 1); + return node; + } + function objectExpression(properties) { + const node = { + type: "ObjectExpression", + properties + }; + const defs = NODE_FIELDS.ObjectExpression; + validate(defs.properties, node, "properties", properties, 1); + return node; + } + function objectMethod(kind = "method", key, params, body, computed = false, generator = false, async = false) { + const node = { + type: "ObjectMethod", + kind, + key, + params, + body, + computed, + generator, + async + }; + const defs = NODE_FIELDS.ObjectMethod; + validate(defs.kind, node, "kind", kind); + validate(defs.key, node, "key", key, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function objectProperty(key, value, computed = false, shorthand = false, decorators = null) { + const node = { + type: "ObjectProperty", + key, + value, + computed, + shorthand, + decorators + }; + const defs = NODE_FIELDS.ObjectProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.shorthand, node, "shorthand", shorthand); + validate(defs.decorators, node, "decorators", decorators, 1); + return node; + } + function restElement(argument) { + const node = { + type: "RestElement", + argument + }; + const defs = NODE_FIELDS.RestElement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function returnStatement(argument = null) { + const node = { + type: "ReturnStatement", + argument + }; + const defs = NODE_FIELDS.ReturnStatement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function sequenceExpression(expressions) { + const node = { + type: "SequenceExpression", + expressions + }; + const defs = NODE_FIELDS.SequenceExpression; + validate(defs.expressions, node, "expressions", expressions, 1); + return node; + } + function parenthesizedExpression(expression) { + const node = { + type: "ParenthesizedExpression", + expression + }; + const defs = NODE_FIELDS.ParenthesizedExpression; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function switchCase(test = null, consequent) { + const node = { + type: "SwitchCase", + test, + consequent + }; + const defs = NODE_FIELDS.SwitchCase; + validate(defs.test, node, "test", test, 1); + validate(defs.consequent, node, "consequent", consequent, 1); + return node; + } + function switchStatement(discriminant, cases) { + const node = { + type: "SwitchStatement", + discriminant, + cases + }; + const defs = NODE_FIELDS.SwitchStatement; + validate(defs.discriminant, node, "discriminant", discriminant, 1); + validate(defs.cases, node, "cases", cases, 1); + return node; + } + function thisExpression() { + return { + type: "ThisExpression" + }; + } + function throwStatement(argument) { + const node = { + type: "ThrowStatement", + argument + }; + const defs = NODE_FIELDS.ThrowStatement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function tryStatement(block, handler = null, finalizer = null) { + const node = { + type: "TryStatement", + block, + handler, + finalizer + }; + const defs = NODE_FIELDS.TryStatement; + validate(defs.block, node, "block", block, 1); + validate(defs.handler, node, "handler", handler, 1); + validate(defs.finalizer, node, "finalizer", finalizer, 1); + return node; + } + function unaryExpression(operator, argument, prefix = true) { + const node = { + type: "UnaryExpression", + operator, + argument, + prefix + }; + const defs = NODE_FIELDS.UnaryExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.argument, node, "argument", argument, 1); + validate(defs.prefix, node, "prefix", prefix); + return node; + } + function updateExpression(operator, argument, prefix = false) { + const node = { + type: "UpdateExpression", + operator, + argument, + prefix + }; + const defs = NODE_FIELDS.UpdateExpression; + validate(defs.operator, node, "operator", operator); + validate(defs.argument, node, "argument", argument, 1); + validate(defs.prefix, node, "prefix", prefix); + return node; + } + function variableDeclaration(kind, declarations) { + const node = { + type: "VariableDeclaration", + kind, + declarations + }; + const defs = NODE_FIELDS.VariableDeclaration; + validate(defs.kind, node, "kind", kind); + validate(defs.declarations, node, "declarations", declarations, 1); + return node; + } + function variableDeclarator(id, init = null) { + const node = { + type: "VariableDeclarator", + id, + init + }; + const defs = NODE_FIELDS.VariableDeclarator; + validate(defs.id, node, "id", id, 1); + validate(defs.init, node, "init", init, 1); + return node; + } + function whileStatement(test, body) { + const node = { + type: "WhileStatement", + test, + body + }; + const defs = NODE_FIELDS.WhileStatement; + validate(defs.test, node, "test", test, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function withStatement(object, body) { + const node = { + type: "WithStatement", + object, + body + }; + const defs = NODE_FIELDS.WithStatement; + validate(defs.object, node, "object", object, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function assignmentPattern(left, right) { + const node = { + type: "AssignmentPattern", + left, + right + }; + const defs = NODE_FIELDS.AssignmentPattern; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function arrayPattern(elements) { + const node = { + type: "ArrayPattern", + elements + }; + const defs = NODE_FIELDS.ArrayPattern; + validate(defs.elements, node, "elements", elements, 1); + return node; + } + function arrowFunctionExpression(params, body, async = false) { + const node = { + type: "ArrowFunctionExpression", + params, + body, + async, + expression: null + }; + const defs = NODE_FIELDS.ArrowFunctionExpression; + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.async, node, "async", async); + return node; + } + function classBody(body) { + const node = { + type: "ClassBody", + body + }; + const defs = NODE_FIELDS.ClassBody; + validate(defs.body, node, "body", body, 1); + return node; + } + function classExpression(id = null, superClass = null, body, decorators = null) { + const node = { + type: "ClassExpression", + id, + superClass, + body, + decorators + }; + const defs = NODE_FIELDS.ClassExpression; + validate(defs.id, node, "id", id, 1); + validate(defs.superClass, node, "superClass", superClass, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + return node; + } + function classDeclaration(id = null, superClass = null, body, decorators = null) { + const node = { + type: "ClassDeclaration", + id, + superClass, + body, + decorators + }; + const defs = NODE_FIELDS.ClassDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.superClass, node, "superClass", superClass, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + return node; + } + function exportAllDeclaration(source) { + const node = { + type: "ExportAllDeclaration", + source + }; + const defs = NODE_FIELDS.ExportAllDeclaration; + validate(defs.source, node, "source", source, 1); + return node; + } + function exportDefaultDeclaration(declaration) { + const node = { + type: "ExportDefaultDeclaration", + declaration + }; + const defs = NODE_FIELDS.ExportDefaultDeclaration; + validate(defs.declaration, node, "declaration", declaration, 1); + return node; + } + function exportNamedDeclaration(declaration = null, specifiers = [], source = null) { + const node = { + type: "ExportNamedDeclaration", + declaration, + specifiers, + source + }; + const defs = NODE_FIELDS.ExportNamedDeclaration; + validate(defs.declaration, node, "declaration", declaration, 1); + validate(defs.specifiers, node, "specifiers", specifiers, 1); + validate(defs.source, node, "source", source, 1); + return node; + } + function exportSpecifier(local, exported) { + const node = { + type: "ExportSpecifier", + local, + exported + }; + const defs = NODE_FIELDS.ExportSpecifier; + validate(defs.local, node, "local", local, 1); + validate(defs.exported, node, "exported", exported, 1); + return node; + } + function forOfStatement(left, right, body, _await = false) { + const node = { + type: "ForOfStatement", + left, + right, + body, + await: _await + }; + const defs = NODE_FIELDS.ForOfStatement; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.await, node, "await", _await); + return node; + } + function importDeclaration(specifiers, source) { + const node = { + type: "ImportDeclaration", + specifiers, + source + }; + const defs = NODE_FIELDS.ImportDeclaration; + validate(defs.specifiers, node, "specifiers", specifiers, 1); + validate(defs.source, node, "source", source, 1); + return node; + } + function importDefaultSpecifier(local) { + const node = { + type: "ImportDefaultSpecifier", + local + }; + const defs = NODE_FIELDS.ImportDefaultSpecifier; + validate(defs.local, node, "local", local, 1); + return node; + } + function importNamespaceSpecifier(local) { + const node = { + type: "ImportNamespaceSpecifier", + local + }; + const defs = NODE_FIELDS.ImportNamespaceSpecifier; + validate(defs.local, node, "local", local, 1); + return node; + } + function importSpecifier(local, imported) { + const node = { + type: "ImportSpecifier", + local, + imported + }; + const defs = NODE_FIELDS.ImportSpecifier; + validate(defs.local, node, "local", local, 1); + validate(defs.imported, node, "imported", imported, 1); + return node; + } + function importExpression(source, options = null) { + const node = { + type: "ImportExpression", + source, + options + }; + const defs = NODE_FIELDS.ImportExpression; + validate(defs.source, node, "source", source, 1); + validate(defs.options, node, "options", options, 1); + return node; + } + function metaProperty(meta, property) { + const node = { + type: "MetaProperty", + meta, + property + }; + const defs = NODE_FIELDS.MetaProperty; + validate(defs.meta, node, "meta", meta, 1); + validate(defs.property, node, "property", property, 1); + return node; + } + function classMethod(kind = "method", key, params, body, computed = false, _static = false, generator = false, async = false) { + const node = { + type: "ClassMethod", + kind, + key, + params, + body, + computed, + static: _static, + generator, + async + }; + const defs = NODE_FIELDS.ClassMethod; + validate(defs.kind, node, "kind", kind); + validate(defs.key, node, "key", key, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.static, node, "static", _static); + validate(defs.generator, node, "generator", generator); + validate(defs.async, node, "async", async); + return node; + } + function objectPattern(properties) { + const node = { + type: "ObjectPattern", + properties + }; + const defs = NODE_FIELDS.ObjectPattern; + validate(defs.properties, node, "properties", properties, 1); + return node; + } + function spreadElement(argument) { + const node = { + type: "SpreadElement", + argument + }; + const defs = NODE_FIELDS.SpreadElement; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function _super() { + return { + type: "Super" + }; + } + function taggedTemplateExpression(tag, quasi) { + const node = { + type: "TaggedTemplateExpression", + tag, + quasi + }; + const defs = NODE_FIELDS.TaggedTemplateExpression; + validate(defs.tag, node, "tag", tag, 1); + validate(defs.quasi, node, "quasi", quasi, 1); + return node; + } + function templateElement(value, tail = false) { + const node = { + type: "TemplateElement", + value, + tail + }; + const defs = NODE_FIELDS.TemplateElement; + validate(defs.value, node, "value", value); + validate(defs.tail, node, "tail", tail); + return node; + } + function templateLiteral(quasis, expressions) { + const node = { + type: "TemplateLiteral", + quasis, + expressions + }; + const defs = NODE_FIELDS.TemplateLiteral; + validate(defs.quasis, node, "quasis", quasis, 1); + validate(defs.expressions, node, "expressions", expressions, 1); + return node; + } + function yieldExpression(argument = null, delegate = false) { + const node = { + type: "YieldExpression", + argument, + delegate + }; + const defs = NODE_FIELDS.YieldExpression; + validate(defs.argument, node, "argument", argument, 1); + validate(defs.delegate, node, "delegate", delegate); + return node; + } + function awaitExpression(argument) { + const node = { + type: "AwaitExpression", + argument + }; + const defs = NODE_FIELDS.AwaitExpression; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function _import() { + return { + type: "Import" + }; + } + function bigIntLiteral(value) { + const node = { + type: "BigIntLiteral", + value + }; + const defs = NODE_FIELDS.BigIntLiteral; + validate(defs.value, node, "value", value); + return node; + } + function exportNamespaceSpecifier(exported) { + const node = { + type: "ExportNamespaceSpecifier", + exported + }; + const defs = NODE_FIELDS.ExportNamespaceSpecifier; + validate(defs.exported, node, "exported", exported, 1); + return node; + } + function optionalMemberExpression(object, property, computed = false, optional) { + const node = { + type: "OptionalMemberExpression", + object, + property, + computed, + optional + }; + const defs = NODE_FIELDS.OptionalMemberExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.property, node, "property", property, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.optional, node, "optional", optional); + return node; + } + function optionalCallExpression(callee, _arguments, optional) { + const node = { + type: "OptionalCallExpression", + callee, + arguments: _arguments, + optional + }; + const defs = NODE_FIELDS.OptionalCallExpression; + validate(defs.callee, node, "callee", callee, 1); + validate(defs.arguments, node, "arguments", _arguments, 1); + validate(defs.optional, node, "optional", optional); + return node; + } + function classProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) { + const node = { + type: "ClassProperty", + key, + value, + typeAnnotation, + decorators, + computed, + static: _static + }; + const defs = NODE_FIELDS.ClassProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.static, node, "static", _static); + return node; + } + function classAccessorProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) { + const node = { + type: "ClassAccessorProperty", + key, + value, + typeAnnotation, + decorators, + computed, + static: _static + }; + const defs = NODE_FIELDS.ClassAccessorProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.computed, node, "computed", computed); + validate(defs.static, node, "static", _static); + return node; + } + function classPrivateProperty(key, value = null, decorators = null, _static = false) { + const node = { + type: "ClassPrivateProperty", + key, + value, + decorators, + static: _static + }; + const defs = NODE_FIELDS.ClassPrivateProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.static, node, "static", _static); + return node; + } + function classPrivateMethod(kind = "method", key, params, body, _static = false) { + const node = { + type: "ClassPrivateMethod", + kind, + key, + params, + body, + static: _static + }; + const defs = NODE_FIELDS.ClassPrivateMethod; + validate(defs.kind, node, "kind", kind); + validate(defs.key, node, "key", key, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.static, node, "static", _static); + return node; + } + function privateName(id) { + const node = { + type: "PrivateName", + id + }; + const defs = NODE_FIELDS.PrivateName; + validate(defs.id, node, "id", id, 1); + return node; + } + function staticBlock(body) { + const node = { + type: "StaticBlock", + body + }; + const defs = NODE_FIELDS.StaticBlock; + validate(defs.body, node, "body", body, 1); + return node; + } + function anyTypeAnnotation() { + return { + type: "AnyTypeAnnotation" + }; + } + function arrayTypeAnnotation(elementType) { + const node = { + type: "ArrayTypeAnnotation", + elementType + }; + const defs = NODE_FIELDS.ArrayTypeAnnotation; + validate(defs.elementType, node, "elementType", elementType, 1); + return node; + } + function booleanTypeAnnotation() { + return { + type: "BooleanTypeAnnotation" + }; + } + function booleanLiteralTypeAnnotation(value) { + const node = { + type: "BooleanLiteralTypeAnnotation", + value + }; + const defs = NODE_FIELDS.BooleanLiteralTypeAnnotation; + validate(defs.value, node, "value", value); + return node; + } + function nullLiteralTypeAnnotation() { + return { + type: "NullLiteralTypeAnnotation" + }; + } + function classImplements(id, typeParameters = null) { + const node = { + type: "ClassImplements", + id, + typeParameters + }; + const defs = NODE_FIELDS.ClassImplements; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function declareClass(id, typeParameters = null, _extends = null, body) { + const node = { + type: "DeclareClass", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.DeclareClass; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function declareFunction(id) { + const node = { + type: "DeclareFunction", + id + }; + const defs = NODE_FIELDS.DeclareFunction; + validate(defs.id, node, "id", id, 1); + return node; + } + function declareInterface(id, typeParameters = null, _extends = null, body) { + const node = { + type: "DeclareInterface", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.DeclareInterface; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function declareModule(id, body, kind = null) { + const node = { + type: "DeclareModule", + id, + body, + kind + }; + const defs = NODE_FIELDS.DeclareModule; + validate(defs.id, node, "id", id, 1); + validate(defs.body, node, "body", body, 1); + validate(defs.kind, node, "kind", kind); + return node; + } + function declareModuleExports(typeAnnotation) { + const node = { + type: "DeclareModuleExports", + typeAnnotation + }; + const defs = NODE_FIELDS.DeclareModuleExports; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function declareTypeAlias(id, typeParameters = null, right) { + const node = { + type: "DeclareTypeAlias", + id, + typeParameters, + right + }; + const defs = NODE_FIELDS.DeclareTypeAlias; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function declareOpaqueType(id, typeParameters = null, supertype = null) { + const node = { + type: "DeclareOpaqueType", + id, + typeParameters, + supertype + }; + const defs = NODE_FIELDS.DeclareOpaqueType; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.supertype, node, "supertype", supertype, 1); + return node; + } + function declareVariable(id) { + const node = { + type: "DeclareVariable", + id + }; + const defs = NODE_FIELDS.DeclareVariable; + validate(defs.id, node, "id", id, 1); + return node; + } + function declareExportDeclaration(declaration = null, specifiers = null, source = null, attributes = null) { + const node = { + type: "DeclareExportDeclaration", + declaration, + specifiers, + source, + attributes + }; + const defs = NODE_FIELDS.DeclareExportDeclaration; + validate(defs.declaration, node, "declaration", declaration, 1); + validate(defs.specifiers, node, "specifiers", specifiers, 1); + validate(defs.source, node, "source", source, 1); + validate(defs.attributes, node, "attributes", attributes, 1); + return node; + } + function declareExportAllDeclaration(source, attributes = null) { + const node = { + type: "DeclareExportAllDeclaration", + source, + attributes + }; + const defs = NODE_FIELDS.DeclareExportAllDeclaration; + validate(defs.source, node, "source", source, 1); + validate(defs.attributes, node, "attributes", attributes, 1); + return node; + } + function declaredPredicate(value) { + const node = { + type: "DeclaredPredicate", + value + }; + const defs = NODE_FIELDS.DeclaredPredicate; + validate(defs.value, node, "value", value, 1); + return node; + } + function existsTypeAnnotation() { + return { + type: "ExistsTypeAnnotation" + }; + } + function functionTypeAnnotation(typeParameters = null, params, rest = null, returnType) { + const node = { + type: "FunctionTypeAnnotation", + typeParameters, + params, + rest, + returnType + }; + const defs = NODE_FIELDS.FunctionTypeAnnotation; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.rest, node, "rest", rest, 1); + validate(defs.returnType, node, "returnType", returnType, 1); + return node; + } + function functionTypeParam(name = null, typeAnnotation) { + const node = { + type: "FunctionTypeParam", + name, + typeAnnotation + }; + const defs = NODE_FIELDS.FunctionTypeParam; + validate(defs.name, node, "name", name, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function genericTypeAnnotation(id, typeParameters = null) { + const node = { + type: "GenericTypeAnnotation", + id, + typeParameters + }; + const defs = NODE_FIELDS.GenericTypeAnnotation; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function inferredPredicate() { + return { + type: "InferredPredicate" + }; + } + function interfaceExtends(id, typeParameters = null) { + const node = { + type: "InterfaceExtends", + id, + typeParameters + }; + const defs = NODE_FIELDS.InterfaceExtends; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function interfaceDeclaration(id, typeParameters = null, _extends = null, body) { + const node = { + type: "InterfaceDeclaration", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.InterfaceDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function interfaceTypeAnnotation(_extends = null, body) { + const node = { + type: "InterfaceTypeAnnotation", + extends: _extends, + body + }; + const defs = NODE_FIELDS.InterfaceTypeAnnotation; + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function intersectionTypeAnnotation(types) { + const node = { + type: "IntersectionTypeAnnotation", + types + }; + const defs = NODE_FIELDS.IntersectionTypeAnnotation; + validate(defs.types, node, "types", types, 1); + return node; + } + function mixedTypeAnnotation() { + return { + type: "MixedTypeAnnotation" + }; + } + function emptyTypeAnnotation() { + return { + type: "EmptyTypeAnnotation" + }; + } + function nullableTypeAnnotation(typeAnnotation) { + const node = { + type: "NullableTypeAnnotation", + typeAnnotation + }; + const defs = NODE_FIELDS.NullableTypeAnnotation; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function numberLiteralTypeAnnotation(value) { + const node = { + type: "NumberLiteralTypeAnnotation", + value + }; + const defs = NODE_FIELDS.NumberLiteralTypeAnnotation; + validate(defs.value, node, "value", value); + return node; + } + function numberTypeAnnotation() { + return { + type: "NumberTypeAnnotation" + }; + } + function objectTypeAnnotation(properties, indexers = [], callProperties = [], internalSlots = [], exact = false) { + const node = { + type: "ObjectTypeAnnotation", + properties, + indexers, + callProperties, + internalSlots, + exact + }; + const defs = NODE_FIELDS.ObjectTypeAnnotation; + validate(defs.properties, node, "properties", properties, 1); + validate(defs.indexers, node, "indexers", indexers, 1); + validate(defs.callProperties, node, "callProperties", callProperties, 1); + validate(defs.internalSlots, node, "internalSlots", internalSlots, 1); + validate(defs.exact, node, "exact", exact); + return node; + } + function objectTypeInternalSlot(id, value, optional, _static, method) { + const node = { + type: "ObjectTypeInternalSlot", + id, + value, + optional, + static: _static, + method + }; + const defs = NODE_FIELDS.ObjectTypeInternalSlot; + validate(defs.id, node, "id", id, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.optional, node, "optional", optional); + validate(defs.static, node, "static", _static); + validate(defs.method, node, "method", method); + return node; + } + function objectTypeCallProperty(value) { + const node = { + type: "ObjectTypeCallProperty", + value, + static: null + }; + const defs = NODE_FIELDS.ObjectTypeCallProperty; + validate(defs.value, node, "value", value, 1); + return node; + } + function objectTypeIndexer(id = null, key, value, variance = null) { + const node = { + type: "ObjectTypeIndexer", + id, + key, + value, + variance, + static: null + }; + const defs = NODE_FIELDS.ObjectTypeIndexer; + validate(defs.id, node, "id", id, 1); + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.variance, node, "variance", variance, 1); + return node; + } + function objectTypeProperty(key, value, variance = null) { + const node = { + type: "ObjectTypeProperty", + key, + value, + variance, + kind: null, + method: null, + optional: null, + proto: null, + static: null + }; + const defs = NODE_FIELDS.ObjectTypeProperty; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + validate(defs.variance, node, "variance", variance, 1); + return node; + } + function objectTypeSpreadProperty(argument) { + const node = { + type: "ObjectTypeSpreadProperty", + argument + }; + const defs = NODE_FIELDS.ObjectTypeSpreadProperty; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function opaqueType(id, typeParameters = null, supertype = null, impltype) { + const node = { + type: "OpaqueType", + id, + typeParameters, + supertype, + impltype + }; + const defs = NODE_FIELDS.OpaqueType; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.supertype, node, "supertype", supertype, 1); + validate(defs.impltype, node, "impltype", impltype, 1); + return node; + } + function qualifiedTypeIdentifier(id, qualification) { + const node = { + type: "QualifiedTypeIdentifier", + id, + qualification + }; + const defs = NODE_FIELDS.QualifiedTypeIdentifier; + validate(defs.id, node, "id", id, 1); + validate(defs.qualification, node, "qualification", qualification, 1); + return node; + } + function stringLiteralTypeAnnotation(value) { + const node = { + type: "StringLiteralTypeAnnotation", + value + }; + const defs = NODE_FIELDS.StringLiteralTypeAnnotation; + validate(defs.value, node, "value", value); + return node; + } + function stringTypeAnnotation() { + return { + type: "StringTypeAnnotation" + }; + } + function symbolTypeAnnotation() { + return { + type: "SymbolTypeAnnotation" + }; + } + function thisTypeAnnotation() { + return { + type: "ThisTypeAnnotation" + }; + } + function tupleTypeAnnotation(types) { + const node = { + type: "TupleTypeAnnotation", + types + }; + const defs = NODE_FIELDS.TupleTypeAnnotation; + validate(defs.types, node, "types", types, 1); + return node; + } + function typeofTypeAnnotation(argument) { + const node = { + type: "TypeofTypeAnnotation", + argument + }; + const defs = NODE_FIELDS.TypeofTypeAnnotation; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function typeAlias(id, typeParameters = null, right) { + const node = { + type: "TypeAlias", + id, + typeParameters, + right + }; + const defs = NODE_FIELDS.TypeAlias; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function typeAnnotation(typeAnnotation) { + const node = { + type: "TypeAnnotation", + typeAnnotation + }; + const defs = NODE_FIELDS.TypeAnnotation; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function typeCastExpression(expression, typeAnnotation) { + const node = { + type: "TypeCastExpression", + expression, + typeAnnotation + }; + const defs = NODE_FIELDS.TypeCastExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function typeParameter(bound = null, _default = null, variance = null) { + const node = { + type: "TypeParameter", + bound, + default: _default, + variance, + name: null + }; + const defs = NODE_FIELDS.TypeParameter; + validate(defs.bound, node, "bound", bound, 1); + validate(defs.default, node, "default", _default, 1); + validate(defs.variance, node, "variance", variance, 1); + return node; + } + function typeParameterDeclaration(params) { + const node = { + type: "TypeParameterDeclaration", + params + }; + const defs = NODE_FIELDS.TypeParameterDeclaration; + validate(defs.params, node, "params", params, 1); + return node; + } + function typeParameterInstantiation(params) { + const node = { + type: "TypeParameterInstantiation", + params + }; + const defs = NODE_FIELDS.TypeParameterInstantiation; + validate(defs.params, node, "params", params, 1); + return node; + } + function unionTypeAnnotation(types) { + const node = { + type: "UnionTypeAnnotation", + types + }; + const defs = NODE_FIELDS.UnionTypeAnnotation; + validate(defs.types, node, "types", types, 1); + return node; + } + function variance(kind) { + const node = { + type: "Variance", + kind + }; + const defs = NODE_FIELDS.Variance; + validate(defs.kind, node, "kind", kind); + return node; + } + function voidTypeAnnotation() { + return { + type: "VoidTypeAnnotation" + }; + } + function enumDeclaration(id, body) { + const node = { + type: "EnumDeclaration", + id, + body + }; + const defs = NODE_FIELDS.EnumDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function enumBooleanBody(members) { + const node = { + type: "EnumBooleanBody", + members, + explicitType: null, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumBooleanBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumNumberBody(members) { + const node = { + type: "EnumNumberBody", + members, + explicitType: null, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumNumberBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumStringBody(members) { + const node = { + type: "EnumStringBody", + members, + explicitType: null, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumStringBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumSymbolBody(members) { + const node = { + type: "EnumSymbolBody", + members, + hasUnknownMembers: null + }; + const defs = NODE_FIELDS.EnumSymbolBody; + validate(defs.members, node, "members", members, 1); + return node; + } + function enumBooleanMember(id) { + const node = { + type: "EnumBooleanMember", + id, + init: null + }; + const defs = NODE_FIELDS.EnumBooleanMember; + validate(defs.id, node, "id", id, 1); + return node; + } + function enumNumberMember(id, init) { + const node = { + type: "EnumNumberMember", + id, + init + }; + const defs = NODE_FIELDS.EnumNumberMember; + validate(defs.id, node, "id", id, 1); + validate(defs.init, node, "init", init, 1); + return node; + } + function enumStringMember(id, init) { + const node = { + type: "EnumStringMember", + id, + init + }; + const defs = NODE_FIELDS.EnumStringMember; + validate(defs.id, node, "id", id, 1); + validate(defs.init, node, "init", init, 1); + return node; + } + function enumDefaultedMember(id) { + const node = { + type: "EnumDefaultedMember", + id + }; + const defs = NODE_FIELDS.EnumDefaultedMember; + validate(defs.id, node, "id", id, 1); + return node; + } + function indexedAccessType(objectType, indexType) { + const node = { + type: "IndexedAccessType", + objectType, + indexType + }; + const defs = NODE_FIELDS.IndexedAccessType; + validate(defs.objectType, node, "objectType", objectType, 1); + validate(defs.indexType, node, "indexType", indexType, 1); + return node; + } + function optionalIndexedAccessType(objectType, indexType) { + const node = { + type: "OptionalIndexedAccessType", + objectType, + indexType, + optional: null + }; + const defs = NODE_FIELDS.OptionalIndexedAccessType; + validate(defs.objectType, node, "objectType", objectType, 1); + validate(defs.indexType, node, "indexType", indexType, 1); + return node; + } + function jsxAttribute(name, value = null) { + const node = { + type: "JSXAttribute", + name, + value + }; + const defs = NODE_FIELDS.JSXAttribute; + validate(defs.name, node, "name", name, 1); + validate(defs.value, node, "value", value, 1); + return node; + } + function jsxClosingElement(name) { + const node = { + type: "JSXClosingElement", + name + }; + const defs = NODE_FIELDS.JSXClosingElement; + validate(defs.name, node, "name", name, 1); + return node; + } + function jsxElement(openingElement, closingElement = null, children, selfClosing = null) { + const node = { + type: "JSXElement", + openingElement, + closingElement, + children, + selfClosing + }; + const defs = NODE_FIELDS.JSXElement; + validate(defs.openingElement, node, "openingElement", openingElement, 1); + validate(defs.closingElement, node, "closingElement", closingElement, 1); + validate(defs.children, node, "children", children, 1); + validate(defs.selfClosing, node, "selfClosing", selfClosing); + return node; + } + function jsxEmptyExpression() { + return { + type: "JSXEmptyExpression" + }; + } + function jsxExpressionContainer(expression) { + const node = { + type: "JSXExpressionContainer", + expression + }; + const defs = NODE_FIELDS.JSXExpressionContainer; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function jsxSpreadChild(expression) { + const node = { + type: "JSXSpreadChild", + expression + }; + const defs = NODE_FIELDS.JSXSpreadChild; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function jsxIdentifier(name) { + const node = { + type: "JSXIdentifier", + name + }; + const defs = NODE_FIELDS.JSXIdentifier; + validate(defs.name, node, "name", name); + return node; + } + function jsxMemberExpression(object, property) { + const node = { + type: "JSXMemberExpression", + object, + property + }; + const defs = NODE_FIELDS.JSXMemberExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.property, node, "property", property, 1); + return node; + } + function jsxNamespacedName(namespace, name) { + const node = { + type: "JSXNamespacedName", + namespace, + name + }; + const defs = NODE_FIELDS.JSXNamespacedName; + validate(defs.namespace, node, "namespace", namespace, 1); + validate(defs.name, node, "name", name, 1); + return node; + } + function jsxOpeningElement(name, attributes, selfClosing = false) { + const node = { + type: "JSXOpeningElement", + name, + attributes, + selfClosing + }; + const defs = NODE_FIELDS.JSXOpeningElement; + validate(defs.name, node, "name", name, 1); + validate(defs.attributes, node, "attributes", attributes, 1); + validate(defs.selfClosing, node, "selfClosing", selfClosing); + return node; + } + function jsxSpreadAttribute(argument) { + const node = { + type: "JSXSpreadAttribute", + argument + }; + const defs = NODE_FIELDS.JSXSpreadAttribute; + validate(defs.argument, node, "argument", argument, 1); + return node; + } + function jsxText(value) { + const node = { + type: "JSXText", + value + }; + const defs = NODE_FIELDS.JSXText; + validate(defs.value, node, "value", value); + return node; + } + function jsxFragment(openingFragment, closingFragment, children) { + const node = { + type: "JSXFragment", + openingFragment, + closingFragment, + children + }; + const defs = NODE_FIELDS.JSXFragment; + validate(defs.openingFragment, node, "openingFragment", openingFragment, 1); + validate(defs.closingFragment, node, "closingFragment", closingFragment, 1); + validate(defs.children, node, "children", children, 1); + return node; + } + function jsxOpeningFragment() { + return { + type: "JSXOpeningFragment" + }; + } + function jsxClosingFragment() { + return { + type: "JSXClosingFragment" + }; + } + function noop() { + return { + type: "Noop" + }; + } + function placeholder(expectedNode, name) { + const node = { + type: "Placeholder", + expectedNode, + name + }; + const defs = NODE_FIELDS.Placeholder; + validate(defs.expectedNode, node, "expectedNode", expectedNode); + validate(defs.name, node, "name", name, 1); + return node; + } + function v8IntrinsicIdentifier(name) { + const node = { + type: "V8IntrinsicIdentifier", + name + }; + const defs = NODE_FIELDS.V8IntrinsicIdentifier; + validate(defs.name, node, "name", name); + return node; + } + function argumentPlaceholder() { + return { + type: "ArgumentPlaceholder" + }; + } + function bindExpression(object, callee) { + const node = { + type: "BindExpression", + object, + callee + }; + const defs = NODE_FIELDS.BindExpression; + validate(defs.object, node, "object", object, 1); + validate(defs.callee, node, "callee", callee, 1); + return node; + } + function importAttribute(key, value) { + const node = { + type: "ImportAttribute", + key, + value + }; + const defs = NODE_FIELDS.ImportAttribute; + validate(defs.key, node, "key", key, 1); + validate(defs.value, node, "value", value, 1); + return node; + } + function decorator(expression) { + const node = { + type: "Decorator", + expression + }; + const defs = NODE_FIELDS.Decorator; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function doExpression(body, async = false) { + const node = { + type: "DoExpression", + body, + async + }; + const defs = NODE_FIELDS.DoExpression; + validate(defs.body, node, "body", body, 1); + validate(defs.async, node, "async", async); + return node; + } + function exportDefaultSpecifier(exported) { + const node = { + type: "ExportDefaultSpecifier", + exported + }; + const defs = NODE_FIELDS.ExportDefaultSpecifier; + validate(defs.exported, node, "exported", exported, 1); + return node; + } + function recordExpression(properties) { + const node = { + type: "RecordExpression", + properties + }; + const defs = NODE_FIELDS.RecordExpression; + validate(defs.properties, node, "properties", properties, 1); + return node; + } + function tupleExpression(elements = []) { + const node = { + type: "TupleExpression", + elements + }; + const defs = NODE_FIELDS.TupleExpression; + validate(defs.elements, node, "elements", elements, 1); + return node; + } + function decimalLiteral(value) { + const node = { + type: "DecimalLiteral", + value + }; + const defs = NODE_FIELDS.DecimalLiteral; + validate(defs.value, node, "value", value); + return node; + } + function moduleExpression(body) { + const node = { + type: "ModuleExpression", + body + }; + const defs = NODE_FIELDS.ModuleExpression; + validate(defs.body, node, "body", body, 1); + return node; + } + function topicReference() { + return { + type: "TopicReference" + }; + } + function pipelineTopicExpression(expression) { + const node = { + type: "PipelineTopicExpression", + expression + }; + const defs = NODE_FIELDS.PipelineTopicExpression; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function pipelineBareFunction(callee) { + const node = { + type: "PipelineBareFunction", + callee + }; + const defs = NODE_FIELDS.PipelineBareFunction; + validate(defs.callee, node, "callee", callee, 1); + return node; + } + function pipelinePrimaryTopicReference() { + return { + type: "PipelinePrimaryTopicReference" + }; + } + function tsParameterProperty(parameter) { + const node = { + type: "TSParameterProperty", + parameter + }; + const defs = NODE_FIELDS.TSParameterProperty; + validate(defs.parameter, node, "parameter", parameter, 1); + return node; + } + function tsDeclareFunction(id = null, typeParameters = null, params, returnType = null) { + const node = { + type: "TSDeclareFunction", + id, + typeParameters, + params, + returnType + }; + const defs = NODE_FIELDS.TSDeclareFunction; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.returnType, node, "returnType", returnType, 1); + return node; + } + function tsDeclareMethod(decorators = null, key, typeParameters = null, params, returnType = null) { + const node = { + type: "TSDeclareMethod", + decorators, + key, + typeParameters, + params, + returnType + }; + const defs = NODE_FIELDS.TSDeclareMethod; + validate(defs.decorators, node, "decorators", decorators, 1); + validate(defs.key, node, "key", key, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.params, node, "params", params, 1); + validate(defs.returnType, node, "returnType", returnType, 1); + return node; + } + function tsQualifiedName(left, right) { + const node = { + type: "TSQualifiedName", + left, + right + }; + const defs = NODE_FIELDS.TSQualifiedName; + validate(defs.left, node, "left", left, 1); + validate(defs.right, node, "right", right, 1); + return node; + } + function tsCallSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSCallSignatureDeclaration", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSCallSignatureDeclaration; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsConstructSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSConstructSignatureDeclaration", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSConstructSignatureDeclaration; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsPropertySignature(key, typeAnnotation = null) { + const node = { + type: "TSPropertySignature", + key, + typeAnnotation, + kind: null + }; + const defs = NODE_FIELDS.TSPropertySignature; + validate(defs.key, node, "key", key, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsMethodSignature(key, typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSMethodSignature", + key, + typeParameters, + parameters, + typeAnnotation, + kind: null + }; + const defs = NODE_FIELDS.TSMethodSignature; + validate(defs.key, node, "key", key, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsIndexSignature(parameters, typeAnnotation = null) { + const node = { + type: "TSIndexSignature", + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSIndexSignature; + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsAnyKeyword() { + return { + type: "TSAnyKeyword" + }; + } + function tsBooleanKeyword() { + return { + type: "TSBooleanKeyword" + }; + } + function tsBigIntKeyword() { + return { + type: "TSBigIntKeyword" + }; + } + function tsIntrinsicKeyword() { + return { + type: "TSIntrinsicKeyword" + }; + } + function tsNeverKeyword() { + return { + type: "TSNeverKeyword" + }; + } + function tsNullKeyword() { + return { + type: "TSNullKeyword" + }; + } + function tsNumberKeyword() { + return { + type: "TSNumberKeyword" + }; + } + function tsObjectKeyword() { + return { + type: "TSObjectKeyword" + }; + } + function tsStringKeyword() { + return { + type: "TSStringKeyword" + }; + } + function tsSymbolKeyword() { + return { + type: "TSSymbolKeyword" + }; + } + function tsUndefinedKeyword() { + return { + type: "TSUndefinedKeyword" + }; + } + function tsUnknownKeyword() { + return { + type: "TSUnknownKeyword" + }; + } + function tsVoidKeyword() { + return { + type: "TSVoidKeyword" + }; + } + function tsThisType() { + return { + type: "TSThisType" + }; + } + function tsFunctionType(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSFunctionType", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSFunctionType; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsConstructorType(typeParameters = null, parameters, typeAnnotation = null) { + const node = { + type: "TSConstructorType", + typeParameters, + parameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSConstructorType; + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.parameters, node, "parameters", parameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeReference(typeName, typeParameters = null) { + const node = { + type: "TSTypeReference", + typeName, + typeParameters + }; + const defs = NODE_FIELDS.TSTypeReference; + validate(defs.typeName, node, "typeName", typeName, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsTypePredicate(parameterName, typeAnnotation = null, asserts = null) { + const node = { + type: "TSTypePredicate", + parameterName, + typeAnnotation, + asserts + }; + const defs = NODE_FIELDS.TSTypePredicate; + validate(defs.parameterName, node, "parameterName", parameterName, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.asserts, node, "asserts", asserts); + return node; + } + function tsTypeQuery(exprName, typeParameters = null) { + const node = { + type: "TSTypeQuery", + exprName, + typeParameters + }; + const defs = NODE_FIELDS.TSTypeQuery; + validate(defs.exprName, node, "exprName", exprName, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsTypeLiteral(members) { + const node = { + type: "TSTypeLiteral", + members + }; + const defs = NODE_FIELDS.TSTypeLiteral; + validate(defs.members, node, "members", members, 1); + return node; + } + function tsArrayType(elementType) { + const node = { + type: "TSArrayType", + elementType + }; + const defs = NODE_FIELDS.TSArrayType; + validate(defs.elementType, node, "elementType", elementType, 1); + return node; + } + function tsTupleType(elementTypes) { + const node = { + type: "TSTupleType", + elementTypes + }; + const defs = NODE_FIELDS.TSTupleType; + validate(defs.elementTypes, node, "elementTypes", elementTypes, 1); + return node; + } + function tsOptionalType(typeAnnotation) { + const node = { + type: "TSOptionalType", + typeAnnotation + }; + const defs = NODE_FIELDS.TSOptionalType; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsRestType(typeAnnotation) { + const node = { + type: "TSRestType", + typeAnnotation + }; + const defs = NODE_FIELDS.TSRestType; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsNamedTupleMember(label, elementType, optional = false) { + const node = { + type: "TSNamedTupleMember", + label, + elementType, + optional + }; + const defs = NODE_FIELDS.TSNamedTupleMember; + validate(defs.label, node, "label", label, 1); + validate(defs.elementType, node, "elementType", elementType, 1); + validate(defs.optional, node, "optional", optional); + return node; + } + function tsUnionType(types) { + const node = { + type: "TSUnionType", + types + }; + const defs = NODE_FIELDS.TSUnionType; + validate(defs.types, node, "types", types, 1); + return node; + } + function tsIntersectionType(types) { + const node = { + type: "TSIntersectionType", + types + }; + const defs = NODE_FIELDS.TSIntersectionType; + validate(defs.types, node, "types", types, 1); + return node; + } + function tsConditionalType(checkType, extendsType, trueType, falseType) { + const node = { + type: "TSConditionalType", + checkType, + extendsType, + trueType, + falseType + }; + const defs = NODE_FIELDS.TSConditionalType; + validate(defs.checkType, node, "checkType", checkType, 1); + validate(defs.extendsType, node, "extendsType", extendsType, 1); + validate(defs.trueType, node, "trueType", trueType, 1); + validate(defs.falseType, node, "falseType", falseType, 1); + return node; + } + function tsInferType(typeParameter) { + const node = { + type: "TSInferType", + typeParameter + }; + const defs = NODE_FIELDS.TSInferType; + validate(defs.typeParameter, node, "typeParameter", typeParameter, 1); + return node; + } + function tsParenthesizedType(typeAnnotation) { + const node = { + type: "TSParenthesizedType", + typeAnnotation + }; + const defs = NODE_FIELDS.TSParenthesizedType; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeOperator(typeAnnotation) { + const node = { + type: "TSTypeOperator", + typeAnnotation, + operator: null + }; + const defs = NODE_FIELDS.TSTypeOperator; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsIndexedAccessType(objectType, indexType) { + const node = { + type: "TSIndexedAccessType", + objectType, + indexType + }; + const defs = NODE_FIELDS.TSIndexedAccessType; + validate(defs.objectType, node, "objectType", objectType, 1); + validate(defs.indexType, node, "indexType", indexType, 1); + return node; + } + function tsMappedType(typeParameter, typeAnnotation = null, nameType = null) { + const node = { + type: "TSMappedType", + typeParameter, + typeAnnotation, + nameType + }; + const defs = NODE_FIELDS.TSMappedType; + validate(defs.typeParameter, node, "typeParameter", typeParameter, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.nameType, node, "nameType", nameType, 1); + return node; + } + function tsLiteralType(literal) { + const node = { + type: "TSLiteralType", + literal + }; + const defs = NODE_FIELDS.TSLiteralType; + validate(defs.literal, node, "literal", literal, 1); + return node; + } + function tsExpressionWithTypeArguments(expression, typeParameters = null) { + const node = { + type: "TSExpressionWithTypeArguments", + expression, + typeParameters + }; + const defs = NODE_FIELDS.TSExpressionWithTypeArguments; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsInterfaceDeclaration(id, typeParameters = null, _extends = null, body) { + const node = { + type: "TSInterfaceDeclaration", + id, + typeParameters, + extends: _extends, + body + }; + const defs = NODE_FIELDS.TSInterfaceDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.extends, node, "extends", _extends, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function tsInterfaceBody(body) { + const node = { + type: "TSInterfaceBody", + body + }; + const defs = NODE_FIELDS.TSInterfaceBody; + validate(defs.body, node, "body", body, 1); + return node; + } + function tsTypeAliasDeclaration(id, typeParameters = null, typeAnnotation) { + const node = { + type: "TSTypeAliasDeclaration", + id, + typeParameters, + typeAnnotation + }; + const defs = NODE_FIELDS.TSTypeAliasDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsInstantiationExpression(expression, typeParameters = null) { + const node = { + type: "TSInstantiationExpression", + expression, + typeParameters + }; + const defs = NODE_FIELDS.TSInstantiationExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsAsExpression(expression, typeAnnotation) { + const node = { + type: "TSAsExpression", + expression, + typeAnnotation + }; + const defs = NODE_FIELDS.TSAsExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsSatisfiesExpression(expression, typeAnnotation) { + const node = { + type: "TSSatisfiesExpression", + expression, + typeAnnotation + }; + const defs = NODE_FIELDS.TSSatisfiesExpression; + validate(defs.expression, node, "expression", expression, 1); + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeAssertion(typeAnnotation, expression) { + const node = { + type: "TSTypeAssertion", + typeAnnotation, + expression + }; + const defs = NODE_FIELDS.TSTypeAssertion; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsEnumDeclaration(id, members) { + const node = { + type: "TSEnumDeclaration", + id, + members + }; + const defs = NODE_FIELDS.TSEnumDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.members, node, "members", members, 1); + return node; + } + function tsEnumMember(id, initializer = null) { + const node = { + type: "TSEnumMember", + id, + initializer + }; + const defs = NODE_FIELDS.TSEnumMember; + validate(defs.id, node, "id", id, 1); + validate(defs.initializer, node, "initializer", initializer, 1); + return node; + } + function tsModuleDeclaration(id, body) { + const node = { + type: "TSModuleDeclaration", + id, + body, + kind: null + }; + const defs = NODE_FIELDS.TSModuleDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.body, node, "body", body, 1); + return node; + } + function tsModuleBlock(body) { + const node = { + type: "TSModuleBlock", + body + }; + const defs = NODE_FIELDS.TSModuleBlock; + validate(defs.body, node, "body", body, 1); + return node; + } + function tsImportType(argument, qualifier = null, typeParameters = null) { + const node = { + type: "TSImportType", + argument, + qualifier, + typeParameters + }; + const defs = NODE_FIELDS.TSImportType; + validate(defs.argument, node, "argument", argument, 1); + validate(defs.qualifier, node, "qualifier", qualifier, 1); + validate(defs.typeParameters, node, "typeParameters", typeParameters, 1); + return node; + } + function tsImportEqualsDeclaration(id, moduleReference) { + const node = { + type: "TSImportEqualsDeclaration", + id, + moduleReference, + isExport: null + }; + const defs = NODE_FIELDS.TSImportEqualsDeclaration; + validate(defs.id, node, "id", id, 1); + validate(defs.moduleReference, node, "moduleReference", moduleReference, 1); + return node; + } + function tsExternalModuleReference(expression) { + const node = { + type: "TSExternalModuleReference", + expression + }; + const defs = NODE_FIELDS.TSExternalModuleReference; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsNonNullExpression(expression) { + const node = { + type: "TSNonNullExpression", + expression + }; + const defs = NODE_FIELDS.TSNonNullExpression; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsExportAssignment(expression) { + const node = { + type: "TSExportAssignment", + expression + }; + const defs = NODE_FIELDS.TSExportAssignment; + validate(defs.expression, node, "expression", expression, 1); + return node; + } + function tsNamespaceExportDeclaration(id) { + const node = { + type: "TSNamespaceExportDeclaration", + id + }; + const defs = NODE_FIELDS.TSNamespaceExportDeclaration; + validate(defs.id, node, "id", id, 1); + return node; + } + function tsTypeAnnotation(typeAnnotation) { + const node = { + type: "TSTypeAnnotation", + typeAnnotation + }; + const defs = NODE_FIELDS.TSTypeAnnotation; + validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1); + return node; + } + function tsTypeParameterInstantiation(params) { + const node = { + type: "TSTypeParameterInstantiation", + params + }; + const defs = NODE_FIELDS.TSTypeParameterInstantiation; + validate(defs.params, node, "params", params, 1); + return node; + } + function tsTypeParameterDeclaration(params) { + const node = { + type: "TSTypeParameterDeclaration", + params + }; + const defs = NODE_FIELDS.TSTypeParameterDeclaration; + validate(defs.params, node, "params", params, 1); + return node; + } + function tsTypeParameter(constraint = null, _default = null, name) { + const node = { + type: "TSTypeParameter", + constraint, + default: _default, + name + }; + const defs = NODE_FIELDS.TSTypeParameter; + validate(defs.constraint, node, "constraint", constraint, 1); + validate(defs.default, node, "default", _default, 1); + validate(defs.name, node, "name", name); + return node; + } + function NumberLiteral(value) { + (0, _deprecationWarning.default)("NumberLiteral", "NumericLiteral", "The node type "); + return numericLiteral(value); + } + function RegexLiteral(pattern, flags = "") { + (0, _deprecationWarning.default)("RegexLiteral", "RegExpLiteral", "The node type "); + return regExpLiteral(pattern, flags); + } + function RestProperty(argument) { + (0, _deprecationWarning.default)("RestProperty", "RestElement", "The node type "); + return restElement(argument); + } + function SpreadProperty(argument) { + (0, _deprecationWarning.default)("SpreadProperty", "SpreadElement", "The node type "); + return spreadElement(argument); + } + + + return generated$2; +} + +var hasRequiredCleanJSXElementLiteralChild; + +function requireCleanJSXElementLiteralChild () { + if (hasRequiredCleanJSXElementLiteralChild) return cleanJSXElementLiteralChild; + hasRequiredCleanJSXElementLiteralChild = 1; + + Object.defineProperty(cleanJSXElementLiteralChild, "__esModule", { + value: true + }); + cleanJSXElementLiteralChild.default = cleanJSXElementLiteralChild$1; + var _index = requireGenerated$2(); + var _index2 = requireLib$1(); + function cleanJSXElementLiteralChild$1(child, args) { + const lines = child.value.split(/\r\n|\n|\r/); + let lastNonEmptyLine = 0; + for (let i = 0; i < lines.length; i++) { + if (/[^ \t]/.exec(lines[i])) { + lastNonEmptyLine = i; + } + } + let str = ""; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const isFirstLine = i === 0; + const isLastLine = i === lines.length - 1; + const isLastNonEmptyLine = i === lastNonEmptyLine; + let trimmedLine = line.replace(/\t/g, " "); + if (!isFirstLine) { + trimmedLine = trimmedLine.replace(/^ +/, ""); + } + if (!isLastLine) { + trimmedLine = trimmedLine.replace(/ +$/, ""); + } + if (trimmedLine) { + if (!isLastNonEmptyLine) { + trimmedLine += " "; + } + str += trimmedLine; + } + } + if (str) args.push((0, _index2.inherits)((0, _index.stringLiteral)(str), child)); + } + + + return cleanJSXElementLiteralChild; +} + +var hasRequiredBuildChildren; + +function requireBuildChildren () { + if (hasRequiredBuildChildren) return buildChildren; + hasRequiredBuildChildren = 1; + + Object.defineProperty(buildChildren, "__esModule", { + value: true + }); + buildChildren.default = buildChildren$1; + var _index = requireGenerated$3(); + var _cleanJSXElementLiteralChild = requireCleanJSXElementLiteralChild(); + function buildChildren$1(node) { + const elements = []; + for (let i = 0; i < node.children.length; i++) { + let child = node.children[i]; + if ((0, _index.isJSXText)(child)) { + (0, _cleanJSXElementLiteralChild.default)(child, elements); + continue; + } + if ((0, _index.isJSXExpressionContainer)(child)) child = child.expression; + if ((0, _index.isJSXEmptyExpression)(child)) continue; + elements.push(child); + } + return elements; + } + + + return buildChildren; +} + +var assertNode = {}; + +var isNode = {}; + +var hasRequiredIsNode; + +function requireIsNode () { + if (hasRequiredIsNode) return isNode; + hasRequiredIsNode = 1; + + Object.defineProperty(isNode, "__esModule", { + value: true + }); + isNode.default = isNode$1; + var _index = requireDefinitions(); + function isNode$1(node) { + return !!(node && _index.VISITOR_KEYS[node.type]); + } + + + return isNode; +} + +var hasRequiredAssertNode; + +function requireAssertNode () { + if (hasRequiredAssertNode) return assertNode; + hasRequiredAssertNode = 1; + + Object.defineProperty(assertNode, "__esModule", { + value: true + }); + assertNode.default = assertNode$1; + var _isNode = requireIsNode(); + function assertNode$1(node) { + if (!(0, _isNode.default)(node)) { + var _node$type; + const type = (_node$type = node == null ? void 0 : node.type) != null ? _node$type : JSON.stringify(node); + throw new TypeError(`Not a valid node of type "${type}"`); + } + } + + + return assertNode; +} + +var generated$1 = {}; + +var hasRequiredGenerated$1; + +function requireGenerated$1 () { + if (hasRequiredGenerated$1) return generated$1; + hasRequiredGenerated$1 = 1; + + Object.defineProperty(generated$1, "__esModule", { + value: true + }); + generated$1.assertAccessor = assertAccessor; + generated$1.assertAnyTypeAnnotation = assertAnyTypeAnnotation; + generated$1.assertArgumentPlaceholder = assertArgumentPlaceholder; + generated$1.assertArrayExpression = assertArrayExpression; + generated$1.assertArrayPattern = assertArrayPattern; + generated$1.assertArrayTypeAnnotation = assertArrayTypeAnnotation; + generated$1.assertArrowFunctionExpression = assertArrowFunctionExpression; + generated$1.assertAssignmentExpression = assertAssignmentExpression; + generated$1.assertAssignmentPattern = assertAssignmentPattern; + generated$1.assertAwaitExpression = assertAwaitExpression; + generated$1.assertBigIntLiteral = assertBigIntLiteral; + generated$1.assertBinary = assertBinary; + generated$1.assertBinaryExpression = assertBinaryExpression; + generated$1.assertBindExpression = assertBindExpression; + generated$1.assertBlock = assertBlock; + generated$1.assertBlockParent = assertBlockParent; + generated$1.assertBlockStatement = assertBlockStatement; + generated$1.assertBooleanLiteral = assertBooleanLiteral; + generated$1.assertBooleanLiteralTypeAnnotation = assertBooleanLiteralTypeAnnotation; + generated$1.assertBooleanTypeAnnotation = assertBooleanTypeAnnotation; + generated$1.assertBreakStatement = assertBreakStatement; + generated$1.assertCallExpression = assertCallExpression; + generated$1.assertCatchClause = assertCatchClause; + generated$1.assertClass = assertClass; + generated$1.assertClassAccessorProperty = assertClassAccessorProperty; + generated$1.assertClassBody = assertClassBody; + generated$1.assertClassDeclaration = assertClassDeclaration; + generated$1.assertClassExpression = assertClassExpression; + generated$1.assertClassImplements = assertClassImplements; + generated$1.assertClassMethod = assertClassMethod; + generated$1.assertClassPrivateMethod = assertClassPrivateMethod; + generated$1.assertClassPrivateProperty = assertClassPrivateProperty; + generated$1.assertClassProperty = assertClassProperty; + generated$1.assertCompletionStatement = assertCompletionStatement; + generated$1.assertConditional = assertConditional; + generated$1.assertConditionalExpression = assertConditionalExpression; + generated$1.assertContinueStatement = assertContinueStatement; + generated$1.assertDebuggerStatement = assertDebuggerStatement; + generated$1.assertDecimalLiteral = assertDecimalLiteral; + generated$1.assertDeclaration = assertDeclaration; + generated$1.assertDeclareClass = assertDeclareClass; + generated$1.assertDeclareExportAllDeclaration = assertDeclareExportAllDeclaration; + generated$1.assertDeclareExportDeclaration = assertDeclareExportDeclaration; + generated$1.assertDeclareFunction = assertDeclareFunction; + generated$1.assertDeclareInterface = assertDeclareInterface; + generated$1.assertDeclareModule = assertDeclareModule; + generated$1.assertDeclareModuleExports = assertDeclareModuleExports; + generated$1.assertDeclareOpaqueType = assertDeclareOpaqueType; + generated$1.assertDeclareTypeAlias = assertDeclareTypeAlias; + generated$1.assertDeclareVariable = assertDeclareVariable; + generated$1.assertDeclaredPredicate = assertDeclaredPredicate; + generated$1.assertDecorator = assertDecorator; + generated$1.assertDirective = assertDirective; + generated$1.assertDirectiveLiteral = assertDirectiveLiteral; + generated$1.assertDoExpression = assertDoExpression; + generated$1.assertDoWhileStatement = assertDoWhileStatement; + generated$1.assertEmptyStatement = assertEmptyStatement; + generated$1.assertEmptyTypeAnnotation = assertEmptyTypeAnnotation; + generated$1.assertEnumBody = assertEnumBody; + generated$1.assertEnumBooleanBody = assertEnumBooleanBody; + generated$1.assertEnumBooleanMember = assertEnumBooleanMember; + generated$1.assertEnumDeclaration = assertEnumDeclaration; + generated$1.assertEnumDefaultedMember = assertEnumDefaultedMember; + generated$1.assertEnumMember = assertEnumMember; + generated$1.assertEnumNumberBody = assertEnumNumberBody; + generated$1.assertEnumNumberMember = assertEnumNumberMember; + generated$1.assertEnumStringBody = assertEnumStringBody; + generated$1.assertEnumStringMember = assertEnumStringMember; + generated$1.assertEnumSymbolBody = assertEnumSymbolBody; + generated$1.assertExistsTypeAnnotation = assertExistsTypeAnnotation; + generated$1.assertExportAllDeclaration = assertExportAllDeclaration; + generated$1.assertExportDeclaration = assertExportDeclaration; + generated$1.assertExportDefaultDeclaration = assertExportDefaultDeclaration; + generated$1.assertExportDefaultSpecifier = assertExportDefaultSpecifier; + generated$1.assertExportNamedDeclaration = assertExportNamedDeclaration; + generated$1.assertExportNamespaceSpecifier = assertExportNamespaceSpecifier; + generated$1.assertExportSpecifier = assertExportSpecifier; + generated$1.assertExpression = assertExpression; + generated$1.assertExpressionStatement = assertExpressionStatement; + generated$1.assertExpressionWrapper = assertExpressionWrapper; + generated$1.assertFile = assertFile; + generated$1.assertFlow = assertFlow; + generated$1.assertFlowBaseAnnotation = assertFlowBaseAnnotation; + generated$1.assertFlowDeclaration = assertFlowDeclaration; + generated$1.assertFlowPredicate = assertFlowPredicate; + generated$1.assertFlowType = assertFlowType; + generated$1.assertFor = assertFor; + generated$1.assertForInStatement = assertForInStatement; + generated$1.assertForOfStatement = assertForOfStatement; + generated$1.assertForStatement = assertForStatement; + generated$1.assertForXStatement = assertForXStatement; + generated$1.assertFunction = assertFunction; + generated$1.assertFunctionDeclaration = assertFunctionDeclaration; + generated$1.assertFunctionExpression = assertFunctionExpression; + generated$1.assertFunctionParent = assertFunctionParent; + generated$1.assertFunctionTypeAnnotation = assertFunctionTypeAnnotation; + generated$1.assertFunctionTypeParam = assertFunctionTypeParam; + generated$1.assertGenericTypeAnnotation = assertGenericTypeAnnotation; + generated$1.assertIdentifier = assertIdentifier; + generated$1.assertIfStatement = assertIfStatement; + generated$1.assertImmutable = assertImmutable; + generated$1.assertImport = assertImport; + generated$1.assertImportAttribute = assertImportAttribute; + generated$1.assertImportDeclaration = assertImportDeclaration; + generated$1.assertImportDefaultSpecifier = assertImportDefaultSpecifier; + generated$1.assertImportExpression = assertImportExpression; + generated$1.assertImportNamespaceSpecifier = assertImportNamespaceSpecifier; + generated$1.assertImportOrExportDeclaration = assertImportOrExportDeclaration; + generated$1.assertImportSpecifier = assertImportSpecifier; + generated$1.assertIndexedAccessType = assertIndexedAccessType; + generated$1.assertInferredPredicate = assertInferredPredicate; + generated$1.assertInterfaceDeclaration = assertInterfaceDeclaration; + generated$1.assertInterfaceExtends = assertInterfaceExtends; + generated$1.assertInterfaceTypeAnnotation = assertInterfaceTypeAnnotation; + generated$1.assertInterpreterDirective = assertInterpreterDirective; + generated$1.assertIntersectionTypeAnnotation = assertIntersectionTypeAnnotation; + generated$1.assertJSX = assertJSX; + generated$1.assertJSXAttribute = assertJSXAttribute; + generated$1.assertJSXClosingElement = assertJSXClosingElement; + generated$1.assertJSXClosingFragment = assertJSXClosingFragment; + generated$1.assertJSXElement = assertJSXElement; + generated$1.assertJSXEmptyExpression = assertJSXEmptyExpression; + generated$1.assertJSXExpressionContainer = assertJSXExpressionContainer; + generated$1.assertJSXFragment = assertJSXFragment; + generated$1.assertJSXIdentifier = assertJSXIdentifier; + generated$1.assertJSXMemberExpression = assertJSXMemberExpression; + generated$1.assertJSXNamespacedName = assertJSXNamespacedName; + generated$1.assertJSXOpeningElement = assertJSXOpeningElement; + generated$1.assertJSXOpeningFragment = assertJSXOpeningFragment; + generated$1.assertJSXSpreadAttribute = assertJSXSpreadAttribute; + generated$1.assertJSXSpreadChild = assertJSXSpreadChild; + generated$1.assertJSXText = assertJSXText; + generated$1.assertLVal = assertLVal; + generated$1.assertLabeledStatement = assertLabeledStatement; + generated$1.assertLiteral = assertLiteral; + generated$1.assertLogicalExpression = assertLogicalExpression; + generated$1.assertLoop = assertLoop; + generated$1.assertMemberExpression = assertMemberExpression; + generated$1.assertMetaProperty = assertMetaProperty; + generated$1.assertMethod = assertMethod; + generated$1.assertMiscellaneous = assertMiscellaneous; + generated$1.assertMixedTypeAnnotation = assertMixedTypeAnnotation; + generated$1.assertModuleDeclaration = assertModuleDeclaration; + generated$1.assertModuleExpression = assertModuleExpression; + generated$1.assertModuleSpecifier = assertModuleSpecifier; + generated$1.assertNewExpression = assertNewExpression; + generated$1.assertNoop = assertNoop; + generated$1.assertNullLiteral = assertNullLiteral; + generated$1.assertNullLiteralTypeAnnotation = assertNullLiteralTypeAnnotation; + generated$1.assertNullableTypeAnnotation = assertNullableTypeAnnotation; + generated$1.assertNumberLiteral = assertNumberLiteral; + generated$1.assertNumberLiteralTypeAnnotation = assertNumberLiteralTypeAnnotation; + generated$1.assertNumberTypeAnnotation = assertNumberTypeAnnotation; + generated$1.assertNumericLiteral = assertNumericLiteral; + generated$1.assertObjectExpression = assertObjectExpression; + generated$1.assertObjectMember = assertObjectMember; + generated$1.assertObjectMethod = assertObjectMethod; + generated$1.assertObjectPattern = assertObjectPattern; + generated$1.assertObjectProperty = assertObjectProperty; + generated$1.assertObjectTypeAnnotation = assertObjectTypeAnnotation; + generated$1.assertObjectTypeCallProperty = assertObjectTypeCallProperty; + generated$1.assertObjectTypeIndexer = assertObjectTypeIndexer; + generated$1.assertObjectTypeInternalSlot = assertObjectTypeInternalSlot; + generated$1.assertObjectTypeProperty = assertObjectTypeProperty; + generated$1.assertObjectTypeSpreadProperty = assertObjectTypeSpreadProperty; + generated$1.assertOpaqueType = assertOpaqueType; + generated$1.assertOptionalCallExpression = assertOptionalCallExpression; + generated$1.assertOptionalIndexedAccessType = assertOptionalIndexedAccessType; + generated$1.assertOptionalMemberExpression = assertOptionalMemberExpression; + generated$1.assertParenthesizedExpression = assertParenthesizedExpression; + generated$1.assertPattern = assertPattern; + generated$1.assertPatternLike = assertPatternLike; + generated$1.assertPipelineBareFunction = assertPipelineBareFunction; + generated$1.assertPipelinePrimaryTopicReference = assertPipelinePrimaryTopicReference; + generated$1.assertPipelineTopicExpression = assertPipelineTopicExpression; + generated$1.assertPlaceholder = assertPlaceholder; + generated$1.assertPrivate = assertPrivate; + generated$1.assertPrivateName = assertPrivateName; + generated$1.assertProgram = assertProgram; + generated$1.assertProperty = assertProperty; + generated$1.assertPureish = assertPureish; + generated$1.assertQualifiedTypeIdentifier = assertQualifiedTypeIdentifier; + generated$1.assertRecordExpression = assertRecordExpression; + generated$1.assertRegExpLiteral = assertRegExpLiteral; + generated$1.assertRegexLiteral = assertRegexLiteral; + generated$1.assertRestElement = assertRestElement; + generated$1.assertRestProperty = assertRestProperty; + generated$1.assertReturnStatement = assertReturnStatement; + generated$1.assertScopable = assertScopable; + generated$1.assertSequenceExpression = assertSequenceExpression; + generated$1.assertSpreadElement = assertSpreadElement; + generated$1.assertSpreadProperty = assertSpreadProperty; + generated$1.assertStandardized = assertStandardized; + generated$1.assertStatement = assertStatement; + generated$1.assertStaticBlock = assertStaticBlock; + generated$1.assertStringLiteral = assertStringLiteral; + generated$1.assertStringLiteralTypeAnnotation = assertStringLiteralTypeAnnotation; + generated$1.assertStringTypeAnnotation = assertStringTypeAnnotation; + generated$1.assertSuper = assertSuper; + generated$1.assertSwitchCase = assertSwitchCase; + generated$1.assertSwitchStatement = assertSwitchStatement; + generated$1.assertSymbolTypeAnnotation = assertSymbolTypeAnnotation; + generated$1.assertTSAnyKeyword = assertTSAnyKeyword; + generated$1.assertTSArrayType = assertTSArrayType; + generated$1.assertTSAsExpression = assertTSAsExpression; + generated$1.assertTSBaseType = assertTSBaseType; + generated$1.assertTSBigIntKeyword = assertTSBigIntKeyword; + generated$1.assertTSBooleanKeyword = assertTSBooleanKeyword; + generated$1.assertTSCallSignatureDeclaration = assertTSCallSignatureDeclaration; + generated$1.assertTSConditionalType = assertTSConditionalType; + generated$1.assertTSConstructSignatureDeclaration = assertTSConstructSignatureDeclaration; + generated$1.assertTSConstructorType = assertTSConstructorType; + generated$1.assertTSDeclareFunction = assertTSDeclareFunction; + generated$1.assertTSDeclareMethod = assertTSDeclareMethod; + generated$1.assertTSEntityName = assertTSEntityName; + generated$1.assertTSEnumDeclaration = assertTSEnumDeclaration; + generated$1.assertTSEnumMember = assertTSEnumMember; + generated$1.assertTSExportAssignment = assertTSExportAssignment; + generated$1.assertTSExpressionWithTypeArguments = assertTSExpressionWithTypeArguments; + generated$1.assertTSExternalModuleReference = assertTSExternalModuleReference; + generated$1.assertTSFunctionType = assertTSFunctionType; + generated$1.assertTSImportEqualsDeclaration = assertTSImportEqualsDeclaration; + generated$1.assertTSImportType = assertTSImportType; + generated$1.assertTSIndexSignature = assertTSIndexSignature; + generated$1.assertTSIndexedAccessType = assertTSIndexedAccessType; + generated$1.assertTSInferType = assertTSInferType; + generated$1.assertTSInstantiationExpression = assertTSInstantiationExpression; + generated$1.assertTSInterfaceBody = assertTSInterfaceBody; + generated$1.assertTSInterfaceDeclaration = assertTSInterfaceDeclaration; + generated$1.assertTSIntersectionType = assertTSIntersectionType; + generated$1.assertTSIntrinsicKeyword = assertTSIntrinsicKeyword; + generated$1.assertTSLiteralType = assertTSLiteralType; + generated$1.assertTSMappedType = assertTSMappedType; + generated$1.assertTSMethodSignature = assertTSMethodSignature; + generated$1.assertTSModuleBlock = assertTSModuleBlock; + generated$1.assertTSModuleDeclaration = assertTSModuleDeclaration; + generated$1.assertTSNamedTupleMember = assertTSNamedTupleMember; + generated$1.assertTSNamespaceExportDeclaration = assertTSNamespaceExportDeclaration; + generated$1.assertTSNeverKeyword = assertTSNeverKeyword; + generated$1.assertTSNonNullExpression = assertTSNonNullExpression; + generated$1.assertTSNullKeyword = assertTSNullKeyword; + generated$1.assertTSNumberKeyword = assertTSNumberKeyword; + generated$1.assertTSObjectKeyword = assertTSObjectKeyword; + generated$1.assertTSOptionalType = assertTSOptionalType; + generated$1.assertTSParameterProperty = assertTSParameterProperty; + generated$1.assertTSParenthesizedType = assertTSParenthesizedType; + generated$1.assertTSPropertySignature = assertTSPropertySignature; + generated$1.assertTSQualifiedName = assertTSQualifiedName; + generated$1.assertTSRestType = assertTSRestType; + generated$1.assertTSSatisfiesExpression = assertTSSatisfiesExpression; + generated$1.assertTSStringKeyword = assertTSStringKeyword; + generated$1.assertTSSymbolKeyword = assertTSSymbolKeyword; + generated$1.assertTSThisType = assertTSThisType; + generated$1.assertTSTupleType = assertTSTupleType; + generated$1.assertTSType = assertTSType; + generated$1.assertTSTypeAliasDeclaration = assertTSTypeAliasDeclaration; + generated$1.assertTSTypeAnnotation = assertTSTypeAnnotation; + generated$1.assertTSTypeAssertion = assertTSTypeAssertion; + generated$1.assertTSTypeElement = assertTSTypeElement; + generated$1.assertTSTypeLiteral = assertTSTypeLiteral; + generated$1.assertTSTypeOperator = assertTSTypeOperator; + generated$1.assertTSTypeParameter = assertTSTypeParameter; + generated$1.assertTSTypeParameterDeclaration = assertTSTypeParameterDeclaration; + generated$1.assertTSTypeParameterInstantiation = assertTSTypeParameterInstantiation; + generated$1.assertTSTypePredicate = assertTSTypePredicate; + generated$1.assertTSTypeQuery = assertTSTypeQuery; + generated$1.assertTSTypeReference = assertTSTypeReference; + generated$1.assertTSUndefinedKeyword = assertTSUndefinedKeyword; + generated$1.assertTSUnionType = assertTSUnionType; + generated$1.assertTSUnknownKeyword = assertTSUnknownKeyword; + generated$1.assertTSVoidKeyword = assertTSVoidKeyword; + generated$1.assertTaggedTemplateExpression = assertTaggedTemplateExpression; + generated$1.assertTemplateElement = assertTemplateElement; + generated$1.assertTemplateLiteral = assertTemplateLiteral; + generated$1.assertTerminatorless = assertTerminatorless; + generated$1.assertThisExpression = assertThisExpression; + generated$1.assertThisTypeAnnotation = assertThisTypeAnnotation; + generated$1.assertThrowStatement = assertThrowStatement; + generated$1.assertTopicReference = assertTopicReference; + generated$1.assertTryStatement = assertTryStatement; + generated$1.assertTupleExpression = assertTupleExpression; + generated$1.assertTupleTypeAnnotation = assertTupleTypeAnnotation; + generated$1.assertTypeAlias = assertTypeAlias; + generated$1.assertTypeAnnotation = assertTypeAnnotation; + generated$1.assertTypeCastExpression = assertTypeCastExpression; + generated$1.assertTypeParameter = assertTypeParameter; + generated$1.assertTypeParameterDeclaration = assertTypeParameterDeclaration; + generated$1.assertTypeParameterInstantiation = assertTypeParameterInstantiation; + generated$1.assertTypeScript = assertTypeScript; + generated$1.assertTypeofTypeAnnotation = assertTypeofTypeAnnotation; + generated$1.assertUnaryExpression = assertUnaryExpression; + generated$1.assertUnaryLike = assertUnaryLike; + generated$1.assertUnionTypeAnnotation = assertUnionTypeAnnotation; + generated$1.assertUpdateExpression = assertUpdateExpression; + generated$1.assertUserWhitespacable = assertUserWhitespacable; + generated$1.assertV8IntrinsicIdentifier = assertV8IntrinsicIdentifier; + generated$1.assertVariableDeclaration = assertVariableDeclaration; + generated$1.assertVariableDeclarator = assertVariableDeclarator; + generated$1.assertVariance = assertVariance; + generated$1.assertVoidTypeAnnotation = assertVoidTypeAnnotation; + generated$1.assertWhile = assertWhile; + generated$1.assertWhileStatement = assertWhileStatement; + generated$1.assertWithStatement = assertWithStatement; + generated$1.assertYieldExpression = assertYieldExpression; + var _is = requireIs(); + var _deprecationWarning = requireDeprecationWarning(); + function assert(type, node, opts) { + if (!(0, _is.default)(type, node, opts)) { + throw new Error(`Expected type "${type}" with option ${JSON.stringify(opts)}, ` + `but instead got "${node.type}".`); + } + } + function assertArrayExpression(node, opts) { + assert("ArrayExpression", node, opts); + } + function assertAssignmentExpression(node, opts) { + assert("AssignmentExpression", node, opts); + } + function assertBinaryExpression(node, opts) { + assert("BinaryExpression", node, opts); + } + function assertInterpreterDirective(node, opts) { + assert("InterpreterDirective", node, opts); + } + function assertDirective(node, opts) { + assert("Directive", node, opts); + } + function assertDirectiveLiteral(node, opts) { + assert("DirectiveLiteral", node, opts); + } + function assertBlockStatement(node, opts) { + assert("BlockStatement", node, opts); + } + function assertBreakStatement(node, opts) { + assert("BreakStatement", node, opts); + } + function assertCallExpression(node, opts) { + assert("CallExpression", node, opts); + } + function assertCatchClause(node, opts) { + assert("CatchClause", node, opts); + } + function assertConditionalExpression(node, opts) { + assert("ConditionalExpression", node, opts); + } + function assertContinueStatement(node, opts) { + assert("ContinueStatement", node, opts); + } + function assertDebuggerStatement(node, opts) { + assert("DebuggerStatement", node, opts); + } + function assertDoWhileStatement(node, opts) { + assert("DoWhileStatement", node, opts); + } + function assertEmptyStatement(node, opts) { + assert("EmptyStatement", node, opts); + } + function assertExpressionStatement(node, opts) { + assert("ExpressionStatement", node, opts); + } + function assertFile(node, opts) { + assert("File", node, opts); + } + function assertForInStatement(node, opts) { + assert("ForInStatement", node, opts); + } + function assertForStatement(node, opts) { + assert("ForStatement", node, opts); + } + function assertFunctionDeclaration(node, opts) { + assert("FunctionDeclaration", node, opts); + } + function assertFunctionExpression(node, opts) { + assert("FunctionExpression", node, opts); + } + function assertIdentifier(node, opts) { + assert("Identifier", node, opts); + } + function assertIfStatement(node, opts) { + assert("IfStatement", node, opts); + } + function assertLabeledStatement(node, opts) { + assert("LabeledStatement", node, opts); + } + function assertStringLiteral(node, opts) { + assert("StringLiteral", node, opts); + } + function assertNumericLiteral(node, opts) { + assert("NumericLiteral", node, opts); + } + function assertNullLiteral(node, opts) { + assert("NullLiteral", node, opts); + } + function assertBooleanLiteral(node, opts) { + assert("BooleanLiteral", node, opts); + } + function assertRegExpLiteral(node, opts) { + assert("RegExpLiteral", node, opts); + } + function assertLogicalExpression(node, opts) { + assert("LogicalExpression", node, opts); + } + function assertMemberExpression(node, opts) { + assert("MemberExpression", node, opts); + } + function assertNewExpression(node, opts) { + assert("NewExpression", node, opts); + } + function assertProgram(node, opts) { + assert("Program", node, opts); + } + function assertObjectExpression(node, opts) { + assert("ObjectExpression", node, opts); + } + function assertObjectMethod(node, opts) { + assert("ObjectMethod", node, opts); + } + function assertObjectProperty(node, opts) { + assert("ObjectProperty", node, opts); + } + function assertRestElement(node, opts) { + assert("RestElement", node, opts); + } + function assertReturnStatement(node, opts) { + assert("ReturnStatement", node, opts); + } + function assertSequenceExpression(node, opts) { + assert("SequenceExpression", node, opts); + } + function assertParenthesizedExpression(node, opts) { + assert("ParenthesizedExpression", node, opts); + } + function assertSwitchCase(node, opts) { + assert("SwitchCase", node, opts); + } + function assertSwitchStatement(node, opts) { + assert("SwitchStatement", node, opts); + } + function assertThisExpression(node, opts) { + assert("ThisExpression", node, opts); + } + function assertThrowStatement(node, opts) { + assert("ThrowStatement", node, opts); + } + function assertTryStatement(node, opts) { + assert("TryStatement", node, opts); + } + function assertUnaryExpression(node, opts) { + assert("UnaryExpression", node, opts); + } + function assertUpdateExpression(node, opts) { + assert("UpdateExpression", node, opts); + } + function assertVariableDeclaration(node, opts) { + assert("VariableDeclaration", node, opts); + } + function assertVariableDeclarator(node, opts) { + assert("VariableDeclarator", node, opts); + } + function assertWhileStatement(node, opts) { + assert("WhileStatement", node, opts); + } + function assertWithStatement(node, opts) { + assert("WithStatement", node, opts); + } + function assertAssignmentPattern(node, opts) { + assert("AssignmentPattern", node, opts); + } + function assertArrayPattern(node, opts) { + assert("ArrayPattern", node, opts); + } + function assertArrowFunctionExpression(node, opts) { + assert("ArrowFunctionExpression", node, opts); + } + function assertClassBody(node, opts) { + assert("ClassBody", node, opts); + } + function assertClassExpression(node, opts) { + assert("ClassExpression", node, opts); + } + function assertClassDeclaration(node, opts) { + assert("ClassDeclaration", node, opts); + } + function assertExportAllDeclaration(node, opts) { + assert("ExportAllDeclaration", node, opts); + } + function assertExportDefaultDeclaration(node, opts) { + assert("ExportDefaultDeclaration", node, opts); + } + function assertExportNamedDeclaration(node, opts) { + assert("ExportNamedDeclaration", node, opts); + } + function assertExportSpecifier(node, opts) { + assert("ExportSpecifier", node, opts); + } + function assertForOfStatement(node, opts) { + assert("ForOfStatement", node, opts); + } + function assertImportDeclaration(node, opts) { + assert("ImportDeclaration", node, opts); + } + function assertImportDefaultSpecifier(node, opts) { + assert("ImportDefaultSpecifier", node, opts); + } + function assertImportNamespaceSpecifier(node, opts) { + assert("ImportNamespaceSpecifier", node, opts); + } + function assertImportSpecifier(node, opts) { + assert("ImportSpecifier", node, opts); + } + function assertImportExpression(node, opts) { + assert("ImportExpression", node, opts); + } + function assertMetaProperty(node, opts) { + assert("MetaProperty", node, opts); + } + function assertClassMethod(node, opts) { + assert("ClassMethod", node, opts); + } + function assertObjectPattern(node, opts) { + assert("ObjectPattern", node, opts); + } + function assertSpreadElement(node, opts) { + assert("SpreadElement", node, opts); + } + function assertSuper(node, opts) { + assert("Super", node, opts); + } + function assertTaggedTemplateExpression(node, opts) { + assert("TaggedTemplateExpression", node, opts); + } + function assertTemplateElement(node, opts) { + assert("TemplateElement", node, opts); + } + function assertTemplateLiteral(node, opts) { + assert("TemplateLiteral", node, opts); + } + function assertYieldExpression(node, opts) { + assert("YieldExpression", node, opts); + } + function assertAwaitExpression(node, opts) { + assert("AwaitExpression", node, opts); + } + function assertImport(node, opts) { + assert("Import", node, opts); + } + function assertBigIntLiteral(node, opts) { + assert("BigIntLiteral", node, opts); + } + function assertExportNamespaceSpecifier(node, opts) { + assert("ExportNamespaceSpecifier", node, opts); + } + function assertOptionalMemberExpression(node, opts) { + assert("OptionalMemberExpression", node, opts); + } + function assertOptionalCallExpression(node, opts) { + assert("OptionalCallExpression", node, opts); + } + function assertClassProperty(node, opts) { + assert("ClassProperty", node, opts); + } + function assertClassAccessorProperty(node, opts) { + assert("ClassAccessorProperty", node, opts); + } + function assertClassPrivateProperty(node, opts) { + assert("ClassPrivateProperty", node, opts); + } + function assertClassPrivateMethod(node, opts) { + assert("ClassPrivateMethod", node, opts); + } + function assertPrivateName(node, opts) { + assert("PrivateName", node, opts); + } + function assertStaticBlock(node, opts) { + assert("StaticBlock", node, opts); + } + function assertAnyTypeAnnotation(node, opts) { + assert("AnyTypeAnnotation", node, opts); + } + function assertArrayTypeAnnotation(node, opts) { + assert("ArrayTypeAnnotation", node, opts); + } + function assertBooleanTypeAnnotation(node, opts) { + assert("BooleanTypeAnnotation", node, opts); + } + function assertBooleanLiteralTypeAnnotation(node, opts) { + assert("BooleanLiteralTypeAnnotation", node, opts); + } + function assertNullLiteralTypeAnnotation(node, opts) { + assert("NullLiteralTypeAnnotation", node, opts); + } + function assertClassImplements(node, opts) { + assert("ClassImplements", node, opts); + } + function assertDeclareClass(node, opts) { + assert("DeclareClass", node, opts); + } + function assertDeclareFunction(node, opts) { + assert("DeclareFunction", node, opts); + } + function assertDeclareInterface(node, opts) { + assert("DeclareInterface", node, opts); + } + function assertDeclareModule(node, opts) { + assert("DeclareModule", node, opts); + } + function assertDeclareModuleExports(node, opts) { + assert("DeclareModuleExports", node, opts); + } + function assertDeclareTypeAlias(node, opts) { + assert("DeclareTypeAlias", node, opts); + } + function assertDeclareOpaqueType(node, opts) { + assert("DeclareOpaqueType", node, opts); + } + function assertDeclareVariable(node, opts) { + assert("DeclareVariable", node, opts); + } + function assertDeclareExportDeclaration(node, opts) { + assert("DeclareExportDeclaration", node, opts); + } + function assertDeclareExportAllDeclaration(node, opts) { + assert("DeclareExportAllDeclaration", node, opts); + } + function assertDeclaredPredicate(node, opts) { + assert("DeclaredPredicate", node, opts); + } + function assertExistsTypeAnnotation(node, opts) { + assert("ExistsTypeAnnotation", node, opts); + } + function assertFunctionTypeAnnotation(node, opts) { + assert("FunctionTypeAnnotation", node, opts); + } + function assertFunctionTypeParam(node, opts) { + assert("FunctionTypeParam", node, opts); + } + function assertGenericTypeAnnotation(node, opts) { + assert("GenericTypeAnnotation", node, opts); + } + function assertInferredPredicate(node, opts) { + assert("InferredPredicate", node, opts); + } + function assertInterfaceExtends(node, opts) { + assert("InterfaceExtends", node, opts); + } + function assertInterfaceDeclaration(node, opts) { + assert("InterfaceDeclaration", node, opts); + } + function assertInterfaceTypeAnnotation(node, opts) { + assert("InterfaceTypeAnnotation", node, opts); + } + function assertIntersectionTypeAnnotation(node, opts) { + assert("IntersectionTypeAnnotation", node, opts); + } + function assertMixedTypeAnnotation(node, opts) { + assert("MixedTypeAnnotation", node, opts); + } + function assertEmptyTypeAnnotation(node, opts) { + assert("EmptyTypeAnnotation", node, opts); + } + function assertNullableTypeAnnotation(node, opts) { + assert("NullableTypeAnnotation", node, opts); + } + function assertNumberLiteralTypeAnnotation(node, opts) { + assert("NumberLiteralTypeAnnotation", node, opts); + } + function assertNumberTypeAnnotation(node, opts) { + assert("NumberTypeAnnotation", node, opts); + } + function assertObjectTypeAnnotation(node, opts) { + assert("ObjectTypeAnnotation", node, opts); + } + function assertObjectTypeInternalSlot(node, opts) { + assert("ObjectTypeInternalSlot", node, opts); + } + function assertObjectTypeCallProperty(node, opts) { + assert("ObjectTypeCallProperty", node, opts); + } + function assertObjectTypeIndexer(node, opts) { + assert("ObjectTypeIndexer", node, opts); + } + function assertObjectTypeProperty(node, opts) { + assert("ObjectTypeProperty", node, opts); + } + function assertObjectTypeSpreadProperty(node, opts) { + assert("ObjectTypeSpreadProperty", node, opts); + } + function assertOpaqueType(node, opts) { + assert("OpaqueType", node, opts); + } + function assertQualifiedTypeIdentifier(node, opts) { + assert("QualifiedTypeIdentifier", node, opts); + } + function assertStringLiteralTypeAnnotation(node, opts) { + assert("StringLiteralTypeAnnotation", node, opts); + } + function assertStringTypeAnnotation(node, opts) { + assert("StringTypeAnnotation", node, opts); + } + function assertSymbolTypeAnnotation(node, opts) { + assert("SymbolTypeAnnotation", node, opts); + } + function assertThisTypeAnnotation(node, opts) { + assert("ThisTypeAnnotation", node, opts); + } + function assertTupleTypeAnnotation(node, opts) { + assert("TupleTypeAnnotation", node, opts); + } + function assertTypeofTypeAnnotation(node, opts) { + assert("TypeofTypeAnnotation", node, opts); + } + function assertTypeAlias(node, opts) { + assert("TypeAlias", node, opts); + } + function assertTypeAnnotation(node, opts) { + assert("TypeAnnotation", node, opts); + } + function assertTypeCastExpression(node, opts) { + assert("TypeCastExpression", node, opts); + } + function assertTypeParameter(node, opts) { + assert("TypeParameter", node, opts); + } + function assertTypeParameterDeclaration(node, opts) { + assert("TypeParameterDeclaration", node, opts); + } + function assertTypeParameterInstantiation(node, opts) { + assert("TypeParameterInstantiation", node, opts); + } + function assertUnionTypeAnnotation(node, opts) { + assert("UnionTypeAnnotation", node, opts); + } + function assertVariance(node, opts) { + assert("Variance", node, opts); + } + function assertVoidTypeAnnotation(node, opts) { + assert("VoidTypeAnnotation", node, opts); + } + function assertEnumDeclaration(node, opts) { + assert("EnumDeclaration", node, opts); + } + function assertEnumBooleanBody(node, opts) { + assert("EnumBooleanBody", node, opts); + } + function assertEnumNumberBody(node, opts) { + assert("EnumNumberBody", node, opts); + } + function assertEnumStringBody(node, opts) { + assert("EnumStringBody", node, opts); + } + function assertEnumSymbolBody(node, opts) { + assert("EnumSymbolBody", node, opts); + } + function assertEnumBooleanMember(node, opts) { + assert("EnumBooleanMember", node, opts); + } + function assertEnumNumberMember(node, opts) { + assert("EnumNumberMember", node, opts); + } + function assertEnumStringMember(node, opts) { + assert("EnumStringMember", node, opts); + } + function assertEnumDefaultedMember(node, opts) { + assert("EnumDefaultedMember", node, opts); + } + function assertIndexedAccessType(node, opts) { + assert("IndexedAccessType", node, opts); + } + function assertOptionalIndexedAccessType(node, opts) { + assert("OptionalIndexedAccessType", node, opts); + } + function assertJSXAttribute(node, opts) { + assert("JSXAttribute", node, opts); + } + function assertJSXClosingElement(node, opts) { + assert("JSXClosingElement", node, opts); + } + function assertJSXElement(node, opts) { + assert("JSXElement", node, opts); + } + function assertJSXEmptyExpression(node, opts) { + assert("JSXEmptyExpression", node, opts); + } + function assertJSXExpressionContainer(node, opts) { + assert("JSXExpressionContainer", node, opts); + } + function assertJSXSpreadChild(node, opts) { + assert("JSXSpreadChild", node, opts); + } + function assertJSXIdentifier(node, opts) { + assert("JSXIdentifier", node, opts); + } + function assertJSXMemberExpression(node, opts) { + assert("JSXMemberExpression", node, opts); + } + function assertJSXNamespacedName(node, opts) { + assert("JSXNamespacedName", node, opts); + } + function assertJSXOpeningElement(node, opts) { + assert("JSXOpeningElement", node, opts); + } + function assertJSXSpreadAttribute(node, opts) { + assert("JSXSpreadAttribute", node, opts); + } + function assertJSXText(node, opts) { + assert("JSXText", node, opts); + } + function assertJSXFragment(node, opts) { + assert("JSXFragment", node, opts); + } + function assertJSXOpeningFragment(node, opts) { + assert("JSXOpeningFragment", node, opts); + } + function assertJSXClosingFragment(node, opts) { + assert("JSXClosingFragment", node, opts); + } + function assertNoop(node, opts) { + assert("Noop", node, opts); + } + function assertPlaceholder(node, opts) { + assert("Placeholder", node, opts); + } + function assertV8IntrinsicIdentifier(node, opts) { + assert("V8IntrinsicIdentifier", node, opts); + } + function assertArgumentPlaceholder(node, opts) { + assert("ArgumentPlaceholder", node, opts); + } + function assertBindExpression(node, opts) { + assert("BindExpression", node, opts); + } + function assertImportAttribute(node, opts) { + assert("ImportAttribute", node, opts); + } + function assertDecorator(node, opts) { + assert("Decorator", node, opts); + } + function assertDoExpression(node, opts) { + assert("DoExpression", node, opts); + } + function assertExportDefaultSpecifier(node, opts) { + assert("ExportDefaultSpecifier", node, opts); + } + function assertRecordExpression(node, opts) { + assert("RecordExpression", node, opts); + } + function assertTupleExpression(node, opts) { + assert("TupleExpression", node, opts); + } + function assertDecimalLiteral(node, opts) { + assert("DecimalLiteral", node, opts); + } + function assertModuleExpression(node, opts) { + assert("ModuleExpression", node, opts); + } + function assertTopicReference(node, opts) { + assert("TopicReference", node, opts); + } + function assertPipelineTopicExpression(node, opts) { + assert("PipelineTopicExpression", node, opts); + } + function assertPipelineBareFunction(node, opts) { + assert("PipelineBareFunction", node, opts); + } + function assertPipelinePrimaryTopicReference(node, opts) { + assert("PipelinePrimaryTopicReference", node, opts); + } + function assertTSParameterProperty(node, opts) { + assert("TSParameterProperty", node, opts); + } + function assertTSDeclareFunction(node, opts) { + assert("TSDeclareFunction", node, opts); + } + function assertTSDeclareMethod(node, opts) { + assert("TSDeclareMethod", node, opts); + } + function assertTSQualifiedName(node, opts) { + assert("TSQualifiedName", node, opts); + } + function assertTSCallSignatureDeclaration(node, opts) { + assert("TSCallSignatureDeclaration", node, opts); + } + function assertTSConstructSignatureDeclaration(node, opts) { + assert("TSConstructSignatureDeclaration", node, opts); + } + function assertTSPropertySignature(node, opts) { + assert("TSPropertySignature", node, opts); + } + function assertTSMethodSignature(node, opts) { + assert("TSMethodSignature", node, opts); + } + function assertTSIndexSignature(node, opts) { + assert("TSIndexSignature", node, opts); + } + function assertTSAnyKeyword(node, opts) { + assert("TSAnyKeyword", node, opts); + } + function assertTSBooleanKeyword(node, opts) { + assert("TSBooleanKeyword", node, opts); + } + function assertTSBigIntKeyword(node, opts) { + assert("TSBigIntKeyword", node, opts); + } + function assertTSIntrinsicKeyword(node, opts) { + assert("TSIntrinsicKeyword", node, opts); + } + function assertTSNeverKeyword(node, opts) { + assert("TSNeverKeyword", node, opts); + } + function assertTSNullKeyword(node, opts) { + assert("TSNullKeyword", node, opts); + } + function assertTSNumberKeyword(node, opts) { + assert("TSNumberKeyword", node, opts); + } + function assertTSObjectKeyword(node, opts) { + assert("TSObjectKeyword", node, opts); + } + function assertTSStringKeyword(node, opts) { + assert("TSStringKeyword", node, opts); + } + function assertTSSymbolKeyword(node, opts) { + assert("TSSymbolKeyword", node, opts); + } + function assertTSUndefinedKeyword(node, opts) { + assert("TSUndefinedKeyword", node, opts); + } + function assertTSUnknownKeyword(node, opts) { + assert("TSUnknownKeyword", node, opts); + } + function assertTSVoidKeyword(node, opts) { + assert("TSVoidKeyword", node, opts); + } + function assertTSThisType(node, opts) { + assert("TSThisType", node, opts); + } + function assertTSFunctionType(node, opts) { + assert("TSFunctionType", node, opts); + } + function assertTSConstructorType(node, opts) { + assert("TSConstructorType", node, opts); + } + function assertTSTypeReference(node, opts) { + assert("TSTypeReference", node, opts); + } + function assertTSTypePredicate(node, opts) { + assert("TSTypePredicate", node, opts); + } + function assertTSTypeQuery(node, opts) { + assert("TSTypeQuery", node, opts); + } + function assertTSTypeLiteral(node, opts) { + assert("TSTypeLiteral", node, opts); + } + function assertTSArrayType(node, opts) { + assert("TSArrayType", node, opts); + } + function assertTSTupleType(node, opts) { + assert("TSTupleType", node, opts); + } + function assertTSOptionalType(node, opts) { + assert("TSOptionalType", node, opts); + } + function assertTSRestType(node, opts) { + assert("TSRestType", node, opts); + } + function assertTSNamedTupleMember(node, opts) { + assert("TSNamedTupleMember", node, opts); + } + function assertTSUnionType(node, opts) { + assert("TSUnionType", node, opts); + } + function assertTSIntersectionType(node, opts) { + assert("TSIntersectionType", node, opts); + } + function assertTSConditionalType(node, opts) { + assert("TSConditionalType", node, opts); + } + function assertTSInferType(node, opts) { + assert("TSInferType", node, opts); + } + function assertTSParenthesizedType(node, opts) { + assert("TSParenthesizedType", node, opts); + } + function assertTSTypeOperator(node, opts) { + assert("TSTypeOperator", node, opts); + } + function assertTSIndexedAccessType(node, opts) { + assert("TSIndexedAccessType", node, opts); + } + function assertTSMappedType(node, opts) { + assert("TSMappedType", node, opts); + } + function assertTSLiteralType(node, opts) { + assert("TSLiteralType", node, opts); + } + function assertTSExpressionWithTypeArguments(node, opts) { + assert("TSExpressionWithTypeArguments", node, opts); + } + function assertTSInterfaceDeclaration(node, opts) { + assert("TSInterfaceDeclaration", node, opts); + } + function assertTSInterfaceBody(node, opts) { + assert("TSInterfaceBody", node, opts); + } + function assertTSTypeAliasDeclaration(node, opts) { + assert("TSTypeAliasDeclaration", node, opts); + } + function assertTSInstantiationExpression(node, opts) { + assert("TSInstantiationExpression", node, opts); + } + function assertTSAsExpression(node, opts) { + assert("TSAsExpression", node, opts); + } + function assertTSSatisfiesExpression(node, opts) { + assert("TSSatisfiesExpression", node, opts); + } + function assertTSTypeAssertion(node, opts) { + assert("TSTypeAssertion", node, opts); + } + function assertTSEnumDeclaration(node, opts) { + assert("TSEnumDeclaration", node, opts); + } + function assertTSEnumMember(node, opts) { + assert("TSEnumMember", node, opts); + } + function assertTSModuleDeclaration(node, opts) { + assert("TSModuleDeclaration", node, opts); + } + function assertTSModuleBlock(node, opts) { + assert("TSModuleBlock", node, opts); + } + function assertTSImportType(node, opts) { + assert("TSImportType", node, opts); + } + function assertTSImportEqualsDeclaration(node, opts) { + assert("TSImportEqualsDeclaration", node, opts); + } + function assertTSExternalModuleReference(node, opts) { + assert("TSExternalModuleReference", node, opts); + } + function assertTSNonNullExpression(node, opts) { + assert("TSNonNullExpression", node, opts); + } + function assertTSExportAssignment(node, opts) { + assert("TSExportAssignment", node, opts); + } + function assertTSNamespaceExportDeclaration(node, opts) { + assert("TSNamespaceExportDeclaration", node, opts); + } + function assertTSTypeAnnotation(node, opts) { + assert("TSTypeAnnotation", node, opts); + } + function assertTSTypeParameterInstantiation(node, opts) { + assert("TSTypeParameterInstantiation", node, opts); + } + function assertTSTypeParameterDeclaration(node, opts) { + assert("TSTypeParameterDeclaration", node, opts); + } + function assertTSTypeParameter(node, opts) { + assert("TSTypeParameter", node, opts); + } + function assertStandardized(node, opts) { + assert("Standardized", node, opts); + } + function assertExpression(node, opts) { + assert("Expression", node, opts); + } + function assertBinary(node, opts) { + assert("Binary", node, opts); + } + function assertScopable(node, opts) { + assert("Scopable", node, opts); + } + function assertBlockParent(node, opts) { + assert("BlockParent", node, opts); + } + function assertBlock(node, opts) { + assert("Block", node, opts); + } + function assertStatement(node, opts) { + assert("Statement", node, opts); + } + function assertTerminatorless(node, opts) { + assert("Terminatorless", node, opts); + } + function assertCompletionStatement(node, opts) { + assert("CompletionStatement", node, opts); + } + function assertConditional(node, opts) { + assert("Conditional", node, opts); + } + function assertLoop(node, opts) { + assert("Loop", node, opts); + } + function assertWhile(node, opts) { + assert("While", node, opts); + } + function assertExpressionWrapper(node, opts) { + assert("ExpressionWrapper", node, opts); + } + function assertFor(node, opts) { + assert("For", node, opts); + } + function assertForXStatement(node, opts) { + assert("ForXStatement", node, opts); + } + function assertFunction(node, opts) { + assert("Function", node, opts); + } + function assertFunctionParent(node, opts) { + assert("FunctionParent", node, opts); + } + function assertPureish(node, opts) { + assert("Pureish", node, opts); + } + function assertDeclaration(node, opts) { + assert("Declaration", node, opts); + } + function assertPatternLike(node, opts) { + assert("PatternLike", node, opts); + } + function assertLVal(node, opts) { + assert("LVal", node, opts); + } + function assertTSEntityName(node, opts) { + assert("TSEntityName", node, opts); + } + function assertLiteral(node, opts) { + assert("Literal", node, opts); + } + function assertImmutable(node, opts) { + assert("Immutable", node, opts); + } + function assertUserWhitespacable(node, opts) { + assert("UserWhitespacable", node, opts); + } + function assertMethod(node, opts) { + assert("Method", node, opts); + } + function assertObjectMember(node, opts) { + assert("ObjectMember", node, opts); + } + function assertProperty(node, opts) { + assert("Property", node, opts); + } + function assertUnaryLike(node, opts) { + assert("UnaryLike", node, opts); + } + function assertPattern(node, opts) { + assert("Pattern", node, opts); + } + function assertClass(node, opts) { + assert("Class", node, opts); + } + function assertImportOrExportDeclaration(node, opts) { + assert("ImportOrExportDeclaration", node, opts); + } + function assertExportDeclaration(node, opts) { + assert("ExportDeclaration", node, opts); + } + function assertModuleSpecifier(node, opts) { + assert("ModuleSpecifier", node, opts); + } + function assertAccessor(node, opts) { + assert("Accessor", node, opts); + } + function assertPrivate(node, opts) { + assert("Private", node, opts); + } + function assertFlow(node, opts) { + assert("Flow", node, opts); + } + function assertFlowType(node, opts) { + assert("FlowType", node, opts); + } + function assertFlowBaseAnnotation(node, opts) { + assert("FlowBaseAnnotation", node, opts); + } + function assertFlowDeclaration(node, opts) { + assert("FlowDeclaration", node, opts); + } + function assertFlowPredicate(node, opts) { + assert("FlowPredicate", node, opts); + } + function assertEnumBody(node, opts) { + assert("EnumBody", node, opts); + } + function assertEnumMember(node, opts) { + assert("EnumMember", node, opts); + } + function assertJSX(node, opts) { + assert("JSX", node, opts); + } + function assertMiscellaneous(node, opts) { + assert("Miscellaneous", node, opts); + } + function assertTypeScript(node, opts) { + assert("TypeScript", node, opts); + } + function assertTSTypeElement(node, opts) { + assert("TSTypeElement", node, opts); + } + function assertTSType(node, opts) { + assert("TSType", node, opts); + } + function assertTSBaseType(node, opts) { + assert("TSBaseType", node, opts); + } + function assertNumberLiteral(node, opts) { + (0, _deprecationWarning.default)("assertNumberLiteral", "assertNumericLiteral"); + assert("NumberLiteral", node, opts); + } + function assertRegexLiteral(node, opts) { + (0, _deprecationWarning.default)("assertRegexLiteral", "assertRegExpLiteral"); + assert("RegexLiteral", node, opts); + } + function assertRestProperty(node, opts) { + (0, _deprecationWarning.default)("assertRestProperty", "assertRestElement"); + assert("RestProperty", node, opts); + } + function assertSpreadProperty(node, opts) { + (0, _deprecationWarning.default)("assertSpreadProperty", "assertSpreadElement"); + assert("SpreadProperty", node, opts); + } + function assertModuleDeclaration(node, opts) { + (0, _deprecationWarning.default)("assertModuleDeclaration", "assertImportOrExportDeclaration"); + assert("ModuleDeclaration", node, opts); + } + + + return generated$1; +} + +var createTypeAnnotationBasedOnTypeof = {}; + +var hasRequiredCreateTypeAnnotationBasedOnTypeof; + +function requireCreateTypeAnnotationBasedOnTypeof () { + if (hasRequiredCreateTypeAnnotationBasedOnTypeof) return createTypeAnnotationBasedOnTypeof; + hasRequiredCreateTypeAnnotationBasedOnTypeof = 1; + + Object.defineProperty(createTypeAnnotationBasedOnTypeof, "__esModule", { + value: true + }); + createTypeAnnotationBasedOnTypeof.default = void 0; + var _index = requireGenerated$2(); + createTypeAnnotationBasedOnTypeof.default = createTypeAnnotationBasedOnTypeof$1; + function createTypeAnnotationBasedOnTypeof$1(type) { + switch (type) { + case "string": + return (0, _index.stringTypeAnnotation)(); + case "number": + return (0, _index.numberTypeAnnotation)(); + case "undefined": + return (0, _index.voidTypeAnnotation)(); + case "boolean": + return (0, _index.booleanTypeAnnotation)(); + case "function": + return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Function")); + case "object": + return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Object")); + case "symbol": + return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Symbol")); + case "bigint": + return (0, _index.anyTypeAnnotation)(); + } + throw new Error("Invalid typeof value: " + type); + } + + + return createTypeAnnotationBasedOnTypeof; +} + +var createFlowUnionType = {}; + +var removeTypeDuplicates$1 = {}; + +var hasRequiredRemoveTypeDuplicates$1; + +function requireRemoveTypeDuplicates$1 () { + if (hasRequiredRemoveTypeDuplicates$1) return removeTypeDuplicates$1; + hasRequiredRemoveTypeDuplicates$1 = 1; + + Object.defineProperty(removeTypeDuplicates$1, "__esModule", { + value: true + }); + removeTypeDuplicates$1.default = removeTypeDuplicates; + var _index = requireGenerated$3(); + function getQualifiedName(node) { + return (0, _index.isIdentifier)(node) ? node.name : `${node.id.name}.${getQualifiedName(node.qualification)}`; + } + function removeTypeDuplicates(nodesIn) { + const nodes = Array.from(nodesIn); + const generics = new Map(); + const bases = new Map(); + const typeGroups = new Set(); + const types = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node) continue; + if (types.includes(node)) { + continue; + } + if ((0, _index.isAnyTypeAnnotation)(node)) { + return [node]; + } + if ((0, _index.isFlowBaseAnnotation)(node)) { + bases.set(node.type, node); + continue; + } + if ((0, _index.isUnionTypeAnnotation)(node)) { + if (!typeGroups.has(node.types)) { + nodes.push(...node.types); + typeGroups.add(node.types); + } + continue; + } + if ((0, _index.isGenericTypeAnnotation)(node)) { + const name = getQualifiedName(node.id); + if (generics.has(name)) { + let existing = generics.get(name); + if (existing.typeParameters) { + if (node.typeParameters) { + existing.typeParameters.params.push(...node.typeParameters.params); + existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params); + } + } else { + existing = node.typeParameters; + } + } else { + generics.set(name, node); + } + continue; + } + types.push(node); + } + for (const [, baseType] of bases) { + types.push(baseType); + } + for (const [, genericName] of generics) { + types.push(genericName); + } + return types; + } + + + return removeTypeDuplicates$1; +} + +var hasRequiredCreateFlowUnionType; + +function requireCreateFlowUnionType () { + if (hasRequiredCreateFlowUnionType) return createFlowUnionType; + hasRequiredCreateFlowUnionType = 1; + + Object.defineProperty(createFlowUnionType, "__esModule", { + value: true + }); + createFlowUnionType.default = createFlowUnionType$1; + var _index = requireGenerated$2(); + var _removeTypeDuplicates = requireRemoveTypeDuplicates$1(); + function createFlowUnionType$1(types) { + const flattened = (0, _removeTypeDuplicates.default)(types); + if (flattened.length === 1) { + return flattened[0]; + } else { + return (0, _index.unionTypeAnnotation)(flattened); + } + } + + + return createFlowUnionType; +} + +var createTSUnionType = {}; + +var removeTypeDuplicates = {}; + +var hasRequiredRemoveTypeDuplicates; + +function requireRemoveTypeDuplicates () { + if (hasRequiredRemoveTypeDuplicates) return removeTypeDuplicates; + hasRequiredRemoveTypeDuplicates = 1; + + Object.defineProperty(removeTypeDuplicates, "__esModule", { + value: true + }); + removeTypeDuplicates.default = removeTypeDuplicates$1; + var _index = requireGenerated$3(); + function getQualifiedName(node) { + return (0, _index.isIdentifier)(node) ? node.name : `${node.right.name}.${getQualifiedName(node.left)}`; + } + function removeTypeDuplicates$1(nodesIn) { + const nodes = Array.from(nodesIn); + const generics = new Map(); + const bases = new Map(); + const typeGroups = new Set(); + const types = []; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node) continue; + if (types.includes(node)) { + continue; + } + if ((0, _index.isTSAnyKeyword)(node)) { + return [node]; + } + if ((0, _index.isTSBaseType)(node)) { + bases.set(node.type, node); + continue; + } + if ((0, _index.isTSUnionType)(node)) { + if (!typeGroups.has(node.types)) { + nodes.push(...node.types); + typeGroups.add(node.types); + } + continue; + } + if ((0, _index.isTSTypeReference)(node) && node.typeParameters) { + const name = getQualifiedName(node.typeName); + if (generics.has(name)) { + let existing = generics.get(name); + if (existing.typeParameters) { + if (node.typeParameters) { + existing.typeParameters.params.push(...node.typeParameters.params); + existing.typeParameters.params = removeTypeDuplicates$1(existing.typeParameters.params); + } + } else { + existing = node.typeParameters; + } + } else { + generics.set(name, node); + } + continue; + } + types.push(node); + } + for (const [, baseType] of bases) { + types.push(baseType); + } + for (const [, genericName] of generics) { + types.push(genericName); + } + return types; + } + + + return removeTypeDuplicates; +} + +var hasRequiredCreateTSUnionType; + +function requireCreateTSUnionType () { + if (hasRequiredCreateTSUnionType) return createTSUnionType; + hasRequiredCreateTSUnionType = 1; + + Object.defineProperty(createTSUnionType, "__esModule", { + value: true + }); + createTSUnionType.default = createTSUnionType$1; + var _index = requireGenerated$2(); + var _removeTypeDuplicates = requireRemoveTypeDuplicates(); + var _index2 = requireGenerated$3(); + function createTSUnionType$1(typeAnnotations) { + const types = typeAnnotations.map(type => { + return (0, _index2.isTSTypeAnnotation)(type) ? type.typeAnnotation : type; + }); + const flattened = (0, _removeTypeDuplicates.default)(types); + if (flattened.length === 1) { + return flattened[0]; + } else { + return (0, _index.tsUnionType)(flattened); + } + } + + + return createTSUnionType; +} + +var uppercase = {}; + +var hasRequiredUppercase; + +function requireUppercase () { + if (hasRequiredUppercase) return uppercase; + hasRequiredUppercase = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "AnyTypeAnnotation", { + enumerable: true, + get: function () { + return _index.anyTypeAnnotation; + } + }); + Object.defineProperty(exports, "ArgumentPlaceholder", { + enumerable: true, + get: function () { + return _index.argumentPlaceholder; + } + }); + Object.defineProperty(exports, "ArrayExpression", { + enumerable: true, + get: function () { + return _index.arrayExpression; + } + }); + Object.defineProperty(exports, "ArrayPattern", { + enumerable: true, + get: function () { + return _index.arrayPattern; + } + }); + Object.defineProperty(exports, "ArrayTypeAnnotation", { + enumerable: true, + get: function () { + return _index.arrayTypeAnnotation; + } + }); + Object.defineProperty(exports, "ArrowFunctionExpression", { + enumerable: true, + get: function () { + return _index.arrowFunctionExpression; + } + }); + Object.defineProperty(exports, "AssignmentExpression", { + enumerable: true, + get: function () { + return _index.assignmentExpression; + } + }); + Object.defineProperty(exports, "AssignmentPattern", { + enumerable: true, + get: function () { + return _index.assignmentPattern; + } + }); + Object.defineProperty(exports, "AwaitExpression", { + enumerable: true, + get: function () { + return _index.awaitExpression; + } + }); + Object.defineProperty(exports, "BigIntLiteral", { + enumerable: true, + get: function () { + return _index.bigIntLiteral; + } + }); + Object.defineProperty(exports, "BinaryExpression", { + enumerable: true, + get: function () { + return _index.binaryExpression; + } + }); + Object.defineProperty(exports, "BindExpression", { + enumerable: true, + get: function () { + return _index.bindExpression; + } + }); + Object.defineProperty(exports, "BlockStatement", { + enumerable: true, + get: function () { + return _index.blockStatement; + } + }); + Object.defineProperty(exports, "BooleanLiteral", { + enumerable: true, + get: function () { + return _index.booleanLiteral; + } + }); + Object.defineProperty(exports, "BooleanLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.booleanLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "BooleanTypeAnnotation", { + enumerable: true, + get: function () { + return _index.booleanTypeAnnotation; + } + }); + Object.defineProperty(exports, "BreakStatement", { + enumerable: true, + get: function () { + return _index.breakStatement; + } + }); + Object.defineProperty(exports, "CallExpression", { + enumerable: true, + get: function () { + return _index.callExpression; + } + }); + Object.defineProperty(exports, "CatchClause", { + enumerable: true, + get: function () { + return _index.catchClause; + } + }); + Object.defineProperty(exports, "ClassAccessorProperty", { + enumerable: true, + get: function () { + return _index.classAccessorProperty; + } + }); + Object.defineProperty(exports, "ClassBody", { + enumerable: true, + get: function () { + return _index.classBody; + } + }); + Object.defineProperty(exports, "ClassDeclaration", { + enumerable: true, + get: function () { + return _index.classDeclaration; + } + }); + Object.defineProperty(exports, "ClassExpression", { + enumerable: true, + get: function () { + return _index.classExpression; + } + }); + Object.defineProperty(exports, "ClassImplements", { + enumerable: true, + get: function () { + return _index.classImplements; + } + }); + Object.defineProperty(exports, "ClassMethod", { + enumerable: true, + get: function () { + return _index.classMethod; + } + }); + Object.defineProperty(exports, "ClassPrivateMethod", { + enumerable: true, + get: function () { + return _index.classPrivateMethod; + } + }); + Object.defineProperty(exports, "ClassPrivateProperty", { + enumerable: true, + get: function () { + return _index.classPrivateProperty; + } + }); + Object.defineProperty(exports, "ClassProperty", { + enumerable: true, + get: function () { + return _index.classProperty; + } + }); + Object.defineProperty(exports, "ConditionalExpression", { + enumerable: true, + get: function () { + return _index.conditionalExpression; + } + }); + Object.defineProperty(exports, "ContinueStatement", { + enumerable: true, + get: function () { + return _index.continueStatement; + } + }); + Object.defineProperty(exports, "DebuggerStatement", { + enumerable: true, + get: function () { + return _index.debuggerStatement; + } + }); + Object.defineProperty(exports, "DecimalLiteral", { + enumerable: true, + get: function () { + return _index.decimalLiteral; + } + }); + Object.defineProperty(exports, "DeclareClass", { + enumerable: true, + get: function () { + return _index.declareClass; + } + }); + Object.defineProperty(exports, "DeclareExportAllDeclaration", { + enumerable: true, + get: function () { + return _index.declareExportAllDeclaration; + } + }); + Object.defineProperty(exports, "DeclareExportDeclaration", { + enumerable: true, + get: function () { + return _index.declareExportDeclaration; + } + }); + Object.defineProperty(exports, "DeclareFunction", { + enumerable: true, + get: function () { + return _index.declareFunction; + } + }); + Object.defineProperty(exports, "DeclareInterface", { + enumerable: true, + get: function () { + return _index.declareInterface; + } + }); + Object.defineProperty(exports, "DeclareModule", { + enumerable: true, + get: function () { + return _index.declareModule; + } + }); + Object.defineProperty(exports, "DeclareModuleExports", { + enumerable: true, + get: function () { + return _index.declareModuleExports; + } + }); + Object.defineProperty(exports, "DeclareOpaqueType", { + enumerable: true, + get: function () { + return _index.declareOpaqueType; + } + }); + Object.defineProperty(exports, "DeclareTypeAlias", { + enumerable: true, + get: function () { + return _index.declareTypeAlias; + } + }); + Object.defineProperty(exports, "DeclareVariable", { + enumerable: true, + get: function () { + return _index.declareVariable; + } + }); + Object.defineProperty(exports, "DeclaredPredicate", { + enumerable: true, + get: function () { + return _index.declaredPredicate; + } + }); + Object.defineProperty(exports, "Decorator", { + enumerable: true, + get: function () { + return _index.decorator; + } + }); + Object.defineProperty(exports, "Directive", { + enumerable: true, + get: function () { + return _index.directive; + } + }); + Object.defineProperty(exports, "DirectiveLiteral", { + enumerable: true, + get: function () { + return _index.directiveLiteral; + } + }); + Object.defineProperty(exports, "DoExpression", { + enumerable: true, + get: function () { + return _index.doExpression; + } + }); + Object.defineProperty(exports, "DoWhileStatement", { + enumerable: true, + get: function () { + return _index.doWhileStatement; + } + }); + Object.defineProperty(exports, "EmptyStatement", { + enumerable: true, + get: function () { + return _index.emptyStatement; + } + }); + Object.defineProperty(exports, "EmptyTypeAnnotation", { + enumerable: true, + get: function () { + return _index.emptyTypeAnnotation; + } + }); + Object.defineProperty(exports, "EnumBooleanBody", { + enumerable: true, + get: function () { + return _index.enumBooleanBody; + } + }); + Object.defineProperty(exports, "EnumBooleanMember", { + enumerable: true, + get: function () { + return _index.enumBooleanMember; + } + }); + Object.defineProperty(exports, "EnumDeclaration", { + enumerable: true, + get: function () { + return _index.enumDeclaration; + } + }); + Object.defineProperty(exports, "EnumDefaultedMember", { + enumerable: true, + get: function () { + return _index.enumDefaultedMember; + } + }); + Object.defineProperty(exports, "EnumNumberBody", { + enumerable: true, + get: function () { + return _index.enumNumberBody; + } + }); + Object.defineProperty(exports, "EnumNumberMember", { + enumerable: true, + get: function () { + return _index.enumNumberMember; + } + }); + Object.defineProperty(exports, "EnumStringBody", { + enumerable: true, + get: function () { + return _index.enumStringBody; + } + }); + Object.defineProperty(exports, "EnumStringMember", { + enumerable: true, + get: function () { + return _index.enumStringMember; + } + }); + Object.defineProperty(exports, "EnumSymbolBody", { + enumerable: true, + get: function () { + return _index.enumSymbolBody; + } + }); + Object.defineProperty(exports, "ExistsTypeAnnotation", { + enumerable: true, + get: function () { + return _index.existsTypeAnnotation; + } + }); + Object.defineProperty(exports, "ExportAllDeclaration", { + enumerable: true, + get: function () { + return _index.exportAllDeclaration; + } + }); + Object.defineProperty(exports, "ExportDefaultDeclaration", { + enumerable: true, + get: function () { + return _index.exportDefaultDeclaration; + } + }); + Object.defineProperty(exports, "ExportDefaultSpecifier", { + enumerable: true, + get: function () { + return _index.exportDefaultSpecifier; + } + }); + Object.defineProperty(exports, "ExportNamedDeclaration", { + enumerable: true, + get: function () { + return _index.exportNamedDeclaration; + } + }); + Object.defineProperty(exports, "ExportNamespaceSpecifier", { + enumerable: true, + get: function () { + return _index.exportNamespaceSpecifier; + } + }); + Object.defineProperty(exports, "ExportSpecifier", { + enumerable: true, + get: function () { + return _index.exportSpecifier; + } + }); + Object.defineProperty(exports, "ExpressionStatement", { + enumerable: true, + get: function () { + return _index.expressionStatement; + } + }); + Object.defineProperty(exports, "File", { + enumerable: true, + get: function () { + return _index.file; + } + }); + Object.defineProperty(exports, "ForInStatement", { + enumerable: true, + get: function () { + return _index.forInStatement; + } + }); + Object.defineProperty(exports, "ForOfStatement", { + enumerable: true, + get: function () { + return _index.forOfStatement; + } + }); + Object.defineProperty(exports, "ForStatement", { + enumerable: true, + get: function () { + return _index.forStatement; + } + }); + Object.defineProperty(exports, "FunctionDeclaration", { + enumerable: true, + get: function () { + return _index.functionDeclaration; + } + }); + Object.defineProperty(exports, "FunctionExpression", { + enumerable: true, + get: function () { + return _index.functionExpression; + } + }); + Object.defineProperty(exports, "FunctionTypeAnnotation", { + enumerable: true, + get: function () { + return _index.functionTypeAnnotation; + } + }); + Object.defineProperty(exports, "FunctionTypeParam", { + enumerable: true, + get: function () { + return _index.functionTypeParam; + } + }); + Object.defineProperty(exports, "GenericTypeAnnotation", { + enumerable: true, + get: function () { + return _index.genericTypeAnnotation; + } + }); + Object.defineProperty(exports, "Identifier", { + enumerable: true, + get: function () { + return _index.identifier; + } + }); + Object.defineProperty(exports, "IfStatement", { + enumerable: true, + get: function () { + return _index.ifStatement; + } + }); + Object.defineProperty(exports, "Import", { + enumerable: true, + get: function () { + return _index.import; + } + }); + Object.defineProperty(exports, "ImportAttribute", { + enumerable: true, + get: function () { + return _index.importAttribute; + } + }); + Object.defineProperty(exports, "ImportDeclaration", { + enumerable: true, + get: function () { + return _index.importDeclaration; + } + }); + Object.defineProperty(exports, "ImportDefaultSpecifier", { + enumerable: true, + get: function () { + return _index.importDefaultSpecifier; + } + }); + Object.defineProperty(exports, "ImportExpression", { + enumerable: true, + get: function () { + return _index.importExpression; + } + }); + Object.defineProperty(exports, "ImportNamespaceSpecifier", { + enumerable: true, + get: function () { + return _index.importNamespaceSpecifier; + } + }); + Object.defineProperty(exports, "ImportSpecifier", { + enumerable: true, + get: function () { + return _index.importSpecifier; + } + }); + Object.defineProperty(exports, "IndexedAccessType", { + enumerable: true, + get: function () { + return _index.indexedAccessType; + } + }); + Object.defineProperty(exports, "InferredPredicate", { + enumerable: true, + get: function () { + return _index.inferredPredicate; + } + }); + Object.defineProperty(exports, "InterfaceDeclaration", { + enumerable: true, + get: function () { + return _index.interfaceDeclaration; + } + }); + Object.defineProperty(exports, "InterfaceExtends", { + enumerable: true, + get: function () { + return _index.interfaceExtends; + } + }); + Object.defineProperty(exports, "InterfaceTypeAnnotation", { + enumerable: true, + get: function () { + return _index.interfaceTypeAnnotation; + } + }); + Object.defineProperty(exports, "InterpreterDirective", { + enumerable: true, + get: function () { + return _index.interpreterDirective; + } + }); + Object.defineProperty(exports, "IntersectionTypeAnnotation", { + enumerable: true, + get: function () { + return _index.intersectionTypeAnnotation; + } + }); + Object.defineProperty(exports, "JSXAttribute", { + enumerable: true, + get: function () { + return _index.jsxAttribute; + } + }); + Object.defineProperty(exports, "JSXClosingElement", { + enumerable: true, + get: function () { + return _index.jsxClosingElement; + } + }); + Object.defineProperty(exports, "JSXClosingFragment", { + enumerable: true, + get: function () { + return _index.jsxClosingFragment; + } + }); + Object.defineProperty(exports, "JSXElement", { + enumerable: true, + get: function () { + return _index.jsxElement; + } + }); + Object.defineProperty(exports, "JSXEmptyExpression", { + enumerable: true, + get: function () { + return _index.jsxEmptyExpression; + } + }); + Object.defineProperty(exports, "JSXExpressionContainer", { + enumerable: true, + get: function () { + return _index.jsxExpressionContainer; + } + }); + Object.defineProperty(exports, "JSXFragment", { + enumerable: true, + get: function () { + return _index.jsxFragment; + } + }); + Object.defineProperty(exports, "JSXIdentifier", { + enumerable: true, + get: function () { + return _index.jsxIdentifier; + } + }); + Object.defineProperty(exports, "JSXMemberExpression", { + enumerable: true, + get: function () { + return _index.jsxMemberExpression; + } + }); + Object.defineProperty(exports, "JSXNamespacedName", { + enumerable: true, + get: function () { + return _index.jsxNamespacedName; + } + }); + Object.defineProperty(exports, "JSXOpeningElement", { + enumerable: true, + get: function () { + return _index.jsxOpeningElement; + } + }); + Object.defineProperty(exports, "JSXOpeningFragment", { + enumerable: true, + get: function () { + return _index.jsxOpeningFragment; + } + }); + Object.defineProperty(exports, "JSXSpreadAttribute", { + enumerable: true, + get: function () { + return _index.jsxSpreadAttribute; + } + }); + Object.defineProperty(exports, "JSXSpreadChild", { + enumerable: true, + get: function () { + return _index.jsxSpreadChild; + } + }); + Object.defineProperty(exports, "JSXText", { + enumerable: true, + get: function () { + return _index.jsxText; + } + }); + Object.defineProperty(exports, "LabeledStatement", { + enumerable: true, + get: function () { + return _index.labeledStatement; + } + }); + Object.defineProperty(exports, "LogicalExpression", { + enumerable: true, + get: function () { + return _index.logicalExpression; + } + }); + Object.defineProperty(exports, "MemberExpression", { + enumerable: true, + get: function () { + return _index.memberExpression; + } + }); + Object.defineProperty(exports, "MetaProperty", { + enumerable: true, + get: function () { + return _index.metaProperty; + } + }); + Object.defineProperty(exports, "MixedTypeAnnotation", { + enumerable: true, + get: function () { + return _index.mixedTypeAnnotation; + } + }); + Object.defineProperty(exports, "ModuleExpression", { + enumerable: true, + get: function () { + return _index.moduleExpression; + } + }); + Object.defineProperty(exports, "NewExpression", { + enumerable: true, + get: function () { + return _index.newExpression; + } + }); + Object.defineProperty(exports, "Noop", { + enumerable: true, + get: function () { + return _index.noop; + } + }); + Object.defineProperty(exports, "NullLiteral", { + enumerable: true, + get: function () { + return _index.nullLiteral; + } + }); + Object.defineProperty(exports, "NullLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.nullLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "NullableTypeAnnotation", { + enumerable: true, + get: function () { + return _index.nullableTypeAnnotation; + } + }); + Object.defineProperty(exports, "NumberLiteral", { + enumerable: true, + get: function () { + return _index.numberLiteral; + } + }); + Object.defineProperty(exports, "NumberLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.numberLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "NumberTypeAnnotation", { + enumerable: true, + get: function () { + return _index.numberTypeAnnotation; + } + }); + Object.defineProperty(exports, "NumericLiteral", { + enumerable: true, + get: function () { + return _index.numericLiteral; + } + }); + Object.defineProperty(exports, "ObjectExpression", { + enumerable: true, + get: function () { + return _index.objectExpression; + } + }); + Object.defineProperty(exports, "ObjectMethod", { + enumerable: true, + get: function () { + return _index.objectMethod; + } + }); + Object.defineProperty(exports, "ObjectPattern", { + enumerable: true, + get: function () { + return _index.objectPattern; + } + }); + Object.defineProperty(exports, "ObjectProperty", { + enumerable: true, + get: function () { + return _index.objectProperty; + } + }); + Object.defineProperty(exports, "ObjectTypeAnnotation", { + enumerable: true, + get: function () { + return _index.objectTypeAnnotation; + } + }); + Object.defineProperty(exports, "ObjectTypeCallProperty", { + enumerable: true, + get: function () { + return _index.objectTypeCallProperty; + } + }); + Object.defineProperty(exports, "ObjectTypeIndexer", { + enumerable: true, + get: function () { + return _index.objectTypeIndexer; + } + }); + Object.defineProperty(exports, "ObjectTypeInternalSlot", { + enumerable: true, + get: function () { + return _index.objectTypeInternalSlot; + } + }); + Object.defineProperty(exports, "ObjectTypeProperty", { + enumerable: true, + get: function () { + return _index.objectTypeProperty; + } + }); + Object.defineProperty(exports, "ObjectTypeSpreadProperty", { + enumerable: true, + get: function () { + return _index.objectTypeSpreadProperty; + } + }); + Object.defineProperty(exports, "OpaqueType", { + enumerable: true, + get: function () { + return _index.opaqueType; + } + }); + Object.defineProperty(exports, "OptionalCallExpression", { + enumerable: true, + get: function () { + return _index.optionalCallExpression; + } + }); + Object.defineProperty(exports, "OptionalIndexedAccessType", { + enumerable: true, + get: function () { + return _index.optionalIndexedAccessType; + } + }); + Object.defineProperty(exports, "OptionalMemberExpression", { + enumerable: true, + get: function () { + return _index.optionalMemberExpression; + } + }); + Object.defineProperty(exports, "ParenthesizedExpression", { + enumerable: true, + get: function () { + return _index.parenthesizedExpression; + } + }); + Object.defineProperty(exports, "PipelineBareFunction", { + enumerable: true, + get: function () { + return _index.pipelineBareFunction; + } + }); + Object.defineProperty(exports, "PipelinePrimaryTopicReference", { + enumerable: true, + get: function () { + return _index.pipelinePrimaryTopicReference; + } + }); + Object.defineProperty(exports, "PipelineTopicExpression", { + enumerable: true, + get: function () { + return _index.pipelineTopicExpression; + } + }); + Object.defineProperty(exports, "Placeholder", { + enumerable: true, + get: function () { + return _index.placeholder; + } + }); + Object.defineProperty(exports, "PrivateName", { + enumerable: true, + get: function () { + return _index.privateName; + } + }); + Object.defineProperty(exports, "Program", { + enumerable: true, + get: function () { + return _index.program; + } + }); + Object.defineProperty(exports, "QualifiedTypeIdentifier", { + enumerable: true, + get: function () { + return _index.qualifiedTypeIdentifier; + } + }); + Object.defineProperty(exports, "RecordExpression", { + enumerable: true, + get: function () { + return _index.recordExpression; + } + }); + Object.defineProperty(exports, "RegExpLiteral", { + enumerable: true, + get: function () { + return _index.regExpLiteral; + } + }); + Object.defineProperty(exports, "RegexLiteral", { + enumerable: true, + get: function () { + return _index.regexLiteral; + } + }); + Object.defineProperty(exports, "RestElement", { + enumerable: true, + get: function () { + return _index.restElement; + } + }); + Object.defineProperty(exports, "RestProperty", { + enumerable: true, + get: function () { + return _index.restProperty; + } + }); + Object.defineProperty(exports, "ReturnStatement", { + enumerable: true, + get: function () { + return _index.returnStatement; + } + }); + Object.defineProperty(exports, "SequenceExpression", { + enumerable: true, + get: function () { + return _index.sequenceExpression; + } + }); + Object.defineProperty(exports, "SpreadElement", { + enumerable: true, + get: function () { + return _index.spreadElement; + } + }); + Object.defineProperty(exports, "SpreadProperty", { + enumerable: true, + get: function () { + return _index.spreadProperty; + } + }); + Object.defineProperty(exports, "StaticBlock", { + enumerable: true, + get: function () { + return _index.staticBlock; + } + }); + Object.defineProperty(exports, "StringLiteral", { + enumerable: true, + get: function () { + return _index.stringLiteral; + } + }); + Object.defineProperty(exports, "StringLiteralTypeAnnotation", { + enumerable: true, + get: function () { + return _index.stringLiteralTypeAnnotation; + } + }); + Object.defineProperty(exports, "StringTypeAnnotation", { + enumerable: true, + get: function () { + return _index.stringTypeAnnotation; + } + }); + Object.defineProperty(exports, "Super", { + enumerable: true, + get: function () { + return _index.super; + } + }); + Object.defineProperty(exports, "SwitchCase", { + enumerable: true, + get: function () { + return _index.switchCase; + } + }); + Object.defineProperty(exports, "SwitchStatement", { + enumerable: true, + get: function () { + return _index.switchStatement; + } + }); + Object.defineProperty(exports, "SymbolTypeAnnotation", { + enumerable: true, + get: function () { + return _index.symbolTypeAnnotation; + } + }); + Object.defineProperty(exports, "TSAnyKeyword", { + enumerable: true, + get: function () { + return _index.tsAnyKeyword; + } + }); + Object.defineProperty(exports, "TSArrayType", { + enumerable: true, + get: function () { + return _index.tsArrayType; + } + }); + Object.defineProperty(exports, "TSAsExpression", { + enumerable: true, + get: function () { + return _index.tsAsExpression; + } + }); + Object.defineProperty(exports, "TSBigIntKeyword", { + enumerable: true, + get: function () { + return _index.tsBigIntKeyword; + } + }); + Object.defineProperty(exports, "TSBooleanKeyword", { + enumerable: true, + get: function () { + return _index.tsBooleanKeyword; + } + }); + Object.defineProperty(exports, "TSCallSignatureDeclaration", { + enumerable: true, + get: function () { + return _index.tsCallSignatureDeclaration; + } + }); + Object.defineProperty(exports, "TSConditionalType", { + enumerable: true, + get: function () { + return _index.tsConditionalType; + } + }); + Object.defineProperty(exports, "TSConstructSignatureDeclaration", { + enumerable: true, + get: function () { + return _index.tsConstructSignatureDeclaration; + } + }); + Object.defineProperty(exports, "TSConstructorType", { + enumerable: true, + get: function () { + return _index.tsConstructorType; + } + }); + Object.defineProperty(exports, "TSDeclareFunction", { + enumerable: true, + get: function () { + return _index.tsDeclareFunction; + } + }); + Object.defineProperty(exports, "TSDeclareMethod", { + enumerable: true, + get: function () { + return _index.tsDeclareMethod; + } + }); + Object.defineProperty(exports, "TSEnumDeclaration", { + enumerable: true, + get: function () { + return _index.tsEnumDeclaration; + } + }); + Object.defineProperty(exports, "TSEnumMember", { + enumerable: true, + get: function () { + return _index.tsEnumMember; + } + }); + Object.defineProperty(exports, "TSExportAssignment", { + enumerable: true, + get: function () { + return _index.tsExportAssignment; + } + }); + Object.defineProperty(exports, "TSExpressionWithTypeArguments", { + enumerable: true, + get: function () { + return _index.tsExpressionWithTypeArguments; + } + }); + Object.defineProperty(exports, "TSExternalModuleReference", { + enumerable: true, + get: function () { + return _index.tsExternalModuleReference; + } + }); + Object.defineProperty(exports, "TSFunctionType", { + enumerable: true, + get: function () { + return _index.tsFunctionType; + } + }); + Object.defineProperty(exports, "TSImportEqualsDeclaration", { + enumerable: true, + get: function () { + return _index.tsImportEqualsDeclaration; + } + }); + Object.defineProperty(exports, "TSImportType", { + enumerable: true, + get: function () { + return _index.tsImportType; + } + }); + Object.defineProperty(exports, "TSIndexSignature", { + enumerable: true, + get: function () { + return _index.tsIndexSignature; + } + }); + Object.defineProperty(exports, "TSIndexedAccessType", { + enumerable: true, + get: function () { + return _index.tsIndexedAccessType; + } + }); + Object.defineProperty(exports, "TSInferType", { + enumerable: true, + get: function () { + return _index.tsInferType; + } + }); + Object.defineProperty(exports, "TSInstantiationExpression", { + enumerable: true, + get: function () { + return _index.tsInstantiationExpression; + } + }); + Object.defineProperty(exports, "TSInterfaceBody", { + enumerable: true, + get: function () { + return _index.tsInterfaceBody; + } + }); + Object.defineProperty(exports, "TSInterfaceDeclaration", { + enumerable: true, + get: function () { + return _index.tsInterfaceDeclaration; + } + }); + Object.defineProperty(exports, "TSIntersectionType", { + enumerable: true, + get: function () { + return _index.tsIntersectionType; + } + }); + Object.defineProperty(exports, "TSIntrinsicKeyword", { + enumerable: true, + get: function () { + return _index.tsIntrinsicKeyword; + } + }); + Object.defineProperty(exports, "TSLiteralType", { + enumerable: true, + get: function () { + return _index.tsLiteralType; + } + }); + Object.defineProperty(exports, "TSMappedType", { + enumerable: true, + get: function () { + return _index.tsMappedType; + } + }); + Object.defineProperty(exports, "TSMethodSignature", { + enumerable: true, + get: function () { + return _index.tsMethodSignature; + } + }); + Object.defineProperty(exports, "TSModuleBlock", { + enumerable: true, + get: function () { + return _index.tsModuleBlock; + } + }); + Object.defineProperty(exports, "TSModuleDeclaration", { + enumerable: true, + get: function () { + return _index.tsModuleDeclaration; + } + }); + Object.defineProperty(exports, "TSNamedTupleMember", { + enumerable: true, + get: function () { + return _index.tsNamedTupleMember; + } + }); + Object.defineProperty(exports, "TSNamespaceExportDeclaration", { + enumerable: true, + get: function () { + return _index.tsNamespaceExportDeclaration; + } + }); + Object.defineProperty(exports, "TSNeverKeyword", { + enumerable: true, + get: function () { + return _index.tsNeverKeyword; + } + }); + Object.defineProperty(exports, "TSNonNullExpression", { + enumerable: true, + get: function () { + return _index.tsNonNullExpression; + } + }); + Object.defineProperty(exports, "TSNullKeyword", { + enumerable: true, + get: function () { + return _index.tsNullKeyword; + } + }); + Object.defineProperty(exports, "TSNumberKeyword", { + enumerable: true, + get: function () { + return _index.tsNumberKeyword; + } + }); + Object.defineProperty(exports, "TSObjectKeyword", { + enumerable: true, + get: function () { + return _index.tsObjectKeyword; + } + }); + Object.defineProperty(exports, "TSOptionalType", { + enumerable: true, + get: function () { + return _index.tsOptionalType; + } + }); + Object.defineProperty(exports, "TSParameterProperty", { + enumerable: true, + get: function () { + return _index.tsParameterProperty; + } + }); + Object.defineProperty(exports, "TSParenthesizedType", { + enumerable: true, + get: function () { + return _index.tsParenthesizedType; + } + }); + Object.defineProperty(exports, "TSPropertySignature", { + enumerable: true, + get: function () { + return _index.tsPropertySignature; + } + }); + Object.defineProperty(exports, "TSQualifiedName", { + enumerable: true, + get: function () { + return _index.tsQualifiedName; + } + }); + Object.defineProperty(exports, "TSRestType", { + enumerable: true, + get: function () { + return _index.tsRestType; + } + }); + Object.defineProperty(exports, "TSSatisfiesExpression", { + enumerable: true, + get: function () { + return _index.tsSatisfiesExpression; + } + }); + Object.defineProperty(exports, "TSStringKeyword", { + enumerable: true, + get: function () { + return _index.tsStringKeyword; + } + }); + Object.defineProperty(exports, "TSSymbolKeyword", { + enumerable: true, + get: function () { + return _index.tsSymbolKeyword; + } + }); + Object.defineProperty(exports, "TSThisType", { + enumerable: true, + get: function () { + return _index.tsThisType; + } + }); + Object.defineProperty(exports, "TSTupleType", { + enumerable: true, + get: function () { + return _index.tsTupleType; + } + }); + Object.defineProperty(exports, "TSTypeAliasDeclaration", { + enumerable: true, + get: function () { + return _index.tsTypeAliasDeclaration; + } + }); + Object.defineProperty(exports, "TSTypeAnnotation", { + enumerable: true, + get: function () { + return _index.tsTypeAnnotation; + } + }); + Object.defineProperty(exports, "TSTypeAssertion", { + enumerable: true, + get: function () { + return _index.tsTypeAssertion; + } + }); + Object.defineProperty(exports, "TSTypeLiteral", { + enumerable: true, + get: function () { + return _index.tsTypeLiteral; + } + }); + Object.defineProperty(exports, "TSTypeOperator", { + enumerable: true, + get: function () { + return _index.tsTypeOperator; + } + }); + Object.defineProperty(exports, "TSTypeParameter", { + enumerable: true, + get: function () { + return _index.tsTypeParameter; + } + }); + Object.defineProperty(exports, "TSTypeParameterDeclaration", { + enumerable: true, + get: function () { + return _index.tsTypeParameterDeclaration; + } + }); + Object.defineProperty(exports, "TSTypeParameterInstantiation", { + enumerable: true, + get: function () { + return _index.tsTypeParameterInstantiation; + } + }); + Object.defineProperty(exports, "TSTypePredicate", { + enumerable: true, + get: function () { + return _index.tsTypePredicate; + } + }); + Object.defineProperty(exports, "TSTypeQuery", { + enumerable: true, + get: function () { + return _index.tsTypeQuery; + } + }); + Object.defineProperty(exports, "TSTypeReference", { + enumerable: true, + get: function () { + return _index.tsTypeReference; + } + }); + Object.defineProperty(exports, "TSUndefinedKeyword", { + enumerable: true, + get: function () { + return _index.tsUndefinedKeyword; + } + }); + Object.defineProperty(exports, "TSUnionType", { + enumerable: true, + get: function () { + return _index.tsUnionType; + } + }); + Object.defineProperty(exports, "TSUnknownKeyword", { + enumerable: true, + get: function () { + return _index.tsUnknownKeyword; + } + }); + Object.defineProperty(exports, "TSVoidKeyword", { + enumerable: true, + get: function () { + return _index.tsVoidKeyword; + } + }); + Object.defineProperty(exports, "TaggedTemplateExpression", { + enumerable: true, + get: function () { + return _index.taggedTemplateExpression; + } + }); + Object.defineProperty(exports, "TemplateElement", { + enumerable: true, + get: function () { + return _index.templateElement; + } + }); + Object.defineProperty(exports, "TemplateLiteral", { + enumerable: true, + get: function () { + return _index.templateLiteral; + } + }); + Object.defineProperty(exports, "ThisExpression", { + enumerable: true, + get: function () { + return _index.thisExpression; + } + }); + Object.defineProperty(exports, "ThisTypeAnnotation", { + enumerable: true, + get: function () { + return _index.thisTypeAnnotation; + } + }); + Object.defineProperty(exports, "ThrowStatement", { + enumerable: true, + get: function () { + return _index.throwStatement; + } + }); + Object.defineProperty(exports, "TopicReference", { + enumerable: true, + get: function () { + return _index.topicReference; + } + }); + Object.defineProperty(exports, "TryStatement", { + enumerable: true, + get: function () { + return _index.tryStatement; + } + }); + Object.defineProperty(exports, "TupleExpression", { + enumerable: true, + get: function () { + return _index.tupleExpression; + } + }); + Object.defineProperty(exports, "TupleTypeAnnotation", { + enumerable: true, + get: function () { + return _index.tupleTypeAnnotation; + } + }); + Object.defineProperty(exports, "TypeAlias", { + enumerable: true, + get: function () { + return _index.typeAlias; + } + }); + Object.defineProperty(exports, "TypeAnnotation", { + enumerable: true, + get: function () { + return _index.typeAnnotation; + } + }); + Object.defineProperty(exports, "TypeCastExpression", { + enumerable: true, + get: function () { + return _index.typeCastExpression; + } + }); + Object.defineProperty(exports, "TypeParameter", { + enumerable: true, + get: function () { + return _index.typeParameter; + } + }); + Object.defineProperty(exports, "TypeParameterDeclaration", { + enumerable: true, + get: function () { + return _index.typeParameterDeclaration; + } + }); + Object.defineProperty(exports, "TypeParameterInstantiation", { + enumerable: true, + get: function () { + return _index.typeParameterInstantiation; + } + }); + Object.defineProperty(exports, "TypeofTypeAnnotation", { + enumerable: true, + get: function () { + return _index.typeofTypeAnnotation; + } + }); + Object.defineProperty(exports, "UnaryExpression", { + enumerable: true, + get: function () { + return _index.unaryExpression; + } + }); + Object.defineProperty(exports, "UnionTypeAnnotation", { + enumerable: true, + get: function () { + return _index.unionTypeAnnotation; + } + }); + Object.defineProperty(exports, "UpdateExpression", { + enumerable: true, + get: function () { + return _index.updateExpression; + } + }); + Object.defineProperty(exports, "V8IntrinsicIdentifier", { + enumerable: true, + get: function () { + return _index.v8IntrinsicIdentifier; + } + }); + Object.defineProperty(exports, "VariableDeclaration", { + enumerable: true, + get: function () { + return _index.variableDeclaration; + } + }); + Object.defineProperty(exports, "VariableDeclarator", { + enumerable: true, + get: function () { + return _index.variableDeclarator; + } + }); + Object.defineProperty(exports, "Variance", { + enumerable: true, + get: function () { + return _index.variance; + } + }); + Object.defineProperty(exports, "VoidTypeAnnotation", { + enumerable: true, + get: function () { + return _index.voidTypeAnnotation; + } + }); + Object.defineProperty(exports, "WhileStatement", { + enumerable: true, + get: function () { + return _index.whileStatement; + } + }); + Object.defineProperty(exports, "WithStatement", { + enumerable: true, + get: function () { + return _index.withStatement; + } + }); + Object.defineProperty(exports, "YieldExpression", { + enumerable: true, + get: function () { + return _index.yieldExpression; + } + }); + var _index = requireGenerated$2(); + + +} (uppercase)); + return uppercase; +} + +var productions = {}; + +var hasRequiredProductions; + +function requireProductions () { + if (hasRequiredProductions) return productions; + hasRequiredProductions = 1; + + Object.defineProperty(productions, "__esModule", { + value: true + }); + productions.buildUndefinedNode = buildUndefinedNode; + var _index = requireGenerated$2(); + function buildUndefinedNode() { + return (0, _index.unaryExpression)("void", (0, _index.numericLiteral)(0), true); + } + + + return productions; +} + +var cloneNode = {}; + +var hasRequiredCloneNode; + +function requireCloneNode () { + if (hasRequiredCloneNode) return cloneNode; + hasRequiredCloneNode = 1; + + Object.defineProperty(cloneNode, "__esModule", { + value: true + }); + cloneNode.default = cloneNode$1; + var _index = requireDefinitions(); + var _index2 = requireGenerated$3(); + const { + hasOwn + } = { + hasOwn: Function.call.bind(Object.prototype.hasOwnProperty) + }; + function cloneIfNode(obj, deep, withoutLoc, commentsCache) { + if (obj && typeof obj.type === "string") { + return cloneNodeInternal(obj, deep, withoutLoc, commentsCache); + } + return obj; + } + function cloneIfNodeOrArray(obj, deep, withoutLoc, commentsCache) { + if (Array.isArray(obj)) { + return obj.map(node => cloneIfNode(node, deep, withoutLoc, commentsCache)); + } + return cloneIfNode(obj, deep, withoutLoc, commentsCache); + } + function cloneNode$1(node, deep = true, withoutLoc = false) { + return cloneNodeInternal(node, deep, withoutLoc, new Map()); + } + function cloneNodeInternal(node, deep = true, withoutLoc = false, commentsCache) { + if (!node) return node; + const { + type + } = node; + const newNode = { + type: node.type + }; + if ((0, _index2.isIdentifier)(node)) { + newNode.name = node.name; + if (hasOwn(node, "optional") && typeof node.optional === "boolean") { + newNode.optional = node.optional; + } + if (hasOwn(node, "typeAnnotation")) { + newNode.typeAnnotation = deep ? cloneIfNodeOrArray(node.typeAnnotation, true, withoutLoc, commentsCache) : node.typeAnnotation; + } + if (hasOwn(node, "decorators")) { + newNode.decorators = deep ? cloneIfNodeOrArray(node.decorators, true, withoutLoc, commentsCache) : node.decorators; + } + } else if (!hasOwn(_index.NODE_FIELDS, type)) { + throw new Error(`Unknown node type: "${type}"`); + } else { + for (const field of Object.keys(_index.NODE_FIELDS[type])) { + if (hasOwn(node, field)) { + if (deep) { + newNode[field] = (0, _index2.isFile)(node) && field === "comments" ? maybeCloneComments(node.comments, deep, withoutLoc, commentsCache) : cloneIfNodeOrArray(node[field], true, withoutLoc, commentsCache); + } else { + newNode[field] = node[field]; + } + } + } + } + if (hasOwn(node, "loc")) { + if (withoutLoc) { + newNode.loc = null; + } else { + newNode.loc = node.loc; + } + } + if (hasOwn(node, "leadingComments")) { + newNode.leadingComments = maybeCloneComments(node.leadingComments, deep, withoutLoc, commentsCache); + } + if (hasOwn(node, "innerComments")) { + newNode.innerComments = maybeCloneComments(node.innerComments, deep, withoutLoc, commentsCache); + } + if (hasOwn(node, "trailingComments")) { + newNode.trailingComments = maybeCloneComments(node.trailingComments, deep, withoutLoc, commentsCache); + } + if (hasOwn(node, "extra")) { + newNode.extra = Object.assign({}, node.extra); + } + return newNode; + } + function maybeCloneComments(comments, deep, withoutLoc, commentsCache) { + if (!comments || !deep) { + return comments; + } + return comments.map(comment => { + const cache = commentsCache.get(comment); + if (cache) return cache; + const { + type, + value, + loc + } = comment; + const ret = { + type, + value, + loc + }; + if (withoutLoc) { + ret.loc = null; + } + commentsCache.set(comment, ret); + return ret; + }); + } + + + return cloneNode; +} + +var clone = {}; + +var hasRequiredClone; + +function requireClone () { + if (hasRequiredClone) return clone; + hasRequiredClone = 1; + + Object.defineProperty(clone, "__esModule", { + value: true + }); + clone.default = clone$1; + var _cloneNode = requireCloneNode(); + function clone$1(node) { + return (0, _cloneNode.default)(node, false); + } + + + return clone; +} + +var cloneDeep = {}; + +var hasRequiredCloneDeep; + +function requireCloneDeep () { + if (hasRequiredCloneDeep) return cloneDeep; + hasRequiredCloneDeep = 1; + + Object.defineProperty(cloneDeep, "__esModule", { + value: true + }); + cloneDeep.default = cloneDeep$1; + var _cloneNode = requireCloneNode(); + function cloneDeep$1(node) { + return (0, _cloneNode.default)(node); + } + + + return cloneDeep; +} + +var cloneDeepWithoutLoc = {}; + +var hasRequiredCloneDeepWithoutLoc; + +function requireCloneDeepWithoutLoc () { + if (hasRequiredCloneDeepWithoutLoc) return cloneDeepWithoutLoc; + hasRequiredCloneDeepWithoutLoc = 1; + + Object.defineProperty(cloneDeepWithoutLoc, "__esModule", { + value: true + }); + cloneDeepWithoutLoc.default = cloneDeepWithoutLoc$1; + var _cloneNode = requireCloneNode(); + function cloneDeepWithoutLoc$1(node) { + return (0, _cloneNode.default)(node, true, true); + } + + + return cloneDeepWithoutLoc; +} + +var cloneWithoutLoc = {}; + +var hasRequiredCloneWithoutLoc; + +function requireCloneWithoutLoc () { + if (hasRequiredCloneWithoutLoc) return cloneWithoutLoc; + hasRequiredCloneWithoutLoc = 1; + + Object.defineProperty(cloneWithoutLoc, "__esModule", { + value: true + }); + cloneWithoutLoc.default = cloneWithoutLoc$1; + var _cloneNode = requireCloneNode(); + function cloneWithoutLoc$1(node) { + return (0, _cloneNode.default)(node, false, true); + } + + + return cloneWithoutLoc; +} + +var addComment = {}; + +var addComments = {}; + +var hasRequiredAddComments; + +function requireAddComments () { + if (hasRequiredAddComments) return addComments; + hasRequiredAddComments = 1; + + Object.defineProperty(addComments, "__esModule", { + value: true + }); + addComments.default = addComments$1; + function addComments$1(node, type, comments) { + if (!comments || !node) return node; + const key = `${type}Comments`; + if (node[key]) { + if (type === "leading") { + node[key] = comments.concat(node[key]); + } else { + node[key].push(...comments); + } + } else { + node[key] = comments; + } + return node; + } + + + return addComments; +} + +var hasRequiredAddComment; + +function requireAddComment () { + if (hasRequiredAddComment) return addComment; + hasRequiredAddComment = 1; + + Object.defineProperty(addComment, "__esModule", { + value: true + }); + addComment.default = addComment$1; + var _addComments = requireAddComments(); + function addComment$1(node, type, content, line) { + return (0, _addComments.default)(node, type, [{ + type: line ? "CommentLine" : "CommentBlock", + value: content + }]); + } + + + return addComment; +} + +var inheritInnerComments = {}; + +var inherit = {}; + +var hasRequiredInherit; + +function requireInherit () { + if (hasRequiredInherit) return inherit; + hasRequiredInherit = 1; + + Object.defineProperty(inherit, "__esModule", { + value: true + }); + inherit.default = inherit$1; + function inherit$1(key, child, parent) { + if (child && parent) { + child[key] = Array.from(new Set([].concat(child[key], parent[key]).filter(Boolean))); + } + } + + + return inherit; +} + +var hasRequiredInheritInnerComments; + +function requireInheritInnerComments () { + if (hasRequiredInheritInnerComments) return inheritInnerComments; + hasRequiredInheritInnerComments = 1; + + Object.defineProperty(inheritInnerComments, "__esModule", { + value: true + }); + inheritInnerComments.default = inheritInnerComments$1; + var _inherit = requireInherit(); + function inheritInnerComments$1(child, parent) { + (0, _inherit.default)("innerComments", child, parent); + } + + + return inheritInnerComments; +} + +var inheritLeadingComments = {}; + +var hasRequiredInheritLeadingComments; + +function requireInheritLeadingComments () { + if (hasRequiredInheritLeadingComments) return inheritLeadingComments; + hasRequiredInheritLeadingComments = 1; + + Object.defineProperty(inheritLeadingComments, "__esModule", { + value: true + }); + inheritLeadingComments.default = inheritLeadingComments$1; + var _inherit = requireInherit(); + function inheritLeadingComments$1(child, parent) { + (0, _inherit.default)("leadingComments", child, parent); + } + + + return inheritLeadingComments; +} + +var inheritsComments = {}; + +var inheritTrailingComments = {}; + +var hasRequiredInheritTrailingComments; + +function requireInheritTrailingComments () { + if (hasRequiredInheritTrailingComments) return inheritTrailingComments; + hasRequiredInheritTrailingComments = 1; + + Object.defineProperty(inheritTrailingComments, "__esModule", { + value: true + }); + inheritTrailingComments.default = inheritTrailingComments$1; + var _inherit = requireInherit(); + function inheritTrailingComments$1(child, parent) { + (0, _inherit.default)("trailingComments", child, parent); + } + + + return inheritTrailingComments; +} + +var hasRequiredInheritsComments; + +function requireInheritsComments () { + if (hasRequiredInheritsComments) return inheritsComments; + hasRequiredInheritsComments = 1; + + Object.defineProperty(inheritsComments, "__esModule", { + value: true + }); + inheritsComments.default = inheritsComments$1; + var _inheritTrailingComments = requireInheritTrailingComments(); + var _inheritLeadingComments = requireInheritLeadingComments(); + var _inheritInnerComments = requireInheritInnerComments(); + function inheritsComments$1(child, parent) { + (0, _inheritTrailingComments.default)(child, parent); + (0, _inheritLeadingComments.default)(child, parent); + (0, _inheritInnerComments.default)(child, parent); + return child; + } + + + return inheritsComments; +} + +var removeComments = {}; + +var hasRequiredRemoveComments; + +function requireRemoveComments () { + if (hasRequiredRemoveComments) return removeComments; + hasRequiredRemoveComments = 1; + + Object.defineProperty(removeComments, "__esModule", { + value: true + }); + removeComments.default = removeComments$1; + var _index = requireConstants(); + function removeComments$1(node) { + _index.COMMENT_KEYS.forEach(key => { + node[key] = null; + }); + return node; + } + + + return removeComments; +} + +var generated = {}; + +var hasRequiredGenerated; + +function requireGenerated () { + if (hasRequiredGenerated) return generated; + hasRequiredGenerated = 1; + + Object.defineProperty(generated, "__esModule", { + value: true + }); + generated.WHILE_TYPES = generated.USERWHITESPACABLE_TYPES = generated.UNARYLIKE_TYPES = generated.TYPESCRIPT_TYPES = generated.TSTYPE_TYPES = generated.TSTYPEELEMENT_TYPES = generated.TSENTITYNAME_TYPES = generated.TSBASETYPE_TYPES = generated.TERMINATORLESS_TYPES = generated.STATEMENT_TYPES = generated.STANDARDIZED_TYPES = generated.SCOPABLE_TYPES = generated.PUREISH_TYPES = generated.PROPERTY_TYPES = generated.PRIVATE_TYPES = generated.PATTERN_TYPES = generated.PATTERNLIKE_TYPES = generated.OBJECTMEMBER_TYPES = generated.MODULESPECIFIER_TYPES = generated.MODULEDECLARATION_TYPES = generated.MISCELLANEOUS_TYPES = generated.METHOD_TYPES = generated.LVAL_TYPES = generated.LOOP_TYPES = generated.LITERAL_TYPES = generated.JSX_TYPES = generated.IMPORTOREXPORTDECLARATION_TYPES = generated.IMMUTABLE_TYPES = generated.FUNCTION_TYPES = generated.FUNCTIONPARENT_TYPES = generated.FOR_TYPES = generated.FORXSTATEMENT_TYPES = generated.FLOW_TYPES = generated.FLOWTYPE_TYPES = generated.FLOWPREDICATE_TYPES = generated.FLOWDECLARATION_TYPES = generated.FLOWBASEANNOTATION_TYPES = generated.EXPRESSION_TYPES = generated.EXPRESSIONWRAPPER_TYPES = generated.EXPORTDECLARATION_TYPES = generated.ENUMMEMBER_TYPES = generated.ENUMBODY_TYPES = generated.DECLARATION_TYPES = generated.CONDITIONAL_TYPES = generated.COMPLETIONSTATEMENT_TYPES = generated.CLASS_TYPES = generated.BLOCK_TYPES = generated.BLOCKPARENT_TYPES = generated.BINARY_TYPES = generated.ACCESSOR_TYPES = void 0; + var _index = requireDefinitions(); + generated.STANDARDIZED_TYPES = _index.FLIPPED_ALIAS_KEYS["Standardized"]; + generated.EXPRESSION_TYPES = _index.FLIPPED_ALIAS_KEYS["Expression"]; + generated.BINARY_TYPES = _index.FLIPPED_ALIAS_KEYS["Binary"]; + generated.SCOPABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Scopable"]; + generated.BLOCKPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["BlockParent"]; + generated.BLOCK_TYPES = _index.FLIPPED_ALIAS_KEYS["Block"]; + generated.STATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["Statement"]; + generated.TERMINATORLESS_TYPES = _index.FLIPPED_ALIAS_KEYS["Terminatorless"]; + generated.COMPLETIONSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["CompletionStatement"]; + generated.CONDITIONAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Conditional"]; + generated.LOOP_TYPES = _index.FLIPPED_ALIAS_KEYS["Loop"]; + generated.WHILE_TYPES = _index.FLIPPED_ALIAS_KEYS["While"]; + generated.EXPRESSIONWRAPPER_TYPES = _index.FLIPPED_ALIAS_KEYS["ExpressionWrapper"]; + generated.FOR_TYPES = _index.FLIPPED_ALIAS_KEYS["For"]; + generated.FORXSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["ForXStatement"]; + generated.FUNCTION_TYPES = _index.FLIPPED_ALIAS_KEYS["Function"]; + generated.FUNCTIONPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["FunctionParent"]; + generated.PUREISH_TYPES = _index.FLIPPED_ALIAS_KEYS["Pureish"]; + generated.DECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["Declaration"]; + generated.PATTERNLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["PatternLike"]; + generated.LVAL_TYPES = _index.FLIPPED_ALIAS_KEYS["LVal"]; + generated.TSENTITYNAME_TYPES = _index.FLIPPED_ALIAS_KEYS["TSEntityName"]; + generated.LITERAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Literal"]; + generated.IMMUTABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Immutable"]; + generated.USERWHITESPACABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["UserWhitespacable"]; + generated.METHOD_TYPES = _index.FLIPPED_ALIAS_KEYS["Method"]; + generated.OBJECTMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["ObjectMember"]; + generated.PROPERTY_TYPES = _index.FLIPPED_ALIAS_KEYS["Property"]; + generated.UNARYLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["UnaryLike"]; + generated.PATTERN_TYPES = _index.FLIPPED_ALIAS_KEYS["Pattern"]; + generated.CLASS_TYPES = _index.FLIPPED_ALIAS_KEYS["Class"]; + const IMPORTOREXPORTDECLARATION_TYPES = generated.IMPORTOREXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ImportOrExportDeclaration"]; + generated.EXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ExportDeclaration"]; + generated.MODULESPECIFIER_TYPES = _index.FLIPPED_ALIAS_KEYS["ModuleSpecifier"]; + generated.ACCESSOR_TYPES = _index.FLIPPED_ALIAS_KEYS["Accessor"]; + generated.PRIVATE_TYPES = _index.FLIPPED_ALIAS_KEYS["Private"]; + generated.FLOW_TYPES = _index.FLIPPED_ALIAS_KEYS["Flow"]; + generated.FLOWTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowType"]; + generated.FLOWBASEANNOTATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowBaseAnnotation"]; + generated.FLOWDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowDeclaration"]; + generated.FLOWPREDICATE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowPredicate"]; + generated.ENUMBODY_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumBody"]; + generated.ENUMMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumMember"]; + generated.JSX_TYPES = _index.FLIPPED_ALIAS_KEYS["JSX"]; + generated.MISCELLANEOUS_TYPES = _index.FLIPPED_ALIAS_KEYS["Miscellaneous"]; + generated.TYPESCRIPT_TYPES = _index.FLIPPED_ALIAS_KEYS["TypeScript"]; + generated.TSTYPEELEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["TSTypeElement"]; + generated.TSTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSType"]; + generated.TSBASETYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSBaseType"]; + generated.MODULEDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES; + + + return generated; +} + +var ensureBlock = {}; + +var toBlock = {}; + +var hasRequiredToBlock; + +function requireToBlock () { + if (hasRequiredToBlock) return toBlock; + hasRequiredToBlock = 1; + + Object.defineProperty(toBlock, "__esModule", { + value: true + }); + toBlock.default = toBlock$1; + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + function toBlock$1(node, parent) { + if ((0, _index.isBlockStatement)(node)) { + return node; + } + let blockNodes = []; + if ((0, _index.isEmptyStatement)(node)) { + blockNodes = []; + } else { + if (!(0, _index.isStatement)(node)) { + if ((0, _index.isFunction)(parent)) { + node = (0, _index2.returnStatement)(node); + } else { + node = (0, _index2.expressionStatement)(node); + } + } + blockNodes = [node]; + } + return (0, _index2.blockStatement)(blockNodes); + } + + + return toBlock; +} + +var hasRequiredEnsureBlock; + +function requireEnsureBlock () { + if (hasRequiredEnsureBlock) return ensureBlock; + hasRequiredEnsureBlock = 1; + + Object.defineProperty(ensureBlock, "__esModule", { + value: true + }); + ensureBlock.default = ensureBlock$1; + var _toBlock = requireToBlock(); + function ensureBlock$1(node, key = "body") { + const result = (0, _toBlock.default)(node[key], node); + node[key] = result; + return result; + } + + + return ensureBlock; +} + +var toBindingIdentifierName = {}; + +var toIdentifier = {}; + +var hasRequiredToIdentifier; + +function requireToIdentifier () { + if (hasRequiredToIdentifier) return toIdentifier; + hasRequiredToIdentifier = 1; + + Object.defineProperty(toIdentifier, "__esModule", { + value: true + }); + toIdentifier.default = toIdentifier$1; + var _isValidIdentifier = requireIsValidIdentifier(); + var _helperValidatorIdentifier = requireLib$3(); + function toIdentifier$1(input) { + input = input + ""; + let name = ""; + for (const c of input) { + name += (0, _helperValidatorIdentifier.isIdentifierChar)(c.codePointAt(0)) ? c : "-"; + } + name = name.replace(/^[-0-9]+/, ""); + name = name.replace(/[-\s]+(.)?/g, function (match, c) { + return c ? c.toUpperCase() : ""; + }); + if (!(0, _isValidIdentifier.default)(name)) { + name = `_${name}`; + } + return name || "_"; + } + + + return toIdentifier; +} + +var hasRequiredToBindingIdentifierName; + +function requireToBindingIdentifierName () { + if (hasRequiredToBindingIdentifierName) return toBindingIdentifierName; + hasRequiredToBindingIdentifierName = 1; + + Object.defineProperty(toBindingIdentifierName, "__esModule", { + value: true + }); + toBindingIdentifierName.default = toBindingIdentifierName$1; + var _toIdentifier = requireToIdentifier(); + function toBindingIdentifierName$1(name) { + name = (0, _toIdentifier.default)(name); + if (name === "eval" || name === "arguments") name = "_" + name; + return name; + } + + + return toBindingIdentifierName; +} + +var toComputedKey = {}; + +var hasRequiredToComputedKey; + +function requireToComputedKey () { + if (hasRequiredToComputedKey) return toComputedKey; + hasRequiredToComputedKey = 1; + + Object.defineProperty(toComputedKey, "__esModule", { + value: true + }); + toComputedKey.default = toComputedKey$1; + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + function toComputedKey$1(node, key = node.key || node.property) { + if (!node.computed && (0, _index.isIdentifier)(key)) key = (0, _index2.stringLiteral)(key.name); + return key; + } + + + return toComputedKey; +} + +var toExpression = {}; + +var hasRequiredToExpression; + +function requireToExpression () { + if (hasRequiredToExpression) return toExpression; + hasRequiredToExpression = 1; + + Object.defineProperty(toExpression, "__esModule", { + value: true + }); + toExpression.default = void 0; + var _index = requireGenerated$3(); + toExpression.default = toExpression$1; + function toExpression$1(node) { + if ((0, _index.isExpressionStatement)(node)) { + node = node.expression; + } + if ((0, _index.isExpression)(node)) { + return node; + } + if ((0, _index.isClass)(node)) { + node.type = "ClassExpression"; + } else if ((0, _index.isFunction)(node)) { + node.type = "FunctionExpression"; + } + if (!(0, _index.isExpression)(node)) { + throw new Error(`cannot turn ${node.type} to an expression`); + } + return node; + } + + + return toExpression; +} + +var toKeyAlias = {}; + +var removePropertiesDeep = {}; + +var traverseFast = {}; + +var hasRequiredTraverseFast; + +function requireTraverseFast () { + if (hasRequiredTraverseFast) return traverseFast; + hasRequiredTraverseFast = 1; + + Object.defineProperty(traverseFast, "__esModule", { + value: true + }); + traverseFast.default = traverseFast$1; + var _index = requireDefinitions(); + function traverseFast$1(node, enter, opts) { + if (!node) return; + const keys = _index.VISITOR_KEYS[node.type]; + if (!keys) return; + opts = opts || {}; + enter(node, opts); + for (const key of keys) { + const subNode = node[key]; + if (Array.isArray(subNode)) { + for (const node of subNode) { + traverseFast$1(node, enter, opts); + } + } else { + traverseFast$1(subNode, enter, opts); + } + } + } + + + return traverseFast; +} + +var removeProperties = {}; + +var hasRequiredRemoveProperties; + +function requireRemoveProperties () { + if (hasRequiredRemoveProperties) return removeProperties; + hasRequiredRemoveProperties = 1; + + Object.defineProperty(removeProperties, "__esModule", { + value: true + }); + removeProperties.default = removeProperties$1; + var _index = requireConstants(); + const CLEAR_KEYS = ["tokens", "start", "end", "loc", "raw", "rawValue"]; + const CLEAR_KEYS_PLUS_COMMENTS = [..._index.COMMENT_KEYS, "comments", ...CLEAR_KEYS]; + function removeProperties$1(node, opts = {}) { + const map = opts.preserveComments ? CLEAR_KEYS : CLEAR_KEYS_PLUS_COMMENTS; + for (const key of map) { + if (node[key] != null) node[key] = undefined; + } + for (const key of Object.keys(node)) { + if (key[0] === "_" && node[key] != null) node[key] = undefined; + } + const symbols = Object.getOwnPropertySymbols(node); + for (const sym of symbols) { + node[sym] = null; + } + } + + + return removeProperties; +} + +var hasRequiredRemovePropertiesDeep; + +function requireRemovePropertiesDeep () { + if (hasRequiredRemovePropertiesDeep) return removePropertiesDeep; + hasRequiredRemovePropertiesDeep = 1; + + Object.defineProperty(removePropertiesDeep, "__esModule", { + value: true + }); + removePropertiesDeep.default = removePropertiesDeep$1; + var _traverseFast = requireTraverseFast(); + var _removeProperties = requireRemoveProperties(); + function removePropertiesDeep$1(tree, opts) { + (0, _traverseFast.default)(tree, _removeProperties.default, opts); + return tree; + } + + + return removePropertiesDeep; +} + +var hasRequiredToKeyAlias; + +function requireToKeyAlias () { + if (hasRequiredToKeyAlias) return toKeyAlias; + hasRequiredToKeyAlias = 1; + + Object.defineProperty(toKeyAlias, "__esModule", { + value: true + }); + toKeyAlias.default = toKeyAlias$1; + var _index = requireGenerated$3(); + var _cloneNode = requireCloneNode(); + var _removePropertiesDeep = requireRemovePropertiesDeep(); + function toKeyAlias$1(node, key = node.key) { + let alias; + if (node.kind === "method") { + return toKeyAlias$1.increment() + ""; + } else if ((0, _index.isIdentifier)(key)) { + alias = key.name; + } else if ((0, _index.isStringLiteral)(key)) { + alias = JSON.stringify(key.value); + } else { + alias = JSON.stringify((0, _removePropertiesDeep.default)((0, _cloneNode.default)(key))); + } + if (node.computed) { + alias = `[${alias}]`; + } + if (node.static) { + alias = `static:${alias}`; + } + return alias; + } + toKeyAlias$1.uid = 0; + toKeyAlias$1.increment = function () { + if (toKeyAlias$1.uid >= Number.MAX_SAFE_INTEGER) { + return toKeyAlias$1.uid = 0; + } else { + return toKeyAlias$1.uid++; + } + }; + + + return toKeyAlias; +} + +var toStatement = {}; + +var hasRequiredToStatement; + +function requireToStatement () { + if (hasRequiredToStatement) return toStatement; + hasRequiredToStatement = 1; + + Object.defineProperty(toStatement, "__esModule", { + value: true + }); + toStatement.default = void 0; + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + toStatement.default = toStatement$1; + function toStatement$1(node, ignore) { + if ((0, _index.isStatement)(node)) { + return node; + } + let mustHaveId = false; + let newType; + if ((0, _index.isClass)(node)) { + mustHaveId = true; + newType = "ClassDeclaration"; + } else if ((0, _index.isFunction)(node)) { + mustHaveId = true; + newType = "FunctionDeclaration"; + } else if ((0, _index.isAssignmentExpression)(node)) { + return (0, _index2.expressionStatement)(node); + } + if (mustHaveId && !node.id) { + newType = false; + } + if (!newType) { + if (ignore) { + return false; + } else { + throw new Error(`cannot turn ${node.type} to a statement`); + } + } + node.type = newType; + return node; + } + + + return toStatement; +} + +var valueToNode = {}; + +var hasRequiredValueToNode; + +function requireValueToNode () { + if (hasRequiredValueToNode) return valueToNode; + hasRequiredValueToNode = 1; + + Object.defineProperty(valueToNode, "__esModule", { + value: true + }); + valueToNode.default = void 0; + var _isValidIdentifier = requireIsValidIdentifier(); + var _index = requireGenerated$2(); + valueToNode.default = valueToNode$1; + const objectToString = Function.call.bind(Object.prototype.toString); + function isRegExp(value) { + return objectToString(value) === "[object RegExp]"; + } + function isPlainObject(value) { + if (typeof value !== "object" || value === null || Object.prototype.toString.call(value) !== "[object Object]") { + return false; + } + const proto = Object.getPrototypeOf(value); + return proto === null || Object.getPrototypeOf(proto) === null; + } + function valueToNode$1(value) { + if (value === undefined) { + return (0, _index.identifier)("undefined"); + } + if (value === true || value === false) { + return (0, _index.booleanLiteral)(value); + } + if (value === null) { + return (0, _index.nullLiteral)(); + } + if (typeof value === "string") { + return (0, _index.stringLiteral)(value); + } + if (typeof value === "number") { + let result; + if (Number.isFinite(value)) { + result = (0, _index.numericLiteral)(Math.abs(value)); + } else { + let numerator; + if (Number.isNaN(value)) { + numerator = (0, _index.numericLiteral)(0); + } else { + numerator = (0, _index.numericLiteral)(1); + } + result = (0, _index.binaryExpression)("/", numerator, (0, _index.numericLiteral)(0)); + } + if (value < 0 || Object.is(value, -0)) { + result = (0, _index.unaryExpression)("-", result); + } + return result; + } + if (isRegExp(value)) { + const pattern = value.source; + const flags = /\/([a-z]*)$/.exec(value.toString())[1]; + return (0, _index.regExpLiteral)(pattern, flags); + } + if (Array.isArray(value)) { + return (0, _index.arrayExpression)(value.map(valueToNode$1)); + } + if (isPlainObject(value)) { + const props = []; + for (const key of Object.keys(value)) { + let nodeKey; + if ((0, _isValidIdentifier.default)(key)) { + nodeKey = (0, _index.identifier)(key); + } else { + nodeKey = (0, _index.stringLiteral)(key); + } + props.push((0, _index.objectProperty)(nodeKey, valueToNode$1(value[key]))); + } + return (0, _index.objectExpression)(props); + } + throw new Error("don't know how to turn this value into a node"); + } + + + return valueToNode; +} + +var appendToMemberExpression = {}; + +var hasRequiredAppendToMemberExpression; + +function requireAppendToMemberExpression () { + if (hasRequiredAppendToMemberExpression) return appendToMemberExpression; + hasRequiredAppendToMemberExpression = 1; + + Object.defineProperty(appendToMemberExpression, "__esModule", { + value: true + }); + appendToMemberExpression.default = appendToMemberExpression$1; + var _index = requireGenerated$2(); + function appendToMemberExpression$1(member, append, computed = false) { + member.object = (0, _index.memberExpression)(member.object, member.property, member.computed); + member.property = append; + member.computed = !!computed; + return member; + } + + + return appendToMemberExpression; +} + +var inherits = {}; + +var hasRequiredInherits; + +function requireInherits () { + if (hasRequiredInherits) return inherits; + hasRequiredInherits = 1; + + Object.defineProperty(inherits, "__esModule", { + value: true + }); + inherits.default = inherits$1; + var _index = requireConstants(); + var _inheritsComments = requireInheritsComments(); + function inherits$1(child, parent) { + if (!child || !parent) return child; + for (const key of _index.INHERIT_KEYS.optional) { + if (child[key] == null) { + child[key] = parent[key]; + } + } + for (const key of Object.keys(parent)) { + if (key[0] === "_" && key !== "__clone") { + child[key] = parent[key]; + } + } + for (const key of _index.INHERIT_KEYS.force) { + child[key] = parent[key]; + } + (0, _inheritsComments.default)(child, parent); + return child; + } + + + return inherits; +} + +var prependToMemberExpression = {}; + +var hasRequiredPrependToMemberExpression; + +function requirePrependToMemberExpression () { + if (hasRequiredPrependToMemberExpression) return prependToMemberExpression; + hasRequiredPrependToMemberExpression = 1; + + Object.defineProperty(prependToMemberExpression, "__esModule", { + value: true + }); + prependToMemberExpression.default = prependToMemberExpression$1; + var _index = requireGenerated$2(); + var _index2 = requireLib$1(); + function prependToMemberExpression$1(member, prepend) { + if ((0, _index2.isSuper)(member.object)) { + throw new Error("Cannot prepend node to super property access (`super.foo`)."); + } + member.object = (0, _index.memberExpression)(prepend, member.object); + return member; + } + + + return prependToMemberExpression; +} + +var getAssignmentIdentifiers = {}; + +var hasRequiredGetAssignmentIdentifiers; + +function requireGetAssignmentIdentifiers () { + if (hasRequiredGetAssignmentIdentifiers) return getAssignmentIdentifiers; + hasRequiredGetAssignmentIdentifiers = 1; + + Object.defineProperty(getAssignmentIdentifiers, "__esModule", { + value: true + }); + getAssignmentIdentifiers.default = getAssignmentIdentifiers$1; + function getAssignmentIdentifiers$1(node) { + const search = [].concat(node); + const ids = Object.create(null); + while (search.length) { + const id = search.pop(); + if (!id) continue; + switch (id.type) { + case "ArrayPattern": + search.push(...id.elements); + break; + case "AssignmentExpression": + case "AssignmentPattern": + case "ForInStatement": + case "ForOfStatement": + search.push(id.left); + break; + case "ObjectPattern": + search.push(...id.properties); + break; + case "ObjectProperty": + search.push(id.value); + break; + case "RestElement": + case "UpdateExpression": + search.push(id.argument); + break; + case "UnaryExpression": + if (id.operator === "delete") { + search.push(id.argument); + } + break; + case "Identifier": + ids[id.name] = id; + break; + } + } + return ids; + } + + + return getAssignmentIdentifiers; +} + +var getBindingIdentifiers = {}; + +var hasRequiredGetBindingIdentifiers; + +function requireGetBindingIdentifiers () { + if (hasRequiredGetBindingIdentifiers) return getBindingIdentifiers; + hasRequiredGetBindingIdentifiers = 1; + + Object.defineProperty(getBindingIdentifiers, "__esModule", { + value: true + }); + getBindingIdentifiers.default = getBindingIdentifiers$1; + var _index = requireGenerated$3(); + function getBindingIdentifiers$1(node, duplicates, outerOnly, newBindingsOnly) { + const search = [].concat(node); + const ids = Object.create(null); + while (search.length) { + const id = search.shift(); + if (!id) continue; + if (newBindingsOnly && ((0, _index.isAssignmentExpression)(id) || (0, _index.isUnaryExpression)(id) || (0, _index.isUpdateExpression)(id))) { + continue; + } + if ((0, _index.isIdentifier)(id)) { + if (duplicates) { + const _ids = ids[id.name] = ids[id.name] || []; + _ids.push(id); + } else { + ids[id.name] = id; + } + continue; + } + if ((0, _index.isExportDeclaration)(id) && !(0, _index.isExportAllDeclaration)(id)) { + if ((0, _index.isDeclaration)(id.declaration)) { + search.push(id.declaration); + } + continue; + } + if (outerOnly) { + if ((0, _index.isFunctionDeclaration)(id)) { + search.push(id.id); + continue; + } + if ((0, _index.isFunctionExpression)(id)) { + continue; + } + } + const keys = getBindingIdentifiers$1.keys[id.type]; + if (keys) { + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const nodes = id[key]; + if (nodes) { + if (Array.isArray(nodes)) { + search.push(...nodes); + } else { + search.push(nodes); + } + } + } + } + } + return ids; + } + const keys = { + DeclareClass: ["id"], + DeclareFunction: ["id"], + DeclareModule: ["id"], + DeclareVariable: ["id"], + DeclareInterface: ["id"], + DeclareTypeAlias: ["id"], + DeclareOpaqueType: ["id"], + InterfaceDeclaration: ["id"], + TypeAlias: ["id"], + OpaqueType: ["id"], + CatchClause: ["param"], + LabeledStatement: ["label"], + UnaryExpression: ["argument"], + AssignmentExpression: ["left"], + ImportSpecifier: ["local"], + ImportNamespaceSpecifier: ["local"], + ImportDefaultSpecifier: ["local"], + ImportDeclaration: ["specifiers"], + ExportSpecifier: ["exported"], + ExportNamespaceSpecifier: ["exported"], + ExportDefaultSpecifier: ["exported"], + FunctionDeclaration: ["id", "params"], + FunctionExpression: ["id", "params"], + ArrowFunctionExpression: ["params"], + ObjectMethod: ["params"], + ClassMethod: ["params"], + ClassPrivateMethod: ["params"], + ForInStatement: ["left"], + ForOfStatement: ["left"], + ClassDeclaration: ["id"], + ClassExpression: ["id"], + RestElement: ["argument"], + UpdateExpression: ["argument"], + ObjectProperty: ["value"], + AssignmentPattern: ["left"], + ArrayPattern: ["elements"], + ObjectPattern: ["properties"], + VariableDeclaration: ["declarations"], + VariableDeclarator: ["id"] + }; + getBindingIdentifiers$1.keys = keys; + + + return getBindingIdentifiers; +} + +var getOuterBindingIdentifiers = {}; + +var hasRequiredGetOuterBindingIdentifiers; + +function requireGetOuterBindingIdentifiers () { + if (hasRequiredGetOuterBindingIdentifiers) return getOuterBindingIdentifiers; + hasRequiredGetOuterBindingIdentifiers = 1; + + Object.defineProperty(getOuterBindingIdentifiers, "__esModule", { + value: true + }); + getOuterBindingIdentifiers.default = void 0; + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + getOuterBindingIdentifiers.default = getOuterBindingIdentifiers$1; + function getOuterBindingIdentifiers$1(node, duplicates) { + return (0, _getBindingIdentifiers.default)(node, duplicates, true); + } + + + return getOuterBindingIdentifiers; +} + +var getFunctionName$3 = {}; + +var hasRequiredGetFunctionName; + +function requireGetFunctionName () { + if (hasRequiredGetFunctionName) return getFunctionName$3; + hasRequiredGetFunctionName = 1; + + Object.defineProperty(getFunctionName$3, "__esModule", { + value: true + }); + getFunctionName$3.default = getFunctionName; + var _index = requireGenerated$3(); + function getNameFromLiteralId(id) { + if ((0, _index.isNullLiteral)(id)) { + return "null"; + } + if ((0, _index.isRegExpLiteral)(id)) { + return `/${id.pattern}/${id.flags}`; + } + if ((0, _index.isTemplateLiteral)(id)) { + return id.quasis.map(quasi => quasi.value.raw).join(""); + } + if (id.value !== undefined) { + return String(id.value); + } + return null; + } + function getObjectMemberKey(node) { + if (!node.computed || (0, _index.isLiteral)(node.key)) { + return node.key; + } + } + function getFunctionName(node, parent) { + if ("id" in node && node.id) { + return { + name: node.id.name, + originalNode: node.id + }; + } + let prefix = ""; + let id; + if ((0, _index.isObjectProperty)(parent, { + value: node + })) { + id = getObjectMemberKey(parent); + } else if ((0, _index.isObjectMethod)(node) || (0, _index.isClassMethod)(node)) { + id = getObjectMemberKey(node); + if (node.kind === "get") prefix = "get ";else if (node.kind === "set") prefix = "set "; + } else if ((0, _index.isVariableDeclarator)(parent, { + init: node + })) { + id = parent.id; + } else if ((0, _index.isAssignmentExpression)(parent, { + operator: "=", + right: node + })) { + id = parent.left; + } + if (!id) return null; + const name = (0, _index.isLiteral)(id) ? getNameFromLiteralId(id) : (0, _index.isIdentifier)(id) ? id.name : (0, _index.isPrivateName)(id) ? id.id.name : null; + if (name == null) return null; + return { + name: prefix + name, + originalNode: id + }; + } + + + return getFunctionName$3; +} + +var traverse = {}; + +var hasRequiredTraverse; + +function requireTraverse () { + if (hasRequiredTraverse) return traverse; + hasRequiredTraverse = 1; + + Object.defineProperty(traverse, "__esModule", { + value: true + }); + traverse.default = traverse$1; + var _index = requireDefinitions(); + function traverse$1(node, handlers, state) { + if (typeof handlers === "function") { + handlers = { + enter: handlers + }; + } + const { + enter, + exit + } = handlers; + traverseSimpleImpl(node, enter, exit, state, []); + } + function traverseSimpleImpl(node, enter, exit, state, ancestors) { + const keys = _index.VISITOR_KEYS[node.type]; + if (!keys) return; + if (enter) enter(node, ancestors, state); + for (const key of keys) { + const subNode = node[key]; + if (Array.isArray(subNode)) { + for (let i = 0; i < subNode.length; i++) { + const child = subNode[i]; + if (!child) continue; + ancestors.push({ + node, + key, + index: i + }); + traverseSimpleImpl(child, enter, exit, state, ancestors); + ancestors.pop(); + } + } else if (subNode) { + ancestors.push({ + node, + key + }); + traverseSimpleImpl(subNode, enter, exit, state, ancestors); + ancestors.pop(); + } + } + if (exit) exit(node, ancestors, state); + } + + + return traverse; +} + +var isBinding = {}; + +var hasRequiredIsBinding; + +function requireIsBinding () { + if (hasRequiredIsBinding) return isBinding; + hasRequiredIsBinding = 1; + + Object.defineProperty(isBinding, "__esModule", { + value: true + }); + isBinding.default = isBinding$1; + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + function isBinding$1(node, parent, grandparent) { + if (grandparent && node.type === "Identifier" && parent.type === "ObjectProperty" && grandparent.type === "ObjectExpression") { + return false; + } + const keys = _getBindingIdentifiers.default.keys[parent.type]; + if (keys) { + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = parent[key]; + if (Array.isArray(val)) { + if (val.includes(node)) return true; + } else { + if (val === node) return true; + } + } + } + return false; + } + + + return isBinding; +} + +var isBlockScoped = {}; + +var isLet = {}; + +var hasRequiredIsLet; + +function requireIsLet () { + if (hasRequiredIsLet) return isLet; + hasRequiredIsLet = 1; + + Object.defineProperty(isLet, "__esModule", { + value: true + }); + isLet.default = isLet$1; + var _index = requireGenerated$3(); + var _index2 = requireConstants(); + function isLet$1(node) { + return (0, _index.isVariableDeclaration)(node) && (node.kind !== "var" || node[_index2.BLOCK_SCOPED_SYMBOL]); + } + + + return isLet; +} + +var hasRequiredIsBlockScoped; + +function requireIsBlockScoped () { + if (hasRequiredIsBlockScoped) return isBlockScoped; + hasRequiredIsBlockScoped = 1; + + Object.defineProperty(isBlockScoped, "__esModule", { + value: true + }); + isBlockScoped.default = isBlockScoped$1; + var _index = requireGenerated$3(); + var _isLet = requireIsLet(); + function isBlockScoped$1(node) { + return (0, _index.isFunctionDeclaration)(node) || (0, _index.isClassDeclaration)(node) || (0, _isLet.default)(node); + } + + + return isBlockScoped; +} + +var isImmutable = {}; + +var hasRequiredIsImmutable; + +function requireIsImmutable () { + if (hasRequiredIsImmutable) return isImmutable; + hasRequiredIsImmutable = 1; + + Object.defineProperty(isImmutable, "__esModule", { + value: true + }); + isImmutable.default = isImmutable$1; + var _isType = requireIsType(); + var _index = requireGenerated$3(); + function isImmutable$1(node) { + if ((0, _isType.default)(node.type, "Immutable")) return true; + if ((0, _index.isIdentifier)(node)) { + if (node.name === "undefined") { + return true; + } else { + return false; + } + } + return false; + } + + + return isImmutable; +} + +var isNodesEquivalent = {}; + +var hasRequiredIsNodesEquivalent; + +function requireIsNodesEquivalent () { + if (hasRequiredIsNodesEquivalent) return isNodesEquivalent; + hasRequiredIsNodesEquivalent = 1; + + Object.defineProperty(isNodesEquivalent, "__esModule", { + value: true + }); + isNodesEquivalent.default = isNodesEquivalent$1; + var _index = requireDefinitions(); + function isNodesEquivalent$1(a, b) { + if (typeof a !== "object" || typeof b !== "object" || a == null || b == null) { + return a === b; + } + if (a.type !== b.type) { + return false; + } + const fields = Object.keys(_index.NODE_FIELDS[a.type] || a.type); + const visitorKeys = _index.VISITOR_KEYS[a.type]; + for (const field of fields) { + const val_a = a[field]; + const val_b = b[field]; + if (typeof val_a !== typeof val_b) { + return false; + } + if (val_a == null && val_b == null) { + continue; + } else if (val_a == null || val_b == null) { + return false; + } + if (Array.isArray(val_a)) { + if (!Array.isArray(val_b)) { + return false; + } + if (val_a.length !== val_b.length) { + return false; + } + for (let i = 0; i < val_a.length; i++) { + if (!isNodesEquivalent$1(val_a[i], val_b[i])) { + return false; + } + } + continue; + } + if (typeof val_a === "object" && !(visitorKeys != null && visitorKeys.includes(field))) { + for (const key of Object.keys(val_a)) { + if (val_a[key] !== val_b[key]) { + return false; + } + } + continue; + } + if (!isNodesEquivalent$1(val_a, val_b)) { + return false; + } + } + return true; + } + + + return isNodesEquivalent; +} + +var isReferenced = {}; + +var hasRequiredIsReferenced; + +function requireIsReferenced () { + if (hasRequiredIsReferenced) return isReferenced; + hasRequiredIsReferenced = 1; + + Object.defineProperty(isReferenced, "__esModule", { + value: true + }); + isReferenced.default = isReferenced$1; + function isReferenced$1(node, parent, grandparent) { + switch (parent.type) { + case "MemberExpression": + case "OptionalMemberExpression": + if (parent.property === node) { + return !!parent.computed; + } + return parent.object === node; + case "JSXMemberExpression": + return parent.object === node; + case "VariableDeclarator": + return parent.init === node; + case "ArrowFunctionExpression": + return parent.body === node; + case "PrivateName": + return false; + case "ClassMethod": + case "ClassPrivateMethod": + case "ObjectMethod": + if (parent.key === node) { + return !!parent.computed; + } + return false; + case "ObjectProperty": + if (parent.key === node) { + return !!parent.computed; + } + return !grandparent || grandparent.type !== "ObjectPattern"; + case "ClassProperty": + case "ClassAccessorProperty": + if (parent.key === node) { + return !!parent.computed; + } + return true; + case "ClassPrivateProperty": + return parent.key !== node; + case "ClassDeclaration": + case "ClassExpression": + return parent.superClass === node; + case "AssignmentExpression": + return parent.right === node; + case "AssignmentPattern": + return parent.right === node; + case "LabeledStatement": + return false; + case "CatchClause": + return false; + case "RestElement": + return false; + case "BreakStatement": + case "ContinueStatement": + return false; + case "FunctionDeclaration": + case "FunctionExpression": + return false; + case "ExportNamespaceSpecifier": + case "ExportDefaultSpecifier": + return false; + case "ExportSpecifier": + if (grandparent != null && grandparent.source) { + return false; + } + return parent.local === node; + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + return false; + case "ImportAttribute": + return false; + case "JSXAttribute": + return false; + case "ObjectPattern": + case "ArrayPattern": + return false; + case "MetaProperty": + return false; + case "ObjectTypeProperty": + return parent.key !== node; + case "TSEnumMember": + return parent.id !== node; + case "TSPropertySignature": + if (parent.key === node) { + return !!parent.computed; + } + return true; + } + return true; + } + + + return isReferenced; +} + +var isScope = {}; + +var hasRequiredIsScope; + +function requireIsScope () { + if (hasRequiredIsScope) return isScope; + hasRequiredIsScope = 1; + + Object.defineProperty(isScope, "__esModule", { + value: true + }); + isScope.default = isScope$1; + var _index = requireGenerated$3(); + function isScope$1(node, parent) { + if ((0, _index.isBlockStatement)(node) && ((0, _index.isFunction)(parent) || (0, _index.isCatchClause)(parent))) { + return false; + } + if ((0, _index.isPattern)(node) && ((0, _index.isFunction)(parent) || (0, _index.isCatchClause)(parent))) { + return true; + } + return (0, _index.isScopable)(node); + } + + + return isScope; +} + +var isSpecifierDefault = {}; + +var hasRequiredIsSpecifierDefault; + +function requireIsSpecifierDefault () { + if (hasRequiredIsSpecifierDefault) return isSpecifierDefault; + hasRequiredIsSpecifierDefault = 1; + + Object.defineProperty(isSpecifierDefault, "__esModule", { + value: true + }); + isSpecifierDefault.default = isSpecifierDefault$1; + var _index = requireGenerated$3(); + function isSpecifierDefault$1(specifier) { + return (0, _index.isImportDefaultSpecifier)(specifier) || (0, _index.isIdentifier)(specifier.imported || specifier.exported, { + name: "default" + }); + } + + + return isSpecifierDefault; +} + +var isValidES3Identifier = {}; + +var hasRequiredIsValidES3Identifier; + +function requireIsValidES3Identifier () { + if (hasRequiredIsValidES3Identifier) return isValidES3Identifier; + hasRequiredIsValidES3Identifier = 1; + + Object.defineProperty(isValidES3Identifier, "__esModule", { + value: true + }); + isValidES3Identifier.default = isValidES3Identifier$1; + var _isValidIdentifier = requireIsValidIdentifier(); + const RESERVED_WORDS_ES3_ONLY = new Set(["abstract", "boolean", "byte", "char", "double", "enum", "final", "float", "goto", "implements", "int", "interface", "long", "native", "package", "private", "protected", "public", "short", "static", "synchronized", "throws", "transient", "volatile"]); + function isValidES3Identifier$1(name) { + return (0, _isValidIdentifier.default)(name) && !RESERVED_WORDS_ES3_ONLY.has(name); + } + + + return isValidES3Identifier; +} + +var isVar = {}; + +var hasRequiredIsVar; + +function requireIsVar () { + if (hasRequiredIsVar) return isVar; + hasRequiredIsVar = 1; + + Object.defineProperty(isVar, "__esModule", { + value: true + }); + isVar.default = isVar$1; + var _index = requireGenerated$3(); + var _index2 = requireConstants(); + function isVar$1(node) { + return (0, _index.isVariableDeclaration)(node, { + kind: "var" + }) && !node[_index2.BLOCK_SCOPED_SYMBOL]; + } + + + return isVar; +} + +var toSequenceExpression = {}; + +var gatherSequenceExpressions = {}; + +var hasRequiredGatherSequenceExpressions; + +function requireGatherSequenceExpressions () { + if (hasRequiredGatherSequenceExpressions) return gatherSequenceExpressions; + hasRequiredGatherSequenceExpressions = 1; + + Object.defineProperty(gatherSequenceExpressions, "__esModule", { + value: true + }); + gatherSequenceExpressions.default = gatherSequenceExpressions$1; + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + var _index = requireGenerated$3(); + var _index2 = requireGenerated$2(); + var _productions = requireProductions(); + var _cloneNode = requireCloneNode(); + function gatherSequenceExpressions$1(nodes, declars) { + const exprs = []; + let ensureLastUndefined = true; + for (const node of nodes) { + if (!(0, _index.isEmptyStatement)(node)) { + ensureLastUndefined = false; + } + if ((0, _index.isExpression)(node)) { + exprs.push(node); + } else if ((0, _index.isExpressionStatement)(node)) { + exprs.push(node.expression); + } else if ((0, _index.isVariableDeclaration)(node)) { + if (node.kind !== "var") return; + for (const declar of node.declarations) { + const bindings = (0, _getBindingIdentifiers.default)(declar); + for (const key of Object.keys(bindings)) { + declars.push({ + kind: node.kind, + id: (0, _cloneNode.default)(bindings[key]) + }); + } + if (declar.init) { + exprs.push((0, _index2.assignmentExpression)("=", declar.id, declar.init)); + } + } + ensureLastUndefined = true; + } else if ((0, _index.isIfStatement)(node)) { + const consequent = node.consequent ? gatherSequenceExpressions$1([node.consequent], declars) : (0, _productions.buildUndefinedNode)(); + const alternate = node.alternate ? gatherSequenceExpressions$1([node.alternate], declars) : (0, _productions.buildUndefinedNode)(); + if (!consequent || !alternate) return; + exprs.push((0, _index2.conditionalExpression)(node.test, consequent, alternate)); + } else if ((0, _index.isBlockStatement)(node)) { + const body = gatherSequenceExpressions$1(node.body, declars); + if (!body) return; + exprs.push(body); + } else if ((0, _index.isEmptyStatement)(node)) { + if (nodes.indexOf(node) === 0) { + ensureLastUndefined = true; + } + } else { + return; + } + } + if (ensureLastUndefined) { + exprs.push((0, _productions.buildUndefinedNode)()); + } + if (exprs.length === 1) { + return exprs[0]; + } else { + return (0, _index2.sequenceExpression)(exprs); + } + } + + + return gatherSequenceExpressions; +} + +var hasRequiredToSequenceExpression; + +function requireToSequenceExpression () { + if (hasRequiredToSequenceExpression) return toSequenceExpression; + hasRequiredToSequenceExpression = 1; + + Object.defineProperty(toSequenceExpression, "__esModule", { + value: true + }); + toSequenceExpression.default = toSequenceExpression$1; + var _gatherSequenceExpressions = requireGatherSequenceExpressions(); + function toSequenceExpression$1(nodes, scope) { + if (!(nodes != null && nodes.length)) return; + const declars = []; + const result = (0, _gatherSequenceExpressions.default)(nodes, declars); + if (!result) return; + for (const declar of declars) { + scope.push(declar); + } + return result; + } + + + return toSequenceExpression; +} + +var hasRequiredLib$1; + +function requireLib$1 () { + if (hasRequiredLib$1) return lib$3; + hasRequiredLib$1 = 1; + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + var _exportNames = { + react: true, + assertNode: true, + createTypeAnnotationBasedOnTypeof: true, + createUnionTypeAnnotation: true, + createFlowUnionType: true, + createTSUnionType: true, + cloneNode: true, + clone: true, + cloneDeep: true, + cloneDeepWithoutLoc: true, + cloneWithoutLoc: true, + addComment: true, + addComments: true, + inheritInnerComments: true, + inheritLeadingComments: true, + inheritsComments: true, + inheritTrailingComments: true, + removeComments: true, + ensureBlock: true, + toBindingIdentifierName: true, + toBlock: true, + toComputedKey: true, + toExpression: true, + toIdentifier: true, + toKeyAlias: true, + toStatement: true, + valueToNode: true, + appendToMemberExpression: true, + inherits: true, + prependToMemberExpression: true, + removeProperties: true, + removePropertiesDeep: true, + removeTypeDuplicates: true, + getAssignmentIdentifiers: true, + getBindingIdentifiers: true, + getOuterBindingIdentifiers: true, + getFunctionName: true, + traverse: true, + traverseFast: true, + shallowEqual: true, + is: true, + isBinding: true, + isBlockScoped: true, + isImmutable: true, + isLet: true, + isNode: true, + isNodesEquivalent: true, + isPlaceholderType: true, + isReferenced: true, + isScope: true, + isSpecifierDefault: true, + isType: true, + isValidES3Identifier: true, + isValidIdentifier: true, + isVar: true, + matchesPattern: true, + validate: true, + buildMatchMemberExpression: true, + __internal__deprecationWarning: true + }; + Object.defineProperty(exports, "__internal__deprecationWarning", { + enumerable: true, + get: function () { + return _deprecationWarning.default; + } + }); + Object.defineProperty(exports, "addComment", { + enumerable: true, + get: function () { + return _addComment.default; + } + }); + Object.defineProperty(exports, "addComments", { + enumerable: true, + get: function () { + return _addComments.default; + } + }); + Object.defineProperty(exports, "appendToMemberExpression", { + enumerable: true, + get: function () { + return _appendToMemberExpression.default; + } + }); + Object.defineProperty(exports, "assertNode", { + enumerable: true, + get: function () { + return _assertNode.default; + } + }); + Object.defineProperty(exports, "buildMatchMemberExpression", { + enumerable: true, + get: function () { + return _buildMatchMemberExpression.default; + } + }); + Object.defineProperty(exports, "clone", { + enumerable: true, + get: function () { + return _clone.default; + } + }); + Object.defineProperty(exports, "cloneDeep", { + enumerable: true, + get: function () { + return _cloneDeep.default; + } + }); + Object.defineProperty(exports, "cloneDeepWithoutLoc", { + enumerable: true, + get: function () { + return _cloneDeepWithoutLoc.default; + } + }); + Object.defineProperty(exports, "cloneNode", { + enumerable: true, + get: function () { + return _cloneNode.default; + } + }); + Object.defineProperty(exports, "cloneWithoutLoc", { + enumerable: true, + get: function () { + return _cloneWithoutLoc.default; + } + }); + Object.defineProperty(exports, "createFlowUnionType", { + enumerable: true, + get: function () { + return _createFlowUnionType.default; + } + }); + Object.defineProperty(exports, "createTSUnionType", { + enumerable: true, + get: function () { + return _createTSUnionType.default; + } + }); + Object.defineProperty(exports, "createTypeAnnotationBasedOnTypeof", { + enumerable: true, + get: function () { + return _createTypeAnnotationBasedOnTypeof.default; + } + }); + Object.defineProperty(exports, "createUnionTypeAnnotation", { + enumerable: true, + get: function () { + return _createFlowUnionType.default; + } + }); + Object.defineProperty(exports, "ensureBlock", { + enumerable: true, + get: function () { + return _ensureBlock.default; + } + }); + Object.defineProperty(exports, "getAssignmentIdentifiers", { + enumerable: true, + get: function () { + return _getAssignmentIdentifiers.default; + } + }); + Object.defineProperty(exports, "getBindingIdentifiers", { + enumerable: true, + get: function () { + return _getBindingIdentifiers.default; + } + }); + Object.defineProperty(exports, "getFunctionName", { + enumerable: true, + get: function () { + return _getFunctionName.default; + } + }); + Object.defineProperty(exports, "getOuterBindingIdentifiers", { + enumerable: true, + get: function () { + return _getOuterBindingIdentifiers.default; + } + }); + Object.defineProperty(exports, "inheritInnerComments", { + enumerable: true, + get: function () { + return _inheritInnerComments.default; + } + }); + Object.defineProperty(exports, "inheritLeadingComments", { + enumerable: true, + get: function () { + return _inheritLeadingComments.default; + } + }); + Object.defineProperty(exports, "inheritTrailingComments", { + enumerable: true, + get: function () { + return _inheritTrailingComments.default; + } + }); + Object.defineProperty(exports, "inherits", { + enumerable: true, + get: function () { + return _inherits.default; + } + }); + Object.defineProperty(exports, "inheritsComments", { + enumerable: true, + get: function () { + return _inheritsComments.default; + } + }); + Object.defineProperty(exports, "is", { + enumerable: true, + get: function () { + return _is.default; + } + }); + Object.defineProperty(exports, "isBinding", { + enumerable: true, + get: function () { + return _isBinding.default; + } + }); + Object.defineProperty(exports, "isBlockScoped", { + enumerable: true, + get: function () { + return _isBlockScoped.default; + } + }); + Object.defineProperty(exports, "isImmutable", { + enumerable: true, + get: function () { + return _isImmutable.default; + } + }); + Object.defineProperty(exports, "isLet", { + enumerable: true, + get: function () { + return _isLet.default; + } + }); + Object.defineProperty(exports, "isNode", { + enumerable: true, + get: function () { + return _isNode.default; + } + }); + Object.defineProperty(exports, "isNodesEquivalent", { + enumerable: true, + get: function () { + return _isNodesEquivalent.default; + } + }); + Object.defineProperty(exports, "isPlaceholderType", { + enumerable: true, + get: function () { + return _isPlaceholderType.default; + } + }); + Object.defineProperty(exports, "isReferenced", { + enumerable: true, + get: function () { + return _isReferenced.default; + } + }); + Object.defineProperty(exports, "isScope", { + enumerable: true, + get: function () { + return _isScope.default; + } + }); + Object.defineProperty(exports, "isSpecifierDefault", { + enumerable: true, + get: function () { + return _isSpecifierDefault.default; + } + }); + Object.defineProperty(exports, "isType", { + enumerable: true, + get: function () { + return _isType.default; + } + }); + Object.defineProperty(exports, "isValidES3Identifier", { + enumerable: true, + get: function () { + return _isValidES3Identifier.default; + } + }); + Object.defineProperty(exports, "isValidIdentifier", { + enumerable: true, + get: function () { + return _isValidIdentifier.default; + } + }); + Object.defineProperty(exports, "isVar", { + enumerable: true, + get: function () { + return _isVar.default; + } + }); + Object.defineProperty(exports, "matchesPattern", { + enumerable: true, + get: function () { + return _matchesPattern.default; + } + }); + Object.defineProperty(exports, "prependToMemberExpression", { + enumerable: true, + get: function () { + return _prependToMemberExpression.default; + } + }); + exports.react = void 0; + Object.defineProperty(exports, "removeComments", { + enumerable: true, + get: function () { + return _removeComments.default; + } + }); + Object.defineProperty(exports, "removeProperties", { + enumerable: true, + get: function () { + return _removeProperties.default; + } + }); + Object.defineProperty(exports, "removePropertiesDeep", { + enumerable: true, + get: function () { + return _removePropertiesDeep.default; + } + }); + Object.defineProperty(exports, "removeTypeDuplicates", { + enumerable: true, + get: function () { + return _removeTypeDuplicates.default; + } + }); + Object.defineProperty(exports, "shallowEqual", { + enumerable: true, + get: function () { + return _shallowEqual.default; + } + }); + Object.defineProperty(exports, "toBindingIdentifierName", { + enumerable: true, + get: function () { + return _toBindingIdentifierName.default; + } + }); + Object.defineProperty(exports, "toBlock", { + enumerable: true, + get: function () { + return _toBlock.default; + } + }); + Object.defineProperty(exports, "toComputedKey", { + enumerable: true, + get: function () { + return _toComputedKey.default; + } + }); + Object.defineProperty(exports, "toExpression", { + enumerable: true, + get: function () { + return _toExpression.default; + } + }); + Object.defineProperty(exports, "toIdentifier", { + enumerable: true, + get: function () { + return _toIdentifier.default; + } + }); + Object.defineProperty(exports, "toKeyAlias", { + enumerable: true, + get: function () { + return _toKeyAlias.default; + } + }); + Object.defineProperty(exports, "toStatement", { + enumerable: true, + get: function () { + return _toStatement.default; + } + }); + Object.defineProperty(exports, "traverse", { + enumerable: true, + get: function () { + return _traverse.default; + } + }); + Object.defineProperty(exports, "traverseFast", { + enumerable: true, + get: function () { + return _traverseFast.default; + } + }); + Object.defineProperty(exports, "validate", { + enumerable: true, + get: function () { + return _validate.default; + } + }); + Object.defineProperty(exports, "valueToNode", { + enumerable: true, + get: function () { + return _valueToNode.default; + } + }); + var _isReactComponent = requireIsReactComponent(); + var _isCompatTag = requireIsCompatTag(); + var _buildChildren = requireBuildChildren(); + var _assertNode = requireAssertNode(); + var _index = requireGenerated$1(); + Object.keys(_index).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index[key]; + } + }); + }); + var _createTypeAnnotationBasedOnTypeof = requireCreateTypeAnnotationBasedOnTypeof(); + var _createFlowUnionType = requireCreateFlowUnionType(); + var _createTSUnionType = requireCreateTSUnionType(); + var _index2 = requireGenerated$2(); + Object.keys(_index2).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index2[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index2[key]; + } + }); + }); + var _uppercase = requireUppercase(); + Object.keys(_uppercase).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _uppercase[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _uppercase[key]; + } + }); + }); + var _productions = requireProductions(); + Object.keys(_productions).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _productions[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _productions[key]; + } + }); + }); + var _cloneNode = requireCloneNode(); + var _clone = requireClone(); + var _cloneDeep = requireCloneDeep(); + var _cloneDeepWithoutLoc = requireCloneDeepWithoutLoc(); + var _cloneWithoutLoc = requireCloneWithoutLoc(); + var _addComment = requireAddComment(); + var _addComments = requireAddComments(); + var _inheritInnerComments = requireInheritInnerComments(); + var _inheritLeadingComments = requireInheritLeadingComments(); + var _inheritsComments = requireInheritsComments(); + var _inheritTrailingComments = requireInheritTrailingComments(); + var _removeComments = requireRemoveComments(); + var _index3 = requireGenerated(); + Object.keys(_index3).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index3[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index3[key]; + } + }); + }); + var _index4 = requireConstants(); + Object.keys(_index4).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index4[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index4[key]; + } + }); + }); + var _ensureBlock = requireEnsureBlock(); + var _toBindingIdentifierName = requireToBindingIdentifierName(); + var _toBlock = requireToBlock(); + var _toComputedKey = requireToComputedKey(); + var _toExpression = requireToExpression(); + var _toIdentifier = requireToIdentifier(); + var _toKeyAlias = requireToKeyAlias(); + var _toStatement = requireToStatement(); + var _valueToNode = requireValueToNode(); + var _index5 = requireDefinitions(); + Object.keys(_index5).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index5[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index5[key]; + } + }); + }); + var _appendToMemberExpression = requireAppendToMemberExpression(); + var _inherits = requireInherits(); + var _prependToMemberExpression = requirePrependToMemberExpression(); + var _removeProperties = requireRemoveProperties(); + var _removePropertiesDeep = requireRemovePropertiesDeep(); + var _removeTypeDuplicates = requireRemoveTypeDuplicates$1(); + var _getAssignmentIdentifiers = requireGetAssignmentIdentifiers(); + var _getBindingIdentifiers = requireGetBindingIdentifiers(); + var _getOuterBindingIdentifiers = requireGetOuterBindingIdentifiers(); + var _getFunctionName = requireGetFunctionName(); + var _traverse = requireTraverse(); + Object.keys(_traverse).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _traverse[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _traverse[key]; + } + }); + }); + var _traverseFast = requireTraverseFast(); + var _shallowEqual = requireShallowEqual(); + var _is = requireIs(); + var _isBinding = requireIsBinding(); + var _isBlockScoped = requireIsBlockScoped(); + var _isImmutable = requireIsImmutable(); + var _isLet = requireIsLet(); + var _isNode = requireIsNode(); + var _isNodesEquivalent = requireIsNodesEquivalent(); + var _isPlaceholderType = requireIsPlaceholderType(); + var _isReferenced = requireIsReferenced(); + var _isScope = requireIsScope(); + var _isSpecifierDefault = requireIsSpecifierDefault(); + var _isType = requireIsType(); + var _isValidES3Identifier = requireIsValidES3Identifier(); + var _isValidIdentifier = requireIsValidIdentifier(); + var _isVar = requireIsVar(); + var _matchesPattern = requireMatchesPattern(); + var _validate = requireValidate(); + var _buildMatchMemberExpression = requireBuildMatchMemberExpression(); + var _index6 = requireGenerated$3(); + Object.keys(_index6).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _index6[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _index6[key]; + } + }); + }); + var _deprecationWarning = requireDeprecationWarning(); + exports.react = { + isReactComponent: _isReactComponent.default, + isCompatTag: _isCompatTag.default, + buildChildren: _buildChildren.default + }; + { + exports.toSequenceExpression = requireToSequenceExpression().default; + } + if (process.env.BABEL_TYPES_8_BREAKING) { + console.warn("BABEL_TYPES_8_BREAKING is not supported anymore. Use the latest Babel 8.0.0 pre-release instead!"); + } + + +} (lib$3)); + return lib$3; +} + +var libExports$1 = requireLib$1(); + +var lib = {}; + +var picocolorsExports = {}; +var picocolors = { + get exports(){ return picocolorsExports; }, + set exports(v){ picocolorsExports = v; }, +}; + +var hasRequiredPicocolors; + +function requirePicocolors () { + if (hasRequiredPicocolors) return picocolorsExports; + hasRequiredPicocolors = 1; + let p = process || {}, argv = p.argv || [], env = p.env || {}; + let isColorSupported = + !(!!env.NO_COLOR || argv.includes("--no-color")) && + (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI); + + let formatter = (open, close, replace = open) => + input => { + let string = "" + input, index = string.indexOf(close, open.length); + return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close + }; + + let replaceClose = (string, close, replace, index) => { + let result = "", cursor = 0; + do { + result += string.substring(cursor, index) + replace; + cursor = index + close.length; + index = string.indexOf(close, cursor); + } while (~index) + return result + string.substring(cursor) + }; + + let createColors = (enabled = isColorSupported) => { + let f = enabled ? formatter : () => String; + return { + isColorSupported: enabled, + reset: f("\x1b[0m", "\x1b[0m"), + bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), + dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), + italic: f("\x1b[3m", "\x1b[23m"), + underline: f("\x1b[4m", "\x1b[24m"), + inverse: f("\x1b[7m", "\x1b[27m"), + hidden: f("\x1b[8m", "\x1b[28m"), + strikethrough: f("\x1b[9m", "\x1b[29m"), + + black: f("\x1b[30m", "\x1b[39m"), + red: f("\x1b[31m", "\x1b[39m"), + green: f("\x1b[32m", "\x1b[39m"), + yellow: f("\x1b[33m", "\x1b[39m"), + blue: f("\x1b[34m", "\x1b[39m"), + magenta: f("\x1b[35m", "\x1b[39m"), + cyan: f("\x1b[36m", "\x1b[39m"), + white: f("\x1b[37m", "\x1b[39m"), + gray: f("\x1b[90m", "\x1b[39m"), + + bgBlack: f("\x1b[40m", "\x1b[49m"), + bgRed: f("\x1b[41m", "\x1b[49m"), + bgGreen: f("\x1b[42m", "\x1b[49m"), + bgYellow: f("\x1b[43m", "\x1b[49m"), + bgBlue: f("\x1b[44m", "\x1b[49m"), + bgMagenta: f("\x1b[45m", "\x1b[49m"), + bgCyan: f("\x1b[46m", "\x1b[49m"), + bgWhite: f("\x1b[47m", "\x1b[49m"), + + blackBright: f("\x1b[90m", "\x1b[39m"), + redBright: f("\x1b[91m", "\x1b[39m"), + greenBright: f("\x1b[92m", "\x1b[39m"), + yellowBright: f("\x1b[93m", "\x1b[39m"), + blueBright: f("\x1b[94m", "\x1b[39m"), + magentaBright: f("\x1b[95m", "\x1b[39m"), + cyanBright: f("\x1b[96m", "\x1b[39m"), + whiteBright: f("\x1b[97m", "\x1b[39m"), + + bgBlackBright: f("\x1b[100m", "\x1b[49m"), + bgRedBright: f("\x1b[101m", "\x1b[49m"), + bgGreenBright: f("\x1b[102m", "\x1b[49m"), + bgYellowBright: f("\x1b[103m", "\x1b[49m"), + bgBlueBright: f("\x1b[104m", "\x1b[49m"), + bgMagentaBright: f("\x1b[105m", "\x1b[49m"), + bgCyanBright: f("\x1b[106m", "\x1b[49m"), + bgWhiteBright: f("\x1b[107m", "\x1b[49m"), + } + }; + + picocolors.exports = createColors(); + picocolorsExports.createColors = createColors; + return picocolorsExports; +} + +var jsTokens = {}; + +var hasRequiredJsTokens; + +function requireJsTokens () { + if (hasRequiredJsTokens) return jsTokens; + hasRequiredJsTokens = 1; + // Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell + // License: MIT. (See LICENSE.) + + Object.defineProperty(jsTokens, "__esModule", { + value: true + }); + + // This regex comes from regex.coffee, and is inserted here by generate-index.js + // (run `npm run build`). + jsTokens.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g; + + jsTokens.matchToToken = function(match) { + var token = {type: "invalid", value: match[0], closed: undefined}; + if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]); + else if (match[ 5]) token.type = "comment"; + else if (match[ 6]) token.type = "comment", token.closed = !!match[7]; + else if (match[ 8]) token.type = "regex"; + else if (match[ 9]) token.type = "number"; + else if (match[10]) token.type = "name"; + else if (match[11]) token.type = "punctuator"; + else if (match[12]) token.type = "whitespace"; + return token + }; + return jsTokens; +} + +var hasRequiredLib; + +function requireLib () { + if (hasRequiredLib) return lib; + hasRequiredLib = 1; + + Object.defineProperty(lib, '__esModule', { value: true }); + + var picocolors = requirePicocolors(); + var jsTokens = requireJsTokens(); + var helperValidatorIdentifier = requireLib$3(); + + function isColorSupported() { + return (typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported + ); + } + const compose = (f, g) => v => f(g(v)); + function buildDefs(colors) { + return { + keyword: colors.cyan, + capitalized: colors.yellow, + jsxIdentifier: colors.yellow, + punctuator: colors.yellow, + number: colors.magenta, + string: colors.green, + regex: colors.magenta, + comment: colors.gray, + invalid: compose(compose(colors.white, colors.bgRed), colors.bold), + gutter: colors.gray, + marker: compose(colors.red, colors.bold), + message: compose(colors.red, colors.bold), + reset: colors.reset + }; + } + const defsOn = buildDefs(picocolors.createColors(true)); + const defsOff = buildDefs(picocolors.createColors(false)); + function getDefs(enabled) { + return enabled ? defsOn : defsOff; + } + + const sometimesKeywords = new Set(["as", "async", "from", "get", "of", "set"]); + const NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/; + const BRACKET = /^[()[\]{}]$/; + let tokenize; + { + const JSX_TAG = /^[a-z][\w-]*$/i; + const getTokenType = function (token, offset, text) { + if (token.type === "name") { + if (helperValidatorIdentifier.isKeyword(token.value) || helperValidatorIdentifier.isStrictReservedWord(token.value, true) || sometimesKeywords.has(token.value)) { + return "keyword"; + } + if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === " defs[type](str)).join("\n"); + } else { + highlighted += value; + } + } + return highlighted; + } + + let deprecationWarningShown = false; + const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; + function getMarkerLines(loc, source, opts) { + const startLoc = Object.assign({ + column: 0, + line: -1 + }, loc.start); + const endLoc = Object.assign({}, startLoc, loc.end); + const { + linesAbove = 2, + linesBelow = 3 + } = opts || {}; + const startLine = startLoc.line; + const startColumn = startLoc.column; + const endLine = endLoc.line; + const endColumn = endLoc.column; + let start = Math.max(startLine - (linesAbove + 1), 0); + let end = Math.min(source.length, endLine + linesBelow); + if (startLine === -1) { + start = 0; + } + if (endLine === -1) { + end = source.length; + } + const lineDiff = endLine - startLine; + const markerLines = {}; + if (lineDiff) { + for (let i = 0; i <= lineDiff; i++) { + const lineNumber = i + startLine; + if (!startColumn) { + markerLines[lineNumber] = true; + } else if (i === 0) { + const sourceLength = source[lineNumber - 1].length; + markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; + } else if (i === lineDiff) { + markerLines[lineNumber] = [0, endColumn]; + } else { + const sourceLength = source[lineNumber - i].length; + markerLines[lineNumber] = [0, sourceLength]; + } + } + } else { + if (startColumn === endColumn) { + if (startColumn) { + markerLines[startLine] = [startColumn, 0]; + } else { + markerLines[startLine] = true; + } + } else { + markerLines[startLine] = [startColumn, endColumn - startColumn]; + } + } + return { + start, + end, + markerLines + }; + } + function codeFrameColumns(rawLines, loc, opts = {}) { + const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode; + const defs = getDefs(shouldHighlight); + const lines = rawLines.split(NEWLINE); + const { + start, + end, + markerLines + } = getMarkerLines(loc, lines, opts); + const hasColumns = loc.start && typeof loc.start.column === "number"; + const numberMaxWidth = String(end).length; + const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines; + let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index) => { + const number = start + 1 + index; + const paddedNumber = ` ${number}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} |`; + const hasMarker = markerLines[number]; + const lastMarkerLine = !markerLines[number + 1]; + if (hasMarker) { + let markerLine = ""; + if (Array.isArray(hasMarker)) { + const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; + markerLine = ["\n ", defs.gutter(gutter.replace(/\d/g, " ")), " ", markerSpacing, defs.marker("^").repeat(numberOfMarkers)].join(""); + if (lastMarkerLine && opts.message) { + markerLine += " " + defs.message(opts.message); + } + } + return [defs.marker(">"), defs.gutter(gutter), line.length > 0 ? ` ${line}` : "", markerLine].join(""); + } else { + return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`; + } + }).join("\n"); + if (opts.message && !hasColumns) { + frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; + } + if (shouldHighlight) { + return defs.reset(frame); + } else { + return frame; + } + } + function index (rawLines, lineNumber, colNumber, opts = {}) { + if (!deprecationWarningShown) { + deprecationWarningShown = true; + const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; + if (process.emitWarning) { + process.emitWarning(message, "DeprecationWarning"); + } else { + const deprecationError = new Error(message); + deprecationError.name = "DeprecationWarning"; + console.warn(new Error(message)); + } + } + colNumber = Math.max(colNumber, 0); + const location = { + start: { + column: colNumber, + line: lineNumber + } + }; + return codeFrameColumns(rawLines, location, opts); + } + + lib.codeFrameColumns = codeFrameColumns; + lib.default = index; + lib.highlight = highlight; + + return lib; +} + +var libExports = requireLib(); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + + +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +var _OkImpl_val, _ErrImpl_val; +function Ok(val) { + return new OkImpl(val); +} +class OkImpl { + constructor(val) { + _OkImpl_val.set(this, void 0); + __classPrivateFieldSet(this, _OkImpl_val, val, "f"); + } + map(fn) { + return new OkImpl(fn(__classPrivateFieldGet(this, _OkImpl_val, "f"))); + } + mapErr(_fn) { + return this; + } + mapOr(_fallback, fn) { + return fn(__classPrivateFieldGet(this, _OkImpl_val, "f")); + } + mapOrElse(_fallback, fn) { + return fn(__classPrivateFieldGet(this, _OkImpl_val, "f")); + } + andThen(fn) { + return fn(__classPrivateFieldGet(this, _OkImpl_val, "f")); + } + and(res) { + return res; + } + or(_res) { + return this; + } + orElse(_fn) { + return this; + } + isOk() { + return true; + } + isErr() { + return false; + } + expect(_msg) { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + expectErr(msg) { + throw new Error(`${msg}: ${__classPrivateFieldGet(this, _OkImpl_val, "f")}`); + } + unwrap() { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + unwrapOr(_fallback) { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + unwrapOrElse(_fallback) { + return __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + unwrapErr() { + if (__classPrivateFieldGet(this, _OkImpl_val, "f") instanceof Error) { + throw __classPrivateFieldGet(this, _OkImpl_val, "f"); + } + throw new Error(`Can't unwrap \`Ok\` to \`Err\`: ${__classPrivateFieldGet(this, _OkImpl_val, "f")}`); + } +} +_OkImpl_val = new WeakMap(); +function Err(val) { + return new ErrImpl(val); +} +class ErrImpl { + constructor(val) { + _ErrImpl_val.set(this, void 0); + __classPrivateFieldSet(this, _ErrImpl_val, val, "f"); + } + map(_fn) { + return this; + } + mapErr(fn) { + return new ErrImpl(fn(__classPrivateFieldGet(this, _ErrImpl_val, "f"))); + } + mapOr(fallback, _fn) { + return fallback; + } + mapOrElse(fallback, _fn) { + return fallback(); + } + andThen(_fn) { + return this; + } + and(_res) { + return this; + } + or(res) { + return res; + } + orElse(fn) { + return fn(__classPrivateFieldGet(this, _ErrImpl_val, "f")); + } + isOk() { + return false; + } + isErr() { + return true; + } + expect(msg) { + throw new Error(`${msg}: ${__classPrivateFieldGet(this, _ErrImpl_val, "f")}`); + } + expectErr(_msg) { + return __classPrivateFieldGet(this, _ErrImpl_val, "f"); + } + unwrap() { + if (__classPrivateFieldGet(this, _ErrImpl_val, "f") instanceof Error) { + throw __classPrivateFieldGet(this, _ErrImpl_val, "f"); + } + throw new Error(`Can't unwrap \`Err\` to \`Ok\`: ${__classPrivateFieldGet(this, _ErrImpl_val, "f")}`); + } + unwrapOr(fallback) { + return fallback; + } + unwrapOrElse(fallback) { + return fallback(__classPrivateFieldGet(this, _ErrImpl_val, "f")); + } + unwrapErr() { + return __classPrivateFieldGet(this, _ErrImpl_val, "f"); + } +} +_ErrImpl_val = new WeakMap(); + +function assertExhaustive$1(_, errorMsg) { + throw new Error(errorMsg); +} +function retainWhere(array, predicate) { + let writeIndex = 0; + for (let readIndex = 0; readIndex < array.length; readIndex++) { + const item = array[readIndex]; + if (predicate(item, readIndex) === true) { + array[writeIndex++] = item; + } + } + array.length = writeIndex; +} +function retainWhere_Set(items, predicate) { + for (const item of items) { + if (!predicate(item)) { + items.delete(item); + } + } +} +function getOrInsertWith(m, key, makeDefault) { + if (m.has(key)) { + return m.get(key); + } + else { + const defaultValue = makeDefault(); + m.set(key, defaultValue); + return defaultValue; + } +} +function getOrInsertDefault(m, key, defaultValue) { + if (m.has(key)) { + return m.get(key); + } + else { + m.set(key, defaultValue); + return defaultValue; + } +} +function Set_equal(a, b) { + if (a.size !== b.size) { + return false; + } + for (const item of a) { + if (!b.has(item)) { + return false; + } + } + return true; +} +function Set_union(a, b) { + const union = new Set(a); + for (const item of b) { + union.add(item); + } + return union; +} +function Set_intersect(sets) { + if (sets.length === 0 || sets.some(s => s.size === 0)) { + return new Set(); + } + else if (sets.length === 1) { + return new Set(sets[0]); + } + const result = new Set(); + const first = sets[0]; + outer: for (const e of first) { + for (let i = 1; i < sets.length; i++) { + if (!sets[i].has(e)) { + continue outer; + } + } + result.add(e); + } + return result; +} +function Set_isSuperset(a, b) { + for (const v of b) { + if (!a.has(v)) { + return false; + } + } + return true; +} +function Iterable_some(iter, pred) { + for (const item of iter) { + if (pred(item)) { + return true; + } + } + return false; +} +function Set_filter(source, fn) { + const result = new Set(); + for (const entry of source) { + if (fn(entry)) { + result.add(entry); + } + } + return result; +} +function hasNode(input) { + return input.node != null; +} +function hasOwnProperty$1(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +var ErrorSeverity; +(function (ErrorSeverity) { + ErrorSeverity["Error"] = "Error"; + ErrorSeverity["Warning"] = "Warning"; + ErrorSeverity["Hint"] = "Hint"; + ErrorSeverity["Off"] = "Off"; +})(ErrorSeverity || (ErrorSeverity = {})); +var CompilerSuggestionOperation; +(function (CompilerSuggestionOperation) { + CompilerSuggestionOperation[CompilerSuggestionOperation["InsertBefore"] = 0] = "InsertBefore"; + CompilerSuggestionOperation[CompilerSuggestionOperation["InsertAfter"] = 1] = "InsertAfter"; + CompilerSuggestionOperation[CompilerSuggestionOperation["Remove"] = 2] = "Remove"; + CompilerSuggestionOperation[CompilerSuggestionOperation["Replace"] = 3] = "Replace"; +})(CompilerSuggestionOperation || (CompilerSuggestionOperation = {})); +class CompilerDiagnostic { + constructor(options) { + this.options = options; + } + static create(options) { + return new CompilerDiagnostic(Object.assign(Object.assign({}, options), { details: [] })); + } + get reason() { + return this.options.reason; + } + get description() { + return this.options.description; + } + get severity() { + return getRuleForCategory(this.category).severity; + } + get suggestions() { + return this.options.suggestions; + } + get category() { + return this.options.category; + } + withDetails(...details) { + this.options.details.push(...details); + return this; + } + primaryLocation() { + const firstErrorDetail = this.options.details.filter(d => d.kind === 'error')[0]; + return firstErrorDetail != null && firstErrorDetail.kind === 'error' + ? firstErrorDetail.loc + : null; + } + printErrorMessage(source, options) { + var _a, _b; + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push('\n\n', `${this.description}.`); + } + for (const detail of this.options.details) { + switch (detail.kind) { + case 'error': { + const loc = detail.loc; + if (loc == null || typeof loc === 'symbol') { + continue; + } + let codeFrame; + try { + codeFrame = printCodeFrame(source, loc, (_a = detail.message) !== null && _a !== void 0 ? _a : ''); + } + catch (e) { + codeFrame = (_b = detail.message) !== null && _b !== void 0 ? _b : ''; + } + buffer.push('\n\n'); + if (loc.filename != null) { + const line = loc.start.line; + const column = options.eslint + ? loc.start.column + 1 + : loc.start.column; + buffer.push(`${loc.filename}:${line}:${column}\n`); + } + buffer.push(codeFrame); + break; + } + case 'hint': { + buffer.push('\n\n'); + buffer.push(detail.message); + break; + } + default: { + assertExhaustive$1(detail, `Unexpected detail kind ${detail.kind}`); + } + } + } + return buffer.join(''); + } + toString() { + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push(`. ${this.description}.`); + } + const loc = this.primaryLocation(); + if (loc != null && typeof loc !== 'symbol') { + buffer.push(` (${loc.start.line}:${loc.start.column})`); + } + return buffer.join(''); + } +} +class CompilerErrorDetail { + constructor(options) { + this.options = options; + } + get reason() { + return this.options.reason; + } + get description() { + return this.options.description; + } + get severity() { + return getRuleForCategory(this.category).severity; + } + get loc() { + return this.options.loc; + } + get suggestions() { + return this.options.suggestions; + } + get category() { + return this.options.category; + } + primaryLocation() { + return this.loc; + } + printErrorMessage(source, options) { + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push(`\n\n${this.description}.`); + } + const loc = this.loc; + if (loc != null && typeof loc !== 'symbol') { + let codeFrame; + try { + codeFrame = printCodeFrame(source, loc, this.reason); + } + catch (e) { + codeFrame = ''; + } + buffer.push(`\n\n`); + if (loc.filename != null) { + const line = loc.start.line; + const column = options.eslint ? loc.start.column + 1 : loc.start.column; + buffer.push(`${loc.filename}:${line}:${column}\n`); + } + buffer.push(codeFrame); + buffer.push('\n\n'); + } + return buffer.join(''); + } + toString() { + const buffer = [printErrorSummary(this.category, this.reason)]; + if (this.description != null) { + buffer.push(`. ${this.description}.`); + } + const loc = this.loc; + if (loc != null && typeof loc !== 'symbol') { + buffer.push(` (${loc.start.line}:${loc.start.column})`); + } + return buffer.join(''); + } +} +class CompilerError extends Error { + static invariant(condition, options) { + if (!condition) { + const errors = new CompilerError(); + errors.pushDiagnostic(CompilerDiagnostic.create({ + reason: options.reason, + description: options.description, + category: ErrorCategory.Invariant, + }).withDetails(...options.details)); + throw errors; + } + } + static throwDiagnostic(options) { + const errors = new CompilerError(); + errors.pushDiagnostic(new CompilerDiagnostic(options)); + throw errors; + } + static throwTodo(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(Object.assign(Object.assign({}, options), { category: ErrorCategory.Todo }))); + throw errors; + } + static throwInvalidJS(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(Object.assign(Object.assign({}, options), { category: ErrorCategory.Syntax }))); + throw errors; + } + static throwInvalidReact(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(options)); + throw errors; + } + static throwInvalidConfig(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(Object.assign(Object.assign({}, options), { category: ErrorCategory.Config }))); + throw errors; + } + static throw(options) { + const errors = new CompilerError(); + errors.pushErrorDetail(new CompilerErrorDetail(options)); + throw errors; + } + constructor(...args) { + super(...args); + this.details = []; + this.disabledDetails = []; + this.printedMessage = null; + this.name = 'ReactCompilerError'; + this.details = []; + this.disabledDetails = []; + } + get message() { + var _a; + return (_a = this.printedMessage) !== null && _a !== void 0 ? _a : this.toString(); + } + set message(_message) { } + toString() { + if (this.printedMessage) { + return this.printedMessage; + } + if (Array.isArray(this.details)) { + return this.details.map(detail => detail.toString()).join('\n\n'); + } + return this.name; + } + withPrintedMessage(source, options) { + this.printedMessage = this.printErrorMessage(source, options); + return this; + } + printErrorMessage(source, options) { + if (options.eslint && this.details.length === 1) { + return this.details[0].printErrorMessage(source, options); + } + return (`Found ${this.details.length} error${this.details.length === 1 ? '' : 's'}:\n\n` + + this.details + .map(detail => detail.printErrorMessage(source, options).trim()) + .join('\n\n')); + } + merge(other) { + this.details.push(...other.details); + this.disabledDetails.push(...other.disabledDetails); + } + pushDiagnostic(diagnostic) { + if (diagnostic.severity === ErrorSeverity.Off) { + this.disabledDetails.push(diagnostic); + } + else { + this.details.push(diagnostic); + } + } + push(options) { + var _a; + const detail = new CompilerErrorDetail({ + category: options.category, + reason: options.reason, + description: (_a = options.description) !== null && _a !== void 0 ? _a : null, + suggestions: options.suggestions, + loc: typeof options.loc === 'symbol' ? null : options.loc, + }); + return this.pushErrorDetail(detail); + } + pushErrorDetail(detail) { + if (detail.severity === ErrorSeverity.Off) { + this.disabledDetails.push(detail); + } + else { + this.details.push(detail); + } + return detail; + } + hasAnyErrors() { + return this.details.length > 0; + } + asResult() { + return this.hasAnyErrors() ? Err(this) : Ok(undefined); + } + hasErrors() { + for (const detail of this.details) { + if (detail.severity === ErrorSeverity.Error) { + return true; + } + } + return false; + } + hasWarning() { + let res = false; + for (const detail of this.details) { + if (detail.severity === ErrorSeverity.Error) { + return false; + } + if (detail.severity === ErrorSeverity.Warning) { + res = true; + } + } + return res; + } + hasHints() { + let res = false; + for (const detail of this.details) { + if (detail.severity === ErrorSeverity.Error) { + return false; + } + if (detail.severity === ErrorSeverity.Warning) { + return false; + } + if (detail.severity === ErrorSeverity.Hint) { + res = true; + } + } + return res; + } +} +function printCodeFrame(source, loc, message) { + return libExports.codeFrameColumns(source, { + start: { + line: loc.start.line, + column: loc.start.column + 1, + }, + end: { + line: loc.end.line, + column: loc.end.column + 1, + }, + }, { + message, + }); +} +function printErrorSummary(category, message) { + let heading; + switch (category) { + case ErrorCategory.AutomaticEffectDependencies: + case ErrorCategory.CapitalizedCalls: + case ErrorCategory.Config: + case ErrorCategory.EffectDerivationsOfState: + case ErrorCategory.EffectSetState: + case ErrorCategory.ErrorBoundaries: + case ErrorCategory.Factories: + case ErrorCategory.FBT: + case ErrorCategory.Fire: + case ErrorCategory.Gating: + case ErrorCategory.Globals: + case ErrorCategory.Hooks: + case ErrorCategory.Immutability: + case ErrorCategory.Purity: + case ErrorCategory.Refs: + case ErrorCategory.RenderSetState: + case ErrorCategory.StaticComponents: + case ErrorCategory.Suppression: + case ErrorCategory.Syntax: + case ErrorCategory.UseMemo: { + heading = 'Error'; + break; + } + case ErrorCategory.EffectDependencies: + case ErrorCategory.IncompatibleLibrary: + case ErrorCategory.PreserveManualMemo: + case ErrorCategory.UnsupportedSyntax: { + heading = 'Compilation Skipped'; + break; + } + case ErrorCategory.Invariant: { + heading = 'Invariant'; + break; + } + case ErrorCategory.Todo: { + heading = 'Todo'; + break; + } + default: { + assertExhaustive$1(category, `Unhandled category '${category}'`); + } + } + return `${heading}: ${message}`; +} +var ErrorCategory; +(function (ErrorCategory) { + ErrorCategory["Hooks"] = "Hooks"; + ErrorCategory["CapitalizedCalls"] = "CapitalizedCalls"; + ErrorCategory["StaticComponents"] = "StaticComponents"; + ErrorCategory["UseMemo"] = "UseMemo"; + ErrorCategory["Factories"] = "Factories"; + ErrorCategory["PreserveManualMemo"] = "PreserveManualMemo"; + ErrorCategory["IncompatibleLibrary"] = "IncompatibleLibrary"; + ErrorCategory["Immutability"] = "Immutability"; + ErrorCategory["Globals"] = "Globals"; + ErrorCategory["Refs"] = "Refs"; + ErrorCategory["EffectDependencies"] = "EffectDependencies"; + ErrorCategory["EffectSetState"] = "EffectSetState"; + ErrorCategory["EffectDerivationsOfState"] = "EffectDerivationsOfState"; + ErrorCategory["ErrorBoundaries"] = "ErrorBoundaries"; + ErrorCategory["Purity"] = "Purity"; + ErrorCategory["RenderSetState"] = "RenderSetState"; + ErrorCategory["Invariant"] = "Invariant"; + ErrorCategory["Todo"] = "Todo"; + ErrorCategory["Syntax"] = "Syntax"; + ErrorCategory["UnsupportedSyntax"] = "UnsupportedSyntax"; + ErrorCategory["Config"] = "Config"; + ErrorCategory["Gating"] = "Gating"; + ErrorCategory["Suppression"] = "Suppression"; + ErrorCategory["AutomaticEffectDependencies"] = "AutomaticEffectDependencies"; + ErrorCategory["Fire"] = "Fire"; + ErrorCategory["FBT"] = "FBT"; +})(ErrorCategory || (ErrorCategory = {})); +const RULE_NAME_PATTERN = /^[a-z]+(-[a-z]+)*$/; +function getRuleForCategory(category) { + const rule = getRuleForCategoryImpl(category); + invariant(RULE_NAME_PATTERN.test(rule.name), `Invalid rule name, got '${rule.name}' but rules must match ${RULE_NAME_PATTERN.toString()}`); + return rule; +} +function getRuleForCategoryImpl(category) { + switch (category) { + case ErrorCategory.AutomaticEffectDependencies: { + return { + category, + severity: ErrorSeverity.Error, + name: 'automatic-effect-dependencies', + description: 'Verifies that automatic effect dependencies are compiled if opted-in', + recommended: false, + }; + } + case ErrorCategory.CapitalizedCalls: { + return { + category, + severity: ErrorSeverity.Error, + name: 'capitalized-calls', + description: 'Validates against calling capitalized functions/methods instead of using JSX', + recommended: false, + }; + } + case ErrorCategory.Config: { + return { + category, + severity: ErrorSeverity.Error, + name: 'config', + description: 'Validates the compiler configuration options', + recommended: true, + }; + } + case ErrorCategory.EffectDependencies: { + return { + category, + severity: ErrorSeverity.Error, + name: 'memoized-effect-dependencies', + description: 'Validates that effect dependencies are memoized', + recommended: false, + }; + } + case ErrorCategory.EffectDerivationsOfState: { + return { + category, + severity: ErrorSeverity.Error, + name: 'no-deriving-state-in-effects', + description: 'Validates against deriving values from state in an effect', + recommended: false, + }; + } + case ErrorCategory.EffectSetState: { + return { + category, + severity: ErrorSeverity.Error, + name: 'set-state-in-effect', + description: 'Validates against calling setState synchronously in an effect, which can lead to re-renders that degrade performance', + recommended: true, + }; + } + case ErrorCategory.ErrorBoundaries: { + return { + category, + severity: ErrorSeverity.Error, + name: 'error-boundaries', + description: 'Validates usage of error boundaries instead of try/catch for errors in child components', + recommended: true, + }; + } + case ErrorCategory.Factories: { + return { + category, + severity: ErrorSeverity.Error, + name: 'component-hook-factories', + description: 'Validates against higher order functions defining nested components or hooks. ' + + 'Components and hooks should be defined at the module level', + recommended: true, + }; + } + case ErrorCategory.FBT: { + return { + category, + severity: ErrorSeverity.Error, + name: 'fbt', + description: 'Validates usage of fbt', + recommended: false, + }; + } + case ErrorCategory.Fire: { + return { + category, + severity: ErrorSeverity.Error, + name: 'fire', + description: 'Validates usage of `fire`', + recommended: false, + }; + } + case ErrorCategory.Gating: { + return { + category, + severity: ErrorSeverity.Error, + name: 'gating', + description: 'Validates configuration of [gating mode](https://react.dev/reference/react-compiler/gating)', + recommended: true, + }; + } + case ErrorCategory.Globals: { + return { + category, + severity: ErrorSeverity.Error, + name: 'globals', + description: 'Validates against assignment/mutation of globals during render, part of ensuring that ' + + '[side effects must render outside of render](https://react.dev/reference/rules/components-and-hooks-must-be-pure#side-effects-must-run-outside-of-render)', + recommended: true, + }; + } + case ErrorCategory.Hooks: { + return { + category, + severity: ErrorSeverity.Error, + name: 'hooks', + description: 'Validates the rules of hooks', + recommended: false, + }; + } + case ErrorCategory.Immutability: { + return { + category, + severity: ErrorSeverity.Error, + name: 'immutability', + description: 'Validates against mutating props, state, and other values that [are immutable](https://react.dev/reference/rules/components-and-hooks-must-be-pure#props-and-state-are-immutable)', + recommended: true, + }; + } + case ErrorCategory.Invariant: { + return { + category, + severity: ErrorSeverity.Error, + name: 'invariant', + description: 'Internal invariants', + recommended: false, + }; + } + case ErrorCategory.PreserveManualMemo: { + return { + category, + severity: ErrorSeverity.Error, + name: 'preserve-manual-memoization', + description: 'Validates that existing manual memoized is preserved by the compiler. ' + + 'React Compiler will only compile components and hooks if its inference ' + + '[matches or exceeds the existing manual memoization](https://react.dev/learn/react-compiler/introduction#what-should-i-do-about-usememo-usecallback-and-reactmemo)', + recommended: true, + }; + } + case ErrorCategory.Purity: { + return { + category, + severity: ErrorSeverity.Error, + name: 'purity', + description: 'Validates that [components/hooks are pure](https://react.dev/reference/rules/components-and-hooks-must-be-pure) by checking that they do not call known-impure functions', + recommended: true, + }; + } + case ErrorCategory.Refs: { + return { + category, + severity: ErrorSeverity.Error, + name: 'refs', + description: 'Validates correct usage of refs, not reading/writing during render. See the "pitfalls" section in [`useRef()` usage](https://react.dev/reference/react/useRef#usage)', + recommended: true, + }; + } + case ErrorCategory.RenderSetState: { + return { + category, + severity: ErrorSeverity.Error, + name: 'set-state-in-render', + description: 'Validates against setting state during render, which can trigger additional renders and potential infinite render loops', + recommended: true, + }; + } + case ErrorCategory.StaticComponents: { + return { + category, + severity: ErrorSeverity.Error, + name: 'static-components', + description: 'Validates that components are static, not recreated every render. Components that are recreated dynamically can reset state and trigger excessive re-rendering', + recommended: true, + }; + } + case ErrorCategory.Suppression: { + return { + category, + severity: ErrorSeverity.Error, + name: 'rule-suppression', + description: 'Validates against suppression of other rules', + recommended: false, + }; + } + case ErrorCategory.Syntax: { + return { + category, + severity: ErrorSeverity.Error, + name: 'syntax', + description: 'Validates against invalid syntax', + recommended: false, + }; + } + case ErrorCategory.Todo: { + return { + category, + severity: ErrorSeverity.Hint, + name: 'todo', + description: 'Unimplemented features', + recommended: false, + }; + } + case ErrorCategory.UnsupportedSyntax: { + return { + category, + severity: ErrorSeverity.Warning, + name: 'unsupported-syntax', + description: 'Validates against syntax that we do not plan to support in React Compiler', + recommended: true, + }; + } + case ErrorCategory.UseMemo: { + return { + category, + severity: ErrorSeverity.Error, + name: 'use-memo', + description: 'Validates usage of the useMemo() hook against common mistakes. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.', + recommended: true, + }; + } + case ErrorCategory.IncompatibleLibrary: { + return { + category, + severity: ErrorSeverity.Warning, + name: 'incompatible-library', + description: 'Validates against usage of libraries which are incompatible with memoization (manual or automatic)', + recommended: true, + }; + } + default: { + assertExhaustive$1(category, `Unsupported category ${category}`); + } + } +} +const LintRules = Object.keys(ErrorCategory).map(category => getRuleForCategory(category)); + +function insertAdditionalFunctionDeclaration(fnPath, compiled, programContext, gatingFunctionIdentifierName) { + var _a, _b; + const originalFnName = fnPath.node.id; + const originalFnParams = fnPath.node.params; + const compiledParams = fnPath.node.params; + CompilerError.invariant(originalFnName != null && compiled.id != null, { + reason: 'Expected function declarations that are referenced elsewhere to have a named identifier', + description: null, + details: [ + { + kind: 'error', + loc: (_a = fnPath.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + CompilerError.invariant(originalFnParams.length === compiledParams.length, { + reason: 'Expected React Compiler optimized function declarations to have the same number of parameters as source', + description: null, + details: [ + { + kind: 'error', + loc: (_b = fnPath.node.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + }); + const gatingCondition = libExports$1.identifier(programContext.newUid(`${gatingFunctionIdentifierName}_result`)); + const unoptimizedFnName = libExports$1.identifier(programContext.newUid(`${originalFnName.name}_unoptimized`)); + const optimizedFnName = libExports$1.identifier(programContext.newUid(`${originalFnName.name}_optimized`)); + compiled.id.name = optimizedFnName.name; + fnPath.get('id').replaceInline(unoptimizedFnName); + const newParams = []; + const genNewArgs = []; + for (let i = 0; i < originalFnParams.length; i++) { + const argName = `arg${i}`; + if (originalFnParams[i].type === 'RestElement') { + newParams.push(libExports$1.restElement(libExports$1.identifier(argName))); + genNewArgs.push(() => libExports$1.spreadElement(libExports$1.identifier(argName))); + } + else { + newParams.push(libExports$1.identifier(argName)); + genNewArgs.push(() => libExports$1.identifier(argName)); + } + } + fnPath.insertAfter(libExports$1.functionDeclaration(originalFnName, newParams, libExports$1.blockStatement([ + libExports$1.ifStatement(gatingCondition, libExports$1.returnStatement(libExports$1.callExpression(compiled.id, genNewArgs.map(fn => fn()))), libExports$1.returnStatement(libExports$1.callExpression(unoptimizedFnName, genNewArgs.map(fn => fn())))), + ]))); + fnPath.insertBefore(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(gatingCondition, libExports$1.callExpression(libExports$1.identifier(gatingFunctionIdentifierName), [])), + ])); + fnPath.insertBefore(compiled); +} +function insertGatedFunctionDeclaration(fnPath, compiled, programContext, gating, referencedBeforeDeclaration) { + var _a; + const gatingImportedName = programContext.addImportSpecifier(gating).name; + if (referencedBeforeDeclaration && fnPath.isFunctionDeclaration()) { + CompilerError.invariant(compiled.type === 'FunctionDeclaration', { + reason: 'Expected compiled node type to match input type', + description: `Got ${compiled.type} but expected FunctionDeclaration`, + details: [ + { + kind: 'error', + loc: (_a = fnPath.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + insertAdditionalFunctionDeclaration(fnPath, compiled, programContext, gatingImportedName); + } + else { + const gatingExpression = libExports$1.conditionalExpression(libExports$1.callExpression(libExports$1.identifier(gatingImportedName), []), buildFunctionExpression(compiled), buildFunctionExpression(fnPath.node)); + if (fnPath.parentPath.node.type !== 'ExportDefaultDeclaration' && + fnPath.node.type === 'FunctionDeclaration' && + fnPath.node.id != null) { + fnPath.replaceWith(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(fnPath.node.id, gatingExpression), + ])); + } + else if (fnPath.parentPath.node.type === 'ExportDefaultDeclaration' && + fnPath.node.type !== 'ArrowFunctionExpression' && + fnPath.node.id != null) { + fnPath.insertAfter(libExports$1.exportDefaultDeclaration(libExports$1.identifier(fnPath.node.id.name))); + fnPath.parentPath.replaceWith(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(libExports$1.identifier(fnPath.node.id.name), gatingExpression), + ])); + } + else { + fnPath.replaceWith(gatingExpression); + } + } +} +function buildFunctionExpression(node) { + var _a, _b; + if (node.type === 'ArrowFunctionExpression' || + node.type === 'FunctionExpression') { + return node; + } + else { + const fn = { + type: 'FunctionExpression', + async: node.async, + generator: node.generator, + loc: (_a = node.loc) !== null && _a !== void 0 ? _a : null, + id: (_b = node.id) !== null && _b !== void 0 ? _b : null, + params: node.params, + body: node.body, + }; + return fn; + } +} + +function makeTypeId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected instruction id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +let typeCounter = 0; +function makeType() { + return { + kind: 'Type', + id: makeTypeId(typeCounter++), + }; +} +function typeEquals(tA, tB) { + if (tA.kind !== tB.kind) + return false; + return (typeVarEquals(tA, tB) || + funcTypeEquals(tA, tB) || + objectTypeEquals(tA, tB) || + primitiveTypeEquals(tA, tB) || + polyTypeEquals(tA, tB) || + phiTypeEquals(tA, tB) || + propTypeEquals(tA, tB) || + objectMethodTypeEquals(tA, tB)); +} +function typeVarEquals(tA, tB) { + if (tA.kind === 'Type' && tB.kind === 'Type') { + return tA.id === tB.id; + } + return false; +} +function typeKindCheck(tA, tb, type) { + return tA.kind === type && tb.kind === type; +} +function objectMethodTypeEquals(tA, tB) { + return typeKindCheck(tA, tB, 'ObjectMethod'); +} +function propTypeEquals(tA, tB) { + if (tA.kind === 'Property' && tB.kind === 'Property') { + if (!typeEquals(tA.objectType, tB.objectType)) { + return false; + } + return (tA.propertyName === tB.propertyName && tA.objectName === tB.objectName); + } + return false; +} +function primitiveTypeEquals(tA, tB) { + return typeKindCheck(tA, tB, 'Primitive'); +} +function polyTypeEquals(tA, tB) { + return typeKindCheck(tA, tB, 'Poly'); +} +function objectTypeEquals(tA, tB) { + if (tA.kind === 'Object' && tB.kind == 'Object') { + return tA.shapeId === tB.shapeId; + } + return false; +} +function funcTypeEquals(tA, tB) { + if (tA.kind !== 'Function' || tB.kind !== 'Function') { + return false; + } + return typeEquals(tA.return, tB.return); +} +function phiTypeEquals(tA, tB) { + if (tA.kind === 'Phi' && tB.kind === 'Phi') { + if (tA.operands.length !== tB.operands.length) { + return false; + } + let operands = new Set(tA.operands); + for (let i = 0; i < tB.operands.length; i++) { + if (!operands.has(tB.operands[i])) { + return false; + } + } + } + return false; +} + +const RESERVED_WORDS = new Set([ + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'debugger', + 'default', + 'delete', + 'do', + 'else', + 'enum', + 'export', + 'extends', + 'false', + 'finally', + 'for', + 'function', + 'if', + 'import', + 'in', + 'instanceof', + 'new', + 'null', + 'return', + 'super', + 'switch', + 'this', + 'throw', + 'true', + 'try', + 'typeof', + 'var', + 'void', + 'while', + 'with', +]); +const STRICT_MODE_RESERVED_WORDS = new Set([ + 'let', + 'static', + 'implements', + 'interface', + 'package', + 'private', + 'protected', + 'public', +]); +const STRICT_MODE_RESTRICTED_WORDS = new Set(['eval', 'arguments']); +function isReservedWord(identifierName) { + return (RESERVED_WORDS.has(identifierName) || + STRICT_MODE_RESERVED_WORDS.has(identifierName) || + STRICT_MODE_RESTRICTED_WORDS.has(identifierName)); +} + +const GeneratedSource = Symbol(); +function isStatementBlockKind(kind) { + return kind === 'block' || kind === 'catch'; +} +function isExpressionBlockKind(kind) { + return !isStatementBlockKind(kind); +} +var GotoVariant; +(function (GotoVariant) { + GotoVariant["Break"] = "Break"; + GotoVariant["Continue"] = "Continue"; + GotoVariant["Try"] = "Try"; +})(GotoVariant || (GotoVariant = {})); +var InstructionKind; +(function (InstructionKind) { + InstructionKind["Const"] = "Const"; + InstructionKind["Let"] = "Let"; + InstructionKind["Reassign"] = "Reassign"; + InstructionKind["Catch"] = "Catch"; + InstructionKind["HoistedConst"] = "HoistedConst"; + InstructionKind["HoistedLet"] = "HoistedLet"; + InstructionKind["HoistedFunction"] = "HoistedFunction"; + InstructionKind["Function"] = "Function"; +})(InstructionKind || (InstructionKind = {})); +function convertHoistedLValueKind(kind) { + switch (kind) { + case InstructionKind.HoistedLet: + return InstructionKind.Let; + case InstructionKind.HoistedConst: + return InstructionKind.Const; + case InstructionKind.HoistedFunction: + return InstructionKind.Function; + case InstructionKind.Let: + case InstructionKind.Const: + case InstructionKind.Function: + case InstructionKind.Reassign: + case InstructionKind.Catch: + return null; + default: + assertExhaustive$1(kind, 'Unexpected lvalue kind'); + } +} +function makeTemporaryIdentifier(id, loc) { + return { + id, + name: null, + declarationId: makeDeclarationId(id), + mutableRange: { start: makeInstructionId(0), end: makeInstructionId(0) }, + scope: null, + type: makeType(), + loc, + }; +} +function forkTemporaryIdentifier(id, source) { + return Object.assign(Object.assign({}, source), { mutableRange: { start: makeInstructionId(0), end: makeInstructionId(0) }, id }); +} +function validateIdentifierName(name) { + if (isReservedWord(name)) { + const error = new CompilerError(); + error.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Syntax, + reason: 'Expected a non-reserved identifier name', + description: `\`${name}\` is a reserved word in JavaScript and cannot be used as an identifier name`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: GeneratedSource, + message: 'reserved word', + })); + return Err(error); + } + else if (!libExports$1.isValidIdentifier(name)) { + const error = new CompilerError(); + error.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Syntax, + reason: `Expected a valid identifier name`, + description: `\`${name}\` is not a valid JavaScript identifier`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: GeneratedSource, + message: 'reserved word', + })); + } + return Ok({ + kind: 'named', + value: name, + }); +} +function makeIdentifierName(name) { + return validateIdentifierName(name).unwrap(); +} +function promoteTemporary(identifier) { + CompilerError.invariant(identifier.name === null, { + reason: `Expected a temporary (unnamed) identifier`, + description: `Identifier already has a name, \`${identifier.name}\``, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + identifier.name = { + kind: 'promoted', + value: `#t${identifier.declarationId}`, + }; +} +function isPromotedTemporary(name) { + return name.startsWith('#t'); +} +function promoteTemporaryJsxTag(identifier) { + CompilerError.invariant(identifier.name === null, { + reason: `Expected a temporary (unnamed) identifier`, + description: `Identifier already has a name, \`${identifier.name}\``, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + identifier.name = { + kind: 'promoted', + value: `#T${identifier.declarationId}`, + }; +} +function isPromotedJsxTemporary(name) { + return name.startsWith('#T'); +} +var ValueReason; +(function (ValueReason) { + ValueReason["Global"] = "global"; + ValueReason["JsxCaptured"] = "jsx-captured"; + ValueReason["HookCaptured"] = "hook-captured"; + ValueReason["HookReturn"] = "hook-return"; + ValueReason["Effect"] = "effect"; + ValueReason["KnownReturnSignature"] = "known-return-signature"; + ValueReason["Context"] = "context"; + ValueReason["State"] = "state"; + ValueReason["ReducerState"] = "reducer-state"; + ValueReason["ReactiveFunctionArgument"] = "reactive-function-argument"; + ValueReason["Other"] = "other"; +})(ValueReason || (ValueReason = {})); +var ValueKind; +(function (ValueKind) { + ValueKind["MaybeFrozen"] = "maybefrozen"; + ValueKind["Frozen"] = "frozen"; + ValueKind["Primitive"] = "primitive"; + ValueKind["Global"] = "global"; + ValueKind["Mutable"] = "mutable"; + ValueKind["Context"] = "context"; +})(ValueKind || (ValueKind = {})); +const ValueKindSchema = zod.z.enum([ + ValueKind.MaybeFrozen, + ValueKind.Frozen, + ValueKind.Primitive, + ValueKind.Global, + ValueKind.Mutable, + ValueKind.Context, +]); +const ValueReasonSchema = zod.z.enum([ + ValueReason.Context, + ValueReason.Effect, + ValueReason.Global, + ValueReason.HookCaptured, + ValueReason.HookReturn, + ValueReason.JsxCaptured, + ValueReason.KnownReturnSignature, + ValueReason.Other, + ValueReason.ReactiveFunctionArgument, + ValueReason.ReducerState, + ValueReason.State, +]); +var Effect; +(function (Effect) { + Effect["Unknown"] = ""; + Effect["Freeze"] = "freeze"; + Effect["Read"] = "read"; + Effect["Capture"] = "capture"; + Effect["ConditionallyMutateIterator"] = "mutate-iterator?"; + Effect["ConditionallyMutate"] = "mutate?"; + Effect["Mutate"] = "mutate"; + Effect["Store"] = "store"; +})(Effect || (Effect = {})); +const EffectSchema = zod.z.enum([ + Effect.Read, + Effect.Mutate, + Effect.ConditionallyMutate, + Effect.ConditionallyMutateIterator, + Effect.Capture, + Effect.Store, + Effect.Freeze, +]); +function isMutableEffect(effect, location) { + switch (effect) { + case Effect.Capture: + case Effect.Store: + case Effect.ConditionallyMutate: + case Effect.ConditionallyMutateIterator: + case Effect.Mutate: { + return true; + } + case Effect.Unknown: { + CompilerError.invariant(false, { + reason: 'Unexpected unknown effect', + description: null, + details: [ + { + kind: 'error', + loc: location, + message: null, + }, + ], + suggestions: null, + }); + } + case Effect.Read: + case Effect.Freeze: { + return false; + } + default: { + assertExhaustive$1(effect, `Unexpected effect \`${effect}\``); + } + } +} +function makePropertyLiteral(value) { + return value; +} +function areEqualPaths(a, b) { + return (a.length === b.length && + a.every((item, ix) => item.property === b[ix].property && item.optional === b[ix].optional)); +} +function getPlaceScope(id, place) { + const scope = place.identifier.scope; + if (scope !== null && isScopeActive(scope, id)) { + return scope; + } + return null; +} +function isScopeActive(scope, id) { + return id >= scope.range.start && id < scope.range.end; +} +function makeBlockId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected block id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeScopeId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected block id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeIdentifierId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected identifier id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeDeclarationId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected declaration id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeInstructionId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected instruction id to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function isObjectMethodType(id) { + return id.type.kind == 'ObjectMethod'; +} +function isPrimitiveType(id) { + return id.type.kind === 'Primitive'; +} +function isArrayType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInArray'; +} +function isMapType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInMap'; +} +function isSetType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInSet'; +} +function isPropsType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInProps'; +} +function isRefValueType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInRefValue'; +} +function isUseRefType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInUseRefId'; +} +function isUseStateType(id) { + return id.type.kind === 'Object' && id.type.shapeId === 'BuiltInUseState'; +} +function isJsxType(type) { + return type.kind === 'Object' && type.shapeId === 'BuiltInJsx'; +} +function isRefOrRefValue(id) { + return isUseRefType(id) || isRefValueType(id); +} +function isRefOrRefLikeMutableType(type) { + return (type.kind === 'Object' && + (type.shapeId === 'BuiltInUseRefId' || + type.shapeId == 'ReanimatedSharedValueId')); +} +function isSetStateType(id) { + return id.type.kind === 'Function' && id.type.shapeId === 'BuiltInSetState'; +} +function isStartTransitionType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInStartTransition'); +} +function isSetActionStateType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInSetActionState'); +} +function isUseReducerType(id) { + return id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseReducer'; +} +function isDispatcherType(id) { + return id.type.kind === 'Function' && id.type.shapeId === 'BuiltInDispatch'; +} +function isFireFunctionType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInFireFunction'); +} +function isEffectEventFunctionType(id) { + return (id.type.kind === 'Function' && + id.type.shapeId === 'BuiltInEffectEventFunction'); +} +function isStableType(id) { + return (isSetStateType(id) || + isSetActionStateType(id) || + isDispatcherType(id) || + isUseRefType(id) || + isStartTransitionType(id)); +} +function isStableTypeContainer(id) { + const type_ = id.type; + if (type_.kind !== 'Object') { + return false; + } + return (isUseStateType(id) || + type_.shapeId === 'BuiltInUseActionState' || + isUseReducerType(id) || + type_.shapeId === 'BuiltInUseTransition'); +} +function evaluatesToStableTypeOrContainer(env, { value }) { + if (value.kind === 'CallExpression' || value.kind === 'MethodCall') { + const callee = value.kind === 'CallExpression' ? value.callee : value.property; + const calleeHookKind = getHookKind(env, callee.identifier); + switch (calleeHookKind) { + case 'useState': + case 'useReducer': + case 'useActionState': + case 'useRef': + case 'useTransition': + return true; + } + } + return false; +} +function isUseEffectHookType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseEffectHook'); +} +function isUseLayoutEffectHookType(id) { + return (id.type.kind === 'Function' && + id.type.shapeId === 'BuiltInUseLayoutEffectHook'); +} +function isUseInsertionEffectHookType(id) { + return (id.type.kind === 'Function' && + id.type.shapeId === 'BuiltInUseInsertionEffectHook'); +} +function isUseContextHookType(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseContextHook'); +} +function getHookKind(env, id) { + return getHookKindForType(env, id.type); +} +function isUseOperator(id) { + return (id.type.kind === 'Function' && id.type.shapeId === 'BuiltInUseOperator'); +} +function getHookKindForType(env, type) { + var _a; + if (type.kind === 'Function') { + const signature = env.getFunctionSignature(type); + return (_a = signature === null || signature === void 0 ? void 0 : signature.hookKind) !== null && _a !== void 0 ? _a : null; + } + return null; +} + +function printReactiveScopeSummary(scope) { + const items = []; + items.push('scope'); + items.push(`@${scope.id}`); + items.push(`[${scope.range.start}:${scope.range.end}]`); + items.push(`dependencies=[${Array.from(scope.dependencies) + .map(dep => printDependency(dep)) + .join(', ')}]`); + items.push(`declarations=[${Array.from(scope.declarations) + .map(([, decl]) => printIdentifier(Object.assign(Object.assign({}, decl.identifier), { scope: decl.scope }))) + .join(', ')}]`); + items.push(`reassignments=[${Array.from(scope.reassignments).map(reassign => printIdentifier(reassign))}]`); + if (scope.earlyReturnValue !== null) { + items.push(`earlyReturn={id: ${printIdentifier(scope.earlyReturnValue.value)}, label: ${scope.earlyReturnValue.label}}}`); + } + return items.join(' '); +} +function printDependency(dependency) { + const identifier = printIdentifier(dependency.identifier) + + printType(dependency.identifier.type); + return `${identifier}${dependency.path.map(token => `${token.optional ? '?.' : '.'}${token.property}`).join('')}`; +} + +function printFunction(fn) { + const output = []; + let definition = ''; + if (fn.id !== null) { + definition += fn.id; + } + else { + definition += '<>'; + } + if (fn.nameHint != null) { + definition += ` ${fn.nameHint}`; + } + if (fn.params.length !== 0) { + definition += + '(' + + fn.params + .map(param => { + if (param.kind === 'Identifier') { + return printPlace(param); + } + else { + return `...${printPlace(param.place)}`; + } + }) + .join(', ') + + ')'; + } + else { + definition += '()'; + } + definition += `: ${printPlace(fn.returns)}`; + output.push(definition); + output.push(...fn.directives); + output.push(printHIR(fn.body)); + return output.join('\n'); +} +function printHIR(ir, options = null) { + var _a; + let output = []; + let indent = ' '.repeat((_a = options === null || options === void 0 ? void 0 : options.indent) !== null && _a !== void 0 ? _a : 0); + const push = (text, indent = ' ') => { + output.push(`${indent}${text}`); + }; + for (const [blockId, block] of ir.blocks) { + output.push(`bb${blockId} (${block.kind}):`); + if (block.preds.size > 0) { + const preds = ['predecessor blocks:']; + for (const pred of block.preds) { + preds.push(`bb${pred}`); + } + push(preds.join(' ')); + } + for (const phi of block.phis) { + push(printPhi(phi)); + } + for (const instr of block.instructions) { + push(printInstruction(instr)); + } + const terminal = printTerminal(block.terminal); + if (Array.isArray(terminal)) { + terminal.forEach(line => push(line)); + } + else { + push(terminal); + } + } + return output.map(line => indent + line).join('\n'); +} +function printInstruction(instr) { + const id = `[${instr.id}]`; + let value = printInstructionValue(instr.value); + if (instr.effects != null) { + value += `\n ${instr.effects.map(printAliasingEffect).join('\n ')}`; + } + if (instr.lvalue !== null) { + return `${id} ${printPlace(instr.lvalue)} = ${value}`; + } + else { + return `${id} ${value}`; + } +} +function printPhi(phi) { + const items = []; + items.push(printPlace(phi.place)); + items.push(printMutableRange(phi.place.identifier)); + items.push(printType(phi.place.identifier.type)); + items.push(': phi('); + const phis = []; + for (const [blockId, place] of phi.operands) { + phis.push(`bb${blockId}: ${printPlace(place)}`); + } + items.push(phis.join(', ')); + items.push(')'); + return items.join(''); +} +function printTerminal(terminal) { + let value; + switch (terminal.kind) { + case 'if': { + value = `[${terminal.id}] If (${printPlace(terminal.test)}) then:bb${terminal.consequent} else:bb${terminal.alternate}${terminal.fallthrough ? ` fallthrough=bb${terminal.fallthrough}` : ''}`; + break; + } + case 'branch': { + value = `[${terminal.id}] Branch (${printPlace(terminal.test)}) then:bb${terminal.consequent} else:bb${terminal.alternate} fallthrough:bb${terminal.fallthrough}`; + break; + } + case 'logical': { + value = `[${terminal.id}] Logical ${terminal.operator} test:bb${terminal.test} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'ternary': { + value = `[${terminal.id}] Ternary test:bb${terminal.test} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'optional': { + value = `[${terminal.id}] Optional (optional=${terminal.optional}) test:bb${terminal.test} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'throw': { + value = `[${terminal.id}] Throw ${printPlace(terminal.value)}`; + break; + } + case 'return': { + value = `[${terminal.id}] Return ${terminal.returnVariant}${terminal.value != null ? ' ' + printPlace(terminal.value) : ''}`; + if (terminal.effects != null) { + value += `\n ${terminal.effects.map(printAliasingEffect).join('\n ')}`; + } + break; + } + case 'goto': { + value = `[${terminal.id}] Goto${terminal.variant === GotoVariant.Continue ? '(Continue)' : ''} bb${terminal.block}`; + break; + } + case 'switch': { + const output = []; + output.push(`[${terminal.id}] Switch (${printPlace(terminal.test)})`); + terminal.cases.forEach(case_ => { + if (case_.test !== null) { + output.push(` Case ${printPlace(case_.test)}: bb${case_.block}`); + } + else { + output.push(` Default: bb${case_.block}`); + } + }); + if (terminal.fallthrough) { + output.push(` Fallthrough: bb${terminal.fallthrough}`); + } + value = output; + break; + } + case 'do-while': { + value = `[${terminal.id}] DoWhile loop=${`bb${terminal.loop}`} test=bb${terminal.test} fallthrough=${`bb${terminal.fallthrough}`}`; + break; + } + case 'while': { + value = `[${terminal.id}] While test=bb${terminal.test} loop=${terminal.loop !== null ? `bb${terminal.loop}` : ''} fallthrough=${terminal.fallthrough ? `bb${terminal.fallthrough}` : ''}`; + break; + } + case 'for': { + value = `[${terminal.id}] For init=bb${terminal.init} test=bb${terminal.test} loop=bb${terminal.loop} update=bb${terminal.update} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'for-of': { + value = `[${terminal.id}] ForOf init=bb${terminal.init} test=bb${terminal.test} loop=bb${terminal.loop} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'for-in': { + value = `[${terminal.id}] ForIn init=bb${terminal.init} loop=bb${terminal.loop} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'label': { + value = `[${terminal.id}] Label block=bb${terminal.block} fallthrough=${terminal.fallthrough ? `bb${terminal.fallthrough}` : ''}`; + break; + } + case 'sequence': { + value = `[${terminal.id}] Sequence block=bb${terminal.block} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'unreachable': { + value = `[${terminal.id}] Unreachable`; + break; + } + case 'unsupported': { + value = `[${terminal.id}] Unsupported`; + break; + } + case 'maybe-throw': { + value = `[${terminal.id}] MaybeThrow continuation=bb${terminal.continuation} handler=bb${terminal.handler}`; + if (terminal.effects != null) { + value += `\n ${terminal.effects.map(printAliasingEffect).join('\n ')}`; + } + break; + } + case 'scope': { + value = `[${terminal.id}] Scope ${printReactiveScopeSummary(terminal.scope)} block=bb${terminal.block} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'pruned-scope': { + value = `[${terminal.id}] Scope ${printReactiveScopeSummary(terminal.scope)} block=bb${terminal.block} fallthrough=bb${terminal.fallthrough}`; + break; + } + case 'try': { + value = `[${terminal.id}] Try block=bb${terminal.block} handler=bb${terminal.handler}${terminal.handlerBinding !== null + ? ` handlerBinding=(${printPlace(terminal.handlerBinding)})` + : ''} fallthrough=${terminal.fallthrough != null ? `bb${terminal.fallthrough}` : ''}`; + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal}\``); + } + } + return value; +} +function printHole() { + return ''; +} +function printObjectPropertyKey(key) { + switch (key.kind) { + case 'identifier': + return key.name; + case 'string': + return `"${key.name}"`; + case 'computed': { + return `[${printPlace(key.name)}]`; + } + case 'number': { + return String(key.name); + } + } +} +function printInstructionValue(instrValue) { + var _a, _b, _c, _d, _e; + let value = ''; + switch (instrValue.kind) { + case 'ArrayExpression': { + value = `Array [${instrValue.elements + .map(element => { + if (element.kind === 'Identifier') { + return printPlace(element); + } + else if (element.kind === 'Hole') { + return printHole(); + } + else { + return `...${printPlace(element.place)}`; + } + }) + .join(', ')}]`; + break; + } + case 'ObjectExpression': { + const properties = []; + if (instrValue.properties !== null) { + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty') { + properties.push(`${printObjectPropertyKey(property.key)}: ${printPlace(property.place)}`); + } + else { + properties.push(`...${printPlace(property.place)}`); + } + } + } + value = `Object { ${properties.join(', ')} }`; + break; + } + case 'UnaryExpression': { + value = `Unary ${printPlace(instrValue.value)}`; + break; + } + case 'BinaryExpression': { + value = `Binary ${printPlace(instrValue.left)} ${instrValue.operator} ${printPlace(instrValue.right)}`; + break; + } + case 'NewExpression': { + value = `New ${printPlace(instrValue.callee)}(${instrValue.args + .map(arg => printPattern(arg)) + .join(', ')})`; + break; + } + case 'CallExpression': { + value = `Call ${printPlace(instrValue.callee)}(${instrValue.args + .map(arg => printPattern(arg)) + .join(', ')})`; + break; + } + case 'MethodCall': { + value = `MethodCall ${printPlace(instrValue.receiver)}.${printPlace(instrValue.property)}(${instrValue.args.map(arg => printPattern(arg)).join(', ')})`; + break; + } + case 'JSXText': { + value = `JSXText ${JSON.stringify(instrValue.value)}`; + break; + } + case 'Primitive': { + if (instrValue.value === undefined) { + value = ''; + } + else { + value = JSON.stringify(instrValue.value); + } + break; + } + case 'TypeCastExpression': { + value = `TypeCast ${printPlace(instrValue.value)}: ${printType(instrValue.type)}`; + break; + } + case 'JsxExpression': { + const propItems = []; + for (const attribute of instrValue.props) { + if (attribute.kind === 'JsxAttribute') { + propItems.push(`${attribute.name}={${attribute.place !== null ? printPlace(attribute.place) : ''}}`); + } + else { + propItems.push(`...${printPlace(attribute.argument)}`); + } + } + const tag = instrValue.tag.kind === 'Identifier' + ? printPlace(instrValue.tag) + : instrValue.tag.name; + const props = propItems.length !== 0 ? ' ' + propItems.join(' ') : ''; + if (instrValue.children !== null) { + const children = instrValue.children.map(child => { + return `{${printPlace(child)}}`; + }); + value = `JSX <${tag}${props}${props.length > 0 ? ' ' : ''}>${children.join('')}`; + } + else { + value = `JSX <${tag}${props}${props.length > 0 ? ' ' : ''}/>`; + } + break; + } + case 'JsxFragment': { + value = `JsxFragment [${instrValue.children + .map(child => printPlace(child)) + .join(', ')}]`; + break; + } + case 'UnsupportedNode': { + value = `UnsupportedNode ${instrValue.node.type}`; + break; + } + case 'LoadLocal': { + value = `LoadLocal ${printPlace(instrValue.place)}`; + break; + } + case 'DeclareLocal': { + value = `DeclareLocal ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)}`; + break; + } + case 'DeclareContext': { + value = `DeclareContext ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)}`; + break; + } + case 'StoreLocal': { + value = `StoreLocal ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)} = ${printPlace(instrValue.value)}`; + break; + } + case 'LoadContext': { + value = `LoadContext ${printPlace(instrValue.place)}`; + break; + } + case 'StoreContext': { + value = `StoreContext ${instrValue.lvalue.kind} ${printPlace(instrValue.lvalue.place)} = ${printPlace(instrValue.value)}`; + break; + } + case 'Destructure': { + value = `Destructure ${instrValue.lvalue.kind} ${printPattern(instrValue.lvalue.pattern)} = ${printPlace(instrValue.value)}`; + break; + } + case 'PropertyLoad': { + value = `PropertyLoad ${printPlace(instrValue.object)}.${instrValue.property}`; + break; + } + case 'PropertyStore': { + value = `PropertyStore ${printPlace(instrValue.object)}.${instrValue.property} = ${printPlace(instrValue.value)}`; + break; + } + case 'PropertyDelete': { + value = `PropertyDelete ${printPlace(instrValue.object)}.${instrValue.property}`; + break; + } + case 'ComputedLoad': { + value = `ComputedLoad ${printPlace(instrValue.object)}[${printPlace(instrValue.property)}]`; + break; + } + case 'ComputedStore': { + value = `ComputedStore ${printPlace(instrValue.object)}[${printPlace(instrValue.property)}] = ${printPlace(instrValue.value)}`; + break; + } + case 'ComputedDelete': { + value = `ComputedDelete ${printPlace(instrValue.object)}[${printPlace(instrValue.property)}]`; + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + const kind = instrValue.kind === 'FunctionExpression' ? 'Function' : 'ObjectMethod'; + const name = getFunctionName$2(instrValue, ''); + const fn = printFunction(instrValue.loweredFunc.func) + .split('\n') + .map(line => ` ${line}`) + .join('\n'); + const context = instrValue.loweredFunc.func.context + .map(dep => printPlace(dep)) + .join(','); + const aliasingEffects = (_c = (_b = (_a = instrValue.loweredFunc.func.aliasingEffects) === null || _a === void 0 ? void 0 : _a.map(printAliasingEffect)) === null || _b === void 0 ? void 0 : _b.join(', ')) !== null && _c !== void 0 ? _c : ''; + value = `${kind} ${name} @context[${context}] @aliasingEffects=[${aliasingEffects}]\n${fn}`; + break; + } + case 'TaggedTemplateExpression': { + value = `${printPlace(instrValue.tag)}\`${instrValue.value.raw}\``; + break; + } + case 'LogicalExpression': { + value = `Logical ${printInstructionValue(instrValue.left)} ${instrValue.operator} ${printInstructionValue(instrValue.right)}`; + break; + } + case 'SequenceExpression': { + value = [ + `Sequence`, + ...instrValue.instructions.map(instr => ` ${printInstruction(instr)}`), + ` ${printInstructionValue(instrValue.value)}`, + ].join('\n'); + break; + } + case 'ConditionalExpression': { + value = `Ternary ${printInstructionValue(instrValue.test)} ? ${printInstructionValue(instrValue.consequent)} : ${printInstructionValue(instrValue.alternate)}`; + break; + } + case 'TemplateLiteral': { + value = '`'; + CompilerError.invariant(instrValue.subexprs.length === instrValue.quasis.length - 1, { + reason: 'Bad assumption about quasi length.', + description: null, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + for (let i = 0; i < instrValue.subexprs.length; i++) { + value += instrValue.quasis[i].raw; + value += `\${${printPlace(instrValue.subexprs[i])}}`; + } + value += instrValue.quasis.at(-1).raw + '`'; + break; + } + case 'LoadGlobal': { + switch (instrValue.binding.kind) { + case 'Global': { + value = `LoadGlobal(global) ${instrValue.binding.name}`; + break; + } + case 'ModuleLocal': { + value = `LoadGlobal(module) ${instrValue.binding.name}`; + break; + } + case 'ImportDefault': { + value = `LoadGlobal import ${instrValue.binding.name} from '${instrValue.binding.module}'`; + break; + } + case 'ImportNamespace': { + value = `LoadGlobal import * as ${instrValue.binding.name} from '${instrValue.binding.module}'`; + break; + } + case 'ImportSpecifier': { + if (instrValue.binding.imported !== instrValue.binding.name) { + value = `LoadGlobal import { ${instrValue.binding.imported} as ${instrValue.binding.name} } from '${instrValue.binding.module}'`; + } + else { + value = `LoadGlobal import { ${instrValue.binding.name} } from '${instrValue.binding.module}'`; + } + break; + } + default: { + assertExhaustive$1(instrValue.binding, `Unexpected binding kind \`${instrValue.binding.kind}\``); + } + } + break; + } + case 'StoreGlobal': { + value = `StoreGlobal ${instrValue.name} = ${printPlace(instrValue.value)}`; + break; + } + case 'OptionalExpression': { + value = `OptionalExpression ${printInstructionValue(instrValue.value)}`; + break; + } + case 'RegExpLiteral': { + value = `RegExp /${instrValue.pattern}/${instrValue.flags}`; + break; + } + case 'MetaProperty': { + value = `MetaProperty ${instrValue.meta}.${instrValue.property}`; + break; + } + case 'Await': { + value = `Await ${printPlace(instrValue.value)}`; + break; + } + case 'GetIterator': { + value = `GetIterator collection=${printPlace(instrValue.collection)}`; + break; + } + case 'IteratorNext': { + value = `IteratorNext iterator=${printPlace(instrValue.iterator)} collection=${printPlace(instrValue.collection)}`; + break; + } + case 'NextPropertyOf': { + value = `NextPropertyOf ${printPlace(instrValue.value)}`; + break; + } + case 'Debugger': { + value = `Debugger`; + break; + } + case 'PostfixUpdate': { + value = `PostfixUpdate ${printPlace(instrValue.lvalue)} = ${printPlace(instrValue.value)} ${instrValue.operation}`; + break; + } + case 'PrefixUpdate': { + value = `PrefixUpdate ${printPlace(instrValue.lvalue)} = ${instrValue.operation} ${printPlace(instrValue.value)}`; + break; + } + case 'StartMemoize': { + value = `StartMemoize deps=${(_e = (_d = instrValue.deps) === null || _d === void 0 ? void 0 : _d.map(dep => printManualMemoDependency(dep, false))) !== null && _e !== void 0 ? _e : '(none)'}`; + break; + } + case 'FinishMemoize': { + value = `FinishMemoize decl=${printPlace(instrValue.decl)}${instrValue.pruned ? ' pruned' : ''}`; + break; + } + default: { + assertExhaustive$1(instrValue, `Unexpected instruction kind '${instrValue.kind}'`); + } + } + return value; +} +function isMutable$1(range) { + return range.end > range.start + 1; +} +function printMutableRange(identifier) { + var _b, _c; + const range = (_c = (_b = identifier.scope) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : identifier.mutableRange; + return isMutable$1(range) ? `[${range.start}:${range.end}]` : ''; +} +function printPattern(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + return ('[ ' + + pattern.items + .map(item => { + if (item.kind === 'Hole') { + return ''; + } + return printPattern(item); + }) + .join(', ') + + ' ]'); + } + case 'ObjectPattern': { + return ('{ ' + + pattern.properties + .map(item => { + switch (item.kind) { + case 'ObjectProperty': { + return `${printObjectPropertyKey(item.key)}: ${printPattern(item.place)}`; + } + case 'Spread': { + return printPattern(item); + } + default: { + assertExhaustive$1(item, 'Unexpected object property kind'); + } + } + }) + .join(', ') + + ' }'); + } + case 'Spread': { + return `...${printPlace(pattern.place)}`; + } + case 'Identifier': { + return printPlace(pattern); + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function printPlace(place) { + const items = [ + place.effect, + ' ', + printIdentifier(place.identifier), + printMutableRange(place.identifier), + printType(place.identifier.type), + place.reactive ? '{reactive}' : null, + ]; + return items.filter(x => x != null).join(''); +} +function printIdentifier(id) { + return `${printName(id.name)}\$${id.id}${printScope(id.scope)}`; +} +function printName(name) { + if (name === null) { + return ''; + } + return name.value; +} +function printScope(scope) { + return `${scope !== null ? `_@${scope.id}` : ''}`; +} +function printManualMemoDependency(val, nameOnly) { + var _a; + let rootStr; + if (val.root.kind === 'Global') { + rootStr = val.root.identifierName; + } + else { + CompilerError.invariant(((_a = val.root.value.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named', { + reason: 'DepsValidation: expected named local variable in depslist', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: val.root.value.loc, + message: null, + }, + ], + }); + rootStr = nameOnly + ? val.root.value.identifier.name.value + : printIdentifier(val.root.value.identifier); + } + return `${rootStr}${val.path.map(v => `${v.optional ? '?.' : '.'}${v.property}`).join('')}`; +} +function printType(type) { + if (type.kind === 'Type') + return ''; + if (type.kind === 'Object' && type.shapeId != null) { + return `:T${type.kind}<${type.shapeId}>`; + } + else if (type.kind === 'Function' && type.shapeId != null) { + const returnType = printType(type.return); + return `:T${type.kind}<${type.shapeId}>()${returnType !== '' ? `: ${returnType}` : ''}`; + } + else { + return `:T${type.kind}`; + } +} +function printSourceLocation(loc) { + if (typeof loc === 'symbol') { + return 'generated'; + } + else { + return `${loc.start.line}:${loc.start.column}:${loc.end.line}:${loc.end.column}`; + } +} +function printSourceLocationLine(loc) { + if (typeof loc === 'symbol') { + return 'generated'; + } + else { + return `${loc.start.line}:${loc.end.line}`; + } +} +function getFunctionName$2(instrValue, defaultValue) { + var _a; + switch (instrValue.kind) { + case 'FunctionExpression': + return (_a = instrValue.name) !== null && _a !== void 0 ? _a : defaultValue; + case 'ObjectMethod': + return defaultValue; + } +} +function printAliasingEffect(effect) { + var _a; + switch (effect.kind) { + case 'Assign': { + return `Assign ${printPlaceForAliasEffect(effect.into)} = ${printPlaceForAliasEffect(effect.from)}`; + } + case 'Alias': { + return `Alias ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'MaybeAlias': { + return `MaybeAlias ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'Capture': { + return `Capture ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'ImmutableCapture': { + return `ImmutableCapture ${printPlaceForAliasEffect(effect.into)} <- ${printPlaceForAliasEffect(effect.from)}`; + } + case 'Create': { + return `Create ${printPlaceForAliasEffect(effect.into)} = ${effect.value}`; + } + case 'CreateFrom': { + return `Create ${printPlaceForAliasEffect(effect.into)} = kindOf(${printPlaceForAliasEffect(effect.from)})`; + } + case 'CreateFunction': { + return `Function ${printPlaceForAliasEffect(effect.into)} = Function captures=[${effect.captures.map(printPlaceForAliasEffect).join(', ')}]`; + } + case 'Apply': { + const receiverCallee = effect.receiver.identifier.id === effect.function.identifier.id + ? printPlaceForAliasEffect(effect.receiver) + : `${printPlaceForAliasEffect(effect.receiver)}.${printPlaceForAliasEffect(effect.function)}`; + const args = effect.args + .map(arg => { + if (arg.kind === 'Identifier') { + return printPlaceForAliasEffect(arg); + } + else if (arg.kind === 'Hole') { + return ' '; + } + return `...${printPlaceForAliasEffect(arg.place)}`; + }) + .join(', '); + let signature = ''; + if (effect.signature != null) { + if (effect.signature.aliasing != null) { + signature = printAliasingSignature(effect.signature.aliasing); + } + else { + signature = JSON.stringify(effect.signature, null, 2); + } + } + return `Apply ${printPlaceForAliasEffect(effect.into)} = ${receiverCallee}(${args})${signature != '' ? '\n ' : ''}${signature}`; + } + case 'Freeze': { + return `Freeze ${printPlaceForAliasEffect(effect.value)} ${effect.reason}`; + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + return `${effect.kind} ${printPlaceForAliasEffect(effect.value)}${effect.kind === 'Mutate' && ((_a = effect.reason) === null || _a === void 0 ? void 0 : _a.kind) === 'AssignCurrentProperty' ? ' (assign `.current`)' : ''}`; + } + case 'MutateFrozen': { + return `MutateFrozen ${printPlaceForAliasEffect(effect.place)} reason=${JSON.stringify(effect.error.reason)}`; + } + case 'MutateGlobal': { + return `MutateGlobal ${printPlaceForAliasEffect(effect.place)} reason=${JSON.stringify(effect.error.reason)}`; + } + case 'Impure': { + return `Impure ${printPlaceForAliasEffect(effect.place)} reason=${JSON.stringify(effect.error.reason)}`; + } + case 'Render': { + return `Render ${printPlaceForAliasEffect(effect.place)}`; + } + default: { + assertExhaustive$1(effect, `Unexpected kind '${effect.kind}'`); + } + } +} +function printPlaceForAliasEffect(place) { + return printIdentifier(place.identifier); +} +function printAliasingSignature(signature) { + const tokens = ['function ']; + if (signature.temporaries.length !== 0) { + tokens.push('<'); + tokens.push(signature.temporaries.map(temp => `$${temp.identifier.id}`).join(', ')); + tokens.push('>'); + } + tokens.push('('); + tokens.push('this=$' + String(signature.receiver)); + for (const param of signature.params) { + tokens.push(', $' + String(param)); + } + if (signature.rest != null) { + tokens.push(`, ...$${String(signature.rest)}`); + } + tokens.push('): '); + tokens.push('$' + String(signature.returns) + ':'); + for (const effect of signature.effects) { + tokens.push('\n ' + printAliasingEffect(effect)); + } + return tokens.join(''); +} + +var _ScopeBlockTraversal_activeScopes; +function* eachInstructionLValue(instr) { + if (instr.lvalue !== null) { + yield instr.lvalue; + } + yield* eachInstructionValueLValue(instr.value); +} +function* eachInstructionValueLValue(value) { + switch (value.kind) { + case 'DeclareContext': + case 'StoreContext': + case 'DeclareLocal': + case 'StoreLocal': { + yield value.lvalue.place; + break; + } + case 'Destructure': { + yield* eachPatternOperand(value.lvalue.pattern); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + yield value.lvalue; + break; + } + } +} +function* eachInstructionOperand(instr) { + yield* eachInstructionValueOperand(instr.value); +} +function* eachInstructionValueOperand(instrValue) { + switch (instrValue.kind) { + case 'NewExpression': + case 'CallExpression': { + yield instrValue.callee; + yield* eachCallArgument(instrValue.args); + break; + } + case 'BinaryExpression': { + yield instrValue.left; + yield instrValue.right; + break; + } + case 'MethodCall': { + yield instrValue.receiver; + yield instrValue.property; + yield* eachCallArgument(instrValue.args); + break; + } + case 'DeclareContext': + case 'DeclareLocal': { + break; + } + case 'LoadLocal': + case 'LoadContext': { + yield instrValue.place; + break; + } + case 'StoreLocal': { + yield instrValue.value; + break; + } + case 'StoreContext': { + yield instrValue.lvalue.place; + yield instrValue.value; + break; + } + case 'StoreGlobal': { + yield instrValue.value; + break; + } + case 'Destructure': { + yield instrValue.value; + break; + } + case 'PropertyLoad': { + yield instrValue.object; + break; + } + case 'PropertyDelete': { + yield instrValue.object; + break; + } + case 'PropertyStore': { + yield instrValue.object; + yield instrValue.value; + break; + } + case 'ComputedLoad': { + yield instrValue.object; + yield instrValue.property; + break; + } + case 'ComputedDelete': { + yield instrValue.object; + yield instrValue.property; + break; + } + case 'ComputedStore': { + yield instrValue.object; + yield instrValue.property; + yield instrValue.value; + break; + } + case 'UnaryExpression': { + yield instrValue.value; + break; + } + case 'JsxExpression': { + if (instrValue.tag.kind === 'Identifier') { + yield instrValue.tag; + } + for (const attribute of instrValue.props) { + switch (attribute.kind) { + case 'JsxAttribute': { + yield attribute.place; + break; + } + case 'JsxSpreadAttribute': { + yield attribute.argument; + break; + } + default: { + assertExhaustive$1(attribute, `Unexpected attribute kind \`${attribute.kind}\``); + } + } + } + if (instrValue.children) { + yield* instrValue.children; + } + break; + } + case 'JsxFragment': { + yield* instrValue.children; + break; + } + case 'ObjectExpression': { + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty' && + property.key.kind === 'computed') { + yield property.key.name; + } + yield property.place; + } + break; + } + case 'ArrayExpression': { + for (const element of instrValue.elements) { + if (element.kind === 'Identifier') { + yield element; + } + else if (element.kind === 'Spread') { + yield element.place; + } + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + yield* instrValue.loweredFunc.func.context; + break; + } + case 'TaggedTemplateExpression': { + yield instrValue.tag; + break; + } + case 'TypeCastExpression': { + yield instrValue.value; + break; + } + case 'TemplateLiteral': { + yield* instrValue.subexprs; + break; + } + case 'Await': { + yield instrValue.value; + break; + } + case 'GetIterator': { + yield instrValue.collection; + break; + } + case 'IteratorNext': { + yield instrValue.iterator; + yield instrValue.collection; + break; + } + case 'NextPropertyOf': { + yield instrValue.value; + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + yield instrValue.value; + break; + } + case 'StartMemoize': { + if (instrValue.deps != null) { + for (const dep of instrValue.deps) { + if (dep.root.kind === 'NamedLocal') { + yield dep.root.value; + } + } + } + break; + } + case 'FinishMemoize': { + yield instrValue.decl; + break; + } + case 'Debugger': + case 'RegExpLiteral': + case 'MetaProperty': + case 'LoadGlobal': + case 'UnsupportedNode': + case 'Primitive': + case 'JSXText': { + break; + } + default: { + assertExhaustive$1(instrValue, `Unexpected instruction kind \`${instrValue.kind}\``); + } + } +} +function* eachCallArgument(args) { + for (const arg of args) { + if (arg.kind === 'Identifier') { + yield arg; + } + else { + yield arg.place; + } + } +} +function doesPatternContainSpreadElement(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Spread') { + return true; + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'Spread') { + return true; + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } + return false; +} +function* eachPatternOperand(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Identifier') { + yield item; + } + else if (item.kind === 'Spread') { + yield item.place; + } + else if (item.kind === 'Hole') { + continue; + } + else { + assertExhaustive$1(item, `Unexpected item kind \`${item.kind}\``); + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + yield property.place; + } + else if (property.kind === 'Spread') { + yield property.place; + } + else { + assertExhaustive$1(property, `Unexpected item kind \`${property.kind}\``); + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function* eachPatternItem(pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Identifier') { + yield item; + } + else if (item.kind === 'Spread') { + yield item; + } + else if (item.kind === 'Hole') { + continue; + } + else { + assertExhaustive$1(item, `Unexpected item kind \`${item.kind}\``); + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + yield property.place; + } + else if (property.kind === 'Spread') { + yield property; + } + else { + assertExhaustive$1(property, `Unexpected item kind \`${property.kind}\``); + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function mapInstructionLValues(instr, fn) { + switch (instr.value.kind) { + case 'DeclareLocal': + case 'StoreLocal': { + const lvalue = instr.value.lvalue; + lvalue.place = fn(lvalue.place); + break; + } + case 'Destructure': { + mapPatternOperands(instr.value.lvalue.pattern, fn); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + instr.value.lvalue = fn(instr.value.lvalue); + break; + } + } + if (instr.lvalue !== null) { + instr.lvalue = fn(instr.lvalue); + } +} +function mapInstructionOperands(instr, fn) { + mapInstructionValueOperands(instr.value, fn); +} +function mapInstructionValueOperands(instrValue, fn) { + switch (instrValue.kind) { + case 'BinaryExpression': { + instrValue.left = fn(instrValue.left); + instrValue.right = fn(instrValue.right); + break; + } + case 'PropertyLoad': { + instrValue.object = fn(instrValue.object); + break; + } + case 'PropertyDelete': { + instrValue.object = fn(instrValue.object); + break; + } + case 'PropertyStore': { + instrValue.object = fn(instrValue.object); + instrValue.value = fn(instrValue.value); + break; + } + case 'ComputedLoad': { + instrValue.object = fn(instrValue.object); + instrValue.property = fn(instrValue.property); + break; + } + case 'ComputedDelete': { + instrValue.object = fn(instrValue.object); + instrValue.property = fn(instrValue.property); + break; + } + case 'ComputedStore': { + instrValue.object = fn(instrValue.object); + instrValue.property = fn(instrValue.property); + instrValue.value = fn(instrValue.value); + break; + } + case 'DeclareContext': + case 'DeclareLocal': { + break; + } + case 'LoadLocal': + case 'LoadContext': { + instrValue.place = fn(instrValue.place); + break; + } + case 'StoreLocal': { + instrValue.value = fn(instrValue.value); + break; + } + case 'StoreContext': { + instrValue.lvalue.place = fn(instrValue.lvalue.place); + instrValue.value = fn(instrValue.value); + break; + } + case 'StoreGlobal': { + instrValue.value = fn(instrValue.value); + break; + } + case 'Destructure': { + instrValue.value = fn(instrValue.value); + break; + } + case 'NewExpression': + case 'CallExpression': { + instrValue.callee = fn(instrValue.callee); + instrValue.args = mapCallArguments(instrValue.args, fn); + break; + } + case 'MethodCall': { + instrValue.receiver = fn(instrValue.receiver); + instrValue.property = fn(instrValue.property); + instrValue.args = mapCallArguments(instrValue.args, fn); + break; + } + case 'UnaryExpression': { + instrValue.value = fn(instrValue.value); + break; + } + case 'JsxExpression': { + if (instrValue.tag.kind === 'Identifier') { + instrValue.tag = fn(instrValue.tag); + } + for (const attribute of instrValue.props) { + switch (attribute.kind) { + case 'JsxAttribute': { + attribute.place = fn(attribute.place); + break; + } + case 'JsxSpreadAttribute': { + attribute.argument = fn(attribute.argument); + break; + } + default: { + assertExhaustive$1(attribute, `Unexpected attribute kind \`${attribute.kind}\``); + } + } + } + if (instrValue.children) { + instrValue.children = instrValue.children.map(p => fn(p)); + } + break; + } + case 'ObjectExpression': { + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty' && + property.key.kind === 'computed') { + property.key.name = fn(property.key.name); + } + property.place = fn(property.place); + } + break; + } + case 'ArrayExpression': { + instrValue.elements = instrValue.elements.map(element => { + if (element.kind === 'Identifier') { + return fn(element); + } + else if (element.kind === 'Spread') { + element.place = fn(element.place); + return element; + } + else { + return element; + } + }); + break; + } + case 'JsxFragment': { + instrValue.children = instrValue.children.map(e => fn(e)); + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + instrValue.loweredFunc.func.context = + instrValue.loweredFunc.func.context.map(d => fn(d)); + break; + } + case 'TaggedTemplateExpression': { + instrValue.tag = fn(instrValue.tag); + break; + } + case 'TypeCastExpression': { + instrValue.value = fn(instrValue.value); + break; + } + case 'TemplateLiteral': { + instrValue.subexprs = instrValue.subexprs.map(fn); + break; + } + case 'Await': { + instrValue.value = fn(instrValue.value); + break; + } + case 'GetIterator': { + instrValue.collection = fn(instrValue.collection); + break; + } + case 'IteratorNext': { + instrValue.iterator = fn(instrValue.iterator); + instrValue.collection = fn(instrValue.collection); + break; + } + case 'NextPropertyOf': { + instrValue.value = fn(instrValue.value); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + instrValue.value = fn(instrValue.value); + break; + } + case 'StartMemoize': { + if (instrValue.deps != null) { + for (const dep of instrValue.deps) { + if (dep.root.kind === 'NamedLocal') { + dep.root.value = fn(dep.root.value); + } + } + } + break; + } + case 'FinishMemoize': { + instrValue.decl = fn(instrValue.decl); + break; + } + case 'Debugger': + case 'RegExpLiteral': + case 'MetaProperty': + case 'LoadGlobal': + case 'UnsupportedNode': + case 'Primitive': + case 'JSXText': { + break; + } + default: { + assertExhaustive$1(instrValue, 'Unexpected instruction kind'); + } + } +} +function mapCallArguments(args, fn) { + return args.map(arg => { + if (arg.kind === 'Identifier') { + return fn(arg); + } + else { + arg.place = fn(arg.place); + return arg; + } + }); +} +function mapPatternOperands(pattern, fn) { + switch (pattern.kind) { + case 'ArrayPattern': { + pattern.items = pattern.items.map(item => { + if (item.kind === 'Identifier') { + return fn(item); + } + else if (item.kind === 'Spread') { + item.place = fn(item.place); + return item; + } + else { + return item; + } + }); + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + property.place = fn(property.place); + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function mapTerminalSuccessors(terminal, fn) { + switch (terminal.kind) { + case 'goto': { + const target = fn(terminal.block); + return { + kind: 'goto', + block: target, + variant: terminal.variant, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'if': { + const consequent = fn(terminal.consequent); + const alternate = fn(terminal.alternate); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'if', + test: terminal.test, + consequent, + alternate, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'branch': { + const consequent = fn(terminal.consequent); + const alternate = fn(terminal.alternate); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'branch', + test: terminal.test, + consequent, + alternate, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'switch': { + const cases = terminal.cases.map(case_ => { + const target = fn(case_.block); + return { + test: case_.test, + block: target, + }; + }); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'switch', + test: terminal.test, + cases, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'logical': { + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'logical', + test, + fallthrough, + operator: terminal.operator, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'ternary': { + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'ternary', + test, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'optional': { + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'optional', + optional: terminal.optional, + test, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'return': { + return { + kind: 'return', + returnVariant: terminal.returnVariant, + loc: terminal.loc, + value: terminal.value, + id: makeInstructionId(0), + effects: terminal.effects, + }; + } + case 'throw': { + return terminal; + } + case 'do-while': { + const loop = fn(terminal.loop); + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'do-while', + loc: terminal.loc, + test, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'while': { + const test = fn(terminal.test); + const loop = fn(terminal.loop); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'while', + loc: terminal.loc, + test, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'for': { + const init = fn(terminal.init); + const test = fn(terminal.test); + const update = terminal.update !== null ? fn(terminal.update) : null; + const loop = fn(terminal.loop); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'for', + loc: terminal.loc, + init, + test, + update, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'for-of': { + const init = fn(terminal.init); + const loop = fn(terminal.loop); + const test = fn(terminal.test); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'for-of', + loc: terminal.loc, + init, + test, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'for-in': { + const init = fn(terminal.init); + const loop = fn(terminal.loop); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'for-in', + loc: terminal.loc, + init, + loop, + fallthrough, + id: makeInstructionId(0), + }; + } + case 'label': { + const block = fn(terminal.block); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'label', + block, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'sequence': { + const block = fn(terminal.block); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'sequence', + block, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'maybe-throw': { + const continuation = fn(terminal.continuation); + const handler = fn(terminal.handler); + return { + kind: 'maybe-throw', + continuation, + handler, + id: makeInstructionId(0), + loc: terminal.loc, + effects: terminal.effects, + }; + } + case 'try': { + const block = fn(terminal.block); + const handler = fn(terminal.handler); + const fallthrough = fn(terminal.fallthrough); + return { + kind: 'try', + block, + handlerBinding: terminal.handlerBinding, + handler, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'scope': + case 'pruned-scope': { + const block = fn(terminal.block); + const fallthrough = fn(terminal.fallthrough); + return { + kind: terminal.kind, + scope: terminal.scope, + block, + fallthrough, + id: makeInstructionId(0), + loc: terminal.loc, + }; + } + case 'unreachable': + case 'unsupported': { + return terminal; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function terminalHasFallthrough(terminal) { + switch (terminal.kind) { + case 'maybe-throw': + case 'goto': + case 'return': + case 'throw': + case 'unreachable': + case 'unsupported': { + return false; + } + case 'branch': + case 'try': + case 'do-while': + case 'for-of': + case 'for-in': + case 'for': + case 'if': + case 'label': + case 'logical': + case 'optional': + case 'sequence': + case 'switch': + case 'ternary': + case 'while': + case 'scope': + case 'pruned-scope': { + return true; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function terminalFallthrough(terminal) { + if (terminalHasFallthrough(terminal)) { + return terminal.fallthrough; + } + else { + return null; + } +} +function* eachTerminalSuccessor(terminal) { + switch (terminal.kind) { + case 'goto': { + yield terminal.block; + break; + } + case 'if': { + yield terminal.consequent; + yield terminal.alternate; + break; + } + case 'branch': { + yield terminal.consequent; + yield terminal.alternate; + break; + } + case 'switch': { + for (const case_ of terminal.cases) { + yield case_.block; + } + break; + } + case 'optional': + case 'ternary': + case 'logical': { + yield terminal.test; + break; + } + case 'return': { + break; + } + case 'throw': { + break; + } + case 'do-while': { + yield terminal.loop; + break; + } + case 'while': { + yield terminal.test; + break; + } + case 'for': { + yield terminal.init; + break; + } + case 'for-of': { + yield terminal.init; + break; + } + case 'for-in': { + yield terminal.init; + break; + } + case 'label': { + yield terminal.block; + break; + } + case 'sequence': { + yield terminal.block; + break; + } + case 'maybe-throw': { + yield terminal.continuation; + yield terminal.handler; + break; + } + case 'try': { + yield terminal.block; + break; + } + case 'scope': + case 'pruned-scope': { + yield terminal.block; + break; + } + case 'unreachable': + case 'unsupported': + break; + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function mapTerminalOperands(terminal, fn) { + switch (terminal.kind) { + case 'if': { + terminal.test = fn(terminal.test); + break; + } + case 'branch': { + terminal.test = fn(terminal.test); + break; + } + case 'switch': { + terminal.test = fn(terminal.test); + for (const case_ of terminal.cases) { + if (case_.test === null) { + continue; + } + case_.test = fn(case_.test); + } + break; + } + case 'return': + case 'throw': { + terminal.value = fn(terminal.value); + break; + } + case 'try': { + if (terminal.handlerBinding !== null) { + terminal.handlerBinding = fn(terminal.handlerBinding); + } + else { + terminal.handlerBinding = null; + } + break; + } + case 'maybe-throw': + case 'sequence': + case 'label': + case 'optional': + case 'ternary': + case 'logical': + case 'do-while': + case 'while': + case 'for': + case 'for-of': + case 'for-in': + case 'goto': + case 'unreachable': + case 'unsupported': + case 'scope': + case 'pruned-scope': { + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function* eachTerminalOperand(terminal) { + switch (terminal.kind) { + case 'if': { + yield terminal.test; + break; + } + case 'branch': { + yield terminal.test; + break; + } + case 'switch': { + yield terminal.test; + for (const case_ of terminal.cases) { + if (case_.test === null) { + continue; + } + yield case_.test; + } + break; + } + case 'return': + case 'throw': { + yield terminal.value; + break; + } + case 'try': { + if (terminal.handlerBinding !== null) { + yield terminal.handlerBinding; + } + break; + } + case 'maybe-throw': + case 'sequence': + case 'label': + case 'optional': + case 'ternary': + case 'logical': + case 'do-while': + case 'while': + case 'for': + case 'for-of': + case 'for-in': + case 'goto': + case 'unreachable': + case 'unsupported': + case 'scope': + case 'pruned-scope': { + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +class ScopeBlockTraversal { + constructor() { + _ScopeBlockTraversal_activeScopes.set(this, []); + this.blockInfos = new Map(); + } + recordScopes(block) { + var _a, _b; + const blockInfo = this.blockInfos.get(block.id); + if ((blockInfo === null || blockInfo === void 0 ? void 0 : blockInfo.kind) === 'begin') { + __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").push(blockInfo.scope.id); + } + else if ((blockInfo === null || blockInfo === void 0 ? void 0 : blockInfo.kind) === 'end') { + const top = __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").at(-1); + CompilerError.invariant(blockInfo.scope.id === top, { + reason: 'Expected traversed block fallthrough to match top-most active scope', + description: null, + details: [ + { + kind: 'error', + loc: (_b = (_a = block.instructions[0]) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : block.terminal.id, + message: null, + }, + ], + }); + __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").pop(); + } + if (block.terminal.kind === 'scope' || + block.terminal.kind === 'pruned-scope') { + CompilerError.invariant(!this.blockInfos.has(block.terminal.block) && + !this.blockInfos.has(block.terminal.fallthrough), { + reason: 'Expected unique scope blocks and fallthroughs', + description: null, + details: [ + { + kind: 'error', + loc: block.terminal.loc, + message: null, + }, + ], + }); + this.blockInfos.set(block.terminal.block, { + kind: 'begin', + scope: block.terminal.scope, + pruned: block.terminal.kind === 'pruned-scope', + fallthrough: block.terminal.fallthrough, + }); + this.blockInfos.set(block.terminal.fallthrough, { + kind: 'end', + scope: block.terminal.scope, + pruned: block.terminal.kind === 'pruned-scope', + }); + } + } + isScopeActive(scopeId) { + return __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").indexOf(scopeId) !== -1; + } + get currentScope() { + var _a; + return (_a = __classPrivateFieldGet(this, _ScopeBlockTraversal_activeScopes, "f").at(-1)) !== null && _a !== void 0 ? _a : null; + } +} +_ScopeBlockTraversal_activeScopes = new WeakMap(); + +function assertConsistentIdentifiers(fn) { + const identifiers = new Map(); + const assignments = new Set(); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + validate(identifiers, phi.place.identifier); + for (const [, operand] of phi.operands) { + validate(identifiers, operand.identifier); + } + } + for (const instr of block.instructions) { + CompilerError.invariant(instr.lvalue.identifier.name === null, { + reason: `Expected all lvalues to be temporaries`, + description: `Found named lvalue \`${instr.lvalue.identifier.name}\``, + details: [ + { + kind: 'error', + loc: instr.lvalue.loc, + message: null, + }, + ], + suggestions: null, + }); + CompilerError.invariant(!assignments.has(instr.lvalue.identifier.id), { + reason: `Expected lvalues to be assigned exactly once`, + description: `Found duplicate assignment of '${printPlace(instr.lvalue)}'`, + details: [ + { + kind: 'error', + loc: instr.lvalue.loc, + message: null, + }, + ], + suggestions: null, + }); + assignments.add(instr.lvalue.identifier.id); + for (const operand of eachInstructionLValue(instr)) { + validate(identifiers, operand.identifier, operand.loc); + } + for (const operand of eachInstructionValueOperand(instr.value)) { + validate(identifiers, operand.identifier, operand.loc); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + validate(identifiers, operand.identifier, operand.loc); + } + } +} +function validate(identifiers, identifier, loc = null) { + const previous = identifiers.get(identifier.id); + if (previous === undefined) { + identifiers.set(identifier.id, identifier); + } + else { + CompilerError.invariant(identifier === previous, { + reason: `Duplicate identifier object`, + description: `Found duplicate identifier object for id ${identifier.id}`, + details: [ + { + kind: 'error', + loc: loc !== null && loc !== void 0 ? loc : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + } +} + +function assertTerminalSuccessorsExist(fn) { + for (const [, block] of fn.body.blocks) { + mapTerminalSuccessors(block.terminal, successor => { + var _a; + CompilerError.invariant(fn.body.blocks.has(successor), { + reason: `Terminal successor references unknown block`, + description: `Block bb${successor} does not exist for terminal '${printTerminal(block.terminal)}'`, + details: [ + { + kind: 'error', + loc: (_a = block.terminal.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + return successor; + }); + } +} +function assertTerminalPredsExist(fn) { + for (const [, block] of fn.body.blocks) { + for (const pred of block.preds) { + const predBlock = fn.body.blocks.get(pred); + CompilerError.invariant(predBlock != null, { + reason: 'Expected predecessor block to exist', + description: `Block ${block.id} references non-existent ${pred}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + CompilerError.invariant([...eachTerminalSuccessor(predBlock.terminal)].includes(block.id), { + reason: 'Terminal successor does not reference correct predecessor', + description: `Block bb${block.id} has bb${predBlock.id} as a predecessor, but bb${predBlock.id}'s successors do not include bb${block.id}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } +} + +function getScopes(fn) { + const scopes = new Set(); + function visitPlace(place) { + const scope = place.identifier.scope; + if (scope != null) { + if (scope.range.start !== scope.range.end) { + scopes.add(scope); + } + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + visitPlace(operand); + } + for (const operand of eachInstructionOperand(instr)) { + visitPlace(operand); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visitPlace(operand); + } + } + return scopes; +} +function rangePreOrderComparator(a, b) { + const startDiff = a.start - b.start; + if (startDiff !== 0) + return startDiff; + return b.end - a.end; +} +function recursivelyTraverseItems(items, getRange, context, enter, exit) { + items.sort((a, b) => rangePreOrderComparator(getRange(a), getRange(b))); + let activeItems = []; + const ranges = items.map(getRange); + for (let i = 0; i < items.length; i++) { + const curr = items[i]; + const currRange = ranges[i]; + for (let i = activeItems.length - 1; i >= 0; i--) { + const maybeParent = activeItems[i]; + const maybeParentRange = getRange(maybeParent); + const disjoint = currRange.start >= maybeParentRange.end; + const nested = currRange.end <= maybeParentRange.end; + CompilerError.invariant(disjoint || nested, { + reason: 'Invalid nesting in program blocks or scopes', + description: `Items overlap but are not nested: ${maybeParentRange.start}:${maybeParentRange.end}(${currRange.start}:${currRange.end})`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + if (disjoint) { + exit(maybeParent, context); + activeItems.length = i; + } + else { + break; + } + } + enter(curr, context); + activeItems.push(curr); + } + let curr = activeItems.pop(); + while (curr != null) { + exit(curr, context); + curr = activeItems.pop(); + } +} +const no_op = () => { }; +function assertValidBlockNesting(fn) { + var _a, _b; + const scopes = getScopes(fn); + const blocks = [...scopes].map(scope => (Object.assign({ kind: 'Scope', id: scope.id }, scope.range))); + for (const [, block] of fn.body.blocks) { + const fallthroughId = terminalFallthrough(block.terminal); + if (fallthroughId != null) { + const fallthrough = fn.body.blocks.get(fallthroughId); + const end = (_b = (_a = fallthrough.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : fallthrough.terminal.id; + blocks.push({ + kind: 'ProgramBlockSubtree', + id: block.id, + start: block.terminal.id, + end, + }); + } + } + recursivelyTraverseItems(blocks, block => block, null, no_op, no_op); +} + +function assertValidMutableRanges(fn) { + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + visit$2(phi.place, `phi for block bb${block.id}`); + for (const [pred, operand] of phi.operands) { + visit$2(operand, `phi predecessor bb${pred} for block bb${block.id}`); + } + } + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + visit$2(operand, `instruction [${instr.id}]`); + } + for (const operand of eachInstructionOperand(instr)) { + visit$2(operand, `instruction [${instr.id}]`); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visit$2(operand, `terminal [${block.terminal.id}]`); + } + } +} +function visit$2(place, description) { + validateMutableRange(place, place.identifier.mutableRange, description); + if (place.identifier.scope !== null) { + validateMutableRange(place, place.identifier.scope.range, description); + } +} +function validateMutableRange(place, range, description) { + CompilerError.invariant((range.start === 0 && range.end === 0) || range.end > range.start, { + reason: `Invalid mutable range: [${range.start}:${range.end}]`, + description: `${printPlace(place)} in ${description}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + }); +} + +var _HIRBuilder_instances, _HIRBuilder_completed, _HIRBuilder_current, _HIRBuilder_entry, _HIRBuilder_scopes, _HIRBuilder_context, _HIRBuilder_bindings, _HIRBuilder_env, _HIRBuilder_exceptionHandlerStack, _HIRBuilder_resolveBabelBinding; +function newBlock(id, kind) { + return { id, kind, instructions: [] }; +} +class HIRBuilder { + get nextIdentifierId() { + return __classPrivateFieldGet(this, _HIRBuilder_env, "f").nextIdentifierId; + } + get context() { + return __classPrivateFieldGet(this, _HIRBuilder_context, "f"); + } + get bindings() { + return __classPrivateFieldGet(this, _HIRBuilder_bindings, "f"); + } + get environment() { + return __classPrivateFieldGet(this, _HIRBuilder_env, "f"); + } + constructor(env, options) { + var _a, _b, _c; + _HIRBuilder_instances.add(this); + _HIRBuilder_completed.set(this, new Map()); + _HIRBuilder_current.set(this, void 0); + _HIRBuilder_entry.set(this, void 0); + _HIRBuilder_scopes.set(this, []); + _HIRBuilder_context.set(this, void 0); + _HIRBuilder_bindings.set(this, void 0); + _HIRBuilder_env.set(this, void 0); + _HIRBuilder_exceptionHandlerStack.set(this, []); + this.errors = new CompilerError(); + this.fbtDepth = 0; + __classPrivateFieldSet(this, _HIRBuilder_env, env, "f"); + __classPrivateFieldSet(this, _HIRBuilder_bindings, (_a = options === null || options === void 0 ? void 0 : options.bindings) !== null && _a !== void 0 ? _a : new Map(), "f"); + __classPrivateFieldSet(this, _HIRBuilder_context, (_b = options === null || options === void 0 ? void 0 : options.context) !== null && _b !== void 0 ? _b : new Map(), "f"); + __classPrivateFieldSet(this, _HIRBuilder_entry, makeBlockId(env.nextBlockId), "f"); + __classPrivateFieldSet(this, _HIRBuilder_current, newBlock(__classPrivateFieldGet(this, _HIRBuilder_entry, "f"), (_c = options === null || options === void 0 ? void 0 : options.entryBlockKind) !== null && _c !== void 0 ? _c : 'block'), "f"); + } + currentBlockKind() { + return __classPrivateFieldGet(this, _HIRBuilder_current, "f").kind; + } + push(instruction) { + __classPrivateFieldGet(this, _HIRBuilder_current, "f").instructions.push(instruction); + const exceptionHandler = __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").at(-1); + if (exceptionHandler !== undefined) { + const continuationBlock = this.reserve(this.currentBlockKind()); + this.terminateWithContinuation({ + kind: 'maybe-throw', + continuation: continuationBlock.id, + handler: exceptionHandler, + id: makeInstructionId(0), + loc: instruction.loc, + effects: null, + }, continuationBlock); + } + } + enterTryCatch(handler, fn) { + __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").push(handler); + fn(); + __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").pop(); + } + resolveThrowHandler() { + const handler = __classPrivateFieldGet(this, _HIRBuilder_exceptionHandlerStack, "f").at(-1); + return handler !== null && handler !== void 0 ? handler : null; + } + makeTemporary(loc) { + const id = this.nextIdentifierId; + return makeTemporaryIdentifier(id, loc); + } + resolveIdentifier(path) { + const originalName = path.node.name; + const babelBinding = __classPrivateFieldGet(this, _HIRBuilder_instances, "m", _HIRBuilder_resolveBabelBinding).call(this, path); + if (babelBinding == null) { + return { kind: 'Global', name: originalName }; + } + const outerBinding = __classPrivateFieldGet(this, _HIRBuilder_env, "f").parentFunction.scope.parent.getBinding(originalName); + if (babelBinding === outerBinding) { + const path = babelBinding.path; + if (path.isImportDefaultSpecifier()) { + const importDeclaration = path.parentPath; + return { + kind: 'ImportDefault', + name: originalName, + module: importDeclaration.node.source.value, + }; + } + else if (path.isImportSpecifier()) { + const importDeclaration = path.parentPath; + return { + kind: 'ImportSpecifier', + name: originalName, + module: importDeclaration.node.source.value, + imported: path.node.imported.type === 'Identifier' + ? path.node.imported.name + : path.node.imported.value, + }; + } + else if (path.isImportNamespaceSpecifier()) { + const importDeclaration = path.parentPath; + return { + kind: 'ImportNamespace', + name: originalName, + module: importDeclaration.node.source.value, + }; + } + else { + return { + kind: 'ModuleLocal', + name: originalName, + }; + } + } + const resolvedBinding = this.resolveBinding(babelBinding.identifier); + if (resolvedBinding.name && resolvedBinding.name.value !== originalName) { + babelBinding.scope.rename(originalName, resolvedBinding.name.value); + } + return { + kind: 'Identifier', + identifier: resolvedBinding, + bindingKind: babelBinding.kind, + }; + } + isContextIdentifier(path) { + const binding = __classPrivateFieldGet(this, _HIRBuilder_instances, "m", _HIRBuilder_resolveBabelBinding).call(this, path); + if (binding) { + const outerBinding = __classPrivateFieldGet(this, _HIRBuilder_env, "f").parentFunction.scope.parent.getBinding(path.node.name); + if (binding === outerBinding) { + return false; + } + return __classPrivateFieldGet(this, _HIRBuilder_env, "f").isContextIdentifier(binding.identifier); + } + else { + return false; + } + } + resolveBinding(node) { + var _a, _b, _c; + if (node.name === 'fbt') { + CompilerError.throwDiagnostic({ + category: ErrorCategory.Todo, + reason: 'Support local variables named `fbt`', + description: 'Local variables named `fbt` may conflict with the fbt plugin and are not yet supported', + details: [ + { + kind: 'error', + message: 'Rename to avoid conflict with fbt plugin', + loc: (_a = node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }, + ], + }); + } + if (node.name === 'this') { + CompilerError.throwDiagnostic({ + category: ErrorCategory.UnsupportedSyntax, + reason: '`this` is not supported syntax', + description: 'React Compiler does not support compiling functions that use `this`', + details: [ + { + kind: 'error', + message: '`this` was used here', + loc: (_b = node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }, + ], + }); + } + const originalName = node.name; + let name = originalName; + let index = 0; + while (true) { + const mapping = __classPrivateFieldGet(this, _HIRBuilder_bindings, "f").get(name); + if (mapping === undefined) { + const id = this.nextIdentifierId; + const identifier = { + id, + declarationId: makeDeclarationId(id), + name: makeIdentifierName(name), + mutableRange: { + start: makeInstructionId(0), + end: makeInstructionId(0), + }, + scope: null, + type: makeType(), + loc: (_c = node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + }; + __classPrivateFieldGet(this, _HIRBuilder_env, "f").programContext.addNewReference(name); + __classPrivateFieldGet(this, _HIRBuilder_bindings, "f").set(name, { node, identifier }); + return identifier; + } + else if (mapping.node === node) { + return mapping.identifier; + } + else { + name = `${originalName}_${index++}`; + } + } + } + build() { + var _a, _b; + let ir = { + blocks: __classPrivateFieldGet(this, _HIRBuilder_completed, "f"), + entry: __classPrivateFieldGet(this, _HIRBuilder_entry, "f"), + }; + const rpoBlocks = getReversePostorderedBlocks(ir); + for (const [id, block] of ir.blocks) { + if (!rpoBlocks.has(id) && + block.instructions.some(instr => instr.value.kind === 'FunctionExpression')) { + CompilerError.throwTodo({ + reason: `Support functions with unreachable code that may contain hoisted declarations`, + loc: (_b = (_a = block.instructions[0]) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : block.terminal.loc, + description: null, + suggestions: null, + }); + } + } + ir.blocks = rpoBlocks; + removeUnreachableForUpdates(ir); + removeDeadDoWhileStatements(ir); + removeUnnecessaryTryCatch(ir); + markInstructionIds(ir); + markPredecessors(ir); + return ir; + } + terminate(terminal, nextBlockKind) { + const { id: blockId, kind, instructions } = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind, + id: blockId, + instructions, + terminal, + preds: new Set(), + phis: new Set(), + }); + if (nextBlockKind) { + const nextId = __classPrivateFieldGet(this, _HIRBuilder_env, "f").nextBlockId; + __classPrivateFieldSet(this, _HIRBuilder_current, newBlock(nextId, nextBlockKind), "f"); + } + return blockId; + } + terminateWithContinuation(terminal, continuation) { + const { id: blockId, kind, instructions } = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind: kind, + id: blockId, + instructions, + terminal: terminal, + preds: new Set(), + phis: new Set(), + }); + __classPrivateFieldSet(this, _HIRBuilder_current, continuation, "f"); + } + reserve(kind) { + return newBlock(makeBlockId(__classPrivateFieldGet(this, _HIRBuilder_env, "f").nextBlockId), kind); + } + complete(block, terminal) { + const { id: blockId, kind, instructions } = block; + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind, + id: blockId, + instructions, + terminal, + preds: new Set(), + phis: new Set(), + }); + } + enterReserved(wip, fn) { + const current = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldSet(this, _HIRBuilder_current, wip, "f"); + const terminal = fn(); + const { id: blockId, kind, instructions } = __classPrivateFieldGet(this, _HIRBuilder_current, "f"); + __classPrivateFieldGet(this, _HIRBuilder_completed, "f").set(blockId, { + kind, + id: blockId, + instructions, + terminal, + preds: new Set(), + phis: new Set(), + }); + __classPrivateFieldSet(this, _HIRBuilder_current, current, "f"); + } + enter(nextBlockKind, fn) { + const wip = this.reserve(nextBlockKind); + this.enterReserved(wip, () => { + return fn(wip.id); + }); + return wip.id; + } + label(label, breakBlock, fn) { + __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").push({ + kind: 'label', + breakBlock, + label, + }); + const value = fn(); + const last = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").pop(); + CompilerError.invariant(last != null && + last.kind === 'label' && + last.label === label && + last.breakBlock === breakBlock, { + reason: 'Mismatched label', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return value; + } + switch(label, breakBlock, fn) { + __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").push({ + kind: 'switch', + breakBlock, + label, + }); + const value = fn(); + const last = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").pop(); + CompilerError.invariant(last != null && + last.kind === 'switch' && + last.label === label && + last.breakBlock === breakBlock, { + reason: 'Mismatched label', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return value; + } + loop(label, continueBlock, breakBlock, fn) { + __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").push({ + kind: 'loop', + label, + continueBlock, + breakBlock, + }); + const value = fn(); + const last = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").pop(); + CompilerError.invariant(last != null && + last.kind === 'loop' && + last.label === label && + last.continueBlock === continueBlock && + last.breakBlock === breakBlock, { + reason: 'Mismatched loops', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return value; + } + lookupBreak(label) { + for (let ii = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").length - 1; ii >= 0; ii--) { + const scope = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f")[ii]; + if ((label === null && + (scope.kind === 'loop' || scope.kind === 'switch')) || + label === scope.label) { + return scope.breakBlock; + } + } + CompilerError.invariant(false, { + reason: 'Expected a loop or switch to be in scope', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + lookupContinue(label) { + for (let ii = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f").length - 1; ii >= 0; ii--) { + const scope = __classPrivateFieldGet(this, _HIRBuilder_scopes, "f")[ii]; + if (scope.kind === 'loop') { + if (label === null || label === scope.label) { + return scope.continueBlock; + } + } + else if (label !== null && scope.label === label) { + CompilerError.invariant(false, { + reason: 'Continue may only refer to a labeled loop', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + } + CompilerError.invariant(false, { + reason: 'Expected a loop to be in scope', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } +} +_HIRBuilder_completed = new WeakMap(), _HIRBuilder_current = new WeakMap(), _HIRBuilder_entry = new WeakMap(), _HIRBuilder_scopes = new WeakMap(), _HIRBuilder_context = new WeakMap(), _HIRBuilder_bindings = new WeakMap(), _HIRBuilder_env = new WeakMap(), _HIRBuilder_exceptionHandlerStack = new WeakMap(), _HIRBuilder_instances = new WeakSet(), _HIRBuilder_resolveBabelBinding = function _HIRBuilder_resolveBabelBinding(path) { + const originalName = path.node.name; + const binding = path.scope.getBinding(originalName); + if (binding == null) { + return null; + } + return binding; +}; +function removeUnreachableForUpdates(fn) { + for (const [, block] of fn.blocks) { + if (block.terminal.kind === 'for' && + block.terminal.update !== null && + !fn.blocks.has(block.terminal.update)) { + block.terminal.update = null; + } + } +} +function removeDeadDoWhileStatements(func) { + const visited = new Set(); + for (const [_, block] of func.blocks) { + visited.add(block.id); + } + for (const [_, block] of func.blocks) { + if (block.terminal.kind === 'do-while') { + if (!visited.has(block.terminal.test)) { + block.terminal = { + kind: 'goto', + block: block.terminal.loop, + variant: GotoVariant.Break, + id: block.terminal.id, + loc: block.terminal.loc, + }; + } + } + } +} +function reversePostorderBlocks(func) { + const rpoBlocks = getReversePostorderedBlocks(func); + func.blocks = rpoBlocks; +} +function getReversePostorderedBlocks(func) { + const visited = new Set(); + const used = new Set(); + const usedFallthroughs = new Set(); + const postorder = []; + function visit(blockId, isUsed) { + const wasUsed = used.has(blockId); + const wasVisited = visited.has(blockId); + visited.add(blockId); + if (isUsed) { + used.add(blockId); + } + if (wasVisited && (wasUsed || !isUsed)) { + return; + } + const block = func.blocks.get(blockId); + CompilerError.invariant(block != null, { + reason: '[HIRBuilder] Unexpected null block', + description: `expected block ${blockId} to exist`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + const successors = [...eachTerminalSuccessor(block.terminal)].reverse(); + const fallthrough = terminalFallthrough(block.terminal); + if (fallthrough != null) { + if (isUsed) { + usedFallthroughs.add(fallthrough); + } + visit(fallthrough, false); + } + for (const successor of successors) { + visit(successor, isUsed); + } + if (!wasVisited) { + postorder.push(blockId); + } + } + visit(func.entry, true); + const blocks = new Map(); + for (const blockId of postorder.reverse()) { + const block = func.blocks.get(blockId); + if (used.has(blockId)) { + blocks.set(blockId, func.blocks.get(blockId)); + } + else if (usedFallthroughs.has(blockId)) { + blocks.set(blockId, Object.assign(Object.assign({}, block), { instructions: [], terminal: { + kind: 'unreachable', + id: block.terminal.id, + loc: block.terminal.loc, + } })); + } + } + return blocks; +} +function markInstructionIds(func) { + let id = 0; + const visited = new Set(); + for (const [_, block] of func.blocks) { + for (const instr of block.instructions) { + CompilerError.invariant(!visited.has(instr), { + reason: `${printInstruction(instr)} already visited!`, + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + suggestions: null, + }); + visited.add(instr); + instr.id = makeInstructionId(++id); + } + block.terminal.id = makeInstructionId(++id); + } +} +function markPredecessors(func) { + for (const [, block] of func.blocks) { + block.preds.clear(); + } + const visited = new Set(); + function visit(blockId, prevBlock) { + const block = func.blocks.get(blockId); + if (block == null) { + return; + } + CompilerError.invariant(block != null, { + reason: 'unexpected missing block', + description: `block ${blockId}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + if (prevBlock) { + block.preds.add(prevBlock.id); + } + if (visited.has(blockId)) { + return; + } + visited.add(blockId); + const { terminal } = block; + for (const successor of eachTerminalSuccessor(terminal)) { + visit(successor, block); + } + } + visit(func.entry, null); +} +function removeUnnecessaryTryCatch(fn) { + for (const [, block] of fn.blocks) { + if (block.terminal.kind === 'try' && + !fn.blocks.has(block.terminal.handler)) { + const handlerId = block.terminal.handler; + const fallthroughId = block.terminal.fallthrough; + const fallthrough = fn.blocks.get(fallthroughId); + block.terminal = { + kind: 'goto', + block: block.terminal.block, + id: makeInstructionId(0), + loc: block.terminal.loc, + variant: GotoVariant.Break, + }; + if (fallthrough != null) { + if (fallthrough.preds.size === 1 && fallthrough.preds.has(handlerId)) { + fn.blocks.delete(fallthroughId); + } + else { + fallthrough.preds.delete(handlerId); + } + } + } + } +} +function createTemporaryPlace(env, loc) { + return { + kind: 'Identifier', + identifier: makeTemporaryIdentifier(env.nextIdentifierId, loc), + reactive: false, + effect: Effect.Unknown, + loc: GeneratedSource, + }; +} +function clonePlaceToTemporary(env, place) { + const temp = createTemporaryPlace(env, place.loc); + temp.effect = place.effect; + temp.identifier.type = place.identifier.type; + temp.reactive = place.reactive; + return temp; +} +function fixScopeAndIdentifierRanges(func) { + var _a, _b; + for (const [, block] of func.blocks) { + const terminal = block.terminal; + if (terminal.kind === 'scope' || terminal.kind === 'pruned-scope') { + const fallthroughBlock = func.blocks.get(terminal.fallthrough); + const firstId = (_b = (_a = fallthroughBlock.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : fallthroughBlock.terminal.id; + terminal.scope.range.start = terminal.id; + terminal.scope.range.end = firstId; + } + } +} + +const PRIMITIVE_TYPE = { + kind: 'Primitive', +}; +let nextAnonId = 0; +function createAnonId() { + return ``; +} +function addFunction(registry, properties, fn, id = null, isConstructor = false) { + const shapeId = id !== null && id !== void 0 ? id : createAnonId(); + const aliasing = fn.aliasing != null + ? parseAliasingSignatureConfig(fn.aliasing, '', GeneratedSource) + : null; + addShape(registry, shapeId, properties, Object.assign(Object.assign({}, fn), { aliasing, hookKind: null })); + return { + kind: 'Function', + return: fn.returnType, + shapeId, + isConstructor, + }; +} +function addHook(registry, fn, id = null) { + const shapeId = id !== null && id !== void 0 ? id : createAnonId(); + const aliasing = fn.aliasing != null + ? parseAliasingSignatureConfig(fn.aliasing, '', GeneratedSource) + : null; + addShape(registry, shapeId, [], Object.assign(Object.assign({}, fn), { aliasing })); + return { + kind: 'Function', + return: fn.returnType, + shapeId, + isConstructor: false, + }; +} +function parseAliasingSignatureConfig(typeConfig, moduleName, loc) { + const lifetimes = new Map(); + function define(temp) { + CompilerError.invariant(!lifetimes.has(temp), { + reason: `Invalid type configuration for module`, + description: `Expected aliasing signature to have unique names for receiver, params, rest, returns, and temporaries in module '${moduleName}'`, + details: [ + { + kind: 'error', + loc, + message: null, + }, + ], + }); + const place = signatureArgument(lifetimes.size); + lifetimes.set(temp, place); + return place; + } + function lookup(temp) { + const place = lifetimes.get(temp); + CompilerError.invariant(place != null, { + reason: `Invalid type configuration for module`, + description: `Expected aliasing signature effects to reference known names from receiver/params/rest/returns/temporaries, but '${temp}' is not a known name in '${moduleName}'`, + details: [ + { + kind: 'error', + loc, + message: null, + }, + ], + }); + return place; + } + const receiver = define(typeConfig.receiver); + const params = typeConfig.params.map(define); + const rest = typeConfig.rest != null ? define(typeConfig.rest) : null; + const returns = define(typeConfig.returns); + const temporaries = typeConfig.temporaries.map(define); + const effects = typeConfig.effects.map((effect) => { + switch (effect.kind) { + case 'ImmutableCapture': + case 'CreateFrom': + case 'Capture': + case 'Alias': + case 'Assign': { + const from = lookup(effect.from); + const into = lookup(effect.into); + return { + kind: effect.kind, + from, + into, + }; + } + case 'Mutate': + case 'MutateTransitiveConditionally': { + const value = lookup(effect.value); + return { kind: effect.kind, value }; + } + case 'Create': { + const into = lookup(effect.into); + return { + kind: 'Create', + into, + reason: effect.reason, + value: effect.value, + }; + } + case 'Freeze': { + const value = lookup(effect.value); + return { + kind: 'Freeze', + value, + reason: effect.reason, + }; + } + case 'Impure': { + const place = lookup(effect.place); + return { + kind: 'Impure', + place, + error: CompilerError.throwTodo({ + reason: 'Support impure effect declarations', + loc: GeneratedSource, + }), + }; + } + case 'Apply': { + const receiver = lookup(effect.receiver); + const fn = lookup(effect.function); + const args = effect.args.map(arg => { + if (typeof arg === 'string') { + return lookup(arg); + } + else if (arg.kind === 'Spread') { + return { kind: 'Spread', place: lookup(arg.place) }; + } + else { + return arg; + } + }); + const into = lookup(effect.into); + return { + kind: 'Apply', + receiver, + function: fn, + mutatesFunction: effect.mutatesFunction, + args, + into, + loc, + signature: null, + }; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind '${effect.kind}'`); + } + } + }); + return { + receiver: receiver.identifier.id, + params: params.map(p => p.identifier.id), + rest: rest != null ? rest.identifier.id : null, + returns: returns.identifier.id, + temporaries, + effects, + }; +} +function addObject(registry, id, properties) { + const shapeId = id !== null && id !== void 0 ? id : createAnonId(); + addShape(registry, shapeId, properties, null); + return { + kind: 'Object', + shapeId, + }; +} +function addShape(registry, id, properties, functionType) { + const shape = { + properties: new Map(properties), + functionType, + }; + CompilerError.invariant(!registry.has(id), { + reason: `[ObjectShape] Could not add shape to registry: name ${id} already exists.`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + registry.set(id, shape); + return shape; +} +const BuiltInPropsId = 'BuiltInProps'; +const BuiltInArrayId = 'BuiltInArray'; +const BuiltInSetId = 'BuiltInSet'; +const BuiltInMapId = 'BuiltInMap'; +const BuiltInWeakSetId = 'BuiltInWeakSet'; +const BuiltInWeakMapId = 'BuiltInWeakMap'; +const BuiltInFunctionId = 'BuiltInFunction'; +const BuiltInJsxId = 'BuiltInJsx'; +const BuiltInObjectId = 'BuiltInObject'; +const BuiltInUseStateId = 'BuiltInUseState'; +const BuiltInSetStateId = 'BuiltInSetState'; +const BuiltInUseActionStateId = 'BuiltInUseActionState'; +const BuiltInSetActionStateId = 'BuiltInSetActionState'; +const BuiltInUseRefId = 'BuiltInUseRefId'; +const BuiltInRefValueId = 'BuiltInRefValue'; +const BuiltInMixedReadonlyId = 'BuiltInMixedReadonly'; +const BuiltInUseEffectHookId = 'BuiltInUseEffectHook'; +const BuiltInUseLayoutEffectHookId = 'BuiltInUseLayoutEffectHook'; +const BuiltInUseInsertionEffectHookId = 'BuiltInUseInsertionEffectHook'; +const BuiltInUseOperatorId = 'BuiltInUseOperator'; +const BuiltInUseReducerId = 'BuiltInUseReducer'; +const BuiltInDispatchId = 'BuiltInDispatch'; +const BuiltInUseContextHookId = 'BuiltInUseContextHook'; +const BuiltInUseTransitionId = 'BuiltInUseTransition'; +const BuiltInStartTransitionId = 'BuiltInStartTransition'; +const BuiltInFireId = 'BuiltInFire'; +const BuiltInFireFunctionId = 'BuiltInFireFunction'; +const BuiltInUseEffectEventId = 'BuiltInUseEffectEvent'; +const BuiltinEffectEventId = 'BuiltInEffectEventFunction'; +const BuiltInAutodepsId = 'BuiltInAutoDepsId'; +const ReanimatedSharedValueId = 'ReanimatedSharedValueId'; +const BUILTIN_SHAPES = new Map(); +addObject(BUILTIN_SHAPES, BuiltInPropsId, [ + ['ref', { kind: 'Object', shapeId: BuiltInUseRefId }], +]); +addObject(BUILTIN_SHAPES, BuiltInArrayId, [ + [ + 'indexOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'includes', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'pop', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'at', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'concat', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + ['length', PRIMITIVE_TYPE], + [ + 'push', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: [], + effects: [ + { kind: 'Mutate', value: '@receiver' }, + { + kind: 'Capture', + from: '@rest', + into: '@receiver', + }, + { + kind: 'Create', + into: '@returns', + value: ValueKind.Primitive, + reason: ValueReason.KnownReturnSignature, + }, + ], + }, + }), + ], + [ + 'slice', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'map', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + aliasing: { + receiver: '@receiver', + params: ['@callback'], + rest: null, + returns: '@returns', + temporaries: [ + '@item', + '@callbackReturn', + '@thisArg', + ], + effects: [ + { + kind: 'Create', + into: '@returns', + value: ValueKind.Mutable, + reason: ValueReason.KnownReturnSignature, + }, + { + kind: 'CreateFrom', + from: '@receiver', + into: '@item', + }, + { + kind: 'Create', + into: '@thisArg', + value: ValueKind.Primitive, + reason: ValueReason.KnownReturnSignature, + }, + { + kind: 'Apply', + receiver: '@thisArg', + args: ['@item', { kind: 'Hole' }, '@receiver'], + function: '@callback', + into: '@callbackReturn', + mutatesFunction: false, + }, + { + kind: 'Capture', + from: '@callbackReturn', + into: '@returns', + }, + ], + }, + }), + ], + [ + 'flatMap', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'filter', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'every', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'some', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'find', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'findIndex', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'join', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInObjectId, [ + [ + 'toString', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInSetId, [ + [ + 'add', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Assign', + from: '@receiver', + into: '@returns', + }, + { + kind: 'Mutate', + value: '@receiver', + }, + { + kind: 'Capture', + from: '@rest', + into: '@receiver', + }, + ], + }, + }), + ], + [ + 'clear', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + ['size', PRIMITIVE_TYPE], + [ + 'difference', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'union', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'symmetricalDifference', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'isSubsetOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'isSupersetOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'forEach', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'entries', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'keys', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'values', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInMapId, [ + [ + 'clear', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'get', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'set', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture, Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInMapId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], + ['size', PRIMITIVE_TYPE], + [ + 'forEach', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'entries', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'keys', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'values', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInWeakSetId, [ + [ + 'add', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakSetId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInWeakMapId, [ + [ + 'delete', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'get', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'has', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'set', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Capture, Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakMapId }, + calleeEffect: Effect.Store, + returnValueKind: ValueKind.Mutable, + }), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseStateId, [ + ['0', { kind: 'Poly' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInSetStateId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseTransitionId, [ + ['0', { kind: 'Primitive' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInStartTransitionId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseActionStateId, [ + ['0', { kind: 'Poly' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInSetActionStateId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseReducerId, [ + ['0', { kind: 'Poly' }], + [ + '1', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }, BuiltInDispatchId), + ], +]); +addObject(BUILTIN_SHAPES, BuiltInUseRefId, [ + ['current', { kind: 'Object', shapeId: BuiltInRefValueId }], +]); +addObject(BUILTIN_SHAPES, BuiltInRefValueId, [ + ['*', { kind: 'Object', shapeId: BuiltInRefValueId }], +]); +addObject(BUILTIN_SHAPES, ReanimatedSharedValueId, []); +addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, +}, BuiltinEffectEventId); +addObject(BUILTIN_SHAPES, BuiltInMixedReadonlyId, [ + [ + 'toString', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'indexOf', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'includes', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'at', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInMixedReadonlyId }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'map', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ], + [ + 'flatMap', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ], + [ + 'filter', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ], + [ + 'concat', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'slice', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { + kind: 'Object', + shapeId: BuiltInArrayId, + }, + calleeEffect: Effect.Capture, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'every', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'some', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'find', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Object', shapeId: BuiltInMixedReadonlyId }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Frozen, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'findIndex', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.ConditionallyMutate, + returnValueKind: ValueKind.Primitive, + noAlias: true, + mutableOnlyIfOperandsAreMutable: true, + }), + ], + [ + 'join', + addFunction(BUILTIN_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: PRIMITIVE_TYPE, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + ['*', { kind: 'Object', shapeId: BuiltInMixedReadonlyId }], +]); +addObject(BUILTIN_SHAPES, BuiltInJsxId, []); +addObject(BUILTIN_SHAPES, BuiltInFunctionId, []); +const DefaultMutatingHook = addHook(BUILTIN_SHAPES, { + positionalParams: [], + restParam: Effect.ConditionallyMutate, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'Custom', + returnValueKind: ValueKind.Mutable, +}, 'DefaultMutatingHook'); +const DefaultNonmutatingHook = addHook(BUILTIN_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'Custom', + returnValueKind: ValueKind.Frozen, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Freeze', + value: '@rest', + reason: ValueReason.HookCaptured, + }, + { + kind: 'Create', + into: '@returns', + value: ValueKind.Frozen, + reason: ValueReason.HookReturn, + }, + { + kind: 'Alias', + from: '@rest', + into: '@returns', + }, + ], + }, +}, 'DefaultNonmutatingHook'); +function signatureArgument(id) { + const place = { + kind: 'Identifier', + effect: Effect.Unknown, + loc: GeneratedSource, + reactive: false, + identifier: { + declarationId: makeDeclarationId(id), + id: makeIdentifierId(id), + loc: GeneratedSource, + mutableRange: { start: makeInstructionId(0), end: makeInstructionId(0) }, + name: null, + scope: null, + type: makeType(), + }, + }; + return place; +} + +function lower(func, env, bindings = null, capturedRefs = new Map()) { + var _a, _b, _c; + const builder = new HIRBuilder(env, { + bindings, + context: capturedRefs, + }); + const context = []; + for (const [ref, loc] of capturedRefs !== null && capturedRefs !== void 0 ? capturedRefs : []) { + context.push({ + kind: 'Identifier', + identifier: builder.resolveBinding(ref), + effect: Effect.Unknown, + reactive: false, + loc, + }); + } + let id = null; + if (func.isFunctionDeclaration() || func.isFunctionExpression()) { + const idNode = func.get('id'); + if (hasNode(idNode)) { + id = idNode.node.name; + } + } + const params = []; + func.get('params').forEach(param => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + if (param.isIdentifier()) { + const binding = builder.resolveIdentifier(param); + if (binding.kind !== 'Identifier') { + builder.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Invariant, + reason: 'Could not find binding', + description: `[BuildHIR] Could not find binding for param \`${param.node.name}\``, + }).withDetails({ + kind: 'error', + loc: (_a = param.node.loc) !== null && _a !== void 0 ? _a : null, + message: 'Could not find binding', + })); + return; + } + const place = { + kind: 'Identifier', + identifier: binding.identifier, + effect: Effect.Unknown, + reactive: false, + loc: (_b = param.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + params.push(place); + } + else if (param.isObjectPattern() || + param.isArrayPattern() || + param.isAssignmentPattern()) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary((_c = param.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource), + effect: Effect.Unknown, + reactive: false, + loc: (_d = param.node.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }; + promoteTemporary(place.identifier); + params.push(place); + lowerAssignment(builder, (_e = param.node.loc) !== null && _e !== void 0 ? _e : GeneratedSource, InstructionKind.Let, param, place, 'Assignment'); + } + else if (param.isRestElement()) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary((_f = param.node.loc) !== null && _f !== void 0 ? _f : GeneratedSource), + effect: Effect.Unknown, + reactive: false, + loc: (_g = param.node.loc) !== null && _g !== void 0 ? _g : GeneratedSource, + }; + params.push({ + kind: 'Spread', + place, + }); + lowerAssignment(builder, (_h = param.node.loc) !== null && _h !== void 0 ? _h : GeneratedSource, InstructionKind.Let, param.get('argument'), place, 'Assignment'); + } + else { + builder.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Todo, + reason: `Handle ${param.node.type} parameters`, + description: `[BuildHIR] Add support for ${param.node.type} parameters`, + }).withDetails({ + kind: 'error', + loc: (_j = param.node.loc) !== null && _j !== void 0 ? _j : null, + message: 'Unsupported parameter type', + })); + } + }); + let directives = []; + const body = func.get('body'); + if (body.isExpression()) { + const fallthrough = builder.reserve('block'); + const terminal = { + kind: 'return', + returnVariant: 'Implicit', + loc: GeneratedSource, + value: lowerExpressionToTemporary(builder, body), + id: makeInstructionId(0), + effects: null, + }; + builder.terminateWithContinuation(terminal, fallthrough); + } + else if (body.isBlockStatement()) { + lowerStatement(builder, body); + directives = body.get('directives').map(d => d.node.value.value); + } + else { + builder.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Syntax, + reason: `Unexpected function body kind`, + description: `Expected function body to be an expression or a block statement, got \`${body.type}\``, + }).withDetails({ + kind: 'error', + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : null, + message: 'Expected a block statement or expression', + })); + } + let validatedId = null; + if (id != null) { + const idResult = validateIdentifierName(id); + if (idResult.isErr()) { + builder.errors.merge(idResult.unwrapErr()); + } + else { + validatedId = idResult.unwrap().value; + } + } + if (builder.errors.hasAnyErrors()) { + return Err(builder.errors); + } + builder.terminate({ + kind: 'return', + returnVariant: 'Void', + loc: GeneratedSource, + value: lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc: GeneratedSource, + }), + id: makeInstructionId(0), + effects: null, + }, null); + return Ok({ + id: validatedId, + nameHint: null, + params, + fnType: bindings == null ? env.fnType : 'Other', + returnTypeAnnotation: null, + returns: createTemporaryPlace(env, (_b = func.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource), + body: builder.build(), + context, + generator: func.node.generator === true, + async: func.node.async === true, + loc: (_c = func.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + env, + effects: null, + aliasingEffects: null, + directives, + }); +} +function lowerStatement(builder, stmtPath, label = null) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36; + const stmtNode = stmtPath.node; + switch (stmtNode.type) { + case 'ThrowStatement': { + const stmt = stmtPath; + const value = lowerExpressionToTemporary(builder, stmt.get('argument')); + const handler = builder.resolveThrowHandler(); + if (handler != null) { + builder.errors.push({ + reason: '(BuildHIR::lowerStatement) Support ThrowStatement inside of try/catch', + category: ErrorCategory.Todo, + loc: (_a = stmt.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + const terminal = { + kind: 'throw', + value, + id: makeInstructionId(0), + loc: (_b = stmt.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + builder.terminate(terminal, 'block'); + return; + } + case 'ReturnStatement': { + const stmt = stmtPath; + const argument = stmt.get('argument'); + let value; + if (argument.node === null) { + value = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc: GeneratedSource, + }); + } + else { + value = lowerExpressionToTemporary(builder, argument); + } + const terminal = { + kind: 'return', + returnVariant: 'Explicit', + loc: (_c = stmt.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + value, + id: makeInstructionId(0), + effects: null, + }; + builder.terminate(terminal, 'block'); + return; + } + case 'IfStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const consequentBlock = builder.enter('block', _blockId => { + var _a; + const consequent = stmt.get('consequent'); + lowerStatement(builder, consequent); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = consequent.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + let alternateBlock; + const alternate = stmt.get('alternate'); + if (hasNode(alternate)) { + alternateBlock = builder.enter('block', _blockId => { + var _a, _b; + lowerStatement(builder, alternate); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_b = (_a = alternate.node) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + }); + } + else { + alternateBlock = continuationBlock.id; + } + const test = lowerExpressionToTemporary(builder, stmt.get('test')); + const terminal = { + kind: 'if', + test, + consequent: consequentBlock, + alternate: alternateBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_d = stmt.node.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }; + builder.terminateWithContinuation(terminal, continuationBlock); + return; + } + case 'BlockStatement': { + const stmt = stmtPath; + const statements = stmt.get('body'); + const hoistableIdentifiers = new Set(); + for (const [, binding] of Object.entries(stmt.scope.bindings)) { + if (binding.kind !== 'param') { + hoistableIdentifiers.add(binding.identifier); + } + } + for (const s of statements) { + const willHoist = new Set(); + let fnDepth = s.isFunctionDeclaration() ? 1 : 0; + const withFunctionContext = { + enter: () => { + fnDepth++; + }, + exit: () => { + fnDepth--; + }, + }; + s.traverse({ + FunctionExpression: withFunctionContext, + FunctionDeclaration: withFunctionContext, + ArrowFunctionExpression: withFunctionContext, + ObjectMethod: withFunctionContext, + Identifier(id) { + const id2 = id; + if (!id2.isReferencedIdentifier() && + id.parent.type !== 'AssignmentExpression') { + return; + } + const binding = id.scope.getBinding(id.node.name); + if (binding != null && + hoistableIdentifiers.has(binding.identifier) && + (fnDepth > 0 || binding.kind === 'hoisted')) { + willHoist.add(id); + } + }, + }); + s.traverse({ + Identifier(path) { + if (hoistableIdentifiers.has(path.node)) { + hoistableIdentifiers.delete(path.node); + } + }, + }); + for (const id of willHoist) { + const binding = stmt.scope.getBinding(id.node.name); + CompilerError.invariant(binding != null, { + reason: 'Expected to find binding for hoisted identifier', + description: `Could not find a binding for ${id.node.name}`, + suggestions: null, + details: [ + { + kind: 'error', + loc: (_e = id.node.loc) !== null && _e !== void 0 ? _e : GeneratedSource, + message: null, + }, + ], + }); + if (builder.environment.isHoistedIdentifier(binding.identifier)) { + continue; + } + let kind; + if (binding.kind === 'const' || binding.kind === 'var') { + kind = InstructionKind.HoistedConst; + } + else if (binding.kind === 'let') { + kind = InstructionKind.HoistedLet; + } + else if (binding.path.isFunctionDeclaration()) { + kind = InstructionKind.HoistedFunction; + } + else if (!binding.path.isVariableDeclarator()) { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Unsupported declaration type for hoisting', + description: `variable "${binding.identifier.name}" declared with ${binding.path.type}`, + suggestions: null, + loc: (_f = id.parentPath.node.loc) !== null && _f !== void 0 ? _f : GeneratedSource, + }); + continue; + } + else { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Handle non-const declarations for hoisting', + description: `variable "${binding.identifier.name}" declared with ${binding.kind}`, + suggestions: null, + loc: (_g = id.parentPath.node.loc) !== null && _g !== void 0 ? _g : GeneratedSource, + }); + continue; + } + const identifier = builder.resolveIdentifier(id); + CompilerError.invariant(identifier.kind === 'Identifier', { + reason: 'Expected hoisted binding to be a local identifier, not a global', + description: null, + details: [ + { + kind: 'error', + loc: (_h = id.node.loc) !== null && _h !== void 0 ? _h : GeneratedSource, + message: null, + }, + ], + }); + const place = { + effect: Effect.Unknown, + identifier: identifier.identifier, + kind: 'Identifier', + reactive: false, + loc: (_j = id.node.loc) !== null && _j !== void 0 ? _j : GeneratedSource, + }; + lowerValueToTemporary(builder, { + kind: 'DeclareContext', + lvalue: { + kind, + place, + }, + loc: (_k = id.node.loc) !== null && _k !== void 0 ? _k : GeneratedSource, + }); + builder.environment.addHoistedIdentifier(binding.identifier); + } + lowerStatement(builder, s); + } + return; + } + case 'BreakStatement': { + const stmt = stmtPath; + const block = builder.lookupBreak((_m = (_l = stmt.node.label) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : null); + builder.terminate({ + kind: 'goto', + block, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_o = stmt.node.loc) !== null && _o !== void 0 ? _o : GeneratedSource, + }, 'block'); + return; + } + case 'ContinueStatement': { + const stmt = stmtPath; + const block = builder.lookupContinue((_q = (_p = stmt.node.label) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : null); + builder.terminate({ + kind: 'goto', + block, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_r = stmt.node.loc) !== null && _r !== void 0 ? _r : GeneratedSource, + }, 'block'); + return; + } + case 'ForStatement': { + const stmt = stmtPath; + const testBlock = builder.reserve('loop'); + const continuationBlock = builder.reserve('block'); + const initBlock = builder.enter('loop', _blockId => { + var _a, _b, _c, _d; + const init = stmt.get('init'); + if (!init.isVariableDeclaration()) { + builder.errors.push({ + reason: '(BuildHIR::lowerStatement) Handle non-variable initialization in ForStatement', + category: ErrorCategory.Todo, + loc: (_a = stmt.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return { + kind: 'unsupported', + id: makeInstructionId(0), + loc: (_c = (_b = init.node) === null || _b === void 0 ? void 0 : _b.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + }; + } + lowerStatement(builder, init); + return { + kind: 'goto', + block: testBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_d = init.node.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }; + }); + let updateBlock = null; + const update = stmt.get('update'); + if (hasNode(update)) { + updateBlock = builder.enter('loop', _blockId => { + var _a, _b; + lowerExpressionToTemporary(builder, update); + return { + kind: 'goto', + block: testBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_b = (_a = update.node) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + }); + } + const bodyBlock = builder.enter('block', _blockId => { + return builder.loop(label, updateBlock !== null && updateBlock !== void 0 ? updateBlock : testBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: updateBlock !== null && updateBlock !== void 0 ? updateBlock : testBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + builder.terminateWithContinuation({ + kind: 'for', + loc: (_s = stmtNode.loc) !== null && _s !== void 0 ? _s : GeneratedSource, + init: initBlock, + test: testBlock.id, + update: updateBlock, + loop: bodyBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, testBlock); + const test = stmt.get('test'); + if (test.node == null) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle empty test in ForStatement`, + category: ErrorCategory.Todo, + loc: (_t = stmt.node.loc) !== null && _t !== void 0 ? _t : null, + suggestions: null, + }); + } + else { + builder.terminateWithContinuation({ + kind: 'branch', + test: lowerExpressionToTemporary(builder, test), + consequent: bodyBlock, + alternate: continuationBlock.id, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_u = stmt.node.loc) !== null && _u !== void 0 ? _u : GeneratedSource, + }, continuationBlock); + } + return; + } + case 'WhileStatement': { + const stmt = stmtPath; + const conditionalBlock = builder.reserve('loop'); + const continuationBlock = builder.reserve('block'); + const loopBlock = builder.enter('block', _blockId => { + return builder.loop(label, conditionalBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: conditionalBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_v = stmt.node.loc) !== null && _v !== void 0 ? _v : GeneratedSource; + builder.terminateWithContinuation({ + kind: 'while', + loc, + test: conditionalBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, conditionalBlock); + const test = lowerExpressionToTemporary(builder, stmt.get('test')); + const terminal = { + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + fallthrough: conditionalBlock.id, + id: makeInstructionId(0), + loc: (_w = stmt.node.loc) !== null && _w !== void 0 ? _w : GeneratedSource, + }; + builder.terminateWithContinuation(terminal, continuationBlock); + return; + } + case 'LabeledStatement': { + const stmt = stmtPath; + const label = stmt.node.label.name; + const body = stmt.get('body'); + switch (body.node.type) { + case 'ForInStatement': + case 'ForOfStatement': + case 'ForStatement': + case 'WhileStatement': + case 'DoWhileStatement': { + lowerStatement(builder, stmt.get('body'), label); + break; + } + default: { + const continuationBlock = builder.reserve('block'); + const block = builder.enter('block', () => { + var _a; + const body = stmt.get('body'); + builder.label(label, continuationBlock.id, () => { + lowerStatement(builder, body); + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'label', + block, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_x = stmt.node.loc) !== null && _x !== void 0 ? _x : GeneratedSource, + }, continuationBlock); + } + } + return; + } + case 'SwitchStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + let fallthrough = continuationBlock.id; + const cases = []; + let hasDefault = false; + for (let ii = stmt.get('cases').length - 1; ii >= 0; ii--) { + const case_ = stmt.get('cases')[ii]; + const testExpr = case_.get('test'); + if (testExpr.node == null) { + if (hasDefault) { + builder.errors.push({ + reason: `Expected at most one \`default\` branch in a switch statement, this code should have failed to parse`, + category: ErrorCategory.Syntax, + loc: (_y = case_.node.loc) !== null && _y !== void 0 ? _y : null, + suggestions: null, + }); + break; + } + hasDefault = true; + } + const block = builder.enter('block', _blockId => { + return builder.switch(label, continuationBlock.id, () => { + var _a; + case_ + .get('consequent') + .forEach(consequent => lowerStatement(builder, consequent)); + return { + kind: 'goto', + block: fallthrough, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = case_.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + let test = null; + if (hasNode(testExpr)) { + test = lowerReorderableExpression(builder, testExpr); + } + cases.push({ + test, + block, + }); + fallthrough = block; + } + cases.reverse(); + if (!hasDefault) { + cases.push({ test: null, block: continuationBlock.id }); + } + const test = lowerExpressionToTemporary(builder, stmt.get('discriminant')); + builder.terminateWithContinuation({ + kind: 'switch', + test, + cases, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_z = stmt.node.loc) !== null && _z !== void 0 ? _z : GeneratedSource, + }, continuationBlock); + return; + } + case 'VariableDeclaration': { + const stmt = stmtPath; + const nodeKind = stmt.node.kind; + if (nodeKind === 'var') { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle ${nodeKind} kinds in VariableDeclaration`, + category: ErrorCategory.Todo, + loc: (_0 = stmt.node.loc) !== null && _0 !== void 0 ? _0 : null, + suggestions: null, + }); + return; + } + const kind = nodeKind === 'let' ? InstructionKind.Let : InstructionKind.Const; + for (const declaration of stmt.get('declarations')) { + const id = declaration.get('id'); + const init = declaration.get('init'); + if (hasNode(init)) { + const value = lowerExpressionToTemporary(builder, init); + lowerAssignment(builder, (_1 = stmt.node.loc) !== null && _1 !== void 0 ? _1 : GeneratedSource, kind, id, value, id.isObjectPattern() || id.isArrayPattern() + ? 'Destructure' + : 'Assignment'); + } + else if (id.isIdentifier()) { + const binding = builder.resolveIdentifier(id); + if (binding.kind !== 'Identifier') { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Could not find binding for declaration.`, + category: ErrorCategory.Invariant, + loc: (_2 = id.node.loc) !== null && _2 !== void 0 ? _2 : null, + suggestions: null, + }); + } + else { + const place = { + effect: Effect.Unknown, + identifier: binding.identifier, + kind: 'Identifier', + reactive: false, + loc: (_3 = id.node.loc) !== null && _3 !== void 0 ? _3 : GeneratedSource, + }; + if (builder.isContextIdentifier(id)) { + if (kind === InstructionKind.Const) { + const declRangeStart = declaration.parentPath.node.start; + builder.errors.push({ + reason: `Expect \`const\` declaration not to be reassigned`, + category: ErrorCategory.Syntax, + loc: (_4 = id.node.loc) !== null && _4 !== void 0 ? _4 : null, + suggestions: [ + { + description: 'Change to a `let` declaration', + op: CompilerSuggestionOperation.Replace, + range: [declRangeStart, declRangeStart + 5], + text: 'let', + }, + ], + }); + } + lowerValueToTemporary(builder, { + kind: 'DeclareContext', + lvalue: { + kind: InstructionKind.Let, + place, + }, + loc: (_5 = id.node.loc) !== null && _5 !== void 0 ? _5 : GeneratedSource, + }); + } + else { + const typeAnnotation = id.get('typeAnnotation'); + let type; + if (typeAnnotation.isTSTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else if (typeAnnotation.isTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else { + type = null; + } + lowerValueToTemporary(builder, { + kind: 'DeclareLocal', + lvalue: { + kind, + place, + }, + type, + loc: (_6 = id.node.loc) !== null && _6 !== void 0 ? _6 : GeneratedSource, + }); + } + } + } + else { + builder.errors.push({ + reason: `Expected variable declaration to be an identifier if no initializer was provided`, + description: `Got a \`${id.type}\``, + category: ErrorCategory.Syntax, + loc: (_7 = stmt.node.loc) !== null && _7 !== void 0 ? _7 : null, + suggestions: null, + }); + } + } + return; + } + case 'ExpressionStatement': { + const stmt = stmtPath; + const expression = stmt.get('expression'); + lowerExpressionToTemporary(builder, expression); + return; + } + case 'DoWhileStatement': { + const stmt = stmtPath; + const conditionalBlock = builder.reserve('loop'); + const continuationBlock = builder.reserve('block'); + const loopBlock = builder.enter('block', _loopBlockId => { + return builder.loop(label, conditionalBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: conditionalBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_8 = stmt.node.loc) !== null && _8 !== void 0 ? _8 : GeneratedSource; + builder.terminateWithContinuation({ + kind: 'do-while', + loc, + test: conditionalBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, conditionalBlock); + const test = lowerExpressionToTemporary(builder, stmt.get('test')); + const terminal = { + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + fallthrough: conditionalBlock.id, + id: makeInstructionId(0), + loc, + }; + builder.terminateWithContinuation(terminal, continuationBlock); + return; + } + case 'FunctionDeclaration': { + const stmt = stmtPath; + stmt.skip(); + CompilerError.invariant(stmt.get('id').type === 'Identifier', { + reason: 'function declarations must have a name', + description: null, + details: [ + { + kind: 'error', + loc: (_9 = stmt.node.loc) !== null && _9 !== void 0 ? _9 : null, + message: null, + }, + ], + suggestions: null, + }); + const id = stmt.get('id'); + const fn = lowerValueToTemporary(builder, lowerFunctionToValue(builder, stmt)); + lowerAssignment(builder, (_10 = stmt.node.loc) !== null && _10 !== void 0 ? _10 : GeneratedSource, InstructionKind.Function, id, fn, 'Assignment'); + return; + } + case 'ForOfStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const initBlock = builder.reserve('loop'); + const testBlock = builder.reserve('loop'); + if (stmt.node.await) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle for-await loops`, + category: ErrorCategory.Todo, + loc: (_11 = stmt.node.loc) !== null && _11 !== void 0 ? _11 : null, + suggestions: null, + }); + return; + } + const loopBlock = builder.enter('block', _blockId => { + return builder.loop(label, initBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: initBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_12 = stmt.node.loc) !== null && _12 !== void 0 ? _12 : GeneratedSource; + const value = lowerExpressionToTemporary(builder, stmt.get('right')); + builder.terminateWithContinuation({ + kind: 'for-of', + loc, + init: initBlock.id, + test: testBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, initBlock); + const iterator = lowerValueToTemporary(builder, { + kind: 'GetIterator', + loc: value.loc, + collection: Object.assign({}, value), + }); + builder.terminateWithContinuation({ + id: makeInstructionId(0), + kind: 'goto', + block: testBlock.id, + variant: GotoVariant.Break, + loc: (_13 = stmt.node.loc) !== null && _13 !== void 0 ? _13 : GeneratedSource, + }, testBlock); + const left = stmt.get('left'); + const leftLoc = (_14 = left.node.loc) !== null && _14 !== void 0 ? _14 : GeneratedSource; + let test; + const advanceIterator = lowerValueToTemporary(builder, { + kind: 'IteratorNext', + loc: leftLoc, + iterator: Object.assign({}, iterator), + collection: Object.assign({}, value), + }); + if (left.isVariableDeclaration()) { + const declarations = left.get('declarations'); + CompilerError.invariant(declarations.length === 1, { + reason: `Expected only one declaration in the init of a ForOfStatement, got ${declarations.length}`, + description: null, + details: [ + { + kind: 'error', + loc: (_15 = left.node.loc) !== null && _15 !== void 0 ? _15 : null, + message: null, + }, + ], + suggestions: null, + }); + const id = declarations[0].get('id'); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Let, id, advanceIterator, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + else { + CompilerError.invariant(left.isLVal(), { + reason: 'Expected ForOf init to be a variable declaration or lval', + description: null, + details: [ + { + kind: 'error', + loc: leftLoc, + message: null, + }, + ], + }); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Reassign, left, advanceIterator, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + builder.terminateWithContinuation({ + id: makeInstructionId(0), + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + loc: (_16 = stmt.node.loc) !== null && _16 !== void 0 ? _16 : GeneratedSource, + fallthrough: continuationBlock.id, + }, continuationBlock); + return; + } + case 'ForInStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const initBlock = builder.reserve('loop'); + const loopBlock = builder.enter('block', _blockId => { + return builder.loop(label, initBlock.id, continuationBlock.id, () => { + var _a; + const body = stmt.get('body'); + lowerStatement(builder, body); + return { + kind: 'goto', + block: initBlock.id, + variant: GotoVariant.Continue, + id: makeInstructionId(0), + loc: (_a = body.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + }); + const loc = (_17 = stmt.node.loc) !== null && _17 !== void 0 ? _17 : GeneratedSource; + const value = lowerExpressionToTemporary(builder, stmt.get('right')); + builder.terminateWithContinuation({ + kind: 'for-in', + loc, + init: initBlock.id, + loop: loopBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + }, initBlock); + const left = stmt.get('left'); + const leftLoc = (_18 = left.node.loc) !== null && _18 !== void 0 ? _18 : GeneratedSource; + let test; + const nextPropertyTemp = lowerValueToTemporary(builder, { + kind: 'NextPropertyOf', + loc: leftLoc, + value, + }); + if (left.isVariableDeclaration()) { + const declarations = left.get('declarations'); + CompilerError.invariant(declarations.length === 1, { + reason: `Expected only one declaration in the init of a ForInStatement, got ${declarations.length}`, + description: null, + details: [ + { + kind: 'error', + loc: (_19 = left.node.loc) !== null && _19 !== void 0 ? _19 : null, + message: null, + }, + ], + suggestions: null, + }); + const id = declarations[0].get('id'); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Let, id, nextPropertyTemp, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + else { + CompilerError.invariant(left.isLVal(), { + reason: 'Expected ForIn init to be a variable declaration or lval', + description: null, + details: [ + { + kind: 'error', + loc: leftLoc, + message: null, + }, + ], + }); + const assign = lowerAssignment(builder, leftLoc, InstructionKind.Reassign, left, nextPropertyTemp, 'Assignment'); + test = lowerValueToTemporary(builder, assign); + } + builder.terminateWithContinuation({ + id: makeInstructionId(0), + kind: 'branch', + test, + consequent: loopBlock, + alternate: continuationBlock.id, + fallthrough: continuationBlock.id, + loc: (_20 = stmt.node.loc) !== null && _20 !== void 0 ? _20 : GeneratedSource, + }, continuationBlock); + return; + } + case 'DebuggerStatement': { + const stmt = stmtPath; + const loc = (_21 = stmt.node.loc) !== null && _21 !== void 0 ? _21 : GeneratedSource; + builder.push({ + id: makeInstructionId(0), + lvalue: buildTemporaryPlace(builder, loc), + value: { + kind: 'Debugger', + loc, + }, + effects: null, + loc, + }); + return; + } + case 'EmptyStatement': { + return; + } + case 'TryStatement': { + const stmt = stmtPath; + const continuationBlock = builder.reserve('block'); + const handlerPath = stmt.get('handler'); + if (!hasNode(handlerPath)) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle TryStatement without a catch clause`, + category: ErrorCategory.Todo, + loc: (_22 = stmt.node.loc) !== null && _22 !== void 0 ? _22 : null, + suggestions: null, + }); + return; + } + if (hasNode(stmt.get('finalizer'))) { + builder.errors.push({ + reason: `(BuildHIR::lowerStatement) Handle TryStatement with a finalizer ('finally') clause`, + category: ErrorCategory.Todo, + loc: (_23 = stmt.node.loc) !== null && _23 !== void 0 ? _23 : null, + suggestions: null, + }); + } + const handlerBindingPath = handlerPath.get('param'); + let handlerBinding = null; + if (hasNode(handlerBindingPath)) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary((_24 = handlerBindingPath.node.loc) !== null && _24 !== void 0 ? _24 : GeneratedSource), + effect: Effect.Unknown, + reactive: false, + loc: (_25 = handlerBindingPath.node.loc) !== null && _25 !== void 0 ? _25 : GeneratedSource, + }; + promoteTemporary(place.identifier); + lowerValueToTemporary(builder, { + kind: 'DeclareLocal', + lvalue: { + kind: InstructionKind.Catch, + place: Object.assign({}, place), + }, + type: null, + loc: (_26 = handlerBindingPath.node.loc) !== null && _26 !== void 0 ? _26 : GeneratedSource, + }); + handlerBinding = { + path: handlerBindingPath, + place, + }; + } + const handler = builder.enter('catch', _blockId => { + var _a, _b; + if (handlerBinding !== null) { + lowerAssignment(builder, (_a = handlerBinding.path.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, InstructionKind.Catch, handlerBinding.path, Object.assign({}, handlerBinding.place), 'Assignment'); + } + lowerStatement(builder, handlerPath.get('body')); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_b = handlerPath.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + }; + }); + const block = builder.enter('block', _blockId => { + var _a; + const block = stmt.get('block'); + builder.enterTryCatch(handler, () => { + lowerStatement(builder, block); + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Try, + id: makeInstructionId(0), + loc: (_a = block.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'try', + block, + handlerBinding: handlerBinding !== null ? Object.assign({}, handlerBinding.place) : null, + handler, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: (_27 = stmt.node.loc) !== null && _27 !== void 0 ? _27 : GeneratedSource, + }, continuationBlock); + return; + } + case 'WithStatement': { + builder.errors.push({ + reason: `JavaScript 'with' syntax is not supported`, + description: `'with' syntax is considered deprecated and removed from JavaScript standards, consider alternatives`, + category: ErrorCategory.UnsupportedSyntax, + loc: (_28 = stmtPath.node.loc) !== null && _28 !== void 0 ? _28 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_29 = stmtPath.node.loc) !== null && _29 !== void 0 ? _29 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'ClassDeclaration': { + builder.errors.push({ + reason: 'Inline `class` declarations are not supported', + description: `Move class declarations outside of components/hooks`, + category: ErrorCategory.UnsupportedSyntax, + loc: (_30 = stmtPath.node.loc) !== null && _30 !== void 0 ? _30 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_31 = stmtPath.node.loc) !== null && _31 !== void 0 ? _31 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'EnumDeclaration': + case 'TSEnumDeclaration': { + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_32 = stmtPath.node.loc) !== null && _32 !== void 0 ? _32 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'ExportAllDeclaration': + case 'ExportDefaultDeclaration': + case 'ExportNamedDeclaration': + case 'ImportDeclaration': + case 'TSExportAssignment': + case 'TSImportEqualsDeclaration': { + builder.errors.push({ + reason: 'JavaScript `import` and `export` statements may only appear at the top level of a module', + category: ErrorCategory.Syntax, + loc: (_33 = stmtPath.node.loc) !== null && _33 !== void 0 ? _33 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_34 = stmtPath.node.loc) !== null && _34 !== void 0 ? _34 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'TSNamespaceExportDeclaration': { + builder.errors.push({ + reason: 'TypeScript `namespace` statements may only appear at the top level of a module', + category: ErrorCategory.Syntax, + loc: (_35 = stmtPath.node.loc) !== null && _35 !== void 0 ? _35 : null, + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + loc: (_36 = stmtPath.node.loc) !== null && _36 !== void 0 ? _36 : GeneratedSource, + node: stmtPath.node, + }); + return; + } + case 'DeclareClass': + case 'DeclareExportAllDeclaration': + case 'DeclareExportDeclaration': + case 'DeclareFunction': + case 'DeclareInterface': + case 'DeclareModule': + case 'DeclareModuleExports': + case 'DeclareOpaqueType': + case 'DeclareTypeAlias': + case 'DeclareVariable': + case 'InterfaceDeclaration': + case 'OpaqueType': + case 'TSDeclareFunction': + case 'TSInterfaceDeclaration': + case 'TSModuleDeclaration': + case 'TSTypeAliasDeclaration': + case 'TypeAlias': { + return; + } + default: { + return assertExhaustive$1(stmtNode, `Unsupported statement kind '${stmtNode.type}'`); + } + } +} +function lowerObjectMethod(builder, property) { + var _a; + const loc = (_a = property.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const loweredFunc = lowerFunction(builder, property); + if (!loweredFunc) { + return { kind: 'UnsupportedNode', node: property.node, loc: loc }; + } + return { + kind: 'ObjectMethod', + loc, + loweredFunc, + }; +} +function lowerObjectPropertyKey(builder, property) { + var _a, _b; + const key = property.get('key'); + if (key.isStringLiteral()) { + return { + kind: 'string', + name: key.node.value, + }; + } + else if (property.node.computed && key.isExpression()) { + if (!key.isIdentifier() && !key.isMemberExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Identifier, got ${key.type} key in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_a = key.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return null; + } + const place = lowerExpressionToTemporary(builder, key); + return { + kind: 'computed', + name: place, + }; + } + else if (key.isIdentifier()) { + return { + kind: 'identifier', + name: key.node.name, + }; + } + else if (key.isNumericLiteral()) { + return { + kind: 'identifier', + name: String(key.node.value), + }; + } + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Identifier, got ${key.type} key in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_b = key.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return null; +} +function lowerExpression(builder, exprPath) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + switch (exprNode.type) { + case 'Identifier': { + const expr = exprPath; + const place = lowerIdentifier(builder, expr); + return { + kind: getLoadKind(builder, expr), + place, + loc: exprLoc, + }; + } + case 'NullLiteral': { + return { + kind: 'Primitive', + value: null, + loc: exprLoc, + }; + } + case 'BooleanLiteral': + case 'NumericLiteral': + case 'StringLiteral': { + const expr = exprPath; + const value = expr.node.value; + return { + kind: 'Primitive', + value, + loc: exprLoc, + }; + } + case 'ObjectExpression': { + const expr = exprPath; + const propertyPaths = expr.get('properties'); + const properties = []; + for (const propertyPath of propertyPaths) { + if (propertyPath.isObjectProperty()) { + const loweredKey = lowerObjectPropertyKey(builder, propertyPath); + if (!loweredKey) { + continue; + } + const valuePath = propertyPath.get('value'); + if (!valuePath.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${valuePath.type} values in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_b = valuePath.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + continue; + } + const value = lowerExpressionToTemporary(builder, valuePath); + properties.push({ + kind: 'ObjectProperty', + type: 'property', + place: value, + key: loweredKey, + }); + } + else if (propertyPath.isSpreadElement()) { + const place = lowerExpressionToTemporary(builder, propertyPath.get('argument')); + properties.push({ + kind: 'Spread', + place, + }); + } + else if (propertyPath.isObjectMethod()) { + if (propertyPath.node.kind !== 'method') { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${propertyPath.node.kind} functions in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_c = propertyPath.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + continue; + } + const method = lowerObjectMethod(builder, propertyPath); + const place = lowerValueToTemporary(builder, method); + const loweredKey = lowerObjectPropertyKey(builder, propertyPath); + if (!loweredKey) { + continue; + } + properties.push({ + kind: 'ObjectProperty', + type: 'method', + place, + key: loweredKey, + }); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${propertyPath.type} properties in ObjectExpression`, + category: ErrorCategory.Todo, + loc: (_d = propertyPath.node.loc) !== null && _d !== void 0 ? _d : null, + suggestions: null, + }); + continue; + } + } + return { + kind: 'ObjectExpression', + properties, + loc: exprLoc, + }; + } + case 'ArrayExpression': { + const expr = exprPath; + let elements = []; + for (const element of expr.get('elements')) { + if (element.node == null) { + elements.push({ + kind: 'Hole', + }); + continue; + } + else if (element.isExpression()) { + elements.push(lowerExpressionToTemporary(builder, element)); + } + else if (element.isSpreadElement()) { + const place = lowerExpressionToTemporary(builder, element.get('argument')); + elements.push({ kind: 'Spread', place }); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${element.type} elements in ArrayExpression`, + category: ErrorCategory.Todo, + loc: (_e = element.node.loc) !== null && _e !== void 0 ? _e : null, + suggestions: null, + }); + continue; + } + } + return { + kind: 'ArrayExpression', + elements, + loc: exprLoc, + }; + } + case 'NewExpression': { + const expr = exprPath; + const calleePath = expr.get('callee'); + if (!calleePath.isExpression()) { + builder.errors.push({ + reason: `Expected an expression as the \`new\` expression receiver (v8 intrinsics are not supported)`, + description: `Got a \`${calleePath.node.type}\``, + category: ErrorCategory.Syntax, + loc: (_f = calleePath.node.loc) !== null && _f !== void 0 ? _f : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const callee = lowerExpressionToTemporary(builder, calleePath); + const args = lowerArguments(builder, expr.get('arguments')); + return { + kind: 'NewExpression', + callee, + args, + loc: exprLoc, + }; + } + case 'OptionalCallExpression': { + const expr = exprPath; + return lowerOptionalCallExpression(builder, expr, null); + } + case 'CallExpression': { + const expr = exprPath; + const calleePath = expr.get('callee'); + if (!calleePath.isExpression()) { + builder.errors.push({ + reason: `Expected Expression, got ${calleePath.type} in CallExpression (v8 intrinsics not supported). This error is likely caused by a bug in React Compiler. Please file an issue`, + category: ErrorCategory.Todo, + loc: (_g = calleePath.node.loc) !== null && _g !== void 0 ? _g : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + if (calleePath.isMemberExpression()) { + const memberExpr = lowerMemberExpression(builder, calleePath); + const propertyPlace = lowerValueToTemporary(builder, memberExpr.value); + const args = lowerArguments(builder, expr.get('arguments')); + return { + kind: 'MethodCall', + receiver: memberExpr.object, + property: Object.assign({}, propertyPlace), + args, + loc: exprLoc, + }; + } + else { + const callee = lowerExpressionToTemporary(builder, calleePath); + const args = lowerArguments(builder, expr.get('arguments')); + return { + kind: 'CallExpression', + callee, + args, + loc: exprLoc, + }; + } + } + case 'BinaryExpression': { + const expr = exprPath; + const leftPath = expr.get('left'); + if (!leftPath.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Expression, got ${leftPath.type} lval in BinaryExpression`, + category: ErrorCategory.Todo, + loc: (_h = leftPath.node.loc) !== null && _h !== void 0 ? _h : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const left = lowerExpressionToTemporary(builder, leftPath); + const right = lowerExpressionToTemporary(builder, expr.get('right')); + const operator = expr.node.operator; + if (operator === '|>') { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Pipe operator not supported`, + category: ErrorCategory.Todo, + loc: (_j = leftPath.node.loc) !== null && _j !== void 0 ? _j : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + return { + kind: 'BinaryExpression', + operator, + left, + right, + loc: exprLoc, + }; + } + case 'SequenceExpression': { + const expr = exprPath; + const exprLoc = (_k = expr.node.loc) !== null && _k !== void 0 ? _k : GeneratedSource; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const place = buildTemporaryPlace(builder, exprLoc); + const sequenceBlock = builder.enter('sequence', _ => { + var _a; + let last = null; + for (const item of expr.get('expressions')) { + last = lowerExpressionToTemporary(builder, item); + } + if (last === null) { + builder.errors.push({ + reason: `Expected sequence expression to have at least one expression`, + category: ErrorCategory.Syntax, + loc: (_a = expr.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + else { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: last, + type: null, + loc: exprLoc, + }); + } + return { + kind: 'goto', + id: makeInstructionId(0), + block: continuationBlock.id, + loc: exprLoc, + variant: GotoVariant.Break, + }; + }); + builder.terminateWithContinuation({ + kind: 'sequence', + block: sequenceBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: exprLoc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'ConditionalExpression': { + const expr = exprPath; + const exprLoc = (_l = expr.node.loc) !== null && _l !== void 0 ? _l : GeneratedSource; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const testBlock = builder.reserve('value'); + const place = buildTemporaryPlace(builder, exprLoc); + const consequentBlock = builder.enter('value', _blockId => { + var _a; + const consequentPath = expr.get('consequent'); + const consequent = lowerExpressionToTemporary(builder, consequentPath); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: consequent, + type: null, + loc: exprLoc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = consequentPath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + const alternateBlock = builder.enter('value', _blockId => { + var _a; + const alternatePath = expr.get('alternate'); + const alternate = lowerExpressionToTemporary(builder, alternatePath); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: alternate, + type: null, + loc: exprLoc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: (_a = alternatePath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'ternary', + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + test: testBlock.id, + loc: exprLoc, + }, testBlock); + const testPlace = lowerExpressionToTemporary(builder, expr.get('test')); + builder.terminateWithContinuation({ + kind: 'branch', + test: Object.assign({}, testPlace), + consequent: consequentBlock, + alternate: alternateBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: exprLoc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'LogicalExpression': { + const expr = exprPath; + const exprLoc = (_m = expr.node.loc) !== null && _m !== void 0 ? _m : GeneratedSource; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const testBlock = builder.reserve('value'); + const place = buildTemporaryPlace(builder, exprLoc); + const leftPlace = buildTemporaryPlace(builder, (_o = expr.get('left').node.loc) !== null && _o !== void 0 ? _o : GeneratedSource); + const consequent = builder.enter('value', () => { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, leftPlace), + type: null, + loc: leftPlace.loc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: leftPlace.loc, + }; + }); + const alternate = builder.enter('value', () => { + const right = lowerExpressionToTemporary(builder, expr.get('right')); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, right), + type: null, + loc: right.loc, + }); + return { + kind: 'goto', + block: continuationBlock.id, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: right.loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'logical', + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + test: testBlock.id, + operator: expr.node.operator, + loc: exprLoc, + }, testBlock); + const leftValue = lowerExpressionToTemporary(builder, expr.get('left')); + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, leftPlace), + value: { + kind: 'LoadLocal', + place: leftValue, + loc: exprLoc, + }, + effects: null, + loc: exprLoc, + }); + builder.terminateWithContinuation({ + kind: 'branch', + test: Object.assign({}, leftPlace), + consequent, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: exprLoc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'AssignmentExpression': { + const expr = exprPath; + const operator = expr.node.operator; + if (operator === '=') { + const left = expr.get('left'); + if (left.isLVal()) { + return lowerAssignment(builder, (_p = left.node.loc) !== null && _p !== void 0 ? _p : GeneratedSource, InstructionKind.Reassign, left, lowerExpressionToTemporary(builder, expr.get('right')), left.isArrayPattern() || left.isObjectPattern() + ? 'Destructure' + : 'Assignment'); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Unsupported syntax on the left side of an AssignmentExpression`, + description: `Expected an LVal, got: ${left.type}`, + category: ErrorCategory.Todo, + loc: (_q = left.node.loc) !== null && _q !== void 0 ? _q : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + } + const operators = { + '+=': '+', + '-=': '-', + '/=': '/', + '%=': '%', + '*=': '*', + '**=': '**', + '&=': '&', + '|=': '|', + '>>=': '>>', + '>>>=': '>>>', + '<<=': '<<', + '^=': '^', + }; + const binaryOperator = operators[operator]; + if (binaryOperator == null) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${operator} operators in AssignmentExpression`, + category: ErrorCategory.Todo, + loc: (_r = expr.node.loc) !== null && _r !== void 0 ? _r : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const left = expr.get('left'); + const leftNode = left.node; + switch (leftNode.type) { + case 'Identifier': { + const leftExpr = left; + const leftPlace = lowerExpressionToTemporary(builder, leftExpr); + const right = lowerExpressionToTemporary(builder, expr.get('right')); + const binaryPlace = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + operator: binaryOperator, + left: leftPlace, + right, + loc: exprLoc, + }); + const binding = builder.resolveIdentifier(leftExpr); + if (binding.kind === 'Identifier') { + const identifier = lowerIdentifier(builder, leftExpr); + const kind = getStoreKind(builder, leftExpr); + if (kind === 'StoreLocal') { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { + place: Object.assign({}, identifier), + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, binaryPlace), + type: null, + loc: exprLoc, + }); + return { kind: 'LoadLocal', place: identifier, loc: exprLoc }; + } + else { + lowerValueToTemporary(builder, { + kind: 'StoreContext', + lvalue: { + place: Object.assign({}, identifier), + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, binaryPlace), + loc: exprLoc, + }); + return { kind: 'LoadContext', place: identifier, loc: exprLoc }; + } + } + else { + const temporary = lowerValueToTemporary(builder, { + kind: 'StoreGlobal', + name: leftExpr.node.name, + value: Object.assign({}, binaryPlace), + loc: exprLoc, + }); + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + } + case 'MemberExpression': { + const leftExpr = left; + const { object, property, value } = lowerMemberExpression(builder, leftExpr); + const previousValuePlace = lowerValueToTemporary(builder, value); + const newValuePlace = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + operator: binaryOperator, + left: Object.assign({}, previousValuePlace), + right: lowerExpressionToTemporary(builder, expr.get('right')), + loc: (_s = leftExpr.node.loc) !== null && _s !== void 0 ? _s : GeneratedSource, + }); + if (typeof property === 'string' || typeof property === 'number') { + return { + kind: 'PropertyStore', + object: Object.assign({}, object), + property: makePropertyLiteral(property), + value: Object.assign({}, newValuePlace), + loc: (_t = leftExpr.node.loc) !== null && _t !== void 0 ? _t : GeneratedSource, + }; + } + else { + return { + kind: 'ComputedStore', + object: Object.assign({}, object), + property: Object.assign({}, property), + value: Object.assign({}, newValuePlace), + loc: (_u = leftExpr.node.loc) !== null && _u !== void 0 ? _u : GeneratedSource, + }; + } + } + default: { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Expected Identifier or MemberExpression, got ${expr.type} lval in AssignmentExpression`, + category: ErrorCategory.Todo, + loc: (_v = expr.node.loc) !== null && _v !== void 0 ? _v : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + } + } + case 'OptionalMemberExpression': { + const expr = exprPath; + const { value } = lowerOptionalMemberExpression(builder, expr, null); + return { kind: 'LoadLocal', place: value, loc: value.loc }; + } + case 'MemberExpression': { + const expr = exprPath; + const { value } = lowerMemberExpression(builder, expr); + const place = lowerValueToTemporary(builder, value); + return { kind: 'LoadLocal', place, loc: place.loc }; + } + case 'JSXElement': { + const expr = exprPath; + const opening = expr.get('openingElement'); + const openingLoc = (_w = opening.node.loc) !== null && _w !== void 0 ? _w : GeneratedSource; + const tag = lowerJsxElementName(builder, opening.get('name')); + const props = []; + for (const attribute of opening.get('attributes')) { + if (attribute.isJSXSpreadAttribute()) { + const argument = lowerExpressionToTemporary(builder, attribute.get('argument')); + props.push({ kind: 'JsxSpreadAttribute', argument }); + continue; + } + if (!attribute.isJSXAttribute()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${attribute.type} attributes in JSXElement`, + category: ErrorCategory.Todo, + loc: (_x = attribute.node.loc) !== null && _x !== void 0 ? _x : null, + suggestions: null, + }); + continue; + } + const namePath = attribute.get('name'); + let propName; + if (namePath.isJSXIdentifier()) { + propName = namePath.node.name; + if (propName.indexOf(':') !== -1) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Unexpected colon in attribute name \`${propName}\``, + category: ErrorCategory.Todo, + loc: (_y = namePath.node.loc) !== null && _y !== void 0 ? _y : null, + suggestions: null, + }); + } + } + else { + CompilerError.invariant(namePath.isJSXNamespacedName(), { + reason: 'Refinement', + description: null, + details: [ + { + kind: 'error', + loc: (_z = namePath.node.loc) !== null && _z !== void 0 ? _z : null, + message: null, + }, + ], + suggestions: null, + }); + const namespace = namePath.node.namespace.name; + const name = namePath.node.name.name; + propName = `${namespace}:${name}`; + } + const valueExpr = attribute.get('value'); + let value; + if (valueExpr.isJSXElement() || valueExpr.isStringLiteral()) { + value = lowerExpressionToTemporary(builder, valueExpr); + } + else if (valueExpr.type == null) { + value = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: true, + loc: (_0 = attribute.node.loc) !== null && _0 !== void 0 ? _0 : GeneratedSource, + }); + } + else { + if (!valueExpr.isJSXExpressionContainer()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${valueExpr.type} attribute values in JSXElement`, + category: ErrorCategory.Todo, + loc: (_2 = (_1 = valueExpr.node) === null || _1 === void 0 ? void 0 : _1.loc) !== null && _2 !== void 0 ? _2 : null, + suggestions: null, + }); + continue; + } + const expression = valueExpr.get('expression'); + if (!expression.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${expression.type} expressions in JSXExpressionContainer within JSXElement`, + category: ErrorCategory.Todo, + loc: (_3 = valueExpr.node.loc) !== null && _3 !== void 0 ? _3 : null, + suggestions: null, + }); + continue; + } + value = lowerExpressionToTemporary(builder, expression); + } + props.push({ kind: 'JsxAttribute', name: propName, place: value }); + } + const isFbt = tag.kind === 'BuiltinTag' && (tag.name === 'fbt' || tag.name === 'fbs'); + if (isFbt) { + const tagName = tag.name; + const openingIdentifier = opening.get('name'); + const tagIdentifier = openingIdentifier.isJSXIdentifier() + ? builder.resolveIdentifier(openingIdentifier) + : null; + if (tagIdentifier != null) { + CompilerError.invariant(tagIdentifier.kind !== 'Identifier', { + reason: `<${tagName}> tags should be module-level imports`, + description: null, + details: [ + { + kind: 'error', + loc: (_4 = openingIdentifier.node.loc) !== null && _4 !== void 0 ? _4 : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + } + const fbtLocations = { + enum: new Array(), + plural: new Array(), + pronoun: new Array(), + }; + expr.traverse({ + JSXClosingElement(path) { + path.skip(); + }, + JSXNamespacedName(path) { + var _a, _b, _c; + if (path.node.namespace.name === tagName) { + switch (path.node.name.name) { + case 'enum': + fbtLocations.enum.push((_a = path.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource); + break; + case 'plural': + fbtLocations.plural.push((_b = path.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource); + break; + case 'pronoun': + fbtLocations.pronoun.push((_c = path.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource); + break; + } + } + }, + }); + for (const [name, locations] of Object.entries(fbtLocations)) { + if (locations.length > 1) { + CompilerError.throwDiagnostic({ + category: ErrorCategory.Todo, + reason: 'Support duplicate fbt tags', + description: `Support \`<${tagName}>\` tags with multiple \`<${tagName}:${name}>\` values`, + details: locations.map(loc => { + return { + kind: 'error', + message: `Multiple \`<${tagName}:${name}>\` tags found`, + loc, + }; + }), + }); + } + } + } + isFbt && builder.fbtDepth++; + const children = expr + .get('children') + .map(child => lowerJsxElement(builder, child)) + .filter(notNull); + isFbt && builder.fbtDepth--; + return { + kind: 'JsxExpression', + tag, + props, + children: children.length === 0 ? null : children, + loc: exprLoc, + openingLoc: openingLoc, + closingLoc: (_6 = (_5 = expr.get('closingElement').node) === null || _5 === void 0 ? void 0 : _5.loc) !== null && _6 !== void 0 ? _6 : GeneratedSource, + }; + } + case 'JSXFragment': { + const expr = exprPath; + const children = expr + .get('children') + .map(child => lowerJsxElement(builder, child)) + .filter(notNull); + return { + kind: 'JsxFragment', + children, + loc: exprLoc, + }; + } + case 'ArrowFunctionExpression': + case 'FunctionExpression': { + const expr = exprPath; + return lowerFunctionToValue(builder, expr); + } + case 'TaggedTemplateExpression': { + const expr = exprPath; + if (expr.get('quasi').get('expressions').length !== 0) { + builder.errors.push({ + reason: '(BuildHIR::lowerExpression) Handle tagged template with interpolations', + category: ErrorCategory.Todo, + loc: (_7 = exprPath.node.loc) !== null && _7 !== void 0 ? _7 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + CompilerError.invariant(expr.get('quasi').get('quasis').length == 1, { + reason: "there should be only one quasi as we don't support interpolations yet", + description: null, + details: [ + { + kind: 'error', + loc: (_8 = expr.node.loc) !== null && _8 !== void 0 ? _8 : null, + message: null, + }, + ], + suggestions: null, + }); + const value = expr.get('quasi').get('quasis').at(0).node.value; + if (value.raw !== value.cooked) { + builder.errors.push({ + reason: '(BuildHIR::lowerExpression) Handle tagged template where cooked value is different from raw value', + category: ErrorCategory.Todo, + loc: (_9 = exprPath.node.loc) !== null && _9 !== void 0 ? _9 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + return { + kind: 'TaggedTemplateExpression', + tag: lowerExpressionToTemporary(builder, expr.get('tag')), + value, + loc: exprLoc, + }; + } + case 'TemplateLiteral': { + const expr = exprPath; + const subexprs = expr.get('expressions'); + const quasis = expr.get('quasis'); + if (subexprs.length !== quasis.length - 1) { + builder.errors.push({ + reason: `Unexpected quasi and subexpression lengths in template literal`, + category: ErrorCategory.Syntax, + loc: (_10 = exprPath.node.loc) !== null && _10 !== void 0 ? _10 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + if (subexprs.some(e => !e.isExpression())) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle TSType in TemplateLiteral.`, + category: ErrorCategory.Todo, + loc: (_11 = exprPath.node.loc) !== null && _11 !== void 0 ? _11 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const subexprPlaces = subexprs.map(e => lowerExpressionToTemporary(builder, e)); + return { + kind: 'TemplateLiteral', + subexprs: subexprPlaces, + quasis: expr.get('quasis').map(q => q.node.value), + loc: exprLoc, + }; + } + case 'UnaryExpression': { + let expr = exprPath; + if (expr.node.operator === 'delete') { + const argument = expr.get('argument'); + if (argument.isMemberExpression()) { + const { object, property } = lowerMemberExpression(builder, argument); + if (typeof property === 'string' || typeof property === 'number') { + return { + kind: 'PropertyDelete', + object, + property: makePropertyLiteral(property), + loc: exprLoc, + }; + } + else { + return { + kind: 'ComputedDelete', + object, + property, + loc: exprLoc, + }; + } + } + else { + builder.errors.push({ + reason: `Only object properties can be deleted`, + category: ErrorCategory.Syntax, + loc: (_12 = expr.node.loc) !== null && _12 !== void 0 ? _12 : null, + suggestions: [ + { + description: 'Remove this line', + range: [expr.node.start, expr.node.end], + op: CompilerSuggestionOperation.Remove, + }, + ], + }); + return { kind: 'UnsupportedNode', node: expr.node, loc: exprLoc }; + } + } + else if (expr.node.operator === 'throw') { + builder.errors.push({ + reason: `Throw expressions are not supported`, + category: ErrorCategory.Syntax, + loc: (_13 = expr.node.loc) !== null && _13 !== void 0 ? _13 : null, + suggestions: [ + { + description: 'Remove this line', + range: [expr.node.start, expr.node.end], + op: CompilerSuggestionOperation.Remove, + }, + ], + }); + return { kind: 'UnsupportedNode', node: expr.node, loc: exprLoc }; + } + else { + return { + kind: 'UnaryExpression', + operator: expr.node.operator, + value: lowerExpressionToTemporary(builder, expr.get('argument')), + loc: exprLoc, + }; + } + } + case 'AwaitExpression': { + let expr = exprPath; + return { + kind: 'Await', + value: lowerExpressionToTemporary(builder, expr.get('argument')), + loc: exprLoc, + }; + } + case 'TypeCastExpression': { + let expr = exprPath; + const typeAnnotation = expr.get('typeAnnotation').get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'cast', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'TSSatisfiesExpression': { + let expr = exprPath; + const typeAnnotation = expr.get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'satisfies', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'TSAsExpression': { + let expr = exprPath; + const typeAnnotation = expr.get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'as', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'UpdateExpression': { + let expr = exprPath; + const argument = expr.get('argument'); + if (argument.isMemberExpression()) { + const binaryOperator = expr.node.operator === '++' ? '+' : '-'; + const leftExpr = argument; + const { object, property, value } = lowerMemberExpression(builder, leftExpr); + const previousValuePlace = lowerValueToTemporary(builder, value); + const updatedValue = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + operator: binaryOperator, + left: Object.assign({}, previousValuePlace), + right: lowerValueToTemporary(builder, { + kind: 'Primitive', + value: 1, + loc: GeneratedSource, + }), + loc: (_14 = leftExpr.node.loc) !== null && _14 !== void 0 ? _14 : GeneratedSource, + }); + let newValuePlace; + if (typeof property === 'string' || typeof property === 'number') { + newValuePlace = lowerValueToTemporary(builder, { + kind: 'PropertyStore', + object: Object.assign({}, object), + property: makePropertyLiteral(property), + value: Object.assign({}, updatedValue), + loc: (_15 = leftExpr.node.loc) !== null && _15 !== void 0 ? _15 : GeneratedSource, + }); + } + else { + newValuePlace = lowerValueToTemporary(builder, { + kind: 'ComputedStore', + object: Object.assign({}, object), + property: Object.assign({}, property), + value: Object.assign({}, updatedValue), + loc: (_16 = leftExpr.node.loc) !== null && _16 !== void 0 ? _16 : GeneratedSource, + }); + } + return { + kind: 'LoadLocal', + place: expr.node.prefix + ? Object.assign({}, newValuePlace) : Object.assign({}, previousValuePlace), + loc: exprLoc, + }; + } + if (!argument.isIdentifier()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle UpdateExpression with ${argument.type} argument`, + category: ErrorCategory.Todo, + loc: (_17 = exprPath.node.loc) !== null && _17 !== void 0 ? _17 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + else if (builder.isContextIdentifier(argument)) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle UpdateExpression to variables captured within lambdas.`, + category: ErrorCategory.Todo, + loc: (_18 = exprPath.node.loc) !== null && _18 !== void 0 ? _18 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const lvalue = lowerIdentifierForAssignment(builder, (_19 = argument.node.loc) !== null && _19 !== void 0 ? _19 : GeneratedSource, InstructionKind.Reassign, argument); + if (lvalue === null) { + if (!builder.errors.hasAnyErrors()) { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Found an invalid UpdateExpression without a previously reported error`, + category: ErrorCategory.Invariant, + loc: exprLoc, + suggestions: null, + }); + } + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + else if (lvalue.kind === 'Global') { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Support UpdateExpression where argument is a global`, + category: ErrorCategory.Todo, + loc: exprLoc, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + const value = lowerIdentifier(builder, argument); + if (expr.node.prefix) { + return { + kind: 'PrefixUpdate', + lvalue, + operation: expr.node.operator, + value, + loc: exprLoc, + }; + } + else { + return { + kind: 'PostfixUpdate', + lvalue, + operation: expr.node.operator, + value, + loc: exprLoc, + }; + } + } + case 'RegExpLiteral': { + let expr = exprPath; + return { + kind: 'RegExpLiteral', + pattern: expr.node.pattern, + flags: expr.node.flags, + loc: (_20 = expr.node.loc) !== null && _20 !== void 0 ? _20 : GeneratedSource, + }; + } + case 'TSInstantiationExpression': + case 'TSNonNullExpression': { + let expr = exprPath; + return lowerExpression(builder, expr.get('expression')); + } + case 'MetaProperty': { + let expr = exprPath; + if (expr.node.meta.name === 'import' && + expr.node.property.name === 'meta') { + return { + kind: 'MetaProperty', + meta: expr.node.meta.name, + property: expr.node.property.name, + loc: (_21 = expr.node.loc) !== null && _21 !== void 0 ? _21 : GeneratedSource, + }; + } + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle MetaProperty expressions other than import.meta`, + category: ErrorCategory.Todo, + loc: (_22 = exprPath.node.loc) !== null && _22 !== void 0 ? _22 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + default: { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${exprPath.type} expressions`, + category: ErrorCategory.Todo, + loc: (_23 = exprPath.node.loc) !== null && _23 !== void 0 ? _23 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + } +} +function lowerOptionalMemberExpression(builder, expr, parentAlternate) { + var _a; + const optional = expr.node.optional; + const loc = (_a = expr.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const place = buildTemporaryPlace(builder, loc); + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const consequent = builder.reserve('value'); + const alternate = parentAlternate !== null + ? parentAlternate + : builder.enter('value', () => { + const temp = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + let object = null; + const testBlock = builder.enter('value', () => { + const objectPath = expr.get('object'); + if (objectPath.isOptionalMemberExpression()) { + const { value } = lowerOptionalMemberExpression(builder, objectPath, alternate); + object = value; + } + else if (objectPath.isOptionalCallExpression()) { + const value = lowerOptionalCallExpression(builder, objectPath, alternate); + object = lowerValueToTemporary(builder, value); + } + else { + object = lowerExpressionToTemporary(builder, objectPath); + } + return { + kind: 'branch', + test: Object.assign({}, object), + consequent: consequent.id, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + CompilerError.invariant(object !== null, { + reason: 'Satisfy type checker', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + builder.enterReserved(consequent, () => { + const { value } = lowerMemberExpression(builder, expr, object); + const temp = lowerValueToTemporary(builder, value); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'optional', + optional, + test: testBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, continuationBlock); + return { object, value: place }; +} +function lowerOptionalCallExpression(builder, expr, parentAlternate) { + var _a; + const optional = expr.node.optional; + const calleePath = expr.get('callee'); + const loc = (_a = expr.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const place = buildTemporaryPlace(builder, loc); + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const consequent = builder.reserve('value'); + const alternate = parentAlternate !== null + ? parentAlternate + : builder.enter('value', () => { + const temp = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + let callee; + const testBlock = builder.enter('value', () => { + if (calleePath.isOptionalCallExpression()) { + const value = lowerOptionalCallExpression(builder, calleePath, alternate); + const valuePlace = lowerValueToTemporary(builder, value); + callee = { + kind: 'CallExpression', + callee: valuePlace, + }; + } + else if (calleePath.isOptionalMemberExpression()) { + const { object, value } = lowerOptionalMemberExpression(builder, calleePath, alternate); + callee = { + kind: 'MethodCall', + receiver: object, + property: value, + }; + } + else if (calleePath.isMemberExpression()) { + const memberExpr = lowerMemberExpression(builder, calleePath); + const propertyPlace = lowerValueToTemporary(builder, memberExpr.value); + callee = { + kind: 'MethodCall', + receiver: memberExpr.object, + property: propertyPlace, + }; + } + else { + callee = { + kind: 'CallExpression', + callee: lowerExpressionToTemporary(builder, calleePath), + }; + } + const testPlace = callee.kind === 'CallExpression' ? callee.callee : callee.property; + return { + kind: 'branch', + test: Object.assign({}, testPlace), + consequent: consequent.id, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.enterReserved(consequent, () => { + const args = lowerArguments(builder, expr.get('arguments')); + const temp = buildTemporaryPlace(builder, loc); + if (callee.kind === 'CallExpression') { + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, temp), + value: { + kind: 'CallExpression', + callee: Object.assign({}, callee.callee), + args, + loc, + }, + effects: null, + loc, + }); + } + else { + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, temp), + value: { + kind: 'MethodCall', + receiver: Object.assign({}, callee.receiver), + property: Object.assign({}, callee.property), + args, + loc, + }, + effects: null, + loc, + }); + } + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, place) }, + value: Object.assign({}, temp), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'optional', + optional, + test: testBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, continuationBlock); + return { kind: 'LoadLocal', place, loc: place.loc }; +} +function lowerReorderableExpression(builder, expr) { + var _a; + if (!isReorderableExpression(builder, expr, true)) { + builder.errors.push({ + reason: `(BuildHIR::node.lowerReorderableExpression) Expression type \`${expr.type}\` cannot be safely reordered`, + category: ErrorCategory.Todo, + loc: (_a = expr.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + return lowerExpressionToTemporary(builder, expr); +} +function isReorderableExpression(builder, expr, allowLocalIdentifiers) { + switch (expr.node.type) { + case 'Identifier': { + const binding = builder.resolveIdentifier(expr); + if (binding.kind === 'Identifier') { + return allowLocalIdentifiers; + } + else { + return true; + } + } + case 'TSInstantiationExpression': { + const innerExpr = expr.get('expression'); + return isReorderableExpression(builder, innerExpr, allowLocalIdentifiers); + } + case 'RegExpLiteral': + case 'StringLiteral': + case 'NumericLiteral': + case 'NullLiteral': + case 'BooleanLiteral': + case 'BigIntLiteral': { + return true; + } + case 'UnaryExpression': { + const unary = expr; + switch (expr.node.operator) { + case '!': + case '+': + case '-': { + return isReorderableExpression(builder, unary.get('argument'), allowLocalIdentifiers); + } + default: { + return false; + } + } + } + case 'TSAsExpression': + case 'TSNonNullExpression': + case 'TypeCastExpression': { + return isReorderableExpression(builder, expr.get('expression'), allowLocalIdentifiers); + } + case 'LogicalExpression': { + const logical = expr; + return (isReorderableExpression(builder, logical.get('left'), allowLocalIdentifiers) && + isReorderableExpression(builder, logical.get('right'), allowLocalIdentifiers)); + } + case 'ConditionalExpression': { + const conditional = expr; + return (isReorderableExpression(builder, conditional.get('test'), allowLocalIdentifiers) && + isReorderableExpression(builder, conditional.get('consequent'), allowLocalIdentifiers) && + isReorderableExpression(builder, conditional.get('alternate'), allowLocalIdentifiers)); + } + case 'ArrayExpression': { + return expr + .get('elements') + .every(element => element.isExpression() && + isReorderableExpression(builder, element, allowLocalIdentifiers)); + } + case 'ObjectExpression': { + return expr + .get('properties') + .every(property => { + if (!property.isObjectProperty() || property.node.computed) { + return false; + } + const value = property.get('value'); + return (value.isExpression() && + isReorderableExpression(builder, value, allowLocalIdentifiers)); + }); + } + case 'MemberExpression': { + const test = expr; + let innerObject = test; + while (innerObject.isMemberExpression()) { + innerObject = innerObject.get('object'); + } + if (innerObject.isIdentifier() && + builder.resolveIdentifier(innerObject).kind !== 'Identifier') { + return true; + } + else { + return false; + } + } + case 'ArrowFunctionExpression': { + const fn = expr; + const body = fn.get('body'); + if (body.node.type === 'BlockStatement') { + return body.node.body.length === 0; + } + else { + invariant(body.isExpression(), 'Expected an expression'); + return isReorderableExpression(builder, body, false); + } + } + case 'CallExpression': { + const call = expr; + const callee = call.get('callee'); + return (callee.isExpression() && + isReorderableExpression(builder, callee, allowLocalIdentifiers) && + call + .get('arguments') + .every(arg => arg.isExpression() && + isReorderableExpression(builder, arg, allowLocalIdentifiers))); + } + default: { + return false; + } + } +} +function lowerArguments(builder, expr) { + var _a; + let args = []; + for (const argPath of expr) { + if (argPath.isSpreadElement()) { + args.push({ + kind: 'Spread', + place: lowerExpressionToTemporary(builder, argPath.get('argument')), + }); + } + else if (argPath.isExpression()) { + args.push(lowerExpressionToTemporary(builder, argPath)); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerExpression) Handle ${argPath.type} arguments in CallExpression`, + category: ErrorCategory.Todo, + loc: (_a = argPath.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + } + return args; +} +function lowerMemberExpression(builder, expr, loweredObject = null) { + var _a, _b, _c; + const exprNode = expr.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const objectNode = expr.get('object'); + const propertyNode = expr.get('property'); + const object = loweredObject !== null && loweredObject !== void 0 ? loweredObject : lowerExpressionToTemporary(builder, objectNode); + if (!expr.node.computed || expr.node.property.type === 'NumericLiteral') { + let property; + if (propertyNode.isIdentifier()) { + property = makePropertyLiteral(propertyNode.node.name); + } + else if (propertyNode.isNumericLiteral()) { + property = makePropertyLiteral(propertyNode.node.value); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerMemberExpression) Handle ${propertyNode.type} property`, + category: ErrorCategory.Todo, + loc: (_b = propertyNode.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return { + object, + property: propertyNode.toString(), + value: { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }, + }; + } + const value = { + kind: 'PropertyLoad', + object: Object.assign({}, object), + property, + loc: exprLoc, + }; + return { object, property, value }; + } + else { + if (!propertyNode.isExpression()) { + builder.errors.push({ + reason: `(BuildHIR::lowerMemberExpression) Expected Expression, got ${propertyNode.type} property`, + category: ErrorCategory.Todo, + loc: (_c = propertyNode.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + return { + object, + property: propertyNode.toString(), + value: { + kind: 'UnsupportedNode', + node: exprNode, + loc: exprLoc, + }, + }; + } + const property = lowerExpressionToTemporary(builder, propertyNode); + const value = { + kind: 'ComputedLoad', + object: Object.assign({}, object), + property: Object.assign({}, property), + loc: exprLoc, + }; + return { object, property, value }; + } +} +function lowerJsxElementName(builder, exprPath) { + var _a, _b, _c; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + if (exprPath.isJSXIdentifier()) { + const tag = exprPath.node.name; + if (tag.match(/^[A-Z]/)) { + const kind = getLoadKind(builder, exprPath); + return lowerValueToTemporary(builder, { + kind: kind, + place: lowerIdentifier(builder, exprPath), + loc: exprLoc, + }); + } + else { + return { + kind: 'BuiltinTag', + name: tag, + loc: exprLoc, + }; + } + } + else if (exprPath.isJSXMemberExpression()) { + return lowerJsxMemberExpression(builder, exprPath); + } + else if (exprPath.isJSXNamespacedName()) { + const namespace = exprPath.node.namespace.name; + const name = exprPath.node.name.name; + const tag = `${namespace}:${name}`; + if (namespace.indexOf(':') !== -1 || name.indexOf(':') !== -1) { + builder.errors.push({ + reason: `Expected JSXNamespacedName to have no colons in the namespace or name`, + description: `Got \`${namespace}\` : \`${name}\``, + category: ErrorCategory.Syntax, + loc: (_b = exprPath.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + } + const place = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: tag, + loc: exprLoc, + }); + return place; + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerJsxElementName) Handle ${exprPath.type} tags`, + category: ErrorCategory.Todo, + loc: (_c = exprPath.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + return lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + node: exprNode, + loc: exprLoc, + }); + } +} +function lowerJsxMemberExpression(builder, exprPath) { + var _a, _b, _c; + const loc = (_a = exprPath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const object = exprPath.get('object'); + let objectPlace; + if (object.isJSXMemberExpression()) { + objectPlace = lowerJsxMemberExpression(builder, object); + } + else { + CompilerError.invariant(object.isJSXIdentifier(), { + reason: `TypeScript refinement fail: expected 'JsxIdentifier', got \`${object.node.type}\``, + description: null, + details: [ + { + kind: 'error', + loc: (_b = object.node.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + const kind = getLoadKind(builder, object); + objectPlace = lowerValueToTemporary(builder, { + kind: kind, + place: lowerIdentifier(builder, object), + loc: (_c = exprPath.node.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + }); + } + const property = exprPath.get('property').node.name; + return lowerValueToTemporary(builder, { + kind: 'PropertyLoad', + object: objectPlace, + property: makePropertyLiteral(property), + loc, + }); +} +function lowerJsxElement(builder, exprPath) { + var _a, _b, _c; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + if (exprPath.isJSXElement() || exprPath.isJSXFragment()) { + return lowerExpressionToTemporary(builder, exprPath); + } + else if (exprPath.isJSXExpressionContainer()) { + const expression = exprPath.get('expression'); + if (expression.isJSXEmptyExpression()) { + return null; + } + else { + CompilerError.invariant(expression.isExpression(), { + reason: `(BuildHIR::lowerJsxElement) Expected Expression but found ${expression.type}!`, + description: null, + details: [ + { + kind: 'error', + loc: (_b = expression.node.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + return lowerExpressionToTemporary(builder, expression); + } + } + else if (exprPath.isJSXText()) { + let text; + if (builder.fbtDepth > 0) { + text = exprPath.node.value; + } + else { + text = trimJsxText(exprPath.node.value); + } + if (text === null) { + return null; + } + const place = lowerValueToTemporary(builder, { + kind: 'JSXText', + value: text, + loc: exprLoc, + }); + return place; + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerJsxElement) Unhandled JsxElement, got: ${exprPath.type}`, + category: ErrorCategory.Todo, + loc: (_c = exprPath.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + const place = lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + node: exprNode, + loc: exprLoc, + }); + return place; + } +} +function trimJsxText(original) { + const lines = original.split(/\r\n|\n|\r/); + let lastNonEmptyLine = 0; + for (let i = 0; i < lines.length; i++) { + if (lines[i].match(/[^ \t]/)) { + lastNonEmptyLine = i; + } + } + let str = ''; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const isFirstLine = i === 0; + const isLastLine = i === lines.length - 1; + const isLastNonEmptyLine = i === lastNonEmptyLine; + let trimmedLine = line.replace(/\t/g, ' '); + if (!isFirstLine) { + trimmedLine = trimmedLine.replace(/^[ ]+/, ''); + } + if (!isLastLine) { + trimmedLine = trimmedLine.replace(/[ ]+$/, ''); + } + if (trimmedLine) { + if (!isLastNonEmptyLine) { + trimmedLine += ' '; + } + str += trimmedLine; + } + } + if (str.length !== 0) { + return str; + } + else { + return null; + } +} +function lowerFunctionToValue(builder, expr) { + var _a; + const exprNode = expr.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const loweredFunc = lowerFunction(builder, expr); + if (!loweredFunc) { + return { kind: 'UnsupportedNode', node: exprNode, loc: exprLoc }; + } + return { + kind: 'FunctionExpression', + name: loweredFunc.func.id, + nameHint: null, + type: expr.node.type, + loc: exprLoc, + loweredFunc, + }; +} +function lowerFunction(builder, expr) { + const componentScope = builder.environment.parentFunction.scope; + const capturedContext = gatherCapturedContext(expr, componentScope); + const lowering = lower(expr, builder.environment, builder.bindings, new Map([...builder.context, ...capturedContext])); + let loweredFunc; + if (lowering.isErr()) { + const functionErrors = lowering.unwrapErr(); + builder.errors.merge(functionErrors); + return null; + } + loweredFunc = lowering.unwrap(); + return { + func: loweredFunc, + }; +} +function lowerExpressionToTemporary(builder, exprPath) { + const value = lowerExpression(builder, exprPath); + return lowerValueToTemporary(builder, value); +} +function lowerValueToTemporary(builder, value) { + if (value.kind === 'LoadLocal' && value.place.identifier.name === null) { + return value.place; + } + const place = buildTemporaryPlace(builder, value.loc); + builder.push({ + id: makeInstructionId(0), + lvalue: Object.assign({}, place), + value: value, + effects: null, + loc: value.loc, + }); + return place; +} +function lowerIdentifier(builder, exprPath) { + var _a, _b; + const exprNode = exprPath.node; + const exprLoc = (_a = exprNode.loc) !== null && _a !== void 0 ? _a : GeneratedSource; + const binding = builder.resolveIdentifier(exprPath); + switch (binding.kind) { + case 'Identifier': { + const place = { + kind: 'Identifier', + identifier: binding.identifier, + effect: Effect.Unknown, + reactive: false, + loc: exprLoc, + }; + return place; + } + default: { + if (binding.kind === 'Global' && binding.name === 'eval') { + builder.errors.push({ + reason: `The 'eval' function is not supported`, + description: 'Eval is an anti-pattern in JavaScript, and the code executed cannot be evaluated by React Compiler', + category: ErrorCategory.UnsupportedSyntax, + loc: (_b = exprPath.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + } + return lowerValueToTemporary(builder, { + kind: 'LoadGlobal', + binding, + loc: exprLoc, + }); + } + } +} +function buildTemporaryPlace(builder, loc) { + const place = { + kind: 'Identifier', + identifier: builder.makeTemporary(loc), + effect: Effect.Unknown, + reactive: false, + loc, + }; + return place; +} +function getStoreKind(builder, identifier) { + const isContext = builder.isContextIdentifier(identifier); + return isContext ? 'StoreContext' : 'StoreLocal'; +} +function getLoadKind(builder, identifier) { + const isContext = builder.isContextIdentifier(identifier); + return isContext ? 'LoadContext' : 'LoadLocal'; +} +function lowerIdentifierForAssignment(builder, loc, kind, path) { + var _a, _b; + const binding = builder.resolveIdentifier(path); + if (binding.kind !== 'Identifier') { + if (kind === InstructionKind.Reassign) { + return { kind: 'Global', name: path.node.name }; + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Could not find binding for declaration.`, + category: ErrorCategory.Invariant, + loc: (_a = path.node.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return null; + } + } + else if (binding.bindingKind === 'const' && + kind === InstructionKind.Reassign) { + builder.errors.push({ + reason: `Cannot reassign a \`const\` variable`, + category: ErrorCategory.Syntax, + loc: (_b = path.node.loc) !== null && _b !== void 0 ? _b : null, + description: binding.identifier.name != null + ? `\`${binding.identifier.name.value}\` is declared as const` + : null, + }); + return null; + } + const place = { + kind: 'Identifier', + identifier: binding.identifier, + effect: Effect.Unknown, + reactive: false, + loc, + }; + return place; +} +function lowerAssignment(builder, loc, kind, lvaluePath, value, assignmentKind) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2; + const lvalueNode = lvaluePath.node; + switch (lvalueNode.type) { + case 'Identifier': { + const lvalue = lvaluePath; + const place = lowerIdentifierForAssignment(builder, loc, kind, lvalue); + if (place === null) { + return { + kind: 'UnsupportedNode', + loc: (_a = lvalue.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + node: lvalue.node, + }; + } + else if (place.kind === 'Global') { + const temporary = lowerValueToTemporary(builder, { + kind: 'StoreGlobal', + name: place.name, + value, + loc, + }); + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + const isHoistedIdentifier = builder.environment.isHoistedIdentifier(lvalue.node); + let temporary; + if (builder.isContextIdentifier(lvalue)) { + if (kind === InstructionKind.Const && !isHoistedIdentifier) { + builder.errors.push({ + reason: `Expected \`const\` declaration not to be reassigned`, + category: ErrorCategory.Syntax, + loc: (_b = lvalue.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + } + if (kind !== InstructionKind.Const && + kind !== InstructionKind.Reassign && + kind !== InstructionKind.Let && + kind !== InstructionKind.Function) { + builder.errors.push({ + reason: `Unexpected context variable kind`, + category: ErrorCategory.Syntax, + loc: (_c = lvalue.node.loc) !== null && _c !== void 0 ? _c : null, + suggestions: null, + }); + temporary = lowerValueToTemporary(builder, { + kind: 'UnsupportedNode', + node: lvalueNode, + loc: (_d = lvalueNode.loc) !== null && _d !== void 0 ? _d : GeneratedSource, + }); + } + else { + temporary = lowerValueToTemporary(builder, { + kind: 'StoreContext', + lvalue: { place: Object.assign({}, place), kind }, + value, + loc, + }); + } + } + else { + const typeAnnotation = lvalue.get('typeAnnotation'); + let type; + if (typeAnnotation.isTSTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else if (typeAnnotation.isTypeAnnotation()) { + const typePath = typeAnnotation.get('typeAnnotation'); + type = typePath.node; + } + else { + type = null; + } + temporary = lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { place: Object.assign({}, place), kind }, + value, + type, + loc, + }); + } + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + case 'MemberExpression': { + CompilerError.invariant(kind === InstructionKind.Reassign, { + reason: 'MemberExpression may only appear in an assignment expression', + description: null, + details: [ + { + kind: 'error', + loc: (_e = lvaluePath.node.loc) !== null && _e !== void 0 ? _e : null, + message: null, + }, + ], + suggestions: null, + }); + const lvalue = lvaluePath; + const property = lvalue.get('property'); + const object = lowerExpressionToTemporary(builder, lvalue.get('object')); + if (!lvalue.node.computed || lvalue.get('property').isNumericLiteral()) { + let temporary; + if (property.isIdentifier()) { + temporary = lowerValueToTemporary(builder, { + kind: 'PropertyStore', + object, + property: makePropertyLiteral(property.node.name), + value, + loc, + }); + } + else if (property.isNumericLiteral()) { + temporary = lowerValueToTemporary(builder, { + kind: 'PropertyStore', + object, + property: makePropertyLiteral(property.node.value), + value, + loc, + }); + } + else { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${property.type} properties in MemberExpression`, + category: ErrorCategory.Todo, + loc: (_f = property.node.loc) !== null && _f !== void 0 ? _f : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: lvalueNode, loc }; + } + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + else { + if (!property.isExpression()) { + builder.errors.push({ + reason: '(BuildHIR::lowerAssignment) Expected private name to appear as a non-computed property', + category: ErrorCategory.Todo, + loc: (_g = property.node.loc) !== null && _g !== void 0 ? _g : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: lvalueNode, loc }; + } + const propertyPlace = lowerExpressionToTemporary(builder, property); + const temporary = lowerValueToTemporary(builder, { + kind: 'ComputedStore', + object, + property: propertyPlace, + value, + loc, + }); + return { kind: 'LoadLocal', place: temporary, loc: temporary.loc }; + } + } + case 'ArrayPattern': { + const lvalue = lvaluePath; + const elements = lvalue.get('elements'); + const items = []; + const followups = []; + const forceTemporaries = kind === InstructionKind.Reassign && + (elements.some(element => !element.isIdentifier()) || + elements.some(element => element.isIdentifier() && + (getStoreKind(builder, element) !== 'StoreLocal' || + builder.resolveIdentifier(element).kind !== 'Identifier'))); + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + if (element.node == null) { + items.push({ + kind: 'Hole', + }); + continue; + } + if (element.isRestElement()) { + const argument = element.get('argument'); + if (argument.isIdentifier() && + !forceTemporaries && + (assignmentKind === 'Assignment' || + getStoreKind(builder, argument) === 'StoreLocal')) { + const identifier = lowerIdentifierForAssignment(builder, (_h = element.node.loc) !== null && _h !== void 0 ? _h : GeneratedSource, kind, argument); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_j = element.node.loc) !== null && _j !== void 0 ? _j : GeneratedSource, + }); + continue; + } + items.push({ + kind: 'Spread', + place: identifier, + }); + } + else { + const temp = buildTemporaryPlace(builder, (_k = element.node.loc) !== null && _k !== void 0 ? _k : GeneratedSource); + promoteTemporary(temp.identifier); + items.push({ + kind: 'Spread', + place: Object.assign({}, temp), + }); + followups.push({ place: temp, path: argument }); + } + } + else if (element.isIdentifier() && + !forceTemporaries && + (assignmentKind === 'Assignment' || + getStoreKind(builder, element) === 'StoreLocal')) { + const identifier = lowerIdentifierForAssignment(builder, (_l = element.node.loc) !== null && _l !== void 0 ? _l : GeneratedSource, kind, element); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_m = element.node.loc) !== null && _m !== void 0 ? _m : GeneratedSource, + }); + continue; + } + items.push(identifier); + } + else { + const temp = buildTemporaryPlace(builder, (_o = element.node.loc) !== null && _o !== void 0 ? _o : GeneratedSource); + promoteTemporary(temp.identifier); + items.push(Object.assign({}, temp)); + followups.push({ place: temp, path: element }); + } + } + const temporary = lowerValueToTemporary(builder, { + kind: 'Destructure', + lvalue: { + kind, + pattern: { + kind: 'ArrayPattern', + items, + }, + }, + value, + loc, + }); + for (const { place, path } of followups) { + lowerAssignment(builder, (_p = path.node.loc) !== null && _p !== void 0 ? _p : loc, kind, path, place, assignmentKind); + } + return { kind: 'LoadLocal', place: temporary, loc: value.loc }; + } + case 'ObjectPattern': { + const lvalue = lvaluePath; + const propertiesPaths = lvalue.get('properties'); + const properties = []; + const followups = []; + const forceTemporaries = kind === InstructionKind.Reassign && + propertiesPaths.some(property => property.isRestElement() || + (property.isObjectProperty() && + (!property.get('value').isIdentifier() || + builder.resolveIdentifier(property.get('value')).kind !== 'Identifier'))); + for (let i = 0; i < propertiesPaths.length; i++) { + const property = propertiesPaths[i]; + if (property.isRestElement()) { + const argument = property.get('argument'); + if (!argument.isIdentifier()) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${argument.node.type} rest element in ObjectPattern`, + category: ErrorCategory.Todo, + loc: (_q = argument.node.loc) !== null && _q !== void 0 ? _q : null, + suggestions: null, + }); + continue; + } + if (forceTemporaries || + getStoreKind(builder, argument) === 'StoreContext') { + const temp = buildTemporaryPlace(builder, (_r = property.node.loc) !== null && _r !== void 0 ? _r : GeneratedSource); + promoteTemporary(temp.identifier); + properties.push({ + kind: 'Spread', + place: Object.assign({}, temp), + }); + followups.push({ place: temp, path: argument }); + } + else { + const identifier = lowerIdentifierForAssignment(builder, (_s = property.node.loc) !== null && _s !== void 0 ? _s : GeneratedSource, kind, argument); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_t = property.node.loc) !== null && _t !== void 0 ? _t : GeneratedSource, + }); + continue; + } + properties.push({ + kind: 'Spread', + place: identifier, + }); + } + } + else { + if (!property.isObjectProperty()) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${property.type} properties in ObjectPattern`, + category: ErrorCategory.Todo, + loc: (_u = property.node.loc) !== null && _u !== void 0 ? _u : null, + suggestions: null, + }); + continue; + } + if (property.node.computed) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle computed properties in ObjectPattern`, + category: ErrorCategory.Todo, + loc: (_v = property.node.loc) !== null && _v !== void 0 ? _v : null, + suggestions: null, + }); + continue; + } + const loweredKey = lowerObjectPropertyKey(builder, property); + if (!loweredKey) { + continue; + } + const element = property.get('value'); + if (!element.isLVal()) { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Expected object property value to be an LVal, got: ${element.type}`, + category: ErrorCategory.Todo, + loc: (_w = element.node.loc) !== null && _w !== void 0 ? _w : null, + suggestions: null, + }); + continue; + } + if (element.isIdentifier() && + !forceTemporaries && + (assignmentKind === 'Assignment' || + getStoreKind(builder, element) === 'StoreLocal')) { + const identifier = lowerIdentifierForAssignment(builder, (_x = element.node.loc) !== null && _x !== void 0 ? _x : GeneratedSource, kind, element); + if (identifier === null) { + continue; + } + else if (identifier.kind === 'Global') { + builder.errors.push({ + category: ErrorCategory.Todo, + reason: 'Expected reassignment of globals to enable forceTemporaries', + loc: (_y = element.node.loc) !== null && _y !== void 0 ? _y : GeneratedSource, + }); + continue; + } + properties.push({ + kind: 'ObjectProperty', + type: 'property', + place: identifier, + key: loweredKey, + }); + } + else { + const temp = buildTemporaryPlace(builder, (_z = element.node.loc) !== null && _z !== void 0 ? _z : GeneratedSource); + promoteTemporary(temp.identifier); + properties.push({ + kind: 'ObjectProperty', + type: 'property', + place: Object.assign({}, temp), + key: loweredKey, + }); + followups.push({ place: temp, path: element }); + } + } + } + const temporary = lowerValueToTemporary(builder, { + kind: 'Destructure', + lvalue: { + kind, + pattern: { + kind: 'ObjectPattern', + properties, + }, + }, + value, + loc, + }); + for (const { place, path } of followups) { + lowerAssignment(builder, (_0 = path.node.loc) !== null && _0 !== void 0 ? _0 : loc, kind, path, place, assignmentKind); + } + return { kind: 'LoadLocal', place: temporary, loc: value.loc }; + } + case 'AssignmentPattern': { + const lvalue = lvaluePath; + const loc = (_1 = lvalue.node.loc) !== null && _1 !== void 0 ? _1 : GeneratedSource; + const temp = buildTemporaryPlace(builder, loc); + const testBlock = builder.reserve('value'); + const continuationBlock = builder.reserve(builder.currentBlockKind()); + const consequent = builder.enter('value', () => { + const defaultValue = lowerReorderableExpression(builder, lvalue.get('right')); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, temp) }, + value: Object.assign({}, defaultValue), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + const alternate = builder.enter('value', () => { + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, temp) }, + value: Object.assign({}, value), + type: null, + loc, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc, + }; + }); + builder.terminateWithContinuation({ + kind: 'ternary', + test: testBlock.id, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, testBlock); + const undef = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc, + }); + const test = lowerValueToTemporary(builder, { + kind: 'BinaryExpression', + left: Object.assign({}, value), + operator: '===', + right: Object.assign({}, undef), + loc, + }); + builder.terminateWithContinuation({ + kind: 'branch', + test: Object.assign({}, test), + consequent, + alternate, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc, + }, continuationBlock); + return lowerAssignment(builder, loc, kind, lvalue.get('left'), temp, assignmentKind); + } + default: { + builder.errors.push({ + reason: `(BuildHIR::lowerAssignment) Handle ${lvaluePath.type} assignments`, + category: ErrorCategory.Todo, + loc: (_2 = lvaluePath.node.loc) !== null && _2 !== void 0 ? _2 : null, + suggestions: null, + }); + return { kind: 'UnsupportedNode', node: lvalueNode, loc }; + } + } +} +function captureScopes({ from, to }) { + let scopes = new Set(); + while (from) { + scopes.add(from); + if (from === to) { + break; + } + from = from.parent; + } + return scopes; +} +function gatherCapturedContext(fn, componentScope) { + const capturedIds = new Map(); + const pureScopes = captureScopes({ + from: fn.scope.parent, + to: componentScope, + }); + function handleMaybeDependency(path) { + var _a, _b; + let baseIdentifier; + if (path.isJSXOpeningElement()) { + const name = path.get('name'); + if (!(name.isJSXMemberExpression() || name.isJSXIdentifier())) { + return; + } + let current = name; + while (current.isJSXMemberExpression()) { + current = current.get('object'); + } + invariant(current.isJSXIdentifier(), 'Invalid logic in gatherCapturedDeps'); + baseIdentifier = current; + } + else { + baseIdentifier = path; + } + path.skip(); + const binding = baseIdentifier.scope.getBinding(baseIdentifier.node.name); + if (binding !== undefined && + pureScopes.has(binding.scope) && + !capturedIds.has(binding.identifier)) { + capturedIds.set(binding.identifier, (_b = (_a = path.node.loc) !== null && _a !== void 0 ? _a : binding.identifier.loc) !== null && _b !== void 0 ? _b : GeneratedSource); + } + } + fn.traverse({ + TypeAnnotation(path) { + path.skip(); + }, + TSTypeAnnotation(path) { + path.skip(); + }, + TypeAlias(path) { + path.skip(); + }, + TSTypeAliasDeclaration(path) { + path.skip(); + }, + Expression(path) { + if (path.isAssignmentExpression()) { + const left = path.get('left'); + if (left.isIdentifier()) { + handleMaybeDependency(left); + } + return; + } + else if (path.isJSXElement()) { + handleMaybeDependency(path.get('openingElement')); + } + else if (path.isIdentifier()) { + handleMaybeDependency(path); + } + }, + }); + return capturedIds; +} +function notNull(value) { + return value !== null; +} +function lowerType(node) { + switch (node.type) { + case 'GenericTypeAnnotation': { + const id = node.id; + if (id.type === 'Identifier' && id.name === 'Array') { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + return makeType(); + } + case 'TSTypeReference': { + const typeName = node.typeName; + if (typeName.type === 'Identifier' && typeName.name === 'Array') { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + return makeType(); + } + case 'ArrayTypeAnnotation': + case 'TSArrayType': { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + case 'BooleanLiteralTypeAnnotation': + case 'BooleanTypeAnnotation': + case 'NullLiteralTypeAnnotation': + case 'NumberLiteralTypeAnnotation': + case 'NumberTypeAnnotation': + case 'StringLiteralTypeAnnotation': + case 'StringTypeAnnotation': + case 'TSBooleanKeyword': + case 'TSNullKeyword': + case 'TSNumberKeyword': + case 'TSStringKeyword': + case 'TSSymbolKeyword': + case 'TSUndefinedKeyword': + case 'TSVoidKeyword': + case 'VoidTypeAnnotation': { + return { kind: 'Primitive' }; + } + default: { + return makeType(); + } + } +} + +function buildReactiveScopeTerminalsHIR(fn) { + const queuedRewrites = []; + recursivelyTraverseItems([...getScopes(fn)], scope => scope.range, { + fallthroughs: new Map(), + rewrites: queuedRewrites, + env: fn.env, + }, pushStartScopeTerminal, pushEndScopeTerminal); + const rewrittenFinalBlocks = new Map(); + const nextBlocks = new Map(); + queuedRewrites.reverse(); + for (const [, block] of fn.body.blocks) { + const context = { + nextBlockId: block.id, + rewrites: [], + nextPreds: block.preds, + instrSliceIdx: 0, + source: block, + }; + for (let i = 0; i < block.instructions.length + 1; i++) { + const instrId = i < block.instructions.length + ? block.instructions[i].id + : block.terminal.id; + let rewrite = queuedRewrites.at(-1); + while (rewrite != null && rewrite.instrId <= instrId) { + handleRewrite(rewrite, i, context); + queuedRewrites.pop(); + rewrite = queuedRewrites.at(-1); + } + } + if (context.rewrites.length > 0) { + const finalBlock = { + id: context.nextBlockId, + kind: block.kind, + preds: context.nextPreds, + terminal: block.terminal, + instructions: block.instructions.slice(context.instrSliceIdx), + phis: new Set(), + }; + context.rewrites.push(finalBlock); + for (const b of context.rewrites) { + nextBlocks.set(b.id, b); + } + rewrittenFinalBlocks.set(block.id, finalBlock.id); + } + else { + nextBlocks.set(block.id, block); + } + } + const originalBlocks = fn.body.blocks; + fn.body.blocks = nextBlocks; + for (const [, block] of originalBlocks) { + for (const phi of block.phis) { + for (const [originalId, value] of phi.operands) { + const newId = rewrittenFinalBlocks.get(originalId); + if (newId != null) { + phi.operands.delete(originalId); + phi.operands.set(newId, value); + } + } + } + } + reversePostorderBlocks(fn.body); + markPredecessors(fn.body); + markInstructionIds(fn.body); + fixScopeAndIdentifierRanges(fn.body); +} +function pushStartScopeTerminal(scope, context) { + const blockId = context.env.nextBlockId; + const fallthroughId = context.env.nextBlockId; + context.rewrites.push({ + kind: 'StartScope', + blockId, + fallthroughId, + instrId: scope.range.start, + scope, + }); + context.fallthroughs.set(scope.id, fallthroughId); +} +function pushEndScopeTerminal(scope, context) { + const fallthroughId = context.fallthroughs.get(scope.id); + CompilerError.invariant(fallthroughId != null, { + reason: 'Expected scope to exist', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + context.rewrites.push({ + kind: 'EndScope', + fallthroughId, + instrId: scope.range.end, + }); +} +function handleRewrite(terminalInfo, idx, context) { + const terminal = terminalInfo.kind === 'StartScope' + ? { + kind: 'scope', + fallthrough: terminalInfo.fallthroughId, + block: terminalInfo.blockId, + scope: terminalInfo.scope, + id: terminalInfo.instrId, + loc: GeneratedSource, + } + : { + kind: 'goto', + variant: GotoVariant.Break, + block: terminalInfo.fallthroughId, + id: terminalInfo.instrId, + loc: GeneratedSource, + }; + const currBlockId = context.nextBlockId; + context.rewrites.push({ + kind: context.source.kind, + id: currBlockId, + instructions: context.source.instructions.slice(context.instrSliceIdx, idx), + preds: context.nextPreds, + phis: context.rewrites.length === 0 ? context.source.phis : new Set(), + terminal, + }); + context.nextPreds = new Set([currBlockId]); + context.nextBlockId = + terminalInfo.kind === 'StartScope' + ? terminalInfo.blockId + : terminalInfo.fallthroughId; + context.instrSliceIdx = idx; +} + +var ansiStylesExports = {}; +var ansiStyles = { + get exports(){ return ansiStylesExports; }, + set exports(v){ ansiStylesExports = v; }, +}; + +var conversionsExports = {}; +var conversions = { + get exports(){ return conversionsExports; }, + set exports(v){ conversionsExports = v; }, +}; + +var colorName; +var hasRequiredColorName; + +function requireColorName () { + if (hasRequiredColorName) return colorName; + hasRequiredColorName = 1; + + colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] + }; + return colorName; +} + +var hasRequiredConversions; + +function requireConversions () { + if (hasRequiredConversions) return conversionsExports; + hasRequiredConversions = 1; + var cssKeywords = requireColorName(); + + // NOTE: conversions should only return primitive values (i.e. arrays, or + // values that give correct `typeof` results). + // do not use box values types (i.e. Number(), String(), etc.) + + var reverseKeywords = {}; + for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; + } + } + + var convert = conversions.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} + }; + + // hide .channels and .labels properties + for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } + + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } + + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } + + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } + } + + convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } + + h = Math.min(h * 60, 360); + + if (h < 0) { + h += 360; + } + + l = (min + max) / 2; + + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + + return [h, s * 100, l * 100]; + }; + + convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; + + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; + + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } + + return [ + h * 360, + s * 100, + v * 100 + ]; + }; + + convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); + + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; + }; + + convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + + return [c * 100, m * 100, y * 100, k * 100]; + }; + + /** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ + function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); + } + + convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + + var currentClosestDistance = Infinity; + var currentClosestKeyword; + + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; + + // Compute comparative distance + var distance = comparativeDistance(rgb, value); + + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } + + return currentClosestKeyword; + }; + + convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; + }; + + convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y * 100, z * 100]; + }; + + convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; + }; + + convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; + + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } + + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + + rgb[i] = val * 255; + } + + return rgb; + }; + + convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + + return [h, sv * 100, v * 100]; + }; + + convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; + + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; + + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } + }; + + convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; + + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + + return [h, sl * 100, l * 100]; + }; + + // http://dev.w3.org/csswg/css-color/#hwb-to-rgb + convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + + if ((i & 0x01) !== 0) { + f = 1 - f; + } + + n = wh + f * (v - wh); // linear interpolation + + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; + }; + + convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + + return [r * 255, g * 255, b * 255]; + }; + + convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; + + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; + + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; + }; + + convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; + }; + + convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; + + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; + + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + + x *= 95.047; + y *= 100; + z *= 108.883; + + return [x, y, z]; + }; + + convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + + if (h < 0) { + h += 360; + } + + c = Math.sqrt(a * a + b * b); + + return [l, c, h]; + }; + + convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + + return [l, a, b]; + }; + + convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + + value = Math.round(value / 50); + + if (value === 0) { + return 30; + } + + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + + if (value === 2) { + ansi += 60; + } + + return ansi; + }; + + convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); + }; + + convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } + + if (r > 248) { + return 231; + } + + return Math.round(((r - 8) / 247) * 24) + 232; + } + + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); + + return ansi; + }; + + convert.ansi16.rgb = function (args) { + var color = args % 10; + + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } + + color = color / 10.5 * 255; + + return [color, color, color]; + } + + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; + + return [r, g, b]; + }; + + convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } + + args -= 16; + + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; + + return [r, g, b]; + }; + + convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; + }; + + convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + + var colorString = match[0]; + + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } + + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; + + return [r, g, b]; + }; + + convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; + + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } + + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } + + hue /= 6; + hue %= 1; + + return [hue * 360, chroma * 100, grayscale * 100]; + }; + + convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; + + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } + + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } + + return [hsl[0], c * 100, f * 100]; + }; + + convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; + + var c = s * v; + var f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); + } + + return [hsv[0], c * 100, f * 100]; + }; + + convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } + + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; + + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + + mg = (1.0 - c) * g; + + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; + }; + + convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var v = c + g * (1.0 - c); + var f = 0; + + if (v > 0.0) { + f = c / v; + } + + return [hcg[0], f * 100, v * 100]; + }; + + convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; + + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + + return [hcg[0], s * 100, l * 100]; + }; + + convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; + }; + + convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; + + if (c < 1) { + g = (v - c) / (1 - c); + } + + return [hwb[0], c * 100, g * 100]; + }; + + convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; + }; + + convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; + }; + + convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; + }; + + convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; + }; + + convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; + }; + + convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; + }; + + convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; + }; + + convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; + }; + + convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; + }; + return conversionsExports; +} + +var route; +var hasRequiredRoute; + +function requireRoute () { + if (hasRequiredRoute) return route; + hasRequiredRoute = 1; + var conversions = requireConversions(); + + /* + this function routes a model to all other models. + + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). + + conversions that are not possible simply are not included. + */ + + function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; + } + + // https://en.wikipedia.org/wiki/Breadth-first_search + function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop + + graph[fromModel].distance = 0; + + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); + + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; + } + + function link(from, to) { + return function (args) { + return to(from(args)); + }; + } + + function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; + + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } + + fn.conversion = path; + return fn; + } + + route = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; + + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; + + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; + }; + return route; +} + +var colorConvert; +var hasRequiredColorConvert; + +function requireColorConvert () { + if (hasRequiredColorConvert) return colorConvert; + hasRequiredColorConvert = 1; + var conversions = requireConversions(); + var route = requireRoute(); + + var convert = {}; + + var models = Object.keys(conversions); + + function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + return fn(args); + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; + } + + function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + var result = fn(args); + + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; + } + + models.forEach(function (fromModel) { + convert[fromModel] = {}; + + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); + + var routes = route(fromModel); + var routeModels = Object.keys(routes); + + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); + }); + + colorConvert = convert; + return colorConvert; +} + +var hasRequiredAnsiStyles; + +function requireAnsiStyles () { + if (hasRequiredAnsiStyles) return ansiStylesExports; + hasRequiredAnsiStyles = 1; + (function (module) { + const colorConvert = requireColorConvert(); + + const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; + }; + + const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; + }; + + const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + }; + + function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Fix humans + styles.color.grey = styles.color.gray; + + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; + + for (const styleName of Object.keys(group)) { + const style = group[styleName]; + + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } + + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; + + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; + + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } + + const suite = colorConvert[key]; + + if (key === 'ansi16') { + key = 'ansi'; + } + + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } + + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } + + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + + return styles; + } + + // Make the export immutable + Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles + }); +} (ansiStyles)); + return ansiStylesExports; +} + +var collections = {}; + +var hasRequiredCollections; + +function requireCollections () { + if (hasRequiredCollections) return collections; + hasRequiredCollections = 1; + + Object.defineProperty(collections, '__esModule', { + value: true + }); + collections.printIteratorEntries = printIteratorEntries; + collections.printIteratorValues = printIteratorValues; + collections.printListItems = printListItems; + collections.printObjectProperties = printObjectProperties; + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + const getKeysOfEnumerableProperties = object => { + const keys = Object.keys(object).sort(); + + if (Object.getOwnPropertySymbols) { + Object.getOwnPropertySymbols(object).forEach(symbol => { + if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) { + keys.push(symbol); + } + }); + } + + return keys; + }; + /** + * Return entries (for example, of a map) + * with spacing, indentation, and comma + * without surrounding punctuation (for example, braces) + */ + + function printIteratorEntries( // Flow 0.51.0: property `@@iterator` of $Iterator not found in Object + // To allow simplistic getRecordIterator in immutable.js + iterator, + config, + indentation, + depth, + refs, + printer, // Too bad, so sad that separator for ECMAScript Map has been ' => ' + // What a distracting diff if you change a data structure to/from + separator = ': ' + ) { + let result = ''; + let current = iterator.next(); + + if (!current.done) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + while (!current.done) { + const name = printer( + current.value[0], + config, + indentationNext, + depth, + refs + ); + const value = printer( + current.value[1], + config, + indentationNext, + depth, + refs + ); + result += indentationNext + name + separator + value; + current = iterator.next(); + + if (!current.done) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + /** + * Return values (for example, of a set) + * with spacing, indentation, and comma + * without surrounding punctuation (braces or brackets) + */ + + function printIteratorValues( + iterator, + config, + indentation, + depth, + refs, + printer + ) { + let result = ''; + let current = iterator.next(); + + if (!current.done) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + while (!current.done) { + result += + indentationNext + + printer(current.value, config, indentationNext, depth, refs); + current = iterator.next(); + + if (!current.done) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + /** + * Return items (for example, of an array) + * with spacing, indentation, and comma + * without surrounding punctuation (for example, brackets) + **/ + + function printListItems(list, config, indentation, depth, refs, printer) { + let result = ''; + + if (list.length) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + for (let i = 0; i < list.length; i++) { + result += + indentationNext + + printer(list[i], config, indentationNext, depth, refs); + + if (i < list.length - 1) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + /** + * Return properties of an object + * with spacing, indentation, and comma + * without surrounding punctuation (for example, braces) + */ + + function printObjectProperties(val, config, indentation, depth, refs, printer) { + let result = ''; + const keys = getKeysOfEnumerableProperties(val); + + if (keys.length) { + result += config.spacingOuter; + const indentationNext = indentation + config.indent; + + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const name = printer(key, config, indentationNext, depth, refs); + const value = printer(val[key], config, indentationNext, depth, refs); + result += indentationNext + name + ': ' + value; + + if (i < keys.length - 1) { + result += ',' + config.spacingInner; + } else if (!config.min) { + result += ','; + } + } + + result += config.spacingOuter + indentation; + } + + return result; + } + return collections; +} + +var AsymmetricMatcher = {}; + +var hasRequiredAsymmetricMatcher; + +function requireAsymmetricMatcher () { + if (hasRequiredAsymmetricMatcher) return AsymmetricMatcher; + hasRequiredAsymmetricMatcher = 1; + + Object.defineProperty(AsymmetricMatcher, '__esModule', { + value: true + }); + AsymmetricMatcher.default = AsymmetricMatcher.test = AsymmetricMatcher.serialize = void 0; + + var _collections = requireCollections(); + + var Symbol = commonjsGlobal['jest-symbol-do-not-touch'] || commonjsGlobal.Symbol; + const asymmetricMatcher = Symbol.for('jest.asymmetricMatcher'); + const SPACE = ' '; + + const serialize = (val, config, indentation, depth, refs, printer) => { + const stringedValue = val.toString(); + + if ( + stringedValue === 'ArrayContaining' || + stringedValue === 'ArrayNotContaining' + ) { + if (++depth > config.maxDepth) { + return '[' + stringedValue + ']'; + } + + return ( + stringedValue + + SPACE + + '[' + + (0, _collections.printListItems)( + val.sample, + config, + indentation, + depth, + refs, + printer + ) + + ']' + ); + } + + if ( + stringedValue === 'ObjectContaining' || + stringedValue === 'ObjectNotContaining' + ) { + if (++depth > config.maxDepth) { + return '[' + stringedValue + ']'; + } + + return ( + stringedValue + + SPACE + + '{' + + (0, _collections.printObjectProperties)( + val.sample, + config, + indentation, + depth, + refs, + printer + ) + + '}' + ); + } + + if ( + stringedValue === 'StringMatching' || + stringedValue === 'StringNotMatching' + ) { + return ( + stringedValue + + SPACE + + printer(val.sample, config, indentation, depth, refs) + ); + } + + if ( + stringedValue === 'StringContaining' || + stringedValue === 'StringNotContaining' + ) { + return ( + stringedValue + + SPACE + + printer(val.sample, config, indentation, depth, refs) + ); + } + + return val.toAsymmetricMatcher(); + }; + + AsymmetricMatcher.serialize = serialize; + + const test = val => val && val.$$typeof === asymmetricMatcher; + + AsymmetricMatcher.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + AsymmetricMatcher.default = _default; + return AsymmetricMatcher; +} + +var ConvertAnsi = {}; + +var ansiRegex; +var hasRequiredAnsiRegex; + +function requireAnsiRegex () { + if (hasRequiredAnsiRegex) return ansiRegex; + hasRequiredAnsiRegex = 1; + + ansiRegex = options => { + options = Object.assign({ + onlyFirst: false + }, options); + + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, options.onlyFirst ? undefined : 'g'); + }; + return ansiRegex; +} + +var hasRequiredConvertAnsi; + +function requireConvertAnsi () { + if (hasRequiredConvertAnsi) return ConvertAnsi; + hasRequiredConvertAnsi = 1; + + Object.defineProperty(ConvertAnsi, '__esModule', { + value: true + }); + ConvertAnsi.default = ConvertAnsi.serialize = ConvertAnsi.test = void 0; + + var _ansiRegex = _interopRequireDefault(requireAnsiRegex()); + + var _ansiStyles = _interopRequireDefault(requireAnsiStyles()); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {default: obj}; + } + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + const toHumanReadableAnsi = text => + text.replace((0, _ansiRegex.default)(), match => { + switch (match) { + case _ansiStyles.default.red.close: + case _ansiStyles.default.green.close: + case _ansiStyles.default.cyan.close: + case _ansiStyles.default.gray.close: + case _ansiStyles.default.white.close: + case _ansiStyles.default.yellow.close: + case _ansiStyles.default.bgRed.close: + case _ansiStyles.default.bgGreen.close: + case _ansiStyles.default.bgYellow.close: + case _ansiStyles.default.inverse.close: + case _ansiStyles.default.dim.close: + case _ansiStyles.default.bold.close: + case _ansiStyles.default.reset.open: + case _ansiStyles.default.reset.close: + return ''; + + case _ansiStyles.default.red.open: + return ''; + + case _ansiStyles.default.green.open: + return ''; + + case _ansiStyles.default.cyan.open: + return ''; + + case _ansiStyles.default.gray.open: + return ''; + + case _ansiStyles.default.white.open: + return ''; + + case _ansiStyles.default.yellow.open: + return ''; + + case _ansiStyles.default.bgRed.open: + return ''; + + case _ansiStyles.default.bgGreen.open: + return ''; + + case _ansiStyles.default.bgYellow.open: + return ''; + + case _ansiStyles.default.inverse.open: + return ''; + + case _ansiStyles.default.dim.open: + return ''; + + case _ansiStyles.default.bold.open: + return ''; + + default: + return ''; + } + }); + + const test = val => + typeof val === 'string' && !!val.match((0, _ansiRegex.default)()); + + ConvertAnsi.test = test; + + const serialize = (val, config, indentation, depth, refs, printer) => + printer(toHumanReadableAnsi(val), config, indentation, depth, refs); + + ConvertAnsi.serialize = serialize; + const plugin = { + serialize, + test + }; + var _default = plugin; + ConvertAnsi.default = _default; + return ConvertAnsi; +} + +var DOMCollection = {}; + +var hasRequiredDOMCollection; + +function requireDOMCollection () { + if (hasRequiredDOMCollection) return DOMCollection; + hasRequiredDOMCollection = 1; + + Object.defineProperty(DOMCollection, '__esModule', { + value: true + }); + DOMCollection.default = DOMCollection.serialize = DOMCollection.test = void 0; + + var _collections = requireCollections(); + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat( + Object.getOwnPropertySymbols(source).filter(function(sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + }) + ); + } + ownKeys.forEach(function(key) { + _defineProperty(target, key, source[key]); + }); + } + return target; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + const SPACE = ' '; + const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap']; + const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/; + + const testName = name => + OBJECT_NAMES.indexOf(name) !== -1 || ARRAY_REGEXP.test(name); + + const test = val => + val && + val.constructor && + val.constructor.name && + testName(val.constructor.name); // Convert array of attribute objects to props object. + + DOMCollection.test = test; + + const propsReducer = (props, attribute) => { + props[attribute.name] = attribute.value; + return props; + }; + + const serialize = (collection, config, indentation, depth, refs, printer) => { + const name = collection.constructor.name; + + if (++depth > config.maxDepth) { + return '[' + name + ']'; + } + + return ( + (config.min ? '' : name + SPACE) + + (OBJECT_NAMES.indexOf(name) !== -1 + ? '{' + + (0, _collections.printObjectProperties)( + name === 'NamedNodeMap' + ? Array.prototype.reduce.call(collection, propsReducer, {}) + : _objectSpread({}, collection), + config, + indentation, + depth, + refs, + printer + ) + + '}' + : '[' + + (0, _collections.printListItems)( + Array.from(collection), + config, + indentation, + depth, + refs, + printer + ) + + ']') + ); + }; + + DOMCollection.serialize = serialize; + const plugin = { + serialize, + test + }; + var _default = plugin; + DOMCollection.default = _default; + return DOMCollection; +} + +var DOMElement = {}; + +var markup = {}; + +var escapeHTML = {}; + +var hasRequiredEscapeHTML; + +function requireEscapeHTML () { + if (hasRequiredEscapeHTML) return escapeHTML; + hasRequiredEscapeHTML = 1; + + Object.defineProperty(escapeHTML, '__esModule', { + value: true + }); + escapeHTML.default = escapeHTML$1; + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + function escapeHTML$1(str) { + return str.replace(//g, '>'); + } + return escapeHTML; +} + +var hasRequiredMarkup; + +function requireMarkup () { + if (hasRequiredMarkup) return markup; + hasRequiredMarkup = 1; + + Object.defineProperty(markup, '__esModule', { + value: true + }); + markup.printElementAsLeaf = markup.printElement = markup.printComment = markup.printText = markup.printChildren = markup.printProps = void 0; + + var _escapeHTML = _interopRequireDefault(requireEscapeHTML()); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {default: obj}; + } + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + // Return empty string if keys is empty. + const printProps = (keys, props, config, indentation, depth, refs, printer) => { + const indentationNext = indentation + config.indent; + const colors = config.colors; + return keys + .map(key => { + const value = props[key]; + let printed = printer(value, config, indentationNext, depth, refs); + + if (typeof value !== 'string') { + if (printed.indexOf('\n') !== -1) { + printed = + config.spacingOuter + + indentationNext + + printed + + config.spacingOuter + + indentation; + } + + printed = '{' + printed + '}'; + } + + return ( + config.spacingInner + + indentation + + colors.prop.open + + key + + colors.prop.close + + '=' + + colors.value.open + + printed + + colors.value.close + ); + }) + .join(''); + }; // Return empty string if children is empty. + + markup.printProps = printProps; + + const printChildren = (children, config, indentation, depth, refs, printer) => + children + .map( + child => + config.spacingOuter + + indentation + + (typeof child === 'string' + ? printText(child, config) + : printer(child, config, indentation, depth, refs)) + ) + .join(''); + + markup.printChildren = printChildren; + + const printText = (text, config) => { + const contentColor = config.colors.content; + return ( + contentColor.open + (0, _escapeHTML.default)(text) + contentColor.close + ); + }; + + markup.printText = printText; + + const printComment = (comment, config) => { + const commentColor = config.colors.comment; + return ( + commentColor.open + + '' + + commentColor.close + ); + }; // Separate the functions to format props, children, and element, + // so a plugin could override a particular function, if needed. + // Too bad, so sad: the traditional (but unnecessary) space + // in a self-closing tagColor requires a second test of printedProps. + + markup.printComment = printComment; + + const printElement = ( + type, + printedProps, + printedChildren, + config, + indentation + ) => { + const tagColor = config.colors.tag; + return ( + tagColor.open + + '<' + + type + + (printedProps && + tagColor.close + + printedProps + + config.spacingOuter + + indentation + + tagColor.open) + + (printedChildren + ? '>' + + tagColor.close + + printedChildren + + config.spacingOuter + + indentation + + tagColor.open + + '' + + tagColor.close + ); + }; + + markup.printElement = printElement; + + const printElementAsLeaf = (type, config) => { + const tagColor = config.colors.tag; + return ( + tagColor.open + + '<' + + type + + tagColor.close + + ' …' + + tagColor.open + + ' />' + + tagColor.close + ); + }; + + markup.printElementAsLeaf = printElementAsLeaf; + return markup; +} + +var hasRequiredDOMElement; + +function requireDOMElement () { + if (hasRequiredDOMElement) return DOMElement; + hasRequiredDOMElement = 1; + + Object.defineProperty(DOMElement, '__esModule', { + value: true + }); + DOMElement.default = DOMElement.serialize = DOMElement.test = void 0; + + var _markup = requireMarkup(); + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + const ELEMENT_NODE = 1; + const TEXT_NODE = 3; + const COMMENT_NODE = 8; + const FRAGMENT_NODE = 11; + const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/; + + const testNode = (nodeType, name) => + (nodeType === ELEMENT_NODE && ELEMENT_REGEXP.test(name)) || + (nodeType === TEXT_NODE && name === 'Text') || + (nodeType === COMMENT_NODE && name === 'Comment') || + (nodeType === FRAGMENT_NODE && name === 'DocumentFragment'); + + const test = val => + val && + val.constructor && + val.constructor.name && + testNode(val.nodeType, val.constructor.name); + + DOMElement.test = test; + + function nodeIsText(node) { + return node.nodeType === TEXT_NODE; + } + + function nodeIsComment(node) { + return node.nodeType === COMMENT_NODE; + } + + function nodeIsFragment(node) { + return node.nodeType === FRAGMENT_NODE; + } + + const serialize = (node, config, indentation, depth, refs, printer) => { + if (nodeIsText(node)) { + return (0, _markup.printText)(node.data, config); + } + + if (nodeIsComment(node)) { + return (0, _markup.printComment)(node.data, config); + } + + const type = nodeIsFragment(node) + ? `DocumentFragment` + : node.tagName.toLowerCase(); + + if (++depth > config.maxDepth) { + return (0, _markup.printElementAsLeaf)(type, config); + } + + return (0, _markup.printElement)( + type, + (0, _markup.printProps)( + nodeIsFragment(node) + ? [] + : Array.from(node.attributes) + .map(attr => attr.name) + .sort(), + nodeIsFragment(node) + ? [] + : Array.from(node.attributes).reduce((props, attribute) => { + props[attribute.name] = attribute.value; + return props; + }, {}), + config, + indentation + config.indent, + depth, + refs, + printer + ), + (0, _markup.printChildren)( + Array.prototype.slice.call(node.childNodes || node.children), + config, + indentation + config.indent, + depth, + refs, + printer + ), + config, + indentation + ); + }; + + DOMElement.serialize = serialize; + const plugin = { + serialize, + test + }; + var _default = plugin; + DOMElement.default = _default; + return DOMElement; +} + +var Immutable = {}; + +var hasRequiredImmutable; + +function requireImmutable () { + if (hasRequiredImmutable) return Immutable; + hasRequiredImmutable = 1; + + Object.defineProperty(Immutable, '__esModule', { + value: true + }); + Immutable.default = Immutable.test = Immutable.serialize = void 0; + + var _collections = requireCollections(); + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + // SENTINEL constants are from https://github.com/facebook/immutable-js + const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; + const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; + const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; + const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; + const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4 + + const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; + const IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; + const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; + + const getImmutableName = name => 'Immutable.' + name; + + const printAsLeaf = name => '[' + name + ']'; + + const SPACE = ' '; + const LAZY = '…'; // Seq is lazy if it calls a method like filter + + const printImmutableEntries = ( + val, + config, + indentation, + depth, + refs, + printer, + type + ) => + ++depth > config.maxDepth + ? printAsLeaf(getImmutableName(type)) + : getImmutableName(type) + + SPACE + + '{' + + (0, _collections.printIteratorEntries)( + val.entries(), + config, + indentation, + depth, + refs, + printer + ) + + '}'; // Record has an entries method because it is a collection in immutable v3. + // Return an iterator for Immutable Record from version v3 or v4. + + const getRecordEntries = val => { + let i = 0; + return { + next() { + if (i < val._keys.length) { + const key = val._keys[i++]; + return { + done: false, + value: [key, val.get(key)] + }; + } + + return { + done: true + }; + } + }; + }; + + const printImmutableRecord = ( + val, + config, + indentation, + depth, + refs, + printer + ) => { + // _name property is defined only for an Immutable Record instance + // which was constructed with a second optional descriptive name arg + const name = getImmutableName(val._name || 'Record'); + return ++depth > config.maxDepth + ? printAsLeaf(name) + : name + + SPACE + + '{' + + (0, _collections.printIteratorEntries)( + getRecordEntries(val), + config, + indentation, + depth, + refs, + printer + ) + + '}'; + }; + + const printImmutableSeq = (val, config, indentation, depth, refs, printer) => { + const name = getImmutableName('Seq'); + + if (++depth > config.maxDepth) { + return printAsLeaf(name); + } + + if (val[IS_KEYED_SENTINEL]) { + return ( + name + + SPACE + + '{' + // from Immutable collection of entries or from ECMAScript object + (val._iter || val._object + ? (0, _collections.printIteratorEntries)( + val.entries(), + config, + indentation, + depth, + refs, + printer + ) + : LAZY) + + '}' + ); + } + + return ( + name + + SPACE + + '[' + + (val._iter || // from Immutable collection of values + val._array || // from ECMAScript array + val._collection || // from ECMAScript collection in immutable v4 + val._iterable // from ECMAScript collection in immutable v3 + ? (0, _collections.printIteratorValues)( + val.values(), + config, + indentation, + depth, + refs, + printer + ) + : LAZY) + + ']' + ); + }; + + const printImmutableValues = ( + val, + config, + indentation, + depth, + refs, + printer, + type + ) => + ++depth > config.maxDepth + ? printAsLeaf(getImmutableName(type)) + : getImmutableName(type) + + SPACE + + '[' + + (0, _collections.printIteratorValues)( + val.values(), + config, + indentation, + depth, + refs, + printer + ) + + ']'; + + const serialize = (val, config, indentation, depth, refs, printer) => { + if (val[IS_MAP_SENTINEL]) { + return printImmutableEntries( + val, + config, + indentation, + depth, + refs, + printer, + val[IS_ORDERED_SENTINEL] ? 'OrderedMap' : 'Map' + ); + } + + if (val[IS_LIST_SENTINEL]) { + return printImmutableValues( + val, + config, + indentation, + depth, + refs, + printer, + 'List' + ); + } + + if (val[IS_SET_SENTINEL]) { + return printImmutableValues( + val, + config, + indentation, + depth, + refs, + printer, + val[IS_ORDERED_SENTINEL] ? 'OrderedSet' : 'Set' + ); + } + + if (val[IS_STACK_SENTINEL]) { + return printImmutableValues( + val, + config, + indentation, + depth, + refs, + printer, + 'Stack' + ); + } + + if (val[IS_SEQ_SENTINEL]) { + return printImmutableSeq(val, config, indentation, depth, refs, printer); + } // For compatibility with immutable v3 and v4, let record be the default. + + return printImmutableRecord(val, config, indentation, depth, refs, printer); + }; // Explicitly comparing sentinel properties to true avoids false positive + // when mock identity-obj-proxy returns the key as the value for any key. + + Immutable.serialize = serialize; + + const test = val => + val && + (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true); + + Immutable.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + Immutable.default = _default; + return Immutable; +} + +var ReactElement = {}; + +var reactIsExports = {}; +var reactIs = { + get exports(){ return reactIsExports; }, + set exports(v){ reactIsExports = v; }, +}; + +var reactIs_production_min = {}; + +var hasRequiredReactIs_production_min; + +function requireReactIs_production_min () { + if (hasRequiredReactIs_production_min) return reactIs_production_min; + hasRequiredReactIs_production_min = 1; +var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b? + Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119; + function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}reactIs_production_min.AsyncMode=l;reactIs_production_min.ConcurrentMode=m;reactIs_production_min.ContextConsumer=k;reactIs_production_min.ContextProvider=h;reactIs_production_min.Element=c;reactIs_production_min.ForwardRef=n;reactIs_production_min.Fragment=e;reactIs_production_min.Lazy=t;reactIs_production_min.Memo=r;reactIs_production_min.Portal=d; + reactIs_production_min.Profiler=g;reactIs_production_min.StrictMode=f;reactIs_production_min.Suspense=p;reactIs_production_min.isAsyncMode=function(a){return A(a)||z(a)===l};reactIs_production_min.isConcurrentMode=A;reactIs_production_min.isContextConsumer=function(a){return z(a)===k};reactIs_production_min.isContextProvider=function(a){return z(a)===h};reactIs_production_min.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===c};reactIs_production_min.isForwardRef=function(a){return z(a)===n};reactIs_production_min.isFragment=function(a){return z(a)===e};reactIs_production_min.isLazy=function(a){return z(a)===t}; + reactIs_production_min.isMemo=function(a){return z(a)===r};reactIs_production_min.isPortal=function(a){return z(a)===d};reactIs_production_min.isProfiler=function(a){return z(a)===g};reactIs_production_min.isStrictMode=function(a){return z(a)===f};reactIs_production_min.isSuspense=function(a){return z(a)===p}; + reactIs_production_min.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};reactIs_production_min.typeOf=z; + return reactIs_production_min; +} + +var hasRequiredReactIs; + +function requireReactIs () { + if (hasRequiredReactIs) return reactIsExports; + hasRequiredReactIs = 1; + (function (module) { + + { + module.exports = requireReactIs_production_min(); + } +} (reactIs)); + return reactIsExports; +} + +var hasRequiredReactElement; + +function requireReactElement () { + if (hasRequiredReactElement) return ReactElement; + hasRequiredReactElement = 1; + + Object.defineProperty(ReactElement, '__esModule', { + value: true + }); + ReactElement.default = ReactElement.test = ReactElement.serialize = void 0; + + var ReactIs = _interopRequireWildcard(requireReactIs()); + + var _markup = requireMarkup(); + + function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = + Object.defineProperty && Object.getOwnPropertyDescriptor + ? Object.getOwnPropertyDescriptor(obj, key) + : {}; + if (desc.get || desc.set) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + } + newObj.default = obj; + return newObj; + } + } + + /** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + // Given element.props.children, or subtree during recursive traversal, + // return flattened array of children. + const getChildren = (arg, children = []) => { + if (Array.isArray(arg)) { + arg.forEach(item => { + getChildren(item, children); + }); + } else if (arg != null && arg !== false) { + children.push(arg); + } + + return children; + }; + + const getType = element => { + const type = element.type; + + if (typeof type === 'string') { + return type; + } + + if (typeof type === 'function') { + return type.displayName || type.name || 'Unknown'; + } + + if (ReactIs.isFragment(element)) { + return 'React.Fragment'; + } + + if (ReactIs.isSuspense(element)) { + return 'React.Suspense'; + } + + if (typeof type === 'object' && type !== null) { + if (ReactIs.isContextProvider(element)) { + return 'Context.Provider'; + } + + if (ReactIs.isContextConsumer(element)) { + return 'Context.Consumer'; + } + + if (ReactIs.isForwardRef(element)) { + const functionName = type.render.displayName || type.render.name || ''; + return functionName !== '' + ? 'ForwardRef(' + functionName + ')' + : 'ForwardRef'; + } + + if (ReactIs.isMemo(type)) { + const functionName = + type.displayName || type.type.displayName || type.type.name || ''; + return functionName !== '' ? 'Memo(' + functionName + ')' : 'Memo'; + } + } + + return 'UNDEFINED'; + }; + + const getPropKeys = element => { + const props = element.props; + return Object.keys(props) + .filter(key => key !== 'children' && props[key] !== undefined) + .sort(); + }; + + const serialize = (element, config, indentation, depth, refs, printer) => + ++depth > config.maxDepth + ? (0, _markup.printElementAsLeaf)(getType(element), config) + : (0, _markup.printElement)( + getType(element), + (0, _markup.printProps)( + getPropKeys(element), + element.props, + config, + indentation + config.indent, + depth, + refs, + printer + ), + (0, _markup.printChildren)( + getChildren(element.props.children), + config, + indentation + config.indent, + depth, + refs, + printer + ), + config, + indentation + ); + + ReactElement.serialize = serialize; + + const test = val => val && ReactIs.isElement(val); + + ReactElement.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + ReactElement.default = _default; + return ReactElement; +} + +var ReactTestComponent = {}; + +var hasRequiredReactTestComponent; + +function requireReactTestComponent () { + if (hasRequiredReactTestComponent) return ReactTestComponent; + hasRequiredReactTestComponent = 1; + + Object.defineProperty(ReactTestComponent, '__esModule', { + value: true + }); + ReactTestComponent.default = ReactTestComponent.test = ReactTestComponent.serialize = void 0; + + var _markup = requireMarkup(); + + var Symbol = commonjsGlobal['jest-symbol-do-not-touch'] || commonjsGlobal.Symbol; + const testSymbol = Symbol.for('react.test.json'); + + const getPropKeys = object => { + const props = object.props; + return props + ? Object.keys(props) + .filter(key => props[key] !== undefined) + .sort() + : []; + }; + + const serialize = (object, config, indentation, depth, refs, printer) => + ++depth > config.maxDepth + ? (0, _markup.printElementAsLeaf)(object.type, config) + : (0, _markup.printElement)( + object.type, + object.props + ? (0, _markup.printProps)( + getPropKeys(object), + object.props, + config, + indentation + config.indent, + depth, + refs, + printer + ) + : '', + object.children + ? (0, _markup.printChildren)( + object.children, + config, + indentation + config.indent, + depth, + refs, + printer + ) + : '', + config, + indentation + ); + + ReactTestComponent.serialize = serialize; + + const test = val => val && val.$$typeof === testSymbol; + + ReactTestComponent.test = test; + const plugin = { + serialize, + test + }; + var _default = plugin; + ReactTestComponent.default = _default; + return ReactTestComponent; +} + +var build; +var hasRequiredBuild; + +function requireBuild () { + if (hasRequiredBuild) return build; + hasRequiredBuild = 1; + + var _ansiStyles = _interopRequireDefault(requireAnsiStyles()); + + var _collections = requireCollections(); + + var _AsymmetricMatcher = _interopRequireDefault( + requireAsymmetricMatcher() + ); + + var _ConvertAnsi = _interopRequireDefault(requireConvertAnsi()); + + var _DOMCollection = _interopRequireDefault(requireDOMCollection()); + + var _DOMElement = _interopRequireDefault(requireDOMElement()); + + var _Immutable = _interopRequireDefault(requireImmutable()); + + var _ReactElement = _interopRequireDefault(requireReactElement()); + + var _ReactTestComponent = _interopRequireDefault( + requireReactTestComponent() + ); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {default: obj}; + } + + var Symbol = commonjsGlobal['jest-symbol-do-not-touch'] || commonjsGlobal.Symbol; + const toString = Object.prototype.toString; + const toISOString = Date.prototype.toISOString; + const errorToString = Error.prototype.toString; + const regExpToString = RegExp.prototype.toString; + const symbolToString = Symbol.prototype.toString; + /** + * Explicitly comparing typeof constructor to function avoids undefined as name + * when mock identity-obj-proxy returns the key as the value for any key. + */ + + const getConstructorName = val => + (typeof val.constructor === 'function' && val.constructor.name) || 'Object'; + /* global window */ + + /** Is val is equal to global window object? Works even if it does not exist :) */ + + const isWindow = val => typeof window !== 'undefined' && val === window; + + const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/; + const NEWLINE_REGEXP = /\n/gi; + + class PrettyFormatPluginError extends Error { + constructor(message, stack) { + super(message); + this.stack = stack; + this.name = this.constructor.name; + } + } + + function isToStringedArrayType(toStringed) { + return ( + toStringed === '[object Array]' || + toStringed === '[object ArrayBuffer]' || + toStringed === '[object DataView]' || + toStringed === '[object Float32Array]' || + toStringed === '[object Float64Array]' || + toStringed === '[object Int8Array]' || + toStringed === '[object Int16Array]' || + toStringed === '[object Int32Array]' || + toStringed === '[object Uint8Array]' || + toStringed === '[object Uint8ClampedArray]' || + toStringed === '[object Uint16Array]' || + toStringed === '[object Uint32Array]' + ); + } + + function printNumber(val) { + return Object.is(val, -0) ? '-0' : String(val); + } + + function printBigInt(val) { + return String(`${val}n`); + } + + function printFunction(val, printFunctionName) { + if (!printFunctionName) { + return '[Function]'; + } + + return '[Function ' + (val.name || 'anonymous') + ']'; + } + + function printSymbol(val) { + return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)'); + } + + function printError(val) { + return '[' + errorToString.call(val) + ']'; + } + /** + * The first port of call for printing an object, handles most of the + * data-types in JS. + */ + + function printBasicValue(val, printFunctionName, escapeRegex, escapeString) { + if (val === true || val === false) { + return '' + val; + } + + if (val === undefined) { + return 'undefined'; + } + + if (val === null) { + return 'null'; + } + + const typeOf = typeof val; + + if (typeOf === 'number') { + return printNumber(val); + } + + if (typeOf === 'bigint') { + return printBigInt(val); + } + + if (typeOf === 'string') { + if (escapeString) { + return '"' + val.replace(/"|\\/g, '\\$&') + '"'; + } + + return '"' + val + '"'; + } + + if (typeOf === 'function') { + return printFunction(val, printFunctionName); + } + + if (typeOf === 'symbol') { + return printSymbol(val); + } + + const toStringed = toString.call(val); + + if (toStringed === '[object WeakMap]') { + return 'WeakMap {}'; + } + + if (toStringed === '[object WeakSet]') { + return 'WeakSet {}'; + } + + if ( + toStringed === '[object Function]' || + toStringed === '[object GeneratorFunction]' + ) { + return printFunction(val, printFunctionName); + } + + if (toStringed === '[object Symbol]') { + return printSymbol(val); + } + + if (toStringed === '[object Date]') { + return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val); + } + + if (toStringed === '[object Error]') { + return printError(val); + } + + if (toStringed === '[object RegExp]') { + if (escapeRegex) { + // https://github.com/benjamingr/RegExp.escape/blob/master/polyfill.js + return regExpToString.call(val).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + return regExpToString.call(val); + } + + if (val instanceof Error) { + return printError(val); + } + + return null; + } + /** + * Handles more complex objects ( such as objects with circular references. + * maps and sets etc ) + */ + + function printComplexValue( + val, + config, + indentation, + depth, + refs, + hasCalledToJSON + ) { + if (refs.indexOf(val) !== -1) { + return '[Circular]'; + } + + refs = refs.slice(); + refs.push(val); + const hitMaxDepth = ++depth > config.maxDepth; + const min = config.min; + + if ( + config.callToJSON && + !hitMaxDepth && + val.toJSON && + typeof val.toJSON === 'function' && + !hasCalledToJSON + ) { + return printer(val.toJSON(), config, indentation, depth, refs, true); + } + + const toStringed = toString.call(val); + + if (toStringed === '[object Arguments]') { + return hitMaxDepth + ? '[Arguments]' + : (min ? '' : 'Arguments ') + + '[' + + (0, _collections.printListItems)( + val, + config, + indentation, + depth, + refs, + printer + ) + + ']'; + } + + if (isToStringedArrayType(toStringed)) { + return hitMaxDepth + ? '[' + val.constructor.name + ']' + : (min ? '' : val.constructor.name + ' ') + + '[' + + (0, _collections.printListItems)( + val, + config, + indentation, + depth, + refs, + printer + ) + + ']'; + } + + if (toStringed === '[object Map]') { + return hitMaxDepth + ? '[Map]' + : 'Map {' + + (0, _collections.printIteratorEntries)( + val.entries(), + config, + indentation, + depth, + refs, + printer, + ' => ' + ) + + '}'; + } + + if (toStringed === '[object Set]') { + return hitMaxDepth + ? '[Set]' + : 'Set {' + + (0, _collections.printIteratorValues)( + val.values(), + config, + indentation, + depth, + refs, + printer + ) + + '}'; + } // Avoid failure to serialize global window object in jsdom test environment. + // For example, not even relevant if window is prop of React element. + + return hitMaxDepth || isWindow(val) + ? '[' + getConstructorName(val) + ']' + : (min ? '' : getConstructorName(val) + ' ') + + '{' + + (0, _collections.printObjectProperties)( + val, + config, + indentation, + depth, + refs, + printer + ) + + '}'; + } + + function isNewPlugin(plugin) { + return plugin.serialize != null; + } + + function printPlugin(plugin, val, config, indentation, depth, refs) { + let printed; + + try { + printed = isNewPlugin(plugin) + ? plugin.serialize(val, config, indentation, depth, refs, printer) + : plugin.print( + val, + valChild => printer(valChild, config, indentation, depth, refs), + str => { + const indentationNext = indentation + config.indent; + return ( + indentationNext + + str.replace(NEWLINE_REGEXP, '\n' + indentationNext) + ); + }, + { + edgeSpacing: config.spacingOuter, + min: config.min, + spacing: config.spacingInner + }, + config.colors + ); + } catch (error) { + throw new PrettyFormatPluginError(error.message, error.stack); + } + + if (typeof printed !== 'string') { + throw new Error( + `pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".` + ); + } + + return printed; + } + + function findPlugin(plugins, val) { + for (let p = 0; p < plugins.length; p++) { + try { + if (plugins[p].test(val)) { + return plugins[p]; + } + } catch (error) { + throw new PrettyFormatPluginError(error.message, error.stack); + } + } + + return null; + } + + function printer(val, config, indentation, depth, refs, hasCalledToJSON) { + const plugin = findPlugin(config.plugins, val); + + if (plugin !== null) { + return printPlugin(plugin, val, config, indentation, depth, refs); + } + + const basicResult = printBasicValue( + val, + config.printFunctionName, + config.escapeRegex, + config.escapeString + ); + + if (basicResult !== null) { + return basicResult; + } + + return printComplexValue( + val, + config, + indentation, + depth, + refs, + hasCalledToJSON + ); + } + + const DEFAULT_THEME = { + comment: 'gray', + content: 'reset', + prop: 'yellow', + tag: 'cyan', + value: 'green' + }; + const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME); + const DEFAULT_OPTIONS = { + callToJSON: true, + escapeRegex: false, + escapeString: true, + highlight: false, + indent: 2, + maxDepth: Infinity, + min: false, + plugins: [], + printFunctionName: true, + theme: DEFAULT_THEME + }; + + function validateOptions(options) { + Object.keys(options).forEach(key => { + if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { + throw new Error(`pretty-format: Unknown option "${key}".`); + } + }); + + if (options.min && options.indent !== undefined && options.indent !== 0) { + throw new Error( + 'pretty-format: Options "min" and "indent" cannot be used together.' + ); + } + + if (options.theme !== undefined) { + if (options.theme === null) { + throw new Error(`pretty-format: Option "theme" must not be null.`); + } + + if (typeof options.theme !== 'object') { + throw new Error( + `pretty-format: Option "theme" must be of type "object" but instead received "${typeof options.theme}".` + ); + } + } + } + + const getColorsHighlight = options => + DEFAULT_THEME_KEYS.reduce((colors, key) => { + const value = + options.theme && options.theme[key] !== undefined + ? options.theme[key] + : DEFAULT_THEME[key]; + const color = value && _ansiStyles.default[value]; + + if ( + color && + typeof color.close === 'string' && + typeof color.open === 'string' + ) { + colors[key] = color; + } else { + throw new Error( + `pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.` + ); + } + + return colors; + }, Object.create(null)); + + const getColorsEmpty = () => + DEFAULT_THEME_KEYS.reduce((colors, key) => { + colors[key] = { + close: '', + open: '' + }; + return colors; + }, Object.create(null)); + + const getPrintFunctionName = options => + options && options.printFunctionName !== undefined + ? options.printFunctionName + : DEFAULT_OPTIONS.printFunctionName; + + const getEscapeRegex = options => + options && options.escapeRegex !== undefined + ? options.escapeRegex + : DEFAULT_OPTIONS.escapeRegex; + + const getEscapeString = options => + options && options.escapeString !== undefined + ? options.escapeString + : DEFAULT_OPTIONS.escapeString; + + const getConfig = options => ({ + callToJSON: + options && options.callToJSON !== undefined + ? options.callToJSON + : DEFAULT_OPTIONS.callToJSON, + colors: + options && options.highlight + ? getColorsHighlight(options) + : getColorsEmpty(), + escapeRegex: getEscapeRegex(options), + escapeString: getEscapeString(options), + indent: + options && options.min + ? '' + : createIndent( + options && options.indent !== undefined + ? options.indent + : DEFAULT_OPTIONS.indent + ), + maxDepth: + options && options.maxDepth !== undefined + ? options.maxDepth + : DEFAULT_OPTIONS.maxDepth, + min: options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min, + plugins: + options && options.plugins !== undefined + ? options.plugins + : DEFAULT_OPTIONS.plugins, + printFunctionName: getPrintFunctionName(options), + spacingInner: options && options.min ? ' ' : '\n', + spacingOuter: options && options.min ? '' : '\n' + }); + + function createIndent(indent) { + return new Array(indent + 1).join(' '); + } + /** + * Returns a presentation string of your `val` object + * @param val any potential JavaScript object + * @param options Custom settings + */ + + function prettyFormat(val, options) { + if (options) { + validateOptions(options); + + if (options.plugins) { + const plugin = findPlugin(options.plugins, val); + + if (plugin !== null) { + return printPlugin(plugin, val, getConfig(options), '', 0, []); + } + } + } + + const basicResult = printBasicValue( + val, + getPrintFunctionName(options), + getEscapeRegex(options), + getEscapeString(options) + ); + + if (basicResult !== null) { + return basicResult; + } + + return printComplexValue(val, getConfig(options), '', 0, []); + } + + prettyFormat.plugins = { + AsymmetricMatcher: _AsymmetricMatcher.default, + ConvertAnsi: _ConvertAnsi.default, + DOMCollection: _DOMCollection.default, + DOMElement: _DOMElement.default, + Immutable: _Immutable.default, + ReactElement: _ReactElement.default, + ReactTestComponent: _ReactTestComponent.default + }; + /* eslint-disable-next-line no-redeclare */ + + build = prettyFormat; + return build; +} + +var buildExports = requireBuild(); +var prettyFormat = /*@__PURE__*/getDefaultExportFromCjs(buildExports); + +var _PostDominator_exit, _PostDominator_nodes; +function computePostDominatorTree(fn, options) { + const graph = buildReverseGraph(fn, options.includeThrowsAsExitNode); + const nodes = computeImmediateDominators(graph); + if (!options.includeThrowsAsExitNode) { + for (const [id] of fn.body.blocks) { + if (!nodes.has(id)) { + nodes.set(id, id); + } + } + } + return new PostDominator(graph.entry, nodes); +} +class PostDominator { + constructor(exit, nodes) { + _PostDominator_exit.set(this, void 0); + _PostDominator_nodes.set(this, void 0); + __classPrivateFieldSet(this, _PostDominator_exit, exit, "f"); + __classPrivateFieldSet(this, _PostDominator_nodes, nodes, "f"); + } + get exit() { + return __classPrivateFieldGet(this, _PostDominator_exit, "f"); + } + get(id) { + const dominator = __classPrivateFieldGet(this, _PostDominator_nodes, "f").get(id); + CompilerError.invariant(dominator !== undefined, { + reason: 'Unknown node', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return dominator === id ? null : dominator; + } + debug() { + const postDominators = new Map(); + for (const [key, value] of __classPrivateFieldGet(this, _PostDominator_nodes, "f")) { + postDominators.set(`bb${key}`, `bb${value}`); + } + return prettyFormat({ + exit: `bb${this.exit}`, + postDominators, + }); + } +} +_PostDominator_exit = new WeakMap(), _PostDominator_nodes = new WeakMap(); +function computeImmediateDominators(graph) { + const nodes = new Map(); + nodes.set(graph.entry, graph.entry); + let changed = true; + while (changed) { + changed = false; + for (const [id, node] of graph.nodes) { + if (node.id === graph.entry) { + continue; + } + let newIdom = null; + for (const pred of node.preds) { + if (nodes.has(pred)) { + newIdom = pred; + break; + } + } + CompilerError.invariant(newIdom !== null, { + reason: `At least one predecessor must have been visited for block ${id}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + for (const pred of node.preds) { + if (pred === newIdom) { + continue; + } + const predDom = nodes.get(pred); + if (predDom !== undefined) { + newIdom = intersect(pred, newIdom, graph, nodes); + } + } + if (nodes.get(id) !== newIdom) { + nodes.set(id, newIdom); + changed = true; + } + } + } + return nodes; +} +function intersect(a, b, graph, nodes) { + let block1 = graph.nodes.get(a); + let block2 = graph.nodes.get(b); + while (block1 !== block2) { + while (block1.index > block2.index) { + const dom = nodes.get(block1.id); + block1 = graph.nodes.get(dom); + } + while (block2.index > block1.index) { + const dom = nodes.get(block2.id); + block2 = graph.nodes.get(dom); + } + } + return block1.id; +} +function buildReverseGraph(fn, includeThrowsAsExitNode) { + const nodes = new Map(); + const exitId = fn.env.nextBlockId; + const exit = { + id: exitId, + index: 0, + preds: new Set(), + succs: new Set(), + }; + nodes.set(exitId, exit); + for (const [id, block] of fn.body.blocks) { + const node = { + id, + index: 0, + preds: new Set(eachTerminalSuccessor(block.terminal)), + succs: new Set(block.preds), + }; + if (block.terminal.kind === 'return') { + node.preds.add(exitId); + exit.succs.add(id); + } + else if (block.terminal.kind === 'throw' && includeThrowsAsExitNode) { + node.preds.add(exitId); + exit.succs.add(id); + } + nodes.set(id, node); + } + const visited = new Set(); + const postorder = []; + function visit(id) { + if (visited.has(id)) { + return; + } + visited.add(id); + const node = nodes.get(id); + for (const successor of node.succs) { + visit(successor); + } + postorder.push(id); + } + visit(exitId); + const rpo = { entry: exitId, nodes: new Map() }; + let index = 0; + for (const id of postorder.reverse()) { + const node = nodes.get(id); + node.index = index++; + rpo.nodes.set(id, node); + } + return rpo; +} + +const DEFAULT_SHAPES = new Map(BUILTIN_SHAPES); +const UNTYPED_GLOBALS = new Set([ + 'Object', + 'Function', + 'RegExp', + 'Date', + 'Error', + 'TypeError', + 'RangeError', + 'ReferenceError', + 'SyntaxError', + 'URIError', + 'EvalError', + 'DataView', + 'Float32Array', + 'Float64Array', + 'Int8Array', + 'Int16Array', + 'Int32Array', + 'WeakMap', + 'Uint8Array', + 'Uint8ClampedArray', + 'Uint16Array', + 'Uint32Array', + 'ArrayBuffer', + 'JSON', + 'console', + 'eval', +]); +const TYPED_GLOBALS = [ + [ + 'Object', + addObject(DEFAULT_SHAPES, 'Object', [ + [ + 'keys', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'fromEntries', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutate], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInObjectId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'entries', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@object'], + rest: null, + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@returns', + reason: ValueReason.KnownReturnSignature, + value: ValueKind.Mutable, + }, + { + kind: 'Capture', + from: '@object', + into: '@returns', + }, + ], + }, + }), + ], + [ + 'keys', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@object'], + rest: null, + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@returns', + reason: ValueReason.KnownReturnSignature, + value: ValueKind.Mutable, + }, + { + kind: 'ImmutableCapture', + from: '@object', + into: '@returns', + }, + ], + }, + }), + ], + [ + 'values', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Capture], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@object'], + rest: null, + returns: '@returns', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@returns', + reason: ValueReason.KnownReturnSignature, + value: ValueKind.Mutable, + }, + { + kind: 'Capture', + from: '@object', + into: '@returns', + }, + ], + }, + }), + ], + ]), + ], + [ + 'Array', + addObject(DEFAULT_SHAPES, 'Array', [ + [ + 'isArray', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.Read], + restParam: null, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'from', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [ + Effect.ConditionallyMutateIterator, + Effect.ConditionallyMutate, + Effect.ConditionallyMutate, + ], + restParam: Effect.Read, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'of', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Object', shapeId: BuiltInArrayId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + ]), + ], + [ + 'performance', + addObject(DEFAULT_SHAPES, 'performance', [ + [ + 'now', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + impure: true, + canonicalName: 'performance.now', + }), + ], + ]), + ], + [ + 'Date', + addObject(DEFAULT_SHAPES, 'Date', [ + [ + 'now', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + impure: true, + canonicalName: 'Date.now', + }), + ], + ]), + ], + [ + 'Math', + addObject(DEFAULT_SHAPES, 'Math', [ + ['PI', { kind: 'Primitive' }], + [ + 'max', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'min', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'trunc', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'ceil', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'floor', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'pow', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'random', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + impure: true, + canonicalName: 'Math.random', + }), + ], + ]), + ], + ['Infinity', { kind: 'Primitive' }], + ['NaN', { kind: 'Primitive' }], + [ + 'console', + addObject(DEFAULT_SHAPES, 'console', [ + [ + 'error', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'info', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'log', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'table', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'trace', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'warn', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + ]), + ], + [ + 'Boolean', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'Number', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'String', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'parseInt', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'parseFloat', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'isNaN', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'isFinite', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'encodeURI', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'encodeURIComponent', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'decodeURI', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'decodeURIComponent', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Primitive, + }), + ], + [ + 'Map', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInMapId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], + [ + 'Set', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInSetId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], + [ + 'WeakMap', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakMapId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], + [ + 'WeakSet', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [Effect.ConditionallyMutateIterator], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInWeakSetId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }, null, true), + ], +]; +const REACT_APIS = [ + [ + 'useContext', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useContext', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.Context, + }, BuiltInUseContextHookId), + ], + [ + 'useState', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: BuiltInUseStateId }, + calleeEffect: Effect.Read, + hookKind: 'useState', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.State, + }), + ], + [ + 'useActionState', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: BuiltInUseActionStateId }, + calleeEffect: Effect.Read, + hookKind: 'useActionState', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.State, + }), + ], + [ + 'useReducer', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: BuiltInUseReducerId }, + calleeEffect: Effect.Read, + hookKind: 'useReducer', + returnValueKind: ValueKind.Frozen, + returnValueReason: ValueReason.ReducerState, + }), + ], + [ + 'useRef', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Capture, + returnType: { kind: 'Object', shapeId: BuiltInUseRefId }, + calleeEffect: Effect.Read, + hookKind: 'useRef', + returnValueKind: ValueKind.Mutable, + }), + ], + [ + 'useImperativeHandle', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + hookKind: 'useImperativeHandle', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'useMemo', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useMemo', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'useCallback', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useCallback', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'useEffect', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Primitive' }, + calleeEffect: Effect.Read, + hookKind: 'useEffect', + returnValueKind: ValueKind.Frozen, + aliasing: { + receiver: '@receiver', + params: [], + rest: '@rest', + returns: '@returns', + temporaries: ['@effect'], + effects: [ + { + kind: 'Freeze', + value: '@rest', + reason: ValueReason.Effect, + }, + { + kind: 'Create', + into: '@effect', + value: ValueKind.Frozen, + reason: ValueReason.KnownReturnSignature, + }, + { + kind: 'Capture', + from: '@rest', + into: '@effect', + }, + { + kind: 'Create', + into: '@returns', + value: ValueKind.Primitive, + reason: ValueReason.KnownReturnSignature, + }, + ], + }, + }, BuiltInUseEffectHookId), + ], + [ + 'useLayoutEffect', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useLayoutEffect', + returnValueKind: ValueKind.Frozen, + }, BuiltInUseLayoutEffectHookId), + ], + [ + 'useInsertionEffect', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + hookKind: 'useInsertionEffect', + returnValueKind: ValueKind.Frozen, + }, BuiltInUseInsertionEffectHookId), + ], + [ + 'useTransition', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: null, + returnType: { kind: 'Object', shapeId: BuiltInUseTransitionId }, + calleeEffect: Effect.Read, + hookKind: 'useTransition', + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'use', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }, BuiltInUseOperatorId), + ], + [ + 'fire', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: null, + returnType: { + kind: 'Function', + return: { kind: 'Poly' }, + shapeId: BuiltInFireFunctionId, + isConstructor: false, + }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }, BuiltInFireId), + ], + [ + 'useEffectEvent', + addHook(DEFAULT_SHAPES, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { + kind: 'Function', + return: { kind: 'Poly' }, + shapeId: BuiltinEffectEventId, + isConstructor: false, + }, + calleeEffect: Effect.Read, + hookKind: 'useEffectEvent', + returnValueKind: ValueKind.Frozen, + }, BuiltInUseEffectEventId), + ], + ['AUTODEPS', addObject(DEFAULT_SHAPES, BuiltInAutodepsId, [])], +]; +TYPED_GLOBALS.push([ + 'React', + addObject(DEFAULT_SHAPES, null, [ + ...REACT_APIS, + [ + 'createElement', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'cloneElement', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }), + ], + [ + 'createRef', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Capture, + returnType: { kind: 'Object', shapeId: BuiltInUseRefId }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + }), + ], + ]), +], [ + '_jsx', + addFunction(DEFAULT_SHAPES, [], { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Frozen, + }), +]); +const DEFAULT_GLOBALS = new Map(REACT_APIS); +for (const name of UNTYPED_GLOBALS) { + DEFAULT_GLOBALS.set(name, { + kind: 'Poly', + }); +} +for (const [name, type_] of TYPED_GLOBALS) { + DEFAULT_GLOBALS.set(name, type_); +} +DEFAULT_GLOBALS.set('globalThis', addObject(DEFAULT_SHAPES, 'globalThis', TYPED_GLOBALS)); +DEFAULT_GLOBALS.set('global', addObject(DEFAULT_SHAPES, 'global', TYPED_GLOBALS)); +function installTypeConfig(globals, shapes, typeConfig, moduleName, loc) { + var _a, _b, _c, _d, _e, _f; + switch (typeConfig.kind) { + case 'type': { + switch (typeConfig.name) { + case 'Array': { + return { kind: 'Object', shapeId: BuiltInArrayId }; + } + case 'MixedReadonly': { + return { kind: 'Object', shapeId: BuiltInMixedReadonlyId }; + } + case 'Primitive': { + return { kind: 'Primitive' }; + } + case 'Ref': { + return { kind: 'Object', shapeId: BuiltInUseRefId }; + } + case 'Any': { + return { kind: 'Poly' }; + } + default: { + assertExhaustive$1(typeConfig.name, `Unexpected type '${typeConfig.name}'`); + } + } + } + case 'function': { + return addFunction(shapes, [], { + positionalParams: typeConfig.positionalParams, + restParam: typeConfig.restParam, + calleeEffect: typeConfig.calleeEffect, + returnType: installTypeConfig(globals, shapes, typeConfig.returnType, moduleName, loc), + returnValueKind: typeConfig.returnValueKind, + noAlias: typeConfig.noAlias === true, + mutableOnlyIfOperandsAreMutable: typeConfig.mutableOnlyIfOperandsAreMutable === true, + aliasing: typeConfig.aliasing, + knownIncompatible: (_a = typeConfig.knownIncompatible) !== null && _a !== void 0 ? _a : null, + }); + } + case 'hook': { + return addHook(shapes, { + hookKind: 'Custom', + positionalParams: (_b = typeConfig.positionalParams) !== null && _b !== void 0 ? _b : [], + restParam: (_c = typeConfig.restParam) !== null && _c !== void 0 ? _c : Effect.Freeze, + calleeEffect: Effect.Read, + returnType: installTypeConfig(globals, shapes, typeConfig.returnType, moduleName, loc), + returnValueKind: (_d = typeConfig.returnValueKind) !== null && _d !== void 0 ? _d : ValueKind.Frozen, + noAlias: typeConfig.noAlias === true, + aliasing: typeConfig.aliasing, + knownIncompatible: (_e = typeConfig.knownIncompatible) !== null && _e !== void 0 ? _e : null, + }); + } + case 'object': { + return addObject(shapes, null, Object.entries((_f = typeConfig.properties) !== null && _f !== void 0 ? _f : {}).map(([key, value]) => { + var _a; + const type = installTypeConfig(globals, shapes, value, moduleName, loc); + const expectHook = isHookName$2(key); + let isHook = false; + if (type.kind === 'Function' && type.shapeId !== null) { + const functionType = shapes.get(type.shapeId); + if (((_a = functionType === null || functionType === void 0 ? void 0 : functionType.functionType) === null || _a === void 0 ? void 0 : _a.hookKind) !== null) { + isHook = true; + } + } + if (expectHook !== isHook) { + CompilerError.throwInvalidConfig({ + reason: `Invalid type configuration for module`, + description: `Expected type for object property '${key}' from module '${moduleName}' ${expectHook ? 'to be a hook' : 'not to be a hook'} based on the property name`, + loc, + }); + } + return [key, type]; + })); + } + default: { + assertExhaustive$1(typeConfig, `Unexpected type kind '${typeConfig.kind}'`); + } + } +} +function getReanimatedModuleType(registry) { + const frozenHooks = [ + 'useFrameCallback', + 'useAnimatedStyle', + 'useAnimatedProps', + 'useAnimatedScrollHandler', + 'useAnimatedReaction', + 'useWorkletCallback', + ]; + const reanimatedType = []; + for (const hook of frozenHooks) { + reanimatedType.push([ + hook, + addHook(registry, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Poly' }, + returnValueKind: ValueKind.Frozen, + noAlias: true, + calleeEffect: Effect.Read, + hookKind: 'Custom', + }), + ]); + } + const mutableHooks = ['useSharedValue', 'useDerivedValue']; + for (const hook of mutableHooks) { + reanimatedType.push([ + hook, + addHook(registry, { + positionalParams: [], + restParam: Effect.Freeze, + returnType: { kind: 'Object', shapeId: ReanimatedSharedValueId }, + returnValueKind: ValueKind.Mutable, + noAlias: true, + calleeEffect: Effect.Read, + hookKind: 'Custom', + }), + ]); + } + const funcs = [ + 'withTiming', + 'withSpring', + 'createAnimatedPropAdapter', + 'withDecay', + 'withRepeat', + 'runOnUI', + 'executeOnUIRuntimeSync', + ]; + for (const fn of funcs) { + reanimatedType.push([ + fn, + addFunction(registry, [], { + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'Poly' }, + calleeEffect: Effect.Read, + returnValueKind: ValueKind.Mutable, + noAlias: true, + }), + ]); + } + return addObject(registry, null, reanimatedType); +} + +const ObjectPropertiesSchema = zod.z + .record(zod.z.string(), zod.z.lazy(() => TypeSchema)) + .refine(record => { + return Object.keys(record).every(key => key === '*' || key === 'default' || libExports$1.isValidIdentifier(key)); +}, 'Expected all "object" property names to be valid identifier, `*` to match any property, of `default` to define a module default export'); +const ObjectTypeSchema = zod.z.object({ + kind: zod.z.literal('object'), + properties: ObjectPropertiesSchema.nullable(), +}); +const LifetimeIdSchema = zod.z.string().refine(id => id.startsWith('@'), { + message: "Placeholder names must start with '@'", +}); +const FreezeEffectSchema = zod.z.object({ + kind: zod.z.literal('Freeze'), + value: LifetimeIdSchema, + reason: ValueReasonSchema, +}); +const MutateEffectSchema = zod.z.object({ + kind: zod.z.literal('Mutate'), + value: LifetimeIdSchema, +}); +const MutateTransitiveConditionallySchema = zod.z.object({ + kind: zod.z.literal('MutateTransitiveConditionally'), + value: LifetimeIdSchema, +}); +const CreateEffectSchema = zod.z.object({ + kind: zod.z.literal('Create'), + into: LifetimeIdSchema, + value: ValueKindSchema, + reason: ValueReasonSchema, +}); +const AssignEffectSchema = zod.z.object({ + kind: zod.z.literal('Assign'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const AliasEffectSchema = zod.z.object({ + kind: zod.z.literal('Alias'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const ImmutableCaptureEffectSchema = zod.z.object({ + kind: zod.z.literal('ImmutableCapture'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const CaptureEffectSchema = zod.z.object({ + kind: zod.z.literal('Capture'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const CreateFromEffectSchema = zod.z.object({ + kind: zod.z.literal('CreateFrom'), + from: LifetimeIdSchema, + into: LifetimeIdSchema, +}); +const ApplyArgSchema = zod.z.union([ + LifetimeIdSchema, + zod.z.object({ + kind: zod.z.literal('Spread'), + place: LifetimeIdSchema, + }), + zod.z.object({ + kind: zod.z.literal('Hole'), + }), +]); +const ApplyEffectSchema = zod.z.object({ + kind: zod.z.literal('Apply'), + receiver: LifetimeIdSchema, + function: LifetimeIdSchema, + mutatesFunction: zod.z.boolean(), + args: zod.z.array(ApplyArgSchema), + into: LifetimeIdSchema, +}); +const ImpureEffectSchema = zod.z.object({ + kind: zod.z.literal('Impure'), + place: LifetimeIdSchema, +}); +const AliasingEffectSchema = zod.z.union([ + FreezeEffectSchema, + CreateEffectSchema, + CreateFromEffectSchema, + AssignEffectSchema, + AliasEffectSchema, + CaptureEffectSchema, + ImmutableCaptureEffectSchema, + ImpureEffectSchema, + MutateEffectSchema, + MutateTransitiveConditionallySchema, + ApplyEffectSchema, +]); +const AliasingSignatureSchema = zod.z.object({ + receiver: LifetimeIdSchema, + params: zod.z.array(LifetimeIdSchema), + rest: LifetimeIdSchema.nullable(), + returns: LifetimeIdSchema, + effects: zod.z.array(AliasingEffectSchema), + temporaries: zod.z.array(LifetimeIdSchema), +}); +const FunctionTypeSchema = zod.z.object({ + kind: zod.z.literal('function'), + positionalParams: zod.z.array(EffectSchema), + restParam: EffectSchema.nullable(), + calleeEffect: EffectSchema, + returnType: zod.z.lazy(() => TypeSchema), + returnValueKind: ValueKindSchema, + noAlias: zod.z.boolean().nullable().optional(), + mutableOnlyIfOperandsAreMutable: zod.z.boolean().nullable().optional(), + impure: zod.z.boolean().nullable().optional(), + canonicalName: zod.z.string().nullable().optional(), + aliasing: AliasingSignatureSchema.nullable().optional(), + knownIncompatible: zod.z.string().nullable().optional(), +}); +const HookTypeSchema = zod.z.object({ + kind: zod.z.literal('hook'), + positionalParams: zod.z.array(EffectSchema).nullable().optional(), + restParam: EffectSchema.nullable().optional(), + returnType: zod.z.lazy(() => TypeSchema), + returnValueKind: ValueKindSchema.nullable().optional(), + noAlias: zod.z.boolean().nullable().optional(), + aliasing: AliasingSignatureSchema.nullable().optional(), + knownIncompatible: zod.z.string().nullable().optional(), +}); +const BuiltInTypeSchema = zod.z.union([ + zod.z.literal('Any'), + zod.z.literal('Ref'), + zod.z.literal('Array'), + zod.z.literal('Primitive'), + zod.z.literal('MixedReadonly'), +]); +const TypeReferenceSchema = zod.z.object({ + kind: zod.z.literal('type'), + name: BuiltInTypeSchema, +}); +const TypeSchema = zod.z.union([ + ObjectTypeSchema, + FunctionTypeSchema, + HookTypeSchema, + TypeReferenceSchema, +]); + +function unsupportedTypeAnnotation(desc, loc) { + CompilerError.throwInvalidJS({ + reason: `Typedchecker does not currently support type annotation: ${desc}`, + loc, + }); +} + +var _FlowTypeEnv_nextNominalId, _FlowTypeEnv_nextTypeParameterId, _FlowTypeEnv_types, _FlowTypeEnv_bindings, _FlowTypeEnv_generics, _FlowTypeEnv_flowTypes; +function makeTypeParameterId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected TypeParameterId to be a non-negative integer', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return id; +} +function makeNominalId(id) { + return id; +} +const DUMMY_NOMINAL = makeNominalId(0); +function convertFlowType(flowType, loc) { + let nextGenericId = 0; + function convertFlowTypeImpl(flowType, loc, genericEnv, platform, poly = null) { + var _a, _b, _c; + switch (flowType.kind) { + case 'TypeApp': { + if (flowType.type.kind === 'Def' && + flowType.type.def.kind === 'Poly' && + flowType.type.def.t_out.kind === 'Def' && + flowType.type.def.t_out.def.kind === 'Type' && + flowType.type.def.t_out.def.type.kind === 'Opaque' && + flowType.type.def.t_out.def.type.opaquetype.opaque_name === + 'Client' && + flowType.targs.length === 1) { + return convertFlowTypeImpl(flowType.targs[0], loc, genericEnv, 'client'); + } + else if (flowType.type.kind === 'Def' && + flowType.type.def.kind === 'Poly' && + flowType.type.def.t_out.kind === 'Def' && + flowType.type.def.t_out.def.kind === 'Type' && + flowType.type.def.t_out.def.type.kind === 'Opaque' && + flowType.type.def.t_out.def.type.opaquetype.opaque_name === + 'Server' && + flowType.targs.length === 1) { + return convertFlowTypeImpl(flowType.targs[0], loc, genericEnv, 'server'); + } + return Resolved.todo(platform); + } + case 'Open': + return Resolved.mixed(platform); + case 'Any': + return Resolved.todo(platform); + case 'Annot': + return convertFlowTypeImpl(flowType.type, loc, genericEnv, platform, poly); + case 'Opaque': { + if (flowType.opaquetype.opaque_name === 'Client' && + flowType.opaquetype.super_t != null) { + return convertFlowTypeImpl(flowType.opaquetype.super_t, loc, genericEnv, 'client'); + } + if (flowType.opaquetype.opaque_name === 'Server' && + flowType.opaquetype.super_t != null) { + return convertFlowTypeImpl(flowType.opaquetype.super_t, loc, genericEnv, 'server'); + } + const t = (_a = flowType.opaquetype.underlying_t) !== null && _a !== void 0 ? _a : flowType.opaquetype.super_t; + if (t != null) { + return convertFlowTypeImpl(t, loc, genericEnv, platform, poly); + } + else { + return Resolved.todo(platform); + } + } + case 'Def': { + switch (flowType.def.kind) { + case 'EnumValue': + return convertFlowTypeImpl(flowType.def.enum_info.representation_t, loc, genericEnv, platform, poly); + case 'EnumObject': + return Resolved.enum(platform); + case 'Empty': + return Resolved.todo(platform); + case 'Instance': { + const members = new Map(); + for (const key in flowType.def.instance.inst.own_props) { + const prop = flowType.def.instance.inst.own_props[key]; + if (prop.kind === 'Field') { + members.set(key, convertFlowTypeImpl(prop.type, loc, genericEnv, platform)); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported property kind ${prop.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } + return Resolved.class((_b = flowType.def.instance.inst.class_name) !== null && _b !== void 0 ? _b : '[anonymous class]', members, platform); + } + case 'Type': + return convertFlowTypeImpl(flowType.def.type, loc, genericEnv, platform, poly); + case 'NumGeneral': + case 'SingletonNum': + return Resolved.number(platform); + case 'StrGeneral': + case 'SingletonStr': + return Resolved.string(platform); + case 'BoolGeneral': + case 'SingletonBool': + return Resolved.boolean(platform); + case 'Void': + return Resolved.void(platform); + case 'Null': + return Resolved.void(platform); + case 'Mixed': + return Resolved.mixed(platform); + case 'Arr': { + if (flowType.def.arrtype.kind === 'ArrayAT' || + flowType.def.arrtype.kind === 'ROArrayAT') { + return Resolved.array(convertFlowTypeImpl(flowType.def.arrtype.elem_t, loc, genericEnv, platform), platform); + } + else { + return Resolved.tuple(DUMMY_NOMINAL, flowType.def.arrtype.elements.map(t => convertFlowTypeImpl(t.t, loc, genericEnv, platform)), platform); + } + } + case 'Obj': { + const members = new Map(); + for (const key in flowType.def.objtype.props) { + const prop = flowType.def.objtype.props[key]; + if (prop.kind === 'Field') { + members.set(key, convertFlowTypeImpl(prop.type, loc, genericEnv, platform)); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported property kind ${prop.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } + return Resolved.object(DUMMY_NOMINAL, members, platform); + } + case 'Class': { + if (flowType.def.type.kind === 'ThisInstance') { + const members = new Map(); + for (const key in flowType.def.type.instance.inst.own_props) { + const prop = flowType.def.type.instance.inst.own_props[key]; + if (prop.kind === 'Field') { + members.set(key, convertFlowTypeImpl(prop.type, loc, genericEnv, platform)); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported property kind ${prop.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + } + return Resolved.class((_c = flowType.def.type.instance.inst.class_name) !== null && _c !== void 0 ? _c : '[anonymous class]', members, platform); + } + CompilerError.invariant(false, { + reason: `Unsupported class instance type ${flowType.def.type.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + case 'Fun': + return Resolved.function(poly, flowType.def.funtype.params.map(p => convertFlowTypeImpl(p.type, loc, genericEnv, platform)), convertFlowTypeImpl(flowType.def.funtype.return_t, loc, genericEnv, platform), platform); + case 'Poly': { + let newEnv = genericEnv; + const poly = flowType.def.tparams.map(p => { + const id = makeTypeParameterId(nextGenericId++); + const bound = convertFlowTypeImpl(p.bound, loc, newEnv, platform); + newEnv = new Map(newEnv); + newEnv.set(p.name, id); + return { + name: p.name, + id, + bound, + }; + }); + return convertFlowTypeImpl(flowType.def.t_out, loc, newEnv, platform, poly); + } + case 'ReactAbstractComponent': { + const props = new Map(); + let children = null; + const propsType = convertFlowTypeImpl(flowType.def.config, loc, genericEnv, platform); + if (propsType.type.kind === 'Object') { + propsType.type.members.forEach((v, k) => { + if (k === 'children') { + children = v; + } + else { + props.set(k, v); + } + }); + } + else { + CompilerError.invariant(false, { + reason: `Unsupported component props type ${propsType.type.kind}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + return Resolved.component(props, children, platform); + } + case 'Renders': + return Resolved.todo(platform); + default: + unsupportedTypeAnnotation('Renders', GeneratedSource); + } + } + case 'Generic': { + const id = genericEnv.get(flowType.name); + if (id == null) { + unsupportedTypeAnnotation(flowType.name, GeneratedSource); + } + return Resolved.generic(id, platform, convertFlowTypeImpl(flowType.bound, loc, genericEnv, platform)); + } + case 'Union': { + const members = flowType.members.map(t => convertFlowTypeImpl(t, loc, genericEnv, platform)); + if (members.length === 1) { + return members[0]; + } + if (members[0].type.kind === 'Number' || + members[0].type.kind === 'String' || + members[0].type.kind === 'Boolean') { + const dupes = members.filter(t => t.type.kind === members[0].type.kind); + if (dupes.length === members.length) { + return members[0]; + } + } + if (members[0].type.kind === 'Array' && + (members[0].type.element.type.kind === 'Number' || + members[0].type.element.type.kind === 'String' || + members[0].type.element.type.kind === 'Boolean')) { + const first = members[0].type.element; + const dupes = members.filter(t => t.type.kind === 'Array' && + t.type.element.type.kind === first.type.kind); + if (dupes.length === members.length) { + return members[0]; + } + } + return Resolved.union(members, platform); + } + case 'Eval': { + if (flowType.destructor.kind === 'ReactDRO' || + flowType.destructor.kind === 'ReactCheckComponentConfig') { + return convertFlowTypeImpl(flowType.type, loc, genericEnv, platform, poly); + } + unsupportedTypeAnnotation(`EvalT(${flowType.destructor.kind})`, GeneratedSource); + } + case 'Optional': { + return Resolved.union([ + convertFlowTypeImpl(flowType.type, loc, genericEnv, platform), + Resolved.void(platform), + ], platform); + } + default: + unsupportedTypeAnnotation(flowType.kind, GeneratedSource); + } + } + return convertFlowTypeImpl(flowType, loc, new Map(), 'shared'); +} +function serializeLoc(location) { + return `${location.start.line}:${location.start.column}-${location.end.line}:${location.end.column}`; +} +function buildTypeEnvironment(flowOutput) { + const result = new Map(); + for (const item of flowOutput) { + const loc = { + start: { + line: item.loc.start.line, + column: item.loc.start.column - 1, + index: item.loc.start.index, + }, + end: item.loc.end, + filename: item.loc.filename, + identifierName: item.loc.identifierName, + }; + result.set(serializeLoc(loc), item.type); + } + return result; +} +let lastFlowSource = null; +let lastFlowResult = null; +class FlowTypeEnv { + constructor() { + this.moduleEnv = new Map(); + _FlowTypeEnv_nextNominalId.set(this, 0); + _FlowTypeEnv_nextTypeParameterId.set(this, 0); + _FlowTypeEnv_types.set(this, new Map()); + _FlowTypeEnv_bindings.set(this, new Map()); + _FlowTypeEnv_generics.set(this, []); + _FlowTypeEnv_flowTypes.set(this, new Map()); + } + init(env, source) { + CompilerError.invariant(env.config.flowTypeProvider != null, { + reason: 'Expected flowDumpTypes to be defined in environment config', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + let stdout; + if (source === lastFlowSource) { + stdout = lastFlowResult; + } + else { + lastFlowSource = source; + lastFlowResult = env.config.flowTypeProvider(source); + stdout = lastFlowResult; + } + const flowTypes = buildTypeEnvironment(stdout); + const resolvedFlowTypes = new Map(); + for (const [loc, type] of flowTypes) { + if (typeof loc === 'symbol') + continue; + resolvedFlowTypes.set(loc, convertFlowType(JSON.parse(type), loc)); + } + __classPrivateFieldSet(this, _FlowTypeEnv_flowTypes, resolvedFlowTypes, "f"); + } + setType(identifier, type) { + if (typeof identifier.loc !== 'symbol' && + __classPrivateFieldGet(this, _FlowTypeEnv_flowTypes, "f").has(serializeLoc(identifier.loc))) { + return; + } + __classPrivateFieldGet(this, _FlowTypeEnv_types, "f").set(identifier.id, type); + } + getType(identifier) { + const result = this.getTypeOrNull(identifier); + if (result == null) { + throw new Error(`Type not found for ${identifier.id}, ${typeof identifier.loc === 'symbol' ? 'generated loc' : serializeLoc(identifier.loc)}`); + } + return result; + } + getTypeOrNull(identifier) { + var _a; + const result = (_a = __classPrivateFieldGet(this, _FlowTypeEnv_types, "f").get(identifier.id)) !== null && _a !== void 0 ? _a : null; + if (result == null && typeof identifier.loc !== 'symbol') { + const flowType = __classPrivateFieldGet(this, _FlowTypeEnv_flowTypes, "f").get(serializeLoc(identifier.loc)); + return flowType !== null && flowType !== void 0 ? flowType : null; + } + return result; + } + getTypeByLoc(loc) { + if (typeof loc === 'symbol') { + return null; + } + const flowType = __classPrivateFieldGet(this, _FlowTypeEnv_flowTypes, "f").get(serializeLoc(loc)); + return flowType !== null && flowType !== void 0 ? flowType : null; + } + nextNominalId() { + var _a, _b; + return makeNominalId((__classPrivateFieldSet(this, _FlowTypeEnv_nextNominalId, (_b = __classPrivateFieldGet(this, _FlowTypeEnv_nextNominalId, "f"), _a = _b++, _b), "f"), _a)); + } + nextTypeParameterId() { + var _a, _b; + return makeTypeParameterId((__classPrivateFieldSet(this, _FlowTypeEnv_nextTypeParameterId, (_b = __classPrivateFieldGet(this, _FlowTypeEnv_nextTypeParameterId, "f"), _a = _b++, _b), "f"), _a)); + } + addBinding(bindingIdentifier, type) { + __classPrivateFieldGet(this, _FlowTypeEnv_bindings, "f").set(bindingIdentifier, type); + } + resolveBinding(bindingIdentifier) { + var _a; + return (_a = __classPrivateFieldGet(this, _FlowTypeEnv_bindings, "f").get(bindingIdentifier)) !== null && _a !== void 0 ? _a : null; + } + pushGeneric(name, generic) { + __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f").unshift([name, generic]); + } + popGeneric(name) { + for (let i = 0; i < __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f").length; i++) { + if (__classPrivateFieldGet(this, _FlowTypeEnv_generics, "f")[i][0] === name) { + __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f").splice(i, 1); + return; + } + } + } + getGeneric(name) { + for (const [eltName, param] of __classPrivateFieldGet(this, _FlowTypeEnv_generics, "f")) { + if (name === eltName) { + return param; + } + } + return null; + } +} +_FlowTypeEnv_nextNominalId = new WeakMap(), _FlowTypeEnv_nextTypeParameterId = new WeakMap(), _FlowTypeEnv_types = new WeakMap(), _FlowTypeEnv_bindings = new WeakMap(), _FlowTypeEnv_generics = new WeakMap(), _FlowTypeEnv_flowTypes = new WeakMap(); +const Primitives = { + number(platform) { + return { kind: 'Concrete', type: { kind: 'Number' }, platform }; + }, + string(platform) { + return { kind: 'Concrete', type: { kind: 'String' }, platform }; + }, + boolean(platform) { + return { kind: 'Concrete', type: { kind: 'Boolean' }, platform }; + }, + void(platform) { + return { kind: 'Concrete', type: { kind: 'Void' }, platform }; + }, + mixed(platform) { + return { kind: 'Concrete', type: { kind: 'Mixed' }, platform }; + }, + enum(platform) { + return { kind: 'Concrete', type: { kind: 'Enum' }, platform }; + }, + todo(platform) { + return { kind: 'Concrete', type: { kind: 'Mixed' }, platform }; + }, +}; +const Resolved = Object.assign(Object.assign({}, Primitives), { nullable(type, platform) { + return { kind: 'Concrete', type: { kind: 'Nullable', type }, platform }; + }, + array(element, platform) { + return { kind: 'Concrete', type: { kind: 'Array', element }, platform }; + }, + set(element, platform) { + return { kind: 'Concrete', type: { kind: 'Set', element }, platform }; + }, + map(key, value, platform) { + return { kind: 'Concrete', type: { kind: 'Map', key, value }, platform }; + }, + function(typeParameters, params, returnType, platform) { + return { + kind: 'Concrete', + type: { kind: 'Function', typeParameters, params, returnType }, + platform, + }; + }, + component(props, children, platform) { + return { + kind: 'Concrete', + type: { kind: 'Component', props, children }, + platform, + }; + }, + object(id, members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Object', + id, + members, + }, + platform, + }; + }, + class(name, members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Instance', + name, + members, + }, + platform, + }; + }, + tuple(id, members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Tuple', + id, + members, + }, + platform, + }; + }, + generic(id, platform, bound = Primitives.mixed(platform)) { + return { + kind: 'Concrete', + type: { + kind: 'Generic', + id, + bound, + }, + platform, + }; + }, + union(members, platform) { + return { + kind: 'Concrete', + type: { + kind: 'Union', + members, + }, + platform, + }; + } }); + +function defaultModuleTypeProvider(moduleName) { + switch (moduleName) { + case 'react-hook-form': { + return { + kind: 'object', + properties: { + useForm: { + kind: 'hook', + returnType: { + kind: 'object', + properties: { + watch: { + kind: 'function', + positionalParams: [], + restParam: Effect.Read, + calleeEffect: Effect.Read, + returnType: { kind: 'type', name: 'Any' }, + returnValueKind: ValueKind.Mutable, + knownIncompatible: `React Hook Form's \`useForm()\` API returns a \`watch()\` function which cannot be memoized safely.`, + }, + }, + }, + }, + }, + }; + } + case '@tanstack/react-table': { + return { + kind: 'object', + properties: { + useReactTable: { + kind: 'hook', + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'type', name: 'Any' }, + knownIncompatible: `TanStack Table's \`useReactTable()\` API returns functions that cannot be memoized safely`, + }, + }, + }; + } + case '@tanstack/react-virtual': { + return { + kind: 'object', + properties: { + useVirtualizer: { + kind: 'hook', + positionalParams: [], + restParam: Effect.Read, + returnType: { kind: 'type', name: 'Any' }, + knownIncompatible: `TanStack Virtual's \`useVirtualizer()\` API returns functions that cannot be memoized safely`, + }, + }, + }; + } + } + return null; +} + +var _Environment_instances, _Environment_globals, _Environment_shapes, _Environment_moduleTypes, _Environment_nextIdentifer, _Environment_nextBlock, _Environment_nextScope, _Environment_scope, _Environment_outlinedFunctions, _Environment_contextIdentifiers, _Environment_hoistedIdentifiers, _Environment_flowTypeEnvironment, _Environment_resolveModuleType, _Environment_isKnownReactModule, _Environment_getCustomHookType; +const ReactElementSymbolSchema = zod.z.object({ + elementSymbol: zod.z.union([ + zod.z.literal('react.element'), + zod.z.literal('react.transitional.element'), + ]), + globalDevVar: zod.z.string(), +}); +const ExternalFunctionSchema = zod.z.object({ + source: zod.z.string(), + importSpecifierName: zod.z.string(), +}); +const InstrumentationSchema = zod.z + .object({ + fn: ExternalFunctionSchema, + gating: ExternalFunctionSchema.nullable(), + globalGating: zod.z.string().nullable(), +}) + .refine(opts => opts.gating != null || opts.globalGating != null, 'Expected at least one of gating or globalGating'); +const USE_FIRE_FUNCTION_NAME = 'useFire'; +const EMIT_FREEZE_GLOBAL_GATING = 'false'; +const MacroMethodSchema = zod.z.union([ + zod.z.object({ type: zod.z.literal('wildcard') }), + zod.z.object({ type: zod.z.literal('name'), name: zod.z.string() }), +]); +const MacroSchema = zod.z.union([ + zod.z.string(), + zod.z.tuple([zod.z.string(), zod.z.array(MacroMethodSchema)]), +]); +const HookSchema = zod.z.object({ + effectKind: zod.z.nativeEnum(Effect), + valueKind: zod.z.nativeEnum(ValueKind), + noAlias: zod.z.boolean().default(false), + transitiveMixedData: zod.z.boolean().default(false), +}); +const EnvironmentConfigSchema = zod.z.object({ + customHooks: zod.z.map(zod.z.string(), HookSchema).default(new Map()), + moduleTypeProvider: zod.z.nullable(zod.z.function().args(zod.z.string())).default(null), + customMacros: zod.z.nullable(zod.z.array(MacroSchema)).default(null), + enableResetCacheOnSourceFileChanges: zod.z.nullable(zod.z.boolean()).default(null), + enablePreserveExistingMemoizationGuarantees: zod.z.boolean().default(false), + validatePreserveExistingMemoizationGuarantees: zod.z.boolean().default(true), + enablePreserveExistingManualUseMemo: zod.z.boolean().default(false), + enableForest: zod.z.boolean().default(false), + enableUseTypeAnnotations: zod.z.boolean().default(false), + flowTypeProvider: zod.z.nullable(zod.z.function().args(zod.z.string())).default(null), + enableOptionalDependencies: zod.z.boolean().default(true), + enableFire: zod.z.boolean().default(false), + enableNameAnonymousFunctions: zod.z.boolean().default(false), + inferEffectDependencies: zod.z + .nullable(zod.z.array(zod.z.object({ + function: ExternalFunctionSchema, + autodepsIndex: zod.z.number().min(1, 'autodepsIndex must be > 0'), + }))) + .default(null), + inlineJsxTransform: ReactElementSymbolSchema.nullable().default(null), + validateHooksUsage: zod.z.boolean().default(true), + validateRefAccessDuringRender: zod.z.boolean().default(true), + validateNoSetStateInRender: zod.z.boolean().default(true), + validateNoSetStateInEffects: zod.z.boolean().default(false), + validateNoDerivedComputationsInEffects: zod.z.boolean().default(false), + validateNoJSXInTryStatements: zod.z.boolean().default(false), + validateStaticComponents: zod.z.boolean().default(false), + validateMemoizedEffectDependencies: zod.z.boolean().default(false), + validateNoCapitalizedCalls: zod.z.nullable(zod.z.array(zod.z.string())).default(null), + validateBlocklistedImports: zod.z.nullable(zod.z.array(zod.z.string())).default(null), + validateNoImpureFunctionsInRender: zod.z.boolean().default(false), + validateNoFreezingKnownMutableFunctions: zod.z.boolean().default(false), + enableAssumeHooksFollowRulesOfReact: zod.z.boolean().default(true), + enableTransitivelyFreezeFunctionExpressions: zod.z.boolean().default(true), + enableEmitFreeze: ExternalFunctionSchema.nullable().default(null), + enableEmitHookGuards: ExternalFunctionSchema.nullable().default(null), + enableInstructionReordering: zod.z.boolean().default(false), + enableFunctionOutlining: zod.z.boolean().default(true), + enableJsxOutlining: zod.z.boolean().default(false), + enableEmitInstrumentForget: InstrumentationSchema.nullable().default(null), + assertValidMutableRanges: zod.z.boolean().default(false), + enableChangeVariableCodegen: zod.z.boolean().default(false), + enableMemoizationComments: zod.z.boolean().default(false), + throwUnknownException__testonly: zod.z.boolean().default(false), + enableTreatFunctionDepsAsConditional: zod.z.boolean().default(false), + disableMemoizationForDebugging: zod.z.boolean().default(false), + enableChangeDetectionForDebugging: ExternalFunctionSchema.nullable().default(null), + enableCustomTypeDefinitionForReanimated: zod.z.boolean().default(false), + hookPattern: zod.z.string().nullable().default(null), + enableTreatRefLikeIdentifiersAsRefs: zod.z.boolean().default(true), + enableTreatSetIdentifiersAsStateSetters: zod.z.boolean().default(false), + lowerContextAccess: ExternalFunctionSchema.nullable().default(null), + validateNoVoidUseMemo: zod.z.boolean().default(false), + validateNoDynamicallyCreatedComponentsOrHooks: zod.z.boolean().default(false), + enableAllowSetStateFromRefsInEffects: zod.z.boolean().default(true), +}); +class Environment { + constructor(scope, fnType, compilerMode, config, contextIdentifiers, parentFunction, logger, filename, code, programContext) { + _Environment_instances.add(this); + _Environment_globals.set(this, void 0); + _Environment_shapes.set(this, void 0); + _Environment_moduleTypes.set(this, new Map()); + _Environment_nextIdentifer.set(this, 0); + _Environment_nextBlock.set(this, 0); + _Environment_nextScope.set(this, 0); + _Environment_scope.set(this, void 0); + _Environment_outlinedFunctions.set(this, []); + this.inferredEffectLocations = new Set(); + _Environment_contextIdentifiers.set(this, void 0); + _Environment_hoistedIdentifiers.set(this, void 0); + _Environment_flowTypeEnvironment.set(this, void 0); + __classPrivateFieldSet(this, _Environment_scope, scope, "f"); + this.fnType = fnType; + this.compilerMode = compilerMode; + this.config = config; + this.filename = filename; + this.code = code; + this.logger = logger; + this.programContext = programContext; + __classPrivateFieldSet(this, _Environment_shapes, new Map(DEFAULT_SHAPES), "f"); + __classPrivateFieldSet(this, _Environment_globals, new Map(DEFAULT_GLOBALS), "f"); + this.hasFireRewrite = false; + this.hasInferredEffect = false; + if (config.disableMemoizationForDebugging && + config.enableChangeDetectionForDebugging != null) { + CompilerError.throwInvalidConfig({ + reason: `Invalid environment config: the 'disableMemoizationForDebugging' and 'enableChangeDetectionForDebugging' options cannot be used together`, + description: null, + loc: null, + suggestions: null, + }); + } + for (const [hookName, hook] of this.config.customHooks) { + CompilerError.invariant(!__classPrivateFieldGet(this, _Environment_globals, "f").has(hookName), { + reason: `[Globals] Found existing definition in global registry for custom hook ${hookName}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _Environment_globals, "f").set(hookName, addHook(__classPrivateFieldGet(this, _Environment_shapes, "f"), { + positionalParams: [], + restParam: hook.effectKind, + returnType: hook.transitiveMixedData + ? { kind: 'Object', shapeId: BuiltInMixedReadonlyId } + : { kind: 'Poly' }, + returnValueKind: hook.valueKind, + calleeEffect: Effect.Read, + hookKind: 'Custom', + noAlias: hook.noAlias, + })); + } + if (config.enableCustomTypeDefinitionForReanimated) { + const reanimatedModuleType = getReanimatedModuleType(__classPrivateFieldGet(this, _Environment_shapes, "f")); + __classPrivateFieldGet(this, _Environment_moduleTypes, "f").set(REANIMATED_MODULE_NAME, reanimatedModuleType); + } + this.parentFunction = parentFunction; + __classPrivateFieldSet(this, _Environment_contextIdentifiers, contextIdentifiers, "f"); + __classPrivateFieldSet(this, _Environment_hoistedIdentifiers, new Set(), "f"); + if (config.flowTypeProvider != null) { + __classPrivateFieldSet(this, _Environment_flowTypeEnvironment, new FlowTypeEnv(), "f"); + CompilerError.invariant(code != null, { + reason: 'Expected Environment to be initialized with source code when a Flow type provider is specified', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + __classPrivateFieldGet(this, _Environment_flowTypeEnvironment, "f").init(this, code); + } + else { + __classPrivateFieldSet(this, _Environment_flowTypeEnvironment, null, "f"); + } + } + get typeContext() { + CompilerError.invariant(__classPrivateFieldGet(this, _Environment_flowTypeEnvironment, "f") != null, { + reason: 'Flow type environment not initialized', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return __classPrivateFieldGet(this, _Environment_flowTypeEnvironment, "f"); + } + get isInferredMemoEnabled() { + return this.compilerMode !== 'no_inferred_memo'; + } + get nextIdentifierId() { + var _a, _b; + return makeIdentifierId((__classPrivateFieldSet(this, _Environment_nextIdentifer, (_b = __classPrivateFieldGet(this, _Environment_nextIdentifer, "f"), _a = _b++, _b), "f"), _a)); + } + get nextBlockId() { + var _a, _b; + return makeBlockId((__classPrivateFieldSet(this, _Environment_nextBlock, (_b = __classPrivateFieldGet(this, _Environment_nextBlock, "f"), _a = _b++, _b), "f"), _a)); + } + get nextScopeId() { + var _a, _b; + return makeScopeId((__classPrivateFieldSet(this, _Environment_nextScope, (_b = __classPrivateFieldGet(this, _Environment_nextScope, "f"), _a = _b++, _b), "f"), _a)); + } + get scope() { + return __classPrivateFieldGet(this, _Environment_scope, "f"); + } + logErrors(errors) { + if (errors.isOk() || this.logger == null) { + return; + } + for (const error of errors.unwrapErr().details) { + this.logger.logEvent(this.filename, { + kind: 'CompileError', + detail: error, + fnLoc: null, + }); + } + } + isContextIdentifier(node) { + return __classPrivateFieldGet(this, _Environment_contextIdentifiers, "f").has(node); + } + isHoistedIdentifier(node) { + return __classPrivateFieldGet(this, _Environment_hoistedIdentifiers, "f").has(node); + } + generateGloballyUniqueIdentifierName(name) { + const identifierNode = __classPrivateFieldGet(this, _Environment_scope, "f").generateUidIdentifier(name !== null && name !== void 0 ? name : undefined); + return makeIdentifierName(identifierNode.name); + } + outlineFunction(fn, type) { + __classPrivateFieldGet(this, _Environment_outlinedFunctions, "f").push({ fn, type }); + } + getOutlinedFunctions() { + return __classPrivateFieldGet(this, _Environment_outlinedFunctions, "f"); + } + getGlobalDeclaration(binding, loc) { + var _a, _b, _c, _d; + if (this.config.hookPattern != null) { + const match = new RegExp(this.config.hookPattern).exec(binding.name); + if (match != null && + typeof match[1] === 'string' && + isHookName$2(match[1])) { + const resolvedName = match[1]; + return (_a = __classPrivateFieldGet(this, _Environment_globals, "f").get(resolvedName)) !== null && _a !== void 0 ? _a : __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this); + } + } + switch (binding.kind) { + case 'ModuleLocal': { + return isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null; + } + case 'Global': { + return ((_b = __classPrivateFieldGet(this, _Environment_globals, "f").get(binding.name)) !== null && _b !== void 0 ? _b : (isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null)); + } + case 'ImportSpecifier': { + if (__classPrivateFieldGet(this, _Environment_instances, "m", _Environment_isKnownReactModule).call(this, binding.module)) { + return ((_c = __classPrivateFieldGet(this, _Environment_globals, "f").get(binding.imported)) !== null && _c !== void 0 ? _c : (isHookName$2(binding.imported) || isHookName$2(binding.name) + ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) + : null)); + } + else { + const moduleType = __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_resolveModuleType).call(this, binding.module, loc); + if (moduleType !== null) { + const importedType = this.getPropertyType(moduleType, binding.imported); + if (importedType != null) { + const expectHook = isHookName$2(binding.imported); + const isHook = getHookKindForType(this, importedType) != null; + if (expectHook !== isHook) { + CompilerError.throwInvalidConfig({ + reason: `Invalid type configuration for module`, + description: `Expected type for \`import {${binding.imported}} from '${binding.module}'\` ${expectHook ? 'to be a hook' : 'not to be a hook'} based on the exported name`, + loc, + }); + } + return importedType; + } + } + return isHookName$2(binding.imported) || isHookName$2(binding.name) + ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) + : null; + } + } + case 'ImportDefault': + case 'ImportNamespace': { + if (__classPrivateFieldGet(this, _Environment_instances, "m", _Environment_isKnownReactModule).call(this, binding.module)) { + return ((_d = __classPrivateFieldGet(this, _Environment_globals, "f").get(binding.name)) !== null && _d !== void 0 ? _d : (isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null)); + } + else { + const moduleType = __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_resolveModuleType).call(this, binding.module, loc); + if (moduleType !== null) { + let importedType = null; + if (binding.kind === 'ImportDefault') { + const defaultType = this.getPropertyType(moduleType, 'default'); + if (defaultType !== null) { + importedType = defaultType; + } + } + else { + importedType = moduleType; + } + if (importedType !== null) { + const expectHook = isHookName$2(binding.module); + const isHook = getHookKindForType(this, importedType) != null; + if (expectHook !== isHook) { + CompilerError.throwInvalidConfig({ + reason: `Invalid type configuration for module`, + description: `Expected type for \`import ... from '${binding.module}'\` ${expectHook ? 'to be a hook' : 'not to be a hook'} based on the module name`, + loc, + }); + } + return importedType; + } + } + return isHookName$2(binding.name) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null; + } + } + } + } + getFallthroughPropertyType(receiver, _property) { + var _a; + let shapeId = null; + if (receiver.kind === 'Object' || receiver.kind === 'Function') { + shapeId = receiver.shapeId; + } + if (shapeId !== null) { + const shape = __classPrivateFieldGet(this, _Environment_shapes, "f").get(shapeId); + CompilerError.invariant(shape !== undefined, { + reason: `[HIR] Forget internal error: cannot resolve shape ${shapeId}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return (_a = shape.properties.get('*')) !== null && _a !== void 0 ? _a : null; + } + return null; + } + getPropertyType(receiver, property) { + var _a, _b, _c; + let shapeId = null; + if (receiver.kind === 'Object' || receiver.kind === 'Function') { + shapeId = receiver.shapeId; + } + if (shapeId !== null) { + const shape = __classPrivateFieldGet(this, _Environment_shapes, "f").get(shapeId); + CompilerError.invariant(shape !== undefined, { + reason: `[HIR] Forget internal error: cannot resolve shape ${shapeId}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (typeof property === 'string') { + return ((_b = (_a = shape.properties.get(property)) !== null && _a !== void 0 ? _a : shape.properties.get('*')) !== null && _b !== void 0 ? _b : (isHookName$2(property) ? __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this) : null)); + } + else { + return (_c = shape.properties.get('*')) !== null && _c !== void 0 ? _c : null; + } + } + else if (typeof property === 'string' && isHookName$2(property)) { + return __classPrivateFieldGet(this, _Environment_instances, "m", _Environment_getCustomHookType).call(this); + } + return null; + } + getFunctionSignature(type) { + const { shapeId } = type; + if (shapeId !== null) { + const shape = __classPrivateFieldGet(this, _Environment_shapes, "f").get(shapeId); + CompilerError.invariant(shape !== undefined, { + reason: `[HIR] Forget internal error: cannot resolve shape ${shapeId}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return shape.functionType; + } + return null; + } + addHoistedIdentifier(node) { + __classPrivateFieldGet(this, _Environment_contextIdentifiers, "f").add(node); + __classPrivateFieldGet(this, _Environment_hoistedIdentifiers, "f").add(node); + } +} +_Environment_globals = new WeakMap(), _Environment_shapes = new WeakMap(), _Environment_moduleTypes = new WeakMap(), _Environment_nextIdentifer = new WeakMap(), _Environment_nextBlock = new WeakMap(), _Environment_nextScope = new WeakMap(), _Environment_scope = new WeakMap(), _Environment_outlinedFunctions = new WeakMap(), _Environment_contextIdentifiers = new WeakMap(), _Environment_hoistedIdentifiers = new WeakMap(), _Environment_flowTypeEnvironment = new WeakMap(), _Environment_instances = new WeakSet(), _Environment_resolveModuleType = function _Environment_resolveModuleType(moduleName, loc) { + var _a; + let moduleType = __classPrivateFieldGet(this, _Environment_moduleTypes, "f").get(moduleName); + if (moduleType === undefined) { + const moduleTypeProvider = (_a = this.config.moduleTypeProvider) !== null && _a !== void 0 ? _a : defaultModuleTypeProvider; + if (moduleTypeProvider == null) { + return null; + } + const unparsedModuleConfig = moduleTypeProvider(moduleName); + if (unparsedModuleConfig != null) { + const parsedModuleConfig = TypeSchema.safeParse(unparsedModuleConfig); + if (!parsedModuleConfig.success) { + CompilerError.throwInvalidConfig({ + reason: `Could not parse module type, the configured \`moduleTypeProvider\` function returned an invalid module description`, + description: parsedModuleConfig.error.toString(), + loc, + }); + } + const moduleConfig = parsedModuleConfig.data; + moduleType = installTypeConfig(__classPrivateFieldGet(this, _Environment_globals, "f"), __classPrivateFieldGet(this, _Environment_shapes, "f"), moduleConfig, moduleName, loc); + } + else { + moduleType = null; + } + __classPrivateFieldGet(this, _Environment_moduleTypes, "f").set(moduleName, moduleType); + } + return moduleType; +}, _Environment_isKnownReactModule = function _Environment_isKnownReactModule(moduleName) { + return (moduleName.toLowerCase() === 'react' || + moduleName.toLowerCase() === 'react-dom'); +}, _Environment_getCustomHookType = function _Environment_getCustomHookType() { + if (this.config.enableAssumeHooksFollowRulesOfReact) { + return DefaultNonmutatingHook; + } + else { + return DefaultMutatingHook; + } +}; +Environment.knownReactModules = ['react', 'react-dom']; +const REANIMATED_MODULE_NAME = 'react-native-reanimated'; +function isHookName$2(name) { + return /^use[A-Z0-9]/.test(name); +} +function parseEnvironmentConfig(partialConfig) { + const config = EnvironmentConfigSchema.safeParse(partialConfig); + if (config.success) { + return Ok(config.data); + } + else { + return Err(config.error); + } +} +function validateEnvironmentConfig(partialConfig) { + const config = EnvironmentConfigSchema.safeParse(partialConfig); + if (config.success) { + return config.data; + } + CompilerError.throwInvalidConfig({ + reason: 'Could not validate environment config. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(config.error)}`, + loc: null, + suggestions: null, + }); +} +function tryParseExternalFunction(maybeExternalFunction) { + const externalFunction = ExternalFunctionSchema.safeParse(maybeExternalFunction); + if (externalFunction.success) { + return externalFunction.data; + } + CompilerError.throwInvalidConfig({ + reason: 'Could not parse external function. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(externalFunction.error)}`, + loc: null, + suggestions: null, + }); +} +const DEFAULT_EXPORT = 'default'; + +var _MergedBlocks_map; +function mergeConsecutiveBlocks(fn) { + const merged = new MergedBlocks(); + const fallthroughBlocks = new Set(); + for (const [, block] of fn.body.blocks) { + const fallthrough = terminalFallthrough(block.terminal); + if (fallthrough !== null) { + fallthroughBlocks.add(fallthrough); + } + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + mergeConsecutiveBlocks(instr.value.loweredFunc.func); + } + } + if (block.preds.size !== 1 || + block.kind !== 'block' || + fallthroughBlocks.has(block.id)) { + continue; + } + const originalPredecessorId = Array.from(block.preds)[0]; + const predecessorId = merged.get(originalPredecessorId); + const predecessor = fn.body.blocks.get(predecessorId); + CompilerError.invariant(predecessor !== undefined, { + reason: `Expected predecessor ${predecessorId} to exist`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (predecessor.terminal.kind !== 'goto' || predecessor.kind !== 'block') { + continue; + } + for (const phi of block.phis) { + CompilerError.invariant(phi.operands.size === 1, { + reason: `Found a block with a single predecessor but where a phi has multiple (${phi.operands.size}) operands`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + const operand = Array.from(phi.operands.values())[0]; + const lvalue = { + kind: 'Identifier', + identifier: phi.place.identifier, + effect: Effect.ConditionallyMutate, + reactive: false, + loc: GeneratedSource, + }; + const instr = { + id: predecessor.terminal.id, + lvalue: Object.assign({}, lvalue), + value: { + kind: 'LoadLocal', + place: Object.assign({}, operand), + loc: GeneratedSource, + }, + effects: [{ kind: 'Alias', from: Object.assign({}, operand), into: Object.assign({}, lvalue) }], + loc: GeneratedSource, + }; + predecessor.instructions.push(instr); + } + predecessor.instructions.push(...block.instructions); + predecessor.terminal = block.terminal; + merged.merge(block.id, predecessorId); + fn.body.blocks.delete(block.id); + } + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const [predecessorId, operand] of phi.operands) { + const mapped = merged.get(predecessorId); + if (mapped !== predecessorId) { + phi.operands.delete(predecessorId); + phi.operands.set(mapped, operand); + } + } + } + } + markPredecessors(fn.body); + for (const [, { terminal }] of fn.body.blocks) { + if (terminalHasFallthrough(terminal)) { + terminal.fallthrough = merged.get(terminal.fallthrough); + } + } +} +class MergedBlocks { + constructor() { + _MergedBlocks_map.set(this, new Map()); + } + merge(block, into) { + const target = this.get(into); + __classPrivateFieldGet(this, _MergedBlocks_map, "f").set(block, target); + } + get(block) { + var _a; + let current = block; + while (__classPrivateFieldGet(this, _MergedBlocks_map, "f").has(current)) { + current = (_a = __classPrivateFieldGet(this, _MergedBlocks_map, "f").get(current)) !== null && _a !== void 0 ? _a : current; + } + return current; + } +} +_MergedBlocks_map = new WeakMap(); + +var _DisjointSet_entries; +class DisjointSet { + constructor() { + _DisjointSet_entries.set(this, new Map()); + } + union(items) { + const first = items.shift(); + CompilerError.invariant(first != null, { + reason: 'Expected set to be non-empty', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + let root = this.find(first); + if (root == null) { + root = first; + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(first, first); + } + for (const item of items) { + let itemParent = __classPrivateFieldGet(this, _DisjointSet_entries, "f").get(item); + if (itemParent == null) { + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(item, root); + continue; + } + else if (itemParent === root) { + continue; + } + else { + let current = item; + while (itemParent !== root) { + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(current, root); + current = itemParent; + itemParent = __classPrivateFieldGet(this, _DisjointSet_entries, "f").get(current); + } + } + } + } + find(item) { + if (!__classPrivateFieldGet(this, _DisjointSet_entries, "f").has(item)) { + return null; + } + const parent = __classPrivateFieldGet(this, _DisjointSet_entries, "f").get(item); + if (parent === item) { + return item; + } + const root = this.find(parent); + __classPrivateFieldGet(this, _DisjointSet_entries, "f").set(item, root); + return root; + } + has(item) { + return __classPrivateFieldGet(this, _DisjointSet_entries, "f").has(item); + } + canonicalize() { + const entries = new Map(); + for (const item of __classPrivateFieldGet(this, _DisjointSet_entries, "f").keys()) { + const root = this.find(item); + entries.set(item, root); + } + return entries; + } + forEach(fn) { + for (const item of __classPrivateFieldGet(this, _DisjointSet_entries, "f").keys()) { + const group = this.find(item); + fn(item, group); + } + } + buildSets() { + const ids = new Map(); + const sets = new Map(); + this.forEach((identifier, groupIdentifier) => { + let id = ids.get(groupIdentifier); + if (id == null) { + id = ids.size; + ids.set(groupIdentifier, id); + } + let set = sets.get(id); + if (set === undefined) { + set = new Set(); + sets.set(id, set); + } + set.add(identifier); + }); + return [...sets.values()]; + } + get size() { + return __classPrivateFieldGet(this, _DisjointSet_entries, "f").size; + } +} +_DisjointSet_entries = new WeakMap(); + +function inferReactiveScopeVariables(fn) { + var _a, _b; + const scopeIdentifiers = findDisjointMutableValues(fn); + const scopes = new Map(); + scopeIdentifiers.forEach((identifier, groupIdentifier) => { + let scope = scopes.get(groupIdentifier); + if (scope === undefined) { + scope = { + id: fn.env.nextScopeId, + range: identifier.mutableRange, + dependencies: new Set(), + declarations: new Map(), + reassignments: new Set(), + earlyReturnValue: null, + merged: new Set(), + loc: identifier.loc, + }; + scopes.set(groupIdentifier, scope); + } + else { + if (scope.range.start === 0) { + scope.range.start = identifier.mutableRange.start; + } + else if (identifier.mutableRange.start !== 0) { + scope.range.start = makeInstructionId(Math.min(scope.range.start, identifier.mutableRange.start)); + } + scope.range.end = makeInstructionId(Math.max(scope.range.end, identifier.mutableRange.end)); + scope.loc = mergeLocation(scope.loc, identifier.loc); + } + identifier.scope = scope; + identifier.mutableRange = scope.range; + }); + let maxInstruction = 0; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + maxInstruction = makeInstructionId(Math.max(maxInstruction, instr.id)); + } + maxInstruction = makeInstructionId(Math.max(maxInstruction, block.terminal.id)); + } + for (const [, scope] of scopes) { + if (scope.range.start === 0 || + scope.range.end === 0 || + maxInstruction === 0 || + scope.range.end > maxInstruction + 1) { + (_b = (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, { + kind: 'hir', + name: 'InferReactiveScopeVariables (invalid scope)', + value: fn, + }); + CompilerError.invariant(false, { + reason: `Invalid mutable range for scope`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + description: `Scope @${scope.id} has range [${scope.range.start}:${scope.range.end}] but the valid range is [1:${maxInstruction + 1}]`, + }); + } + } +} +function mergeLocation(l, r) { + if (l === GeneratedSource) { + return r; + } + else if (r === GeneratedSource) { + return l; + } + else { + return { + filename: l.filename, + identifierName: l.identifierName, + start: { + index: Math.min(l.start.index, r.start.index), + line: Math.min(l.start.line, r.start.line), + column: Math.min(l.start.column, r.start.column), + }, + end: { + index: Math.max(l.end.index, r.end.index), + line: Math.max(l.end.line, r.end.line), + column: Math.max(l.end.column, r.end.column), + }, + }; + } +} +function isMutable(instr, place) { + return inRange(instr, place.identifier.mutableRange); +} +function inRange({ id }, range) { + return id >= range.start && id < range.end; +} +function mayAllocate(_env, instruction) { + const { value } = instruction; + switch (value.kind) { + case 'Destructure': { + return doesPatternContainSpreadElement(value.lvalue.pattern); + } + case 'PostfixUpdate': + case 'PrefixUpdate': + case 'Await': + case 'DeclareLocal': + case 'DeclareContext': + case 'StoreLocal': + case 'LoadGlobal': + case 'MetaProperty': + case 'TypeCastExpression': + case 'LoadLocal': + case 'LoadContext': + case 'StoreContext': + case 'PropertyDelete': + case 'ComputedLoad': + case 'ComputedDelete': + case 'JSXText': + case 'TemplateLiteral': + case 'Primitive': + case 'GetIterator': + case 'IteratorNext': + case 'NextPropertyOf': + case 'Debugger': + case 'StartMemoize': + case 'FinishMemoize': + case 'UnaryExpression': + case 'BinaryExpression': + case 'PropertyLoad': + case 'StoreGlobal': { + return false; + } + case 'TaggedTemplateExpression': + case 'CallExpression': + case 'MethodCall': { + return instruction.lvalue.identifier.type.kind !== 'Primitive'; + } + case 'RegExpLiteral': + case 'PropertyStore': + case 'ComputedStore': + case 'ArrayExpression': + case 'JsxExpression': + case 'JsxFragment': + case 'NewExpression': + case 'ObjectExpression': + case 'UnsupportedNode': + case 'ObjectMethod': + case 'FunctionExpression': { + return true; + } + default: { + assertExhaustive$1(value, `Unexpected value kind \`${value.kind}\``); + } + } +} +function findDisjointMutableValues(fn) { + var _a, _b; + const scopeIdentifiers = new DisjointSet(); + const declarations = new Map(); + function declareIdentifier(lvalue) { + if (!declarations.has(lvalue.identifier.declarationId)) { + declarations.set(lvalue.identifier.declarationId, lvalue.identifier); + } + } + for (const [_, block] of fn.body.blocks) { + for (const phi of block.phis) { + if (phi.place.identifier.mutableRange.start + 1 !== + phi.place.identifier.mutableRange.end && + phi.place.identifier.mutableRange.end > + ((_b = (_a = block.instructions.at(0)) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : block.terminal.id)) { + const operands = [phi.place.identifier]; + const declaration = declarations.get(phi.place.identifier.declarationId); + if (declaration !== undefined) { + operands.push(declaration); + } + for (const [_, phiId] of phi.operands) { + operands.push(phiId.identifier); + } + scopeIdentifiers.union(operands); + } + else if (fn.env.config.enableForest) { + for (const [, phiId] of phi.operands) { + scopeIdentifiers.union([phi.place.identifier, phiId.identifier]); + } + } + } + for (const instr of block.instructions) { + const operands = []; + const range = instr.lvalue.identifier.mutableRange; + if (range.end > range.start + 1 || mayAllocate(fn.env, instr)) { + operands.push(instr.lvalue.identifier); + } + if (instr.value.kind === 'DeclareLocal' || + instr.value.kind === 'DeclareContext') { + declareIdentifier(instr.value.lvalue.place); + } + else if (instr.value.kind === 'StoreLocal' || + instr.value.kind === 'StoreContext') { + declareIdentifier(instr.value.lvalue.place); + if (instr.value.lvalue.place.identifier.mutableRange.end > + instr.value.lvalue.place.identifier.mutableRange.start + 1) { + operands.push(instr.value.lvalue.place.identifier); + } + if (isMutable(instr, instr.value.value) && + instr.value.value.identifier.mutableRange.start > 0) { + operands.push(instr.value.value.identifier); + } + } + else if (instr.value.kind === 'Destructure') { + for (const place of eachPatternOperand(instr.value.lvalue.pattern)) { + declareIdentifier(place); + if (place.identifier.mutableRange.end > + place.identifier.mutableRange.start + 1) { + operands.push(place.identifier); + } + } + if (isMutable(instr, instr.value.value) && + instr.value.value.identifier.mutableRange.start > 0) { + operands.push(instr.value.value.identifier); + } + } + else if (instr.value.kind === 'MethodCall') { + for (const operand of eachInstructionOperand(instr)) { + if (isMutable(instr, operand) && + operand.identifier.mutableRange.start > 0) { + operands.push(operand.identifier); + } + } + operands.push(instr.value.property.identifier); + } + else { + for (const operand of eachInstructionOperand(instr)) { + if (isMutable(instr, operand) && + operand.identifier.mutableRange.start > 0) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + if (operand.identifier.type.kind === 'Primitive') { + continue; + } + } + operands.push(operand.identifier); + } + } + } + if (operands.length !== 0) { + scopeIdentifiers.union(operands); + } + } + } + return scopeIdentifiers; +} + +function mergeOverlappingReactiveScopesHIR(fn) { + const scopesInfo = collectScopeInfo(fn); + const joinedScopes = getOverlappingReactiveScopes(fn, scopesInfo); + joinedScopes.forEach((scope, groupScope) => { + if (scope !== groupScope) { + groupScope.range.start = makeInstructionId(Math.min(groupScope.range.start, scope.range.start)); + groupScope.range.end = makeInstructionId(Math.max(groupScope.range.end, scope.range.end)); + } + }); + for (const [place, originalScope] of scopesInfo.placeScopes) { + const nextScope = joinedScopes.find(originalScope); + if (nextScope !== null && nextScope !== originalScope) { + place.identifier.scope = nextScope; + } + } +} +function collectScopeInfo(fn) { + const scopeStarts = new Map(); + const scopeEnds = new Map(); + const placeScopes = new Map(); + function collectPlaceScope(place) { + const scope = place.identifier.scope; + if (scope != null) { + placeScopes.set(place, scope); + if (scope.range.start !== scope.range.end) { + getOrInsertDefault(scopeStarts, scope.range.start, new Set()).add(scope); + getOrInsertDefault(scopeEnds, scope.range.end, new Set()).add(scope); + } + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + collectPlaceScope(operand); + } + for (const operand of eachInstructionOperand(instr)) { + collectPlaceScope(operand); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + collectPlaceScope(operand); + } + } + return { + scopeStarts: [...scopeStarts.entries()] + .map(([id, scopes]) => ({ id, scopes })) + .sort((a, b) => b.id - a.id), + scopeEnds: [...scopeEnds.entries()] + .map(([id, scopes]) => ({ id, scopes })) + .sort((a, b) => b.id - a.id), + placeScopes, + }; +} +function visitInstructionId(id, { scopeEnds, scopeStarts }, { activeScopes, joined }) { + const scopeEndTop = scopeEnds.at(-1); + if (scopeEndTop != null && scopeEndTop.id <= id) { + scopeEnds.pop(); + const scopesSortedStartDescending = [...scopeEndTop.scopes].sort((a, b) => b.range.start - a.range.start); + for (const scope of scopesSortedStartDescending) { + const idx = activeScopes.indexOf(scope); + if (idx !== -1) { + if (idx !== activeScopes.length - 1) { + joined.union([scope, ...activeScopes.slice(idx + 1)]); + } + activeScopes.splice(idx, 1); + } + } + } + const scopeStartTop = scopeStarts.at(-1); + if (scopeStartTop != null && scopeStartTop.id <= id) { + scopeStarts.pop(); + const scopesSortedEndDescending = [...scopeStartTop.scopes].sort((a, b) => b.range.end - a.range.end); + activeScopes.push(...scopesSortedEndDescending); + for (let i = 1; i < scopesSortedEndDescending.length; i++) { + const prev = scopesSortedEndDescending[i - 1]; + const curr = scopesSortedEndDescending[i]; + if (prev.range.end === curr.range.end) { + joined.union([prev, curr]); + } + } + } +} +function visitPlace(id, place, { activeScopes, joined }) { + const placeScope = getPlaceScope(id, place); + if (placeScope != null && isMutable({ id }, place)) { + const placeScopeIdx = activeScopes.indexOf(placeScope); + if (placeScopeIdx !== -1 && placeScopeIdx !== activeScopes.length - 1) { + joined.union([placeScope, ...activeScopes.slice(placeScopeIdx + 1)]); + } + } +} +function getOverlappingReactiveScopes(fn, context) { + const state = { + joined: new DisjointSet(), + activeScopes: [], + }; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + visitInstructionId(instr.id, context, state); + for (const place of eachInstructionOperand(instr)) { + if ((instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') && + place.identifier.type.kind === 'Primitive') { + continue; + } + visitPlace(instr.id, place, state); + } + for (const place of eachInstructionLValue(instr)) { + visitPlace(instr.id, place, state); + } + } + visitInstructionId(block.terminal.id, context, state); + for (const place of eachTerminalOperand(block.terminal)) { + visitPlace(block.terminal.id, place, state); + } + } + return state.joined; +} + +function pruneUnusedLabelsHIR(fn) { + var _a; + const merged = []; + const rewrites = new Map(); + for (const [blockId, block] of fn.body.blocks) { + const terminal = block.terminal; + if (terminal.kind === 'label') { + const { block: nextId, fallthrough: fallthroughId } = terminal; + const next = fn.body.blocks.get(nextId); + const fallthrough = fn.body.blocks.get(fallthroughId); + if (next.terminal.kind === 'goto' && + next.terminal.variant === GotoVariant.Break && + next.terminal.block === fallthroughId) { + if (next.kind === 'block' && fallthrough.kind === 'block') { + merged.push({ + label: blockId, + next: nextId, + fallthrough: fallthroughId, + }); + } + } + } + } + for (const { label: originalLabelId, next: nextId, fallthrough: fallthroughId, } of merged) { + const labelId = (_a = rewrites.get(originalLabelId)) !== null && _a !== void 0 ? _a : originalLabelId; + const label = fn.body.blocks.get(labelId); + const next = fn.body.blocks.get(nextId); + const fallthrough = fn.body.blocks.get(fallthroughId); + CompilerError.invariant(next.phis.size === 0 && fallthrough.phis.size === 0, { + reason: 'Unexpected phis when merging label blocks', + description: null, + details: [ + { + kind: 'error', + loc: label.terminal.loc, + message: null, + }, + ], + }); + CompilerError.invariant(next.preds.size === 1 && + fallthrough.preds.size === 1 && + next.preds.has(originalLabelId) && + fallthrough.preds.has(nextId), { + reason: 'Unexpected block predecessors when merging label blocks', + description: null, + details: [ + { + kind: 'error', + loc: label.terminal.loc, + message: null, + }, + ], + }); + label.instructions.push(...next.instructions, ...fallthrough.instructions); + label.terminal = fallthrough.terminal; + fn.body.blocks.delete(nextId); + fn.body.blocks.delete(fallthroughId); + rewrites.set(fallthroughId, labelId); + } + for (const [_, block] of fn.body.blocks) { + for (const pred of block.preds) { + const rewritten = rewrites.get(pred); + if (rewritten != null) { + block.preds.delete(pred); + block.preds.add(rewritten); + } + } + } +} + +function isComponentDeclaration(node) { + return Object.prototype.hasOwnProperty.call(node, '__componentDeclaration'); +} + +function isHookDeclaration(node) { + return Object.prototype.hasOwnProperty.call(node, '__hookDeclaration'); +} + +const DEFAULT_IDENTIFIER_INFO = { + reassigned: false, + reassignedByInnerFn: false, + referencedByInnerFn: false, +}; +const withFunctionScope = { + enter: function (path, state) { + state.currentFn.push(path); + }, + exit: function (_, state) { + state.currentFn.pop(); + }, +}; +function findContextIdentifiers(func) { + const state = { + currentFn: [], + identifiers: new Map(), + }; + func.traverse({ + FunctionDeclaration: withFunctionScope, + FunctionExpression: withFunctionScope, + ArrowFunctionExpression: withFunctionScope, + ObjectMethod: withFunctionScope, + AssignmentExpression(path, state) { + var _a, _b; + const left = path.get('left'); + if (left.isLVal()) { + const currentFn = (_a = state.currentFn.at(-1)) !== null && _a !== void 0 ? _a : null; + handleAssignment(currentFn, state.identifiers, left); + } + else { + CompilerError.throwTodo({ + reason: `Unsupported syntax on the left side of an AssignmentExpression`, + description: `Expected an LVal, got: ${left.type}`, + loc: (_b = left.node.loc) !== null && _b !== void 0 ? _b : null, + }); + } + }, + UpdateExpression(path, state) { + var _a; + const argument = path.get('argument'); + const currentFn = (_a = state.currentFn.at(-1)) !== null && _a !== void 0 ? _a : null; + if (argument.isLVal()) { + handleAssignment(currentFn, state.identifiers, argument); + } + }, + Identifier(path, state) { + var _a; + const currentFn = (_a = state.currentFn.at(-1)) !== null && _a !== void 0 ? _a : null; + if (path.isReferencedIdentifier()) { + handleIdentifier$1(currentFn, state.identifiers, path); + } + }, + }, state); + const result = new Set(); + for (const [id, info] of state.identifiers.entries()) { + if (info.reassignedByInnerFn) { + result.add(id); + } + else if (info.reassigned && info.referencedByInnerFn) { + result.add(id); + } + } + return result; +} +function handleIdentifier$1(currentFn, identifiers, path) { + const name = path.node.name; + const binding = path.scope.getBinding(name); + if (binding == null) { + return; + } + const identifier = getOrInsertDefault(identifiers, binding.identifier, Object.assign({}, DEFAULT_IDENTIFIER_INFO)); + if (currentFn != null) { + const bindingAboveLambdaScope = currentFn.scope.parent.getBinding(name); + if (binding === bindingAboveLambdaScope) { + identifier.referencedByInnerFn = true; + } + } +} +function handleAssignment(currentFn, identifiers, lvalPath) { + var _a, _b, _c; + const lvalNode = lvalPath.node; + switch (lvalNode.type) { + case 'Identifier': { + const path = lvalPath; + const name = path.node.name; + const binding = path.scope.getBinding(name); + if (binding == null) { + break; + } + const state = getOrInsertDefault(identifiers, binding.identifier, Object.assign({}, DEFAULT_IDENTIFIER_INFO)); + state.reassigned = true; + if (currentFn != null) { + const bindingAboveLambdaScope = currentFn.scope.parent.getBinding(name); + if (binding === bindingAboveLambdaScope) { + state.reassignedByInnerFn = true; + } + } + break; + } + case 'ArrayPattern': { + const path = lvalPath; + for (const element of path.get('elements')) { + if (nonNull(element)) { + handleAssignment(currentFn, identifiers, element); + } + } + break; + } + case 'ObjectPattern': { + const path = lvalPath; + for (const property of path.get('properties')) { + if (property.isObjectProperty()) { + const valuePath = property.get('value'); + CompilerError.invariant(valuePath.isLVal(), { + reason: `[FindContextIdentifiers] Expected object property value to be an LVal, got: ${valuePath.type}`, + description: null, + details: [ + { + kind: 'error', + loc: (_a = valuePath.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + handleAssignment(currentFn, identifiers, valuePath); + } + else { + CompilerError.invariant(property.isRestElement(), { + reason: `[FindContextIdentifiers] Invalid assumptions for babel types.`, + description: null, + details: [ + { + kind: 'error', + loc: (_b = property.node.loc) !== null && _b !== void 0 ? _b : GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + handleAssignment(currentFn, identifiers, property); + } + } + break; + } + case 'AssignmentPattern': { + const path = lvalPath; + const left = path.get('left'); + handleAssignment(currentFn, identifiers, left); + break; + } + case 'RestElement': { + const path = lvalPath; + handleAssignment(currentFn, identifiers, path.get('argument')); + break; + } + case 'MemberExpression': { + break; + } + default: { + CompilerError.throwTodo({ + reason: `[FindContextIdentifiers] Cannot handle Object destructuring assignment target ${lvalNode.type}`, + description: null, + loc: (_c = lvalNode.loc) !== null && _c !== void 0 ? _c : GeneratedSource, + suggestions: null, + }); + } + } +} +function nonNull(t) { + return t.node != null; +} + +function eliminateRedundantPhi(fn, sharedRewrites) { + const ir = fn.body; + const rewrites = sharedRewrites != null ? sharedRewrites : new Map(); + let hasBackEdge = false; + const visited = new Set(); + let size = rewrites.size; + do { + size = rewrites.size; + for (const [blockId, block] of ir.blocks) { + if (!hasBackEdge) { + for (const predId of block.preds) { + if (!visited.has(predId)) { + hasBackEdge = true; + } + } + } + visited.add(blockId); + phis: for (const phi of block.phis) { + phi.operands.forEach((place, _) => rewritePlace(place, rewrites)); + let same = null; + for (const [_, operand] of phi.operands) { + if ((same !== null && operand.identifier.id === same.id) || + operand.identifier.id === phi.place.identifier.id) { + continue; + } + else if (same !== null) { + continue phis; + } + else { + same = operand.identifier; + } + } + CompilerError.invariant(same !== null, { + reason: 'Expected phis to be non-empty', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + rewrites.set(phi.place.identifier, same); + block.phis.delete(phi); + } + for (const instr of block.instructions) { + for (const place of eachInstructionLValue(instr)) { + rewritePlace(place, rewrites); + } + for (const place of eachInstructionOperand(instr)) { + rewritePlace(place, rewrites); + } + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + const { context } = instr.value.loweredFunc.func; + for (const place of context) { + rewritePlace(place, rewrites); + } + eliminateRedundantPhi(instr.value.loweredFunc.func, rewrites); + } + } + const { terminal } = block; + for (const place of eachTerminalOperand(terminal)) { + rewritePlace(place, rewrites); + } + } + } while (rewrites.size > size && hasBackEdge); +} +function rewritePlace(place, rewrites) { + const rewrite = rewrites.get(place.identifier); + if (rewrite != null) { + place.identifier = rewrite; + } +} + +var _SSABuilder_states, _SSABuilder_current, _SSABuilder_blocks, _SSABuilder_env, _SSABuilder_unknown, _SSABuilder_context; +class SSABuilder { + constructor(env, blocks) { + _SSABuilder_states.set(this, new Map()); + _SSABuilder_current.set(this, null); + this.unsealedPreds = new Map(); + _SSABuilder_blocks.set(this, void 0); + _SSABuilder_env.set(this, void 0); + _SSABuilder_unknown.set(this, new Set()); + _SSABuilder_context.set(this, new Set()); + __classPrivateFieldSet(this, _SSABuilder_blocks, new Map(blocks), "f"); + __classPrivateFieldSet(this, _SSABuilder_env, env, "f"); + } + get nextSsaId() { + return __classPrivateFieldGet(this, _SSABuilder_env, "f").nextIdentifierId; + } + defineFunction(func) { + for (const [id, block] of func.body.blocks) { + __classPrivateFieldGet(this, _SSABuilder_blocks, "f").set(id, block); + } + } + enter(fn) { + const current = __classPrivateFieldGet(this, _SSABuilder_current, "f"); + fn(); + __classPrivateFieldSet(this, _SSABuilder_current, current, "f"); + } + state() { + CompilerError.invariant(__classPrivateFieldGet(this, _SSABuilder_current, "f") !== null, { + reason: 'we need to be in a block to access state!', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return __classPrivateFieldGet(this, _SSABuilder_states, "f").get(__classPrivateFieldGet(this, _SSABuilder_current, "f")); + } + makeId(oldId) { + return { + id: this.nextSsaId, + declarationId: oldId.declarationId, + name: oldId.name, + mutableRange: { + start: makeInstructionId(0), + end: makeInstructionId(0), + }, + scope: null, + type: makeType(), + loc: oldId.loc, + }; + } + defineContext(oldPlace) { + const newPlace = this.definePlace(oldPlace); + __classPrivateFieldGet(this, _SSABuilder_context, "f").add(oldPlace.identifier); + return newPlace; + } + definePlace(oldPlace) { + const oldId = oldPlace.identifier; + if (__classPrivateFieldGet(this, _SSABuilder_unknown, "f").has(oldId)) { + CompilerError.throwTodo({ + reason: `[hoisting] EnterSSA: Expected identifier to be defined before being used`, + description: `Identifier ${printIdentifier(oldId)} is undefined`, + loc: oldPlace.loc, + suggestions: null, + }); + } + if (__classPrivateFieldGet(this, _SSABuilder_context, "f").has(oldId)) { + return this.getPlace(oldPlace); + } + const newId = this.makeId(oldId); + this.state().defs.set(oldId, newId); + return Object.assign(Object.assign({}, oldPlace), { identifier: newId }); + } + getPlace(oldPlace) { + const newId = this.getIdAt(oldPlace, __classPrivateFieldGet(this, _SSABuilder_current, "f").id); + return Object.assign(Object.assign({}, oldPlace), { identifier: newId }); + } + getIdAt(oldPlace, blockId) { + const block = __classPrivateFieldGet(this, _SSABuilder_blocks, "f").get(blockId); + const state = __classPrivateFieldGet(this, _SSABuilder_states, "f").get(block); + if (state.defs.has(oldPlace.identifier)) { + return state.defs.get(oldPlace.identifier); + } + if (block.preds.size == 0) { + __classPrivateFieldGet(this, _SSABuilder_unknown, "f").add(oldPlace.identifier); + return oldPlace.identifier; + } + if (this.unsealedPreds.get(block) > 0) { + const newId = this.makeId(oldPlace.identifier); + state.incompletePhis.push({ + oldPlace, + newPlace: Object.assign(Object.assign({}, oldPlace), { identifier: newId }), + }); + state.defs.set(oldPlace.identifier, newId); + return newId; + } + if (block.preds.size == 1) { + const [pred] = block.preds; + const newId = this.getIdAt(oldPlace, pred); + state.defs.set(oldPlace.identifier, newId); + return newId; + } + const newId = this.makeId(oldPlace.identifier); + state.defs.set(oldPlace.identifier, newId); + return this.addPhi(block, oldPlace, Object.assign(Object.assign({}, oldPlace), { identifier: newId })); + } + addPhi(block, oldPlace, newPlace) { + const predDefs = new Map(); + for (const predBlockId of block.preds) { + const predId = this.getIdAt(oldPlace, predBlockId); + predDefs.set(predBlockId, Object.assign(Object.assign({}, oldPlace), { identifier: predId })); + } + const phi = { + kind: 'Phi', + place: newPlace, + operands: predDefs, + }; + block.phis.add(phi); + return newPlace.identifier; + } + fixIncompletePhis(block) { + const state = __classPrivateFieldGet(this, _SSABuilder_states, "f").get(block); + for (const phi of state.incompletePhis) { + this.addPhi(block, phi.oldPlace, phi.newPlace); + } + } + startBlock(block) { + __classPrivateFieldSet(this, _SSABuilder_current, block, "f"); + __classPrivateFieldGet(this, _SSABuilder_states, "f").set(block, { + defs: new Map(), + incompletePhis: [], + }); + } + print() { + var _a; + const text = []; + for (const [block, state] of __classPrivateFieldGet(this, _SSABuilder_states, "f")) { + text.push(`bb${block.id}:`); + for (const [oldId, newId] of state.defs) { + text.push(` \$${printIdentifier(oldId)}: \$${printIdentifier(newId)}`); + } + for (const incompletePhi of state.incompletePhis) { + text.push(` iphi \$${printPlace(incompletePhi.newPlace)} = \$${printPlace(incompletePhi.oldPlace)}`); + } + } + text.push(`current block: bb${(_a = __classPrivateFieldGet(this, _SSABuilder_current, "f")) === null || _a === void 0 ? void 0 : _a.id}`); + console.log(text.join('\n')); + } +} +_SSABuilder_states = new WeakMap(), _SSABuilder_current = new WeakMap(), _SSABuilder_blocks = new WeakMap(), _SSABuilder_env = new WeakMap(), _SSABuilder_unknown = new WeakMap(), _SSABuilder_context = new WeakMap(); +function enterSSA(func) { + const builder = new SSABuilder(func.env, func.body.blocks); + enterSSAImpl(func, builder, func.body.entry); +} +function enterSSAImpl(func, builder, rootEntry) { + const visitedBlocks = new Set(); + for (const [blockId, block] of func.body.blocks) { + CompilerError.invariant(!visitedBlocks.has(block), { + reason: `found a cycle! visiting bb${block.id} again`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + visitedBlocks.add(block); + builder.startBlock(block); + if (blockId === rootEntry) { + CompilerError.invariant(func.context.length === 0, { + reason: `Expected function context to be empty for outer function declarations`, + description: null, + details: [ + { + kind: 'error', + loc: func.loc, + message: null, + }, + ], + suggestions: null, + }); + func.params = func.params.map(param => { + if (param.kind === 'Identifier') { + return builder.definePlace(param); + } + else { + return { + kind: 'Spread', + place: builder.definePlace(param.place), + }; + } + }); + } + for (const instr of block.instructions) { + mapInstructionOperands(instr, place => builder.getPlace(place)); + mapInstructionLValues(instr, lvalue => builder.definePlace(lvalue)); + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + const loweredFunc = instr.value.loweredFunc.func; + const entry = loweredFunc.body.blocks.get(loweredFunc.body.entry); + CompilerError.invariant(entry.preds.size === 0, { + reason: 'Expected function expression entry block to have zero predecessors', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + entry.preds.add(blockId); + builder.defineFunction(loweredFunc); + builder.enter(() => { + loweredFunc.params = loweredFunc.params.map(param => { + if (param.kind === 'Identifier') { + return builder.definePlace(param); + } + else { + return { + kind: 'Spread', + place: builder.definePlace(param.place), + }; + } + }); + enterSSAImpl(loweredFunc, builder, rootEntry); + }); + entry.preds.clear(); + } + } + mapTerminalOperands(block.terminal, place => builder.getPlace(place)); + for (const outputId of eachTerminalSuccessor(block.terminal)) { + const output = func.body.blocks.get(outputId); + let count; + if (builder.unsealedPreds.has(output)) { + count = builder.unsealedPreds.get(output) - 1; + } + else { + count = output.preds.size - 1; + } + builder.unsealedPreds.set(output, count); + if (count === 0 && visitedBlocks.has(output)) { + builder.fixIncompletePhis(output); + } + } + } +} + +function rewriteInstructionKindsBasedOnReassignment(fn) { + const declarations = new Map(); + for (const param of fn.params) { + let place = param.kind === 'Identifier' ? param : param.place; + if (place.identifier.name !== null) { + declarations.set(place.identifier.declarationId, { + kind: InstructionKind.Let, + place, + }); + } + } + for (const place of fn.context) { + if (place.identifier.name !== null) { + declarations.set(place.identifier.declarationId, { + kind: InstructionKind.Let, + place, + }); + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'DeclareLocal': { + const lvalue = value.lvalue; + CompilerError.invariant(!declarations.has(lvalue.place.identifier.declarationId), { + reason: `Expected variable not to be defined prior to declaration`, + description: `${printPlace(lvalue.place)} was already defined`, + details: [ + { + kind: 'error', + loc: lvalue.place.loc, + message: null, + }, + ], + }); + declarations.set(lvalue.place.identifier.declarationId, lvalue); + break; + } + case 'StoreLocal': { + const lvalue = value.lvalue; + if (lvalue.place.identifier.name !== null) { + const declaration = declarations.get(lvalue.place.identifier.declarationId); + if (declaration === undefined) { + CompilerError.invariant(!declarations.has(lvalue.place.identifier.declarationId), { + reason: `Expected variable not to be defined prior to declaration`, + description: `${printPlace(lvalue.place)} was already defined`, + details: [ + { + kind: 'error', + loc: lvalue.place.loc, + message: null, + }, + ], + }); + declarations.set(lvalue.place.identifier.declarationId, lvalue); + lvalue.kind = InstructionKind.Const; + } + else { + declaration.kind = InstructionKind.Let; + lvalue.kind = InstructionKind.Reassign; + } + } + break; + } + case 'Destructure': { + const lvalue = value.lvalue; + let kind = null; + for (const place of eachPatternOperand(lvalue.pattern)) { + if (place.identifier.name === null) { + CompilerError.invariant(kind === null || kind === InstructionKind.Const, { + reason: `Expected consistent kind for destructuring`, + description: `other places were \`${kind}\` but '${printPlace(place)}' is const`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'Expected consistent kind for destructuring', + }, + ], + suggestions: null, + }); + kind = InstructionKind.Const; + } + else { + const declaration = declarations.get(place.identifier.declarationId); + if (declaration === undefined) { + CompilerError.invariant(block.kind !== 'value', { + reason: `TODO: Handle reassignment in a value block where the original declaration was removed by dead code elimination (DCE)`, + description: null, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + declarations.set(place.identifier.declarationId, lvalue); + CompilerError.invariant(kind === null || kind === InstructionKind.Const, { + reason: `Expected consistent kind for destructuring`, + description: `Other places were \`${kind}\` but '${printPlace(place)}' is const`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'Expected consistent kind for destructuring', + }, + ], + suggestions: null, + }); + kind = InstructionKind.Const; + } + else { + CompilerError.invariant(kind === null || kind === InstructionKind.Reassign, { + reason: `Expected consistent kind for destructuring`, + description: `Other places were \`${kind}\` but '${printPlace(place)}' is reassigned`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'Expected consistent kind for destructuring', + }, + ], + suggestions: null, + }); + kind = InstructionKind.Reassign; + declaration.kind = InstructionKind.Let; + } + } + } + CompilerError.invariant(kind !== null, { + reason: 'Expected at least one operand', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + lvalue.kind = kind; + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + const lvalue = value.lvalue; + const declaration = declarations.get(lvalue.identifier.declarationId); + CompilerError.invariant(declaration !== undefined, { + reason: `Expected variable to have been defined`, + description: `No declaration for ${printPlace(lvalue)}`, + details: [ + { + kind: 'error', + loc: lvalue.loc, + message: null, + }, + ], + }); + declaration.kind = InstructionKind.Let; + break; + } + } + } + } +} + +function constantPropagation(fn) { + const constants = new Map(); + constantPropagationImpl(fn, constants); +} +function constantPropagationImpl(fn, constants) { + while (true) { + const haveTerminalsChanged = applyConstantPropagation(fn, constants); + if (!haveTerminalsChanged) { + break; + } + reversePostorderBlocks(fn.body); + removeUnreachableForUpdates(fn.body); + removeDeadDoWhileStatements(fn.body); + removeUnnecessaryTryCatch(fn.body); + markInstructionIds(fn.body); + markPredecessors(fn.body); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const [predecessor] of phi.operands) { + if (!block.preds.has(predecessor)) { + phi.operands.delete(predecessor); + } + } + } + } + eliminateRedundantPhi(fn); + mergeConsecutiveBlocks(fn); + assertConsistentIdentifiers(fn); + assertTerminalSuccessorsExist(fn); + } +} +function applyConstantPropagation(fn, constants) { + let hasChanges = false; + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + let value = evaluatePhi(phi, constants); + if (value !== null) { + constants.set(phi.place.identifier.id, value); + } + } + for (let i = 0; i < block.instructions.length; i++) { + if (block.kind === 'sequence' && i === block.instructions.length - 1) { + continue; + } + const instr = block.instructions[i]; + const value = evaluateInstruction(constants, instr); + if (value !== null) { + constants.set(instr.lvalue.identifier.id, value); + } + } + const terminal = block.terminal; + switch (terminal.kind) { + case 'if': { + const testValue = read(constants, terminal.test); + if (testValue !== null && testValue.kind === 'Primitive') { + hasChanges = true; + const targetBlockId = testValue.value + ? terminal.consequent + : terminal.alternate; + block.terminal = { + kind: 'goto', + variant: GotoVariant.Break, + block: targetBlockId, + id: terminal.id, + loc: terminal.loc, + }; + } + break; + } + } + } + return hasChanges; +} +function evaluatePhi(phi, constants) { + var _a; + let value = null; + for (const [, operand] of phi.operands) { + const operandValue = (_a = constants.get(operand.identifier.id)) !== null && _a !== void 0 ? _a : null; + if (operandValue === null) { + return null; + } + if (value === null) { + value = operandValue; + continue; + } + if (operandValue.kind !== value.kind) { + return null; + } + switch (operandValue.kind) { + case 'Primitive': { + CompilerError.invariant(value.kind === 'Primitive', { + reason: 'value kind expected to be Primitive', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (operandValue.value !== value.value) { + return null; + } + break; + } + case 'LoadGlobal': { + CompilerError.invariant(value.kind === 'LoadGlobal', { + reason: 'value kind expected to be LoadGlobal', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (operandValue.binding.name !== value.binding.name) { + return null; + } + break; + } + default: + return null; + } + } + return value; +} +function evaluateInstruction(constants, instr) { + const value = instr.value; + switch (value.kind) { + case 'Primitive': { + return value; + } + case 'LoadGlobal': { + return value; + } + case 'ComputedLoad': { + const property = read(constants, value.property); + if (property !== null && + property.kind === 'Primitive' && + ((typeof property.value === 'string' && + libExports$1.isValidIdentifier(property.value)) || + typeof property.value === 'number')) { + const nextValue = { + kind: 'PropertyLoad', + loc: value.loc, + property: makePropertyLiteral(property.value), + object: value.object, + }; + instr.value = nextValue; + } + return null; + } + case 'ComputedStore': { + const property = read(constants, value.property); + if (property !== null && + property.kind === 'Primitive' && + ((typeof property.value === 'string' && + libExports$1.isValidIdentifier(property.value)) || + typeof property.value === 'number')) { + const nextValue = { + kind: 'PropertyStore', + loc: value.loc, + property: makePropertyLiteral(property.value), + object: value.object, + value: value.value, + }; + instr.value = nextValue; + } + return null; + } + case 'PostfixUpdate': { + const previous = read(constants, value.value); + if (previous !== null && + previous.kind === 'Primitive' && + typeof previous.value === 'number') { + const next = value.operation === '++' ? previous.value + 1 : previous.value - 1; + constants.set(value.lvalue.identifier.id, { + kind: 'Primitive', + value: next, + loc: value.loc, + }); + return previous; + } + return null; + } + case 'PrefixUpdate': { + const previous = read(constants, value.value); + if (previous !== null && + previous.kind === 'Primitive' && + typeof previous.value === 'number') { + const next = { + kind: 'Primitive', + value: value.operation === '++' ? previous.value + 1 : previous.value - 1, + loc: value.loc, + }; + constants.set(value.lvalue.identifier.id, next); + return next; + } + return null; + } + case 'UnaryExpression': { + switch (value.operator) { + case '!': { + const operand = read(constants, value.value); + if (operand !== null && operand.kind === 'Primitive') { + const result = { + kind: 'Primitive', + value: !operand.value, + loc: value.loc, + }; + instr.value = result; + return result; + } + return null; + } + case '-': { + const operand = read(constants, value.value); + if (operand !== null && + operand.kind === 'Primitive' && + typeof operand.value === 'number') { + const result = { + kind: 'Primitive', + value: operand.value * -1, + loc: value.loc, + }; + instr.value = result; + return result; + } + return null; + } + default: + return null; + } + } + case 'BinaryExpression': { + const lhsValue = read(constants, value.left); + const rhsValue = read(constants, value.right); + if (lhsValue !== null && + rhsValue !== null && + lhsValue.kind === 'Primitive' && + rhsValue.kind === 'Primitive') { + const lhs = lhsValue.value; + const rhs = rhsValue.value; + let result = null; + switch (value.operator) { + case '+': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs + rhs, loc: value.loc }; + } + else if (typeof lhs === 'string' && typeof rhs === 'string') { + result = { kind: 'Primitive', value: lhs + rhs, loc: value.loc }; + } + break; + } + case '-': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs - rhs, loc: value.loc }; + } + break; + } + case '*': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs * rhs, loc: value.loc }; + } + break; + } + case '/': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs / rhs, loc: value.loc }; + } + break; + } + case '|': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs | rhs, loc: value.loc }; + } + break; + } + case '&': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs & rhs, loc: value.loc }; + } + break; + } + case '^': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs ^ rhs, loc: value.loc }; + } + break; + } + case '<<': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs << rhs, loc: value.loc }; + } + break; + } + case '>>': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs >> rhs, loc: value.loc }; + } + break; + } + case '>>>': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { + kind: 'Primitive', + value: lhs >>> rhs, + loc: value.loc, + }; + } + break; + } + case '%': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs % rhs, loc: value.loc }; + } + break; + } + case '**': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: Math.pow(lhs, rhs), loc: value.loc }; + } + break; + } + case '<': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs < rhs, loc: value.loc }; + } + break; + } + case '<=': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs <= rhs, loc: value.loc }; + } + break; + } + case '>': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs > rhs, loc: value.loc }; + } + break; + } + case '>=': { + if (typeof lhs === 'number' && typeof rhs === 'number') { + result = { kind: 'Primitive', value: lhs >= rhs, loc: value.loc }; + } + break; + } + case '==': { + result = { kind: 'Primitive', value: lhs == rhs, loc: value.loc }; + break; + } + case '===': { + result = { kind: 'Primitive', value: lhs === rhs, loc: value.loc }; + break; + } + case '!=': { + result = { kind: 'Primitive', value: lhs != rhs, loc: value.loc }; + break; + } + case '!==': { + result = { kind: 'Primitive', value: lhs !== rhs, loc: value.loc }; + break; + } + } + if (result !== null) { + instr.value = result; + return result; + } + } + return null; + } + case 'PropertyLoad': { + const objectValue = read(constants, value.object); + if (objectValue !== null) { + if (objectValue.kind === 'Primitive' && + typeof objectValue.value === 'string' && + value.property === 'length') { + const result = { + kind: 'Primitive', + value: objectValue.value.length, + loc: value.loc, + }; + instr.value = result; + return result; + } + } + return null; + } + case 'TemplateLiteral': { + if (value.subexprs.length === 0) { + const result = { + kind: 'Primitive', + value: value.quasis.map(q => q.cooked).join(''), + loc: value.loc, + }; + instr.value = result; + return result; + } + if (value.subexprs.length !== value.quasis.length - 1) { + return null; + } + if (value.quasis.some(q => q.cooked === undefined)) { + return null; + } + let quasiIndex = 0; + let resultString = value.quasis[quasiIndex].cooked; + ++quasiIndex; + for (const subExpr of value.subexprs) { + const subExprValue = read(constants, subExpr); + if (!subExprValue || subExprValue.kind !== 'Primitive') { + return null; + } + const expressionValue = subExprValue.value; + if (typeof expressionValue !== 'number' && + typeof expressionValue !== 'string' && + typeof expressionValue !== 'boolean' && + !(typeof expressionValue === 'object' && expressionValue === null)) { + return null; + } + const suffix = value.quasis[quasiIndex].cooked; + ++quasiIndex; + if (suffix === undefined) { + return null; + } + resultString = resultString.concat(expressionValue, suffix); + } + const result = { + kind: 'Primitive', + value: resultString, + loc: value.loc, + }; + instr.value = result; + return result; + } + case 'LoadLocal': { + const placeValue = read(constants, value.place); + if (placeValue !== null) { + instr.value = placeValue; + } + return placeValue; + } + case 'StoreLocal': { + const placeValue = read(constants, value.value); + if (placeValue !== null) { + constants.set(value.lvalue.place.identifier.id, placeValue); + } + return placeValue; + } + case 'ObjectMethod': + case 'FunctionExpression': { + constantPropagationImpl(value.loweredFunc.func, constants); + return null; + } + default: { + return null; + } + } +} +function read(constants, place) { + var _a; + return (_a = constants.get(place.identifier.id)) !== null && _a !== void 0 ? _a : null; +} + +function deadCodeElimination(fn) { + const state = findReferencedIdentifiers(fn); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + if (!state.isIdOrNameUsed(phi.place.identifier)) { + block.phis.delete(phi); + } + } + retainWhere(block.instructions, instr => state.isIdOrNameUsed(instr.lvalue.identifier)); + for (let i = 0; i < block.instructions.length; i++) { + const isBlockValue = block.kind !== 'block' && i === block.instructions.length - 1; + if (!isBlockValue) { + rewriteInstruction(block.instructions[i], state); + } + } + } + retainWhere(fn.context, contextVar => state.isIdOrNameUsed(contextVar.identifier)); +} +let State$2 = class State { + constructor() { + this.named = new Set(); + this.identifiers = new Set(); + } + reference(identifier) { + this.identifiers.add(identifier.id); + if (identifier.name !== null) { + this.named.add(identifier.name.value); + } + } + isIdOrNameUsed(identifier) { + return (this.identifiers.has(identifier.id) || + (identifier.name !== null && this.named.has(identifier.name.value))); + } + isIdUsed(identifier) { + return this.identifiers.has(identifier.id); + } + get count() { + return this.identifiers.size; + } +}; +function findReferencedIdentifiers(fn) { + const hasLoop = hasBackEdge(fn); + const reversedBlocks = [...fn.body.blocks.values()].reverse(); + const state = new State$2(); + let size = state.count; + do { + size = state.count; + for (const block of reversedBlocks) { + for (const operand of eachTerminalOperand(block.terminal)) { + state.reference(operand.identifier); + } + for (let i = block.instructions.length - 1; i >= 0; i--) { + const instr = block.instructions[i]; + const isBlockValue = block.kind !== 'block' && i === block.instructions.length - 1; + if (isBlockValue) { + state.reference(instr.lvalue.identifier); + for (const place of eachInstructionValueOperand(instr.value)) { + state.reference(place.identifier); + } + } + else if (state.isIdOrNameUsed(instr.lvalue.identifier) || + !pruneableValue(instr.value, state)) { + state.reference(instr.lvalue.identifier); + if (instr.value.kind === 'StoreLocal') { + if (instr.value.lvalue.kind === InstructionKind.Reassign || + state.isIdUsed(instr.value.lvalue.place.identifier)) { + state.reference(instr.value.value.identifier); + } + } + else { + for (const operand of eachInstructionValueOperand(instr.value)) { + state.reference(operand.identifier); + } + } + } + } + for (const phi of block.phis) { + if (state.isIdOrNameUsed(phi.place.identifier)) { + for (const [_pred, operand] of phi.operands) { + state.reference(operand.identifier); + } + } + } + } + } while (state.count > size && hasLoop); + return state; +} +function rewriteInstruction(instr, state) { + if (instr.value.kind === 'Destructure') { + switch (instr.value.lvalue.pattern.kind) { + case 'ArrayPattern': { + let lastEntryIndex = 0; + const items = instr.value.lvalue.pattern.items; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (item.kind === 'Identifier') { + if (!state.isIdOrNameUsed(item.identifier)) { + items[i] = { kind: 'Hole' }; + } + else { + lastEntryIndex = i; + } + } + else if (item.kind === 'Spread') { + if (!state.isIdOrNameUsed(item.place.identifier)) { + items[i] = { kind: 'Hole' }; + } + else { + lastEntryIndex = i; + } + } + } + items.length = lastEntryIndex + 1; + break; + } + case 'ObjectPattern': { + let nextProperties = null; + for (const property of instr.value.lvalue.pattern.properties) { + if (property.kind === 'ObjectProperty') { + if (state.isIdOrNameUsed(property.place.identifier)) { + nextProperties !== null && nextProperties !== void 0 ? nextProperties : (nextProperties = []); + nextProperties.push(property); + } + } + else { + if (state.isIdOrNameUsed(property.place.identifier)) { + nextProperties = null; + break; + } + } + } + if (nextProperties !== null) { + instr.value.lvalue.pattern.properties = nextProperties; + } + break; + } + default: { + assertExhaustive$1(instr.value.lvalue.pattern, `Unexpected pattern kind '${instr.value.lvalue.pattern.kind}'`); + } + } + } + else if (instr.value.kind === 'StoreLocal') { + if (instr.value.lvalue.kind !== InstructionKind.Reassign && + !state.isIdUsed(instr.value.lvalue.place.identifier)) { + instr.value = { + kind: 'DeclareLocal', + lvalue: instr.value.lvalue, + type: instr.value.type, + loc: instr.value.loc, + }; + } + } +} +function pruneableValue(value, state) { + switch (value.kind) { + case 'DeclareLocal': { + return !state.isIdOrNameUsed(value.lvalue.place.identifier); + } + case 'StoreLocal': { + if (value.lvalue.kind === InstructionKind.Reassign) { + return !state.isIdUsed(value.lvalue.place.identifier); + } + return !state.isIdOrNameUsed(value.lvalue.place.identifier); + } + case 'Destructure': { + let isIdOrNameUsed = false; + let isIdUsed = false; + for (const place of eachPatternOperand(value.lvalue.pattern)) { + if (state.isIdUsed(place.identifier)) { + isIdOrNameUsed = true; + isIdUsed = true; + } + else if (state.isIdOrNameUsed(place.identifier)) { + isIdOrNameUsed = true; + } + } + if (value.lvalue.kind === InstructionKind.Reassign) { + return !isIdUsed; + } + else { + return !isIdOrNameUsed; + } + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + return !state.isIdUsed(value.lvalue.identifier); + } + case 'Debugger': { + return false; + } + case 'Await': + case 'CallExpression': + case 'ComputedDelete': + case 'ComputedStore': + case 'PropertyDelete': + case 'MethodCall': + case 'PropertyStore': + case 'StoreGlobal': { + return false; + } + case 'NewExpression': + case 'UnsupportedNode': + case 'TaggedTemplateExpression': { + return false; + } + case 'GetIterator': + case 'NextPropertyOf': + case 'IteratorNext': { + return false; + } + case 'LoadContext': + case 'DeclareContext': + case 'StoreContext': { + return false; + } + case 'StartMemoize': + case 'FinishMemoize': { + return false; + } + case 'RegExpLiteral': + case 'MetaProperty': + case 'LoadGlobal': + case 'ArrayExpression': + case 'BinaryExpression': + case 'ComputedLoad': + case 'ObjectMethod': + case 'FunctionExpression': + case 'LoadLocal': + case 'JsxExpression': + case 'JsxFragment': + case 'JSXText': + case 'ObjectExpression': + case 'Primitive': + case 'PropertyLoad': + case 'TemplateLiteral': + case 'TypeCastExpression': + case 'UnaryExpression': { + return true; + } + default: { + assertExhaustive$1(value, `Unexepcted value kind \`${value.kind}\``); + } + } +} +function hasBackEdge(fn) { + return findBlocksWithBackEdges(fn).size > 0; +} +function findBlocksWithBackEdges(fn) { + const visited = new Set(); + const blocks = new Set(); + for (const [blockId, block] of fn.body.blocks) { + for (const predId of block.preds) { + if (!visited.has(predId)) { + blocks.add(blockId); + } + } + visited.add(blockId); + } + return blocks; +} + +function pruneMaybeThrows(fn) { + const terminalMapping = pruneMaybeThrowsImpl(fn); + if (terminalMapping) { + reversePostorderBlocks(fn.body); + removeUnreachableForUpdates(fn.body); + removeDeadDoWhileStatements(fn.body); + removeUnnecessaryTryCatch(fn.body); + markInstructionIds(fn.body); + mergeConsecutiveBlocks(fn); + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const [predecessor, operand] of phi.operands) { + if (!block.preds.has(predecessor)) { + const mappedTerminal = terminalMapping.get(predecessor); + CompilerError.invariant(mappedTerminal != null, { + reason: `Expected non-existing phi operand's predecessor to have been mapped to a new terminal`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + description: `Could not find mapping for predecessor bb${predecessor} in block bb${block.id} for phi ${printPlace(phi.place)}`, + suggestions: null, + }); + phi.operands.delete(predecessor); + phi.operands.set(mappedTerminal, operand); + } + } + } + } + assertConsistentIdentifiers(fn); + assertTerminalSuccessorsExist(fn); + } +} +function pruneMaybeThrowsImpl(fn) { + var _a; + const terminalMapping = new Map(); + for (const [_, block] of fn.body.blocks) { + const terminal = block.terminal; + if (terminal.kind !== 'maybe-throw') { + continue; + } + const canThrow = block.instructions.some(instr => instructionMayThrow(instr)); + if (!canThrow) { + const source = (_a = terminalMapping.get(block.id)) !== null && _a !== void 0 ? _a : block.id; + terminalMapping.set(terminal.continuation, source); + block.terminal = { + kind: 'goto', + block: terminal.continuation, + variant: GotoVariant.Break, + id: terminal.id, + loc: terminal.loc, + }; + } + } + return terminalMapping.size > 0 ? terminalMapping : null; +} +function instructionMayThrow(instr) { + switch (instr.value.kind) { + case 'Primitive': + case 'ArrayExpression': + case 'ObjectExpression': { + return false; + } + default: { + return true; + } + } +} + +function inlineJsxTransform(fn, inlineJsxTransformConfig) { + var _a; + const inlinedJsxDeclarations = new Map(); + for (const [_, currentBlock] of [...fn.body.blocks]) { + let fallthroughBlockInstructions = null; + const instructionCount = currentBlock.instructions.length; + for (let i = 0; i < instructionCount; i++) { + const instr = currentBlock.instructions[i]; + if (currentBlock.kind === 'value') { + (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.logEvent(fn.env.filename, { + kind: 'CompileDiagnostic', + fnLoc: null, + detail: { + category: ErrorCategory.Todo, + reason: 'JSX Inlining is not supported on value blocks', + loc: instr.loc, + }, + }); + continue; + } + switch (instr.value.kind) { + case 'JsxExpression': + case 'JsxFragment': { + const currentBlockInstructions = currentBlock.instructions.slice(0, i); + const thenBlockInstructions = currentBlock.instructions.slice(i, i + 1); + const elseBlockInstructions = []; + fallthroughBlockInstructions !== null && fallthroughBlockInstructions !== void 0 ? fallthroughBlockInstructions : (fallthroughBlockInstructions = currentBlock.instructions.slice(i + 1)); + const fallthroughBlockId = fn.env.nextBlockId; + const fallthroughBlock = { + kind: currentBlock.kind, + id: fallthroughBlockId, + instructions: fallthroughBlockInstructions, + terminal: currentBlock.terminal, + preds: new Set(), + phis: new Set(), + }; + const varPlace = createTemporaryPlace(fn.env, instr.value.loc); + promoteTemporary(varPlace.identifier); + const varLValuePlace = createTemporaryPlace(fn.env, instr.value.loc); + const thenVarPlace = Object.assign(Object.assign({}, varPlace), { identifier: forkTemporaryIdentifier(fn.env.nextIdentifierId, varPlace.identifier) }); + const elseVarPlace = Object.assign(Object.assign({}, varPlace), { identifier: forkTemporaryIdentifier(fn.env.nextIdentifierId, varPlace.identifier) }); + const varInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign({}, varLValuePlace), + value: { + kind: 'DeclareLocal', + lvalue: { place: Object.assign({}, varPlace), kind: InstructionKind.Let }, + type: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + currentBlockInstructions.push(varInstruction); + const devGlobalPlace = createTemporaryPlace(fn.env, instr.value.loc); + const devGlobalInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, devGlobalPlace), { effect: Effect.Mutate }), + value: { + kind: 'LoadGlobal', + binding: { + kind: 'Global', + name: inlineJsxTransformConfig.globalDevVar, + }, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + currentBlockInstructions.push(devGlobalInstruction); + const thenBlockId = fn.env.nextBlockId; + const elseBlockId = fn.env.nextBlockId; + const ifTerminal = { + kind: 'if', + test: Object.assign(Object.assign({}, devGlobalPlace), { effect: Effect.Read }), + consequent: thenBlockId, + alternate: elseBlockId, + fallthrough: fallthroughBlockId, + loc: instr.loc, + id: makeInstructionId(0), + }; + currentBlock.instructions = currentBlockInstructions; + currentBlock.terminal = ifTerminal; + const thenBlock = { + id: thenBlockId, + instructions: thenBlockInstructions, + kind: 'block', + phis: new Set(), + preds: new Set(), + terminal: { + kind: 'goto', + block: fallthroughBlockId, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: instr.loc, + }, + }; + fn.body.blocks.set(thenBlockId, thenBlock); + const resassignElsePlace = createTemporaryPlace(fn.env, instr.value.loc); + const reassignElseInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign({}, resassignElsePlace), + value: { + kind: 'StoreLocal', + lvalue: { + place: elseVarPlace, + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, instr.lvalue), + type: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + thenBlockInstructions.push(reassignElseInstruction); + const elseBlockTerminal = { + kind: 'goto', + block: fallthroughBlockId, + variant: GotoVariant.Break, + id: makeInstructionId(0), + loc: instr.loc, + }; + const elseBlock = { + id: elseBlockId, + instructions: elseBlockInstructions, + kind: 'block', + phis: new Set(), + preds: new Set(), + terminal: elseBlockTerminal, + }; + fn.body.blocks.set(elseBlockId, elseBlock); + const { refProperty, keyProperty, propsProperty } = createPropsProperties(fn, instr, elseBlockInstructions, instr.value.kind === 'JsxExpression' ? instr.value.props : [], instr.value.children); + const reactElementInstructionPlace = createTemporaryPlace(fn.env, instr.value.loc); + const reactElementInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, reactElementInstructionPlace), { effect: Effect.Store }), + value: { + kind: 'ObjectExpression', + properties: [ + createSymbolProperty(fn, instr, elseBlockInstructions, '$$typeof', inlineJsxTransformConfig.elementSymbol), + instr.value.kind === 'JsxExpression' + ? createTagProperty(fn, instr, elseBlockInstructions, instr.value.tag) + : createSymbolProperty(fn, instr, elseBlockInstructions, 'type', 'react.fragment'), + refProperty, + keyProperty, + propsProperty, + ], + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + elseBlockInstructions.push(reactElementInstruction); + const reassignConditionalInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign({}, createTemporaryPlace(fn.env, instr.value.loc)), + value: { + kind: 'StoreLocal', + lvalue: { + place: Object.assign({}, elseVarPlace), + kind: InstructionKind.Reassign, + }, + value: Object.assign({}, reactElementInstruction.lvalue), + type: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + elseBlockInstructions.push(reassignConditionalInstruction); + const operands = new Map(); + operands.set(thenBlockId, Object.assign({}, elseVarPlace)); + operands.set(elseBlockId, Object.assign({}, thenVarPlace)); + const phiIdentifier = forkTemporaryIdentifier(fn.env.nextIdentifierId, varPlace.identifier); + const phiPlace = Object.assign(Object.assign({}, createTemporaryPlace(fn.env, instr.value.loc)), { identifier: phiIdentifier }); + const phis = new Set([ + { + kind: 'Phi', + operands, + place: phiPlace, + }, + ]); + fallthroughBlock.phis = phis; + fn.body.blocks.set(fallthroughBlockId, fallthroughBlock); + inlinedJsxDeclarations.set(instr.lvalue.identifier.declarationId, { + identifier: phiIdentifier, + blockIdsToIgnore: new Set([thenBlockId, elseBlockId]), + }); + break; + } + case 'FunctionExpression': + case 'ObjectMethod': { + inlineJsxTransform(instr.value.loweredFunc.func, inlineJsxTransformConfig); + break; + } + } + } + } + for (const [blockId, block] of fn.body.blocks) { + for (const instr of block.instructions) { + mapInstructionOperands(instr, place => handlePlace(place, blockId, inlinedJsxDeclarations)); + mapInstructionLValues(instr, lvalue => handlelValue(lvalue, blockId, inlinedJsxDeclarations)); + mapInstructionValueOperands(instr.value, place => handlePlace(place, blockId, inlinedJsxDeclarations)); + } + mapTerminalOperands(block.terminal, place => handlePlace(place, blockId, inlinedJsxDeclarations)); + if (block.terminal.kind === 'scope') { + const scope = block.terminal.scope; + for (const dep of scope.dependencies) { + dep.identifier = handleIdentifier(dep.identifier, inlinedJsxDeclarations); + } + for (const [origId, decl] of [...scope.declarations]) { + const newDecl = handleIdentifier(decl.identifier, inlinedJsxDeclarations); + if (newDecl.id !== origId) { + scope.declarations.delete(origId); + scope.declarations.set(decl.identifier.id, { + identifier: newDecl, + scope: decl.scope, + }); + } + } + } + } + reversePostorderBlocks(fn.body); + markPredecessors(fn.body); + markInstructionIds(fn.body); + fixScopeAndIdentifierRanges(fn.body); +} +function createSymbolProperty(fn, instr, nextInstructions, propertyName, symbolName) { + const symbolPlace = createTemporaryPlace(fn.env, instr.value.loc); + const symbolInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, symbolPlace), { effect: Effect.Mutate }), + value: { + kind: 'LoadGlobal', + binding: { kind: 'Global', name: 'Symbol' }, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(symbolInstruction); + const symbolForPlace = createTemporaryPlace(fn.env, instr.value.loc); + const symbolForInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, symbolForPlace), { effect: Effect.Read }), + value: { + kind: 'PropertyLoad', + object: Object.assign({}, symbolInstruction.lvalue), + property: makePropertyLiteral('for'), + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(symbolForInstruction); + const symbolValuePlace = createTemporaryPlace(fn.env, instr.value.loc); + const symbolValueInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, symbolValuePlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: symbolName, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(symbolValueInstruction); + const $$typeofPlace = createTemporaryPlace(fn.env, instr.value.loc); + const $$typeofInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, $$typeofPlace), { effect: Effect.Mutate }), + value: { + kind: 'MethodCall', + receiver: symbolInstruction.lvalue, + property: symbolForInstruction.lvalue, + args: [symbolValueInstruction.lvalue], + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + const $$typeofProperty = { + kind: 'ObjectProperty', + key: { name: propertyName, kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, $$typeofPlace), { effect: Effect.Capture }), + }; + nextInstructions.push($$typeofInstruction); + return $$typeofProperty; +} +function createTagProperty(fn, instr, nextInstructions, componentTag) { + let tagProperty; + switch (componentTag.kind) { + case 'BuiltinTag': { + const tagPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const tagInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, tagPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: componentTag.name, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + tagProperty = { + kind: 'ObjectProperty', + key: { name: 'type', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, tagPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(tagInstruction); + break; + } + case 'Identifier': { + tagProperty = { + kind: 'ObjectProperty', + key: { name: 'type', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, componentTag), { effect: Effect.Capture }), + }; + break; + } + } + return tagProperty; +} +function createPropsProperties(fn, instr, nextInstructions, propAttributes, children) { + let refProperty; + let keyProperty; + const props = []; + const jsxAttributesWithoutKey = propAttributes.filter(p => p.kind === 'JsxAttribute' && p.name !== 'key'); + const jsxSpreadAttributes = propAttributes.filter(p => p.kind === 'JsxSpreadAttribute'); + const spreadPropsOnly = jsxAttributesWithoutKey.length === 0 && jsxSpreadAttributes.length === 1; + propAttributes.forEach(prop => { + switch (prop.kind) { + case 'JsxAttribute': { + switch (prop.name) { + case 'key': { + keyProperty = { + kind: 'ObjectProperty', + key: { name: 'key', kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + break; + } + case 'ref': { + refProperty = { + kind: 'ObjectProperty', + key: { name: 'ref', kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + const refPropProperty = { + kind: 'ObjectProperty', + key: { name: 'ref', kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + props.push(refPropProperty); + break; + } + default: { + const attributeProperty = { + kind: 'ObjectProperty', + key: { name: prop.name, kind: 'string' }, + type: 'property', + place: Object.assign({}, prop.place), + }; + props.push(attributeProperty); + } + } + break; + } + case 'JsxSpreadAttribute': { + props.push({ + kind: 'Spread', + place: Object.assign({}, prop.argument), + }); + break; + } + } + }); + const propsPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + if (children) { + let childrenPropProperty; + if (children.length === 1) { + childrenPropProperty = { + kind: 'ObjectProperty', + key: { name: 'children', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, children[0]), { effect: Effect.Capture }), + }; + } + else { + const childrenPropPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const childrenPropInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, childrenPropPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'ArrayExpression', + elements: [...children], + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + nextInstructions.push(childrenPropInstruction); + childrenPropProperty = { + kind: 'ObjectProperty', + key: { name: 'children', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, childrenPropPropertyPlace), { effect: Effect.Capture }), + }; + } + props.push(childrenPropProperty); + } + if (refProperty == null) { + const refPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const refInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, refPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + refProperty = { + kind: 'ObjectProperty', + key: { name: 'ref', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, refPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(refInstruction); + } + if (keyProperty == null) { + const keyPropertyPlace = createTemporaryPlace(fn.env, instr.value.loc); + const keyInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, keyPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'Primitive', + value: null, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + keyProperty = { + kind: 'ObjectProperty', + key: { name: 'key', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, keyPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(keyInstruction); + } + let propsProperty; + if (spreadPropsOnly) { + const spreadProp = jsxSpreadAttributes[0]; + CompilerError.invariant(spreadProp.kind === 'JsxSpreadAttribute', { + reason: 'Spread prop attribute must be of kind JSXSpreadAttribute', + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + }); + propsProperty = { + kind: 'ObjectProperty', + key: { name: 'props', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, spreadProp.argument), { effect: Effect.Mutate }), + }; + } + else { + const propsInstruction = { + id: makeInstructionId(0), + lvalue: Object.assign(Object.assign({}, propsPropertyPlace), { effect: Effect.Mutate }), + value: { + kind: 'ObjectExpression', + properties: props, + loc: instr.value.loc, + }, + effects: null, + loc: instr.loc, + }; + propsProperty = { + kind: 'ObjectProperty', + key: { name: 'props', kind: 'string' }, + type: 'property', + place: Object.assign(Object.assign({}, propsPropertyPlace), { effect: Effect.Capture }), + }; + nextInstructions.push(propsInstruction); + } + return { refProperty, keyProperty, propsProperty }; +} +function handlePlace(place, blockId, inlinedJsxDeclarations) { + const inlinedJsxDeclaration = inlinedJsxDeclarations.get(place.identifier.declarationId); + if (inlinedJsxDeclaration == null || + inlinedJsxDeclaration.blockIdsToIgnore.has(blockId)) { + return place; + } + return Object.assign(Object.assign({}, place), { identifier: inlinedJsxDeclaration.identifier }); +} +function handlelValue(lvalue, blockId, inlinedJsxDeclarations) { + const inlinedJsxDeclaration = inlinedJsxDeclarations.get(lvalue.identifier.declarationId); + if (inlinedJsxDeclaration == null || + inlinedJsxDeclaration.blockIdsToIgnore.has(blockId)) { + return lvalue; + } + return Object.assign(Object.assign({}, lvalue), { identifier: inlinedJsxDeclaration.identifier }); +} +function handleIdentifier(identifier, inlinedJsxDeclarations) { + const inlinedJsxDeclaration = inlinedJsxDeclarations.get(identifier.declarationId); + return inlinedJsxDeclaration == null + ? identifier + : inlinedJsxDeclaration.identifier; +} + +function findScopesToMerge(fn) { + const objectMethodDecls = new Set(); + const mergeScopesBuilder = new DisjointSet(); + for (const [_, block] of fn.body.blocks) { + for (const { lvalue, value } of block.instructions) { + if (value.kind === 'ObjectMethod') { + objectMethodDecls.add(lvalue.identifier); + } + else if (value.kind === 'ObjectExpression') { + for (const operand of eachInstructionValueOperand(value)) { + if (objectMethodDecls.has(operand.identifier)) { + const operandScope = operand.identifier.scope; + const lvalueScope = lvalue.identifier.scope; + CompilerError.invariant(operandScope != null && lvalueScope != null, { + reason: 'Internal error: Expected all ObjectExpressions and ObjectMethods to have non-null scope.', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + mergeScopesBuilder.union([operandScope, lvalueScope]); + } + } + } + } + } + return mergeScopesBuilder; +} +function alignObjectMethodScopes(fn) { + for (const [_, block] of fn.body.blocks) { + for (const { value } of block.instructions) { + if (value.kind === 'ObjectMethod' || + value.kind === 'FunctionExpression') { + alignObjectMethodScopes(value.loweredFunc.func); + } + } + } + const scopeGroupsMap = findScopesToMerge(fn).canonicalize(); + for (const [scope, root] of scopeGroupsMap) { + if (scope !== root) { + root.range.start = makeInstructionId(Math.min(scope.range.start, root.range.start)); + root.range.end = makeInstructionId(Math.max(scope.range.end, root.range.end)); + } + } + for (const [_, block] of fn.body.blocks) { + for (const { lvalue: { identifier }, } of block.instructions) { + if (identifier.scope != null) { + const root = scopeGroupsMap.get(identifier.scope); + if (root != null) { + identifier.scope = root; + } + } + } + } +} + +function visitReactiveFunction(fn, visitor, state) { + visitor.visitBlock(fn.body, state); +} +class ReactiveFunctionVisitor { + visitID(_id, _state) { } + visitParam(_place, _state) { } + visitLValue(_id, _lvalue, _state) { } + visitPlace(_id, _place, _state) { } + visitReactiveFunctionValue(_id, _dependencies, _fn, _state) { } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + } + traverseValue(id, value, state) { + switch (value.kind) { + case 'OptionalExpression': { + this.visitValue(id, value.value, state); + break; + } + case 'LogicalExpression': { + this.visitValue(id, value.left, state); + this.visitValue(id, value.right, state); + break; + } + case 'ConditionalExpression': { + this.visitValue(id, value.test, state); + this.visitValue(id, value.consequent, state); + this.visitValue(id, value.alternate, state); + break; + } + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitInstruction(instr, state); + } + this.visitValue(value.id, value.value, state); + break; + } + default: { + for (const place of eachInstructionValueOperand(value)) { + this.visitPlace(id, place, state); + } + } + } + } + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + } + traverseInstruction(instruction, state) { + this.visitID(instruction.id, state); + for (const operand of eachInstructionLValue(instruction)) { + this.visitLValue(instruction.id, operand, state); + } + this.visitValue(instruction.id, instruction.value, state); + } + visitTerminal(stmt, state) { + this.traverseTerminal(stmt, state); + } + traverseTerminal(stmt, state) { + const { terminal } = stmt; + if (terminal.id !== null) { + this.visitID(terminal.id, state); + } + switch (terminal.kind) { + case 'break': + case 'continue': { + break; + } + case 'return': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'throw': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'for': { + this.visitValue(terminal.id, terminal.init, state); + this.visitValue(terminal.id, terminal.test, state); + this.visitBlock(terminal.loop, state); + if (terminal.update !== null) { + this.visitValue(terminal.id, terminal.update, state); + } + break; + } + case 'for-of': { + this.visitValue(terminal.id, terminal.init, state); + this.visitValue(terminal.id, terminal.test, state); + this.visitBlock(terminal.loop, state); + break; + } + case 'for-in': { + this.visitValue(terminal.id, terminal.init, state); + this.visitBlock(terminal.loop, state); + break; + } + case 'do-while': { + this.visitBlock(terminal.loop, state); + this.visitValue(terminal.id, terminal.test, state); + break; + } + case 'while': { + this.visitValue(terminal.id, terminal.test, state); + this.visitBlock(terminal.loop, state); + break; + } + case 'if': { + this.visitPlace(terminal.id, terminal.test, state); + this.visitBlock(terminal.consequent, state); + if (terminal.alternate !== null) { + this.visitBlock(terminal.alternate, state); + } + break; + } + case 'switch': { + this.visitPlace(terminal.id, terminal.test, state); + for (const case_ of terminal.cases) { + if (case_.test !== null) { + this.visitPlace(terminal.id, case_.test, state); + } + if (case_.block !== undefined) { + this.visitBlock(case_.block, state); + } + } + break; + } + case 'label': { + this.visitBlock(terminal.block, state); + break; + } + case 'try': { + this.visitBlock(terminal.block, state); + this.visitBlock(terminal.handler, state); + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } + } + visitScope(scope, state) { + this.traverseScope(scope, state); + } + traverseScope(scope, state) { + this.visitBlock(scope.instructions, state); + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + } + traversePrunedScope(scopeBlock, state) { + this.visitBlock(scopeBlock.instructions, state); + } + visitBlock(block, state) { + this.traverseBlock(block, state); + } + traverseBlock(block, state) { + for (const instr of block) { + switch (instr.kind) { + case 'instruction': { + this.visitInstruction(instr.instruction, state); + break; + } + case 'scope': { + this.visitScope(instr, state); + break; + } + case 'pruned-scope': { + this.visitPrunedScope(instr, state); + break; + } + case 'terminal': { + this.visitTerminal(instr, state); + break; + } + default: { + assertExhaustive$1(instr, `Unexpected instruction kind \`${instr.kind}\``); + } + } + } + } + visitHirFunction(fn, state) { + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + this.visitParam(place, state); + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + this.visitInstruction(instr, state); + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + this.visitHirFunction(instr.value.loweredFunc.func, state); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + this.visitPlace(block.terminal.id, operand, state); + } + } + } +} +class ReactiveFunctionTransform extends ReactiveFunctionVisitor { + traverseBlock(block, state) { + let nextBlock = null; + for (let i = 0; i < block.length; i++) { + const instr = block[i]; + let transformed; + switch (instr.kind) { + case 'instruction': { + transformed = this.transformInstruction(instr.instruction, state); + break; + } + case 'scope': { + transformed = this.transformScope(instr, state); + break; + } + case 'pruned-scope': { + transformed = this.transformPrunedScope(instr, state); + break; + } + case 'terminal': { + transformed = this.transformTerminal(instr, state); + break; + } + default: { + assertExhaustive$1(instr, `Unexpected instruction kind \`${instr.kind}\``); + } + } + switch (transformed.kind) { + case 'keep': { + if (nextBlock !== null) { + nextBlock.push(instr); + } + break; + } + case 'remove': { + if (nextBlock === null) { + nextBlock = block.slice(0, i); + } + break; + } + case 'replace': { + nextBlock !== null && nextBlock !== void 0 ? nextBlock : (nextBlock = block.slice(0, i)); + nextBlock.push(transformed.value); + break; + } + case 'replace-many': { + nextBlock !== null && nextBlock !== void 0 ? nextBlock : (nextBlock = block.slice(0, i)); + nextBlock.push(...transformed.value); + break; + } + } + } + if (nextBlock !== null) { + block.length = 0; + block.push(...nextBlock); + } + } + transformInstruction(instruction, state) { + this.visitInstruction(instruction, state); + return { kind: 'keep' }; + } + transformTerminal(stmt, state) { + this.visitTerminal(stmt, state); + return { kind: 'keep' }; + } + transformScope(scope, state) { + this.visitScope(scope, state); + return { kind: 'keep' }; + } + transformPrunedScope(scope, state) { + this.visitPrunedScope(scope, state); + return { kind: 'keep' }; + } + transformValue(id, value, state) { + this.visitValue(id, value, state); + return { kind: 'keep' }; + } + transformReactiveFunctionValue(id, dependencies, fn, state) { + this.visitReactiveFunctionValue(id, dependencies, fn, state); + return { kind: 'keep' }; + } + traverseValue(id, value, state) { + switch (value.kind) { + case 'OptionalExpression': { + const nextValue = this.transformValue(id, value.value, state); + if (nextValue.kind === 'replace') { + value.value = nextValue.value; + } + break; + } + case 'LogicalExpression': { + const left = this.transformValue(id, value.left, state); + if (left.kind === 'replace') { + value.left = left.value; + } + const right = this.transformValue(id, value.right, state); + if (right.kind === 'replace') { + value.right = right.value; + } + break; + } + case 'ConditionalExpression': { + const test = this.transformValue(id, value.test, state); + if (test.kind === 'replace') { + value.test = test.value; + } + const consequent = this.transformValue(id, value.consequent, state); + if (consequent.kind === 'replace') { + value.consequent = consequent.value; + } + const alternate = this.transformValue(id, value.alternate, state); + if (alternate.kind === 'replace') { + value.alternate = alternate.value; + } + break; + } + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitInstruction(instr, state); + } + const nextValue = this.transformValue(value.id, value.value, state); + if (nextValue.kind === 'replace') { + value.value = nextValue.value; + } + break; + } + default: { + for (const place of eachInstructionValueOperand(value)) { + this.visitPlace(id, place, state); + } + } + } + } + traverseInstruction(instruction, state) { + this.visitID(instruction.id, state); + for (const operand of eachInstructionLValue(instruction)) { + this.visitLValue(instruction.id, operand, state); + } + const nextValue = this.transformValue(instruction.id, instruction.value, state); + if (nextValue.kind === 'replace') { + instruction.value = nextValue.value; + } + } + traverseTerminal(stmt, state) { + const { terminal } = stmt; + if (terminal.id !== null) { + this.visitID(terminal.id, state); + } + switch (terminal.kind) { + case 'break': + case 'continue': { + break; + } + case 'return': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'throw': { + this.visitPlace(terminal.id, terminal.value, state); + break; + } + case 'for': { + const init = this.transformValue(terminal.id, terminal.init, state); + if (init.kind === 'replace') { + terminal.init = init.value; + } + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + if (terminal.update !== null) { + const update = this.transformValue(terminal.id, terminal.update, state); + if (update.kind === 'replace') { + terminal.update = update.value; + } + } + this.visitBlock(terminal.loop, state); + break; + } + case 'for-of': { + const init = this.transformValue(terminal.id, terminal.init, state); + if (init.kind === 'replace') { + terminal.init = init.value; + } + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + this.visitBlock(terminal.loop, state); + break; + } + case 'for-in': { + const init = this.transformValue(terminal.id, terminal.init, state); + if (init.kind === 'replace') { + terminal.init = init.value; + } + this.visitBlock(terminal.loop, state); + break; + } + case 'do-while': { + this.visitBlock(terminal.loop, state); + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + break; + } + case 'while': { + const test = this.transformValue(terminal.id, terminal.test, state); + if (test.kind === 'replace') { + terminal.test = test.value; + } + this.visitBlock(terminal.loop, state); + break; + } + case 'if': { + this.visitPlace(terminal.id, terminal.test, state); + this.visitBlock(terminal.consequent, state); + if (terminal.alternate !== null) { + this.visitBlock(terminal.alternate, state); + } + break; + } + case 'switch': { + this.visitPlace(terminal.id, terminal.test, state); + for (const case_ of terminal.cases) { + if (case_.test !== null) { + this.visitPlace(terminal.id, case_.test, state); + } + if (case_.block !== undefined) { + this.visitBlock(case_.block, state); + } + } + break; + } + case 'label': { + this.visitBlock(terminal.block, state); + break; + } + case 'try': { + this.visitBlock(terminal.block, state); + if (terminal.handlerBinding !== null) { + this.visitPlace(terminal.id, terminal.handlerBinding, state); + } + this.visitBlock(terminal.handler, state); + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } + } +} +function* eachReactiveValueOperand(instrValue) { + switch (instrValue.kind) { + case 'OptionalExpression': { + yield* eachReactiveValueOperand(instrValue.value); + break; + } + case 'LogicalExpression': { + yield* eachReactiveValueOperand(instrValue.left); + yield* eachReactiveValueOperand(instrValue.right); + break; + } + case 'SequenceExpression': { + for (const instr of instrValue.instructions) { + yield* eachReactiveValueOperand(instr.value); + } + yield* eachReactiveValueOperand(instrValue.value); + break; + } + case 'ConditionalExpression': { + yield* eachReactiveValueOperand(instrValue.test); + yield* eachReactiveValueOperand(instrValue.consequent); + yield* eachReactiveValueOperand(instrValue.alternate); + break; + } + default: { + yield* eachInstructionValueOperand(instrValue); + } + } +} + +function assertScopeInstructionsWithinScopes(fn) { + const existingScopes = new Set(); + visitReactiveFunction(fn, new FindAllScopesVisitor(), existingScopes); + visitReactiveFunction(fn, new CheckInstructionsAgainstScopesVisitor(), existingScopes); +} +class FindAllScopesVisitor extends ReactiveFunctionVisitor { + visitScope(block, state) { + this.traverseScope(block, state); + state.add(block.scope.id); + } +} +class CheckInstructionsAgainstScopesVisitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.activeScopes = new Set(); + } + visitPlace(id, place, state) { + const scope = getPlaceScope(id, place); + if (scope !== null && + state.has(scope.id) && + !this.activeScopes.has(scope.id)) { + CompilerError.invariant(false, { + reason: 'Encountered an instruction that should be part of a scope, but where that scope has already completed', + description: `Instruction [${id}] is part of scope @${scope.id}, but that scope has already completed`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + } + } + visitScope(block, state) { + this.activeScopes.add(block.scope.id); + this.traverseScope(block, state); + this.activeScopes.delete(block.scope.id); + } +} + +function assertWellFormedBreakTargets(fn) { + visitReactiveFunction(fn, new Visitor$a(), new Set()); +} +let Visitor$a = class Visitor extends ReactiveFunctionVisitor { + visitTerminal(stmt, seenLabels) { + if (stmt.label != null) { + seenLabels.add(stmt.label.id); + } + const terminal = stmt.terminal; + if (terminal.kind === 'break' || terminal.kind === 'continue') { + CompilerError.invariant(seenLabels.has(terminal.target), { + reason: 'Unexpected break to invalid label', + description: null, + details: [ + { + kind: 'error', + loc: stmt.terminal.loc, + message: null, + }, + ], + }); + } + } +}; + +var _Context_nextScheduleId, _Context_scheduled, _Context_catchHandlers, _Context_controlFlowStack; +function buildReactiveFunction(fn) { + const cx = new Context$3(fn.body); + const driver = new Driver(cx); + const body = driver.traverseBlock(cx.block(fn.body.entry)); + return { + loc: fn.loc, + id: fn.id, + nameHint: fn.nameHint, + params: fn.params, + generator: fn.generator, + async: fn.async, + body, + env: fn.env, + directives: fn.directives, + }; +} +class Driver { + constructor(cx) { + this.cx = cx; + } + traverseBlock(block) { + const blockValue = []; + this.visitBlock(block, blockValue); + return blockValue; + } + visitBlock(block, blockValue) { + var _a; + CompilerError.invariant(!this.cx.emitted.has(block.id), { + reason: `Cannot emit the same block twice: bb${block.id}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + this.cx.emitted.add(block.id); + for (const instruction of block.instructions) { + blockValue.push({ + kind: 'instruction', + instruction, + }); + } + const terminal = block.terminal; + const scheduleIds = []; + switch (terminal.kind) { + case 'return': { + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'return', + loc: terminal.loc, + value: terminal.value, + id: terminal.id, + }, + label: null, + }); + break; + } + case 'throw': { + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'throw', + loc: terminal.loc, + value: terminal.value, + id: terminal.id, + }, + label: null, + }); + break; + } + case 'if': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const alternateId = terminal.alternate !== terminal.fallthrough + ? terminal.alternate + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + let consequent = null; + if (this.cx.isScheduled(terminal.consequent)) { + CompilerError.invariant(false, { + reason: `Unexpected 'if' where the consequent is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + consequent = this.traverseBlock(this.cx.ir.blocks.get(terminal.consequent)); + } + let alternate = null; + if (alternateId !== null) { + if (this.cx.isScheduled(alternateId)) { + CompilerError.invariant(false, { + reason: `Unexpected 'if' where the alternate is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + alternate = this.traverseBlock(this.cx.ir.blocks.get(alternateId)); + } + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'if', + loc: terminal.loc, + test: terminal.test, + consequent: consequent !== null && consequent !== void 0 ? consequent : this.emptyBlock(), + alternate: alternate, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'switch': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'switch'); + scheduleIds.push(scheduleId); + } + const cases = []; + [...terminal.cases].reverse().forEach((case_, _index) => { + const test = case_.test; + let consequent; + if (this.cx.isScheduled(case_.block)) { + CompilerError.invariant(case_.block === terminal.fallthrough, { + reason: `Unexpected 'switch' where a case is already scheduled and block is not the fallthrough`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + return; + } + else { + consequent = this.traverseBlock(this.cx.ir.blocks.get(case_.block)); + const scheduleId = this.cx.schedule(case_.block, 'case'); + scheduleIds.push(scheduleId); + } + cases.push({ test, block: consequent }); + }); + cases.reverse(); + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'switch', + loc: terminal.loc, + test: terminal.test, + cases, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'do-while': { + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.test, terminal.loop); + scheduleIds.push(scheduleId); + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'do-while' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + const testValue = this.visitValueBlock(terminal.test, terminal.loc).value; + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'do-while', + loc: terminal.loc, + test: testValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'while': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.test, terminal.loop); + scheduleIds.push(scheduleId); + const testValue = this.visitValueBlock(terminal.test, terminal.loc).value; + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'while' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'while', + loc: terminal.loc, + test: testValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null + ? null + : { + id: fallthroughId, + implicit: false, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'for': { + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, (_a = terminal.update) !== null && _a !== void 0 ? _a : terminal.test, terminal.loop); + scheduleIds.push(scheduleId); + const init = this.visitValueBlock(terminal.init, terminal.loc); + const initBlock = this.cx.ir.blocks.get(init.block); + let initValue = init.value; + if (initValue.kind === 'SequenceExpression') { + const last = initBlock.instructions.at(-1); + initValue.instructions.push(last); + initValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + initValue = { + kind: 'SequenceExpression', + instructions: [initBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + const testValue = this.visitValueBlock(terminal.test, terminal.loc).value; + const updateValue = terminal.update !== null + ? this.visitValueBlock(terminal.update, terminal.loc).value + : null; + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'for' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'for', + loc: terminal.loc, + init: initValue, + test: testValue, + update: updateValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'for-of': { + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.init, terminal.loop); + scheduleIds.push(scheduleId); + const init = this.visitValueBlock(terminal.init, terminal.loc); + const initBlock = this.cx.ir.blocks.get(init.block); + let initValue = init.value; + if (initValue.kind === 'SequenceExpression') { + const last = initBlock.instructions.at(-1); + initValue.instructions.push(last); + initValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + initValue = { + kind: 'SequenceExpression', + instructions: [initBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + let testValue = test.value; + if (testValue.kind === 'SequenceExpression') { + const last = testBlock.instructions.at(-1); + testValue.instructions.push(last); + testValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + testValue = { + kind: 'SequenceExpression', + instructions: [testBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'for-of' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'for-of', + loc: terminal.loc, + init: initValue, + test: testValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'for-in': { + const loopId = !this.cx.isScheduled(terminal.loop) && + terminal.loop !== terminal.fallthrough + ? terminal.loop + : null; + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + const scheduleId = this.cx.scheduleLoop(terminal.fallthrough, terminal.init, terminal.loop); + scheduleIds.push(scheduleId); + const init = this.visitValueBlock(terminal.init, terminal.loc); + const initBlock = this.cx.ir.blocks.get(init.block); + let initValue = init.value; + if (initValue.kind === 'SequenceExpression') { + const last = initBlock.instructions.at(-1); + initValue.instructions.push(last); + initValue.value = { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }; + } + else { + initValue = { + kind: 'SequenceExpression', + instructions: [initBlock.instructions.at(-1)], + id: terminal.id, + loc: terminal.loc, + value: { + kind: 'Primitive', + value: undefined, + loc: terminal.loc, + }, + }; + } + let loopBody; + if (loopId) { + loopBody = this.traverseBlock(this.cx.ir.blocks.get(loopId)); + } + else { + CompilerError.invariant(false, { + reason: `Unexpected 'for-in' where the loop is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'for-in', + loc: terminal.loc, + init: initValue, + loop: loopBody, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'branch': { + let consequent = null; + if (this.cx.isScheduled(terminal.consequent)) { + const break_ = this.visitBreak(terminal.consequent, terminal.id, terminal.loc); + if (break_ !== null) { + consequent = [break_]; + } + } + else { + consequent = this.traverseBlock(this.cx.ir.blocks.get(terminal.consequent)); + } + let alternate = null; + if (this.cx.isScheduled(terminal.alternate)) { + CompilerError.invariant(false, { + reason: `Unexpected 'branch' where the alternate is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + alternate = this.traverseBlock(this.cx.ir.blocks.get(terminal.alternate)); + } + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'if', + loc: terminal.loc, + test: terminal.test, + consequent: consequent !== null && consequent !== void 0 ? consequent : this.emptyBlock(), + alternate: alternate, + id: terminal.id, + }, + label: null, + }); + break; + } + case 'label': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + let block; + if (this.cx.isScheduled(terminal.block)) { + CompilerError.invariant(false, { + reason: `Unexpected 'label' where the block is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + block = this.traverseBlock(this.cx.ir.blocks.get(terminal.block)); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + terminal: { + kind: 'label', + loc: terminal.loc, + block, + id: terminal.id, + }, + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'sequence': + case 'optional': + case 'ternary': + case 'logical': { + const fallthroughId = terminal.fallthrough !== null && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + const { place, value } = this.visitValueBlockTerminal(terminal); + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'instruction', + instruction: { + id: terminal.id, + lvalue: place, + value, + loc: terminal.loc, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'goto': { + switch (terminal.variant) { + case GotoVariant.Break: { + const break_ = this.visitBreak(terminal.block, terminal.id, terminal.loc); + if (break_ !== null) { + blockValue.push(break_); + } + break; + } + case GotoVariant.Continue: { + const continue_ = this.visitContinue(terminal.block, terminal.id, terminal.loc); + if (continue_ !== null) { + blockValue.push(continue_); + } + break; + } + case GotoVariant.Try: { + break; + } + default: { + assertExhaustive$1(terminal.variant, `Unexpected goto variant \`${terminal.variant}\``); + } + } + break; + } + case 'maybe-throw': { + if (!this.cx.isScheduled(terminal.continuation)) { + this.visitBlock(this.cx.ir.blocks.get(terminal.continuation), blockValue); + } + break; + } + case 'try': { + const fallthroughId = this.cx.reachable(terminal.fallthrough) && + !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + } + this.cx.scheduleCatchHandler(terminal.handler); + const block = this.traverseBlock(this.cx.ir.blocks.get(terminal.block)); + const handler = this.traverseBlock(this.cx.ir.blocks.get(terminal.handler)); + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: 'terminal', + label: fallthroughId == null ? null : { id: fallthroughId, implicit: false }, + terminal: { + kind: 'try', + loc: terminal.loc, + block, + handlerBinding: terminal.handlerBinding, + handler, + id: terminal.id, + }, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'pruned-scope': + case 'scope': { + const fallthroughId = !this.cx.isScheduled(terminal.fallthrough) + ? terminal.fallthrough + : null; + if (fallthroughId !== null) { + const scheduleId = this.cx.schedule(fallthroughId, 'if'); + scheduleIds.push(scheduleId); + this.cx.scopeFallthroughs.add(fallthroughId); + } + let block; + if (this.cx.isScheduled(terminal.block)) { + CompilerError.invariant(false, { + reason: `Unexpected 'scope' where the block is already scheduled`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + } + else { + block = this.traverseBlock(this.cx.ir.blocks.get(terminal.block)); + } + this.cx.unscheduleAll(scheduleIds); + blockValue.push({ + kind: terminal.kind, + instructions: block, + scope: terminal.scope, + }); + if (fallthroughId !== null) { + this.visitBlock(this.cx.ir.blocks.get(fallthroughId), blockValue); + } + break; + } + case 'unreachable': { + break; + } + case 'unsupported': { + CompilerError.invariant(false, { + reason: 'Unexpected unsupported terminal', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(terminal, 'Unexpected terminal'); + } + } + } + visitValueBlock(id, loc) { + const defaultBlock = this.cx.ir.blocks.get(id); + if (defaultBlock.terminal.kind === 'branch') { + const instructions = defaultBlock.instructions; + if (instructions.length === 0) { + return { + block: defaultBlock.id, + place: defaultBlock.terminal.test, + value: { + kind: 'LoadLocal', + place: defaultBlock.terminal.test, + loc: defaultBlock.terminal.test.loc, + }, + id: defaultBlock.terminal.id, + }; + } + else if (defaultBlock.instructions.length === 1) { + const instr = defaultBlock.instructions[0]; + CompilerError.invariant(instr.lvalue.identifier.id === + defaultBlock.terminal.test.identifier.id, { + reason: 'Expected branch block to end in an instruction that sets the test value', + description: null, + details: [ + { + kind: 'error', + loc: instr.lvalue.loc, + message: null, + }, + ], + suggestions: null, + }); + return { + block: defaultBlock.id, + place: instr.lvalue, + value: instr.value, + id: instr.id, + }; + } + else { + const instr = defaultBlock.instructions.at(-1); + const sequence = { + kind: 'SequenceExpression', + instructions: defaultBlock.instructions.slice(0, -1), + id: instr.id, + value: instr.value, + loc: loc, + }; + return { + block: defaultBlock.id, + place: defaultBlock.terminal.test, + value: sequence, + id: defaultBlock.terminal.id, + }; + } + } + else if (defaultBlock.terminal.kind === 'goto') { + const instructions = defaultBlock.instructions; + if (instructions.length === 0) { + CompilerError.invariant(false, { + reason: 'Expected goto value block to have at least one instruction', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + else if (defaultBlock.instructions.length === 1) { + const instr = defaultBlock.instructions[0]; + let place = instr.lvalue; + let value = instr.value; + if (value.kind === 'StoreLocal' && + value.lvalue.place.identifier.name === null) { + place = value.lvalue.place; + value = { + kind: 'LoadLocal', + place: value.value, + loc: value.value.loc, + }; + } + return { + block: defaultBlock.id, + place, + value, + id: instr.id, + }; + } + else { + const instr = defaultBlock.instructions.at(-1); + let place = instr.lvalue; + let value = instr.value; + if (value.kind === 'StoreLocal' && + value.lvalue.place.identifier.name === null) { + place = value.lvalue.place; + value = { + kind: 'LoadLocal', + place: value.value, + loc: value.value.loc, + }; + } + const sequence = { + kind: 'SequenceExpression', + instructions: defaultBlock.instructions.slice(0, -1), + id: instr.id, + value, + loc: loc, + }; + return { + block: defaultBlock.id, + place, + value: sequence, + id: instr.id, + }; + } + } + else { + const init = this.visitValueBlockTerminal(defaultBlock.terminal); + const final = this.visitValueBlock(init.fallthrough, loc); + const sequence = { + kind: 'SequenceExpression', + instructions: [ + ...defaultBlock.instructions, + { + id: init.id, + loc, + lvalue: init.place, + value: init.value, + }, + ], + id: final.id, + value: final.value, + loc, + }; + return { + block: init.fallthrough, + value: sequence, + place: final.place, + id: final.id, + }; + } + } + visitValueBlockTerminal(terminal) { + switch (terminal.kind) { + case 'sequence': { + const block = this.visitValueBlock(terminal.block, terminal.loc); + return { + value: block.value, + place: block.place, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'optional': { + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for optional test block`, + description: null, + loc: testBlock.terminal.loc, + suggestions: null, + }); + } + const consequent = this.visitValueBlock(testBlock.terminal.consequent, terminal.loc); + const call = { + kind: 'SequenceExpression', + instructions: [ + { + id: test.id, + loc: testBlock.terminal.loc, + lvalue: test.place, + value: test.value, + }, + ], + id: consequent.id, + value: consequent.value, + loc: terminal.loc, + }; + return { + place: Object.assign({}, consequent.place), + value: { + kind: 'OptionalExpression', + optional: terminal.optional, + value: call, + id: terminal.id, + loc: terminal.loc, + }, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'logical': { + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for logical test block`, + description: null, + loc: testBlock.terminal.loc, + suggestions: null, + }); + } + const leftFinal = this.visitValueBlock(testBlock.terminal.consequent, terminal.loc); + const left = { + kind: 'SequenceExpression', + instructions: [ + { + id: test.id, + loc: terminal.loc, + lvalue: test.place, + value: test.value, + }, + ], + id: leftFinal.id, + value: leftFinal.value, + loc: terminal.loc, + }; + const right = this.visitValueBlock(testBlock.terminal.alternate, terminal.loc); + const value = { + kind: 'LogicalExpression', + operator: terminal.operator, + left: left, + right: right.value, + loc: terminal.loc, + }; + return { + place: Object.assign({}, leftFinal.place), + value, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'ternary': { + const test = this.visitValueBlock(terminal.test, terminal.loc); + const testBlock = this.cx.ir.blocks.get(test.block); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for ternary test block`, + description: null, + loc: testBlock.terminal.loc, + suggestions: null, + }); + } + const consequent = this.visitValueBlock(testBlock.terminal.consequent, terminal.loc); + const alternate = this.visitValueBlock(testBlock.terminal.alternate, terminal.loc); + const value = { + kind: 'ConditionalExpression', + test: test.value, + consequent: consequent.value, + alternate: alternate.value, + loc: terminal.loc, + }; + return { + place: Object.assign({}, consequent.place), + value, + fallthrough: terminal.fallthrough, + id: terminal.id, + }; + } + case 'maybe-throw': { + CompilerError.throwTodo({ + reason: `Support value blocks (conditional, logical, optional chaining, etc) within a try/catch statement`, + description: null, + loc: terminal.loc, + suggestions: null, + }); + } + case 'label': { + CompilerError.throwTodo({ + reason: `Support labeled statements combined with value blocks (conditional, logical, optional chaining, etc)`, + description: null, + loc: terminal.loc, + suggestions: null, + }); + } + default: { + CompilerError.throwTodo({ + reason: `Support \`${terminal.kind}\` as a value block terminal (conditional, logical, optional chaining, etc)`, + description: null, + loc: terminal.loc, + suggestions: null, + }); + } + } + } + emptyBlock() { + return []; + } + visitBreak(block, id, loc) { + const target = this.cx.getBreakTarget(block); + if (target === null) { + CompilerError.invariant(false, { + reason: 'Expected a break target', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + if (this.cx.scopeFallthroughs.has(target.block)) { + CompilerError.invariant(target.type === 'implicit', { + reason: 'Expected reactive scope to implicitly break to fallthrough', + description: null, + details: [ + { + kind: 'error', + loc, + message: null, + }, + ], + }); + return null; + } + return { + kind: 'terminal', + terminal: { + kind: 'break', + loc, + target: target.block, + id, + targetKind: target.type, + }, + label: null, + }; + } + visitContinue(block, id, loc) { + const target = this.cx.getContinueTarget(block); + CompilerError.invariant(target !== null, { + reason: `Expected continue target to be scheduled for bb${block}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return { + kind: 'terminal', + terminal: { + kind: 'continue', + loc, + target: target.block, + id, + targetKind: target.type, + }, + label: null, + }; + } +} +let Context$3 = class Context { + constructor(ir) { + _Context_nextScheduleId.set(this, 0); + this.emitted = new Set(); + this.scopeFallthroughs = new Set(); + _Context_scheduled.set(this, new Set()); + _Context_catchHandlers.set(this, new Set()); + _Context_controlFlowStack.set(this, []); + this.ir = ir; + } + block(id) { + return this.ir.blocks.get(id); + } + scheduleCatchHandler(block) { + __classPrivateFieldGet(this, _Context_catchHandlers, "f").add(block); + } + reachable(id) { + const block = this.ir.blocks.get(id); + return block.terminal.kind !== 'unreachable'; + } + schedule(block, type) { + var _a, _b; + const id = (__classPrivateFieldSet(this, _Context_nextScheduleId, (_b = __classPrivateFieldGet(this, _Context_nextScheduleId, "f"), _a = _b++, _b), "f"), _a); + CompilerError.invariant(!__classPrivateFieldGet(this, _Context_scheduled, "f").has(block), { + reason: `Break block is already scheduled: bb${block}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(block); + __classPrivateFieldGet(this, _Context_controlFlowStack, "f").push({ block, id, type }); + return id; + } + scheduleLoop(fallthroughBlock, continueBlock, loopBlock) { + var _a, _b; + const id = (__classPrivateFieldSet(this, _Context_nextScheduleId, (_b = __classPrivateFieldGet(this, _Context_nextScheduleId, "f"), _a = _b++, _b), "f"), _a); + const ownsBlock = !__classPrivateFieldGet(this, _Context_scheduled, "f").has(fallthroughBlock); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(fallthroughBlock); + CompilerError.invariant(!__classPrivateFieldGet(this, _Context_scheduled, "f").has(continueBlock), { + reason: `Continue block is already scheduled: bb${continueBlock}`, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(continueBlock); + let ownsLoop = false; + if (loopBlock !== null) { + ownsLoop = !__classPrivateFieldGet(this, _Context_scheduled, "f").has(loopBlock); + __classPrivateFieldGet(this, _Context_scheduled, "f").add(loopBlock); + } + __classPrivateFieldGet(this, _Context_controlFlowStack, "f").push({ + block: fallthroughBlock, + ownsBlock, + id, + type: 'loop', + continueBlock, + loopBlock, + ownsLoop, + }); + return id; + } + unschedule(scheduleId) { + const last = __classPrivateFieldGet(this, _Context_controlFlowStack, "f").pop(); + CompilerError.invariant(last !== undefined && last.id === scheduleId, { + reason: 'Can only unschedule the last target', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (last.type !== 'loop' || last.ownsBlock !== null) { + __classPrivateFieldGet(this, _Context_scheduled, "f").delete(last.block); + } + if (last.type === 'loop') { + __classPrivateFieldGet(this, _Context_scheduled, "f").delete(last.continueBlock); + if (last.ownsLoop && last.loopBlock !== null) { + __classPrivateFieldGet(this, _Context_scheduled, "f").delete(last.loopBlock); + } + } + } + unscheduleAll(scheduleIds) { + for (let i = scheduleIds.length - 1; i >= 0; i--) { + this.unschedule(scheduleIds[i]); + } + } + isScheduled(block) { + return __classPrivateFieldGet(this, _Context_scheduled, "f").has(block) || __classPrivateFieldGet(this, _Context_catchHandlers, "f").has(block); + } + getBreakTarget(block) { + let hasPrecedingLoop = false; + for (let i = __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1; i >= 0; i--) { + const target = __classPrivateFieldGet(this, _Context_controlFlowStack, "f")[i]; + if (target.block === block) { + let type; + if (target.type === 'loop') { + type = hasPrecedingLoop ? 'labeled' : 'unlabeled'; + } + else if (i === __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1) { + type = 'implicit'; + } + else { + type = 'labeled'; + } + return { + block: target.block, + type, + }; + } + hasPrecedingLoop || (hasPrecedingLoop = target.type === 'loop'); + } + CompilerError.invariant(false, { + reason: 'Expected a break target', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } + getContinueTarget(block) { + let hasPrecedingLoop = false; + for (let i = __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1; i >= 0; i--) { + const target = __classPrivateFieldGet(this, _Context_controlFlowStack, "f")[i]; + if (target.type == 'loop' && target.continueBlock === block) { + let type; + if (hasPrecedingLoop) { + type = 'labeled'; + } + else if (i === __classPrivateFieldGet(this, _Context_controlFlowStack, "f").length - 1) { + type = 'implicit'; + } + else { + type = 'unlabeled'; + } + return { + block: target.block, + type, + }; + } + hasPrecedingLoop || (hasPrecedingLoop = target.type === 'loop'); + } + return null; + } + debugBreakTargets() { + return __classPrivateFieldGet(this, _Context_controlFlowStack, "f").map(target => (Object.assign({}, target))); + } +}; +_Context_nextScheduleId = new WeakMap(), _Context_scheduled = new WeakMap(), _Context_catchHandlers = new WeakMap(), _Context_controlFlowStack = new WeakMap(); + +var GuardKind; +(function (GuardKind) { + GuardKind[GuardKind["PushHookGuard"] = 0] = "PushHookGuard"; + GuardKind[GuardKind["PopHookGuard"] = 1] = "PopHookGuard"; + GuardKind[GuardKind["AllowHook"] = 2] = "AllowHook"; + GuardKind[GuardKind["DisallowHook"] = 3] = "DisallowHook"; +})(GuardKind || (GuardKind = {})); + +function memoizeFbtAndMacroOperandsInSameScope(fn) { + var _a; + const fbtMacroTags = new Set([ + ...Array.from(FBT_TAGS).map((tag) => [tag, []]), + ...((_a = fn.env.config.customMacros) !== null && _a !== void 0 ? _a : []), + ]); + const fbtValues = new Set(); + const macroMethods = new Map(); + while (true) { + let vsize = fbtValues.size; + let msize = macroMethods.size; + visit$1(fn, fbtMacroTags, fbtValues, macroMethods); + if (vsize === fbtValues.size && msize === macroMethods.size) { + break; + } + } + return fbtValues; +} +const FBT_TAGS = new Set([ + 'fbt', + 'fbt:param', + 'fbs', + 'fbs:param', +]); +const SINGLE_CHILD_FBT_TAGS = new Set([ + 'fbt:param', + 'fbs:param', +]); +function visit$1(fn, fbtMacroTags, fbtValues, macroMethods) { + for (const [, block] of fn.body.blocks) { + for (const instruction of block.instructions) { + const { lvalue, value } = instruction; + if (lvalue === null) { + continue; + } + if (value.kind === 'Primitive' && + typeof value.value === 'string' && + matchesExactTag(value.value, fbtMacroTags)) { + fbtValues.add(lvalue.identifier.id); + } + else if (value.kind === 'LoadGlobal' && + matchesExactTag(value.binding.name, fbtMacroTags)) { + fbtValues.add(lvalue.identifier.id); + } + else if (value.kind === 'LoadGlobal' && + matchTagRoot(value.binding.name, fbtMacroTags) !== null) { + const methods = matchTagRoot(value.binding.name, fbtMacroTags); + macroMethods.set(lvalue.identifier.id, methods); + } + else if (value.kind === 'PropertyLoad' && + macroMethods.has(value.object.identifier.id)) { + const methods = macroMethods.get(value.object.identifier.id); + const newMethods = []; + for (const method of methods) { + if (method.length > 0 && + (method[0].type === 'wildcard' || + (method[0].type === 'name' && method[0].name === value.property))) { + if (method.length > 1) { + newMethods.push(method.slice(1)); + } + else { + fbtValues.add(lvalue.identifier.id); + } + } + } + if (newMethods.length > 0) { + macroMethods.set(lvalue.identifier.id, newMethods); + } + } + else if (isFbtCallExpression(fbtValues, value)) { + const fbtScope = lvalue.identifier.scope; + if (fbtScope === null) { + continue; + } + for (const operand of eachReactiveValueOperand(value)) { + operand.identifier.scope = fbtScope; + expandFbtScopeRange(fbtScope.range, operand.identifier.mutableRange); + fbtValues.add(operand.identifier.id); + } + } + else if (isFbtJsxExpression(fbtMacroTags, fbtValues, value) || + isFbtJsxChild(fbtValues, lvalue, value)) { + const fbtScope = lvalue.identifier.scope; + if (fbtScope === null) { + continue; + } + for (const operand of eachReactiveValueOperand(value)) { + operand.identifier.scope = fbtScope; + expandFbtScopeRange(fbtScope.range, operand.identifier.mutableRange); + fbtValues.add(operand.identifier.id); + } + } + else if (fbtValues.has(lvalue.identifier.id)) { + const fbtScope = lvalue.identifier.scope; + if (fbtScope === null) { + return; + } + for (const operand of eachReactiveValueOperand(value)) { + if (operand.identifier.name !== null && + operand.identifier.name.kind === 'named') { + continue; + } + operand.identifier.scope = fbtScope; + expandFbtScopeRange(fbtScope.range, operand.identifier.mutableRange); + } + } + } + } +} +function matchesExactTag(s, tags) { + return Array.from(tags).some(macro => typeof macro === 'string' + ? s === macro + : macro[1].length === 0 && macro[0] === s); +} +function matchTagRoot(s, tags) { + const methods = []; + for (const macro of tags) { + if (typeof macro === 'string') { + continue; + } + const [tag, rest] = macro; + if (tag === s && rest.length > 0) { + methods.push(rest); + } + } + if (methods.length > 0) { + return methods; + } + else { + return null; + } +} +function isFbtCallExpression(fbtValues, value) { + return ((value.kind === 'CallExpression' && + fbtValues.has(value.callee.identifier.id)) || + (value.kind === 'MethodCall' && fbtValues.has(value.property.identifier.id))); +} +function isFbtJsxExpression(fbtMacroTags, fbtValues, value) { + return (value.kind === 'JsxExpression' && + ((value.tag.kind === 'Identifier' && + fbtValues.has(value.tag.identifier.id)) || + (value.tag.kind === 'BuiltinTag' && + matchesExactTag(value.tag.name, fbtMacroTags)))); +} +function isFbtJsxChild(fbtValues, lvalue, value) { + return ((value.kind === 'JsxExpression' || value.kind === 'JsxFragment') && + lvalue !== null && + fbtValues.has(lvalue.identifier.id)); +} +function expandFbtScopeRange(fbtRange, extendWith) { + if (extendWith.start !== 0) { + fbtRange.start = makeInstructionId(Math.min(fbtRange.start, extendWith.start)); + } +} + +var _Context_nextCacheIndex, _Context_declarations; +const MEMO_CACHE_SENTINEL = 'react.memo_cache_sentinel'; +const EARLY_RETURN_SENTINEL = 'react.early_return_sentinel'; +function codegenFunction(fn, { uniqueIdentifiers, fbtOperands, }) { + var _a, _b, _c; + const cx = new Context$2(fn.env, (_a = fn.id) !== null && _a !== void 0 ? _a : '[[ anonymous ]]', uniqueIdentifiers, fbtOperands, null); + let fastRefreshState = null; + if (fn.env.config.enableResetCacheOnSourceFileChanges && + fn.env.code !== null) { + const hash = crypto.createHmac('sha256', fn.env.code).digest('hex'); + fastRefreshState = { + cacheIndex: cx.nextCacheIndex, + hash, + }; + } + const compileResult = codegenReactiveFunction(cx, fn); + if (compileResult.isErr()) { + return compileResult; + } + const compiled = compileResult.unwrap(); + const hookGuard = fn.env.config.enableEmitHookGuards; + if (hookGuard != null && fn.env.isInferredMemoEnabled) { + compiled.body = libExports$1.blockStatement([ + createHookGuard(hookGuard, fn.env.programContext, compiled.body.body, GuardKind.PushHookGuard, GuardKind.PopHookGuard), + ]); + } + const cacheCount = compiled.memoSlotsUsed; + if (cacheCount !== 0) { + const preface = []; + const useMemoCacheIdentifier = fn.env.programContext.addMemoCacheImport().name; + preface.push(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.callExpression(libExports$1.identifier(useMemoCacheIdentifier), [ + libExports$1.numericLiteral(cacheCount), + ])), + ])); + if (fastRefreshState !== null) { + const index = cx.synthesizeName('$i'); + preface.push(libExports$1.ifStatement(libExports$1.binaryExpression('!==', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(fastRefreshState.cacheIndex), true), libExports$1.stringLiteral(fastRefreshState.hash)), libExports$1.blockStatement([ + libExports$1.forStatement(libExports$1.variableDeclaration('let', [ + libExports$1.variableDeclarator(libExports$1.identifier(index), libExports$1.numericLiteral(0)), + ]), libExports$1.binaryExpression('<', libExports$1.identifier(index), libExports$1.numericLiteral(cacheCount)), libExports$1.assignmentExpression('+=', libExports$1.identifier(index), libExports$1.numericLiteral(1)), libExports$1.blockStatement([ + libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.identifier(index), true), libExports$1.callExpression(libExports$1.memberExpression(libExports$1.identifier('Symbol'), libExports$1.identifier('for')), [libExports$1.stringLiteral(MEMO_CACHE_SENTINEL)]))), + ])), + libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(fastRefreshState.cacheIndex), true), libExports$1.stringLiteral(fastRefreshState.hash))), + ]))); + } + compiled.body.body.unshift(...preface); + } + const emitInstrumentForget = fn.env.config.enableEmitInstrumentForget; + if (emitInstrumentForget != null && + fn.id != null && + fn.env.isInferredMemoEnabled) { + const gating = emitInstrumentForget.gating != null + ? libExports$1.identifier(fn.env.programContext.addImportSpecifier(emitInstrumentForget.gating).name) + : null; + const globalGating = emitInstrumentForget.globalGating != null + ? libExports$1.identifier(emitInstrumentForget.globalGating) + : null; + if (emitInstrumentForget.globalGating != null) { + const assertResult = fn.env.programContext.assertGlobalBinding(emitInstrumentForget.globalGating); + if (assertResult.isErr()) { + return assertResult; + } + } + let ifTest; + if (gating != null && globalGating != null) { + ifTest = libExports$1.logicalExpression('&&', globalGating, gating); + } + else if (gating != null) { + ifTest = gating; + } + else { + CompilerError.invariant(globalGating != null, { + reason: 'Bad config not caught! Expected at least one of gating or globalGating', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + ifTest = globalGating; + } + const instrumentFnIdentifier = fn.env.programContext.addImportSpecifier(emitInstrumentForget.fn).name; + const test = libExports$1.ifStatement(ifTest, libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(instrumentFnIdentifier), [ + libExports$1.stringLiteral(fn.id), + libExports$1.stringLiteral((_b = fn.env.filename) !== null && _b !== void 0 ? _b : ''), + ]))); + compiled.body.body.unshift(test); + } + const outlined = []; + for (const { fn: outlinedFunction, type } of cx.env.getOutlinedFunctions()) { + const reactiveFunction = buildReactiveFunction(outlinedFunction); + pruneUnusedLabels(reactiveFunction); + pruneUnusedLValues(reactiveFunction); + pruneHoistedContexts(reactiveFunction); + const identifiers = renameVariables(reactiveFunction); + const codegen = codegenReactiveFunction(new Context$2(cx.env, (_c = reactiveFunction.id) !== null && _c !== void 0 ? _c : '[[ anonymous ]]', identifiers, cx.fbtOperands), reactiveFunction); + if (codegen.isErr()) { + return codegen; + } + outlined.push({ fn: codegen.unwrap(), type }); + } + compiled.outlined = outlined; + return compileResult; +} +function codegenReactiveFunction(cx, fn) { + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + cx.temp.set(place.identifier.declarationId, null); + cx.declare(place.identifier); + } + const params = fn.params.map(param => convertParameter(param)); + const body = codegenBlock(cx, fn.body); + body.directives = fn.directives.map(d => libExports$1.directive(libExports$1.directiveLiteral(d))); + const statements = body.body; + if (statements.length !== 0) { + const last = statements[statements.length - 1]; + if (last.type === 'ReturnStatement' && last.argument == null) { + statements.pop(); + } + } + if (cx.errors.hasAnyErrors()) { + return Err(cx.errors); + } + const countMemoBlockVisitor = new CountMemoBlockVisitor(fn.env); + visitReactiveFunction(fn, countMemoBlockVisitor, undefined); + return Ok({ + type: 'CodegenFunction', + loc: fn.loc, + id: fn.id !== null ? libExports$1.identifier(fn.id) : null, + nameHint: fn.nameHint, + params, + body, + generator: fn.generator, + async: fn.async, + memoSlotsUsed: cx.nextCacheIndex, + memoBlocks: countMemoBlockVisitor.memoBlocks, + memoValues: countMemoBlockVisitor.memoValues, + prunedMemoBlocks: countMemoBlockVisitor.prunedMemoBlocks, + prunedMemoValues: countMemoBlockVisitor.prunedMemoValues, + outlined: [], + hasFireRewrite: fn.env.hasFireRewrite, + hasInferredEffect: fn.env.hasInferredEffect, + inferredEffectLocations: fn.env.inferredEffectLocations, + }); +} +class CountMemoBlockVisitor extends ReactiveFunctionVisitor { + constructor(env) { + super(); + this.memoBlocks = 0; + this.memoValues = 0; + this.prunedMemoBlocks = 0; + this.prunedMemoValues = 0; + this.env = env; + } + visitScope(scopeBlock, state) { + this.memoBlocks += 1; + this.memoValues += scopeBlock.scope.declarations.size; + this.traverseScope(scopeBlock, state); + } + visitPrunedScope(scopeBlock, state) { + this.prunedMemoBlocks += 1; + this.prunedMemoValues += scopeBlock.scope.declarations.size; + this.traversePrunedScope(scopeBlock, state); + } +} +function convertParameter(param) { + if (param.kind === 'Identifier') { + return convertIdentifier(param.identifier); + } + else { + return libExports$1.restElement(convertIdentifier(param.place.identifier)); + } +} +let Context$2 = class Context { + constructor(env, fnName, uniqueIdentifiers, fbtOperands, temporaries = null) { + _Context_nextCacheIndex.set(this, 0); + _Context_declarations.set(this, new Set()); + this.errors = new CompilerError(); + this.objectMethods = new Map(); + this.synthesizedNames = new Map(); + this.env = env; + this.fnName = fnName; + this.uniqueIdentifiers = uniqueIdentifiers; + this.fbtOperands = fbtOperands; + this.temp = temporaries !== null ? new Map(temporaries) : new Map(); + } + get nextCacheIndex() { + var _a, _b; + return __classPrivateFieldSet(this, _Context_nextCacheIndex, (_b = __classPrivateFieldGet(this, _Context_nextCacheIndex, "f"), _a = _b++, _b), "f"), _a; + } + declare(identifier) { + __classPrivateFieldGet(this, _Context_declarations, "f").add(identifier.declarationId); + } + hasDeclared(identifier) { + return __classPrivateFieldGet(this, _Context_declarations, "f").has(identifier.declarationId); + } + synthesizeName(name) { + const previous = this.synthesizedNames.get(name); + if (previous !== undefined) { + return previous; + } + let validated = makeIdentifierName(name).value; + let index = 0; + while (this.uniqueIdentifiers.has(validated)) { + validated = makeIdentifierName(`${name}${index++}`).value; + } + this.uniqueIdentifiers.add(validated); + this.synthesizedNames.set(name, validated); + return validated; + } +}; +_Context_nextCacheIndex = new WeakMap(), _Context_declarations = new WeakMap(); +function codegenBlock(cx, block) { + const temp = new Map(cx.temp); + const result = codegenBlockNoReset(cx, block); + for (const [key, value] of cx.temp) { + if (!temp.has(key)) { + continue; + } + CompilerError.invariant(temp.get(key) === value, { + reason: 'Expected temporary value to be unchanged', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + } + cx.temp = temp; + return result; +} +function codegenBlockNoReset(cx, block) { + const statements = []; + for (const item of block) { + switch (item.kind) { + case 'instruction': { + const statement = codegenInstructionNullable(cx, item.instruction); + if (statement !== null) { + statements.push(statement); + } + break; + } + case 'pruned-scope': { + const scopeBlock = codegenBlockNoReset(cx, item.instructions); + statements.push(...scopeBlock.body); + break; + } + case 'scope': { + const temp = new Map(cx.temp); + codegenReactiveScope(cx, statements, item.scope, item.instructions); + cx.temp = temp; + break; + } + case 'terminal': { + const statement = codegenTerminal(cx, item.terminal); + if (statement === null) { + break; + } + if (item.label !== null && !item.label.implicit) { + const block = statement.type === 'BlockStatement' && statement.body.length === 1 + ? statement.body[0] + : statement; + statements.push(libExports$1.labeledStatement(libExports$1.identifier(codegenLabel(item.label.id)), block)); + } + else if (statement.type === 'BlockStatement') { + statements.push(...statement.body); + } + else { + statements.push(statement); + } + break; + } + default: { + assertExhaustive$1(item, `Unexpected item kind \`${item.kind}\``); + } + } + } + return libExports$1.blockStatement(statements); +} +function wrapCacheDep(cx, value) { + if (cx.env.config.enableEmitFreeze != null && cx.env.isInferredMemoEnabled) { + const emitFreezeIdentifier = cx.env.programContext.addImportSpecifier(cx.env.config.enableEmitFreeze).name; + cx.env.programContext + .assertGlobalBinding(EMIT_FREEZE_GLOBAL_GATING, cx.env.scope) + .unwrap(); + return libExports$1.conditionalExpression(libExports$1.identifier(EMIT_FREEZE_GLOBAL_GATING), libExports$1.callExpression(libExports$1.identifier(emitFreezeIdentifier), [ + value, + libExports$1.stringLiteral(cx.fnName), + ]), value); + } + else { + return value; + } +} +function codegenReactiveScope(cx, statements, scope, block) { + const cacheStoreStatements = []; + const cacheLoadStatements = []; + const cacheLoads = []; + const changeExpressions = []; + const changeExpressionComments = []; + const outputComments = []; + for (const dep of [...scope.dependencies].sort(compareScopeDependency)) { + const index = cx.nextCacheIndex; + changeExpressionComments.push(printDependencyComment(dep)); + const comparison = libExports$1.binaryExpression('!==', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true), codegenDependency(cx, dep)); + if (cx.env.config.enableChangeVariableCodegen) { + const changeIdentifier = libExports$1.identifier(cx.synthesizeName(`c_${index}`)); + statements.push(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(changeIdentifier, comparison), + ])); + changeExpressions.push(changeIdentifier); + } + else { + changeExpressions.push(comparison); + } + cacheStoreStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true), codegenDependency(cx, dep)))); + } + let firstOutputIndex = null; + for (const [, { identifier }] of [...scope.declarations].sort(([, a], [, b]) => compareScopeDeclaration(a, b))) { + const index = cx.nextCacheIndex; + if (firstOutputIndex === null) { + firstOutputIndex = index; + } + CompilerError.invariant(identifier.name != null, { + reason: `Expected scope declaration identifier to be named`, + description: `Declaration \`${printIdentifier(identifier)}\` is unnamed in scope @${scope.id}`, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + const name = convertIdentifier(identifier); + outputComments.push(name.name); + if (!cx.hasDeclared(identifier)) { + statements.push(libExports$1.variableDeclaration('let', [libExports$1.variableDeclarator(name)])); + } + cacheLoads.push({ name, index, value: wrapCacheDep(cx, name) }); + cx.declare(identifier); + } + for (const reassignment of scope.reassignments) { + const index = cx.nextCacheIndex; + if (firstOutputIndex === null) { + firstOutputIndex = index; + } + const name = convertIdentifier(reassignment); + outputComments.push(name.name); + cacheLoads.push({ name, index, value: wrapCacheDep(cx, name) }); + } + let testCondition = changeExpressions.reduce((acc, ident) => { + if (acc == null) { + return ident; + } + return libExports$1.logicalExpression('||', acc, ident); + }, null); + if (testCondition === null) { + CompilerError.invariant(firstOutputIndex !== null, { + reason: `Expected scope to have at least one declaration`, + description: `Scope '@${scope.id}' has no declarations`, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + testCondition = libExports$1.binaryExpression('===', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(firstOutputIndex), true), libExports$1.callExpression(libExports$1.memberExpression(libExports$1.identifier('Symbol'), libExports$1.identifier('for')), [libExports$1.stringLiteral(MEMO_CACHE_SENTINEL)])); + } + if (cx.env.config.disableMemoizationForDebugging) { + CompilerError.invariant(cx.env.config.enableChangeDetectionForDebugging == null, { + reason: `Expected to not have both change detection enabled and memoization disabled`, + description: `Incompatible config options`, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + testCondition = libExports$1.logicalExpression('||', testCondition, libExports$1.booleanLiteral(true)); + } + let computationBlock = codegenBlock(cx, block); + let memoStatement; + const detectionFunction = cx.env.config.enableChangeDetectionForDebugging; + if (detectionFunction != null && changeExpressions.length > 0) { + const loc = typeof scope.loc === 'symbol' + ? 'unknown location' + : `(${scope.loc.start.line}:${scope.loc.end.line})`; + const importedDetectionFunctionIdentifier = cx.env.programContext.addImportSpecifier(detectionFunction).name; + const cacheLoadOldValueStatements = []; + const changeDetectionStatements = []; + const idempotenceDetectionStatements = []; + for (const { name, index, value } of cacheLoads) { + const loadName = cx.synthesizeName(`old$${name.name}`); + const slot = libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true); + cacheStoreStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', slot, value))); + cacheLoadOldValueStatements.push(libExports$1.variableDeclaration('let', [ + libExports$1.variableDeclarator(libExports$1.identifier(loadName), slot), + ])); + changeDetectionStatements.push(libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(importedDetectionFunctionIdentifier), [ + libExports$1.identifier(loadName), + libExports$1.cloneNode(name, true), + libExports$1.stringLiteral(name.name), + libExports$1.stringLiteral(cx.fnName), + libExports$1.stringLiteral('cached'), + libExports$1.stringLiteral(loc), + ]))); + idempotenceDetectionStatements.push(libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(importedDetectionFunctionIdentifier), [ + libExports$1.cloneNode(slot, true), + libExports$1.cloneNode(name, true), + libExports$1.stringLiteral(name.name), + libExports$1.stringLiteral(cx.fnName), + libExports$1.stringLiteral('recomputed'), + libExports$1.stringLiteral(loc), + ]))); + idempotenceDetectionStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', name, slot))); + } + const condition = cx.synthesizeName('condition'); + const recomputationBlock = libExports$1.cloneNode(computationBlock, true); + memoStatement = libExports$1.blockStatement([ + ...computationBlock.body, + libExports$1.variableDeclaration('let', [ + libExports$1.variableDeclarator(libExports$1.identifier(condition), testCondition), + ]), + libExports$1.ifStatement(libExports$1.unaryExpression('!', libExports$1.identifier(condition)), libExports$1.blockStatement([ + ...cacheLoadOldValueStatements, + ...changeDetectionStatements, + ])), + ...cacheStoreStatements, + libExports$1.ifStatement(libExports$1.identifier(condition), libExports$1.blockStatement([ + ...recomputationBlock.body, + ...idempotenceDetectionStatements, + ])), + ]); + } + else { + for (const { name, index, value } of cacheLoads) { + cacheStoreStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true), value))); + cacheLoadStatements.push(libExports$1.expressionStatement(libExports$1.assignmentExpression('=', name, libExports$1.memberExpression(libExports$1.identifier(cx.synthesizeName('$')), libExports$1.numericLiteral(index), true)))); + } + computationBlock.body.push(...cacheStoreStatements); + memoStatement = libExports$1.ifStatement(testCondition, computationBlock, libExports$1.blockStatement(cacheLoadStatements)); + } + if (cx.env.config.enableMemoizationComments) { + if (changeExpressionComments.length) { + libExports$1.addComment(memoStatement, 'leading', ` check if ${printDelimitedCommentList(changeExpressionComments, 'or')} changed`, true); + libExports$1.addComment(memoStatement, 'leading', ` "useMemo" for ${printDelimitedCommentList(outputComments, 'and')}:`, true); + } + else { + libExports$1.addComment(memoStatement, 'leading', ' cache value with no dependencies', true); + libExports$1.addComment(memoStatement, 'leading', ` "useMemo" for ${printDelimitedCommentList(outputComments, 'and')}:`, true); + } + if (computationBlock.body.length > 0) { + libExports$1.addComment(computationBlock.body[0], 'leading', ` Inputs changed, recompute`, true); + } + if (cacheLoadStatements.length > 0) { + libExports$1.addComment(cacheLoadStatements[0], 'leading', ` Inputs did not change, use cached value`, true); + } + } + statements.push(memoStatement); + const earlyReturnValue = scope.earlyReturnValue; + if (earlyReturnValue !== null) { + CompilerError.invariant(earlyReturnValue.value.name !== null && + earlyReturnValue.value.name.kind === 'named', { + reason: `Expected early return value to be promoted to a named variable`, + description: null, + details: [ + { + kind: 'error', + loc: earlyReturnValue.loc, + message: null, + }, + ], + suggestions: null, + }); + const name = earlyReturnValue.value.name.value; + statements.push(libExports$1.ifStatement(libExports$1.binaryExpression('!==', libExports$1.identifier(name), libExports$1.callExpression(libExports$1.memberExpression(libExports$1.identifier('Symbol'), libExports$1.identifier('for')), [libExports$1.stringLiteral(EARLY_RETURN_SENTINEL)])), libExports$1.blockStatement([libExports$1.returnStatement(libExports$1.identifier(name))]))); + } +} +function codegenTerminal(cx, terminal) { + switch (terminal.kind) { + case 'break': { + if (terminal.targetKind === 'implicit') { + return null; + } + return createBreakStatement(terminal.loc, terminal.targetKind === 'labeled' + ? libExports$1.identifier(codegenLabel(terminal.target)) + : null); + } + case 'continue': { + if (terminal.targetKind === 'implicit') { + return null; + } + return createContinueStatement(terminal.loc, terminal.targetKind === 'labeled' + ? libExports$1.identifier(codegenLabel(terminal.target)) + : null); + } + case 'for': { + return createForStatement(terminal.loc, codegenForInit(cx, terminal.init), codegenInstructionValueToExpression(cx, terminal.test), terminal.update !== null + ? codegenInstructionValueToExpression(cx, terminal.update) + : null, codegenBlock(cx, terminal.loop)); + } + case 'for-in': { + CompilerError.invariant(terminal.init.kind === 'SequenceExpression', { + reason: `Expected a sequence expression init for for..in`, + description: `Got \`${terminal.init.kind}\` expression instead`, + details: [ + { + kind: 'error', + loc: terminal.init.loc, + message: null, + }, + ], + suggestions: null, + }); + if (terminal.init.instructions.length !== 2) { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..in inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + const iterableCollection = terminal.init.instructions[0]; + const iterableItem = terminal.init.instructions[1]; + let lval; + switch (iterableItem.value.kind) { + case 'StoreLocal': { + lval = codegenLValue(cx, iterableItem.value.lvalue.place); + break; + } + case 'Destructure': { + lval = codegenLValue(cx, iterableItem.value.lvalue.pattern); + break; + } + case 'StoreContext': { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..in inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + default: + CompilerError.invariant(false, { + reason: `Expected a StoreLocal or Destructure to be assigned to the collection`, + description: `Found ${iterableItem.value.kind}`, + details: [ + { + kind: 'error', + loc: iterableItem.value.loc, + message: null, + }, + ], + suggestions: null, + }); + } + let varDeclKind; + switch (iterableItem.value.lvalue.kind) { + case InstructionKind.Const: + varDeclKind = 'const'; + break; + case InstructionKind.Let: + varDeclKind = 'let'; + break; + case InstructionKind.Reassign: + CompilerError.invariant(false, { + reason: 'Destructure should never be Reassign as it would be an Object/ArrayPattern', + description: null, + details: [ + { + kind: 'error', + loc: iterableItem.loc, + message: null, + }, + ], + suggestions: null, + }); + case InstructionKind.Catch: + case InstructionKind.HoistedConst: + case InstructionKind.HoistedLet: + case InstructionKind.HoistedFunction: + case InstructionKind.Function: + CompilerError.invariant(false, { + reason: `Unexpected ${iterableItem.value.lvalue.kind} variable in for..in collection`, + description: null, + details: [ + { + kind: 'error', + loc: iterableItem.loc, + message: null, + }, + ], + suggestions: null, + }); + default: + assertExhaustive$1(iterableItem.value.lvalue.kind, `Unhandled lvalue kind: ${iterableItem.value.lvalue.kind}`); + } + return createForInStatement(terminal.loc, createVariableDeclaration(iterableItem.value.loc, varDeclKind, [ + libExports$1.variableDeclarator(lval, null), + ]), codegenInstructionValueToExpression(cx, iterableCollection.value), codegenBlock(cx, terminal.loop)); + } + case 'for-of': { + CompilerError.invariant(terminal.init.kind === 'SequenceExpression' && + terminal.init.instructions.length === 1 && + terminal.init.instructions[0].value.kind === 'GetIterator', { + reason: `Expected a single-expression sequence expression init for for..of`, + description: `Got \`${terminal.init.kind}\` expression instead`, + details: [ + { + kind: 'error', + loc: terminal.init.loc, + message: null, + }, + ], + suggestions: null, + }); + const iterableCollection = terminal.init.instructions[0].value; + CompilerError.invariant(terminal.test.kind === 'SequenceExpression', { + reason: `Expected a sequence expression test for for..of`, + description: `Got \`${terminal.init.kind}\` expression instead`, + details: [ + { + kind: 'error', + loc: terminal.test.loc, + message: null, + }, + ], + suggestions: null, + }); + if (terminal.test.instructions.length !== 2) { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..of inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + const iterableItem = terminal.test.instructions[1]; + let lval; + switch (iterableItem.value.kind) { + case 'StoreLocal': { + lval = codegenLValue(cx, iterableItem.value.lvalue.place); + break; + } + case 'Destructure': { + lval = codegenLValue(cx, iterableItem.value.lvalue.pattern); + break; + } + case 'StoreContext': { + CompilerError.throwTodo({ + reason: 'Support non-trivial for..of inits', + description: null, + loc: terminal.init.loc, + suggestions: null, + }); + } + default: + CompilerError.invariant(false, { + reason: `Expected a StoreLocal or Destructure to be assigned to the collection`, + description: `Found ${iterableItem.value.kind}`, + details: [ + { + kind: 'error', + loc: iterableItem.value.loc, + message: null, + }, + ], + suggestions: null, + }); + } + let varDeclKind; + switch (iterableItem.value.lvalue.kind) { + case InstructionKind.Const: + varDeclKind = 'const'; + break; + case InstructionKind.Let: + varDeclKind = 'let'; + break; + case InstructionKind.Reassign: + case InstructionKind.Catch: + case InstructionKind.HoistedConst: + case InstructionKind.HoistedLet: + case InstructionKind.HoistedFunction: + case InstructionKind.Function: + CompilerError.invariant(false, { + reason: `Unexpected ${iterableItem.value.lvalue.kind} variable in for..of collection`, + description: null, + details: [ + { + kind: 'error', + loc: iterableItem.loc, + message: null, + }, + ], + suggestions: null, + }); + default: + assertExhaustive$1(iterableItem.value.lvalue.kind, `Unhandled lvalue kind: ${iterableItem.value.lvalue.kind}`); + } + return createForOfStatement(terminal.loc, createVariableDeclaration(iterableItem.value.loc, varDeclKind, [ + libExports$1.variableDeclarator(lval, null), + ]), codegenInstructionValueToExpression(cx, iterableCollection), codegenBlock(cx, terminal.loop)); + } + case 'if': { + const test = codegenPlaceToExpression(cx, terminal.test); + const consequent = codegenBlock(cx, terminal.consequent); + let alternate = null; + if (terminal.alternate !== null) { + const block = codegenBlock(cx, terminal.alternate); + if (block.body.length !== 0) { + alternate = block; + } + } + return createIfStatement(terminal.loc, test, consequent, alternate); + } + case 'return': { + const value = codegenPlaceToExpression(cx, terminal.value); + if (value.type === 'Identifier' && value.name === 'undefined') { + return libExports$1.returnStatement(); + } + return libExports$1.returnStatement(value); + } + case 'switch': { + return createSwitchStatement(terminal.loc, codegenPlaceToExpression(cx, terminal.test), terminal.cases.map(case_ => { + const test = case_.test !== null + ? codegenPlaceToExpression(cx, case_.test) + : null; + const block = codegenBlock(cx, case_.block); + return libExports$1.switchCase(test, block.body.length === 0 ? [] : [block]); + })); + } + case 'throw': { + return createThrowStatement(terminal.loc, codegenPlaceToExpression(cx, terminal.value)); + } + case 'do-while': { + const test = codegenInstructionValueToExpression(cx, terminal.test); + return createDoWhileStatement(terminal.loc, test, codegenBlock(cx, terminal.loop)); + } + case 'while': { + const test = codegenInstructionValueToExpression(cx, terminal.test); + return createWhileStatement(terminal.loc, test, codegenBlock(cx, terminal.loop)); + } + case 'label': { + return codegenBlock(cx, terminal.block); + } + case 'try': { + let catchParam = null; + if (terminal.handlerBinding !== null) { + catchParam = convertIdentifier(terminal.handlerBinding.identifier); + cx.temp.set(terminal.handlerBinding.identifier.declarationId, null); + } + return createTryStatement(terminal.loc, codegenBlock(cx, terminal.block), libExports$1.catchClause(catchParam, codegenBlock(cx, terminal.handler))); + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } +} +function codegenInstructionNullable(cx, instr) { + if (instr.value.kind === 'StoreLocal' || + instr.value.kind === 'StoreContext' || + instr.value.kind === 'Destructure' || + instr.value.kind === 'DeclareLocal' || + instr.value.kind === 'DeclareContext') { + let kind = instr.value.lvalue.kind; + let lvalue; + let value; + if (instr.value.kind === 'StoreLocal') { + kind = cx.hasDeclared(instr.value.lvalue.place.identifier) + ? InstructionKind.Reassign + : kind; + lvalue = instr.value.lvalue.place; + value = codegenPlaceToExpression(cx, instr.value.value); + } + else if (instr.value.kind === 'StoreContext') { + lvalue = instr.value.lvalue.place; + value = codegenPlaceToExpression(cx, instr.value.value); + } + else if (instr.value.kind === 'DeclareLocal' || + instr.value.kind === 'DeclareContext') { + if (cx.hasDeclared(instr.value.lvalue.place.identifier)) { + return null; + } + kind = instr.value.lvalue.kind; + lvalue = instr.value.lvalue.place; + value = null; + } + else { + lvalue = instr.value.lvalue.pattern; + let hasReassign = false; + let hasDeclaration = false; + for (const place of eachPatternOperand(lvalue)) { + if (kind !== InstructionKind.Reassign && + place.identifier.name === null) { + cx.temp.set(place.identifier.declarationId, null); + } + const isDeclared = cx.hasDeclared(place.identifier); + hasReassign || (hasReassign = isDeclared); + hasDeclaration || (hasDeclaration = !isDeclared); + } + if (hasReassign && hasDeclaration) { + CompilerError.invariant(false, { + reason: 'Encountered a destructuring operation where some identifiers are already declared (reassignments) but others are not (declarations)', + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + suggestions: null, + }); + } + else if (hasReassign) { + kind = InstructionKind.Reassign; + } + value = codegenPlaceToExpression(cx, instr.value.value); + } + switch (kind) { + case InstructionKind.Const: { + CompilerError.invariant(instr.lvalue === null, { + reason: `Const declaration cannot be referenced as an expression`, + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: `this is ${kind}`, + }, + ], + suggestions: null, + }); + return createVariableDeclaration(instr.loc, 'const', [ + libExports$1.variableDeclarator(codegenLValue(cx, lvalue), value), + ]); + } + case InstructionKind.Function: { + CompilerError.invariant(instr.lvalue === null, { + reason: `Function declaration cannot be referenced as an expression`, + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: `this is ${kind}`, + }, + ], + suggestions: null, + }); + const genLvalue = codegenLValue(cx, lvalue); + CompilerError.invariant(genLvalue.type === 'Identifier', { + reason: 'Expected an identifier as a function declaration lvalue', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + suggestions: null, + }); + CompilerError.invariant((value === null || value === void 0 ? void 0 : value.type) === 'FunctionExpression', { + reason: 'Expected a function as a function declaration value', + description: `Got ${value == null ? String(value) : value.type} at ${printInstruction(instr)}`, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + suggestions: null, + }); + return createFunctionDeclaration(instr.loc, genLvalue, value.params, value.body, value.generator, value.async); + } + case InstructionKind.Let: { + CompilerError.invariant(instr.lvalue === null, { + reason: `Const declaration cannot be referenced as an expression`, + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: 'this is const', + }, + ], + suggestions: null, + }); + return createVariableDeclaration(instr.loc, 'let', [ + libExports$1.variableDeclarator(codegenLValue(cx, lvalue), value), + ]); + } + case InstructionKind.Reassign: { + CompilerError.invariant(value !== null, { + reason: 'Expected a value for reassignment', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + suggestions: null, + }); + const expr = libExports$1.assignmentExpression('=', codegenLValue(cx, lvalue), value); + if (instr.lvalue !== null) { + if (instr.value.kind !== 'StoreContext') { + cx.temp.set(instr.lvalue.identifier.declarationId, expr); + return null; + } + else { + const statement = codegenInstruction(cx, instr, expr); + if (statement.type === 'EmptyStatement') { + return null; + } + return statement; + } + } + else { + return createExpressionStatement(instr.loc, expr); + } + } + case InstructionKind.Catch: { + return libExports$1.emptyStatement(); + } + case InstructionKind.HoistedLet: + case InstructionKind.HoistedConst: + case InstructionKind.HoistedFunction: { + CompilerError.invariant(false, { + reason: `Expected ${kind} to have been pruned in PruneHoistedContexts`, + description: null, + details: [ + { + kind: 'error', + loc: instr.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(kind, `Unexpected instruction kind \`${kind}\``); + } + } + } + else if (instr.value.kind === 'StartMemoize' || + instr.value.kind === 'FinishMemoize') { + return null; + } + else if (instr.value.kind === 'Debugger') { + return libExports$1.debuggerStatement(); + } + else if (instr.value.kind === 'ObjectMethod') { + CompilerError.invariant(instr.lvalue, { + reason: 'Expected object methods to have a temp lvalue', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + cx.objectMethods.set(instr.lvalue.identifier.id, instr.value); + return null; + } + else { + const value = codegenInstructionValue(cx, instr.value); + const statement = codegenInstruction(cx, instr, value); + if (statement.type === 'EmptyStatement') { + return null; + } + return statement; + } +} +function codegenForInit(cx, init) { + if (init.kind === 'SequenceExpression') { + const body = codegenBlock(cx, init.instructions.map(instruction => ({ + kind: 'instruction', + instruction, + }))).body; + const declarators = []; + let kind = 'const'; + body.forEach(instr => { + var _a; + let top = undefined; + if (instr.type === 'ExpressionStatement' && + instr.expression.type === 'AssignmentExpression' && + instr.expression.operator === '=' && + instr.expression.left.type === 'Identifier' && + ((_a = (top = declarators.at(-1))) === null || _a === void 0 ? void 0 : _a.id.type) === 'Identifier' && + (top === null || top === void 0 ? void 0 : top.id.name) === instr.expression.left.name && + (top === null || top === void 0 ? void 0 : top.init) == null) { + top.init = instr.expression.right; + } + else { + CompilerError.invariant(instr.type === 'VariableDeclaration' && + (instr.kind === 'let' || instr.kind === 'const'), { + reason: 'Expected a variable declaration', + details: [ + { + kind: 'error', + loc: init.loc, + message: null, + }, + ], + description: `Got ${instr.type}`, + suggestions: null, + }); + if (instr.kind === 'let') { + kind = 'let'; + } + declarators.push(...instr.declarations); + } + }); + CompilerError.invariant(declarators.length > 0, { + reason: 'Expected a variable declaration', + details: [ + { + kind: 'error', + loc: init.loc, + message: null, + }, + ], + description: null, + suggestions: null, + }); + return libExports$1.variableDeclaration(kind, declarators); + } + else { + return codegenInstructionValueToExpression(cx, init); + } +} +function printDependencyComment(dependency) { + const identifier = convertIdentifier(dependency.identifier); + let name = identifier.name; + if (dependency.path !== null) { + for (const path of dependency.path) { + name += `.${path.property}`; + } + } + return name; +} +function printDelimitedCommentList(items, finalCompletion) { + if (items.length === 2) { + return items.join(` ${finalCompletion} `); + } + else if (items.length <= 1) { + return items.join(''); + } + let output = []; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (i < items.length - 2) { + output.push(`${item}, `); + } + else if (i === items.length - 2) { + output.push(`${item}, ${finalCompletion} `); + } + else { + output.push(item); + } + } + return output.join(''); +} +function codegenDependency(cx, dependency) { + let object = convertIdentifier(dependency.identifier); + if (dependency.path.length !== 0) { + const hasOptional = dependency.path.some(path => path.optional); + for (const path of dependency.path) { + const property = typeof path.property === 'string' + ? libExports$1.identifier(path.property) + : libExports$1.numericLiteral(path.property); + const isComputed = typeof path.property !== 'string'; + if (hasOptional) { + object = libExports$1.optionalMemberExpression(object, property, isComputed, path.optional); + } + else { + object = libExports$1.memberExpression(object, property, isComputed); + } + } + } + return object; +} +function withLoc(fn) { + return (loc, ...args) => { + const node = fn(...args); + if (loc != null && loc != GeneratedSource) { + node.loc = loc; + } + return node; + }; +} +const createBinaryExpression = withLoc(libExports$1.binaryExpression); +const createExpressionStatement = withLoc(libExports$1.expressionStatement); +const createVariableDeclaration = withLoc(libExports$1.variableDeclaration); +const createFunctionDeclaration = withLoc(libExports$1.functionDeclaration); +const createWhileStatement = withLoc(libExports$1.whileStatement); +const createDoWhileStatement = withLoc(libExports$1.doWhileStatement); +const createSwitchStatement = withLoc(libExports$1.switchStatement); +const createIfStatement = withLoc(libExports$1.ifStatement); +const createForStatement = withLoc(libExports$1.forStatement); +const createForOfStatement = withLoc(libExports$1.forOfStatement); +const createForInStatement = withLoc(libExports$1.forInStatement); +const createTaggedTemplateExpression = withLoc(libExports$1.taggedTemplateExpression); +const createLogicalExpression = withLoc(libExports$1.logicalExpression); +const createSequenceExpression = withLoc(libExports$1.sequenceExpression); +const createConditionalExpression = withLoc(libExports$1.conditionalExpression); +const createTemplateLiteral = withLoc(libExports$1.templateLiteral); +const createJsxNamespacedName = withLoc(libExports$1.jsxNamespacedName); +const createJsxElement = withLoc(libExports$1.jsxElement); +const createJsxAttribute = withLoc(libExports$1.jsxAttribute); +const createJsxIdentifier = withLoc(libExports$1.jsxIdentifier); +const createJsxExpressionContainer = withLoc(libExports$1.jsxExpressionContainer); +const createJsxText = withLoc(libExports$1.jsxText); +const createJsxClosingElement = withLoc(libExports$1.jsxClosingElement); +const createJsxOpeningElement = withLoc(libExports$1.jsxOpeningElement); +const createStringLiteral = withLoc(libExports$1.stringLiteral); +const createThrowStatement = withLoc(libExports$1.throwStatement); +const createTryStatement = withLoc(libExports$1.tryStatement); +const createBreakStatement = withLoc(libExports$1.breakStatement); +const createContinueStatement = withLoc(libExports$1.continueStatement); +function createHookGuard(guard, context, stmts, before, after) { + const guardFnName = context.addImportSpecifier(guard).name; + function createHookGuardImpl(kind) { + return libExports$1.expressionStatement(libExports$1.callExpression(libExports$1.identifier(guardFnName), [libExports$1.numericLiteral(kind)])); + } + return libExports$1.tryStatement(libExports$1.blockStatement([createHookGuardImpl(before), ...stmts]), null, libExports$1.blockStatement([createHookGuardImpl(after)])); +} +function createCallExpression(env, callee, args, loc, isHook) { + const callExpr = libExports$1.callExpression(callee, args); + if (loc != null && loc != GeneratedSource) { + callExpr.loc = loc; + } + const hookGuard = env.config.enableEmitHookGuards; + if (hookGuard != null && isHook && env.isInferredMemoEnabled) { + const iife = libExports$1.functionExpression(null, [], libExports$1.blockStatement([ + createHookGuard(hookGuard, env.programContext, [libExports$1.returnStatement(callExpr)], GuardKind.AllowHook, GuardKind.DisallowHook), + ])); + return libExports$1.callExpression(iife, []); + } + else { + return callExpr; + } +} +function codegenLabel(id) { + return `bb${id}`; +} +function codegenInstruction(cx, instr, value) { + if (libExports$1.isStatement(value)) { + return value; + } + if (instr.lvalue === null) { + return libExports$1.expressionStatement(convertValueToExpression(value)); + } + if (instr.lvalue.identifier.name === null) { + cx.temp.set(instr.lvalue.identifier.declarationId, value); + return libExports$1.emptyStatement(); + } + else { + const expressionValue = convertValueToExpression(value); + if (cx.hasDeclared(instr.lvalue.identifier)) { + return createExpressionStatement(instr.loc, libExports$1.assignmentExpression('=', convertIdentifier(instr.lvalue.identifier), expressionValue)); + } + else { + return createVariableDeclaration(instr.loc, 'const', [ + libExports$1.variableDeclarator(convertIdentifier(instr.lvalue.identifier), expressionValue), + ]); + } + } +} +function convertValueToExpression(value) { + if (value.type === 'JSXText') { + return createStringLiteral(value.loc, value.value); + } + return value; +} +function codegenInstructionValueToExpression(cx, instrValue) { + const value = codegenInstructionValue(cx, instrValue); + return convertValueToExpression(value); +} +function codegenInstructionValue(cx, instrValue) { + var _a, _b, _c, _d, _e, _f, _g; + let value; + switch (instrValue.kind) { + case 'ArrayExpression': { + const elements = instrValue.elements.map(element => { + if (element.kind === 'Identifier') { + return codegenPlaceToExpression(cx, element); + } + else if (element.kind === 'Spread') { + return libExports$1.spreadElement(codegenPlaceToExpression(cx, element.place)); + } + else { + return null; + } + }); + value = libExports$1.arrayExpression(elements); + break; + } + case 'BinaryExpression': { + const left = codegenPlaceToExpression(cx, instrValue.left); + const right = codegenPlaceToExpression(cx, instrValue.right); + value = createBinaryExpression(instrValue.loc, instrValue.operator, left, right); + break; + } + case 'UnaryExpression': { + value = libExports$1.unaryExpression(instrValue.operator, codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'Primitive': { + value = codegenValue(cx, instrValue.loc, instrValue.value); + break; + } + case 'CallExpression': { + if (cx.env.config.enableForest) { + const callee = codegenPlaceToExpression(cx, instrValue.callee); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = libExports$1.callExpression(callee, args); + if (instrValue.typeArguments != null) { + value.typeArguments = libExports$1.typeParameterInstantiation(instrValue.typeArguments); + } + break; + } + const isHook = getHookKind(cx.env, instrValue.callee.identifier) != null; + const callee = codegenPlaceToExpression(cx, instrValue.callee); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = createCallExpression(cx.env, callee, args, instrValue.loc, isHook); + break; + } + case 'OptionalExpression': { + const optionalValue = codegenInstructionValueToExpression(cx, instrValue.value); + switch (optionalValue.type) { + case 'OptionalCallExpression': + case 'CallExpression': { + CompilerError.invariant(libExports$1.isExpression(optionalValue.callee), { + reason: 'v8 intrinsics are validated during lowering', + description: null, + details: [ + { + kind: 'error', + loc: (_a = optionalValue.callee.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + suggestions: null, + }); + value = libExports$1.optionalCallExpression(optionalValue.callee, optionalValue.arguments, instrValue.optional); + break; + } + case 'OptionalMemberExpression': + case 'MemberExpression': { + const property = optionalValue.property; + CompilerError.invariant(libExports$1.isExpression(property), { + reason: 'Private names are validated during lowering', + description: null, + details: [ + { + kind: 'error', + loc: (_b = property.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + value = libExports$1.optionalMemberExpression(optionalValue.object, property, optionalValue.computed, instrValue.optional); + break; + } + default: { + CompilerError.invariant(false, { + reason: 'Expected an optional value to resolve to a call expression or member expression', + description: `Got a \`${optionalValue.type}\``, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + } + } + break; + } + case 'MethodCall': { + const isHook = getHookKind(cx.env, instrValue.property.identifier) != null; + const memberExpr = codegenPlaceToExpression(cx, instrValue.property); + CompilerError.invariant(libExports$1.isMemberExpression(memberExpr) || + libExports$1.isOptionalMemberExpression(memberExpr), { + reason: '[Codegen] Internal error: MethodCall::property must be an unpromoted + unmemoized MemberExpression', + description: null, + details: [ + { + kind: 'error', + loc: (_c = memberExpr.loc) !== null && _c !== void 0 ? _c : null, + message: `Got: '${memberExpr.type}'`, + }, + ], + suggestions: null, + }); + CompilerError.invariant(libExports$1.isNodesEquivalent(memberExpr.object, codegenPlaceToExpression(cx, instrValue.receiver)), { + reason: '[Codegen] Internal error: Forget should always generate MethodCall::property ' + + 'as a MemberExpression of MethodCall::receiver', + description: null, + details: [ + { + kind: 'error', + loc: (_d = memberExpr.loc) !== null && _d !== void 0 ? _d : null, + message: null, + }, + ], + suggestions: null, + }); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = createCallExpression(cx.env, memberExpr, args, instrValue.loc, isHook); + break; + } + case 'NewExpression': { + const callee = codegenPlaceToExpression(cx, instrValue.callee); + const args = instrValue.args.map(arg => codegenArgument(cx, arg)); + value = libExports$1.newExpression(callee, args); + break; + } + case 'ObjectExpression': { + const properties = []; + for (const property of instrValue.properties) { + if (property.kind === 'ObjectProperty') { + const key = codegenObjectPropertyKey(cx, property.key); + switch (property.type) { + case 'property': { + const value = codegenPlaceToExpression(cx, property.place); + properties.push(libExports$1.objectProperty(key, value, property.key.kind === 'computed', key.type === 'Identifier' && + value.type === 'Identifier' && + value.name === key.name)); + break; + } + case 'method': { + const method = cx.objectMethods.get(property.place.identifier.id); + CompilerError.invariant(method, { + reason: 'Expected ObjectMethod instruction', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + const loweredFunc = method.loweredFunc; + const reactiveFunction = buildReactiveFunction(loweredFunc.func); + pruneUnusedLabels(reactiveFunction); + pruneUnusedLValues(reactiveFunction); + const fn = codegenReactiveFunction(new Context$2(cx.env, (_e = reactiveFunction.id) !== null && _e !== void 0 ? _e : '[[ anonymous ]]', cx.uniqueIdentifiers, cx.fbtOperands, cx.temp), reactiveFunction).unwrap(); + const babelNode = libExports$1.objectMethod('method', key, fn.params, fn.body, false); + babelNode.async = fn.async; + babelNode.generator = fn.generator; + properties.push(babelNode); + break; + } + default: + assertExhaustive$1(property.type, `Unexpected property type: ${property.type}`); + } + } + else { + properties.push(libExports$1.spreadElement(codegenPlaceToExpression(cx, property.place))); + } + } + value = libExports$1.objectExpression(properties); + break; + } + case 'JSXText': { + value = createJsxText(instrValue.loc, instrValue.value); + break; + } + case 'JsxExpression': { + const attributes = []; + for (const attribute of instrValue.props) { + attributes.push(codegenJsxAttribute(cx, attribute)); + } + let tagValue = instrValue.tag.kind === 'Identifier' + ? codegenPlaceToExpression(cx, instrValue.tag) + : libExports$1.stringLiteral(instrValue.tag.name); + let tag; + if (tagValue.type === 'Identifier') { + tag = createJsxIdentifier(instrValue.tag.loc, tagValue.name); + } + else if (tagValue.type === 'MemberExpression') { + tag = convertMemberExpressionToJsx(tagValue); + } + else { + CompilerError.invariant(tagValue.type === 'StringLiteral', { + reason: `Expected JSX tag to be an identifier or string, got \`${tagValue.type}\``, + description: null, + details: [ + { + kind: 'error', + loc: (_f = tagValue.loc) !== null && _f !== void 0 ? _f : null, + message: null, + }, + ], + suggestions: null, + }); + if (tagValue.value.indexOf(':') >= 0) { + const [namespace, name] = tagValue.value.split(':', 2); + tag = createJsxNamespacedName(instrValue.tag.loc, createJsxIdentifier(instrValue.tag.loc, namespace), createJsxIdentifier(instrValue.tag.loc, name)); + } + else { + tag = createJsxIdentifier(instrValue.loc, tagValue.value); + } + } + let children; + if (tagValue.type === 'StringLiteral' && + SINGLE_CHILD_FBT_TAGS.has(tagValue.value)) { + CompilerError.invariant(instrValue.children != null, { + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + reason: 'Expected fbt element to have children', + suggestions: null, + description: null, + }); + children = instrValue.children.map(child => codegenJsxFbtChildElement(cx, child)); + } + else { + children = + instrValue.children !== null + ? instrValue.children.map(child => codegenJsxElement(cx, child)) + : []; + } + value = createJsxElement(instrValue.loc, createJsxOpeningElement(instrValue.openingLoc, tag, attributes, instrValue.children === null), instrValue.children !== null + ? createJsxClosingElement(instrValue.closingLoc, tag) + : null, children, instrValue.children === null); + break; + } + case 'JsxFragment': { + value = libExports$1.jsxFragment(libExports$1.jsxOpeningFragment(), libExports$1.jsxClosingFragment(), instrValue.children.map(child => codegenJsxElement(cx, child))); + break; + } + case 'UnsupportedNode': { + const node = instrValue.node; + if (!libExports$1.isExpression(node)) { + return node; + } + value = node; + break; + } + case 'PropertyStore': + case 'PropertyLoad': + case 'PropertyDelete': { + let memberExpr; + if (typeof instrValue.property === 'string') { + memberExpr = libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), libExports$1.identifier(instrValue.property)); + } + else { + memberExpr = libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), libExports$1.numericLiteral(instrValue.property), true); + } + if (instrValue.kind === 'PropertyStore') { + value = libExports$1.assignmentExpression('=', memberExpr, codegenPlaceToExpression(cx, instrValue.value)); + } + else if (instrValue.kind === 'PropertyLoad') { + value = memberExpr; + } + else { + value = libExports$1.unaryExpression('delete', memberExpr); + } + break; + } + case 'ComputedStore': { + value = libExports$1.assignmentExpression('=', libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), codegenPlaceToExpression(cx, instrValue.property), true), codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'ComputedLoad': { + const object = codegenPlaceToExpression(cx, instrValue.object); + const property = codegenPlaceToExpression(cx, instrValue.property); + value = libExports$1.memberExpression(object, property, true); + break; + } + case 'ComputedDelete': { + value = libExports$1.unaryExpression('delete', libExports$1.memberExpression(codegenPlaceToExpression(cx, instrValue.object), codegenPlaceToExpression(cx, instrValue.property), true)); + break; + } + case 'LoadLocal': + case 'LoadContext': { + value = codegenPlaceToExpression(cx, instrValue.place); + break; + } + case 'FunctionExpression': { + const loweredFunc = instrValue.loweredFunc.func; + const reactiveFunction = buildReactiveFunction(loweredFunc); + pruneUnusedLabels(reactiveFunction); + pruneUnusedLValues(reactiveFunction); + pruneHoistedContexts(reactiveFunction); + const fn = codegenReactiveFunction(new Context$2(cx.env, (_g = reactiveFunction.id) !== null && _g !== void 0 ? _g : '[[ anonymous ]]', cx.uniqueIdentifiers, cx.fbtOperands, cx.temp), reactiveFunction).unwrap(); + if (instrValue.type === 'ArrowFunctionExpression') { + let body = fn.body; + if (body.body.length === 1 && loweredFunc.directives.length == 0) { + const stmt = body.body[0]; + if (stmt.type === 'ReturnStatement' && stmt.argument != null) { + body = stmt.argument; + } + } + value = libExports$1.arrowFunctionExpression(fn.params, body, fn.async); + } + else { + value = libExports$1.functionExpression(instrValue.name != null ? libExports$1.identifier(instrValue.name) : null, fn.params, fn.body, fn.generator, fn.async); + } + if (cx.env.config.enableNameAnonymousFunctions && + instrValue.name == null && + instrValue.nameHint != null) { + const name = instrValue.nameHint; + value = libExports$1.memberExpression(libExports$1.objectExpression([libExports$1.objectProperty(libExports$1.stringLiteral(name), value)]), libExports$1.stringLiteral(name), true, false); + } + break; + } + case 'TaggedTemplateExpression': { + value = createTaggedTemplateExpression(instrValue.loc, codegenPlaceToExpression(cx, instrValue.tag), libExports$1.templateLiteral([libExports$1.templateElement(instrValue.value)], [])); + break; + } + case 'TypeCastExpression': { + if (libExports$1.isTSType(instrValue.typeAnnotation)) { + if (instrValue.typeAnnotationKind === 'satisfies') { + value = libExports$1.tsSatisfiesExpression(codegenPlaceToExpression(cx, instrValue.value), instrValue.typeAnnotation); + } + else { + value = libExports$1.tsAsExpression(codegenPlaceToExpression(cx, instrValue.value), instrValue.typeAnnotation); + } + } + else { + value = libExports$1.typeCastExpression(codegenPlaceToExpression(cx, instrValue.value), libExports$1.typeAnnotation(instrValue.typeAnnotation)); + } + break; + } + case 'LogicalExpression': { + value = createLogicalExpression(instrValue.loc, instrValue.operator, codegenInstructionValueToExpression(cx, instrValue.left), codegenInstructionValueToExpression(cx, instrValue.right)); + break; + } + case 'ConditionalExpression': { + value = createConditionalExpression(instrValue.loc, codegenInstructionValueToExpression(cx, instrValue.test), codegenInstructionValueToExpression(cx, instrValue.consequent), codegenInstructionValueToExpression(cx, instrValue.alternate)); + break; + } + case 'SequenceExpression': { + const body = codegenBlockNoReset(cx, instrValue.instructions.map(instruction => ({ + kind: 'instruction', + instruction, + }))).body; + const expressions = body.map(stmt => { + var _a, _b; + if (stmt.type === 'ExpressionStatement') { + return stmt.expression; + } + else { + if (libExports$1.isVariableDeclaration(stmt)) { + const declarator = stmt.declarations[0]; + cx.errors.push({ + reason: `(CodegenReactiveFunction::codegenInstructionValue) Cannot declare variables in a value block, tried to declare '${declarator.id.name}'`, + category: ErrorCategory.Todo, + loc: (_a = declarator.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + return libExports$1.stringLiteral(`TODO handle ${declarator.id}`); + } + else { + cx.errors.push({ + reason: `(CodegenReactiveFunction::codegenInstructionValue) Handle conversion of ${stmt.type} to expression`, + category: ErrorCategory.Todo, + loc: (_b = stmt.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return libExports$1.stringLiteral(`TODO handle ${stmt.type}`); + } + } + }); + if (expressions.length === 0) { + value = codegenInstructionValueToExpression(cx, instrValue.value); + } + else { + value = createSequenceExpression(instrValue.loc, [ + ...expressions, + codegenInstructionValueToExpression(cx, instrValue.value), + ]); + } + break; + } + case 'TemplateLiteral': { + value = createTemplateLiteral(instrValue.loc, instrValue.quasis.map(q => libExports$1.templateElement(q)), instrValue.subexprs.map(p => codegenPlaceToExpression(cx, p))); + break; + } + case 'LoadGlobal': { + value = libExports$1.identifier(instrValue.binding.name); + break; + } + case 'RegExpLiteral': { + value = libExports$1.regExpLiteral(instrValue.pattern, instrValue.flags); + break; + } + case 'MetaProperty': { + value = libExports$1.metaProperty(libExports$1.identifier(instrValue.meta), libExports$1.identifier(instrValue.property)); + break; + } + case 'Await': { + value = libExports$1.awaitExpression(codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'GetIterator': { + value = codegenPlaceToExpression(cx, instrValue.collection); + break; + } + case 'IteratorNext': { + value = codegenPlaceToExpression(cx, instrValue.iterator); + break; + } + case 'NextPropertyOf': { + value = codegenPlaceToExpression(cx, instrValue.value); + break; + } + case 'PostfixUpdate': { + value = libExports$1.updateExpression(instrValue.operation, codegenPlaceToExpression(cx, instrValue.lvalue), false); + break; + } + case 'PrefixUpdate': { + value = libExports$1.updateExpression(instrValue.operation, codegenPlaceToExpression(cx, instrValue.lvalue), true); + break; + } + case 'StoreLocal': { + CompilerError.invariant(instrValue.lvalue.kind === InstructionKind.Reassign, { + reason: `Unexpected StoreLocal in codegenInstructionValue`, + description: null, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + value = libExports$1.assignmentExpression('=', codegenLValue(cx, instrValue.lvalue.place), codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'StoreGlobal': { + value = libExports$1.assignmentExpression('=', libExports$1.identifier(instrValue.name), codegenPlaceToExpression(cx, instrValue.value)); + break; + } + case 'StartMemoize': + case 'FinishMemoize': + case 'Debugger': + case 'DeclareLocal': + case 'DeclareContext': + case 'Destructure': + case 'ObjectMethod': + case 'StoreContext': { + CompilerError.invariant(false, { + reason: `Unexpected ${instrValue.kind} in codegenInstructionValue`, + description: null, + details: [ + { + kind: 'error', + loc: instrValue.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(instrValue, `Unexpected instruction value kind \`${instrValue.kind}\``); + } + } + if (instrValue.loc != null && instrValue.loc != GeneratedSource) { + value.loc = instrValue.loc; + } + return value; +} +const STRING_REQUIRES_EXPR_CONTAINER_PATTERN = /[\u{0000}-\u{001F}\u{007F}\u{0080}-\u{FFFF}\u{010000}-\u{10FFFF}]|"|\\/u; +function codegenJsxAttribute(cx, attribute) { + switch (attribute.kind) { + case 'JsxAttribute': { + let propName; + if (attribute.name.indexOf(':') === -1) { + propName = createJsxIdentifier(attribute.place.loc, attribute.name); + } + else { + const [namespace, name] = attribute.name.split(':', 2); + propName = createJsxNamespacedName(attribute.place.loc, createJsxIdentifier(attribute.place.loc, namespace), createJsxIdentifier(attribute.place.loc, name)); + } + const innerValue = codegenPlaceToExpression(cx, attribute.place); + let value; + switch (innerValue.type) { + case 'StringLiteral': { + value = innerValue; + if (STRING_REQUIRES_EXPR_CONTAINER_PATTERN.test(value.value) && + !cx.fbtOperands.has(attribute.place.identifier.id)) { + value = createJsxExpressionContainer(value.loc, value); + } + break; + } + default: { + value = createJsxExpressionContainer(attribute.place.loc, innerValue); + break; + } + } + return createJsxAttribute(attribute.place.loc, propName, value); + } + case 'JsxSpreadAttribute': { + return libExports$1.jsxSpreadAttribute(codegenPlaceToExpression(cx, attribute.argument)); + } + default: { + assertExhaustive$1(attribute, `Unexpected attribute kind \`${attribute.kind}\``); + } + } +} +const JSX_TEXT_CHILD_REQUIRES_EXPR_CONTAINER_PATTERN = /[<>&{}]/; +function codegenJsxElement(cx, place) { + const value = codegenPlace(cx, place); + switch (value.type) { + case 'JSXText': { + if (JSX_TEXT_CHILD_REQUIRES_EXPR_CONTAINER_PATTERN.test(value.value)) { + return createJsxExpressionContainer(place.loc, createStringLiteral(place.loc, value.value)); + } + return createJsxText(place.loc, value.value); + } + case 'JSXElement': + case 'JSXFragment': { + return value; + } + default: { + return createJsxExpressionContainer(place.loc, value); + } + } +} +function codegenJsxFbtChildElement(cx, place) { + const value = codegenPlace(cx, place); + switch (value.type) { + case 'JSXText': + case 'JSXElement': { + return value; + } + default: { + return createJsxExpressionContainer(place.loc, value); + } + } +} +function convertMemberExpressionToJsx(expr) { + var _a, _b; + CompilerError.invariant(expr.property.type === 'Identifier', { + reason: 'Expected JSX member expression property to be a string', + description: null, + details: [ + { + kind: 'error', + loc: (_a = expr.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + suggestions: null, + }); + const property = libExports$1.jsxIdentifier(expr.property.name); + if (expr.object.type === 'Identifier') { + return libExports$1.jsxMemberExpression(libExports$1.jsxIdentifier(expr.object.name), property); + } + else { + CompilerError.invariant(expr.object.type === 'MemberExpression', { + reason: 'Expected JSX member expression to be an identifier or nested member expression', + description: null, + details: [ + { + kind: 'error', + loc: (_b = expr.object.loc) !== null && _b !== void 0 ? _b : null, + message: null, + }, + ], + suggestions: null, + }); + const object = convertMemberExpressionToJsx(expr.object); + return libExports$1.jsxMemberExpression(object, property); + } +} +function codegenObjectPropertyKey(cx, key) { + switch (key.kind) { + case 'string': { + return libExports$1.stringLiteral(key.name); + } + case 'identifier': { + return libExports$1.identifier(key.name); + } + case 'computed': { + const expr = codegenPlace(cx, key.name); + CompilerError.invariant(libExports$1.isExpression(expr), { + reason: 'Expected object property key to be an expression', + description: null, + details: [ + { + kind: 'error', + loc: key.name.loc, + message: null, + }, + ], + suggestions: null, + }); + return expr; + } + case 'number': { + return libExports$1.numericLiteral(key.name); + } + } +} +function codegenArrayPattern(cx, pattern) { + const hasHoles = !pattern.items.every(e => e.kind !== 'Hole'); + if (hasHoles) { + const result = libExports$1.arrayPattern([]); + for (const item of pattern.items) { + if (item.kind === 'Hole') { + result.elements.push(null); + } + else { + result.elements.push(codegenLValue(cx, item)); + } + } + return result; + } + else { + return libExports$1.arrayPattern(pattern.items.map(item => { + if (item.kind === 'Hole') { + return null; + } + return codegenLValue(cx, item); + })); + } +} +function codegenLValue(cx, pattern) { + switch (pattern.kind) { + case 'ArrayPattern': { + return codegenArrayPattern(cx, pattern); + } + case 'ObjectPattern': { + return libExports$1.objectPattern(pattern.properties.map(property => { + if (property.kind === 'ObjectProperty') { + const key = codegenObjectPropertyKey(cx, property.key); + const value = codegenLValue(cx, property.place); + return libExports$1.objectProperty(key, value, property.key.kind === 'computed', key.type === 'Identifier' && + value.type === 'Identifier' && + value.name === key.name); + } + else { + return libExports$1.restElement(codegenLValue(cx, property.place)); + } + })); + } + case 'Spread': { + return libExports$1.restElement(codegenLValue(cx, pattern.place)); + } + case 'Identifier': { + return convertIdentifier(pattern.identifier); + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } +} +function codegenValue(cx, loc, value) { + if (typeof value === 'number') { + if (value < 0) { + return libExports$1.unaryExpression('-', libExports$1.numericLiteral(-value), false); + } + else { + return libExports$1.numericLiteral(value); + } + } + else if (typeof value === 'boolean') { + return libExports$1.booleanLiteral(value); + } + else if (typeof value === 'string') { + return createStringLiteral(loc, value); + } + else if (value === null) { + return libExports$1.nullLiteral(); + } + else if (value === undefined) { + return libExports$1.identifier('undefined'); + } + else { + assertExhaustive$1(value, 'Unexpected primitive value kind'); + } +} +function codegenArgument(cx, arg) { + if (arg.kind === 'Identifier') { + return codegenPlaceToExpression(cx, arg); + } + else { + return libExports$1.spreadElement(codegenPlaceToExpression(cx, arg.place)); + } +} +function codegenPlaceToExpression(cx, place) { + const value = codegenPlace(cx, place); + return convertValueToExpression(value); +} +function codegenPlace(cx, place) { + let tmp = cx.temp.get(place.identifier.declarationId); + if (tmp != null) { + return tmp; + } + CompilerError.invariant(place.identifier.name !== null || tmp !== undefined, { + reason: `[Codegen] No value found for temporary`, + description: `Value for '${printPlace(place)}' was not set in the codegen context`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + const identifier = convertIdentifier(place.identifier); + identifier.loc = place.loc; + return identifier; +} +function convertIdentifier(identifier) { + CompilerError.invariant(identifier.name !== null && identifier.name.kind === 'named', { + reason: `Expected temporaries to be promoted to named identifiers in an earlier pass`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + description: `identifier ${identifier.id} is unnamed`, + suggestions: null, + }); + return libExports$1.identifier(identifier.name.value); +} +function compareScopeDependency(a, b) { + var _a, _b; + CompilerError.invariant(((_a = a.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named' && ((_b = b.identifier.name) === null || _b === void 0 ? void 0 : _b.kind) === 'named', { + reason: '[Codegen] Expected named identifier for dependency', + description: null, + details: [ + { + kind: 'error', + loc: a.identifier.loc, + message: null, + }, + ], + }); + const aName = [ + a.identifier.name.value, + ...a.path.map(entry => `${entry.optional ? '?' : ''}${entry.property}`), + ].join('.'); + const bName = [ + b.identifier.name.value, + ...b.path.map(entry => `${entry.optional ? '?' : ''}${entry.property}`), + ].join('.'); + if (aName < bName) + return -1; + else if (aName > bName) + return 1; + else + return 0; +} +function compareScopeDeclaration(a, b) { + var _a, _b; + CompilerError.invariant(((_a = a.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named' && ((_b = b.identifier.name) === null || _b === void 0 ? void 0 : _b.kind) === 'named', { + reason: '[Codegen] Expected named identifier for declaration', + description: null, + details: [ + { + kind: 'error', + loc: a.identifier.loc, + message: null, + }, + ], + }); + const aName = a.identifier.name.value; + const bName = b.identifier.name.value; + if (aName < bName) + return -1; + else if (aName > bName) + return 1; + else + return 0; +} + +function extractScopeDeclarationsFromDestructuring(fn) { + const state = new State$1(fn.env); + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + state.declared.add(place.identifier.declarationId); + } + visitReactiveFunction(fn, new Visitor$9(), state); +} +let State$1 = class State { + constructor(env) { + this.declared = new Set(); + this.env = env; + } +}; +let Visitor$9 = class Visitor extends ReactiveFunctionTransform { + visitScope(scope, state) { + for (const [, declaration] of scope.scope.declarations) { + state.declared.add(declaration.identifier.declarationId); + } + this.traverseScope(scope, state); + } + transformInstruction(instruction, state) { + this.visitInstruction(instruction, state); + if (instruction.value.kind === 'Destructure') { + const transformed = transformDestructuring(state, instruction, instruction.value); + if (transformed) { + return { + kind: 'replace-many', + value: transformed.map(instruction => ({ + kind: 'instruction', + instruction, + })), + }; + } + } + return { kind: 'keep' }; + } +}; +function transformDestructuring(state, instr, destructure) { + let reassigned = new Set(); + let hasDeclaration = false; + for (const place of eachPatternOperand(destructure.lvalue.pattern)) { + const isDeclared = state.declared.has(place.identifier.declarationId); + if (isDeclared) { + reassigned.add(place.identifier.id); + } + hasDeclaration || (hasDeclaration = !isDeclared); + } + if (reassigned.size === 0 || !hasDeclaration) { + return null; + } + const instructions = []; + const renamed = new Map(); + mapPatternOperands(destructure.lvalue.pattern, place => { + if (!reassigned.has(place.identifier.id)) { + return place; + } + const temporary = clonePlaceToTemporary(state.env, place); + promoteTemporary(temporary.identifier); + renamed.set(place, temporary); + return temporary; + }); + instructions.push(instr); + for (const [original, temporary] of renamed) { + instructions.push({ + id: instr.id, + lvalue: null, + value: { + kind: 'StoreLocal', + lvalue: { + kind: InstructionKind.Reassign, + place: original, + }, + value: temporary, + type: null, + loc: destructure.loc, + }, + loc: instr.loc, + }); + } + return instructions; +} + +function mergeReactiveScopesThatInvalidateTogether(fn) { + const lastUsageVisitor = new FindLastUsageVisitor(); + visitReactiveFunction(fn, lastUsageVisitor, undefined); + visitReactiveFunction(fn, new Transform$4(lastUsageVisitor.lastUsage), null); +} +function log(msg) { +} +class FindLastUsageVisitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.lastUsage = new Map(); + } + visitPlace(id, place, _state) { + const previousUsage = this.lastUsage.get(place.identifier.declarationId); + const lastUsage = previousUsage !== undefined + ? makeInstructionId(Math.max(previousUsage, id)) + : id; + this.lastUsage.set(place.identifier.declarationId, lastUsage); + } +} +let Transform$4 = class Transform extends ReactiveFunctionTransform { + constructor(lastUsage) { + super(); + this.temporaries = new Map(); + this.lastUsage = lastUsage; + } + transformScope(scopeBlock, state) { + this.visitScope(scopeBlock, scopeBlock.scope.dependencies); + if (state !== null && + areEqualDependencies(state, scopeBlock.scope.dependencies)) { + return { kind: 'replace-many', value: scopeBlock.instructions }; + } + else { + return { kind: 'keep' }; + } + } + visitBlock(block, state) { + var _a; + this.traverseBlock(block, state); + let current = null; + const merged = []; + function reset() { + CompilerError.invariant(current !== null, { + reason: 'MergeConsecutiveScopes: expected current scope to be non-null if reset()', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (current.to > current.from + 1) { + merged.push(current); + } + current = null; + } + for (let i = 0; i < block.length; i++) { + const instr = block[i]; + switch (instr.kind) { + case 'terminal': { + if (current !== null) { + reset(); + } + break; + } + case 'pruned-scope': { + if (current !== null) { + reset(); + } + break; + } + case 'instruction': { + switch (instr.instruction.value.kind) { + case 'BinaryExpression': + case 'ComputedLoad': + case 'JSXText': + case 'LoadGlobal': + case 'LoadLocal': + case 'Primitive': + case 'PropertyLoad': + case 'TemplateLiteral': + case 'UnaryExpression': { + if (current !== null && instr.instruction.lvalue !== null) { + current.lvalues.add(instr.instruction.lvalue.identifier.declarationId); + if (instr.instruction.value.kind === 'LoadLocal') { + this.temporaries.set(instr.instruction.lvalue.identifier.declarationId, instr.instruction.value.place.identifier.declarationId); + } + } + break; + } + case 'StoreLocal': { + if (current !== null) { + if (instr.instruction.value.lvalue.kind === InstructionKind.Const) { + for (const lvalue of eachInstructionLValue(instr.instruction)) { + current.lvalues.add(lvalue.identifier.declarationId); + } + this.temporaries.set(instr.instruction.value.lvalue.place.identifier + .declarationId, (_a = this.temporaries.get(instr.instruction.value.value.identifier.declarationId)) !== null && _a !== void 0 ? _a : instr.instruction.value.value.identifier.declarationId); + } + else { + reset(); + } + } + break; + } + default: { + if (current !== null) { + reset(); + } + } + } + break; + } + case 'scope': { + if (current !== null && + canMergeScopes(current.block, instr, this.temporaries) && + areLValuesLastUsedByScope(instr.scope, current.lvalues, this.lastUsage)) { + current.block.scope.range.end = makeInstructionId(Math.max(current.block.scope.range.end, instr.scope.range.end)); + for (const [key, value] of instr.scope.declarations) { + current.block.scope.declarations.set(key, value); + } + updateScopeDeclarations(current.block.scope, this.lastUsage); + current.to = i + 1; + current.lvalues.clear(); + if (!scopeIsEligibleForMerging(instr)) { + reset(); + } + } + else { + if (current !== null) { + reset(); + } + if (scopeIsEligibleForMerging(instr)) { + current = { + block: instr, + from: i, + to: i + 1, + lvalues: new Set(), + }; + } + } + break; + } + default: { + assertExhaustive$1(instr, `Unexpected instruction kind \`${instr.kind}\``); + } + } + } + if (current !== null) { + reset(); + } + if (merged.length) { + for (const entry of merged) { + log(printReactiveScopeSummary(entry.block.scope) + + ` from=${entry.from} to=${entry.to}`); + } + } + if (merged.length === 0) { + return; + } + const nextInstructions = []; + let index = 0; + for (const entry of merged) { + if (index < entry.from) { + nextInstructions.push(...block.slice(index, entry.from)); + index = entry.from; + } + const mergedScope = block[entry.from]; + CompilerError.invariant(mergedScope.kind === 'scope', { + reason: 'MergeConsecutiveScopes: Expected scope starting index to be a scope', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + nextInstructions.push(mergedScope); + index++; + while (index < entry.to) { + const instr = block[index++]; + if (instr.kind === 'scope') { + mergedScope.instructions.push(...instr.instructions); + mergedScope.scope.merged.add(instr.scope.id); + } + else { + mergedScope.instructions.push(instr); + } + } + } + while (index < block.length) { + nextInstructions.push(block[index++]); + } + block.length = 0; + block.push(...nextInstructions); + } +}; +function updateScopeDeclarations(scope, lastUsage) { + for (const [id, decl] of scope.declarations) { + const lastUsedAt = lastUsage.get(decl.identifier.declarationId); + if (lastUsedAt < scope.range.end) { + scope.declarations.delete(id); + } + } +} +function areLValuesLastUsedByScope(scope, lvalues, lastUsage) { + for (const lvalue of lvalues) { + const lastUsedAt = lastUsage.get(lvalue); + if (lastUsedAt >= scope.range.end) { + return false; + } + } + return true; +} +function canMergeScopes(current, next, temporaries) { + if (current.scope.reassignments.size !== 0 || + next.scope.reassignments.size !== 0) { + return false; + } + if (areEqualDependencies(current.scope.dependencies, next.scope.dependencies)) { + return true; + } + if (areEqualDependencies(new Set([...current.scope.declarations.values()].map(declaration => ({ + identifier: declaration.identifier, + reactive: true, + path: [], + }))), next.scope.dependencies) || + (next.scope.dependencies.size !== 0 && + [...next.scope.dependencies].every(dep => dep.path.length === 0 && + isAlwaysInvalidatingType(dep.identifier.type) && + Iterable_some(current.scope.declarations.values(), decl => decl.identifier.declarationId === dep.identifier.declarationId || + decl.identifier.declarationId === + temporaries.get(dep.identifier.declarationId))))) { + return true; + } + log(` ${printReactiveScopeSummary(current.scope)} ${[...current.scope.declarations.values()].map(decl => decl.identifier.declarationId)}`); + log(` ${printReactiveScopeSummary(next.scope)} ${[...next.scope.dependencies].map(dep => { var _a; return `${dep.identifier.declarationId} ${(_a = temporaries.get(dep.identifier.declarationId)) !== null && _a !== void 0 ? _a : dep.identifier.declarationId}`; })}`); + return false; +} +function isAlwaysInvalidatingType(type) { + switch (type.kind) { + case 'Object': { + switch (type.shapeId) { + case BuiltInArrayId: + case BuiltInObjectId: + case BuiltInFunctionId: + case BuiltInJsxId: { + return true; + } + } + break; + } + case 'Function': { + return true; + } + } + return false; +} +function areEqualDependencies(a, b) { + if (a.size !== b.size) { + return false; + } + for (const aValue of a) { + let found = false; + for (const bValue of b) { + if (aValue.identifier.declarationId === bValue.identifier.declarationId && + areEqualPaths(aValue.path, bValue.path)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + return true; +} +function scopeIsEligibleForMerging(scopeBlock) { + if (scopeBlock.scope.dependencies.size === 0) { + return true; + } + return [...scopeBlock.scope.declarations].some(([, decl]) => isAlwaysInvalidatingType(decl.identifier.type)); +} + +var _PromoteInterposedTemporaries_promotable, _PromoteInterposedTemporaries_consts, _PromoteInterposedTemporaries_globals; +class PromoteTemporaries extends ReactiveFunctionVisitor { + visitScope(scopeBlock, state) { + for (const dep of scopeBlock.scope.dependencies) { + const { identifier } = dep; + if (identifier.name == null) { + promoteIdentifier(identifier, state); + } + } + for (const [, declaration] of scopeBlock.scope.declarations) { + if (declaration.identifier.name == null) { + promoteIdentifier(declaration.identifier, state); + } + } + this.traverseScope(scopeBlock, state); + } + visitPrunedScope(scopeBlock, state) { + var _a; + for (const [, declaration] of scopeBlock.scope.declarations) { + if (declaration.identifier.name == null && + ((_a = state.pruned.get(declaration.identifier.declarationId)) === null || _a === void 0 ? void 0 : _a.usedOutsideScope) === true) { + promoteIdentifier(declaration.identifier, state); + } + } + this.traversePrunedScope(scopeBlock, state); + } + visitParam(place, state) { + if (place.identifier.name === null) { + promoteIdentifier(place.identifier, state); + } + } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') { + this.visitHirFunction(value.loweredFunc.func, state); + } + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + for (const operand of fn.params) { + const place = operand.kind === 'Identifier' ? operand : operand.place; + if (place.identifier.name === null) { + promoteIdentifier(place.identifier, state); + } + } + visitReactiveFunction(fn, this, state); + } +} +class PromoteAllInstancedOfPromotedTemporaries extends ReactiveFunctionVisitor { + visitPlace(_id, place, state) { + if (place.identifier.name === null && + state.promoted.has(place.identifier.declarationId)) { + promoteIdentifier(place.identifier, state); + } + } + visitLValue(_id, _lvalue, _state) { + this.visitPlace(_id, _lvalue, _state); + } + traverseScopeIdentifiers(scope, state) { + for (const [, decl] of scope.declarations) { + if (decl.identifier.name === null && + state.promoted.has(decl.identifier.declarationId)) { + promoteIdentifier(decl.identifier, state); + } + } + for (const dep of scope.dependencies) { + if (dep.identifier.name === null && + state.promoted.has(dep.identifier.declarationId)) { + promoteIdentifier(dep.identifier, state); + } + } + for (const reassignment of scope.reassignments) { + if (reassignment.name === null && + state.promoted.has(reassignment.declarationId)) { + promoteIdentifier(reassignment, state); + } + } + } + visitScope(scope, state) { + this.traverseScope(scope, state); + this.traverseScopeIdentifiers(scope.scope, state); + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + this.traverseScopeIdentifiers(scopeBlock.scope, state); + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + visitReactiveFunction(fn, this, state); + } +} +class CollectPromotableTemporaries extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.activeScopes = []; + } + visitPlace(_id, place, state) { + if (this.activeScopes.length !== 0 && + state.pruned.has(place.identifier.declarationId)) { + const prunedPlace = state.pruned.get(place.identifier.declarationId); + if (prunedPlace.activeScopes.indexOf(this.activeScopes.at(-1)) === -1) { + prunedPlace.usedOutsideScope = true; + } + } + } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'JsxExpression' && value.tag.kind === 'Identifier') { + state.tags.add(value.tag.identifier.declarationId); + } + } + visitPrunedScope(scopeBlock, state) { + for (const [_id, decl] of scopeBlock.scope.declarations) { + state.pruned.set(decl.identifier.declarationId, { + activeScopes: [...this.activeScopes], + usedOutsideScope: false, + }); + } + this.visitBlock(scopeBlock.instructions, state); + } + visitScope(scopeBlock, state) { + this.activeScopes.push(scopeBlock.scope.id); + this.traverseScope(scopeBlock, state); + this.activeScopes.pop(); + } +} +class PromoteInterposedTemporaries extends ReactiveFunctionVisitor { + constructor(promotable, params) { + super(); + _PromoteInterposedTemporaries_promotable.set(this, void 0); + _PromoteInterposedTemporaries_consts.set(this, new Set()); + _PromoteInterposedTemporaries_globals.set(this, new Set()); + params.forEach(param => { + switch (param.kind) { + case 'Identifier': + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(param.identifier.id); + break; + case 'Spread': + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(param.place.identifier.id); + break; + } + }); + __classPrivateFieldSet(this, _PromoteInterposedTemporaries_promotable, promotable, "f"); + } + visitPlace(_id, place, state) { + const promo = state.get(place.identifier.id); + if (promo) { + const [identifier, needsPromotion] = promo; + if (needsPromotion && + identifier.name === null && + !__classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").has(identifier.id)) { + promoteIdentifier(identifier, __classPrivateFieldGet(this, _PromoteInterposedTemporaries_promotable, "f")); + } + } + } + visitInstruction(instruction, state) { + for (const lval of eachInstructionValueLValue(instruction.value)) { + CompilerError.invariant(lval.identifier.name != null, { + reason: 'PromoteInterposedTemporaries: Assignment targets not expected to be temporaries', + description: null, + details: [ + { + kind: 'error', + loc: instruction.loc, + message: null, + }, + ], + }); + } + switch (instruction.value.kind) { + case 'CallExpression': + case 'MethodCall': + case 'Await': + case 'PropertyStore': + case 'PropertyDelete': + case 'ComputedStore': + case 'ComputedDelete': + case 'PostfixUpdate': + case 'PrefixUpdate': + case 'StoreLocal': + case 'StoreContext': + case 'StoreGlobal': + case 'Destructure': { + let constStore = false; + if ((instruction.value.kind === 'StoreContext' || + instruction.value.kind === 'StoreLocal') && + (instruction.value.lvalue.kind === 'Const' || + instruction.value.lvalue.kind === 'HoistedConst')) { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.value.lvalue.place.identifier.id); + constStore = true; + } + if (instruction.value.kind === 'Destructure' && + (instruction.value.lvalue.kind === 'Const' || + instruction.value.lvalue.kind === 'HoistedConst')) { + [...eachPatternOperand(instruction.value.lvalue.pattern)].forEach(ident => __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(ident.identifier.id)); + constStore = true; + } + if (instruction.value.kind === 'MethodCall') { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.value.property.identifier.id); + } + super.visitInstruction(instruction, state); + if (!constStore && + (instruction.lvalue == null || + instruction.lvalue.identifier.name != null)) { + for (const [key, [ident, _]] of state.entries()) { + state.set(key, [ident, true]); + } + } + if (instruction.lvalue && instruction.lvalue.identifier.name === null) { + state.set(instruction.lvalue.identifier.id, [ + instruction.lvalue.identifier, + false, + ]); + } + break; + } + case 'DeclareContext': + case 'DeclareLocal': { + if (instruction.value.lvalue.kind === 'Const' || + instruction.value.lvalue.kind === 'HoistedConst') { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.value.lvalue.place.identifier.id); + } + super.visitInstruction(instruction, state); + break; + } + case 'LoadContext': + case 'LoadLocal': { + if (instruction.lvalue && instruction.lvalue.identifier.name === null) { + if (__classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").has(instruction.value.place.identifier.id)) { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.lvalue.identifier.id); + } + state.set(instruction.lvalue.identifier.id, [ + instruction.lvalue.identifier, + false, + ]); + } + super.visitInstruction(instruction, state); + break; + } + case 'PropertyLoad': + case 'ComputedLoad': { + if (instruction.lvalue) { + if (__classPrivateFieldGet(this, _PromoteInterposedTemporaries_globals, "f").has(instruction.value.object.identifier.id)) { + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_globals, "f").add(instruction.lvalue.identifier.id); + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_consts, "f").add(instruction.lvalue.identifier.id); + } + if (instruction.lvalue.identifier.name === null) { + state.set(instruction.lvalue.identifier.id, [ + instruction.lvalue.identifier, + false, + ]); + } + } + super.visitInstruction(instruction, state); + break; + } + case 'LoadGlobal': { + instruction.lvalue && + __classPrivateFieldGet(this, _PromoteInterposedTemporaries_globals, "f").add(instruction.lvalue.identifier.id); + super.visitInstruction(instruction, state); + break; + } + default: { + super.visitInstruction(instruction, state); + } + } + } +} +_PromoteInterposedTemporaries_promotable = new WeakMap(), _PromoteInterposedTemporaries_consts = new WeakMap(), _PromoteInterposedTemporaries_globals = new WeakMap(); +function promoteUsedTemporaries(fn) { + const state = { + tags: new Set(), + promoted: new Set(), + pruned: new Map(), + }; + visitReactiveFunction(fn, new CollectPromotableTemporaries(), state); + for (const operand of fn.params) { + const place = operand.kind === 'Identifier' ? operand : operand.place; + if (place.identifier.name === null) { + promoteIdentifier(place.identifier, state); + } + } + visitReactiveFunction(fn, new PromoteTemporaries(), state); + visitReactiveFunction(fn, new PromoteInterposedTemporaries(state, fn.params), new Map()); + visitReactiveFunction(fn, new PromoteAllInstancedOfPromotedTemporaries(), state); +} +function promoteIdentifier(identifier, state) { + CompilerError.invariant(identifier.name === null, { + reason: 'promoteTemporary: Expected to be called only for temporary variables', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + if (state.tags.has(identifier.declarationId)) { + promoteTemporaryJsxTag(identifier); + } + else { + promoteTemporary(identifier); + } + state.promoted.add(identifier.declarationId); +} + +function propagateEarlyReturns(fn) { + visitReactiveFunction(fn, new Transform$3(fn.env), { + withinReactiveScope: false, + earlyReturnValue: null, + }); +} +let Transform$3 = class Transform extends ReactiveFunctionTransform { + constructor(env) { + super(); + this.env = env; + } + visitScope(scopeBlock, parentState) { + if (scopeBlock.scope.earlyReturnValue !== null) { + return; + } + const innerState = { + withinReactiveScope: true, + earlyReturnValue: parentState.earlyReturnValue, + }; + this.traverseScope(scopeBlock, innerState); + const earlyReturnValue = innerState.earlyReturnValue; + if (earlyReturnValue !== null) { + if (!parentState.withinReactiveScope) { + scopeBlock.scope.earlyReturnValue = earlyReturnValue; + scopeBlock.scope.declarations.set(earlyReturnValue.value.id, { + identifier: earlyReturnValue.value, + scope: scopeBlock.scope, + }); + const instructions = scopeBlock.instructions; + const loc = earlyReturnValue.loc; + const sentinelTemp = createTemporaryPlace(this.env, loc); + const symbolTemp = createTemporaryPlace(this.env, loc); + const forTemp = createTemporaryPlace(this.env, loc); + const argTemp = createTemporaryPlace(this.env, loc); + scopeBlock.instructions = [ + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, symbolTemp), + value: { + kind: 'LoadGlobal', + binding: { + kind: 'Global', + name: 'Symbol', + }, + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, forTemp), + value: { + kind: 'PropertyLoad', + object: Object.assign({}, symbolTemp), + property: makePropertyLiteral('for'), + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, argTemp), + value: { + kind: 'Primitive', + value: EARLY_RETURN_SENTINEL, + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: Object.assign({}, sentinelTemp), + value: { + kind: 'MethodCall', + receiver: symbolTemp, + property: forTemp, + args: [argTemp], + loc, + }, + }, + }, + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: null, + value: { + kind: 'StoreLocal', + loc, + type: null, + lvalue: { + kind: InstructionKind.Let, + place: { + kind: 'Identifier', + effect: Effect.ConditionallyMutate, + loc, + reactive: true, + identifier: earlyReturnValue.value, + }, + }, + value: Object.assign({}, sentinelTemp), + }, + }, + }, + { + kind: 'terminal', + label: { + id: earlyReturnValue.label, + implicit: false, + }, + terminal: { + kind: 'label', + id: makeInstructionId(0), + loc: GeneratedSource, + block: instructions, + }, + }, + ]; + } + else { + parentState.earlyReturnValue = earlyReturnValue; + } + } + } + transformTerminal(stmt, state) { + if (state.withinReactiveScope && stmt.terminal.kind === 'return') { + const loc = stmt.terminal.value.loc; + let earlyReturnValue; + if (state.earlyReturnValue !== null) { + earlyReturnValue = state.earlyReturnValue; + } + else { + const identifier = createTemporaryPlace(this.env, loc).identifier; + promoteTemporary(identifier); + earlyReturnValue = { + label: this.env.nextBlockId, + loc, + value: identifier, + }; + } + state.earlyReturnValue = earlyReturnValue; + return { + kind: 'replace-many', + value: [ + { + kind: 'instruction', + instruction: { + id: makeInstructionId(0), + loc, + lvalue: null, + value: { + kind: 'StoreLocal', + loc, + type: null, + lvalue: { + kind: InstructionKind.Reassign, + place: { + kind: 'Identifier', + identifier: earlyReturnValue.value, + effect: Effect.Capture, + loc, + reactive: true, + }, + }, + value: stmt.terminal.value, + }, + }, + }, + { + kind: 'terminal', + label: null, + terminal: { + kind: 'break', + id: makeInstructionId(0), + loc, + targetKind: 'labeled', + target: earlyReturnValue.label, + }, + }, + ], + }; + } + this.traverseTerminal(stmt, state); + return { kind: 'keep' }; + } +}; + +var _Node_value, _Node_next; +function empty() { + return EMPTY; +} +class Node { + constructor(value, next = EMPTY) { + _Node_value.set(this, void 0); + _Node_next.set(this, void 0); + __classPrivateFieldSet(this, _Node_value, value, "f"); + __classPrivateFieldSet(this, _Node_next, next, "f"); + } + push(value) { + return new Node(value, this); + } + pop() { + return __classPrivateFieldGet(this, _Node_next, "f"); + } + find(fn) { + return fn(__classPrivateFieldGet(this, _Node_value, "f")) ? true : __classPrivateFieldGet(this, _Node_next, "f").find(fn); + } + contains(value) { + return (value === __classPrivateFieldGet(this, _Node_value, "f") || + (__classPrivateFieldGet(this, _Node_next, "f") !== null && __classPrivateFieldGet(this, _Node_next, "f").contains(value))); + } + each(fn) { + fn(__classPrivateFieldGet(this, _Node_value, "f")); + __classPrivateFieldGet(this, _Node_next, "f").each(fn); + } + get value() { + return __classPrivateFieldGet(this, _Node_value, "f"); + } + print(fn) { + return fn(__classPrivateFieldGet(this, _Node_value, "f")) + __classPrivateFieldGet(this, _Node_next, "f").print(fn); + } +} +_Node_value = new WeakMap(), _Node_next = new WeakMap(); +class Empty { + push(value) { + return new Node(value, this); + } + pop() { + return this; + } + find(_fn) { + return false; + } + contains(_value) { + return false; + } + each(_fn) { + return; + } + get value() { + return null; + } + print(_) { + return ''; + } +} +const EMPTY = new Empty(); + +function pruneHoistedContexts(fn) { + visitReactiveFunction(fn, new Visitor$8(), { + activeScopes: empty(), + uninitialized: new Map(), + }); +} +let Visitor$8 = class Visitor extends ReactiveFunctionTransform { + visitScope(scope, state) { + state.activeScopes = state.activeScopes.push(new Set(scope.scope.declarations.keys())); + for (const decl of scope.scope.declarations.values()) { + state.uninitialized.set(decl.identifier.id, { kind: 'unknown-kind' }); + } + this.traverseScope(scope, state); + state.activeScopes.pop(); + for (const decl of scope.scope.declarations.values()) { + state.uninitialized.delete(decl.identifier.id); + } + } + visitPlace(_id, place, state) { + const maybeHoistedFn = state.uninitialized.get(place.identifier.id); + if ((maybeHoistedFn === null || maybeHoistedFn === void 0 ? void 0 : maybeHoistedFn.kind) === 'func' && + maybeHoistedFn.definition !== place) { + CompilerError.throwTodo({ + reason: '[PruneHoistedContexts] Rewrite hoisted function references', + loc: place.loc, + }); + } + } + transformInstruction(instruction, state) { + if (instruction.value.kind === 'DeclareContext') { + const maybeNonHoisted = convertHoistedLValueKind(instruction.value.lvalue.kind); + if (maybeNonHoisted != null) { + if (maybeNonHoisted === InstructionKind.Function && + state.uninitialized.has(instruction.value.lvalue.place.identifier.id)) { + state.uninitialized.set(instruction.value.lvalue.place.identifier.id, { + kind: 'func', + definition: null, + }); + } + return { kind: 'remove' }; + } + } + if (instruction.value.kind === 'StoreContext' && + instruction.value.lvalue.kind !== InstructionKind.Reassign) { + const lvalueId = instruction.value.lvalue.place.identifier.id; + const isDeclaredByScope = state.activeScopes.find(scope => scope.has(lvalueId)); + if (isDeclaredByScope) { + if (instruction.value.lvalue.kind === InstructionKind.Let || + instruction.value.lvalue.kind === InstructionKind.Const) { + instruction.value.lvalue.kind = InstructionKind.Reassign; + } + else if (instruction.value.lvalue.kind === InstructionKind.Function) { + const maybeHoistedFn = state.uninitialized.get(lvalueId); + if (maybeHoistedFn != null) { + CompilerError.invariant(maybeHoistedFn.kind === 'func', { + reason: '[PruneHoistedContexts] Unexpected hoisted function', + description: null, + details: [ + { + kind: 'error', + loc: instruction.loc, + message: null, + }, + ], + }); + maybeHoistedFn.definition = instruction.value.lvalue.place; + state.uninitialized.delete(lvalueId); + } + } + else { + CompilerError.throwTodo({ + reason: '[PruneHoistedContexts] Unexpected kind', + description: `(${instruction.value.lvalue.kind})`, + loc: instruction.loc, + }); + } + } + } + this.visitInstruction(instruction, state); + return { kind: 'keep' }; + } +}; + +function hashEffect(effect) { + var _a; + switch (effect.kind) { + case 'Apply': { + return [ + effect.kind, + effect.receiver.identifier.id, + effect.function.identifier.id, + effect.mutatesFunction, + effect.args + .map(a => { + if (a.kind === 'Hole') { + return ''; + } + else if (a.kind === 'Identifier') { + return a.identifier.id; + } + else { + return `...${a.place.identifier.id}`; + } + }) + .join(','), + effect.into.identifier.id, + ].join(':'); + } + case 'CreateFrom': + case 'ImmutableCapture': + case 'Assign': + case 'Alias': + case 'Capture': + case 'MaybeAlias': { + return [ + effect.kind, + effect.from.identifier.id, + effect.into.identifier.id, + ].join(':'); + } + case 'Create': { + return [ + effect.kind, + effect.into.identifier.id, + effect.value, + effect.reason, + ].join(':'); + } + case 'Freeze': { + return [effect.kind, effect.value.identifier.id, effect.reason].join(':'); + } + case 'Impure': + case 'Render': { + return [effect.kind, effect.place.identifier.id].join(':'); + } + case 'MutateFrozen': + case 'MutateGlobal': { + return [ + effect.kind, + effect.place.identifier.id, + effect.error.severity, + effect.error.reason, + effect.error.description, + printSourceLocation((_a = effect.error.primaryLocation()) !== null && _a !== void 0 ? _a : GeneratedSource), + ].join(':'); + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + return [effect.kind, effect.value.identifier.id].join(':'); + } + case 'CreateFunction': { + return [ + effect.kind, + effect.into.identifier.id, + effect.function.loweredFunc.func.returns.identifier.id, + effect.captures.map(p => p.identifier.id).join(','), + ].join(':'); + } + } +} + +var _InferenceState_isFunctionExpression, _InferenceState_values, _InferenceState_variables; +function inferMutationAliasingEffects(fn, { isFunctionExpression } = { + isFunctionExpression: false, +}) { + const initialState = InferenceState.empty(fn.env, isFunctionExpression); + const statesByBlock = new Map(); + for (const ref of fn.context) { + const value = { + kind: 'ObjectExpression', + properties: [], + loc: ref.loc, + }; + initialState.initialize(value, { + kind: ValueKind.Context, + reason: new Set([ValueReason.Other]), + }); + initialState.define(ref, value); + } + const paramKind = isFunctionExpression + ? { + kind: ValueKind.Mutable, + reason: new Set([ValueReason.Other]), + } + : { + kind: ValueKind.Frozen, + reason: new Set([ValueReason.ReactiveFunctionArgument]), + }; + if (fn.fnType === 'Component') { + CompilerError.invariant(fn.params.length <= 2, { + reason: 'Expected React component to have not more than two parameters: one for props and for ref', + description: null, + details: [ + { + kind: 'error', + loc: fn.loc, + message: null, + }, + ], + suggestions: null, + }); + const [props, ref] = fn.params; + if (props != null) { + inferParam(props, initialState, paramKind); + } + if (ref != null) { + const place = ref.kind === 'Identifier' ? ref : ref.place; + const value = { + kind: 'ObjectExpression', + properties: [], + loc: place.loc, + }; + initialState.initialize(value, { + kind: ValueKind.Mutable, + reason: new Set([ValueReason.Other]), + }); + initialState.define(place, value); + } + } + else { + for (const param of fn.params) { + inferParam(param, initialState, paramKind); + } + } + const queuedStates = new Map(); + function queue(blockId, state) { + var _a; + let queuedState = queuedStates.get(blockId); + if (queuedState != null) { + state = (_a = queuedState.merge(state)) !== null && _a !== void 0 ? _a : queuedState; + queuedStates.set(blockId, state); + } + else { + const prevState = statesByBlock.get(blockId); + const nextState = prevState != null ? prevState.merge(state) : state; + if (nextState != null) { + queuedStates.set(blockId, nextState); + } + } + } + queue(fn.body.entry, initialState); + const hoistedContextDeclarations = findHoistedContextDeclarations(fn); + const context = new Context$1(isFunctionExpression, fn, hoistedContextDeclarations); + let iterationCount = 0; + while (queuedStates.size !== 0) { + iterationCount++; + if (iterationCount > 100) { + CompilerError.invariant(false, { + reason: `[InferMutationAliasingEffects] Potential infinite loop`, + description: `A value, temporary place, or effect was not cached properly`, + details: [ + { + kind: 'error', + loc: fn.loc, + message: null, + }, + ], + }); + } + for (const [blockId, block] of fn.body.blocks) { + const incomingState = queuedStates.get(blockId); + queuedStates.delete(blockId); + if (incomingState == null) { + continue; + } + statesByBlock.set(blockId, incomingState); + const state = incomingState.clone(); + inferBlock(context, state, block); + for (const nextBlockId of eachTerminalSuccessor(block.terminal)) { + queue(nextBlockId, state); + } + } + } + return Ok(undefined); +} +function findHoistedContextDeclarations(fn) { + const hoisted = new Map(); + function visit(place) { + if (hoisted.has(place.identifier.declarationId) && + hoisted.get(place.identifier.declarationId) == null) { + hoisted.set(place.identifier.declarationId, place); + } + } + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + if (instr.value.kind === 'DeclareContext') { + const kind = instr.value.lvalue.kind; + if (kind == InstructionKind.HoistedConst || + kind == InstructionKind.HoistedFunction || + kind == InstructionKind.HoistedLet) { + hoisted.set(instr.value.lvalue.place.identifier.declarationId, null); + } + } + else { + for (const operand of eachInstructionValueOperand(instr.value)) { + visit(operand); + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visit(operand); + } + } + return hoisted; +} +let Context$1 = class Context { + constructor(isFunctionExpression, fn, hoistedContextDeclarations) { + this.internedEffects = new Map(); + this.instructionSignatureCache = new Map(); + this.effectInstructionValueCache = new Map(); + this.applySignatureCache = new Map(); + this.catchHandlers = new Map(); + this.functionSignatureCache = new Map(); + this.isFuctionExpression = isFunctionExpression; + this.fn = fn; + this.hoistedContextDeclarations = hoistedContextDeclarations; + } + cacheApplySignature(signature, effect, f) { + const inner = getOrInsertDefault(this.applySignatureCache, signature, new Map()); + return getOrInsertWith(inner, effect, f); + } + internEffect(effect) { + const hash = hashEffect(effect); + let interned = this.internedEffects.get(hash); + if (interned == null) { + this.internedEffects.set(hash, effect); + interned = effect; + } + return interned; + } +}; +function inferParam(param, initialState, paramKind) { + const place = param.kind === 'Identifier' ? param : param.place; + const value = { + kind: 'Primitive', + loc: place.loc, + value: undefined, + }; + initialState.initialize(value, paramKind); + initialState.define(place, value); +} +function inferBlock(context, state, block) { + for (const phi of block.phis) { + state.inferPhi(phi); + } + for (const instr of block.instructions) { + let instructionSignature = context.instructionSignatureCache.get(instr); + if (instructionSignature == null) { + instructionSignature = computeSignatureForInstruction(context, state.env, instr); + context.instructionSignatureCache.set(instr, instructionSignature); + } + const effects = applySignature(context, state, instructionSignature, instr); + instr.effects = effects; + } + const terminal = block.terminal; + if (terminal.kind === 'try' && terminal.handlerBinding != null) { + context.catchHandlers.set(terminal.handler, terminal.handlerBinding); + } + else if (terminal.kind === 'maybe-throw') { + const handlerParam = context.catchHandlers.get(terminal.handler); + if (handlerParam != null) { + CompilerError.invariant(state.kind(handlerParam) != null, { + reason: 'Expected catch binding to be intialized with a DeclareLocal Catch instruction', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + const effects = []; + for (const instr of block.instructions) { + if (instr.value.kind === 'CallExpression' || + instr.value.kind === 'MethodCall') { + state.appendAlias(handlerParam, instr.lvalue); + const kind = state.kind(instr.lvalue).kind; + if (kind === ValueKind.Mutable || kind == ValueKind.Context) { + effects.push(context.internEffect({ + kind: 'Alias', + from: instr.lvalue, + into: handlerParam, + })); + } + } + } + terminal.effects = effects.length !== 0 ? effects : null; + } + } + else if (terminal.kind === 'return') { + if (!context.isFuctionExpression) { + terminal.effects = [ + context.internEffect({ + kind: 'Freeze', + value: terminal.value, + reason: ValueReason.JsxCaptured, + }), + ]; + } + } +} +function applySignature(context, state, signature, instruction) { + var _a, _b; + const effects = []; + if (instruction.value.kind === 'FunctionExpression' || + instruction.value.kind === 'ObjectMethod') { + const aliasingEffects = (_a = instruction.value.loweredFunc.func.aliasingEffects) !== null && _a !== void 0 ? _a : []; + const context = new Set(instruction.value.loweredFunc.func.context.map(p => p.identifier.id)); + for (const effect of aliasingEffects) { + if (effect.kind === 'Mutate' || effect.kind === 'MutateTransitive') { + if (!context.has(effect.value.identifier.id)) { + continue; + } + const value = state.kind(effect.value); + switch (value.kind) { + case ValueKind.Frozen: { + const reason = getWriteErrorReason({ + kind: value.kind, + reason: value.reason, + }); + const variable = effect.value.identifier.name !== null && + effect.value.identifier.name.kind === 'named' + ? `\`${effect.value.identifier.name.value}\`` + : 'value'; + const diagnostic = CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'This value cannot be modified', + description: reason, + }).withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `${variable} cannot be modified`, + }); + if (effect.kind === 'Mutate' && + ((_b = effect.reason) === null || _b === void 0 ? void 0 : _b.kind) === 'AssignCurrentProperty') { + diagnostic.withDetails({ + kind: 'hint', + message: `Hint: If this value is a Ref (value returned by \`useRef()\`), rename the variable to end in "Ref".`, + }); + } + effects.push({ + kind: 'MutateFrozen', + place: effect.value, + error: diagnostic, + }); + } + } + } + } + } + const initialized = new Set(); + for (const effect of signature.effects) { + applyEffect(context, state, effect, initialized, effects); + } + if (!(state.isDefined(instruction.lvalue) && state.kind(instruction.lvalue))) { + CompilerError.invariant(false, { + reason: `Expected instruction lvalue to be initialized`, + description: null, + details: [ + { + kind: 'error', + loc: instruction.loc, + message: null, + }, + ], + }); + } + return effects.length !== 0 ? effects : null; +} +function applyEffect(context, state, _effect, initialized, effects) { + var _a, _b, _c, _d, _e; + const effect = context.internEffect(_effect); + switch (effect.kind) { + case 'Freeze': { + const didFreeze = state.freeze(effect.value, effect.reason); + if (didFreeze) { + effects.push(effect); + } + break; + } + case 'Create': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'ObjectExpression', + properties: [], + loc: effect.into.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: effect.value, + reason: new Set([effect.reason]), + }); + state.define(effect.into, value); + effects.push(effect); + break; + } + case 'ImmutableCapture': { + const kind = state.kind(effect.from).kind; + switch (kind) { + case ValueKind.Global: + case ValueKind.Primitive: { + break; + } + default: { + effects.push(effect); + } + } + break; + } + case 'CreateFrom': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + const fromValue = state.kind(effect.from); + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'ObjectExpression', + properties: [], + loc: effect.into.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: fromValue.kind, + reason: new Set(fromValue.reason), + }); + state.define(effect.into, value); + switch (fromValue.kind) { + case ValueKind.Primitive: + case ValueKind.Global: { + effects.push({ + kind: 'Create', + value: fromValue.kind, + into: effect.into, + reason: (_a = [...fromValue.reason][0]) !== null && _a !== void 0 ? _a : ValueReason.Other, + }); + break; + } + case ValueKind.Frozen: { + effects.push({ + kind: 'Create', + value: fromValue.kind, + into: effect.into, + reason: (_b = [...fromValue.reason][0]) !== null && _b !== void 0 ? _b : ValueReason.Other, + }); + applyEffect(context, state, { + kind: 'ImmutableCapture', + from: effect.from, + into: effect.into, + }, initialized, effects); + break; + } + default: { + effects.push(effect); + } + } + break; + } + case 'CreateFunction': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + effects.push(effect); + const hasCaptures = effect.captures.some(capture => { + switch (state.kind(capture).kind) { + case ValueKind.Context: + case ValueKind.Mutable: { + return true; + } + default: { + return false; + } + } + }); + const hasTrackedSideEffects = (_c = effect.function.loweredFunc.func.aliasingEffects) === null || _c === void 0 ? void 0 : _c.some(effect => effect.kind === 'MutateFrozen' || + effect.kind === 'MutateGlobal' || + effect.kind === 'Impure'); + const capturesRef = effect.function.loweredFunc.func.context.some(operand => isRefOrRefValue(operand.identifier)); + const isMutable = hasCaptures || hasTrackedSideEffects || capturesRef; + for (const operand of effect.function.loweredFunc.func.context) { + if (operand.effect !== Effect.Capture) { + continue; + } + const kind = state.kind(operand).kind; + if (kind === ValueKind.Primitive || + kind == ValueKind.Frozen || + kind == ValueKind.Global) { + operand.effect = Effect.Read; + } + } + state.initialize(effect.function, { + kind: isMutable ? ValueKind.Mutable : ValueKind.Frozen, + reason: new Set([]), + }); + state.define(effect.into, effect.function); + for (const capture of effect.captures) { + applyEffect(context, state, { + kind: 'Capture', + from: capture, + into: effect.into, + }, initialized, effects); + } + break; + } + case 'MaybeAlias': + case 'Alias': + case 'Capture': { + CompilerError.invariant(effect.kind === 'Capture' || + effect.kind === 'MaybeAlias' || + initialized.has(effect.into.identifier.id), { + reason: `Expected destination to already be initialized within this instruction`, + description: `Destination ${printPlace(effect.into)} is not initialized in this ` + + `instruction for effect ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + const intoKind = state.kind(effect.into).kind; + let destinationType = null; + switch (intoKind) { + case ValueKind.Context: { + destinationType = 'context'; + break; + } + case ValueKind.Mutable: + case ValueKind.MaybeFrozen: { + destinationType = 'mutable'; + break; + } + } + const fromKind = state.kind(effect.from).kind; + let sourceType = null; + switch (fromKind) { + case ValueKind.Context: { + sourceType = 'context'; + break; + } + case ValueKind.Global: + case ValueKind.Primitive: { + break; + } + case ValueKind.Frozen: { + sourceType = 'frozen'; + break; + } + default: { + sourceType = 'mutable'; + break; + } + } + if (sourceType === 'frozen') { + applyEffect(context, state, { + kind: 'ImmutableCapture', + from: effect.from, + into: effect.into, + }, initialized, effects); + } + else if ((sourceType === 'mutable' && destinationType === 'mutable') || + effect.kind === 'MaybeAlias') { + effects.push(effect); + } + else if ((sourceType === 'context' && destinationType != null) || + (sourceType === 'mutable' && destinationType === 'context')) { + applyEffect(context, state, { kind: 'MaybeAlias', from: effect.from, into: effect.into }, initialized, effects); + } + break; + } + case 'Assign': { + CompilerError.invariant(!initialized.has(effect.into.identifier.id), { + reason: `Cannot re-initialize variable within an instruction`, + description: `Re-initialized ${printPlace(effect.into)} in ${printAliasingEffect(effect)}`, + details: [ + { + kind: 'error', + loc: effect.into.loc, + message: null, + }, + ], + }); + initialized.add(effect.into.identifier.id); + const fromValue = state.kind(effect.from); + const fromKind = fromValue.kind; + switch (fromKind) { + case ValueKind.Frozen: { + applyEffect(context, state, { + kind: 'ImmutableCapture', + from: effect.from, + into: effect.into, + }, initialized, effects); + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'Primitive', + value: undefined, + loc: effect.from.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: fromKind, + reason: new Set(fromValue.reason), + }); + state.define(effect.into, value); + break; + } + case ValueKind.Global: + case ValueKind.Primitive: { + let value = context.effectInstructionValueCache.get(effect); + if (value == null) { + value = { + kind: 'Primitive', + value: undefined, + loc: effect.from.loc, + }; + context.effectInstructionValueCache.set(effect, value); + } + state.initialize(value, { + kind: fromKind, + reason: new Set(fromValue.reason), + }); + state.define(effect.into, value); + break; + } + default: { + state.assign(effect.into, effect.from); + effects.push(effect); + break; + } + } + break; + } + case 'Apply': { + const functionValues = state.values(effect.function); + if (functionValues.length === 1 && + functionValues[0].kind === 'FunctionExpression' && + functionValues[0].loweredFunc.func.aliasingEffects != null) { + const functionExpr = functionValues[0]; + let signature = context.functionSignatureCache.get(functionExpr); + if (signature == null) { + signature = buildSignatureFromFunctionExpression(state.env, functionExpr); + context.functionSignatureCache.set(functionExpr, signature); + } + const signatureEffects = context.cacheApplySignature(signature, effect, () => computeEffectsForSignature(state.env, signature, effect.into, effect.receiver, effect.args, functionExpr.loweredFunc.func.context, effect.loc)); + if (signatureEffects != null) { + applyEffect(context, state, { kind: 'MutateTransitiveConditionally', value: effect.function }, initialized, effects); + for (const signatureEffect of signatureEffects) { + applyEffect(context, state, signatureEffect, initialized, effects); + } + break; + } + } + let signatureEffects = null; + if (((_d = effect.signature) === null || _d === void 0 ? void 0 : _d.aliasing) != null) { + const signature = effect.signature.aliasing; + signatureEffects = context.cacheApplySignature(effect.signature.aliasing, effect, () => computeEffectsForSignature(state.env, signature, effect.into, effect.receiver, effect.args, [], effect.loc)); + } + if (signatureEffects != null) { + for (const signatureEffect of signatureEffects) { + applyEffect(context, state, signatureEffect, initialized, effects); + } + } + else if (effect.signature != null) { + const legacyEffects = computeEffectsForLegacySignature(state, effect.signature, effect.into, effect.receiver, effect.args, effect.loc); + for (const legacyEffect of legacyEffects) { + applyEffect(context, state, legacyEffect, initialized, effects); + } + } + else { + applyEffect(context, state, { + kind: 'Create', + into: effect.into, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }, initialized, effects); + for (const arg of [effect.receiver, effect.function, ...effect.args]) { + if (arg.kind === 'Hole') { + continue; + } + const operand = arg.kind === 'Identifier' ? arg : arg.place; + if (operand !== effect.function || effect.mutatesFunction) { + applyEffect(context, state, { + kind: 'MutateTransitiveConditionally', + value: operand, + }, initialized, effects); + } + const mutateIterator = arg.kind === 'Spread' ? conditionallyMutateIterator(operand) : null; + if (mutateIterator) { + applyEffect(context, state, mutateIterator, initialized, effects); + } + applyEffect(context, state, { kind: 'MaybeAlias', from: operand, into: effect.into }, initialized, effects); + for (const otherArg of [ + effect.receiver, + effect.function, + ...effect.args, + ]) { + if (otherArg.kind === 'Hole') { + continue; + } + const other = otherArg.kind === 'Identifier' ? otherArg : otherArg.place; + if (other === arg) { + continue; + } + applyEffect(context, state, { + kind: 'Capture', + from: operand, + into: other, + }, initialized, effects); + } + } + } + break; + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + const mutationKind = state.mutate(effect.kind, effect.value); + if (mutationKind === 'mutate') { + effects.push(effect); + } + else if (mutationKind === 'mutate-ref') ; + else if (mutationKind !== 'none' && + (effect.kind === 'Mutate' || effect.kind === 'MutateTransitive')) { + const value = state.kind(effect.value); + if (mutationKind === 'mutate-frozen' && + context.hoistedContextDeclarations.has(effect.value.identifier.declarationId)) { + const variable = effect.value.identifier.name !== null && + effect.value.identifier.name.kind === 'named' + ? `\`${effect.value.identifier.name.value}\`` + : null; + const hoistedAccess = context.hoistedContextDeclarations.get(effect.value.identifier.declarationId); + const diagnostic = CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot access variable before it is declared', + description: `${variable !== null && variable !== void 0 ? variable : 'This variable'} is accessed before it is declared, which prevents the earlier access from updating when this value changes over time`, + }); + if (hoistedAccess != null && hoistedAccess.loc != effect.value.loc) { + diagnostic.withDetails({ + kind: 'error', + loc: hoistedAccess.loc, + message: `${variable !== null && variable !== void 0 ? variable : 'variable'} accessed before it is declared`, + }); + } + diagnostic.withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `${variable !== null && variable !== void 0 ? variable : 'variable'} is declared here`, + }); + applyEffect(context, state, { + kind: 'MutateFrozen', + place: effect.value, + error: diagnostic, + }, initialized, effects); + } + else { + const reason = getWriteErrorReason({ + kind: value.kind, + reason: value.reason, + }); + const variable = effect.value.identifier.name !== null && + effect.value.identifier.name.kind === 'named' + ? `\`${effect.value.identifier.name.value}\`` + : 'value'; + const diagnostic = CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'This value cannot be modified', + description: reason, + }).withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `${variable} cannot be modified`, + }); + if (effect.kind === 'Mutate' && + ((_e = effect.reason) === null || _e === void 0 ? void 0 : _e.kind) === 'AssignCurrentProperty') { + diagnostic.withDetails({ + kind: 'hint', + message: `Hint: If this value is a Ref (value returned by \`useRef()\`), rename the variable to end in "Ref".`, + }); + } + applyEffect(context, state, { + kind: value.kind === ValueKind.Frozen + ? 'MutateFrozen' + : 'MutateGlobal', + place: effect.value, + error: diagnostic, + }, initialized, effects); + } + } + break; + } + case 'Impure': + case 'Render': + case 'MutateFrozen': + case 'MutateGlobal': { + effects.push(effect); + break; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind '${effect.kind}'`); + } + } +} +class InferenceState { + constructor(env, isFunctionExpression, values, variables) { + _InferenceState_isFunctionExpression.set(this, void 0); + _InferenceState_values.set(this, void 0); + _InferenceState_variables.set(this, void 0); + this.env = env; + __classPrivateFieldSet(this, _InferenceState_isFunctionExpression, isFunctionExpression, "f"); + __classPrivateFieldSet(this, _InferenceState_values, values, "f"); + __classPrivateFieldSet(this, _InferenceState_variables, variables, "f"); + } + static empty(env, isFunctionExpression) { + return new InferenceState(env, isFunctionExpression, new Map(), new Map()); + } + get isFunctionExpression() { + return __classPrivateFieldGet(this, _InferenceState_isFunctionExpression, "f"); + } + initialize(value, kind) { + CompilerError.invariant(value.kind !== 'LoadLocal', { + reason: '[InferMutationAliasingEffects] Expected all top-level identifiers to be defined as variables, not values', + description: null, + details: [ + { + kind: 'error', + loc: value.loc, + message: null, + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _InferenceState_values, "f").set(value, kind); + } + values(place) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(place.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value kind to be initialized`, + description: `${printPlace(place)}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'this is uninitialized', + }, + ], + suggestions: null, + }); + return Array.from(values); + } + kind(place) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(place.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value kind to be initialized`, + description: `${printPlace(place)}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: 'this is uninitialized', + }, + ], + suggestions: null, + }); + let mergedKind = null; + for (const value of values) { + const kind = __classPrivateFieldGet(this, _InferenceState_values, "f").get(value); + mergedKind = + mergedKind !== null ? mergeAbstractValues(mergedKind, kind) : kind; + } + CompilerError.invariant(mergedKind !== null, { + reason: `[InferMutationAliasingEffects] Expected at least one value`, + description: `No value found at \`${printPlace(place)}\``, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + return mergedKind; + } + assign(place, value) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(value.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value for identifier to be initialized`, + description: `${printIdentifier(value.identifier)}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: 'Expected value for identifier to be initialized', + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(place.identifier.id, new Set(values)); + } + appendAlias(place, value) { + const values = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(value.identifier.id); + CompilerError.invariant(values != null, { + reason: `[InferMutationAliasingEffects] Expected value for identifier to be initialized`, + description: `${printIdentifier(value.identifier)}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: 'Expected value for identifier to be initialized', + }, + ], + suggestions: null, + }); + const prevValues = this.values(place); + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(place.identifier.id, new Set([...prevValues, ...values])); + } + define(place, value) { + CompilerError.invariant(__classPrivateFieldGet(this, _InferenceState_values, "f").has(value), { + reason: `[InferMutationAliasingEffects] Expected value to be initialized`, + description: printInstructionValue(value), + details: [ + { + kind: 'error', + loc: value.loc, + message: 'Expected value for identifier to be initialized', + }, + ], + suggestions: null, + }); + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(place.identifier.id, new Set([value])); + } + isDefined(place) { + return __classPrivateFieldGet(this, _InferenceState_variables, "f").has(place.identifier.id); + } + freeze(place, reason) { + const value = this.kind(place); + switch (value.kind) { + case ValueKind.Context: + case ValueKind.Mutable: + case ValueKind.MaybeFrozen: { + const values = this.values(place); + for (const instrValue of values) { + this.freezeValue(instrValue, reason); + } + return true; + } + case ValueKind.Frozen: + case ValueKind.Global: + case ValueKind.Primitive: { + return false; + } + default: { + assertExhaustive$1(value.kind, `Unexpected value kind '${value.kind}'`); + } + } + } + freezeValue(value, reason) { + __classPrivateFieldGet(this, _InferenceState_values, "f").set(value, { + kind: ValueKind.Frozen, + reason: new Set([reason]), + }); + if (value.kind === 'FunctionExpression' && + (this.env.config.enablePreserveExistingMemoizationGuarantees || + this.env.config.enableTransitivelyFreezeFunctionExpressions)) { + for (const place of value.loweredFunc.func.context) { + this.freeze(place, reason); + } + } + } + mutate(variant, place) { + if (isRefOrRefValue(place.identifier)) { + return 'mutate-ref'; + } + const kind = this.kind(place).kind; + switch (variant) { + case 'MutateConditionally': + case 'MutateTransitiveConditionally': { + switch (kind) { + case ValueKind.Mutable: + case ValueKind.Context: { + return 'mutate'; + } + default: { + return 'none'; + } + } + } + case 'Mutate': + case 'MutateTransitive': { + switch (kind) { + case ValueKind.Mutable: + case ValueKind.Context: { + return 'mutate'; + } + case ValueKind.Primitive: { + return 'none'; + } + case ValueKind.Frozen: { + return 'mutate-frozen'; + } + case ValueKind.Global: { + return 'mutate-global'; + } + case ValueKind.MaybeFrozen: { + return 'mutate-frozen'; + } + default: { + assertExhaustive$1(kind, `Unexpected kind ${kind}`); + } + } + } + default: { + assertExhaustive$1(variant, `Unexpected mutation variant ${variant}`); + } + } + } + merge(other) { + let nextValues = null; + let nextVariables = null; + for (const [id, thisValue] of __classPrivateFieldGet(this, _InferenceState_values, "f")) { + const otherValue = __classPrivateFieldGet(other, _InferenceState_values, "f").get(id); + if (otherValue !== undefined) { + const mergedValue = mergeAbstractValues(thisValue, otherValue); + if (mergedValue !== thisValue) { + nextValues = nextValues !== null && nextValues !== void 0 ? nextValues : new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")); + nextValues.set(id, mergedValue); + } + } + } + for (const [id, otherValue] of __classPrivateFieldGet(other, _InferenceState_values, "f")) { + if (__classPrivateFieldGet(this, _InferenceState_values, "f").has(id)) { + continue; + } + nextValues = nextValues !== null && nextValues !== void 0 ? nextValues : new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")); + nextValues.set(id, otherValue); + } + for (const [id, thisValues] of __classPrivateFieldGet(this, _InferenceState_variables, "f")) { + const otherValues = __classPrivateFieldGet(other, _InferenceState_variables, "f").get(id); + if (otherValues !== undefined) { + let mergedValues = null; + for (const otherValue of otherValues) { + if (!thisValues.has(otherValue)) { + mergedValues = mergedValues !== null && mergedValues !== void 0 ? mergedValues : new Set(thisValues); + mergedValues.add(otherValue); + } + } + if (mergedValues !== null) { + nextVariables = nextVariables !== null && nextVariables !== void 0 ? nextVariables : new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f")); + nextVariables.set(id, mergedValues); + } + } + } + for (const [id, otherValues] of __classPrivateFieldGet(other, _InferenceState_variables, "f")) { + if (__classPrivateFieldGet(this, _InferenceState_variables, "f").has(id)) { + continue; + } + nextVariables = nextVariables !== null && nextVariables !== void 0 ? nextVariables : new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f")); + nextVariables.set(id, new Set(otherValues)); + } + if (nextVariables === null && nextValues === null) { + return null; + } + else { + return new InferenceState(this.env, __classPrivateFieldGet(this, _InferenceState_isFunctionExpression, "f"), nextValues !== null && nextValues !== void 0 ? nextValues : new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")), nextVariables !== null && nextVariables !== void 0 ? nextVariables : new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f"))); + } + } + clone() { + return new InferenceState(this.env, __classPrivateFieldGet(this, _InferenceState_isFunctionExpression, "f"), new Map(__classPrivateFieldGet(this, _InferenceState_values, "f")), new Map(__classPrivateFieldGet(this, _InferenceState_variables, "f"))); + } + debug() { + const result = { values: {}, variables: {} }; + const objects = new Map(); + function identify(value) { + let id = objects.get(value); + if (id == null) { + id = objects.size; + objects.set(value, id); + } + return id; + } + for (const [value, kind] of __classPrivateFieldGet(this, _InferenceState_values, "f")) { + const id = identify(value); + result.values[id] = { + abstract: this.debugAbstractValue(kind), + value: printInstructionValue(value), + }; + } + for (const [variable, values] of __classPrivateFieldGet(this, _InferenceState_variables, "f")) { + result.variables[`$${variable}`] = [...values].map(identify); + } + return result; + } + debugAbstractValue(value) { + return { + kind: value.kind, + reason: [...value.reason], + }; + } + inferPhi(phi) { + const values = new Set(); + for (const [_, operand] of phi.operands) { + const operandValues = __classPrivateFieldGet(this, _InferenceState_variables, "f").get(operand.identifier.id); + if (operandValues === undefined) + continue; + for (const v of operandValues) { + values.add(v); + } + } + if (values.size > 0) { + __classPrivateFieldGet(this, _InferenceState_variables, "f").set(phi.place.identifier.id, values); + } + } +} +_InferenceState_isFunctionExpression = new WeakMap(), _InferenceState_values = new WeakMap(), _InferenceState_variables = new WeakMap(); +function mergeAbstractValues(a, b) { + const kind = mergeValueKinds(a.kind, b.kind); + if (kind === a.kind && + kind === b.kind && + Set_isSuperset(a.reason, b.reason)) { + return a; + } + const reason = new Set(a.reason); + for (const r of b.reason) { + reason.add(r); + } + return { kind, reason }; +} +function conditionallyMutateIterator(place) { + if (!(isArrayType(place.identifier) || + isSetType(place.identifier) || + isMapType(place.identifier))) { + return { + kind: 'MutateTransitiveConditionally', + value: place, + }; + } + return null; +} +function computeSignatureForInstruction(context, env, instr) { + const { lvalue, value } = instr; + const effects = []; + switch (value.kind) { + case 'ArrayExpression': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + for (const element of value.elements) { + if (element.kind === 'Identifier') { + effects.push({ + kind: 'Capture', + from: element, + into: lvalue, + }); + } + else if (element.kind === 'Spread') { + const mutateIterator = conditionallyMutateIterator(element.place); + if (mutateIterator != null) { + effects.push(mutateIterator); + } + effects.push({ + kind: 'Capture', + from: element.place, + into: lvalue, + }); + } + else { + continue; + } + } + break; + } + case 'ObjectExpression': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + for (const property of value.properties) { + if (property.kind === 'ObjectProperty') { + effects.push({ + kind: 'Capture', + from: property.place, + into: lvalue, + }); + } + else { + effects.push({ + kind: 'Capture', + from: property.place, + into: lvalue, + }); + } + } + break; + } + case 'Await': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + effects.push({ kind: 'MutateTransitiveConditionally', value: value.value }); + effects.push({ + kind: 'Capture', + from: value.value, + into: lvalue, + }); + break; + } + case 'NewExpression': + case 'CallExpression': + case 'MethodCall': { + let callee; + let receiver; + let mutatesCallee; + if (value.kind === 'NewExpression') { + callee = value.callee; + receiver = value.callee; + mutatesCallee = false; + } + else if (value.kind === 'CallExpression') { + callee = value.callee; + receiver = value.callee; + mutatesCallee = true; + } + else if (value.kind === 'MethodCall') { + callee = value.property; + receiver = value.receiver; + mutatesCallee = false; + } + else { + assertExhaustive$1(value, `Unexpected value kind '${value.kind}'`); + } + const signature = getFunctionCallSignature(env, callee.identifier.type); + effects.push({ + kind: 'Apply', + receiver, + function: callee, + mutatesFunction: mutatesCallee, + args: value.args, + into: lvalue, + signature, + loc: value.loc, + }); + break; + } + case 'PropertyDelete': + case 'ComputedDelete': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + effects.push({ kind: 'Mutate', value: value.object }); + break; + } + case 'PropertyLoad': + case 'ComputedLoad': { + if (isPrimitiveType(lvalue.identifier)) { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + } + else { + effects.push({ + kind: 'CreateFrom', + from: value.object, + into: lvalue, + }); + } + break; + } + case 'PropertyStore': + case 'ComputedStore': { + const mutationReason = value.kind === 'PropertyStore' && + value.property === 'current' && + value.object.identifier.type.kind === 'Type' + ? { kind: 'AssignCurrentProperty' } + : null; + effects.push({ + kind: 'Mutate', + value: value.object, + reason: mutationReason, + }); + effects.push({ + kind: 'Capture', + from: value.value, + into: value.object, + }); + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + effects.push({ + kind: 'CreateFunction', + into: lvalue, + function: value, + captures: value.loweredFunc.func.context.filter(operand => operand.effect === Effect.Capture), + }); + break; + } + case 'GetIterator': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + if (isArrayType(value.collection.identifier) || + isMapType(value.collection.identifier) || + isSetType(value.collection.identifier)) { + effects.push({ + kind: 'Capture', + from: value.collection, + into: lvalue, + }); + } + else { + effects.push({ kind: 'Alias', from: value.collection, into: lvalue }); + effects.push({ + kind: 'MutateTransitiveConditionally', + value: value.collection, + }); + } + break; + } + case 'IteratorNext': { + effects.push({ kind: 'MutateConditionally', value: value.iterator }); + effects.push({ + kind: 'CreateFrom', + from: value.collection, + into: lvalue, + }); + break; + } + case 'NextPropertyOf': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'JsxExpression': + case 'JsxFragment': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Frozen, + reason: ValueReason.JsxCaptured, + }); + for (const operand of eachInstructionValueOperand(value)) { + effects.push({ + kind: 'Freeze', + value: operand, + reason: ValueReason.JsxCaptured, + }); + effects.push({ + kind: 'Capture', + from: operand, + into: lvalue, + }); + } + if (value.kind === 'JsxExpression') { + if (value.tag.kind === 'Identifier') { + effects.push({ + kind: 'Render', + place: value.tag, + }); + } + if (value.children != null) { + for (const child of value.children) { + effects.push({ + kind: 'Render', + place: child, + }); + } + } + for (const prop of value.props) { + if (prop.kind === 'JsxAttribute' && + prop.place.identifier.type.kind === 'Function' && + (isJsxType(prop.place.identifier.type.return) || + (prop.place.identifier.type.return.kind === 'Phi' && + prop.place.identifier.type.return.operands.some(operand => isJsxType(operand))))) { + effects.push({ + kind: 'Render', + place: prop.place, + }); + } + } + } + break; + } + case 'DeclareLocal': { + effects.push({ + kind: 'Create', + into: value.lvalue.place, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'Destructure': { + for (const patternItem of eachPatternItem(value.lvalue.pattern)) { + const place = patternItem.kind === 'Identifier' ? patternItem : patternItem.place; + if (isPrimitiveType(place.identifier)) { + effects.push({ + kind: 'Create', + into: place, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + } + else if (patternItem.kind === 'Identifier') { + effects.push({ + kind: 'CreateFrom', + from: value.value, + into: place, + }); + } + else { + effects.push({ + kind: 'Create', + into: place, + reason: ValueReason.Other, + value: ValueKind.Mutable, + }); + effects.push({ + kind: 'Capture', + from: value.value, + into: place, + }); + } + } + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'LoadContext': { + effects.push({ kind: 'CreateFrom', from: value.place, into: lvalue }); + break; + } + case 'DeclareContext': { + const kind = value.lvalue.kind; + if (!context.hoistedContextDeclarations.has(value.lvalue.place.identifier.declarationId) || + kind === InstructionKind.HoistedConst || + kind === InstructionKind.HoistedFunction || + kind === InstructionKind.HoistedLet) { + effects.push({ + kind: 'Create', + into: value.lvalue.place, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + } + else { + effects.push({ kind: 'Mutate', value: value.lvalue.place }); + } + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'StoreContext': { + if (value.lvalue.kind === InstructionKind.Reassign || + context.hoistedContextDeclarations.has(value.lvalue.place.identifier.declarationId)) { + effects.push({ kind: 'Mutate', value: value.lvalue.place }); + } + else { + effects.push({ + kind: 'Create', + into: value.lvalue.place, + value: ValueKind.Mutable, + reason: ValueReason.Other, + }); + } + effects.push({ + kind: 'Capture', + from: value.value, + into: value.lvalue.place, + }); + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'LoadLocal': { + effects.push({ kind: 'Assign', from: value.place, into: lvalue }); + break; + } + case 'StoreLocal': { + effects.push({ + kind: 'Assign', + from: value.value, + into: value.lvalue.place, + }); + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + effects.push({ + kind: 'Create', + into: value.lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'StoreGlobal': { + const variable = `\`${value.name}\``; + effects.push({ + kind: 'MutateGlobal', + place: value.value, + error: CompilerDiagnostic.create({ + category: ErrorCategory.Globals, + reason: 'Cannot reassign variables declared outside of the component/hook', + description: `Variable ${variable} is declared outside of the component/hook. Reassigning this value during render is a form of side effect, which can cause unpredictable behavior depending on when the component happens to re-render. If this variable is used in rendering, use useState instead. Otherwise, consider updating it in an effect. (https://react.dev/reference/rules/components-and-hooks-must-be-pure#side-effects-must-run-outside-of-render)`, + }).withDetails({ + kind: 'error', + loc: instr.loc, + message: `${variable} cannot be reassigned`, + }), + }); + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'TypeCastExpression': { + effects.push({ kind: 'Assign', from: value.value, into: lvalue }); + break; + } + case 'LoadGlobal': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Global, + reason: ValueReason.Global, + }); + break; + } + case 'StartMemoize': + case 'FinishMemoize': { + if (env.config.enablePreserveExistingMemoizationGuarantees) { + for (const operand of eachInstructionValueOperand(value)) { + effects.push({ + kind: 'Freeze', + value: operand, + reason: ValueReason.HookCaptured, + }); + } + } + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + case 'TaggedTemplateExpression': + case 'BinaryExpression': + case 'Debugger': + case 'JSXText': + case 'MetaProperty': + case 'Primitive': + case 'RegExpLiteral': + case 'TemplateLiteral': + case 'UnaryExpression': + case 'UnsupportedNode': { + effects.push({ + kind: 'Create', + into: lvalue, + value: ValueKind.Primitive, + reason: ValueReason.Other, + }); + break; + } + } + return { + effects, + }; +} +function computeEffectsForLegacySignature(state, signature, lvalue, receiver, args, loc) { + var _a, _b; + const returnValueReason = (_a = signature.returnValueReason) !== null && _a !== void 0 ? _a : ValueReason.Other; + const effects = []; + effects.push({ + kind: 'Create', + into: lvalue, + value: signature.returnValueKind, + reason: returnValueReason, + }); + if (signature.impure && state.env.config.validateNoImpureFunctionsInRender) { + effects.push({ + kind: 'Impure', + place: receiver, + error: CompilerDiagnostic.create({ + category: ErrorCategory.Purity, + reason: 'Cannot call impure function during render', + description: (signature.canonicalName != null + ? `\`${signature.canonicalName}\` is an impure function. ` + : '') + + 'Calling an impure function can produce unstable results that update unpredictably when the component happens to re-render. (https://react.dev/reference/rules/components-and-hooks-must-be-pure#components-and-hooks-must-be-idempotent)', + }).withDetails({ + kind: 'error', + loc, + message: 'Cannot call impure function', + }), + }); + } + if (signature.knownIncompatible != null && state.env.isInferredMemoEnabled) { + const errors = new CompilerError(); + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.IncompatibleLibrary, + reason: 'Use of incompatible library', + description: [ + 'This API returns functions which cannot be memoized without leading to stale UI. ' + + 'To prevent this, by default React Compiler will skip memoizing this component/hook. ' + + 'However, you may see issues if values from this API are passed to other components/hooks that are ' + + 'memoized', + ].join(''), + }).withDetails({ + kind: 'error', + loc: receiver.loc, + message: signature.knownIncompatible, + })); + throw errors; + } + const stores = []; + const captures = []; + function visit(place, effect) { + switch (effect) { + case Effect.Store: { + effects.push({ + kind: 'Mutate', + value: place, + }); + stores.push(place); + break; + } + case Effect.Capture: { + captures.push(place); + break; + } + case Effect.ConditionallyMutate: { + effects.push({ + kind: 'MutateTransitiveConditionally', + value: place, + }); + break; + } + case Effect.ConditionallyMutateIterator: { + const mutateIterator = conditionallyMutateIterator(place); + if (mutateIterator != null) { + effects.push(mutateIterator); + } + effects.push({ + kind: 'Capture', + from: place, + into: lvalue, + }); + break; + } + case Effect.Freeze: { + effects.push({ + kind: 'Freeze', + value: place, + reason: returnValueReason, + }); + break; + } + case Effect.Mutate: { + effects.push({ kind: 'MutateTransitive', value: place }); + break; + } + case Effect.Read: { + effects.push({ + kind: 'ImmutableCapture', + from: place, + into: lvalue, + }); + break; + } + } + } + if (signature.mutableOnlyIfOperandsAreMutable && + areArgumentsImmutableAndNonMutating(state, args)) { + effects.push({ + kind: 'Alias', + from: receiver, + into: lvalue, + }); + for (const arg of args) { + if (arg.kind === 'Hole') { + continue; + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + effects.push({ + kind: 'ImmutableCapture', + from: place, + into: lvalue, + }); + } + return effects; + } + if (signature.calleeEffect !== Effect.Capture) { + effects.push({ + kind: 'Alias', + from: receiver, + into: lvalue, + }); + } + visit(receiver, signature.calleeEffect); + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg.kind === 'Hole') { + continue; + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + const signatureEffect = arg.kind === 'Identifier' && i < signature.positionalParams.length + ? signature.positionalParams[i] + : ((_b = signature.restParam) !== null && _b !== void 0 ? _b : Effect.ConditionallyMutate); + const effect = getArgumentEffect(signatureEffect, arg); + visit(place, effect); + } + if (captures.length !== 0) { + if (stores.length === 0) { + for (const capture of captures) { + effects.push({ kind: 'Alias', from: capture, into: lvalue }); + } + } + else { + for (const capture of captures) { + for (const store of stores) { + effects.push({ kind: 'Capture', from: capture, into: store }); + } + } + } + } + return effects; +} +function areArgumentsImmutableAndNonMutating(state, args) { + for (const arg of args) { + if (arg.kind === 'Hole') { + continue; + } + if (arg.kind === 'Identifier' && arg.identifier.type.kind === 'Function') { + const fnShape = state.env.getFunctionSignature(arg.identifier.type); + if (fnShape != null) { + return (!fnShape.positionalParams.some(isKnownMutableEffect) && + (fnShape.restParam == null || + !isKnownMutableEffect(fnShape.restParam))); + } + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + const kind = state.kind(place).kind; + switch (kind) { + case ValueKind.Primitive: + case ValueKind.Frozen: { + break; + } + default: { + return false; + } + } + const values = state.values(place); + for (const value of values) { + if (value.kind === 'FunctionExpression' && + value.loweredFunc.func.params.some(param => { + const place = param.kind === 'Identifier' ? param : param.place; + const range = place.identifier.mutableRange; + return range.end > range.start + 1; + })) { + return false; + } + } + } + return true; +} +function computeEffectsForSignature(env, signature, lvalue, receiver, args, context = [], loc) { + var _a, _b, _c, _d, _e, _f, _g; + if (signature.params.length > args.length || + (args.length > signature.params.length && signature.rest == null)) { + return null; + } + const mutableSpreads = new Set(); + const substitutions = new Map(); + substitutions.set(signature.receiver, [receiver]); + substitutions.set(signature.returns, [lvalue]); + const params = signature.params; + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg.kind === 'Hole') { + continue; + } + else if (params == null || i >= params.length || arg.kind === 'Spread') { + if (signature.rest == null) { + return null; + } + const place = arg.kind === 'Identifier' ? arg : arg.place; + getOrInsertWith(substitutions, signature.rest, () => []).push(place); + if (arg.kind === 'Spread') { + const mutateIterator = conditionallyMutateIterator(arg.place); + if (mutateIterator != null) { + mutableSpreads.add(arg.place.identifier.id); + } + } + } + else { + const param = params[i]; + substitutions.set(param, [arg]); + } + } + for (const operand of context) { + substitutions.set(operand.identifier.id, [operand]); + } + const effects = []; + for (const signatureTemporary of signature.temporaries) { + const temp = createTemporaryPlace(env, receiver.loc); + substitutions.set(signatureTemporary.identifier.id, [temp]); + } + for (const effect of signature.effects) { + switch (effect.kind) { + case 'MaybeAlias': + case 'Assign': + case 'ImmutableCapture': + case 'Alias': + case 'CreateFrom': + case 'Capture': { + const from = (_a = substitutions.get(effect.from.identifier.id)) !== null && _a !== void 0 ? _a : []; + const to = (_b = substitutions.get(effect.into.identifier.id)) !== null && _b !== void 0 ? _b : []; + for (const fromId of from) { + for (const toId of to) { + effects.push({ + kind: effect.kind, + from: fromId, + into: toId, + }); + } + } + break; + } + case 'Impure': + case 'MutateFrozen': + case 'MutateGlobal': { + const values = (_c = substitutions.get(effect.place.identifier.id)) !== null && _c !== void 0 ? _c : []; + for (const value of values) { + effects.push({ kind: effect.kind, place: value, error: effect.error }); + } + break; + } + case 'Render': { + const values = (_d = substitutions.get(effect.place.identifier.id)) !== null && _d !== void 0 ? _d : []; + for (const value of values) { + effects.push({ kind: effect.kind, place: value }); + } + break; + } + case 'Mutate': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': + case 'MutateConditionally': { + const values = (_e = substitutions.get(effect.value.identifier.id)) !== null && _e !== void 0 ? _e : []; + for (const id of values) { + effects.push({ kind: effect.kind, value: id }); + } + break; + } + case 'Freeze': { + const values = (_f = substitutions.get(effect.value.identifier.id)) !== null && _f !== void 0 ? _f : []; + for (const value of values) { + if (mutableSpreads.has(value.identifier.id)) { + CompilerError.throwTodo({ + reason: 'Support spread syntax for hook arguments', + loc: value.loc, + }); + } + effects.push({ kind: 'Freeze', value, reason: effect.reason }); + } + break; + } + case 'Create': { + const into = (_g = substitutions.get(effect.into.identifier.id)) !== null && _g !== void 0 ? _g : []; + for (const value of into) { + effects.push({ + kind: 'Create', + into: value, + value: effect.value, + reason: effect.reason, + }); + } + break; + } + case 'Apply': { + const applyReceiver = substitutions.get(effect.receiver.identifier.id); + if (applyReceiver == null || applyReceiver.length !== 1) { + return null; + } + const applyFunction = substitutions.get(effect.function.identifier.id); + if (applyFunction == null || applyFunction.length !== 1) { + return null; + } + const applyInto = substitutions.get(effect.into.identifier.id); + if (applyInto == null || applyInto.length !== 1) { + return null; + } + const applyArgs = []; + for (const arg of effect.args) { + if (arg.kind === 'Hole') { + applyArgs.push(arg); + } + else if (arg.kind === 'Identifier') { + const applyArg = substitutions.get(arg.identifier.id); + if (applyArg == null || applyArg.length !== 1) { + return null; + } + applyArgs.push(applyArg[0]); + } + else { + const applyArg = substitutions.get(arg.place.identifier.id); + if (applyArg == null || applyArg.length !== 1) { + return null; + } + applyArgs.push({ kind: 'Spread', place: applyArg[0] }); + } + } + effects.push({ + kind: 'Apply', + mutatesFunction: effect.mutatesFunction, + receiver: applyReceiver[0], + args: applyArgs, + function: applyFunction[0], + into: applyInto[0], + signature: effect.signature, + loc, + }); + break; + } + case 'CreateFunction': { + CompilerError.throwTodo({ + reason: `Support CreateFrom effects in signatures`, + loc: receiver.loc, + }); + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind '${effect.kind}'`); + } + } + } + return effects; +} +function buildSignatureFromFunctionExpression(env, fn) { + var _a; + let rest = null; + const params = []; + for (const param of fn.loweredFunc.func.params) { + if (param.kind === 'Identifier') { + params.push(param.identifier.id); + } + else { + rest = param.place.identifier.id; + } + } + return { + receiver: makeIdentifierId(0), + params, + rest: rest !== null && rest !== void 0 ? rest : createTemporaryPlace(env, fn.loc).identifier.id, + returns: fn.loweredFunc.func.returns.identifier.id, + effects: (_a = fn.loweredFunc.func.aliasingEffects) !== null && _a !== void 0 ? _a : [], + temporaries: [], + }; +} +function getWriteErrorReason(abstractValue) { + if (abstractValue.reason.has(ValueReason.Global)) { + return 'Modifying a variable defined outside a component or hook is not allowed. Consider using an effect'; + } + else if (abstractValue.reason.has(ValueReason.JsxCaptured)) { + return 'Modifying a value used previously in JSX is not allowed. Consider moving the modification before the JSX'; + } + else if (abstractValue.reason.has(ValueReason.Context)) { + return `Modifying a value returned from 'useContext()' is not allowed.`; + } + else if (abstractValue.reason.has(ValueReason.KnownReturnSignature)) { + return 'Modifying a value returned from a function whose return value should not be mutated'; + } + else if (abstractValue.reason.has(ValueReason.ReactiveFunctionArgument)) { + return 'Modifying component props or hook arguments is not allowed. Consider using a local variable instead'; + } + else if (abstractValue.reason.has(ValueReason.State)) { + return "Modifying a value returned from 'useState()', which should not be modified directly. Use the setter function to update instead"; + } + else if (abstractValue.reason.has(ValueReason.ReducerState)) { + return "Modifying a value returned from 'useReducer()', which should not be modified directly. Use the dispatch function to update instead"; + } + else if (abstractValue.reason.has(ValueReason.Effect)) { + return 'Modifying a value used previously in an effect function or as an effect dependency is not allowed. Consider moving the modification before calling useEffect()'; + } + else if (abstractValue.reason.has(ValueReason.HookCaptured)) { + return 'Modifying a value previously passed as an argument to a hook is not allowed. Consider moving the modification before calling the hook'; + } + else if (abstractValue.reason.has(ValueReason.HookReturn)) { + return 'Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed'; + } + else { + return 'This modifies a variable that React considers immutable'; + } +} +function getArgumentEffect(signatureEffect, arg) { + if (signatureEffect != null) { + if (arg.kind === 'Identifier') { + return signatureEffect; + } + else if (signatureEffect === Effect.Mutate || + signatureEffect === Effect.ConditionallyMutate) { + return signatureEffect; + } + else { + if (signatureEffect === Effect.Freeze) { + CompilerError.throwTodo({ + reason: 'Support spread syntax for hook arguments', + loc: arg.place.loc, + }); + } + return Effect.ConditionallyMutateIterator; + } + } + else { + return Effect.ConditionallyMutate; + } +} +function getFunctionCallSignature(env, type) { + if (type.kind !== 'Function') { + return null; + } + return env.getFunctionSignature(type); +} +function isKnownMutableEffect(effect) { + switch (effect) { + case Effect.Store: + case Effect.ConditionallyMutate: + case Effect.ConditionallyMutateIterator: + case Effect.Mutate: { + return true; + } + case Effect.Unknown: { + CompilerError.invariant(false, { + reason: 'Unexpected unknown effect', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + } + case Effect.Read: + case Effect.Capture: + case Effect.Freeze: { + return false; + } + default: { + assertExhaustive$1(effect, `Unexpected effect \`${effect}\``); + } + } +} +function mergeValueKinds(a, b) { + if (a === b) { + return a; + } + else if (a === ValueKind.MaybeFrozen || b === ValueKind.MaybeFrozen) { + return ValueKind.MaybeFrozen; + } + else if (a === ValueKind.Mutable || b === ValueKind.Mutable) { + if (a === ValueKind.Frozen || b === ValueKind.Frozen) { + return ValueKind.MaybeFrozen; + } + else if (a === ValueKind.Context || b === ValueKind.Context) { + return ValueKind.Context; + } + else { + return ValueKind.Mutable; + } + } + else if (a === ValueKind.Context || b === ValueKind.Context) { + if (a === ValueKind.Frozen || b === ValueKind.Frozen) { + return ValueKind.MaybeFrozen; + } + else { + return ValueKind.Context; + } + } + else if (a === ValueKind.Frozen || b === ValueKind.Frozen) { + return ValueKind.Frozen; + } + else if (a === ValueKind.Global || b === ValueKind.Global) { + return ValueKind.Global; + } + else { + CompilerError.invariant(a === ValueKind.Primitive && b == ValueKind.Primitive, { + reason: `Unexpected value kind in mergeValues()`, + description: `Found kinds ${a} and ${b}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + return ValueKind.Primitive; + } +} + +function pruneNonEscapingScopes(fn) { + const state = new State(fn.env); + for (const param of fn.params) { + if (param.kind === 'Identifier') { + state.declare(param.identifier.declarationId); + } + else { + state.declare(param.place.identifier.declarationId); + } + } + visitReactiveFunction(fn, new CollectDependenciesVisitor(fn.env, state), []); + const memoized = computeMemoizedIdentifiers(state); + visitReactiveFunction(fn, new PruneScopesTransform(), memoized); +} +var MemoizationLevel; +(function (MemoizationLevel) { + MemoizationLevel["Memoized"] = "Memoized"; + MemoizationLevel["Conditional"] = "Conditional"; + MemoizationLevel["Unmemoized"] = "Unmemoized"; + MemoizationLevel["Never"] = "Never"; +})(MemoizationLevel || (MemoizationLevel = {})); +function joinAliases(kind1, kind2) { + if (kind1 === MemoizationLevel.Memoized || + kind2 === MemoizationLevel.Memoized) { + return MemoizationLevel.Memoized; + } + else if (kind1 === MemoizationLevel.Conditional || + kind2 === MemoizationLevel.Conditional) { + return MemoizationLevel.Conditional; + } + else if (kind1 === MemoizationLevel.Unmemoized || + kind2 === MemoizationLevel.Unmemoized) { + return MemoizationLevel.Unmemoized; + } + else { + return MemoizationLevel.Never; + } +} +class State { + constructor(env) { + this.definitions = new Map(); + this.identifiers = new Map(); + this.scopes = new Map(); + this.escapingValues = new Set(); + this.env = env; + } + declare(id) { + this.identifiers.set(id, { + level: MemoizationLevel.Never, + memoized: false, + dependencies: new Set(), + scopes: new Set(), + seen: false, + }); + } + visitOperand(id, place, identifier) { + const scope = getPlaceScope(id, place); + if (scope !== null) { + let node = this.scopes.get(scope.id); + if (node === undefined) { + node = { + dependencies: [...scope.dependencies].map(dep => dep.identifier.declarationId), + seen: false, + }; + this.scopes.set(scope.id, node); + } + const identifierNode = this.identifiers.get(identifier); + CompilerError.invariant(identifierNode !== undefined, { + reason: 'Expected identifier to be initialized', + description: `[${id}] operand=${printPlace(place)} for identifier declaration ${identifier}`, + details: [ + { + kind: 'error', + loc: place.loc, + message: null, + }, + ], + suggestions: null, + }); + identifierNode.scopes.add(scope.id); + } + } +} +function computeMemoizedIdentifiers(state) { + const memoized = new Set(); + function visit(id, forceMemoize = false) { + const node = state.identifiers.get(id); + CompilerError.invariant(node !== undefined, { + reason: `Expected a node for all identifiers, none found for \`${id}\``, + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (node.seen) { + return node.memoized; + } + node.seen = true; + node.memoized = false; + let hasMemoizedDependency = false; + for (const dep of node.dependencies) { + const isDepMemoized = visit(dep); + hasMemoizedDependency || (hasMemoizedDependency = isDepMemoized); + } + if (node.level === MemoizationLevel.Memoized || + (node.level === MemoizationLevel.Conditional && + (hasMemoizedDependency || forceMemoize)) || + (node.level === MemoizationLevel.Unmemoized && forceMemoize)) { + node.memoized = true; + memoized.add(id); + for (const scope of node.scopes) { + forceMemoizeScopeDependencies(scope); + } + } + return node.memoized; + } + function forceMemoizeScopeDependencies(id) { + const node = state.scopes.get(id); + CompilerError.invariant(node !== undefined, { + reason: 'Expected a node for all scopes', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + if (node.seen) { + return; + } + node.seen = true; + for (const dep of node.dependencies) { + visit(dep, true); + } + return; + } + for (const value of state.escapingValues) { + visit(value); + } + return memoized; +} +function computePatternLValues(pattern) { + const lvalues = []; + switch (pattern.kind) { + case 'ArrayPattern': { + for (const item of pattern.items) { + if (item.kind === 'Identifier') { + lvalues.push({ place: item, level: MemoizationLevel.Conditional }); + } + else if (item.kind === 'Spread') { + lvalues.push({ place: item.place, level: MemoizationLevel.Memoized }); + } + } + break; + } + case 'ObjectPattern': { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + lvalues.push({ + place: property.place, + level: MemoizationLevel.Conditional, + }); + } + else { + lvalues.push({ + place: property.place, + level: MemoizationLevel.Memoized, + }); + } + } + break; + } + default: { + assertExhaustive$1(pattern, `Unexpected pattern kind \`${pattern.kind}\``); + } + } + return lvalues; +} +class CollectDependenciesVisitor extends ReactiveFunctionVisitor { + constructor(env, state) { + super(); + this.env = env; + this.state = state; + this.options = { + memoizeJsxElements: !this.env.config.enableForest, + forceMemoizePrimitives: this.env.config.enableForest || + this.env.config.enablePreserveExistingMemoizationGuarantees, + }; + } + computeMemoizationInputs(value, lvalue) { + const env = this.env; + const options = this.options; + switch (value.kind) { + case 'ConditionalExpression': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [ + ...this.computeMemoizationInputs(value.consequent, null).rvalues, + ...this.computeMemoizationInputs(value.alternate, null).rvalues, + ], + }; + } + case 'LogicalExpression': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [ + ...this.computeMemoizationInputs(value.left, null).rvalues, + ...this.computeMemoizationInputs(value.right, null).rvalues, + ], + }; + } + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitValueForMemoization(instr.id, instr.value, instr.lvalue); + } + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: this.computeMemoizationInputs(value.value, null).rvalues, + }; + } + case 'JsxExpression': { + const operands = []; + if (value.tag.kind === 'Identifier') { + operands.push(value.tag); + } + for (const prop of value.props) { + if (prop.kind === 'JsxAttribute') { + operands.push(prop.place); + } + else { + operands.push(prop.argument); + } + } + if (value.children !== null) { + for (const child of value.children) { + operands.push(child); + } + } + const level = options.memoizeJsxElements + ? MemoizationLevel.Memoized + : MemoizationLevel.Unmemoized; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: operands, + }; + } + case 'JsxFragment': { + const level = options.memoizeJsxElements + ? MemoizationLevel.Memoized + : MemoizationLevel.Unmemoized; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: value.children, + }; + } + case 'NextPropertyOf': + case 'StartMemoize': + case 'FinishMemoize': + case 'Debugger': + case 'ComputedDelete': + case 'PropertyDelete': + case 'LoadGlobal': + case 'MetaProperty': + case 'TemplateLiteral': + case 'Primitive': + case 'JSXText': + case 'BinaryExpression': + case 'UnaryExpression': { + if (options.forceMemoizePrimitives) { + const level = MemoizationLevel.Conditional; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: [...eachReactiveValueOperand(value)], + }; + } + const level = MemoizationLevel.Never; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: [], + }; + } + case 'Await': + case 'TypeCastExpression': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.value], + }; + } + case 'IteratorNext': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.iterator, value.collection], + }; + } + case 'GetIterator': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.collection], + }; + } + case 'LoadLocal': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.place], + }; + } + case 'LoadContext': { + return { + lvalues: lvalue !== null + ? [{ place: lvalue, level: MemoizationLevel.Conditional }] + : [], + rvalues: [value.place], + }; + } + case 'DeclareContext': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Memoized }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Unmemoized }); + } + return { + lvalues, + rvalues: [], + }; + } + case 'DeclareLocal': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Unmemoized }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Unmemoized }); + } + return { + lvalues, + rvalues: [], + }; + } + case 'PrefixUpdate': + case 'PostfixUpdate': { + const lvalues = [ + { place: value.lvalue, level: MemoizationLevel.Conditional }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'StoreLocal': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Conditional }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'StoreContext': { + const lvalues = [ + { place: value.lvalue.place, level: MemoizationLevel.Memoized }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'StoreGlobal': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Unmemoized }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'Destructure': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + lvalues.push(...computePatternLValues(value.lvalue.pattern)); + return { + lvalues: lvalues, + rvalues: [value.value], + }; + } + case 'ComputedLoad': + case 'PropertyLoad': { + const level = MemoizationLevel.Conditional; + return { + lvalues: lvalue !== null ? [{ place: lvalue, level }] : [], + rvalues: [value.object], + }; + } + case 'ComputedStore': { + const lvalues = [ + { place: value.object, level: MemoizationLevel.Conditional }, + ]; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues, + rvalues: [value.value], + }; + } + case 'OptionalExpression': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Conditional }); + } + return { + lvalues: lvalues, + rvalues: [ + ...this.computeMemoizationInputs(value.value, null).rvalues, + ], + }; + } + case 'TaggedTemplateExpression': { + const signature = getFunctionCallSignature(env, value.tag.identifier.type); + let lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + if ((signature === null || signature === void 0 ? void 0 : signature.noAlias) === true) { + return { + lvalues, + rvalues: [], + }; + } + const operands = [...eachReactiveValueOperand(value)]; + lvalues.push(...operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized }))); + return { + lvalues, + rvalues: operands, + }; + } + case 'CallExpression': { + const signature = getFunctionCallSignature(env, value.callee.identifier.type); + let lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + if ((signature === null || signature === void 0 ? void 0 : signature.noAlias) === true) { + return { + lvalues, + rvalues: [], + }; + } + const operands = [...eachReactiveValueOperand(value)]; + lvalues.push(...operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized }))); + return { + lvalues, + rvalues: operands, + }; + } + case 'MethodCall': { + const signature = getFunctionCallSignature(env, value.property.identifier.type); + let lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + if ((signature === null || signature === void 0 ? void 0 : signature.noAlias) === true) { + return { + lvalues, + rvalues: [], + }; + } + const operands = [...eachReactiveValueOperand(value)]; + lvalues.push(...operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized }))); + return { + lvalues, + rvalues: operands, + }; + } + case 'RegExpLiteral': + case 'ObjectMethod': + case 'FunctionExpression': + case 'ArrayExpression': + case 'NewExpression': + case 'ObjectExpression': + case 'PropertyStore': { + const operands = [...eachReactiveValueOperand(value)]; + const lvalues = operands + .filter(operand => isMutableEffect(operand.effect, operand.loc)) + .map(place => ({ place, level: MemoizationLevel.Memoized })); + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Memoized }); + } + return { + lvalues, + rvalues: operands, + }; + } + case 'UnsupportedNode': { + const lvalues = []; + if (lvalue !== null) { + lvalues.push({ place: lvalue, level: MemoizationLevel.Never }); + } + return { + lvalues, + rvalues: [], + }; + } + default: { + assertExhaustive$1(value, `Unexpected value kind \`${value.kind}\``); + } + } + } + visitValueForMemoization(id, value, lvalue) { + var _a, _b, _c; + const state = this.state; + const aliasing = this.computeMemoizationInputs(value, lvalue); + for (const operand of aliasing.rvalues) { + const operandId = (_a = state.definitions.get(operand.identifier.declarationId)) !== null && _a !== void 0 ? _a : operand.identifier.declarationId; + state.visitOperand(id, operand, operandId); + } + for (const { place: lvalue, level } of aliasing.lvalues) { + const lvalueId = (_b = state.definitions.get(lvalue.identifier.declarationId)) !== null && _b !== void 0 ? _b : lvalue.identifier.declarationId; + let node = state.identifiers.get(lvalueId); + if (node === undefined) { + node = { + level: MemoizationLevel.Never, + memoized: false, + dependencies: new Set(), + scopes: new Set(), + seen: false, + }; + state.identifiers.set(lvalueId, node); + } + node.level = joinAliases(node.level, level); + for (const operand of aliasing.rvalues) { + const operandId = (_c = state.definitions.get(operand.identifier.declarationId)) !== null && _c !== void 0 ? _c : operand.identifier.declarationId; + if (operandId === lvalueId) { + continue; + } + node.dependencies.add(operandId); + } + state.visitOperand(id, lvalue, lvalueId); + } + if (value.kind === 'LoadLocal' && lvalue !== null) { + state.definitions.set(lvalue.identifier.declarationId, value.place.identifier.declarationId); + } + else if (value.kind === 'CallExpression' || value.kind === 'MethodCall') { + let callee = value.kind === 'CallExpression' ? value.callee : value.property; + if (getHookKind(state.env, callee.identifier) != null) { + const signature = getFunctionCallSignature(this.env, callee.identifier.type); + if (signature && signature.noAlias === true) { + return; + } + for (const operand of value.args) { + const place = operand.kind === 'Spread' ? operand.place : operand; + state.escapingValues.add(place.identifier.declarationId); + } + } + } + } + visitInstruction(instruction, _scopes) { + this.visitValueForMemoization(instruction.id, instruction.value, instruction.lvalue); + } + visitTerminal(stmt, scopes) { + this.traverseTerminal(stmt, scopes); + if (stmt.terminal.kind === 'return') { + this.state.escapingValues.add(stmt.terminal.value.identifier.declarationId); + const identifierNode = this.state.identifiers.get(stmt.terminal.value.identifier.declarationId); + CompilerError.invariant(identifierNode !== undefined, { + reason: 'Expected identifier to be initialized', + description: null, + details: [ + { + kind: 'error', + loc: stmt.terminal.loc, + message: null, + }, + ], + suggestions: null, + }); + for (const scope of scopes) { + identifierNode.scopes.add(scope.id); + } + } + } + visitScope(scope, scopes) { + for (const reassignment of scope.scope.reassignments) { + const identifierNode = this.state.identifiers.get(reassignment.declarationId); + CompilerError.invariant(identifierNode !== undefined, { + reason: 'Expected identifier to be initialized', + description: null, + details: [ + { + kind: 'error', + loc: reassignment.loc, + message: null, + }, + ], + suggestions: null, + }); + for (const scope of scopes) { + identifierNode.scopes.add(scope.id); + } + identifierNode.scopes.add(scope.scope.id); + } + this.traverseScope(scope, [...scopes, scope.scope]); + } +} +class PruneScopesTransform extends ReactiveFunctionTransform { + constructor() { + super(...arguments); + this.prunedScopes = new Set(); + this.reassignments = new Map(); + } + transformScope(scopeBlock, state) { + this.visitScope(scopeBlock, state); + if ((scopeBlock.scope.declarations.size === 0 && + scopeBlock.scope.reassignments.size === 0) || + scopeBlock.scope.earlyReturnValue !== null) { + return { kind: 'keep' }; + } + const hasMemoizedOutput = Array.from(scopeBlock.scope.declarations.values()).some(decl => state.has(decl.identifier.declarationId)) || + Array.from(scopeBlock.scope.reassignments).some(identifier => state.has(identifier.declarationId)); + if (hasMemoizedOutput) { + return { kind: 'keep' }; + } + else { + this.prunedScopes.add(scopeBlock.scope.id); + return { + kind: 'replace-many', + value: scopeBlock.instructions, + }; + } + } + transformInstruction(instruction, state) { + var _a; + this.traverseInstruction(instruction, state); + const value = instruction.value; + if (value.kind === 'StoreLocal' && value.lvalue.kind === 'Reassign') { + const ids = getOrInsertDefault(this.reassignments, value.lvalue.place.identifier.declarationId, new Set()); + ids.add(value.value.identifier); + } + else if (value.kind === 'LoadLocal' && + value.place.identifier.scope != null && + instruction.lvalue != null && + instruction.lvalue.identifier.scope == null) { + const ids = getOrInsertDefault(this.reassignments, instruction.lvalue.identifier.declarationId, new Set()); + ids.add(value.place.identifier); + } + else if (value.kind === 'FinishMemoize') { + let decls; + if (value.decl.identifier.scope == null) { + decls = (_a = this.reassignments.get(value.decl.identifier.declarationId)) !== null && _a !== void 0 ? _a : [ + value.decl.identifier, + ]; + } + else { + decls = [value.decl.identifier]; + } + if ([...decls].every(decl => decl.scope == null || this.prunedScopes.has(decl.scope.id))) { + value.pruned = true; + } + } + return { kind: 'keep' }; + } +} + +let Visitor$7 = class Visitor extends ReactiveFunctionVisitor { + visitLValue(id, lvalue, state) { + this.visitPlace(id, lvalue, state); + } + visitPlace(_id, place, state) { + if (place.reactive) { + state.add(place.identifier.id); + } + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + for (const [id, decl] of scopeBlock.scope.declarations) { + if (!isPrimitiveType(decl.identifier) && + !isStableRefType(decl.identifier, state)) { + state.add(id); + } + } + } +}; +function isStableRefType(identifier, reactiveIdentifiers) { + return isUseRefType(identifier) && !reactiveIdentifiers.has(identifier.id); +} +function collectReactiveIdentifiers(fn) { + const visitor = new Visitor$7(); + const state = new Set(); + visitReactiveFunction(fn, visitor, state); + return state; +} + +function pruneNonReactiveDependencies(fn) { + const reactiveIdentifiers = collectReactiveIdentifiers(fn); + visitReactiveFunction(fn, new Visitor$6(), reactiveIdentifiers); +} +let Visitor$6 = class Visitor extends ReactiveFunctionVisitor { + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + const { lvalue, value } = instruction; + switch (value.kind) { + case 'LoadLocal': { + if (lvalue !== null && state.has(value.place.identifier.id)) { + state.add(lvalue.identifier.id); + } + break; + } + case 'StoreLocal': { + if (state.has(value.value.identifier.id)) { + state.add(value.lvalue.place.identifier.id); + if (lvalue !== null) { + state.add(lvalue.identifier.id); + } + } + break; + } + case 'Destructure': { + if (state.has(value.value.identifier.id)) { + for (const lvalue of eachPatternOperand(value.lvalue.pattern)) { + if (isStableType(lvalue.identifier)) { + continue; + } + state.add(lvalue.identifier.id); + } + if (lvalue !== null) { + state.add(lvalue.identifier.id); + } + } + break; + } + case 'PropertyLoad': { + if (lvalue !== null && + state.has(value.object.identifier.id) && + !isStableType(lvalue.identifier)) { + state.add(lvalue.identifier.id); + } + break; + } + case 'ComputedLoad': { + if (lvalue !== null && + (state.has(value.object.identifier.id) || + state.has(value.property.identifier.id))) { + state.add(lvalue.identifier.id); + } + break; + } + } + } + visitScope(scopeBlock, state) { + this.traverseScope(scopeBlock, state); + for (const dep of scopeBlock.scope.dependencies) { + const isReactive = state.has(dep.identifier.id); + if (!isReactive) { + scopeBlock.scope.dependencies.delete(dep); + } + } + if (scopeBlock.scope.dependencies.size !== 0) { + for (const [, declaration] of scopeBlock.scope.declarations) { + state.add(declaration.identifier.id); + } + for (const reassignment of scopeBlock.scope.reassignments) { + state.add(reassignment.id); + } + } + } +}; + +function pruneUnusedLValues(fn) { + const lvalues = new Map(); + visitReactiveFunction(fn, new Visitor$5(), lvalues); + for (const [, instr] of lvalues) { + instr.lvalue = null; + } +} +let Visitor$5 = class Visitor extends ReactiveFunctionVisitor { + visitPlace(id, place, state) { + state.delete(place.identifier.declarationId); + } + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + if (instruction.lvalue !== null && + instruction.lvalue.identifier.name === null) { + state.set(instruction.lvalue.identifier.declarationId, instruction); + } + } +}; + +function pruneUnusedLabels(fn) { + const labels = new Set(); + visitReactiveFunction(fn, new Transform$2(), labels); +} +let Transform$2 = class Transform extends ReactiveFunctionTransform { + transformTerminal(stmt, state) { + this.traverseTerminal(stmt, state); + const { terminal } = stmt; + if ((terminal.kind === 'break' || terminal.kind === 'continue') && + terminal.targetKind === 'labeled') { + state.add(terminal.target); + } + const isReachableLabel = stmt.label !== null && state.has(stmt.label.id); + if (stmt.terminal.kind === 'label' && !isReachableLabel) { + const block = [...stmt.terminal.block]; + const last = block.at(-1); + if (last !== undefined && + last.kind === 'terminal' && + last.terminal.kind === 'break' && + last.terminal.target === null) { + block.pop(); + } + return { kind: 'replace-many', value: block }; + } + else { + if (!isReachableLabel && stmt.label != null) { + stmt.label.implicit = true; + } + return { kind: 'keep' }; + } + } +}; + +function pruneUnusedScopes(fn) { + visitReactiveFunction(fn, new Transform$1(), { + hasReturnStatement: false, + }); +} +let Transform$1 = class Transform extends ReactiveFunctionTransform { + visitTerminal(stmt, state) { + this.traverseTerminal(stmt, state); + if (stmt.terminal.kind === 'return') { + state.hasReturnStatement = true; + } + } + transformScope(scopeBlock, _state) { + const scopeState = { hasReturnStatement: false }; + this.visitScope(scopeBlock, scopeState); + if (!scopeState.hasReturnStatement && + scopeBlock.scope.reassignments.size === 0 && + (scopeBlock.scope.declarations.size === 0 || + !hasOwnDeclaration(scopeBlock))) { + return { + kind: 'replace', + value: { + kind: 'pruned-scope', + scope: scopeBlock.scope, + instructions: scopeBlock.instructions, + }, + }; + } + else { + return { kind: 'keep' }; + } + } +}; +function hasOwnDeclaration(block) { + for (const declaration of block.scope.declarations.values()) { + if (declaration.scope.id === block.scope.id) { + return true; + } + } + return false; +} + +function collectReferencedGlobals(fn) { + const identifiers = new Set(); + visitReactiveFunction(fn, new Visitor$4(), identifiers); + return identifiers; +} +let Visitor$4 = class Visitor extends ReactiveFunctionVisitor { + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') { + this.visitHirFunction(value.loweredFunc.func, state); + } + else if (value.kind === 'LoadGlobal') { + state.add(value.binding.name); + } + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + visitReactiveFunction(fn, this, state); + } +}; + +var _Scopes_instances, _Scopes_seen, _Scopes_stack, _Scopes_globals, _Scopes_programContext, _Scopes_lookup; +function renameVariables(fn) { + const globals = collectReferencedGlobals(fn); + const scopes = new Scopes(globals, fn.env.programContext); + renameVariablesImpl(fn, new Visitor$3(), scopes); + return new Set([...scopes.names, ...globals]); +} +function renameVariablesImpl(fn, visitor, scopes) { + scopes.enter(() => { + for (const param of fn.params) { + if (param.kind === 'Identifier') { + scopes.visit(param.identifier); + } + else { + scopes.visit(param.place.identifier); + } + } + visitReactiveFunction(fn, visitor, scopes); + }); +} +let Visitor$3 = class Visitor extends ReactiveFunctionVisitor { + visitParam(place, state) { + state.visit(place.identifier); + } + visitLValue(_id, lvalue, state) { + state.visit(lvalue.identifier); + } + visitPlace(id, place, state) { + state.visit(place.identifier); + } + visitBlock(block, state) { + state.enter(() => { + this.traverseBlock(block, state); + }); + } + visitPrunedScope(scopeBlock, state) { + this.traverseBlock(scopeBlock.instructions, state); + } + visitScope(scope, state) { + for (const [_, declaration] of scope.scope.declarations) { + state.visit(declaration.identifier); + } + this.traverseScope(scope, state); + } + visitValue(id, value, state) { + this.traverseValue(id, value, state); + if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') { + this.visitHirFunction(value.loweredFunc.func, state); + } + } + visitReactiveFunctionValue(_id, _dependencies, _fn, _state) { + renameVariablesImpl(_fn, this, _state); + } +}; +class Scopes { + constructor(globals, programContext) { + _Scopes_instances.add(this); + _Scopes_seen.set(this, new Map()); + _Scopes_stack.set(this, [new Map()]); + _Scopes_globals.set(this, void 0); + _Scopes_programContext.set(this, void 0); + this.names = new Set(); + __classPrivateFieldSet(this, _Scopes_globals, globals, "f"); + __classPrivateFieldSet(this, _Scopes_programContext, programContext, "f"); + } + visit(identifier) { + const originalName = identifier.name; + if (originalName === null) { + return; + } + const mappedName = __classPrivateFieldGet(this, _Scopes_seen, "f").get(identifier.declarationId); + if (mappedName !== undefined) { + identifier.name = mappedName; + return; + } + let name = originalName.value; + let id = 0; + if (isPromotedTemporary(originalName.value)) { + name = `t${id++}`; + } + else if (isPromotedJsxTemporary(originalName.value)) { + name = `T${id++}`; + } + while (__classPrivateFieldGet(this, _Scopes_instances, "m", _Scopes_lookup).call(this, name) !== null || __classPrivateFieldGet(this, _Scopes_globals, "f").has(name)) { + if (isPromotedTemporary(originalName.value)) { + name = `t${id++}`; + } + else if (isPromotedJsxTemporary(originalName.value)) { + name = `T${id++}`; + } + else { + name = `${originalName.value}$${id++}`; + } + } + __classPrivateFieldGet(this, _Scopes_programContext, "f").addNewReference(name); + const identifierName = makeIdentifierName(name); + identifier.name = identifierName; + __classPrivateFieldGet(this, _Scopes_seen, "f").set(identifier.declarationId, identifierName); + __classPrivateFieldGet(this, _Scopes_stack, "f").at(-1).set(identifierName.value, identifier.declarationId); + this.names.add(identifierName.value); + } + enter(fn) { + const next = new Map(); + __classPrivateFieldGet(this, _Scopes_stack, "f").push(next); + fn(); + const last = __classPrivateFieldGet(this, _Scopes_stack, "f").pop(); + CompilerError.invariant(last === next, { + reason: 'Mismatch push/pop calls', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + } +} +_Scopes_seen = new WeakMap(), _Scopes_stack = new WeakMap(), _Scopes_globals = new WeakMap(), _Scopes_programContext = new WeakMap(), _Scopes_instances = new WeakSet(), _Scopes_lookup = function _Scopes_lookup(name) { + for (let i = __classPrivateFieldGet(this, _Scopes_stack, "f").length - 1; i >= 0; i--) { + const scope = __classPrivateFieldGet(this, _Scopes_stack, "f")[i]; + const entry = scope.get(name); + if (entry !== undefined) { + return entry; + } + } + return null; +}; + +function stabilizeBlockIds(fn) { + const referenced = new Set(); + visitReactiveFunction(fn, new CollectReferencedLabels(), referenced); + const mappings = new Map(); + for (const blockId of referenced) { + mappings.set(blockId, makeBlockId(mappings.size)); + } + visitReactiveFunction(fn, new RewriteBlockIds(), mappings); +} +class CollectReferencedLabels extends ReactiveFunctionVisitor { + visitScope(scope, state) { + const { earlyReturnValue } = scope.scope; + if (earlyReturnValue != null) { + state.add(earlyReturnValue.label); + } + this.traverseScope(scope, state); + } + visitTerminal(stmt, state) { + if (stmt.label != null) { + if (!stmt.label.implicit) { + state.add(stmt.label.id); + } + } + this.traverseTerminal(stmt, state); + } +} +class RewriteBlockIds extends ReactiveFunctionVisitor { + visitScope(scope, state) { + const { earlyReturnValue } = scope.scope; + if (earlyReturnValue != null) { + const rewrittenId = getOrInsertDefault(state, earlyReturnValue.label, state.size); + earlyReturnValue.label = makeBlockId(rewrittenId); + } + this.traverseScope(scope, state); + } + visitTerminal(stmt, state) { + if (stmt.label != null) { + const rewrittenId = getOrInsertDefault(state, stmt.label.id, state.size); + stmt.label.id = makeBlockId(rewrittenId); + } + const terminal = stmt.terminal; + if (terminal.kind === 'break' || terminal.kind === 'continue') { + const rewrittenId = getOrInsertDefault(state, terminal.target, state.size); + terminal.target = makeBlockId(rewrittenId); + } + this.traverseTerminal(stmt, state); + } +} + +function inferMutationAliasingRanges(fn, { isFunctionExpression }) { + var _a, _b, _c, _d, _e, _f, _g; + const functionEffects = []; + const state = new AliasingState(); + const pendingPhis = new Map(); + const mutations = []; + const renders = []; + let index = 0; + const errors = new CompilerError(); + for (const param of [...fn.params, ...fn.context, fn.returns]) { + const place = param.kind === 'Identifier' ? param : param.place; + state.create(place, { kind: 'Object' }); + } + const seenBlocks = new Set(); + for (const block of fn.body.blocks.values()) { + for (const phi of block.phis) { + state.create(phi.place, { kind: 'Phi' }); + for (const [pred, operand] of phi.operands) { + if (!seenBlocks.has(pred)) { + const blockPhis = getOrInsertWith(pendingPhis, pred, () => []); + blockPhis.push({ from: operand, into: phi.place, index: index++ }); + } + else { + state.assign(index++, operand, phi.place); + } + } + } + seenBlocks.add(block.id); + for (const instr of block.instructions) { + if (instr.effects == null) + continue; + for (const effect of instr.effects) { + if (effect.kind === 'Create') { + state.create(effect.into, { kind: 'Object' }); + } + else if (effect.kind === 'CreateFunction') { + state.create(effect.into, { + kind: 'Function', + function: effect.function.loweredFunc.func, + }); + } + else if (effect.kind === 'CreateFrom') { + state.createFrom(index++, effect.from, effect.into); + } + else if (effect.kind === 'Assign') { + if (!state.nodes.has(effect.into.identifier)) { + state.create(effect.into, { kind: 'Object' }); + } + state.assign(index++, effect.from, effect.into); + } + else if (effect.kind === 'Alias') { + state.assign(index++, effect.from, effect.into); + } + else if (effect.kind === 'MaybeAlias') { + state.maybeAlias(index++, effect.from, effect.into); + } + else if (effect.kind === 'Capture') { + state.capture(index++, effect.from, effect.into); + } + else if (effect.kind === 'MutateTransitive' || + effect.kind === 'MutateTransitiveConditionally') { + mutations.push({ + index: index++, + id: instr.id, + transitive: true, + kind: effect.kind === 'MutateTransitive' + ? MutationKind.Definite + : MutationKind.Conditional, + reason: null, + place: effect.value, + }); + } + else if (effect.kind === 'Mutate' || + effect.kind === 'MutateConditionally') { + mutations.push({ + index: index++, + id: instr.id, + transitive: false, + kind: effect.kind === 'Mutate' + ? MutationKind.Definite + : MutationKind.Conditional, + reason: effect.kind === 'Mutate' ? ((_a = effect.reason) !== null && _a !== void 0 ? _a : null) : null, + place: effect.value, + }); + } + else if (effect.kind === 'MutateFrozen' || + effect.kind === 'MutateGlobal' || + effect.kind === 'Impure') { + errors.pushDiagnostic(effect.error); + functionEffects.push(effect); + } + else if (effect.kind === 'Render') { + renders.push({ index: index++, place: effect.place }); + functionEffects.push(effect); + } + } + } + const blockPhis = pendingPhis.get(block.id); + if (blockPhis != null) { + for (const { from, into, index } of blockPhis) { + state.assign(index, from, into); + } + } + if (block.terminal.kind === 'return') { + state.assign(index++, block.terminal.value, fn.returns); + } + if ((block.terminal.kind === 'maybe-throw' || + block.terminal.kind === 'return') && + block.terminal.effects != null) { + for (const effect of block.terminal.effects) { + if (effect.kind === 'Alias') { + state.assign(index++, effect.from, effect.into); + } + else { + CompilerError.invariant(effect.kind === 'Freeze', { + reason: `Unexpected '${effect.kind}' effect for MaybeThrow terminal`, + description: null, + details: [ + { + kind: 'error', + loc: block.terminal.loc, + message: null, + }, + ], + }); + } + } + } + } + for (const mutation of mutations) { + state.mutate(mutation.index, mutation.place.identifier, makeInstructionId(mutation.id + 1), mutation.transitive, mutation.kind, mutation.place.loc, mutation.reason, errors); + } + for (const render of renders) { + state.render(render.index, render.place.identifier, errors); + } + for (const param of [...fn.context, ...fn.params]) { + const place = param.kind === 'Identifier' ? param : param.place; + const node = state.nodes.get(place.identifier); + if (node == null) { + continue; + } + let mutated = false; + if (node.local != null) { + if (node.local.kind === MutationKind.Conditional) { + mutated = true; + functionEffects.push({ + kind: 'MutateConditionally', + value: Object.assign(Object.assign({}, place), { loc: node.local.loc }), + }); + } + else if (node.local.kind === MutationKind.Definite) { + mutated = true; + functionEffects.push({ + kind: 'Mutate', + value: Object.assign(Object.assign({}, place), { loc: node.local.loc }), + reason: node.mutationReason, + }); + } + } + if (node.transitive != null) { + if (node.transitive.kind === MutationKind.Conditional) { + mutated = true; + functionEffects.push({ + kind: 'MutateTransitiveConditionally', + value: Object.assign(Object.assign({}, place), { loc: node.transitive.loc }), + }); + } + else if (node.transitive.kind === MutationKind.Definite) { + mutated = true; + functionEffects.push({ + kind: 'MutateTransitive', + value: Object.assign(Object.assign({}, place), { loc: node.transitive.loc }), + }); + } + } + if (mutated) { + place.effect = Effect.Capture; + } + } + for (const block of fn.body.blocks.values()) { + for (const phi of block.phis) { + phi.place.effect = Effect.Store; + const isPhiMutatedAfterCreation = phi.place.identifier.mutableRange.end > + ((_c = (_b = block.instructions.at(0)) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : block.terminal.id); + for (const operand of phi.operands.values()) { + operand.effect = isPhiMutatedAfterCreation + ? Effect.Capture + : Effect.Read; + } + if (isPhiMutatedAfterCreation && + phi.place.identifier.mutableRange.start === 0) { + const firstInstructionIdOfBlock = (_e = (_d = block.instructions.at(0)) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : block.terminal.id; + phi.place.identifier.mutableRange.start = makeInstructionId(firstInstructionIdOfBlock - 1); + } + } + for (const instr of block.instructions) { + for (const lvalue of eachInstructionLValue(instr)) { + lvalue.effect = Effect.ConditionallyMutate; + if (lvalue.identifier.mutableRange.start === 0) { + lvalue.identifier.mutableRange.start = instr.id; + } + if (lvalue.identifier.mutableRange.end === 0) { + lvalue.identifier.mutableRange.end = makeInstructionId(Math.max(instr.id + 1, lvalue.identifier.mutableRange.end)); + } + } + for (const operand of eachInstructionValueOperand(instr.value)) { + operand.effect = Effect.Read; + } + if (instr.effects == null) { + continue; + } + const operandEffects = new Map(); + for (const effect of instr.effects) { + switch (effect.kind) { + case 'Assign': + case 'Alias': + case 'Capture': + case 'CreateFrom': + case 'MaybeAlias': { + const isMutatedOrReassigned = effect.into.identifier.mutableRange.end > instr.id; + if (isMutatedOrReassigned) { + operandEffects.set(effect.from.identifier.id, Effect.Capture); + operandEffects.set(effect.into.identifier.id, Effect.Store); + } + else { + operandEffects.set(effect.from.identifier.id, Effect.Read); + operandEffects.set(effect.into.identifier.id, Effect.Store); + } + break; + } + case 'CreateFunction': + case 'Create': { + break; + } + case 'Mutate': { + operandEffects.set(effect.value.identifier.id, Effect.Store); + break; + } + case 'Apply': { + CompilerError.invariant(false, { + reason: `[AnalyzeFunctions] Expected Apply effects to be replaced with more precise effects`, + description: null, + details: [ + { + kind: 'error', + loc: effect.function.loc, + message: null, + }, + ], + }); + } + case 'MutateTransitive': + case 'MutateConditionally': + case 'MutateTransitiveConditionally': { + operandEffects.set(effect.value.identifier.id, Effect.ConditionallyMutate); + break; + } + case 'Freeze': { + operandEffects.set(effect.value.identifier.id, Effect.Freeze); + break; + } + case 'ImmutableCapture': { + break; + } + case 'Impure': + case 'Render': + case 'MutateFrozen': + case 'MutateGlobal': { + break; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind ${effect.kind}`); + } + } + } + for (const lvalue of eachInstructionLValue(instr)) { + const effect = (_f = operandEffects.get(lvalue.identifier.id)) !== null && _f !== void 0 ? _f : Effect.ConditionallyMutate; + lvalue.effect = effect; + } + for (const operand of eachInstructionValueOperand(instr.value)) { + if (operand.identifier.mutableRange.end > instr.id && + operand.identifier.mutableRange.start === 0) { + operand.identifier.mutableRange.start = instr.id; + } + const effect = (_g = operandEffects.get(operand.identifier.id)) !== null && _g !== void 0 ? _g : Effect.Read; + operand.effect = effect; + } + if (instr.value.kind === 'StoreContext' && + instr.value.value.identifier.mutableRange.end <= instr.id) { + instr.value.value.identifier.mutableRange.end = makeInstructionId(instr.id + 1); + } + } + if (block.terminal.kind === 'return') { + block.terminal.value.effect = isFunctionExpression + ? Effect.Read + : Effect.Freeze; + } + else { + for (const operand of eachTerminalOperand(block.terminal)) { + operand.effect = Effect.Read; + } + } + } + const returns = fn.returns.identifier; + functionEffects.push({ + kind: 'Create', + into: fn.returns, + value: isPrimitiveType(returns) + ? ValueKind.Primitive + : isJsxType(returns.type) + ? ValueKind.Frozen + : ValueKind.Mutable, + reason: ValueReason.KnownReturnSignature, + }); + const tracked = []; + const ignoredErrors = new CompilerError(); + for (const param of [...fn.params, ...fn.context, fn.returns]) { + const place = param.kind === 'Identifier' ? param : param.place; + tracked.push(place); + } + for (const into of tracked) { + const mutationIndex = index++; + state.mutate(mutationIndex, into.identifier, null, true, MutationKind.Conditional, into.loc, null, ignoredErrors); + for (const from of tracked) { + if (from.identifier.id === into.identifier.id || + from.identifier.id === fn.returns.identifier.id) { + continue; + } + const fromNode = state.nodes.get(from.identifier); + CompilerError.invariant(fromNode != null, { + reason: `Expected a node to exist for all parameters and context variables`, + description: null, + details: [ + { + kind: 'error', + loc: into.loc, + message: null, + }, + ], + }); + if (fromNode.lastMutated === mutationIndex) { + if (into.identifier.id === fn.returns.identifier.id) { + functionEffects.push({ + kind: 'Alias', + from, + into, + }); + } + else { + functionEffects.push({ + kind: 'Capture', + from, + into, + }); + } + } + } + } + if (errors.hasAnyErrors() && !isFunctionExpression) { + return Err(errors); + } + return Ok(functionEffects); +} +function appendFunctionErrors(errors, fn) { + var _a; + for (const effect of (_a = fn.aliasingEffects) !== null && _a !== void 0 ? _a : []) { + switch (effect.kind) { + case 'Impure': + case 'MutateFrozen': + case 'MutateGlobal': { + errors.pushDiagnostic(effect.error); + break; + } + } + } +} +var MutationKind; +(function (MutationKind) { + MutationKind[MutationKind["None"] = 0] = "None"; + MutationKind[MutationKind["Conditional"] = 1] = "Conditional"; + MutationKind[MutationKind["Definite"] = 2] = "Definite"; +})(MutationKind || (MutationKind = {})); +class AliasingState { + constructor() { + this.nodes = new Map(); + } + create(place, value) { + this.nodes.set(place.identifier, { + id: place.identifier, + createdFrom: new Map(), + captures: new Map(), + aliases: new Map(), + maybeAliases: new Map(), + edges: [], + transitive: null, + local: null, + lastMutated: 0, + mutationReason: null, + value, + }); + } + createFrom(index, from, into) { + this.create(into, { kind: 'Object' }); + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'alias' }); + if (!toNode.createdFrom.has(from.identifier)) { + toNode.createdFrom.set(from.identifier, index); + } + } + capture(index, from, into) { + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'capture' }); + if (!toNode.captures.has(from.identifier)) { + toNode.captures.set(from.identifier, index); + } + } + assign(index, from, into) { + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'alias' }); + if (!toNode.aliases.has(from.identifier)) { + toNode.aliases.set(from.identifier, index); + } + } + maybeAlias(index, from, into) { + const fromNode = this.nodes.get(from.identifier); + const toNode = this.nodes.get(into.identifier); + if (fromNode == null || toNode == null) { + return; + } + fromNode.edges.push({ index, node: into.identifier, kind: 'maybeAlias' }); + if (!toNode.maybeAliases.has(from.identifier)) { + toNode.maybeAliases.set(from.identifier, index); + } + } + render(index, start, errors) { + const seen = new Set(); + const queue = [start]; + while (queue.length !== 0) { + const current = queue.pop(); + if (seen.has(current)) { + continue; + } + seen.add(current); + const node = this.nodes.get(current); + if (node == null || node.transitive != null || node.local != null) { + continue; + } + if (node.value.kind === 'Function') { + appendFunctionErrors(errors, node.value.function); + } + for (const [alias, when] of node.createdFrom) { + if (when >= index) { + continue; + } + queue.push(alias); + } + for (const [alias, when] of node.aliases) { + if (when >= index) { + continue; + } + queue.push(alias); + } + for (const [capture, when] of node.captures) { + if (when >= index) { + continue; + } + queue.push(capture); + } + } + } + mutate(index, start, end, transitive, startKind, loc, reason, errors) { + var _a; + const seen = new Map(); + const queue = [{ place: start, transitive, direction: 'backwards', kind: startKind }]; + while (queue.length !== 0) { + const { place: current, transitive, direction, kind } = queue.pop(); + const previousKind = seen.get(current); + if (previousKind != null && previousKind >= kind) { + continue; + } + seen.set(current, kind); + const node = this.nodes.get(current); + if (node == null) { + continue; + } + (_a = node.mutationReason) !== null && _a !== void 0 ? _a : (node.mutationReason = reason); + node.lastMutated = Math.max(node.lastMutated, index); + if (end != null) { + node.id.mutableRange.end = makeInstructionId(Math.max(node.id.mutableRange.end, end)); + } + if (node.value.kind === 'Function' && + node.transitive == null && + node.local == null) { + appendFunctionErrors(errors, node.value.function); + } + if (transitive) { + if (node.transitive == null || node.transitive.kind < kind) { + node.transitive = { kind, loc }; + } + } + else { + if (node.local == null || node.local.kind < kind) { + node.local = { kind, loc }; + } + } + for (const edge of node.edges) { + if (edge.index >= index) { + break; + } + queue.push({ + place: edge.node, + transitive, + direction: 'forwards', + kind: edge.kind === 'maybeAlias' ? MutationKind.Conditional : kind, + }); + } + for (const [alias, when] of node.createdFrom) { + if (when >= index) { + continue; + } + queue.push({ + place: alias, + transitive: true, + direction: 'backwards', + kind, + }); + } + if (direction === 'backwards' || node.value.kind !== 'Phi') { + for (const [alias, when] of node.aliases) { + if (when >= index) { + continue; + } + queue.push({ + place: alias, + transitive, + direction: 'backwards', + kind, + }); + } + for (const [alias, when] of node.maybeAliases) { + if (when >= index) { + continue; + } + queue.push({ + place: alias, + transitive, + direction: 'backwards', + kind: MutationKind.Conditional, + }); + } + } + if (transitive) { + for (const [capture, when] of node.captures) { + if (when >= index) { + continue; + } + queue.push({ + place: capture, + transitive, + direction: 'backwards', + kind, + }); + } + } + } + } +} + +function analyseFunctions(func) { + for (const [_, block] of func.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'ObjectMethod': + case 'FunctionExpression': { + lowerWithMutationAliasing(instr.value.loweredFunc.func); + for (const operand of instr.value.loweredFunc.func.context) { + operand.identifier.mutableRange = { + start: makeInstructionId(0), + end: makeInstructionId(0), + }; + operand.identifier.scope = null; + } + break; + } + } + } + } +} +function lowerWithMutationAliasing(fn) { + var _a, _b; + analyseFunctions(fn); + inferMutationAliasingEffects(fn, { isFunctionExpression: true }); + deadCodeElimination(fn); + const functionEffects = inferMutationAliasingRanges(fn, { + isFunctionExpression: true, + }).unwrap(); + rewriteInstructionKindsBasedOnReassignment(fn); + inferReactiveScopeVariables(fn); + fn.aliasingEffects = functionEffects; + const capturedOrMutated = new Set(); + for (const effect of functionEffects) { + switch (effect.kind) { + case 'Assign': + case 'Alias': + case 'Capture': + case 'CreateFrom': + case 'MaybeAlias': { + capturedOrMutated.add(effect.from.identifier.id); + break; + } + case 'Apply': { + CompilerError.invariant(false, { + reason: `[AnalyzeFunctions] Expected Apply effects to be replaced with more precise effects`, + description: null, + details: [ + { + kind: 'error', + loc: effect.function.loc, + message: null, + }, + ], + }); + } + case 'Mutate': + case 'MutateConditionally': + case 'MutateTransitive': + case 'MutateTransitiveConditionally': { + capturedOrMutated.add(effect.value.identifier.id); + break; + } + case 'Impure': + case 'Render': + case 'MutateFrozen': + case 'MutateGlobal': + case 'CreateFunction': + case 'Create': + case 'Freeze': + case 'ImmutableCapture': { + break; + } + default: { + assertExhaustive$1(effect, `Unexpected effect kind ${effect.kind}`); + } + } + } + for (const operand of fn.context) { + if (capturedOrMutated.has(operand.identifier.id) || + operand.effect === Effect.Capture) { + operand.effect = Effect.Capture; + } + else { + operand.effect = Effect.Read; + } + } + (_b = (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, { + kind: 'hir', + name: 'AnalyseFunction (inner)', + value: fn, + }); +} + +function collectMaybeMemoDependencies(value, maybeDeps, optional) { + var _a; + switch (value.kind) { + case 'LoadGlobal': { + return { + root: { + kind: 'Global', + identifierName: value.binding.name, + }, + path: [], + }; + } + case 'PropertyLoad': { + const object = maybeDeps.get(value.object.identifier.id); + if (object != null) { + return { + root: object.root, + path: [...object.path, { property: value.property, optional }], + }; + } + break; + } + case 'LoadLocal': + case 'LoadContext': { + const source = maybeDeps.get(value.place.identifier.id); + if (source != null) { + return source; + } + else if (value.place.identifier.name != null && + value.place.identifier.name.kind === 'named') { + return { + root: { + kind: 'NamedLocal', + value: Object.assign({}, value.place), + }, + path: [], + }; + } + break; + } + case 'StoreLocal': { + const lvalue = value.lvalue.place.identifier; + const rvalue = value.value.identifier.id; + const aliased = maybeDeps.get(rvalue); + if (aliased != null && ((_a = lvalue.name) === null || _a === void 0 ? void 0 : _a.kind) !== 'named') { + maybeDeps.set(lvalue.id, aliased); + return aliased; + } + break; + } + } + return null; +} +function collectTemporaries(instr, env, sidemap) { + const { value, lvalue } = instr; + switch (value.kind) { + case 'FunctionExpression': { + sidemap.functions.set(instr.lvalue.identifier.id, instr); + break; + } + case 'LoadGlobal': { + const global = env.getGlobalDeclaration(value.binding, value.loc); + const hookKind = global !== null ? getHookKindForType(env, global) : null; + const lvalId = instr.lvalue.identifier.id; + if (hookKind === 'useMemo' || hookKind === 'useCallback') { + sidemap.manualMemos.set(lvalId, { + kind: hookKind, + loadInstr: instr, + }); + } + else if (value.binding.name === 'React') { + sidemap.react.add(lvalId); + } + break; + } + case 'PropertyLoad': { + if (sidemap.react.has(value.object.identifier.id)) { + const property = value.property; + if (property === 'useMemo' || property === 'useCallback') { + sidemap.manualMemos.set(instr.lvalue.identifier.id, { + kind: property, + loadInstr: instr, + }); + } + } + break; + } + case 'ArrayExpression': { + if (value.elements.every(e => e.kind === 'Identifier')) { + sidemap.maybeDepsLists.set(instr.lvalue.identifier.id, value.elements); + } + break; + } + } + const maybeDep = collectMaybeMemoDependencies(value, sidemap.maybeDeps, sidemap.optionals.has(lvalue.identifier.id)); + if (maybeDep != null) { + sidemap.maybeDeps.set(lvalue.identifier.id, maybeDep); + } +} +function makeManualMemoizationMarkers(fnExpr, env, depsList, memoDecl, manualMemoId) { + return [ + { + id: makeInstructionId(0), + lvalue: createTemporaryPlace(env, fnExpr.loc), + value: { + kind: 'StartMemoize', + manualMemoId, + deps: depsList, + loc: fnExpr.loc, + }, + effects: null, + loc: fnExpr.loc, + }, + { + id: makeInstructionId(0), + lvalue: createTemporaryPlace(env, fnExpr.loc), + value: { + kind: 'FinishMemoize', + manualMemoId, + decl: Object.assign({}, memoDecl), + loc: fnExpr.loc, + }, + effects: null, + loc: fnExpr.loc, + }, + ]; +} +function getManualMemoizationReplacement(fn, loc, kind) { + if (kind === 'useMemo') { + return { + kind: 'CallExpression', + callee: fn, + args: [], + loc, + }; + } + else { + return { + kind: 'LoadLocal', + place: { + kind: 'Identifier', + identifier: fn.identifier, + effect: Effect.Unknown, + reactive: false, + loc, + }, + loc, + }; + } +} +function extractManualMemoizationArgs(instr, kind, sidemap, errors) { + const [fnPlace, depsListPlace] = instr.value.args; + if (fnPlace == null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected a callback function to be passed to ${kind}`, + description: `Expected a callback function to be passed to ${kind}`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: instr.value.loc, + message: `Expected a callback function to be passed to ${kind}`, + })); + return { fnPlace: null, depsList: null }; + } + if (fnPlace.kind === 'Spread' || (depsListPlace === null || depsListPlace === void 0 ? void 0 : depsListPlace.kind) === 'Spread') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Unexpected spread argument to ${kind}`, + description: `Unexpected spread argument to ${kind}`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: instr.value.loc, + message: `Unexpected spread argument to ${kind}`, + })); + return { fnPlace: null, depsList: null }; + } + let depsList = null; + if (depsListPlace != null) { + const maybeDepsList = sidemap.maybeDepsLists.get(depsListPlace.identifier.id); + if (maybeDepsList == null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected the dependency list for ${kind} to be an array literal`, + description: `Expected the dependency list for ${kind} to be an array literal`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: depsListPlace.loc, + message: `Expected the dependency list for ${kind} to be an array literal`, + })); + return { fnPlace, depsList: null }; + } + depsList = []; + for (const dep of maybeDepsList) { + const maybeDep = sidemap.maybeDeps.get(dep.identifier.id); + if (maybeDep == null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected the dependency list to be an array of simple expressions (e.g. \`x\`, \`x.y.z\`, \`x?.y?.z\`)`, + description: `Expected the dependency list to be an array of simple expressions (e.g. \`x\`, \`x.y.z\`, \`x?.y?.z\`)`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: dep.loc, + message: `Expected the dependency list to be an array of simple expressions (e.g. \`x\`, \`x.y.z\`, \`x?.y?.z\`)`, + })); + } + else { + depsList.push(maybeDep); + } + } + } + return { + fnPlace, + depsList, + }; +} +function dropManualMemoization(func) { + var _a; + const errors = new CompilerError(); + const isValidationEnabled = func.env.config.validatePreserveExistingMemoizationGuarantees || + func.env.config.validateNoSetStateInRender || + func.env.config.enablePreserveExistingMemoizationGuarantees; + const optionals = findOptionalPlaces(func); + const sidemap = { + functions: new Map(), + manualMemos: new Map(), + react: new Set(), + maybeDeps: new Map(), + maybeDepsLists: new Map(), + optionals, + }; + let nextManualMemoId = 0; + const queuedInserts = new Map(); + for (const [_, block] of func.body.blocks) { + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + if (instr.value.kind === 'CallExpression' || + instr.value.kind === 'MethodCall') { + const id = instr.value.kind === 'CallExpression' + ? instr.value.callee.identifier.id + : instr.value.property.identifier.id; + const manualMemo = sidemap.manualMemos.get(id); + if (manualMemo != null) { + const { fnPlace, depsList } = extractManualMemoizationArgs(instr, manualMemo.kind, sidemap, errors); + if (fnPlace == null) { + continue; + } + if (func.env.config.validateNoVoidUseMemo && + manualMemo.kind === 'useMemo') { + const funcToCheck = (_a = sidemap.functions.get(fnPlace.identifier.id)) === null || _a === void 0 ? void 0 : _a.value; + if (funcToCheck !== undefined && funcToCheck.loweredFunc.func) { + if (!hasNonVoidReturn(funcToCheck.loweredFunc.func)) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: 'useMemo() callbacks must return a value', + description: `This ${manualMemo.loadInstr.value.kind === 'PropertyLoad' + ? 'React.useMemo' + : 'useMemo'} callback doesn't return a value. useMemo is for computing and caching values, not for arbitrary side effects`, + suggestions: null, + }).withDetails({ + kind: 'error', + loc: instr.value.loc, + message: 'useMemo() callbacks must return a value', + })); + } + } + } + instr.value = getManualMemoizationReplacement(fnPlace, instr.value.loc, manualMemo.kind); + if (isValidationEnabled) { + if (!sidemap.functions.has(fnPlace.identifier.id)) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: `Expected the first argument to be an inline function expression`, + description: `Expected the first argument to be an inline function expression`, + suggestions: [], + }).withDetails({ + kind: 'error', + loc: fnPlace.loc, + message: `Expected the first argument to be an inline function expression`, + })); + continue; + } + const memoDecl = manualMemo.kind === 'useMemo' + ? instr.lvalue + : { + kind: 'Identifier', + identifier: fnPlace.identifier, + effect: Effect.Unknown, + reactive: false, + loc: fnPlace.loc, + }; + const [startMarker, finishMarker] = makeManualMemoizationMarkers(fnPlace, func.env, depsList, memoDecl, nextManualMemoId++); + queuedInserts.set(manualMemo.loadInstr.id, startMarker); + queuedInserts.set(instr.id, finishMarker); + } + } + } + else { + collectTemporaries(instr, func.env, sidemap); + } + } + } + if (queuedInserts.size > 0) { + let hasChanges = false; + for (const [_, block] of func.body.blocks) { + let nextInstructions = null; + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + const insertInstr = queuedInserts.get(instr.id); + if (insertInstr != null) { + nextInstructions = nextInstructions !== null && nextInstructions !== void 0 ? nextInstructions : block.instructions.slice(0, i); + nextInstructions.push(instr); + nextInstructions.push(insertInstr); + } + else if (nextInstructions != null) { + nextInstructions.push(instr); + } + } + if (nextInstructions !== null) { + block.instructions = nextInstructions; + hasChanges = true; + } + } + if (hasChanges) { + markInstructionIds(func.body); + } + } + return errors.asResult(); +} +function findOptionalPlaces(fn) { + const optionals = new Set(); + for (const [, block] of fn.body.blocks) { + if (block.terminal.kind === 'optional' && block.terminal.optional) { + const optionalTerminal = block.terminal; + let testBlock = fn.body.blocks.get(block.terminal.test); + loop: while (true) { + const terminal = testBlock.terminal; + switch (terminal.kind) { + case 'branch': { + if (terminal.fallthrough === optionalTerminal.fallthrough) { + const consequent = fn.body.blocks.get(terminal.consequent); + const last = consequent.instructions.at(-1); + if (last !== undefined && last.value.kind === 'StoreLocal') { + optionals.add(last.value.value.identifier.id); + } + break loop; + } + else { + testBlock = fn.body.blocks.get(terminal.fallthrough); + } + break; + } + case 'optional': + case 'logical': + case 'sequence': + case 'ternary': { + testBlock = fn.body.blocks.get(terminal.fallthrough); + break; + } + default: { + CompilerError.invariant(false, { + reason: `Unexpected terminal in optional`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: `Unexpected ${terminal.kind} in optional`, + }, + ], + }); + } + } + } + } + } + return optionals; +} +function hasNonVoidReturn(func) { + for (const [, block] of func.body.blocks) { + if (block.terminal.kind === 'return') { + if (block.terminal.returnVariant === 'Explicit' || + block.terminal.returnVariant === 'Implicit') { + return true; + } + } + } + return false; +} + +class StableSidemap { + constructor(env) { + this.map = new Map(); + this.env = env; + } + handleInstruction(instr) { + const { value, lvalue } = instr; + switch (value.kind) { + case 'CallExpression': + case 'MethodCall': { + if (evaluatesToStableTypeOrContainer(this.env, instr)) { + if (isStableType(lvalue.identifier)) { + this.map.set(lvalue.identifier.id, { + isStable: true, + }); + } + else { + this.map.set(lvalue.identifier.id, { + isStable: false, + }); + } + } + break; + } + case 'Destructure': + case 'PropertyLoad': { + const source = value.kind === 'Destructure' + ? value.value.identifier.id + : value.object.identifier.id; + const entry = this.map.get(source); + if (entry) { + for (const lvalue of eachInstructionLValue(instr)) { + if (isStableTypeContainer(lvalue.identifier)) { + this.map.set(lvalue.identifier.id, { + isStable: false, + }); + } + else if (isStableType(lvalue.identifier)) { + this.map.set(lvalue.identifier.id, { + isStable: true, + }); + } + } + } + break; + } + case 'StoreLocal': { + const entry = this.map.get(value.value.identifier.id); + if (entry) { + this.map.set(lvalue.identifier.id, entry); + this.map.set(value.lvalue.place.identifier.id, entry); + } + break; + } + case 'LoadLocal': { + const entry = this.map.get(value.place.identifier.id); + if (entry) { + this.map.set(lvalue.identifier.id, entry); + } + break; + } + } + } + isStable(id) { + const entry = this.map.get(id); + return entry != null ? entry.isStable : false; + } +} +function inferReactivePlaces(fn) { + const reactiveIdentifiers = new ReactivityMap(findDisjointMutableValues(fn)); + const stableIdentifierSources = new StableSidemap(fn.env); + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + reactiveIdentifiers.markReactive(place); + } + const postDominators = computePostDominatorTree(fn, { + includeThrowsAsExitNode: false, + }); + const postDominatorFrontierCache = new Map(); + function isReactiveControlledBlock(id) { + let controlBlocks = postDominatorFrontierCache.get(id); + if (controlBlocks === undefined) { + controlBlocks = postDominatorFrontier(fn, postDominators, id); + postDominatorFrontierCache.set(id, controlBlocks); + } + for (const blockId of controlBlocks) { + const controlBlock = fn.body.blocks.get(blockId); + switch (controlBlock.terminal.kind) { + case 'if': + case 'branch': { + if (reactiveIdentifiers.isReactive(controlBlock.terminal.test)) { + return true; + } + break; + } + case 'switch': { + if (reactiveIdentifiers.isReactive(controlBlock.terminal.test)) { + return true; + } + for (const case_ of controlBlock.terminal.cases) { + if (case_.test !== null && + reactiveIdentifiers.isReactive(case_.test)) { + return true; + } + } + break; + } + } + } + return false; + } + do { + for (const [, block] of fn.body.blocks) { + let hasReactiveControl = isReactiveControlledBlock(block.id); + for (const phi of block.phis) { + if (reactiveIdentifiers.isReactive(phi.place)) { + continue; + } + let isPhiReactive = false; + for (const [, operand] of phi.operands) { + if (reactiveIdentifiers.isReactive(operand)) { + isPhiReactive = true; + break; + } + } + if (isPhiReactive) { + reactiveIdentifiers.markReactive(phi.place); + } + else { + for (const [pred] of phi.operands) { + if (isReactiveControlledBlock(pred)) { + reactiveIdentifiers.markReactive(phi.place); + break; + } + } + } + } + for (const instruction of block.instructions) { + stableIdentifierSources.handleInstruction(instruction); + const { value } = instruction; + let hasReactiveInput = false; + for (const operand of eachInstructionValueOperand(value)) { + const reactive = reactiveIdentifiers.isReactive(operand); + hasReactiveInput || (hasReactiveInput = reactive); + } + if (value.kind === 'CallExpression' && + (getHookKind(fn.env, value.callee.identifier) != null || + isUseOperator(value.callee.identifier))) { + hasReactiveInput = true; + } + else if (value.kind === 'MethodCall' && + (getHookKind(fn.env, value.property.identifier) != null || + isUseOperator(value.property.identifier))) { + hasReactiveInput = true; + } + if (hasReactiveInput) { + for (const lvalue of eachInstructionLValue(instruction)) { + if (stableIdentifierSources.isStable(lvalue.identifier.id)) { + continue; + } + reactiveIdentifiers.markReactive(lvalue); + } + } + if (hasReactiveInput || hasReactiveControl) { + for (const operand of eachInstructionValueOperand(value)) { + switch (operand.effect) { + case Effect.Capture: + case Effect.Store: + case Effect.ConditionallyMutate: + case Effect.ConditionallyMutateIterator: + case Effect.Mutate: { + if (isMutable(instruction, operand)) { + reactiveIdentifiers.markReactive(operand); + } + break; + } + case Effect.Freeze: + case Effect.Read: { + break; + } + case Effect.Unknown: { + CompilerError.invariant(false, { + reason: 'Unexpected unknown effect', + description: null, + details: [ + { + kind: 'error', + loc: operand.loc, + message: null, + }, + ], + suggestions: null, + }); + } + default: { + assertExhaustive$1(operand.effect, `Unexpected effect kind \`${operand.effect}\``); + } + } + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + reactiveIdentifiers.isReactive(operand); + } + } + } while (reactiveIdentifiers.snapshot()); + function propagateReactivityToInnerFunctions(fn, isOutermost) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (!isOutermost) { + for (const operand of eachInstructionOperand(instr)) { + reactiveIdentifiers.isReactive(operand); + } + } + if (instr.value.kind === 'ObjectMethod' || + instr.value.kind === 'FunctionExpression') { + propagateReactivityToInnerFunctions(instr.value.loweredFunc.func, false); + } + } + if (!isOutermost) { + for (const operand of eachTerminalOperand(block.terminal)) { + reactiveIdentifiers.isReactive(operand); + } + } + } + } + propagateReactivityToInnerFunctions(fn, true); +} +function postDominatorFrontier(fn, postDominators, targetId) { + const visited = new Set(); + const frontier = new Set(); + const targetPostDominators = postDominatorsOf(fn, postDominators, targetId); + for (const blockId of [...targetPostDominators, targetId]) { + if (visited.has(blockId)) { + continue; + } + visited.add(blockId); + const block = fn.body.blocks.get(blockId); + for (const pred of block.preds) { + if (!targetPostDominators.has(pred)) { + frontier.add(pred); + } + } + } + return frontier; +} +function postDominatorsOf(fn, postDominators, targetId) { + var _a; + const result = new Set(); + const visited = new Set(); + const queue = [targetId]; + while (queue.length) { + const currentId = queue.shift(); + if (visited.has(currentId)) { + continue; + } + visited.add(currentId); + const current = fn.body.blocks.get(currentId); + for (const pred of current.preds) { + const predPostDominator = (_a = postDominators.get(pred)) !== null && _a !== void 0 ? _a : pred; + if (predPostDominator === targetId || result.has(predPostDominator)) { + result.add(pred); + } + queue.push(pred); + } + } + return result; +} +class ReactivityMap { + constructor(aliasedIdentifiers) { + this.hasChanges = false; + this.reactive = new Set(); + this.aliasedIdentifiers = aliasedIdentifiers; + } + isReactive(place) { + var _a; + const identifier = (_a = this.aliasedIdentifiers.find(place.identifier)) !== null && _a !== void 0 ? _a : place.identifier; + const reactive = this.reactive.has(identifier.id); + if (reactive) { + place.reactive = true; + } + return reactive; + } + markReactive(place) { + var _a; + place.reactive = true; + const identifier = (_a = this.aliasedIdentifiers.find(place.identifier)) !== null && _a !== void 0 ? _a : place.identifier; + if (!this.reactive.has(identifier.id)) { + this.hasChanges = true; + this.reactive.add(identifier.id); + } + } + snapshot() { + const hasChanges = this.hasChanges; + this.hasChanges = false; + return hasChanges; + } +} + +function inlineImmediatelyInvokedFunctionExpressions(fn) { + const functions = new Map(); + const inlinedFunctions = new Set(); + const queue = Array.from(fn.body.blocks.values()); + queue: for (const block of queue) { + if (isStatementBlockKind(block.kind)) { + for (let ii = 0; ii < block.instructions.length; ii++) { + const instr = block.instructions[ii]; + switch (instr.value.kind) { + case 'FunctionExpression': { + if (instr.lvalue.identifier.name === null) { + functions.set(instr.lvalue.identifier.id, instr.value); + } + break; + } + case 'CallExpression': { + if (instr.value.args.length !== 0) { + continue; + } + const body = functions.get(instr.value.callee.identifier.id); + if (body === undefined) { + continue; + } + if (body.loweredFunc.func.params.length > 0 || + body.loweredFunc.func.async || + body.loweredFunc.func.generator) { + continue; + } + inlinedFunctions.add(instr.value.callee.identifier.id); + const continuationBlockId = fn.env.nextBlockId; + const continuationBlock = { + id: continuationBlockId, + instructions: block.instructions.slice(ii + 1), + kind: block.kind, + phis: new Set(), + preds: new Set(), + terminal: block.terminal, + }; + fn.body.blocks.set(continuationBlockId, continuationBlock); + block.instructions.length = ii; + if (hasSingleExitReturnTerminal(body.loweredFunc.func)) { + block.terminal = { + kind: 'goto', + block: body.loweredFunc.func.body.entry, + id: block.terminal.id, + loc: block.terminal.loc, + variant: GotoVariant.Break, + }; + for (const block of body.loweredFunc.func.body.blocks.values()) { + if (block.terminal.kind === 'return') { + block.instructions.push({ + id: makeInstructionId(0), + loc: block.terminal.loc, + lvalue: instr.lvalue, + value: { + kind: 'LoadLocal', + loc: block.terminal.loc, + place: block.terminal.value, + }, + effects: null, + }); + block.terminal = { + kind: 'goto', + block: continuationBlockId, + id: block.terminal.id, + loc: block.terminal.loc, + variant: GotoVariant.Break, + }; + } + } + for (const [id, block] of body.loweredFunc.func.body.blocks) { + block.preds.clear(); + fn.body.blocks.set(id, block); + } + } + else { + const newTerminal = { + block: body.loweredFunc.func.body.entry, + id: makeInstructionId(0), + kind: 'label', + fallthrough: continuationBlockId, + loc: block.terminal.loc, + }; + block.terminal = newTerminal; + const result = instr.lvalue; + declareTemporary(fn.env, block, result); + if (result.identifier.name == null) { + promoteTemporary(result.identifier); + } + for (const [id, block] of body.loweredFunc.func.body.blocks) { + block.preds.clear(); + rewriteBlock(fn.env, block, continuationBlockId, result); + fn.body.blocks.set(id, block); + } + } + queue.push(continuationBlock); + continue queue; + } + default: { + for (const place of eachInstructionValueOperand(instr.value)) { + functions.delete(place.identifier.id); + } + } + } + } + } + } + if (inlinedFunctions.size !== 0) { + for (const block of fn.body.blocks.values()) { + retainWhere(block.instructions, instr => !inlinedFunctions.has(instr.lvalue.identifier.id)); + } + reversePostorderBlocks(fn.body); + markInstructionIds(fn.body); + markPredecessors(fn.body); + mergeConsecutiveBlocks(fn); + } +} +function hasSingleExitReturnTerminal(fn) { + let hasReturn = false; + let exitCount = 0; + for (const [, block] of fn.body.blocks) { + if (block.terminal.kind === 'return' || block.terminal.kind === 'throw') { + hasReturn || (hasReturn = block.terminal.kind === 'return'); + exitCount++; + } + } + return exitCount === 1 && hasReturn; +} +function rewriteBlock(env, block, returnTarget, returnValue) { + const { terminal } = block; + if (terminal.kind !== 'return') { + return; + } + block.instructions.push({ + id: makeInstructionId(0), + loc: terminal.loc, + lvalue: createTemporaryPlace(env, terminal.loc), + value: { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Reassign, place: Object.assign({}, returnValue) }, + value: terminal.value, + type: null, + loc: terminal.loc, + }, + effects: null, + }); + block.terminal = { + kind: 'goto', + block: returnTarget, + id: makeInstructionId(0), + variant: GotoVariant.Break, + loc: block.terminal.loc, + }; +} +function declareTemporary(env, block, result) { + block.instructions.push({ + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: createTemporaryPlace(env, result.loc), + value: { + kind: 'DeclareLocal', + lvalue: { + place: result, + kind: InstructionKind.Let, + }, + type: null, + loc: result.loc, + }, + effects: null, + }); +} + +function collectHoistablePropertyLoads(fn, temporaries, hoistableFromOptionals) { + const registry = new PropertyPathRegistry(); + const knownImmutableIdentifiers = new Set(); + if (fn.fnType === 'Component' || fn.fnType === 'Hook') { + for (const p of fn.params) { + if (p.kind === 'Identifier') { + knownImmutableIdentifiers.add(p.identifier.id); + } + } + } + return collectHoistablePropertyLoadsImpl(fn, { + temporaries, + knownImmutableIdentifiers, + hoistableFromOptionals, + registry, + nestedFnImmutableContext: null, + assumedInvokedFns: fn.env.config.enableTreatFunctionDepsAsConditional + ? new Set() + : getAssumedInvokedFunctions(fn), + }); +} +function collectHoistablePropertyLoadsInInnerFn(fnInstr, temporaries, hoistableFromOptionals) { + const fn = fnInstr.value.loweredFunc.func; + const initialContext = { + temporaries, + knownImmutableIdentifiers: new Set(), + hoistableFromOptionals, + registry: new PropertyPathRegistry(), + nestedFnImmutableContext: null, + assumedInvokedFns: fn.env.config.enableTreatFunctionDepsAsConditional + ? new Set() + : getAssumedInvokedFunctions(fn), + }; + const nestedFnImmutableContext = new Set(fn.context + .filter(place => isImmutableAtInstr(place.identifier, fnInstr.id, initialContext)) + .map(place => place.identifier.id)); + initialContext.nestedFnImmutableContext = nestedFnImmutableContext; + return collectHoistablePropertyLoadsImpl(fn, initialContext); +} +function collectHoistablePropertyLoadsImpl(fn, context) { + const nodes = collectNonNullsInBlocks(fn, context); + propagateNonNull(fn, nodes, context.registry); + return nodes; +} +function keyByScopeId(fn, source) { + const keyedByScopeId = new Map(); + for (const [_, block] of fn.body.blocks) { + if (block.terminal.kind === 'scope') { + keyedByScopeId.set(block.terminal.scope.id, source.get(block.terminal.block)); + } + } + return keyedByScopeId; +} +class PropertyPathRegistry { + constructor() { + this.roots = new Map(); + } + getOrCreateIdentifier(identifier, reactive) { + let rootNode = this.roots.get(identifier.id); + if (rootNode === undefined) { + rootNode = { + root: identifier.id, + properties: new Map(), + optionalProperties: new Map(), + fullPath: { + identifier, + reactive, + path: [], + }, + hasOptional: false, + parent: null, + }; + this.roots.set(identifier.id, rootNode); + } + else { + CompilerError.invariant(reactive === rootNode.fullPath.reactive, { + reason: '[HoistablePropertyLoads] Found inconsistencies in `reactive` flag when deduping identifier reads within the same scope', + description: null, + details: [ + { + kind: 'error', + loc: identifier.loc, + message: null, + }, + ], + }); + } + return rootNode; + } + static getOrCreatePropertyEntry(parent, entry) { + const map = entry.optional ? parent.optionalProperties : parent.properties; + let child = map.get(entry.property); + if (child == null) { + child = { + properties: new Map(), + optionalProperties: new Map(), + parent: parent, + fullPath: { + identifier: parent.fullPath.identifier, + reactive: parent.fullPath.reactive, + path: parent.fullPath.path.concat(entry), + }, + hasOptional: parent.hasOptional || entry.optional, + }; + map.set(entry.property, child); + } + return child; + } + getOrCreateProperty(n) { + let currNode = this.getOrCreateIdentifier(n.identifier, n.reactive); + if (n.path.length === 0) { + return currNode; + } + for (let i = 0; i < n.path.length - 1; i++) { + currNode = PropertyPathRegistry.getOrCreatePropertyEntry(currNode, n.path[i]); + } + return PropertyPathRegistry.getOrCreatePropertyEntry(currNode, n.path.at(-1)); + } +} +function getMaybeNonNullInInstruction(instr, context) { + var _a, _b, _c; + let path = null; + if (instr.kind === 'PropertyLoad') { + path = (_a = context.temporaries.get(instr.object.identifier.id)) !== null && _a !== void 0 ? _a : { + identifier: instr.object.identifier, + reactive: instr.object.reactive, + path: [], + }; + } + else if (instr.kind === 'Destructure') { + path = (_b = context.temporaries.get(instr.value.identifier.id)) !== null && _b !== void 0 ? _b : null; + } + else if (instr.kind === 'ComputedLoad') { + path = (_c = context.temporaries.get(instr.object.identifier.id)) !== null && _c !== void 0 ? _c : null; + } + return path != null ? context.registry.getOrCreateProperty(path) : null; +} +function isImmutableAtInstr(identifier, instr, context) { + if (context.nestedFnImmutableContext != null) { + return context.nestedFnImmutableContext.has(identifier.id); + } + else { + const mutableAtInstr = identifier.mutableRange.end > identifier.mutableRange.start + 1 && + identifier.scope != null && + inRange({ + id: instr, + }, identifier.scope.range); + return (!mutableAtInstr || context.knownImmutableIdentifiers.has(identifier.id)); + } +} +function collectNonNullsInBlocks(fn, context) { + var _a; + const knownNonNullIdentifiers = new Set(); + if (fn.fnType === 'Component' && + fn.params.length > 0 && + fn.params[0].kind === 'Identifier') { + const identifier = fn.params[0].identifier; + knownNonNullIdentifiers.add(context.registry.getOrCreateIdentifier(identifier, true)); + } + const nodes = new Map(); + for (const [_, block] of fn.body.blocks) { + const assumedNonNullObjects = new Set(knownNonNullIdentifiers); + const maybeOptionalChain = context.hoistableFromOptionals.get(block.id); + if (maybeOptionalChain != null) { + assumedNonNullObjects.add(context.registry.getOrCreateProperty(maybeOptionalChain)); + } + for (const instr of block.instructions) { + const maybeNonNull = getMaybeNonNullInInstruction(instr.value, context); + if (maybeNonNull != null && + isImmutableAtInstr(maybeNonNull.fullPath.identifier, instr.id, context)) { + assumedNonNullObjects.add(maybeNonNull); + } + if (instr.value.kind === 'FunctionExpression') { + const innerFn = instr.value.loweredFunc; + if (context.assumedInvokedFns.has(innerFn)) { + const innerHoistableMap = collectHoistablePropertyLoadsImpl(innerFn.func, Object.assign(Object.assign({}, context), { nestedFnImmutableContext: (_a = context.nestedFnImmutableContext) !== null && _a !== void 0 ? _a : new Set(innerFn.func.context + .filter(place => isImmutableAtInstr(place.identifier, instr.id, context)) + .map(place => place.identifier.id)) })); + const innerHoistables = assertNonNull(innerHoistableMap.get(innerFn.func.body.entry)); + for (const entry of innerHoistables.assumedNonNullObjects) { + assumedNonNullObjects.add(entry); + } + } + } + } + nodes.set(block.id, { + block, + assumedNonNullObjects, + }); + } + return nodes; +} +function propagateNonNull(fn, nodes, registry) { + const blockSuccessors = new Map(); + const terminalPreds = new Set(); + for (const [blockId, block] of fn.body.blocks) { + for (const pred of block.preds) { + getOrInsertDefault(blockSuccessors, pred, new Set()).add(blockId); + } + if (block.terminal.kind === 'throw' || block.terminal.kind === 'return') { + terminalPreds.add(blockId); + } + } + function recursivelyPropagateNonNull(nodeId, direction, traversalState) { + var _a; + if (traversalState.has(nodeId)) { + return false; + } + traversalState.set(nodeId, 'active'); + const node = nodes.get(nodeId); + if (node == null) { + CompilerError.invariant(false, { + reason: `Bad node ${nodeId}, kind: ${direction}`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + const neighbors = Array.from(direction === 'backward' + ? ((_a = blockSuccessors.get(nodeId)) !== null && _a !== void 0 ? _a : []) + : node.block.preds); + let changed = false; + for (const pred of neighbors) { + if (!traversalState.has(pred)) { + const neighborChanged = recursivelyPropagateNonNull(pred, direction, traversalState); + changed || (changed = neighborChanged); + } + } + const neighborAccesses = Set_intersect(Array.from(neighbors) + .filter(n => traversalState.get(n) === 'done') + .map(n => assertNonNull(nodes.get(n)).assumedNonNullObjects)); + const prevObjects = assertNonNull(nodes.get(nodeId)).assumedNonNullObjects; + const mergedObjects = Set_union(prevObjects, neighborAccesses); + reduceMaybeOptionalChains(mergedObjects, registry); + assertNonNull(nodes.get(nodeId)).assumedNonNullObjects = mergedObjects; + traversalState.set(nodeId, 'done'); + changed || (changed = !Set_equal(prevObjects, mergedObjects)); + return changed; + } + const traversalState = new Map(); + const reversedBlocks = [...fn.body.blocks]; + reversedBlocks.reverse(); + let changed; + let i = 0; + do { + CompilerError.invariant(i++ < 100, { + reason: '[CollectHoistablePropertyLoads] fixed point iteration did not terminate after 100 loops', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + changed = false; + for (const [blockId] of fn.body.blocks) { + const forwardChanged = recursivelyPropagateNonNull(blockId, 'forward', traversalState); + changed || (changed = forwardChanged); + } + traversalState.clear(); + for (const [blockId] of reversedBlocks) { + const backwardChanged = recursivelyPropagateNonNull(blockId, 'backward', traversalState); + changed || (changed = backwardChanged); + } + traversalState.clear(); + } while (changed); +} +function assertNonNull(value, source) { + CompilerError.invariant(value != null, { + reason: 'Unexpected null', + description: source != null ? `(from ${source})` : null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + return value; +} +function reduceMaybeOptionalChains(nodes, registry) { + let optionalChainNodes = Set_filter(nodes, n => n.hasOptional); + if (optionalChainNodes.size === 0) { + return; + } + let changed; + do { + changed = false; + for (const original of optionalChainNodes) { + let { identifier, path: origPath, reactive } = original.fullPath; + let currNode = registry.getOrCreateIdentifier(identifier, reactive); + for (let i = 0; i < origPath.length; i++) { + const entry = origPath[i]; + const nextEntry = entry.optional && nodes.has(currNode) + ? { property: entry.property, optional: false } + : entry; + currNode = PropertyPathRegistry.getOrCreatePropertyEntry(currNode, nextEntry); + } + if (currNode !== original) { + changed = true; + optionalChainNodes.delete(original); + optionalChainNodes.add(currNode); + nodes.delete(original); + nodes.add(currNode); + } + } + } while (changed); +} +function getAssumedInvokedFunctions(fn, temporaries = new Map()) { + var _a; + const hoistableFunctions = new Set(); + for (const block of fn.body.blocks.values()) { + for (const { lvalue, value } of block.instructions) { + if (value.kind === 'FunctionExpression') { + temporaries.set(lvalue.identifier.id, { + fn: value.loweredFunc, + mayInvoke: new Set(), + }); + } + else if (value.kind === 'StoreLocal') { + const lvalue = value.lvalue.place.identifier; + const maybeLoweredFunc = temporaries.get(value.value.identifier.id); + if (maybeLoweredFunc != null) { + temporaries.set(lvalue.id, maybeLoweredFunc); + } + } + else if (value.kind === 'LoadLocal') { + const maybeLoweredFunc = temporaries.get(value.place.identifier.id); + if (maybeLoweredFunc != null) { + temporaries.set(lvalue.identifier.id, maybeLoweredFunc); + } + } + } + } + for (const block of fn.body.blocks.values()) { + for (const { lvalue, value } of block.instructions) { + if (value.kind === 'CallExpression') { + const callee = value.callee; + const maybeHook = getHookKind(fn.env, callee.identifier); + const maybeLoweredFunc = temporaries.get(callee.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + else if (maybeHook != null) { + for (const arg of value.args) { + if (arg.kind === 'Identifier') { + const maybeLoweredFunc = temporaries.get(arg.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + } + } + } + else if (value.kind === 'JsxExpression') { + for (const attr of value.props) { + if (attr.kind === 'JsxSpreadAttribute') { + continue; + } + const maybeLoweredFunc = temporaries.get(attr.place.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + for (const child of (_a = value.children) !== null && _a !== void 0 ? _a : []) { + const maybeLoweredFunc = temporaries.get(child.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + } + else if (value.kind === 'FunctionExpression') { + const loweredFunc = value.loweredFunc.func; + const lambdasCalled = getAssumedInvokedFunctions(loweredFunc, temporaries); + const maybeLoweredFunc = temporaries.get(lvalue.identifier.id); + if (maybeLoweredFunc != null) { + for (const called of lambdasCalled) { + maybeLoweredFunc.mayInvoke.add(called); + } + } + } + } + if (block.terminal.kind === 'return') { + const maybeLoweredFunc = temporaries.get(block.terminal.value.identifier.id); + if (maybeLoweredFunc != null) { + hoistableFunctions.add(maybeLoweredFunc.fn); + } + } + } + for (const [_, { fn, mayInvoke }] of temporaries) { + if (hoistableFunctions.has(fn)) { + for (const called of mayInvoke) { + hoistableFunctions.add(called); + } + } + } + return hoistableFunctions; +} + +function collectOptionalChainSidemap(fn) { + const context = { + currFn: fn, + blocks: fn.body.blocks, + seenOptionals: new Set(), + processedInstrsInOptional: new Set(), + temporariesReadInOptional: new Map(), + hoistableObjects: new Map(), + }; + traverseFunction(fn, context); + return { + temporariesReadInOptional: context.temporariesReadInOptional, + processedInstrsInOptional: context.processedInstrsInOptional, + hoistableObjects: context.hoistableObjects, + }; +} +function traverseFunction(fn, context) { + for (const [_, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + traverseFunction(instr.value.loweredFunc.func, Object.assign(Object.assign({}, context), { currFn: instr.value.loweredFunc.func, blocks: instr.value.loweredFunc.func.body.blocks })); + } + } + if (block.terminal.kind === 'optional' && + !context.seenOptionals.has(block.id)) { + traverseOptionalBlock(block, context, null); + } + } +} +function matchOptionalTestBlock(terminal, blocks) { + const consequentBlock = assertNonNull(blocks.get(terminal.consequent)); + if (consequentBlock.instructions.length === 2 && + consequentBlock.instructions[0].value.kind === 'PropertyLoad' && + consequentBlock.instructions[1].value.kind === 'StoreLocal') { + const propertyLoad = consequentBlock + .instructions[0]; + const storeLocal = consequentBlock.instructions[1].value; + const storeLocalInstr = consequentBlock.instructions[1]; + CompilerError.invariant(propertyLoad.value.object.identifier.id === terminal.test.identifier.id, { + reason: '[OptionalChainDeps] Inconsistent optional chaining property load', + description: `Test=${printIdentifier(terminal.test.identifier)} PropertyLoad base=${printIdentifier(propertyLoad.value.object.identifier)}`, + details: [ + { + kind: 'error', + loc: propertyLoad.loc, + message: null, + }, + ], + }); + CompilerError.invariant(storeLocal.value.identifier.id === propertyLoad.lvalue.identifier.id, { + reason: '[OptionalChainDeps] Unexpected storeLocal', + description: null, + details: [ + { + kind: 'error', + loc: propertyLoad.loc, + message: null, + }, + ], + }); + if (consequentBlock.terminal.kind !== 'goto' || + consequentBlock.terminal.variant !== GotoVariant.Break) { + return null; + } + const alternate = assertNonNull(blocks.get(terminal.alternate)); + CompilerError.invariant(alternate.instructions.length === 2 && + alternate.instructions[0].value.kind === 'Primitive' && + alternate.instructions[1].value.kind === 'StoreLocal', { + reason: 'Unexpected alternate structure', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + return { + consequentId: storeLocal.lvalue.place.identifier.id, + property: propertyLoad.value.property, + propertyId: propertyLoad.lvalue.identifier.id, + storeLocalInstr, + consequentGoto: consequentBlock.terminal.block, + }; + } + return null; +} +function traverseOptionalBlock(optional, context, outerAlternate) { + context.seenOptionals.add(optional.id); + const maybeTest = context.blocks.get(optional.terminal.test); + let test; + let baseObject; + if (maybeTest.terminal.kind === 'branch') { + CompilerError.invariant(optional.terminal.optional, { + reason: '[OptionalChainDeps] Expect base case to be always optional', + description: null, + details: [ + { + kind: 'error', + loc: optional.terminal.loc, + message: null, + }, + ], + }); + if (maybeTest.instructions.length === 0 || + maybeTest.instructions[0].value.kind !== 'LoadLocal') { + return null; + } + const path = []; + for (let i = 1; i < maybeTest.instructions.length; i++) { + const instrVal = maybeTest.instructions[i].value; + const prevInstr = maybeTest.instructions[i - 1]; + if (instrVal.kind === 'PropertyLoad' && + instrVal.object.identifier.id === prevInstr.lvalue.identifier.id) { + path.push({ property: instrVal.property, optional: false }); + } + else { + return null; + } + } + CompilerError.invariant(maybeTest.terminal.test.identifier.id === + maybeTest.instructions.at(-1).lvalue.identifier.id, { + reason: '[OptionalChainDeps] Unexpected test expression', + description: null, + details: [ + { + kind: 'error', + loc: maybeTest.terminal.loc, + message: null, + }, + ], + }); + baseObject = { + identifier: maybeTest.instructions[0].value.place.identifier, + reactive: maybeTest.instructions[0].value.place.reactive, + path, + }; + test = maybeTest.terminal; + } + else if (maybeTest.terminal.kind === 'optional') { + const testBlock = context.blocks.get(maybeTest.terminal.fallthrough); + if (testBlock.terminal.kind !== 'branch') { + CompilerError.throwTodo({ + reason: `Unexpected terminal kind \`${testBlock.terminal.kind}\` for optional fallthrough block`, + loc: maybeTest.terminal.loc, + }); + } + const innerOptional = traverseOptionalBlock(maybeTest, context, testBlock.terminal.alternate); + if (innerOptional == null) { + return null; + } + if (testBlock.terminal.test.identifier.id !== innerOptional) { + return null; + } + if (!optional.terminal.optional) { + context.hoistableObjects.set(optional.id, assertNonNull(context.temporariesReadInOptional.get(innerOptional))); + } + baseObject = assertNonNull(context.temporariesReadInOptional.get(innerOptional)); + test = testBlock.terminal; + } + else { + return null; + } + if (test.alternate === outerAlternate) { + CompilerError.invariant(optional.instructions.length === 0, { + reason: '[OptionalChainDeps] Unexpected instructions an inner optional block. ' + + 'This indicates that the compiler may be incorrectly concatenating two unrelated optional chains', + description: null, + details: [ + { + kind: 'error', + loc: optional.terminal.loc, + message: null, + }, + ], + }); + } + const matchConsequentResult = matchOptionalTestBlock(test, context.blocks); + if (!matchConsequentResult) { + return null; + } + CompilerError.invariant(matchConsequentResult.consequentGoto === optional.terminal.fallthrough, { + reason: '[OptionalChainDeps] Unexpected optional goto-fallthrough', + description: `${matchConsequentResult.consequentGoto} != ${optional.terminal.fallthrough}`, + details: [ + { + kind: 'error', + loc: optional.terminal.loc, + message: null, + }, + ], + }); + const load = { + identifier: baseObject.identifier, + reactive: baseObject.reactive, + path: [ + ...baseObject.path, + { + property: matchConsequentResult.property, + optional: optional.terminal.optional, + }, + ], + }; + context.processedInstrsInOptional.add(matchConsequentResult.storeLocalInstr); + context.processedInstrsInOptional.add(test); + context.temporariesReadInOptional.set(matchConsequentResult.consequentId, load); + context.temporariesReadInOptional.set(matchConsequentResult.propertyId, load); + return matchConsequentResult.consequentId; +} + +var _a, _ReactiveScopeDependencyTreeHIR_hoistableObjects, _ReactiveScopeDependencyTreeHIR_deps, _ReactiveScopeDependencyTreeHIR_getOrCreateRoot, _ReactiveScopeDependencyTreeHIR_debugImpl; +class ReactiveScopeDependencyTreeHIR { + constructor(hoistableObjects) { + var _b; + _ReactiveScopeDependencyTreeHIR_hoistableObjects.set(this, new Map()); + _ReactiveScopeDependencyTreeHIR_deps.set(this, new Map()); + for (const { path, identifier, reactive } of hoistableObjects) { + let currNode = __classPrivateFieldGet(_a, _a, "m", _ReactiveScopeDependencyTreeHIR_getOrCreateRoot).call(_a, identifier, reactive, __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_hoistableObjects, "f"), path.length > 0 && path[0].optional ? 'Optional' : 'NonNull'); + for (let i = 0; i < path.length; i++) { + const prevAccessType = (_b = currNode.properties.get(path[i].property)) === null || _b === void 0 ? void 0 : _b.accessType; + const accessType = i + 1 < path.length && path[i + 1].optional ? 'Optional' : 'NonNull'; + CompilerError.invariant(prevAccessType == null || prevAccessType === accessType, { + reason: 'Conflicting access types', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + let nextNode = currNode.properties.get(path[i].property); + if (nextNode == null) { + nextNode = { + properties: new Map(), + accessType, + }; + currNode.properties.set(path[i].property, nextNode); + } + currNode = nextNode; + } + } + } + addDependency(dep) { + const { identifier, reactive, path } = dep; + let depCursor = __classPrivateFieldGet(_a, _a, "m", _ReactiveScopeDependencyTreeHIR_getOrCreateRoot).call(_a, identifier, reactive, __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_deps, "f"), PropertyAccessType.UnconditionalAccess); + let hoistableCursor = __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_hoistableObjects, "f").get(identifier); + for (const entry of path) { + let nextHoistableCursor; + let nextDepCursor; + if (entry.optional) { + if (hoistableCursor != null) { + nextHoistableCursor = hoistableCursor === null || hoistableCursor === void 0 ? void 0 : hoistableCursor.properties.get(entry.property); + } + let accessType; + if (hoistableCursor != null && + hoistableCursor.accessType === 'NonNull') { + accessType = PropertyAccessType.UnconditionalAccess; + } + else { + accessType = PropertyAccessType.OptionalAccess; + } + nextDepCursor = makeOrMergeProperty(depCursor, entry.property, accessType); + } + else if (hoistableCursor != null && + hoistableCursor.accessType === 'NonNull') { + nextHoistableCursor = hoistableCursor.properties.get(entry.property); + nextDepCursor = makeOrMergeProperty(depCursor, entry.property, PropertyAccessType.UnconditionalAccess); + } + else { + break; + } + depCursor = nextDepCursor; + hoistableCursor = nextHoistableCursor; + } + depCursor.accessType = merge$1(depCursor.accessType, PropertyAccessType.OptionalDependency); + } + deriveMinimalDependencies() { + const results = new Set(); + for (const [rootId, rootNode] of __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_deps, "f").entries()) { + collectMinimalDependenciesInSubtree(rootNode, rootNode.reactive, rootId, [], results); + } + return results; + } + printDeps(includeAccesses) { + let res = []; + for (const [rootId, rootNode] of __classPrivateFieldGet(this, _ReactiveScopeDependencyTreeHIR_deps, "f").entries()) { + const rootResults = printSubtree(rootNode, includeAccesses).map(result => `${printIdentifier(rootId)}.${result}`); + res.push(rootResults); + } + return res.flat().join('\n'); + } + static debug(roots) { + const buf = [`tree() [`]; + for (const [rootId, rootNode] of roots) { + buf.push(`${printIdentifier(rootId)} (${rootNode.accessType}):`); + __classPrivateFieldGet(this, _a, "m", _ReactiveScopeDependencyTreeHIR_debugImpl).call(this, buf, rootNode, 1); + } + buf.push(']'); + return buf.length > 2 ? buf.join('\n') : buf.join(''); + } +} +_a = ReactiveScopeDependencyTreeHIR, _ReactiveScopeDependencyTreeHIR_hoistableObjects = new WeakMap(), _ReactiveScopeDependencyTreeHIR_deps = new WeakMap(), _ReactiveScopeDependencyTreeHIR_getOrCreateRoot = function _ReactiveScopeDependencyTreeHIR_getOrCreateRoot(identifier, reactive, roots, defaultAccessType) { + let rootNode = roots.get(identifier); + if (rootNode === undefined) { + rootNode = { + properties: new Map(), + reactive, + accessType: defaultAccessType, + }; + roots.set(identifier, rootNode); + } + else { + CompilerError.invariant(reactive === rootNode.reactive, { + reason: '[DeriveMinimalDependenciesHIR] Conflicting reactive root flag', + description: `Identifier ${printIdentifier(identifier)}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + return rootNode; +}, _ReactiveScopeDependencyTreeHIR_debugImpl = function _ReactiveScopeDependencyTreeHIR_debugImpl(buf, node, depth = 0) { + for (const [property, childNode] of node.properties) { + buf.push(`${' '.repeat(depth)}.${property} (${childNode.accessType}):`); + __classPrivateFieldGet(this, _a, "m", _ReactiveScopeDependencyTreeHIR_debugImpl).call(this, buf, childNode, depth + 1); + } +}; +var PropertyAccessType; +(function (PropertyAccessType) { + PropertyAccessType["OptionalAccess"] = "OptionalAccess"; + PropertyAccessType["UnconditionalAccess"] = "UnconditionalAccess"; + PropertyAccessType["OptionalDependency"] = "OptionalDependency"; + PropertyAccessType["UnconditionalDependency"] = "UnconditionalDependency"; +})(PropertyAccessType || (PropertyAccessType = {})); +function isOptional(access) { + return (access === PropertyAccessType.OptionalAccess || + access === PropertyAccessType.OptionalDependency); +} +function isDependency(access) { + return (access === PropertyAccessType.OptionalDependency || + access === PropertyAccessType.UnconditionalDependency); +} +function merge$1(access1, access2) { + const resultIsUnconditional = !(isOptional(access1) && isOptional(access2)); + const resultIsDependency = isDependency(access1) || isDependency(access2); + if (resultIsUnconditional) { + if (resultIsDependency) { + return PropertyAccessType.UnconditionalDependency; + } + else { + return PropertyAccessType.UnconditionalAccess; + } + } + else { + if (resultIsDependency) { + return PropertyAccessType.OptionalDependency; + } + else { + return PropertyAccessType.OptionalAccess; + } + } +} +function collectMinimalDependenciesInSubtree(node, reactive, rootIdentifier, path, results) { + if (isDependency(node.accessType)) { + results.add({ identifier: rootIdentifier, reactive, path }); + } + else { + for (const [childName, childNode] of node.properties) { + collectMinimalDependenciesInSubtree(childNode, reactive, rootIdentifier, [ + ...path, + { + property: childName, + optional: isOptional(childNode.accessType), + }, + ], results); + } + } +} +function printSubtree(node, includeAccesses) { + const results = []; + for (const [propertyName, propertyNode] of node.properties) { + if (includeAccesses || isDependency(propertyNode.accessType)) { + results.push(`${propertyName} (${propertyNode.accessType})`); + } + const propertyResults = printSubtree(propertyNode, includeAccesses); + results.push(...propertyResults.map(result => `${propertyName}.${result}`)); + } + return results; +} +function makeOrMergeProperty(node, property, accessType) { + let child = node.properties.get(property); + if (child == null) { + child = { + properties: new Map(), + accessType, + }; + node.properties.set(property, child); + } + else { + child.accessType = merge$1(child.accessType, accessType); + } + return child; +} + +var _DependencyCollectionContext_instances, _DependencyCollectionContext_declarations, _DependencyCollectionContext_reassignments, _DependencyCollectionContext_scopes, _DependencyCollectionContext_dependencies, _DependencyCollectionContext_temporaries, _DependencyCollectionContext_temporariesUsedOutsideScope, _DependencyCollectionContext_processedInstrsInOptional, _DependencyCollectionContext_innerFnContext, _DependencyCollectionContext_checkValidDependency, _DependencyCollectionContext_isScopeActive; +function propagateScopeDependenciesHIR(fn) { + const usedOutsideDeclaringScope = findTemporariesUsedOutsideDeclaringScope(fn); + const temporaries = collectTemporariesSidemap$1(fn, usedOutsideDeclaringScope); + const { temporariesReadInOptional, processedInstrsInOptional, hoistableObjects, } = collectOptionalChainSidemap(fn); + const hoistablePropertyLoads = keyByScopeId(fn, collectHoistablePropertyLoads(fn, temporaries, hoistableObjects)); + const scopeDeps = collectDependencies(fn, usedOutsideDeclaringScope, new Map([...temporaries, ...temporariesReadInOptional]), processedInstrsInOptional); + for (const [scope, deps] of scopeDeps) { + if (deps.length === 0) { + continue; + } + const hoistables = hoistablePropertyLoads.get(scope.id); + CompilerError.invariant(hoistables != null, { + reason: '[PropagateScopeDependencies] Scope not found in tracked blocks', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + const tree = new ReactiveScopeDependencyTreeHIR([...hoistables.assumedNonNullObjects].map(o => o.fullPath)); + for (const dep of deps) { + tree.addDependency(Object.assign({}, dep)); + } + const candidates = tree.deriveMinimalDependencies(); + for (const candidateDep of candidates) { + if (!Iterable_some(scope.dependencies, existingDep => existingDep.identifier.declarationId === + candidateDep.identifier.declarationId && + areEqualPaths(existingDep.path, candidateDep.path))) + scope.dependencies.add(candidateDep); + } + } +} +function findTemporariesUsedOutsideDeclaringScope(fn) { + const declarations = new Map(); + const prunedScopes = new Set(); + const scopeTraversal = new ScopeBlockTraversal(); + const usedOutsideDeclaringScope = new Set(); + function handlePlace(place) { + const declaringScope = declarations.get(place.identifier.declarationId); + if (declaringScope != null && + !scopeTraversal.isScopeActive(declaringScope) && + !prunedScopes.has(declaringScope)) { + usedOutsideDeclaringScope.add(place.identifier.declarationId); + } + } + function handleInstruction(instr) { + const scope = scopeTraversal.currentScope; + if (scope == null || prunedScopes.has(scope)) { + return; + } + switch (instr.value.kind) { + case 'LoadLocal': + case 'LoadContext': + case 'PropertyLoad': { + declarations.set(instr.lvalue.identifier.declarationId, scope); + break; + } + } + } + for (const [blockId, block] of fn.body.blocks) { + scopeTraversal.recordScopes(block); + const scopeStartInfo = scopeTraversal.blockInfos.get(blockId); + if ((scopeStartInfo === null || scopeStartInfo === void 0 ? void 0 : scopeStartInfo.kind) === 'begin' && scopeStartInfo.pruned) { + prunedScopes.add(scopeStartInfo.scope.id); + } + for (const instr of block.instructions) { + for (const place of eachInstructionOperand(instr)) { + handlePlace(place); + } + handleInstruction(instr); + } + for (const place of eachTerminalOperand(block.terminal)) { + handlePlace(place); + } + } + return usedOutsideDeclaringScope; +} +function collectTemporariesSidemap$1(fn, usedOutsideDeclaringScope) { + const temporaries = new Map(); + collectTemporariesSidemapImpl(fn, usedOutsideDeclaringScope, temporaries, null); + return temporaries; +} +function isLoadContextMutable(instrValue, id) { + if (instrValue.kind === 'LoadContext') { + return (instrValue.place.identifier.scope != null && + id >= instrValue.place.identifier.scope.range.end); + } + return false; +} +function collectTemporariesSidemapImpl(fn, usedOutsideDeclaringScope, temporaries, innerFnContext) { + for (const [_, block] of fn.body.blocks) { + for (const { value, lvalue, id: origInstrId } of block.instructions) { + const instrId = innerFnContext != null ? innerFnContext.instrId : origInstrId; + const usedOutside = usedOutsideDeclaringScope.has(lvalue.identifier.declarationId); + if (value.kind === 'PropertyLoad' && !usedOutside) { + if (innerFnContext == null || + temporaries.has(value.object.identifier.id)) { + const property = getProperty(value.object, value.property, false, temporaries); + temporaries.set(lvalue.identifier.id, property); + } + } + else if ((value.kind === 'LoadLocal' || isLoadContextMutable(value, instrId)) && + lvalue.identifier.name == null && + value.place.identifier.name !== null && + !usedOutside) { + if (innerFnContext == null || + fn.context.some(context => context.identifier.id === value.place.identifier.id)) { + temporaries.set(lvalue.identifier.id, { + identifier: value.place.identifier, + reactive: value.place.reactive, + path: [], + }); + } + } + else if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + collectTemporariesSidemapImpl(value.loweredFunc.func, usedOutsideDeclaringScope, temporaries, innerFnContext !== null && innerFnContext !== void 0 ? innerFnContext : { instrId }); + } + } + } +} +function getProperty(object, propertyName, optional, temporaries) { + const resolvedDependency = temporaries.get(object.identifier.id); + let property; + if (resolvedDependency == null) { + property = { + identifier: object.identifier, + reactive: object.reactive, + path: [{ property: propertyName, optional }], + }; + } + else { + property = { + identifier: resolvedDependency.identifier, + reactive: resolvedDependency.reactive, + path: [...resolvedDependency.path, { property: propertyName, optional }], + }; + } + return property; +} +class DependencyCollectionContext { + constructor(temporariesUsedOutsideScope, temporaries, processedInstrsInOptional) { + _DependencyCollectionContext_instances.add(this); + _DependencyCollectionContext_declarations.set(this, new Map()); + _DependencyCollectionContext_reassignments.set(this, new Map()); + _DependencyCollectionContext_scopes.set(this, empty()); + _DependencyCollectionContext_dependencies.set(this, empty()); + this.deps = new Map(); + _DependencyCollectionContext_temporaries.set(this, void 0); + _DependencyCollectionContext_temporariesUsedOutsideScope.set(this, void 0); + _DependencyCollectionContext_processedInstrsInOptional.set(this, void 0); + _DependencyCollectionContext_innerFnContext.set(this, null); + __classPrivateFieldSet(this, _DependencyCollectionContext_temporariesUsedOutsideScope, temporariesUsedOutsideScope, "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_temporaries, temporaries, "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_processedInstrsInOptional, processedInstrsInOptional, "f"); + } + enterScope(scope) { + __classPrivateFieldSet(this, _DependencyCollectionContext_dependencies, __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").push([]), "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_scopes, __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f").push(scope), "f"); + } + exitScope(scope, pruned) { + var _a; + const scopedDependencies = __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").value; + CompilerError.invariant(scopedDependencies != null, { + reason: '[PropagateScopeDeps]: Unexpected scope mismatch', + description: null, + details: [ + { + kind: 'error', + loc: scope.loc, + message: null, + }, + ], + }); + __classPrivateFieldSet(this, _DependencyCollectionContext_scopes, __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f").pop(), "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_dependencies, __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").pop(), "f"); + for (const dep of scopedDependencies) { + if (__classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_checkValidDependency).call(this, dep)) { + (_a = __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").value) === null || _a === void 0 ? void 0 : _a.push(dep); + } + } + if (!pruned) { + this.deps.set(scope, scopedDependencies); + } + } + isUsedOutsideDeclaringScope(place) { + return __classPrivateFieldGet(this, _DependencyCollectionContext_temporariesUsedOutsideScope, "f").has(place.identifier.declarationId); + } + declare(identifier, decl) { + if (__classPrivateFieldGet(this, _DependencyCollectionContext_innerFnContext, "f") != null) + return; + if (!__classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").has(identifier.declarationId)) { + __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").set(identifier.declarationId, decl); + } + __classPrivateFieldGet(this, _DependencyCollectionContext_reassignments, "f").set(identifier, decl); + } + hasDeclared(identifier) { + return __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").has(identifier.declarationId); + } + get currentScope() { + return __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f"); + } + visitOperand(place) { + var _a; + this.visitDependency((_a = __classPrivateFieldGet(this, _DependencyCollectionContext_temporaries, "f").get(place.identifier.id)) !== null && _a !== void 0 ? _a : { + identifier: place.identifier, + reactive: place.reactive, + path: [], + }); + } + visitProperty(object, property, optional) { + const nextDependency = getProperty(object, property, optional, __classPrivateFieldGet(this, _DependencyCollectionContext_temporaries, "f")); + this.visitDependency(nextDependency); + } + visitDependency(maybeDependency) { + var _a; + const originalDeclaration = __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").get(maybeDependency.identifier.declarationId); + if (originalDeclaration !== undefined && + originalDeclaration.scope.value !== null) { + originalDeclaration.scope.each(scope => { + if (!__classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_isScopeActive).call(this, scope) && + !Iterable_some(scope.declarations.values(), decl => decl.identifier.declarationId === + maybeDependency.identifier.declarationId)) { + scope.declarations.set(maybeDependency.identifier.id, { + identifier: maybeDependency.identifier, + scope: originalDeclaration.scope.value, + }); + } + }); + } + if (isUseRefType(maybeDependency.identifier) && + ((_a = maybeDependency.path.at(0)) === null || _a === void 0 ? void 0 : _a.property) === 'current') { + maybeDependency = { + identifier: maybeDependency.identifier, + reactive: maybeDependency.reactive, + path: [], + }; + } + if (__classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_checkValidDependency).call(this, maybeDependency)) { + __classPrivateFieldGet(this, _DependencyCollectionContext_dependencies, "f").value.push(maybeDependency); + } + } + visitReassignment(place) { + const currentScope = this.currentScope.value; + if (currentScope != null && + !Iterable_some(currentScope.reassignments, identifier => identifier.declarationId === place.identifier.declarationId) && + __classPrivateFieldGet(this, _DependencyCollectionContext_instances, "m", _DependencyCollectionContext_checkValidDependency).call(this, { + identifier: place.identifier, + reactive: place.reactive, + path: [], + })) { + currentScope.reassignments.add(place.identifier); + } + } + enterInnerFn(innerFn, cb) { + var _a; + const prevContext = __classPrivateFieldGet(this, _DependencyCollectionContext_innerFnContext, "f"); + __classPrivateFieldSet(this, _DependencyCollectionContext_innerFnContext, (_a = __classPrivateFieldGet(this, _DependencyCollectionContext_innerFnContext, "f")) !== null && _a !== void 0 ? _a : { outerInstrId: innerFn.id }, "f"); + const result = cb(); + __classPrivateFieldSet(this, _DependencyCollectionContext_innerFnContext, prevContext, "f"); + return result; + } + isDeferredDependency(instr) { + return (__classPrivateFieldGet(this, _DependencyCollectionContext_processedInstrsInOptional, "f").has(instr.value) || + (instr.kind === HIRValue.Instruction && + __classPrivateFieldGet(this, _DependencyCollectionContext_temporaries, "f").has(instr.value.lvalue.identifier.id))); + } +} +_DependencyCollectionContext_declarations = new WeakMap(), _DependencyCollectionContext_reassignments = new WeakMap(), _DependencyCollectionContext_scopes = new WeakMap(), _DependencyCollectionContext_dependencies = new WeakMap(), _DependencyCollectionContext_temporaries = new WeakMap(), _DependencyCollectionContext_temporariesUsedOutsideScope = new WeakMap(), _DependencyCollectionContext_processedInstrsInOptional = new WeakMap(), _DependencyCollectionContext_innerFnContext = new WeakMap(), _DependencyCollectionContext_instances = new WeakSet(), _DependencyCollectionContext_checkValidDependency = function _DependencyCollectionContext_checkValidDependency(maybeDependency) { + var _a; + if (isRefValueType(maybeDependency.identifier)) { + return false; + } + if (isObjectMethodType(maybeDependency.identifier)) { + return false; + } + const identifier = maybeDependency.identifier; + const currentDeclaration = (_a = __classPrivateFieldGet(this, _DependencyCollectionContext_reassignments, "f").get(identifier)) !== null && _a !== void 0 ? _a : __classPrivateFieldGet(this, _DependencyCollectionContext_declarations, "f").get(identifier.declarationId); + const currentScope = this.currentScope.value; + return (currentScope != null && + currentDeclaration !== undefined && + currentDeclaration.id < currentScope.range.start); +}, _DependencyCollectionContext_isScopeActive = function _DependencyCollectionContext_isScopeActive(scope) { + if (__classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f") === null) { + return false; + } + return __classPrivateFieldGet(this, _DependencyCollectionContext_scopes, "f").find(state => state === scope); +}; +var HIRValue; +(function (HIRValue) { + HIRValue[HIRValue["Instruction"] = 1] = "Instruction"; + HIRValue[HIRValue["Terminal"] = 2] = "Terminal"; +})(HIRValue || (HIRValue = {})); +function handleInstruction(instr, context) { + const { id, value, lvalue } = instr; + context.declare(lvalue.identifier, { + id, + scope: context.currentScope, + }); + if (context.isDeferredDependency({ kind: HIRValue.Instruction, value: instr })) { + return; + } + if (value.kind === 'PropertyLoad') { + context.visitProperty(value.object, value.property, false); + } + else if (value.kind === 'StoreLocal') { + context.visitOperand(value.value); + if (value.lvalue.kind === InstructionKind.Reassign) { + context.visitReassignment(value.lvalue.place); + } + context.declare(value.lvalue.place.identifier, { + id, + scope: context.currentScope, + }); + } + else if (value.kind === 'DeclareLocal' || value.kind === 'DeclareContext') { + if (convertHoistedLValueKind(value.lvalue.kind) === null) { + context.declare(value.lvalue.place.identifier, { + id, + scope: context.currentScope, + }); + } + } + else if (value.kind === 'Destructure') { + context.visitOperand(value.value); + for (const place of eachPatternOperand(value.lvalue.pattern)) { + if (value.lvalue.kind === InstructionKind.Reassign) { + context.visitReassignment(place); + } + context.declare(place.identifier, { + id, + scope: context.currentScope, + }); + } + } + else if (value.kind === 'StoreContext') { + if (!context.hasDeclared(value.lvalue.place.identifier) || + value.lvalue.kind !== InstructionKind.Reassign) { + context.declare(value.lvalue.place.identifier, { + id, + scope: context.currentScope, + }); + } + for (const operand of eachInstructionValueOperand(value)) { + context.visitOperand(operand); + } + } + else { + for (const operand of eachInstructionValueOperand(value)) { + context.visitOperand(operand); + } + } +} +function collectDependencies(fn, usedOutsideDeclaringScope, temporaries, processedInstrsInOptional) { + const context = new DependencyCollectionContext(usedOutsideDeclaringScope, temporaries, processedInstrsInOptional); + for (const param of fn.params) { + if (param.kind === 'Identifier') { + context.declare(param.identifier, { + id: makeInstructionId(0), + scope: empty(), + }); + } + else { + context.declare(param.place.identifier, { + id: makeInstructionId(0), + scope: empty(), + }); + } + } + const scopeTraversal = new ScopeBlockTraversal(); + const handleFunction = (fn) => { + for (const [blockId, block] of fn.body.blocks) { + scopeTraversal.recordScopes(block); + const scopeBlockInfo = scopeTraversal.blockInfos.get(blockId); + if ((scopeBlockInfo === null || scopeBlockInfo === void 0 ? void 0 : scopeBlockInfo.kind) === 'begin') { + context.enterScope(scopeBlockInfo.scope); + } + else if ((scopeBlockInfo === null || scopeBlockInfo === void 0 ? void 0 : scopeBlockInfo.kind) === 'end') { + context.exitScope(scopeBlockInfo.scope, scopeBlockInfo.pruned); + } + for (const phi of block.phis) { + for (const operand of phi.operands) { + const maybeOptionalChain = temporaries.get(operand[1].identifier.id); + if (maybeOptionalChain) { + context.visitDependency(maybeOptionalChain); + } + } + } + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + context.declare(instr.lvalue.identifier, { + id: instr.id, + scope: context.currentScope, + }); + const innerFn = instr.value.loweredFunc.func; + context.enterInnerFn(instr, () => { + handleFunction(innerFn); + }); + } + else { + handleInstruction(instr, context); + } + } + if (!context.isDeferredDependency({ + kind: HIRValue.Terminal, + value: block.terminal, + })) { + for (const place of eachTerminalOperand(block.terminal)) { + context.visitOperand(place); + } + } + } + }; + handleFunction(fn); + return context.deps; +} + +function buildDependencyInstructions(dep, env) { + const builder = new HIRBuilder(env, { + entryBlockKind: 'value', + }); + let dependencyValue; + if (dep.path.every(path => !path.optional)) { + dependencyValue = writeNonOptionalDependency(dep, env, builder); + } + else { + dependencyValue = writeOptionalDependency(dep, builder, null); + } + const exitBlockId = builder.terminate({ + kind: 'unsupported', + loc: GeneratedSource, + id: makeInstructionId(0), + }, null); + return { + place: { + kind: 'Identifier', + identifier: dependencyValue, + effect: Effect.Freeze, + reactive: dep.reactive, + loc: GeneratedSource, + }, + value: builder.build(), + exitBlockId, + }; +} +function writeNonOptionalDependency(dep, env, builder) { + const loc = dep.identifier.loc; + let curr = makeTemporaryIdentifier(env.nextIdentifierId, loc); + builder.push({ + lvalue: { + identifier: curr, + kind: 'Identifier', + effect: Effect.Mutate, + reactive: dep.reactive, + loc, + }, + value: { + kind: 'LoadLocal', + place: { + identifier: dep.identifier, + kind: 'Identifier', + effect: Effect.Freeze, + reactive: dep.reactive, + loc, + }, + loc, + }, + id: makeInstructionId(1), + loc: loc, + effects: null, + }); + for (const path of dep.path) { + const next = makeTemporaryIdentifier(env.nextIdentifierId, loc); + builder.push({ + lvalue: { + identifier: next, + kind: 'Identifier', + effect: Effect.Mutate, + reactive: dep.reactive, + loc, + }, + value: { + kind: 'PropertyLoad', + object: { + identifier: curr, + kind: 'Identifier', + effect: Effect.Freeze, + reactive: dep.reactive, + loc, + }, + property: path.property, + loc, + }, + id: makeInstructionId(1), + loc: loc, + effects: null, + }); + curr = next; + } + return curr; +} +function writeOptionalDependency(dep, builder, parentAlternate) { + const env = builder.environment; + const dependencyValue = { + kind: 'Identifier', + identifier: makeTemporaryIdentifier(env.nextIdentifierId, GeneratedSource), + effect: Effect.Mutate, + reactive: dep.reactive, + loc: GeneratedSource, + }; + const continuationBlock = builder.reserve(builder.currentBlockKind()); + let alternate; + if (parentAlternate != null) { + alternate = parentAlternate; + } + else { + alternate = builder.enter('value', () => { + const temp = lowerValueToTemporary(builder, { + kind: 'Primitive', + value: undefined, + loc: GeneratedSource, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, dependencyValue) }, + value: Object.assign({}, temp), + type: null, + loc: GeneratedSource, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc: GeneratedSource, + }; + }); + } + const consequent = builder.reserve('value'); + let testIdentifier = null; + const testBlock = builder.enter('value', () => { + const testDependency = Object.assign(Object.assign({}, dep), { path: dep.path.slice(0, dep.path.length - 1) }); + const firstOptional = dep.path.findIndex(path => path.optional); + CompilerError.invariant(firstOptional !== -1, { + reason: '[ScopeDependencyUtils] Internal invariant broken: expected optional path', + description: null, + details: [ + { + kind: 'error', + loc: dep.identifier.loc, + message: null, + }, + ], + suggestions: null, + }); + if (firstOptional === dep.path.length - 1) { + testIdentifier = writeNonOptionalDependency(testDependency, env, builder); + } + else { + testIdentifier = writeOptionalDependency(testDependency, builder, alternate); + } + return { + kind: 'branch', + test: { + identifier: testIdentifier, + effect: Effect.Freeze, + kind: 'Identifier', + loc: GeneratedSource, + reactive: dep.reactive, + }, + consequent: consequent.id, + alternate, + id: makeInstructionId(0), + loc: GeneratedSource, + fallthrough: continuationBlock.id, + }; + }); + builder.enterReserved(consequent, () => { + CompilerError.invariant(testIdentifier !== null, { + reason: 'Satisfy type checker', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + lowerValueToTemporary(builder, { + kind: 'StoreLocal', + lvalue: { kind: InstructionKind.Const, place: Object.assign({}, dependencyValue) }, + value: lowerValueToTemporary(builder, { + kind: 'PropertyLoad', + object: { + identifier: testIdentifier, + kind: 'Identifier', + effect: Effect.Freeze, + reactive: dep.reactive, + loc: GeneratedSource, + }, + property: dep.path.at(-1).property, + loc: GeneratedSource, + }), + type: null, + loc: GeneratedSource, + }); + return { + kind: 'goto', + variant: GotoVariant.Break, + block: continuationBlock.id, + id: makeInstructionId(0), + loc: GeneratedSource, + }; + }); + builder.terminateWithContinuation({ + kind: 'optional', + optional: dep.path.at(-1).optional, + test: testBlock, + fallthrough: continuationBlock.id, + id: makeInstructionId(0), + loc: GeneratedSource, + }, continuationBlock); + return dependencyValue.identifier; +} + +function inferEffectDependencies(fn) { + var _a, _b; + const fnExpressions = new Map(); + const autodepFnConfigs = new Map(); + for (const effectTarget of fn.env.config.inferEffectDependencies) { + const moduleTargets = getOrInsertWith(autodepFnConfigs, effectTarget.function.source, () => new Map()); + moduleTargets.set(effectTarget.function.importSpecifierName, effectTarget.autodepsIndex); + } + const autodepFnLoads = new Map(); + const autodepModuleLoads = new Map(); + const scopeInfos = new Map(); + const loadGlobals = new Set(); + const reactiveIds = inferReactiveIdentifiers(fn); + const rewriteBlocks = []; + for (const [, block] of fn.body.blocks) { + if (block.terminal.kind === 'scope') { + const scopeBlock = fn.body.blocks.get(block.terminal.block); + if (scopeBlock.instructions.length === 1 && + scopeBlock.terminal.kind === 'goto' && + scopeBlock.terminal.block === block.terminal.fallthrough) { + scopeInfos.set(block.terminal.scope.id, block.terminal.scope.dependencies); + } + } + const rewriteInstrs = []; + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'FunctionExpression') { + fnExpressions.set(lvalue.identifier.id, instr); + } + else if (value.kind === 'PropertyLoad') { + if (typeof value.property === 'string' && + autodepModuleLoads.has(value.object.identifier.id)) { + const moduleTargets = autodepModuleLoads.get(value.object.identifier.id); + const propertyName = value.property; + const numRequiredArgs = moduleTargets.get(propertyName); + if (numRequiredArgs != null) { + autodepFnLoads.set(lvalue.identifier.id, numRequiredArgs); + } + } + } + else if (value.kind === 'LoadGlobal') { + loadGlobals.add(lvalue.identifier.id); + if (value.binding.kind === 'ImportNamespace') { + const moduleTargets = autodepFnConfigs.get(value.binding.module); + if (moduleTargets != null) { + autodepModuleLoads.set(lvalue.identifier.id, moduleTargets); + } + } + if (value.binding.kind === 'ImportSpecifier' || + value.binding.kind === 'ImportDefault') { + const moduleTargets = autodepFnConfigs.get(value.binding.module); + if (moduleTargets != null) { + const importSpecifierName = value.binding.kind === 'ImportSpecifier' + ? value.binding.imported + : DEFAULT_EXPORT; + const numRequiredArgs = moduleTargets.get(importSpecifierName); + if (numRequiredArgs != null) { + autodepFnLoads.set(lvalue.identifier.id, numRequiredArgs); + } + } + } + } + else if (value.kind === 'CallExpression' || + value.kind === 'MethodCall') { + const callee = value.kind === 'CallExpression' ? value.callee : value.property; + const autodepsArgIndex = value.args.findIndex(arg => arg.kind === 'Identifier' && + arg.identifier.type.kind === 'Object' && + arg.identifier.type.shapeId === BuiltInAutodepsId); + const autodepsArgExpectedIndex = autodepFnLoads.get(callee.identifier.id); + if (value.args.length > 0 && + autodepsArgExpectedIndex != null && + autodepsArgIndex === autodepsArgExpectedIndex && + autodepFnLoads.has(callee.identifier.id) && + value.args[0].kind === 'Identifier') { + const effectDeps = []; + const deps = { + kind: 'ArrayExpression', + elements: effectDeps, + loc: GeneratedSource, + }; + const depsPlace = createTemporaryPlace(fn.env, GeneratedSource); + depsPlace.effect = Effect.Read; + const fnExpr = fnExpressions.get(value.args[0].identifier.id); + if (fnExpr != null) { + const scopeInfo = fnExpr.lvalue.identifier.scope != null + ? scopeInfos.get(fnExpr.lvalue.identifier.scope.id) + : null; + let minimalDeps; + if (scopeInfo != null) { + minimalDeps = new Set(scopeInfo); + } + else { + minimalDeps = inferMinimalDependencies(fnExpr); + } + const usedDeps = []; + for (const maybeDep of minimalDeps) { + if (((isUseRefType(maybeDep.identifier) || + isSetStateType(maybeDep.identifier)) && + !reactiveIds.has(maybeDep.identifier.id)) || + isFireFunctionType(maybeDep.identifier) || + isEffectEventFunctionType(maybeDep.identifier)) { + continue; + } + const dep = truncateDepAtCurrent(maybeDep); + const { place, value, exitBlockId } = buildDependencyInstructions(dep, fn.env); + rewriteInstrs.push({ + kind: 'block', + location: instr.id, + value, + exitBlockId: exitBlockId, + }); + effectDeps.push(place); + usedDeps.push(dep); + } + const decorations = []; + for (const loc of collectDepUsages(usedDeps, fnExpr.value)) { + if (typeof loc === 'symbol') { + continue; + } + decorations.push(loc); + } + if (typeof value.loc !== 'symbol') { + (_a = fn.env.logger) === null || _a === void 0 ? void 0 : _a.logEvent(fn.env.filename, { + kind: 'AutoDepsDecorations', + fnLoc: value.loc, + decorations, + }); + } + rewriteInstrs.push({ + kind: 'instr', + location: instr.id, + value: { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: Object.assign(Object.assign({}, depsPlace), { effect: Effect.Mutate }), + value: deps, + effects: null, + }, + }); + value.args[autodepsArgIndex] = Object.assign(Object.assign({}, depsPlace), { effect: Effect.Freeze }); + fn.env.inferredEffectLocations.add(callee.loc); + } + else if (loadGlobals.has(value.args[0].identifier.id)) { + rewriteInstrs.push({ + kind: 'instr', + location: instr.id, + value: { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: Object.assign(Object.assign({}, depsPlace), { effect: Effect.Mutate }), + value: deps, + effects: null, + }, + }); + value.args[autodepsArgIndex] = Object.assign(Object.assign({}, depsPlace), { effect: Effect.Freeze }); + fn.env.inferredEffectLocations.add(callee.loc); + } + } + else if (value.args.length >= 2 && + value.args.length - 1 === autodepFnLoads.get(callee.identifier.id) && + value.args[0] != null && + value.args[0].kind === 'Identifier') { + const penultimateArg = value.args[value.args.length - 2]; + const depArrayArg = value.args[value.args.length - 1]; + if (depArrayArg.kind !== 'Spread' && + penultimateArg.kind !== 'Spread' && + typeof depArrayArg.loc !== 'symbol' && + typeof penultimateArg.loc !== 'symbol' && + typeof value.loc !== 'symbol') { + (_b = fn.env.logger) === null || _b === void 0 ? void 0 : _b.logEvent(fn.env.filename, { + kind: 'AutoDepsEligible', + fnLoc: value.loc, + depArrayLoc: Object.assign(Object.assign({}, depArrayArg.loc), { start: penultimateArg.loc.end, end: depArrayArg.loc.end }), + }); + } + } + } + } + rewriteSplices(block, rewriteInstrs, rewriteBlocks); + } + if (rewriteBlocks.length > 0) { + for (const block of rewriteBlocks) { + fn.body.blocks.set(block.id, block); + } + reversePostorderBlocks(fn.body); + markPredecessors(fn.body); + markInstructionIds(fn.body); + fixScopeAndIdentifierRanges(fn.body); + deadCodeElimination(fn); + fn.env.hasInferredEffect = true; + } +} +function truncateDepAtCurrent(dep) { + const idx = dep.path.findIndex(path => path.property === 'current'); + if (idx === -1) { + return dep; + } + else { + return Object.assign(Object.assign({}, dep), { path: dep.path.slice(0, idx) }); + } +} +function rewriteSplices(originalBlock, splices, rewriteBlocks) { + if (splices.length === 0) { + return; + } + const originalInstrs = originalBlock.instructions; + let currBlock = Object.assign(Object.assign({}, originalBlock), { instructions: [] }); + rewriteBlocks.push(currBlock); + let cursor = 0; + for (const rewrite of splices) { + while (originalInstrs[cursor].id < rewrite.location) { + CompilerError.invariant(originalInstrs[cursor].id < originalInstrs[cursor + 1].id, { + reason: '[InferEffectDependencies] Internal invariant broken: expected block instructions to be sorted', + description: null, + details: [ + { + kind: 'error', + loc: originalInstrs[cursor].loc, + message: null, + }, + ], + }); + currBlock.instructions.push(originalInstrs[cursor]); + cursor++; + } + CompilerError.invariant(originalInstrs[cursor].id === rewrite.location, { + reason: '[InferEffectDependencies] Internal invariant broken: splice location not found', + description: null, + details: [ + { + kind: 'error', + loc: originalInstrs[cursor].loc, + message: null, + }, + ], + }); + if (rewrite.kind === 'instr') { + currBlock.instructions.push(rewrite.value); + } + else if (rewrite.kind === 'block') { + const { entry, blocks } = rewrite.value; + const entryBlock = blocks.get(entry); + currBlock.instructions.push(...entryBlock.instructions); + if (blocks.size > 1) { + CompilerError.invariant(terminalFallthrough(entryBlock.terminal) === rewrite.exitBlockId, { + reason: '[InferEffectDependencies] Internal invariant broken: expected entry block to have a fallthrough', + description: null, + details: [ + { + kind: 'error', + loc: entryBlock.terminal.loc, + message: null, + }, + ], + }); + const originalTerminal = currBlock.terminal; + currBlock.terminal = entryBlock.terminal; + for (const [id, block] of blocks) { + if (id === entry) { + continue; + } + if (id === rewrite.exitBlockId) { + block.terminal = originalTerminal; + currBlock = block; + } + rewriteBlocks.push(block); + } + } + } + } + currBlock.instructions.push(...originalInstrs.slice(cursor)); +} +function inferReactiveIdentifiers(fn) { + const reactiveIds = new Set(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const place of eachInstructionOperand(instr)) { + if (place.reactive) { + reactiveIds.add(place.identifier.id); + } + } + } + for (const place of eachTerminalOperand(block.terminal)) { + if (place.reactive) { + reactiveIds.add(place.identifier.id); + } + } + } + return reactiveIds; +} +function collectDepUsages(deps, fnExpr) { + const identifiers = new Map(); + const loadedDeps = new Set(); + const sourceLocations = []; + for (const dep of deps) { + identifiers.set(dep.identifier.id, dep); + } + for (const [, block] of fnExpr.loweredFunc.func.body.blocks) { + for (const instr of block.instructions) { + if (instr.value.kind === 'LoadLocal' && + identifiers.has(instr.value.place.identifier.id)) { + loadedDeps.add(instr.lvalue.identifier.id); + } + for (const place of eachInstructionOperand(instr)) { + if (loadedDeps.has(place.identifier.id)) { + sourceLocations.push(place.identifier.loc); + } + } + } + } + return sourceLocations; +} +function inferMinimalDependencies(fnInstr) { + const fn = fnInstr.value.loweredFunc.func; + const temporaries = collectTemporariesSidemap$1(fn, new Set()); + const { hoistableObjects, processedInstrsInOptional, temporariesReadInOptional, } = collectOptionalChainSidemap(fn); + const hoistablePropertyLoads = collectHoistablePropertyLoadsInInnerFn(fnInstr, temporaries, hoistableObjects); + const hoistableToFnEntry = hoistablePropertyLoads.get(fn.body.entry); + CompilerError.invariant(hoistableToFnEntry != null, { + reason: '[InferEffectDependencies] Internal invariant broken: missing entry block', + description: null, + details: [ + { + kind: 'error', + loc: fnInstr.loc, + message: null, + }, + ], + }); + const dependencies = inferDependencies(fnInstr, new Map([...temporaries, ...temporariesReadInOptional]), processedInstrsInOptional); + const tree = new ReactiveScopeDependencyTreeHIR([...hoistableToFnEntry.assumedNonNullObjects].map(o => o.fullPath)); + for (const dep of dependencies) { + tree.addDependency(Object.assign({}, dep)); + } + return tree.deriveMinimalDependencies(); +} +function inferDependencies(fnInstr, temporaries, processedInstrsInOptional) { + const fn = fnInstr.value.loweredFunc.func; + const context = new DependencyCollectionContext(new Set(), temporaries, processedInstrsInOptional); + for (const dep of fn.context) { + context.declare(dep.identifier, { + id: makeInstructionId(0), + scope: empty(), + }); + } + const placeholderScope = { + id: makeScopeId(0), + range: { + start: fnInstr.id, + end: makeInstructionId(fnInstr.id + 1), + }, + dependencies: new Set(), + reassignments: new Set(), + declarations: new Map(), + earlyReturnValue: null, + merged: new Set(), + loc: GeneratedSource, + }; + context.enterScope(placeholderScope); + inferDependenciesInFn(fn, context, temporaries); + context.exitScope(placeholderScope, false); + const resultUnfiltered = context.deps.get(placeholderScope); + CompilerError.invariant(resultUnfiltered != null, { + reason: '[InferEffectDependencies] Internal invariant broken: missing scope dependencies', + description: null, + details: [ + { + kind: 'error', + loc: fn.loc, + message: null, + }, + ], + }); + const fnContext = new Set(fn.context.map(dep => dep.identifier.id)); + const result = new Set(); + for (const dep of resultUnfiltered) { + if (fnContext.has(dep.identifier.id)) { + result.add(dep); + } + } + return result; +} +function inferDependenciesInFn(fn, context, temporaries) { + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + for (const operand of phi.operands) { + const maybeOptionalChain = temporaries.get(operand[1].identifier.id); + if (maybeOptionalChain) { + context.visitDependency(maybeOptionalChain); + } + } + } + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + context.declare(instr.lvalue.identifier, { + id: instr.id, + scope: context.currentScope, + }); + const innerFn = instr.value.loweredFunc.func; + context.enterInnerFn(instr, () => { + inferDependenciesInFn(innerFn, context, temporaries); + }); + } + else { + handleInstruction(instr, context); + } + } + } +} + +function instructionReordering(fn) { + var _a; + const shared = new Map(); + const references = findReferencedRangeOfTemporaries(fn); + for (const [, block] of fn.body.blocks) { + reorderBlock(fn.env, block, shared, references); + } + CompilerError.invariant(shared.size === 0, { + reason: `InstructionReordering: expected all reorderable nodes to have been emitted`, + description: null, + details: [ + { + kind: 'error', + loc: (_a = [...shared.values()] + .map(node => { var _a; return (_a = node.instruction) === null || _a === void 0 ? void 0 : _a.loc; }) + .filter(loc => loc != null)[0]) !== null && _a !== void 0 ? _a : GeneratedSource, + message: null, + }, + ], + }); + markInstructionIds(fn.body); +} +var ReferenceKind; +(function (ReferenceKind) { + ReferenceKind[ReferenceKind["Read"] = 0] = "Read"; + ReferenceKind[ReferenceKind["Write"] = 1] = "Write"; +})(ReferenceKind || (ReferenceKind = {})); +function findReferencedRangeOfTemporaries(fn) { + const singleUseIdentifiers = new Map(); + const lastAssignments = new Map(); + function reference(instr, place, kind) { + var _a; + if (place.identifier.name !== null && + place.identifier.name.kind === 'named') { + if (kind === ReferenceKind.Write) { + const name = place.identifier.name.value; + const previous = lastAssignments.get(name); + if (previous === undefined) { + lastAssignments.set(name, instr); + } + else { + lastAssignments.set(name, makeInstructionId(Math.max(previous, instr))); + } + } + return; + } + else if (kind === ReferenceKind.Read) { + const previousCount = (_a = singleUseIdentifiers.get(place.identifier.id)) !== null && _a !== void 0 ? _a : 0; + singleUseIdentifiers.set(place.identifier.id, previousCount + 1); + } + } + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + for (const operand of eachInstructionValueLValue(instr.value)) { + reference(instr.id, operand, ReferenceKind.Read); + } + for (const lvalue of eachInstructionLValue(instr)) { + reference(instr.id, lvalue, ReferenceKind.Write); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + reference(block.terminal.id, operand, ReferenceKind.Read); + } + } + return { + singleUseIdentifiers: new Set([...singleUseIdentifiers] + .filter(([, count]) => count === 1) + .map(([id]) => id)), + lastAssignments, + }; +} +function reorderBlock(env, block, shared, references) { + var _a, _b; + const locals = new Map(); + const named = new Map(); + let previous = null; + for (const instr of block.instructions) { + const { lvalue, value } = instr; + const reorderability = getReorderability(instr, references); + const node = getOrInsertWith(locals, lvalue.identifier.id, () => ({ + instruction: instr, + dependencies: new Set(), + reorderability, + depth: null, + })); + if (reorderability === Reorderability.Nonreorderable) { + if (previous !== null) { + node.dependencies.add(previous); + } + previous = lvalue.identifier.id; + } + for (const operand of eachInstructionValueOperand(value)) { + const { name, id } = operand.identifier; + if (name !== null && name.kind === 'named') { + const previous = named.get(name.value); + if (previous !== undefined) { + node.dependencies.add(previous); + } + named.set(name.value, lvalue.identifier.id); + } + else if (locals.has(id) || shared.has(id)) { + node.dependencies.add(id); + } + } + for (const lvalueOperand of eachInstructionValueLValue(value)) { + const lvalueNode = getOrInsertWith(locals, lvalueOperand.identifier.id, () => ({ + instruction: null, + dependencies: new Set(), + depth: null, + })); + lvalueNode.dependencies.add(lvalue.identifier.id); + const name = lvalueOperand.identifier.name; + if (name !== null && name.kind === 'named') { + const previous = named.get(name.value); + if (previous !== undefined) { + node.dependencies.add(previous); + } + named.set(name.value, lvalue.identifier.id); + } + } + } + const nextInstructions = []; + if (isExpressionBlockKind(block.kind)) { + if (previous !== null) { + emit(env, locals, shared, nextInstructions, previous); + } + if (block.instructions.length !== 0) { + emit(env, locals, shared, nextInstructions, block.instructions.at(-1).lvalue.identifier.id); + } + for (const operand of eachTerminalOperand(block.terminal)) { + emit(env, locals, shared, nextInstructions, operand.identifier.id); + } + for (const [id, node] of locals) { + if (node.instruction == null) { + continue; + } + CompilerError.invariant(node.reorderability === Reorderability.Reorderable, { + reason: `Expected all remaining instructions to be reorderable`, + details: [ + { + kind: 'error', + loc: (_b = (_a = node.instruction) === null || _a === void 0 ? void 0 : _a.loc) !== null && _b !== void 0 ? _b : block.terminal.loc, + message: null, + }, + ], + description: node.instruction != null + ? `Instruction [${node.instruction.id}] was not emitted yet but is not reorderable` + : `Lvalue $${id} was not emitted yet but is not reorderable`, + }); + shared.set(id, node); + } + } + else { + for (const operand of eachTerminalOperand(block.terminal)) { + emit(env, locals, shared, nextInstructions, operand.identifier.id); + } + for (const id of Array.from(locals.keys()).reverse()) { + const node = locals.get(id); + if (node === undefined) { + continue; + } + if (node.reorderability === Reorderability.Reorderable) { + shared.set(id, node); + } + else { + emit(env, locals, shared, nextInstructions, id); + } + } + } + block.instructions = nextInstructions; +} +function getDepth(env, nodes, id) { + const node = nodes.get(id); + if (node == null) { + return 0; + } + if (node.depth != null) { + return node.depth; + } + node.depth = 0; + let depth = node.reorderability === Reorderability.Reorderable ? 1 : 10; + for (const dep of node.dependencies) { + depth += getDepth(env, nodes, dep); + } + node.depth = depth; + return depth; +} +function emit(env, locals, shared, instructions, id) { + var _a; + const node = (_a = locals.get(id)) !== null && _a !== void 0 ? _a : shared.get(id); + if (node == null) { + return; + } + locals.delete(id); + shared.delete(id); + const deps = [...node.dependencies]; + deps.sort((a, b) => { + const aDepth = getDepth(env, locals, a); + const bDepth = getDepth(env, locals, b); + return bDepth - aDepth; + }); + for (const dep of deps) { + emit(env, locals, shared, instructions, dep); + } + if (node.instruction !== null) { + instructions.push(node.instruction); + } +} +var Reorderability; +(function (Reorderability) { + Reorderability[Reorderability["Reorderable"] = 0] = "Reorderable"; + Reorderability[Reorderability["Nonreorderable"] = 1] = "Nonreorderable"; +})(Reorderability || (Reorderability = {})); +function getReorderability(instr, references) { + switch (instr.value.kind) { + case 'JsxExpression': + case 'JsxFragment': + case 'JSXText': + case 'LoadGlobal': + case 'Primitive': + case 'TemplateLiteral': + case 'BinaryExpression': + case 'UnaryExpression': { + return Reorderability.Reorderable; + } + case 'LoadLocal': { + const name = instr.value.place.identifier.name; + if (name !== null && name.kind === 'named') { + const lastAssignment = references.lastAssignments.get(name.value); + if (lastAssignment !== undefined && + lastAssignment < instr.id && + references.singleUseIdentifiers.has(instr.lvalue.identifier.id)) { + return Reorderability.Reorderable; + } + } + return Reorderability.Nonreorderable; + } + default: { + return Reorderability.Nonreorderable; + } + } +} + +function alignMethodCallScopes(fn) { + const scopeMapping = new Map(); + const mergedScopes = new DisjointSet(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + if (value.kind === 'MethodCall') { + const lvalueScope = lvalue.identifier.scope; + const propertyScope = value.property.identifier.scope; + if (lvalueScope !== null) { + if (propertyScope !== null) { + mergedScopes.union([lvalueScope, propertyScope]); + } + else { + scopeMapping.set(value.property.identifier.id, lvalueScope); + } + } + else if (propertyScope !== null) { + scopeMapping.set(value.property.identifier.id, null); + } + } + else if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + alignMethodCallScopes(value.loweredFunc.func); + } + } + } + mergedScopes.forEach((scope, root) => { + if (scope === root) { + return; + } + root.range.start = makeInstructionId(Math.min(scope.range.start, root.range.start)); + root.range.end = makeInstructionId(Math.max(scope.range.end, root.range.end)); + }); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const mappedScope = scopeMapping.get(instr.lvalue.identifier.id); + if (mappedScope !== undefined) { + instr.lvalue.identifier.scope = mappedScope; + } + else if (instr.lvalue.identifier.scope !== null) { + const mergedScope = mergedScopes.find(instr.lvalue.identifier.scope); + if (mergedScope != null) { + instr.lvalue.identifier.scope = mergedScope; + } + } + } + } +} + +function alignReactiveScopesToBlockScopesHIR(fn) { + var _a, _b, _c, _d, _e, _f, _g; + const activeBlockFallthroughRanges = []; + const activeScopes = new Set(); + const seen = new Set(); + const valueBlockNodes = new Map(); + const placeScopes = new Map(); + function recordPlace(id, place, node) { + if (place.identifier.scope !== null) { + placeScopes.set(place, place.identifier.scope); + } + const scope = getPlaceScope(id, place); + if (scope == null) { + return; + } + activeScopes.add(scope); + node === null || node === void 0 ? void 0 : node.children.push({ kind: 'scope', scope, id }); + if (seen.has(scope)) { + return; + } + seen.add(scope); + if (node != null && node.valueRange !== null) { + scope.range.start = makeInstructionId(Math.min(node.valueRange.start, scope.range.start)); + scope.range.end = makeInstructionId(Math.max(node.valueRange.end, scope.range.end)); + } + } + for (const [, block] of fn.body.blocks) { + const startingId = (_b = (_a = block.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : block.terminal.id; + retainWhere_Set(activeScopes, scope => scope.range.end > startingId); + const top = activeBlockFallthroughRanges.at(-1); + if ((top === null || top === void 0 ? void 0 : top.fallthrough) === block.id) { + activeBlockFallthroughRanges.pop(); + for (const scope of activeScopes) { + scope.range.start = makeInstructionId(Math.min(scope.range.start, top.range.start)); + } + } + const { instructions, terminal } = block; + const node = (_c = valueBlockNodes.get(block.id)) !== null && _c !== void 0 ? _c : null; + for (const instr of instructions) { + for (const lvalue of eachInstructionLValue(instr)) { + recordPlace(instr.id, lvalue, node); + } + for (const operand of eachInstructionValueOperand(instr.value)) { + recordPlace(instr.id, operand, node); + } + } + for (const operand of eachTerminalOperand(terminal)) { + recordPlace(terminal.id, operand, node); + } + const fallthrough = terminalFallthrough(terminal); + if (fallthrough !== null && terminal.kind !== 'branch') { + const fallthroughBlock = fn.body.blocks.get(fallthrough); + const nextId = (_e = (_d = fallthroughBlock.instructions[0]) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : fallthroughBlock.terminal.id; + for (const scope of activeScopes) { + if (scope.range.end > terminal.id) { + scope.range.end = makeInstructionId(Math.max(scope.range.end, nextId)); + } + } + activeBlockFallthroughRanges.push({ + fallthrough, + range: { + start: terminal.id, + end: nextId, + }, + }); + CompilerError.invariant(!valueBlockNodes.has(fallthrough), { + reason: 'Expect hir blocks to have unique fallthroughs', + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + if (node != null) { + valueBlockNodes.set(fallthrough, node); + } + } + else if (terminal.kind === 'goto') { + const start = activeBlockFallthroughRanges.find(range => range.fallthrough === terminal.block); + if (start != null && start !== activeBlockFallthroughRanges.at(-1)) { + const fallthroughBlock = fn.body.blocks.get(start.fallthrough); + const firstId = (_g = (_f = fallthroughBlock.instructions[0]) === null || _f === void 0 ? void 0 : _f.id) !== null && _g !== void 0 ? _g : fallthroughBlock.terminal.id; + for (const scope of activeScopes) { + if (scope.range.end <= terminal.id) { + continue; + } + scope.range.start = makeInstructionId(Math.min(start.range.start, scope.range.start)); + scope.range.end = makeInstructionId(Math.max(firstId, scope.range.end)); + } + } + } + mapTerminalSuccessors(terminal, successor => { + var _a, _b; + if (valueBlockNodes.has(successor)) { + return successor; + } + const successorBlock = fn.body.blocks.get(successor); + if (successorBlock.kind === 'block' || successorBlock.kind === 'catch') ; + else if (node == null || + terminal.kind === 'ternary' || + terminal.kind === 'logical' || + terminal.kind === 'optional') { + let valueRange; + if (node == null) { + CompilerError.invariant(fallthrough !== null, { + reason: `Expected a fallthrough for value block`, + description: null, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + const fallthroughBlock = fn.body.blocks.get(fallthrough); + const nextId = (_b = (_a = fallthroughBlock.instructions[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : fallthroughBlock.terminal.id; + valueRange = { + start: terminal.id, + end: nextId, + }; + } + else { + valueRange = node.valueRange; + } + const childNode = { + kind: 'node', + id: terminal.id, + children: [], + valueRange, + }; + node === null || node === void 0 ? void 0 : node.children.push(childNode); + valueBlockNodes.set(successor, childNode); + } + else { + valueBlockNodes.set(successor, node); + } + return successor; + }); + } +} + +function flattenReactiveLoopsHIR(fn) { + const activeLoops = Array(); + for (const [, block] of fn.body.blocks) { + retainWhere(activeLoops, id => id !== block.id); + const { terminal } = block; + switch (terminal.kind) { + case 'do-while': + case 'for': + case 'for-in': + case 'for-of': + case 'while': { + activeLoops.push(terminal.fallthrough); + break; + } + case 'scope': { + if (activeLoops.length !== 0) { + block.terminal = { + kind: 'pruned-scope', + block: terminal.block, + fallthrough: terminal.fallthrough, + id: terminal.id, + loc: terminal.loc, + scope: terminal.scope, + }; + } + break; + } + case 'branch': + case 'goto': + case 'if': + case 'label': + case 'logical': + case 'maybe-throw': + case 'optional': + case 'pruned-scope': + case 'return': + case 'sequence': + case 'switch': + case 'ternary': + case 'throw': + case 'try': + case 'unreachable': + case 'unsupported': { + break; + } + default: { + assertExhaustive$1(terminal, `Unexpected terminal kind \`${terminal.kind}\``); + } + } + } +} + +function flattenScopesWithHooksOrUseHIR(fn) { + const activeScopes = []; + const prune = []; + for (const [, block] of fn.body.blocks) { + retainWhere(activeScopes, current => current.fallthrough !== block.id); + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'MethodCall': + case 'CallExpression': { + const callee = value.kind === 'MethodCall' ? value.property : value.callee; + if (getHookKind(fn.env, callee.identifier) != null || + isUseOperator(callee.identifier)) { + prune.push(...activeScopes.map(entry => entry.block)); + activeScopes.length = 0; + } + } + } + } + if (block.terminal.kind === 'scope') { + activeScopes.push({ + block: block.id, + fallthrough: block.terminal.fallthrough, + }); + } + } + for (const id of prune) { + const block = fn.body.blocks.get(id); + const terminal = block.terminal; + CompilerError.invariant(terminal.kind === 'scope', { + reason: `Expected block to have a scope terminal`, + description: `Expected block bb${block.id} to end in a scope terminal`, + details: [ + { + kind: 'error', + loc: terminal.loc, + message: null, + }, + ], + }); + const body = fn.body.blocks.get(terminal.block); + if (body.instructions.length === 1 && + body.terminal.kind === 'goto' && + body.terminal.block === terminal.fallthrough) { + block.terminal = { + kind: 'label', + block: terminal.block, + fallthrough: terminal.fallthrough, + id: terminal.id, + loc: terminal.loc, + }; + continue; + } + block.terminal = { + kind: 'pruned-scope', + block: terminal.block, + fallthrough: terminal.fallthrough, + id: terminal.id, + loc: terminal.loc, + scope: terminal.scope, + }; + } +} + +function pruneAlwaysInvalidatingScopes(fn) { + visitReactiveFunction(fn, new Transform(), false); +} +class Transform extends ReactiveFunctionTransform { + constructor() { + super(...arguments); + this.alwaysInvalidatingValues = new Set(); + this.unmemoizedValues = new Set(); + } + transformInstruction(instruction, withinScope) { + this.visitInstruction(instruction, withinScope); + const { lvalue, value } = instruction; + switch (value.kind) { + case 'ArrayExpression': + case 'ObjectExpression': + case 'JsxExpression': + case 'JsxFragment': + case 'NewExpression': { + if (lvalue !== null) { + this.alwaysInvalidatingValues.add(lvalue.identifier); + if (!withinScope) { + this.unmemoizedValues.add(lvalue.identifier); + } + } + break; + } + case 'StoreLocal': { + if (this.alwaysInvalidatingValues.has(value.value.identifier)) { + this.alwaysInvalidatingValues.add(value.lvalue.place.identifier); + } + if (this.unmemoizedValues.has(value.value.identifier)) { + this.unmemoizedValues.add(value.lvalue.place.identifier); + } + break; + } + case 'LoadLocal': { + if (lvalue !== null && + this.alwaysInvalidatingValues.has(value.place.identifier)) { + this.alwaysInvalidatingValues.add(lvalue.identifier); + } + if (lvalue !== null && + this.unmemoizedValues.has(value.place.identifier)) { + this.unmemoizedValues.add(lvalue.identifier); + } + break; + } + } + return { kind: 'keep' }; + } + transformScope(scopeBlock, _withinScope) { + this.visitScope(scopeBlock, true); + for (const dep of scopeBlock.scope.dependencies) { + if (this.unmemoizedValues.has(dep.identifier)) { + for (const [_, decl] of scopeBlock.scope.declarations) { + if (this.alwaysInvalidatingValues.has(decl.identifier)) { + this.unmemoizedValues.add(decl.identifier); + } + } + for (const identifier of scopeBlock.scope.reassignments) { + if (this.alwaysInvalidatingValues.has(identifier)) { + this.unmemoizedValues.add(identifier); + } + } + return { + kind: 'replace', + value: { + kind: 'pruned-scope', + scope: scopeBlock.scope, + instructions: scopeBlock.instructions, + }, + }; + } + } + return { kind: 'keep' }; + } +} + +let Visitor$2 = class Visitor extends ReactiveFunctionVisitor { + constructor(env, aliases, paths) { + super(); + this.map = new Map(); + this.aliases = aliases; + this.paths = paths; + this.env = env; + } + join(values) { + function join2(l, r) { + if (l === 'Update' || r === 'Update') { + return 'Update'; + } + else if (l === 'Create' || r === 'Create') { + return 'Create'; + } + else if (l === 'Unknown' || r === 'Unknown') { + return 'Unknown'; + } + assertExhaustive$1(r, `Unhandled variable kind ${r}`); + } + return values.reduce(join2, 'Unknown'); + } + isCreateOnlyHook(id) { + return isUseStateType(id) || isUseRefType(id); + } + visitPlace(_, place, state) { + var _a; + this.map.set(place.identifier.id, this.join([state, (_a = this.map.get(place.identifier.id)) !== null && _a !== void 0 ? _a : 'Unknown'])); + } + visitBlock(block, state) { + super.visitBlock([...block].reverse(), state); + } + visitInstruction(instruction) { + const state = this.join([...eachInstructionLValue(instruction)].map(operand => { var _a; return (_a = this.map.get(operand.identifier.id)) !== null && _a !== void 0 ? _a : 'Unknown'; })); + const visitCallOrMethodNonArgs = () => { + switch (instruction.value.kind) { + case 'CallExpression': { + this.visitPlace(instruction.id, instruction.value.callee, state); + break; + } + case 'MethodCall': { + this.visitPlace(instruction.id, instruction.value.property, state); + this.visitPlace(instruction.id, instruction.value.receiver, state); + break; + } + } + }; + const isHook = () => { + let callee = null; + switch (instruction.value.kind) { + case 'CallExpression': { + callee = instruction.value.callee.identifier; + break; + } + case 'MethodCall': { + callee = instruction.value.property.identifier; + break; + } + } + return callee != null && getHookKind(this.env, callee) != null; + }; + switch (instruction.value.kind) { + case 'CallExpression': + case 'MethodCall': { + if (instruction.lvalue && + this.isCreateOnlyHook(instruction.lvalue.identifier)) { + [...eachCallArgument(instruction.value.args)].forEach(operand => this.visitPlace(instruction.id, operand, 'Create')); + visitCallOrMethodNonArgs(); + } + else { + this.traverseInstruction(instruction, isHook() ? 'Update' : state); + } + break; + } + default: { + this.traverseInstruction(instruction, state); + } + } + } + visitScope(scope) { + const state = this.join([ + ...scope.scope.declarations.keys(), + ...[...scope.scope.reassignments.values()].map(ident => ident.id), + ].map(id => { var _a; return (_a = this.map.get(id)) !== null && _a !== void 0 ? _a : 'Unknown'; })); + super.visitScope(scope, state); + [...scope.scope.dependencies].forEach(ident => { + var _a; + let target = (_a = this.aliases.find(ident.identifier.id)) !== null && _a !== void 0 ? _a : ident.identifier.id; + ident.path.forEach(token => { + var _a; + target && (target = (_a = this.paths.get(target)) === null || _a === void 0 ? void 0 : _a.get(token.property)); + }); + if (target && this.map.get(target) === 'Create') { + scope.scope.dependencies.delete(ident); + } + }); + } + visitTerminal(stmt, state) { + CompilerError.invariant(state !== 'Create', { + reason: "Visiting a terminal statement with state 'Create'", + description: null, + details: [ + { + kind: 'error', + loc: stmt.terminal.loc, + message: null, + }, + ], + }); + super.visitTerminal(stmt, state); + } + visitReactiveFunctionValue(_id, _dependencies, fn, state) { + visitReactiveFunction(fn, this, state); + } +}; +function pruneInitializationDependencies(fn) { + const [aliases, paths] = getAliases(fn); + visitReactiveFunction(fn, new Visitor$2(fn.env, aliases, paths), 'Update'); +} +function update(map, key, path, value) { + var _a; + const inner = (_a = map.get(key)) !== null && _a !== void 0 ? _a : new Map(); + inner.set(path, value); + map.set(key, inner); +} +class AliasVisitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.scopeIdentifiers = new DisjointSet(); + this.scopePaths = new Map(); + } + visitInstruction(instr) { + if (instr.value.kind === 'StoreLocal' || + instr.value.kind === 'StoreContext') { + this.scopeIdentifiers.union([ + instr.value.lvalue.place.identifier.id, + instr.value.value.identifier.id, + ]); + } + else if (instr.value.kind === 'LoadLocal' || + instr.value.kind === 'LoadContext') { + instr.lvalue && + this.scopeIdentifiers.union([ + instr.lvalue.identifier.id, + instr.value.place.identifier.id, + ]); + } + else if (instr.value.kind === 'PropertyLoad') { + instr.lvalue && + update(this.scopePaths, instr.value.object.identifier.id, instr.value.property, instr.lvalue.identifier.id); + } + else if (instr.value.kind === 'PropertyStore') { + update(this.scopePaths, instr.value.object.identifier.id, instr.value.property, instr.value.value.identifier.id); + } + } +} +function getAliases(fn) { + var _a, _b; + const visitor = new AliasVisitor(); + visitReactiveFunction(fn, visitor, null); + let disjoint = visitor.scopeIdentifiers; + let scopePaths = new Map(); + for (const [key, value] of visitor.scopePaths) { + for (const [path, id] of value) { + update(scopePaths, (_a = disjoint.find(key)) !== null && _a !== void 0 ? _a : key, path, (_b = disjoint.find(id)) !== null && _b !== void 0 ? _b : id); + } + } + return [disjoint, scopePaths]; +} + +function isPrimitiveBinaryOp(op) { + switch (op) { + case '+': + case '-': + case '/': + case '%': + case '*': + case '**': + case '&': + case '|': + case '>>': + case '<<': + case '^': + case '>': + case '<': + case '>=': + case '<=': + case '|>': + return true; + default: + return false; + } +} +function inferTypes(func) { + const unifier = new Unifier(func.env); + for (const e of generate(func)) { + unifier.unify(e.left, e.right); + } + apply(func, unifier); +} +function apply(func, unifier) { + for (const [_, block] of func.body.blocks) { + for (const phi of block.phis) { + phi.place.identifier.type = unifier.get(phi.place.identifier.type); + } + for (const instr of block.instructions) { + for (const operand of eachInstructionLValue(instr)) { + operand.identifier.type = unifier.get(operand.identifier.type); + } + for (const place of eachInstructionOperand(instr)) { + place.identifier.type = unifier.get(place.identifier.type); + } + const { lvalue, value } = instr; + lvalue.identifier.type = unifier.get(lvalue.identifier.type); + if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + apply(value.loweredFunc.func, unifier); + } + } + } + const returns = func.returns.identifier; + returns.type = unifier.get(returns.type); +} +function equation(left, right) { + return { + left, + right, + }; +} +function* generate(func) { + if (func.fnType === 'Component') { + const [props, ref] = func.params; + if (props && props.kind === 'Identifier') { + yield equation(props.identifier.type, { + kind: 'Object', + shapeId: BuiltInPropsId, + }); + } + if (ref && ref.kind === 'Identifier') { + yield equation(ref.identifier.type, { + kind: 'Object', + shapeId: BuiltInUseRefId, + }); + } + } + const names = new Map(); + const returnTypes = []; + for (const [_, block] of func.body.blocks) { + for (const phi of block.phis) { + yield equation(phi.place.identifier.type, { + kind: 'Phi', + operands: [...phi.operands.values()].map(id => id.identifier.type), + }); + } + for (const instr of block.instructions) { + yield* generateInstructionTypes(func.env, names, instr); + } + const terminal = block.terminal; + if (terminal.kind === 'return') { + returnTypes.push(terminal.value.identifier.type); + } + } + if (returnTypes.length > 1) { + yield equation(func.returns.identifier.type, { + kind: 'Phi', + operands: returnTypes, + }); + } + else if (returnTypes.length === 1) { + yield equation(func.returns.identifier.type, returnTypes[0]); + } +} +function setName(names, id, name) { + var _a; + if (((_a = name.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named') { + names.set(id, name.name.value); + } +} +function getName(names, id) { + var _a; + return (_a = names.get(id)) !== null && _a !== void 0 ? _a : ''; +} +function* generateInstructionTypes(env, names, instr) { + const { lvalue, value } = instr; + const left = lvalue.identifier.type; + switch (value.kind) { + case 'TemplateLiteral': + case 'JSXText': + case 'Primitive': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'UnaryExpression': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'LoadLocal': { + setName(names, lvalue.identifier.id, value.place.identifier); + yield equation(left, value.place.identifier.type); + break; + } + case 'DeclareContext': + case 'LoadContext': { + break; + } + case 'StoreContext': { + if (value.lvalue.kind === InstructionKind.Const) { + yield equation(value.lvalue.place.identifier.type, value.value.identifier.type); + } + break; + } + case 'StoreLocal': { + if (env.config.enableUseTypeAnnotations) { + yield equation(value.lvalue.place.identifier.type, value.value.identifier.type); + const valueType = value.type === null ? makeType() : lowerType(value.type); + yield equation(valueType, value.lvalue.place.identifier.type); + yield equation(left, valueType); + } + else { + yield equation(left, value.value.identifier.type); + yield equation(value.lvalue.place.identifier.type, value.value.identifier.type); + } + break; + } + case 'StoreGlobal': { + yield equation(left, value.value.identifier.type); + break; + } + case 'BinaryExpression': { + if (isPrimitiveBinaryOp(value.operator)) { + yield equation(value.left.identifier.type, { kind: 'Primitive' }); + yield equation(value.right.identifier.type, { kind: 'Primitive' }); + } + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + yield equation(value.value.identifier.type, { kind: 'Primitive' }); + yield equation(value.lvalue.identifier.type, { kind: 'Primitive' }); + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'LoadGlobal': { + const globalType = env.getGlobalDeclaration(value.binding, value.loc); + if (globalType) { + yield equation(left, globalType); + } + break; + } + case 'CallExpression': { + const returnType = makeType(); + let shapeId = null; + if (env.config.enableTreatSetIdentifiersAsStateSetters) { + const name = getName(names, value.callee.identifier.id); + if (name.startsWith('set')) { + shapeId = BuiltInSetStateId; + } + } + yield equation(value.callee.identifier.type, { + kind: 'Function', + shapeId, + return: returnType, + isConstructor: false, + }); + yield equation(left, returnType); + break; + } + case 'TaggedTemplateExpression': { + const returnType = makeType(); + yield equation(value.tag.identifier.type, { + kind: 'Function', + shapeId: null, + return: returnType, + isConstructor: false, + }); + yield equation(left, returnType); + break; + } + case 'ObjectExpression': { + for (const property of value.properties) { + if (property.kind === 'ObjectProperty' && + property.key.kind === 'computed') { + yield equation(property.key.name.identifier.type, { + kind: 'Primitive', + }); + } + } + yield equation(left, { kind: 'Object', shapeId: BuiltInObjectId }); + break; + } + case 'ArrayExpression': { + yield equation(left, { kind: 'Object', shapeId: BuiltInArrayId }); + break; + } + case 'PropertyLoad': { + yield equation(left, { + kind: 'Property', + objectType: value.object.identifier.type, + objectName: getName(names, value.object.identifier.id), + propertyName: { + kind: 'literal', + value: value.property, + }, + }); + break; + } + case 'ComputedLoad': { + yield equation(left, { + kind: 'Property', + objectType: value.object.identifier.type, + objectName: getName(names, value.object.identifier.id), + propertyName: { + kind: 'computed', + value: value.property.identifier.type, + }, + }); + break; + } + case 'MethodCall': { + const returnType = makeType(); + yield equation(value.property.identifier.type, { + kind: 'Function', + return: returnType, + shapeId: null, + isConstructor: false, + }); + yield equation(left, returnType); + break; + } + case 'Destructure': { + const pattern = value.lvalue.pattern; + if (pattern.kind === 'ArrayPattern') { + for (let i = 0; i < pattern.items.length; i++) { + const item = pattern.items[i]; + if (item.kind === 'Identifier') { + const propertyName = String(i); + yield equation(item.identifier.type, { + kind: 'Property', + objectType: value.value.identifier.type, + objectName: getName(names, value.value.identifier.id), + propertyName: { + kind: 'literal', + value: makePropertyLiteral(propertyName), + }, + }); + } + else if (item.kind === 'Spread') { + yield equation(item.place.identifier.type, { + kind: 'Object', + shapeId: BuiltInArrayId, + }); + } + else { + break; + } + } + } + else { + for (const property of pattern.properties) { + if (property.kind === 'ObjectProperty') { + if (property.key.kind === 'identifier' || + property.key.kind === 'string') { + yield equation(property.place.identifier.type, { + kind: 'Property', + objectType: value.value.identifier.type, + objectName: getName(names, value.value.identifier.id), + propertyName: { + kind: 'literal', + value: makePropertyLiteral(property.key.name), + }, + }); + } + } + } + } + break; + } + case 'TypeCastExpression': { + if (env.config.enableUseTypeAnnotations) { + yield equation(value.type, value.value.identifier.type); + yield equation(left, value.type); + } + else { + yield equation(left, value.value.identifier.type); + } + break; + } + case 'PropertyDelete': + case 'ComputedDelete': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'FunctionExpression': { + yield* generate(value.loweredFunc.func); + yield equation(left, { + kind: 'Function', + shapeId: BuiltInFunctionId, + return: value.loweredFunc.func.returns.identifier.type, + isConstructor: false, + }); + break; + } + case 'NextPropertyOf': { + yield equation(left, { kind: 'Primitive' }); + break; + } + case 'ObjectMethod': { + yield* generate(value.loweredFunc.func); + yield equation(left, { kind: 'ObjectMethod' }); + break; + } + case 'JsxExpression': + case 'JsxFragment': { + if (env.config.enableTreatRefLikeIdentifiersAsRefs) { + if (value.kind === 'JsxExpression') { + for (const prop of value.props) { + if (prop.kind === 'JsxAttribute' && prop.name === 'ref') { + yield equation(prop.place.identifier.type, { + kind: 'Object', + shapeId: BuiltInUseRefId, + }); + } + } + } + } + yield equation(left, { kind: 'Object', shapeId: BuiltInJsxId }); + break; + } + case 'NewExpression': { + const returnType = makeType(); + yield equation(value.callee.identifier.type, { + kind: 'Function', + return: returnType, + shapeId: null, + isConstructor: true, + }); + yield equation(left, returnType); + break; + } + case 'PropertyStore': { + yield equation(makeType(), { + kind: 'Property', + objectType: value.object.identifier.type, + objectName: getName(names, value.object.identifier.id), + propertyName: { + kind: 'literal', + value: value.property, + }, + }); + break; + } + case 'DeclareLocal': + case 'RegExpLiteral': + case 'MetaProperty': + case 'ComputedStore': + case 'Await': + case 'GetIterator': + case 'IteratorNext': + case 'UnsupportedNode': + case 'Debugger': + case 'FinishMemoize': + case 'StartMemoize': { + break; + } + default: + assertExhaustive$1(value, `Unhandled instruction value kind: ${value.kind}`); + } +} +class Unifier { + constructor(env) { + this.substitutions = new Map(); + this.env = env; + } + unify(tA, tB) { + if (tB.kind === 'Property') { + if (this.env.config.enableTreatRefLikeIdentifiersAsRefs && + isRefLikeName(tB)) { + this.unify(tB.objectType, { + kind: 'Object', + shapeId: BuiltInUseRefId, + }); + this.unify(tA, { + kind: 'Object', + shapeId: BuiltInRefValueId, + }); + return; + } + const objectType = this.get(tB.objectType); + const propertyType = tB.propertyName.kind === 'literal' + ? this.env.getPropertyType(objectType, tB.propertyName.value) + : this.env.getFallthroughPropertyType(objectType, tB.propertyName.value); + if (propertyType !== null) { + this.unify(tA, propertyType); + } + return; + } + if (typeEquals(tA, tB)) { + return; + } + if (tA.kind === 'Type') { + this.bindVariableTo(tA, tB); + return; + } + if (tB.kind === 'Type') { + this.bindVariableTo(tB, tA); + return; + } + if (tB.kind === 'Function' && + tA.kind === 'Function' && + tA.isConstructor === tB.isConstructor) { + this.unify(tA.return, tB.return); + return; + } + } + bindVariableTo(v, type) { + if (type.kind === 'Poly') { + return; + } + if (this.substitutions.has(v.id)) { + this.unify(this.substitutions.get(v.id), type); + return; + } + if (type.kind === 'Type' && this.substitutions.has(type.id)) { + this.unify(v, this.substitutions.get(type.id)); + return; + } + if (type.kind === 'Phi') { + CompilerError.invariant(type.operands.length > 0, { + reason: 'there should be at least one operand', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + let candidateType = null; + for (const operand of type.operands) { + const resolved = this.get(operand); + if (candidateType === null) { + candidateType = resolved; + } + else if (!typeEquals(resolved, candidateType)) { + const unionType = tryUnionTypes(resolved, candidateType); + if (unionType === null) { + candidateType = null; + break; + } + else { + candidateType = unionType; + } + } + } + if (candidateType !== null) { + this.unify(v, candidateType); + return; + } + } + if (this.occursCheck(v, type)) { + const resolvedType = this.tryResolveType(v, type); + if (resolvedType !== null) { + this.substitutions.set(v.id, resolvedType); + return; + } + throw new Error('cycle detected'); + } + this.substitutions.set(v.id, type); + } + tryResolveType(v, type) { + switch (type.kind) { + case 'Phi': { + const operands = []; + for (const operand of type.operands) { + if (operand.kind === 'Type' && operand.id === v.id) { + continue; + } + const resolved = this.tryResolveType(v, operand); + if (resolved === null) { + return null; + } + operands.push(resolved); + } + return { kind: 'Phi', operands }; + } + case 'Type': { + const substitution = this.get(type); + if (substitution !== type) { + const resolved = this.tryResolveType(v, substitution); + if (resolved !== null) { + this.substitutions.set(type.id, resolved); + } + return resolved; + } + return type; + } + case 'Property': { + const objectType = this.tryResolveType(v, this.get(type.objectType)); + if (objectType === null) { + return null; + } + return { + kind: 'Property', + objectName: type.objectName, + objectType, + propertyName: type.propertyName, + }; + } + case 'Function': { + const returnType = this.tryResolveType(v, this.get(type.return)); + if (returnType === null) { + return null; + } + return { + kind: 'Function', + return: returnType, + shapeId: type.shapeId, + isConstructor: type.isConstructor, + }; + } + case 'ObjectMethod': + case 'Object': + case 'Primitive': + case 'Poly': { + return type; + } + default: { + assertExhaustive$1(type, `Unexpected type kind '${type.kind}'`); + } + } + } + occursCheck(v, type) { + if (typeEquals(v, type)) + return true; + if (type.kind === 'Type' && this.substitutions.has(type.id)) { + return this.occursCheck(v, this.substitutions.get(type.id)); + } + if (type.kind === 'Phi') { + return type.operands.some(o => this.occursCheck(v, o)); + } + if (type.kind === 'Function') { + return this.occursCheck(v, type.return); + } + return false; + } + get(type) { + if (type.kind === 'Type') { + if (this.substitutions.has(type.id)) { + return this.get(this.substitutions.get(type.id)); + } + } + if (type.kind === 'Phi') { + return { kind: 'Phi', operands: type.operands.map(o => this.get(o)) }; + } + if (type.kind === 'Function') { + return { + kind: 'Function', + isConstructor: type.isConstructor, + shapeId: type.shapeId, + return: this.get(type.return), + }; + } + return type; + } +} +const RefLikeNameRE = /^(?:[a-zA-Z$_][a-zA-Z$_0-9]*)Ref$|^ref$/; +function isRefLikeName(t) { + return (t.propertyName.kind === 'literal' && + RefLikeNameRE.test(t.objectName) && + t.propertyName.value === 'current'); +} +function tryUnionTypes(ty1, ty2) { + let readonlyType; + let otherType; + if (ty1.kind === 'Object' && ty1.shapeId === BuiltInMixedReadonlyId) { + readonlyType = ty1; + otherType = ty2; + } + else if (ty2.kind === 'Object' && ty2.shapeId === BuiltInMixedReadonlyId) { + readonlyType = ty2; + otherType = ty1; + } + else { + return null; + } + if (otherType.kind === 'Primitive') { + return readonlyType; + } + else if (otherType.kind === 'Object' && + otherType.shapeId === BuiltInArrayId) { + return otherType; + } + return null; +} + +function validateContextVariableLValues(fn) { + const identifierKinds = new Map(); + validateContextVariableLValuesImpl(fn, identifierKinds); +} +function validateContextVariableLValuesImpl(fn, identifierKinds) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'DeclareContext': + case 'StoreContext': { + visit(identifierKinds, value.lvalue.place, 'context'); + break; + } + case 'LoadContext': { + visit(identifierKinds, value.place, 'context'); + break; + } + case 'StoreLocal': + case 'DeclareLocal': { + visit(identifierKinds, value.lvalue.place, 'local'); + break; + } + case 'LoadLocal': { + visit(identifierKinds, value.place, 'local'); + break; + } + case 'PostfixUpdate': + case 'PrefixUpdate': { + visit(identifierKinds, value.lvalue, 'local'); + break; + } + case 'Destructure': { + for (const lvalue of eachPatternOperand(value.lvalue.pattern)) { + visit(identifierKinds, lvalue, 'destructure'); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + validateContextVariableLValuesImpl(value.loweredFunc.func, identifierKinds); + break; + } + default: { + for (const _ of eachInstructionValueLValue(value)) { + CompilerError.throwTodo({ + reason: 'ValidateContextVariableLValues: unhandled instruction variant', + loc: value.loc, + description: `Handle '${value.kind} lvalues`, + suggestions: null, + }); + } + } + } + } + } +} +function visit(identifiers, place, kind) { + const prev = identifiers.get(place.identifier.id); + if (prev !== undefined) { + const wasContext = prev.kind === 'context'; + const isContext = kind === 'context'; + if (wasContext !== isContext) { + if (prev.kind === 'destructure' || kind === 'destructure') { + CompilerError.throwTodo({ + reason: `Support destructuring of context variables`, + loc: kind === 'destructure' ? place.loc : prev.place.loc, + description: null, + suggestions: null, + }); + } + CompilerError.invariant(false, { + reason: 'Expected all references to a variable to be consistently local or context references', + description: `Identifier ${printPlace(place)} is referenced as a ${kind} variable, but was previously referenced as a ${prev.kind} variable`, + suggestions: null, + details: [ + { + kind: 'error', + loc: place.loc, + message: `this is ${prev.kind}`, + }, + ], + }); + } + } + identifiers.set(place.identifier.id, { place, kind }); +} + +function computeUnconditionalBlocks(fn) { + const unconditionalBlocks = new Set(); + const dominators = computePostDominatorTree(fn, { + includeThrowsAsExitNode: false, + }); + const exit = dominators.exit; + let current = fn.body.entry; + while (current !== null && current !== exit) { + CompilerError.invariant(!unconditionalBlocks.has(current), { + reason: 'Internal error: non-terminating loop in ComputeUnconditionalBlocks', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + unconditionalBlocks.add(current); + current = dominators.get(current); + } + return unconditionalBlocks; +} + +var Kind; +(function (Kind) { + Kind["Error"] = "Error"; + Kind["KnownHook"] = "KnownHook"; + Kind["PotentialHook"] = "PotentialHook"; + Kind["Global"] = "Global"; + Kind["Local"] = "Local"; +})(Kind || (Kind = {})); +function joinKinds(a, b) { + if (a === Kind.Error || b === Kind.Error) { + return Kind.Error; + } + else if (a === Kind.KnownHook || b === Kind.KnownHook) { + return Kind.KnownHook; + } + else if (a === Kind.PotentialHook || b === Kind.PotentialHook) { + return Kind.PotentialHook; + } + else if (a === Kind.Global || b === Kind.Global) { + return Kind.Global; + } + else { + return Kind.Local; + } +} +function validateHooksUsage(fn) { + const unconditionalBlocks = computeUnconditionalBlocks(fn); + const errors = new CompilerError(); + const errorsByPlace = new Map(); + function recordError(loc, errorDetail) { + if (typeof loc === 'symbol') { + errors.pushErrorDetail(errorDetail); + } + else { + errorsByPlace.set(loc, errorDetail); + } + } + function recordConditionalHookError(place) { + setKind(place, Kind.Error); + const reason = 'Hooks must always be called in a consistent order, and may not be called conditionally. See the Rules of Hooks (https://react.dev/warnings/invalid-hook-call-warning)'; + const previousError = typeof place.loc !== 'symbol' ? errorsByPlace.get(place.loc) : undefined; + if (previousError === undefined || previousError.reason !== reason) { + recordError(place.loc, new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + description: null, + reason, + loc: place.loc, + suggestions: null, + })); + } + } + function recordInvalidHookUsageError(place) { + const previousError = typeof place.loc !== 'symbol' ? errorsByPlace.get(place.loc) : undefined; + if (previousError === undefined) { + recordError(place.loc, new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + description: null, + reason: 'Hooks may not be referenced as normal values, they must be called. See https://react.dev/reference/rules/react-calls-components-and-hooks#never-pass-around-hooks-as-regular-values', + loc: place.loc, + suggestions: null, + })); + } + } + function recordDynamicHookUsageError(place) { + const previousError = typeof place.loc !== 'symbol' ? errorsByPlace.get(place.loc) : undefined; + if (previousError === undefined) { + recordError(place.loc, new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + description: null, + reason: 'Hooks must be the same function on every render, but this value may change over time to a different function. See https://react.dev/reference/rules/react-calls-components-and-hooks#dont-dynamically-use-hooks', + loc: place.loc, + suggestions: null, + })); + } + } + const valueKinds = new Map(); + function getKindForPlace(place) { + const knownKind = valueKinds.get(place.identifier.id); + if (place.identifier.name !== null && + isHookName$2(place.identifier.name.value)) { + return joinKinds(knownKind !== null && knownKind !== void 0 ? knownKind : Kind.Local, Kind.PotentialHook); + } + else { + return knownKind !== null && knownKind !== void 0 ? knownKind : Kind.Local; + } + } + function visitPlace(place) { + const kind = valueKinds.get(place.identifier.id); + if (kind === Kind.KnownHook) { + recordInvalidHookUsageError(place); + } + } + function setKind(place, kind) { + valueKinds.set(place.identifier.id, kind); + } + for (const param of fn.params) { + const place = param.kind === 'Identifier' ? param : param.place; + const kind = getKindForPlace(place); + setKind(place, kind); + } + for (const [, block] of fn.body.blocks) { + for (const phi of block.phis) { + let kind = phi.place.identifier.name !== null && + isHookName$2(phi.place.identifier.name.value) + ? Kind.PotentialHook + : Kind.Local; + for (const [, operand] of phi.operands) { + const operandKind = valueKinds.get(operand.identifier.id); + if (operandKind !== undefined) { + kind = joinKinds(kind, operandKind); + } + } + valueKinds.set(phi.place.identifier.id, kind); + } + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'LoadGlobal': { + if (getHookKind(fn.env, instr.lvalue.identifier) != null) { + setKind(instr.lvalue, Kind.KnownHook); + } + else { + setKind(instr.lvalue, Kind.Global); + } + break; + } + case 'LoadContext': + case 'LoadLocal': { + visitPlace(instr.value.place); + const kind = getKindForPlace(instr.value.place); + setKind(instr.lvalue, kind); + break; + } + case 'StoreLocal': + case 'StoreContext': { + visitPlace(instr.value.value); + const kind = joinKinds(getKindForPlace(instr.value.value), getKindForPlace(instr.value.lvalue.place)); + setKind(instr.value.lvalue.place, kind); + setKind(instr.lvalue, kind); + break; + } + case 'ComputedLoad': { + visitPlace(instr.value.object); + const kind = getKindForPlace(instr.value.object); + setKind(instr.lvalue, joinKinds(getKindForPlace(instr.lvalue), kind)); + break; + } + case 'PropertyLoad': { + const objectKind = getKindForPlace(instr.value.object); + const isHookProperty = typeof instr.value.property === 'string' && + isHookName$2(instr.value.property); + let kind; + switch (objectKind) { + case Kind.Error: { + kind = Kind.Error; + break; + } + case Kind.KnownHook: { + kind = isHookProperty ? Kind.KnownHook : Kind.Local; + break; + } + case Kind.PotentialHook: { + kind = Kind.PotentialHook; + break; + } + case Kind.Global: { + kind = isHookProperty ? Kind.KnownHook : Kind.Global; + break; + } + case Kind.Local: { + kind = isHookProperty ? Kind.PotentialHook : Kind.Local; + break; + } + default: { + assertExhaustive$1(objectKind, `Unexpected kind \`${objectKind}\``); + } + } + setKind(instr.lvalue, kind); + break; + } + case 'CallExpression': { + const calleeKind = getKindForPlace(instr.value.callee); + const isHookCallee = calleeKind === Kind.KnownHook || calleeKind === Kind.PotentialHook; + if (isHookCallee && !unconditionalBlocks.has(block.id)) { + recordConditionalHookError(instr.value.callee); + } + else if (calleeKind === Kind.PotentialHook) { + recordDynamicHookUsageError(instr.value.callee); + } + for (const operand of eachInstructionOperand(instr)) { + if (operand === instr.value.callee) { + continue; + } + visitPlace(operand); + } + break; + } + case 'MethodCall': { + const calleeKind = getKindForPlace(instr.value.property); + const isHookCallee = calleeKind === Kind.KnownHook || calleeKind === Kind.PotentialHook; + if (isHookCallee && !unconditionalBlocks.has(block.id)) { + recordConditionalHookError(instr.value.property); + } + else if (calleeKind === Kind.PotentialHook) { + recordDynamicHookUsageError(instr.value.property); + } + for (const operand of eachInstructionOperand(instr)) { + if (operand === instr.value.property) { + continue; + } + visitPlace(operand); + } + break; + } + case 'Destructure': { + visitPlace(instr.value.value); + const objectKind = getKindForPlace(instr.value.value); + for (const lvalue of eachInstructionLValue(instr)) { + const isHookProperty = lvalue.identifier.name !== null && + isHookName$2(lvalue.identifier.name.value); + let kind; + switch (objectKind) { + case Kind.Error: { + kind = Kind.Error; + break; + } + case Kind.KnownHook: { + kind = Kind.KnownHook; + break; + } + case Kind.PotentialHook: { + kind = Kind.PotentialHook; + break; + } + case Kind.Global: { + kind = isHookProperty ? Kind.KnownHook : Kind.Global; + break; + } + case Kind.Local: { + kind = isHookProperty ? Kind.PotentialHook : Kind.Local; + break; + } + default: { + assertExhaustive$1(objectKind, `Unexpected kind \`${objectKind}\``); + } + } + setKind(lvalue, kind); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + visitFunctionExpression(errors, instr.value.loweredFunc.func); + break; + } + default: { + for (const operand of eachInstructionOperand(instr)) { + visitPlace(operand); + } + for (const lvalue of eachInstructionLValue(instr)) { + const kind = getKindForPlace(lvalue); + setKind(lvalue, kind); + } + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visitPlace(operand); + } + } + for (const [, error] of errorsByPlace) { + errors.pushErrorDetail(error); + } + return errors.asResult(); +} +function visitFunctionExpression(errors, fn) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'ObjectMethod': + case 'FunctionExpression': { + visitFunctionExpression(errors, instr.value.loweredFunc.func); + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = instr.value.kind === 'CallExpression' + ? instr.value.callee + : instr.value.property; + const hookKind = getHookKind(fn.env, callee.identifier); + if (hookKind != null) { + errors.pushErrorDetail(new CompilerErrorDetail({ + category: ErrorCategory.Hooks, + reason: 'Hooks must be called at the top level in the body of a function component or custom hook, and may not be called within function expressions. See the Rules of Hooks (https://react.dev/warnings/invalid-hook-call-warning)', + loc: callee.loc, + description: `Cannot call ${hookKind === 'Custom' ? 'hook' : hookKind} within a function expression`, + suggestions: null, + })); + } + break; + } + } + } + } +} + +function validateMemoizedEffectDependencies(fn) { + const errors = new CompilerError(); + visitReactiveFunction(fn, new Visitor$1(), errors); + return errors.asResult(); +} +let Visitor$1 = class Visitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.scopes = new Set(); + } + visitScope(scopeBlock, state) { + this.traverseScope(scopeBlock, state); + let areDependenciesMemoized = true; + for (const dep of scopeBlock.scope.dependencies) { + if (isUnmemoized$1(dep.identifier, this.scopes)) { + areDependenciesMemoized = false; + break; + } + } + if (areDependenciesMemoized) { + this.scopes.add(scopeBlock.scope.id); + for (const id of scopeBlock.scope.merged) { + this.scopes.add(id); + } + } + } + visitInstruction(instruction, state) { + this.traverseInstruction(instruction, state); + if (instruction.value.kind === 'CallExpression' && + isEffectHook(instruction.value.callee.identifier) && + instruction.value.args.length >= 2) { + const deps = instruction.value.args[1]; + if (deps.kind === 'Identifier' && + (isMutable(instruction, deps) || + isUnmemoized$1(deps.identifier, this.scopes))) { + state.push({ + category: ErrorCategory.EffectDependencies, + reason: 'React Compiler has skipped optimizing this component because the effect dependencies could not be memoized. Unmemoized effect dependencies can trigger an infinite loop or other unexpected behavior', + description: null, + loc: typeof instruction.loc !== 'symbol' ? instruction.loc : null, + suggestions: null, + }); + } + } + } +}; +function isUnmemoized$1(operand, scopes) { + return operand.scope != null && !scopes.has(operand.scope.id); +} +function isEffectHook(identifier) { + return (isUseEffectHookType(identifier) || + isUseLayoutEffectHookType(identifier) || + isUseInsertionEffectHookType(identifier)); +} + +function validateNoCapitalizedCalls(fn) { + var _a; + const envConfig = fn.env.config; + const ALLOW_LIST = new Set([ + ...DEFAULT_GLOBALS.keys(), + ...((_a = envConfig.validateNoCapitalizedCalls) !== null && _a !== void 0 ? _a : []), + ]); + const hookPattern = envConfig.hookPattern != null ? new RegExp(envConfig.hookPattern) : null; + const isAllowed = (name) => { + return (ALLOW_LIST.has(name) || (hookPattern != null && hookPattern.test(name))); + }; + const errors = new CompilerError(); + const capitalLoadGlobals = new Map(); + const capitalizedProperties = new Map(); + const reason = 'Capitalized functions are reserved for components, which must be invoked with JSX. If this is a component, render it with JSX. Otherwise, ensure that it has no hook calls and rename it to begin with a lowercase letter. Alternatively, if you know for a fact that this function is not a component, you can allowlist it via the compiler config'; + for (const [, block] of fn.body.blocks) { + for (const { lvalue, value } of block.instructions) { + switch (value.kind) { + case 'LoadGlobal': { + if (value.binding.name != '' && + /^[A-Z]/.test(value.binding.name) && + !(value.binding.name.toUpperCase() === value.binding.name) && + !isAllowed(value.binding.name)) { + capitalLoadGlobals.set(lvalue.identifier.id, value.binding.name); + } + break; + } + case 'CallExpression': { + const calleeIdentifier = value.callee.identifier.id; + const calleeName = capitalLoadGlobals.get(calleeIdentifier); + if (calleeName != null) { + CompilerError.throwInvalidReact({ + category: ErrorCategory.CapitalizedCalls, + reason, + description: `${calleeName} may be a component`, + loc: value.loc, + suggestions: null, + }); + } + break; + } + case 'PropertyLoad': { + if (typeof value.property === 'string' && + /^[A-Z]/.test(value.property)) { + capitalizedProperties.set(lvalue.identifier.id, value.property); + } + break; + } + case 'MethodCall': { + const propertyIdentifier = value.property.identifier.id; + const propertyName = capitalizedProperties.get(propertyIdentifier); + if (propertyName != null) { + errors.push({ + category: ErrorCategory.CapitalizedCalls, + reason, + description: `${propertyName} may be a component`, + loc: value.loc, + suggestions: null, + }); + } + break; + } + } + } + } + return errors.asResult(); +} + +var _Env_changed, _Env_data, _Env_temporaries; +function makeRefId(id) { + CompilerError.invariant(id >= 0 && Number.isInteger(id), { + reason: 'Expected identifier id to be a non-negative integer', + description: null, + suggestions: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return id; +} +let _refId = 0; +function nextRefId() { + return makeRefId(_refId++); +} +class Env { + constructor() { + _Env_changed.set(this, false); + _Env_data.set(this, new Map()); + _Env_temporaries.set(this, new Map()); + } + lookup(place) { + var _a; + return (_a = __classPrivateFieldGet(this, _Env_temporaries, "f").get(place.identifier.id)) !== null && _a !== void 0 ? _a : place; + } + define(place, value) { + __classPrivateFieldGet(this, _Env_temporaries, "f").set(place.identifier.id, value); + } + resetChanged() { + __classPrivateFieldSet(this, _Env_changed, false, "f"); + } + hasChanged() { + return __classPrivateFieldGet(this, _Env_changed, "f"); + } + get(key) { + var _a, _b; + const operandId = (_b = (_a = __classPrivateFieldGet(this, _Env_temporaries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.identifier.id) !== null && _b !== void 0 ? _b : key; + return __classPrivateFieldGet(this, _Env_data, "f").get(operandId); + } + set(key, value) { + var _a, _b; + const operandId = (_b = (_a = __classPrivateFieldGet(this, _Env_temporaries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.identifier.id) !== null && _b !== void 0 ? _b : key; + const cur = __classPrivateFieldGet(this, _Env_data, "f").get(operandId); + const widenedValue = joinRefAccessTypes(value, cur !== null && cur !== void 0 ? cur : { kind: 'None' }); + if (!(cur == null && widenedValue.kind === 'None') && + (cur == null || !tyEqual(cur, widenedValue))) { + __classPrivateFieldSet(this, _Env_changed, true, "f"); + } + __classPrivateFieldGet(this, _Env_data, "f").set(operandId, widenedValue); + return this; + } +} +_Env_changed = new WeakMap(), _Env_data = new WeakMap(), _Env_temporaries = new WeakMap(); +function validateNoRefAccessInRender(fn) { + const env = new Env(); + collectTemporariesSidemap(fn, env); + return validateNoRefAccessInRenderImpl(fn, env).map(_ => undefined); +} +function collectTemporariesSidemap(fn, env) { + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'LoadLocal': { + const temp = env.lookup(value.place); + if (temp != null) { + env.define(lvalue, temp); + } + break; + } + case 'StoreLocal': { + const temp = env.lookup(value.value); + if (temp != null) { + env.define(lvalue, temp); + env.define(value.lvalue.place, temp); + } + break; + } + case 'PropertyLoad': { + if (isUseRefType(value.object.identifier) && + value.property === 'current') { + continue; + } + const temp = env.lookup(value.object); + if (temp != null) { + env.define(lvalue, temp); + } + break; + } + } + } + } +} +function refTypeOfType(place) { + if (isRefValueType(place.identifier)) { + return { kind: 'RefValue' }; + } + else if (isUseRefType(place.identifier)) { + return { kind: 'Ref', refId: nextRefId() }; + } + else { + return { kind: 'None' }; + } +} +function tyEqual(a, b) { + if (a.kind !== b.kind) { + return false; + } + switch (a.kind) { + case 'None': + return true; + case 'Ref': + return true; + case 'Nullable': + return true; + case 'Guard': + CompilerError.invariant(b.kind === 'Guard', { + reason: 'Expected ref value', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return a.refId === b.refId; + case 'RefValue': + CompilerError.invariant(b.kind === 'RefValue', { + reason: 'Expected ref value', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return a.loc == b.loc; + case 'Structure': { + CompilerError.invariant(b.kind === 'Structure', { + reason: 'Expected structure', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + const fnTypesEqual = (a.fn === null && b.fn === null) || + (a.fn !== null && + b.fn !== null && + a.fn.readRefEffect === b.fn.readRefEffect && + tyEqual(a.fn.returnType, b.fn.returnType)); + return (fnTypesEqual && + (a.value === b.value || + (a.value !== null && b.value !== null && tyEqual(a.value, b.value)))); + } + } +} +function joinRefAccessTypes(...types) { + function joinRefAccessRefTypes(a, b) { + if (a.kind === 'RefValue') { + if (b.kind === 'RefValue' && a.refId === b.refId) { + return a; + } + return { kind: 'RefValue' }; + } + else if (b.kind === 'RefValue') { + return b; + } + else if (a.kind === 'Ref' || b.kind === 'Ref') { + if (a.kind === 'Ref' && b.kind === 'Ref' && a.refId === b.refId) { + return a; + } + return { kind: 'Ref', refId: nextRefId() }; + } + else { + CompilerError.invariant(a.kind === 'Structure' && b.kind === 'Structure', { + reason: 'Expected structure', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + const fn = a.fn === null + ? b.fn + : b.fn === null + ? a.fn + : { + readRefEffect: a.fn.readRefEffect || b.fn.readRefEffect, + returnType: joinRefAccessTypes(a.fn.returnType, b.fn.returnType), + }; + const value = a.value === null + ? b.value + : b.value === null + ? a.value + : joinRefAccessRefTypes(a.value, b.value); + return { + kind: 'Structure', + fn, + value, + }; + } + } + return types.reduce((a, b) => { + if (a.kind === 'None') { + return b; + } + else if (b.kind === 'None') { + return a; + } + else if (a.kind === 'Guard') { + if (b.kind === 'Guard' && a.refId === b.refId) { + return a; + } + else if (b.kind === 'Nullable' || b.kind === 'Guard') { + return { kind: 'None' }; + } + else { + return b; + } + } + else if (b.kind === 'Guard') { + if (a.kind === 'Nullable') { + return { kind: 'None' }; + } + else { + return b; + } + } + else if (a.kind === 'Nullable') { + return b; + } + else if (b.kind === 'Nullable') { + return a; + } + else { + return joinRefAccessRefTypes(a, b); + } + }, { kind: 'None' }); +} +function validateNoRefAccessInRenderImpl(fn, env) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + let returnValues = []; + let place; + for (const param of fn.params) { + if (param.kind === 'Identifier') { + place = param; + } + else { + place = param.place; + } + const type = refTypeOfType(place); + env.set(place.identifier.id, type); + } + const interpolatedAsJsx = new Set(); + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { value } = instr; + if (value.kind === 'JsxExpression' || value.kind === 'JsxFragment') { + if (value.children != null) { + for (const child of value.children) { + interpolatedAsJsx.add(child.identifier.id); + } + } + } + } + } + for (let i = 0; (i == 0 || env.hasChanged()) && i < 10; i++) { + env.resetChanged(); + returnValues = []; + const safeBlocks = []; + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + retainWhere(safeBlocks, entry => entry.block !== block.id); + for (const phi of block.phis) { + env.set(phi.place.identifier.id, joinRefAccessTypes(...Array(...phi.operands.values()).map(operand => { var _a; return (_a = env.get(operand.identifier.id)) !== null && _a !== void 0 ? _a : { kind: 'None' }; }))); + } + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'JsxExpression': + case 'JsxFragment': { + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoDirectRefValueAccess(errors, operand, env); + } + break; + } + case 'ComputedLoad': + case 'PropertyLoad': { + if (instr.value.kind === 'ComputedLoad') { + validateNoDirectRefValueAccess(errors, instr.value.property, env); + } + const objType = env.get(instr.value.object.identifier.id); + let lookupType = null; + if ((objType === null || objType === void 0 ? void 0 : objType.kind) === 'Structure') { + lookupType = objType.value; + } + else if ((objType === null || objType === void 0 ? void 0 : objType.kind) === 'Ref') { + lookupType = { + kind: 'RefValue', + loc: instr.loc, + refId: objType.refId, + }; + } + env.set(instr.lvalue.identifier.id, lookupType !== null && lookupType !== void 0 ? lookupType : refTypeOfType(instr.lvalue)); + break; + } + case 'TypeCastExpression': { + env.set(instr.lvalue.identifier.id, (_a = env.get(instr.value.value.identifier.id)) !== null && _a !== void 0 ? _a : refTypeOfType(instr.lvalue)); + break; + } + case 'LoadContext': + case 'LoadLocal': { + env.set(instr.lvalue.identifier.id, (_b = env.get(instr.value.place.identifier.id)) !== null && _b !== void 0 ? _b : refTypeOfType(instr.lvalue)); + break; + } + case 'StoreContext': + case 'StoreLocal': { + env.set(instr.value.lvalue.place.identifier.id, (_c = env.get(instr.value.value.identifier.id)) !== null && _c !== void 0 ? _c : refTypeOfType(instr.value.lvalue.place)); + env.set(instr.lvalue.identifier.id, (_d = env.get(instr.value.value.identifier.id)) !== null && _d !== void 0 ? _d : refTypeOfType(instr.lvalue)); + break; + } + case 'Destructure': { + const objType = env.get(instr.value.value.identifier.id); + let lookupType = null; + if ((objType === null || objType === void 0 ? void 0 : objType.kind) === 'Structure') { + lookupType = objType.value; + } + env.set(instr.lvalue.identifier.id, lookupType !== null && lookupType !== void 0 ? lookupType : refTypeOfType(instr.lvalue)); + for (const lval of eachPatternOperand(instr.value.lvalue.pattern)) { + env.set(lval.identifier.id, lookupType !== null && lookupType !== void 0 ? lookupType : refTypeOfType(lval)); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + let returnType = { kind: 'None' }; + let readRefEffect = false; + const result = validateNoRefAccessInRenderImpl(instr.value.loweredFunc.func, env); + if (result.isOk()) { + returnType = result.unwrap(); + } + else if (result.isErr()) { + readRefEffect = true; + } + env.set(instr.lvalue.identifier.id, { + kind: 'Structure', + fn: { + readRefEffect, + returnType, + }, + value: null, + }); + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = instr.value.kind === 'CallExpression' + ? instr.value.callee + : instr.value.property; + const hookKind = getHookKindForType(fn.env, callee.identifier.type); + let returnType = { kind: 'None' }; + const fnType = env.get(callee.identifier.id); + let didError = false; + if ((fnType === null || fnType === void 0 ? void 0 : fnType.kind) === 'Structure' && fnType.fn !== null) { + returnType = fnType.fn.returnType; + if (fnType.fn.readRefEffect) { + didError = true; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: `This function accesses a ref value`, + })); + } + } + if (!didError) { + const isRefLValue = isUseRefType(instr.lvalue.identifier); + for (const operand of eachInstructionValueOperand(instr.value)) { + if (isRefLValue || + (hookKind != null && + hookKind !== 'useState' && + hookKind !== 'useReducer')) { + validateNoDirectRefValueAccess(errors, operand, env); + } + else if (interpolatedAsJsx.has(instr.lvalue.identifier.id)) { + validateNoRefValueAccess(errors, env, operand); + } + else { + validateNoRefPassedToFunction(errors, env, operand, operand.loc); + } + } + } + env.set(instr.lvalue.identifier.id, returnType); + break; + } + case 'ObjectExpression': + case 'ArrayExpression': { + const types = []; + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoDirectRefValueAccess(errors, operand, env); + types.push((_e = env.get(operand.identifier.id)) !== null && _e !== void 0 ? _e : { kind: 'None' }); + } + const value = joinRefAccessTypes(...types); + if (value.kind === 'None' || + value.kind === 'Guard' || + value.kind === 'Nullable') { + env.set(instr.lvalue.identifier.id, { kind: 'None' }); + } + else { + env.set(instr.lvalue.identifier.id, { + kind: 'Structure', + value, + fn: null, + }); + } + break; + } + case 'PropertyDelete': + case 'PropertyStore': + case 'ComputedDelete': + case 'ComputedStore': { + const target = env.get(instr.value.object.identifier.id); + let safe = null; + if (instr.value.kind === 'PropertyStore' && + target != null && + target.kind === 'Ref') { + safe = safeBlocks.find(entry => entry.ref === target.refId); + } + if (safe != null) { + retainWhere(safeBlocks, entry => entry !== safe); + } + else { + validateNoRefUpdate(errors, env, instr.value.object, instr.loc); + } + if (instr.value.kind === 'ComputedDelete' || + instr.value.kind === 'ComputedStore') { + validateNoRefValueAccess(errors, env, instr.value.property); + } + if (instr.value.kind === 'ComputedStore' || + instr.value.kind === 'PropertyStore') { + validateNoDirectRefValueAccess(errors, instr.value.value, env); + const type = env.get(instr.value.value.identifier.id); + if (type != null && type.kind === 'Structure') { + let objectType = type; + if (target != null) { + objectType = joinRefAccessTypes(objectType, target); + } + env.set(instr.value.object.identifier.id, objectType); + } + } + break; + } + case 'StartMemoize': + case 'FinishMemoize': + break; + case 'LoadGlobal': { + if (instr.value.binding.name === 'undefined') { + env.set(instr.lvalue.identifier.id, { kind: 'Nullable' }); + } + break; + } + case 'Primitive': { + if (instr.value.value == null) { + env.set(instr.lvalue.identifier.id, { kind: 'Nullable' }); + } + break; + } + case 'UnaryExpression': { + if (instr.value.operator === '!') { + const value = env.get(instr.value.value.identifier.id); + const refId = (value === null || value === void 0 ? void 0 : value.kind) === 'RefValue' && value.refId != null + ? value.refId + : null; + if (refId !== null) { + env.set(instr.lvalue.identifier.id, { kind: 'Guard', refId }); + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }) + .withDetails({ + kind: 'error', + loc: instr.value.value.loc, + message: `Cannot access ref value during render`, + }) + .withDetails({ + kind: 'hint', + message: 'To initialize a ref only once, check that the ref is null with the pattern `if (ref.current == null) { ref.current = ... }`', + })); + break; + } + } + validateNoRefValueAccess(errors, env, instr.value.value); + break; + } + case 'BinaryExpression': { + const left = env.get(instr.value.left.identifier.id); + const right = env.get(instr.value.right.identifier.id); + let nullish = false; + let refId = null; + if ((left === null || left === void 0 ? void 0 : left.kind) === 'RefValue' && left.refId != null) { + refId = left.refId; + } + else if ((right === null || right === void 0 ? void 0 : right.kind) === 'RefValue' && right.refId != null) { + refId = right.refId; + } + if ((left === null || left === void 0 ? void 0 : left.kind) === 'Nullable') { + nullish = true; + } + else if ((right === null || right === void 0 ? void 0 : right.kind) === 'Nullable') { + nullish = true; + } + if (refId !== null && nullish) { + env.set(instr.lvalue.identifier.id, { kind: 'Guard', refId }); + } + else { + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoRefValueAccess(errors, env, operand); + } + } + break; + } + default: { + for (const operand of eachInstructionValueOperand(instr.value)) { + validateNoRefValueAccess(errors, env, operand); + } + break; + } + } + for (const operand of eachInstructionOperand(instr)) { + guardCheck(errors, operand, env); + } + if (isUseRefType(instr.lvalue.identifier) && + ((_f = env.get(instr.lvalue.identifier.id)) === null || _f === void 0 ? void 0 : _f.kind) !== 'Ref') { + env.set(instr.lvalue.identifier.id, joinRefAccessTypes((_g = env.get(instr.lvalue.identifier.id)) !== null && _g !== void 0 ? _g : { kind: 'None' }, { kind: 'Ref', refId: nextRefId() })); + } + if (isRefValueType(instr.lvalue.identifier) && + ((_h = env.get(instr.lvalue.identifier.id)) === null || _h === void 0 ? void 0 : _h.kind) !== 'RefValue') { + env.set(instr.lvalue.identifier.id, joinRefAccessTypes((_j = env.get(instr.lvalue.identifier.id)) !== null && _j !== void 0 ? _j : { kind: 'None' }, { kind: 'RefValue', loc: instr.loc })); + } + } + if (block.terminal.kind === 'if') { + const test = env.get(block.terminal.test.identifier.id); + if ((test === null || test === void 0 ? void 0 : test.kind) === 'Guard' && + safeBlocks.find(entry => entry.ref === test.refId) == null) { + safeBlocks.push({ block: block.terminal.fallthrough, ref: test.refId }); + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + if (block.terminal.kind !== 'return') { + validateNoRefValueAccess(errors, env, operand); + if (block.terminal.kind !== 'if') { + guardCheck(errors, operand, env); + } + } + else { + validateNoDirectRefValueAccess(errors, operand, env); + guardCheck(errors, operand, env); + returnValues.push(env.get(operand.identifier.id)); + } + } + } + if (errors.hasAnyErrors()) { + return Err(errors); + } + } + CompilerError.invariant(!env.hasChanged(), { + reason: 'Ref type environment did not converge', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + }); + return Ok(joinRefAccessTypes(...returnValues.filter((env) => env !== undefined))); +} +function destructure(type) { + if ((type === null || type === void 0 ? void 0 : type.kind) === 'Structure' && type.value !== null) { + return destructure(type.value); + } + return type; +} +function guardCheck(errors, operand, env) { + var _a; + if (((_a = env.get(operand.identifier.id)) === null || _a === void 0 ? void 0 : _a.kind) === 'Guard') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: operand.loc, + message: `Cannot access ref value during render`, + })); + } +} +function validateNoRefValueAccess(errors, env, operand) { + var _a; + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'RefValue' || + ((type === null || type === void 0 ? void 0 : type.kind) === 'Structure' && ((_a = type.fn) === null || _a === void 0 ? void 0 : _a.readRefEffect))) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (type.kind === 'RefValue' && type.loc) || operand.loc, + message: `Cannot access ref value during render`, + })); + } +} +function validateNoRefPassedToFunction(errors, env, operand, loc) { + var _a; + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'Ref' || + (type === null || type === void 0 ? void 0 : type.kind) === 'RefValue' || + ((type === null || type === void 0 ? void 0 : type.kind) === 'Structure' && ((_a = type.fn) === null || _a === void 0 ? void 0 : _a.readRefEffect))) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (type.kind === 'RefValue' && type.loc) || loc, + message: `Passing a ref to a function may read its value during render`, + })); + } +} +function validateNoRefUpdate(errors, env, operand, loc) { + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'Ref' || (type === null || type === void 0 ? void 0 : type.kind) === 'RefValue') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (type.kind === 'RefValue' && type.loc) || loc, + message: `Cannot update ref during render`, + })); + } +} +function validateNoDirectRefValueAccess(errors, operand, env) { + var _a; + const type = destructure(env.get(operand.identifier.id)); + if ((type === null || type === void 0 ? void 0 : type.kind) === 'RefValue') { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Refs, + reason: 'Cannot access refs during render', + description: ERROR_DESCRIPTION, + }).withDetails({ + kind: 'error', + loc: (_a = type.loc) !== null && _a !== void 0 ? _a : operand.loc, + message: `Cannot access ref value during render`, + })); + } +} +const ERROR_DESCRIPTION = 'React refs are values that are not needed for rendering. Refs should only be accessed ' + + 'outside of render, such as in event handlers or effects. ' + + 'Accessing a ref value (the `current` property) during render can cause your component ' + + 'not to update as expected (https://react.dev/reference/react/useRef)'; + +function validateNoSetStateInRender(fn) { + const unconditionalSetStateFunctions = new Set(); + return validateNoSetStateInRenderImpl(fn, unconditionalSetStateFunctions); +} +function validateNoSetStateInRenderImpl(fn, unconditionalSetStateFunctions) { + const unconditionalBlocks = computeUnconditionalBlocks(fn); + let activeManualMemoId = null; + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'LoadLocal': { + if (unconditionalSetStateFunctions.has(instr.value.place.identifier.id)) { + unconditionalSetStateFunctions.add(instr.lvalue.identifier.id); + } + break; + } + case 'StoreLocal': { + if (unconditionalSetStateFunctions.has(instr.value.value.identifier.id)) { + unconditionalSetStateFunctions.add(instr.value.lvalue.place.identifier.id); + unconditionalSetStateFunctions.add(instr.lvalue.identifier.id); + } + break; + } + case 'ObjectMethod': + case 'FunctionExpression': { + if ([...eachInstructionValueOperand(instr.value)].some(operand => isSetStateType(operand.identifier) || + unconditionalSetStateFunctions.has(operand.identifier.id)) && + validateNoSetStateInRenderImpl(instr.value.loweredFunc.func, unconditionalSetStateFunctions).isErr()) { + unconditionalSetStateFunctions.add(instr.lvalue.identifier.id); + } + break; + } + case 'StartMemoize': { + CompilerError.invariant(activeManualMemoId === null, { + reason: 'Unexpected nested StartMemoize instructions', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + }); + activeManualMemoId = instr.value.manualMemoId; + break; + } + case 'FinishMemoize': { + CompilerError.invariant(activeManualMemoId === instr.value.manualMemoId, { + reason: 'Expected FinishMemoize to align with previous StartMemoize instruction', + description: null, + details: [ + { + kind: 'error', + loc: instr.value.loc, + message: null, + }, + ], + }); + activeManualMemoId = null; + break; + } + case 'CallExpression': { + const callee = instr.value.callee; + if (isSetStateType(callee.identifier) || + unconditionalSetStateFunctions.has(callee.identifier.id)) { + if (activeManualMemoId !== null) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.RenderSetState, + reason: 'Calling setState from useMemo may trigger an infinite loop', + description: 'Each time the memo callback is evaluated it will change state. This can cause a memoization dependency to change, running the memo function again and causing an infinite loop. Instead of setting state in useMemo(), prefer deriving the value during render. (https://react.dev/reference/react/useState)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: 'Found setState() within useMemo()', + })); + } + else if (unconditionalBlocks.has(block.id)) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.RenderSetState, + reason: 'Calling setState during render may trigger an infinite loop', + description: 'Calling setState during render will trigger another render, and can lead to infinite loops. (https://react.dev/reference/react/useState)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: 'Found setState() in render', + })); + } + } + break; + } + } + } + } + return errors.asResult(); +} + +function validatePreservedManualMemoization(fn) { + const state = { + errors: new CompilerError(), + manualMemoState: null, + }; + visitReactiveFunction(fn, new Visitor(), state); + return state.errors.asResult(); +} +function prettyPrintScopeDependency(val) { + var _a; + let rootStr; + if (((_a = val.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named') { + rootStr = val.identifier.name.value; + } + else { + rootStr = '[unnamed]'; + } + return `${rootStr}${val.path.map(v => `${v.optional ? '?.' : '.'}${v.property}`).join('')}`; +} +var CompareDependencyResult; +(function (CompareDependencyResult) { + CompareDependencyResult[CompareDependencyResult["Ok"] = 0] = "Ok"; + CompareDependencyResult[CompareDependencyResult["RootDifference"] = 1] = "RootDifference"; + CompareDependencyResult[CompareDependencyResult["PathDifference"] = 2] = "PathDifference"; + CompareDependencyResult[CompareDependencyResult["Subpath"] = 3] = "Subpath"; + CompareDependencyResult[CompareDependencyResult["RefAccessDifference"] = 4] = "RefAccessDifference"; +})(CompareDependencyResult || (CompareDependencyResult = {})); +function merge(a, b) { + return Math.max(a, b); +} +function getCompareDependencyResultDescription(result) { + switch (result) { + case CompareDependencyResult.Ok: + return 'Dependencies equal'; + case CompareDependencyResult.RootDifference: + case CompareDependencyResult.PathDifference: + return 'Inferred different dependency than source'; + case CompareDependencyResult.RefAccessDifference: + return 'Differences in ref.current access'; + case CompareDependencyResult.Subpath: + return 'Inferred less specific property than source'; + } +} +function compareDeps(inferred, source) { + const rootsEqual = (inferred.root.kind === 'Global' && + source.root.kind === 'Global' && + inferred.root.identifierName === source.root.identifierName) || + (inferred.root.kind === 'NamedLocal' && + source.root.kind === 'NamedLocal' && + inferred.root.value.identifier.id === source.root.value.identifier.id); + if (!rootsEqual) { + return CompareDependencyResult.RootDifference; + } + let isSubpath = true; + for (let i = 0; i < Math.min(inferred.path.length, source.path.length); i++) { + if (inferred.path[i].property !== source.path[i].property) { + isSubpath = false; + break; + } + else if (inferred.path[i].optional !== source.path[i].optional) { + return CompareDependencyResult.PathDifference; + } + } + if (isSubpath && + (source.path.length === inferred.path.length || + (inferred.path.length >= source.path.length && + !inferred.path.some(token => token.property === 'current')))) { + return CompareDependencyResult.Ok; + } + else { + if (isSubpath) { + if (source.path.some(token => token.property === 'current') || + inferred.path.some(token => token.property === 'current')) { + return CompareDependencyResult.RefAccessDifference; + } + else { + return CompareDependencyResult.Subpath; + } + } + else { + return CompareDependencyResult.PathDifference; + } + } +} +function validateInferredDep(dep, temporaries, declsWithinMemoBlock, validDepsInMemoBlock, errorState, memoLocation) { + var _a; + let normalizedDep; + const maybeNormalizedRoot = temporaries.get(dep.identifier.id); + if (maybeNormalizedRoot != null) { + normalizedDep = { + root: maybeNormalizedRoot.root, + path: [...maybeNormalizedRoot.path, ...dep.path], + }; + } + else { + CompilerError.invariant(((_a = dep.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named', { + reason: 'ValidatePreservedManualMemoization: expected scope dependency to be named', + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + normalizedDep = { + root: { + kind: 'NamedLocal', + value: { + kind: 'Identifier', + identifier: dep.identifier, + loc: GeneratedSource, + effect: Effect.Read, + reactive: false, + }, + }, + path: [...dep.path], + }; + } + for (const decl of declsWithinMemoBlock) { + if (normalizedDep.root.kind === 'NamedLocal' && + decl === normalizedDep.root.value.identifier.declarationId) { + return; + } + } + let errorDiagnostic = null; + for (const originalDep of validDepsInMemoBlock) { + const compareResult = compareDeps(normalizedDep, originalDep); + if (compareResult === CompareDependencyResult.Ok) { + return; + } + else { + errorDiagnostic = merge(errorDiagnostic !== null && errorDiagnostic !== void 0 ? errorDiagnostic : compareResult, compareResult); + } + } + errorState.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.PreserveManualMemo, + reason: 'Existing memoization could not be preserved', + description: [ + 'React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. ', + 'The inferred dependencies did not match the manually specified dependencies, which could cause the value to change more or less frequently than expected. ', + (dep.identifier.name != null && dep.identifier.name.kind === 'named') + ? `The inferred dependency was \`${prettyPrintScopeDependency(dep)}\`, but the source dependencies were [${validDepsInMemoBlock + .map(dep => printManualMemoDependency(dep, true)) + .join(', ')}]. ${errorDiagnostic + ? getCompareDependencyResultDescription(errorDiagnostic) + : 'Inferred dependency not present in source'}` + : '', + ] + .join('') + .trim(), + suggestions: null, + }).withDetails({ + kind: 'error', + loc: memoLocation, + message: 'Could not preserve existing manual memoization', + })); +} +class Visitor extends ReactiveFunctionVisitor { + constructor() { + super(...arguments); + this.scopes = new Set(); + this.prunedScopes = new Set(); + this.temporaries = new Map(); + } + recordDepsInValue(value, state) { + var _a, _b; + switch (value.kind) { + case 'SequenceExpression': { + for (const instr of value.instructions) { + this.visitInstruction(instr, state); + } + this.recordDepsInValue(value.value, state); + break; + } + case 'OptionalExpression': { + this.recordDepsInValue(value.value, state); + break; + } + case 'ConditionalExpression': { + this.recordDepsInValue(value.test, state); + this.recordDepsInValue(value.consequent, state); + this.recordDepsInValue(value.alternate, state); + break; + } + case 'LogicalExpression': { + this.recordDepsInValue(value.left, state); + this.recordDepsInValue(value.right, state); + break; + } + default: { + collectMaybeMemoDependencies(value, this.temporaries, false); + if (value.kind === 'StoreLocal' || + value.kind === 'StoreContext' || + value.kind === 'Destructure') { + for (const storeTarget of eachInstructionValueLValue(value)) { + (_a = state.manualMemoState) === null || _a === void 0 ? void 0 : _a.decls.add(storeTarget.identifier.declarationId); + if (((_b = storeTarget.identifier.name) === null || _b === void 0 ? void 0 : _b.kind) === 'named') { + this.temporaries.set(storeTarget.identifier.id, { + root: { + kind: 'NamedLocal', + value: storeTarget, + }, + path: [], + }); + } + } + } + break; + } + } + } + recordTemporaries(instr, state) { + var _a; + const temporaries = this.temporaries; + const { lvalue, value } = instr; + const lvalId = lvalue === null || lvalue === void 0 ? void 0 : lvalue.identifier.id; + if (lvalId != null && temporaries.has(lvalId)) { + return; + } + const isNamedLocal = ((_a = lvalue === null || lvalue === void 0 ? void 0 : lvalue.identifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named'; + if (lvalue !== null && isNamedLocal && state.manualMemoState != null) { + state.manualMemoState.decls.add(lvalue.identifier.declarationId); + } + this.recordDepsInValue(value, state); + if (lvalue != null) { + temporaries.set(lvalue.identifier.id, { + root: { + kind: 'NamedLocal', + value: Object.assign({}, lvalue), + }, + path: [], + }); + } + } + visitScope(scopeBlock, state) { + this.traverseScope(scopeBlock, state); + if (state.manualMemoState != null && + state.manualMemoState.depsFromSource != null) { + for (const dep of scopeBlock.scope.dependencies) { + validateInferredDep(dep, this.temporaries, state.manualMemoState.decls, state.manualMemoState.depsFromSource, state.errors, state.manualMemoState.loc); + } + } + this.scopes.add(scopeBlock.scope.id); + for (const id of scopeBlock.scope.merged) { + this.scopes.add(id); + } + } + visitPrunedScope(scopeBlock, state) { + this.traversePrunedScope(scopeBlock, state); + this.prunedScopes.add(scopeBlock.scope.id); + } + visitInstruction(instruction, state) { + var _a, _b, _c; + this.recordTemporaries(instruction, state); + const value = instruction.value; + if (value.kind === 'StoreLocal' && + value.lvalue.kind === 'Reassign' && + state.manualMemoState != null) { + const ids = getOrInsertDefault(state.manualMemoState.reassignments, value.lvalue.place.identifier.declarationId, new Set()); + ids.add(value.value.identifier); + } + if (value.kind === 'LoadLocal' && + value.place.identifier.scope != null && + instruction.lvalue != null && + instruction.lvalue.identifier.scope == null && + state.manualMemoState != null) { + const ids = getOrInsertDefault(state.manualMemoState.reassignments, instruction.lvalue.identifier.declarationId, new Set()); + ids.add(value.place.identifier); + } + if (value.kind === 'StartMemoize') { + let depsFromSource = null; + if (value.deps != null) { + depsFromSource = value.deps; + } + CompilerError.invariant(state.manualMemoState == null, { + reason: 'Unexpected nested StartMemoize instructions', + description: `Bad manual memoization ids: ${(_a = state.manualMemoState) === null || _a === void 0 ? void 0 : _a.manualMemoId}, ${value.manualMemoId}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: null, + }, + ], + suggestions: null, + }); + state.manualMemoState = { + loc: instruction.loc, + decls: new Set(), + depsFromSource, + manualMemoId: value.manualMemoId, + reassignments: new Map(), + }; + for (const { identifier, loc } of eachInstructionValueOperand(value)) { + if (identifier.scope != null && + !this.scopes.has(identifier.scope.id) && + !this.prunedScopes.has(identifier.scope.id)) { + state.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.PreserveManualMemo, + reason: 'Existing memoization could not be preserved', + description: [ + 'React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. ', + 'This dependency may be mutated later, which could cause the value to change unexpectedly', + ].join(''), + }).withDetails({ + kind: 'error', + loc, + message: 'This dependency may be modified later', + })); + } + } + } + if (value.kind === 'FinishMemoize') { + CompilerError.invariant(state.manualMemoState != null && + state.manualMemoState.manualMemoId === value.manualMemoId, { + reason: 'Unexpected mismatch between StartMemoize and FinishMemoize', + description: `Encountered StartMemoize id=${(_b = state.manualMemoState) === null || _b === void 0 ? void 0 : _b.manualMemoId} followed by FinishMemoize id=${value.manualMemoId}`, + details: [ + { + kind: 'error', + loc: value.loc, + message: null, + }, + ], + suggestions: null, + }); + const reassignments = state.manualMemoState.reassignments; + state.manualMemoState = null; + if (!value.pruned) { + for (const { identifier, loc } of eachInstructionValueOperand(value)) { + let decls; + if (identifier.scope == null) { + decls = (_c = reassignments.get(identifier.declarationId)) !== null && _c !== void 0 ? _c : [identifier]; + } + else { + decls = [identifier]; + } + for (const identifier of decls) { + if (isUnmemoized(identifier, this.scopes)) { + state.errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.PreserveManualMemo, + reason: 'Existing memoization could not be preserved', + description: [ + 'React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. This value was memoized in source but not in compilation output', + '', + ] + .join('') + .trim(), + }).withDetails({ + kind: 'error', + loc, + message: 'Could not preserve existing memoization', + })); + } + } + } + } + } + } +} +function isUnmemoized(operand, scopes) { + return operand.scope != null && !scopes.has(operand.scope.id); +} + +function validateUseMemo(fn) { + const errors = new CompilerError(); + const useMemos = new Set(); + const react = new Set(); + const functions = new Map(); + for (const [, block] of fn.body.blocks) { + for (const { lvalue, value } of block.instructions) { + switch (value.kind) { + case 'LoadGlobal': { + if (value.binding.name === 'useMemo') { + useMemos.add(lvalue.identifier.id); + } + else if (value.binding.name === 'React') { + react.add(lvalue.identifier.id); + } + break; + } + case 'PropertyLoad': { + if (react.has(value.object.identifier.id)) { + if (value.property === 'useMemo') { + useMemos.add(lvalue.identifier.id); + } + } + break; + } + case 'FunctionExpression': { + functions.set(lvalue.identifier.id, value); + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = value.kind === 'CallExpression' + ? value.callee.identifier.id + : value.property.identifier.id; + const isUseMemo = useMemos.has(callee); + if (!isUseMemo || value.args.length === 0) { + continue; + } + const [arg] = value.args; + if (arg.kind !== 'Identifier') { + continue; + } + const body = functions.get(arg.identifier.id); + if (body === undefined) { + continue; + } + if (body.loweredFunc.func.params.length > 0) { + const firstParam = body.loweredFunc.func.params[0]; + const loc = firstParam.kind === 'Identifier' + ? firstParam.loc + : firstParam.place.loc; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: 'useMemo() callbacks may not accept parameters', + description: 'useMemo() callbacks are called by React to cache calculations across re-renders. They should not take parameters. Instead, directly reference the props, state, or local variables needed for the computation', + suggestions: null, + }).withDetails({ + kind: 'error', + loc, + message: 'Callbacks with parameters are not supported', + })); + } + if (body.loweredFunc.func.async || body.loweredFunc.func.generator) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.UseMemo, + reason: 'useMemo() callbacks may not be async or generator functions', + description: 'useMemo() callbacks are called once and must synchronously return a value', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: body.loc, + message: 'Async and generator functions are not supported', + })); + } + break; + } + } + } + } + return errors.asResult(); +} + +function validateLocalsNotReassignedAfterRender(fn) { + const contextVariables = new Set(); + const reassignment = getContextReassignment(fn, contextVariables, false, false); + if (reassignment !== null) { + const errors = new CompilerError(); + const variable = reassignment.identifier.name != null && + reassignment.identifier.name.kind === 'named' + ? `\`${reassignment.identifier.name.value}\`` + : 'variable'; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot reassign variable after render completes', + description: `Reassigning ${variable} after render has completed can cause inconsistent behavior on subsequent renders. Consider using state instead`, + }).withDetails({ + kind: 'error', + loc: reassignment.loc, + message: `Cannot reassign ${variable} after render completes`, + })); + throw errors; + } +} +function getContextReassignment(fn, contextVariables, isFunctionExpression, isAsync) { + const reassigningFunctions = new Map(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'FunctionExpression': + case 'ObjectMethod': { + let reassignment = getContextReassignment(value.loweredFunc.func, contextVariables, true, isAsync || value.loweredFunc.func.async); + if (reassignment === null) { + for (const operand of eachInstructionValueOperand(value)) { + const reassignmentFromOperand = reassigningFunctions.get(operand.identifier.id); + if (reassignmentFromOperand !== undefined) { + reassignment = reassignmentFromOperand; + break; + } + } + } + if (reassignment !== null) { + if (isAsync || value.loweredFunc.func.async) { + const errors = new CompilerError(); + const variable = reassignment.identifier.name !== null && + reassignment.identifier.name.kind === 'named' + ? `\`${reassignment.identifier.name.value}\`` + : 'variable'; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot reassign variable in async function', + description: 'Reassigning a variable in an async function can cause inconsistent behavior on subsequent renders. Consider using state instead', + }).withDetails({ + kind: 'error', + loc: reassignment.loc, + message: `Cannot reassign ${variable}`, + })); + throw errors; + } + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + case 'StoreLocal': { + const reassignment = reassigningFunctions.get(value.value.identifier.id); + if (reassignment !== undefined) { + reassigningFunctions.set(value.lvalue.place.identifier.id, reassignment); + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + case 'LoadLocal': { + const reassignment = reassigningFunctions.get(value.place.identifier.id); + if (reassignment !== undefined) { + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + case 'DeclareContext': { + if (!isFunctionExpression) { + contextVariables.add(value.lvalue.place.identifier.id); + } + break; + } + case 'StoreContext': { + if (isFunctionExpression) { + if (contextVariables.has(value.lvalue.place.identifier.id)) { + return value.lvalue.place; + } + } + else { + contextVariables.add(value.lvalue.place.identifier.id); + } + const reassignment = reassigningFunctions.get(value.value.identifier.id); + if (reassignment !== undefined) { + reassigningFunctions.set(value.lvalue.place.identifier.id, reassignment); + reassigningFunctions.set(lvalue.identifier.id, reassignment); + } + break; + } + default: { + let operands = eachInstructionValueOperand(value); + if (value.kind === 'CallExpression') { + const signature = getFunctionCallSignature(fn.env, value.callee.identifier.type); + if (signature === null || signature === void 0 ? void 0 : signature.noAlias) { + operands = [value.callee]; + } + } + else if (value.kind === 'MethodCall') { + const signature = getFunctionCallSignature(fn.env, value.property.identifier.type); + if (signature === null || signature === void 0 ? void 0 : signature.noAlias) { + operands = [value.receiver, value.property]; + } + } + else if (value.kind === 'TaggedTemplateExpression') { + const signature = getFunctionCallSignature(fn.env, value.tag.identifier.type); + if (signature === null || signature === void 0 ? void 0 : signature.noAlias) { + operands = [value.tag]; + } + } + for (const operand of operands) { + CompilerError.invariant(operand.effect !== Effect.Unknown, { + reason: `Expected effects to be inferred prior to ValidateLocalsNotReassignedAfterRender`, + description: null, + details: [ + { + kind: 'error', + loc: operand.loc, + message: '', + }, + ], + }); + const reassignment = reassigningFunctions.get(operand.identifier.id); + if (reassignment !== undefined) { + if (operand.effect === Effect.Freeze) { + return reassignment; + } + else { + for (const lval of eachInstructionLValue(instr)) { + reassigningFunctions.set(lval.identifier.id, reassignment); + } + } + } + } + break; + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + const reassignment = reassigningFunctions.get(operand.identifier.id); + if (reassignment !== undefined) { + return reassignment; + } + } + } + return null; +} + +function outlineFunctions(fn, fbtOperands) { + var _a; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'FunctionExpression' || + value.kind === 'ObjectMethod') { + outlineFunctions(value.loweredFunc.func, fbtOperands); + } + if (value.kind === 'FunctionExpression' && + value.loweredFunc.func.context.length === 0 && + value.loweredFunc.func.id === null && + !fbtOperands.has(lvalue.identifier.id)) { + const loweredFunc = value.loweredFunc.func; + const id = fn.env.generateGloballyUniqueIdentifierName((_a = loweredFunc.id) !== null && _a !== void 0 ? _a : loweredFunc.nameHint); + loweredFunc.id = id.value; + fn.env.outlineFunction(loweredFunc, null); + instr.value = { + kind: 'LoadGlobal', + binding: { + kind: 'Global', + name: id.value, + }, + loc: value.loc, + }; + } + } + } +} + +function lowerContextAccess(fn, loweredContextCalleeConfig) { + const contextAccess = new Map(); + const contextKeys = new Map(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'CallExpression' && + isUseContextHookType(value.callee.identifier)) { + contextAccess.set(lvalue.identifier.id, value); + continue; + } + if (value.kind !== 'Destructure') { + continue; + } + const destructureId = value.value.identifier.id; + if (!contextAccess.has(destructureId)) { + continue; + } + const keys = getContextKeys(value); + if (keys === null) { + return; + } + if (contextKeys.has(destructureId)) { + return; + } + else { + contextKeys.set(destructureId, keys); + } + } + } + let importLoweredContextCallee = null; + if (contextAccess.size > 0 && contextKeys.size > 0) { + for (const [, block] of fn.body.blocks) { + let nextInstructions = null; + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + const { lvalue, value } = instr; + if (value.kind === 'CallExpression' && + isUseContextHookType(value.callee.identifier) && + contextKeys.has(lvalue.identifier.id)) { + importLoweredContextCallee !== null && importLoweredContextCallee !== void 0 ? importLoweredContextCallee : (importLoweredContextCallee = fn.env.programContext.addImportSpecifier(loweredContextCalleeConfig)); + const loweredContextCalleeInstr = emitLoadLoweredContextCallee(fn.env, importLoweredContextCallee); + if (nextInstructions === null) { + nextInstructions = block.instructions.slice(0, i); + } + nextInstructions.push(loweredContextCalleeInstr); + const keys = contextKeys.get(lvalue.identifier.id); + const selectorFnInstr = emitSelectorFn(fn.env, keys); + nextInstructions.push(selectorFnInstr); + const lowerContextCallId = loweredContextCalleeInstr.lvalue; + value.callee = lowerContextCallId; + const selectorFn = selectorFnInstr.lvalue; + value.args.push(selectorFn); + } + if (nextInstructions) { + nextInstructions.push(instr); + } + } + if (nextInstructions) { + block.instructions = nextInstructions; + } + } + markInstructionIds(fn.body); + inferTypes(fn); + } +} +function emitLoadLoweredContextCallee(env, importedLowerContextCallee) { + const loadGlobal = { + kind: 'LoadGlobal', + binding: Object.assign({}, importedLowerContextCallee), + loc: GeneratedSource, + }; + return { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: createTemporaryPlace(env, GeneratedSource), + effects: null, + value: loadGlobal, + }; +} +function getContextKeys(value) { + const keys = []; + const pattern = value.lvalue.pattern; + switch (pattern.kind) { + case 'ArrayPattern': { + return null; + } + case 'ObjectPattern': { + for (const place of pattern.properties) { + if (place.kind !== 'ObjectProperty' || + place.type !== 'property' || + place.key.kind !== 'identifier' || + place.place.identifier.name === null || + place.place.identifier.name.kind !== 'named') { + return null; + } + keys.push(place.key.name); + } + return keys; + } + } +} +function emitPropertyLoad(env, obj, property) { + const loadObj = { + kind: 'LoadLocal', + place: obj, + loc: GeneratedSource, + }; + const object = createTemporaryPlace(env, GeneratedSource); + const loadLocalInstr = { + lvalue: object, + value: loadObj, + id: makeInstructionId(0), + effects: null, + loc: GeneratedSource, + }; + const loadProp = { + kind: 'PropertyLoad', + object, + property: makePropertyLiteral(property), + loc: GeneratedSource, + }; + const element = createTemporaryPlace(env, GeneratedSource); + const loadPropInstr = { + lvalue: element, + value: loadProp, + id: makeInstructionId(0), + effects: null, + loc: GeneratedSource, + }; + return { + instructions: [loadLocalInstr, loadPropInstr], + element: element, + }; +} +function emitSelectorFn(env, keys) { + const obj = createTemporaryPlace(env, GeneratedSource); + promoteTemporary(obj.identifier); + const instr = []; + const elements = []; + for (const key of keys) { + const { instructions, element: prop } = emitPropertyLoad(env, obj, key); + instr.push(...instructions); + elements.push(prop); + } + const arrayInstr = emitArrayInstr(elements, env); + instr.push(arrayInstr); + const block = { + kind: 'block', + id: makeBlockId(0), + instructions: instr, + terminal: { + id: makeInstructionId(0), + kind: 'return', + returnVariant: 'Explicit', + loc: GeneratedSource, + value: arrayInstr.lvalue, + effects: null, + }, + preds: new Set(), + phis: new Set(), + }; + const fn = { + loc: GeneratedSource, + id: null, + nameHint: null, + fnType: 'Other', + env, + params: [obj], + returnTypeAnnotation: null, + returns: createTemporaryPlace(env, GeneratedSource), + context: [], + body: { + entry: block.id, + blocks: new Map([[block.id, block]]), + }, + generator: false, + async: false, + directives: [], + aliasingEffects: [], + }; + reversePostorderBlocks(fn.body); + markInstructionIds(fn.body); + enterSSA(fn); + inferTypes(fn); + const fnInstr = { + id: makeInstructionId(0), + value: { + kind: 'FunctionExpression', + name: null, + nameHint: null, + loweredFunc: { + func: fn, + }, + type: 'ArrowFunctionExpression', + loc: GeneratedSource, + }, + lvalue: createTemporaryPlace(env, GeneratedSource), + effects: null, + loc: GeneratedSource, + }; + return fnInstr; +} +function emitArrayInstr(elements, env) { + const array = { + kind: 'ArrayExpression', + elements, + loc: GeneratedSource, + }; + const arrayLvalue = createTemporaryPlace(env, GeneratedSource); + const arrayInstr = { + id: makeInstructionId(0), + value: array, + lvalue: arrayLvalue, + effects: null, + loc: GeneratedSource, + }; + return arrayInstr; +} + +function validateNoSetStateInEffects(fn, env) { + const setStateFunctions = new Map(); + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'LoadLocal': { + if (setStateFunctions.has(instr.value.place.identifier.id)) { + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.place); + } + break; + } + case 'StoreLocal': { + if (setStateFunctions.has(instr.value.value.identifier.id)) { + setStateFunctions.set(instr.value.lvalue.place.identifier.id, instr.value.value); + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.value); + } + break; + } + case 'FunctionExpression': { + if ([...eachInstructionValueOperand(instr.value)].some(operand => isSetStateType(operand.identifier) || + setStateFunctions.has(operand.identifier.id))) { + const callee = getSetStateCall(instr.value.loweredFunc.func, setStateFunctions, env); + if (callee !== null) { + setStateFunctions.set(instr.lvalue.identifier.id, callee); + } + } + break; + } + case 'MethodCall': + case 'CallExpression': { + const callee = instr.value.kind === 'MethodCall' + ? instr.value.receiver + : instr.value.callee; + if (isUseEffectHookType(callee.identifier) || + isUseLayoutEffectHookType(callee.identifier) || + isUseInsertionEffectHookType(callee.identifier)) { + const arg = instr.value.args[0]; + if (arg !== undefined && arg.kind === 'Identifier') { + const setState = setStateFunctions.get(arg.identifier.id); + if (setState !== undefined) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.EffectSetState, + reason: 'Calling setState synchronously within an effect can trigger cascading renders', + description: 'Effects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. ' + + 'In general, the body of an effect should do one or both of the following:\n' + + '* Update external systems with the latest state from React.\n' + + '* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\n' + + 'Calling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. ' + + '(https://react.dev/learn/you-might-not-need-an-effect)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: setState.loc, + message: 'Avoid calling setState() directly within an effect', + })); + } + } + } + break; + } + } + } + } + return errors.asResult(); +} +function getSetStateCall(fn, setStateFunctions, env) { + const refDerivedValues = new Set(); + const isDerivedFromRef = (place) => { + return (refDerivedValues.has(place.identifier.id) || + isUseRefType(place.identifier) || + isRefValueType(place.identifier)); + }; + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (env.config.enableAllowSetStateFromRefsInEffects) { + const hasRefOperand = Iterable_some(eachInstructionValueOperand(instr.value), isDerivedFromRef); + if (hasRefOperand) { + for (const lvalue of eachInstructionLValue(instr)) { + refDerivedValues.add(lvalue.identifier.id); + } + } + if (instr.value.kind === 'PropertyLoad' && + instr.value.property === 'current' && + (isUseRefType(instr.value.object.identifier) || + isRefValueType(instr.value.object.identifier))) { + refDerivedValues.add(instr.lvalue.identifier.id); + } + } + switch (instr.value.kind) { + case 'LoadLocal': { + if (setStateFunctions.has(instr.value.place.identifier.id)) { + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.place); + } + break; + } + case 'StoreLocal': { + if (setStateFunctions.has(instr.value.value.identifier.id)) { + setStateFunctions.set(instr.value.lvalue.place.identifier.id, instr.value.value); + setStateFunctions.set(instr.lvalue.identifier.id, instr.value.value); + } + break; + } + case 'CallExpression': { + const callee = instr.value.callee; + if (isSetStateType(callee.identifier) || + setStateFunctions.has(callee.identifier.id)) { + if (env.config.enableAllowSetStateFromRefsInEffects) { + const arg = instr.value.args.at(0); + if (arg !== undefined && + arg.kind === 'Identifier' && + refDerivedValues.has(arg.identifier.id)) { + return null; + } + } + return callee; + } + } + } + } + } + return null; +} + +function validateNoJSXInTryStatement(fn) { + const activeTryBlocks = []; + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + retainWhere(activeTryBlocks, id => id !== block.id); + if (activeTryBlocks.length !== 0) { + for (const instr of block.instructions) { + const { value } = instr; + switch (value.kind) { + case 'JsxExpression': + case 'JsxFragment': { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.ErrorBoundaries, + reason: 'Avoid constructing JSX within try/catch', + description: `React does not immediately render components when JSX is rendered, so any errors from this component will not be caught by the try/catch. To catch errors in rendering a given component, wrap that component in an error boundary. (https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary)`, + }).withDetails({ + kind: 'error', + loc: value.loc, + message: 'Avoid constructing JSX within try/catch', + })); + break; + } + } + } + } + if (block.terminal.kind === 'try') { + activeTryBlocks.push(block.terminal.handler); + } + } + return errors.asResult(); +} + +function outlineJSX(fn) { + const outlinedFns = []; + outlineJsxImpl(fn, outlinedFns); + for (const outlinedFn of outlinedFns) { + fn.env.outlineFunction(outlinedFn, 'Component'); + } +} +function outlineJsxImpl(fn, outlinedFns) { + const globals = new Map(); + function processAndOutlineJSX(state, rewriteInstr) { + if (state.jsx.length <= 1) { + return; + } + const result = process$1(fn, [...state.jsx].sort((a, b) => a.id - b.id), globals); + if (result) { + outlinedFns.push(result.fn); + rewriteInstr.set(state.jsx.at(0).id, result.instrs); + } + } + for (const [, block] of fn.body.blocks) { + const rewriteInstr = new Map(); + let state = { + jsx: [], + children: new Set(), + }; + for (let i = block.instructions.length - 1; i >= 0; i--) { + const instr = block.instructions[i]; + const { value, lvalue } = instr; + switch (value.kind) { + case 'LoadGlobal': { + globals.set(lvalue.identifier.id, instr); + break; + } + case 'FunctionExpression': { + outlineJsxImpl(value.loweredFunc.func, outlinedFns); + break; + } + case 'JsxExpression': { + if (!state.children.has(lvalue.identifier.id)) { + processAndOutlineJSX(state, rewriteInstr); + state = { + jsx: [], + children: new Set(), + }; + } + state.jsx.push(instr); + if (value.children) { + for (const child of value.children) { + state.children.add(child.identifier.id); + } + } + break; + } + case 'ArrayExpression': + case 'Await': + case 'BinaryExpression': + case 'CallExpression': + case 'ComputedDelete': + case 'ComputedLoad': + case 'ComputedStore': + case 'Debugger': + case 'DeclareContext': + case 'DeclareLocal': + case 'Destructure': + case 'FinishMemoize': + case 'GetIterator': + case 'IteratorNext': + case 'JSXText': + case 'JsxFragment': + case 'LoadContext': + case 'LoadLocal': + case 'MetaProperty': + case 'MethodCall': + case 'NewExpression': + case 'NextPropertyOf': + case 'ObjectExpression': + case 'ObjectMethod': + case 'PostfixUpdate': + case 'PrefixUpdate': + case 'Primitive': + case 'PropertyDelete': + case 'PropertyLoad': + case 'PropertyStore': + case 'RegExpLiteral': + case 'StartMemoize': + case 'StoreContext': + case 'StoreGlobal': + case 'StoreLocal': + case 'TaggedTemplateExpression': + case 'TemplateLiteral': + case 'TypeCastExpression': + case 'UnsupportedNode': + case 'UnaryExpression': { + break; + } + default: { + assertExhaustive$1(value, `Unexpected instruction: ${value}`); + } + } + } + processAndOutlineJSX(state, rewriteInstr); + if (rewriteInstr.size > 0) { + const newInstrs = []; + for (let i = 0; i < block.instructions.length; i++) { + const id = i + 1; + if (rewriteInstr.has(id)) { + const instrs = rewriteInstr.get(id); + newInstrs.push(...instrs); + } + else { + newInstrs.push(block.instructions[i]); + } + } + block.instructions = newInstrs; + } + deadCodeElimination(fn); + } +} +function process$1(fn, jsx, globals) { + if (fn.fnType === 'Component') { + return null; + } + const props = collectProps(fn.env, jsx); + if (!props) + return null; + const outlinedTag = fn.env.generateGloballyUniqueIdentifierName(null).value; + const newInstrs = emitOutlinedJsx(fn.env, jsx, props, outlinedTag); + if (!newInstrs) + return null; + const outlinedFn = emitOutlinedFn(fn.env, jsx, props, globals); + if (!outlinedFn) + return null; + outlinedFn.id = outlinedTag; + return { instrs: newInstrs, fn: outlinedFn }; +} +function collectProps(env, instructions) { + let id = 1; + function generateName(oldName) { + let newName = oldName; + while (seen.has(newName)) { + newName = `${oldName}${id++}`; + } + seen.add(newName); + env.programContext.addNewReference(newName); + return newName; + } + const attributes = []; + const jsxIds = new Set(instructions.map(i => i.lvalue.identifier.id)); + const seen = new Set(); + for (const instr of instructions) { + const { value } = instr; + for (const at of value.props) { + if (at.kind === 'JsxSpreadAttribute') { + return null; + } + if (at.kind === 'JsxAttribute') { + const newName = generateName(at.name); + attributes.push({ + originalName: at.name, + newName, + place: at.place, + }); + } + } + if (value.children) { + for (const child of value.children) { + if (jsxIds.has(child.identifier.id)) { + continue; + } + promoteTemporary(child.identifier); + const newName = generateName('t'); + attributes.push({ + originalName: child.identifier.name.value, + newName: newName, + place: child, + }); + } + } + } + return attributes; +} +function emitOutlinedJsx(env, instructions, outlinedProps, outlinedTag) { + const props = outlinedProps.map(p => ({ + kind: 'JsxAttribute', + name: p.newName, + place: p.place, + })); + const loadJsx = { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: createTemporaryPlace(env, GeneratedSource), + value: { + kind: 'LoadGlobal', + binding: { + kind: 'ModuleLocal', + name: outlinedTag, + }, + loc: GeneratedSource, + }, + effects: null, + }; + promoteTemporaryJsxTag(loadJsx.lvalue.identifier); + const jsxExpr = { + id: makeInstructionId(0), + loc: GeneratedSource, + lvalue: instructions.at(-1).lvalue, + value: { + kind: 'JsxExpression', + tag: Object.assign({}, loadJsx.lvalue), + props, + children: null, + loc: GeneratedSource, + openingLoc: GeneratedSource, + closingLoc: GeneratedSource, + }, + effects: null, + }; + return [loadJsx, jsxExpr]; +} +function emitOutlinedFn(env, jsx, oldProps, globals) { + const instructions = []; + const oldToNewProps = createOldToNewPropsMapping(env, oldProps); + const propsObj = createTemporaryPlace(env, GeneratedSource); + promoteTemporary(propsObj.identifier); + const destructurePropsInstr = emitDestructureProps(env, propsObj, oldToNewProps); + instructions.push(destructurePropsInstr); + const updatedJsxInstructions = emitUpdatedJsx(jsx, oldToNewProps); + const loadGlobalInstrs = emitLoadGlobals(jsx, globals); + if (!loadGlobalInstrs) { + return null; + } + instructions.push(...loadGlobalInstrs); + instructions.push(...updatedJsxInstructions); + const block = { + kind: 'block', + id: makeBlockId(0), + instructions, + terminal: { + id: makeInstructionId(0), + kind: 'return', + returnVariant: 'Explicit', + loc: GeneratedSource, + value: instructions.at(-1).lvalue, + effects: null, + }, + preds: new Set(), + phis: new Set(), + }; + const fn = { + loc: GeneratedSource, + id: null, + nameHint: null, + fnType: 'Other', + env, + params: [propsObj], + returnTypeAnnotation: null, + returns: createTemporaryPlace(env, GeneratedSource), + context: [], + body: { + entry: block.id, + blocks: new Map([[block.id, block]]), + }, + generator: false, + async: false, + directives: [], + aliasingEffects: [], + }; + return fn; +} +function emitLoadGlobals(jsx, globals) { + const instructions = []; + for (const { value } of jsx) { + if (value.tag.kind === 'Identifier') { + const loadGlobalInstr = globals.get(value.tag.identifier.id); + if (!loadGlobalInstr) { + return null; + } + instructions.push(loadGlobalInstr); + } + } + return instructions; +} +function emitUpdatedJsx(jsx, oldToNewProps) { + const newInstrs = []; + const jsxIds = new Set(jsx.map(i => i.lvalue.identifier.id)); + for (const instr of jsx) { + const { value } = instr; + const newProps = []; + for (const prop of value.props) { + invariant(prop.kind === 'JsxAttribute', `Expected only attributes but found ${prop.kind}`); + if (prop.name === 'key') { + continue; + } + const newProp = oldToNewProps.get(prop.place.identifier.id); + invariant(newProp !== undefined, `Expected a new property for ${printIdentifier(prop.place.identifier)}`); + newProps.push({ + kind: 'JsxAttribute', + name: newProp.originalName, + place: newProp.place, + }); + } + let newChildren = null; + if (value.children) { + newChildren = []; + for (const child of value.children) { + if (jsxIds.has(child.identifier.id)) { + newChildren.push(Object.assign({}, child)); + continue; + } + const newChild = oldToNewProps.get(child.identifier.id); + invariant(newChild !== undefined, `Expected a new prop for ${printIdentifier(child.identifier)}`); + newChildren.push(Object.assign({}, newChild.place)); + } + } + newInstrs.push(Object.assign(Object.assign({}, instr), { value: Object.assign(Object.assign({}, value), { props: newProps, children: newChildren }) })); + } + return newInstrs; +} +function createOldToNewPropsMapping(env, oldProps) { + const oldToNewProps = new Map(); + for (const oldProp of oldProps) { + if (oldProp.originalName === 'key') { + continue; + } + const newProp = Object.assign(Object.assign({}, oldProp), { place: createTemporaryPlace(env, GeneratedSource) }); + newProp.place.identifier.name = makeIdentifierName(oldProp.newName); + oldToNewProps.set(oldProp.place.identifier.id, newProp); + } + return oldToNewProps; +} +function emitDestructureProps(env, propsObj, oldToNewProps) { + const properties = []; + for (const [_, prop] of oldToNewProps) { + properties.push({ + kind: 'ObjectProperty', + key: { + kind: 'string', + name: prop.newName, + }, + type: 'property', + place: prop.place, + }); + } + const destructurePropsInstr = { + id: makeInstructionId(0), + lvalue: createTemporaryPlace(env, GeneratedSource), + loc: GeneratedSource, + value: { + kind: 'Destructure', + lvalue: { + pattern: { + kind: 'ObjectPattern', + properties, + }, + kind: InstructionKind.Let, + }, + loc: GeneratedSource, + value: propsObj, + }, + effects: null, + }; + return destructurePropsInstr; +} + +function optimizePropsMethodCalls(fn) { + for (const [, block] of fn.body.blocks) { + for (let i = 0; i < block.instructions.length; i++) { + const instr = block.instructions[i]; + if (instr.value.kind === 'MethodCall' && + isPropsType(instr.value.receiver.identifier)) { + instr.value = { + kind: 'CallExpression', + callee: instr.value.property, + args: instr.value.args, + loc: instr.value.loc, + }; + } + } + } +} + +var _Context_env, _Context_errors, _Context_callExpressions, _Context_functionExpressions, _Context_loadLocals, _Context_fireCalleesToFireFunctions, _Context_calleesWithInsertedFire, _Context_capturedCalleeIdentifierIds, _Context_inUseEffectLambda, _Context_loadGlobalInstructionIds, _Context_arrayExpressions; +const CANNOT_COMPILE_FIRE = 'Cannot compile `fire`'; +function transformFire(fn) { + const context = new Context(fn.env); + replaceFireFunctions(fn, context); + if (!context.hasErrors()) { + ensureNoMoreFireUses(fn, context); + } + context.throwIfErrorsFound(); +} +function replaceFireFunctions(fn, context) { + let importedUseFire = null; + let hasRewrite = false; + for (const [, block] of fn.body.blocks) { + const rewriteInstrs = new Map(); + const deleteInstrs = new Set(); + for (const instr of block.instructions) { + const { value, lvalue } = instr; + if (value.kind === 'CallExpression' && + isUseEffectHookType(value.callee.identifier) && + value.args.length > 0 && + value.args[0].kind === 'Identifier') { + const lambda = context.getFunctionExpression(value.args[0].identifier.id); + if (lambda != null) { + const capturedCallees = visitFunctionExpressionAndPropagateFireDependencies(lambda, context, true); + const newInstrs = []; + for (const [fireCalleePlace, fireCalleeInfo,] of capturedCallees.entries()) { + if (!context.hasCalleeWithInsertedFire(fireCalleePlace)) { + context.addCalleeWithInsertedFire(fireCalleePlace); + importedUseFire !== null && importedUseFire !== void 0 ? importedUseFire : (importedUseFire = fn.env.programContext.addImportSpecifier({ + source: fn.env.programContext.reactRuntimeModule, + importSpecifierName: USE_FIRE_FUNCTION_NAME, + })); + const loadUseFireInstr = makeLoadUseFireInstruction(fn.env, importedUseFire); + const loadFireCalleeInstr = makeLoadFireCalleeInstruction(fn.env, fireCalleeInfo.capturedCalleeIdentifier); + const callUseFireInstr = makeCallUseFireInstruction(fn.env, loadUseFireInstr.lvalue, loadFireCalleeInstr.lvalue); + const storeUseFireInstr = makeStoreUseFireInstruction(fn.env, callUseFireInstr.lvalue, fireCalleeInfo.fireFunctionBinding); + newInstrs.push(loadUseFireInstr, loadFireCalleeInstr, callUseFireInstr, storeUseFireInstr); + const loadUseEffectInstrId = context.getLoadGlobalInstrId(value.callee.identifier.id); + if (loadUseEffectInstrId == null) { + context.pushError({ + loc: value.loc, + description: null, + category: ErrorCategory.Invariant, + reason: '[InsertFire] No LoadGlobal found for useEffect call', + suggestions: null, + }); + continue; + } + rewriteInstrs.set(loadUseEffectInstrId, newInstrs); + } + } + ensureNoRemainingCalleeCaptures(lambda.loweredFunc.func, context, capturedCallees); + if (value.args.length > 1 && + value.args[1] != null && + value.args[1].kind === 'Identifier') { + const depArray = value.args[1]; + const depArrayExpression = context.getArrayExpression(depArray.identifier.id); + if (depArrayExpression != null) { + for (const dependency of depArrayExpression.elements) { + if (dependency.kind === 'Identifier') { + const loadOfDependency = context.getLoadLocalInstr(dependency.identifier.id); + if (loadOfDependency != null) { + const replacedDepArrayItem = capturedCallees.get(loadOfDependency.place.identifier.id); + if (replacedDepArrayItem != null) { + loadOfDependency.place = + replacedDepArrayItem.fireFunctionBinding; + } + } + } + } + } + else { + context.pushError({ + loc: value.args[1].loc, + description: 'You must use an array literal for an effect dependency array when that effect uses `fire()`', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + else if (value.args.length > 1 && value.args[1].kind === 'Spread') { + context.pushError({ + loc: value.args[1].place.loc, + description: 'You must use an array literal for an effect dependency array when that effect uses `fire()`', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + } + else if (value.kind === 'CallExpression' && + value.callee.identifier.type.kind === 'Function' && + value.callee.identifier.type.shapeId === BuiltInFireId && + context.inUseEffectLambda()) { + if (value.args.length === 1 && value.args[0].kind === 'Identifier') { + const callExpr = context.getCallExpression(value.args[0].identifier.id); + if (callExpr != null) { + const calleeId = callExpr.callee.identifier.id; + const loadLocal = context.getLoadLocalInstr(calleeId); + if (loadLocal == null) { + context.pushError({ + loc: value.loc, + description: null, + category: ErrorCategory.Invariant, + reason: '[InsertFire] No loadLocal found for fire call argument', + suggestions: null, + }); + continue; + } + const fireFunctionBinding = context.getOrGenerateFireFunctionBinding(loadLocal.place, value.loc); + loadLocal.place = Object.assign({}, fireFunctionBinding); + deleteInstrs.add(instr.id); + } + else { + context.pushError({ + loc: value.loc, + description: '`fire()` can only receive a function call such as `fire(fn(a,b)). Method calls and other expressions are not allowed', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + else { + let description = 'fire() can only take in a single call expression as an argument'; + if (value.args.length === 0) { + description += ' but received none'; + } + else if (value.args.length > 1) { + description += ' but received multiple arguments'; + } + else if (value.args[0].kind === 'Spread') { + description += ' but received a spread argument'; + } + context.pushError({ + loc: value.loc, + description, + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } + else if (value.kind === 'CallExpression') { + context.addCallExpression(lvalue.identifier.id, value); + } + else if (value.kind === 'FunctionExpression' && + context.inUseEffectLambda()) { + visitFunctionExpressionAndPropagateFireDependencies(value, context, false); + } + else if (value.kind === 'FunctionExpression') { + context.addFunctionExpression(lvalue.identifier.id, value); + } + else if (value.kind === 'LoadLocal') { + context.addLoadLocalInstr(lvalue.identifier.id, value); + } + else if (value.kind === 'LoadGlobal' && + value.binding.kind === 'ImportSpecifier' && + value.binding.module === 'react' && + value.binding.imported === 'fire' && + context.inUseEffectLambda()) { + deleteInstrs.add(instr.id); + } + else if (value.kind === 'LoadGlobal') { + context.addLoadGlobalInstrId(lvalue.identifier.id, instr.id); + } + else if (value.kind === 'ArrayExpression') { + context.addArrayExpression(lvalue.identifier.id, value); + } + } + block.instructions = rewriteInstructions(rewriteInstrs, block.instructions); + block.instructions = deleteInstructions(deleteInstrs, block.instructions); + if (rewriteInstrs.size > 0 || deleteInstrs.size > 0) { + hasRewrite = true; + fn.env.hasFireRewrite = true; + } + } + if (hasRewrite) { + markInstructionIds(fn.body); + } +} +function visitFunctionExpressionAndPropagateFireDependencies(fnExpr, context, enteringUseEffect) { + let withScope = enteringUseEffect + ? context.withUseEffectLambdaScope.bind(context) + : context.withFunctionScope.bind(context); + const calleesCapturedByFnExpression = withScope(() => replaceFireFunctions(fnExpr.loweredFunc.func, context)); + for (let contextIdx = 0; contextIdx < fnExpr.loweredFunc.func.context.length; contextIdx++) { + const contextItem = fnExpr.loweredFunc.func.context[contextIdx]; + const replacedCallee = calleesCapturedByFnExpression.get(contextItem.identifier.id); + if (replacedCallee != null) { + fnExpr.loweredFunc.func.context[contextIdx] = Object.assign({}, replacedCallee.fireFunctionBinding); + } + } + context.mergeCalleesFromInnerScope(calleesCapturedByFnExpression); + return calleesCapturedByFnExpression; +} +function* eachReachablePlace(fn) { + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + if (instr.value.kind === 'FunctionExpression' || + instr.value.kind === 'ObjectMethod') { + yield* eachReachablePlace(instr.value.loweredFunc.func); + } + else { + yield* eachInstructionOperand(instr); + } + } + } +} +function ensureNoRemainingCalleeCaptures(fn, context, capturedCallees) { + var _a; + for (const place of eachReachablePlace(fn)) { + const calleeInfo = capturedCallees.get(place.identifier.id); + if (calleeInfo != null) { + const calleeName = ((_a = calleeInfo.capturedCalleeIdentifier.name) === null || _a === void 0 ? void 0 : _a.kind) === 'named' + ? calleeInfo.capturedCalleeIdentifier.name.value + : ''; + context.pushError({ + loc: place.loc, + description: `All uses of ${calleeName} must be either used with a fire() call in \ +this effect or not used with a fire() call at all. ${calleeName} was used with fire() on line \ +${printSourceLocationLine(calleeInfo.fireLoc)} in this effect`, + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } +} +function ensureNoMoreFireUses(fn, context) { + for (const place of eachReachablePlace(fn)) { + if (place.identifier.type.kind === 'Function' && + place.identifier.type.shapeId === BuiltInFireId) { + context.pushError({ + loc: place.identifier.loc, + description: 'Cannot use `fire` outside of a useEffect function', + category: ErrorCategory.Fire, + reason: CANNOT_COMPILE_FIRE, + suggestions: null, + }); + } + } +} +function makeLoadUseFireInstruction(env, importedLoadUseFire) { + const useFirePlace = createTemporaryPlace(env, GeneratedSource); + useFirePlace.effect = Effect.Read; + useFirePlace.identifier.type = DefaultNonmutatingHook; + const instrValue = { + kind: 'LoadGlobal', + binding: Object.assign({}, importedLoadUseFire), + loc: GeneratedSource, + }; + return { + id: makeInstructionId(0), + value: instrValue, + lvalue: Object.assign({}, useFirePlace), + loc: GeneratedSource, + effects: null, + }; +} +function makeLoadFireCalleeInstruction(env, fireCalleeIdentifier) { + const loadedFireCallee = createTemporaryPlace(env, GeneratedSource); + const fireCallee = { + kind: 'Identifier', + identifier: fireCalleeIdentifier, + reactive: false, + effect: Effect.Unknown, + loc: fireCalleeIdentifier.loc, + }; + return { + id: makeInstructionId(0), + value: { + kind: 'LoadLocal', + loc: GeneratedSource, + place: Object.assign({}, fireCallee), + }, + lvalue: Object.assign({}, loadedFireCallee), + loc: GeneratedSource, + effects: null, + }; +} +function makeCallUseFireInstruction(env, useFirePlace, argPlace) { + const useFireCallResultPlace = createTemporaryPlace(env, GeneratedSource); + useFireCallResultPlace.effect = Effect.Read; + const useFireCall = { + kind: 'CallExpression', + callee: Object.assign({}, useFirePlace), + args: [argPlace], + loc: GeneratedSource, + }; + return { + id: makeInstructionId(0), + value: useFireCall, + lvalue: Object.assign({}, useFireCallResultPlace), + loc: GeneratedSource, + effects: null, + }; +} +function makeStoreUseFireInstruction(env, useFireCallResultPlace, fireFunctionBindingPlace) { + promoteTemporary(fireFunctionBindingPlace.identifier); + const fireFunctionBindingLValuePlace = createTemporaryPlace(env, GeneratedSource); + return { + id: makeInstructionId(0), + value: { + kind: 'StoreLocal', + lvalue: { + kind: InstructionKind.Const, + place: Object.assign({}, fireFunctionBindingPlace), + }, + value: Object.assign({}, useFireCallResultPlace), + type: null, + loc: GeneratedSource, + }, + lvalue: fireFunctionBindingLValuePlace, + loc: GeneratedSource, + effects: null, + }; +} +class Context { + constructor(env) { + _Context_env.set(this, void 0); + _Context_errors.set(this, new CompilerError()); + _Context_callExpressions.set(this, new Map()); + _Context_functionExpressions.set(this, new Map()); + _Context_loadLocals.set(this, new Map()); + _Context_fireCalleesToFireFunctions.set(this, new Map()); + _Context_calleesWithInsertedFire.set(this, new Set()); + _Context_capturedCalleeIdentifierIds.set(this, new Map()); + _Context_inUseEffectLambda.set(this, false); + _Context_loadGlobalInstructionIds.set(this, new Map()); + _Context_arrayExpressions.set(this, new Map()); + __classPrivateFieldSet(this, _Context_env, env, "f"); + } + pushError(error) { + __classPrivateFieldGet(this, _Context_errors, "f").push(error); + } + withFunctionScope(fn) { + fn(); + return __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f"); + } + withUseEffectLambdaScope(fn) { + const capturedCalleeIdentifierIds = __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f"); + const inUseEffectLambda = __classPrivateFieldGet(this, _Context_inUseEffectLambda, "f"); + __classPrivateFieldSet(this, _Context_capturedCalleeIdentifierIds, new Map(), "f"); + __classPrivateFieldSet(this, _Context_inUseEffectLambda, true, "f"); + const resultCapturedCalleeIdentifierIds = this.withFunctionScope(fn); + __classPrivateFieldSet(this, _Context_capturedCalleeIdentifierIds, capturedCalleeIdentifierIds, "f"); + __classPrivateFieldSet(this, _Context_inUseEffectLambda, inUseEffectLambda, "f"); + return resultCapturedCalleeIdentifierIds; + } + addCallExpression(id, callExpr) { + __classPrivateFieldGet(this, _Context_callExpressions, "f").set(id, callExpr); + } + getCallExpression(id) { + return __classPrivateFieldGet(this, _Context_callExpressions, "f").get(id); + } + addLoadLocalInstr(id, loadLocal) { + __classPrivateFieldGet(this, _Context_loadLocals, "f").set(id, loadLocal); + } + getLoadLocalInstr(id) { + return __classPrivateFieldGet(this, _Context_loadLocals, "f").get(id); + } + getOrGenerateFireFunctionBinding(callee, fireLoc) { + const fireFunctionBinding = getOrInsertWith(__classPrivateFieldGet(this, _Context_fireCalleesToFireFunctions, "f"), callee.identifier.id, () => createTemporaryPlace(__classPrivateFieldGet(this, _Context_env, "f"), GeneratedSource)); + fireFunctionBinding.identifier.type = { + kind: 'Function', + shapeId: BuiltInFireFunctionId, + return: { kind: 'Poly' }, + isConstructor: false, + }; + __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f").set(callee.identifier.id, { + fireFunctionBinding, + capturedCalleeIdentifier: callee.identifier, + fireLoc, + }); + return fireFunctionBinding; + } + mergeCalleesFromInnerScope(innerCallees) { + for (const [id, calleeInfo] of innerCallees.entries()) { + __classPrivateFieldGet(this, _Context_capturedCalleeIdentifierIds, "f").set(id, calleeInfo); + } + } + addCalleeWithInsertedFire(id) { + __classPrivateFieldGet(this, _Context_calleesWithInsertedFire, "f").add(id); + } + hasCalleeWithInsertedFire(id) { + return __classPrivateFieldGet(this, _Context_calleesWithInsertedFire, "f").has(id); + } + inUseEffectLambda() { + return __classPrivateFieldGet(this, _Context_inUseEffectLambda, "f"); + } + addFunctionExpression(id, fn) { + __classPrivateFieldGet(this, _Context_functionExpressions, "f").set(id, fn); + } + getFunctionExpression(id) { + return __classPrivateFieldGet(this, _Context_functionExpressions, "f").get(id); + } + addLoadGlobalInstrId(id, instrId) { + __classPrivateFieldGet(this, _Context_loadGlobalInstructionIds, "f").set(id, instrId); + } + getLoadGlobalInstrId(id) { + return __classPrivateFieldGet(this, _Context_loadGlobalInstructionIds, "f").get(id); + } + addArrayExpression(id, array) { + __classPrivateFieldGet(this, _Context_arrayExpressions, "f").set(id, array); + } + getArrayExpression(id) { + return __classPrivateFieldGet(this, _Context_arrayExpressions, "f").get(id); + } + hasErrors() { + return __classPrivateFieldGet(this, _Context_errors, "f").hasAnyErrors(); + } + throwIfErrorsFound() { + if (this.hasErrors()) + throw __classPrivateFieldGet(this, _Context_errors, "f"); + } +} +_Context_env = new WeakMap(), _Context_errors = new WeakMap(), _Context_callExpressions = new WeakMap(), _Context_functionExpressions = new WeakMap(), _Context_loadLocals = new WeakMap(), _Context_fireCalleesToFireFunctions = new WeakMap(), _Context_calleesWithInsertedFire = new WeakMap(), _Context_capturedCalleeIdentifierIds = new WeakMap(), _Context_inUseEffectLambda = new WeakMap(), _Context_loadGlobalInstructionIds = new WeakMap(), _Context_arrayExpressions = new WeakMap(); +function deleteInstructions(deleteInstrs, instructions) { + if (deleteInstrs.size > 0) { + const newInstrs = instructions.filter(instr => !deleteInstrs.has(instr.id)); + return newInstrs; + } + return instructions; +} +function rewriteInstructions(rewriteInstrs, instructions) { + if (rewriteInstrs.size > 0) { + const newInstrs = []; + for (const instr of instructions) { + const newInstrsAtId = rewriteInstrs.get(instr.id); + if (newInstrsAtId != null) { + newInstrs.push(...newInstrsAtId, instr); + } + else { + newInstrs.push(instr); + } + } + return newInstrs; + } + return instructions; +} + +function validateNoImpureFunctionsInRender(fn) { + const errors = new CompilerError(); + for (const [, block] of fn.body.blocks) { + for (const instr of block.instructions) { + const value = instr.value; + if (value.kind === 'MethodCall' || value.kind == 'CallExpression') { + const callee = value.kind === 'MethodCall' ? value.property : value.callee; + const signature = getFunctionCallSignature(fn.env, callee.identifier.type); + if (signature != null && signature.impure === true) { + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Purity, + reason: 'Cannot call impure function during render', + description: (signature.canonicalName != null + ? `\`${signature.canonicalName}\` is an impure function. ` + : '') + + 'Calling an impure function can produce unstable results that update unpredictably when the component happens to re-render. (https://react.dev/reference/rules/components-and-hooks-must-be-pure#components-and-hooks-must-be-idempotent)', + suggestions: null, + }).withDetails({ + kind: 'error', + loc: callee.loc, + message: 'Cannot call impure function', + })); + } + } + } + } + return errors.asResult(); +} + +function validateStaticComponents(fn) { + const error = new CompilerError(); + const knownDynamicComponents = new Map(); + for (const block of fn.body.blocks.values()) { + phis: for (const phi of block.phis) { + for (const operand of phi.operands.values()) { + const loc = knownDynamicComponents.get(operand.identifier.id); + if (loc != null) { + knownDynamicComponents.set(phi.place.identifier.id, loc); + continue phis; + } + } + } + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'FunctionExpression': + case 'NewExpression': + case 'MethodCall': + case 'CallExpression': { + knownDynamicComponents.set(lvalue.identifier.id, value.loc); + break; + } + case 'LoadLocal': { + const loc = knownDynamicComponents.get(value.place.identifier.id); + if (loc != null) { + knownDynamicComponents.set(lvalue.identifier.id, loc); + } + break; + } + case 'StoreLocal': { + const loc = knownDynamicComponents.get(value.value.identifier.id); + if (loc != null) { + knownDynamicComponents.set(lvalue.identifier.id, loc); + knownDynamicComponents.set(value.lvalue.place.identifier.id, loc); + } + break; + } + case 'JsxExpression': { + if (value.tag.kind === 'Identifier') { + const location = knownDynamicComponents.get(value.tag.identifier.id); + if (location != null) { + error.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.StaticComponents, + reason: 'Cannot create components during render', + description: `Components created during render will reset their state each time they are created. Declare components outside of render`, + }) + .withDetails({ + kind: 'error', + loc: value.tag.loc, + message: 'This component is created during render', + }) + .withDetails({ + kind: 'error', + loc: location, + message: 'The component is created during render here', + })); + } + } + } + } + } + } + return error.asResult(); +} + +function validateNoFreezingKnownMutableFunctions(fn) { + const errors = new CompilerError(); + const contextMutationEffects = new Map(); + function visitOperand(operand) { + if (operand.effect === Effect.Freeze) { + const effect = contextMutationEffects.get(operand.identifier.id); + if (effect != null) { + const place = effect.value; + const variable = place != null && + place.identifier.name != null && + place.identifier.name.kind === 'named' + ? `\`${place.identifier.name.value}\`` + : 'a local variable'; + errors.pushDiagnostic(CompilerDiagnostic.create({ + category: ErrorCategory.Immutability, + reason: 'Cannot modify local variables after render completes', + description: `This argument is a function which may reassign or mutate ${variable} after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead`, + }) + .withDetails({ + kind: 'error', + loc: operand.loc, + message: `This function may (indirectly) reassign or modify ${variable} after render`, + }) + .withDetails({ + kind: 'error', + loc: effect.value.loc, + message: `This modifies ${variable}`, + })); + } + } + } + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'LoadLocal': { + const effect = contextMutationEffects.get(value.place.identifier.id); + if (effect != null) { + contextMutationEffects.set(lvalue.identifier.id, effect); + } + break; + } + case 'StoreLocal': { + const effect = contextMutationEffects.get(value.value.identifier.id); + if (effect != null) { + contextMutationEffects.set(lvalue.identifier.id, effect); + contextMutationEffects.set(value.lvalue.place.identifier.id, effect); + } + break; + } + case 'FunctionExpression': { + if (value.loweredFunc.func.aliasingEffects != null) { + const context = new Set(value.loweredFunc.func.context.map(p => p.identifier.id)); + effects: for (const effect of value.loweredFunc.func + .aliasingEffects) { + switch (effect.kind) { + case 'Mutate': + case 'MutateTransitive': { + const knownMutation = contextMutationEffects.get(effect.value.identifier.id); + if (knownMutation != null) { + contextMutationEffects.set(lvalue.identifier.id, knownMutation); + } + else if (context.has(effect.value.identifier.id) && + !isRefOrRefLikeMutableType(effect.value.identifier.type)) { + contextMutationEffects.set(lvalue.identifier.id, effect); + break effects; + } + break; + } + case 'MutateConditionally': + case 'MutateTransitiveConditionally': { + const knownMutation = contextMutationEffects.get(effect.value.identifier.id); + if (knownMutation != null) { + contextMutationEffects.set(lvalue.identifier.id, knownMutation); + } + break; + } + } + } + } + break; + } + default: { + for (const operand of eachInstructionValueOperand(value)) { + visitOperand(operand); + } + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + visitOperand(operand); + } + } + return errors.asResult(); +} + +function validateNoDerivedComputationsInEffects(fn) { + const candidateDependencies = new Map(); + const functions = new Map(); + const locals = new Map(); + const errors = new CompilerError(); + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + if (value.kind === 'LoadLocal') { + locals.set(lvalue.identifier.id, value.place.identifier.id); + } + else if (value.kind === 'ArrayExpression') { + candidateDependencies.set(lvalue.identifier.id, value); + } + else if (value.kind === 'FunctionExpression') { + functions.set(lvalue.identifier.id, value); + } + else if (value.kind === 'CallExpression' || + value.kind === 'MethodCall') { + const callee = value.kind === 'CallExpression' ? value.callee : value.property; + if (isUseEffectHookType(callee.identifier) && + value.args.length === 2 && + value.args[0].kind === 'Identifier' && + value.args[1].kind === 'Identifier') { + const effectFunction = functions.get(value.args[0].identifier.id); + const deps = candidateDependencies.get(value.args[1].identifier.id); + if (effectFunction != null && + deps != null && + deps.elements.length !== 0 && + deps.elements.every(element => element.kind === 'Identifier')) { + const dependencies = deps.elements.map(dep => { + var _a; + CompilerError.invariant(dep.kind === 'Identifier', { + reason: `Dependency is checked as a place above`, + description: null, + details: [ + { + kind: 'error', + loc: value.loc, + message: 'this is checked as a place above', + }, + ], + }); + return (_a = locals.get(dep.identifier.id)) !== null && _a !== void 0 ? _a : dep.identifier.id; + }); + validateEffect(effectFunction.loweredFunc.func, dependencies, errors); + } + } + } + } + } + if (errors.hasAnyErrors()) { + throw errors; + } +} +function validateEffect(effectFunction, effectDeps, errors) { + for (const operand of effectFunction.context) { + if (isSetStateType(operand.identifier)) { + continue; + } + else if (effectDeps.find(dep => dep === operand.identifier.id) != null) { + continue; + } + else { + return; + } + } + for (const dep of effectDeps) { + if (effectFunction.context.find(operand => operand.identifier.id === dep) == + null) { + return; + } + } + const seenBlocks = new Set(); + const values = new Map(); + for (const dep of effectDeps) { + values.set(dep, [dep]); + } + const setStateLocations = []; + for (const block of effectFunction.body.blocks.values()) { + for (const pred of block.preds) { + if (!seenBlocks.has(pred)) { + return; + } + } + for (const phi of block.phis) { + const aggregateDeps = new Set(); + for (const operand of phi.operands.values()) { + const deps = values.get(operand.identifier.id); + if (deps != null) { + for (const dep of deps) { + aggregateDeps.add(dep); + } + } + } + if (aggregateDeps.size !== 0) { + values.set(phi.place.identifier.id, Array.from(aggregateDeps)); + } + } + for (const instr of block.instructions) { + switch (instr.value.kind) { + case 'Primitive': + case 'JSXText': + case 'LoadGlobal': { + break; + } + case 'LoadLocal': { + const deps = values.get(instr.value.place.identifier.id); + if (deps != null) { + values.set(instr.lvalue.identifier.id, deps); + } + break; + } + case 'ComputedLoad': + case 'PropertyLoad': + case 'BinaryExpression': + case 'TemplateLiteral': + case 'CallExpression': + case 'MethodCall': { + const aggregateDeps = new Set(); + for (const operand of eachInstructionValueOperand(instr.value)) { + const deps = values.get(operand.identifier.id); + if (deps != null) { + for (const dep of deps) { + aggregateDeps.add(dep); + } + } + } + if (aggregateDeps.size !== 0) { + values.set(instr.lvalue.identifier.id, Array.from(aggregateDeps)); + } + if (instr.value.kind === 'CallExpression' && + isSetStateType(instr.value.callee.identifier) && + instr.value.args.length === 1 && + instr.value.args[0].kind === 'Identifier') { + const deps = values.get(instr.value.args[0].identifier.id); + if (deps != null && new Set(deps).size === effectDeps.length) { + setStateLocations.push(instr.value.callee.loc); + } + else { + return; + } + } + break; + } + default: { + return; + } + } + } + for (const operand of eachTerminalOperand(block.terminal)) { + if (values.has(operand.identifier.id)) { + return; + } + } + seenBlocks.add(block.id); + } + for (const loc of setStateLocations) { + errors.push({ + category: ErrorCategory.EffectDerivationsOfState, + reason: 'Values derived from props and state should be calculated during render, not in an effect. (https://react.dev/learn/you-might-not-need-an-effect#updating-state-based-on-props-or-state)', + description: null, + loc, + suggestions: null, + }); + } +} + +function nameAnonymousFunctions(fn) { + if (fn.id == null) { + return; + } + const parentName = fn.id; + const functions = nameAnonymousFunctionsImpl(fn); + function visit(node, prefix) { + var _a, _b; + if (node.generatedName != null && node.fn.nameHint == null) { + const name = `${prefix}${node.generatedName}]`; + node.fn.nameHint = name; + node.fn.loweredFunc.func.nameHint = name; + } + const nextPrefix = `${prefix}${(_b = (_a = node.generatedName) !== null && _a !== void 0 ? _a : node.fn.name) !== null && _b !== void 0 ? _b : ''} > `; + for (const inner of node.inner) { + visit(inner, nextPrefix); + } + } + for (const node of functions) { + visit(node, `${parentName}[`); + } +} +function nameAnonymousFunctionsImpl(fn) { + var _a, _b; + const functions = new Map(); + const names = new Map(); + const nodes = []; + for (const block of fn.body.blocks.values()) { + for (const instr of block.instructions) { + const { lvalue, value } = instr; + switch (value.kind) { + case 'LoadGlobal': { + names.set(lvalue.identifier.id, value.binding.name); + break; + } + case 'LoadContext': + case 'LoadLocal': { + const name = value.place.identifier.name; + if (name != null && name.kind === 'named') { + names.set(lvalue.identifier.id, name.value); + } + const func = functions.get(value.place.identifier.id); + if (func != null) { + functions.set(lvalue.identifier.id, func); + } + break; + } + case 'PropertyLoad': { + const objectName = names.get(value.object.identifier.id); + if (objectName != null) { + names.set(lvalue.identifier.id, `${objectName}.${String(value.property)}`); + } + break; + } + case 'FunctionExpression': { + const inner = nameAnonymousFunctionsImpl(value.loweredFunc.func); + const node = { + fn: value, + generatedName: null, + inner, + }; + nodes.push(node); + if (value.name == null) { + functions.set(lvalue.identifier.id, node); + } + break; + } + case 'StoreContext': + case 'StoreLocal': { + const node = functions.get(value.value.identifier.id); + const variableName = value.lvalue.place.identifier.name; + if (node != null && + node.generatedName == null && + variableName != null && + variableName.kind === 'named') { + node.generatedName = variableName.value; + functions.delete(value.value.identifier.id); + } + break; + } + case 'CallExpression': + case 'MethodCall': { + const callee = value.kind === 'MethodCall' ? value.property : value.callee; + const hookKind = getHookKind(fn.env, callee.identifier); + let calleeName = null; + if (hookKind != null && hookKind !== 'Custom') { + calleeName = hookKind; + } + else { + calleeName = (_a = names.get(callee.identifier.id)) !== null && _a !== void 0 ? _a : '(anonymous)'; + } + let fnArgCount = 0; + for (const arg of value.args) { + if (arg.kind === 'Identifier' && functions.has(arg.identifier.id)) { + fnArgCount++; + } + } + for (let i = 0; i < value.args.length; i++) { + const arg = value.args[i]; + if (arg.kind === 'Spread') { + continue; + } + const node = functions.get(arg.identifier.id); + if (node != null && node.generatedName == null) { + const generatedName = fnArgCount > 1 ? `${calleeName}(arg${i})` : `${calleeName}()`; + node.generatedName = generatedName; + functions.delete(arg.identifier.id); + } + } + break; + } + case 'JsxExpression': { + for (const attr of value.props) { + if (attr.kind === 'JsxSpreadAttribute') { + continue; + } + const node = functions.get(attr.place.identifier.id); + if (node != null && node.generatedName == null) { + const elementName = value.tag.kind === 'BuiltinTag' + ? value.tag.name + : ((_b = names.get(value.tag.identifier.id)) !== null && _b !== void 0 ? _b : null); + const propName = elementName == null + ? attr.name + : `<${elementName}>.${attr.name}`; + node.generatedName = `${propName}`; + functions.delete(attr.place.identifier.id); + } + } + break; + } + } + } + } + return nodes; +} + +function run(func, config, fnType, mode, programContext, logger, filename, code) { + var _a, _b; + const contextIdentifiers = findContextIdentifiers(func); + const env = new Environment(func.scope, fnType, mode, config, contextIdentifiers, func, logger, filename, code, programContext); + (_b = (_a = env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, { + kind: 'debug', + name: 'EnvironmentConfig', + value: prettyFormat(env.config), + }); + return runWithEnvironment(func, env); +} +function runWithEnvironment(func, env) { + const log = (value) => { + var _a, _b; + (_b = (_a = env.logger) === null || _a === void 0 ? void 0 : _a.debugLogIRs) === null || _b === void 0 ? void 0 : _b.call(_a, value); + }; + const hir = lower(func, env).unwrap(); + log({ kind: 'hir', name: 'HIR', value: hir }); + pruneMaybeThrows(hir); + log({ kind: 'hir', name: 'PruneMaybeThrows', value: hir }); + validateContextVariableLValues(hir); + validateUseMemo(hir).unwrap(); + if (env.isInferredMemoEnabled && + !env.config.enablePreserveExistingManualUseMemo && + !env.config.disableMemoizationForDebugging && + !env.config.enableChangeDetectionForDebugging) { + dropManualMemoization(hir).unwrap(); + log({ kind: 'hir', name: 'DropManualMemoization', value: hir }); + } + inlineImmediatelyInvokedFunctionExpressions(hir); + log({ + kind: 'hir', + name: 'InlineImmediatelyInvokedFunctionExpressions', + value: hir, + }); + mergeConsecutiveBlocks(hir); + log({ kind: 'hir', name: 'MergeConsecutiveBlocks', value: hir }); + assertConsistentIdentifiers(hir); + assertTerminalSuccessorsExist(hir); + enterSSA(hir); + log({ kind: 'hir', name: 'SSA', value: hir }); + eliminateRedundantPhi(hir); + log({ kind: 'hir', name: 'EliminateRedundantPhi', value: hir }); + assertConsistentIdentifiers(hir); + constantPropagation(hir); + log({ kind: 'hir', name: 'ConstantPropagation', value: hir }); + inferTypes(hir); + log({ kind: 'hir', name: 'InferTypes', value: hir }); + if (env.isInferredMemoEnabled) { + if (env.config.validateHooksUsage) { + validateHooksUsage(hir).unwrap(); + } + if (env.config.validateNoCapitalizedCalls) { + validateNoCapitalizedCalls(hir).unwrap(); + } + } + if (env.config.enableFire) { + transformFire(hir); + log({ kind: 'hir', name: 'TransformFire', value: hir }); + } + if (env.config.lowerContextAccess) { + lowerContextAccess(hir, env.config.lowerContextAccess); + } + optimizePropsMethodCalls(hir); + log({ kind: 'hir', name: 'OptimizePropsMethodCalls', value: hir }); + analyseFunctions(hir); + log({ kind: 'hir', name: 'AnalyseFunctions', value: hir }); + const mutabilityAliasingErrors = inferMutationAliasingEffects(hir); + log({ kind: 'hir', name: 'InferMutationAliasingEffects', value: hir }); + if (env.isInferredMemoEnabled) { + if (mutabilityAliasingErrors.isErr()) { + throw mutabilityAliasingErrors.unwrapErr(); + } + } + deadCodeElimination(hir); + log({ kind: 'hir', name: 'DeadCodeElimination', value: hir }); + if (env.config.enableInstructionReordering) { + instructionReordering(hir); + log({ kind: 'hir', name: 'InstructionReordering', value: hir }); + } + pruneMaybeThrows(hir); + log({ kind: 'hir', name: 'PruneMaybeThrows', value: hir }); + const mutabilityAliasingRangeErrors = inferMutationAliasingRanges(hir, { + isFunctionExpression: false, + }); + log({ kind: 'hir', name: 'InferMutationAliasingRanges', value: hir }); + if (env.isInferredMemoEnabled) { + if (mutabilityAliasingRangeErrors.isErr()) { + throw mutabilityAliasingRangeErrors.unwrapErr(); + } + validateLocalsNotReassignedAfterRender(hir); + } + if (env.isInferredMemoEnabled) { + if (env.config.assertValidMutableRanges) { + assertValidMutableRanges(hir); + } + if (env.config.validateRefAccessDuringRender) { + validateNoRefAccessInRender(hir).unwrap(); + } + if (env.config.validateNoSetStateInRender) { + validateNoSetStateInRender(hir).unwrap(); + } + if (env.config.validateNoDerivedComputationsInEffects) { + validateNoDerivedComputationsInEffects(hir); + } + if (env.config.validateNoSetStateInEffects) { + env.logErrors(validateNoSetStateInEffects(hir, env)); + } + if (env.config.validateNoJSXInTryStatements) { + env.logErrors(validateNoJSXInTryStatement(hir)); + } + if (env.config.validateNoImpureFunctionsInRender) { + validateNoImpureFunctionsInRender(hir).unwrap(); + } + validateNoFreezingKnownMutableFunctions(hir).unwrap(); + } + inferReactivePlaces(hir); + log({ kind: 'hir', name: 'InferReactivePlaces', value: hir }); + rewriteInstructionKindsBasedOnReassignment(hir); + log({ + kind: 'hir', + name: 'RewriteInstructionKindsBasedOnReassignment', + value: hir, + }); + if (env.isInferredMemoEnabled) { + if (env.config.validateStaticComponents) { + env.logErrors(validateStaticComponents(hir)); + } + inferReactiveScopeVariables(hir); + log({ kind: 'hir', name: 'InferReactiveScopeVariables', value: hir }); + } + const fbtOperands = memoizeFbtAndMacroOperandsInSameScope(hir); + log({ + kind: 'hir', + name: 'MemoizeFbtAndMacroOperandsInSameScope', + value: hir, + }); + if (env.config.enableJsxOutlining) { + outlineJSX(hir); + } + if (env.config.enableNameAnonymousFunctions) { + nameAnonymousFunctions(hir); + log({ + kind: 'hir', + name: 'NameAnonymousFunctions', + value: hir, + }); + } + if (env.config.enableFunctionOutlining) { + outlineFunctions(hir, fbtOperands); + log({ kind: 'hir', name: 'OutlineFunctions', value: hir }); + } + alignMethodCallScopes(hir); + log({ + kind: 'hir', + name: 'AlignMethodCallScopes', + value: hir, + }); + alignObjectMethodScopes(hir); + log({ + kind: 'hir', + name: 'AlignObjectMethodScopes', + value: hir, + }); + pruneUnusedLabelsHIR(hir); + log({ + kind: 'hir', + name: 'PruneUnusedLabelsHIR', + value: hir, + }); + alignReactiveScopesToBlockScopesHIR(hir); + log({ + kind: 'hir', + name: 'AlignReactiveScopesToBlockScopesHIR', + value: hir, + }); + mergeOverlappingReactiveScopesHIR(hir); + log({ + kind: 'hir', + name: 'MergeOverlappingReactiveScopesHIR', + value: hir, + }); + assertValidBlockNesting(hir); + buildReactiveScopeTerminalsHIR(hir); + log({ + kind: 'hir', + name: 'BuildReactiveScopeTerminalsHIR', + value: hir, + }); + assertValidBlockNesting(hir); + flattenReactiveLoopsHIR(hir); + log({ + kind: 'hir', + name: 'FlattenReactiveLoopsHIR', + value: hir, + }); + flattenScopesWithHooksOrUseHIR(hir); + log({ + kind: 'hir', + name: 'FlattenScopesWithHooksOrUseHIR', + value: hir, + }); + assertTerminalSuccessorsExist(hir); + assertTerminalPredsExist(hir); + propagateScopeDependenciesHIR(hir); + log({ + kind: 'hir', + name: 'PropagateScopeDependenciesHIR', + value: hir, + }); + if (env.config.inferEffectDependencies) { + inferEffectDependencies(hir); + log({ + kind: 'hir', + name: 'InferEffectDependencies', + value: hir, + }); + } + if (env.config.inlineJsxTransform) { + inlineJsxTransform(hir, env.config.inlineJsxTransform); + log({ + kind: 'hir', + name: 'inlineJsxTransform', + value: hir, + }); + } + const reactiveFunction = buildReactiveFunction(hir); + log({ + kind: 'reactive', + name: 'BuildReactiveFunction', + value: reactiveFunction, + }); + assertWellFormedBreakTargets(reactiveFunction); + pruneUnusedLabels(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneUnusedLabels', + value: reactiveFunction, + }); + assertScopeInstructionsWithinScopes(reactiveFunction); + pruneNonEscapingScopes(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneNonEscapingScopes', + value: reactiveFunction, + }); + pruneNonReactiveDependencies(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneNonReactiveDependencies', + value: reactiveFunction, + }); + pruneUnusedScopes(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneUnusedScopes', + value: reactiveFunction, + }); + mergeReactiveScopesThatInvalidateTogether(reactiveFunction); + log({ + kind: 'reactive', + name: 'MergeReactiveScopesThatInvalidateTogether', + value: reactiveFunction, + }); + pruneAlwaysInvalidatingScopes(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneAlwaysInvalidatingScopes', + value: reactiveFunction, + }); + if (env.config.enableChangeDetectionForDebugging != null) { + pruneInitializationDependencies(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneInitializationDependencies', + value: reactiveFunction, + }); + } + propagateEarlyReturns(reactiveFunction); + log({ + kind: 'reactive', + name: 'PropagateEarlyReturns', + value: reactiveFunction, + }); + pruneUnusedLValues(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneUnusedLValues', + value: reactiveFunction, + }); + promoteUsedTemporaries(reactiveFunction); + log({ + kind: 'reactive', + name: 'PromoteUsedTemporaries', + value: reactiveFunction, + }); + extractScopeDeclarationsFromDestructuring(reactiveFunction); + log({ + kind: 'reactive', + name: 'ExtractScopeDeclarationsFromDestructuring', + value: reactiveFunction, + }); + stabilizeBlockIds(reactiveFunction); + log({ + kind: 'reactive', + name: 'StabilizeBlockIds', + value: reactiveFunction, + }); + const uniqueIdentifiers = renameVariables(reactiveFunction); + log({ + kind: 'reactive', + name: 'RenameVariables', + value: reactiveFunction, + }); + pruneHoistedContexts(reactiveFunction); + log({ + kind: 'reactive', + name: 'PruneHoistedContexts', + value: reactiveFunction, + }); + if (env.config.validateMemoizedEffectDependencies) { + validateMemoizedEffectDependencies(reactiveFunction).unwrap(); + } + if (env.config.enablePreserveExistingMemoizationGuarantees || + env.config.validatePreserveExistingMemoizationGuarantees) { + validatePreservedManualMemoization(reactiveFunction).unwrap(); + } + const ast = codegenFunction(reactiveFunction, { + uniqueIdentifiers, + fbtOperands, + }).unwrap(); + log({ kind: 'ast', name: 'Codegen', value: ast }); + for (const outlined of ast.outlined) { + log({ kind: 'ast', name: 'Codegen (outlined)', value: outlined.fn }); + } + if (env.config.throwUnknownException__testonly) { + throw new Error('unexpected error'); + } + return ast; +} +function compileFn(func, config, fnType, mode, programContext, logger, filename, code) { + return run(func, config, fnType, mode, programContext, logger, filename, code); +} + +function filterSuppressionsThatAffectFunction(suppressionRanges, fn) { + const suppressionsInScope = []; + const fnNode = fn.node; + for (const suppressionRange of suppressionRanges) { + if (suppressionRange.disableComment.start == null || + fnNode.start == null || + fnNode.end == null) { + continue; + } + if (suppressionRange.disableComment.start > fnNode.start && + (suppressionRange.enableComment === null || + (suppressionRange.enableComment.end != null && + suppressionRange.enableComment.end < fnNode.end))) { + suppressionsInScope.push(suppressionRange); + } + if (suppressionRange.disableComment.start < fnNode.start && + (suppressionRange.enableComment === null || + (suppressionRange.enableComment.end != null && + suppressionRange.enableComment.end > fnNode.end))) { + suppressionsInScope.push(suppressionRange); + } + } + return suppressionsInScope; +} +function findProgramSuppressions(programComments, ruleNames, flowSuppressions) { + const suppressionRanges = []; + let disableComment = null; + let enableComment = null; + let source = null; + let disableNextLinePattern = null; + let disablePattern = null; + let enablePattern = null; + if (ruleNames.length !== 0) { + const rulePattern = `(${ruleNames.join('|')})`; + disableNextLinePattern = new RegExp(`eslint-disable-next-line ${rulePattern}`); + disablePattern = new RegExp(`eslint-disable ${rulePattern}`); + enablePattern = new RegExp(`eslint-enable ${rulePattern}`); + } + const flowSuppressionPattern = new RegExp('\\$(FlowFixMe\\w*|FlowExpectedError|FlowIssue)\\[react\\-rule'); + for (const comment of programComments) { + if (comment.start == null || comment.end == null) { + continue; + } + if (disableComment == null && + disableNextLinePattern != null && + disableNextLinePattern.test(comment.value)) { + disableComment = comment; + enableComment = comment; + source = 'Eslint'; + } + if (flowSuppressions && + disableComment == null && + flowSuppressionPattern.test(comment.value)) { + disableComment = comment; + enableComment = comment; + source = 'Flow'; + } + if (disablePattern != null && disablePattern.test(comment.value)) { + disableComment = comment; + source = 'Eslint'; + } + if (enablePattern != null && + enablePattern.test(comment.value) && + source === 'Eslint') { + enableComment = comment; + } + if (disableComment != null && source != null) { + suppressionRanges.push({ + disableComment: disableComment, + enableComment: enableComment, + source, + }); + disableComment = null; + enableComment = null; + source = null; + } + } + return suppressionRanges; +} +function suppressionsToCompilerError(suppressionRanges) { + var _a; + CompilerError.invariant(suppressionRanges.length !== 0, { + reason: `Expected at least suppression comment source range`, + description: null, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + const error = new CompilerError(); + for (const suppressionRange of suppressionRanges) { + if (suppressionRange.disableComment.start == null || + suppressionRange.disableComment.end == null) { + continue; + } + let reason, suggestion; + switch (suppressionRange.source) { + case 'Eslint': + reason = + 'React Compiler has skipped optimizing this component because one or more React ESLint rules were disabled'; + suggestion = + 'Remove the ESLint suppression and address the React error'; + break; + case 'Flow': + reason = + 'React Compiler has skipped optimizing this component because one or more React rule violations were reported by Flow'; + suggestion = 'Remove the Flow suppression and address the React error'; + break; + default: + assertExhaustive$1(suppressionRange.source, 'Unhandled suppression source'); + } + error.pushDiagnostic(CompilerDiagnostic.create({ + reason: reason, + description: `React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression \`${suppressionRange.disableComment.value.trim()}\``, + category: ErrorCategory.Suppression, + suggestions: [ + { + description: suggestion, + range: [ + suppressionRange.disableComment.start, + suppressionRange.disableComment.end, + ], + op: CompilerSuggestionOperation.Remove, + }, + ], + }).withDetails({ + kind: 'error', + loc: (_a = suppressionRange.disableComment.loc) !== null && _a !== void 0 ? _a : null, + message: 'Found React rule suppression', + })); + } + return error; +} + +const OPT_IN_DIRECTIVES = new Set(['use forget', 'use memo']); +const OPT_OUT_DIRECTIVES = new Set(['use no forget', 'use no memo']); +const DYNAMIC_GATING_DIRECTIVE = new RegExp('^use memo if\\(([^\\)]*)\\)$'); +function tryFindDirectiveEnablingMemoization(directives, opts) { + var _a, _b; + const optIn = directives.find(directive => OPT_IN_DIRECTIVES.has(directive.value.value)); + if (optIn != null) { + return Ok(optIn); + } + const dynamicGating = findDirectivesDynamicGating(directives, opts); + if (dynamicGating.isOk()) { + return Ok((_b = (_a = dynamicGating.unwrap()) === null || _a === void 0 ? void 0 : _a.directive) !== null && _b !== void 0 ? _b : null); + } + else { + return Err(dynamicGating.unwrapErr()); + } +} +function findDirectiveDisablingMemoization(directives, { customOptOutDirectives }) { + var _a, _b; + if (customOptOutDirectives != null) { + return ((_a = directives.find(directive => customOptOutDirectives.indexOf(directive.value.value) !== -1)) !== null && _a !== void 0 ? _a : null); + } + return ((_b = directives.find(directive => OPT_OUT_DIRECTIVES.has(directive.value.value))) !== null && _b !== void 0 ? _b : null); +} +function findDirectivesDynamicGating(directives, opts) { + var _a, _b; + if (opts.dynamicGating === null) { + return Ok(null); + } + const errors = new CompilerError(); + const result = []; + for (const directive of directives) { + const maybeMatch = DYNAMIC_GATING_DIRECTIVE.exec(directive.value.value); + if (maybeMatch != null && maybeMatch[1] != null) { + if (libExports$1.isValidIdentifier(maybeMatch[1])) { + result.push({ directive, match: maybeMatch[1] }); + } + else { + errors.push({ + reason: `Dynamic gating directive is not a valid JavaScript identifier`, + description: `Found '${directive.value.value}'`, + category: ErrorCategory.Gating, + loc: (_a = directive.loc) !== null && _a !== void 0 ? _a : null, + suggestions: null, + }); + } + } + } + if (errors.hasAnyErrors()) { + return Err(errors); + } + else if (result.length > 1) { + const error = new CompilerError(); + error.push({ + reason: `Multiple dynamic gating directives found`, + description: `Expected a single directive but found [${result + .map(r => r.directive.value.value) + .join(', ')}]`, + category: ErrorCategory.Gating, + loc: (_b = result[0].directive.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return Err(error); + } + else if (result.length === 1) { + return Ok({ + gating: { + source: opts.dynamicGating.source, + importSpecifierName: result[0].match, + }, + directive: result[0].directive, + }); + } + else { + return Ok(null); + } +} +function isError(err) { + return !(err instanceof CompilerError) || err.hasErrors(); +} +function isConfigError(err) { + if (err instanceof CompilerError) { + return err.details.some(detail => detail.category === ErrorCategory.Config); + } + return false; +} +function logError(err, context, fnLoc) { + var _a, _b; + if (context.opts.logger) { + if (err instanceof CompilerError) { + for (const detail of err.details) { + context.opts.logger.logEvent(context.filename, { + kind: 'CompileError', + fnLoc, + detail, + }); + } + } + else { + let stringifiedError; + if (err instanceof Error) { + stringifiedError = (_a = err.stack) !== null && _a !== void 0 ? _a : err.message; + } + else { + stringifiedError = (_b = err === null || err === void 0 ? void 0 : err.toString()) !== null && _b !== void 0 ? _b : '[ null ]'; + } + context.opts.logger.logEvent(context.filename, { + kind: 'PipelineError', + fnLoc, + data: stringifiedError, + }); + } + } +} +function handleError(err, context, fnLoc) { + logError(err, context, fnLoc); + if (context.opts.panicThreshold === 'all_errors' || + (context.opts.panicThreshold === 'critical_errors' && isError(err)) || + isConfigError(err)) { + throw err; + } +} +function createNewFunctionNode(originalFn, compiledFn) { + var _a, _b, _c; + let transformedFn; + switch (originalFn.node.type) { + case 'FunctionDeclaration': { + const fn = { + type: 'FunctionDeclaration', + id: compiledFn.id, + loc: (_a = originalFn.node.loc) !== null && _a !== void 0 ? _a : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + body: compiledFn.body, + }; + transformedFn = fn; + break; + } + case 'ArrowFunctionExpression': { + const fn = { + type: 'ArrowFunctionExpression', + loc: (_b = originalFn.node.loc) !== null && _b !== void 0 ? _b : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + expression: originalFn.node.expression, + body: compiledFn.body, + }; + transformedFn = fn; + break; + } + case 'FunctionExpression': { + const fn = { + type: 'FunctionExpression', + id: compiledFn.id, + loc: (_c = originalFn.node.loc) !== null && _c !== void 0 ? _c : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + body: compiledFn.body, + }; + transformedFn = fn; + break; + } + default: { + assertExhaustive$1(originalFn.node, `Creating unhandled function: ${originalFn.node}`); + } + } + return transformedFn; +} +function insertNewOutlinedFunctionNode(program, originalFn, compiledFn) { + var _a, _b, _c; + switch (originalFn.type) { + case 'FunctionDeclaration': { + return originalFn.insertAfter(createNewFunctionNode(originalFn, compiledFn))[0]; + } + case 'ArrowFunctionExpression': + case 'FunctionExpression': { + const fn = { + type: 'FunctionDeclaration', + id: compiledFn.id, + loc: (_a = originalFn.node.loc) !== null && _a !== void 0 ? _a : null, + async: compiledFn.async, + generator: compiledFn.generator, + params: compiledFn.params, + body: compiledFn.body, + }; + const insertedFuncDecl = program.pushContainer('body', [fn])[0]; + CompilerError.invariant(insertedFuncDecl.isFunctionDeclaration(), { + reason: 'Expected inserted function declaration', + description: `Got: ${insertedFuncDecl}`, + details: [ + { + kind: 'error', + loc: (_c = (_b = insertedFuncDecl.node) === null || _b === void 0 ? void 0 : _b.loc) !== null && _c !== void 0 ? _c : null, + message: null, + }, + ], + }); + return insertedFuncDecl; + } + default: { + assertExhaustive$1(originalFn, `Inserting unhandled function: ${originalFn}`); + } + } +} +const DEFAULT_ESLINT_SUPPRESSIONS = [ + 'react-hooks/exhaustive-deps', + 'react-hooks/rules-of-hooks', +]; +function isFilePartOfSources(sources, filename) { + if (typeof sources === 'function') { + return sources(filename); + } + for (const prefix of sources) { + if (filename.indexOf(prefix) !== -1) { + return true; + } + } + return false; +} +function compileProgram(program, pass) { + var _a; + if (shouldSkipCompilation(program, pass)) { + return null; + } + const restrictedImportsErr = validateRestrictedImports(program, pass.opts.environment); + if (restrictedImportsErr) { + handleError(restrictedImportsErr, pass, null); + return null; + } + const suppressions = findProgramSuppressions(pass.comments, (_a = pass.opts.eslintSuppressionRules) !== null && _a !== void 0 ? _a : DEFAULT_ESLINT_SUPPRESSIONS, pass.opts.flowSuppressions); + const programContext = new ProgramContext({ + program: program, + opts: pass.opts, + filename: pass.filename, + code: pass.code, + suppressions, + hasModuleScopeOptOut: findDirectiveDisablingMemoization(program.node.directives, pass.opts) != + null, + }); + const queue = findFunctionsToCompile(program, pass, programContext); + const compiledFns = []; + while (queue.length !== 0) { + const current = queue.shift(); + const compiled = processFn(current.fn, current.fnType, programContext); + if (compiled != null) { + for (const outlined of compiled.outlined) { + CompilerError.invariant(outlined.fn.outlined.length === 0, { + reason: 'Unexpected nested outlined functions', + description: null, + details: [ + { + kind: 'error', + loc: outlined.fn.loc, + message: null, + }, + ], + }); + const fn = insertNewOutlinedFunctionNode(program, current.fn, outlined.fn); + fn.skip(); + programContext.alreadyCompiled.add(fn.node); + if (outlined.type !== null) { + queue.push({ + kind: 'outlined', + fn, + fnType: outlined.type, + }); + } + } + compiledFns.push({ + kind: current.kind, + originalFn: current.fn, + compiledFn: compiled, + }); + } + } + if (programContext.hasModuleScopeOptOut) { + if (compiledFns.length > 0) { + const error = new CompilerError(); + error.pushErrorDetail(new CompilerErrorDetail({ + reason: 'Unexpected compiled functions when module scope opt-out is present', + category: ErrorCategory.Invariant, + loc: null, + })); + handleError(error, programContext, null); + } + return null; + } + applyCompiledFunctions(program, compiledFns, pass, programContext); + return { + retryErrors: programContext.retryErrors, + inferredEffectLocations: programContext.inferredEffectLocations, + }; +} +function findFunctionsToCompile(program, pass, programContext) { + var _a; + const queue = []; + const traverseFunction = (fn, pass) => { + if (pass.opts.compilationMode === 'all' && + fn.scope.getProgramParent() !== fn.scope.parent) { + return; + } + const fnType = getReactFunctionType(fn, pass); + if (pass.opts.environment.validateNoDynamicallyCreatedComponentsOrHooks) { + validateNoDynamicallyCreatedComponentsOrHooks(fn, pass, programContext); + } + if (fnType === null || programContext.alreadyCompiled.has(fn.node)) { + return; + } + programContext.alreadyCompiled.add(fn.node); + fn.skip(); + queue.push({ kind: 'original', fn, fnType }); + }; + program.traverse({ + ClassDeclaration(node) { + node.skip(); + }, + ClassExpression(node) { + node.skip(); + }, + FunctionDeclaration: traverseFunction, + FunctionExpression: traverseFunction, + ArrowFunctionExpression: traverseFunction, + }, Object.assign(Object.assign({}, pass), { opts: Object.assign(Object.assign({}, pass.opts), pass.opts), filename: (_a = pass.filename) !== null && _a !== void 0 ? _a : null })); + return queue; +} +function processFn(fn, fnType, programContext) { + var _a, _b, _c, _d, _e, _f, _g, _h; + let directives; + if (fn.node.body.type !== 'BlockStatement') { + directives = { + optIn: null, + optOut: null, + }; + } + else { + const optIn = tryFindDirectiveEnablingMemoization(fn.node.body.directives, programContext.opts); + if (optIn.isErr()) { + handleError(optIn.unwrapErr(), programContext, (_a = fn.node.loc) !== null && _a !== void 0 ? _a : null); + return null; + } + directives = { + optIn: optIn.unwrapOr(null), + optOut: findDirectiveDisablingMemoization(fn.node.body.directives, programContext.opts), + }; + } + let compiledFn; + const compileResult = tryCompileFunction(fn, fnType, programContext); + if (compileResult.kind === 'error') { + if (directives.optOut != null) { + logError(compileResult.error, programContext, (_b = fn.node.loc) !== null && _b !== void 0 ? _b : null); + } + else { + handleError(compileResult.error, programContext, (_c = fn.node.loc) !== null && _c !== void 0 ? _c : null); + } + const retryResult = retryCompileFunction(fn, fnType, programContext); + if (retryResult == null) { + return null; + } + compiledFn = retryResult; + } + else { + compiledFn = compileResult.compiledFn; + } + if (programContext.opts.ignoreUseNoForget === false && + directives.optOut != null) { + programContext.logEvent({ + kind: 'CompileSkip', + fnLoc: (_d = fn.node.body.loc) !== null && _d !== void 0 ? _d : null, + reason: `Skipped due to '${directives.optOut.value}' directive.`, + loc: (_e = directives.optOut.loc) !== null && _e !== void 0 ? _e : null, + }); + return null; + } + programContext.logEvent({ + kind: 'CompileSuccess', + fnLoc: (_f = fn.node.loc) !== null && _f !== void 0 ? _f : null, + fnName: (_h = (_g = compiledFn.id) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : null, + memoSlots: compiledFn.memoSlotsUsed, + memoBlocks: compiledFn.memoBlocks, + memoValues: compiledFn.memoValues, + prunedMemoBlocks: compiledFn.prunedMemoBlocks, + prunedMemoValues: compiledFn.prunedMemoValues, + }); + if (programContext.hasModuleScopeOptOut) { + return null; + } + else if (programContext.opts.noEmit) { + for (const loc of compiledFn.inferredEffectLocations) { + if (loc !== GeneratedSource) { + programContext.inferredEffectLocations.add(loc); + } + } + return null; + } + else if (programContext.opts.compilationMode === 'annotation' && + directives.optIn == null) { + return null; + } + else { + return compiledFn; + } +} +function tryCompileFunction(fn, fnType, programContext) { + const suppressionsInFunction = filterSuppressionsThatAffectFunction(programContext.suppressions, fn); + if (suppressionsInFunction.length > 0) { + return { + kind: 'error', + error: suppressionsToCompilerError(suppressionsInFunction), + }; + } + try { + return { + kind: 'compile', + compiledFn: compileFn(fn, programContext.opts.environment, fnType, 'all_features', programContext, programContext.opts.logger, programContext.filename, programContext.code), + }; + } + catch (err) { + return { kind: 'error', error: err }; + } +} +function retryCompileFunction(fn, fnType, programContext) { + const environment = programContext.opts.environment; + if (!(environment.enableFire || environment.inferEffectDependencies != null)) { + return null; + } + try { + const retryResult = compileFn(fn, environment, fnType, 'no_inferred_memo', programContext, programContext.opts.logger, programContext.filename, programContext.code); + if (!retryResult.hasFireRewrite && !retryResult.hasInferredEffect) { + return null; + } + return retryResult; + } + catch (err) { + if (err instanceof CompilerError) { + programContext.retryErrors.push({ fn, error: err }); + } + return null; + } +} +function applyCompiledFunctions(program, compiledFns, pass, programContext) { + var _a, _b; + let referencedBeforeDeclared = null; + for (const result of compiledFns) { + const { kind, originalFn, compiledFn } = result; + const transformedFn = createNewFunctionNode(originalFn, compiledFn); + programContext.alreadyCompiled.add(transformedFn); + let dynamicGating = null; + if (originalFn.node.body.type === 'BlockStatement') { + const result = findDirectivesDynamicGating(originalFn.node.body.directives, pass.opts); + if (result.isOk()) { + dynamicGating = (_b = (_a = result.unwrap()) === null || _a === void 0 ? void 0 : _a.gating) !== null && _b !== void 0 ? _b : null; + } + } + const functionGating = dynamicGating !== null && dynamicGating !== void 0 ? dynamicGating : pass.opts.gating; + if (kind === 'original' && functionGating != null) { + referencedBeforeDeclared !== null && referencedBeforeDeclared !== void 0 ? referencedBeforeDeclared : (referencedBeforeDeclared = getFunctionReferencedBeforeDeclarationAtTopLevel(program, compiledFns)); + insertGatedFunctionDeclaration(originalFn, transformedFn, programContext, functionGating, referencedBeforeDeclared.has(result)); + } + else { + originalFn.replaceWith(transformedFn); + } + } + if (compiledFns.length > 0) { + addImportsToProgram(program, programContext); + } +} +function shouldSkipCompilation(program, pass) { + if (pass.opts.sources) { + if (pass.filename === null) { + const error = new CompilerError(); + error.pushErrorDetail(new CompilerErrorDetail({ + reason: `Expected a filename but found none.`, + description: "When the 'sources' config options is specified, the React compiler will only compile files with a name", + category: ErrorCategory.Config, + loc: null, + })); + handleError(error, pass, null); + return true; + } + if (!isFilePartOfSources(pass.opts.sources, pass.filename)) { + return true; + } + } + if (hasMemoCacheFunctionImport(program, getReactCompilerRuntimeModule(pass.opts.target))) { + return true; + } + return false; +} +function validateNoDynamicallyCreatedComponentsOrHooks(fn, pass, programContext) { + const parentNameExpr = getFunctionName$1(fn); + const parentName = parentNameExpr !== null && parentNameExpr.isIdentifier() + ? parentNameExpr.node.name + : ''; + const validateNestedFunction = (nestedFn) => { + var _a, _b, _c, _d; + if (nestedFn.node === fn.node || + programContext.alreadyCompiled.has(nestedFn.node)) { + return; + } + if (nestedFn.scope.getProgramParent() !== nestedFn.scope.parent) { + const nestedFnType = getReactFunctionType(nestedFn, pass); + const nestedFnNameExpr = getFunctionName$1(nestedFn); + const nestedName = nestedFnNameExpr !== null && nestedFnNameExpr.isIdentifier() + ? nestedFnNameExpr.node.name + : ''; + if (nestedFnType === 'Component' || nestedFnType === 'Hook') { + CompilerError.throwDiagnostic({ + category: ErrorCategory.Factories, + reason: `Components and hooks cannot be created dynamically`, + description: `The function \`${nestedName}\` appears to be a React ${nestedFnType.toLowerCase()}, but it's defined inside \`${parentName}\`. Components and Hooks should always be declared at module scope`, + details: [ + { + kind: 'error', + message: 'this function dynamically created a component/hook', + loc: (_b = (_a = parentNameExpr === null || parentNameExpr === void 0 ? void 0 : parentNameExpr.node.loc) !== null && _a !== void 0 ? _a : fn.node.loc) !== null && _b !== void 0 ? _b : null, + }, + { + kind: 'error', + message: 'the component is created here', + loc: (_d = (_c = nestedFnNameExpr === null || nestedFnNameExpr === void 0 ? void 0 : nestedFnNameExpr.node.loc) !== null && _c !== void 0 ? _c : nestedFn.node.loc) !== null && _d !== void 0 ? _d : null, + }, + ], + }); + } + } + nestedFn.skip(); + }; + fn.traverse({ + FunctionDeclaration: validateNestedFunction, + FunctionExpression: validateNestedFunction, + ArrowFunctionExpression: validateNestedFunction, + }); +} +function getReactFunctionType(fn, pass) { + var _a, _b; + const hookPattern = pass.opts.environment.hookPattern; + if (fn.node.body.type === 'BlockStatement') { + const optInDirectives = tryFindDirectiveEnablingMemoization(fn.node.body.directives, pass.opts); + if (optInDirectives.unwrapOr(null) != null) { + return (_a = getComponentOrHookLike(fn, hookPattern)) !== null && _a !== void 0 ? _a : 'Other'; + } + } + let componentSyntaxType = null; + if (fn.isFunctionDeclaration()) { + if (isComponentDeclaration(fn.node)) { + componentSyntaxType = 'Component'; + } + else if (isHookDeclaration(fn.node)) { + componentSyntaxType = 'Hook'; + } + } + switch (pass.opts.compilationMode) { + case 'annotation': { + return null; + } + case 'infer': { + return componentSyntaxType !== null && componentSyntaxType !== void 0 ? componentSyntaxType : getComponentOrHookLike(fn, hookPattern); + } + case 'syntax': { + return componentSyntaxType; + } + case 'all': { + return (_b = getComponentOrHookLike(fn, hookPattern)) !== null && _b !== void 0 ? _b : 'Other'; + } + default: { + assertExhaustive$1(pass.opts.compilationMode, `Unexpected compilationMode \`${pass.opts.compilationMode}\``); + } + } +} +function hasMemoCacheFunctionImport(program, moduleName) { + let hasUseMemoCache = false; + program.traverse({ + ImportSpecifier(path) { + const imported = path.get('imported'); + let importedName = null; + if (imported.isIdentifier()) { + importedName = imported.node.name; + } + else if (imported.isStringLiteral()) { + importedName = imported.node.value; + } + if (importedName === 'c' && + path.parentPath.isImportDeclaration() && + path.parentPath.get('source').node.value === moduleName) { + hasUseMemoCache = true; + } + }, + }); + return hasUseMemoCache; +} +function isHookName$1(s, hookPattern) { + if (hookPattern !== null) { + return new RegExp(hookPattern).test(s); + } + return /^use[A-Z0-9]/.test(s); +} +function isHook$1(path, hookPattern) { + if (path.isIdentifier()) { + return isHookName$1(path.node.name, hookPattern); + } + else if (path.isMemberExpression() && + !path.node.computed && + isHook$1(path.get('property'), hookPattern)) { + const obj = path.get('object').node; + const isPascalCaseNameSpace = /^[A-Z].*/; + return obj.type === 'Identifier' && isPascalCaseNameSpace.test(obj.name); + } + else { + return false; + } +} +function isComponentName$1(path) { + return path.isIdentifier() && /^[A-Z]/.test(path.node.name); +} +function isReactAPI(path, functionName) { + const node = path.node; + return ((node.type === 'Identifier' && node.name === functionName) || + (node.type === 'MemberExpression' && + node.object.type === 'Identifier' && + node.object.name === 'React' && + node.property.type === 'Identifier' && + node.property.name === functionName)); +} +function isForwardRefCallback$1(path) { + return !!(path.parentPath.isCallExpression() && + path.parentPath.get('callee').isExpression() && + isReactAPI(path.parentPath.get('callee'), 'forwardRef')); +} +function isMemoCallback$1(path) { + return (path.parentPath.isCallExpression() && + path.parentPath.get('callee').isExpression() && + isReactAPI(path.parentPath.get('callee'), 'memo')); +} +function isValidPropsAnnotation(annot) { + if (annot == null) { + return true; + } + else if (annot.type === 'TSTypeAnnotation') { + switch (annot.typeAnnotation.type) { + case 'TSArrayType': + case 'TSBigIntKeyword': + case 'TSBooleanKeyword': + case 'TSConstructorType': + case 'TSFunctionType': + case 'TSLiteralType': + case 'TSNeverKeyword': + case 'TSNumberKeyword': + case 'TSStringKeyword': + case 'TSSymbolKeyword': + case 'TSTupleType': + return false; + } + return true; + } + else if (annot.type === 'TypeAnnotation') { + switch (annot.typeAnnotation.type) { + case 'ArrayTypeAnnotation': + case 'BooleanLiteralTypeAnnotation': + case 'BooleanTypeAnnotation': + case 'EmptyTypeAnnotation': + case 'FunctionTypeAnnotation': + case 'NumberLiteralTypeAnnotation': + case 'NumberTypeAnnotation': + case 'StringLiteralTypeAnnotation': + case 'StringTypeAnnotation': + case 'SymbolTypeAnnotation': + case 'ThisTypeAnnotation': + case 'TupleTypeAnnotation': + return false; + } + return true; + } + else if (annot.type === 'Noop') { + return true; + } + else { + assertExhaustive$1(annot, `Unexpected annotation node \`${annot}\``); + } +} +function isValidComponentParams(params) { + if (params.length === 0) { + return true; + } + else if (params.length > 0 && params.length <= 2) { + if (!isValidPropsAnnotation(params[0].node.typeAnnotation)) { + return false; + } + if (params.length === 1) { + return !params[0].isRestElement(); + } + else if (params[1].isIdentifier()) { + const { name } = params[1].node; + return name.includes('ref') || name.includes('Ref'); + } + else { + return false; + } + } + return false; +} +function getComponentOrHookLike(node, hookPattern) { + const functionName = getFunctionName$1(node); + if (functionName !== null && isComponentName$1(functionName)) { + let isComponent = callsHooksOrCreatesJsx(node, hookPattern) && + isValidComponentParams(node.get('params')) && + !returnsNonNode(node); + return isComponent ? 'Component' : null; + } + else if (functionName !== null && isHook$1(functionName, hookPattern)) { + return callsHooksOrCreatesJsx(node, hookPattern) ? 'Hook' : null; + } + if (node.isFunctionExpression() || node.isArrowFunctionExpression()) { + if (isForwardRefCallback$1(node) || isMemoCallback$1(node)) { + return callsHooksOrCreatesJsx(node, hookPattern) ? 'Component' : null; + } + } + return null; +} +function skipNestedFunctions(node) { + return (fn) => { + if (fn.node !== node.node) { + fn.skip(); + } + }; +} +function callsHooksOrCreatesJsx(node, hookPattern) { + let invokesHooks = false; + let createsJsx = false; + node.traverse({ + JSX() { + createsJsx = true; + }, + CallExpression(call) { + const callee = call.get('callee'); + if (callee.isExpression() && isHook$1(callee, hookPattern)) { + invokesHooks = true; + } + }, + ArrowFunctionExpression: skipNestedFunctions(node), + FunctionExpression: skipNestedFunctions(node), + FunctionDeclaration: skipNestedFunctions(node), + }); + return invokesHooks || createsJsx; +} +function isNonNode(node) { + if (!node) { + return true; + } + switch (node.type) { + case 'ObjectExpression': + case 'ArrowFunctionExpression': + case 'FunctionExpression': + case 'BigIntLiteral': + case 'ClassExpression': + case 'NewExpression': + return true; + } + return false; +} +function returnsNonNode(node) { + let returnsNonNode = false; + if (node.type === 'ArrowFunctionExpression' && + node.node.body.type !== 'BlockStatement') { + returnsNonNode = isNonNode(node.node.body); + } + node.traverse({ + ReturnStatement(ret) { + returnsNonNode = isNonNode(ret.node.argument); + }, + ArrowFunctionExpression: skipNestedFunctions(node), + FunctionExpression: skipNestedFunctions(node), + FunctionDeclaration: skipNestedFunctions(node), + ObjectMethod: node => node.skip(), + }); + return returnsNonNode; +} +function getFunctionName$1(path) { + if (path.isFunctionDeclaration()) { + const id = path.get('id'); + if (id.isIdentifier()) { + return id; + } + return null; + } + let id = null; + const parent = path.parentPath; + if (parent.isVariableDeclarator() && parent.get('init').node === path.node) { + id = parent.get('id'); + } + else if (parent.isAssignmentExpression() && + parent.get('right').node === path.node && + parent.get('operator') === '=') { + id = parent.get('left'); + } + else if (parent.isProperty() && + parent.get('value').node === path.node && + !parent.get('computed') && + parent.get('key').isLVal()) { + id = parent.get('key'); + } + else if (parent.isAssignmentPattern() && + parent.get('right').node === path.node && + !parent.get('computed')) { + id = parent.get('left'); + } + if (id !== null && (id.isIdentifier() || id.isMemberExpression())) { + return id; + } + else { + return null; + } +} +function getFunctionReferencedBeforeDeclarationAtTopLevel(program, fns) { + const fnNames = new Map(fns + .map(fn => [ + getFunctionName$1(fn.originalFn), + fn, + ]) + .filter((entry) => !!entry[0] && entry[0].isIdentifier()) + .map(entry => [entry[0].node.name, { id: entry[0].node, fn: entry[1] }])); + const referencedBeforeDeclaration = new Set(); + program.traverse({ + TypeAnnotation(path) { + path.skip(); + }, + TSTypeAnnotation(path) { + path.skip(); + }, + TypeAlias(path) { + path.skip(); + }, + TSTypeAliasDeclaration(path) { + path.skip(); + }, + Identifier(id) { + const fn = fnNames.get(id.node.name); + if (!fn) { + return; + } + if (id.node === fn.id) { + fnNames.delete(id.node.name); + return; + } + const scope = id.scope.getFunctionParent(); + if (scope === null && id.isReferencedIdentifier()) { + referencedBeforeDeclaration.add(fn.fn); + } + }, + }); + return referencedBeforeDeclaration; +} +function getReactCompilerRuntimeModule(target) { + if (target === '19') { + return 'react/compiler-runtime'; + } + else if (target === '17' || target === '18') { + return 'react-compiler-runtime'; + } + else { + CompilerError.invariant(target != null && + target.kind === 'donotuse_meta_internal' && + typeof target.runtimeModule === 'string', { + reason: 'Expected target to already be validated', + description: null, + details: [ + { + kind: 'error', + loc: null, + message: null, + }, + ], + suggestions: null, + }); + return target.runtimeModule; + } +} + +function validateRestrictedImports(path, { validateBlocklistedImports }) { + if (validateBlocklistedImports == null || + validateBlocklistedImports.length === 0) { + return null; + } + const error = new CompilerError(); + const restrictedImports = new Set(validateBlocklistedImports); + path.traverse({ + ImportDeclaration(importDeclPath) { + var _a; + if (restrictedImports.has(importDeclPath.node.source.value)) { + error.push({ + category: ErrorCategory.Todo, + reason: 'Bailing out due to blocklisted import', + description: `Import from module ${importDeclPath.node.source.value}`, + loc: (_a = importDeclPath.node.loc) !== null && _a !== void 0 ? _a : null, + }); + } + }, + }); + if (error.hasAnyErrors()) { + return error; + } + else { + return null; + } +} +class ProgramContext { + constructor({ program, suppressions, opts, filename, code, hasModuleScopeOptOut, }) { + this.alreadyCompiled = new (WeakSet !== null && WeakSet !== void 0 ? WeakSet : Set)(); + this.knownReferencedNames = new Set(); + this.imports = new Map(); + this.retryErrors = []; + this.inferredEffectLocations = new Set(); + this.scope = program.scope; + this.opts = opts; + this.filename = filename; + this.code = code; + this.reactRuntimeModule = getReactCompilerRuntimeModule(opts.target); + this.suppressions = suppressions; + this.hasModuleScopeOptOut = hasModuleScopeOptOut; + } + isHookName(name) { + if (this.opts.environment.hookPattern == null) { + return isHookName$2(name); + } + else { + const match = new RegExp(this.opts.environment.hookPattern).exec(name); + return (match != null && typeof match[1] === 'string' && isHookName$2(match[1])); + } + } + hasReference(name) { + return (this.knownReferencedNames.has(name) || + this.scope.hasBinding(name) || + this.scope.hasGlobal(name) || + this.scope.hasReference(name)); + } + newUid(name) { + let uid; + if (this.isHookName(name)) { + uid = name; + let i = 0; + while (this.hasReference(uid)) { + this.knownReferencedNames.add(uid); + uid = `${name}_${i++}`; + } + } + else if (!this.hasReference(name)) { + uid = name; + } + else { + uid = this.scope.generateUid(name); + } + this.knownReferencedNames.add(uid); + return uid; + } + addMemoCacheImport() { + return this.addImportSpecifier({ + source: this.reactRuntimeModule, + importSpecifierName: 'c', + }, '_c'); + } + addImportSpecifier({ source: module, importSpecifierName: specifier }, nameHint) { + var _a; + const maybeBinding = (_a = this.imports.get(module)) === null || _a === void 0 ? void 0 : _a.get(specifier); + if (maybeBinding != null) { + return Object.assign({}, maybeBinding); + } + const binding = { + kind: 'ImportSpecifier', + name: this.newUid(nameHint !== null && nameHint !== void 0 ? nameHint : specifier), + module, + imported: specifier, + }; + getOrInsertWith(this.imports, module, () => new Map()).set(specifier, Object.assign({}, binding)); + return binding; + } + addNewReference(name) { + this.knownReferencedNames.add(name); + } + assertGlobalBinding(name, localScope) { + var _a, _b; + const scope = localScope !== null && localScope !== void 0 ? localScope : this.scope; + if (!scope.hasReference(name) && !scope.hasBinding(name)) { + return Ok(undefined); + } + const error = new CompilerError(); + error.push({ + category: ErrorCategory.Todo, + reason: 'Encountered conflicting global in generated program', + description: `Conflict from local binding ${name}`, + loc: (_b = (_a = scope.getBinding(name)) === null || _a === void 0 ? void 0 : _a.path.node.loc) !== null && _b !== void 0 ? _b : null, + suggestions: null, + }); + return Err(error); + } + logEvent(event) { + if (this.opts.logger != null) { + this.opts.logger.logEvent(this.filename, event); + } + } +} +function getExistingImports(program) { + const existingImports = new Map(); + program.traverse({ + ImportDeclaration(path) { + if (isNonNamespacedImport(path)) { + existingImports.set(path.node.source.value, path); + } + }, + }); + return existingImports; +} +function addImportsToProgram(path, programContext) { + const existingImports = getExistingImports(path); + const stmts = []; + const sortedModules = [...programContext.imports.entries()].sort(([a], [b]) => a.localeCompare(b)); + for (const [moduleName, importsMap] of sortedModules) { + for (const [specifierName, loweredImport] of importsMap) { + CompilerError.invariant(path.scope.getBinding(loweredImport.name) == null, { + reason: 'Encountered conflicting import specifiers in generated program', + description: `Conflict from import ${loweredImport.module}:(${loweredImport.imported} as ${loweredImport.name})`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + suggestions: null, + }); + CompilerError.invariant(loweredImport.module === moduleName && + loweredImport.imported === specifierName, { + reason: 'Found inconsistent import specifier. This is an internal bug.', + description: `Expected import ${moduleName}:${specifierName} but found ${loweredImport.module}:${loweredImport.imported}`, + details: [ + { + kind: 'error', + loc: GeneratedSource, + message: null, + }, + ], + }); + } + const sortedImport = [ + ...importsMap.values(), + ].sort(({ imported: a }, { imported: b }) => a.localeCompare(b)); + const importSpecifiers = sortedImport.map(specifier => { + return libExports$1.importSpecifier(libExports$1.identifier(specifier.name), libExports$1.identifier(specifier.imported)); + }); + const maybeExistingImports = existingImports.get(moduleName); + if (maybeExistingImports != null) { + maybeExistingImports.pushContainer('specifiers', importSpecifiers); + } + else { + if (path.node.sourceType === 'module') { + stmts.push(libExports$1.importDeclaration(importSpecifiers, libExports$1.stringLiteral(moduleName))); + } + else { + stmts.push(libExports$1.variableDeclaration('const', [ + libExports$1.variableDeclarator(libExports$1.objectPattern(sortedImport.map(specifier => { + return libExports$1.objectProperty(libExports$1.identifier(specifier.imported), libExports$1.identifier(specifier.name)); + })), libExports$1.callExpression(libExports$1.identifier('require'), [ + libExports$1.stringLiteral(moduleName), + ])), + ])); + } + } + } + path.unshiftContainer('body', stmts); +} +function isNonNamespacedImport(importDeclPath) { + return (importDeclPath + .get('specifiers') + .every(specifier => specifier.isImportSpecifier()) && + importDeclPath.node.importKind !== 'type' && + importDeclPath.node.importKind !== 'typeof'); +} + +zod.z.enum([ + 'all_errors', + 'critical_errors', + 'none', +]); +const DynamicGatingOptionsSchema = zod.z.object({ + source: zod.z.string(), +}); +const CustomOptOutDirectiveSchema = zod.z + .nullable(zod.z.array(zod.z.string())) + .default(null); +const CompilerReactTargetSchema = zod.z.union([ + zod.z.literal('17'), + zod.z.literal('18'), + zod.z.literal('19'), + zod.z.object({ + kind: zod.z.literal('donotuse_meta_internal'), + runtimeModule: zod.z.string().default('react'), + }), +]); +zod.z.enum([ + 'infer', + 'syntax', + 'annotation', + 'all', +]); +const defaultOptions = { + compilationMode: 'infer', + panicThreshold: 'none', + environment: parseEnvironmentConfig({}).unwrap(), + logger: null, + gating: null, + noEmit: false, + dynamicGating: null, + eslintSuppressionRules: null, + flowSuppressions: true, + ignoreUseNoForget: false, + sources: filename => { + return filename.indexOf('node_modules') === -1; + }, + enableReanimatedCheck: true, + customOptOutDirectives: null, + target: '19', +}; +function parsePluginOptions(obj) { + if (obj == null || typeof obj !== 'object') { + return defaultOptions; + } + const parsedOptions = Object.create(null); + for (let [key, value] of Object.entries(obj)) { + if (typeof value === 'string') { + value = value.toLowerCase(); + } + if (isCompilerFlag(key)) { + switch (key) { + case 'environment': { + const environmentResult = parseEnvironmentConfig(value); + if (environmentResult.isErr()) { + CompilerError.throwInvalidConfig({ + reason: 'Error in validating environment config. This is an advanced setting and not meant to be used directly', + description: environmentResult.unwrapErr().toString(), + suggestions: null, + loc: null, + }); + } + parsedOptions[key] = environmentResult.unwrap(); + break; + } + case 'target': { + parsedOptions[key] = parseTargetConfig(value); + break; + } + case 'gating': { + if (value == null) { + parsedOptions[key] = null; + } + else { + parsedOptions[key] = tryParseExternalFunction(value); + } + break; + } + case 'dynamicGating': { + if (value == null) { + parsedOptions[key] = null; + } + else { + const result = DynamicGatingOptionsSchema.safeParse(value); + if (result.success) { + parsedOptions[key] = result.data; + } + else { + CompilerError.throwInvalidConfig({ + reason: 'Could not parse dynamic gating. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(result.error)}`, + loc: null, + suggestions: null, + }); + } + } + break; + } + case 'customOptOutDirectives': { + const result = CustomOptOutDirectiveSchema.safeParse(value); + if (result.success) { + parsedOptions[key] = result.data; + } + else { + CompilerError.throwInvalidConfig({ + reason: 'Could not parse custom opt out directives. Update React Compiler config to fix the error', + description: `${zodValidationError.fromZodError(result.error)}`, + loc: null, + suggestions: null, + }); + } + break; + } + default: { + parsedOptions[key] = value; + } + } + } + } + return Object.assign(Object.assign({}, defaultOptions), parsedOptions); +} +function parseTargetConfig(value) { + const parsed = CompilerReactTargetSchema.safeParse(value); + if (parsed.success) { + return parsed.data; + } + else { + CompilerError.throwInvalidConfig({ + reason: 'Not a valid target', + description: `${zodValidationError.fromZodError(parsed.error)}`, + suggestions: null, + loc: null, + }); + } +} +function isCompilerFlag(s) { + return hasOwnProperty$1(defaultOptions, s); +} + +function hasModule(name) { + if (typeof require === 'undefined') { + return false; + } + try { + return !!require.resolve(name); + } + catch (error) { + if (error.code === 'MODULE_NOT_FOUND' && + error.message.indexOf(name) !== -1) { + return false; + } + throw error; + } +} +function pipelineUsesReanimatedPlugin(plugins) { + if (Array.isArray(plugins)) { + for (const plugin of plugins) { + if (hasOwnProperty$1(plugin, 'key')) { + const key = plugin.key; + if (typeof key === 'string' && + key.indexOf('react-native-reanimated') !== -1) { + return true; + } + } + } + } + return hasModule('react-native-reanimated'); +} +function injectReanimatedFlag(options) { + return Object.assign(Object.assign({}, options), { environment: Object.assign(Object.assign({}, options.environment), { enableCustomTypeDefinitionForReanimated: true }) }); +} + +function throwInvalidReact(options, { logger, filename }) { + logger === null || logger === void 0 ? void 0 : logger.logEvent(filename, { + kind: 'CompileError', + fnLoc: null, + detail: new CompilerDiagnostic(options), + }); + CompilerError.throwDiagnostic(options); +} +function isAutodepsSigil(arg) { + if (arg.isIdentifier() && arg.node.name === 'AUTODEPS') { + const binding = arg.scope.getBinding(arg.node.name); + if (binding && binding.path.isImportSpecifier()) { + const importSpecifier = binding.path.node; + if (importSpecifier.imported.type === 'Identifier') { + return importSpecifier.imported.name === 'AUTODEPS'; + } + } + return false; + } + if (arg.isMemberExpression() && !arg.node.computed) { + const object = arg.get('object'); + const property = arg.get('property'); + if (object.isIdentifier() && + object.node.name === 'React' && + property.isIdentifier() && + property.node.name === 'AUTODEPS') { + return true; + } + } + return false; +} +function assertValidEffectImportReference(autodepsIndex, paths, context) { + var _a; + for (const path of paths) { + const parent = path.parentPath; + if (parent != null && parent.isCallExpression()) { + const args = parent.get('arguments'); + const maybeCalleeLoc = path.node.loc; + const hasInferredEffect = maybeCalleeLoc != null && + context.inferredEffectLocations.has(maybeCalleeLoc); + const hasAutodepsArg = args.some(isAutodepsSigil); + if (hasAutodepsArg && !hasInferredEffect) { + const maybeErrorDiagnostic = matchCompilerDiagnostic(path, context.transformErrors); + throwInvalidReact({ + category: ErrorCategory.AutomaticEffectDependencies, + reason: 'Cannot infer dependencies of this effect. This will break your build!', + description: 'To resolve, either pass a dependency array or fix reported compiler bailout diagnostics' + + (maybeErrorDiagnostic ? ` ${maybeErrorDiagnostic}` : ''), + details: [ + { + kind: 'error', + message: 'Cannot infer dependencies', + loc: (_a = parent.node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }, + ], + }, context); + } + } + } +} +function assertValidFireImportReference(paths, context) { + var _a; + if (paths.length > 0) { + const maybeErrorDiagnostic = matchCompilerDiagnostic(paths[0], context.transformErrors); + throwInvalidReact({ + category: ErrorCategory.Fire, + reason: '[Fire] Untransformed reference to compiler-required feature.', + description: 'Either remove this `fire` call or ensure it is successfully transformed by the compiler' + + (maybeErrorDiagnostic != null ? ` ${maybeErrorDiagnostic}` : ''), + details: [ + { + kind: 'error', + message: 'Untransformed `fire` call', + loc: (_a = paths[0].node.loc) !== null && _a !== void 0 ? _a : GeneratedSource, + }, + ], + }, context); + } +} +function validateNoUntransformedReferences(path, filename, logger, env, compileResult) { + const moduleLoadChecks = new Map(); + if (env.enableFire) { + for (const module of Environment.knownReactModules) { + const react = getOrInsertWith(moduleLoadChecks, module, () => new Map()); + react.set('fire', assertValidFireImportReference); + } + } + if (env.inferEffectDependencies) { + for (const { function: { source, importSpecifierName }, autodepsIndex, } of env.inferEffectDependencies) { + const module = getOrInsertWith(moduleLoadChecks, source, () => new Map()); + module.set(importSpecifierName, assertValidEffectImportReference.bind(null, autodepsIndex)); + } + } + if (moduleLoadChecks.size > 0) { + transformProgram(path, moduleLoadChecks, filename, logger, compileResult); + } +} +function validateImportSpecifier(specifier, importSpecifierChecks, state) { + var _a; + const imported = specifier.get('imported'); + const specifierName = imported.node.type === 'Identifier' + ? imported.node.name + : imported.node.value; + const checkFn = importSpecifierChecks.get(specifierName); + if (checkFn == null) { + return; + } + if (state.shouldInvalidateScopes) { + state.shouldInvalidateScopes = false; + state.program.scope.crawl(); + } + const local = specifier.get('local'); + const binding = local.scope.getBinding(local.node.name); + CompilerError.invariant(binding != null, { + reason: 'Expected binding to be found for import specifier', + description: null, + details: [ + { + kind: 'error', + loc: (_a = local.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + checkFn(binding.referencePaths, state); +} +function validateNamespacedImport(specifier, importSpecifierChecks, state) { + var _a; + if (state.shouldInvalidateScopes) { + state.shouldInvalidateScopes = false; + state.program.scope.crawl(); + } + const local = specifier.get('local'); + const binding = local.scope.getBinding(local.node.name); + const defaultCheckFn = importSpecifierChecks.get(DEFAULT_EXPORT); + CompilerError.invariant(binding != null, { + reason: 'Expected binding to be found for import specifier', + description: null, + details: [ + { + kind: 'error', + loc: (_a = local.node.loc) !== null && _a !== void 0 ? _a : null, + message: null, + }, + ], + }); + const filteredReferences = new Map(); + for (const reference of binding.referencePaths) { + if (defaultCheckFn != null) { + getOrInsertWith(filteredReferences, defaultCheckFn, () => []).push(reference); + } + const parent = reference.parentPath; + if (parent != null && + parent.isMemberExpression() && + parent.get('object') === reference) { + if (parent.node.computed || parent.node.property.type !== 'Identifier') { + continue; + } + const checkFn = importSpecifierChecks.get(parent.node.property.name); + if (checkFn != null) { + getOrInsertWith(filteredReferences, checkFn, () => []).push(parent); + } + } + } + for (const [checkFn, references] of filteredReferences) { + checkFn(references, state); + } +} +function transformProgram(path, moduleLoadChecks, filename, logger, compileResult) { + var _a, _b; + const traversalState = { + shouldInvalidateScopes: true, + program: path, + filename, + logger, + transformErrors: (_a = compileResult === null || compileResult === void 0 ? void 0 : compileResult.retryErrors) !== null && _a !== void 0 ? _a : [], + inferredEffectLocations: (_b = compileResult === null || compileResult === void 0 ? void 0 : compileResult.inferredEffectLocations) !== null && _b !== void 0 ? _b : new Set(), + }; + path.traverse({ + ImportDeclaration(path) { + const importSpecifierChecks = moduleLoadChecks.get(path.node.source.value); + if (importSpecifierChecks == null) { + return; + } + const specifiers = path.get('specifiers'); + for (const specifier of specifiers) { + if (specifier.isImportSpecifier()) { + validateImportSpecifier(specifier, importSpecifierChecks, traversalState); + } + else { + validateNamespacedImport(specifier, importSpecifierChecks, traversalState); + } + } + }, + }); +} +function matchCompilerDiagnostic(badReference, transformErrors) { + for (const { fn, error } of transformErrors) { + if (fn.isAncestor(badReference)) { + return error.toString(); + } + } + return null; +} + +const ENABLE_REACT_COMPILER_TIMINGS = process.env['ENABLE_REACT_COMPILER_TIMINGS'] === '1'; +function BabelPluginReactCompiler(_babel) { + return { + name: 'react-forget', + visitor: { + Program: { + enter(prog, pass) { + var _a, _b, _c, _d; + try { + const filename = (_a = pass.filename) !== null && _a !== void 0 ? _a : 'unknown'; + if (ENABLE_REACT_COMPILER_TIMINGS === true) { + performance.mark(`${filename}:start`, { + detail: 'BabelPlugin:Program:start', + }); + } + let opts = parsePluginOptions(pass.opts); + const isDev = (typeof false !== 'undefined' && false === true) || + process.env['NODE_ENV'] === 'development'; + if (opts.enableReanimatedCheck === true && + pipelineUsesReanimatedPlugin(pass.file.opts.plugins)) { + opts = injectReanimatedFlag(opts); + } + if (opts.environment.enableResetCacheOnSourceFileChanges !== false && + isDev) { + opts = Object.assign(Object.assign({}, opts), { environment: Object.assign(Object.assign({}, opts.environment), { enableResetCacheOnSourceFileChanges: true }) }); + } + const result = compileProgram(prog, { + opts, + filename: (_b = pass.filename) !== null && _b !== void 0 ? _b : null, + comments: (_c = pass.file.ast.comments) !== null && _c !== void 0 ? _c : [], + code: pass.file.code, + }); + validateNoUntransformedReferences(prog, (_d = pass.filename) !== null && _d !== void 0 ? _d : null, opts.logger, opts.environment, result); + if (ENABLE_REACT_COMPILER_TIMINGS === true) { + performance.mark(`${filename}:end`, { + detail: 'BabelPlugin:Program:end', + }); + } + } + catch (e) { + if (e instanceof CompilerError) { + throw e.withPrintedMessage(pass.file.code, { eslint: false }); + } + throw e; + } + }, + exit(_, pass) { + var _a; + if (ENABLE_REACT_COMPILER_TIMINGS === true) { + const filename = (_a = pass.filename) !== null && _a !== void 0 ? _a : 'unknown'; + const measurement = performance.measure(filename, { + start: `${filename}:start`, + end: `${filename}:end`, + detail: 'BabelPlugin:Program', + }); + if ('logger' in pass.opts && pass.opts.logger != null) { + const logger = pass.opts.logger; + logger.logEvent(filename, { + kind: 'Timing', + measurement, + }); + } + } + }, + }, + }, + }; +} + +var _LRUCache_values, _LRUCache_headIdx; +const COMPILER_OPTIONS = { + noEmit: true, + panicThreshold: 'none', + flowSuppressions: false, + environment: { + validateRefAccessDuringRender: true, + validateNoSetStateInRender: true, + validateNoSetStateInEffects: true, + validateNoJSXInTryStatements: true, + validateNoImpureFunctionsInRender: true, + validateStaticComponents: true, + validateNoFreezingKnownMutableFunctions: true, + validateNoVoidUseMemo: true, + validateNoCapitalizedCalls: [], + validateHooksUsage: true, + validateNoDerivedComputationsInEffects: true, + }, +}; +const FLOW_SUPPRESSION_REGEX = /\$FlowFixMe\[([^\]]*)\]/g; +function getFlowSuppressions(sourceCode) { + const comments = sourceCode.getAllComments(); + const results = []; + for (const commentNode of comments) { + const matches = commentNode.value.matchAll(FLOW_SUPPRESSION_REGEX); + for (const match of matches) { + if (match.index != null && commentNode.loc != null) { + const code = match[1]; + results.push({ + line: commentNode.loc.end.line, + code, + }); + } + } + } + return results; +} +function filterUnusedOptOutDirectives(directives) { + const results = []; + for (const directive of directives) { + if (OPT_OUT_DIRECTIVES.has(directive.value.value) && + directive.loc != null) { + results.push({ + loc: directive.loc, + directive: directive.value.value, + range: [directive.start, directive.end], + }); + } + } + return results; +} +function runReactCompilerImpl({ sourceCode, filename, userOpts, }) { + var _a, _b; + const options = parsePluginOptions(Object.assign(Object.assign(Object.assign({}, COMPILER_OPTIONS), userOpts), { environment: Object.assign(Object.assign({}, COMPILER_OPTIONS.environment), userOpts.environment) })); + const results = { + sourceCode: sourceCode.text, + filename, + userOpts, + flowSuppressions: [], + unusedOptOutDirectives: [], + events: [], + }; + const userLogger = options.logger; + options.logger = { + logEvent: (eventFilename, event) => { + userLogger === null || userLogger === void 0 ? void 0 : userLogger.logEvent(eventFilename, event); + results.events.push(event); + }, + }; + try { + options.environment = validateEnvironmentConfig((_a = options.environment) !== null && _a !== void 0 ? _a : {}); + } + catch (err) { + (_b = options.logger) === null || _b === void 0 ? void 0 : _b.logEvent(filename, err); + } + let babelAST = null; + if (filename.endsWith('.tsx') || filename.endsWith('.ts')) { + try { + babelAST = BabelParser.parse(sourceCode.text, { + sourceFilename: filename, + sourceType: 'unambiguous', + plugins: ['typescript', 'jsx'], + }); + } + catch (_c) { + } + } + else { + try { + babelAST = HermesParser.parse(sourceCode.text, { + babel: true, + enableExperimentalComponentSyntax: true, + sourceFilename: filename, + sourceType: 'module', + }); + } + catch (_d) { + } + } + if (babelAST != null) { + results.flowSuppressions = getFlowSuppressions(sourceCode); + try { + core$1.transformFromAstSync(babelAST, sourceCode.text, { + filename, + highlightCode: false, + retainLines: true, + plugins: [ + [PluginProposalPrivateMethods.default, { loose: true }], + [BabelPluginReactCompiler, options], + ], + sourceType: 'module', + configFile: false, + babelrc: false, + }); + if (results.events.filter(e => e.kind === 'CompileError').length === 0) { + core$1.traverse(babelAST, { + FunctionDeclaration(path) { + results.unusedOptOutDirectives.push(...filterUnusedOptOutDirectives(path.node.body.directives)); + }, + ArrowFunctionExpression(path) { + if (path.node.body.type === 'BlockStatement') { + results.unusedOptOutDirectives.push(...filterUnusedOptOutDirectives(path.node.body.directives)); + } + }, + FunctionExpression(path) { + results.unusedOptOutDirectives.push(...filterUnusedOptOutDirectives(path.node.body.directives)); + }, + }); + } + } + catch (err) { + } + } + return results; +} +const SENTINEL = Symbol(); +class LRUCache { + constructor(size) { + _LRUCache_values.set(this, void 0); + _LRUCache_headIdx.set(this, 0); + __classPrivateFieldSet(this, _LRUCache_values, new Array(size).fill(SENTINEL), "f"); + } + get(key) { + const idx = __classPrivateFieldGet(this, _LRUCache_values, "f").findIndex(entry => entry[0] === key); + if (idx === __classPrivateFieldGet(this, _LRUCache_headIdx, "f")) { + return __classPrivateFieldGet(this, _LRUCache_values, "f")[__classPrivateFieldGet(this, _LRUCache_headIdx, "f")][1]; + } + else if (idx < 0) { + return null; + } + const entry = __classPrivateFieldGet(this, _LRUCache_values, "f")[idx]; + const len = __classPrivateFieldGet(this, _LRUCache_values, "f").length; + for (let i = 0; i < Math.min(idx, len - 1); i++) { + __classPrivateFieldGet(this, _LRUCache_values, "f")[(__classPrivateFieldGet(this, _LRUCache_headIdx, "f") + i + 1) % len] = + __classPrivateFieldGet(this, _LRUCache_values, "f")[(__classPrivateFieldGet(this, _LRUCache_headIdx, "f") + i) % len]; + } + __classPrivateFieldGet(this, _LRUCache_values, "f")[__classPrivateFieldGet(this, _LRUCache_headIdx, "f")] = entry; + return entry[1]; + } + push(key, value) { + __classPrivateFieldSet(this, _LRUCache_headIdx, (__classPrivateFieldGet(this, _LRUCache_headIdx, "f") - 1 + __classPrivateFieldGet(this, _LRUCache_values, "f").length) % __classPrivateFieldGet(this, _LRUCache_values, "f").length, "f"); + __classPrivateFieldGet(this, _LRUCache_values, "f")[__classPrivateFieldGet(this, _LRUCache_headIdx, "f")] = [key, value]; + } +} +_LRUCache_values = new WeakMap(), _LRUCache_headIdx = new WeakMap(); +const cache = new LRUCache(10); +function runReactCompiler({ sourceCode, filename, userOpts, }) { + const entry = cache.get(filename); + if (entry != null && + entry.sourceCode === sourceCode.text && + util.isDeepStrictEqual(entry.userOpts, userOpts)) { + return entry; + } + const runEntry = runReactCompilerImpl({ + sourceCode, + filename, + userOpts, + }); + if (entry != null) { + Object.assign(entry, runEntry); + } + else { + cache.push(filename, runEntry); + } + return Object.assign({}, runEntry); +} + +function assertExhaustive(_, errorMsg) { + throw new Error(errorMsg); +} +function makeSuggestions(detail) { + const suggest = []; + if (Array.isArray(detail.suggestions)) { + for (const suggestion of detail.suggestions) { + switch (suggestion.op) { + case CompilerSuggestionOperation.InsertBefore: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.insertTextBeforeRange(suggestion.range, suggestion.text); + }, + }); + break; + case CompilerSuggestionOperation.InsertAfter: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.insertTextAfterRange(suggestion.range, suggestion.text); + }, + }); + break; + case CompilerSuggestionOperation.Replace: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.replaceTextRange(suggestion.range, suggestion.text); + }, + }); + break; + case CompilerSuggestionOperation.Remove: + suggest.push({ + desc: suggestion.description, + fix(fixer) { + return fixer.removeRange(suggestion.range); + }, + }); + break; + default: + assertExhaustive(suggestion, 'Unhandled suggestion operation'); + } + } + } + return suggest; +} +function getReactCompilerResult(context) { + var _a, _b, _c; + const sourceCode = (_a = context.sourceCode) !== null && _a !== void 0 ? _a : context.getSourceCode(); + const filename = (_b = context.filename) !== null && _b !== void 0 ? _b : context.getFilename(); + const userOpts = (_c = context.options[0]) !== null && _c !== void 0 ? _c : {}; + const results = runReactCompiler({ + sourceCode, + filename, + userOpts, + }); + return results; +} +function hasFlowSuppression(program, nodeLoc, suppressions) { + for (const commentNode of program.flowSuppressions) { + if (suppressions.includes(commentNode.code) && + commentNode.line === nodeLoc.start.line - 1) { + return true; + } + } + return false; +} +function makeRule(rule) { + const create = (context) => { + const result = getReactCompilerResult(context); + for (const event of result.events) { + if (event.kind === 'CompileError') { + const detail = event.detail; + if (detail.category === rule.category) { + const loc = detail.primaryLocation(); + if (loc == null || typeof loc === 'symbol') { + continue; + } + if (hasFlowSuppression(result, loc, [ + 'react-rule-hook', + 'react-rule-unsafe-ref', + ])) { + continue; + } + context.report({ + message: detail.printErrorMessage(result.sourceCode, { + eslint: true, + }), + loc, + suggest: makeSuggestions(detail.options), + }); + } + } + } + return {}; + }; + return { + meta: { + type: 'problem', + docs: { + description: rule.description, + recommended: rule.recommended, + }, + fixable: 'code', + hasSuggestions: true, + schema: [{ type: 'object', additionalProperties: true }], + }, + create, + }; +} +const NoUnusedDirectivesRule = { + meta: { + type: 'suggestion', + docs: { + recommended: true, + }, + fixable: 'code', + hasSuggestions: true, + schema: [{ type: 'object', additionalProperties: true }], + }, + create(context) { + const results = getReactCompilerResult(context); + for (const directive of results.unusedOptOutDirectives) { + context.report({ + message: `Unused '${directive.directive}' directive`, + loc: directive.loc, + suggest: [ + { + desc: 'Remove the directive', + fix(fixer) { + return fixer.removeRange(directive.range); + }, + }, + ], + }); + } + return {}; + }, +}; +const allRules = LintRules.reduce((acc, rule) => { + acc[rule.name] = { rule: makeRule(rule), severity: rule.severity }; + return acc; +}, { + 'no-unused-directives': { + rule: NoUnusedDirectivesRule, + severity: ErrorSeverity.Error, + }, +}); +LintRules.filter(rule => rule.recommended).reduce((acc, rule) => { + acc[rule.name] = { rule: makeRule(rule), severity: rule.severity }; + return acc; +}, { + 'no-unused-directives': { + rule: NoUnusedDirectivesRule, + severity: ErrorSeverity.Error, + }, +}); + var assert_1; var hasRequiredAssert; function requireAssert() { @@ -4736,10 +57549,7 @@ function last(array) { return array[array.length - 1]; } -const rules = { - 'exhaustive-deps': rule$1, - 'rules-of-hooks': rule, -}; +const rules = Object.assign({ 'exhaustive-deps': rule$1, 'rules-of-hooks': rule }, Object.fromEntries(Object.entries(allRules).map(([name, config]) => [name, config.rule]))); const ruleConfigs = { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', diff --git a/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/package.json b/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/package.json index 534f045ac8..309a024aae 100644 --- a/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/package.json +++ b/compiled-rn/facebook-fbsource/xplat/js/tools/eslint-plugin-react-hooks/package.json @@ -1,7 +1,7 @@ { "name": "eslint-plugin-react-hooks", "description": "ESLint rules for React Hooks", - "version": "0.0.0-experimental-67e24bc5-20251001", + "version": "0.0.0-experimental-ae74234e-20251001", "repository": { "type": "git", "url": "https://github.com/facebook/react.git",