diff --git a/.gitignore b/.gitignore
index 8f62cba..ea86a06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
TODOs.md
node_modules
-dist
-explorations
\ No newline at end of file
+explorations
+
+.claude/
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 598829d..1055535 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,25 +1,55 @@
-## [0.4.1](https://github.com/vuejs/petite-vue/compare/v0.4.0...v0.4.1) (2022-01-18)
+# [1.2.0](https://github.com/ws-rush/pocket-vue/compare/v1.1.2...v1.2.0) (2025-11-20)
### Bug Fixes
-- custom delimiters in child contexts ([#90](https://github.com/vuejs/petite-vue/issues/90)) ([1bbd4d1](https://github.com/vuejs/petite-vue/commit/1bbd4d1c00c6c19f2ee6740e728fb274101fc6c9))
+- make tests compatible with browser mode ([bc88638](https://github.com/ws-rush/pocket-vue/commit/bc88638710096edd9135d011c887f85ce9198040))
-# [0.4.0](https://github.com/vuejs/petite-vue/compare/v0.3.0...v0.4.0) (2021-12-10)
+### Features
-### Breaking Changes
+- add fileName to vite config ([869367f](https://github.com/ws-rush/pocket-vue/commit/869367f849730ec7c641ca9377744610fb0cc08c)), closes [#22](https://github.com/ws-rush/pocket-vue/issues/22)
+- enhance test coverage and fix type errors ([23c8cab](https://github.com/ws-rush/pocket-vue/commit/23c8cab256e46a68ccf27a7c840072314ffee11d))
+- migrate tests from happy-dom to browser mode with Playwright ([7e16c0a](https://github.com/ws-rush/pocket-vue/commit/7e16c0ad73ff7578a3a397ffe32f1faa42a9d124))
-- require vue: prefix for lifecycle hooks ([a981928](https://github.com/vuejs/petite-vue/commit/a9819283f8504a9c2d0cea4d9d122028eba2d10d))
+## [1.1.2](https://github.com/ws-rush/pocket-vue/compare/v1.1.1...v1.1.2) (2025-09-26)
-# [0.3.0](https://github.com/vuejs/petite-vue/compare/v0.2.3...v0.3.0) (2021-09-14)
+## [1.1.1](https://github.com/ws-rush/pocket-vue/compare/v1.0.2...v1.1.1) (2025-09-26)
### Bug Fixes
-- fix parsing chained modifiers ([15f75e9](https://github.com/vuejs/petite-vue/commit/15f75e94db3ce1d3630d7ffc10e2db4748d94f3e))
-- fix v-cloak on toggle ([#71](https://github.com/vuejs/petite-vue/issues/71)) ([f41981b](https://github.com/vuejs/petite-vue/commit/f41981b32ae4832e58223f55c209fd112dfbede7))
-- v-for update on move ([#79](https://github.com/vuejs/petite-vue/issues/79)) ([9af4ea3](https://github.com/vuejs/petite-vue/commit/9af4ea35957053665e586556f7ffb90b9077db26))
-- **v-model:** ensure v-model listeners are attached before v-on ([06d3aa7](https://github.com/vuejs/petite-vue/commit/06d3aa79b066410fe4e270b1a9dad65cb8d3fb97)), closes [#65](https://github.com/vuejs/petite-vue/issues/65)
+- types generation ([ca6493f](https://github.com/ws-rush/pocket-vue/commit/ca6493fe9bb86859c0e39450207a5f1897ec14af))
+- types generation ([fb3da69](https://github.com/ws-rush/pocket-vue/commit/fb3da690f48ba7ada0ae75115c56f04bccb82410))
+- **v-bind:** correctly remove attributes when value is null/undefined ([2bcb8d5](https://github.com/ws-rush/pocket-vue/commit/2bcb8d59ad702714e1367b1a784fc691cc1fe0b4))
+- **v-bind:** Enhance reactivity and testing reliability ([857258e](https://github.com/ws-rush/pocket-vue/commit/857258e1b6573070c559aa17026661b7bd6d017f))
-### Features
+# [1.1.0](https://github.com/ws-rush/pocket-vue/compare/v1.0.2...v1.1.0) (2025-09-26)
+
+### Bug Fixes
+
+- types generation ([ca6493f](https://github.com/ws-rush/pocket-vue/commit/ca6493fe9bb86859c0e39450207a5f1897ec14af))
+- types generation ([fb3da69](https://github.com/ws-rush/pocket-vue/commit/fb3da690f48ba7ada0ae75115c56f04bccb82410))
+- **v-bind:** correctly remove attributes when value is null/undefined ([2bcb8d5](https://github.com/ws-rush/pocket-vue/commit/2bcb8d59ad702714e1367b1a784fc691cc1fe0b4))
+- **v-bind:** Enhance reactivity and testing reliability ([857258e](https://github.com/ws-rush/pocket-vue/commit/857258e1b6573070c559aa17026661b7bd6d017f))
+
+## [1.0.2](https://github.com/ws-rush/pocket-vue/compare/v1.0.1...v1.0.2) (2025-09-26)
+
+### Bug Fixes
+
+- **doc:** correct cdn links ([3770193](https://github.com/ws-rush/pocket-vue/commit/37701932a2d9a36799c49d2df82bff28a7c2ecfd))
+- elemenate node spesfic code from bundles ([8d0e507](https://github.com/ws-rush/pocket-vue/commit/8d0e507fb313284d5c03545bc90fff741355369c))
+
+## [1.0.1](https://github.com/ws-rush/pocket-vue/compare/v1.0.0...v1.0.1) (2025-09-26)
+
+### Bug Fixes
+
+- package published w/o dist ([27291f0](https://github.com/ws-rush/pocket-vue/commit/27291f048ba2b3deb3842465486a1e310cf027df))
+
+# [1.0.0](https://github.com/ws-rush/pocket-vue/compare/v0.4.1...v1.0.0) (2025-09-23)
+
+### Bug Fixes
-- bind methods to context ([#74](https://github.com/vuejs/petite-vue/issues/74)) ([167c49d](https://github.com/vuejs/petite-vue/commit/167c49d6940c6f35c6002093d8807ac0e835dcea))
-- custom delimiters ([eda903c](https://github.com/vuejs/petite-vue/commit/eda903c0a93fe048219b74b0a44064c87b553ad4))
+- build command ([fe3ff5f](https://github.com/ws-rush/pocket-vue/commit/fe3ff5fb71d6889d11bbc47461683135e7f58990))
+- fix pico-vue dependcies to 3.2.27 ([72ff52c](https://github.com/ws-rush/pocket-vue/commit/72ff52cc479b9c6600104a74e826754294ad45d9))
+- todomvc example ([f965e5e](https://github.com/ws-rush/pocket-vue/commit/f965e5e41d0c81dba4d834298a8784f4abf246c2))
+- types for { moduleResolution: Node16 } ([c7e636b](https://github.com/ws-rush/pocket-vue/commit/c7e636b19024760177caa616404e2cab8a35dc80))
+- update commits example to use working API endpoint ([3ee6a93](https://github.com/ws-rush/pocket-vue/commit/3ee6a93a8ace6c1d757193e0ff71b5cbf0f2abc6))
+- v-if nested in v-for template tag ([3b809d0](https://github.com/ws-rush/pocket-vue/commit/3b809d0e08b62c577683e0acec247b02fcff964e))
diff --git a/README.md b/README.md
index efa2241..4108717 100644
--- a/README.md
+++ b/README.md
@@ -1,44 +1,52 @@
-# petite-vue
+# pocket-vue
-`petite-vue` is an alternative distribution of [Vue](https://vuejs.org) optimized for [progressive enhancement](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement). It provides the same template syntax and reactivity mental model as standard Vue. However, it is specifically optimized for "sprinkling" a small amount of interactions on an existing HTML page rendered by a server framework. See more details on [how it differs from standard Vue](#comparison-with-standard-vue).
+[](https://deepwiki.com/ws-rush/pocket-vue)
-- Only ~6kb
+`pocket-vue` is a fork of `petite-vue`, which is an alternative distribution of [Vue](https://vuejs.org) optimized for [progressive enhancement](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement). It provides the same template syntax and reactivity mental model as standard Vue. However, it is specifically optimized for "sprinkling" a small amount of interactions on an existing HTML page rendered by a server framework. See more details on [how it differs from standard Vue](#comparison-with-standard-vue).
+
+- Only ~9kb
- Vue-compatible template syntax
- DOM-based, mutates in place
- Driven by `@vue/reactivity`
## Status
-- This is pretty new. There are probably bugs and there might still be API changes, so **use at your own risk.** Is it usable though? Very much. Check out the [examples](https://github.com/vuejs/petite-vue/tree/main/examples) to see what it's capable of.
-
-- The issue list is intentionally disabled because I have higher priority things to focus on for now and don't want to be distracted. If you found a bug, you'll have to either workaround it or submit a PR to fix it yourself. That said, feel free to use the discussions tab to help each other out.
+- `petite-vue` it's not mantained anymore, hence we will provide bug fixes and handle feature requests. Feel free to open issue or PR.
+- this fork is focused on web components, but we will provide new generic features too
-- Feature requests are unlikely to be accepted at this time - the scope of this project is intentionally kept to a bare minimum.
## Usage
-`petite-vue` can be used without a build step. Simply load it from a CDN:
+`pocket-vue` can be used without a build step. Simply load it from a CDN:
```html
-
+
{{ count }}
inc
+
+
+
```
-- Use `v-scope` to mark regions on the page that should be controlled by `petite-vue`.
+- Use `v-scope` to mark regions on the page that should be controlled by `pocket-vue`.
- The `defer` attribute makes the script execute after HTML content is parsed.
-- The `init` attribute tells `petite-vue` to automatically query and initialize all elements that have `v-scope` on the page.
+- The `init` attribute tells `pocket-vue` to automatically query and initialize all elements that have `v-scope` on the page.
### Manual Init
If you don't want the auto init, remove the `init` attribute and move the scripts to end of ``:
```html
-
+
@@ -48,19 +56,25 @@ Or, use the ES module build:
```html
```
-### Production CDN URLs
+### CDN Links
+
+You can also use the following CDN services:
-The short CDN URL is meant for prototyping. For production usage, use a fully resolved CDN URL to avoid resolving and redirect cost:
+- **jsDelivr**:
+ - Global build: `https://cdn.jsdelivr.net/npm/pocket-vue`
+ - ESM build: `https://cdn.jsdelivr.net/npm/pocket-vue?module`
-- Global build: `https://unpkg.com/petite-vue@0.2.2/dist/petite-vue.iife.js`
- - exposes `PetiteVue` global, supports auto init
-- ESM build: `https://unpkg.com/petite-vue@0.2.2/dist/petite-vue.es.js`
- - Must be used with `
+```
+
+A plugin code similar to vue plugins code:
+
+```js
+// inside log.js plugin file
+export default {
+ install: (app, options) => {
+ app.directive('log', ({exp}) => {
+ console.log(exp)
+ })
+ }
+}
+```
+
## Examples
-Check out the [examples directory](https://github.com/vuejs/petite-vue/tree/main/examples).
+Check out the [examples directory](https://github.com/ws-rush/pocket-vue/tree/main/examples).
## Features
-### `petite-vue` only
+### `pocket-vue`/`petite-vue` only
- `v-scope`
- `v-effect`
- `@vue:mounted` & `@vue:unmounted` events
+- `$root` refers to the component root element
-### Has Different Behavior
+### Different Behavior from `petite-vue`
-- In expressions, `$el` points to the current element the directive is bound to (instead of component root element)
+- In expressions, `$el` points to the current element the directive is bound to (instead of component root element which accessed by `$root`)
- `createApp()` accepts global state instead of a component
- Components are simplified into object-returning functions
- Custom directives have a different interface
+- exported `watchEffect`
### Vue Compatible
@@ -348,7 +467,7 @@ Check out the [examples directory](https://github.com/vuejs/petite-vue/tree/main
Some features are dropped because they have a relatively low utility/size ratio in the context of progressive enhancement. If you need these features, you should probably just use standard Vue.
- `ref()`, `computed()` etc.
-- Render functions (`petite-vue` has no virtual DOM)
+- Render functions (`pocket-vue` has no virtual DOM)
- Reactivity for Collection Types (Map, Set, etc., removed for smaller size)
- Transition, KeepAlive, Teleport, Suspense
- `v-for` deep destructure
diff --git a/__tests__/app.test.ts b/__tests__/app.test.ts
new file mode 100644
index 0000000..a5dc0be
--- /dev/null
+++ b/__tests__/app.test.ts
@@ -0,0 +1,238 @@
+import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
+import { createApp, nextTick, reactive, watchEffect } from "../src/index";
+
+describe("app", () => {
+ let container: HTMLElement;
+
+ beforeEach(() => {
+ container = document.createElement("div");
+ document.body.appendChild(container);
+ });
+
+ afterEach(() => {
+ container.remove();
+ });
+
+ describe("createApp", () => {
+ it("should create app with initial data", () => {
+ const app = createApp({ count: 0 });
+
+ expect(app).toBeDefined();
+ expect(typeof app.mount).toBe("function");
+ expect(typeof app.directive).toBe("function");
+ expect(typeof app.use).toBe("function");
+ });
+
+ it("should create app without initial data", () => {
+ const app = createApp();
+
+ expect(app).toBeDefined();
+ });
+
+ it("should handle custom delimiters", () => {
+ const app = createApp({
+ $delimiters: ["${", "}"],
+ });
+
+ expect(app).toBeDefined();
+ });
+ });
+
+ describe("mount", () => {
+ it("should mount to element selector", () => {
+ container.id = "test-app";
+ container.innerHTML = "{{ count }}
";
+
+ const app = createApp({ count: 42 });
+ app.mount("#test-app");
+
+ expect(container.textContent).toBe("42");
+ });
+
+ it("should mount to DOM element", () => {
+ container.innerHTML = "{{ count }}
";
+
+ const app = createApp({ count: 42 });
+ app.mount(container);
+
+ expect(container.textContent).toBe("42");
+ });
+
+ it("should mount to body when no element provided", () => {
+ document.body.innerHTML = "{{ count }}
";
+
+ const app = createApp({ count: 42 });
+ app.mount();
+
+ expect(document.body.textContent).toContain("42");
+ });
+
+ it("should handle invalid selector", () => {
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {});
+
+ const app = createApp({});
+ app.mount("#nonexistent");
+
+ expect(consoleSpy).toHaveBeenCalledWith(
+ "selector #nonexistent has no matching element."
+ );
+ consoleSpy.mockRestore();
+ });
+
+ it("should handle unmount", () => {
+ container.innerHTML = 'Test
';
+
+ const app = createApp({});
+ app.mount(container);
+
+ expect(app.rootBlocks.length).toBe(1);
+
+ app.unmount();
+
+ // After unmount, the blocks should be cleaned up
+ expect(app.rootBlocks.length).toBe(1); // Blocks array still exists but are torn down
+ });
+
+ it("should handle nested v-scope elements", () => {
+ container.innerHTML = `
+
+ `;
+
+ const app = createApp({});
+ app.mount(container);
+
+ // Should only mount the outer v-scope, not the nested one
+ expect(app.rootBlocks.length).toBe(1);
+ });
+
+ it("should handle multiple v-scope elements", () => {
+ container.innerHTML = `
+ First
+ Second
+ `;
+
+ const app = createApp({});
+ app.mount(container);
+
+ expect(app.rootBlocks.length).toBe(2);
+ });
+
+ it("should handle v-scope on the mount element itself", () => {
+ container.innerHTML = 'Content
';
+ container.setAttribute("v-scope", "");
+
+ const app = createApp({});
+ app.mount(container);
+
+ expect(app.rootBlocks.length).toBe(1);
+ });
+
+ it("should handle no v-scope elements", () => {
+ container.innerHTML = 'No v-scope
';
+
+ const app = createApp({});
+ app.mount(container);
+
+ // Should mount the container itself if no v-scope elements
+ expect(app.rootBlocks.length).toBe(1);
+ });
+ });
+
+ describe("directive", () => {
+ it("should register custom directive", () => {
+ const app = createApp();
+ const directive = vi.fn();
+
+ app.directive("test", directive);
+
+ expect(app.directive("test")).toBe(directive);
+ });
+
+ it("should return directive when getting", () => {
+ const app = createApp();
+ const directive = vi.fn();
+
+ app.directive("test", directive);
+
+ expect(app.directive("test")).toBe(directive);
+ });
+
+ it("should be chainable", () => {
+ const app = createApp();
+ const directive = vi.fn();
+
+ const result = app.directive("test", directive);
+
+ expect(result).toBe(app);
+ });
+ });
+
+ describe("use", () => {
+ it("should install plugin", () => {
+ const app = createApp();
+ const plugin = {
+ install: vi.fn(),
+ };
+ const options = { test: true };
+
+ app.use(plugin, options);
+
+ expect(plugin.install).toHaveBeenCalledWith(app, options);
+ });
+
+ it("should be chainable", () => {
+ const app = createApp();
+ const plugin = {
+ install: vi.fn(),
+ };
+
+ const result = app.use(plugin);
+
+ expect(result).toBe(app);
+ });
+
+ it("should handle plugin without options", () => {
+ const app = createApp();
+ const plugin = {
+ install: vi.fn(),
+ };
+
+ app.use(plugin);
+
+ expect(plugin.install).toHaveBeenCalledWith(app, {});
+ });
+ });
+
+ describe("global helpers", () => {
+ it("should provide $s helper for display string", () => {
+ container.innerHTML = "{{ $s(test) }}";
+ const app = createApp({ test: 42 });
+
+ app.mount(container);
+
+ expect(container.textContent).toBe("42");
+ });
+
+ it("should provide $nextTick helper", () => {
+ container.innerHTML = "{{ $nextTick }}
";
+ const app = createApp();
+
+ app.mount(container);
+
+ // $nextTick should be available in template expressions
+ expect(container.textContent).not.toBe("");
+ });
+
+ it("should provide $refs object", () => {
+ container.innerHTML = 'Test
';
+ const app = createApp();
+
+ app.mount(container);
+
+ // Test that refs work by checking the template renders
+ expect(container.textContent).toBe("Test");
+ });
+ });
+});
diff --git a/__tests__/block.test.ts b/__tests__/block.test.ts
new file mode 100644
index 0000000..7a9f26e
--- /dev/null
+++ b/__tests__/block.test.ts
@@ -0,0 +1,229 @@
+import { describe, it, expect, beforeEach, vi } from "vitest";
+import { Block } from "../src/block";
+import { createContext } from "../src/context";
+import { walk } from "../src/walk";
+import { stop } from "@vue/reactivity";
+import { nextTick } from "../src/scheduler";
+
+describe("Block", () => {
+ let container: HTMLElement;
+ let ctx: any;
+
+ beforeEach(() => {
+ container = document.createElement("div");
+ ctx = createContext();
+ ctx.scope.$refs = Object.create(null);
+ });
+
+ it("should create block with element", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx);
+
+ // Block clones the template, so we check if it's the same type
+ expect(block.el).toBeTruthy();
+ expect(block.el.nodeName).toBe(el.nodeName);
+ // Block creates a child context, so check inheritance
+ expect(block.parentCtx).toBe(ctx);
+ expect(block.ctx.dirs).toBe(ctx.dirs);
+ });
+
+ it("should handle block insertion", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx);
+ const parent = document.createElement("div");
+
+ block.insert(parent);
+
+ // The block inserts a cloned element, not the original
+ expect(parent.children.length).toBe(1);
+ expect(parent.children[0].nodeName).toBe("DIV");
+ });
+
+ it("should handle block removal", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx);
+ const parent = document.createElement("div");
+
+ block.insert(parent);
+ expect(parent.children.length).toBe(1);
+
+ block.remove();
+ expect(parent.children.length).toBe(0);
+ });
+
+
+
+ it("should handle block cleanup", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx);
+ const parent = document.createElement("div");
+
+ block.insert(parent);
+
+ const cleanupSpy = vi.fn();
+ block.ctx.cleanups.push(cleanupSpy);
+
+ block.remove();
+
+ expect(cleanupSpy).toHaveBeenCalled();
+ });
+
+ it("should handle multiple blocks", () => {
+ const el1 = document.createElement("div");
+ const el2 = document.createElement("div");
+ const block1 = new Block(el1, ctx);
+ const block2 = new Block(el2, ctx);
+
+ // Block clones templates, so we check node names
+ expect(block1.el.nodeName).toBe(el1.nodeName);
+ expect(block2.el.nodeName).toBe(el2.nodeName);
+ // Block creates child contexts, so check inheritance
+ expect(block1.parentCtx).toBe(ctx);
+ expect(block2.parentCtx).toBe(ctx);
+ expect(block1.ctx.dirs).toBe(ctx.dirs);
+ expect(block2.ctx.dirs).toBe(ctx.dirs);
+ });
+
+ it("should handle block with children", () => {
+ const el = document.createElement("div");
+ const child = document.createElement("span");
+ el.appendChild(child);
+
+ const block = new Block(el, ctx);
+
+ // The block clones the template, so children should be preserved
+ const blockEl = block.el as Element;
+ expect(blockEl.children.length).toBe(1);
+ expect(blockEl.children[0].nodeName).toBe("SPAN");
+ });
+
+ it("should create block with template element", () => {
+ const template = document.createElement("template");
+ template.innerHTML = "
";
+ const block = new Block(template, ctx);
+
+ expect(block.isFragment).toBe(true);
+ // In browser, DocumentFragment nodeName is '#document-fragment'
+ expect(block.el.nodeName).toBe("#document-fragment");
+ });
+
+ it("should create root block", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx, true);
+
+ expect(block.parentCtx).toBeUndefined();
+ expect(block.ctx).toBe(ctx);
+ });
+
+ it("should handle root block removal", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx, true);
+ const parent = document.createElement("div");
+
+ block.insert(parent);
+ expect(parent.children.length).toBe(1);
+
+ // Removing a root block should not try to remove from parentCtx.blocks
+ block.remove();
+ expect(parent.children.length).toBe(0);
+ });
+
+ it("should move block", () => {
+ const el = document.createElement("div");
+ const block = new Block(el, ctx);
+ const parent1 = document.createElement("div");
+ const parent2 = document.createElement("div");
+
+ block.insert(parent1);
+ expect(parent1.children.length).toBe(1);
+ expect(parent2.children.length).toBe(0);
+
+ block.insert(parent2);
+ expect(parent1.children.length).toBe(0);
+ expect(parent2.children.length).toBe(1);
+ });
+
+ it("should teardown block", async () => {
+ const el = document.createElement("div");
+ const child = document.createElement("div");
+ child.setAttribute("v-effect", "() => {}");
+ const block = new Block(el, ctx);
+ const childBlock = new Block(child, block.ctx);
+ walk(childBlock.template, childBlock.ctx);
+
+ // Wait for nextTick to ensure the effect is created
+ await nextTick();
+
+ // Check if effects array has any effects before teardown
+ expect(childBlock.ctx.effects.length).toBeGreaterThan(0);
+
+ const cleanupSpy = vi.fn();
+ childBlock.ctx.cleanups.push(cleanupSpy);
+
+ block.teardown();
+
+ // After teardown, effects should be stopped (but the array might still contain them)
+ // The important thing is that cleanups are called
+ expect(cleanupSpy).toHaveBeenCalled();
+ });
+
+ it("should handle fragment insertion with existing start/end markers", () => {
+ const template = document.createElement("template");
+ template.innerHTML = "Fragment content
";
+ const block = new Block(template, ctx);
+ const parent = document.createElement("div");
+
+ // First insertion
+ block.insert(parent);
+ expect(parent.children.length).toBe(1);
+ expect(block.start).toBeTruthy();
+ expect(block.end).toBeTruthy();
+
+ // Second insertion (moving)
+ const parent2 = document.createElement("div");
+ block.insert(parent2);
+ expect(parent.children.length).toBe(0);
+ expect(parent2.children.length).toBe(1);
+ });
+
+ it("should handle fragment removal with start/end markers", () => {
+ const template = document.createElement("template");
+ template.innerHTML = "Fragment content
";
+ const block = new Block(template, ctx);
+ const parent = document.createElement("div");
+
+ block.insert(parent);
+ expect(parent.children.length).toBe(1);
+
+ block.remove();
+ expect(parent.children.length).toBe(0);
+ });
+
+ it("should handle fragment insertion with anchor", () => {
+ const template = document.createElement("template");
+ template.innerHTML = "Fragment content
";
+ const block = new Block(template, ctx);
+ const parent = document.createElement("div");
+ const anchor = document.createElement("span");
+ parent.appendChild(anchor);
+
+ block.insert(parent, anchor);
+ expect(parent.children.length).toBe(2);
+ expect(parent.children[0].textContent).toBe("Fragment content");
+ expect(parent.children[1]).toBe(anchor);
+ });
+
+ it("should handle regular element insertion with anchor", () => {
+ const el = document.createElement("div");
+ el.textContent = "Regular content";
+ const block = new Block(el, ctx);
+ const parent = document.createElement("div");
+ const anchor = document.createElement("span");
+ parent.appendChild(anchor);
+
+ block.insert(parent, anchor);
+ expect(parent.children.length).toBe(2);
+ expect(parent.children[0].textContent).toBe("Regular content");
+ expect(parent.children[1]).toBe(anchor);
+ });
+});
diff --git a/__tests__/context.test.ts b/__tests__/context.test.ts
new file mode 100644
index 0000000..a2d99bd
--- /dev/null
+++ b/__tests__/context.test.ts
@@ -0,0 +1,114 @@
+import { describe, it, expect, beforeEach, vi } from 'vitest'
+import { reactive } from '@vue/reactivity'
+import {
+ createContext,
+ createScopedContext,
+ bindContextMethods,
+ Context
+} from '../src/context'
+import { queueJob } from '../src/scheduler'
+
+describe('context', () => {
+ describe('createContext', () => {
+ it('should create context with default values', () => {
+ const ctx = createContext()
+
+ expect(ctx.scope).toBeDefined()
+ expect(ctx.dirs).toEqual({})
+ expect(ctx.blocks).toEqual([])
+ expect(ctx.effects).toEqual([])
+ expect(ctx.cleanups).toEqual([])
+ expect(ctx.delimiters).toEqual(['{{', '}}'])
+ expect(ctx.delimitersRE).toBeInstanceOf(RegExp)
+ })
+
+ it('should create child context inheriting from parent', () => {
+ const parent = createContext()
+ parent.dirs.test = vi.fn()
+ parent.scope.testValue = 'parent'
+
+ const child = createContext(parent)
+
+ expect(child.dirs).toBe(parent.dirs)
+ expect(child.scope).toBe(parent.scope)
+ expect(child.blocks).not.toBe(parent.blocks)
+ })
+
+ it('should create effect with scheduler', () => {
+ const ctx = createContext()
+ const fn = vi.fn()
+ const effect = ctx.effect(fn)
+
+ expect(ctx.effects).toContain(effect)
+ expect(typeof effect).toBe('function')
+ })
+ })
+
+ describe('createScopedContext', () => {
+ it('should create scoped context with merged scope', () => {
+ const parent = createContext()
+ parent.scope.parentValue = 'parent'
+ parent.scope.$refs = Object.create(null)
+
+ const scoped = createScopedContext(parent, { childValue: 'child' })
+
+ expect(scoped.scope.parentValue).toBe('parent')
+ expect(scoped.scope.childValue).toBe('child')
+ expect(scoped.scope).not.toBe(parent.scope)
+ })
+
+ it('should handle refs inheritance', () => {
+ const parent = createContext()
+ parent.scope.$refs = Object.create(null)
+ parent.scope.$refs.parentRef = 'test'
+
+ const scoped = createScopedContext(parent)
+
+ expect(scoped.scope.$refs).not.toBe(parent.scope.$refs)
+ expect(scoped.scope.$refs.parentRef).toBe('test')
+ })
+
+ it('should fallback to parent scope for non-existent properties', () => {
+ const parent = createContext()
+ parent.scope.parentValue = 'parent'
+ parent.scope.$refs = Object.create(null)
+
+ const scoped = createScopedContext(parent)
+
+ scoped.scope.newValue = 'child'
+ expect(parent.scope.newValue).toBe('child')
+ })
+ })
+
+ describe('bindContextMethods', () => {
+ it('should bind all functions in scope to scope itself', () => {
+ const scope = reactive({
+ value: 'test',
+ method: function() {
+ return this.value
+ }
+ })
+
+ bindContextMethods(scope)
+
+ expect(scope.method()).toBe('test')
+ })
+
+ it('should not bind non-function properties', () => {
+ const scope = reactive({
+ value: 'test',
+ notAFunction: 42
+ })
+
+ bindContextMethods(scope)
+
+ expect(scope.notAFunction).toBe(42)
+ })
+
+ it('should handle empty scope', () => {
+ const scope = reactive({})
+
+ expect(() => bindContextMethods(scope)).not.toThrow()
+ })
+ })
+})
\ No newline at end of file
diff --git a/__tests__/coverage.test.ts b/__tests__/coverage.test.ts
new file mode 100644
index 0000000..adeeaa8
--- /dev/null
+++ b/__tests__/coverage.test.ts
@@ -0,0 +1,229 @@
+import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
+import { createApp } from '../src/app'
+import { reactive } from '@vue/reactivity'
+import { nextTick } from '../src/scheduler'
+
+describe('coverage tests for edge cases', () => {
+ let container: HTMLElement
+
+ beforeEach(() => {
+ container = document.createElement('div')
+ document.body.appendChild(container)
+ })
+
+ afterEach(() => {
+ container.remove()
+ })
+
+ describe('error boundary scenarios', () => {
+ it('should handle malformed expressions', () => {
+ container.innerHTML = '{{ malformed.expression[0] }}
'
+
+ expect(() => {
+ const app = createApp({})
+ app.mount(container)
+ }).not.toThrow()
+
+ expect(container.querySelector('div')?.textContent).toBe('')
+ })
+
+ it('should handle circular references', () => {
+ container.innerHTML = '{{ obj }}
'
+
+ const obj: any = {}
+ obj.self = obj
+
+ expect(() => {
+ const app = createApp({ obj })
+ app.mount(container)
+ }).not.toThrow()
+ })
+
+ it('should handle very large datasets', () => {
+ container.innerHTML = '{{ item }}
'
+
+ const largeArray = Array.from({ length: 10000 }, (_, i) => `Item ${i}`)
+
+ expect(() => {
+ const app = createApp({ items: largeArray })
+ app.mount(container)
+ }).not.toThrow()
+
+ expect(container.querySelectorAll('div').length).toBe(10000)
+ })
+
+ it('should handle rapid state changes', async () => {
+ container.innerHTML = '{{ count }}
'
+
+ const data = reactive({ count: 0 })
+ const app = createApp(data)
+ app.mount(container)
+
+ for (let i = 0; i < 1000; i++) {
+ data.count = i
+ }
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ expect(container.querySelector('div')?.textContent).toBe('999')
+ })
+ })
+
+ describe('browser compatibility', () => {
+ it('should work with various element types', () => {
+ container.innerHTML = `
+
+
+ Option 1
+ Option 2
+
+
+ Click
+ `
+
+ const app = createApp({
+ value: 'test',
+ selectValue: '1',
+ textareaValue: 'textarea test',
+ handleClick: () => {}
+ })
+
+ expect(() => app.mount(container)).not.toThrow()
+ })
+
+ it('should handle custom elements', () => {
+ container.innerHTML = ' '
+
+ customElements.define('custom-element', class extends HTMLElement {})
+
+ const app = createApp({ value: 'test' })
+
+ expect(() => app.mount(container)).not.toThrow()
+ })
+ })
+
+ describe('memory management', () => {
+
+
+ it('should clean up reactive effects', async () => {
+ container.innerHTML = '
'
+
+ let callCount = 0
+ const app = createApp({
+ sideEffect: () => {
+ callCount++
+ }
+ })
+ app.mount(container)
+
+ // Wait for effect to run
+ await nextTick()
+
+ const initialCount = callCount
+ expect(initialCount).toBeGreaterThan(0)
+
+ // Properly unmount the app
+ app.unmount()
+
+ // Wait to ensure no additional effects run
+ await nextTick()
+
+ // Effect should not run again after unmount
+ expect(callCount).toBe(initialCount)
+ })
+ })
+
+ describe('performance optimizations', () => {
+ it('should batch multiple updates', async () => {
+ container.innerHTML = '{{ count }}
'
+
+ const data = reactive({ count: 0 })
+ const app = createApp(data)
+ app.mount(container)
+
+ data.count = 1
+ data.count = 2
+ data.count = 3
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ expect(container.querySelector('div')?.textContent).toBe('3')
+ })
+
+ it('should avoid unnecessary re-renders', () => {
+ container.innerHTML = `
+ {{ static }}
+ {{ dynamic }}
+ `
+
+ const data = { static: 'static', dynamic: 'dynamic' }
+ const app = createApp(data)
+ app.mount(container)
+
+ const staticDiv = container.querySelector('div:first-child')
+ const originalText = staticDiv?.textContent
+
+ data.dynamic = 'updated'
+
+ expect(staticDiv?.textContent).toBe(originalText)
+ })
+ })
+
+ describe('accessibility', () => {
+ it('should maintain ARIA attributes', () => {
+ container.innerHTML = 'Click '
+
+ const app = createApp({ label: 'Accessible button' })
+ app.mount(container)
+
+ const button = container.querySelector('button')
+ expect(button?.getAttribute('aria-label')).toBe('Accessible button')
+ })
+
+ it('should handle role attributes', () => {
+ container.innerHTML = 'Content
'
+
+ const app = createApp({ role: 'main' })
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ expect(div?.getAttribute('role')).toBe('main')
+ })
+ })
+
+ describe('security', () => {
+ it('should escape HTML content in text bindings', () => {
+ container.innerHTML = '{{ maliciousContent }}
'
+
+ const app = createApp({
+ maliciousContent: ''
+ })
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ expect(div?.textContent).toBe('')
+
+ // The important security test: the script content should not be executable
+ // Since we're using textContent, it's displayed as escaped text, not executed
+ expect(div?.innerHTML).toBe('<script>alert("xss")</script>')
+
+ // Verify it's actually text content, not executable script
+ const scriptTags = div?.querySelectorAll('script')
+ expect(scriptTags?.length).toBe(0)
+ })
+
+ it('should handle safe HTML content in v-html', () => {
+ container.innerHTML = '
'
+
+ const app = createApp({
+ safeHtml: 'Safe content '
+ })
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ expect(div?.innerHTML).toBe('Safe content ')
+ })
+ })
+})
\ No newline at end of file
diff --git a/__tests__/directives.test.ts b/__tests__/directives.test.ts
new file mode 100644
index 0000000..2d02d9b
--- /dev/null
+++ b/__tests__/directives.test.ts
@@ -0,0 +1,1516 @@
+import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
+import { nextTick } from "../src/scheduler";
+import { reactive } from "@vue/reactivity";
+import { createApp } from "../src/app";
+import { builtInDirectives } from "../src/directives";
+import { onCompositionEnd, updateTextValue, handleCheckboxChange, handleTextInput, updateCheckboxValue, handleRadioChange } from "../src/directives/model";
+import { createContext, createScopedContext } from "../src/context";
+
+describe("directives", () => {
+ let container: HTMLElement;
+
+ beforeEach(() => {
+ container = document.createElement("div");
+ document.body.appendChild(container);
+ });
+
+ afterEach(() => {
+ container.remove();
+ });
+
+ describe("built-in directives", () => {
+ it("should have all built-in directives", () => {
+ expect(builtInDirectives.bind).toBeDefined();
+ expect(builtInDirectives.on).toBeDefined();
+ expect(builtInDirectives.show).toBeDefined();
+ expect(builtInDirectives.text).toBeDefined();
+ expect(builtInDirectives.html).toBeDefined();
+ expect(builtInDirectives.model).toBeDefined();
+ expect(builtInDirectives.effect).toBeDefined();
+ expect(builtInDirectives.ref).toBeDefined();
+ });
+ });
+
+ describe("v-bind", () => {
+ it("should bind attribute", () => {
+ container.innerHTML = '
';
+ const app = createApp({ dynamicId: "test-id" });
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.getAttribute("id")).toBe("test-id");
+ });
+
+ it("should update attribute when data changes", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ dynamicId: "initial" });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.getAttribute("id")).toBe("initial");
+ data.dynamicId = "updated";
+ await nextTick();
+ const updatedDiv = container.querySelector("div");
+ expect(updatedDiv?.getAttribute("id")).toBe("updated");
+ });
+
+ it("should handle shorthand syntax", () => {
+ container.innerHTML = '
';
+ const app = createApp({ dynamicId: "test-id" });
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.getAttribute("id")).toBe("test-id");
+ });
+
+ it("should bind a full object of attributes", async () => {
+ container.innerHTML = '
';
+ const attrs = reactive({ id: "test-id", "data-foo": "bar" } as Record);
+ const app = createApp({ attrs });
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.getAttribute("id")).toBe("test-id");
+ expect(div?.getAttribute("data-foo")).toBe("bar");
+
+ attrs.id = "new-id";
+ attrs["data-foo"] = undefined;
+ await nextTick();
+ expect(div?.getAttribute("id")).toBe("new-id");
+ expect(div?.hasAttribute("data-foo")).toBe(false);
+ });
+
+ it("should handle .camel modifier", () => {
+ container.innerHTML = '
';
+ const app = createApp({ id: "test" });
+ app.mount(container);
+ const div = container.querySelector("div");
+ // @ts-ignore
+ expect(div.fooBar).toBe("test");
+ });
+
+ it("should bind style as string", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ style: "color: red" });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.style.color).toBe("red");
+
+ data.style = "color: blue";
+ await nextTick();
+ expect(div?.style.color).toBe("blue");
+ });
+
+ it("should bind style as object", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ style: { color: "red", fontSize: "12px" } as Record });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.style.color).toBe("red");
+ expect(div?.style.fontSize).toBe("12px");
+
+ data.style = { color: "blue" };
+ await nextTick();
+ expect(div?.style.color).toBe("blue");
+ expect(div?.style.fontSize).toBe("");
+ });
+
+ it("should bind style with !important", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ style: { color: "red !important" } });
+ createApp(data).mount(container);
+ const div = container.querySelector("div")!;
+ expect(div.style.getPropertyValue("color")).toBe("red");
+ expect(div.style.getPropertyPriority("color")).toBe("important");
+ });
+
+ it("should bind style with CSS variables", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ style: { "--color": "red" } });
+ createApp(data).mount(container);
+ const div = container.querySelector("div")!;
+ expect(div.style.getPropertyValue("--color")).toBe("red");
+ });
+
+ it("should remove style attribute when style becomes falsy", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ style: "color: red" });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div")!;
+ expect(div.hasAttribute("style")).toBe(true);
+
+ data.style = "";
+ await nextTick();
+ expect(div.hasAttribute("style")).toBe(false);
+ });
+
+ it("should handle style with array values", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ style: { color: ["red", "blue"] } });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div")!;
+ // With array values, the last one should win
+ expect(div.style.color).toBe("blue");
+ });
+
+ it("should remove attribute if value is null or undefined", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ id: "test-id" as string | undefined });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.getAttribute("id")).toBe("test-id");
+
+ data.id = "test-id";
+ await nextTick();
+ expect(div?.getAttribute("id")).toBe("test-id");
+
+ data.id = undefined;
+ await nextTick();
+ expect(div?.hasAttribute("id")).toBe(false);
+ });
+
+ it("should bind true-value and false-value for checkboxes", async () => {
+ container.innerHTML =
+ ' ';
+ const data = reactive({ a: "yes", b: "no", checked: "yes" });
+ const app = createApp(data);
+ app.mount(container);
+ const input = container.querySelector("input")!;
+ expect(input.checked).toBe(true);
+
+ input.click();
+ await nextTick();
+ expect(data.checked).toBe("no");
+
+ data.checked = "yes";
+ await nextTick();
+ expect(input.checked).toBe(true);
+ });
+
+ it("should merge with existing class", async () => {
+ container.innerHTML = '
';
+ const data = reactive({ dynamic: "dynamic" });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div");
+ expect(div?.className).toBe("static dynamic");
+
+ data.dynamic = "updated";
+ await nextTick();
+ expect(div?.className).toBe("static updated");
+ });
+
+ it("should bind value for input", async () => {
+ container.innerHTML = ' ';
+ const data = reactive({ message: "hello" });
+ const app = createApp(data);
+ app.mount(container);
+ const input = container.querySelector("input")!;
+ expect(input.value).toBe("hello");
+
+ data.message = "world";
+ await nextTick();
+ expect(input.value).toBe("world");
+ });
+
+ it("should handle object binding with key removal", async () => {
+ container.innerHTML = '
';
+ const data = reactive({
+ attrs: {
+ id: "test",
+ "data-foo": "bar",
+ "data-baz": "qux"
+ } as Record
+ });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div")!;
+
+ expect(div.getAttribute("id")).toBe("test");
+ expect(div.getAttribute("data-foo")).toBe("bar");
+ expect(div.getAttribute("data-baz")).toBe("qux");
+
+ // Remove some keys from the object
+ data.attrs = { id: "new-id" };
+ await nextTick();
+
+ expect(div.getAttribute("id")).toBe("new-id");
+ expect(div.hasAttribute("data-foo")).toBe(false);
+ expect(div.hasAttribute("data-baz")).toBe(false);
+ });
+
+ it("should handle object binding with all keys removed", async () => {
+ container.innerHTML = '
';
+ const data = reactive({
+ attrs: { "data-test": "value" } as Record
+ });
+ const app = createApp(data);
+ app.mount(container);
+ const div = container.querySelector("div")!;
+
+ expect(div.getAttribute("data-test")).toBe("value");
+
+ // Remove all keys
+ data.attrs = {};
+ await nextTick();
+
+ expect(div.hasAttribute("data-test")).toBe(false);
+ });
+ });
+
+ describe("v-on", () => {
+ it("should attach event handler", () => {
+ container.innerHTML = 'Click ';
+
+ const handleClick = vi.fn();
+ const app = createApp({ handleClick });
+ app.mount(container);
+
+ const button = container.querySelector("button");
+ button?.click();
+
+ expect(handleClick).toHaveBeenCalled();
+ });
+
+ it("should handle shorthand syntax", () => {
+ container.innerHTML = 'Click ';
+
+ const handleClick = vi.fn();
+ const app = createApp({ handleClick });
+ app.mount(container);
+
+ const button = container.querySelector("button");
+ button?.click();
+
+ expect(handleClick).toHaveBeenCalled();
+ });
+
+ it("should handle event modifiers", () => {
+ container.innerHTML =
+ 'Click ';
+
+ const handleClick = vi.fn();
+ const app = createApp({ handleClick });
+ app.mount(container);
+
+ const button = container.querySelector("button");
+ const event = new MouseEvent("click", { cancelable: true });
+ button?.dispatchEvent(event);
+
+ expect(handleClick).toHaveBeenCalled();
+ expect(event.defaultPrevented).toBe(true);
+ });
+ });
+
+ describe("v-show", () => {
+ it("should toggle display based on condition", async () => {
+ container.innerHTML = 'Content
';
+
+ const data = reactive({ isVisible: true });
+ const app = createApp(data);
+ app.mount(container);
+
+ const div = container.querySelector("div");
+ expect(div?.style.display).not.toBe("none");
+
+ data.isVisible = false;
+
+ // Wait for reactivity to take effect
+ await nextTick();
+
+ expect(div?.style.display).toBe("none");
+ });
+ });
+
+ describe("v-text", () => {
+ it("should set text content", () => {
+ container.innerHTML = '
';
+
+ const app = createApp({ message: "Hello World" });
+ app.mount(container);
+
+ const div = container.querySelector("div");
+ expect(div?.textContent).toBe("Hello World");
+ });
+
+ it("should update text content when data changes", async () => {
+ container.innerHTML = '
';
+
+ const data = reactive({ message: "Initial" });
+ const app = createApp(data);
+ app.mount(container);
+
+ data.message = "Updated";
+
+ // Wait for reactivity to take effect
+ await nextTick();
+
+ const div = container.querySelector("div");
+ expect(div?.textContent).toBe("Updated");
+ });
+ });
+
+ describe("v-html", () => {
+ it("should set HTML content", () => {
+ container.innerHTML = '
';
+
+ const app = createApp({ htmlContent: "HTML Content " });
+ app.mount(container);
+
+ const div = container.querySelector("div");
+ expect(div?.innerHTML).toBe("HTML Content ");
+ });
+
+ it("should update HTML content when data changes", async () => {
+ container.innerHTML = '
';
+
+ const data = reactive({ htmlContent: "Initial " });
+ const app = createApp(data);
+ app.mount(container);
+
+ data.htmlContent = "Updated ";
+
+ // Wait for reactivity to take effect
+ await nextTick();
+
+ const div = container.querySelector("div");
+ expect(div?.innerHTML).toBe("Updated ");
+ });
+ });
+
+ describe("v-model", () => {
+ it("should bind input value", () => {
+ container.innerHTML = ' ';
+
+ const app = createApp({ message: "test" });
+ app.mount(container);
+
+ const input = container.querySelector("input");
+ expect(input?.value).toBe("test");
+ });
+
+ it("should update data when input changes", () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ message: "initial" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input");
+ input!.value = "updated";
+ input?.dispatchEvent(new Event("input"));
+
+ expect(data.message).toBe("updated");
+ });
+
+ it("should work with checkbox with array", async () => {
+ container.innerHTML = `
+
+
+ `;
+
+ const data = reactive({ checked: ["a"] });
+ const app = createApp(data);
+ app.mount(container);
+
+ const a = container.querySelector('input[value="a"]') as HTMLInputElement;
+ const b = container.querySelector('input[value="b"]') as HTMLInputElement;
+
+ expect(a.checked).toBe(true);
+ expect(b.checked).toBe(false);
+
+ b.click();
+ await nextTick();
+ expect(data.checked).toEqual(["a", "b"]);
+
+ a.click();
+ await nextTick();
+ expect(data.checked).toEqual(["b"]);
+ });
+
+ it("should work with radio buttons", async () => {
+ container.innerHTML = `
+
+
+ `;
+
+ const data = reactive({ picked: "a" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const a = container.querySelector('input[value="a"]') as HTMLInputElement;
+ const b = container.querySelector('input[value="b"]') as HTMLInputElement;
+
+ expect(a.checked).toBe(true);
+ expect(b.checked).toBe(false);
+
+ b.click();
+ await nextTick();
+ expect(data.picked).toBe("b");
+ });
+
+ it("should work with .lazy modifier", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ message: "initial" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input")!;
+ input.value = "updated";
+ input.dispatchEvent(new Event("input"));
+ await nextTick();
+ expect(data.message).toBe("initial");
+
+ input.dispatchEvent(new Event("change"));
+ await nextTick();
+ expect(data.message).toBe("updated");
+ });
+
+ it("should work with textarea", () => {
+ container.innerHTML = '';
+
+ const app = createApp({ message: "test" });
+ app.mount(container);
+
+ const textarea = container.querySelector("textarea");
+ expect(textarea?.value).toBe("test");
+ });
+
+ it("should work with select", () => {
+ container.innerHTML = `
+
+ Option 1
+ Option 2
+
+ `;
+
+ const app = createApp({ selected: "option2" });
+ app.mount(container);
+
+ const select = container.querySelector("select");
+ expect(select?.value).toBe("option2");
+ });
+
+ it("should work with multiple select", async () => {
+ container.innerHTML = `
+
+ Option 1
+ Option 2
+ Option 3
+
+ `;
+
+ const data = reactive({ selected: ["option1", "option3"] });
+ const app = createApp(data);
+ app.mount(container);
+
+ const select = container.querySelector("select") as HTMLSelectElement;
+ expect(select.options[0].selected).toBe(true);
+ expect(select.options[1].selected).toBe(false);
+ expect(select.options[2].selected).toBe(true);
+
+ // Change selection
+ select.options[1].selected = true;
+ select.dispatchEvent(new Event("change"));
+ await nextTick();
+ expect(data.selected).toEqual(["option1", "option2", "option3"]);
+ });
+
+ it("should handle select with non-matching value", () => {
+ container.innerHTML = `
+
+ Option 1
+ Option 2
+
+ `;
+
+ const app = createApp({ selected: "option3" });
+ app.mount(container);
+
+ const select = container.querySelector("select") as HTMLSelectElement;
+ expect(select.selectedIndex).toBe(-1);
+ });
+
+ it("should handle multiple select with non-array value", () => {
+ container.innerHTML = `
+
+ Option 1
+ Option 2
+
+ `;
+
+ const app = createApp({ selected: "notarray" });
+ app.mount(container);
+
+ const select = container.querySelector("select") as HTMLSelectElement;
+ expect(select.options[0].selected).toBe(false);
+ expect(select.options[1].selected).toBe(false);
+ });
+
+ it("should work with select with number modifier", async () => {
+ container.innerHTML = `
+
+ One
+ Two
+
+ `;
+
+ const data = reactive({ selected: 2 });
+ const app = createApp(data);
+ app.mount(container);
+
+ const select = container.querySelector("select") as HTMLSelectElement;
+ expect(select.value).toBe("2");
+
+ select.value = "1";
+ select.dispatchEvent(new Event("change"));
+ await nextTick();
+ expect(data.selected).toBe(1);
+ });
+
+ it("should work with single checkbox", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ checked: true });
+ const app = createApp(data);
+ app.mount(container);
+
+ const checkbox = container.querySelector("input") as HTMLInputElement;
+ expect(checkbox.checked).toBe(true);
+
+ checkbox.click();
+ await nextTick();
+ expect(data.checked).toBe(false);
+ });
+
+ it("should work with number input", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ value: 42 });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+ expect(input.value).toBe("42");
+
+ input.value = "123";
+ input.dispatchEvent(new Event("input"));
+ await nextTick();
+ expect(data.value).toBe(123);
+ });
+
+ it("should work with trim modifier", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ value: "test" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+ input.value = " trimmed ";
+ input.dispatchEvent(new Event("input"));
+ await nextTick();
+ expect(data.value).toBe("trimmed");
+
+ input.dispatchEvent(new Event("change"));
+ await nextTick();
+ expect(input.value).toBe("trimmed");
+ });
+
+ it("should handle composition events", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ value: "test" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+
+ // Simulate composition start
+ input.dispatchEvent(new Event("compositionstart"));
+ expect((input as any).composing).toBe(true);
+
+ // Change input value during composition - should be ignored
+ input.value = "composed";
+ input.dispatchEvent(new Event("input"));
+ await nextTick();
+ expect(data.value).toBe("test"); // should not update during composition
+
+ // Composition end should trigger update
+ input.dispatchEvent(new Event("compositionend"));
+ expect((input as any).composing).toBe(false);
+ expect(data.value).toBe("composed"); // should update after composition end
+
+ // Test multiple composition cycles
+ input.dispatchEvent(new Event("compositionstart"));
+ input.value = "second";
+ input.dispatchEvent(new Event("input"));
+ await nextTick();
+ expect(data.value).toBe("composed"); // still should not update
+
+ input.dispatchEvent(new Event("compositionend"));
+ expect(data.value).toBe("second"); // should update to new value
+ });
+
+ it("should handle composition end when composing", () => {
+ const input = document.createElement('input');
+ (input as any).composing = true;
+
+ const mockDispatch = vi.spyOn(input, 'dispatchEvent');
+ const event = new Event('compositionend');
+ Object.defineProperty(event, 'target', { value: input });
+
+ onCompositionEnd(event);
+
+ expect((input as any).composing).toBe(false);
+ expect(mockDispatch).toHaveBeenCalledWith(
+ expect.objectContaining({ type: 'input' })
+ );
+ });
+
+ it("should not trigger input when not composing", () => {
+ const input = document.createElement('input');
+ (input as any).composing = false;
+
+ const mockDispatch = vi.spyOn(input, 'dispatchEvent');
+ const event = new Event('compositionend');
+ Object.defineProperty(event, 'target', { value: input });
+
+ onCompositionEnd(event);
+
+ expect(mockDispatch).not.toHaveBeenCalled();
+ });
+
+ it("should skip update when composing", () => {
+ const input = document.createElement('input');
+ (input as any).composing = true;
+ input.value = 'old';
+
+ updateTextValue(input, () => 'new', (val) => val);
+
+ expect(input.value).toBe('old'); // should not update
+ });
+
+ it("should update text value when not composing", () => {
+ const input = document.createElement('input');
+ (input as any).composing = false;
+ input.value = 'old';
+
+ updateTextValue(input, () => 'new', (val) => val);
+
+ expect(input.value).toBe('new');
+ });
+
+ it("should handle lazy modifier with number input type edge case", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ value: 0 });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+
+ // Input event should not update immediately with lazy modifier
+ input.value = "123";
+ input.dispatchEvent(new Event("input"));
+ await nextTick();
+ expect(data.value).toBe(0);
+
+ // Change event should update
+ input.dispatchEvent(new Event("change"));
+ await nextTick();
+ expect(data.value).toBe(123);
+ });
+
+ it("should handle checkbox with custom true/false values and non-array model", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ yes: "yes-value", no: "no-value", checked: "yes-value" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const checkbox = container.querySelector("input") as HTMLInputElement;
+ expect(checkbox.checked).toBe(true);
+
+ // Uncheck it
+ checkbox.click();
+ await nextTick();
+ expect(data.checked).toBe("no-value");
+
+ // Check it again
+ checkbox.click();
+ await nextTick();
+ expect(data.checked).toBe("yes-value");
+ });
+
+ it("should skip update when active element and values match", () => {
+ const input = document.createElement('input');
+ (input as any).composing = false;
+ input.value = 'same';
+ input.focus();
+
+ updateTextValue(input, () => 'same', (val) => val);
+
+ expect(input.value).toBe('same'); // should not change
+ });
+
+ it("should handle checkbox change for array add", () => {
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.checked = true;
+ checkbox.value = 'test';
+
+ const modelValue = ['existing'];
+ const assign = vi.fn();
+
+ handleCheckboxChange(checkbox, () => modelValue, assign);
+
+ expect(assign).toHaveBeenCalledWith(['existing', 'test']);
+ });
+
+ it("should handle checkbox change for array remove", () => {
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.checked = false;
+ checkbox.value = 'test';
+
+ const modelValue = ['existing', 'test'];
+ const assign = vi.fn();
+
+ handleCheckboxChange(checkbox, () => modelValue, assign);
+
+ expect(assign).toHaveBeenCalledWith(['existing']);
+ });
+
+ it("should handle checkbox change for single value", () => {
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.checked = true;
+
+ const assign = vi.fn();
+
+ handleCheckboxChange(checkbox, () => false, assign);
+
+ expect(assign).toHaveBeenCalledWith(true);
+ });
+
+ it("should handle text input when not composing", () => {
+ const input = document.createElement('input');
+ input.value = 'test value';
+ (input as any).composing = false;
+
+ const assign = vi.fn();
+
+ handleTextInput(input, assign);
+
+ expect(assign).toHaveBeenCalledWith('test value');
+ });
+
+ it("should skip text input when composing", () => {
+ const input = document.createElement('input');
+ input.value = 'test value';
+ (input as any).composing = true;
+
+ const assign = vi.fn();
+
+ handleTextInput(input, assign);
+
+ expect(assign).not.toHaveBeenCalled();
+ });
+
+ it("should update checkbox value for array", () => {
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.value = 'test';
+
+ updateCheckboxValue(checkbox, () => ['test'], undefined);
+
+ expect(checkbox.checked).toBe(true);
+ });
+
+ it("should update checkbox value for single when changed", () => {
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+
+ updateCheckboxValue(checkbox, () => true, false);
+
+ expect(checkbox.checked).toBe(true);
+ });
+
+ it("should handle radio change", () => {
+ const radio = document.createElement('input');
+ radio.type = 'radio';
+ radio.value = 'test';
+
+ const assign = vi.fn();
+
+ handleRadioChange(radio, assign);
+
+ expect(assign).toHaveBeenCalledWith('test');
+ });
+
+ it("should handle active element check", async () => {
+ container.innerHTML = ' ';
+
+ const data = reactive({ value: "test" });
+ const app = createApp(data);
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+ input.focus();
+ expect(document.activeElement).toBe(input);
+ expect(input.value).toBe("test");
+
+ // Change input value manually (simulating user typing)
+ input.value = "modified";
+ // When data changes to same resolved value as current input, should not update input
+ data.value = "modified"; // same as current input value
+ await nextTick();
+ expect(input.value).toBe("modified"); // should not change
+ });
+
+ it("should work with select with multiple attribute", async () => {
+ container.innerHTML = `
+
+ Option 1
+ Option 2
+ Option 3
+
+ `;
+
+ const data = reactive({ selected: ["option1", "option3"] });
+ const app = createApp(data);
+ app.mount(container);
+
+ const select = container.querySelector("select")!;
+ expect(select.selectedOptions[0].value).toBe("option1");
+ expect(select.selectedOptions[1].value).toBe("option3");
+
+ select.options[1].selected = true;
+ select.dispatchEvent(new Event("change"));
+ await nextTick();
+ expect(data.selected.sort()).toEqual(
+ ["option1", "option2", "option3"].sort(),
+ );
+ });
+
+
+ it("should handle checkbox with array values", () => {
+ container.innerHTML = `
+
+
+
+ `;
+
+ const app = createApp({ selected: ["option1", "option3"] });
+ app.mount(container);
+
+ const checkboxes = container.querySelectorAll("input[type='checkbox']");
+ expect((checkboxes[0] as HTMLInputElement).checked).toBe(true);
+ expect((checkboxes[1] as HTMLInputElement).checked).toBe(false);
+ expect((checkboxes[2] as HTMLInputElement).checked).toBe(true);
+
+ // Uncheck first option
+ (checkboxes[0] as HTMLInputElement).checked = false;
+ checkboxes[0].dispatchEvent(new Event("change"));
+ expect(app.scope.selected).toEqual(["option3"]);
+
+ // Check second option
+ (checkboxes[1] as HTMLInputElement).checked = true;
+ checkboxes[1].dispatchEvent(new Event("change"));
+ expect(app.scope.selected).toEqual(["option3", "option2"]);
+ });
+
+ it("should handle radio buttons", () => {
+ container.innerHTML = `
+
+
+
+ `;
+
+ const app = createApp({ selected: "option2" });
+ app.mount(container);
+
+ const radios = container.querySelectorAll("input[type='radio']");
+ expect((radios[0] as HTMLInputElement).checked).toBe(false);
+ expect((radios[1] as HTMLInputElement).checked).toBe(true);
+ expect((radios[2] as HTMLInputElement).checked).toBe(false);
+
+ // Select first option
+ (radios[0] as HTMLInputElement).checked = true;
+ radios[0].dispatchEvent(new Event("change"));
+ expect(app.scope.selected).toBe("option1");
+ });
+
+ it("should handle lazy modifier", async () => {
+ container.innerHTML = ' ';
+
+ const app = createApp({ message: "" });
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+ input.value = "test";
+
+ // Should not update on input event
+ input.dispatchEvent(new Event("input"));
+ expect(app.scope.message).toBe("");
+
+ // Should update on change event
+ input.dispatchEvent(new Event("change"));
+ expect(app.scope.message).toBe("test");
+ });
+
+ it("should handle number modifier", () => {
+ container.innerHTML = ' ';
+
+ const app = createApp({ count: 0 });
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+ input.value = "42";
+ input.dispatchEvent(new Event("input"));
+ expect(app.scope.count).toBe(42);
+ expect(typeof app.scope.count).toBe("number");
+
+ input.value = "not a number";
+ input.dispatchEvent(new Event("input"));
+ expect(app.scope.count).toBe("not a number");
+ expect(typeof app.scope.count).toBe("string");
+ });
+
+ it("should handle trim modifier", () => {
+ container.innerHTML = ' ';
+
+ const app = createApp({ message: "" });
+ app.mount(container);
+
+ const input = container.querySelector("input") as HTMLInputElement;
+ input.value = " test ";
+ input.dispatchEvent(new Event("input"));
+ expect(app.scope.message).toBe("test");
+ });
+ });
+
+ describe("v-ref", () => {
+ it("should register element in $refs", () => {
+ container.innerHTML = '
';
+
+ const app = createApp({});
+ app.mount(container);
+
+ expect(app.scope.$refs.myRef).toBeTruthy();
+ expect(app.scope.$refs.myRef.tagName).toBe("DIV");
+ });
+
+ it("should update ref when expression changes", async () => {
+ container.innerHTML = '
';
+
+ const app = createApp({ refName: "firstRef" });
+ app.mount(container);
+
+ expect(app.scope.$refs.firstRef).toBeTruthy();
+ expect(app.scope.$refs.firstRef.tagName).toBe("DIV");
+
+ // Change ref name
+ app.scope.refName = "secondRef";
+ await nextTick();
+ expect(app.scope.$refs.firstRef).toBeUndefined();
+ expect(app.scope.$refs.secondRef).toBeTruthy();
+ });
+
+ it("should cleanup old ref when ref changes", async () => {
+ container.innerHTML = '
';
+
+ const app = createApp({ refName: "firstRef" });
+ app.mount(container);
+
+ const element = app.scope.$refs.firstRef;
+ expect(element).toBeTruthy();
+
+ // Change ref name
+ app.scope.refName = "secondRef";
+ await nextTick();
+
+ // Old ref should be cleaned up
+ expect(app.scope.$refs.firstRef).toBeUndefined();
+ // New ref should be set
+ expect(app.scope.$refs.secondRef).toBe(element);
+ });
+
+ it("should cleanup ref on unmount", () => {
+ container.innerHTML = '
';
+
+ const app = createApp({});
+ app.mount(container);
+
+ const element = app.scope.$refs.myRef;
+ expect(element).toBeTruthy();
+
+ // Unmount the app
+ app.unmount();
+
+ // Ref should be cleaned up
+ expect(app.scope.$refs.myRef).toBeUndefined();
+ });
+ });
+
+ describe("v-for", () => {
+ it("should render list items", () => {
+ container.innerHTML = `
+
+ {{ item.name }}
+
+ `;
+
+ const app = createApp({
+ items: [
+ { id: 1, name: "Item 1" },
+ { id: 2, name: "Item 2" }
+ ]
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("Item 1");
+ expect(divs[1].textContent?.trim()).toBe("Item 2");
+ });
+
+ it("should handle object iteration", () => {
+ container.innerHTML = `
+
+ {{ key }}: {{ value }}
+
+ `;
+
+ const app = createApp({
+ obj: { a: 1, b: 2 }
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("a: 1");
+ expect(divs[1].textContent?.trim()).toBe("b: 2");
+ });
+
+ it("should handle array with index", () => {
+ container.innerHTML = `
+
+ {{ index }}: {{ item }}
+
+ `;
+
+ const app = createApp({
+ items: ["a", "b"]
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("0: a");
+ expect(divs[1].textContent?.trim()).toBe("1: b");
+ });
+
+ it("should handle object iteration with index", () => {
+ container.innerHTML = `
+
+ {{ index }}: {{ key }}: {{ value }}
+
+ `;
+
+ const app = createApp({
+ obj: { a: 1, b: 2 }
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("0: a: 1");
+ expect(divs[1].textContent?.trim()).toBe("1: b: 2");
+ });
+
+ it("should handle nested object iteration", () => {
+ container.innerHTML = `
+
+
+ {{ nestedKey }}: {{ nestedValue }}
+
+
+ `;
+
+ const app = createApp({
+ obj: {
+ group1: { a: 1, b: 2 },
+ group2: { c: 3, d: 4 }
+ }
+ });
+ app.mount(container);
+
+ const spans = container.querySelectorAll("span");
+ expect(spans.length).toBe(4);
+ expect(spans[0].textContent?.trim()).toBe("a: 1");
+ expect(spans[1].textContent?.trim()).toBe("b: 2");
+ expect(spans[2].textContent?.trim()).toBe("c: 3");
+ expect(spans[3].textContent?.trim()).toBe("d: 4");
+ });
+
+ it("should handle dynamic list updates", async () => {
+ container.innerHTML = `
+
+ {{ item }}
+
+ `;
+
+ const app = createApp({
+ items: ["a", "b"]
+ });
+ app.mount(container);
+
+ let divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+
+ // Add new item
+ app.scope.items.push("c");
+ await nextTick();
+ divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(3);
+ expect(divs[2].textContent?.trim()).toBe("c");
+
+ // Remove item
+ app.scope.items.pop();
+ await nextTick();
+ divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ });
+
+ it("should handle empty array", () => {
+ container.innerHTML = `
+
+ {{ item }}
+
+ `;
+
+ const app = createApp({
+ items: []
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(0);
+ });
+
+ it("should handle null/undefined array", () => {
+ container.innerHTML = `
+
+ {{ item }}
+
+ `;
+
+ const app = createApp({
+ items: null
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(0);
+
+ // Set to undefined
+ app.scope.items = undefined;
+ expect(divs.length).toBe(0);
+ });
+
+ it("should handle array destructuring", () => {
+ container.innerHTML = `
+
+ {{ a }}, {{ b }}
+
+ `;
+
+ const app = createApp({
+ items: [[1, 2], [3, 4]]
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("1, 2");
+ expect(divs[1].textContent?.trim()).toBe("3, 4");
+ });
+
+ it("should handle object destructuring", () => {
+ container.innerHTML = `
+
+ {{ name }}: {{ age }}
+
+ `;
+
+ const app = createApp({
+ items: [
+ { name: "John", age: 25 },
+ { name: "Jane", age: 30 }
+ ]
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("John: 25");
+ expect(divs[1].textContent?.trim()).toBe("Jane: 30");
+ });
+
+ it("should handle v-for block reuse when keys change completely", async () => {
+ container.innerHTML = `
+
+ {{ item.name }}
+
+ `;
+
+ const data = reactive({
+ items: [{ id: 1, name: "First" }, { id: 2, name: "Second" }]
+ });
+ const app = createApp(data);
+ app.mount(container);
+
+ let divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("First");
+
+ // Replace with completely new items (new keys, should create new blocks)
+ data.items = [{ id: 3, name: "Third" }, { id: 4, name: "Fourth" }];
+ await nextTick();
+
+ divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("Third");
+ expect(divs[1].textContent?.trim()).toBe("Fourth");
+ });
+
+ it("should handle v-for as last element in container", () => {
+ container.innerHTML = `{{ item }}
`;
+
+ const app = createApp({
+ items: ["A", "B", "C"]
+ });
+ app.mount(container);
+
+ const divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(3);
+ expect(divs[0].textContent).toBe("A");
+ expect(divs[1].textContent).toBe("B");
+ expect(divs[2].textContent).toBe("C");
+ });
+
+ it("should handle complex reordering", async () => {
+ container.innerHTML = `
+
+ {{ item.value }}
+
+ `;
+
+ const data = reactive({
+ items: [
+ { id: 1, value: 'A' },
+ { id: 2, value: 'B' },
+ { id: 3, value: 'C' },
+ { id: 4, value: 'D' }
+ ]
+ });
+ const app = createApp(data);
+ app.mount(container);
+
+ let divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(4);
+ expect(divs[0].textContent?.trim()).toBe("A");
+ expect(divs[1].textContent?.trim()).toBe("B");
+ expect(divs[2].textContent?.trim()).toBe("C");
+ expect(divs[3].textContent?.trim()).toBe("D");
+
+ // Complex reordering: D, B, A, C - this should trigger various move conditions
+ data.items = [
+ { id: 4, value: 'D' },
+ { id: 2, value: 'B' },
+ { id: 1, value: 'A' },
+ { id: 3, value: 'C' }
+ ];
+ await nextTick();
+
+ divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(4);
+ expect(divs[0].textContent?.trim()).toBe("D");
+ expect(divs[1].textContent?.trim()).toBe("B");
+ expect(divs[2].textContent?.trim()).toBe("A");
+ expect(divs[3].textContent?.trim()).toBe("C");
+ });
+
+ it("should handle adding items in the middle", async () => {
+ container.innerHTML = `
+
+ {{ item.value }}
+
+ `;
+
+ const data = reactive({
+ items: [
+ { id: 1, value: 'A' },
+ { id: 3, value: 'C' }
+ ]
+ });
+ const app = createApp(data);
+ app.mount(container);
+
+ let divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(2);
+ expect(divs[0].textContent?.trim()).toBe("A");
+ expect(divs[1].textContent?.trim()).toBe("C");
+
+ // Add item in the middle
+ data.items.splice(1, 0, { id: 2, value: 'B' });
+ await nextTick();
+
+ divs = container.querySelectorAll("div");
+ expect(divs.length).toBe(3);
+ expect(divs[0].textContent?.trim()).toBe("A");
+ expect(divs[1].textContent?.trim()).toBe("B");
+ expect(divs[2].textContent?.trim()).toBe("C");
+ });
+
+
+
+
+
+ });
+
+ describe("v-for integration tests", () => {
+ it("should handle complex list reordering efficiently", async () => {
+ container.innerHTML = `
+
+ `;
+
+ const data = reactive({
+ items: [
+ { id: 1, name: 'First' },
+ { id: 2, name: 'Second' },
+ { id: 3, name: 'Third' },
+ { id: 4, name: 'Fourth' }
+ ]
+ });
+ const app = createApp(data);
+ app.mount(container);
+
+ let items = container.querySelectorAll("li");
+ expect(items.length).toBe(4);
+ expect(items[0].textContent?.trim()).toBe("First");
+ expect(items[1].textContent?.trim()).toBe("Second");
+ expect(items[2].textContent?.trim()).toBe("Third");
+ expect(items[3].textContent?.trim()).toBe("Fourth");
+
+ // Complex reordering: move items around, add new, and remove existing
+ data.items = [
+ { id: 4, name: 'Fourth Updated' }, // moved to front and updated
+ { id: 2, name: 'Second' }, // stays in middle
+ { id: 5, name: 'New Fifth' }, // new item added
+ { id: 1, name: 'First Moved' } // moved to end and updated
+ // id: 3 (Third) is removed
+ ];
+ await nextTick();
+
+ items = container.querySelectorAll("li");
+ expect(items.length).toBe(4);
+ expect(items[0].textContent?.trim()).toBe("Fourth Updated");
+ expect(items[1].textContent?.trim()).toBe("Second");
+ expect(items[2].textContent?.trim()).toBe("New Fifth");
+ expect(items[3].textContent?.trim()).toBe("First Moved");
+
+ // Verify data-id attributes are maintained correctly
+ expect(items[0].getAttribute('data-id')).toBe('4');
+ expect(items[1].getAttribute('data-id')).toBe('2');
+ expect(items[2].getAttribute('data-id')).toBe('5');
+ expect(items[3].getAttribute('data-id')).toBe('1');
+ });
+
+ it("should handle mixed reordering with insertions and removals", async () => {
+ container.innerHTML = `
+
+
+ {{ user.name }}
+ {{ user.email }}
+
+
+ `;
+
+ const data = reactive({
+ users: [
+ { id: 'a1', name: 'Alice', email: 'alice@example.com' },
+ { id: 'b2', name: 'Bob', email: 'bob@example.com' }
+ ]
+ });
+ const app = createApp(data);
+ app.mount(container);
+
+ let users = container.querySelectorAll(".user-card");
+ expect(users.length).toBe(2);
+
+ // Update: add new user, update existing, remove one
+ data.users = [
+ { id: 'c3', name: 'Charlie', email: 'charlie@example.com' }, // new
+ { id: 'a1', name: 'Alice Smith', email: 'alice.smith@example.com' }, // updated
+ // b2 (Bob) is removed
+ { id: 'd4', name: 'Diana', email: 'diana@example.com' } // new
+ ];
+ await nextTick();
+
+ users = container.querySelectorAll(".user-card");
+ expect(users.length).toBe(3);
+
+ const names = Array.from(users).map(el =>
+ el.querySelector('.name')?.textContent?.trim()
+ );
+ const emails = Array.from(users).map(el =>
+ el.querySelector('.email')?.textContent?.trim()
+ );
+
+ expect(names).toEqual(['Charlie', 'Alice Smith', 'Diana']);
+ expect(emails).toEqual(['charlie@example.com', 'alice.smith@example.com', 'diana@example.com']);
+ });
+ });
+
+ describe("v-effect", () => {
+ it("should run effect when mounted", async () => {
+ container.innerHTML = '
';
+
+ const sideEffect = vi.fn();
+ const app = createApp({ sideEffect });
+ app.mount(container);
+
+ // Wait for effect to run
+ await nextTick();
+
+ expect(sideEffect).toHaveBeenCalled();
+ });
+
+ it("should run effect when dependencies change", async () => {
+ container.innerHTML = '
';
+
+ let callCount = 0;
+ const app = createApp({
+ sideEffect: () => {
+ callCount++;
+ },
+ });
+ app.mount(container);
+
+ // Wait for effect to run
+ await nextTick();
+
+ expect(callCount).toBe(1);
+ });
+ });
+});
diff --git a/__tests__/eval.test.ts b/__tests__/eval.test.ts
new file mode 100644
index 0000000..332aea6
--- /dev/null
+++ b/__tests__/eval.test.ts
@@ -0,0 +1,274 @@
+import { describe, it, expect, beforeEach, vi } from 'vitest'
+import { evaluate, execute } from '../src/eval'
+
+describe('evaluate', () => {
+ let scope: any
+ let el: Element
+
+ beforeEach(() => {
+ el = document.createElement('div')
+ scope = {
+ message: 'Hello',
+ count: 42,
+ user: { name: 'John', age: 30 },
+ items: ['item1', 'item2'],
+ isActive: true,
+ method: function() {
+ return this.message
+ }
+ }
+ })
+
+ it('should evaluate simple expressions', () => {
+ expect(evaluate(scope, 'message', el)).toBe('Hello')
+ expect(evaluate(scope, 'count', el)).toBe(42)
+ expect(evaluate(scope, 'isActive', el)).toBe(true)
+ // This should execute the try block
+ expect(evaluate(scope, 'count + 10', el)).toBe(52)
+ })
+
+ it('should evaluate object property access', () => {
+ expect(evaluate(scope, 'user.name', el)).toBe('John')
+ expect(evaluate(scope, 'user.age', el)).toBe(30)
+ })
+
+ it('should evaluate array access', () => {
+ expect(evaluate(scope, 'items[0]', el)).toBe('item1')
+ expect(evaluate(scope, 'items[1]', el)).toBe('item2')
+ })
+
+ it('should evaluate method calls', () => {
+ expect(evaluate(scope, 'method()', el)).toBe('Hello')
+ })
+
+ it('should evaluate complex expressions', () => {
+ expect(evaluate(scope, 'count + 10', el)).toBe(52)
+ expect(evaluate(scope, 'message + " World"', el)).toBe('Hello World')
+ expect(evaluate(scope, 'user.age > 25', el)).toBe(true)
+ })
+
+ it('should evaluate ternary expressions', () => {
+ expect(evaluate(scope, 'isActive ? "Active" : "Inactive"', el)).toBe('Active')
+ scope.isActive = false
+ expect(evaluate(scope, 'isActive ? "Active" : "Inactive"', el)).toBe('Inactive')
+ })
+
+ it('should evaluate logical expressions', () => {
+ expect(evaluate(scope, 'isActive && count > 0', el)).toBe(true)
+ expect(evaluate(scope, 'isActive || false', el)).toBe(true)
+ })
+
+ it('should handle undefined properties', () => {
+ expect(evaluate(scope, 'nonexistent', el)).toBeUndefined()
+ expect(evaluate(scope, 'user.nonexistent', el)).toBeUndefined()
+ })
+
+ it('should handle null values', () => {
+ scope.nullValue = null
+ expect(evaluate(scope, 'nullValue', el)).toBeNull()
+ })
+
+ it('should handle function expressions', () => {
+ const result = evaluate(scope, 'method', el)
+ expect(typeof result).toBe('function')
+ expect(result.call(scope)).toBe('Hello')
+ })
+
+ it('should handle nested object access', () => {
+ scope.nested = { level1: { level2: { value: 'deep' } } }
+ expect(evaluate(scope, 'nested.level1.level2.value', el)).toBe('deep')
+ })
+
+ it('should handle array methods', () => {
+ expect(evaluate(scope, 'items.length', el)).toBe(2)
+ expect(evaluate(scope, 'items.indexOf("item1")', el)).toBe(0)
+ })
+
+ it('should handle mathematical operations', () => {
+ expect(evaluate(scope, 'count * 2', el)).toBe(84)
+ expect(evaluate(scope, 'count / 2', el)).toBe(21)
+ expect(evaluate(scope, 'count % 10', el)).toBe(2)
+ })
+
+ it('should handle string operations', () => {
+ expect(evaluate(scope, 'message.length', el)).toBe(5)
+ expect(evaluate(scope, 'message.toUpperCase()', el)).toBe('HELLO')
+ })
+
+ it('should handle comparison operations', () => {
+ expect(evaluate(scope, 'count > 40', el)).toBe(true)
+ expect(evaluate(scope, 'count < 50', el)).toBe(true)
+ expect(evaluate(scope, 'count === 42', el)).toBe(true)
+ })
+
+ it('should handle this context', () => {
+ // Note: 'this' context works differently in the eval function
+ // Let's test direct property access instead
+ expect(evaluate(scope, 'message', el)).toBe('Hello')
+ expect(evaluate(scope, 'count', el)).toBe(42)
+ })
+
+ it('should handle complex nested expressions', () => {
+ const result = evaluate(scope, 'items.length', el)
+ expect(result).toBe(2)
+ })
+
+ it('should handle error cases gracefully', () => {
+ expect(() => evaluate(scope, 'syntax error', el)).not.toThrow()
+ expect(evaluate(scope, 'syntax error', el)).toBeUndefined()
+ })
+
+ it('should handle boolean coercion', () => {
+ expect(evaluate(scope, '!!message', el)).toBe(true)
+ expect(evaluate(scope, '!count', el)).toBe(false)
+ })
+
+ it('should handle type checking', () => {
+ expect(evaluate(scope, 'typeof message', el)).toBe('string')
+ expect(evaluate(scope, 'typeof count', el)).toBe('number')
+ expect(evaluate(scope, 'typeof user', el)).toBe('object')
+ })
+
+ it('should handle conditional expressions', () => {
+ expect(evaluate(scope, 'isActive ? count * 2 : count / 2', el)).toBe(84)
+ scope.isActive = false
+ expect(evaluate(scope, 'isActive ? count * 2 : count / 2', el)).toBe(21)
+ })
+
+ it('should handle object property access with variables', () => {
+ const prop = 'name'
+ scope.prop = prop
+ expect(evaluate(scope, 'user[prop]', el)).toBe('John')
+ })
+
+ it('should handle array access with variables', () => {
+ const index = 0
+ scope.index = index
+ expect(evaluate(scope, 'items[index]', el)).toBe('item1')
+ })
+
+ it('should reject dangerous expressions', () => {
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
+
+ // Test various dangerous patterns
+ expect(evaluate(scope, 'eval("alert(1)")', el)).toBeUndefined()
+ expect(evaluate(scope, 'window.location', el)).toBeUndefined()
+ expect(evaluate(scope, 'delete something()', el)).toBeUndefined()
+
+ // Test empty and overly long expressions
+ expect(evaluate(scope, '', el)).toBeUndefined()
+ expect(evaluate(scope, 'a'.repeat(1001), el)).toBeUndefined()
+
+ expect(consoleWarnSpy).toHaveBeenCalledTimes(5)
+
+ consoleWarnSpy.mockRestore()
+ })
+})
+
+describe('execute', () => {
+ let scope: any
+ let el: Element
+
+ beforeEach(() => {
+ el = document.createElement('div')
+ scope = {
+ message: 'Hello',
+ count: 42,
+ sideEffect: vi.fn()
+ }
+ })
+
+ it('should execute simple expressions', () => {
+ expect(execute(scope, 'sideEffect()', el)).toBeUndefined()
+ expect(scope.sideEffect).toHaveBeenCalled()
+ })
+
+ it('should handle error in execution', () => {
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
+
+ // This should throw an error
+ const result = execute(scope, 'throw new Error("test error")', el)
+
+ expect(result).toBeUndefined()
+ expect(consoleErrorSpy).toHaveBeenCalled()
+
+ consoleErrorSpy.mockRestore()
+ })
+
+ it('should cache compiled functions', () => {
+ const exp = 'sideEffect()'
+ execute(scope, exp, el)
+ execute(scope, exp, el) // Should use cached function
+
+ expect(scope.sideEffect).toHaveBeenCalledTimes(2)
+ })
+
+ it('should handle invalid function syntax', () => {
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
+
+ // This syntax error should be caught
+ const result = execute(scope, 'invalid syntax {{{', el)
+
+ expect(result).toBeUndefined()
+ expect(consoleErrorSpy).toHaveBeenCalled()
+
+ consoleErrorSpy.mockRestore()
+ })
+
+ it('should reject dangerous expressions in execute', () => {
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
+
+ // Test dangerous expressions are rejected
+ expect(execute(scope, 'window.alert(1)', el)).toBeUndefined()
+ expect(execute(scope, 'eval("code")', el)).toBeUndefined()
+
+ expect(consoleWarnSpy).toHaveBeenCalledTimes(2)
+
+ consoleWarnSpy.mockRestore()
+ })
+
+ it('should invalidate cache on execution error', () => {
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
+
+ // Create a function that will be cached initially
+ const exp = 'count + 1'
+ execute(scope, exp, el) // Should cache the function
+
+ // Now execute with an expression that causes runtime error
+ const errorExp = 'nonexistent.property.access'
+ const result = execute(scope, errorExp, el)
+
+ expect(result).toBeUndefined()
+ expect(consoleErrorSpy).toHaveBeenCalled()
+
+ // The error expression should be removed from cache
+ // We can't directly test the cache, but we can verify the error was logged
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ expect.stringContaining('Error executing expression'),
+ expect.any(Error)
+ )
+
+ consoleErrorSpy.mockRestore()
+ })
+
+ it('should handle runtime errors in cached functions', () => {
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
+
+ // First execute a valid expression to cache it
+ const exp = 'sideEffect()'
+ execute(scope, exp, el)
+
+ // Now modify scope to cause runtime error on next execution
+ scope.sideEffect = () => { throw new Error('runtime error') }
+
+ // Execute again - should handle the error and remove from cache
+ const result = execute(scope, exp, el)
+
+ expect(result).toBeUndefined()
+ expect(consoleErrorSpy).toHaveBeenCalled()
+
+ consoleErrorSpy.mockRestore()
+ })
+
+
+})
\ No newline at end of file
diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts
new file mode 100644
index 0000000..ff45bcc
--- /dev/null
+++ b/__tests__/index.test.ts
@@ -0,0 +1,101 @@
+import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
+
+describe("index.ts", () => {
+ let originalCurrentScript: HTMLOrSVGScriptElement | null;
+
+ beforeEach(() => {
+ // Store original currentScript
+ originalCurrentScript = document.currentScript;
+ });
+
+ afterEach(() => {
+ // Restore original currentScript if it was set
+ if (originalCurrentScript !== null) {
+ Object.defineProperty(document, "currentScript", {
+ value: originalCurrentScript,
+ writable: true,
+ configurable: true
+ });
+ }
+ });
+
+ it("should export createApp", async () => {
+ const { createApp } = await import("../src/index");
+ expect(createApp).toBeDefined();
+ });
+
+ it("should export nextTick", async () => {
+ const { nextTick } = await import("../src/index");
+ expect(nextTick).toBeDefined();
+ });
+
+ it("should export reactive", async () => {
+ const { reactive } = await import("../src/index");
+ expect(reactive).toBeDefined();
+ });
+
+ it("should export watchEffect", async () => {
+ const indexExports = await import("../src/index");
+ // Test that effect is re-exported as watchEffect
+ expect(indexExports.watchEffect).toBeDefined();
+ });
+
+ it("should not auto-mount when script has no init attribute", async () => {
+ // Create a script element without init attribute
+ const script = document.createElement("script");
+ script.textContent = ""; // Empty script to simulate currentScript
+
+ // Mock currentScript to be our script without init attribute
+ Object.defineProperty(document, "currentScript", {
+ value: script,
+ writable: true,
+ configurable: true
+ });
+
+ // Spy on console.warn to check if mount warning is logged
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
+
+ // Import index module
+ const { autoMount } = await import("../src/index");
+
+ // Call autoMount
+ autoMount();
+
+ // Verify no warning was logged (since mount shouldn't be called)
+ expect(consoleWarnSpy).not.toHaveBeenCalled();
+
+ // Restore the spy
+ consoleWarnSpy.mockRestore();
+ });
+
+ it("should auto-mount when script has init attribute", async () => {
+ // Create a script element with init attribute
+ const script = document.createElement("script");
+ script.setAttribute("init", "");
+ script.textContent = ""; // Empty script to simulate currentScript
+
+ // Mock currentScript to be our script with init attribute
+ Object.defineProperty(document, "currentScript", {
+ value: script,
+ writable: true,
+ configurable: true
+ });
+
+ // Spy on console.warn to check if mount warning is logged
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
+
+ // Import index module
+ const { autoMount } = await import("../src/index");
+
+ // Call autoMount
+ autoMount();
+
+ // Verify warning was logged (since mount is called and logs a warning in dev mode)
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
+ expect.stringContaining('Mounting on documentElement')
+ );
+
+ // Restore the spy
+ consoleWarnSpy.mockRestore();
+ });
+});
\ No newline at end of file
diff --git a/__tests__/integration.test.ts b/__tests__/integration.test.ts
new file mode 100644
index 0000000..bacccf1
--- /dev/null
+++ b/__tests__/integration.test.ts
@@ -0,0 +1,303 @@
+import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'
+import { createApp } from '../src/app'
+import { reactive } from '@vue/reactivity'
+import { nextTick } from '../src/scheduler'
+
+describe('integration tests', () => {
+ let container: HTMLElement
+
+ beforeEach(() => {
+ container = document.createElement('div')
+ document.body.appendChild(container)
+ })
+
+ afterEach(() => {
+ container.remove()
+ })
+
+ describe('reactivity system', () => {
+ it('should handle reactive data updates', async () => {
+ container.innerHTML = '{{ message }}
Update '
+
+ const data = reactive({
+ message: 'Hello',
+ updateMessage() {
+ this.message = 'Updated'
+ }
+ })
+
+ const app = createApp(data)
+ app.mount(container)
+
+ expect(container.querySelector('div')?.textContent).toBe('Hello')
+
+ const button = container.querySelector('button')
+ button?.click()
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ expect(container.querySelector('div')?.textContent).toBe('Updated')
+ })
+
+ it('should handle nested reactive objects', async () => {
+ container.innerHTML = '{{ user.name }}
{{ user.profile.age }}
'
+
+ const data = reactive({
+ user: {
+ name: 'John',
+ profile: {
+ age: 30
+ }
+ }
+ })
+
+ const app = createApp(data)
+ app.mount(container)
+
+ const divs = container.querySelectorAll('div')
+ expect(divs[0]?.textContent).toBe('John')
+ expect(divs[1]?.textContent).toBe('30')
+
+ data.user.name = 'Jane'
+ data.user.profile.age = 31
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ expect(divs[0]?.textContent).toBe('Jane')
+ expect(divs[1]?.textContent).toBe('31')
+ })
+
+ it('should handle array operations', async () => {
+ container.innerHTML = ''
+
+ const data = reactive({
+ items: ['item1', 'item2', 'item3']
+ })
+
+ const app = createApp(data)
+ app.mount(container)
+
+ let items = container.querySelectorAll('li')
+ expect(items.length).toBe(3)
+ expect(items[0]?.textContent).toBe('item1')
+
+ data.items.push('item4')
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ items = container.querySelectorAll('li')
+ expect(items.length).toBe(4)
+ expect(items[3]?.textContent).toBe('item4')
+
+ data.items.pop()
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ items = container.querySelectorAll('li')
+ expect(items.length).toBe(3)
+ })
+ })
+
+ describe('component-like behavior', () => {
+ it('should handle scoped data in nested elements', async () => {
+ container.innerHTML = '{{ localCount }}
Increment '
+
+ const app = createApp()
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ const button = container.querySelector('button')
+
+ expect(div?.textContent).toContain('0')
+
+ button?.click()
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ expect(div?.textContent).toContain('1')
+ })
+
+ it('should handle multiple independent instances', async () => {
+ container.innerHTML = ''
+
+ const app1 = createApp({
+ message: 'App1',
+ update() {
+ this.message = 'App1 Updated'
+ }
+ })
+
+ const app2 = createApp({
+ message: 'App2',
+ update() {
+ this.message = 'App2 Updated'
+ }
+ })
+
+ app1.mount('#app1')
+ app2.mount('#app2')
+
+ const app1Div = container.querySelector('#app1 div')
+ const app2Div = container.querySelector('#app2 div')
+
+ expect(app1Div?.textContent).toBe('App1')
+ expect(app2Div?.textContent).toBe('App2')
+
+ const app1Button = container.querySelector('#app1 button') as HTMLButtonElement
+ app1Button?.click()
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ expect(app1Div?.textContent).toBe('App1 Updated')
+ expect(app2Div?.textContent).toBe('App2')
+ })
+ })
+
+ describe('lifecycle and cleanup', () => {
+ it('should clean up effects when unmounted', async () => {
+ container.innerHTML = '
'
+
+ let callCount = 0
+ const app = createApp({
+ trackEffect() {
+ callCount++
+ }
+ })
+ app.mount(container)
+
+ // Wait for effect to run
+ await nextTick()
+
+ // The effect should have been called at least once
+ expect(callCount).toBeGreaterThan(0)
+
+ const initialCallCount = callCount
+
+ // Properly unmount the app
+ app.unmount()
+
+ // Wait to see if effect runs again (it shouldn't)
+ await nextTick()
+
+ // The effect should not run again after unmount
+ expect(callCount).toBe(initialCallCount)
+ })
+
+ it('should handle conditional rendering', async () => {
+ container.innerHTML = 'Visible Content
Toggle '
+
+ const data = reactive({
+ show: true,
+ toggle() {
+ this.show = !this.show
+ }
+ })
+
+ const app = createApp(data)
+ app.mount(container)
+
+ let content = container.querySelector('div')
+ expect(content?.textContent).toBe('Visible Content')
+
+ const button = container.querySelector('button')
+ button?.click()
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ content = container.querySelector('div')
+ expect(content).toBeNull()
+
+ button?.click()
+
+ // Wait for reactivity to take effect
+ await nextTick()
+
+ content = container.querySelector('div')
+ expect(content?.textContent).toBe('Visible Content')
+ })
+ })
+
+ describe('error handling', () => {
+ it('should handle undefined expressions gracefully', () => {
+ container.innerHTML = '{{ undefinedVar }}
'
+
+ const app = createApp({})
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ expect(div?.textContent).toBe('')
+ })
+
+ it('should handle null expressions gracefully', () => {
+ container.innerHTML = '{{ nullVar }}
'
+
+ const app = createApp({ nullVar: null })
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ expect(div?.textContent).toBe('')
+ })
+
+ it('should handle function expressions', () => {
+ container.innerHTML = '{{ getMessage() }}
'
+
+ const app = createApp({
+ getMessage() {
+ return 'Hello from function'
+ }
+ })
+ app.mount(container)
+
+ const div = container.querySelector('div')
+ expect(div?.textContent).toBe('Hello from function')
+ })
+ })
+
+ describe('performance optimizations', () => {
+ it('should batch DOM updates', () => {
+ container.innerHTML = `
+ {{ count }}
+ {{ count }}
+ {{ count }}
+ `
+
+ const data = reactive({ count: 0 })
+ const app = createApp(data)
+ app.mount(container)
+
+ const spy = vi.spyOn(container, 'querySelectorAll')
+
+ data.count = 1
+
+ expect(spy).not.toHaveBeenCalled()
+ })
+
+ it('should avoid unnecessary re-renders', () => {
+ container.innerHTML = `
+ {{ staticValue }}
+ {{ dynamicValue }}
+ `
+
+ const data = reactive({
+ staticValue: 'static',
+ dynamicValue: 'dynamic'
+ })
+ const app = createApp(data)
+ app.mount(container)
+
+ const staticDiv = container.querySelector('div:first-child')
+ const originalText = staticDiv?.textContent
+
+ data.dynamicValue = 'updated'
+
+ expect(staticDiv?.textContent).toBe(originalText)
+ })
+ })
+})
\ No newline at end of file
diff --git a/__tests__/on-directive.test.ts b/__tests__/on-directive.test.ts
new file mode 100644
index 0000000..15dd62c
--- /dev/null
+++ b/__tests__/on-directive.test.ts
@@ -0,0 +1,529 @@
+import { describe, it, expect, beforeEach, vi } from "vitest";
+import { on } from "../src/directives/on";
+import { createContext } from "../src/context";
+import { evaluate } from "../src/eval";
+import { effect as rawEffect } from "@vue/reactivity";
+import { nextTick } from "../src/scheduler";
+
+describe("on directive", () => {
+ let container: HTMLElement;
+ let ctx: any;
+
+ beforeEach(() => {
+ container = document.createElement("div");
+ ctx = createContext();
+ ctx.scope.$refs = Object.create(null);
+ });
+
+ it("should handle simple path expressions", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: undefined,
+ ctx
+ });
+
+ el.click();
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle complex expressions", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp) => {
+ if (exp === "($event => { handler($event) })") {
+ return (e: Event) => handler(e);
+ }
+ return ctx.scope[exp || "handler"];
+ },
+ effect: rawEffect,
+ exp: "handler($event)",
+ arg: "click",
+ modifiers: undefined,
+ ctx
+ });
+
+ el.click();
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle vue:mounted lifecycle", async () => {
+ const el = document.createElement("div");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "vue:mounted",
+ modifiers: undefined,
+ ctx
+ });
+
+ // Handler should be called on nextTick
+ await nextTick();
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle vue:unmounted lifecycle", () => {
+ const el = document.createElement("div");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ const cleanup = on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "vue:unmounted",
+ modifiers: undefined,
+ ctx
+ });
+
+ expect(typeof cleanup).toBe("function");
+ if (cleanup) cleanup();
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle stop modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+ const stopPropagation = vi.fn();
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { stop: true },
+ ctx
+ });
+
+ const event = new Event("click");
+ event.stopPropagation = stopPropagation;
+ el.dispatchEvent(event);
+
+ expect(stopPropagation).toHaveBeenCalled();
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle prevent modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+ const preventDefault = vi.fn();
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { prevent: true },
+ ctx
+ });
+
+ const event = new Event("click");
+ event.preventDefault = preventDefault;
+ el.dispatchEvent(event);
+
+ expect(preventDefault).toHaveBeenCalled();
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle self modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { self: true },
+ ctx
+ });
+
+ // Create a child element and click it
+ const child = document.createElement("span");
+ el.appendChild(child);
+
+ const event = new Event("click");
+ Object.defineProperty(event, "target", { value: child });
+ Object.defineProperty(event, "currentTarget", { value: el });
+
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ // Click the element itself
+ const selfEvent = new Event("click");
+ Object.defineProperty(selfEvent, "target", { value: el });
+ Object.defineProperty(selfEvent, "currentTarget", { value: el });
+ el.dispatchEvent(selfEvent);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle ctrl modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { ctrl: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { ctrlKey: false });
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const eventWithCtrl = new MouseEvent("click", { ctrlKey: true });
+ el.dispatchEvent(eventWithCtrl);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle shift modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { shift: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { shiftKey: false });
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const eventWithShift = new MouseEvent("click", { shiftKey: true });
+ el.dispatchEvent(eventWithShift);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle alt modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { alt: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { altKey: false });
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const eventWithAlt = new MouseEvent("click", { altKey: true });
+ el.dispatchEvent(eventWithAlt);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle meta modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { meta: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { metaKey: false });
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const eventWithMeta = new MouseEvent("click", { metaKey: true });
+ el.dispatchEvent(eventWithMeta);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle left mouse button modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { left: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { button: 1 }); // Right button
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const leftClickEvent = new MouseEvent("click", { button: 0 }); // Left button
+ el.dispatchEvent(leftClickEvent);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle middle mouse button modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { middle: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { button: 0 }); // Left button
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const middleClickEvent = new MouseEvent("mouseup", { button: 1 }); // Middle button
+ el.dispatchEvent(middleClickEvent);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle right mouse button modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { right: true },
+ ctx
+ });
+
+ const event = new MouseEvent("click", { button: 0 }); // Left button
+ el.dispatchEvent(event);
+ expect(handler).not.toHaveBeenCalled();
+
+ const rightClickEvent = new MouseEvent("contextmenu", { button: 2 }); // Right button
+ el.dispatchEvent(rightClickEvent);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle exact modifier", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: (exp = "handler") => evaluate(ctx.scope, exp, el),
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { exact: true },
+ ctx
+ });
+
+ // Event with extra modifiers should not trigger
+ const eventWithExtra = new MouseEvent("click", { ctrlKey: true, shiftKey: true });
+ el.dispatchEvent(eventWithExtra);
+ expect(handler).not.toHaveBeenCalled();
+
+ // Event without modifiers should trigger
+ const eventWithoutModifiers = new MouseEvent("click");
+ el.dispatchEvent(eventWithoutModifiers);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle key modifiers", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "keydown",
+ modifiers: { enter: true },
+ ctx
+ });
+
+ const enterEvent = new KeyboardEvent("keydown", { key: "Enter" });
+ el.dispatchEvent(enterEvent);
+ expect(handler).toHaveBeenCalled();
+
+ const escapeEvent = new KeyboardEvent("keydown", { key: "Escape" });
+ el.dispatchEvent(escapeEvent);
+ expect(handler).toHaveBeenCalledTimes(1); // Should not be called again
+ });
+
+ it("should handle right click modifier mapping", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { right: true },
+ ctx
+ });
+
+ // Should map to contextmenu event
+ const event = new Event("contextmenu");
+ el.dispatchEvent(event);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should handle middle click modifier mapping", () => {
+ const el = document.createElement("button");
+ const handler = vi.fn();
+ ctx.scope.handler = handler;
+
+ on({
+ el,
+ get: () => handler,
+ effect: rawEffect,
+ exp: "handler",
+ arg: "click",
+ modifiers: { middle: true },
+ ctx
+ });
+
+ // Should map to mouseup event
+ const event = new Event("mouseup");
+ el.dispatchEvent(event);
+ expect(handler).toHaveBeenCalled();
+ });
+
+ it("should return early when no arg provided", () => {
+ const el = document.createElement("div");
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {});
+
+ on({
+ el,
+ get: () => {},
+ effect: rawEffect,
+ exp: "handler",
+ arg: undefined,
+ modifiers: undefined,
+ ctx
+ });
+
+ expect(consoleSpy).toHaveBeenCalledWith(
+ "v-on=\"obj\" syntax is not supported in pocket-vue."
+ );
+ consoleSpy.mockRestore();
+ });
+
+ it("should warn about deprecated mounted/unmounted hooks", () => {
+ const el = document.createElement("div");
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {});
+
+ on({
+ el,
+ get: () => {},
+ effect: rawEffect,
+ exp: "handler",
+ arg: "mounted",
+ modifiers: undefined,
+ ctx
+ });
+
+ expect(consoleSpy).toHaveBeenCalledWith(
+ "mounted and unmounted hooks now need to be prefixed with vue: " +
+ "- use @vue:mounted=\"handler\" instead."
+ );
+
+ on({
+ el,
+ get: () => {},
+ effect: rawEffect,
+ exp: "handler",
+ arg: "unmounted",
+ modifiers: undefined,
+ ctx
+ });
+
+ expect(consoleSpy).toHaveBeenCalledWith(
+ "mounted and unmounted hooks now need to be prefixed with vue: " +
+ "- use @vue:unmounted=\"handler\" instead."
+ );
+
+ consoleSpy.mockRestore();
+ });
+
+ it('should warn when v-on has no event type in DEV', () => {
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
+ const originalDEV = (globalThis as any).import?.meta?.env?.DEV;
+ ;(globalThis as any).import = { meta: { env: { DEV: true } } };
+
+ const el = document.createElement('div');
+ const ctx = createContext();
+
+ on({
+ el,
+ get: () => () => {},
+ effect: rawEffect,
+ exp: 'handler',
+ arg: undefined, // no event type
+ modifiers: undefined,
+ ctx
+ });
+
+ expect(consoleSpy).toHaveBeenCalledWith(
+ 'v-on="obj" syntax is not supported in pocket-vue.'
+ );
+
+ consoleSpy.mockRestore();
+ if (originalDEV !== undefined) {
+ ;(globalThis as any).import.meta.env.DEV = originalDEV;
+ } else {
+ delete (globalThis as any).import;
+ }
+ });
+});
\ No newline at end of file
diff --git a/__tests__/scheduler.test.ts b/__tests__/scheduler.test.ts
new file mode 100644
index 0000000..9e6cdbd
--- /dev/null
+++ b/__tests__/scheduler.test.ts
@@ -0,0 +1,165 @@
+import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
+import { nextTick, queueJob } from '../src/scheduler'
+
+describe('scheduler', () => {
+ beforeEach(() => {
+ vi.useFakeTimers()
+ })
+
+ afterEach(() => {
+ vi.useRealTimers()
+ })
+
+ describe('nextTick', () => {
+ it('should execute callback in next microtask', async () => {
+ const fn = vi.fn()
+ nextTick(fn)
+
+ expect(fn).not.toHaveBeenCalled()
+ await vi.runAllTimers()
+ expect(fn).toHaveBeenCalled()
+ })
+
+ it('should return promise that resolves in next microtask', async () => {
+ let resolved = false
+
+ const promise = nextTick(() => {
+ resolved = true
+ })
+
+ expect(resolved).toBe(false)
+ await promise
+ expect(resolved).toBe(true)
+ })
+ })
+
+ describe('queueJob', () => {
+ it('should queue job and execute it', async () => {
+ const job = vi.fn()
+ queueJob(job)
+
+ expect(job).not.toHaveBeenCalled()
+ await vi.runAllTimers()
+ expect(job).toHaveBeenCalled()
+ })
+
+ it('should not queue duplicate jobs', async () => {
+ const job = vi.fn()
+ queueJob(job)
+ queueJob(job)
+
+ await vi.runAllTimers()
+
+ expect(job).toHaveBeenCalledTimes(1)
+ })
+
+ it('should execute jobs in order', async () => {
+ const order: number[] = []
+ const job1 = vi.fn(() => order.push(1))
+ const job2 = vi.fn(() => order.push(2))
+ const job3 = vi.fn(() => order.push(3))
+
+ queueJob(job1)
+ queueJob(job2)
+ queueJob(job3)
+
+ await vi.runAllTimers()
+ expect(order).toEqual([1, 2, 3])
+ })
+
+ it('should handle jobs that queue more jobs', async () => {
+ const job1 = vi.fn()
+ const job2 = vi.fn(() => queueJob(job1))
+
+ queueJob(job2)
+ await vi.runAllTimers()
+
+ expect(job2).toHaveBeenCalled()
+ expect(job1).toHaveBeenCalled()
+ })
+
+ it('should wait for queue to empty when calling nextTick without callback', async () => {
+ const job = vi.fn()
+ queueJob(job)
+
+ // Call nextTick without callback while queue has jobs
+ const promise = nextTick()
+
+ // Flush microtasks to run checkQueue
+ await Promise.resolve()
+
+ // Now run timers to execute flushJobs and checkQueue
+ vi.runAllTimers()
+
+ // flushJobs executes job
+ expect(job).toHaveBeenCalled()
+
+ // Now the promise should resolve
+ await promise
+ })
+
+ it('should resolve nextTick promise after queued jobs', async () => {
+ const job = vi.fn()
+ queueJob(job)
+
+ // Call nextTick without callback
+ const promise = nextTick()
+
+ // The promise should resolve after the queued job runs
+ await promise
+
+ expect(job).toHaveBeenCalled()
+ })
+
+ it('should handle rapid queueJob calls efficiently', async () => {
+ const job1 = vi.fn()
+ const job2 = vi.fn()
+ const job3 = vi.fn()
+
+ // Queue multiple jobs rapidly
+ queueJob(job1)
+ queueJob(job2)
+ queueJob(job3)
+
+ // All jobs should be queued and executed
+ await vi.runAllTimers()
+
+ expect(job1).toHaveBeenCalled();
+ expect(job2).toHaveBeenCalled();
+ expect(job3).toHaveBeenCalled();
+ });
+
+ it('should execute callback in next microtask via nextTick', async () => {
+ const callback = vi.fn();
+ nextTick(callback);
+
+ expect(callback).not.toHaveBeenCalled();
+
+ // Wait for microtask to execute
+ await Promise.resolve();
+ await vi.runAllTimers();
+
+ expect(callback).toHaveBeenCalled();
+ });
+
+ it('should handle undefined callback in nextTick', async () => {
+ // Should not throw when no callback provided
+ expect(() => nextTick()).not.toThrow();
+
+ // Wait for microtask
+ await Promise.resolve();
+ });
+
+ it('should execute multiple independent nextTick callbacks', async () => {
+ const order: number[] = [];
+
+ nextTick(() => order.push(1));
+ nextTick(() => order.push(2));
+ nextTick(() => order.push(3));
+
+ await vi.runAllTimers();
+ expect(order).toEqual([1, 2, 3]);
+ });
+
+ })
+})
\ No newline at end of file
diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts
new file mode 100644
index 0000000..a200a87
--- /dev/null
+++ b/__tests__/utils.test.ts
@@ -0,0 +1,51 @@
+import { describe, it, expect, beforeEach, vi } from 'vitest'
+import { checkAttr, listen } from '../src/utils'
+
+describe('utils', () => {
+ let el: HTMLElement
+
+ beforeEach(() => {
+ el = document.createElement('div')
+ })
+
+ describe('checkAttr', () => {
+ it('should return attribute value and remove it', () => {
+ el.setAttribute('test-attr', 'test-value')
+ const value = checkAttr(el, 'test-attr')
+
+ expect(value).toBe('test-value')
+ expect(el.hasAttribute('test-attr')).toBe(false)
+ })
+
+ it('should return null if attribute does not exist', () => {
+ const value = checkAttr(el, 'non-existent')
+ expect(value).toBeNull()
+ })
+
+ it('should return null if attribute value is null', () => {
+ el.setAttribute('test-attr', 'null')
+ const value = checkAttr(el, 'test-attr')
+ expect(value).toBe('null')
+ })
+ })
+
+ describe('listen', () => {
+ it('should add event listener to element', () => {
+ const handler = vi.fn()
+ listen(el, 'click', handler)
+
+ el.click()
+ expect(handler).toHaveBeenCalled()
+ })
+
+ it('should pass options to addEventListener', () => {
+ const handler = vi.fn()
+ const options = { once: true }
+ const spy = vi.spyOn(el, 'addEventListener')
+
+ listen(el, 'click', handler, options)
+
+ expect(spy).toHaveBeenCalledWith('click', handler, options)
+ })
+ })
+})
\ No newline at end of file
diff --git a/__tests__/walk.test.ts b/__tests__/walk.test.ts
new file mode 100644
index 0000000..e8b6304
--- /dev/null
+++ b/__tests__/walk.test.ts
@@ -0,0 +1,448 @@
+import { describe, it, expect, beforeEach, vi } from 'vitest'
+import { walk } from '../src/walk'
+import { createContext } from '../src/context'
+import { _if } from '../src/directives/if'
+import { nextTick } from '../src/scheduler'
+
+describe('walk', () => {
+ let container: HTMLElement
+ let ctx: any
+
+ beforeEach(() => {
+ container = document.createElement('div')
+ ctx = createContext()
+ ctx.scope.$refs = Object.create(null)
+ ctx.scope.$s = (value: any) => value == null ? '' : String(value)
+ })
+
+ it('should walk through DOM elements', () => {
+ container.innerHTML = '{{ message }} Click
'
+
+ ctx.scope.message = 'Hello'
+ ctx.scope.handleClick = vi.fn()
+ walk(container, ctx)
+
+ expect(container.innerHTML).toContain('Hello')
+ })
+
+ it('should skip elements with v-pre', () => {
+ container.innerHTML = '{{ message }}
{{ message }}
'
+
+ ctx.scope.message = 'Hello'
+ walk(container, ctx)
+
+ const divs = container.querySelectorAll('div')
+ // First div should not be processed (still has {{ message }})
+ expect(divs[0].innerHTML).toContain('{{ message }}')
+ // Second div should be processed
+ expect(divs[1].innerHTML).toContain('Hello')
+ })
+
+
+
+ it('should handle v-scope directive', () => {
+ container.innerHTML = '{{ localCount }}
'
+
+ walk(container, ctx)
+
+ expect(container.innerHTML).toContain('0')
+ })
+
+ it('should handle v-if directive', () => {
+ // Test with show = true
+ const container1 = document.createElement('div')
+ container1.innerHTML = 'Visible
'
+ ctx.scope.show = true
+ walk(container1, ctx)
+ expect(container1.innerHTML).toContain('Visible')
+
+ // Test with show = false
+ const container2 = document.createElement('div')
+ container2.innerHTML = 'Visible
'
+ ctx.scope.show = false
+ walk(container2, ctx)
+ expect(container2.innerHTML).not.toContain('Visible')
+ })
+
+ it('should handle v-if with v-else', () => {
+ const container = document.createElement('div')
+ container.innerHTML = 'True
False
'
+ ctx.scope.show = false
+ walk(container, ctx)
+ expect(container.innerHTML).toContain('False')
+ expect(container.innerHTML).not.toContain('True')
+ })
+
+ it('should handle v-if with v-else-if', () => {
+ const container = document.createElement('div')
+ container.innerHTML = 'A
B
C
'
+ ctx.scope.a = false
+ ctx.scope.b = true
+ walk(container, ctx)
+ expect(container.innerHTML).toContain('B')
+ expect(container.innerHTML).not.toContain('A')
+ expect(container.innerHTML).not.toContain('C')
+ })
+
+ it('should warn for empty v-if in DEV', () => {
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { })
+ const originalDEV = (globalThis as any).import?.meta?.env?.DEV
+ ; (globalThis as any).import = { meta: { env: { DEV: true } } }
+
+ const container = document.createElement('div')
+ container.innerHTML = 'Empty
'
+ walk(container, ctx)
+
+ expect(warnSpy).toHaveBeenCalledWith('v-if expression cannot be empty.')
+
+ warnSpy.mockRestore()
+ if (originalDEV !== undefined) {
+ ; (globalThis as any).import.meta.env.DEV = originalDEV
+ } else {
+ delete (globalThis as any).import
+ }
+ })
+
+ it('should handle v-if on element with no parent', () => {
+ const el = document.createElement('div')
+ el.setAttribute('v-if', 'true')
+
+ // _if should return early if no parent
+ const result = _if(el, 'true', ctx)
+ expect(result).toBeUndefined()
+ })
+
+ it('should handle v-for directive', () => {
+ container.innerHTML = ''
+
+ ctx.scope.items = ['Item 1', 'Item 2']
+ walk(container, ctx)
+
+ const items = container.querySelectorAll('li')
+ expect(items.length).toBe(2)
+ expect(items[0]?.textContent).toBe('Item 1')
+ expect(items[1]?.textContent).toBe('Item 2')
+ })
+
+ it('should handle v-for with number', () => {
+ container.innerHTML = ''
+
+ ctx.scope.count = 3
+ walk(container, ctx)
+
+ const items = container.querySelectorAll('li')
+ expect(items.length).toBe(3)
+ expect(items[0]?.textContent).toBe('1')
+ expect(items[1]?.textContent).toBe('2')
+ expect(items[2]?.textContent).toBe('3')
+ })
+
+ it('should handle v-for with object', () => {
+ container.innerHTML = ''
+
+ ctx.scope.obj = { a: 1, b: 2 }
+ walk(container, ctx)
+
+ const items = container.querySelectorAll('li')
+ expect(items.length).toBe(2)
+ // Order may vary, but check content
+ const texts = Array.from(items).map(li => li.textContent)
+ expect(texts).toContain('a: 1')
+ expect(texts).toContain('b: 2')
+ })
+
+ it('should handle v-for with index', () => {
+ container.innerHTML = ''
+
+ ctx.scope.items = ['A', 'B']
+ walk(container, ctx)
+
+ const items = container.querySelectorAll('li')
+ expect(items[0]?.textContent).toBe('0: A')
+ expect(items[1]?.textContent).toBe('1: B')
+ })
+
+ it('should handle v-for with key', () => {
+ container.innerHTML = ''
+
+ ctx.scope.items = [{ id: 1, name: 'First' }, { id: 2, name: 'Second' }]
+ walk(container, ctx)
+
+ const items = container.querySelectorAll('li')
+ expect(items[0]?.textContent).toBe('First')
+ expect(items[1]?.textContent).toBe('Second')
+ })
+
+ it('should handle v-for with destructure', () => {
+ container.innerHTML = ''
+
+ ctx.scope.people = [{ name: 'John', age: 30 }, { name: 'Jane', age: 25 }]
+ walk(container, ctx)
+
+ const items = container.querySelectorAll('li')
+ expect(items[0]?.textContent).toBe('John (30)')
+ expect(items[1]?.textContent).toBe('Jane (25)')
+ })
+
+ it('should warn for invalid v-for in DEV', () => {
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { })
+ const originalDEV = (globalThis as any).import?.meta?.env?.DEV
+ ; (globalThis as any).import = { meta: { env: { DEV: true } } }
+
+ container.innerHTML = ''
+ walk(container, ctx)
+
+ expect(warnSpy).toHaveBeenCalledWith('invalid v-for expression: invalid')
+
+ warnSpy.mockRestore()
+ if (originalDEV !== undefined) {
+ ; (globalThis as any).import.meta.env.DEV = originalDEV
+ } else {
+ delete (globalThis as any).import
+ }
+ })
+
+ it('should handle v-for updates and moves', async () => {
+ container.innerHTML = ''
+
+ ctx.scope.items = ['A', 'B', 'C']
+ walk(container, ctx)
+
+ let items = container.querySelectorAll('li')
+ expect(items.length).toBe(3)
+ expect(Array.from(items).map(li => li.textContent)).toEqual(['A', 'B', 'C'])
+
+ // Update to trigger move and reordering
+ ctx.scope.items = ['C', 'A', 'B']
+ await nextTick()
+
+ items = container.querySelectorAll('li')
+ expect(items.length).toBe(3)
+ expect(Array.from(items).map(li => li.textContent)).toEqual(['C', 'A', 'B'])
+ })
+
+ it('should handle attribute interpolation', () => {
+ container.innerHTML = 'Content
'
+
+ ctx.scope.dynamicId = 'test-id'
+ ctx.scope.dynamicClass = 'test-class'
+ walk(container, ctx)
+
+ const div = container.querySelector('div')
+ expect(div?.getAttribute('id')).toBe('test-id')
+ expect(div?.getAttribute('class')).toBe('test-class')
+ })
+
+ it('should handle text interpolation', () => {
+ container.innerHTML = '{{ message }}
'
+
+ ctx.scope.message = 'Hello World'
+ walk(container, ctx)
+
+ const div = container.querySelector('div')
+ expect(div?.textContent).toBe('Hello World')
+ })
+
+ it('should handle event handlers', () => {
+ container.innerHTML = 'Click '
+
+ const handleClick = vi.fn()
+ ctx.scope.handleClick = handleClick
+ walk(container, ctx)
+
+ const button = container.querySelector('button')
+ button?.click()
+
+ expect(handleClick).toHaveBeenCalled()
+ })
+
+ it('should handle nested directives', () => {
+ container.innerHTML = ''
+
+ ctx.scope.show = true
+ walk(container, ctx)
+
+ expect(container.innerHTML).toContain('0')
+ })
+
+ it('should handle multiple directives on same element', () => {
+ container.innerHTML = 'Content
'
+
+ ctx.scope.isVisible = true
+ ctx.scope.dynamicClass = 'active'
+ walk(container, ctx)
+
+ const div = container.querySelector('div')
+ expect(div?.style.display).not.toBe('none')
+ expect(div?.getAttribute('class')).toBe('active')
+ })
+
+ it('should handle custom delimiters', () => {
+ container.innerHTML = '${ message }
'
+
+ ctx.scope.message = 'Hello'
+ ctx.delimiters = ['${', '}']
+ ctx.delimitersRE = /\$\{([^]+?)\}/g
+
+ walk(container, ctx)
+
+ const div = container.querySelector('div')
+ expect(div?.textContent).toBe('Hello')
+ })
+
+
+
+ it('should handle unknown custom directive in DEV', () => {
+ const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { })
+ const originalDEV = (globalThis as any).import?.meta?.env?.DEV
+ ; (globalThis as any).import = { meta: { env: { DEV: true } } }
+
+ container.innerHTML = '
'
+ walk(container, ctx)
+
+ expect(errorSpy).toHaveBeenCalledWith('unknown custom directive v-unknown.')
+
+ errorSpy.mockRestore()
+ if (originalDEV !== undefined) {
+ ; (globalThis as any).import.meta.env.DEV = originalDEV
+ } else {
+ delete (globalThis as any).import
+ }
+ })
+
+ it('should handle v-scope with $template selector', () => {
+ // Create a template element
+ const template = document.createElement('template')
+ template.id = 'my-template'
+ template.innerHTML = 'Template content '
+ document.body.appendChild(template)
+
+ container.innerHTML = "
"
+ walk(container, ctx)
+
+ const div = container.querySelector('div')
+ expect(div?.innerHTML).toContain('Template content')
+
+ document.body.removeChild(template)
+ })
+
+ it('should handle v-scope with $template string', () => {
+ container.innerHTML = "String template' }\">
"
+ walk(container, ctx)
+
+ const div = container.querySelector('div')
+ expect(div?.innerHTML).toContain('String template')
+ })
+
+ it('should handle v-once directive', async () => {
+ container.innerHTML = '{{ message }}
'
+
+ ctx.scope.message = 'Initial value'
+ walk(container, ctx)
+
+ // Wait for the initial effect to run
+ await nextTick()
+
+ // v-once should interpolate once with current data
+ const span = container.querySelector('span')
+ expect(span?.textContent).toBe('Initial value')
+
+ // The v-once attribute should be removed after processing
+ const div = container.querySelector('div')
+ expect(div?.hasAttribute('v-once')).toBe(false)
+
+ // Even after changing the scope data and triggering reactivity, v-once content should not update
+ ctx.scope.message = 'Updated value'
+ await nextTick()
+ // Since the v-once element has been processed and is not reactive,
+ // the span should still contain the initial value
+ expect(span?.textContent).toBe('Initial value')
+ })
+
+ it('should handle ref directive inside v-scope', () => {
+ container.innerHTML = 'Content
'
+
+ walk(container, ctx)
+
+ // The ref should be registered in both parent and scoped contexts
+ const scopedDiv = container.querySelector('div[ref]')
+ expect(scopedDiv).toBeDefined()
+ })
+
+ it('should register ref in both parent and scoped context when used with v-scope', () => {
+ container.innerHTML = 'Scoped Content
'
+
+ ctx.scope.$refs = {}
+ walk(container, ctx)
+
+ // The ref should be registered
+ expect(ctx.scope.$refs.scopedRef).toBeDefined()
+ const div = container.querySelector('div')
+ expect(div).toBeDefined()
+ expect(ctx.scope.$refs.scopedRef).toBe(div)
+ })
+
+ it('should handle v-scope with empty expression', () => {
+ container.innerHTML = '{{ $root.tagName }}
'
+
+ walk(container, ctx)
+
+ const span = container.querySelector('span')
+ expect(span?.textContent).toBe('DIV')
+ })
+
+ it('should handle directive cleanup functions', () => {
+ // Create a mock directive that returns a cleanup function
+ const mockDirective = vi.fn(() => {
+ return () => { } // cleanup function
+ })
+
+ ctx.dirs = { 'test-dir': mockDirective }
+
+ container.innerHTML = '
'
+
+ walk(container, ctx)
+
+ expect(mockDirective).toHaveBeenCalled()
+ })
+
+ it('should handle :ref shorthand', () => {
+ container.innerHTML = '
'
+
+ walk(container, ctx)
+
+ // :ref should be handled as ref directive
+ const div = container.querySelector('div')
+ expect(div).toBeDefined()
+ })
+
+ it('should process DocumentFragment nodes', () => {
+ const fragment = document.createDocumentFragment()
+ const div = document.createElement('div')
+ div.textContent = '{{ message }}'
+ fragment.appendChild(div)
+
+ ctx.scope.message = 'Fragment content'
+ walk(fragment, ctx)
+
+ expect(div.textContent).toBe('Fragment content')
+ })
+
+ it('should warn for invalid template selector in DEV', () => {
+ const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { })
+ const originalDEV = (globalThis as any).import?.meta?.env?.DEV
+ ; (globalThis as any).import = { meta: { env: { DEV: true } } }
+
+ container.innerHTML = "
"
+ walk(container, ctx)
+
+ expect(errorSpy).toHaveBeenCalled()
+
+ errorSpy.mockRestore()
+ if (originalDEV !== undefined) {
+ ; (globalThis as any).import.meta.env.DEV = originalDEV
+ } else {
+ delete (globalThis as any).import
+ }
+ })
+})
\ No newline at end of file
diff --git a/coverage.txt b/coverage.txt
new file mode 100644
index 0000000..e5121c7
--- /dev/null
+++ b/coverage.txt
@@ -0,0 +1,54 @@
+
+> pocket-vue@1.1.2 test:coverage /home/rush/Projects/pocket-vue
+> vitest run --coverage -- --reporter\=lcov
+
+
+[1m[46m RUN [49m[22m [36mv4.0.2 [39m[90m/home/rush/Projects/pocket-vue[39m
+ [2mCoverage enabled with [22m[33mv8[39m
+
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/index.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 273[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/directives.test.ts [2m([22m[2m79 tests[22m[2m)[22m[32m 197[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/walk.test.ts [2m([22m[2m31 tests[22m[2m)[22m[32m 41[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/coverage.test.ts [2m([22m[2m14 tests[22m[2m)[22m[33m 969[2mms[22m[39m
+ [33m[2m✓[22m[39m should handle very large datasets [33m 906[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/app.test.ts [2m([22m[2m25 tests[22m[2m)[22m[32m 33[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/on-directive.test.ts [2m([22m[2m21 tests[22m[2m)[22m[32m 18[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/integration.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/scheduler.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 27[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/block.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 15[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/eval.test.ts [2m([22m[2m27 tests[22m[2m)[22m[32m 19[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/context.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 9[2mms[22m[39m
+ [32m✓[39m [30m[43m chromium [49m[39m __tests__/utils.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
+
+[2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
+[2m Tests [22m [1m[32m252 passed[39m[22m[90m (252)[39m
+[2m Start at [22m 14:16:26
+[2m Duration [22m 7.76s[2m (transform 0ms, setup 222ms, collect 2.57s, tests 1.62s, environment 0ms, prepare 46.98s)[22m
+
+[34m % [39m[2mCoverage report from [22m[33mv8[39m
+----------------|---------|----------|---------|---------|-------------------
+File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
+----------------|---------|----------|---------|---------|-------------------
+All files | 99.22 | 96.18 | 100 | 99.5 |
+ src | 98.84 | 96.83 | 100 | 99.2 |
+ app.ts | 100 | 100 | 100 | 100 |
+ block.ts | 100 | 100 | 100 | 100 |
+ context.ts | 100 | 100 | 100 | 100 |
+ eval.ts | 100 | 100 | 100 | 100 |
+ index.ts | 100 | 100 | 100 | 100 |
+ scheduler.ts | 95.83 | 90 | 100 | 95.65 | 16
+ utils.ts | 100 | 100 | 100 | 100 |
+ walk.ts | 97.93 | 95.06 | 100 | 98.93 | 60
+ src/directives | 99.47 | 95.78 | 100 | 99.72 |
+ bind.ts | 98.3 | 95.16 | 100 | 98.24 | 40
+ effect.ts | 100 | 100 | 100 | 100 |
+ for.ts | 99 | 96.22 | 100 | 100 | 49,92
+ html.ts | 100 | 100 | 100 | 100 |
+ if.ts | 100 | 95 | 100 | 100 | 63
+ index.ts | 100 | 100 | 100 | 100 |
+ model.ts | 100 | 94.2 | 100 | 100 | 62,91,129,156
+ on.ts | 100 | 97.43 | 100 | 100 | 34
+ ref.ts | 100 | 100 | 100 | 100 |
+ show.ts | 100 | 100 | 100 | 100 |
+ text.ts | 100 | 100 | 100 | 100 |
+----------------|---------|----------|---------|---------|-------------------
diff --git a/coverage/base.css b/coverage/base.css
new file mode 100644
index 0000000..f418035
--- /dev/null
+++ b/coverage/base.css
@@ -0,0 +1,224 @@
+body, html {
+ margin:0; padding: 0;
+ height: 100%;
+}
+body {
+ font-family: Helvetica Neue, Helvetica, Arial;
+ font-size: 14px;
+ color:#333;
+}
+.small { font-size: 12px; }
+*, *:after, *:before {
+ -webkit-box-sizing:border-box;
+ -moz-box-sizing:border-box;
+ box-sizing:border-box;
+ }
+h1 { font-size: 20px; margin: 0;}
+h2 { font-size: 14px; }
+pre {
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ margin: 0;
+ padding: 0;
+ -moz-tab-size: 2;
+ -o-tab-size: 2;
+ tab-size: 2;
+}
+a { color:#0074D9; text-decoration:none; }
+a:hover { text-decoration:underline; }
+.strong { font-weight: bold; }
+.space-top1 { padding: 10px 0 0 0; }
+.pad2y { padding: 20px 0; }
+.pad1y { padding: 10px 0; }
+.pad2x { padding: 0 20px; }
+.pad2 { padding: 20px; }
+.pad1 { padding: 10px; }
+.space-left2 { padding-left:55px; }
+.space-right2 { padding-right:20px; }
+.center { text-align:center; }
+.clearfix { display:block; }
+.clearfix:after {
+ content:'';
+ display:block;
+ height:0;
+ clear:both;
+ visibility:hidden;
+ }
+.fl { float: left; }
+@media only screen and (max-width:640px) {
+ .col3 { width:100%; max-width:100%; }
+ .hide-mobile { display:none!important; }
+}
+
+.quiet {
+ color: #7f7f7f;
+ color: rgba(0,0,0,0.5);
+}
+.quiet a { opacity: 0.7; }
+
+.fraction {
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+ font-size: 10px;
+ color: #555;
+ background: #E8E8E8;
+ padding: 4px 5px;
+ border-radius: 3px;
+ vertical-align: middle;
+}
+
+div.path a:link, div.path a:visited { color: #333; }
+table.coverage {
+ border-collapse: collapse;
+ margin: 10px 0 0 0;
+ padding: 0;
+}
+
+table.coverage td {
+ margin: 0;
+ padding: 0;
+ vertical-align: top;
+}
+table.coverage td.line-count {
+ text-align: right;
+ padding: 0 5px 0 20px;
+}
+table.coverage td.line-coverage {
+ text-align: right;
+ padding-right: 10px;
+ min-width:20px;
+}
+
+table.coverage td span.cline-any {
+ display: inline-block;
+ padding: 0 5px;
+ width: 100%;
+}
+.missing-if-branch {
+ display: inline-block;
+ margin-right: 5px;
+ border-radius: 3px;
+ position: relative;
+ padding: 0 4px;
+ background: #333;
+ color: yellow;
+}
+
+.skip-if-branch {
+ display: none;
+ margin-right: 10px;
+ position: relative;
+ padding: 0 4px;
+ background: #ccc;
+ color: white;
+}
+.missing-if-branch .typ, .skip-if-branch .typ {
+ color: inherit !important;
+}
+.coverage-summary {
+ border-collapse: collapse;
+ width: 100%;
+}
+.coverage-summary tr { border-bottom: 1px solid #bbb; }
+.keyline-all { border: 1px solid #ddd; }
+.coverage-summary td, .coverage-summary th { padding: 10px; }
+.coverage-summary tbody { border: 1px solid #bbb; }
+.coverage-summary td { border-right: 1px solid #bbb; }
+.coverage-summary td:last-child { border-right: none; }
+.coverage-summary th {
+ text-align: left;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.coverage-summary th.file { border-right: none !important; }
+.coverage-summary th.pct { }
+.coverage-summary th.pic,
+.coverage-summary th.abs,
+.coverage-summary td.pct,
+.coverage-summary td.abs { text-align: right; }
+.coverage-summary td.file { white-space: nowrap; }
+.coverage-summary td.pic { min-width: 120px !important; }
+.coverage-summary tfoot td { }
+
+.coverage-summary .sorter {
+ height: 10px;
+ width: 7px;
+ display: inline-block;
+ margin-left: 0.5em;
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
+}
+.coverage-summary .sorted .sorter {
+ background-position: 0 -20px;
+}
+.coverage-summary .sorted-desc .sorter {
+ background-position: 0 -10px;
+}
+.status-line { height: 10px; }
+/* yellow */
+.cbranch-no { background: yellow !important; color: #111; }
+/* dark red */
+.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
+.low .chart { border:1px solid #C21F39 }
+.highlighted,
+.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
+ background: #C21F39 !important;
+}
+/* medium red */
+.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
+/* light red */
+.low, .cline-no { background:#FCE1E5 }
+/* light green */
+.high, .cline-yes { background:rgb(230,245,208) }
+/* medium green */
+.cstat-yes { background:rgb(161,215,106) }
+/* dark green */
+.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
+.high .chart { border:1px solid rgb(77,146,33) }
+/* dark yellow (gold) */
+.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
+.medium .chart { border:1px solid #f9cd0b; }
+/* light yellow */
+.medium { background: #fff4c2; }
+
+.cstat-skip { background: #ddd; color: #111; }
+.fstat-skip { background: #ddd; color: #111 !important; }
+.cbranch-skip { background: #ddd !important; color: #111; }
+
+span.cline-neutral { background: #eaeaea; }
+
+.coverage-summary td.empty {
+ opacity: .5;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ line-height: 1;
+ color: #888;
+}
+
+.cover-fill, .cover-empty {
+ display:inline-block;
+ height: 12px;
+}
+.chart {
+ line-height: 0;
+}
+.cover-empty {
+ background: white;
+}
+.cover-full {
+ border-right: none !important;
+}
+pre.prettyprint {
+ border: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.com { color: #999 !important; }
+.ignore-none { color: #999; font-weight: normal; }
+
+.wrapper {
+ min-height: 100%;
+ height: auto !important;
+ height: 100%;
+ margin: 0 auto -48px;
+}
+.footer, .push {
+ height: 48px;
+}
diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js
new file mode 100644
index 0000000..530d1ed
--- /dev/null
+++ b/coverage/block-navigation.js
@@ -0,0 +1,87 @@
+/* eslint-disable */
+var jumpToCode = (function init() {
+ // Classes of code we would like to highlight in the file view
+ var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
+
+ // Elements to highlight in the file listing view
+ var fileListingElements = ['td.pct.low'];
+
+ // We don't want to select elements that are direct descendants of another match
+ var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
+
+ // Selector that finds elements on the page to which we can jump
+ var selector =
+ fileListingElements.join(', ') +
+ ', ' +
+ notSelector +
+ missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
+
+ // The NodeList of matching elements
+ var missingCoverageElements = document.querySelectorAll(selector);
+
+ var currentIndex;
+
+ function toggleClass(index) {
+ missingCoverageElements
+ .item(currentIndex)
+ .classList.remove('highlighted');
+ missingCoverageElements.item(index).classList.add('highlighted');
+ }
+
+ function makeCurrent(index) {
+ toggleClass(index);
+ currentIndex = index;
+ missingCoverageElements.item(index).scrollIntoView({
+ behavior: 'smooth',
+ block: 'center',
+ inline: 'center'
+ });
+ }
+
+ function goToPrevious() {
+ var nextIndex = 0;
+ if (typeof currentIndex !== 'number' || currentIndex === 0) {
+ nextIndex = missingCoverageElements.length - 1;
+ } else if (missingCoverageElements.length > 1) {
+ nextIndex = currentIndex - 1;
+ }
+
+ makeCurrent(nextIndex);
+ }
+
+ function goToNext() {
+ var nextIndex = 0;
+
+ if (
+ typeof currentIndex === 'number' &&
+ currentIndex < missingCoverageElements.length - 1
+ ) {
+ nextIndex = currentIndex + 1;
+ }
+
+ makeCurrent(nextIndex);
+ }
+
+ return function jump(event) {
+ if (
+ document.getElementById('fileSearch') === document.activeElement &&
+ document.activeElement != null
+ ) {
+ // if we're currently focused on the search input, we don't want to navigate
+ return;
+ }
+
+ switch (event.which) {
+ case 78: // n
+ case 74: // j
+ goToNext();
+ break;
+ case 66: // b
+ case 75: // k
+ case 80: // p
+ goToPrevious();
+ break;
+ }
+ };
+})();
+window.addEventListener('keydown', jumpToCode);
diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json
new file mode 100644
index 0000000..dff0943
--- /dev/null
+++ b/coverage/coverage-final.json
@@ -0,0 +1,23 @@
+{"/home/rush/Projects/pocket-vue/src/app.ts": {"path":"/home/rush/Projects/pocket-vue/src/app.ts","statementMap":{"0":{"start":{"line":8,"column":20},"end":{"line":9,"column":null}},"1":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"2":{"start":{"line":11,"column":25},"end":{"line":100,"column":null}},"3":{"start":{"line":13,"column":14},"end":{"line":13,"column":null}},"4":{"start":{"line":14,"column":2},"end":{"line":26,"column":null}},"5":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"6":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"7":{"start":{"line":19,"column":4},"end":{"line":25,"column":null}},"8":{"start":{"line":20,"column":29},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":6},"end":{"line":24,"column":null}},"10":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"11":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"12":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"13":{"start":{"line":35,"column":2},"end":{"line":99,"column":null}},"14":{"start":{"line":37,"column":6},"end":{"line":42,"column":null}},"15":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"16":{"start":{"line":39,"column":8},"end":{"line":39,"column":null}},"17":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"18":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"19":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"20":{"start":{"line":51,"column":6},"end":{"line":59,"column":null}},"21":{"start":{"line":52,"column":25},"end":{"line":52,"column":null}},"22":{"start":{"line":53,"column":8},"end":{"line":53,"column":null}},"23":{"start":{"line":54,"column":8},"end":{"line":58,"column":null}},"24":{"start":{"line":55,"column":10},"end":{"line":56,"column":null}},"25":{"start":{"line":57,"column":10},"end":{"line":57,"column":null}},"26":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"27":{"start":{"line":63,"column":6},"end":{"line":69,"column":null}},"28":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"29":{"start":{"line":66,"column":8},"end":{"line":68,"column":null}},"30":{"start":{"line":67,"column":20},"end":{"line":67,"column":null}},"31":{"start":{"line":70,"column":6},"end":{"line":72,"column":null}},"32":{"start":{"line":71,"column":8},"end":{"line":71,"column":null}},"33":{"start":{"line":74,"column":6},"end":{"line":82,"column":null}},"34":{"start":{"line":79,"column":8},"end":{"line":81,"column":null}},"35":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"36":{"start":{"line":84,"column":37},"end":{"line":84,"column":61}},"37":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"38":{"start":{"line":89,"column":6},"end":{"line":89,"column":null}},"39":{"start":{"line":89,"column":36},"end":{"line":89,"column":52}},"40":{"start":{"line":93,"column":6},"end":{"line":93,"column":null}},"41":{"start":{"line":97,"column":6},"end":{"line":97,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":20},"end":{"line":8,"column":21}},"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"line":9},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":25},"end":{"line":11,"column":26}},"loc":{"start":{"line":11,"column":48},"end":{"line":100,"column":null}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":4},"end":{"line":36,"column":14}},"loc":{"start":{"line":36,"column":45},"end":{"line":43,"column":null}},"line":36},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":4},"end":{"line":45,"column":8}},"loc":{"start":{"line":45,"column":35},"end":{"line":48,"column":null}},"line":45},"4":{"name":"(anonymous_4)","decl":{"start":{"line":50,"column":4},"end":{"line":50,"column":10}},"loc":{"start":{"line":50,"column":40},"end":{"line":86,"column":null}},"line":50},"5":{"name":"(anonymous_5)","decl":{"start":{"line":67,"column":10},"end":{"line":67,"column":11}},"loc":{"start":{"line":67,"column":20},"end":{"line":67,"column":null}},"line":67},"6":{"name":"(anonymous_6)","decl":{"start":{"line":84,"column":29},"end":{"line":84,"column":30}},"loc":{"start":{"line":84,"column":37},"end":{"line":84,"column":61}},"line":84},"7":{"name":"(anonymous_7)","decl":{"start":{"line":88,"column":4},"end":{"line":88,"column":14}},"loc":{"start":{"line":88,"column":14},"end":{"line":90,"column":null}},"line":88},"8":{"name":"(anonymous_8)","decl":{"start":{"line":89,"column":25},"end":{"line":89,"column":26}},"loc":{"start":{"line":89,"column":36},"end":{"line":89,"column":52}},"line":89},"9":{"name":"(anonymous_9)","decl":{"start":{"line":92,"column":8},"end":{"line":92,"column":21}},"loc":{"start":{"line":92,"column":21},"end":{"line":94,"column":null}},"line":92},"10":{"name":"(anonymous_10)","decl":{"start":{"line":96,"column":8},"end":{"line":96,"column":16}},"loc":{"start":{"line":96,"column":16},"end":{"line":98,"column":null}},"line":96}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":14},"1":{"loc":{"start":{"line":19,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":19},"2":{"loc":{"start":{"line":37,"column":6},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":6},"end":{"line":42,"column":null}},{"start":{"line":40,"column":13},"end":{"line":42,"column":null}}],"line":37},"3":{"loc":{"start":{"line":45,"column":21},"end":{"line":45,"column":35}},"type":"default-arg","locations":[{"start":{"line":45,"column":31},"end":{"line":45,"column":35}}],"line":45},"4":{"loc":{"start":{"line":51,"column":6},"end":{"line":59,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":59,"column":null}},{"start":{},"end":{}}],"line":51},"5":{"loc":{"start":{"line":54,"column":8},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":8},"end":{"line":58,"column":null}},{"start":{},"end":{}}],"line":54},"6":{"loc":{"start":{"line":55,"column":10},"end":{"line":56,"column":null}},"type":"binary-expr","locations":[{"start":{"line":55,"column":10},"end":{"line":55,"column":null}},{"start":{"line":56,"column":12},"end":{"line":56,"column":null}}],"line":55},"7":{"loc":{"start":{"line":61,"column":11},"end":{"line":61,"column":null}},"type":"binary-expr","locations":[{"start":{"line":61,"column":11},"end":{"line":61,"column":17}},{"start":{"line":61,"column":17},"end":{"line":61,"column":null}}],"line":61},"8":{"loc":{"start":{"line":63,"column":6},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":6},"end":{"line":69,"column":null}},{"start":{"line":65,"column":13},"end":{"line":69,"column":null}}],"line":63},"9":{"loc":{"start":{"line":70,"column":6},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":6},"end":{"line":72,"column":null}},{"start":{},"end":{}}],"line":70},"10":{"loc":{"start":{"line":74,"column":6},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":74,"column":6},"end":{"line":82,"column":null}},{"start":{},"end":{}}],"line":74},"11":{"loc":{"start":{"line":75,"column":8},"end":{"line":77,"column":null}},"type":"binary-expr","locations":[{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},{"start":{"line":77,"column":8},"end":{"line":77,"column":null}}],"line":75}},"s":{"0":5,"1":2,"2":5,"3":119,"4":119,"5":108,"6":108,"7":108,"8":1,"9":1,"10":119,"11":119,"12":119,"13":119,"14":5,"15":3,"16":3,"17":2,"18":3,"19":3,"20":110,"21":4,"22":4,"23":4,"24":1,"25":1,"26":109,"27":110,"28":1,"29":108,"30":6,"31":109,"32":104,"33":109,"34":2,"35":109,"36":110,"37":109,"38":4,"39":4,"40":8,"41":28},"f":{"0":2,"1":119,"2":5,"3":3,"4":110,"5":6,"6":110,"7":4,"8":4,"9":8,"10":28},"b":{"0":[108,11],"1":[1,107],"2":[3,2],"3":[3],"4":[4,106],"5":[1,3],"6":[1,1],"7":[109,2],"8":[1,108],"9":[104,5],"10":[2,107],"11":[109,109,108]},"meta":{"lastBranch":12,"lastFunction":11,"lastStatement":42,"seen":{"s:8:20:9:Infinity":0,"f:8:20:8:21":0,"s:9:2:9:Infinity":1,"s:11:25:100:Infinity":2,"f:11:25:11:26":1,"s:13:14:13:Infinity":3,"b:14:2:26:Infinity:undefined:undefined:undefined:undefined":0,"s:14:2:26:Infinity":4,"s:15:4:15:Infinity":5,"s:16:4:16:Infinity":6,"b:19:4:25:Infinity:undefined:undefined:undefined:undefined":1,"s:19:4:25:Infinity":7,"s:20:29:20:Infinity":8,"s:21:6:24:Infinity":9,"s:29:2:29:Infinity":10,"s:30:2:30:Infinity":11,"s:31:2:31:Infinity":12,"s:35:2:99:Infinity":13,"f:36:4:36:14":2,"b:37:6:42:Infinity:40:13:42:Infinity":2,"s:37:6:42:Infinity":14,"s:38:8:38:Infinity":15,"s:39:8:39:Infinity":16,"s:41:8:41:Infinity":17,"f:45:4:45:8":3,"b:45:31:45:35":3,"s:46:6:46:Infinity":18,"s:47:6:47:Infinity":19,"f:50:4:50:10":4,"b:51:6:59:Infinity:undefined:undefined:undefined:undefined":4,"s:51:6:59:Infinity":20,"s:52:25:52:Infinity":21,"s:53:8:53:Infinity":22,"b:54:8:58:Infinity:undefined:undefined:undefined:undefined":5,"s:54:8:58:Infinity":23,"s:55:10:56:Infinity":24,"b:55:10:55:Infinity:56:12:56:Infinity":6,"s:57:10:57:Infinity":25,"s:61:6:61:Infinity":26,"b:61:11:61:17:61:17:61:Infinity":7,"b:63:6:69:Infinity:65:13:69:Infinity":8,"s:63:6:69:Infinity":27,"s:64:8:64:Infinity":28,"s:66:8:68:Infinity":29,"f:67:10:67:11":5,"s:67:20:67:Infinity":30,"b:70:6:72:Infinity:undefined:undefined:undefined:undefined":9,"s:70:6:72:Infinity":31,"s:71:8:71:Infinity":32,"b:74:6:82:Infinity:undefined:undefined:undefined:undefined":10,"s:74:6:82:Infinity":33,"b:75:8:75:Infinity:76:8:76:Infinity:77:8:77:Infinity":11,"s:79:8:81:Infinity":34,"s:84:6:84:Infinity":35,"f:84:29:84:30":6,"s:84:37:84:61":36,"s:85:6:85:Infinity":37,"f:88:4:88:14":7,"s:89:6:89:Infinity":38,"f:89:25:89:26":8,"s:89:36:89:52":39,"f:92:8:92:21":9,"s:93:6:93:Infinity":40,"f:96:8:96:16":10,"s:97:6:97:Infinity":41}}}
+,"/home/rush/Projects/pocket-vue/src/block.ts": {"path":"/home/rush/Projects/pocket-vue/src/block.ts","statementMap":{"0":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"1":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"2":{"start":{"line":23,"column":4},"end":{"line":31,"column":null}},"3":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"4":{"start":{"line":25,"column":4},"end":{"line":31,"column":null}},"5":{"start":{"line":26,"column":6},"end":{"line":28,"column":null}},"6":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"7":{"start":{"line":33,"column":4},"end":{"line":40,"column":null}},"8":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"9":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"10":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"11":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"12":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"13":{"start":{"line":46,"column":4},"end":{"line":69,"column":null}},"14":{"start":{"line":47,"column":6},"end":{"line":66,"column":null}},"15":{"start":{"line":49,"column":36},"end":{"line":49,"column":null}},"16":{"start":{"line":50,"column":32},"end":{"line":50,"column":null}},"17":{"start":{"line":51,"column":8},"end":{"line":55,"column":null}},"18":{"start":{"line":52,"column":10},"end":{"line":52,"column":null}},"19":{"start":{"line":53,"column":10},"end":{"line":53,"column":null}},"20":{"start":{"line":53,"column":33},"end":{"line":53,"column":null}},"21":{"start":{"line":54,"column":10},"end":{"line":54,"column":null}},"22":{"start":{"line":57,"column":8},"end":{"line":59,"column":null}},"23":{"start":{"line":57,"column":21},"end":{"line":57,"column":45}},"24":{"start":{"line":58,"column":10},"end":{"line":58,"column":null}},"25":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"26":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"27":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"28":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"29":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"30":{"start":{"line":68,"column":6},"end":{"line":68,"column":null}},"31":{"start":{"line":73,"column":4},"end":{"line":75,"column":null}},"32":{"start":{"line":74,"column":6},"end":{"line":74,"column":null}},"33":{"start":{"line":76,"column":4},"end":{"line":88,"column":null}},"34":{"start":{"line":77,"column":21},"end":{"line":77,"column":null}},"35":{"start":{"line":78,"column":30},"end":{"line":78,"column":null}},"36":{"start":{"line":80,"column":6},"end":{"line":85,"column":null}},"37":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"38":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"39":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"40":{"start":{"line":83,"column":31},"end":{"line":83,"column":null}},"41":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"42":{"start":{"line":87,"column":6},"end":{"line":87,"column":null}},"43":{"start":{"line":89,"column":4},"end":{"line":89,"column":null}},"44":{"start":{"line":98,"column":4},"end":{"line":106,"column":null}},"45":{"start":{"line":99,"column":6},"end":{"line":105,"column":null}},"46":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"47":{"start":{"line":102,"column":8},"end":{"line":104,"column":null}},"48":{"start":{"line":103,"column":10},"end":{"line":103,"column":null}},"49":{"start":{"line":109,"column":4},"end":{"line":117,"column":null}},"50":{"start":{"line":110,"column":6},"end":{"line":116,"column":null}},"51":{"start":{"line":111,"column":8},"end":{"line":111,"column":null}},"52":{"start":{"line":113,"column":8},"end":{"line":115,"column":null}},"53":{"start":{"line":114,"column":10},"end":{"line":114,"column":null}},"54":{"start":{"line":120,"column":4},"end":{"line":128,"column":null}},"55":{"start":{"line":121,"column":6},"end":{"line":127,"column":null}},"56":{"start":{"line":122,"column":8},"end":{"line":122,"column":null}},"57":{"start":{"line":124,"column":8},"end":{"line":126,"column":null}},"58":{"start":{"line":125,"column":10},"end":{"line":125,"column":null}},"59":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"60":{"start":{"line":132,"column":4},"end":{"line":132,"column":null}},"61":{"start":{"line":133,"column":4},"end":{"line":133,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":6},"end":{"line":16,"column":11}},"loc":{"start":{"line":16,"column":11},"end":{"line":18,"column":null}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":14}},"loc":{"start":{"line":20,"column":69},"end":{"line":43,"column":null}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":45,"column":2},"end":{"line":45,"column":9}},"loc":{"start":{"line":45,"column":84},"end":{"line":70,"column":null}},"line":45},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":2},"end":{"line":72,"column":11}},"loc":{"start":{"line":72,"column":11},"end":{"line":90,"column":null}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":96,"column":2},"end":{"line":96,"column":13}},"loc":{"start":{"line":96,"column":13},"end":{"line":134,"column":null}},"line":96},"5":{"name":"(anonymous_5)","decl":{"start":{"line":98,"column":28},"end":{"line":98,"column":29}},"loc":{"start":{"line":98,"column":39},"end":{"line":106,"column":5}},"line":98},"6":{"name":"(anonymous_6)","decl":{"start":{"line":109,"column":29},"end":{"line":109,"column":30}},"loc":{"start":{"line":109,"column":41},"end":{"line":117,"column":5}},"line":109},"7":{"name":"(anonymous_7)","decl":{"start":{"line":120,"column":30},"end":{"line":120,"column":31}},"loc":{"start":{"line":120,"column":43},"end":{"line":128,"column":5}},"line":120}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":11},"end":{"line":17,"column":null}},"type":"binary-expr","locations":[{"start":{"line":17,"column":11},"end":{"line":17,"column":26}},{"start":{"line":17,"column":26},"end":{"line":17,"column":null}}],"line":17},"1":{"loc":{"start":{"line":20,"column":53},"end":{"line":20,"column":69}},"type":"default-arg","locations":[{"start":{"line":20,"column":62},"end":{"line":20,"column":69}}],"line":20},"2":{"loc":{"start":{"line":23,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":31,"column":null}},{"start":{"line":25,"column":4},"end":{"line":31,"column":null}}],"line":23},"3":{"loc":{"start":{"line":25,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":31,"column":null}},{"start":{"line":29,"column":11},"end":{"line":31,"column":null}}],"line":25},"4":{"loc":{"start":{"line":33,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":40,"column":null}},{"start":{"line":35,"column":11},"end":{"line":40,"column":null}}],"line":33},"5":{"loc":{"start":{"line":45,"column":56},"end":{"line":45,"column":84}},"type":"default-arg","locations":[{"start":{"line":45,"column":78},"end":{"line":45,"column":84}}],"line":45},"6":{"loc":{"start":{"line":46,"column":4},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":69,"column":null}},{"start":{"line":67,"column":11},"end":{"line":69,"column":null}}],"line":46},"7":{"loc":{"start":{"line":47,"column":6},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":6},"end":{"line":66,"column":null}},{"start":{"line":60,"column":13},"end":{"line":66,"column":null}}],"line":47},"8":{"loc":{"start":{"line":53,"column":10},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":10},"end":{"line":53,"column":null}},{"start":{},"end":{}}],"line":53},"9":{"loc":{"start":{"line":73,"column":4},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":75,"column":null}},{"start":{},"end":{}}],"line":73},"10":{"loc":{"start":{"line":76,"column":4},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":4},"end":{"line":88,"column":null}},{"start":{"line":86,"column":11},"end":{"line":88,"column":null}}],"line":76},"11":{"loc":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},{"start":{},"end":{}}],"line":83},"12":{"loc":{"start":{"line":102,"column":8},"end":{"line":104,"column":null}},"type":"if","locations":[{"start":{"line":102,"column":8},"end":{"line":104,"column":null}},{"start":{},"end":{}}],"line":102},"13":{"loc":{"start":{"line":113,"column":8},"end":{"line":115,"column":null}},"type":"if","locations":[{"start":{"line":113,"column":8},"end":{"line":115,"column":null}},{"start":{},"end":{}}],"line":113},"14":{"loc":{"start":{"line":124,"column":8},"end":{"line":126,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":8},"end":{"line":126,"column":null}},{"start":{},"end":{}}],"line":124}},"s":{"0":60,"1":10197,"2":10197,"3":112,"4":10085,"5":4,"6":10081,"7":10197,"8":112,"9":10085,"10":10085,"11":10085,"12":10197,"13":10088,"14":4,"15":1,"16":1,"17":1,"18":3,"19":3,"20":1,"21":2,"22":1,"23":1,"24":3,"25":3,"26":3,"27":3,"28":3,"29":3,"30":10084,"31":12,"32":11,"33":12,"34":1,"35":1,"36":1,"37":3,"38":3,"39":3,"40":1,"41":2,"42":11,"43":12,"44":18,"45":1,"46":1,"47":0,"48":0,"49":18,"50":12,"51":12,"52":0,"53":0,"54":18,"55":3,"56":3,"57":0,"58":0,"59":18,"60":18,"61":18},"f":{"0":60,"1":10197,"2":10088,"3":12,"4":18,"5":1,"6":12,"7":3},"b":{"0":[60,60],"1":[10197],"2":[112,10085],"3":[4,10081],"4":[112,10085],"5":[10088],"6":[4,10084],"7":[1,3],"8":[1,2],"9":[11,1],"10":[1,11],"11":[1,2],"12":[0,0],"13":[0,0],"14":[0,0]},"meta":{"lastBranch":15,"lastFunction":8,"lastStatement":62,"seen":{"f:16:6:16:11":0,"s:17:4:17:Infinity":0,"b:17:11:17:26:17:26:17:Infinity":0,"f:20:2:20:14":1,"b:20:62:20:69":1,"s:21:4:21:Infinity":1,"b:23:4:31:Infinity:25:4:31:Infinity":2,"s:23:4:31:Infinity":2,"s:24:6:24:Infinity":3,"b:25:4:31:Infinity:29:11:31:Infinity":3,"s:25:4:31:Infinity":4,"s:26:6:28:Infinity":5,"s:30:6:30:Infinity":6,"b:33:4:40:Infinity:35:11:40:Infinity":4,"s:33:4:40:Infinity":7,"s:34:6:34:Infinity":8,"s:37:6:37:Infinity":9,"s:38:6:38:Infinity":10,"s:39:6:39:Infinity":11,"s:42:4:42:Infinity":12,"f:45:2:45:9":2,"b:45:78:45:84":5,"b:46:4:69:Infinity:67:11:69:Infinity":6,"s:46:4:69:Infinity":13,"b:47:6:66:Infinity:60:13:66:Infinity":7,"s:47:6:66:Infinity":14,"s:49:36:49:Infinity":15,"s:50:32:50:Infinity":16,"s:51:8:55:Infinity":17,"s:52:10:52:Infinity":18,"b:53:10:53:Infinity:undefined:undefined:undefined:undefined":8,"s:53:10:53:Infinity":19,"s:53:33:53:Infinity":20,"s:54:10:54:Infinity":21,"s:57:8:59:Infinity":22,"s:57:21:57:45":23,"s:58:10:58:Infinity":24,"s:61:8:61:Infinity":25,"s:62:8:62:Infinity":26,"s:63:8:63:Infinity":27,"s:64:8:64:Infinity":28,"s:65:8:65:Infinity":29,"s:68:6:68:Infinity":30,"f:72:2:72:11":3,"b:73:4:75:Infinity:undefined:undefined:undefined:undefined":9,"s:73:4:75:Infinity":31,"s:74:6:74:Infinity":32,"b:76:4:88:Infinity:86:11:88:Infinity":10,"s:76:4:88:Infinity":33,"s:77:21:77:Infinity":34,"s:78:30:78:Infinity":35,"s:80:6:85:Infinity":36,"s:81:8:81:Infinity":37,"s:82:8:82:Infinity":38,"b:83:8:83:Infinity:undefined:undefined:undefined:undefined":11,"s:83:8:83:Infinity":39,"s:83:31:83:Infinity":40,"s:84:8:84:Infinity":41,"s:87:6:87:Infinity":42,"s:89:4:89:Infinity":43,"f:96:2:96:13":4,"s:98:4:106:Infinity":44,"f:98:28:98:29":5,"s:99:6:105:Infinity":45,"s:100:8:100:Infinity":46,"b:102:8:104:Infinity:undefined:undefined:undefined:undefined":12,"s:102:8:104:Infinity":47,"s:103:10:103:Infinity":48,"s:109:4:117:Infinity":49,"f:109:29:109:30":6,"s:110:6:116:Infinity":50,"s:111:8:111:Infinity":51,"b:113:8:115:Infinity:undefined:undefined:undefined:undefined":13,"s:113:8:115:Infinity":52,"s:114:10:114:Infinity":53,"s:120:4:128:Infinity":54,"f:120:30:120:31":7,"s:121:6:127:Infinity":55,"s:122:8:122:Infinity":56,"b:124:8:126:Infinity:undefined:undefined:undefined:undefined":14,"s:124:8:126:Infinity":57,"s:125:10:125:Infinity":58,"s:131:4:131:Infinity":59,"s:132:4:132:Infinity":60,"s:133:4:133:Infinity":61}}}
+,"/home/rush/Projects/pocket-vue/src/context.ts": {"path":"/home/rush/Projects/pocket-vue/src/context.ts","statementMap":{"0":{"start":{"line":23,"column":29},"end":{"line":46,"column":null}},"1":{"start":{"line":24,"column":23},"end":{"line":44,"column":null}},"2":{"start":{"line":34,"column":6},"end":{"line":37,"column":null}},"3":{"start":{"line":35,"column":8},"end":{"line":35,"column":null}},"4":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"5":{"start":{"line":38,"column":38},"end":{"line":40,"column":null}},"6":{"start":{"line":39,"column":25},"end":{"line":39,"column":null}},"7":{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},"8":{"start":{"line":42,"column":6},"end":{"line":42,"column":null}},"9":{"start":{"line":45,"column":2},"end":{"line":45,"column":null}},"10":{"start":{"line":48,"column":35},"end":{"line":71,"column":null}},"11":{"start":{"line":49,"column":22},"end":{"line":49,"column":null}},"12":{"start":{"line":50,"column":22},"end":{"line":50,"column":null}},"13":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"14":{"start":{"line":52,"column":2},"end":{"line":52,"column":null}},"15":{"start":{"line":53,"column":24},"end":{"line":64,"column":null}},"16":{"start":{"line":58,"column":8},"end":{"line":60,"column":null}},"17":{"start":{"line":59,"column":10},"end":{"line":59,"column":null}},"18":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"19":{"start":{"line":66,"column":2},"end":{"line":66,"column":null}},"20":{"start":{"line":67,"column":2},"end":{"line":70,"column":null}},"21":{"start":{"line":73,"column":34},"end":{"line":79,"column":null}},"22":{"start":{"line":74,"column":2},"end":{"line":78,"column":null}},"23":{"start":{"line":75,"column":4},"end":{"line":77,"column":null}},"24":{"start":{"line":76,"column":6},"end":{"line":76,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":23,"column":29},"end":{"line":23,"column":30}},"loc":{"start":{"line":23,"column":60},"end":{"line":46,"column":null}},"line":23},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":12},"end":{"line":33,"column":13}},"loc":{"start":{"line":33,"column":20},"end":{"line":43,"column":null}},"line":33},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":19},"end":{"line":39,"column":25}},"loc":{"start":{"line":39,"column":25},"end":{"line":39,"column":null}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":48,"column":35},"end":{"line":48,"column":36}},"loc":{"start":{"line":48,"column":73},"end":{"line":71,"column":null}},"line":48},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":6},"end":{"line":55,"column":10}},"loc":{"start":{"line":55,"column":38},"end":{"line":62,"column":null}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":73,"column":34},"end":{"line":73,"column":35}},"loc":{"start":{"line":73,"column":66},"end":{"line":79,"column":null}},"line":73}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":11},"end":{"line":28,"column":null}},"type":"cond-expr","locations":[{"start":{"line":28,"column":20},"end":{"line":28,"column":35}},{"start":{"line":28,"column":35},"end":{"line":28,"column":null}}],"line":28},"1":{"loc":{"start":{"line":29,"column":10},"end":{"line":29,"column":null}},"type":"cond-expr","locations":[{"start":{"line":29,"column":19},"end":{"line":29,"column":33}},{"start":{"line":29,"column":33},"end":{"line":29,"column":null}}],"line":29},"2":{"loc":{"start":{"line":34,"column":6},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":6},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":34},"3":{"loc":{"start":{"line":48,"column":50},"end":{"line":48,"column":73}},"type":"default-arg","locations":[{"start":{"line":48,"column":57},"end":{"line":48,"column":73}}],"line":48},"4":{"loc":{"start":{"line":58,"column":8},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":8},"end":{"line":60,"column":null}},{"start":{},"end":{}}],"line":58},"5":{"loc":{"start":{"line":58,"column":12},"end":{"line":58,"column":64}},"type":"binary-expr","locations":[{"start":{"line":58,"column":12},"end":{"line":58,"column":42}},{"start":{"line":58,"column":42},"end":{"line":58,"column":64}}],"line":58},"6":{"loc":{"start":{"line":75,"column":4},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":77,"column":null}},{"start":{},"end":{}}],"line":75}},"s":{"0":9,"1":10281,"2":10223,"3":1,"4":1,"5":10222,"6":1087,"7":10222,"8":10222,"9":10281,"10":9,"11":10107,"12":10107,"13":10107,"14":10107,"15":10107,"16":53,"17":1,"18":52,"19":10107,"20":10107,"21":9,"22":10218,"23":20360,"24":14},"f":{"0":10281,"1":10223,"2":1087,"3":10107,"4":53,"5":10218},"b":{"0":[10086,195],"1":[10086,195],"2":[1,10222],"3":[10107],"4":[1,52],"5":[53,48],"6":[14,20346]},"meta":{"lastBranch":7,"lastFunction":6,"lastStatement":25,"seen":{"s:23:29:46:Infinity":0,"f:23:29:23:30":0,"s:24:23:44:Infinity":1,"b:28:20:28:35:28:35:28:Infinity":0,"b:29:19:29:33:29:33:29:Infinity":1,"f:33:12:33:13":1,"b:34:6:37:Infinity:undefined:undefined:undefined:undefined":2,"s:34:6:37:Infinity":2,"s:35:8:35:Infinity":3,"s:36:8:36:Infinity":4,"s:38:38:40:Infinity":5,"f:39:19:39:25":2,"s:39:25:39:Infinity":6,"s:41:6:41:Infinity":7,"s:42:6:42:Infinity":8,"s:45:2:45:Infinity":9,"s:48:35:71:Infinity":10,"f:48:35:48:36":3,"b:48:57:48:73":3,"s:49:22:49:Infinity":11,"s:50:22:50:Infinity":12,"s:51:2:51:Infinity":13,"s:52:2:52:Infinity":14,"s:53:24:64:Infinity":15,"f:55:6:55:10":4,"b:58:8:60:Infinity:undefined:undefined:undefined:undefined":4,"s:58:8:60:Infinity":16,"b:58:12:58:42:58:42:58:64":5,"s:59:10:59:Infinity":17,"s:61:8:61:Infinity":18,"s:66:2:66:Infinity":19,"s:67:2:70:Infinity":20,"s:73:34:79:Infinity":21,"f:73:34:73:35":5,"s:74:2:78:Infinity":22,"b:75:4:77:Infinity:undefined:undefined:undefined:undefined":6,"s:75:4:77:Infinity":23,"s:76:6:76:Infinity":24}}}
+,"/home/rush/Projects/pocket-vue/src/dev.ts": {"path":"/home/rush/Projects/pocket-vue/src/dev.ts","statementMap":{"0":{"start":{"line":10,"column":36},"end":{"line":42,"column":null}},"1":{"start":{"line":11,"column":4},"end":{"line":34,"column":null}},"2":{"start":{"line":12,"column":8},"end":{"line":33,"column":null}},"3":{"start":{"line":17,"column":16},"end":{"line":17,"column":null}},"4":{"start":{"line":24,"column":16},"end":{"line":24,"column":null}},"5":{"start":{"line":31,"column":16},"end":{"line":31,"column":null}},"6":{"start":{"line":37,"column":4},"end":{"line":41,"column":null}},"7":{"start":{"line":48,"column":24},"end":{"line":48,"column":null}},"8":{"start":{"line":53,"column":20},"end":{"line":57,"column":null}},"9":{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},"10":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"11":{"start":{"line":62,"column":21},"end":{"line":66,"column":null}},"12":{"start":{"line":63,"column":4},"end":{"line":65,"column":null}},"13":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"14":{"start":{"line":71,"column":22},"end":{"line":75,"column":null}},"15":{"start":{"line":72,"column":4},"end":{"line":74,"column":null}},"16":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":36},"end":{"line":10,"column":null}},"loc":{"start":{"line":10,"column":36},"end":{"line":42,"column":null}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":18},"end":{"line":16,"column":19}},"loc":{"start":{"line":16,"column":51},"end":{"line":18,"column":null}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":19},"end":{"line":23,"column":20}},"loc":{"start":{"line":23,"column":52},"end":{"line":25,"column":null}},"line":23},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":19},"end":{"line":30,"column":20}},"loc":{"start":{"line":30,"column":52},"end":{"line":32,"column":null}},"line":30},"4":{"name":"(anonymous_4)","decl":{"start":{"line":38,"column":14},"end":{"line":38,"column":20}},"loc":{"start":{"line":38,"column":20},"end":{"line":38,"column":null}},"line":38},"5":{"name":"(anonymous_5)","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":21}},"loc":{"start":{"line":39,"column":21},"end":{"line":39,"column":null}},"line":39},"6":{"name":"(anonymous_6)","decl":{"start":{"line":40,"column":15},"end":{"line":40,"column":21}},"loc":{"start":{"line":40,"column":21},"end":{"line":40,"column":null}},"line":40},"7":{"name":"(anonymous_7)","decl":{"start":{"line":53,"column":20},"end":{"line":53,"column":21}},"loc":{"start":{"line":53,"column":53},"end":{"line":57,"column":null}},"line":53},"8":{"name":"(anonymous_8)","decl":{"start":{"line":62,"column":21},"end":{"line":62,"column":22}},"loc":{"start":{"line":62,"column":54},"end":{"line":66,"column":null}},"line":62},"9":{"name":"(anonymous_9)","decl":{"start":{"line":71,"column":22},"end":{"line":71,"column":23}},"loc":{"start":{"line":71,"column":59},"end":{"line":75,"column":null}},"line":71}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":4},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":4},"end":{"line":34,"column":null}},{"start":{},"end":{}}],"line":11},"1":{"loc":{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":54},"2":{"loc":{"start":{"line":63,"column":4},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":65,"column":null}},{"start":{},"end":{}}],"line":63},"3":{"loc":{"start":{"line":72,"column":4},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":74,"column":null}},{"start":{},"end":{}}],"line":72},"4":{"loc":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"type":"binary-expr","locations":[{"start":{"line":72,"column":8},"end":{"line":72,"column":31}},{"start":{"line":72,"column":31},"end":{"line":72,"column":43}}],"line":72}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0]},"meta":{"lastBranch":5,"lastFunction":10,"lastStatement":17,"seen":{"s:10:36:42:Infinity":0,"f:10:36:10:Infinity":0,"b:11:4:34:Infinity:undefined:undefined:undefined:undefined":0,"s:11:4:34:Infinity":1,"s:12:8:33:Infinity":2,"f:16:18:16:19":1,"s:17:16:17:Infinity":3,"f:23:19:23:20":2,"s:24:16:24:Infinity":4,"f:30:19:30:20":3,"s:31:16:31:Infinity":5,"s:37:4:41:Infinity":6,"f:38:14:38:20":4,"f:39:15:39:21":5,"f:40:15:40:21":6,"s:48:24:48:Infinity":7,"s:53:20:57:Infinity":8,"f:53:20:53:21":7,"b:54:4:56:Infinity:undefined:undefined:undefined:undefined":1,"s:54:4:56:Infinity":9,"s:55:8:55:Infinity":10,"s:62:21:66:Infinity":11,"f:62:21:62:22":8,"b:63:4:65:Infinity:undefined:undefined:undefined:undefined":2,"s:63:4:65:Infinity":12,"s:64:8:64:Infinity":13,"s:71:22:75:Infinity":14,"f:71:22:71:23":9,"b:72:4:74:Infinity:undefined:undefined:undefined:undefined":3,"s:72:4:74:Infinity":15,"b:72:8:72:31:72:31:72:43":4,"s:73:8:73:Infinity":16}}}
+,"/home/rush/Projects/pocket-vue/src/eval.ts": {"path":"/home/rush/Projects/pocket-vue/src/eval.ts","statementMap":{"0":{"start":{"line":1,"column":62},"end":{"line":1,"column":null}},"1":{"start":{"line":4,"column":27},"end":{"line":8,"column":null}},"2":{"start":{"line":10,"column":27},"end":{"line":13,"column":null}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"4":{"start":{"line":11,"column":54},"end":{"line":11,"column":null}},"5":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"6":{"start":{"line":12,"column":45},"end":{"line":12,"column":62}},"7":{"start":{"line":15,"column":24},"end":{"line":31,"column":null}},"8":{"start":{"line":16,"column":2},"end":{"line":21,"column":null}},"9":{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},"10":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"11":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"12":{"start":{"line":23,"column":2},"end":{"line":30,"column":null}},"13":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"14":{"start":{"line":26,"column":4},"end":{"line":28,"column":null}},"15":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"16":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"17":{"start":{"line":33,"column":23},"end":{"line":52,"column":null}},"18":{"start":{"line":34,"column":2},"end":{"line":39,"column":null}},"19":{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},"20":{"start":{"line":36,"column":6},"end":{"line":36,"column":null}},"21":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"22":{"start":{"line":41,"column":13},"end":{"line":41,"column":null}},"23":{"start":{"line":42,"column":2},"end":{"line":51,"column":null}},"24":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"25":{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},"26":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"27":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"28":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"29":{"start":{"line":54,"column":19},"end":{"line":63,"column":null}},"30":{"start":{"line":55,"column":2},"end":{"line":62,"column":null}},"31":{"start":{"line":56,"column":4},"end":{"line":56,"column":null}},"32":{"start":{"line":58,"column":4},"end":{"line":60,"column":null}},"33":{"start":{"line":59,"column":6},"end":{"line":59,"column":null}},"34":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":27},"end":{"line":10,"column":28}},"loc":{"start":{"line":10,"column":53},"end":{"line":13,"column":null}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":34},"end":{"line":12,"column":45}},"loc":{"start":{"line":12,"column":45},"end":{"line":12,"column":62}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":15,"column":24},"end":{"line":15,"column":25}},"loc":{"start":{"line":15,"column":70},"end":{"line":31,"column":null}},"line":15},"3":{"name":"(anonymous_3)","decl":{"start":{"line":33,"column":23},"end":{"line":33,"column":24}},"loc":{"start":{"line":33,"column":63},"end":{"line":52,"column":null}},"line":33},"4":{"name":"(anonymous_4)","decl":{"start":{"line":54,"column":19},"end":{"line":54,"column":20}},"loc":{"start":{"line":54,"column":46},"end":{"line":63,"column":null}},"line":54},"5":{"name":"(anonymous_5)","decl":{"start":{"line":61,"column":11},"end":{"line":61,"column":17}},"loc":{"start":{"line":61,"column":17},"end":{"line":61,"column":null}},"line":61}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},{"start":{},"end":{}}],"line":11},"1":{"loc":{"start":{"line":11,"column":6},"end":{"line":11,"column":54}},"type":"binary-expr","locations":[{"start":{"line":11,"column":6},"end":{"line":11,"column":21}},{"start":{"line":11,"column":21},"end":{"line":11,"column":35}},{"start":{"line":11,"column":35},"end":{"line":11,"column":54}}],"line":11},"2":{"loc":{"start":{"line":16,"column":2},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":16},"3":{"loc":{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},{"start":{},"end":{}}],"line":17},"4":{"loc":{"start":{"line":26,"column":4},"end":{"line":28,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":28,"column":null}},{"start":{},"end":{}}],"line":26},"5":{"loc":{"start":{"line":34,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":34},"6":{"loc":{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":35},"7":{"loc":{"start":{"line":41,"column":13},"end":{"line":41,"column":null}},"type":"binary-expr","locations":[{"start":{"line":41,"column":13},"end":{"line":41,"column":32}},{"start":{"line":41,"column":32},"end":{"line":41,"column":null}}],"line":41},"8":{"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":4},"end":{"line":47,"column":null}},{"start":{},"end":{}}],"line":45},"9":{"loc":{"start":{"line":58,"column":4},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":4},"end":{"line":60,"column":null}},{"start":{},"end":{}}],"line":58}},"s":{"0":10,"1":10,"2":10,"3":10526,"4":2,"5":10524,"6":31566,"7":10,"8":10510,"9":5,"10":5,"11":5,"12":10505,"13":10505,"14":13,"15":13,"16":13,"17":10,"18":16,"19":2,"20":2,"21":2,"22":14,"23":16,"24":16,"25":3,"26":3,"27":3,"28":3,"29":10,"30":9,"31":9,"32":1,"33":1,"34":1},"f":{"0":10526,"1":31566,"2":10510,"3":16,"4":9,"5":1},"b":{"0":[2,10524],"1":[10526,10526,10525],"2":[5,10505],"3":[5,0],"4":[13,0],"5":[2,14],"6":[2,0],"7":[14,9],"8":[3,0],"9":[1,0]},"meta":{"lastBranch":10,"lastFunction":6,"lastStatement":35,"seen":{"s:1:62:1:Infinity":0,"s:4:27:8:Infinity":1,"s:10:27:13:Infinity":2,"f:10:27:10:28":0,"b:11:2:11:Infinity:undefined:undefined:undefined:undefined":0,"s:11:2:11:Infinity":3,"b:11:6:11:21:11:21:11:35:11:35:11:54":1,"s:11:54:11:Infinity":4,"s:12:2:12:Infinity":5,"f:12:34:12:45":1,"s:12:45:12:62":6,"s:15:24:31:Infinity":7,"f:15:24:15:25":2,"b:16:2:21:Infinity:undefined:undefined:undefined:undefined":2,"s:16:2:21:Infinity":8,"b:17:4:19:Infinity:undefined:undefined:undefined:undefined":3,"s:17:4:19:Infinity":9,"s:18:6:18:Infinity":10,"s:20:4:20:Infinity":11,"s:23:2:30:Infinity":12,"s:24:4:24:Infinity":13,"b:26:4:28:Infinity:undefined:undefined:undefined:undefined":4,"s:26:4:28:Infinity":14,"s:27:6:27:Infinity":15,"s:29:4:29:Infinity":16,"s:33:23:52:Infinity":17,"f:33:23:33:24":3,"b:34:2:39:Infinity:undefined:undefined:undefined:undefined":5,"s:34:2:39:Infinity":18,"b:35:4:37:Infinity:undefined:undefined:undefined:undefined":6,"s:35:4:37:Infinity":19,"s:36:6:36:Infinity":20,"s:38:4:38:Infinity":21,"s:41:13:41:Infinity":22,"b:41:13:41:32:41:32:41:Infinity":7,"s:42:2:51:Infinity":23,"s:43:4:43:Infinity":24,"b:45:4:47:Infinity:undefined:undefined:undefined:undefined":8,"s:45:4:47:Infinity":25,"s:46:6:46:Infinity":26,"s:49:4:49:Infinity":27,"s:50:4:50:Infinity":28,"s:54:19:63:Infinity":29,"f:54:19:54:20":4,"s:55:2:62:Infinity":30,"s:56:4:56:Infinity":31,"b:58:4:60:Infinity:undefined:undefined:undefined:undefined":9,"s:58:4:60:Infinity":32,"s:59:6:59:Infinity":33,"s:61:4:61:Infinity":34,"f:61:11:61:17":5}}}
+,"/home/rush/Projects/pocket-vue/src/index.ts": {"path":"/home/rush/Projects/pocket-vue/src/index.ts","statementMap":{"0":{"start":{"line":7,"column":25},"end":{"line":12,"column":null}},"1":{"start":{"line":8,"column":12},"end":{"line":8,"column":null}},"2":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"3":{"start":{"line":10,"column":4},"end":{"line":10,"column":null}},"4":{"start":{"line":14,"column":0},"end":{"line":14,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":25},"end":{"line":7,"column":31}},"loc":{"start":{"line":7,"column":31},"end":{"line":12,"column":null}},"line":7}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},{"start":{},"end":{}}],"line":9}},"s":{"0":2,"1":4,"2":4,"3":1,"4":2},"f":{"0":4},"b":{"0":[1,3]},"meta":{"lastBranch":1,"lastFunction":1,"lastStatement":5,"seen":{"s:7:25:12:Infinity":0,"f:7:25:7:31":0,"s:8:12:8:Infinity":1,"b:9:2:11:Infinity:undefined:undefined:undefined:undefined":0,"s:9:2:11:Infinity":2,"s:10:4:10:Infinity":3,"s:14:0:14:Infinity":4}}}
+,"/home/rush/Projects/pocket-vue/src/metadata.ts": {"path":"/home/rush/Projects/pocket-vue/src/metadata.ts","statementMap":{"0":{"start":{"line":29,"column":31},"end":{"line":29,"column":null}},"1":{"start":{"line":35,"column":19},"end":{"line":35,"column":null}},"2":{"start":{"line":36,"column":4},"end":{"line":39,"column":null}},"3":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"5":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"6":{"start":{"line":51,"column":21},"end":{"line":51,"column":null}},"7":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"8":{"start":{"line":59,"column":4},"end":{"line":59,"column":null}}},"fnMap":{"0":{"name":"getElementMetadata","decl":{"start":{"line":34,"column":16},"end":{"line":34,"column":35}},"loc":{"start":{"line":34,"column":65},"end":{"line":41,"column":null}},"line":34},"1":{"name":"setElementMetadata","decl":{"start":{"line":46,"column":16},"end":{"line":46,"column":null}},"loc":{"start":{"line":50,"column":8},"end":{"line":53,"column":null}},"line":50},"2":{"name":"clearElementMetadata","decl":{"start":{"line":58,"column":16},"end":{"line":58,"column":37}},"loc":{"start":{"line":58,"column":56},"end":{"line":60,"column":null}},"line":58}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":4},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":36}},"s":{"0":9,"1":9,"2":9,"3":4,"4":4,"5":9,"6":0,"7":0,"8":0},"f":{"0":9,"1":0,"2":0},"b":{"0":[4,5]},"meta":{"lastBranch":1,"lastFunction":3,"lastStatement":9,"seen":{"s:29:31:29:Infinity":0,"f:34:16:34:35":0,"s:35:19:35:Infinity":1,"b:36:4:39:Infinity:undefined:undefined:undefined:undefined":0,"s:36:4:39:Infinity":2,"s:37:8:37:Infinity":3,"s:38:8:38:Infinity":4,"s:40:4:40:Infinity":5,"f:46:16:46:Infinity":1,"s:51:21:51:Infinity":6,"s:52:4:52:Infinity":7,"f:58:16:58:37":2,"s:59:4:59:Infinity":8}}}
+,"/home/rush/Projects/pocket-vue/src/scheduler.ts": {"path":"/home/rush/Projects/pocket-vue/src/scheduler.ts","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":26},"end":{"line":2,"column":null}},"2":{"start":{"line":4,"column":24},"end":{"line":10,"column":null}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"4":{"start":{"line":5,"column":28},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":2},"end":{"line":9,"column":null}},"6":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"8":{"start":{"line":12,"column":24},"end":{"line":14,"column":null}},"9":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"10":{"start":{"line":13,"column":30},"end":{"line":13,"column":36}},"11":{"start":{"line":16,"column":18},"end":{"line":22,"column":null}},"12":{"start":{"line":17,"column":2},"end":{"line":19,"column":null}},"13":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"14":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"15":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":24},"end":{"line":4,"column":25}},"loc":{"start":{"line":4,"column":43},"end":{"line":10,"column":null}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":24},"end":{"line":12,"column":25}},"loc":{"start":{"line":12,"column":45},"end":{"line":14,"column":null}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":24},"end":{"line":13,"column":30}},"loc":{"start":{"line":13,"column":30},"end":{"line":13,"column":36}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":16,"column":18},"end":{"line":16,"column":24}},"loc":{"start":{"line":16,"column":24},"end":{"line":22,"column":null}},"line":16}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},{"start":{},"end":{}}],"line":5},"1":{"loc":{"start":{"line":6,"column":2},"end":{"line":9,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":9,"column":null}},{"start":{},"end":{}}],"line":6}},"s":{"0":10,"1":10,"2":10,"3":1101,"4":95,"5":1101,"6":68,"7":68,"8":10,"9":80,"10":80,"11":10,"12":68,"13":95,"14":68,"15":68},"f":{"0":1101,"1":80,"2":80,"3":68},"b":{"0":[95,1006],"1":[68,1033]},"meta":{"lastBranch":2,"lastFunction":4,"lastStatement":16,"seen":{"s:1:13:1:Infinity":0,"s:2:26:2:Infinity":1,"s:4:24:10:Infinity":2,"f:4:24:4:25":0,"b:5:2:5:Infinity:undefined:undefined:undefined:undefined":0,"s:5:2:5:Infinity":3,"s:5:28:5:Infinity":4,"b:6:2:9:Infinity:undefined:undefined:undefined:undefined":1,"s:6:2:9:Infinity":5,"s:7:4:7:Infinity":6,"s:8:4:8:Infinity":7,"s:12:24:14:Infinity":8,"f:12:24:12:25":1,"s:13:2:13:Infinity":9,"f:13:24:13:30":2,"s:13:30:13:36":10,"s:16:18:22:Infinity":11,"f:16:18:16:24":3,"s:17:2:19:Infinity":12,"s:18:4:18:Infinity":13,"s:20:2:20:Infinity":14,"s:21:2:21:Infinity":15}}}
+,"/home/rush/Projects/pocket-vue/src/types.ts": {"path":"/home/rush/Projects/pocket-vue/src/types.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
+,"/home/rush/Projects/pocket-vue/src/utils.ts": {"path":"/home/rush/Projects/pocket-vue/src/utils.ts","statementMap":{"0":{"start":{"line":5,"column":71},"end":{"line":9,"column":null}},"1":{"start":{"line":6,"column":14},"end":{"line":6,"column":null}},"2":{"start":{"line":7,"column":2},"end":{"line":7,"column":null}},"3":{"start":{"line":7,"column":19},"end":{"line":7,"column":null}},"4":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"5":{"start":{"line":15,"column":22},"end":{"line":22,"column":null}},"6":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"7":{"start":{"line":32,"column":34},"end":{"line":50,"column":null}},"8":{"start":{"line":60,"column":24},"end":{"line":102,"column":null}},"9":{"start":{"line":66,"column":4},"end":{"line":68,"column":null}},"10":{"start":{"line":67,"column":6},"end":{"line":67,"column":null}},"11":{"start":{"line":76,"column":4},"end":{"line":84,"column":null}},"12":{"start":{"line":77,"column":6},"end":{"line":77,"column":null}},"13":{"start":{"line":78,"column":6},"end":{"line":78,"column":null}},"14":{"start":{"line":80,"column":6},"end":{"line":82,"column":null}},"15":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"16":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"17":{"start":{"line":92,"column":4},"end":{"line":100,"column":null}},"18":{"start":{"line":93,"column":6},"end":{"line":93,"column":null}},"19":{"start":{"line":94,"column":6},"end":{"line":94,"column":null}},"20":{"start":{"line":96,"column":6},"end":{"line":98,"column":null}},"21":{"start":{"line":97,"column":8},"end":{"line":97,"column":null}},"22":{"start":{"line":99,"column":6},"end":{"line":99,"column":null}},"23":{"start":{"line":111,"column":27},"end":{"line":112,"column":null}},"24":{"start":{"line":112,"column":2},"end":{"line":112,"column":null}},"25":{"start":{"line":117,"column":31},"end":{"line":118,"column":null}},"26":{"start":{"line":118,"column":2},"end":{"line":118,"column":null}},"27":{"start":{"line":123,"column":33},"end":{"line":124,"column":null}},"28":{"start":{"line":124,"column":2},"end":{"line":124,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":71},"end":{"line":5,"column":null}},"loc":{"start":{"line":5,"column":71},"end":{"line":9,"column":null}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":22},"end":{"line":15,"column":null}},"loc":{"start":{"line":20,"column":5},"end":{"line":22,"column":null}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":65,"column":17},"end":{"line":65,"column":18}},"loc":{"start":{"line":65,"column":84},"end":{"line":69,"column":null}},"line":65},"3":{"name":"(anonymous_3)","decl":{"start":{"line":66,"column":34},"end":{"line":66,"column":35}},"loc":{"start":{"line":66,"column":52},"end":{"line":68,"column":5}},"line":66},"4":{"name":"(anonymous_4)","decl":{"start":{"line":75,"column":16},"end":{"line":75,"column":17}},"loc":{"start":{"line":75,"column":86},"end":{"line":85,"column":null}},"line":75},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":14},"end":{"line":91,"column":15}},"loc":{"start":{"line":91,"column":39},"end":{"line":101,"column":null}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":111,"column":27},"end":{"line":111,"column":28}},"loc":{"start":{"line":112,"column":2},"end":{"line":112,"column":null}},"line":112},"7":{"name":"(anonymous_7)","decl":{"start":{"line":117,"column":31},"end":{"line":117,"column":32}},"loc":{"start":{"line":118,"column":2},"end":{"line":118,"column":null}},"line":118},"8":{"name":"(anonymous_8)","decl":{"start":{"line":123,"column":33},"end":{"line":123,"column":34}},"loc":{"start":{"line":124,"column":2},"end":{"line":124,"column":null}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":7,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":7,"column":null}},{"start":{},"end":{}}],"line":7},"1":{"loc":{"start":{"line":67,"column":6},"end":{"line":67,"column":null}},"type":"cond-expr","locations":[{"start":{"line":67,"column":22},"end":{"line":67,"column":52}},{"start":{"line":67,"column":52},"end":{"line":67,"column":null}}],"line":67},"2":{"loc":{"start":{"line":80,"column":6},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":6},"end":{"line":82,"column":null}},{"start":{},"end":{}}],"line":80},"3":{"loc":{"start":{"line":96,"column":6},"end":{"line":98,"column":null}},"type":"if","locations":[{"start":{"line":96,"column":6},"end":{"line":98,"column":null}},{"start":{},"end":{}}],"line":96},"4":{"loc":{"start":{"line":112,"column":2},"end":{"line":112,"column":null}},"type":"binary-expr","locations":[{"start":{"line":112,"column":2},"end":{"line":112,"column":28}},{"start":{"line":112,"column":28},"end":{"line":112,"column":null}}],"line":112},"5":{"loc":{"start":{"line":118,"column":2},"end":{"line":118,"column":null}},"type":"binary-expr","locations":[{"start":{"line":118,"column":2},"end":{"line":118,"column":29}},{"start":{"line":118,"column":29},"end":{"line":118,"column":null}}],"line":118},"6":{"loc":{"start":{"line":124,"column":2},"end":{"line":124,"column":null}},"type":"binary-expr","locations":[{"start":{"line":124,"column":2},"end":{"line":124,"column":31}},{"start":{"line":124,"column":31},"end":{"line":124,"column":null}}],"line":124}},"s":{"0":10,"1":62687,"2":62687,"3":61,"4":62687,"5":10,"6":95,"7":10,"8":10,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":10,"24":0,"25":10,"26":0,"27":10,"28":0},"f":{"0":62687,"1":95,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[61,62626],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]},"meta":{"lastBranch":7,"lastFunction":9,"lastStatement":29,"seen":{"s:5:71:9:Infinity":0,"f:5:71:5:Infinity":0,"s:6:14:6:Infinity":1,"b:7:2:7:Infinity:undefined:undefined:undefined:undefined":0,"s:7:2:7:Infinity":2,"s:7:19:7:Infinity":3,"s:8:2:8:Infinity":4,"s:15:22:22:Infinity":5,"f:15:22:15:Infinity":1,"s:21:2:21:Infinity":6,"s:32:34:50:Infinity":7,"s:60:24:102:Infinity":8,"f:65:17:65:18":2,"s:66:4:68:Infinity":9,"f:66:34:66:35":3,"s:67:6:67:Infinity":10,"b:67:22:67:52:67:52:67:Infinity":1,"f:75:16:75:17":4,"s:76:4:84:Infinity":11,"s:77:6:77:Infinity":12,"s:78:6:78:Infinity":13,"b:80:6:82:Infinity:undefined:undefined:undefined:undefined":2,"s:80:6:82:Infinity":14,"s:81:8:81:Infinity":15,"s:83:6:83:Infinity":16,"f:91:14:91:15":5,"s:92:4:100:Infinity":17,"s:93:6:93:Infinity":18,"s:94:6:94:Infinity":19,"b:96:6:98:Infinity:undefined:undefined:undefined:undefined":3,"s:96:6:98:Infinity":20,"s:97:8:97:Infinity":21,"s:99:6:99:Infinity":22,"s:111:27:112:Infinity":23,"f:111:27:111:28":6,"s:112:2:112:Infinity":24,"b:112:2:112:28:112:28:112:Infinity":4,"s:117:31:118:Infinity":25,"f:117:31:117:32":7,"s:118:2:118:Infinity":26,"b:118:2:118:29:118:29:118:Infinity":5,"s:123:33:124:Infinity":27,"f:123:33:123:34":8,"s:124:2:124:Infinity":28,"b:124:2:124:31:124:31:124:Infinity":6}}}
+,"/home/rush/Projects/pocket-vue/src/walk.ts": {"path":"/home/rush/Projects/pocket-vue/src/walk.ts","statementMap":{"0":{"start":{"line":13,"column":14},"end":{"line":13,"column":null}},"1":{"start":{"line":14,"column":19},"end":{"line":14,"column":null}},"2":{"start":{"line":16,"column":20},"end":{"line":16,"column":null}},"3":{"start":{"line":18,"column":20},"end":{"line":112,"column":null}},"4":{"start":{"line":19,"column":20},"end":{"line":19,"column":null}},"5":{"start":{"line":20,"column":15},"end":{"line":20,"column":null}},"6":{"start":{"line":21,"column":2},"end":{"line":111,"column":null}},"7":{"start":{"line":23,"column":15},"end":{"line":23,"column":null}},"8":{"start":{"line":24,"column":4},"end":{"line":26,"column":null}},"9":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"11":{"start":{"line":33,"column":4},"end":{"line":35,"column":null}},"12":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"13":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"14":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"15":{"start":{"line":43,"column":4},"end":{"line":50,"column":null}},"16":{"start":{"line":44,"column":20},"end":{"line":44,"column":null}},"17":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"18":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"19":{"start":{"line":47,"column":6},"end":{"line":49,"column":null}},"20":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"21":{"start":{"line":53,"column":21},"end":{"line":53,"column":null}},"22":{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},"23":{"start":{"line":55,"column":6},"end":{"line":55,"column":null}},"24":{"start":{"line":59,"column":4},"end":{"line":64,"column":null}},"25":{"start":{"line":60,"column":6},"end":{"line":62,"column":null}},"26":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"27":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"28":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"29":{"start":{"line":70,"column":41},"end":{"line":70,"column":null}},"30":{"start":{"line":71,"column":4},"end":{"line":83,"column":null}},"31":{"start":{"line":72,"column":6},"end":{"line":82,"column":null}},"32":{"start":{"line":73,"column":8},"end":{"line":81,"column":null}},"33":{"start":{"line":76,"column":10},"end":{"line":76,"column":null}},"34":{"start":{"line":77,"column":8},"end":{"line":81,"column":null}},"35":{"start":{"line":78,"column":10},"end":{"line":78,"column":null}},"36":{"start":{"line":80,"column":10},"end":{"line":80,"column":null}},"37":{"start":{"line":84,"column":4},"end":{"line":86,"column":null}},"38":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"39":{"start":{"line":88,"column":4},"end":{"line":90,"column":null}},"40":{"start":{"line":89,"column":6},"end":{"line":89,"column":null}},"41":{"start":{"line":91,"column":2},"end":{"line":111,"column":null}},"42":{"start":{"line":93,"column":18},"end":{"line":93,"column":null}},"43":{"start":{"line":94,"column":4},"end":{"line":108,"column":null}},"44":{"start":{"line":95,"column":31},"end":{"line":95,"column":null}},"45":{"start":{"line":96,"column":22},"end":{"line":96,"column":null}},"46":{"start":{"line":98,"column":6},"end":{"line":103,"column":null}},"47":{"start":{"line":99,"column":24},"end":{"line":99,"column":null}},"48":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"49":{"start":{"line":100,"column":21},"end":{"line":100,"column":null}},"50":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"51":{"start":{"line":102,"column":8},"end":{"line":102,"column":null}},"52":{"start":{"line":104,"column":6},"end":{"line":106,"column":null}},"53":{"start":{"line":105,"column":8},"end":{"line":105,"column":null}},"54":{"start":{"line":107,"column":6},"end":{"line":107,"column":null}},"55":{"start":{"line":109,"column":2},"end":{"line":111,"column":null}},"56":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"57":{"start":{"line":114,"column":21},"end":{"line":119,"column":null}},"58":{"start":{"line":115,"column":14},"end":{"line":115,"column":null}},"59":{"start":{"line":116,"column":2},"end":{"line":118,"column":null}},"60":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"61":{"start":{"line":121,"column":25},"end":{"line":156,"column":null}},"62":{"start":{"line":132,"column":2},"end":{"line":135,"column":null}},"63":{"start":{"line":133,"column":4},"end":{"line":133,"column":null}},"64":{"start":{"line":134,"column":4},"end":{"line":134,"column":null}},"65":{"start":{"line":137,"column":2},"end":{"line":148,"column":null}},"66":{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},"67":{"start":{"line":139,"column":4},"end":{"line":139,"column":null}},"68":{"start":{"line":140,"column":2},"end":{"line":148,"column":null}},"69":{"start":{"line":141,"column":4},"end":{"line":141,"column":null}},"70":{"start":{"line":142,"column":4},"end":{"line":142,"column":null}},"71":{"start":{"line":144,"column":21},"end":{"line":144,"column":null}},"72":{"start":{"line":145,"column":20},"end":{"line":145,"column":null}},"73":{"start":{"line":146,"column":4},"end":{"line":146,"column":null}},"74":{"start":{"line":147,"column":4},"end":{"line":147,"column":null}},"75":{"start":{"line":149,"column":2},"end":{"line":155,"column":null}},"76":{"start":{"line":150,"column":4},"end":{"line":150,"column":null}},"77":{"start":{"line":150,"column":39},"end":{"line":150,"column":null}},"78":{"start":{"line":151,"column":4},"end":{"line":151,"column":null}},"79":{"start":{"line":152,"column":4},"end":{"line":152,"column":null}},"80":{"start":{"line":153,"column":2},"end":{"line":155,"column":null}},"81":{"start":{"line":154,"column":4},"end":{"line":154,"column":null}},"82":{"start":{"line":158,"column":23},"end":{"line":179,"column":null}},"83":{"start":{"line":166,"column":14},"end":{"line":166,"column":null}},"84":{"start":{"line":166,"column":27},"end":{"line":166,"column":null}},"85":{"start":{"line":167,"column":18},"end":{"line":175,"column":null}},"86":{"start":{"line":176,"column":2},"end":{"line":178,"column":null}},"87":{"start":{"line":177,"column":4},"end":{"line":177,"column":null}},"88":{"start":{"line":181,"column":24},"end":{"line":195,"column":null}},"89":{"start":{"line":182,"column":2},"end":{"line":193,"column":null}},"90":{"start":{"line":183,"column":23},"end":{"line":183,"column":null}},"91":{"start":{"line":184,"column":4},"end":{"line":188,"column":null}},"92":{"start":{"line":185,"column":6},"end":{"line":187,"column":null}},"93":{"start":{"line":189,"column":4},"end":{"line":191,"column":null}},"94":{"start":{"line":190,"column":6},"end":{"line":190,"column":null}},"95":{"start":{"line":192,"column":4},"end":{"line":192,"column":null}},"96":{"start":{"line":194,"column":2},"end":{"line":194,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":20},"end":{"line":18,"column":21}},"loc":{"start":{"line":18,"column":75},"end":{"line":112,"column":null}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":114,"column":21},"end":{"line":114,"column":22}},"loc":{"start":{"line":114,"column":73},"end":{"line":119,"column":null}},"line":114},"2":{"name":"(anonymous_2)","decl":{"start":{"line":121,"column":25},"end":{"line":121,"column":null}},"loc":{"start":{"line":126,"column":5},"end":{"line":156,"column":null}},"line":126},"3":{"name":"(anonymous_3)","decl":{"start":{"line":132,"column":32},"end":{"line":132,"column":33}},"loc":{"start":{"line":132,"column":42},"end":{"line":135,"column":3}},"line":132},"4":{"name":"(anonymous_4)","decl":{"start":{"line":158,"column":23},"end":{"line":158,"column":null}},"loc":{"start":{"line":165,"column":5},"end":{"line":179,"column":null}},"line":165},"5":{"name":"(anonymous_5)","decl":{"start":{"line":166,"column":14},"end":{"line":166,"column":15}},"loc":{"start":{"line":166,"column":27},"end":{"line":166,"column":null}},"line":166},"6":{"name":"(anonymous_6)","decl":{"start":{"line":181,"column":24},"end":{"line":181,"column":25}},"loc":{"start":{"line":181,"column":59},"end":{"line":195,"column":null}},"line":181}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":111,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":111,"column":null}},{"start":{"line":91,"column":2},"end":{"line":111,"column":null}}],"line":21},"1":{"loc":{"start":{"line":24,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":4},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":24},"2":{"loc":{"start":{"line":33,"column":4},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":35,"column":null}},{"start":{},"end":{}}],"line":33},"3":{"loc":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":38},"4":{"loc":{"start":{"line":43,"column":4},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":4},"end":{"line":50,"column":null}},{"start":{},"end":{}}],"line":43},"5":{"loc":{"start":{"line":44,"column":20},"end":{"line":44,"column":null}},"type":"cond-expr","locations":[{"start":{"line":44,"column":26},"end":{"line":44,"column":57}},{"start":{"line":44,"column":57},"end":{"line":44,"column":null}}],"line":44},"6":{"loc":{"start":{"line":47,"column":6},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":6},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":47},"7":{"loc":{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":54},"8":{"loc":{"start":{"line":59,"column":4},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":59},"9":{"loc":{"start":{"line":60,"column":6},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":6},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":60},"10":{"loc":{"start":{"line":72,"column":6},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":6},"end":{"line":82,"column":null}},{"start":{},"end":{}}],"line":72},"11":{"loc":{"start":{"line":72,"column":10},"end":{"line":72,"column":50}},"type":"binary-expr","locations":[{"start":{"line":72,"column":10},"end":{"line":72,"column":30}},{"start":{"line":72,"column":30},"end":{"line":72,"column":50}}],"line":72},"12":{"loc":{"start":{"line":73,"column":8},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":81,"column":null}},{"start":{"line":77,"column":8},"end":{"line":81,"column":null}}],"line":73},"13":{"loc":{"start":{"line":77,"column":8},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":77,"column":8},"end":{"line":81,"column":null}},{"start":{"line":79,"column":15},"end":{"line":81,"column":null}}],"line":77},"14":{"loc":{"start":{"line":77,"column":19},"end":{"line":77,"column":60}},"type":"binary-expr","locations":[{"start":{"line":77,"column":19},"end":{"line":77,"column":38}},{"start":{"line":77,"column":38},"end":{"line":77,"column":60}}],"line":77},"15":{"loc":{"start":{"line":88,"column":4},"end":{"line":90,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":90,"column":null}},{"start":{},"end":{}}],"line":88},"16":{"loc":{"start":{"line":91,"column":2},"end":{"line":111,"column":null}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":111,"column":null}},{"start":{"line":109,"column":2},"end":{"line":111,"column":null}}],"line":91},"17":{"loc":{"start":{"line":94,"column":4},"end":{"line":108,"column":null}},"type":"if","locations":[{"start":{"line":94,"column":4},"end":{"line":108,"column":null}},{"start":{},"end":{}}],"line":94},"18":{"loc":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},{"start":{},"end":{}}],"line":100},"19":{"loc":{"start":{"line":104,"column":6},"end":{"line":106,"column":null}},"type":"if","locations":[{"start":{"line":104,"column":6},"end":{"line":106,"column":null}},{"start":{},"end":{}}],"line":104},"20":{"loc":{"start":{"line":109,"column":2},"end":{"line":111,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":2},"end":{"line":111,"column":null}},{"start":{},"end":{}}],"line":109},"21":{"loc":{"start":{"line":117,"column":12},"end":{"line":117,"column":null}},"type":"binary-expr","locations":[{"start":{"line":117,"column":12},"end":{"line":117,"column":32}},{"start":{"line":117,"column":32},"end":{"line":117,"column":null}}],"line":117},"22":{"loc":{"start":{"line":137,"column":2},"end":{"line":148,"column":null}},"type":"if","locations":[{"start":{"line":137,"column":2},"end":{"line":148,"column":null}},{"start":{"line":140,"column":2},"end":{"line":148,"column":null}}],"line":137},"23":{"loc":{"start":{"line":140,"column":2},"end":{"line":148,"column":null}},"type":"if","locations":[{"start":{"line":140,"column":2},"end":{"line":148,"column":null}},{"start":{"line":143,"column":9},"end":{"line":148,"column":null}}],"line":140},"24":{"loc":{"start":{"line":145,"column":20},"end":{"line":145,"column":null}},"type":"cond-expr","locations":[{"start":{"line":145,"column":35},"end":{"line":145,"column":60}},{"start":{"line":145,"column":60},"end":{"line":145,"column":null}}],"line":145},"25":{"loc":{"start":{"line":146,"column":10},"end":{"line":146,"column":null}},"type":"binary-expr","locations":[{"start":{"line":146,"column":10},"end":{"line":146,"column":40}},{"start":{"line":146,"column":40},"end":{"line":146,"column":null}}],"line":146},"26":{"loc":{"start":{"line":147,"column":10},"end":{"line":147,"column":null}},"type":"cond-expr","locations":[{"start":{"line":147,"column":25},"end":{"line":147,"column":51}},{"start":{"line":147,"column":51},"end":{"line":147,"column":null}}],"line":147},"27":{"loc":{"start":{"line":149,"column":2},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":155,"column":null}},{"start":{"line":153,"column":2},"end":{"line":155,"column":null}}],"line":149},"28":{"loc":{"start":{"line":150,"column":4},"end":{"line":150,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":150,"column":null}},{"start":{},"end":{}}],"line":150},"29":{"loc":{"start":{"line":150,"column":8},"end":{"line":150,"column":39}},"type":"binary-expr","locations":[{"start":{"line":150,"column":8},"end":{"line":150,"column":24}},{"start":{"line":150,"column":24},"end":{"line":150,"column":39}}],"line":150},"30":{"loc":{"start":{"line":153,"column":2},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":153,"column":2},"end":{"line":155,"column":null}},{"start":{},"end":{}}],"line":153},"31":{"loc":{"start":{"line":166,"column":15},"end":{"line":166,"column":27}},"type":"default-arg","locations":[{"start":{"line":166,"column":19},"end":{"line":166,"column":27}}],"line":166},"32":{"loc":{"start":{"line":173,"column":8},"end":{"line":173,"column":null}},"type":"binary-expr","locations":[{"start":{"line":173,"column":8},"end":{"line":173,"column":29}},{"start":{"line":173,"column":29},"end":{"line":173,"column":null}}],"line":173},"33":{"loc":{"start":{"line":174,"column":8},"end":{"line":174,"column":null}},"type":"binary-expr","locations":[{"start":{"line":174,"column":8},"end":{"line":174,"column":21}},{"start":{"line":174,"column":21},"end":{"line":174,"column":null}}],"line":174},"34":{"loc":{"start":{"line":176,"column":2},"end":{"line":178,"column":null}},"type":"if","locations":[{"start":{"line":176,"column":2},"end":{"line":178,"column":null}},{"start":{},"end":{}}],"line":176},"35":{"loc":{"start":{"line":182,"column":2},"end":{"line":193,"column":null}},"type":"if","locations":[{"start":{"line":182,"column":2},"end":{"line":193,"column":null}},{"start":{},"end":{}}],"line":182},"36":{"loc":{"start":{"line":184,"column":4},"end":{"line":188,"column":null}},"type":"if","locations":[{"start":{"line":184,"column":4},"end":{"line":188,"column":null}},{"start":{},"end":{}}],"line":184},"37":{"loc":{"start":{"line":184,"column":8},"end":{"line":184,"column":44}},"type":"binary-expr","locations":[{"start":{"line":184,"column":8},"end":{"line":184,"column":31}},{"start":{"line":184,"column":31},"end":{"line":184,"column":44}}],"line":184},"38":{"loc":{"start":{"line":189,"column":4},"end":{"line":191,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":4},"end":{"line":191,"column":null}},{"start":{},"end":{}}],"line":189}},"s":{"0":9,"1":9,"2":9,"3":9,"4":20779,"5":20779,"6":20779,"7":10466,"8":10466,"9":1,"10":10465,"11":10465,"12":7,"13":10458,"14":28,"15":10430,"16":17,"17":17,"18":17,"19":17,"20":3,"21":10430,"22":10430,"23":1,"24":10430,"25":3,"26":2,"27":3,"28":10430,"29":10430,"30":10430,"31":197,"32":95,"33":27,"34":68,"35":11,"36":57,"37":10430,"38":38,"39":10430,"40":1,"41":10313,"42":10308,"43":10308,"44":10101,"45":10101,"46":10101,"47":10123,"48":10123,"49":57,"50":10123,"51":10123,"52":10101,"53":37,"54":10101,"55":5,"56":5,"57":9,"58":10435,"59":10435,"60":10548,"61":9,"62":95,"63":9,"64":9,"65":95,"66":26,"67":26,"68":69,"69":10,"70":10,"71":59,"72":59,"73":59,"74":59,"75":95,"76":94,"77":1,"78":94,"79":94,"80":1,"81":1,"82":9,"83":10200,"84":10323,"85":10200,"86":10200,"87":11,"88":9,"89":3,"90":2,"91":2,"92":1,"93":2,"94":1,"95":2,"96":1},"f":{"0":20779,"1":10435,"2":95,"3":9,"4":10200,"5":10323,"6":3},"b":{"0":[10466,10313],"1":[1,10465],"2":[7,10458],"3":[28,10430],"4":[17,10413],"5":[7,10],"6":[3,14],"7":[1,10429],"8":[3,10427],"9":[2,1],"10":[95,102],"11":[197,95],"12":[27,68],"13":[11,57],"14":[68,58],"15":[1,10429],"16":[10308,5],"17":[10101,207],"18":[57,10066],"19":[37,10064],"20":[5,0],"21":[10548,10530],"22":[26,69],"23":[10,59],"24":[4,55],"25":[59,2],"26":[4,55],"27":[94,1],"28":[1,93],"29":[94,32],"30":[1,0],"31":[10323],"32":[10200,40],"33":[10200,9],"34":[11,10189],"35":[2,1],"36":[1,1],"37":[2,2],"38":[1,1]},"meta":{"lastBranch":39,"lastFunction":7,"lastStatement":97,"seen":{"s:13:14:13:Infinity":0,"s:14:19:14:Infinity":1,"s:16:20:16:Infinity":2,"s:18:20:112:Infinity":3,"f:18:20:18:21":0,"s:19:20:19:Infinity":4,"s:20:15:20:Infinity":5,"b:21:2:111:Infinity:91:2:111:Infinity":0,"s:21:2:111:Infinity":6,"s:23:15:23:Infinity":7,"b:24:4:26:Infinity:undefined:undefined:undefined:undefined":1,"s:24:4:26:Infinity":8,"s:25:6:25:Infinity":9,"s:28:4:28:Infinity":10,"b:33:4:35:Infinity:undefined:undefined:undefined:undefined":2,"s:33:4:35:Infinity":11,"s:34:6:34:Infinity":12,"b:38:4:40:Infinity:undefined:undefined:undefined:undefined":3,"s:38:4:40:Infinity":13,"s:39:6:39:Infinity":14,"b:43:4:50:Infinity:undefined:undefined:undefined:undefined":4,"s:43:4:50:Infinity":15,"s:44:20:44:Infinity":16,"b:44:26:44:57:44:57:44:Infinity":5,"s:45:6:45:Infinity":17,"s:46:6:46:Infinity":18,"b:47:6:49:Infinity:undefined:undefined:undefined:undefined":6,"s:47:6:49:Infinity":19,"s:48:8:48:Infinity":20,"s:53:21:53:Infinity":21,"b:54:4:56:Infinity:undefined:undefined:undefined:undefined":7,"s:54:4:56:Infinity":22,"s:55:6:55:Infinity":23,"b:59:4:64:Infinity:undefined:undefined:undefined:undefined":8,"s:59:4:64:Infinity":24,"b:60:6:62:Infinity:undefined:undefined:undefined:undefined":9,"s:60:6:62:Infinity":25,"s:61:8:61:Infinity":26,"s:63:6:63:Infinity":27,"s:67:4:67:Infinity":28,"s:70:41:70:Infinity":29,"s:71:4:83:Infinity":30,"b:72:6:82:Infinity:undefined:undefined:undefined:undefined":10,"s:72:6:82:Infinity":31,"b:72:10:72:30:72:30:72:50":11,"b:73:8:81:Infinity:77:8:81:Infinity":12,"s:73:8:81:Infinity":32,"s:76:10:76:Infinity":33,"b:77:8:81:Infinity:79:15:81:Infinity":13,"s:77:8:81:Infinity":34,"b:77:19:77:38:77:38:77:60":14,"s:78:10:78:Infinity":35,"s:80:10:80:Infinity":36,"s:84:4:86:Infinity":37,"s:85:6:85:Infinity":38,"b:88:4:90:Infinity:undefined:undefined:undefined:undefined":15,"s:88:4:90:Infinity":39,"s:89:6:89:Infinity":40,"b:91:2:111:Infinity:109:2:111:Infinity":16,"s:91:2:111:Infinity":41,"s:93:18:93:Infinity":42,"b:94:4:108:Infinity:undefined:undefined:undefined:undefined":17,"s:94:4:108:Infinity":43,"s:95:31:95:Infinity":44,"s:96:22:96:Infinity":45,"s:98:6:103:Infinity":46,"s:99:24:99:Infinity":47,"b:100:8:100:Infinity:undefined:undefined:undefined:undefined":18,"s:100:8:100:Infinity":48,"s:100:21:100:Infinity":49,"s:101:8:101:Infinity":50,"s:102:8:102:Infinity":51,"b:104:6:106:Infinity:undefined:undefined:undefined:undefined":19,"s:104:6:106:Infinity":52,"s:105:8:105:Infinity":53,"s:107:6:107:Infinity":54,"b:109:2:111:Infinity:undefined:undefined:undefined:undefined":20,"s:109:2:111:Infinity":55,"s:110:4:110:Infinity":56,"s:114:21:119:Infinity":57,"f:114:21:114:22":1,"s:115:14:115:Infinity":58,"s:116:2:118:Infinity":59,"s:117:4:117:Infinity":60,"b:117:12:117:32:117:32:117:Infinity":21,"s:121:25:156:Infinity":61,"f:121:25:121:Infinity":2,"s:132:2:135:Infinity":62,"f:132:32:132:33":3,"s:133:4:133:Infinity":63,"s:134:4:134:Infinity":64,"b:137:2:148:Infinity:140:2:148:Infinity":22,"s:137:2:148:Infinity":65,"s:138:4:138:Infinity":66,"s:139:4:139:Infinity":67,"b:140:2:148:Infinity:143:9:148:Infinity":23,"s:140:2:148:Infinity":68,"s:141:4:141:Infinity":69,"s:142:4:142:Infinity":70,"s:144:21:144:Infinity":71,"s:145:20:145:Infinity":72,"b:145:35:145:60:145:60:145:Infinity":24,"s:146:4:146:Infinity":73,"b:146:10:146:40:146:40:146:Infinity":25,"s:147:4:147:Infinity":74,"b:147:25:147:51:147:51:147:Infinity":26,"b:149:2:155:Infinity:153:2:155:Infinity":27,"s:149:2:155:Infinity":75,"b:150:4:150:Infinity:undefined:undefined:undefined:undefined":28,"s:150:4:150:Infinity":76,"b:150:8:150:24:150:24:150:39":29,"s:150:39:150:Infinity":77,"s:151:4:151:Infinity":78,"s:152:4:152:Infinity":79,"b:153:2:155:Infinity:undefined:undefined:undefined:undefined":30,"s:153:2:155:Infinity":80,"s:154:4:154:Infinity":81,"s:158:23:179:Infinity":82,"f:158:23:158:Infinity":4,"s:166:14:166:Infinity":83,"f:166:14:166:15":5,"s:166:27:166:Infinity":84,"b:166:19:166:27":31,"s:167:18:175:Infinity":85,"b:173:8:173:29:173:29:173:Infinity":32,"b:174:8:174:21:174:21:174:Infinity":33,"b:176:2:178:Infinity:undefined:undefined:undefined:undefined":34,"s:176:2:178:Infinity":86,"s:177:4:177:Infinity":87,"s:181:24:195:Infinity":88,"f:181:24:181:25":6,"b:182:2:193:Infinity:undefined:undefined:undefined:undefined":35,"s:182:2:193:Infinity":89,"s:183:23:183:Infinity":90,"b:184:4:188:Infinity:undefined:undefined:undefined:undefined":36,"s:184:4:188:Infinity":91,"b:184:8:184:31:184:31:184:44":37,"s:185:6:187:Infinity":92,"b:189:4:191:Infinity:undefined:undefined:undefined:undefined":38,"s:189:4:191:Infinity":93,"s:190:6:190:Infinity":94,"s:192:4:192:Infinity":95,"s:194:2:194:Infinity":96}}}
+,"/home/rush/Projects/pocket-vue/src/directives/bind.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/bind.ts","statementMap":{"0":{"start":{"line":12,"column":20},"end":{"line":12,"column":null}},"1":{"start":{"line":14,"column":40},"end":{"line":48,"column":null}},"2":{"start":{"line":24,"column":2},"end":{"line":27,"column":null}},"3":{"start":{"line":25,"column":21},"end":{"line":25,"column":null}},"4":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"5":{"start":{"line":29,"column":2},"end":{"line":47,"column":null}},"6":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"7":{"start":{"line":31,"column":4},"end":{"line":45,"column":null}},"8":{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},"9":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"10":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"11":{"start":{"line":37,"column":6},"end":{"line":39,"column":null}},"12":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"13":{"start":{"line":40,"column":6},"end":{"line":44,"column":null}},"14":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"15":{"start":{"line":42,"column":10},"end":{"line":42,"column":null}},"16":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"17":{"start":{"line":50,"column":16},"end":{"line":66,"column":null}},"18":{"start":{"line":57,"column":2},"end":{"line":65,"column":null}},"19":{"start":{"line":58,"column":4},"end":{"line":58,"column":null}},"20":{"start":{"line":59,"column":2},"end":{"line":65,"column":null}},"21":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"22":{"start":{"line":61,"column":2},"end":{"line":65,"column":null}},"23":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"24":{"start":{"line":64,"column":4},"end":{"line":64,"column":null}},"25":{"start":{"line":68,"column":20},"end":{"line":73,"column":null}},"26":{"start":{"line":69,"column":19},"end":{"line":69,"column":null}},"27":{"start":{"line":70,"column":24},"end":{"line":70,"column":null}},"28":{"start":{"line":71,"column":19},"end":{"line":71,"column":null}},"29":{"start":{"line":72,"column":2},"end":{"line":72,"column":null}},"30":{"start":{"line":75,"column":20},"end":{"line":93,"column":null}},"31":{"start":{"line":76,"column":2},"end":{"line":76,"column":null}},"32":{"start":{"line":77,"column":2},"end":{"line":92,"column":null}},"33":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"34":{"start":{"line":79,"column":2},"end":{"line":92,"column":null}},"35":{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},"36":{"start":{"line":80,"column":29},"end":{"line":80,"column":null}},"37":{"start":{"line":82,"column":4},"end":{"line":84,"column":null}},"38":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"39":{"start":{"line":85,"column":4},"end":{"line":91,"column":null}},"40":{"start":{"line":86,"column":6},"end":{"line":90,"column":null}},"41":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"42":{"start":{"line":88,"column":10},"end":{"line":88,"column":null}},"43":{"start":{"line":95,"column":26},"end":{"line":100,"column":null}},"44":{"start":{"line":96,"column":2},"end":{"line":100,"column":null}},"45":{"start":{"line":103,"column":23},"end":{"line":103,"column":null}},"46":{"start":{"line":105,"column":27},"end":{"line":118,"column":null}},"47":{"start":{"line":106,"column":2},"end":{"line":117,"column":null}},"48":{"start":{"line":107,"column":4},"end":{"line":111,"column":null}},"49":{"start":{"line":108,"column":6},"end":{"line":108,"column":null}},"50":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"51":{"start":{"line":113,"column":5},"end":{"line":113,"column":null}},"52":{"start":{"line":114,"column":4},"end":{"line":116,"column":null}},"53":{"start":{"line":115,"column":7},"end":{"line":115,"column":null}},"54":{"start":{"line":120,"column":28},"end":{"line":130,"column":null}},"55":{"start":{"line":121,"column":2},"end":{"line":129,"column":null}},"56":{"start":{"line":122,"column":5},"end":{"line":122,"column":null}},"57":{"start":{"line":123,"column":2},"end":{"line":129,"column":null}},"58":{"start":{"line":124,"column":5},"end":{"line":124,"column":null}},"59":{"start":{"line":125,"column":2},"end":{"line":129,"column":null}},"60":{"start":{"line":126,"column":4},"end":{"line":126,"column":null}},"61":{"start":{"line":128,"column":4},"end":{"line":128,"column":null}},"62":{"start":{"line":132,"column":20},"end":{"line":132,"column":null}},"63":{"start":{"line":135,"column":17},"end":{"line":150,"column":null}},"64":{"start":{"line":136,"column":2},"end":{"line":149,"column":null}},"65":{"start":{"line":137,"column":4},"end":{"line":137,"column":null}},"66":{"start":{"line":137,"column":23},"end":{"line":137,"column":47}},"67":{"start":{"line":138,"column":2},"end":{"line":149,"column":null}},"68":{"start":{"line":139,"column":4},"end":{"line":139,"column":null}},"69":{"start":{"line":140,"column":2},"end":{"line":149,"column":null}},"70":{"start":{"line":142,"column":4},"end":{"line":146,"column":null}},"71":{"start":{"line":148,"column":4},"end":{"line":148,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":40},"end":{"line":14,"column":41}},"loc":{"start":{"line":20,"column":6},"end":{"line":48,"column":null}},"line":20},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":15}},"loc":{"start":{"line":29,"column":15},"end":{"line":47,"column":3}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":50,"column":16},"end":{"line":50,"column":null}},"loc":{"start":{"line":56,"column":5},"end":{"line":66,"column":null}},"line":56},"3":{"name":"(anonymous_3)","decl":{"start":{"line":68,"column":20},"end":{"line":68,"column":21}},"loc":{"start":{"line":68,"column":49},"end":{"line":73,"column":null}},"line":68},"4":{"name":"(anonymous_4)","decl":{"start":{"line":75,"column":20},"end":{"line":75,"column":21}},"loc":{"start":{"line":75,"column":70},"end":{"line":93,"column":null}},"line":75},"5":{"name":"(anonymous_5)","decl":{"start":{"line":95,"column":26},"end":{"line":95,"column":27}},"loc":{"start":{"line":96,"column":2},"end":{"line":100,"column":null}},"line":96},"6":{"name":"(anonymous_6)","decl":{"start":{"line":105,"column":27},"end":{"line":105,"column":28}},"loc":{"start":{"line":105,"column":69},"end":{"line":118,"column":null}},"line":105},"7":{"name":"(anonymous_7)","decl":{"start":{"line":120,"column":28},"end":{"line":120,"column":29}},"loc":{"start":{"line":120,"column":70},"end":{"line":130,"column":null}},"line":120},"8":{"name":"(anonymous_8)","decl":{"start":{"line":135,"column":17},"end":{"line":135,"column":18}},"loc":{"start":{"line":135,"column":87},"end":{"line":150,"column":null}},"line":135},"9":{"name":"(anonymous_9)","decl":{"start":{"line":137,"column":16},"end":{"line":137,"column":17}},"loc":{"start":{"line":137,"column":23},"end":{"line":137,"column":47}},"line":137}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":2},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":27,"column":null}},{"start":{},"end":{}}],"line":24},"1":{"loc":{"start":{"line":31,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":45,"column":null}},{"start":{"line":36,"column":11},"end":{"line":45,"column":null}}],"line":31},"2":{"loc":{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":6},"end":{"line":34,"column":null}},{"start":{},"end":{}}],"line":32},"3":{"loc":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},{"start":{},"end":{}}],"line":41},"4":{"loc":{"start":{"line":41,"column":12},"end":{"line":41,"column":39}},"type":"binary-expr","locations":[{"start":{"line":41,"column":12},"end":{"line":41,"column":22}},{"start":{"line":41,"column":22},"end":{"line":41,"column":39}}],"line":41},"5":{"loc":{"start":{"line":57,"column":2},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":65,"column":null}},{"start":{"line":59,"column":2},"end":{"line":65,"column":null}}],"line":57},"6":{"loc":{"start":{"line":59,"column":2},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":65,"column":null}},{"start":{"line":61,"column":2},"end":{"line":65,"column":null}}],"line":59},"7":{"loc":{"start":{"line":61,"column":2},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":2},"end":{"line":65,"column":null}},{"start":{"line":63,"column":9},"end":{"line":65,"column":null}}],"line":61},"8":{"loc":{"start":{"line":71,"column":19},"end":{"line":71,"column":null}},"type":"binary-expr","locations":[{"start":{"line":71,"column":19},"end":{"line":71,"column":85}},{"start":{"line":71,"column":85},"end":{"line":71,"column":null}}],"line":71},"9":{"loc":{"start":{"line":71,"column":34},"end":{"line":71,"column":80}},"type":"cond-expr","locations":[{"start":{"line":71,"column":50},"end":{"line":71,"column":75}},{"start":{"line":71,"column":75},"end":{"line":71,"column":80}}],"line":71},"10":{"loc":{"start":{"line":77,"column":2},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":92,"column":null}},{"start":{"line":79,"column":2},"end":{"line":92,"column":null}}],"line":77},"11":{"loc":{"start":{"line":79,"column":2},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":92,"column":null}},{"start":{"line":81,"column":9},"end":{"line":92,"column":null}}],"line":79},"12":{"loc":{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},{"start":{},"end":{}}],"line":80},"13":{"loc":{"start":{"line":85,"column":4},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":85,"column":4},"end":{"line":91,"column":null}},{"start":{},"end":{}}],"line":85},"14":{"loc":{"start":{"line":85,"column":8},"end":{"line":85,"column":43}},"type":"binary-expr","locations":[{"start":{"line":85,"column":8},"end":{"line":85,"column":21}},{"start":{"line":85,"column":21},"end":{"line":85,"column":43}}],"line":85},"15":{"loc":{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":8},"end":{"line":89,"column":null}},{"start":{},"end":{}}],"line":87},"16":{"loc":{"start":{"line":96,"column":2},"end":{"line":100,"column":null}},"type":"binary-expr","locations":[{"start":{"line":96,"column":2},"end":{"line":96,"column":null}},{"start":{"line":97,"column":2},"end":{"line":97,"column":null}},{"start":{"line":98,"column":2},"end":{"line":98,"column":null}},{"start":{"line":99,"column":3},"end":{"line":99,"column":16}},{"start":{"line":99,"column":16},"end":{"line":99,"column":null}},{"start":{"line":100,"column":2},"end":{"line":100,"column":null}}],"line":96},"17":{"loc":{"start":{"line":106,"column":2},"end":{"line":117,"column":null}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":117,"column":null}},{"start":{"line":112,"column":9},"end":{"line":117,"column":null}}],"line":106},"18":{"loc":{"start":{"line":107,"column":4},"end":{"line":111,"column":null}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":111,"column":null}},{"start":{"line":109,"column":11},"end":{"line":111,"column":null}}],"line":107},"19":{"loc":{"start":{"line":114,"column":4},"end":{"line":116,"column":null}},"type":"if","locations":[{"start":{"line":114,"column":4},"end":{"line":116,"column":null}},{"start":{},"end":{}}],"line":114},"20":{"loc":{"start":{"line":121,"column":2},"end":{"line":129,"column":null}},"type":"if","locations":[{"start":{"line":121,"column":2},"end":{"line":129,"column":null}},{"start":{"line":123,"column":2},"end":{"line":129,"column":null}}],"line":121},"21":{"loc":{"start":{"line":123,"column":2},"end":{"line":129,"column":null}},"type":"if","locations":[{"start":{"line":123,"column":2},"end":{"line":129,"column":null}},{"start":{"line":125,"column":2},"end":{"line":129,"column":null}}],"line":123},"22":{"loc":{"start":{"line":125,"column":2},"end":{"line":129,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":2},"end":{"line":129,"column":null}},{"start":{"line":127,"column":9},"end":{"line":129,"column":null}}],"line":125},"23":{"loc":{"start":{"line":136,"column":2},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":136,"column":2},"end":{"line":149,"column":null}},{"start":{"line":138,"column":2},"end":{"line":149,"column":null}}],"line":136},"24":{"loc":{"start":{"line":138,"column":2},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":2},"end":{"line":149,"column":null}},{"start":{"line":140,"column":2},"end":{"line":149,"column":null}}],"line":138},"25":{"loc":{"start":{"line":140,"column":2},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":140,"column":2},"end":{"line":149,"column":null}},{"start":{"line":147,"column":9},"end":{"line":149,"column":null}}],"line":140}},"s":{"0":9,"1":9,"2":31,"3":3,"4":3,"5":31,"6":44,"7":44,"8":38,"9":1,"10":38,"11":6,"12":9,"13":6,"14":6,"15":3,"16":44,"17":9,"18":50,"19":4,"20":46,"21":9,"22":37,"23":15,"24":22,"25":9,"26":4,"27":4,"28":4,"29":4,"30":9,"31":9,"32":9,"33":1,"34":8,"35":3,"36":3,"37":5,"38":6,"39":5,"40":1,"41":2,"42":1,"43":9,"44":37,"45":9,"46":9,"47":15,"48":11,"49":1,"50":10,"51":4,"52":4,"53":2,"54":9,"55":22,"56":2,"57":20,"58":2,"59":18,"60":14,"61":4,"62":9,"63":9,"64":9,"65":1,"66":2,"67":8,"68":1,"69":7,"70":1,"71":6},"f":{"0":31,"1":44,"2":50,"3":4,"4":9,"5":37,"6":15,"7":22,"8":9,"9":2},"b":{"0":[3,28],"1":[38,6],"2":[1,37],"3":[3,3],"4":[6,6],"5":[4,46],"6":[9,37],"7":[15,22],"8":[4,0],"9":[2,2],"10":[1,8],"11":[3,5],"12":[3,0],"13":[1,4],"14":[5,1],"15":[1,1],"16":[37,37,37,37,23,15],"17":[11,4],"18":[1,10],"19":[2,2],"20":[2,20],"21":[2,18],"22":[14,4],"23":[1,8],"24":[1,7],"25":[1,6]},"meta":{"lastBranch":26,"lastFunction":10,"lastStatement":72,"seen":{"s:12:20:12:Infinity":0,"s:14:40:48:Infinity":1,"f:14:40:14:41":0,"b:24:2:27:Infinity:undefined:undefined:undefined:undefined":0,"s:24:2:27:Infinity":2,"s:25:21:25:Infinity":3,"s:26:4:26:Infinity":4,"s:29:2:47:Infinity":5,"f:29:9:29:15":1,"s:30:16:30:Infinity":6,"b:31:4:45:Infinity:36:11:45:Infinity":1,"s:31:4:45:Infinity":7,"b:32:6:34:Infinity:undefined:undefined:undefined:undefined":2,"s:32:6:34:Infinity":8,"s:33:8:33:Infinity":9,"s:35:6:35:Infinity":10,"s:37:6:39:Infinity":11,"s:38:8:38:Infinity":12,"s:40:6:44:Infinity":13,"b:41:8:43:Infinity:undefined:undefined:undefined:undefined":3,"s:41:8:43:Infinity":14,"b:41:12:41:22:41:22:41:39":4,"s:42:10:42:Infinity":15,"s:46:4:46:Infinity":16,"s:50:16:66:Infinity":17,"f:50:16:50:Infinity":2,"b:57:2:65:Infinity:59:2:65:Infinity":5,"s:57:2:65:Infinity":18,"s:58:4:58:Infinity":19,"b:59:2:65:Infinity:61:2:65:Infinity":6,"s:59:2:65:Infinity":20,"s:60:4:60:Infinity":21,"b:61:2:65:Infinity:63:9:65:Infinity":7,"s:61:2:65:Infinity":22,"s:62:4:62:Infinity":23,"s:64:4:64:Infinity":24,"s:68:20:73:Infinity":25,"f:68:20:68:21":3,"s:69:19:69:Infinity":26,"s:70:24:70:Infinity":27,"s:71:19:71:Infinity":28,"b:71:19:71:85:71:85:71:Infinity":8,"b:71:50:71:75:71:75:71:80":9,"s:72:2:72:Infinity":29,"s:75:20:93:Infinity":30,"f:75:20:75:21":4,"s:76:2:76:Infinity":31,"b:77:2:92:Infinity:79:2:92:Infinity":10,"s:77:2:92:Infinity":32,"s:78:4:78:Infinity":33,"b:79:2:92:Infinity:81:9:92:Infinity":11,"s:79:2:92:Infinity":34,"b:80:4:80:Infinity:undefined:undefined:undefined:undefined":12,"s:80:4:80:Infinity":35,"s:80:29:80:Infinity":36,"s:82:4:84:Infinity":37,"s:83:6:83:Infinity":38,"b:85:4:91:Infinity:undefined:undefined:undefined:undefined":13,"s:85:4:91:Infinity":39,"b:85:8:85:21:85:21:85:43":14,"s:86:6:90:Infinity":40,"b:87:8:89:Infinity:undefined:undefined:undefined:undefined":15,"s:87:8:89:Infinity":41,"s:88:10:88:Infinity":42,"s:95:26:100:Infinity":43,"f:95:26:95:27":5,"s:96:2:100:Infinity":44,"b:96:2:96:Infinity:97:2:97:Infinity:98:2:98:Infinity:99:3:99:16:99:16:99:Infinity:100:2:100:Infinity":16,"s:103:23:103:Infinity":45,"s:105:27:118:Infinity":46,"f:105:27:105:28":6,"b:106:2:117:Infinity:112:9:117:Infinity":17,"s:106:2:117:Infinity":47,"b:107:4:111:Infinity:109:11:111:Infinity":18,"s:107:4:111:Infinity":48,"s:108:6:108:Infinity":49,"s:110:6:110:Infinity":50,"s:113:5:113:Infinity":51,"b:114:4:116:Infinity:undefined:undefined:undefined:undefined":19,"s:114:4:116:Infinity":52,"s:115:7:115:Infinity":53,"s:120:28:130:Infinity":54,"f:120:28:120:29":7,"b:121:2:129:Infinity:123:2:129:Infinity":20,"s:121:2:129:Infinity":55,"s:122:5:122:Infinity":56,"b:123:2:129:Infinity:125:2:129:Infinity":21,"s:123:2:129:Infinity":57,"s:124:5:124:Infinity":58,"b:125:2:129:Infinity:127:9:129:Infinity":22,"s:125:2:129:Infinity":59,"s:126:4:126:Infinity":60,"s:128:4:128:Infinity":61,"s:132:20:132:Infinity":62,"s:135:17:150:Infinity":63,"f:135:17:135:18":8,"b:136:2:149:Infinity:138:2:149:Infinity":23,"s:136:2:149:Infinity":64,"s:137:4:137:Infinity":65,"f:137:16:137:17":9,"s:137:23:137:47":66,"b:138:2:149:Infinity:140:2:149:Infinity":24,"s:138:2:149:Infinity":67,"s:139:4:139:Infinity":68,"b:140:2:149:Infinity:147:9:149:Infinity":25,"s:140:2:149:Infinity":69,"s:142:4:146:Infinity":70,"s:148:4:148:Infinity":71}}}
+,"/home/rush/Projects/pocket-vue/src/directives/effect.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/effect.ts","statementMap":{"0":{"start":{"line":5,"column":33},"end":{"line":7,"column":null}},"1":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"2":{"start":{"line":6,"column":17},"end":{"line":6,"column":58}},"3":{"start":{"line":6,"column":30},"end":{"line":6,"column":57}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":33},"end":{"line":5,"column":34}},"loc":{"start":{"line":5,"column":63},"end":{"line":7,"column":null}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":17}},"loc":{"start":{"line":6,"column":17},"end":{"line":6,"column":58}},"line":6},"2":{"name":"(anonymous_2)","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":30}},"loc":{"start":{"line":6,"column":30},"end":{"line":6,"column":57}},"line":6}},"branchMap":{},"s":{"0":9,"1":5,"2":5,"3":5},"f":{"0":5,"1":5,"2":5},"b":{},"meta":{"lastBranch":0,"lastFunction":3,"lastStatement":4,"seen":{"s:5:33:7:Infinity":0,"f:5:33:5:34":0,"s:6:2:6:Infinity":1,"f:6:11:6:17":1,"s:6:17:6:58":2,"f:6:24:6:30":2,"s:6:30:6:57":3}}}
+,"/home/rush/Projects/pocket-vue/src/directives/for.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/for.ts","statementMap":{"0":{"start":{"line":8,"column":19},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":22},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":22},"end":{"line":10,"column":null}},"3":{"start":{"line":11,"column":22},"end":{"line":11,"column":null}},"4":{"start":{"line":15,"column":21},"end":{"line":82,"column":null}},"5":{"start":{"line":25,"column":29},"end":{"line":25,"column":null}},"6":{"start":{"line":26,"column":44},"end":{"line":26,"column":null}},"7":{"start":{"line":29,"column":2},"end":{"line":33,"column":null}},"8":{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},"9":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"10":{"start":{"line":36,"column":2},"end":{"line":57,"column":null}},"11":{"start":{"line":36,"column":15},"end":{"line":36,"column":18}},"12":{"start":{"line":37,"column":24},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":19},"end":{"line":38,"column":null}},"14":{"start":{"line":41,"column":4},"end":{"line":49,"column":null}},"15":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"16":{"start":{"line":44,"column":6},"end":{"line":48,"column":null}},"17":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"18":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"19":{"start":{"line":51,"column":4},"end":{"line":55,"column":null}},"20":{"start":{"line":53,"column":6},"end":{"line":53,"column":null}},"21":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"22":{"start":{"line":56,"column":4},"end":{"line":56,"column":null}},"23":{"start":{"line":60,"column":2},"end":{"line":60,"column":null}},"24":{"start":{"line":60,"column":36},"end":{"line":60,"column":50}},"25":{"start":{"line":64,"column":2},"end":{"line":79,"column":null}},"26":{"start":{"line":64,"column":15},"end":{"line":64,"column":37}},"27":{"start":{"line":65,"column":18},"end":{"line":65,"column":null}},"28":{"start":{"line":66,"column":22},"end":{"line":66,"column":null}},"29":{"start":{"line":67,"column":27},"end":{"line":67,"column":null}},"30":{"start":{"line":72,"column":21},"end":{"line":72,"column":null}},"31":{"start":{"line":73,"column":25},"end":{"line":73,"column":null}},"32":{"start":{"line":76,"column":4},"end":{"line":78,"column":null}},"33":{"start":{"line":77,"column":6},"end":{"line":77,"column":null}},"34":{"start":{"line":81,"column":2},"end":{"line":81,"column":null}},"35":{"start":{"line":84,"column":20},"end":{"line":203,"column":null}},"36":{"start":{"line":85,"column":18},"end":{"line":85,"column":null}},"37":{"start":{"line":86,"column":2},"end":{"line":89,"column":null}},"38":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"39":{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},"40":{"start":{"line":91,"column":19},"end":{"line":91,"column":null}},"41":{"start":{"line":93,"column":17},"end":{"line":93,"column":null}},"42":{"start":{"line":94,"column":17},"end":{"line":94,"column":null}},"43":{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},"44":{"start":{"line":96,"column":2},"end":{"line":96,"column":null}},"45":{"start":{"line":98,"column":20},"end":{"line":98,"column":null}},"46":{"start":{"line":99,"column":17},"end":{"line":99,"column":null}},"47":{"start":{"line":101,"column":27},"end":{"line":101,"column":null}},"48":{"start":{"line":105,"column":16},"end":{"line":105,"column":null}},"49":{"start":{"line":107,"column":4},"end":{"line":109,"column":null}},"50":{"start":{"line":110,"column":2},"end":{"line":113,"column":null}},"51":{"start":{"line":111,"column":4},"end":{"line":111,"column":null}},"52":{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},"53":{"start":{"line":112,"column":27},"end":{"line":112,"column":null}},"54":{"start":{"line":116,"column":2},"end":{"line":122,"column":null}},"55":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"56":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"57":{"start":{"line":119,"column":4},"end":{"line":121,"column":null}},"58":{"start":{"line":120,"column":6},"end":{"line":120,"column":null}},"59":{"start":{"line":124,"column":2},"end":{"line":127,"column":null}},"60":{"start":{"line":125,"column":4},"end":{"line":125,"column":null}},"61":{"start":{"line":125,"column":57},"end":{"line":125,"column":65}},"62":{"start":{"line":126,"column":4},"end":{"line":126,"column":null}},"63":{"start":{"line":129,"column":16},"end":{"line":129,"column":null}},"64":{"start":{"line":134,"column":30},"end":{"line":154,"column":null}},"65":{"start":{"line":135,"column":31},"end":{"line":135,"column":null}},"66":{"start":{"line":136,"column":28},"end":{"line":136,"column":null}},"67":{"start":{"line":138,"column":4},"end":{"line":151,"column":null}},"68":{"start":{"line":139,"column":6},"end":{"line":141,"column":null}},"69":{"start":{"line":139,"column":19},"end":{"line":139,"column":22}},"70":{"start":{"line":140,"column":8},"end":{"line":140,"column":null}},"71":{"start":{"line":142,"column":4},"end":{"line":151,"column":null}},"72":{"start":{"line":143,"column":6},"end":{"line":145,"column":null}},"73":{"start":{"line":143,"column":19},"end":{"line":143,"column":22}},"74":{"start":{"line":144,"column":8},"end":{"line":144,"column":null}},"75":{"start":{"line":146,"column":4},"end":{"line":151,"column":null}},"76":{"start":{"line":147,"column":14},"end":{"line":147,"column":null}},"77":{"start":{"line":148,"column":6},"end":{"line":150,"column":null}},"78":{"start":{"line":149,"column":8},"end":{"line":149,"column":null}},"79":{"start":{"line":153,"column":4},"end":{"line":153,"column":null}},"80":{"start":{"line":156,"column":29},"end":{"line":181,"column":null}},"81":{"start":{"line":162,"column":22},"end":{"line":162,"column":null}},"82":{"start":{"line":163,"column":4},"end":{"line":169,"column":null}},"83":{"start":{"line":164,"column":6},"end":{"line":166,"column":null}},"84":{"start":{"line":165,"column":19},"end":{"line":165,"column":null}},"85":{"start":{"line":168,"column":6},"end":{"line":168,"column":null}},"86":{"start":{"line":170,"column":4},"end":{"line":175,"column":null}},"87":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"88":{"start":{"line":172,"column":6},"end":{"line":172,"column":null}},"89":{"start":{"line":174,"column":6},"end":{"line":174,"column":null}},"90":{"start":{"line":176,"column":21},"end":{"line":176,"column":null}},"91":{"start":{"line":177,"column":16},"end":{"line":177,"column":null}},"92":{"start":{"line":178,"column":4},"end":{"line":178,"column":null}},"93":{"start":{"line":179,"column":4},"end":{"line":179,"column":null}},"94":{"start":{"line":180,"column":4},"end":{"line":180,"column":null}},"95":{"start":{"line":183,"column":21},"end":{"line":188,"column":null}},"96":{"start":{"line":184,"column":18},"end":{"line":184,"column":null}},"97":{"start":{"line":185,"column":4},"end":{"line":185,"column":null}},"98":{"start":{"line":186,"column":4},"end":{"line":186,"column":null}},"99":{"start":{"line":187,"column":4},"end":{"line":187,"column":null}},"100":{"start":{"line":190,"column":2},"end":{"line":200,"column":null}},"101":{"start":{"line":191,"column":19},"end":{"line":191,"column":null}},"102":{"start":{"line":192,"column":30},"end":{"line":192,"column":null}},"103":{"start":{"line":193,"column":7},"end":{"line":193,"column":null}},"104":{"start":{"line":194,"column":4},"end":{"line":199,"column":null}},"105":{"start":{"line":195,"column":6},"end":{"line":195,"column":null}},"106":{"start":{"line":195,"column":36},"end":{"line":195,"column":57}},"107":{"start":{"line":196,"column":6},"end":{"line":196,"column":null}},"108":{"start":{"line":198,"column":6},"end":{"line":198,"column":null}},"109":{"start":{"line":202,"column":2},"end":{"line":202,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":21},"end":{"line":15,"column":null}},"loc":{"start":{"line":24,"column":14},"end":{"line":82,"column":null}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":20},"end":{"line":29,"column":29}},"loc":{"start":{"line":29,"column":29},"end":{"line":33,"column":3}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":60,"column":27},"end":{"line":60,"column":36}},"loc":{"start":{"line":60,"column":36},"end":{"line":60,"column":50}},"line":60},"3":{"name":"(anonymous_3)","decl":{"start":{"line":84,"column":20},"end":{"line":84,"column":21}},"loc":{"start":{"line":84,"column":64},"end":{"line":203,"column":null}},"line":84},"4":{"name":"(anonymous_4)","decl":{"start":{"line":125,"column":50},"end":{"line":125,"column":51}},"loc":{"start":{"line":125,"column":57},"end":{"line":125,"column":65}},"line":125},"5":{"name":"(anonymous_5)","decl":{"start":{"line":134,"column":30},"end":{"line":134,"column":31}},"loc":{"start":{"line":134,"column":79},"end":{"line":154,"column":null}},"line":134},"6":{"name":"(anonymous_6)","decl":{"start":{"line":156,"column":29},"end":{"line":156,"column":null}},"loc":{"start":{"line":161,"column":16},"end":{"line":181,"column":null}},"line":161},"7":{"name":"(anonymous_7)","decl":{"start":{"line":165,"column":8},"end":{"line":165,"column":9}},"loc":{"start":{"line":165,"column":19},"end":{"line":165,"column":null}},"line":165},"8":{"name":"(anonymous_8)","decl":{"start":{"line":183,"column":21},"end":{"line":183,"column":22}},"loc":{"start":{"line":183,"column":50},"end":{"line":188,"column":null}},"line":183},"9":{"name":"(anonymous_9)","decl":{"start":{"line":190,"column":13},"end":{"line":190,"column":19}},"loc":{"start":{"line":190,"column":19},"end":{"line":200,"column":3}},"line":190},"10":{"name":"(anonymous_10)","decl":{"start":{"line":195,"column":29},"end":{"line":195,"column":30}},"loc":{"start":{"line":195,"column":36},"end":{"line":195,"column":57}},"line":195}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":32,"column":null}},{"start":{},"end":{}}],"line":30},"1":{"loc":{"start":{"line":41,"column":4},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":41},"2":{"loc":{"start":{"line":44,"column":6},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":6},"end":{"line":48,"column":null}},{"start":{},"end":{}}],"line":44},"3":{"loc":{"start":{"line":51,"column":4},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":51},"4":{"loc":{"start":{"line":67,"column":27},"end":{"line":67,"column":null}},"type":"cond-expr","locations":[{"start":{"line":67,"column":39},"end":{"line":67,"column":54}},{"start":{"line":67,"column":54},"end":{"line":67,"column":null}}],"line":67},"5":{"loc":{"start":{"line":72,"column":21},"end":{"line":72,"column":null}},"type":"cond-expr","locations":[{"start":{"line":72,"column":40},"end":{"line":72,"column":52}},{"start":{"line":72,"column":52},"end":{"line":72,"column":null}}],"line":72},"6":{"loc":{"start":{"line":76,"column":4},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":4},"end":{"line":78,"column":null}},{"start":{},"end":{}}],"line":76},"7":{"loc":{"start":{"line":86,"column":2},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":86,"column":2},"end":{"line":89,"column":null}},{"start":{},"end":{}}],"line":86},"8":{"loc":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"type":"binary-expr","locations":[{"start":{"line":87,"column":4},"end":{"line":87,"column":27}},{"start":{"line":87,"column":27},"end":{"line":87,"column":null}}],"line":87},"9":{"loc":{"start":{"line":107,"column":4},"end":{"line":109,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},{"start":{"line":108,"column":4},"end":{"line":108,"column":null}},{"start":{"line":109,"column":4},"end":{"line":109,"column":null}}],"line":107},"10":{"loc":{"start":{"line":110,"column":2},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":110,"column":2},"end":{"line":113,"column":null}},{"start":{},"end":{}}],"line":110},"11":{"loc":{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},{"start":{},"end":{}}],"line":112},"12":{"loc":{"start":{"line":116,"column":2},"end":{"line":122,"column":null}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":122,"column":null}},{"start":{},"end":{}}],"line":116},"13":{"loc":{"start":{"line":119,"column":4},"end":{"line":121,"column":null}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":121,"column":null}},{"start":{},"end":{}}],"line":119},"14":{"loc":{"start":{"line":124,"column":2},"end":{"line":127,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":2},"end":{"line":127,"column":null}},{"start":{},"end":{}}],"line":124},"15":{"loc":{"start":{"line":138,"column":4},"end":{"line":151,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":4},"end":{"line":151,"column":null}},{"start":{"line":142,"column":4},"end":{"line":151,"column":null}}],"line":138},"16":{"loc":{"start":{"line":142,"column":4},"end":{"line":151,"column":null}},"type":"if","locations":[{"start":{"line":142,"column":4},"end":{"line":151,"column":null}},{"start":{"line":146,"column":4},"end":{"line":151,"column":null}}],"line":142},"17":{"loc":{"start":{"line":146,"column":4},"end":{"line":151,"column":null}},"type":"if","locations":[{"start":{"line":146,"column":4},"end":{"line":151,"column":null}},{"start":{},"end":{}}],"line":146},"18":{"loc":{"start":{"line":163,"column":4},"end":{"line":169,"column":null}},"type":"if","locations":[{"start":{"line":163,"column":4},"end":{"line":169,"column":null}},{"start":{"line":167,"column":11},"end":{"line":169,"column":null}}],"line":163},"19":{"loc":{"start":{"line":165,"column":35},"end":{"line":165,"column":61}},"type":"cond-expr","locations":[{"start":{"line":165,"column":56},"end":{"line":165,"column":60}},{"start":{"line":165,"column":60},"end":{"line":165,"column":61}}],"line":165},"20":{"loc":{"start":{"line":170,"column":4},"end":{"line":175,"column":null}},"type":"if","locations":[{"start":{"line":170,"column":4},"end":{"line":175,"column":null}},{"start":{"line":173,"column":11},"end":{"line":175,"column":null}}],"line":170},"21":{"loc":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"type":"binary-expr","locations":[{"start":{"line":171,"column":6},"end":{"line":171,"column":19}},{"start":{"line":171,"column":19},"end":{"line":171,"column":null}}],"line":171},"22":{"loc":{"start":{"line":172,"column":6},"end":{"line":172,"column":null}},"type":"binary-expr","locations":[{"start":{"line":172,"column":6},"end":{"line":172,"column":22}},{"start":{"line":172,"column":22},"end":{"line":172,"column":null}}],"line":172},"23":{"loc":{"start":{"line":174,"column":6},"end":{"line":174,"column":null}},"type":"binary-expr","locations":[{"start":{"line":174,"column":6},"end":{"line":174,"column":19}},{"start":{"line":174,"column":19},"end":{"line":174,"column":null}}],"line":174},"24":{"loc":{"start":{"line":177,"column":16},"end":{"line":177,"column":null}},"type":"cond-expr","locations":[{"start":{"line":177,"column":25},"end":{"line":177,"column":64}},{"start":{"line":177,"column":64},"end":{"line":177,"column":null}}],"line":177},"25":{"loc":{"start":{"line":194,"column":4},"end":{"line":199,"column":null}},"type":"if","locations":[{"start":{"line":194,"column":4},"end":{"line":199,"column":null}},{"start":{"line":197,"column":11},"end":{"line":199,"column":null}}],"line":194}},"s":{"0":9,"1":9,"2":9,"3":9,"4":9,"5":11,"6":11,"7":11,"8":29,"9":29,"10":11,"11":11,"12":31,"13":31,"14":31,"15":31,"16":31,"17":23,"18":23,"19":31,"20":8,"21":8,"22":31,"23":11,"24":6,"25":11,"26":11,"27":31,"28":31,"29":31,"30":31,"31":31,"32":31,"33":15,"34":11,"35":9,"36":28,"37":28,"38":1,"39":1,"40":27,"41":27,"42":27,"43":27,"44":27,"45":27,"46":27,"47":27,"48":27,"49":27,"50":28,"51":20,"52":20,"53":0,"54":27,"55":9,"56":9,"57":9,"58":1,"59":27,"60":3,"61":6,"62":3,"63":27,"64":27,"65":38,"66":38,"67":38,"68":29,"69":29,"70":10072,"71":9,"72":1,"73":1,"74":3,"75":8,"76":6,"77":6,"78":12,"79":38,"80":27,"81":10087,"82":10087,"83":6,"84":12,"85":10081,"86":10087,"87":12,"88":12,"89":10075,"90":10087,"91":10087,"92":10087,"93":10087,"94":10087,"95":27,"96":10056,"97":10056,"98":10056,"99":10056,"100":27,"101":38,"102":38,"103":38,"104":38,"105":27,"106":10056,"107":27,"108":11,"109":27},"f":{"0":11,"1":29,"2":6,"3":28,"4":6,"5":38,"6":10087,"7":12,"8":10056,"9":38,"10":10056},"b":{"0":[29,0],"1":[31,0],"2":[23,8],"3":[8,23],"4":[21,10],"5":[0,31],"6":[15,16],"7":[1,27],"8":[1,1],"9":[27,27,7],"10":[20,8],"11":[0,20],"12":[9,18],"13":[1,8],"14":[3,24],"15":[29,9],"16":[1,8],"17":[6,2],"18":[6,10081],"19":[4,8],"20":[12,10075],"21":[12,12],"22":[12,2],"23":[10075,6],"24":[73,10014],"25":[27,11]},"meta":{"lastBranch":26,"lastFunction":11,"lastStatement":110,"seen":{"s:8:19:8:Infinity":0,"s:9:22:9:Infinity":1,"s:10:22:10:Infinity":2,"s:11:22:11:Infinity":3,"s:15:21:82:Infinity":4,"f:15:21:15:Infinity":0,"s:25:29:25:Infinity":5,"s:26:44:26:Infinity":6,"s:29:2:33:Infinity":7,"f:29:20:29:29":1,"b:30:4:32:Infinity:undefined:undefined:undefined:undefined":0,"s:30:4:32:Infinity":8,"s:31:6:31:Infinity":9,"s:36:2:57:Infinity":10,"s:36:15:36:18":11,"s:37:24:37:Infinity":12,"s:38:19:38:Infinity":13,"b:41:4:49:Infinity:undefined:undefined:undefined:undefined":1,"s:41:4:49:Infinity":14,"s:43:6:43:Infinity":15,"b:44:6:48:Infinity:undefined:undefined:undefined:undefined":2,"s:44:6:48:Infinity":16,"s:46:8:46:Infinity":17,"s:47:8:47:Infinity":18,"b:51:4:55:Infinity:undefined:undefined:undefined:undefined":3,"s:51:4:55:Infinity":19,"s:53:6:53:Infinity":20,"s:54:6:54:Infinity":21,"s:56:4:56:Infinity":22,"s:60:2:60:Infinity":23,"f:60:27:60:36":2,"s:60:36:60:50":24,"s:64:2:79:Infinity":25,"s:64:15:64:37":26,"s:65:18:65:Infinity":27,"s:66:22:66:Infinity":28,"s:67:27:67:Infinity":29,"b:67:39:67:54:67:54:67:Infinity":4,"s:72:21:72:Infinity":30,"b:72:40:72:52:72:52:72:Infinity":5,"s:73:25:73:Infinity":31,"b:76:4:78:Infinity:undefined:undefined:undefined:undefined":6,"s:76:4:78:Infinity":32,"s:77:6:77:Infinity":33,"s:81:2:81:Infinity":34,"s:84:20:203:Infinity":35,"f:84:20:84:21":3,"s:85:18:85:Infinity":36,"b:86:2:89:Infinity:undefined:undefined:undefined:undefined":7,"s:86:2:89:Infinity":37,"s:87:4:87:Infinity":38,"b:87:4:87:27:87:27:87:Infinity":8,"s:88:4:88:Infinity":39,"s:91:19:91:Infinity":40,"s:93:17:93:Infinity":41,"s:94:17:94:Infinity":42,"s:95:2:95:Infinity":43,"s:96:2:96:Infinity":44,"s:98:20:98:Infinity":45,"s:99:17:99:Infinity":46,"s:101:27:101:Infinity":47,"s:105:16:105:Infinity":48,"s:107:4:109:Infinity":49,"b:107:4:107:Infinity:108:4:108:Infinity:109:4:109:Infinity":9,"b:110:2:113:Infinity:undefined:undefined:undefined:undefined":10,"s:110:2:113:Infinity":50,"s:111:4:111:Infinity":51,"b:112:4:112:Infinity:undefined:undefined:undefined:undefined":11,"s:112:4:112:Infinity":52,"s:112:27:112:Infinity":53,"b:116:2:122:Infinity:undefined:undefined:undefined:undefined":12,"s:116:2:122:Infinity":54,"s:117:4:117:Infinity":55,"s:118:4:118:Infinity":56,"b:119:4:121:Infinity:undefined:undefined:undefined:undefined":13,"s:119:4:121:Infinity":57,"s:120:6:120:Infinity":58,"b:124:2:127:Infinity:undefined:undefined:undefined:undefined":14,"s:124:2:127:Infinity":59,"s:125:4:125:Infinity":60,"f:125:50:125:51":4,"s:125:57:125:65":61,"s:126:4:126:Infinity":62,"s:129:16:129:Infinity":63,"s:134:30:154:Infinity":64,"f:134:30:134:31":5,"s:135:31:135:Infinity":65,"s:136:28:136:Infinity":66,"b:138:4:151:Infinity:142:4:151:Infinity":15,"s:138:4:151:Infinity":67,"s:139:6:141:Infinity":68,"s:139:19:139:22":69,"s:140:8:140:Infinity":70,"b:142:4:151:Infinity:146:4:151:Infinity":16,"s:142:4:151:Infinity":71,"s:143:6:145:Infinity":72,"s:143:19:143:22":73,"s:144:8:144:Infinity":74,"b:146:4:151:Infinity:undefined:undefined:undefined:undefined":17,"s:146:4:151:Infinity":75,"s:147:14:147:Infinity":76,"s:148:6:150:Infinity":77,"s:149:8:149:Infinity":78,"s:153:4:153:Infinity":79,"s:156:29:181:Infinity":80,"f:156:29:156:Infinity":6,"s:162:22:162:Infinity":81,"b:163:4:169:Infinity:167:11:169:Infinity":18,"s:163:4:169:Infinity":82,"s:164:6:166:Infinity":83,"f:165:8:165:9":7,"s:165:19:165:Infinity":84,"b:165:56:165:60:165:60:165:61":19,"s:168:6:168:Infinity":85,"b:170:4:175:Infinity:173:11:175:Infinity":20,"s:170:4:175:Infinity":86,"s:171:6:171:Infinity":87,"b:171:6:171:19:171:19:171:Infinity":21,"s:172:6:172:Infinity":88,"b:172:6:172:22:172:22:172:Infinity":22,"s:174:6:174:Infinity":89,"b:174:6:174:19:174:19:174:Infinity":23,"s:176:21:176:Infinity":90,"s:177:16:177:Infinity":91,"b:177:25:177:64:177:64:177:Infinity":24,"s:178:4:178:Infinity":92,"s:179:4:179:Infinity":93,"s:180:4:180:Infinity":94,"s:183:21:188:Infinity":95,"f:183:21:183:22":8,"s:184:18:184:Infinity":96,"s:185:4:185:Infinity":97,"s:186:4:186:Infinity":98,"s:187:4:187:Infinity":99,"s:190:2:200:Infinity":100,"f:190:13:190:19":9,"s:191:19:191:Infinity":101,"s:192:30:192:Infinity":102,"s:193:7:193:Infinity":103,"b:194:4:199:Infinity:197:11:199:Infinity":25,"s:194:4:199:Infinity":104,"s:195:6:195:Infinity":105,"f:195:29:195:30":10,"s:195:36:195:57":106,"s:196:6:196:Infinity":107,"s:198:6:198:Infinity":108,"s:202:2:202:Infinity":109}}}
+,"/home/rush/Projects/pocket-vue/src/directives/html.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/html.ts","statementMap":{"0":{"start":{"line":3,"column":31},"end":{"line":7,"column":null}},"1":{"start":{"line":4,"column":2},"end":{"line":6,"column":null}},"2":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":31},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":56},"end":{"line":7,"column":null}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":15}},"loc":{"start":{"line":4,"column":15},"end":{"line":6,"column":3}},"line":4}},"branchMap":{},"s":{"0":9,"1":3,"2":4},"f":{"0":3,"1":4},"b":{},"meta":{"lastBranch":0,"lastFunction":2,"lastStatement":3,"seen":{"s:3:31:7:Infinity":0,"f:3:31:3:32":0,"s:4:2:6:Infinity":1,"f:4:9:4:15":1,"s:5:4:5:Infinity":2}}}
+,"/home/rush/Projects/pocket-vue/src/directives/if.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/if.ts","statementMap":{"0":{"start":{"line":11,"column":19},"end":{"line":79,"column":null}},"1":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"2":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"3":{"start":{"line":16,"column":17},"end":{"line":16,"column":null}},"4":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"5":{"start":{"line":17,"column":15},"end":{"line":17,"column":null}},"6":{"start":{"line":19,"column":17},"end":{"line":19,"column":null}},"7":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"8":{"start":{"line":22,"column":29},"end":{"line":27,"column":null}},"9":{"start":{"line":32,"column":2},"end":{"line":43,"column":null}},"10":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"11":{"start":{"line":34,"column":4},"end":{"line":42,"column":null}},"12":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"14":{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},"15":{"start":{"line":45,"column":19},"end":{"line":45,"column":null}},"16":{"start":{"line":46,"column":2},"end":{"line":46,"column":null}},"17":{"start":{"line":49,"column":34},"end":{"line":49,"column":null}},"18":{"start":{"line":51,"column":28},"end":{"line":57,"column":null}},"19":{"start":{"line":52,"column":4},"end":{"line":56,"column":null}},"20":{"start":{"line":53,"column":6},"end":{"line":53,"column":null}},"21":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"22":{"start":{"line":55,"column":6},"end":{"line":55,"column":null}},"23":{"start":{"line":59,"column":2},"end":{"line":76,"column":null}},"24":{"start":{"line":60,"column":4},"end":{"line":72,"column":null}},"25":{"start":{"line":60,"column":17},"end":{"line":60,"column":20}},"26":{"start":{"line":61,"column":26},"end":{"line":61,"column":null}},"27":{"start":{"line":62,"column":6},"end":{"line":71,"column":null}},"28":{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},"29":{"start":{"line":64,"column":10},"end":{"line":64,"column":null}},"30":{"start":{"line":65,"column":10},"end":{"line":65,"column":null}},"31":{"start":{"line":66,"column":10},"end":{"line":66,"column":null}},"32":{"start":{"line":67,"column":10},"end":{"line":67,"column":null}},"33":{"start":{"line":68,"column":10},"end":{"line":68,"column":null}},"34":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"35":{"start":{"line":74,"column":4},"end":{"line":74,"column":null}},"36":{"start":{"line":75,"column":4},"end":{"line":75,"column":null}},"37":{"start":{"line":78,"column":2},"end":{"line":78,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":19},"end":{"line":11,"column":20}},"loc":{"start":{"line":11,"column":63},"end":{"line":79,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":51,"column":28},"end":{"line":51,"column":34}},"loc":{"start":{"line":51,"column":34},"end":{"line":57,"column":null}},"line":51},"2":{"name":"(anonymous_2)","decl":{"start":{"line":59,"column":13},"end":{"line":59,"column":19}},"loc":{"start":{"line":59,"column":19},"end":{"line":76,"column":3}},"line":59}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},{"start":{},"end":{}}],"line":12},"1":{"loc":{"start":{"line":12,"column":6},"end":{"line":12,"column":42}},"type":"binary-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":29}},{"start":{"line":12,"column":29},"end":{"line":12,"column":42}}],"line":12},"2":{"loc":{"start":{"line":16,"column":17},"end":{"line":16,"column":null}},"type":"binary-expr","locations":[{"start":{"line":16,"column":17},"end":{"line":16,"column":38}},{"start":{"line":16,"column":38},"end":{"line":16,"column":null}}],"line":16},"3":{"loc":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},{"start":{},"end":{}}],"line":17},"4":{"loc":{"start":{"line":34,"column":4},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":42,"column":null}},{"start":{"line":40,"column":11},"end":{"line":42,"column":null}}],"line":34},"5":{"loc":{"start":{"line":35,"column":6},"end":{"line":36,"column":null}},"type":"binary-expr","locations":[{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},{"start":{"line":36,"column":7},"end":{"line":36,"column":null}}],"line":35},"6":{"loc":{"start":{"line":52,"column":4},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":52},"7":{"loc":{"start":{"line":62,"column":6},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":71,"column":null}},{"start":{},"end":{}}],"line":62},"8":{"loc":{"start":{"line":62,"column":10},"end":{"line":62,"column":55}},"type":"binary-expr","locations":[{"start":{"line":62,"column":10},"end":{"line":62,"column":25}},{"start":{"line":62,"column":25},"end":{"line":62,"column":55}}],"line":62},"9":{"loc":{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":8},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":63}},"s":{"0":9,"1":8,"2":1,"3":8,"4":8,"5":1,"6":7,"7":7,"8":7,"9":7,"10":4,"11":4,"12":3,"13":3,"14":1,"15":7,"16":7,"17":7,"18":7,"19":10,"20":2,"21":2,"22":2,"23":7,"24":10,"25":10,"26":12,"27":12,"28":6,"29":6,"30":6,"31":6,"32":6,"33":6,"34":6,"35":4,"36":4,"37":7},"f":{"0":8,"1":10,"2":10},"b":{"0":[1,7],"1":[8,8],"2":[8,1],"3":[1,7],"4":[3,1],"5":[4,2],"6":[2,8],"7":[6,6],"8":[12,11],"9":[6,0]},"meta":{"lastBranch":10,"lastFunction":3,"lastStatement":38,"seen":{"s:11:19:79:Infinity":0,"f:11:19:11:20":0,"b:12:2:14:Infinity:undefined:undefined:undefined:undefined":0,"s:12:2:14:Infinity":1,"b:12:6:12:29:12:29:12:42":1,"s:13:4:13:Infinity":2,"s:16:17:16:Infinity":3,"b:16:17:16:38:16:38:16:Infinity":2,"b:17:2:17:Infinity:undefined:undefined:undefined:undefined":3,"s:17:2:17:Infinity":4,"s:17:15:17:Infinity":5,"s:19:17:19:Infinity":6,"s:20:2:20:Infinity":7,"s:22:29:27:Infinity":8,"s:32:2:43:Infinity":9,"s:33:4:33:Infinity":10,"b:34:4:42:Infinity:40:11:42:Infinity":4,"s:34:4:42:Infinity":11,"b:35:6:35:Infinity:36:7:36:Infinity":5,"s:38:6:38:Infinity":12,"s:39:6:39:Infinity":13,"s:41:6:41:Infinity":14,"s:45:19:45:Infinity":15,"s:46:2:46:Infinity":16,"s:49:34:49:Infinity":17,"s:51:28:57:Infinity":18,"f:51:28:51:34":1,"b:52:4:56:Infinity:undefined:undefined:undefined:undefined":6,"s:52:4:56:Infinity":19,"s:53:6:53:Infinity":20,"s:54:6:54:Infinity":21,"s:55:6:55:Infinity":22,"s:59:2:76:Infinity":23,"f:59:13:59:19":2,"s:60:4:72:Infinity":24,"s:60:17:60:20":25,"s:61:26:61:Infinity":26,"b:62:6:71:Infinity:undefined:undefined:undefined:undefined":7,"s:62:6:71:Infinity":27,"b:62:10:62:25:62:25:62:55":8,"b:63:8:69:Infinity:undefined:undefined:undefined:undefined":9,"s:63:8:69:Infinity":28,"s:64:10:64:Infinity":29,"s:65:10:65:Infinity":30,"s:66:10:66:Infinity":31,"s:67:10:67:Infinity":32,"s:68:10:68:Infinity":33,"s:70:8:70:Infinity":34,"s:74:4:74:Infinity":35,"s:75:4:75:Infinity":36,"s:78:2:78:Infinity":37}}}
+,"/home/rush/Projects/pocket-vue/src/directives/index.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/index.ts","statementMap":{"0":{"start":{"line":28,"column":65},"end":{"line":37,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":9},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":1,"seen":{"s:28:65:37:Infinity":0}}}
+,"/home/rush/Projects/pocket-vue/src/directives/model.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/model.ts","statementMap":{"0":{"start":{"line":6,"column":27},"end":{"line":10,"column":null}},"1":{"start":{"line":7,"column":2},"end":{"line":10,"column":null}},"2":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"3":{"start":{"line":8,"column":31},"end":{"line":8,"column":null}},"4":{"start":{"line":9,"column":4},"end":{"line":9,"column":null}},"5":{"start":{"line":12,"column":27},"end":{"line":16,"column":null}},"6":{"start":{"line":13,"column":2},"end":{"line":15,"column":null}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"8":{"start":{"line":20,"column":4},"end":{"line":108,"column":null}},"9":{"start":{"line":21,"column":15},"end":{"line":21,"column":null}},"10":{"start":{"line":22,"column":17},"end":{"line":22,"column":null}},"11":{"start":{"line":23,"column":67},"end":{"line":23,"column":null}},"12":{"start":{"line":25,"column":2},"end":{"line":107,"column":null}},"13":{"start":{"line":26,"column":16},"end":{"line":26,"column":null}},"14":{"start":{"line":27,"column":4},"end":{"line":34,"column":null}},"15":{"start":{"line":28,"column":26},"end":{"line":32,"column":null}},"16":{"start":{"line":29,"column":42},"end":{"line":29,"column":52}},"17":{"start":{"line":31,"column":10},"end":{"line":31,"column":null}},"18":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"19":{"start":{"line":35,"column":4},"end":{"line":58,"column":null}},"20":{"start":{"line":36,"column":20},"end":{"line":36,"column":null}},"21":{"start":{"line":37,"column":25},"end":{"line":37,"column":null}},"22":{"start":{"line":38,"column":22},"end":{"line":38,"column":null}},"23":{"start":{"line":39,"column":6},"end":{"line":54,"column":null}},"24":{"start":{"line":39,"column":19},"end":{"line":39,"column":22}},"25":{"start":{"line":39,"column":26},"end":{"line":39,"column":42}},"26":{"start":{"line":40,"column":23},"end":{"line":40,"column":null}},"27":{"start":{"line":41,"column":28},"end":{"line":41,"column":null}},"28":{"start":{"line":42,"column":8},"end":{"line":53,"column":null}},"29":{"start":{"line":43,"column":10},"end":{"line":47,"column":null}},"30":{"start":{"line":44,"column":12},"end":{"line":44,"column":null}},"31":{"start":{"line":46,"column":12},"end":{"line":46,"column":null}},"32":{"start":{"line":49,"column":10},"end":{"line":52,"column":null}},"33":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"34":{"start":{"line":50,"column":41},"end":{"line":50,"column":null}},"35":{"start":{"line":51,"column":12},"end":{"line":51,"column":null}},"36":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"37":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"38":{"start":{"line":59,"column":2},"end":{"line":107,"column":null}},"39":{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},"40":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"41":{"start":{"line":65,"column":4},"end":{"line":68,"column":null}},"42":{"start":{"line":66,"column":6},"end":{"line":66,"column":null}},"43":{"start":{"line":67,"column":6},"end":{"line":67,"column":null}},"44":{"start":{"line":69,"column":2},"end":{"line":107,"column":null}},"45":{"start":{"line":70,"column":4},"end":{"line":72,"column":null}},"46":{"start":{"line":71,"column":6},"end":{"line":71,"column":null}},"47":{"start":{"line":74,"column":4},"end":{"line":79,"column":null}},"48":{"start":{"line":75,"column":20},"end":{"line":75,"column":null}},"49":{"start":{"line":76,"column":6},"end":{"line":78,"column":null}},"50":{"start":{"line":77,"column":11},"end":{"line":77,"column":null}},"51":{"start":{"line":82,"column":25},"end":{"line":86,"column":null}},"52":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"53":{"start":{"line":83,"column":16},"end":{"line":83,"column":null}},"54":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"55":{"start":{"line":84,"column":18},"end":{"line":84,"column":null}},"56":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"57":{"start":{"line":88,"column":24},"end":{"line":88,"column":null}},"58":{"start":{"line":89,"column":52},"end":{"line":94,"column":null}},"59":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"60":{"start":{"line":96,"column":4},"end":{"line":100,"column":null}},"61":{"start":{"line":97,"column":6},"end":{"line":99,"column":null}},"62":{"start":{"line":98,"column":8},"end":{"line":98,"column":null}},"63":{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},"64":{"start":{"line":104,"column":4},"end":{"line":106,"column":null}},"65":{"start":{"line":105,"column":6},"end":{"line":105,"column":null}},"66":{"start":{"line":110,"column":17},"end":{"line":110,"column":null}},"67":{"start":{"line":110,"column":31},"end":{"line":110,"column":null}},"68":{"start":{"line":113,"column":25},"end":{"line":119,"column":null}},"69":{"start":{"line":117,"column":14},"end":{"line":117,"column":null}},"70":{"start":{"line":118,"column":2},"end":{"line":118,"column":null}},"71":{"start":{"line":121,"column":34},"end":{"line":123,"column":null}},"72":{"start":{"line":122,"column":5},"end":{"line":122,"column":null}},"73":{"start":{"line":125,"column":32},"end":{"line":131,"column":null}},"74":{"start":{"line":126,"column":17},"end":{"line":126,"column":null}},"75":{"start":{"line":127,"column":2},"end":{"line":130,"column":null}},"76":{"start":{"line":128,"column":4},"end":{"line":128,"column":null}},"77":{"start":{"line":129,"column":4},"end":{"line":129,"column":null}},"78":{"start":{"line":133,"column":33},"end":{"line":138,"column":null}},"79":{"start":{"line":137,"column":2},"end":{"line":137,"column":null}},"80":{"start":{"line":140,"column":35},"end":{"line":151,"column":null}},"81":{"start":{"line":145,"column":16},"end":{"line":145,"column":null}},"82":{"start":{"line":146,"column":2},"end":{"line":150,"column":null}},"83":{"start":{"line":147,"column":4},"end":{"line":147,"column":null}},"84":{"start":{"line":148,"column":2},"end":{"line":150,"column":null}},"85":{"start":{"line":149,"column":4},"end":{"line":149,"column":null}},"86":{"start":{"line":154,"column":31},"end":{"line":154,"column":null}},"87":{"start":{"line":154,"column":67},"end":{"line":154,"column":70}},"88":{"start":{"line":156,"column":36},"end":{"line":177,"column":null}},"89":{"start":{"line":161,"column":21},"end":{"line":161,"column":null}},"90":{"start":{"line":162,"column":18},"end":{"line":162,"column":null}},"91":{"start":{"line":163,"column":2},"end":{"line":176,"column":null}},"92":{"start":{"line":164,"column":25},"end":{"line":164,"column":null}},"93":{"start":{"line":165,"column":18},"end":{"line":165,"column":null}},"94":{"start":{"line":166,"column":18},"end":{"line":166,"column":null}},"95":{"start":{"line":167,"column":4},"end":{"line":173,"column":null}},"96":{"start":{"line":168,"column":6},"end":{"line":168,"column":null}},"97":{"start":{"line":169,"column":4},"end":{"line":173,"column":null}},"98":{"start":{"line":170,"column":23},"end":{"line":170,"column":null}},"99":{"start":{"line":171,"column":6},"end":{"line":171,"column":null}},"100":{"start":{"line":172,"column":6},"end":{"line":172,"column":null}},"101":{"start":{"line":175,"column":4},"end":{"line":175,"column":null}},"102":{"start":{"line":179,"column":31},"end":{"line":195,"column":null}},"103":{"start":{"line":184,"column":2},"end":{"line":186,"column":null}},"104":{"start":{"line":185,"column":4},"end":{"line":185,"column":null}},"105":{"start":{"line":187,"column":17},"end":{"line":187,"column":null}},"106":{"start":{"line":188,"column":17},"end":{"line":188,"column":null}},"107":{"start":{"line":189,"column":2},"end":{"line":191,"column":null}},"108":{"start":{"line":190,"column":4},"end":{"line":190,"column":null}},"109":{"start":{"line":192,"column":2},"end":{"line":194,"column":null}},"110":{"start":{"line":193,"column":4},"end":{"line":193,"column":null}},"111":{"start":{"line":197,"column":16},"end":{"line":201,"column":null}},"112":{"start":{"line":198,"column":12},"end":{"line":198,"column":null}},"113":{"start":{"line":199,"column":2},"end":{"line":199,"column":null}},"114":{"start":{"line":200,"column":2},"end":{"line":200,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":27},"end":{"line":6,"column":28}},"loc":{"start":{"line":7,"column":2},"end":{"line":10,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":2},"end":{"line":7,"column":3}},"loc":{"start":{"line":7,"column":78},"end":{"line":10,"column":null}},"line":7},"2":{"name":"(anonymous_2)","decl":{"start":{"line":12,"column":27},"end":{"line":12,"column":28}},"loc":{"start":{"line":12,"column":85},"end":{"line":16,"column":null}},"line":12},"3":{"name":"(anonymous_3)","decl":{"start":{"line":13,"column":35},"end":{"line":13,"column":36}},"loc":{"start":{"line":13,"column":57},"end":{"line":15,"column":3}},"line":13},"4":{"name":"(anonymous_4)","decl":{"start":{"line":20,"column":4},"end":{"line":20,"column":5}},"loc":{"start":{"line":20,"column":45},"end":{"line":108,"column":null}},"line":20},"5":{"name":"(anonymous_5)","decl":{"start":{"line":27,"column":25},"end":{"line":27,"column":31}},"loc":{"start":{"line":27,"column":31},"end":{"line":34,"column":5}},"line":27},"6":{"name":"(anonymous_6)","decl":{"start":{"line":29,"column":16},"end":{"line":29,"column":17}},"loc":{"start":{"line":29,"column":42},"end":{"line":29,"column":52}},"line":29},"7":{"name":"(anonymous_7)","decl":{"start":{"line":30,"column":13},"end":{"line":30,"column":14}},"loc":{"start":{"line":31,"column":10},"end":{"line":31,"column":null}},"line":31},"8":{"name":"(anonymous_8)","decl":{"start":{"line":35,"column":11},"end":{"line":35,"column":17}},"loc":{"start":{"line":35,"column":17},"end":{"line":58,"column":5}},"line":35},"9":{"name":"(anonymous_9)","decl":{"start":{"line":60,"column":25},"end":{"line":60,"column":31}},"loc":{"start":{"line":60,"column":31},"end":{"line":62,"column":5}},"line":60},"10":{"name":"(anonymous_10)","decl":{"start":{"line":65,"column":11},"end":{"line":65,"column":17}},"loc":{"start":{"line":65,"column":17},"end":{"line":68,"column":5}},"line":65},"11":{"name":"(anonymous_11)","decl":{"start":{"line":70,"column":25},"end":{"line":70,"column":31}},"loc":{"start":{"line":70,"column":31},"end":{"line":72,"column":5}},"line":70},"12":{"name":"(anonymous_12)","decl":{"start":{"line":74,"column":11},"end":{"line":74,"column":17}},"loc":{"start":{"line":74,"column":17},"end":{"line":79,"column":5}},"line":74},"13":{"name":"(anonymous_13)","decl":{"start":{"line":82,"column":25},"end":{"line":82,"column":26}},"loc":{"start":{"line":82,"column":42},"end":{"line":86,"column":null}},"line":82},"14":{"name":"(anonymous_14)","decl":{"start":{"line":92,"column":46},"end":{"line":92,"column":null}},"loc":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"line":93},"15":{"name":"(anonymous_15)","decl":{"start":{"line":97,"column":24},"end":{"line":97,"column":30}},"loc":{"start":{"line":97,"column":30},"end":{"line":99,"column":null}},"line":97},"16":{"name":"(anonymous_16)","decl":{"start":{"line":104,"column":11},"end":{"line":104,"column":17}},"loc":{"start":{"line":104,"column":17},"end":{"line":106,"column":5}},"line":104},"17":{"name":"(anonymous_17)","decl":{"start":{"line":110,"column":17},"end":{"line":110,"column":18}},"loc":{"start":{"line":110,"column":31},"end":{"line":110,"column":null}},"line":110},"18":{"name":"(anonymous_18)","decl":{"start":{"line":113,"column":25},"end":{"line":113,"column":null}},"loc":{"start":{"line":116,"column":5},"end":{"line":119,"column":null}},"line":116},"19":{"name":"(anonymous_19)","decl":{"start":{"line":121,"column":34},"end":{"line":121,"column":35}},"loc":{"start":{"line":121,"column":48},"end":{"line":123,"column":null}},"line":121},"20":{"name":"(anonymous_20)","decl":{"start":{"line":125,"column":32},"end":{"line":125,"column":33}},"loc":{"start":{"line":125,"column":46},"end":{"line":131,"column":null}},"line":125},"21":{"name":"(anonymous_21)","decl":{"start":{"line":133,"column":33},"end":{"line":133,"column":null}},"loc":{"start":{"line":136,"column":5},"end":{"line":138,"column":null}},"line":136},"22":{"name":"(anonymous_22)","decl":{"start":{"line":140,"column":35},"end":{"line":140,"column":null}},"loc":{"start":{"line":144,"column":5},"end":{"line":151,"column":null}},"line":144},"23":{"name":"(anonymous_23)","decl":{"start":{"line":154,"column":50},"end":{"line":154,"column":51}},"loc":{"start":{"line":154,"column":67},"end":{"line":154,"column":70}},"line":154},"24":{"name":"(anonymous_24)","decl":{"start":{"line":156,"column":36},"end":{"line":156,"column":null}},"loc":{"start":{"line":160,"column":5},"end":{"line":177,"column":null}},"line":160},"25":{"name":"(anonymous_25)","decl":{"start":{"line":179,"column":31},"end":{"line":179,"column":null}},"loc":{"start":{"line":183,"column":5},"end":{"line":195,"column":null}},"line":183},"26":{"name":"(anonymous_26)","decl":{"start":{"line":197,"column":16},"end":{"line":197,"column":17}},"loc":{"start":{"line":197,"column":51},"end":{"line":201,"column":null}},"line":197}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":4},"end":{"line":8,"column":null}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":23,"column":16},"end":{"line":23,"column":63}},"type":"default-arg","locations":[{"start":{"line":23,"column":25},"end":{"line":23,"column":63}}],"line":23},"2":{"loc":{"start":{"line":23,"column":25},"end":{"line":23,"column":63}},"type":"binary-expr","locations":[{"start":{"line":23,"column":25},"end":{"line":23,"column":46}},{"start":{"line":23,"column":46},"end":{"line":23,"column":63}}],"line":23},"3":{"loc":{"start":{"line":23,"column":67},"end":{"line":23,"column":null}},"type":"binary-expr","locations":[{"start":{"line":23,"column":67},"end":{"line":23,"column":80}},{"start":{"line":23,"column":80},"end":{"line":23,"column":null}}],"line":23},"4":{"loc":{"start":{"line":25,"column":2},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":107,"column":null}},{"start":{"line":59,"column":2},"end":{"line":107,"column":null}}],"line":25},"5":{"loc":{"start":{"line":31,"column":10},"end":{"line":31,"column":null}},"type":"cond-expr","locations":[{"start":{"line":31,"column":19},"end":{"line":31,"column":43}},{"start":{"line":31,"column":43},"end":{"line":31,"column":null}}],"line":31},"6":{"loc":{"start":{"line":33,"column":13},"end":{"line":33,"column":61}},"type":"cond-expr","locations":[{"start":{"line":33,"column":28},"end":{"line":33,"column":47}},{"start":{"line":33,"column":47},"end":{"line":33,"column":61}}],"line":33},"7":{"loc":{"start":{"line":42,"column":8},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":8},"end":{"line":53,"column":null}},{"start":{"line":48,"column":15},"end":{"line":53,"column":null}}],"line":42},"8":{"loc":{"start":{"line":43,"column":10},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":10},"end":{"line":47,"column":null}},{"start":{"line":45,"column":17},"end":{"line":47,"column":null}}],"line":43},"9":{"loc":{"start":{"line":49,"column":10},"end":{"line":52,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":10},"end":{"line":52,"column":null}},{"start":{},"end":{}}],"line":49},"10":{"loc":{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":12},"end":{"line":50,"column":null}},{"start":{},"end":{}}],"line":50},"11":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":55},"12":{"loc":{"start":{"line":55,"column":10},"end":{"line":55,"column":51}},"type":"binary-expr","locations":[{"start":{"line":55,"column":10},"end":{"line":55,"column":25}},{"start":{"line":55,"column":25},"end":{"line":55,"column":51}}],"line":55},"13":{"loc":{"start":{"line":59,"column":2},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":107,"column":null}},{"start":{"line":69,"column":2},"end":{"line":107,"column":null}}],"line":59},"14":{"loc":{"start":{"line":69,"column":2},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":107,"column":null}},{"start":{"line":80,"column":9},"end":{"line":107,"column":null}}],"line":69},"15":{"loc":{"start":{"line":76,"column":6},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":6},"end":{"line":78,"column":null}},{"start":{},"end":{}}],"line":76},"16":{"loc":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},{"start":{},"end":{}}],"line":83},"17":{"loc":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},{"start":{},"end":{}}],"line":84},"18":{"loc":{"start":{"line":92,"column":7},"end":{"line":92,"column":43}},"type":"cond-expr","locations":[{"start":{"line":92,"column":25},"end":{"line":92,"column":36}},{"start":{"line":92,"column":36},"end":{"line":92,"column":43}}],"line":92},"19":{"loc":{"start":{"line":96,"column":4},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":96,"column":4},"end":{"line":100,"column":null}},{"start":{},"end":{}}],"line":96},"20":{"loc":{"start":{"line":110,"column":31},"end":{"line":110,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":48},"end":{"line":110,"column":60}},{"start":{"line":110,"column":60},"end":{"line":110,"column":null}}],"line":110},"21":{"loc":{"start":{"line":117,"column":14},"end":{"line":117,"column":null}},"type":"cond-expr","locations":[{"start":{"line":117,"column":24},"end":{"line":117,"column":39}},{"start":{"line":117,"column":39},"end":{"line":117,"column":null}}],"line":117},"22":{"loc":{"start":{"line":118,"column":9},"end":{"line":118,"column":null}},"type":"cond-expr","locations":[{"start":{"line":118,"column":21},"end":{"line":118,"column":31}},{"start":{"line":118,"column":31},"end":{"line":118,"column":null}}],"line":118},"23":{"loc":{"start":{"line":127,"column":2},"end":{"line":130,"column":null}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":130,"column":null}},{"start":{},"end":{}}],"line":127},"24":{"loc":{"start":{"line":146,"column":2},"end":{"line":150,"column":null}},"type":"if","locations":[{"start":{"line":146,"column":2},"end":{"line":150,"column":null}},{"start":{"line":148,"column":2},"end":{"line":150,"column":null}}],"line":146},"25":{"loc":{"start":{"line":148,"column":2},"end":{"line":150,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":2},"end":{"line":150,"column":null}},{"start":{},"end":{}}],"line":148},"26":{"loc":{"start":{"line":163,"column":2},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":163,"column":2},"end":{"line":176,"column":null}},{"start":{"line":174,"column":9},"end":{"line":176,"column":null}}],"line":163},"27":{"loc":{"start":{"line":167,"column":4},"end":{"line":173,"column":null}},"type":"if","locations":[{"start":{"line":167,"column":4},"end":{"line":173,"column":null}},{"start":{"line":169,"column":4},"end":{"line":173,"column":null}}],"line":167},"28":{"loc":{"start":{"line":167,"column":8},"end":{"line":167,"column":27}},"type":"binary-expr","locations":[{"start":{"line":167,"column":8},"end":{"line":167,"column":19}},{"start":{"line":167,"column":19},"end":{"line":167,"column":27}}],"line":167},"29":{"loc":{"start":{"line":169,"column":4},"end":{"line":173,"column":null}},"type":"if","locations":[{"start":{"line":169,"column":4},"end":{"line":173,"column":null}},{"start":{},"end":{}}],"line":169},"30":{"loc":{"start":{"line":169,"column":15},"end":{"line":169,"column":34}},"type":"binary-expr","locations":[{"start":{"line":169,"column":15},"end":{"line":169,"column":27}},{"start":{"line":169,"column":27},"end":{"line":169,"column":34}}],"line":169},"31":{"loc":{"start":{"line":184,"column":2},"end":{"line":186,"column":null}},"type":"if","locations":[{"start":{"line":184,"column":2},"end":{"line":186,"column":null}},{"start":{},"end":{}}],"line":184},"32":{"loc":{"start":{"line":189,"column":2},"end":{"line":191,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":2},"end":{"line":191,"column":null}},{"start":{},"end":{}}],"line":189},"33":{"loc":{"start":{"line":189,"column":6},"end":{"line":189,"column":72}},"type":"binary-expr","locations":[{"start":{"line":189,"column":6},"end":{"line":189,"column":39}},{"start":{"line":189,"column":39},"end":{"line":189,"column":72}}],"line":189},"34":{"loc":{"start":{"line":192,"column":2},"end":{"line":194,"column":null}},"type":"if","locations":[{"start":{"line":192,"column":2},"end":{"line":194,"column":null}},{"start":{},"end":{}}],"line":192}},"s":{"0":9,"1":23,"2":15,"3":3,"4":12,"5":9,"6":14,"7":44,"8":9,"9":34,"10":34,"11":34,"12":34,"13":7,"14":7,"15":3,"16":8,"17":7,"18":3,"19":7,"20":10,"21":10,"22":10,"23":10,"24":10,"25":10,"26":22,"27":22,"28":22,"29":14,"30":12,"31":2,"32":8,"33":4,"34":2,"35":4,"36":6,"37":1,"38":27,"39":8,"40":8,"41":8,"42":20,"43":20,"44":19,"45":5,"46":2,"47":5,"48":10,"49":10,"50":10,"51":14,"52":12,"53":2,"54":10,"55":10,"56":6,"57":14,"58":14,"59":13,"60":14,"61":2,"62":1,"63":14,"64":14,"65":24,"66":9,"67":61,"68":9,"69":14,"70":14,"71":9,"72":2,"73":9,"74":4,"75":4,"76":3,"77":3,"78":9,"79":3,"80":9,"81":22,"82":22,"83":13,"84":9,"85":9,"86":9,"87":1,"88":9,"89":11,"90":11,"91":11,"92":6,"93":6,"94":6,"95":6,"96":3,"97":3,"98":3,"99":3,"100":3,"101":5,"102":9,"103":27,"104":2,"105":25,"106":25,"107":25,"108":1,"109":24,"110":17,"111":9,"112":3,"113":3,"114":3},"f":{"0":23,"1":15,"2":14,"3":44,"4":34,"5":3,"6":8,"7":7,"8":10,"9":8,"10":20,"11":2,"12":10,"13":12,"14":13,"15":1,"16":24,"17":61,"18":14,"19":2,"20":4,"21":3,"22":22,"23":1,"24":11,"25":27,"26":3},"b":{"0":[3,12],"1":[34],"2":[34,30],"3":[34,27],"4":[7,27],"5":[1,6],"6":[2,1],"7":[14,8],"8":[12,2],"9":[4,4],"10":[2,2],"11":[1,5],"12":[6,1],"13":[8,19],"14":[5,14],"15":[10,0],"16":[2,10],"17":[4,6],"18":[3,11],"19":[2,12],"20":[0,61],"21":[11,3],"22":[9,5],"23":[3,1],"24":[13,9],"25":[9,0],"26":[6,5],"27":[3,3],"28":[6,3],"29":[3,0],"30":[3,3],"31":[2,25],"32":[1,24],"33":[25,1],"34":[17,7]},"meta":{"lastBranch":35,"lastFunction":27,"lastStatement":115,"seen":{"s:6:27:10:Infinity":0,"f:6:27:6:28":0,"s:7:2:10:Infinity":1,"f:7:2:7:3":1,"b:8:4:8:Infinity:undefined:undefined:undefined:undefined":0,"s:8:4:8:Infinity":2,"s:8:31:8:Infinity":3,"s:9:4:9:Infinity":4,"s:12:27:16:Infinity":5,"f:12:27:12:28":2,"s:13:2:15:Infinity":6,"f:13:35:13:36":3,"s:14:4:14:Infinity":7,"s:20:4:108:Infinity":8,"f:20:4:20:5":4,"s:21:15:21:Infinity":9,"s:22:17:22:Infinity":10,"s:23:67:23:Infinity":11,"b:23:25:23:63":1,"b:23:25:23:46:23:46:23:63":2,"b:23:67:23:80:23:80:23:Infinity":3,"b:25:2:107:Infinity:59:2:107:Infinity":4,"s:25:2:107:Infinity":12,"s:26:16:26:Infinity":13,"s:27:4:34:Infinity":14,"f:27:25:27:31":5,"s:28:26:32:Infinity":15,"f:29:16:29:17":6,"s:29:42:29:52":16,"f:30:13:30:14":7,"s:31:10:31:Infinity":17,"b:31:19:31:43:31:43:31:Infinity":5,"s:33:6:33:Infinity":18,"b:33:28:33:47:33:47:33:61":6,"s:35:4:58:Infinity":19,"f:35:11:35:17":8,"s:36:20:36:Infinity":20,"s:37:25:37:Infinity":21,"s:38:22:38:Infinity":22,"s:39:6:54:Infinity":23,"s:39:19:39:22":24,"s:39:26:39:42":25,"s:40:23:40:Infinity":26,"s:41:28:41:Infinity":27,"b:42:8:53:Infinity:48:15:53:Infinity":7,"s:42:8:53:Infinity":28,"b:43:10:47:Infinity:45:17:47:Infinity":8,"s:43:10:47:Infinity":29,"s:44:12:44:Infinity":30,"s:46:12:46:Infinity":31,"b:49:10:52:Infinity:undefined:undefined:undefined:undefined":9,"s:49:10:52:Infinity":32,"b:50:12:50:Infinity:undefined:undefined:undefined:undefined":10,"s:50:12:50:Infinity":33,"s:50:41:50:Infinity":34,"s:51:12:51:Infinity":35,"b:55:6:57:Infinity:undefined:undefined:undefined:undefined":11,"s:55:6:57:Infinity":36,"b:55:10:55:25:55:25:55:51":12,"s:56:8:56:Infinity":37,"b:59:2:107:Infinity:69:2:107:Infinity":13,"s:59:2:107:Infinity":38,"s:60:4:62:Infinity":39,"f:60:25:60:31":9,"s:61:6:61:Infinity":40,"s:65:4:68:Infinity":41,"f:65:11:65:17":10,"s:66:6:66:Infinity":42,"s:67:6:67:Infinity":43,"b:69:2:107:Infinity:80:9:107:Infinity":14,"s:69:2:107:Infinity":44,"s:70:4:72:Infinity":45,"f:70:25:70:31":11,"s:71:6:71:Infinity":46,"s:74:4:79:Infinity":47,"f:74:11:74:17":12,"s:75:20:75:Infinity":48,"b:76:6:78:Infinity:undefined:undefined:undefined:undefined":15,"s:76:6:78:Infinity":49,"s:77:11:77:Infinity":50,"s:82:25:86:Infinity":51,"f:82:25:82:26":13,"b:83:6:83:Infinity:undefined:undefined:undefined:undefined":16,"s:83:6:83:Infinity":52,"s:83:16:83:Infinity":53,"b:84:6:84:Infinity:undefined:undefined:undefined:undefined":17,"s:84:6:84:Infinity":54,"s:84:18:84:Infinity":55,"s:85:6:85:Infinity":56,"s:88:24:88:Infinity":57,"s:89:52:94:Infinity":58,"b:92:25:92:36:92:36:92:43":18,"f:92:46:92:Infinity":14,"s:93:8:93:Infinity":59,"b:96:4:100:Infinity:undefined:undefined:undefined:undefined":19,"s:96:4:100:Infinity":60,"s:97:6:99:Infinity":61,"f:97:24:97:30":15,"s:98:8:98:Infinity":62,"s:102:4:102:Infinity":63,"s:104:4:106:Infinity":64,"f:104:11:104:17":16,"s:105:6:105:Infinity":65,"s:110:17:110:Infinity":66,"f:110:17:110:18":17,"s:110:31:110:Infinity":67,"b:110:48:110:60:110:60:110:Infinity":20,"s:113:25:119:Infinity":68,"f:113:25:113:Infinity":18,"s:117:14:117:Infinity":69,"b:117:24:117:39:117:39:117:Infinity":21,"s:118:2:118:Infinity":70,"b:118:21:118:31:118:31:118:Infinity":22,"s:121:34:123:Infinity":71,"f:121:34:121:35":19,"s:122:5:122:Infinity":72,"s:125:32:131:Infinity":73,"f:125:32:125:33":20,"s:126:17:126:Infinity":74,"b:127:2:130:Infinity:undefined:undefined:undefined:undefined":23,"s:127:2:130:Infinity":75,"s:128:4:128:Infinity":76,"s:129:4:129:Infinity":77,"s:133:33:138:Infinity":78,"f:133:33:133:Infinity":21,"s:137:2:137:Infinity":79,"s:140:35:151:Infinity":80,"f:140:35:140:Infinity":22,"s:145:16:145:Infinity":81,"b:146:2:150:Infinity:148:2:150:Infinity":24,"s:146:2:150:Infinity":82,"s:147:4:147:Infinity":83,"b:148:2:150:Infinity:undefined:undefined:undefined:undefined":25,"s:148:2:150:Infinity":84,"s:149:4:149:Infinity":85,"s:154:31:154:Infinity":86,"f:154:50:154:51":23,"s:154:67:154:70":87,"s:156:36:177:Infinity":88,"f:156:36:156:Infinity":24,"s:161:21:161:Infinity":89,"s:162:18:162:Infinity":90,"b:163:2:176:Infinity:174:9:176:Infinity":26,"s:163:2:176:Infinity":91,"s:164:25:164:Infinity":92,"s:165:18:165:Infinity":93,"s:166:18:166:Infinity":94,"b:167:4:173:Infinity:169:4:173:Infinity":27,"s:167:4:173:Infinity":95,"b:167:8:167:19:167:19:167:27":28,"s:168:6:168:Infinity":96,"b:169:4:173:Infinity:undefined:undefined:undefined:undefined":29,"s:169:4:173:Infinity":97,"b:169:15:169:27:169:27:169:34":30,"s:170:23:170:Infinity":98,"s:171:6:171:Infinity":99,"s:172:6:172:Infinity":100,"s:175:4:175:Infinity":101,"s:179:31:195:Infinity":102,"f:179:31:179:Infinity":25,"b:184:2:186:Infinity:undefined:undefined:undefined:undefined":31,"s:184:2:186:Infinity":103,"s:185:4:185:Infinity":104,"s:187:17:187:Infinity":105,"s:188:17:188:Infinity":106,"b:189:2:191:Infinity:undefined:undefined:undefined:undefined":32,"s:189:2:191:Infinity":107,"b:189:6:189:39:189:39:189:72":33,"s:190:4:190:Infinity":108,"b:192:2:194:Infinity:undefined:undefined:undefined:undefined":34,"s:192:2:194:Infinity":109,"s:193:4:193:Infinity":110,"s:197:16:201:Infinity":111,"f:197:16:197:17":26,"s:198:12:198:Infinity":112,"s:199:2:199:Infinity":113,"s:200:2:200:Infinity":114}}}
+,"/home/rush/Projects/pocket-vue/src/directives/on.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/on.ts","statementMap":{"0":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"1":{"start":{"line":10,"column":24},"end":{"line":10,"column":null}},"2":{"start":{"line":17,"column":4},"end":{"line":30,"column":null}},"3":{"start":{"line":18,"column":15},"end":{"line":18,"column":null}},"4":{"start":{"line":19,"column":18},"end":{"line":19,"column":null}},"5":{"start":{"line":20,"column":15},"end":{"line":20,"column":null}},"6":{"start":{"line":21,"column":15},"end":{"line":21,"column":null}},"7":{"start":{"line":22,"column":16},"end":{"line":22,"column":null}},"8":{"start":{"line":23,"column":14},"end":{"line":23,"column":null}},"9":{"start":{"line":24,"column":15},"end":{"line":24,"column":null}},"10":{"start":{"line":25,"column":15},"end":{"line":25,"column":null}},"11":{"start":{"line":26,"column":17},"end":{"line":26,"column":null}},"12":{"start":{"line":27,"column":16},"end":{"line":27,"column":null}},"13":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"14":{"start":{"line":29,"column":33},"end":{"line":29,"column":70}},"15":{"start":{"line":32,"column":29},"end":{"line":80,"column":null}},"16":{"start":{"line":33,"column":2},"end":{"line":38,"column":null}},"17":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"18":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"19":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"20":{"start":{"line":40,"column":16},"end":{"line":42,"column":null}},"21":{"start":{"line":45,"column":2},"end":{"line":49,"column":null}},"22":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"23":{"start":{"line":50,"column":2},"end":{"line":55,"column":null}},"24":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"25":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"26":{"start":{"line":53,"column":2},"end":{"line":55,"column":null}},"27":{"start":{"line":54,"column":4},"end":{"line":54,"column":null}},"28":{"start":{"line":54,"column":17},"end":{"line":54,"column":null}},"29":{"start":{"line":57,"column":2},"end":{"line":77,"column":null}},"30":{"start":{"line":59,"column":4},"end":{"line":62,"column":null}},"31":{"start":{"line":60,"column":6},"end":{"line":60,"column":null}},"32":{"start":{"line":60,"column":27},"end":{"line":60,"column":null}},"33":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"34":{"start":{"line":61,"column":28},"end":{"line":61,"column":null}},"35":{"start":{"line":64,"column":16},"end":{"line":64,"column":null}},"36":{"start":{"line":65,"column":4},"end":{"line":76,"column":null}},"37":{"start":{"line":66,"column":6},"end":{"line":68,"column":null}},"38":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"39":{"start":{"line":69,"column":6},"end":{"line":74,"column":null}},"40":{"start":{"line":70,"column":22},"end":{"line":70,"column":null}},"41":{"start":{"line":71,"column":8},"end":{"line":73,"column":null}},"42":{"start":{"line":72,"column":10},"end":{"line":72,"column":null}},"43":{"start":{"line":75,"column":6},"end":{"line":75,"column":null}},"44":{"start":{"line":79,"column":2},"end":{"line":79,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":8},"end":{"line":18,"column":9}},"loc":{"start":{"line":18,"column":15},"end":{"line":18,"column":null}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":11},"end":{"line":19,"column":12}},"loc":{"start":{"line":19,"column":18},"end":{"line":19,"column":null}},"line":19},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":8},"end":{"line":20,"column":9}},"loc":{"start":{"line":20,"column":15},"end":{"line":20,"column":null}},"line":20},"3":{"name":"(anonymous_3)","decl":{"start":{"line":21,"column":8},"end":{"line":21,"column":9}},"loc":{"start":{"line":21,"column":15},"end":{"line":21,"column":null}},"line":21},"4":{"name":"(anonymous_4)","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":10}},"loc":{"start":{"line":22,"column":16},"end":{"line":22,"column":null}},"line":22},"5":{"name":"(anonymous_5)","decl":{"start":{"line":23,"column":7},"end":{"line":23,"column":8}},"loc":{"start":{"line":23,"column":14},"end":{"line":23,"column":null}},"line":23},"6":{"name":"(anonymous_6)","decl":{"start":{"line":24,"column":8},"end":{"line":24,"column":9}},"loc":{"start":{"line":24,"column":15},"end":{"line":24,"column":null}},"line":24},"7":{"name":"(anonymous_7)","decl":{"start":{"line":25,"column":8},"end":{"line":25,"column":9}},"loc":{"start":{"line":25,"column":15},"end":{"line":25,"column":null}},"line":25},"8":{"name":"(anonymous_8)","decl":{"start":{"line":26,"column":10},"end":{"line":26,"column":11}},"loc":{"start":{"line":26,"column":17},"end":{"line":26,"column":null}},"line":26},"9":{"name":"(anonymous_9)","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":10}},"loc":{"start":{"line":27,"column":16},"end":{"line":27,"column":null}},"line":27},"10":{"name":"(anonymous_10)","decl":{"start":{"line":28,"column":9},"end":{"line":28,"column":10}},"loc":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"line":29},"11":{"name":"(anonymous_11)","decl":{"start":{"line":29,"column":25},"end":{"line":29,"column":26}},"loc":{"start":{"line":29,"column":33},"end":{"line":29,"column":70}},"line":29},"12":{"name":"(anonymous_12)","decl":{"start":{"line":32,"column":29},"end":{"line":32,"column":30}},"loc":{"start":{"line":32,"column":67},"end":{"line":80,"column":null}},"line":32},"13":{"name":"(anonymous_13)","decl":{"start":{"line":54,"column":11},"end":{"line":54,"column":17}},"loc":{"start":{"line":54,"column":17},"end":{"line":54,"column":null}},"line":54},"14":{"name":"(anonymous_14)","decl":{"start":{"line":65,"column":14},"end":{"line":65,"column":15}},"loc":{"start":{"line":65,"column":28},"end":{"line":76,"column":null}},"line":65}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":15},"end":{"line":25,"column":null}},"type":"binary-expr","locations":[{"start":{"line":25,"column":15},"end":{"line":25,"column":33}},{"start":{"line":25,"column":33},"end":{"line":25,"column":null}}],"line":25},"1":{"loc":{"start":{"line":26,"column":17},"end":{"line":26,"column":null}},"type":"binary-expr","locations":[{"start":{"line":26,"column":17},"end":{"line":26,"column":35}},{"start":{"line":26,"column":35},"end":{"line":26,"column":null}}],"line":26},"2":{"loc":{"start":{"line":27,"column":16},"end":{"line":27,"column":null}},"type":"binary-expr","locations":[{"start":{"line":27,"column":16},"end":{"line":27,"column":34}},{"start":{"line":27,"column":34},"end":{"line":27,"column":null}}],"line":27},"3":{"loc":{"start":{"line":29,"column":33},"end":{"line":29,"column":70}},"type":"binary-expr","locations":[{"start":{"line":29,"column":33},"end":{"line":29,"column":57}},{"start":{"line":29,"column":57},"end":{"line":29,"column":70}}],"line":29},"4":{"loc":{"start":{"line":33,"column":2},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":33},"5":{"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":34},"6":{"loc":{"start":{"line":40,"column":16},"end":{"line":42,"column":null}},"type":"cond-expr","locations":[{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},{"start":{"line":42,"column":6},"end":{"line":42,"column":null}}],"line":40},"7":{"loc":{"start":{"line":45,"column":2},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":45},"8":{"loc":{"start":{"line":45,"column":6},"end":{"line":45,"column":73}},"type":"binary-expr","locations":[{"start":{"line":45,"column":6},"end":{"line":45,"column":30}},{"start":{"line":45,"column":30},"end":{"line":45,"column":51}},{"start":{"line":45,"column":51},"end":{"line":45,"column":73}}],"line":45},"9":{"loc":{"start":{"line":50,"column":2},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":55,"column":null}},{"start":{"line":53,"column":2},"end":{"line":55,"column":null}}],"line":50},"10":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":53},"11":{"loc":{"start":{"line":57,"column":2},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":77,"column":null}},{"start":{},"end":{}}],"line":57},"12":{"loc":{"start":{"line":59,"column":4},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":59},"13":{"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":null}},{"start":{},"end":{}}],"line":60},"14":{"loc":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},{"start":{},"end":{}}],"line":61},"15":{"loc":{"start":{"line":66,"column":6},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":6},"end":{"line":68,"column":null}},{"start":{},"end":{}}],"line":66},"16":{"loc":{"start":{"line":66,"column":10},"end":{"line":66,"column":77}},"type":"binary-expr","locations":[{"start":{"line":66,"column":10},"end":{"line":66,"column":24}},{"start":{"line":66,"column":24},"end":{"line":66,"column":77}}],"line":66},"17":{"loc":{"start":{"line":71,"column":8},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":73,"column":null}},{"start":{},"end":{}}],"line":71}},"s":{"0":9,"1":9,"2":9,"3":1,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":5,"15":9,"16":33,"17":2,"18":2,"19":2,"20":31,"21":33,"22":2,"23":31,"24":1,"25":1,"26":30,"27":1,"28":1,"29":29,"30":15,"31":14,"32":2,"33":14,"34":2,"35":15,"36":15,"37":23,"38":1,"39":22,"40":22,"41":22,"42":7,"43":15,"44":29},"f":{"0":1,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":5,"12":33,"13":1,"14":23},"b":{"0":[2,2],"1":[2,1],"2":[2,1],"3":[5,1],"4":[2,31],"5":[2,0],"6":[29,2],"7":[2,31],"8":[33,31,30],"9":[1,30],"10":[1,29],"11":[15,14],"12":[14,1],"13":[2,12],"14":[2,12],"15":[1,22],"16":[23,2],"17":[7,15]},"meta":{"lastBranch":18,"lastFunction":15,"lastStatement":45,"seen":{"s:8:2:8:Infinity":0,"s:10:24:10:Infinity":1,"s:17:4:30:Infinity":2,"f:18:8:18:9":0,"s:18:15:18:Infinity":3,"f:19:11:19:12":1,"s:19:18:19:Infinity":4,"f:20:8:20:9":2,"s:20:15:20:Infinity":5,"f:21:8:21:9":3,"s:21:15:21:Infinity":6,"f:22:9:22:10":4,"s:22:16:22:Infinity":7,"f:23:7:23:8":5,"s:23:14:23:Infinity":8,"f:24:8:24:9":6,"s:24:15:24:Infinity":9,"f:25:8:25:9":7,"s:25:15:25:Infinity":10,"b:25:15:25:33:25:33:25:Infinity":0,"f:26:10:26:11":8,"s:26:17:26:Infinity":11,"b:26:17:26:35:26:35:26:Infinity":1,"f:27:9:27:10":9,"s:27:16:27:Infinity":12,"b:27:16:27:34:27:34:27:Infinity":2,"f:28:9:28:10":10,"s:29:4:29:Infinity":13,"f:29:25:29:26":11,"s:29:33:29:70":14,"b:29:33:29:57:29:57:29:70":3,"s:32:29:80:Infinity":15,"f:32:29:32:30":12,"b:33:2:38:Infinity:undefined:undefined:undefined:undefined":4,"s:33:2:38:Infinity":16,"b:34:4:36:Infinity:undefined:undefined:undefined:undefined":5,"s:34:4:36:Infinity":17,"s:35:6:35:Infinity":18,"s:37:4:37:Infinity":19,"s:40:16:42:Infinity":20,"b:41:6:41:Infinity:42:6:42:Infinity":6,"b:45:2:49:Infinity:undefined:undefined:undefined:undefined":7,"s:45:2:49:Infinity":21,"b:45:6:45:30:45:30:45:51:45:51:45:73":8,"s:46:4:48:Infinity":22,"b:50:2:55:Infinity:53:2:55:Infinity":9,"s:50:2:55:Infinity":23,"s:51:4:51:Infinity":24,"s:52:4:52:Infinity":25,"b:53:2:55:Infinity:undefined:undefined:undefined:undefined":10,"s:53:2:55:Infinity":26,"s:54:4:54:Infinity":27,"f:54:11:54:17":13,"s:54:17:54:Infinity":28,"b:57:2:77:Infinity:undefined:undefined:undefined:undefined":11,"s:57:2:77:Infinity":29,"b:59:4:62:Infinity:undefined:undefined:undefined:undefined":12,"s:59:4:62:Infinity":30,"b:60:6:60:Infinity:undefined:undefined:undefined:undefined":13,"s:60:6:60:Infinity":31,"s:60:27:60:Infinity":32,"b:61:6:61:Infinity:undefined:undefined:undefined:undefined":14,"s:61:6:61:Infinity":33,"s:61:28:61:Infinity":34,"s:64:16:64:Infinity":35,"s:65:4:76:Infinity":36,"f:65:14:65:15":14,"b:66:6:68:Infinity:undefined:undefined:undefined:undefined":15,"s:66:6:68:Infinity":37,"b:66:10:66:24:66:24:66:77":16,"s:67:8:67:Infinity":38,"s:69:6:74:Infinity":39,"s:70:22:70:Infinity":40,"b:71:8:73:Infinity:undefined:undefined:undefined:undefined":17,"s:71:8:73:Infinity":41,"s:72:10:72:Infinity":42,"s:75:6:75:Infinity":43,"s:79:2:79:Infinity":44}}}
+,"/home/rush/Projects/pocket-vue/src/directives/ref.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/ref.ts","statementMap":{"0":{"start":{"line":3,"column":30},"end":{"line":28,"column":null}},"1":{"start":{"line":13,"column":2},"end":{"line":24,"column":null}},"2":{"start":{"line":14,"column":14},"end":{"line":14,"column":null}},"3":{"start":{"line":16,"column":4},"end":{"line":18,"column":null}},"4":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"5":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"6":{"start":{"line":20,"column":4},"end":{"line":22,"column":null}},"7":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"8":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"9":{"start":{"line":25,"column":2},"end":{"line":27,"column":null}},"10":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":30},"end":{"line":3,"column":31}},"loc":{"start":{"line":11,"column":6},"end":{"line":28,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":15}},"loc":{"start":{"line":13,"column":15},"end":{"line":24,"column":3}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":15}},"loc":{"start":{"line":25,"column":15},"end":{"line":27,"column":null}},"line":25}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":4},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":18,"column":null}},{"start":{},"end":{}}],"line":16},"1":{"loc":{"start":{"line":16,"column":8},"end":{"line":16,"column":79}},"type":"binary-expr","locations":[{"start":{"line":16,"column":8},"end":{"line":16,"column":29}},{"start":{"line":16,"column":29},"end":{"line":16,"column":36}},{"start":{"line":16,"column":36},"end":{"line":16,"column":59}},{"start":{"line":16,"column":59},"end":{"line":16,"column":79}}],"line":16},"2":{"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":4},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":20},"3":{"loc":{"start":{"line":20,"column":8},"end":{"line":20,"column":36}},"type":"binary-expr","locations":[{"start":{"line":20,"column":8},"end":{"line":20,"column":19}},{"start":{"line":20,"column":19},"end":{"line":20,"column":36}}],"line":20},"4":{"loc":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"type":"binary-expr","locations":[{"start":{"line":26,"column":4},"end":{"line":26,"column":15}},{"start":{"line":26,"column":15},"end":{"line":26,"column":null}}],"line":26}},"s":{"0":9,"1":10,"2":12,"3":12,"4":8,"5":12,"6":12,"7":2,"8":12,"9":10,"10":1},"f":{"0":10,"1":12,"2":1},"b":{"0":[8,4],"1":[12,8,8,8],"2":[2,10],"3":[12,2],"4":[1,1]},"meta":{"lastBranch":5,"lastFunction":3,"lastStatement":11,"seen":{"s:3:30:28:Infinity":0,"f:3:30:3:31":0,"s:13:2:24:Infinity":1,"f:13:9:13:15":1,"s:14:14:14:Infinity":2,"b:16:4:18:Infinity:undefined:undefined:undefined:undefined":0,"s:16:4:18:Infinity":3,"b:16:8:16:29:16:29:16:36:16:36:16:59:16:59:16:79":1,"s:17:6:17:Infinity":4,"s:19:4:19:Infinity":5,"b:20:4:22:Infinity:undefined:undefined:undefined:undefined":2,"s:20:4:22:Infinity":6,"b:20:8:20:19:20:19:20:36":3,"s:21:6:21:Infinity":7,"s:23:4:23:Infinity":8,"s:25:2:27:Infinity":9,"f:25:9:25:15":2,"s:26:4:26:Infinity":10,"b:26:4:26:15:26:15:26:Infinity":4}}}
+,"/home/rush/Projects/pocket-vue/src/directives/show.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/show.ts","statementMap":{"0":{"start":{"line":8,"column":44},"end":{"line":20,"column":null}},"1":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"2":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"3":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"4":{"start":{"line":16,"column":2},"end":{"line":19,"column":null}},"5":{"start":{"line":17,"column":23},"end":{"line":17,"column":null}},"6":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":44},"end":{"line":8,"column":45}},"loc":{"start":{"line":8,"column":69},"end":{"line":20,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":15}},"loc":{"start":{"line":16,"column":15},"end":{"line":19,"column":3}},"line":16}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":14,"column":null}},{"start":{},"end":{}}],"line":12},"1":{"loc":{"start":{"line":13,"column":31},"end":{"line":13,"column":null}},"type":"binary-expr","locations":[{"start":{"line":13,"column":31},"end":{"line":13,"column":51}},{"start":{"line":13,"column":51},"end":{"line":13,"column":null}}],"line":13},"2":{"loc":{"start":{"line":18,"column":23},"end":{"line":18,"column":null}},"type":"cond-expr","locations":[{"start":{"line":18,"column":36},"end":{"line":18,"column":64}},{"start":{"line":18,"column":64},"end":{"line":18,"column":null}}],"line":18}},"s":{"0":9,"1":2,"2":2,"3":2,"4":2,"5":3,"6":3},"f":{"0":2,"1":3},"b":{"0":[2,0],"1":[2,2],"2":[2,1]},"meta":{"lastBranch":3,"lastFunction":2,"lastStatement":7,"seen":{"s:8:44:20:Infinity":0,"f:8:44:8:45":0,"s:11:19:11:Infinity":1,"b:12:2:14:Infinity:undefined:undefined:undefined:undefined":0,"s:12:2:14:Infinity":2,"s:13:4:13:Infinity":3,"b:13:31:13:51:13:51:13:Infinity":1,"s:16:2:19:Infinity":4,"f:16:9:16:15":1,"s:17:23:17:Infinity":5,"s:18:4:18:Infinity":6,"b:18:36:18:64:18:64:18:Infinity":2}}}
+,"/home/rush/Projects/pocket-vue/src/directives/text.ts": {"path":"/home/rush/Projects/pocket-vue/src/directives/text.ts","statementMap":{"0":{"start":{"line":4,"column":47},"end":{"line":8,"column":null}},"1":{"start":{"line":5,"column":2},"end":{"line":7,"column":null}},"2":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}},"3":{"start":{"line":10,"column":31},"end":{"line":21,"column":null}},"4":{"start":{"line":11,"column":0},"end":{"line":21,"column":null}},"5":{"start":{"line":14,"column":0},"end":{"line":18,"column":null}},"6":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":0},"end":{"line":17,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":47},"end":{"line":4,"column":48}},"loc":{"start":{"line":4,"column":72},"end":{"line":8,"column":null}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":15}},"loc":{"start":{"line":5,"column":15},"end":{"line":7,"column":3}},"line":5},"2":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":31},"end":{"line":10,"column":32}},"loc":{"start":{"line":11,"column":0},"end":{"line":21,"column":null}},"line":11},"3":{"name":"(anonymous_3)","decl":{"start":{"line":13,"column":3},"end":{"line":13,"column":9}},"loc":{"start":{"line":13,"column":9},"end":{"line":19,"column":3}},"line":13}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":0},"end":{"line":21,"column":null}},"type":"cond-expr","locations":[{"start":{"line":12,"column":2},"end":{"line":20,"column":null}},{"start":{"line":21,"column":2},"end":{"line":21,"column":null}}],"line":11},"1":{"loc":{"start":{"line":12,"column":2},"end":{"line":20,"column":null}},"type":"cond-expr","locations":[{"start":{"line":12,"column":16},"end":{"line":19,"column":null}},{"start":{"line":20,"column":2},"end":{"line":20,"column":null}}],"line":12}},"s":{"0":9,"1":10103,"2":10124,"3":9,"4":20235,"5":1,"6":1,"7":1},"f":{"0":10103,"1":10124,"2":20235,"3":1},"b":{"0":[20232,3],"1":[1,20231]},"meta":{"lastBranch":2,"lastFunction":4,"lastStatement":8,"seen":{"s:4:47:8:Infinity":0,"f:4:47:4:48":0,"s:5:2:7:Infinity":1,"f:5:9:5:15":1,"s:6:4:6:Infinity":2,"s:10:31:21:Infinity":3,"f:10:31:10:32":2,"s:11:0:21:Infinity":4,"b:12:2:20:Infinity:21:2:21:Infinity":0,"b:12:16:19:Infinity:20:2:20:Infinity":1,"f:13:3:13:9":3,"s:14:0:18:Infinity":5,"s:15:0:15:Infinity":6,"s:17:0:17:Infinity":7}}}
+}
diff --git a/coverage/favicon.png b/coverage/favicon.png
new file mode 100644
index 0000000..c1525b8
Binary files /dev/null and b/coverage/favicon.png differ
diff --git a/coverage/index.html b/coverage/index.html
new file mode 100644
index 0000000..f54464e
--- /dev/null
+++ b/coverage/index.html
@@ -0,0 +1,131 @@
+
+
+
+
+
+ Code coverage report for All files
+
+
+
+
+
+
+
+
+
+
+
+
All files
+
+
+
+ 94.14%
+ Statements
+ 707/751
+
+
+
+
+ 89.38%
+ Branches
+ 404/452
+
+
+
+
+ 86.89%
+ Functions
+ 126/145
+
+
+
+
+ 93.96%
+ Lines
+ 669/712
+
+
+
+
+
+ Press n or j to go to the next uncovered block, b , p or k for the previous block.
+
+
+
+ Filter:
+
+
+
+
+
+
+
+
+
+ File
+
+ Statements
+
+ Branches
+
+ Functions
+
+ Lines
+
+
+
+
+ src
+
+
+
+ 87.24%
+ 294/337
+ 82.05%
+ 160/195
+ 70.76%
+ 46/65
+ 86.72%
+ 281/324
+
+
+
+ src/directives
+
+
+
+ 99.75%
+ 413/414
+ 94.94%
+ 244/257
+ 100%
+ 80/80
+ 100%
+ 388/388
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/coverage/prettify.css b/coverage/prettify.css
new file mode 100644
index 0000000..b317a7c
--- /dev/null
+++ b/coverage/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
diff --git a/coverage/prettify.js b/coverage/prettify.js
new file mode 100644
index 0000000..b322523
--- /dev/null
+++ b/coverage/prettify.js
@@ -0,0 +1,2 @@
+/* eslint-disable */
+window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^
+
+
+
+
+