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..4c54b50 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,25 +1,43 @@
-## [0.4.1](https://github.com/vuejs/petite-vue/compare/v0.4.0...v0.4.1) (2022-01-18)
+## [1.1.2](https://github.com/ws-rush/pocket-vue/compare/v1.1.1...v1.1.2) (2025-09-26)
+
+## [1.1.1](https://github.com/ws-rush/pocket-vue/compare/v1.0.2...v1.1.1) (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.1.0](https://github.com/ws-rush/pocket-vue/compare/v1.0.2...v1.1.0) (2025-09-26)
### 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))
+- 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))
-# [0.4.0](https://github.com/vuejs/petite-vue/compare/v0.3.0...v0.4.0) (2021-12-10)
+## [1.0.2](https://github.com/ws-rush/pocket-vue/compare/v1.0.1...v1.0.2) (2025-09-26)
-### Breaking Changes
+### Bug Fixes
-- require vue: prefix for lifecycle hooks ([a981928](https://github.com/vuejs/petite-vue/commit/a9819283f8504a9c2d0cea4d9d122028eba2d10d))
+- **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))
-# [0.3.0](https://github.com/vuejs/petite-vue/compare/v0.2.3...v0.3.0) (2021-09-14)
+## [1.0.1](https://github.com/ws-rush/pocket-vue/compare/v1.0.0...v1.0.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)
+- package published w/o dist ([27291f0](https://github.com/ws-rush/pocket-vue/commit/27291f048ba2b3deb3842465486a1e310cf027df))
-### Features
+# [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..c6bd0d5 100644
--- a/README.md
+++ b/README.md
@@ -1,44 +1,50 @@
-# 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).
+`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 ~6kb
+- 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.
+- `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
-- 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.
-
-- 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 +54,22 @@ Or, use the ES module build:
```html
```
-### Production CDN URLs
+### CDN Links
-The short CDN URL is meant for prototyping. For production usage, use a fully resolved CDN URL to avoid resolving and redirect cost:
+You can also use the following CDN services:
-- 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 +462,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..4f51c03
--- /dev/null
+++ b/__tests__/directives.test.ts
@@ -0,0 +1,1391 @@
+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");
+ });
+ });
+
+ 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 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();
+ const resolveValue = vi.fn((val) => val);
+
+ handleTextInput(input, assign, resolveValue);
+
+ 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();
+ const resolveValue = vi.fn();
+
+ handleTextInput(input, assign, resolveValue);
+
+ expect(assign).not.toHaveBeenCalled();
+ expect(resolveValue).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 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..3ed930f
--- /dev/null
+++ b/__tests__/eval.test.ts
@@ -0,0 +1,200 @@
+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')
+ })
+})
+
+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()
+ })
+})
\ 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..ebde7ea
--- /dev/null
+++ b/__tests__/scheduler.test.ts
@@ -0,0 +1,152 @@
+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 call setTimeout when nextTick waits for queue to clear', async () => {
+ // Spy on setTimeout
+ const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout')
+
+ try {
+ const job = vi.fn()
+ queueJob(job)
+
+ // Call nextTick without callback
+ const promise = nextTick()
+
+ // Flush microtasks to run checkQueue
+ await Promise.resolve()
+
+ // setTimeout should have been called during the checkQueue process
+ expect(setTimeoutSpy).toHaveBeenCalled()
+
+ // Now run timers to execute flushJobs and checkQueue
+ vi.runAllTimers()
+
+ // flushJobs executes job
+ expect(job).toHaveBeenCalled()
+
+ // Wait for the promise to resolve
+ await promise
+
+ } finally {
+ setTimeoutSpy.mockRestore()
+ }
+ })
+
+ 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()
+ })
+
+
+ })
+})
\ 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..44ad13f
--- /dev/null
+++ b/__tests__/walk.test.ts
@@ -0,0 +1,435 @@
+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 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..93493d8
--- /dev/null
+++ b/coverage/coverage-final.json
@@ -0,0 +1,20 @@
+{"/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":103,"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":102,"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":85,"column":null}},"34":{"start":{"line":79,"column":8},"end":{"line":84,"column":null}},"35":{"start":{"line":87,"column":6},"end":{"line":87,"column":null}},"36":{"start":{"line":87,"column":37},"end":{"line":87,"column":61}},"37":{"start":{"line":88,"column":6},"end":{"line":88,"column":null}},"38":{"start":{"line":92,"column":6},"end":{"line":92,"column":null}},"39":{"start":{"line":92,"column":36},"end":{"line":92,"column":52}},"40":{"start":{"line":96,"column":6},"end":{"line":96,"column":null}},"41":{"start":{"line":100,"column":6},"end":{"line":100,"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":103,"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":89,"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":87,"column":29},"end":{"line":87,"column":30}},"loc":{"start":{"line":87,"column":37},"end":{"line":87,"column":61}},"line":87},"7":{"name":"(anonymous_7)","decl":{"start":{"line":91,"column":4},"end":{"line":91,"column":14}},"loc":{"start":{"line":91,"column":14},"end":{"line":93,"column":null}},"line":91},"8":{"name":"(anonymous_8)","decl":{"start":{"line":92,"column":25},"end":{"line":92,"column":26}},"loc":{"start":{"line":92,"column":36},"end":{"line":92,"column":52}},"line":92},"9":{"name":"(anonymous_9)","decl":{"start":{"line":95,"column":8},"end":{"line":95,"column":21}},"loc":{"start":{"line":95,"column":21},"end":{"line":97,"column":null}},"line":95},"10":{"name":"(anonymous_10)","decl":{"start":{"line":99,"column":8},"end":{"line":99,"column":16}},"loc":{"start":{"line":99,"column":16},"end":{"line":101,"column":null}},"line":99}},"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":85,"column":null}},"type":"if","locations":[{"start":{"line":74,"column":6},"end":{"line":85,"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":113,"4":113,"5":102,"6":102,"7":102,"8":1,"9":1,"10":113,"11":113,"12":113,"13":113,"14":5,"15":3,"16":3,"17":2,"18":3,"19":3,"20":104,"21":4,"22":4,"23":4,"24":1,"25":1,"26":103,"27":104,"28":1,"29":102,"30":6,"31":103,"32":98,"33":103,"34":2,"35":103,"36":104,"37":103,"38":4,"39":4,"40":8,"41":28},"f":{"0":2,"1":113,"2":5,"3":3,"4":104,"5":6,"6":104,"7":4,"8":4,"9":8,"10":28},"b":{"0":[102,11],"1":[1,101],"2":[3,2],"3":[3],"4":[4,100],"5":[1,3],"6":[1,1],"7":[103,2],"8":[1,102],"9":[98,5],"10":[2,101],"11":[103,103,102]},"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:103: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:102: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:85:Infinity:undefined:undefined:undefined:undefined":10,"s:74:6:85:Infinity":33,"b:75:8:75:Infinity:76:8:76:Infinity:77:8:77:Infinity":11,"s:79:8:84:Infinity":34,"s:87:6:87:Infinity":35,"f:87:29:87:30":6,"s:87:37:87:61":36,"s:88:6:88:Infinity":37,"f:91:4:91:14":7,"s:92:6:92:Infinity":38,"f:92:25:92:26":8,"s:92:36:92:52":39,"f:95:8:95:21":9,"s:96:6:96:Infinity":40,"f:99:8:99:16":10,"s:100:6:100: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":66,"column":null}},"14":{"start":{"line":47,"column":6},"end":{"line":63,"column":null}},"15":{"start":{"line":49,"column":32},"end":{"line":49,"column":null}},"16":{"start":{"line":51,"column":8},"end":{"line":56,"column":null}},"17":{"start":{"line":52,"column":10},"end":{"line":52,"column":null}},"18":{"start":{"line":53,"column":10},"end":{"line":53,"column":null}},"19":{"start":{"line":54,"column":10},"end":{"line":54,"column":null}},"20":{"start":{"line":54,"column":33},"end":{"line":54,"column":null}},"21":{"start":{"line":55,"column":10},"end":{"line":55,"column":null}},"22":{"start":{"line":58,"column":8},"end":{"line":58,"column":null}},"23":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"24":{"start":{"line":60,"column":8},"end":{"line":60,"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":65,"column":6},"end":{"line":65,"column":null}},"28":{"start":{"line":70,"column":4},"end":{"line":72,"column":null}},"29":{"start":{"line":71,"column":6},"end":{"line":71,"column":null}},"30":{"start":{"line":73,"column":4},"end":{"line":85,"column":null}},"31":{"start":{"line":74,"column":21},"end":{"line":74,"column":null}},"32":{"start":{"line":75,"column":30},"end":{"line":75,"column":null}},"33":{"start":{"line":77,"column":6},"end":{"line":82,"column":null}},"34":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"35":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"36":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"37":{"start":{"line":80,"column":31},"end":{"line":80,"column":null}},"38":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"39":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"40":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"41":{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},"42":{"start":{"line":91,"column":6},"end":{"line":91,"column":null}},"43":{"start":{"line":93,"column":4},"end":{"line":93,"column":null}},"44":{"start":{"line":94,"column":4},"end":{"line":94,"column":null}},"45":{"start":{"line":94,"column":38},"end":{"line":94,"column":42}}},"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":67,"column":null}},"line":45},"3":{"name":"(anonymous_3)","decl":{"start":{"line":69,"column":2},"end":{"line":69,"column":11}},"loc":{"start":{"line":69,"column":11},"end":{"line":87,"column":null}},"line":69},"4":{"name":"(anonymous_4)","decl":{"start":{"line":89,"column":2},"end":{"line":89,"column":13}},"loc":{"start":{"line":89,"column":13},"end":{"line":95,"column":null}},"line":89},"5":{"name":"(anonymous_5)","decl":{"start":{"line":90,"column":28},"end":{"line":90,"column":29}},"loc":{"start":{"line":90,"column":39},"end":{"line":92,"column":5}},"line":90},"6":{"name":"(anonymous_6)","decl":{"start":{"line":94,"column":30},"end":{"line":94,"column":31}},"loc":{"start":{"line":94,"column":38},"end":{"line":94,"column":42}},"line":94}},"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":66,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":66,"column":null}},{"start":{"line":64,"column":11},"end":{"line":66,"column":null}}],"line":46},"7":{"loc":{"start":{"line":47,"column":6},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":6},"end":{"line":63,"column":null}},{"start":{"line":57,"column":13},"end":{"line":63,"column":null}}],"line":47},"8":{"loc":{"start":{"line":54,"column":10},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":10},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":54},"9":{"loc":{"start":{"line":70,"column":4},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":4},"end":{"line":72,"column":null}},{"start":{},"end":{}}],"line":70},"10":{"loc":{"start":{"line":73,"column":4},"end":{"line":85,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":85,"column":null}},{"start":{"line":83,"column":11},"end":{"line":85,"column":null}}],"line":73},"11":{"loc":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},{"start":{},"end":{}}],"line":80}},"s":{"0":17,"1":10184,"2":10184,"3":106,"4":10078,"5":4,"6":10074,"7":10184,"8":106,"9":10078,"10":10078,"11":10078,"12":10184,"13":10084,"14":4,"15":1,"16":1,"17":3,"18":3,"19":3,"20":1,"21":2,"22":3,"23":3,"24":3,"25":3,"26":3,"27":10080,"28":10,"29":9,"30":10,"31":1,"32":1,"33":1,"34":3,"35":3,"36":3,"37":1,"38":2,"39":9,"40":10,"41":16,"42":1,"43":16,"44":16,"45":3},"f":{"0":17,"1":10184,"2":10084,"3":10,"4":16,"5":1,"6":3},"b":{"0":[17,17],"1":[10184],"2":[106,10078],"3":[4,10074],"4":[106,10078],"5":[10084],"6":[4,10080],"7":[1,3],"8":[1,2],"9":[9,1],"10":[1,9],"11":[1,2]},"meta":{"lastBranch":12,"lastFunction":7,"lastStatement":46,"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:66:Infinity:64:11:66:Infinity":6,"s:46:4:66:Infinity":13,"b:47:6:63:Infinity:57:13:63:Infinity":7,"s:47:6:63:Infinity":14,"s:49:32:49:Infinity":15,"s:51:8:56:Infinity":16,"s:52:10:52:Infinity":17,"s:53:10:53:Infinity":18,"b:54:10:54:Infinity:undefined:undefined:undefined:undefined":8,"s:54:10:54:Infinity":19,"s:54:33:54:Infinity":20,"s:55:10:55:Infinity":21,"s:58:8:58:Infinity":22,"s:59:8:59:Infinity":23,"s:60:8:60:Infinity":24,"s:61:8:61:Infinity":25,"s:62:8:62:Infinity":26,"s:65:6:65:Infinity":27,"f:69:2:69:11":3,"b:70:4:72:Infinity:undefined:undefined:undefined:undefined":9,"s:70:4:72:Infinity":28,"s:71:6:71:Infinity":29,"b:73:4:85:Infinity:83:11:85:Infinity":10,"s:73:4:85:Infinity":30,"s:74:21:74:Infinity":31,"s:75:30:75:Infinity":32,"s:77:6:82:Infinity":33,"s:78:8:78:Infinity":34,"s:79:8:79:Infinity":35,"b:80:8:80:Infinity:undefined:undefined:undefined:undefined":11,"s:80:8:80:Infinity":36,"s:80:31:80:Infinity":37,"s:81:8:81:Infinity":38,"s:84:6:84:Infinity":39,"s:86:4:86:Infinity":40,"f:89:2:89:13":4,"s:90:4:92:Infinity":41,"f:90:28:90:29":5,"s:91:6:91:Infinity":42,"s:93:4:93:Infinity":43,"s:94:4:94:Infinity":44,"f:94:30:94:31":6,"s:94:38:94:42":45}}}
+,"/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":10267,"2":10206,"3":1,"4":1,"5":10205,"6":1081,"7":10205,"8":10205,"9":10267,"10":9,"11":10099,"12":10099,"13":10099,"14":10099,"15":10099,"16":53,"17":1,"18":52,"19":10099,"20":10099,"21":9,"22":10204,"23":20333,"24":14},"f":{"0":10267,"1":10206,"2":1081,"3":10099,"4":53,"5":10204},"b":{"0":[10079,188],"1":[10079,188],"2":[1,10205],"3":[10099],"4":[1,52],"5":[53,48],"6":[14,20319]},"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/eval.ts": {"path":"/home/rush/Projects/pocket-vue/src/eval.ts","statementMap":{"0":{"start":{"line":1,"column":44},"end":{"line":1,"column":null}},"1":{"start":{"line":3,"column":24},"end":{"line":9,"column":null}},"2":{"start":{"line":4,"column":2},"end":{"line":8,"column":null}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":null}},"4":{"start":{"line":11,"column":23},"end":{"line":18,"column":null}},"5":{"start":{"line":12,"column":13},"end":{"line":12,"column":null}},"6":{"start":{"line":13,"column":2},"end":{"line":17,"column":null}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"8":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"9":{"start":{"line":20,"column":19},"end":{"line":27,"column":null}},"10":{"start":{"line":21,"column":2},"end":{"line":26,"column":null}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"12":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"13":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":24},"end":{"line":3,"column":25}},"loc":{"start":{"line":3,"column":70},"end":{"line":9,"column":null}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":23},"end":{"line":11,"column":24}},"loc":{"start":{"line":11,"column":63},"end":{"line":18,"column":null}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":19},"end":{"line":20,"column":20}},"loc":{"start":{"line":20,"column":46},"end":{"line":27,"column":null}},"line":20},"3":{"name":"(anonymous_3)","decl":{"start":{"line":25,"column":11},"end":{"line":25,"column":17}},"loc":{"start":{"line":25,"column":17},"end":{"line":25,"column":null}},"line":25}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":13},"end":{"line":12,"column":null}},"type":"binary-expr","locations":[{"start":{"line":12,"column":13},"end":{"line":12,"column":32}},{"start":{"line":12,"column":32},"end":{"line":12,"column":null}}],"line":12}},"s":{"0":10,"1":10,"2":10470,"3":10470,"4":10,"5":10,"6":10,"7":10,"8":1,"9":10,"10":7,"11":7,"12":1,"13":1},"f":{"0":10470,"1":10,"2":7,"3":1},"b":{"0":[10,7]},"meta":{"lastBranch":1,"lastFunction":4,"lastStatement":14,"seen":{"s:1:44:1:Infinity":0,"s:3:24:9:Infinity":1,"f:3:24:3:25":0,"s:4:2:8:Infinity":2,"s:5:4:5:Infinity":3,"s:11:23:18:Infinity":4,"f:11:23:11:24":1,"s:12:13:12:Infinity":5,"b:12:13:12:32:12:32:12:Infinity":0,"s:13:2:17:Infinity":6,"s:14:4:14:Infinity":7,"s:16:4:16:Infinity":8,"s:20:19:27:Infinity":9,"f:20:19:20:20":2,"s:21:2:26:Infinity":10,"s:22:4:22:Infinity":11,"s:24:4:24:Infinity":12,"s:25:4:25:Infinity":13,"f:25:11:25:17":3}}}
+,"/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},"1":{"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":35}},"type":"binary-expr","locations":[{"start":{"line":9,"column":6},"end":{"line":9,"column":11}},{"start":{"line":9,"column":11},"end":{"line":9,"column":35}}],"line":9}},"s":{"0":2,"1":4,"2":4,"3":1,"4":2},"f":{"0":4},"b":{"0":[1,3],"1":[4,2]},"meta":{"lastBranch":2,"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,"b:9:6:9:11:9:11:9:35":1,"s:10:4:10:Infinity":3,"s:14:0:14:Infinity":4}}}
+,"/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":3,"column":10},"end":{"line":3,"column":null}},"3":{"start":{"line":5,"column":24},"end":{"line":23,"column":null}},"4":{"start":{"line":6,"column":2},"end":{"line":22,"column":null}},"5":{"start":{"line":7,"column":4},"end":{"line":7,"column":null}},"6":{"start":{"line":9,"column":4},"end":{"line":21,"column":null}},"7":{"start":{"line":11,"column":6},"end":{"line":20,"column":null}},"8":{"start":{"line":12,"column":27},"end":{"line":18,"column":null}},"9":{"start":{"line":13,"column":10},"end":{"line":17,"column":null}},"10":{"start":{"line":14,"column":12},"end":{"line":14,"column":null}},"11":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"12":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"13":{"start":{"line":25,"column":24},"end":{"line":31,"column":null}},"14":{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},"15":{"start":{"line":26,"column":28},"end":{"line":26,"column":null}},"16":{"start":{"line":27,"column":2},"end":{"line":30,"column":null}},"17":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"18":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"19":{"start":{"line":33,"column":18},"end":{"line":39,"column":null}},"20":{"start":{"line":34,"column":2},"end":{"line":36,"column":null}},"21":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"22":{"start":{"line":37,"column":2},"end":{"line":37,"column":null}},"23":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":24},"end":{"line":5,"column":25}},"loc":{"start":{"line":5,"column":45},"end":{"line":23,"column":null}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":18},"end":{"line":9,"column":24}},"loc":{"start":{"line":9,"column":24},"end":{"line":21,"column":5}},"line":9},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":25},"end":{"line":11,"column":36}},"loc":{"start":{"line":11,"column":36},"end":{"line":20,"column":7}},"line":11},"3":{"name":"(anonymous_3)","decl":{"start":{"line":12,"column":27},"end":{"line":12,"column":33}},"loc":{"start":{"line":12,"column":33},"end":{"line":18,"column":null}},"line":12},"4":{"name":"(anonymous_4)","decl":{"start":{"line":25,"column":24},"end":{"line":25,"column":25}},"loc":{"start":{"line":25,"column":43},"end":{"line":31,"column":null}},"line":25},"5":{"name":"(anonymous_5)","decl":{"start":{"line":33,"column":18},"end":{"line":33,"column":24}},"loc":{"start":{"line":33,"column":24},"end":{"line":39,"column":null}},"line":33}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":2},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":22,"column":null}},{"start":{"line":8,"column":9},"end":{"line":22,"column":null}}],"line":6},"1":{"loc":{"start":{"line":13,"column":10},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":13,"column":10},"end":{"line":17,"column":null}},{"start":{"line":15,"column":17},"end":{"line":17,"column":null}}],"line":13},"2":{"loc":{"start":{"line":13,"column":14},"end":{"line":13,"column":45}},"type":"binary-expr","locations":[{"start":{"line":13,"column":14},"end":{"line":13,"column":36}},{"start":{"line":13,"column":36},"end":{"line":13,"column":45}}],"line":13},"3":{"loc":{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":26},"4":{"loc":{"start":{"line":27,"column":2},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":27}},"s":{"0":10,"1":10,"2":10,"3":10,"4":68,"5":8,"6":60,"7":60,"8":60,"9":107,"10":60,"11":47,"12":60,"13":10,"14":1095,"15":89,"16":1095,"17":53,"18":53,"19":10,"20":53,"21":89,"22":53,"23":53},"f":{"0":68,"1":60,"2":60,"3":107,"4":1095,"5":53},"b":{"0":[8,60],"1":[60,47],"2":[107,60],"3":[89,1006],"4":[53,1042]},"meta":{"lastBranch":5,"lastFunction":6,"lastStatement":24,"seen":{"s:1:13:1:Infinity":0,"s:2:26:2:Infinity":1,"s:3:10:3:Infinity":2,"s:5:24:23:Infinity":3,"f:5:24:5:25":0,"b:6:2:22:Infinity:8:9:22:Infinity":0,"s:6:2:22:Infinity":4,"s:7:4:7:Infinity":5,"s:9:4:21:Infinity":6,"f:9:18:9:24":1,"s:11:6:20:Infinity":7,"f:11:25:11:36":2,"s:12:27:18:Infinity":8,"f:12:27:12:33":3,"b:13:10:17:Infinity:15:17:17:Infinity":1,"s:13:10:17:Infinity":9,"b:13:14:13:36:13:36:13:45":2,"s:14:12:14:Infinity":10,"s:16:12:16:Infinity":11,"s:19:8:19:Infinity":12,"s:25:24:31:Infinity":13,"f:25:24:25:25":4,"b:26:2:26:Infinity:undefined:undefined:undefined:undefined":3,"s:26:2:26:Infinity":14,"s:26:28:26:Infinity":15,"b:27:2:30:Infinity:undefined:undefined:undefined:undefined":4,"s:27:2:30:Infinity":16,"s:28:4:28:Infinity":17,"s:29:4:29:Infinity":18,"s:33:18:39:Infinity":19,"f:33:18:33:24":5,"s:34:2:36:Infinity":20,"s:35:4:35:Infinity":21,"s:37:2:37:Infinity":22,"s:38:2:38:Infinity":23}}}
+,"/home/rush/Projects/pocket-vue/src/utils.ts": {"path":"/home/rush/Projects/pocket-vue/src/utils.ts","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":5,"column":null}},"1":{"start":{"line":2,"column":14},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"3":{"start":{"line":3,"column":19},"end":{"line":3,"column":null}},"4":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"5":{"start":{"line":7,"column":22},"end":{"line":14,"column":null}},"6":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":71},"end":{"line":5,"column":null}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":22},"end":{"line":7,"column":null}},"loc":{"start":{"line":12,"column":5},"end":{"line":14,"column":null}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"type":"if","locations":[{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},{"start":{},"end":{}}],"line":3}},"s":{"0":10,"1":62567,"2":62567,"3":57,"4":62567,"5":10,"6":91},"f":{"0":62567,"1":91},"b":{"0":[57,62510]},"meta":{"lastBranch":1,"lastFunction":2,"lastStatement":7,"seen":{"s:1:25:5:Infinity":0,"f:1:25:1:26":0,"s:2:14:2:Infinity":1,"b:3:2:3:Infinity:undefined:undefined:undefined:undefined":0,"s:3:2:3:Infinity":2,"s:3:19:3:Infinity":3,"s:4:2:4:Infinity":4,"s:7:22:14:Infinity":5,"f:7:22:7:Infinity":1,"s:13:2:13:Infinity":6}}}
+,"/home/rush/Projects/pocket-vue/src/walk.ts": {"path":"/home/rush/Projects/pocket-vue/src/walk.ts","statementMap":{"0":{"start":{"line":12,"column":14},"end":{"line":12,"column":null}},"1":{"start":{"line":13,"column":19},"end":{"line":13,"column":null}},"2":{"start":{"line":15,"column":20},"end":{"line":15,"column":null}},"3":{"start":{"line":17,"column":20},"end":{"line":111,"column":null}},"4":{"start":{"line":18,"column":20},"end":{"line":18,"column":null}},"5":{"start":{"line":19,"column":15},"end":{"line":19,"column":null}},"6":{"start":{"line":20,"column":2},"end":{"line":110,"column":null}},"7":{"start":{"line":22,"column":15},"end":{"line":22,"column":null}},"8":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"9":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"10":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"11":{"start":{"line":32,"column":4},"end":{"line":34,"column":null}},"12":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"13":{"start":{"line":37,"column":4},"end":{"line":39,"column":null}},"14":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"15":{"start":{"line":42,"column":4},"end":{"line":49,"column":null}},"16":{"start":{"line":43,"column":20},"end":{"line":43,"column":null}},"17":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"18":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"19":{"start":{"line":46,"column":6},"end":{"line":48,"column":null}},"20":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"21":{"start":{"line":52,"column":21},"end":{"line":52,"column":null}},"22":{"start":{"line":53,"column":4},"end":{"line":55,"column":null}},"23":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"24":{"start":{"line":58,"column":4},"end":{"line":63,"column":null}},"25":{"start":{"line":59,"column":6},"end":{"line":61,"column":null}},"26":{"start":{"line":60,"column":7},"end":{"line":60,"column":null}},"27":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"28":{"start":{"line":66,"column":4},"end":{"line":66,"column":null}},"29":{"start":{"line":69,"column":41},"end":{"line":69,"column":null}},"30":{"start":{"line":70,"column":4},"end":{"line":82,"column":null}},"31":{"start":{"line":71,"column":6},"end":{"line":81,"column":null}},"32":{"start":{"line":72,"column":8},"end":{"line":80,"column":null}},"33":{"start":{"line":75,"column":10},"end":{"line":75,"column":null}},"34":{"start":{"line":76,"column":8},"end":{"line":80,"column":null}},"35":{"start":{"line":77,"column":10},"end":{"line":77,"column":null}},"36":{"start":{"line":79,"column":10},"end":{"line":79,"column":null}},"37":{"start":{"line":83,"column":4},"end":{"line":85,"column":null}},"38":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"39":{"start":{"line":87,"column":4},"end":{"line":89,"column":null}},"40":{"start":{"line":88,"column":6},"end":{"line":88,"column":null}},"41":{"start":{"line":90,"column":2},"end":{"line":110,"column":null}},"42":{"start":{"line":92,"column":18},"end":{"line":92,"column":null}},"43":{"start":{"line":93,"column":4},"end":{"line":107,"column":null}},"44":{"start":{"line":94,"column":31},"end":{"line":94,"column":null}},"45":{"start":{"line":95,"column":22},"end":{"line":95,"column":null}},"46":{"start":{"line":97,"column":6},"end":{"line":102,"column":null}},"47":{"start":{"line":98,"column":24},"end":{"line":98,"column":null}},"48":{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},"49":{"start":{"line":99,"column":21},"end":{"line":99,"column":null}},"50":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"51":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"52":{"start":{"line":103,"column":6},"end":{"line":105,"column":null}},"53":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"54":{"start":{"line":106,"column":6},"end":{"line":106,"column":null}},"55":{"start":{"line":108,"column":2},"end":{"line":110,"column":null}},"56":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"57":{"start":{"line":113,"column":21},"end":{"line":118,"column":null}},"58":{"start":{"line":114,"column":14},"end":{"line":114,"column":null}},"59":{"start":{"line":115,"column":2},"end":{"line":117,"column":null}},"60":{"start":{"line":116,"column":4},"end":{"line":116,"column":null}},"61":{"start":{"line":120,"column":25},"end":{"line":155,"column":null}},"62":{"start":{"line":131,"column":2},"end":{"line":134,"column":null}},"63":{"start":{"line":132,"column":5},"end":{"line":132,"column":null}},"64":{"start":{"line":133,"column":4},"end":{"line":133,"column":null}},"65":{"start":{"line":136,"column":2},"end":{"line":147,"column":null}},"66":{"start":{"line":137,"column":4},"end":{"line":137,"column":null}},"67":{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},"68":{"start":{"line":139,"column":2},"end":{"line":147,"column":null}},"69":{"start":{"line":140,"column":4},"end":{"line":140,"column":null}},"70":{"start":{"line":141,"column":4},"end":{"line":141,"column":null}},"71":{"start":{"line":143,"column":21},"end":{"line":143,"column":null}},"72":{"start":{"line":144,"column":20},"end":{"line":144,"column":null}},"73":{"start":{"line":145,"column":4},"end":{"line":145,"column":null}},"74":{"start":{"line":146,"column":4},"end":{"line":146,"column":null}},"75":{"start":{"line":148,"column":2},"end":{"line":154,"column":null}},"76":{"start":{"line":149,"column":4},"end":{"line":149,"column":null}},"77":{"start":{"line":149,"column":39},"end":{"line":149,"column":null}},"78":{"start":{"line":150,"column":4},"end":{"line":150,"column":null}},"79":{"start":{"line":151,"column":4},"end":{"line":151,"column":null}},"80":{"start":{"line":152,"column":2},"end":{"line":154,"column":null}},"81":{"start":{"line":153,"column":4},"end":{"line":153,"column":null}},"82":{"start":{"line":157,"column":23},"end":{"line":178,"column":null}},"83":{"start":{"line":165,"column":14},"end":{"line":165,"column":null}},"84":{"start":{"line":165,"column":27},"end":{"line":165,"column":null}},"85":{"start":{"line":166,"column":18},"end":{"line":174,"column":null}},"86":{"start":{"line":175,"column":2},"end":{"line":177,"column":null}},"87":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"88":{"start":{"line":180,"column":24},"end":{"line":194,"column":null}},"89":{"start":{"line":181,"column":0},"end":{"line":192,"column":null}},"90":{"start":{"line":182,"column":19},"end":{"line":182,"column":null}},"91":{"start":{"line":183,"column":0},"end":{"line":187,"column":null}},"92":{"start":{"line":184,"column":0},"end":{"line":186,"column":null}},"93":{"start":{"line":188,"column":0},"end":{"line":190,"column":null}},"94":{"start":{"line":189,"column":2},"end":{"line":189,"column":null}},"95":{"start":{"line":191,"column":2},"end":{"line":191,"column":null}},"96":{"start":{"line":193,"column":2},"end":{"line":193,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":20},"end":{"line":17,"column":21}},"loc":{"start":{"line":17,"column":75},"end":{"line":111,"column":null}},"line":17},"1":{"name":"(anonymous_1)","decl":{"start":{"line":113,"column":21},"end":{"line":113,"column":22}},"loc":{"start":{"line":113,"column":73},"end":{"line":118,"column":null}},"line":113},"2":{"name":"(anonymous_2)","decl":{"start":{"line":120,"column":25},"end":{"line":120,"column":null}},"loc":{"start":{"line":125,"column":5},"end":{"line":155,"column":null}},"line":125},"3":{"name":"(anonymous_3)","decl":{"start":{"line":131,"column":32},"end":{"line":131,"column":33}},"loc":{"start":{"line":131,"column":42},"end":{"line":134,"column":3}},"line":131},"4":{"name":"(anonymous_4)","decl":{"start":{"line":157,"column":23},"end":{"line":157,"column":null}},"loc":{"start":{"line":164,"column":5},"end":{"line":178,"column":null}},"line":164},"5":{"name":"(anonymous_5)","decl":{"start":{"line":165,"column":14},"end":{"line":165,"column":15}},"loc":{"start":{"line":165,"column":27},"end":{"line":165,"column":null}},"line":165},"6":{"name":"(anonymous_6)","decl":{"start":{"line":180,"column":24},"end":{"line":180,"column":25}},"loc":{"start":{"line":180,"column":59},"end":{"line":194,"column":null}},"line":180}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":2},"end":{"line":110,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":110,"column":null}},{"start":{"line":90,"column":2},"end":{"line":110,"column":null}}],"line":20},"1":{"loc":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":23},"2":{"loc":{"start":{"line":32,"column":4},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":34,"column":null}},{"start":{},"end":{}}],"line":32},"3":{"loc":{"start":{"line":37,"column":4},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":37},"4":{"loc":{"start":{"line":42,"column":4},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":42},"5":{"loc":{"start":{"line":42,"column":4},"end":{"line":42,"column":56}},"type":"binary-expr","locations":[{"start":{"line":42,"column":9},"end":{"line":42,"column":44}},{"start":{"line":42,"column":44},"end":{"line":42,"column":56}}],"line":42},"6":{"loc":{"start":{"line":43,"column":20},"end":{"line":43,"column":null}},"type":"cond-expr","locations":[{"start":{"line":43,"column":26},"end":{"line":43,"column":57}},{"start":{"line":43,"column":57},"end":{"line":43,"column":null}}],"line":43},"7":{"loc":{"start":{"line":46,"column":6},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":6},"end":{"line":48,"column":null}},{"start":{},"end":{}}],"line":46},"8":{"loc":{"start":{"line":53,"column":4},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":53},"9":{"loc":{"start":{"line":58,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":4},"end":{"line":63,"column":null}},{"start":{},"end":{}}],"line":58},"10":{"loc":{"start":{"line":59,"column":6},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":6},"end":{"line":61,"column":null}},{"start":{},"end":{}}],"line":59},"11":{"loc":{"start":{"line":71,"column":6},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":6},"end":{"line":81,"column":null}},{"start":{},"end":{}}],"line":71},"12":{"loc":{"start":{"line":71,"column":10},"end":{"line":71,"column":50}},"type":"binary-expr","locations":[{"start":{"line":71,"column":10},"end":{"line":71,"column":30}},{"start":{"line":71,"column":30},"end":{"line":71,"column":50}}],"line":71},"13":{"loc":{"start":{"line":72,"column":8},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":80,"column":null}},{"start":{"line":76,"column":8},"end":{"line":80,"column":null}}],"line":72},"14":{"loc":{"start":{"line":76,"column":8},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":80,"column":null}},{"start":{"line":78,"column":15},"end":{"line":80,"column":null}}],"line":76},"15":{"loc":{"start":{"line":76,"column":19},"end":{"line":76,"column":60}},"type":"binary-expr","locations":[{"start":{"line":76,"column":19},"end":{"line":76,"column":38}},{"start":{"line":76,"column":38},"end":{"line":76,"column":60}}],"line":76},"16":{"loc":{"start":{"line":87,"column":4},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":4},"end":{"line":89,"column":null}},{"start":{},"end":{}}],"line":87},"17":{"loc":{"start":{"line":90,"column":2},"end":{"line":110,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":2},"end":{"line":110,"column":null}},{"start":{"line":108,"column":2},"end":{"line":110,"column":null}}],"line":90},"18":{"loc":{"start":{"line":93,"column":4},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":93,"column":4},"end":{"line":107,"column":null}},{"start":{},"end":{}}],"line":93},"19":{"loc":{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},{"start":{},"end":{}}],"line":99},"20":{"loc":{"start":{"line":103,"column":6},"end":{"line":105,"column":null}},"type":"if","locations":[{"start":{"line":103,"column":6},"end":{"line":105,"column":null}},{"start":{},"end":{}}],"line":103},"21":{"loc":{"start":{"line":108,"column":2},"end":{"line":110,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":110,"column":null}},{"start":{},"end":{}}],"line":108},"22":{"loc":{"start":{"line":116,"column":12},"end":{"line":116,"column":null}},"type":"binary-expr","locations":[{"start":{"line":116,"column":12},"end":{"line":116,"column":32}},{"start":{"line":116,"column":32},"end":{"line":116,"column":null}}],"line":116},"23":{"loc":{"start":{"line":132,"column":6},"end":{"line":132,"column":37}},"type":"binary-expr","locations":[{"start":{"line":132,"column":6},"end":{"line":132,"column":20}},{"start":{"line":132,"column":20},"end":{"line":132,"column":37}}],"line":132},"24":{"loc":{"start":{"line":136,"column":2},"end":{"line":147,"column":null}},"type":"if","locations":[{"start":{"line":136,"column":2},"end":{"line":147,"column":null}},{"start":{"line":139,"column":2},"end":{"line":147,"column":null}}],"line":136},"25":{"loc":{"start":{"line":139,"column":2},"end":{"line":147,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":2},"end":{"line":147,"column":null}},{"start":{"line":142,"column":9},"end":{"line":147,"column":null}}],"line":139},"26":{"loc":{"start":{"line":144,"column":20},"end":{"line":144,"column":null}},"type":"cond-expr","locations":[{"start":{"line":144,"column":35},"end":{"line":144,"column":60}},{"start":{"line":144,"column":60},"end":{"line":144,"column":null}}],"line":144},"27":{"loc":{"start":{"line":145,"column":10},"end":{"line":145,"column":null}},"type":"binary-expr","locations":[{"start":{"line":145,"column":10},"end":{"line":145,"column":40}},{"start":{"line":145,"column":40},"end":{"line":145,"column":null}}],"line":145},"28":{"loc":{"start":{"line":146,"column":10},"end":{"line":146,"column":null}},"type":"cond-expr","locations":[{"start":{"line":146,"column":25},"end":{"line":146,"column":51}},{"start":{"line":146,"column":51},"end":{"line":146,"column":null}}],"line":146},"29":{"loc":{"start":{"line":148,"column":2},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":2},"end":{"line":154,"column":null}},{"start":{"line":152,"column":2},"end":{"line":154,"column":null}}],"line":148},"30":{"loc":{"start":{"line":149,"column":4},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":149,"column":4},"end":{"line":149,"column":null}},{"start":{},"end":{}}],"line":149},"31":{"loc":{"start":{"line":149,"column":8},"end":{"line":149,"column":39}},"type":"binary-expr","locations":[{"start":{"line":149,"column":8},"end":{"line":149,"column":24}},{"start":{"line":149,"column":24},"end":{"line":149,"column":39}}],"line":149},"32":{"loc":{"start":{"line":152,"column":2},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":154,"column":null}},{"start":{},"end":{}}],"line":152},"33":{"loc":{"start":{"line":165,"column":15},"end":{"line":165,"column":27}},"type":"default-arg","locations":[{"start":{"line":165,"column":19},"end":{"line":165,"column":27}}],"line":165},"34":{"loc":{"start":{"line":172,"column":8},"end":{"line":172,"column":null}},"type":"binary-expr","locations":[{"start":{"line":172,"column":8},"end":{"line":172,"column":29}},{"start":{"line":172,"column":29},"end":{"line":172,"column":null}}],"line":172},"35":{"loc":{"start":{"line":173,"column":8},"end":{"line":173,"column":null}},"type":"binary-expr","locations":[{"start":{"line":173,"column":8},"end":{"line":173,"column":21}},{"start":{"line":173,"column":21},"end":{"line":173,"column":null}}],"line":173},"36":{"loc":{"start":{"line":175,"column":2},"end":{"line":177,"column":null}},"type":"if","locations":[{"start":{"line":175,"column":2},"end":{"line":177,"column":null}},{"start":{},"end":{}}],"line":175},"37":{"loc":{"start":{"line":181,"column":0},"end":{"line":192,"column":null}},"type":"if","locations":[{"start":{"line":181,"column":0},"end":{"line":192,"column":null}},{"start":{},"end":{}}],"line":181},"38":{"loc":{"start":{"line":183,"column":0},"end":{"line":187,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":0},"end":{"line":187,"column":null}},{"start":{},"end":{}}],"line":183},"39":{"loc":{"start":{"line":183,"column":4},"end":{"line":183,"column":40}},"type":"binary-expr","locations":[{"start":{"line":183,"column":4},"end":{"line":183,"column":27}},{"start":{"line":183,"column":27},"end":{"line":183,"column":40}}],"line":183},"40":{"loc":{"start":{"line":188,"column":0},"end":{"line":190,"column":null}},"type":"if","locations":[{"start":{"line":188,"column":0},"end":{"line":190,"column":null}},{"start":{},"end":{}}],"line":188}},"s":{"0":9,"1":9,"2":9,"3":9,"4":20748,"5":20748,"6":20748,"7":10445,"8":10445,"9":1,"10":10444,"11":10444,"12":7,"13":10437,"14":26,"15":10411,"16":16,"17":16,"18":16,"19":16,"20":3,"21":10411,"22":10411,"23":1,"24":10411,"25":2,"26":1,"27":2,"28":10411,"29":10411,"30":10411,"31":189,"32":89,"33":26,"34":63,"35":11,"36":52,"37":10411,"38":37,"39":10411,"40":1,"41":10303,"42":10298,"43":10298,"44":10094,"45":10094,"46":10094,"47":10116,"48":10116,"49":53,"50":10116,"51":10116,"52":10094,"53":33,"54":10094,"55":5,"56":5,"57":9,"58":10416,"59":10416,"60":10531,"61":9,"62":89,"63":8,"64":8,"65":89,"66":24,"67":24,"68":65,"69":10,"70":10,"71":55,"72":55,"73":55,"74":55,"75":89,"76":88,"77":1,"78":88,"79":88,"80":1,"81":1,"82":9,"83":10185,"84":10296,"85":10185,"86":10185,"87":9,"88":9,"89":3,"90":2,"91":2,"92":1,"93":2,"94":1,"95":2,"96":1},"f":{"0":20748,"1":10416,"2":89,"3":8,"4":10185,"5":10296,"6":3},"b":{"0":[10445,10303],"1":[1,10444],"2":[7,10437],"3":[26,10411],"4":[16,10395],"5":[10411,10405],"6":[6,10],"7":[3,13],"8":[1,10410],"9":[2,10409],"10":[1,1],"11":[89,100],"12":[189,89],"13":[26,63],"14":[11,52],"15":[63,53],"16":[1,10410],"17":[10298,5],"18":[10094,204],"19":[53,10063],"20":[33,10061],"21":[5,0],"22":[10531,10514],"23":[8,8],"24":[24,65],"25":[10,55],"26":[4,51],"27":[55,2],"28":[4,51],"29":[88,1],"30":[1,87],"31":[88,28],"32":[1,0],"33":[10296],"34":[10185,38],"35":[10185,8],"36":[9,10176],"37":[2,1],"38":[1,1],"39":[2,2],"40":[1,1]},"meta":{"lastBranch":41,"lastFunction":7,"lastStatement":97,"seen":{"s:12:14:12:Infinity":0,"s:13:19:13:Infinity":1,"s:15:20:15:Infinity":2,"s:17:20:111:Infinity":3,"f:17:20:17:21":0,"s:18:20:18:Infinity":4,"s:19:15:19:Infinity":5,"b:20:2:110:Infinity:90:2:110:Infinity":0,"s:20:2:110:Infinity":6,"s:22:15:22:Infinity":7,"b:23:4:25:Infinity:undefined:undefined:undefined:undefined":1,"s:23:4:25:Infinity":8,"s:24:6:24:Infinity":9,"s:27:4:27:Infinity":10,"b:32:4:34:Infinity:undefined:undefined:undefined:undefined":2,"s:32:4:34:Infinity":11,"s:33:6:33:Infinity":12,"b:37:4:39:Infinity:undefined:undefined:undefined:undefined":3,"s:37:4:39:Infinity":13,"s:38:6:38:Infinity":14,"b:42:4:49:Infinity:undefined:undefined:undefined:undefined":4,"s:42:4:49:Infinity":15,"b:42:9:42:44:42:44:42:56":5,"s:43:20:43:Infinity":16,"b:43:26:43:57:43:57:43:Infinity":6,"s:44:6:44:Infinity":17,"s:45:6:45:Infinity":18,"b:46:6:48:Infinity:undefined:undefined:undefined:undefined":7,"s:46:6:48:Infinity":19,"s:47:8:47:Infinity":20,"s:52:21:52:Infinity":21,"b:53:4:55:Infinity:undefined:undefined:undefined:undefined":8,"s:53:4:55:Infinity":22,"s:54:6:54:Infinity":23,"b:58:4:63:Infinity:undefined:undefined:undefined:undefined":9,"s:58:4:63:Infinity":24,"b:59:6:61:Infinity:undefined:undefined:undefined:undefined":10,"s:59:6:61:Infinity":25,"s:60:7:60:Infinity":26,"s:62:6:62:Infinity":27,"s:66:4:66:Infinity":28,"s:69:41:69:Infinity":29,"s:70:4:82:Infinity":30,"b:71:6:81:Infinity:undefined:undefined:undefined:undefined":11,"s:71:6:81:Infinity":31,"b:71:10:71:30:71:30:71:50":12,"b:72:8:80:Infinity:76:8:80:Infinity":13,"s:72:8:80:Infinity":32,"s:75:10:75:Infinity":33,"b:76:8:80:Infinity:78:15:80:Infinity":14,"s:76:8:80:Infinity":34,"b:76:19:76:38:76:38:76:60":15,"s:77:10:77:Infinity":35,"s:79:10:79:Infinity":36,"s:83:4:85:Infinity":37,"s:84:6:84:Infinity":38,"b:87:4:89:Infinity:undefined:undefined:undefined:undefined":16,"s:87:4:89:Infinity":39,"s:88:6:88:Infinity":40,"b:90:2:110:Infinity:108:2:110:Infinity":17,"s:90:2:110:Infinity":41,"s:92:18:92:Infinity":42,"b:93:4:107:Infinity:undefined:undefined:undefined:undefined":18,"s:93:4:107:Infinity":43,"s:94:31:94:Infinity":44,"s:95:22:95:Infinity":45,"s:97:6:102:Infinity":46,"s:98:24:98:Infinity":47,"b:99:8:99:Infinity:undefined:undefined:undefined:undefined":19,"s:99:8:99:Infinity":48,"s:99:21:99:Infinity":49,"s:100:8:100:Infinity":50,"s:101:8:101:Infinity":51,"b:103:6:105:Infinity:undefined:undefined:undefined:undefined":20,"s:103:6:105:Infinity":52,"s:104:8:104:Infinity":53,"s:106:6:106:Infinity":54,"b:108:2:110:Infinity:undefined:undefined:undefined:undefined":21,"s:108:2:110:Infinity":55,"s:109:4:109:Infinity":56,"s:113:21:118:Infinity":57,"f:113:21:113:22":1,"s:114:14:114:Infinity":58,"s:115:2:117:Infinity":59,"s:116:4:116:Infinity":60,"b:116:12:116:32:116:32:116:Infinity":22,"s:120:25:155:Infinity":61,"f:120:25:120:Infinity":2,"s:131:2:134:Infinity":62,"f:131:32:131:33":3,"s:132:5:132:Infinity":63,"b:132:6:132:20:132:20:132:37":23,"s:133:4:133:Infinity":64,"b:136:2:147:Infinity:139:2:147:Infinity":24,"s:136:2:147:Infinity":65,"s:137:4:137:Infinity":66,"s:138:4:138:Infinity":67,"b:139:2:147:Infinity:142:9:147:Infinity":25,"s:139:2:147:Infinity":68,"s:140:4:140:Infinity":69,"s:141:4:141:Infinity":70,"s:143:21:143:Infinity":71,"s:144:20:144:Infinity":72,"b:144:35:144:60:144:60:144:Infinity":26,"s:145:4:145:Infinity":73,"b:145:10:145:40:145:40:145:Infinity":27,"s:146:4:146:Infinity":74,"b:146:25:146:51:146:51:146:Infinity":28,"b:148:2:154:Infinity:152:2:154:Infinity":29,"s:148:2:154:Infinity":75,"b:149:4:149:Infinity:undefined:undefined:undefined:undefined":30,"s:149:4:149:Infinity":76,"b:149:8:149:24:149:24:149:39":31,"s:149:39:149:Infinity":77,"s:150:4:150:Infinity":78,"s:151:4:151:Infinity":79,"b:152:2:154:Infinity:undefined:undefined:undefined:undefined":32,"s:152:2:154:Infinity":80,"s:153:4:153:Infinity":81,"s:157:23:178:Infinity":82,"f:157:23:157:Infinity":4,"s:165:14:165:Infinity":83,"f:165:14:165:15":5,"s:165:27:165:Infinity":84,"b:165:19:165:27":33,"s:166:18:174:Infinity":85,"b:172:8:172:29:172:29:172:Infinity":34,"b:173:8:173:21:173:21:173:Infinity":35,"b:175:2:177:Infinity:undefined:undefined:undefined:undefined":36,"s:175:2:177:Infinity":86,"s:176:4:176:Infinity":87,"s:180:24:194:Infinity":88,"f:180:24:180:25":6,"b:181:0:192:Infinity:undefined:undefined:undefined:undefined":37,"s:181:0:192:Infinity":89,"s:182:19:182:Infinity":90,"b:183:0:187:Infinity:undefined:undefined:undefined:undefined":38,"s:183:0:187:Infinity":91,"b:183:4:183:27:183:27:183:40":39,"s:184:0:186:Infinity":92,"b:188:0:190:Infinity:undefined:undefined:undefined:undefined":40,"s:188:0:190:Infinity":93,"s:189:2:189:Infinity":94,"s:191:2:191:Infinity":95,"s:193:2:193: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":11,"column":20},"end":{"line":11,"column":null}},"1":{"start":{"line":13,"column":62},"end":{"line":46,"column":null}},"2":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"3":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"4":{"start":{"line":27,"column":2},"end":{"line":45,"column":null}},"5":{"start":{"line":28,"column":16},"end":{"line":28,"column":null}},"6":{"start":{"line":29,"column":4},"end":{"line":43,"column":null}},"7":{"start":{"line":30,"column":6},"end":{"line":32,"column":null}},"8":{"start":{"line":31,"column":8},"end":{"line":31,"column":null}},"9":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"10":{"start":{"line":35,"column":6},"end":{"line":37,"column":null}},"11":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"12":{"start":{"line":38,"column":6},"end":{"line":42,"column":null}},"13":{"start":{"line":39,"column":8},"end":{"line":41,"column":null}},"14":{"start":{"line":40,"column":10},"end":{"line":40,"column":null}},"15":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"16":{"start":{"line":48,"column":16},"end":{"line":115,"column":null}},"17":{"start":{"line":55,"column":20},"end":{"line":55,"column":null}},"18":{"start":{"line":57,"column":2},"end":{"line":114,"column":null}},"19":{"start":{"line":58,"column":21},"end":{"line":58,"column":null}},"20":{"start":{"line":59,"column":4},"end":{"line":59,"column":null}},"21":{"start":{"line":60,"column":2},"end":{"line":114,"column":null}},"22":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}},"23":{"start":{"line":62,"column":4},"end":{"line":77,"column":null}},"24":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"25":{"start":{"line":64,"column":4},"end":{"line":77,"column":null}},"26":{"start":{"line":65,"column":6},"end":{"line":65,"column":null}},"27":{"start":{"line":65,"column":31},"end":{"line":65,"column":null}},"28":{"start":{"line":67,"column":6},"end":{"line":69,"column":null}},"29":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"30":{"start":{"line":70,"column":6},"end":{"line":76,"column":null}},"31":{"start":{"line":71,"column":8},"end":{"line":75,"column":null}},"32":{"start":{"line":72,"column":10},"end":{"line":74,"column":null}},"33":{"start":{"line":73,"column":12},"end":{"line":73,"column":null}},"34":{"start":{"line":78,"column":2},"end":{"line":114,"column":null}},"35":{"start":{"line":86,"column":4},"end":{"line":99,"column":null}},"36":{"start":{"line":87,"column":6},"end":{"line":91,"column":null}},"37":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"38":{"start":{"line":90,"column":8},"end":{"line":90,"column":null}},"39":{"start":{"line":94,"column":6},"end":{"line":94,"column":null}},"40":{"start":{"line":95,"column":6},"end":{"line":98,"column":null}},"41":{"start":{"line":97,"column":8},"end":{"line":97,"column":null}},"42":{"start":{"line":105,"column":4},"end":{"line":113,"column":null}},"43":{"start":{"line":106,"column":7},"end":{"line":106,"column":null}},"44":{"start":{"line":107,"column":4},"end":{"line":113,"column":null}},"45":{"start":{"line":108,"column":7},"end":{"line":108,"column":null}},"46":{"start":{"line":109,"column":4},"end":{"line":113,"column":null}},"47":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"48":{"start":{"line":112,"column":6},"end":{"line":112,"column":null}},"49":{"start":{"line":117,"column":20},"end":{"line":117,"column":null}},"50":{"start":{"line":119,"column":17},"end":{"line":143,"column":null}},"51":{"start":{"line":124,"column":2},"end":{"line":142,"column":null}},"52":{"start":{"line":125,"column":4},"end":{"line":125,"column":null}},"53":{"start":{"line":125,"column":23},"end":{"line":125,"column":47}},"54":{"start":{"line":127,"column":4},"end":{"line":141,"column":null}},"55":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"56":{"start":{"line":131,"column":6},"end":{"line":140,"column":null}},"57":{"start":{"line":133,"column":8},"end":{"line":137,"column":null}},"58":{"start":{"line":139,"column":8},"end":{"line":139,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":62},"end":{"line":13,"column":63}},"loc":{"start":{"line":19,"column":6},"end":{"line":46,"column":null}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":15}},"loc":{"start":{"line":27,"column":15},"end":{"line":45,"column":3}},"line":27},"2":{"name":"(anonymous_2)","decl":{"start":{"line":48,"column":16},"end":{"line":48,"column":null}},"loc":{"start":{"line":54,"column":5},"end":{"line":115,"column":null}},"line":54},"3":{"name":"(anonymous_3)","decl":{"start":{"line":119,"column":17},"end":{"line":119,"column":null}},"loc":{"start":{"line":123,"column":5},"end":{"line":143,"column":null}},"line":123},"4":{"name":"(anonymous_4)","decl":{"start":{"line":125,"column":16},"end":{"line":125,"column":17}},"loc":{"start":{"line":125,"column":23},"end":{"line":125,"column":47}},"line":125}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":23},"1":{"loc":{"start":{"line":29,"column":4},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":43,"column":null}},{"start":{"line":34,"column":11},"end":{"line":43,"column":null}}],"line":29},"2":{"loc":{"start":{"line":30,"column":6},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":6},"end":{"line":32,"column":null}},{"start":{},"end":{}}],"line":30},"3":{"loc":{"start":{"line":36,"column":37},"end":{"line":36,"column":64}},"type":"binary-expr","locations":[{"start":{"line":36,"column":37},"end":{"line":36,"column":50}},{"start":{"line":36,"column":50},"end":{"line":36,"column":64}}],"line":36},"4":{"loc":{"start":{"line":39,"column":8},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":8},"end":{"line":41,"column":null}},{"start":{},"end":{}}],"line":39},"5":{"loc":{"start":{"line":39,"column":12},"end":{"line":39,"column":39}},"type":"binary-expr","locations":[{"start":{"line":39,"column":12},"end":{"line":39,"column":22}},{"start":{"line":39,"column":22},"end":{"line":39,"column":39}}],"line":39},"6":{"loc":{"start":{"line":57,"column":2},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":114,"column":null}},{"start":{"line":60,"column":2},"end":{"line":114,"column":null}}],"line":57},"7":{"loc":{"start":{"line":58,"column":21},"end":{"line":58,"column":null}},"type":"binary-expr","locations":[{"start":{"line":58,"column":21},"end":{"line":58,"column":79}},{"start":{"line":58,"column":79},"end":{"line":58,"column":null}}],"line":58},"8":{"loc":{"start":{"line":58,"column":36},"end":{"line":58,"column":74}},"type":"cond-expr","locations":[{"start":{"line":58,"column":48},"end":{"line":58,"column":69}},{"start":{"line":58,"column":69},"end":{"line":58,"column":74}}],"line":58},"9":{"loc":{"start":{"line":60,"column":2},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":114,"column":null}},{"start":{"line":78,"column":2},"end":{"line":114,"column":null}}],"line":60},"10":{"loc":{"start":{"line":62,"column":4},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":77,"column":null}},{"start":{"line":64,"column":4},"end":{"line":77,"column":null}}],"line":62},"11":{"loc":{"start":{"line":64,"column":4},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":4},"end":{"line":77,"column":null}},{"start":{"line":66,"column":11},"end":{"line":77,"column":null}}],"line":64},"12":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":null}},{"start":{},"end":{}}],"line":65},"13":{"loc":{"start":{"line":70,"column":6},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":6},"end":{"line":76,"column":null}},{"start":{},"end":{}}],"line":70},"14":{"loc":{"start":{"line":70,"column":10},"end":{"line":70,"column":45}},"type":"binary-expr","locations":[{"start":{"line":70,"column":10},"end":{"line":70,"column":23}},{"start":{"line":70,"column":23},"end":{"line":70,"column":45}}],"line":70},"15":{"loc":{"start":{"line":72,"column":10},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":10},"end":{"line":74,"column":null}},{"start":{},"end":{}}],"line":72},"16":{"loc":{"start":{"line":78,"column":2},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":2},"end":{"line":114,"column":null}},{"start":{"line":100,"column":9},"end":{"line":114,"column":null}}],"line":78},"17":{"loc":{"start":{"line":79,"column":4},"end":{"line":83,"column":null}},"type":"binary-expr","locations":[{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},{"start":{"line":81,"column":4},"end":{"line":81,"column":null}},{"start":{"line":82,"column":5},"end":{"line":82,"column":18}},{"start":{"line":82,"column":18},"end":{"line":82,"column":null}},{"start":{"line":83,"column":4},"end":{"line":83,"column":null}}],"line":79},"18":{"loc":{"start":{"line":86,"column":4},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":86,"column":4},"end":{"line":99,"column":null}},{"start":{"line":92,"column":11},"end":{"line":99,"column":null}}],"line":86},"19":{"loc":{"start":{"line":86,"column":8},"end":{"line":86,"column":76}},"type":"binary-expr","locations":[{"start":{"line":86,"column":8},"end":{"line":86,"column":24}},{"start":{"line":86,"column":24},"end":{"line":86,"column":43}},{"start":{"line":86,"column":43},"end":{"line":86,"column":61}},{"start":{"line":86,"column":61},"end":{"line":86,"column":76}}],"line":86},"20":{"loc":{"start":{"line":87,"column":6},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":91,"column":null}},{"start":{"line":89,"column":13},"end":{"line":91,"column":null}}],"line":87},"21":{"loc":{"start":{"line":95,"column":6},"end":{"line":98,"column":null}},"type":"if","locations":[{"start":{"line":95,"column":6},"end":{"line":98,"column":null}},{"start":{},"end":{}}],"line":95},"22":{"loc":{"start":{"line":105,"column":4},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":4},"end":{"line":113,"column":null}},{"start":{"line":107,"column":4},"end":{"line":113,"column":null}}],"line":105},"23":{"loc":{"start":{"line":107,"column":4},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":113,"column":null}},{"start":{"line":109,"column":4},"end":{"line":113,"column":null}}],"line":107},"24":{"loc":{"start":{"line":109,"column":4},"end":{"line":113,"column":null}},"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":113,"column":null}},{"start":{"line":111,"column":11},"end":{"line":113,"column":null}}],"line":109},"25":{"loc":{"start":{"line":124,"column":2},"end":{"line":142,"column":null}},"type":"if","locations":[{"start":{"line":124,"column":2},"end":{"line":142,"column":null}},{"start":{"line":126,"column":9},"end":{"line":142,"column":null}}],"line":124},"26":{"loc":{"start":{"line":127,"column":4},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":127,"column":4},"end":{"line":141,"column":null}},{"start":{"line":130,"column":11},"end":{"line":141,"column":null}}],"line":127},"27":{"loc":{"start":{"line":131,"column":6},"end":{"line":140,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":6},"end":{"line":140,"column":null}},{"start":{"line":138,"column":13},"end":{"line":140,"column":null}}],"line":131}},"s":{"0":9,"1":9,"2":27,"3":3,"4":27,"5":38,"6":38,"7":36,"8":1,"9":36,"10":2,"11":4,"12":2,"13":2,"14":0,"15":38,"16":9,"17":40,"18":40,"19":4,"20":4,"21":36,"22":9,"23":9,"24":1,"25":8,"26":3,"27":3,"28":5,"29":6,"30":5,"31":1,"32":2,"33":1,"34":27,"35":13,"36":9,"37":1,"38":8,"39":4,"40":4,"41":2,"42":14,"43":1,"44":13,"45":1,"46":12,"47":11,"48":1,"49":9,"50":9,"51":9,"52":1,"53":2,"54":8,"55":1,"56":7,"57":1,"58":6},"f":{"0":27,"1":38,"2":40,"3":9,"4":2},"b":{"0":[3,24],"1":[36,2],"2":[1,35],"3":[4,2],"4":[0,2],"5":[2,2],"6":[4,36],"7":[4,0],"8":[2,2],"9":[9,27],"10":[1,8],"11":[3,5],"12":[3,0],"13":[1,4],"14":[5,1],"15":[1,1],"16":[13,14],"17":[27,27,27,27,15,13],"18":[9,4],"19":[13,4,4,4],"20":[1,8],"21":[2,2],"22":[1,13],"23":[1,12],"24":[11,1],"25":[1,8],"26":[1,7],"27":[1,6]},"meta":{"lastBranch":28,"lastFunction":5,"lastStatement":59,"seen":{"s:11:20:11:Infinity":0,"s:13:62:46:Infinity":1,"f:13:62:13:63":0,"b:23:2:25:Infinity:undefined:undefined:undefined:undefined":0,"s:23:2:25:Infinity":2,"s:24:4:24:Infinity":3,"s:27:2:45:Infinity":4,"f:27:9:27:15":1,"s:28:16:28:Infinity":5,"b:29:4:43:Infinity:34:11:43:Infinity":1,"s:29:4:43:Infinity":6,"b:30:6:32:Infinity:undefined:undefined:undefined:undefined":2,"s:30:6:32:Infinity":7,"s:31:8:31:Infinity":8,"s:33:6:33:Infinity":9,"s:35:6:37:Infinity":10,"s:36:8:36:Infinity":11,"b:36:37:36:50:36:50:36:64":3,"s:38:6:42:Infinity":12,"b:39:8:41:Infinity:undefined:undefined:undefined:undefined":4,"s:39:8:41:Infinity":13,"b:39:12:39:22:39:22:39:39":5,"s:40:10:40:Infinity":14,"s:44:4:44:Infinity":15,"s:48:16:115:Infinity":16,"f:48:16:48:Infinity":2,"s:55:20:55:Infinity":17,"b:57:2:114:Infinity:60:2:114:Infinity":6,"s:57:2:114:Infinity":18,"s:58:21:58:Infinity":19,"b:58:21:58:79:58:79:58:Infinity":7,"b:58:48:58:69:58:69:58:74":8,"s:59:4:59:Infinity":20,"b:60:2:114:Infinity:78:2:114:Infinity":9,"s:60:2:114:Infinity":21,"s:61:4:61:Infinity":22,"b:62:4:77:Infinity:64:4:77:Infinity":10,"s:62:4:77:Infinity":23,"s:63:6:63:Infinity":24,"b:64:4:77:Infinity:66:11:77:Infinity":11,"s:64:4:77:Infinity":25,"b:65:6:65:Infinity:undefined:undefined:undefined:undefined":12,"s:65:6:65:Infinity":26,"s:65:31:65:Infinity":27,"s:67:6:69:Infinity":28,"s:68:8:68:Infinity":29,"b:70:6:76:Infinity:undefined:undefined:undefined:undefined":13,"s:70:6:76:Infinity":30,"b:70:10:70:23:70:23:70:45":14,"s:71:8:75:Infinity":31,"b:72:10:74:Infinity:undefined:undefined:undefined:undefined":15,"s:72:10:74:Infinity":32,"s:73:12:73:Infinity":33,"b:78:2:114:Infinity:100:9:114:Infinity":16,"s:78:2:114:Infinity":34,"b:79:4:79:Infinity:80:4:80:Infinity:81:4:81:Infinity:82:5:82:18:82:18:82:Infinity:83:4:83:Infinity":17,"b:86:4:99:Infinity:92:11:99:Infinity":18,"s:86:4:99:Infinity":35,"b:86:8:86:24:86:24:86:43:86:43:86:61:86:61:86:76":19,"b:87:6:91:Infinity:89:13:91:Infinity":20,"s:87:6:91:Infinity":36,"s:88:8:88:Infinity":37,"s:90:8:90:Infinity":38,"s:94:6:94:Infinity":39,"b:95:6:98:Infinity:undefined:undefined:undefined:undefined":21,"s:95:6:98:Infinity":40,"s:97:8:97:Infinity":41,"b:105:4:113:Infinity:107:4:113:Infinity":22,"s:105:4:113:Infinity":42,"s:106:7:106:Infinity":43,"b:107:4:113:Infinity:109:4:113:Infinity":23,"s:107:4:113:Infinity":44,"s:108:7:108:Infinity":45,"b:109:4:113:Infinity:111:11:113:Infinity":24,"s:109:4:113:Infinity":46,"s:110:6:110:Infinity":47,"s:112:6:112:Infinity":48,"s:117:20:117:Infinity":49,"s:119:17:143:Infinity":50,"f:119:17:119:Infinity":3,"b:124:2:142:Infinity:126:9:142:Infinity":25,"s:124:2:142:Infinity":51,"s:125:4:125:Infinity":52,"f:125:16:125:17":4,"s:125:23:125:47":53,"b:127:4:141:Infinity:130:11:141:Infinity":26,"s:127:4:141:Infinity":54,"s:129:6:129:Infinity":55,"b:131:6:140:Infinity:138:13:140:Infinity":27,"s:131:6:140:Infinity":56,"s:133:8:137:Infinity":57,"s:139:8:139:Infinity":58}}}
+,"/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":6,"column":19},"end":{"line":6,"column":null}},"1":{"start":{"line":7,"column":22},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":22},"end":{"line":8,"column":null}},"3":{"start":{"line":9,"column":22},"end":{"line":9,"column":null}},"4":{"start":{"line":13,"column":28},"end":{"line":62,"column":null}},"5":{"start":{"line":24,"column":2},"end":{"line":28,"column":null}},"6":{"start":{"line":24,"column":15},"end":{"line":24,"column":18}},"7":{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},"8":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"9":{"start":{"line":30,"column":30},"end":{"line":30,"column":null}},"10":{"start":{"line":31,"column":10},"end":{"line":31,"column":null}},"11":{"start":{"line":34,"column":2},"end":{"line":60,"column":null}},"12":{"start":{"line":35,"column":21},"end":{"line":35,"column":null}},"13":{"start":{"line":36,"column":21},"end":{"line":36,"column":null}},"14":{"start":{"line":38,"column":4},"end":{"line":58,"column":null}},"15":{"start":{"line":40,"column":6},"end":{"line":40,"column":null}},"16":{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},"17":{"start":{"line":42,"column":6},"end":{"line":42,"column":null}},"18":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"19":{"start":{"line":46,"column":6},"end":{"line":46,"column":null}},"20":{"start":{"line":47,"column":6},"end":{"line":57,"column":null}},"21":{"start":{"line":49,"column":8},"end":{"line":56,"column":null}},"22":{"start":{"line":54,"column":10},"end":{"line":54,"column":null}},"23":{"start":{"line":55,"column":10},"end":{"line":55,"column":null}},"24":{"start":{"line":59,"column":4},"end":{"line":59,"column":null}},"25":{"start":{"line":61,"column":2},"end":{"line":61,"column":null}},"26":{"start":{"line":64,"column":20},"end":{"line":183,"column":null}},"27":{"start":{"line":65,"column":18},"end":{"line":65,"column":null}},"28":{"start":{"line":66,"column":2},"end":{"line":69,"column":null}},"29":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"30":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"31":{"start":{"line":71,"column":19},"end":{"line":71,"column":null}},"32":{"start":{"line":73,"column":17},"end":{"line":73,"column":null}},"33":{"start":{"line":74,"column":17},"end":{"line":74,"column":null}},"34":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},"35":{"start":{"line":76,"column":2},"end":{"line":76,"column":null}},"36":{"start":{"line":78,"column":20},"end":{"line":78,"column":null}},"37":{"start":{"line":79,"column":17},"end":{"line":79,"column":null}},"38":{"start":{"line":81,"column":27},"end":{"line":81,"column":null}},"39":{"start":{"line":85,"column":16},"end":{"line":85,"column":null}},"40":{"start":{"line":87,"column":4},"end":{"line":89,"column":null}},"41":{"start":{"line":90,"column":2},"end":{"line":93,"column":null}},"42":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"43":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"44":{"start":{"line":92,"column":27},"end":{"line":92,"column":null}},"45":{"start":{"line":96,"column":2},"end":{"line":102,"column":null}},"46":{"start":{"line":97,"column":4},"end":{"line":97,"column":null}},"47":{"start":{"line":98,"column":4},"end":{"line":98,"column":null}},"48":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"49":{"start":{"line":100,"column":6},"end":{"line":100,"column":null}},"50":{"start":{"line":104,"column":2},"end":{"line":107,"column":null}},"51":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"52":{"start":{"line":105,"column":57},"end":{"line":105,"column":65}},"53":{"start":{"line":106,"column":4},"end":{"line":106,"column":null}},"54":{"start":{"line":109,"column":16},"end":{"line":109,"column":null}},"55":{"start":{"line":114,"column":30},"end":{"line":134,"column":null}},"56":{"start":{"line":115,"column":31},"end":{"line":115,"column":null}},"57":{"start":{"line":116,"column":28},"end":{"line":116,"column":null}},"58":{"start":{"line":118,"column":4},"end":{"line":131,"column":null}},"59":{"start":{"line":119,"column":6},"end":{"line":121,"column":null}},"60":{"start":{"line":119,"column":19},"end":{"line":119,"column":22}},"61":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"62":{"start":{"line":122,"column":4},"end":{"line":131,"column":null}},"63":{"start":{"line":123,"column":6},"end":{"line":125,"column":null}},"64":{"start":{"line":123,"column":19},"end":{"line":123,"column":22}},"65":{"start":{"line":124,"column":8},"end":{"line":124,"column":null}},"66":{"start":{"line":126,"column":4},"end":{"line":131,"column":null}},"67":{"start":{"line":127,"column":14},"end":{"line":127,"column":null}},"68":{"start":{"line":128,"column":6},"end":{"line":130,"column":null}},"69":{"start":{"line":129,"column":8},"end":{"line":129,"column":null}},"70":{"start":{"line":133,"column":4},"end":{"line":133,"column":null}},"71":{"start":{"line":136,"column":29},"end":{"line":161,"column":null}},"72":{"start":{"line":142,"column":22},"end":{"line":142,"column":null}},"73":{"start":{"line":143,"column":4},"end":{"line":149,"column":null}},"74":{"start":{"line":144,"column":6},"end":{"line":146,"column":null}},"75":{"start":{"line":145,"column":19},"end":{"line":145,"column":null}},"76":{"start":{"line":148,"column":6},"end":{"line":148,"column":null}},"77":{"start":{"line":150,"column":4},"end":{"line":155,"column":null}},"78":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"79":{"start":{"line":152,"column":6},"end":{"line":152,"column":null}},"80":{"start":{"line":154,"column":6},"end":{"line":154,"column":null}},"81":{"start":{"line":156,"column":21},"end":{"line":156,"column":null}},"82":{"start":{"line":157,"column":16},"end":{"line":157,"column":null}},"83":{"start":{"line":158,"column":4},"end":{"line":158,"column":null}},"84":{"start":{"line":159,"column":4},"end":{"line":159,"column":null}},"85":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"86":{"start":{"line":163,"column":21},"end":{"line":168,"column":null}},"87":{"start":{"line":164,"column":18},"end":{"line":164,"column":null}},"88":{"start":{"line":165,"column":4},"end":{"line":165,"column":null}},"89":{"start":{"line":166,"column":4},"end":{"line":166,"column":null}},"90":{"start":{"line":167,"column":4},"end":{"line":167,"column":null}},"91":{"start":{"line":170,"column":2},"end":{"line":180,"column":null}},"92":{"start":{"line":171,"column":19},"end":{"line":171,"column":null}},"93":{"start":{"line":172,"column":30},"end":{"line":172,"column":null}},"94":{"start":{"line":173,"column":5},"end":{"line":173,"column":null}},"95":{"start":{"line":174,"column":4},"end":{"line":179,"column":null}},"96":{"start":{"line":175,"column":6},"end":{"line":175,"column":null}},"97":{"start":{"line":175,"column":36},"end":{"line":175,"column":57}},"98":{"start":{"line":176,"column":6},"end":{"line":176,"column":null}},"99":{"start":{"line":178,"column":6},"end":{"line":178,"column":null}},"100":{"start":{"line":182,"column":2},"end":{"line":182,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"loc":{"start":{"line":22,"column":14},"end":{"line":62,"column":null}},"line":22},"1":{"name":"(anonymous_1)","decl":{"start":{"line":64,"column":20},"end":{"line":64,"column":21}},"loc":{"start":{"line":64,"column":64},"end":{"line":183,"column":null}},"line":64},"2":{"name":"(anonymous_2)","decl":{"start":{"line":105,"column":50},"end":{"line":105,"column":51}},"loc":{"start":{"line":105,"column":57},"end":{"line":105,"column":65}},"line":105},"3":{"name":"(anonymous_3)","decl":{"start":{"line":114,"column":30},"end":{"line":114,"column":31}},"loc":{"start":{"line":114,"column":79},"end":{"line":134,"column":null}},"line":114},"4":{"name":"(anonymous_4)","decl":{"start":{"line":136,"column":29},"end":{"line":136,"column":null}},"loc":{"start":{"line":141,"column":16},"end":{"line":161,"column":null}},"line":141},"5":{"name":"(anonymous_5)","decl":{"start":{"line":145,"column":8},"end":{"line":145,"column":9}},"loc":{"start":{"line":145,"column":19},"end":{"line":145,"column":null}},"line":145},"6":{"name":"(anonymous_6)","decl":{"start":{"line":163,"column":21},"end":{"line":163,"column":22}},"loc":{"start":{"line":163,"column":50},"end":{"line":168,"column":null}},"line":163},"7":{"name":"(anonymous_7)","decl":{"start":{"line":170,"column":13},"end":{"line":170,"column":19}},"loc":{"start":{"line":170,"column":19},"end":{"line":180,"column":3}},"line":170},"8":{"name":"(anonymous_8)","decl":{"start":{"line":175,"column":29},"end":{"line":175,"column":30}},"loc":{"start":{"line":175,"column":36},"end":{"line":175,"column":57}},"line":175}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":null}},{"start":{},"end":{}}],"line":25},"1":{"loc":{"start":{"line":38,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":58,"column":null}},{"start":{"line":43,"column":11},"end":{"line":58,"column":null}}],"line":38},"2":{"loc":{"start":{"line":42,"column":27},"end":{"line":42,"column":60}},"type":"cond-expr","locations":[{"start":{"line":42,"column":39},"end":{"line":42,"column":54}},{"start":{"line":42,"column":54},"end":{"line":42,"column":60}}],"line":42},"3":{"loc":{"start":{"line":47,"column":6},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":6},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":47},"4":{"loc":{"start":{"line":49,"column":8},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":8},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":49},"5":{"loc":{"start":{"line":50,"column":10},"end":{"line":52,"column":null}},"type":"binary-expr","locations":[{"start":{"line":50,"column":10},"end":{"line":50,"column":null}},{"start":{"line":52,"column":10},"end":{"line":52,"column":null}}],"line":50},"6":{"loc":{"start":{"line":55,"column":31},"end":{"line":55,"column":64}},"type":"cond-expr","locations":[{"start":{"line":55,"column":43},"end":{"line":55,"column":58}},{"start":{"line":55,"column":58},"end":{"line":55,"column":64}}],"line":55},"7":{"loc":{"start":{"line":66,"column":2},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":2},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":66},"8":{"loc":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"type":"binary-expr","locations":[{"start":{"line":67,"column":4},"end":{"line":67,"column":27}},{"start":{"line":67,"column":27},"end":{"line":67,"column":null}}],"line":67},"9":{"loc":{"start":{"line":87,"column":4},"end":{"line":89,"column":null}},"type":"binary-expr","locations":[{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},{"start":{"line":89,"column":4},"end":{"line":89,"column":null}}],"line":87},"10":{"loc":{"start":{"line":90,"column":2},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":2},"end":{"line":93,"column":null}},{"start":{},"end":{}}],"line":90},"11":{"loc":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},{"start":{},"end":{}}],"line":92},"12":{"loc":{"start":{"line":96,"column":2},"end":{"line":102,"column":null}},"type":"if","locations":[{"start":{"line":96,"column":2},"end":{"line":102,"column":null}},{"start":{},"end":{}}],"line":96},"13":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},{"start":{},"end":{}}],"line":99},"14":{"loc":{"start":{"line":104,"column":2},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":107,"column":null}},{"start":{},"end":{}}],"line":104},"15":{"loc":{"start":{"line":118,"column":4},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":131,"column":null}},{"start":{"line":122,"column":4},"end":{"line":131,"column":null}}],"line":118},"16":{"loc":{"start":{"line":122,"column":4},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":122,"column":4},"end":{"line":131,"column":null}},{"start":{"line":126,"column":4},"end":{"line":131,"column":null}}],"line":122},"17":{"loc":{"start":{"line":126,"column":4},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":131,"column":null}},{"start":{},"end":{}}],"line":126},"18":{"loc":{"start":{"line":143,"column":4},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":143,"column":4},"end":{"line":149,"column":null}},{"start":{"line":147,"column":11},"end":{"line":149,"column":null}}],"line":143},"19":{"loc":{"start":{"line":145,"column":35},"end":{"line":145,"column":61}},"type":"cond-expr","locations":[{"start":{"line":145,"column":56},"end":{"line":145,"column":60}},{"start":{"line":145,"column":60},"end":{"line":145,"column":61}}],"line":145},"20":{"loc":{"start":{"line":150,"column":4},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":155,"column":null}},{"start":{"line":153,"column":11},"end":{"line":155,"column":null}}],"line":150},"21":{"loc":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"type":"binary-expr","locations":[{"start":{"line":151,"column":6},"end":{"line":151,"column":19}},{"start":{"line":151,"column":19},"end":{"line":151,"column":null}}],"line":151},"22":{"loc":{"start":{"line":152,"column":6},"end":{"line":152,"column":null}},"type":"binary-expr","locations":[{"start":{"line":152,"column":6},"end":{"line":152,"column":22}},{"start":{"line":152,"column":22},"end":{"line":152,"column":null}}],"line":152},"23":{"loc":{"start":{"line":154,"column":6},"end":{"line":154,"column":null}},"type":"binary-expr","locations":[{"start":{"line":154,"column":6},"end":{"line":154,"column":19}},{"start":{"line":154,"column":19},"end":{"line":154,"column":null}}],"line":154},"24":{"loc":{"start":{"line":157,"column":16},"end":{"line":157,"column":null}},"type":"cond-expr","locations":[{"start":{"line":157,"column":25},"end":{"line":157,"column":64}},{"start":{"line":157,"column":64},"end":{"line":157,"column":null}}],"line":157},"25":{"loc":{"start":{"line":174,"column":4},"end":{"line":179,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":179,"column":null}},{"start":{"line":177,"column":11},"end":{"line":179,"column":null}}],"line":174}},"s":{"0":9,"1":9,"2":9,"3":9,"4":9,"5":10,"6":10,"7":27,"8":4,"9":10,"10":10,"11":10,"12":29,"13":29,"14":29,"15":6,"16":6,"17":6,"18":23,"19":23,"20":23,"21":10,"22":10,"23":10,"24":29,"25":10,"26":9,"27":26,"28":26,"29":1,"30":1,"31":25,"32":25,"33":25,"34":25,"35":25,"36":25,"37":25,"38":25,"39":25,"40":25,"41":26,"42":19,"43":19,"44":0,"45":25,"46":8,"47":8,"48":8,"49":1,"50":25,"51":3,"52":6,"53":3,"54":25,"55":25,"56":35,"57":35,"58":35,"59":26,"60":26,"61":10065,"62":9,"63":1,"64":1,"65":3,"66":8,"67":6,"68":6,"69":12,"70":35,"71":25,"72":10080,"73":10080,"74":6,"75":12,"76":10074,"77":10080,"78":12,"79":12,"80":10068,"81":10080,"82":10080,"83":10080,"84":10080,"85":10080,"86":25,"87":10051,"88":10051,"89":10051,"90":10051,"91":25,"92":35,"93":35,"94":35,"95":35,"96":25,"97":10051,"98":25,"99":10,"100":25},"f":{"0":10,"1":26,"2":6,"3":35,"4":10080,"5":12,"6":10051,"7":35,"8":10051},"b":{"0":[4,23],"1":[6,23],"2":[3,3],"3":[10,13],"4":[10,0],"5":[10,2],"6":[6,4],"7":[1,25],"8":[1,1],"9":[25,25,6],"10":[19,7],"11":[0,19],"12":[8,17],"13":[1,7],"14":[3,22],"15":[26,9],"16":[1,8],"17":[6,2],"18":[6,10074],"19":[4,8],"20":[12,10068],"21":[12,12],"22":[12,2],"23":[10068,4],"24":[69,10011],"25":[25,10]},"meta":{"lastBranch":26,"lastFunction":9,"lastStatement":101,"seen":{"s:6:19:6:Infinity":0,"s:7:22:7:Infinity":1,"s:8:22:8:Infinity":2,"s:9:22:9:Infinity":3,"s:13:28:62:Infinity":4,"f:13:28:13:Infinity":0,"s:24:2:28:Infinity":5,"s:24:15:24:18":6,"b:25:4:27:Infinity:undefined:undefined:undefined:undefined":0,"s:25:4:27:Infinity":7,"s:26:6:26:Infinity":8,"s:30:30:30:Infinity":9,"s:31:10:31:Infinity":10,"s:34:2:60:Infinity":11,"s:35:21:35:Infinity":12,"s:36:21:36:Infinity":13,"b:38:4:58:Infinity:43:11:58:Infinity":1,"s:38:4:58:Infinity":14,"s:40:6:40:Infinity":15,"s:41:6:41:Infinity":16,"s:42:6:42:Infinity":17,"b:42:39:42:54:42:54:42:60":2,"s:45:6:45:Infinity":18,"s:46:6:46:Infinity":19,"b:47:6:57:Infinity:undefined:undefined:undefined:undefined":3,"s:47:6:57:Infinity":20,"b:49:8:56:Infinity:undefined:undefined:undefined:undefined":4,"s:49:8:56:Infinity":21,"b:50:10:50:Infinity:52:10:52:Infinity":5,"s:54:10:54:Infinity":22,"s:55:10:55:Infinity":23,"b:55:43:55:58:55:58:55:64":6,"s:59:4:59:Infinity":24,"s:61:2:61:Infinity":25,"s:64:20:183:Infinity":26,"f:64:20:64:21":1,"s:65:18:65:Infinity":27,"b:66:2:69:Infinity:undefined:undefined:undefined:undefined":7,"s:66:2:69:Infinity":28,"s:67:4:67:Infinity":29,"b:67:4:67:27:67:27:67:Infinity":8,"s:68:4:68:Infinity":30,"s:71:19:71:Infinity":31,"s:73:17:73:Infinity":32,"s:74:17:74:Infinity":33,"s:75:2:75:Infinity":34,"s:76:2:76:Infinity":35,"s:78:20:78:Infinity":36,"s:79:17:79:Infinity":37,"s:81:27:81:Infinity":38,"s:85:16:85:Infinity":39,"s:87:4:89:Infinity":40,"b:87:4:87:Infinity:88:4:88:Infinity:89:4:89:Infinity":9,"b:90:2:93:Infinity:undefined:undefined:undefined:undefined":10,"s:90:2:93:Infinity":41,"s:91:4:91:Infinity":42,"b:92:4:92:Infinity:undefined:undefined:undefined:undefined":11,"s:92:4:92:Infinity":43,"s:92:27:92:Infinity":44,"b:96:2:102:Infinity:undefined:undefined:undefined:undefined":12,"s:96:2:102:Infinity":45,"s:97:4:97:Infinity":46,"s:98:4:98:Infinity":47,"b:99:4:101:Infinity:undefined:undefined:undefined:undefined":13,"s:99:4:101:Infinity":48,"s:100:6:100:Infinity":49,"b:104:2:107:Infinity:undefined:undefined:undefined:undefined":14,"s:104:2:107:Infinity":50,"s:105:4:105:Infinity":51,"f:105:50:105:51":2,"s:105:57:105:65":52,"s:106:4:106:Infinity":53,"s:109:16:109:Infinity":54,"s:114:30:134:Infinity":55,"f:114:30:114:31":3,"s:115:31:115:Infinity":56,"s:116:28:116:Infinity":57,"b:118:4:131:Infinity:122:4:131:Infinity":15,"s:118:4:131:Infinity":58,"s:119:6:121:Infinity":59,"s:119:19:119:22":60,"s:120:8:120:Infinity":61,"b:122:4:131:Infinity:126:4:131:Infinity":16,"s:122:4:131:Infinity":62,"s:123:6:125:Infinity":63,"s:123:19:123:22":64,"s:124:8:124:Infinity":65,"b:126:4:131:Infinity:undefined:undefined:undefined:undefined":17,"s:126:4:131:Infinity":66,"s:127:14:127:Infinity":67,"s:128:6:130:Infinity":68,"s:129:8:129:Infinity":69,"s:133:4:133:Infinity":70,"s:136:29:161:Infinity":71,"f:136:29:136:Infinity":4,"s:142:22:142:Infinity":72,"b:143:4:149:Infinity:147:11:149:Infinity":18,"s:143:4:149:Infinity":73,"s:144:6:146:Infinity":74,"f:145:8:145:9":5,"s:145:19:145:Infinity":75,"b:145:56:145:60:145:60:145:61":19,"s:148:6:148:Infinity":76,"b:150:4:155:Infinity:153:11:155:Infinity":20,"s:150:4:155:Infinity":77,"s:151:6:151:Infinity":78,"b:151:6:151:19:151:19:151:Infinity":21,"s:152:6:152:Infinity":79,"b:152:6:152:22:152:22:152:Infinity":22,"s:154:6:154:Infinity":80,"b:154:6:154:19:154:19:154:Infinity":23,"s:156:21:156:Infinity":81,"s:157:16:157:Infinity":82,"b:157:25:157:64:157:64:157:Infinity":24,"s:158:4:158:Infinity":83,"s:159:4:159:Infinity":84,"s:160:4:160:Infinity":85,"s:163:21:168:Infinity":86,"f:163:21:163:22":6,"s:164:18:164:Infinity":87,"s:165:4:165:Infinity":88,"s:166:4:166:Infinity":89,"s:167:4:167:Infinity":90,"s:170:2:180:Infinity":91,"f:170:13:170:19":7,"s:171:19:171:Infinity":92,"s:172:30:172:Infinity":93,"s:173:5:173:Infinity":94,"b:174:4:179:Infinity:177:11:179:Infinity":25,"s:174:4:179:Infinity":95,"s:175:6:175:Infinity":96,"f:175:29:175:30":8,"s:175:36:175:57":97,"s:176:6:176:Infinity":98,"s:178:6:178:Infinity":99,"s:182:2:182:Infinity":100}}}
+,"/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":48}},"type":"binary-expr","locations":[{"start":{"line":62,"column":10},"end":{"line":62,"column":18}},{"start":{"line":62,"column":18},"end":{"line":62,"column":48}}],"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:18:62:18:62:48":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":7,"column":4},"end":{"line":89,"column":null}},"1":{"start":{"line":8,"column":15},"end":{"line":8,"column":null}},"2":{"start":{"line":9,"column":17},"end":{"line":9,"column":null}},"3":{"start":{"line":10,"column":67},"end":{"line":10,"column":null}},"4":{"start":{"line":12,"column":2},"end":{"line":88,"column":null}},"5":{"start":{"line":13,"column":16},"end":{"line":13,"column":null}},"6":{"start":{"line":14,"column":4},"end":{"line":21,"column":null}},"7":{"start":{"line":15,"column":26},"end":{"line":19,"column":null}},"8":{"start":{"line":16,"column":53},"end":{"line":16,"column":63}},"9":{"start":{"line":18,"column":10},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"11":{"start":{"line":22,"column":4},"end":{"line":44,"column":null}},"12":{"start":{"line":23,"column":20},"end":{"line":23,"column":null}},"13":{"start":{"line":24,"column":25},"end":{"line":24,"column":null}},"14":{"start":{"line":25,"column":6},"end":{"line":40,"column":null}},"15":{"start":{"line":25,"column":19},"end":{"line":25,"column":22}},"16":{"start":{"line":25,"column":26},"end":{"line":25,"column":46}},"17":{"start":{"line":26,"column":23},"end":{"line":26,"column":null}},"18":{"start":{"line":27,"column":28},"end":{"line":27,"column":null}},"19":{"start":{"line":28,"column":8},"end":{"line":39,"column":null}},"20":{"start":{"line":29,"column":10},"end":{"line":33,"column":null}},"21":{"start":{"line":30,"column":12},"end":{"line":30,"column":null}},"22":{"start":{"line":32,"column":12},"end":{"line":32,"column":null}},"23":{"start":{"line":35,"column":10},"end":{"line":38,"column":null}},"24":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"25":{"start":{"line":36,"column":41},"end":{"line":36,"column":null}},"26":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"27":{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},"28":{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},"29":{"start":{"line":45,"column":2},"end":{"line":88,"column":null}},"30":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"31":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"32":{"start":{"line":51,"column":4},"end":{"line":54,"column":null}},"33":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"34":{"start":{"line":53,"column":6},"end":{"line":53,"column":null}},"35":{"start":{"line":55,"column":2},"end":{"line":88,"column":null}},"36":{"start":{"line":56,"column":4},"end":{"line":58,"column":null}},"37":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"38":{"start":{"line":60,"column":4},"end":{"line":65,"column":null}},"39":{"start":{"line":61,"column":20},"end":{"line":61,"column":null}},"40":{"start":{"line":62,"column":6},"end":{"line":64,"column":null}},"41":{"start":{"line":63,"column":10},"end":{"line":63,"column":null}},"42":{"start":{"line":68,"column":25},"end":{"line":72,"column":null}},"43":{"start":{"line":69,"column":6},"end":{"line":69,"column":null}},"44":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"45":{"start":{"line":70,"column":6},"end":{"line":70,"column":null}},"46":{"start":{"line":70,"column":18},"end":{"line":70,"column":null}},"47":{"start":{"line":71,"column":6},"end":{"line":71,"column":null}},"48":{"start":{"line":74,"column":4},"end":{"line":74,"column":null}},"49":{"start":{"line":75,"column":4},"end":{"line":75,"column":null}},"50":{"start":{"line":76,"column":4},"end":{"line":78,"column":null}},"51":{"start":{"line":77,"column":6},"end":{"line":77,"column":null}},"52":{"start":{"line":79,"column":4},"end":{"line":83,"column":null}},"53":{"start":{"line":80,"column":6},"end":{"line":82,"column":null}},"54":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"55":{"start":{"line":85,"column":4},"end":{"line":87,"column":null}},"56":{"start":{"line":86,"column":6},"end":{"line":86,"column":null}},"57":{"start":{"line":91,"column":17},"end":{"line":91,"column":null}},"58":{"start":{"line":91,"column":31},"end":{"line":91,"column":null}},"59":{"start":{"line":94,"column":25},"end":{"line":100,"column":null}},"60":{"start":{"line":98,"column":14},"end":{"line":98,"column":null}},"61":{"start":{"line":99,"column":2},"end":{"line":99,"column":null}},"62":{"start":{"line":102,"column":34},"end":{"line":104,"column":null}},"63":{"start":{"line":103,"column":4},"end":{"line":103,"column":null}},"64":{"start":{"line":106,"column":32},"end":{"line":112,"column":null}},"65":{"start":{"line":107,"column":17},"end":{"line":107,"column":null}},"66":{"start":{"line":108,"column":2},"end":{"line":111,"column":null}},"67":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"68":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"69":{"start":{"line":114,"column":33},"end":{"line":119,"column":null}},"70":{"start":{"line":118,"column":2},"end":{"line":118,"column":null}},"71":{"start":{"line":121,"column":35},"end":{"line":132,"column":null}},"72":{"start":{"line":126,"column":16},"end":{"line":126,"column":null}},"73":{"start":{"line":127,"column":2},"end":{"line":131,"column":null}},"74":{"start":{"line":128,"column":4},"end":{"line":128,"column":null}},"75":{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},"76":{"start":{"line":130,"column":4},"end":{"line":130,"column":null}},"77":{"start":{"line":134,"column":31},"end":{"line":141,"column":null}},"78":{"start":{"line":139,"column":2},"end":{"line":139,"column":null}},"79":{"start":{"line":139,"column":29},"end":{"line":139,"column":null}},"80":{"start":{"line":140,"column":2},"end":{"line":140,"column":null}},"81":{"start":{"line":143,"column":36},"end":{"line":164,"column":null}},"82":{"start":{"line":148,"column":21},"end":{"line":148,"column":null}},"83":{"start":{"line":149,"column":18},"end":{"line":149,"column":null}},"84":{"start":{"line":150,"column":2},"end":{"line":163,"column":null}},"85":{"start":{"line":151,"column":25},"end":{"line":151,"column":null}},"86":{"start":{"line":152,"column":18},"end":{"line":152,"column":null}},"87":{"start":{"line":153,"column":18},"end":{"line":153,"column":null}},"88":{"start":{"line":154,"column":4},"end":{"line":160,"column":null}},"89":{"start":{"line":155,"column":6},"end":{"line":155,"column":null}},"90":{"start":{"line":156,"column":4},"end":{"line":160,"column":null}},"91":{"start":{"line":157,"column":23},"end":{"line":157,"column":null}},"92":{"start":{"line":158,"column":6},"end":{"line":158,"column":null}},"93":{"start":{"line":159,"column":6},"end":{"line":159,"column":null}},"94":{"start":{"line":162,"column":4},"end":{"line":162,"column":null}},"95":{"start":{"line":166,"column":31},"end":{"line":182,"column":null}},"96":{"start":{"line":171,"column":2},"end":{"line":173,"column":null}},"97":{"start":{"line":172,"column":4},"end":{"line":172,"column":null}},"98":{"start":{"line":174,"column":17},"end":{"line":174,"column":null}},"99":{"start":{"line":175,"column":17},"end":{"line":175,"column":null}},"100":{"start":{"line":176,"column":2},"end":{"line":178,"column":null}},"101":{"start":{"line":177,"column":4},"end":{"line":177,"column":null}},"102":{"start":{"line":179,"column":2},"end":{"line":181,"column":null}},"103":{"start":{"line":180,"column":4},"end":{"line":180,"column":null}},"104":{"start":{"line":184,"column":16},"end":{"line":188,"column":null}},"105":{"start":{"line":185,"column":12},"end":{"line":185,"column":null}},"106":{"start":{"line":186,"column":2},"end":{"line":186,"column":null}},"107":{"start":{"line":187,"column":2},"end":{"line":187,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":4},"end":{"line":7,"column":5}},"loc":{"start":{"line":7,"column":45},"end":{"line":89,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":25},"end":{"line":14,"column":31}},"loc":{"start":{"line":14,"column":31},"end":{"line":21,"column":5}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":27},"end":{"line":16,"column":28}},"loc":{"start":{"line":16,"column":53},"end":{"line":16,"column":63}},"line":16},"3":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":13},"end":{"line":17,"column":14}},"loc":{"start":{"line":18,"column":10},"end":{"line":18,"column":null}},"line":18},"4":{"name":"(anonymous_4)","decl":{"start":{"line":22,"column":11},"end":{"line":22,"column":17}},"loc":{"start":{"line":22,"column":17},"end":{"line":44,"column":5}},"line":22},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":25},"end":{"line":46,"column":31}},"loc":{"start":{"line":46,"column":31},"end":{"line":48,"column":5}},"line":46},"6":{"name":"(anonymous_6)","decl":{"start":{"line":51,"column":11},"end":{"line":51,"column":17}},"loc":{"start":{"line":51,"column":17},"end":{"line":54,"column":5}},"line":51},"7":{"name":"(anonymous_7)","decl":{"start":{"line":56,"column":25},"end":{"line":56,"column":31}},"loc":{"start":{"line":56,"column":31},"end":{"line":58,"column":5}},"line":56},"8":{"name":"(anonymous_8)","decl":{"start":{"line":60,"column":11},"end":{"line":60,"column":17}},"loc":{"start":{"line":60,"column":17},"end":{"line":65,"column":5}},"line":60},"9":{"name":"(anonymous_9)","decl":{"start":{"line":68,"column":25},"end":{"line":68,"column":26}},"loc":{"start":{"line":68,"column":42},"end":{"line":72,"column":null}},"line":68},"10":{"name":"(anonymous_10)","decl":{"start":{"line":76,"column":53},"end":{"line":76,"column":59}},"loc":{"start":{"line":76,"column":59},"end":{"line":78,"column":5}},"line":76},"11":{"name":"(anonymous_11)","decl":{"start":{"line":80,"column":27},"end":{"line":80,"column":33}},"loc":{"start":{"line":80,"column":33},"end":{"line":82,"column":7}},"line":80},"12":{"name":"(anonymous_12)","decl":{"start":{"line":85,"column":11},"end":{"line":85,"column":17}},"loc":{"start":{"line":85,"column":17},"end":{"line":87,"column":5}},"line":85},"13":{"name":"(anonymous_13)","decl":{"start":{"line":91,"column":17},"end":{"line":91,"column":18}},"loc":{"start":{"line":91,"column":31},"end":{"line":91,"column":null}},"line":91},"14":{"name":"(anonymous_14)","decl":{"start":{"line":94,"column":25},"end":{"line":94,"column":null}},"loc":{"start":{"line":97,"column":5},"end":{"line":100,"column":null}},"line":97},"15":{"name":"(anonymous_15)","decl":{"start":{"line":102,"column":34},"end":{"line":102,"column":35}},"loc":{"start":{"line":102,"column":48},"end":{"line":104,"column":null}},"line":102},"16":{"name":"(anonymous_16)","decl":{"start":{"line":106,"column":32},"end":{"line":106,"column":33}},"loc":{"start":{"line":106,"column":46},"end":{"line":112,"column":null}},"line":106},"17":{"name":"(anonymous_17)","decl":{"start":{"line":114,"column":33},"end":{"line":114,"column":null}},"loc":{"start":{"line":117,"column":5},"end":{"line":119,"column":null}},"line":117},"18":{"name":"(anonymous_18)","decl":{"start":{"line":121,"column":35},"end":{"line":121,"column":null}},"loc":{"start":{"line":125,"column":5},"end":{"line":132,"column":null}},"line":125},"19":{"name":"(anonymous_19)","decl":{"start":{"line":134,"column":31},"end":{"line":134,"column":null}},"loc":{"start":{"line":138,"column":5},"end":{"line":141,"column":null}},"line":138},"20":{"name":"(anonymous_20)","decl":{"start":{"line":143,"column":36},"end":{"line":143,"column":null}},"loc":{"start":{"line":147,"column":5},"end":{"line":164,"column":null}},"line":147},"21":{"name":"(anonymous_21)","decl":{"start":{"line":166,"column":31},"end":{"line":166,"column":null}},"loc":{"start":{"line":170,"column":5},"end":{"line":182,"column":null}},"line":170},"22":{"name":"(anonymous_22)","decl":{"start":{"line":184,"column":16},"end":{"line":184,"column":17}},"loc":{"start":{"line":184,"column":51},"end":{"line":188,"column":null}},"line":184}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":16},"end":{"line":10,"column":63}},"type":"default-arg","locations":[{"start":{"line":10,"column":25},"end":{"line":10,"column":63}}],"line":10},"1":{"loc":{"start":{"line":10,"column":25},"end":{"line":10,"column":63}},"type":"binary-expr","locations":[{"start":{"line":10,"column":25},"end":{"line":10,"column":46}},{"start":{"line":10,"column":46},"end":{"line":10,"column":63}}],"line":10},"2":{"loc":{"start":{"line":10,"column":67},"end":{"line":10,"column":null}},"type":"binary-expr","locations":[{"start":{"line":10,"column":67},"end":{"line":10,"column":80}},{"start":{"line":10,"column":80},"end":{"line":10,"column":null}}],"line":10},"3":{"loc":{"start":{"line":12,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":88,"column":null}},{"start":{"line":45,"column":2},"end":{"line":88,"column":null}}],"line":12},"4":{"loc":{"start":{"line":18,"column":10},"end":{"line":18,"column":null}},"type":"cond-expr","locations":[{"start":{"line":18,"column":19},"end":{"line":18,"column":43}},{"start":{"line":18,"column":43},"end":{"line":18,"column":null}}],"line":18},"5":{"loc":{"start":{"line":20,"column":13},"end":{"line":20,"column":61}},"type":"cond-expr","locations":[{"start":{"line":20,"column":28},"end":{"line":20,"column":47}},{"start":{"line":20,"column":47},"end":{"line":20,"column":61}}],"line":20},"6":{"loc":{"start":{"line":28,"column":8},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":8},"end":{"line":39,"column":null}},{"start":{"line":34,"column":15},"end":{"line":39,"column":null}}],"line":28},"7":{"loc":{"start":{"line":29,"column":10},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":10},"end":{"line":33,"column":null}},{"start":{"line":31,"column":17},"end":{"line":33,"column":null}}],"line":29},"8":{"loc":{"start":{"line":35,"column":10},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":10},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":35},"9":{"loc":{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":12},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":36},"10":{"loc":{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":43,"column":null}},{"start":{},"end":{}}],"line":41},"11":{"loc":{"start":{"line":41,"column":10},"end":{"line":41,"column":51}},"type":"binary-expr","locations":[{"start":{"line":41,"column":10},"end":{"line":41,"column":25}},{"start":{"line":41,"column":25},"end":{"line":41,"column":51}}],"line":41},"12":{"loc":{"start":{"line":45,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":88,"column":null}},{"start":{"line":55,"column":2},"end":{"line":88,"column":null}}],"line":45},"13":{"loc":{"start":{"line":55,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":2},"end":{"line":88,"column":null}},{"start":{"line":66,"column":9},"end":{"line":88,"column":null}}],"line":55},"14":{"loc":{"start":{"line":62,"column":6},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":62},"15":{"loc":{"start":{"line":69,"column":6},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":6},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":69},"16":{"loc":{"start":{"line":70,"column":6},"end":{"line":70,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":6},"end":{"line":70,"column":null}},{"start":{},"end":{}}],"line":70},"17":{"loc":{"start":{"line":76,"column":15},"end":{"line":76,"column":53}},"type":"cond-expr","locations":[{"start":{"line":76,"column":33},"end":{"line":76,"column":44}},{"start":{"line":76,"column":44},"end":{"line":76,"column":53}}],"line":76},"18":{"loc":{"start":{"line":79,"column":4},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":83,"column":null}},{"start":{},"end":{}}],"line":79},"19":{"loc":{"start":{"line":91,"column":31},"end":{"line":91,"column":null}},"type":"cond-expr","locations":[{"start":{"line":91,"column":48},"end":{"line":91,"column":60}},{"start":{"line":91,"column":60},"end":{"line":91,"column":null}}],"line":91},"20":{"loc":{"start":{"line":98,"column":14},"end":{"line":98,"column":null}},"type":"cond-expr","locations":[{"start":{"line":98,"column":24},"end":{"line":98,"column":39}},{"start":{"line":98,"column":39},"end":{"line":98,"column":null}}],"line":98},"21":{"loc":{"start":{"line":99,"column":9},"end":{"line":99,"column":null}},"type":"cond-expr","locations":[{"start":{"line":99,"column":21},"end":{"line":99,"column":31}},{"start":{"line":99,"column":31},"end":{"line":99,"column":null}}],"line":99},"22":{"loc":{"start":{"line":108,"column":2},"end":{"line":111,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":111,"column":null}},{"start":{},"end":{}}],"line":108},"23":{"loc":{"start":{"line":127,"column":2},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":131,"column":null}},{"start":{"line":129,"column":2},"end":{"line":131,"column":null}}],"line":127},"24":{"loc":{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},"type":"if","locations":[{"start":{"line":129,"column":2},"end":{"line":131,"column":null}},{"start":{},"end":{}}],"line":129},"25":{"loc":{"start":{"line":139,"column":2},"end":{"line":139,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":2},"end":{"line":139,"column":null}},{"start":{},"end":{}}],"line":139},"26":{"loc":{"start":{"line":150,"column":2},"end":{"line":163,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":2},"end":{"line":163,"column":null}},{"start":{"line":161,"column":9},"end":{"line":163,"column":null}}],"line":150},"27":{"loc":{"start":{"line":154,"column":4},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":154,"column":4},"end":{"line":160,"column":null}},{"start":{"line":156,"column":4},"end":{"line":160,"column":null}}],"line":154},"28":{"loc":{"start":{"line":154,"column":8},"end":{"line":154,"column":27}},"type":"binary-expr","locations":[{"start":{"line":154,"column":8},"end":{"line":154,"column":19}},{"start":{"line":154,"column":19},"end":{"line":154,"column":27}}],"line":154},"29":{"loc":{"start":{"line":156,"column":4},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":156,"column":4},"end":{"line":160,"column":null}},{"start":{},"end":{}}],"line":156},"30":{"loc":{"start":{"line":156,"column":15},"end":{"line":156,"column":34}},"type":"binary-expr","locations":[{"start":{"line":156,"column":15},"end":{"line":156,"column":27}},{"start":{"line":156,"column":27},"end":{"line":156,"column":34}}],"line":156},"31":{"loc":{"start":{"line":171,"column":2},"end":{"line":173,"column":null}},"type":"if","locations":[{"start":{"line":171,"column":2},"end":{"line":173,"column":null}},{"start":{},"end":{}}],"line":171},"32":{"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},"33":{"loc":{"start":{"line":176,"column":6},"end":{"line":176,"column":72}},"type":"binary-expr","locations":[{"start":{"line":176,"column":6},"end":{"line":176,"column":39}},{"start":{"line":176,"column":39},"end":{"line":176,"column":72}}],"line":176},"34":{"loc":{"start":{"line":179,"column":2},"end":{"line":181,"column":null}},"type":"if","locations":[{"start":{"line":179,"column":2},"end":{"line":181,"column":null}},{"start":{},"end":{}}],"line":179}},"s":{"0":9,"1":32,"2":32,"3":32,"4":32,"5":7,"6":7,"7":3,"8":8,"9":7,"10":3,"11":7,"12":10,"13":10,"14":10,"15":10,"16":10,"17":22,"18":22,"19":22,"20":14,"21":12,"22":2,"23":8,"24":4,"25":2,"26":4,"27":6,"28":1,"29":25,"30":7,"31":6,"32":7,"33":17,"34":17,"35":18,"36":5,"37":2,"38":5,"39":10,"40":10,"41":10,"42":13,"43":11,"44":2,"45":9,"46":9,"47":6,"48":13,"49":13,"50":13,"51":12,"52":13,"53":2,"54":1,"55":13,"56":22,"57":9,"58":69,"59":9,"60":9,"61":9,"62":9,"63":2,"64":9,"65":4,"66":4,"67":3,"68":3,"69":9,"70":3,"71":9,"72":19,"73":19,"74":13,"75":6,"76":6,"77":9,"78":14,"79":3,"80":11,"81":9,"82":9,"83":9,"84":9,"85":6,"86":6,"87":6,"88":6,"89":3,"90":3,"91":3,"92":3,"93":3,"94":3,"95":9,"96":25,"97":2,"98":23,"99":23,"100":23,"101":1,"102":22,"103":15,"104":9,"105":3,"106":3,"107":3},"f":{"0":32,"1":3,"2":8,"3":7,"4":10,"5":6,"6":17,"7":2,"8":10,"9":11,"10":12,"11":1,"12":22,"13":69,"14":9,"15":2,"16":4,"17":3,"18":19,"19":14,"20":9,"21":25,"22":3},"b":{"0":[32],"1":[32,29],"2":[32,26],"3":[7,25],"4":[1,6],"5":[2,1],"6":[14,8],"7":[12,2],"8":[4,4],"9":[2,2],"10":[1,5],"11":[6,1],"12":[7,18],"13":[5,13],"14":[10,0],"15":[2,9],"16":[3,6],"17":[2,11],"18":[2,11],"19":[0,69],"20":[7,2],"21":[4,5],"22":[3,1],"23":[13,6],"24":[6,0],"25":[3,11],"26":[6,3],"27":[3,3],"28":[6,3],"29":[3,0],"30":[3,3],"31":[2,23],"32":[1,22],"33":[23,1],"34":[15,7]},"meta":{"lastBranch":35,"lastFunction":23,"lastStatement":108,"seen":{"s:7:4:89:Infinity":0,"f:7:4:7:5":0,"s:8:15:8:Infinity":1,"s:9:17:9:Infinity":2,"s:10:67:10:Infinity":3,"b:10:25:10:63":0,"b:10:25:10:46:10:46:10:63":1,"b:10:67:10:80:10:80:10:Infinity":2,"b:12:2:88:Infinity:45:2:88:Infinity":3,"s:12:2:88:Infinity":4,"s:13:16:13:Infinity":5,"s:14:4:21:Infinity":6,"f:14:25:14:31":1,"s:15:26:19:Infinity":7,"f:16:27:16:28":2,"s:16:53:16:63":8,"f:17:13:17:14":3,"s:18:10:18:Infinity":9,"b:18:19:18:43:18:43:18:Infinity":4,"s:20:6:20:Infinity":10,"b:20:28:20:47:20:47:20:61":5,"s:22:4:44:Infinity":11,"f:22:11:22:17":4,"s:23:20:23:Infinity":12,"s:24:25:24:Infinity":13,"s:25:6:40:Infinity":14,"s:25:19:25:22":15,"s:25:26:25:46":16,"s:26:23:26:Infinity":17,"s:27:28:27:Infinity":18,"b:28:8:39:Infinity:34:15:39:Infinity":6,"s:28:8:39:Infinity":19,"b:29:10:33:Infinity:31:17:33:Infinity":7,"s:29:10:33:Infinity":20,"s:30:12:30:Infinity":21,"s:32:12:32:Infinity":22,"b:35:10:38:Infinity:undefined:undefined:undefined:undefined":8,"s:35:10:38:Infinity":23,"b:36:12:36:Infinity:undefined:undefined:undefined:undefined":9,"s:36:12:36:Infinity":24,"s:36:41:36:Infinity":25,"s:37:12:37:Infinity":26,"b:41:6:43:Infinity:undefined:undefined:undefined:undefined":10,"s:41:6:43:Infinity":27,"b:41:10:41:25:41:25:41:51":11,"s:42:8:42:Infinity":28,"b:45:2:88:Infinity:55:2:88:Infinity":12,"s:45:2:88:Infinity":29,"s:46:4:48:Infinity":30,"f:46:25:46:31":5,"s:47:6:47:Infinity":31,"s:51:4:54:Infinity":32,"f:51:11:51:17":6,"s:52:6:52:Infinity":33,"s:53:6:53:Infinity":34,"b:55:2:88:Infinity:66:9:88:Infinity":13,"s:55:2:88:Infinity":35,"s:56:4:58:Infinity":36,"f:56:25:56:31":7,"s:57:6:57:Infinity":37,"s:60:4:65:Infinity":38,"f:60:11:60:17":8,"s:61:20:61:Infinity":39,"b:62:6:64:Infinity:undefined:undefined:undefined:undefined":14,"s:62:6:64:Infinity":40,"s:63:10:63:Infinity":41,"s:68:25:72:Infinity":42,"f:68:25:68:26":9,"b:69:6:69:Infinity:undefined:undefined:undefined:undefined":15,"s:69:6:69:Infinity":43,"s:69:16:69:Infinity":44,"b:70:6:70:Infinity:undefined:undefined:undefined:undefined":16,"s:70:6:70:Infinity":45,"s:70:18:70:Infinity":46,"s:71:6:71:Infinity":47,"s:74:4:74:Infinity":48,"s:75:4:75:Infinity":49,"s:76:4:78:Infinity":50,"b:76:33:76:44:76:44:76:53":17,"f:76:53:76:59":10,"s:77:6:77:Infinity":51,"b:79:4:83:Infinity:undefined:undefined:undefined:undefined":18,"s:79:4:83:Infinity":52,"s:80:6:82:Infinity":53,"f:80:27:80:33":11,"s:81:8:81:Infinity":54,"s:85:4:87:Infinity":55,"f:85:11:85:17":12,"s:86:6:86:Infinity":56,"s:91:17:91:Infinity":57,"f:91:17:91:18":13,"s:91:31:91:Infinity":58,"b:91:48:91:60:91:60:91:Infinity":19,"s:94:25:100:Infinity":59,"f:94:25:94:Infinity":14,"s:98:14:98:Infinity":60,"b:98:24:98:39:98:39:98:Infinity":20,"s:99:2:99:Infinity":61,"b:99:21:99:31:99:31:99:Infinity":21,"s:102:34:104:Infinity":62,"f:102:34:102:35":15,"s:103:4:103:Infinity":63,"s:106:32:112:Infinity":64,"f:106:32:106:33":16,"s:107:17:107:Infinity":65,"b:108:2:111:Infinity:undefined:undefined:undefined:undefined":22,"s:108:2:111:Infinity":66,"s:109:4:109:Infinity":67,"s:110:4:110:Infinity":68,"s:114:33:119:Infinity":69,"f:114:33:114:Infinity":17,"s:118:2:118:Infinity":70,"s:121:35:132:Infinity":71,"f:121:35:121:Infinity":18,"s:126:16:126:Infinity":72,"b:127:2:131:Infinity:129:2:131:Infinity":23,"s:127:2:131:Infinity":73,"s:128:4:128:Infinity":74,"b:129:2:131:Infinity:undefined:undefined:undefined:undefined":24,"s:129:2:131:Infinity":75,"s:130:4:130:Infinity":76,"s:134:31:141:Infinity":77,"f:134:31:134:Infinity":19,"b:139:2:139:Infinity:undefined:undefined:undefined:undefined":25,"s:139:2:139:Infinity":78,"s:139:29:139:Infinity":79,"s:140:2:140:Infinity":80,"s:143:36:164:Infinity":81,"f:143:36:143:Infinity":20,"s:148:21:148:Infinity":82,"s:149:18:149:Infinity":83,"b:150:2:163:Infinity:161:9:163:Infinity":26,"s:150:2:163:Infinity":84,"s:151:25:151:Infinity":85,"s:152:18:152:Infinity":86,"s:153:18:153:Infinity":87,"b:154:4:160:Infinity:156:4:160:Infinity":27,"s:154:4:160:Infinity":88,"b:154:8:154:19:154:19:154:27":28,"s:155:6:155:Infinity":89,"b:156:4:160:Infinity:undefined:undefined:undefined:undefined":29,"s:156:4:160:Infinity":90,"b:156:15:156:27:156:27:156:34":30,"s:157:23:157:Infinity":91,"s:158:6:158:Infinity":92,"s:159:6:159:Infinity":93,"s:162:4:162:Infinity":94,"s:166:31:182:Infinity":95,"f:166:31:166:Infinity":21,"b:171:2:173:Infinity:undefined:undefined:undefined:undefined":31,"s:171:2:173:Infinity":96,"s:172:4:172:Infinity":97,"s:174:17:174:Infinity":98,"s:175:17:175:Infinity":99,"b:176:2:178:Infinity:undefined:undefined:undefined:undefined":32,"s:176:2:178:Infinity":100,"b:176:6:176:39:176:39:176:72":33,"s:177:4:177:Infinity":101,"b:179:2:181:Infinity:undefined:undefined:undefined:undefined":34,"s:179:2:181:Infinity":102,"s:180:4:180:Infinity":103,"s:184:16:188:Infinity":104,"f:184:16:184:17":22,"s:185:12:185:Infinity":105,"s:186:2:186:Infinity":106,"s:187:2:187:Infinity":107}}}
+,"/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":81,"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":50,"column":null}},"22":{"start":{"line":46,"column":4},"end":{"line":49,"column":null}},"23":{"start":{"line":51,"column":2},"end":{"line":56,"column":null}},"24":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"25":{"start":{"line":53,"column":4},"end":{"line":53,"column":null}},"26":{"start":{"line":54,"column":2},"end":{"line":56,"column":null}},"27":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"28":{"start":{"line":55,"column":17},"end":{"line":55,"column":null}},"29":{"start":{"line":58,"column":2},"end":{"line":78,"column":null}},"30":{"start":{"line":60,"column":4},"end":{"line":63,"column":null}},"31":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"32":{"start":{"line":61,"column":27},"end":{"line":61,"column":null}},"33":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"34":{"start":{"line":62,"column":28},"end":{"line":62,"column":null}},"35":{"start":{"line":65,"column":16},"end":{"line":65,"column":null}},"36":{"start":{"line":66,"column":4},"end":{"line":77,"column":null}},"37":{"start":{"line":67,"column":6},"end":{"line":69,"column":null}},"38":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"39":{"start":{"line":70,"column":6},"end":{"line":75,"column":null}},"40":{"start":{"line":71,"column":22},"end":{"line":71,"column":null}},"41":{"start":{"line":72,"column":8},"end":{"line":74,"column":null}},"42":{"start":{"line":73,"column":10},"end":{"line":73,"column":null}},"43":{"start":{"line":76,"column":6},"end":{"line":76,"column":null}},"44":{"start":{"line":80,"column":2},"end":{"line":80,"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":81,"column":null}},"line":32},"13":{"name":"(anonymous_13)","decl":{"start":{"line":55,"column":11},"end":{"line":55,"column":17}},"loc":{"start":{"line":55,"column":17},"end":{"line":55,"column":null}},"line":55},"14":{"name":"(anonymous_14)","decl":{"start":{"line":66,"column":14},"end":{"line":66,"column":15}},"loc":{"start":{"line":66,"column":28},"end":{"line":77,"column":null}},"line":66}},"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":50,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":50,"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":51,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":56,"column":null}},{"start":{"line":54,"column":2},"end":{"line":56,"column":null}}],"line":51},"10":{"loc":{"start":{"line":54,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":54},"11":{"loc":{"start":{"line":58,"column":2},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":78,"column":null}},{"start":{},"end":{}}],"line":58},"12":{"loc":{"start":{"line":60,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":4},"end":{"line":63,"column":null}},{"start":{},"end":{}}],"line":60},"13":{"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},"14":{"loc":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":62},"15":{"loc":{"start":{"line":67,"column":6},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":6},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":67},"16":{"loc":{"start":{"line":67,"column":10},"end":{"line":67,"column":77}},"type":"binary-expr","locations":[{"start":{"line":67,"column":10},"end":{"line":67,"column":24}},{"start":{"line":67,"column":24},"end":{"line":67,"column":77}}],"line":67},"17":{"loc":{"start":{"line":72,"column":8},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":74,"column":null}},{"start":{},"end":{}}],"line":72},"18":{"loc":{"start":{"line":72,"column":12},"end":{"line":72,"column":42}},"type":"binary-expr","locations":[{"start":{"line":72,"column":12},"end":{"line":72,"column":21}},{"start":{"line":72,"column":21},"end":{"line":72,"column":42}}],"line":72}},"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],"18":[22,21]},"meta":{"lastBranch":19,"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:81: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:50:Infinity:undefined:undefined:undefined:undefined":7,"s:45:2:50:Infinity":21,"b:45:6:45:30:45:30:45:51:45:51:45:73":8,"s:46:4:49:Infinity":22,"b:51:2:56:Infinity:54:2:56:Infinity":9,"s:51:2:56:Infinity":23,"s:52:4:52:Infinity":24,"s:53:4:53:Infinity":25,"b:54:2:56:Infinity:undefined:undefined:undefined:undefined":10,"s:54:2:56:Infinity":26,"s:55:4:55:Infinity":27,"f:55:11:55:17":13,"s:55:17:55:Infinity":28,"b:58:2:78:Infinity:undefined:undefined:undefined:undefined":11,"s:58:2:78:Infinity":29,"b:60:4:63:Infinity:undefined:undefined:undefined:undefined":12,"s:60:4:63:Infinity":30,"b:61:6:61:Infinity:undefined:undefined:undefined:undefined":13,"s:61:6:61:Infinity":31,"s:61:27:61:Infinity":32,"b:62:6:62:Infinity:undefined:undefined:undefined:undefined":14,"s:62:6:62:Infinity":33,"s:62:28:62:Infinity":34,"s:65:16:65:Infinity":35,"s:66:4:77:Infinity":36,"f:66:14:66:15":14,"b:67:6:69:Infinity:undefined:undefined:undefined:undefined":15,"s:67:6:69:Infinity":37,"b:67:10:67:24:67:24:67:77":16,"s:68:8:68:Infinity":38,"s:70:6:75:Infinity":39,"s:71:22:71:Infinity":40,"b:72:8:74:Infinity:undefined:undefined:undefined:undefined":17,"s:72:8:74:Infinity":41,"b:72:12:72:21:72:21:72:42":18,"s:73:10:73:Infinity":42,"s:76:6:76:Infinity":43,"s:80:2:80: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":8,"2":10,"3":10,"4":6,"5":10,"6":10,"7":2,"8":10,"9":8,"10":1},"f":{"0":8,"1":10,"2":1},"b":{"0":[6,4],"1":[10,6,6,6],"2":[2,8],"3":[10,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":3,"column":44},"end":{"line":8,"column":null}},"1":{"start":{"line":4,"column":25},"end":{"line":4,"column":null}},"2":{"start":{"line":5,"column":2},"end":{"line":7,"column":null}},"3":{"start":{"line":6,"column":4},"end":{"line":6,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":44},"end":{"line":3,"column":45}},"loc":{"start":{"line":3,"column":69},"end":{"line":8,"column":null}},"line":3},"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}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":23},"end":{"line":6,"column":null}},"type":"cond-expr","locations":[{"start":{"line":6,"column":31},"end":{"line":6,"column":48}},{"start":{"line":6,"column":48},"end":{"line":6,"column":null}}],"line":6}},"s":{"0":9,"1":2,"2":2,"3":3},"f":{"0":2,"1":3},"b":{"0":[2,1]},"meta":{"lastBranch":1,"lastFunction":2,"lastStatement":4,"seen":{"s:3:44:8:Infinity":0,"f:3:44:3:45":0,"s:4:25:4:Infinity":1,"s:5:2:7:Infinity":2,"f:5:9:5:15":1,"s:6:4:6:Infinity":3,"b:6:31:6:48:6:48:6:Infinity":0}}}
+,"/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":2},"end":{"line":21,"column":null}},"5":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"6":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"7":{"start":{"line":18,"column":10},"end":{"line":18,"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":2},"end":{"line":21,"column":null}},"line":11},"3":{"name":"(anonymous_3)","decl":{"start":{"line":14,"column":7},"end":{"line":14,"column":13}},"loc":{"start":{"line":14,"column":13},"end":{"line":20,"column":9}},"line":14}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":21,"column":null}},"type":"cond-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":null}},{"start":{"line":13,"column":6},"end":{"line":21,"column":null}}],"line":11},"1":{"loc":{"start":{"line":13,"column":6},"end":{"line":21,"column":null}},"type":"cond-expr","locations":[{"start":{"line":13,"column":20},"end":{"line":20,"column":null}},{"start":{"line":21,"column":6},"end":{"line":21,"column":null}}],"line":13}},"s":{"0":9,"1":10096,"2":10117,"3":9,"4":20221,"5":1,"6":1,"7":1},"f":{"0":10096,"1":10117,"2":20221,"3":1},"b":{"0":[3,20218],"1":[1,20217]},"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:2:21:Infinity":4,"b:12:6:12:Infinity:13:6:21:Infinity":0,"b:13:20:20:Infinity:21:6:21:Infinity":1,"f:14:7:14:13":3,"s:15:8:19:Infinity":5,"s:16:10:16:Infinity":6,"s:18:10:18: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..31d0553
--- /dev/null
+++ b/coverage/index.html
@@ -0,0 +1,131 @@
+
+
+
+
+
+ Code coverage report for All files
+
+
+
+
+
+
+
+
+
+
+
+
All files
+
+
+
+ 99.68%
+ Statements
+ 640/642
+
+
+
+
+ 96.89%
+ Branches
+ 406/419
+
+
+
+
+ 100%
+ Functions
+ 113/113
+
+
+
+
+ 99.83%
+ Lines
+ 608/609
+
+
+
+
+
+ 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
+
+
+
+ 100%
+ 260/260
+ 98.73%
+ 156/158
+ 100%
+ 44/44
+ 100%
+ 250/250
+
+
+
+ src/directives
+
+
+
+ 99.47%
+ 380/382
+ 95.78%
+ 250/261
+ 100%
+ 69/69
+ 99.72%
+ 358/359
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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",/^
+
+
+
+
+