From c81b07cec82af15f7088205467ec6b35f52faa74 Mon Sep 17 00:00:00 2001 From: Carson Gross Date: Sun, 20 Oct 2024 16:29:46 -0600 Subject: [PATCH] release prep --- dist/_hyperscript.d.ts | 240 +- dist/_hyperscript.js | 55 +- dist/_hyperscript.min.js | 2 +- dist/_hyperscript.min.js.gz | Bin 25536 -> 25629 bytes dist/ext/tailwind.js | 43 + www/js/_hyperscript.min.js | 2 +- ...24-10-20-hyperscript-0.9.13-is-released.md | 6 + www/test/0.9.13/dist/_hyperscript.d.ts | 53131 ++++++++++++++++ www/test/0.9.13/dist/_hyperscript.js | 7712 +++ www/test/0.9.13/dist/_hyperscript.min.js | 1 + www/test/0.9.13/dist/_hyperscript.min.js.gz | Bin 0 -> 25629 bytes www/test/0.9.13/dist/bin/node-hyperscript.js | 57 + www/test/0.9.13/dist/deno-hyperscript.js | 66 + www/test/0.9.13/dist/eventsource.d.ts | 23 + www/test/0.9.13/dist/eventsource.js | 232 + www/test/0.9.13/dist/ext/tailwind.js | 43 + www/test/0.9.13/dist/hdb.js | 530 + www/test/0.9.13/dist/hdb.min.js | 1 + www/test/0.9.13/dist/node-hyperscript.js | 57 + www/test/0.9.13/dist/socket.js | 205 + www/test/0.9.13/dist/template.js | 86 + www/test/0.9.13/dist/worker.js | 172 + www/test/0.9.13/node_modules/chai/chai.js | 11464 ++++ www/test/0.9.13/node_modules/mocha/mocha.css | 325 + www/test/0.9.13/node_modules/mocha/mocha.js | 18648 ++++++ .../0.9.13/node_modules/sinon/pkg/sinon.js | 16184 +++++ www/test/0.9.13/src/_hyperscript.d.ts | 1 + www/test/0.9.13/src/_hyperscript.js | 7712 +++ www/test/0.9.13/src/deno-hyperscript.js | 66 + www/test/0.9.13/src/eventsource.d.ts | 23 + www/test/0.9.13/src/eventsource.js | 232 + www/test/0.9.13/src/ext/tailwind.js | 43 + www/test/0.9.13/src/hdb.js | 530 + www/test/0.9.13/src/node-hyperscript.js | 57 + www/test/0.9.13/src/socket.js | 205 + www/test/0.9.13/src/template.js | 86 + www/test/0.9.13/src/worker.js | 172 + www/test/0.9.13/test/commands/add.js | 121 + www/test/0.9.13/test/commands/append.js | 76 + www/test/0.9.13/test/commands/async.js | 41 + www/test/0.9.13/test/commands/call.js | 97 + www/test/0.9.13/test/commands/default.js | 46 + www/test/0.9.13/test/commands/fetch.js | 327 + .../0.9.13/test/commands/fetch/response.txt | 1 + .../0.9.13/test/commands/fetch/scratch.html | 71 + www/test/0.9.13/test/commands/fetch/server.py | 28 + www/test/0.9.13/test/commands/hide.js | 131 + www/test/0.9.13/test/commands/if.js | 208 + www/test/0.9.13/test/commands/increment.js | 120 + www/test/0.9.13/test/commands/js.js | 50 + www/test/0.9.13/test/commands/log.js | 28 + www/test/0.9.13/test/commands/make.js | 60 + www/test/0.9.13/test/commands/measure.js | 43 + www/test/0.9.13/test/commands/pick.js | 119 + .../0.9.13/test/commands/pseudoCommand.js | 141 + www/test/0.9.13/test/commands/put.js | 274 + www/test/0.9.13/test/commands/remove.js | 85 + www/test/0.9.13/test/commands/repeat.js | 299 + www/test/0.9.13/test/commands/send.js | 74 + www/test/0.9.13/test/commands/set.js | 197 + www/test/0.9.13/test/commands/settle.js | 29 + www/test/0.9.13/test/commands/show.js | 164 + www/test/0.9.13/test/commands/take.js | 194 + www/test/0.9.13/test/commands/tell.js | 236 + www/test/0.9.13/test/commands/throw.js | 200 + www/test/0.9.13/test/commands/toggle.js | 189 + www/test/0.9.13/test/commands/transition.js | 194 + www/test/0.9.13/test/commands/trigger.js | 65 + .../0.9.13/test/commands/unlessModifier.js | 25 + www/test/0.9.13/test/commands/wait.js | 138 + www/test/0.9.13/test/core/api.js | 20 + www/test/0.9.13/test/core/bootstrap.js | 141 + www/test/0.9.13/test/core/parser.js | 110 + www/test/0.9.13/test/core/regressions.js | 153 + www/test/0.9.13/test/core/runtime.js | 142 + www/test/0.9.13/test/core/runtimeErrors.js | 107 + www/test/0.9.13/test/core/scoping.js | 256 + www/test/0.9.13/test/core/security.js | 15 + www/test/0.9.13/test/core/sourceInfo.js | 59 + www/test/0.9.13/test/core/tokenizer.js | 454 + www/test/0.9.13/test/eventSource/scratch.html | 117 + .../0.9.13/test/expressions/arrayIndex.js | 119 + .../0.9.13/test/expressions/arrayLiteral.js | 16 + .../0.9.13/test/expressions/asExpression.js | 342 + www/test/0.9.13/test/expressions/async.js | 29 + .../0.9.13/test/expressions/attributeRef.js | 142 + www/test/0.9.13/test/expressions/beep!.js | 69 + .../0.9.13/test/expressions/blockLiteral.js | 21 + www/test/0.9.13/test/expressions/boolean.js | 11 + www/test/0.9.13/test/expressions/classRef.js | 50 + www/test/0.9.13/test/expressions/closest.js | 103 + .../test/expressions/comparisonOperator.js | 614 + www/test/0.9.13/test/expressions/cookies.js | 42 + .../0.9.13/test/expressions/functionCalls.js | 68 + www/test/0.9.13/test/expressions/idRef.js | 32 + www/test/0.9.13/test/expressions/in.js | 80 + .../test/expressions/logicalOperator.js | 26 + .../0.9.13/test/expressions/mathOperator.js | 54 + www/test/0.9.13/test/expressions/no.js | 26 + www/test/0.9.13/test/expressions/not.js | 16 + www/test/0.9.13/test/expressions/null.js | 6 + www/test/0.9.13/test/expressions/numbers.js | 27 + .../0.9.13/test/expressions/objectLiteral.js | 37 + .../test/expressions/positionalExpression.js | 65 + .../test/expressions/possessiveExpression.js | 144 + .../0.9.13/test/expressions/propertyAccess.js | 37 + www/test/0.9.13/test/expressions/queryRef.js | 101 + .../relativePositionalExpression.js | 255 + www/test/0.9.13/test/expressions/some.js | 31 + .../0.9.13/test/expressions/stringPostfix.js | 39 + www/test/0.9.13/test/expressions/strings.js | 65 + www/test/0.9.13/test/expressions/styleRef.js | 126 + www/test/0.9.13/test/expressions/symbol.js | 11 + www/test/0.9.13/test/expressions/typecheck.js | 36 + www/test/0.9.13/test/ext/tailwind.js | 100 + www/test/0.9.13/test/features/behavior.js | 104 + www/test/0.9.13/test/features/def.js | 383 + www/test/0.9.13/test/features/init.js | 47 + www/test/0.9.13/test/features/js.js | 67 + www/test/0.9.13/test/features/on.js | 797 + www/test/0.9.13/test/features/set.js | 19 + www/test/0.9.13/test/features/socket.js | 50 + www/test/0.9.13/test/features/worker.js | 134 + www/test/0.9.13/test/index.html | 157 + www/test/0.9.13/test/playground/scratch.html | 123 + .../0.9.13/test/playground/tailwinds.html | 235 + www/test/0.9.13/test/sockets/asyncio | 0 www/test/0.9.13/test/sockets/json | 0 www/test/0.9.13/test/sockets/scratch.html | 51 + www/test/0.9.13/test/sockets/server.py | 37 + www/test/0.9.13/test/sockets/websockets | 0 www/test/0.9.13/test/templates/templates.js | 53 + www/test/0.9.13/test/util/util.js | 133 + www/test/index.html | 1 + 134 files changed, 129258 insertions(+), 130 deletions(-) create mode 100644 dist/ext/tailwind.js create mode 100644 www/test/0.9.13/dist/_hyperscript.d.ts create mode 100644 www/test/0.9.13/dist/_hyperscript.js create mode 100644 www/test/0.9.13/dist/_hyperscript.min.js create mode 100644 www/test/0.9.13/dist/_hyperscript.min.js.gz create mode 100755 www/test/0.9.13/dist/bin/node-hyperscript.js create mode 100644 www/test/0.9.13/dist/deno-hyperscript.js create mode 100644 www/test/0.9.13/dist/eventsource.d.ts create mode 100644 www/test/0.9.13/dist/eventsource.js create mode 100644 www/test/0.9.13/dist/ext/tailwind.js create mode 100644 www/test/0.9.13/dist/hdb.js create mode 100644 www/test/0.9.13/dist/hdb.min.js create mode 100755 www/test/0.9.13/dist/node-hyperscript.js create mode 100644 www/test/0.9.13/dist/socket.js create mode 100644 www/test/0.9.13/dist/template.js create mode 100644 www/test/0.9.13/dist/worker.js create mode 100644 www/test/0.9.13/node_modules/chai/chai.js create mode 100644 www/test/0.9.13/node_modules/mocha/mocha.css create mode 100644 www/test/0.9.13/node_modules/mocha/mocha.js create mode 100644 www/test/0.9.13/node_modules/sinon/pkg/sinon.js create mode 100644 www/test/0.9.13/src/_hyperscript.d.ts create mode 100644 www/test/0.9.13/src/_hyperscript.js create mode 100644 www/test/0.9.13/src/deno-hyperscript.js create mode 100644 www/test/0.9.13/src/eventsource.d.ts create mode 100644 www/test/0.9.13/src/eventsource.js create mode 100644 www/test/0.9.13/src/ext/tailwind.js create mode 100644 www/test/0.9.13/src/hdb.js create mode 100755 www/test/0.9.13/src/node-hyperscript.js create mode 100644 www/test/0.9.13/src/socket.js create mode 100644 www/test/0.9.13/src/template.js create mode 100644 www/test/0.9.13/src/worker.js create mode 100644 www/test/0.9.13/test/commands/add.js create mode 100644 www/test/0.9.13/test/commands/append.js create mode 100644 www/test/0.9.13/test/commands/async.js create mode 100644 www/test/0.9.13/test/commands/call.js create mode 100644 www/test/0.9.13/test/commands/default.js create mode 100644 www/test/0.9.13/test/commands/fetch.js create mode 100644 www/test/0.9.13/test/commands/fetch/response.txt create mode 100644 www/test/0.9.13/test/commands/fetch/scratch.html create mode 100644 www/test/0.9.13/test/commands/fetch/server.py create mode 100644 www/test/0.9.13/test/commands/hide.js create mode 100644 www/test/0.9.13/test/commands/if.js create mode 100644 www/test/0.9.13/test/commands/increment.js create mode 100644 www/test/0.9.13/test/commands/js.js create mode 100644 www/test/0.9.13/test/commands/log.js create mode 100644 www/test/0.9.13/test/commands/make.js create mode 100644 www/test/0.9.13/test/commands/measure.js create mode 100644 www/test/0.9.13/test/commands/pick.js create mode 100644 www/test/0.9.13/test/commands/pseudoCommand.js create mode 100644 www/test/0.9.13/test/commands/put.js create mode 100644 www/test/0.9.13/test/commands/remove.js create mode 100644 www/test/0.9.13/test/commands/repeat.js create mode 100644 www/test/0.9.13/test/commands/send.js create mode 100644 www/test/0.9.13/test/commands/set.js create mode 100644 www/test/0.9.13/test/commands/settle.js create mode 100644 www/test/0.9.13/test/commands/show.js create mode 100644 www/test/0.9.13/test/commands/take.js create mode 100644 www/test/0.9.13/test/commands/tell.js create mode 100644 www/test/0.9.13/test/commands/throw.js create mode 100644 www/test/0.9.13/test/commands/toggle.js create mode 100644 www/test/0.9.13/test/commands/transition.js create mode 100644 www/test/0.9.13/test/commands/trigger.js create mode 100644 www/test/0.9.13/test/commands/unlessModifier.js create mode 100644 www/test/0.9.13/test/commands/wait.js create mode 100644 www/test/0.9.13/test/core/api.js create mode 100644 www/test/0.9.13/test/core/bootstrap.js create mode 100644 www/test/0.9.13/test/core/parser.js create mode 100644 www/test/0.9.13/test/core/regressions.js create mode 100644 www/test/0.9.13/test/core/runtime.js create mode 100644 www/test/0.9.13/test/core/runtimeErrors.js create mode 100644 www/test/0.9.13/test/core/scoping.js create mode 100644 www/test/0.9.13/test/core/security.js create mode 100644 www/test/0.9.13/test/core/sourceInfo.js create mode 100644 www/test/0.9.13/test/core/tokenizer.js create mode 100644 www/test/0.9.13/test/eventSource/scratch.html create mode 100644 www/test/0.9.13/test/expressions/arrayIndex.js create mode 100644 www/test/0.9.13/test/expressions/arrayLiteral.js create mode 100644 www/test/0.9.13/test/expressions/asExpression.js create mode 100644 www/test/0.9.13/test/expressions/async.js create mode 100644 www/test/0.9.13/test/expressions/attributeRef.js create mode 100644 www/test/0.9.13/test/expressions/beep!.js create mode 100644 www/test/0.9.13/test/expressions/blockLiteral.js create mode 100644 www/test/0.9.13/test/expressions/boolean.js create mode 100644 www/test/0.9.13/test/expressions/classRef.js create mode 100644 www/test/0.9.13/test/expressions/closest.js create mode 100644 www/test/0.9.13/test/expressions/comparisonOperator.js create mode 100644 www/test/0.9.13/test/expressions/cookies.js create mode 100644 www/test/0.9.13/test/expressions/functionCalls.js create mode 100644 www/test/0.9.13/test/expressions/idRef.js create mode 100644 www/test/0.9.13/test/expressions/in.js create mode 100644 www/test/0.9.13/test/expressions/logicalOperator.js create mode 100644 www/test/0.9.13/test/expressions/mathOperator.js create mode 100644 www/test/0.9.13/test/expressions/no.js create mode 100644 www/test/0.9.13/test/expressions/not.js create mode 100644 www/test/0.9.13/test/expressions/null.js create mode 100644 www/test/0.9.13/test/expressions/numbers.js create mode 100644 www/test/0.9.13/test/expressions/objectLiteral.js create mode 100644 www/test/0.9.13/test/expressions/positionalExpression.js create mode 100644 www/test/0.9.13/test/expressions/possessiveExpression.js create mode 100644 www/test/0.9.13/test/expressions/propertyAccess.js create mode 100644 www/test/0.9.13/test/expressions/queryRef.js create mode 100644 www/test/0.9.13/test/expressions/relativePositionalExpression.js create mode 100644 www/test/0.9.13/test/expressions/some.js create mode 100644 www/test/0.9.13/test/expressions/stringPostfix.js create mode 100644 www/test/0.9.13/test/expressions/strings.js create mode 100644 www/test/0.9.13/test/expressions/styleRef.js create mode 100644 www/test/0.9.13/test/expressions/symbol.js create mode 100644 www/test/0.9.13/test/expressions/typecheck.js create mode 100644 www/test/0.9.13/test/ext/tailwind.js create mode 100644 www/test/0.9.13/test/features/behavior.js create mode 100644 www/test/0.9.13/test/features/def.js create mode 100644 www/test/0.9.13/test/features/init.js create mode 100644 www/test/0.9.13/test/features/js.js create mode 100644 www/test/0.9.13/test/features/on.js create mode 100644 www/test/0.9.13/test/features/set.js create mode 100644 www/test/0.9.13/test/features/socket.js create mode 100644 www/test/0.9.13/test/features/worker.js create mode 100644 www/test/0.9.13/test/index.html create mode 100644 www/test/0.9.13/test/playground/scratch.html create mode 100644 www/test/0.9.13/test/playground/tailwinds.html create mode 100644 www/test/0.9.13/test/sockets/asyncio create mode 100644 www/test/0.9.13/test/sockets/json create mode 100644 www/test/0.9.13/test/sockets/scratch.html create mode 100644 www/test/0.9.13/test/sockets/server.py create mode 100644 www/test/0.9.13/test/sockets/websockets create mode 100644 www/test/0.9.13/test/templates/templates.js create mode 100644 www/test/0.9.13/test/util/util.js diff --git a/dist/_hyperscript.d.ts b/dist/_hyperscript.d.ts index f1f0acd8..e09cba57 100644 --- a/dist/_hyperscript.d.ts +++ b/dist/_hyperscript.d.ts @@ -1506,12 +1506,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -2318,12 +2318,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -3459,12 +3459,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -4600,12 +4600,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -7094,12 +7094,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -8236,12 +8236,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -9378,12 +9378,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -10520,12 +10520,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -11662,12 +11662,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -13494,12 +13494,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -14651,12 +14651,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -16150,12 +16150,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -16958,12 +16958,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -17770,12 +17770,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -18911,12 +18911,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -20052,12 +20052,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -22546,12 +22546,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -23688,12 +23688,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -24830,12 +24830,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -25972,12 +25972,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -27114,12 +27114,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -28946,12 +28946,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -30103,12 +30103,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -32274,12 +32274,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -33421,12 +33421,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -34233,12 +34233,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -35374,12 +35374,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -36515,12 +36515,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -39009,12 +39009,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -40151,12 +40151,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -41293,12 +41293,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -42435,12 +42435,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -43577,12 +43577,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -45409,12 +45409,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -46566,12 +46566,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -48063,12 +48063,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -48888,12 +48888,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -50026,12 +50026,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -51164,12 +51164,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. @@ -52302,12 +52302,12 @@ declare const _hyperscript: { triggerEvent(elt: Element, eventName: string, detail?: any, sender?: Element): boolean; /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ - isArrayLike(value: any): value is any[] | NodeList; + isArrayLike(value: any): value is any[] | NodeList | HTMLCollection | FileList; /** * isIterable returns `true` if the provided value supports the * iterator protocol. diff --git a/dist/_hyperscript.js b/dist/_hyperscript.js index 8ae4cd82..7b7a7f02 100644 --- a/dist/_hyperscript.js +++ b/dist/_hyperscript.js @@ -262,7 +262,9 @@ tokens.push(consumeShortAttributeReference()); } else if (currentChar() === "*" && Lexer.isAlpha(nextChar())) { tokens.push(consumeStyleReference()); - } else if (Lexer.isAlpha(currentChar()) || (!inTemplate() && Lexer.isIdentifierChar(currentChar()))) { + } else if (inTemplate() && (Lexer.isAlpha(currentChar()) || currentChar() === "\\")) { + tokens.push(consumeTemplateIdentifier()); + } else if (!inTemplate() && (Lexer.isAlpha(currentChar()) || Lexer.isIdentifierChar(currentChar()))) { tokens.push(consumeIdentifier()); } else if (Lexer.isNumeric(currentChar())) { tokens.push(consumeNumber()); @@ -441,6 +443,40 @@ return idRef; } + /** + * @returns Token + */ + function consumeTemplateIdentifier() { + var identifier = makeToken("IDENTIFIER"); + var value = consumeChar(); + var escd = value === "\\"; + if (escd) { + value = ""; + } + while (Lexer.isAlpha(currentChar()) || + Lexer.isNumeric(currentChar()) || + Lexer.isIdentifierChar(currentChar()) || + currentChar() === "\\" || + currentChar() === "{" || + currentChar() === "}" ) { + if (currentChar() === "$" && escd === false) { + break; + } else if (currentChar() === "\\") { + escd = true; + consumeChar(); + } else { + escd = false; + value += consumeChar(); + } + } + if (currentChar() === "!" && value === "beep") { + value += consumeChar(); + } + identifier.value = value; + identifier.end = position; + return identifier; + } + /** * @returns Token */ @@ -524,6 +560,7 @@ function consumeString() { var string = makeToken("STRING"); var startChar = consumeChar(); // consume leading quote + string.template = startChar === "`"; var value = ""; while (currentChar() && currentChar() !== startChar) { if (currentChar() === "\\") { @@ -541,6 +578,8 @@ value += "\t"; } else if (nextChar === "v") { value += "\v"; + } else if (string.template && nextChar === "$") { + value += "\\$"; } else if (nextChar === "x") { const hex = consumeHexEscape(); if (Number.isNaN(hex)) { @@ -561,7 +600,6 @@ } string.value = value; string.end = position; - string.template = startChar === "`"; return string; } @@ -1453,6 +1491,7 @@ evt = new Event(eventName, { bubbles: true, cancelable: true, + composed: true, }); evt['detail'] = detail; } else { @@ -1479,14 +1518,14 @@ /** * isArrayLike returns `true` if the provided value is an array or - * a NodeList (which is close enough to being an array for our purposes). + * something close enough to being an array for our purposes. * * @param {any} value - * @returns {value is Array | NodeList} + * @returns {value is Array | NodeList | HTMLCollection | FileList} */ isArrayLike(value) { return Array.isArray(value) || - (typeof NodeList !== 'undefined' && (value instanceof NodeList || value instanceof HTMLCollection)); + (typeof NodeList !== 'undefined' && (value instanceof NodeList || value instanceof HTMLCollection || value instanceof FileList)); } /** @@ -6522,7 +6561,7 @@ }); }); } else { - runtime.forEach(on, function (target) { + runtime.implicitLoop(on, function (target) { if (target.hasAttribute(attributeRef.name)) { target.removeAttribute(attributeRef.name); } else { @@ -7030,12 +7069,12 @@ if (tokens.matchToken("over")) { var over = parser.requireElement("expression", tokens); } else if (tokens.matchToken("using")) { - var using = parser.requireElement("expression", tokens); + var usingExpr = parser.requireElement("expression", tokens); } var transition = { to: to, - args: [targetsExpr, properties, from, to, using, over], + args: [targetsExpr, properties, from, to, usingExpr, over], op: function (context, targets, properties, from, to, using, over) { runtime.nullCheck(targets, targetsExpr); var promises = []; diff --git a/dist/_hyperscript.min.js b/dist/_hyperscript.min.js index fd87a284..810c119f 100644 --- a/dist/_hyperscript.min.js +++ b/dist/_hyperscript.min.js @@ -1 +1 @@ -(function(e,t){const r=t(e);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=r}else{e["_hyperscript"]=r;if("document"in e)e["_hyperscript"].browserInit()}})(typeof self!=="undefined"?self:this,(e=>{"use strict";const t={dynamicResolvers:[function(e,t){if(e==="Fixed"){return Number(t).toFixed()}else if(e.indexOf("Fixed:")===0){let r=e.split(":")[1];return Number(t).toFixed(parseInt(r))}}],String:function(e){if(e.toString){return e.toString()}else{return""+e}},Int:function(e){return parseInt(e)},Float:function(e){return parseFloat(e)},Number:function(e){return Number(e)},Date:function(e){return new Date(e)},Array:function(e){return Array.from(e)},JSON:function(e){return JSON.stringify(e)},Object:function(e){if(e instanceof String){e=e.toString()}if(typeof e==="string"){return JSON.parse(e)}else{return Object.assign({},e)}}};const r={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:t};class n{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS"};static isValidCSSClassChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isValidCSSIDChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isWhitespace(e){return e===" "||e==="\t"||n.isNewline(e)}static positionString(e){return"[Line: "+e.line+", Column: "+e.column+"]"}static isNewline(e){return e==="\r"||e==="\n"}static isNumeric(e){return e>="0"&&e<="9"}static isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}static isIdentifierChar(e,t){return e==="_"||e==="$"}static isReservedChar(e){return e==="`"||e==="^"}static isValidSingleQuoteStringStart(e){if(e.length>0){var t=e[e.length-1];if(t.type==="IDENTIFIER"||t.type==="CLASS_REF"||t.type==="ID_REF"){return false}if(t.op&&(t.value===">"||t.value===")")){return false}}return true}static tokenize(e,t){var r=[];var a=e;var o=0;var s=0;var u=1;var l="";var c=0;function f(){return t&&c===0}while(o=0){return this.consumeToken()}}requireToken(e,t){var r=this.matchToken(e,t);if(r){return r}else{this.raiseError(this,"Expected '"+e+"' but found '"+this.currentToken().value+"'")}}peekToken(e,t,r){t=t||0;r=r||"IDENTIFIER";if(this.tokens[t]&&this.tokens[t].value===e&&this.tokens[t].type===r){return this.tokens[t]}}matchToken(e,t){if(this.follows.indexOf(e)!==-1){return}t=t||"IDENTIFIER";if(this.currentToken()&&this.currentToken().value===e&&this.currentToken().type===t){return this.consumeToken()}}consumeToken(){var e=this.tokens.shift();this.consumed.push(e);this._lastConsumed=e;this.consumeWhitespace();return e}consumeUntil(e,t){var r=[];var n=this.token(0,true);while((t==null||n.type!==t)&&(e==null||n.value!==e)&&n.type!=="EOF"){var i=this.tokens.shift();this.consumed.push(i);r.push(n);n=this.token(0,true)}this.consumeWhitespace();return r}lastWhitespace(){if(this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"){return this.consumed[this.consumed.length-1].value}else{return""}}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(e,t){var r;var n=0;do{if(!t){while(this.tokens[n]&&this.tokens[n].type==="WHITESPACE"){n++}}r=this.tokens[n];e--;n++}while(e>-1);if(r){return r}else{return{type:"EOF",value:"<<>>"}}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split("\n")[this.startToken.line-1]};follows=[];pushFollow(e){this.follows.push(e)}popFollow(){this.follows.pop()}clearFollows(){var e=this.follows;this.follows=[];return e}restoreFollows(e){this.follows=e}}class a{constructor(e){this.runtime=e;this.possessivesDisabled=false;this.addGrammarElement("feature",(function(e,t,r){if(r.matchOpToken("(")){var n=e.requireElement("feature",r);r.requireOpToken(")");return n}var i=e.FEATURES[r.currentToken().value||""];if(i){return i(e,t,r)}}));this.addGrammarElement("command",(function(e,t,r){if(r.matchOpToken("(")){const t=e.requireElement("command",r);r.requireOpToken(")");return t}var n=e.COMMANDS[r.currentToken().value||""];let i;if(n){i=n(e,t,r)}else if(r.currentToken().type==="IDENTIFIER"){i=e.parseElement("pseudoCommand",r)}if(i){return e.parseElement("indirectStatement",r,i)}return i}));this.addGrammarElement("commandList",(function(e,t,r){if(r.hasMore()){var n=e.parseElement("command",r);if(n){r.matchToken("then");const t=e.parseElement("commandList",r);if(t)n.next=t;return n}}return{type:"emptyCommandListCommand",op:function(e){return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}));this.addGrammarElement("leaf",(function(e,t,r){var n=e.parseAnyOf(e.LEAF_EXPRESSIONS,r);if(n==null){return e.parseElement("symbol",r)}return n}));this.addGrammarElement("indirectExpression",(function(e,t,r,n){for(var i=0;i{this.unifiedExec(e,t)})).catch((e=>{this.unifiedExec({op:function(){throw e}},t)}));return}else if(r===o.HALT){if(t.meta.finallyHandler&&!t.meta.handlingFinally){t.meta.handlingFinally=true;e=t.meta.finallyHandler}else{if(t.meta.onHalt){t.meta.onHalt()}if(t.meta.currentException){if(t.meta.reject){t.meta.reject(t.meta.currentException);return}else{throw t.meta.currentException}}else{return}}}else{e=r}}}unifiedEval(e,t){var r=[t];var n=false;var i=false;if(e.args){for(var a=0;a{r=this.wrapArrays(r);Promise.all(r).then((function(r){if(i){this.unwrapAsyncs(r)}try{var a=e.op.apply(e,r);t(a)}catch(e){n(e)}})).catch((function(e){n(e)}))}))}else{if(i){this.unwrapAsyncs(r)}return e.op.apply(e,r)}}_scriptAttrs=null;getScriptAttributes(){if(this._scriptAttrs==null){this._scriptAttrs=r.attributes.replace(/ /g,"").split(",")}return this._scriptAttrs}getScript(e){for(var t=0;t{this.initElement(e,e instanceof HTMLScriptElement&&e.type==="text/hyperscript"?document.body:e)}))}}initElement(e,t){if(e.closest&&e.closest(r.disableSelector)){return}var n=this.getInternalData(e);if(!n.initialized){var i=this.getScript(e);if(i){try{n.initialized=true;n.script=i;const r=this.lexer,s=this.parser;var a=r.tokenize(i);var o=s.parseHyperScript(a);if(!o)return;o.apply(t||e,e);setTimeout((()=>{this.triggerEvent(t||e,"load",{hyperscript:true})}),1)}catch(t){this.triggerEvent(e,"exception",{error:t});console.error("hyperscript errors were found on the following element:",e,"\n\n",t.message,t.stack)}}}}internalDataMap=new WeakMap;getInternalData(e){var t=this.internalDataMap.get(e);if(typeof t==="undefined"){this.internalDataMap.set(e,t={})}return t}typeCheck(e,t,r){if(e==null&&r){return true}var n=Object.prototype.toString.call(e).slice(8,-1);return n===t}getElementScope(e){var t=e.meta&&e.meta.owner;if(t){var r=this.getInternalData(t);var n="elementScope";if(e.meta.feature&&e.meta.feature.behavior){n=e.meta.feature.behavior+"Scope"}var i=h(r,n);return i}else{return{}}}isReservedWord(e){return["meta","it","result","locals","event","target","detail","sender","body"].includes(e)}isHyperscriptContext(e){return e instanceof f}resolveSymbol(t,r,n){if(t==="me"||t==="my"||t==="I"){return r.me}if(t==="it"||t==="its"||t==="result"){return r.result}if(t==="you"||t==="your"||t==="yourself"){return r.you}else{if(n==="global"){return e[t]}else if(n==="element"){var i=this.getElementScope(r);return i[t]}else if(n==="local"){return r.locals[t]}else{if(r.meta&&r.meta.context){var a=r.meta.context[t];if(typeof a!=="undefined"){return a}if(r.meta.context.detail){a=r.meta.context.detail[t];if(typeof a!=="undefined"){return a}}}if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){var o=r.locals[t]}else{var o=r[t]}if(typeof o!=="undefined"){return o}else{var i=this.getElementScope(r);o=i[t];if(typeof o!=="undefined"){return o}else{return e[t]}}}}}setSymbol(t,r,n,i){if(n==="global"){e[t]=i}else if(n==="element"){var a=this.getElementScope(r);a[t]=i}else if(n==="local"){r.locals[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)&&typeof r.locals[t]!=="undefined"){r.locals[t]=i}else{var a=this.getElementScope(r);var o=a[t];if(typeof o!=="undefined"){a[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){r.locals[t]=i}else{r[t]=i}}}}}findNext(e,t){if(e){if(e.resolveNext){return e.resolveNext(t)}else if(e.next){return e.next}else{return this.findNext(e.parent,t)}}}flatGet(e,t,r){if(e!=null){var n=r(e,t);if(typeof n!=="undefined"){return n}if(this.shouldAutoIterate(e)){var i=[];for(var a of e){var o=r(a,t);i.push(o)}return i}}}resolveProperty(e,t){return this.flatGet(e,t,((e,t)=>e[t]))}resolveAttribute(e,t){return this.flatGet(e,t,((e,t)=>e.getAttribute&&e.getAttribute(t)))}resolveStyle(e,t){return this.flatGet(e,t,((e,t)=>e.style&&e.style[t]))}resolveComputedStyle(e,t){return this.flatGet(e,t,((e,t)=>getComputedStyle(e).getPropertyValue(t)))}assignToNamespace(t,r,n,i){let a;if(typeof document!=="undefined"&&t===document.body){a=e}else{a=this.getHyperscriptFeatures(t)}var o;while((o=r.shift())!==undefined){var s=a[o];if(s==null){s={};a[o]=s}a=s}a[n]=i}getHyperTrace(e,t){var r=[];var n=e;while(n.meta.caller){n=n.meta.caller}if(n.meta.traceMap){return n.meta.traceMap.get(t,r)}}registerHyperTrace(e,t){var r=[];var n=null;while(e!=null){r.push(e);n=e;e=e.meta.caller}if(n.meta.traceMap==null){n.meta.traceMap=new Map}if(!n.meta.traceMap.get(t)){var i={trace:r,print:function(e){e=e||console.error;e("hypertrace /// ");var t=0;for(var n=0;n",i.meta.feature.displayName.padEnd(t+2),"-",i.meta.owner)}}};n.meta.traceMap.set(t,i)}}escapeSelector(e){return e.replace(/:/g,(function(e){return"\\"+e}))}nullCheck(e,t){if(e==null){throw new Error("'"+t.sourceFor()+"' is null")}}isEmpty(e){return e==undefined||e.length===0}doesExist(e){if(e==null){return false}if(this.shouldAutoIterate(e)){for(const t of e){return true}return false}return true}getRootNode(e){if(e&&e instanceof Node){var t=e.getRootNode();if(t instanceof Document||t instanceof ShadowRoot)return t}return document}getEventQueueFor(e,t){let r=this.getInternalData(e);var n=r.eventQueues;if(n==null){n=new Map;r.eventQueues=n}var i=n.get(t);if(i==null){i={queue:[],executing:false};n.set(t,i)}return i}beepValueToConsole(e,t,r){if(this.triggerEvent(e,"hyperscript:beep",{element:e,expression:t,value:r})){var n;if(r){if(r instanceof m){n="ElementCollection"}else if(r.constructor){n=r.constructor.name}else{n="unknown"}}else{n="object (null)"}var a=r;if(n==="String"){a='"'+a+'"'}else if(r instanceof m){a=Array.from(r)}console.log("///_ BEEP! The expression ("+i.sourceFor.call(t).replace("beep! ","")+") evaluates to:",a,"of type "+n)}}hyperscriptUrl="document"in e&&document.currentScript?document.currentScript.src:null}function s(){let e=document.cookie.split("; ").map((e=>{let t=e.split("=");return{name:t[0],value:decodeURIComponent(t[1])}}));return e}function u(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function l(){for(const e of s()){u(e.name)}}const c=new Proxy({},{get(e,t){if(t==="then"||t==="asyncWrapper"){return null}else if(t==="length"){return s().length}else if(t==="clear"){return u}else if(t==="clearAll"){return l}else if(typeof t==="string"){if(!isNaN(t)){return s()[parseInt(t)]}else{let e=document.cookie.split("; ").find((e=>e.startsWith(t+"=")))?.split("=")[1];if(e){return decodeURIComponent(e)}}}else if(t===Symbol.iterator){return s()[t]}},set(e,t,r){var n=null;if("string"===typeof r){n=encodeURIComponent(r);n+=";samesite=lax"}else{n=encodeURIComponent(r.value);if(r.expires){n+=";expires="+r.maxAge}if(r.maxAge){n+=";max-age="+r.maxAge}if(r.partitioned){n+=";partitioned="+r.partitioned}if(r.path){n+=";path="+r.path}if(r.samesite){n+=";samesite="+r.path}if(r.secure){n+=";secure="+r.path}}document.cookie=t+"="+n;return true}});class f{constructor(t,r,n,i,a){this.meta={parser:a.parser,lexer:a.lexer,runtime:a,owner:t,feature:r,iterators:{},ctx:this};this.locals={cookies:c};this.me=n,this.you=undefined;this.result=undefined;this.event=i;this.target=i?i.target:null;this.detail=i?i.detail:null;this.sender=i?i.detail?i.detail.sender:null:null;this.body="document"in e?document.body:null;a.addFeatures(t,this)}}class m{constructor(e,t,r){this._css=e;this.relativeToElement=t;this.escape=r;this[p]=true}get css(){if(this.escape){return o.prototype.escapeSelector(this._css)}else{return this._css}}get className(){return this._css.substr(1)}get id(){return this.className()}contains(e){for(let t of this){if(t.contains(e)){return true}}return false}get length(){return this.selectMatches().length}[Symbol.iterator](){let e=this.selectMatches();return e[Symbol.iterator]()}selectMatches(){let e=o.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css);return e}}const p=Symbol();function h(e,t){var r=e[t];if(r){return r}else{var n={};e[t]=n;return n}}function v(e){try{return JSON.parse(e)}catch(e){d(e);return null}}function d(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function E(e,t){return new(e.bind.apply(e,[e].concat(t)))}function T(t){t.addLeafExpression("parenthesized",(function(e,t,r){if(r.matchOpToken("(")){var n=r.clearFollows();try{var i=e.requireElement("expression",r)}finally{r.restoreFollows(n)}r.requireOpToken(")");return i}}));t.addLeafExpression("string",(function(e,t,r){var i=r.matchTokenType("STRING");if(!i)return;var a=i.value;var o;if(i.template){var s=n.tokenize(a,true);o=e.parseStringTemplate(s)}else{o=[]}return{type:"string",token:i,args:o,op:function(e){var t="";for(var r=1;re instanceof Element))}get css(){let e="",t=0;for(const r of this.templateParts){if(r instanceof Element){e+="[data-hs-query-id='"+t+++"']"}else e+=r}return e}[Symbol.iterator](){this.elements.forEach(((e,t)=>e.dataset.hsQueryId=t));const e=super[Symbol.iterator]();this.elements.forEach((e=>e.removeAttribute("data-hs-query-id")));return e}}t.addLeafExpression("queryRef",(function(e,t,i){var a=i.matchOpToken("<");if(!a)return;var o=i.consumeUntil("/");i.requireOpToken("/");i.requireOpToken(">");var s=o.map((function(e){if(e.type==="STRING"){return'"'+e.value+'"'}else{return e.value}})).join("");var u,l,c;if(s.indexOf("$")>=0){u=true;l=n.tokenize(s,true);c=e.parseStringTemplate(l)}return{type:"queryRef",css:s,args:c,op:function(e,...t){if(u){return new r(s,e.me,t)}else{return new m(s,e.me)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("attributeRef",(function(e,t,r){var n=r.matchTokenType("ATTRIBUTE_REF");if(!n)return;if(!n.value)return;var i=n.value;if(i.indexOf("[")===0){var a=i.substring(2,i.length-1)}else{var a=i.substring(1)}var o="["+a+"]";var s=a.split("=");var u=s[0];var l=s[1];if(l){if(l.indexOf('"')===0){l=l.substring(1,l.length-1)}}return{type:"attributeRef",name:u,css:o,value:l,op:function(e){var t=e.you||e.me;if(t){return t.getAttribute(u)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("styleRef",(function(e,t,r){var n=r.matchTokenType("STYLE_REF");if(!n)return;if(!n.value)return;var i=n.value.substr(1);if(i.startsWith("computed-")){i=i.substr("computed-".length);return{type:"computedStyleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveComputedStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}else{return{type:"styleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}}));t.addGrammarElement("objectKey",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{type:"objectKey",key:n.value,evaluate:function(){return n.value}}}else if(r.matchOpToken("[")){var i=e.parseElement("expression",r);r.requireOpToken("]");return{type:"objectKey",expr:i,args:[i],op:function(e,t){return t},evaluate:function(e){return t.unifiedEval(this,e)}}}else{var a="";do{n=r.matchTokenType("IDENTIFIER")||r.matchOpToken("-");if(n)a+=n.value}while(n);return{type:"objectKey",key:a,evaluate:function(){return a}}}}));t.addLeafExpression("objectLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[];var i=[];if(!r.matchOpToken("}")){do{var a=e.requireElement("objectKey",r);r.requireOpToken(":");var o=e.requireElement("expression",r);i.push(o);n.push(a)}while(r.matchOpToken(","));r.requireOpToken("}")}return{type:"objectLiteral",args:[n,i],op:function(e,t,r){var n={};for(var i=0;i");var a=e.requireElement("expression",r);return{type:"blockLiteral",args:n,expr:a,evaluate:function(e){var t=function(){for(var t=0;t=0;a--){var o=i[a];if(o.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}if(n){return i[i.length-1]}};var l=function(e,t,r,n){var i=[];o.prototype.forEach(t,(function(t){if(t.matches(r)||t===e){i.push(t)}}));for(var a=0;a","<=",">=","==","===","!=","!==");var a=i?i.value:null;var o=true;var s=false;if(a==null){if(r.matchToken("is")||r.matchToken("am")){if(r.matchToken("not")){if(r.matchToken("in")){a="not in"}else if(r.matchToken("a")){a="not a";s=true}else if(r.matchToken("empty")){a="not empty";o=false}else{if(r.matchToken("really")){a="!=="}else{a="!="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("in")){a="in"}else if(r.matchToken("a")){a="a";s=true}else if(r.matchToken("empty")){a="empty";o=false}else if(r.matchToken("less")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a="<="}else{a="<"}}else if(r.matchToken("greater")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a=">="}else{a=">"}}else{if(r.matchToken("really")){a="==="}else{a="=="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("equals")){a="=="}else if(r.matchToken("really")){r.requireToken("equals");a="==="}else if(r.matchToken("exist")||r.matchToken("exists")){a="exist";o=false}else if(r.matchToken("matches")||r.matchToken("match")){a="match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="contain"}else if(r.matchToken("includes")||r.matchToken("include")){a="include"}else if(r.matchToken("do")||r.matchToken("does")){r.requireToken("not");if(r.matchToken("matches")||r.matchToken("match")){a="not match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="not contain"}else if(r.matchToken("exist")||r.matchToken("exist")){a="not exist";o=false}else if(r.matchToken("include")){a="not include"}else{e.raiseParseError(r,"Expected matches or contains")}}}if(a){var u,l,c;if(s){u=r.requireTokenType("IDENTIFIER");l=!r.matchOpToken("!")}else if(o){c=e.requireElement("mathExpression",r);if(a==="match"||a==="not match"){c=c.css?c.css:c}}var m=n;n={type:"comparisonOperator",operator:a,typeName:u,nullOk:l,lhs:n,rhs:c,args:[n,c],op:function(e,r,n){if(a==="=="){return r==n}else if(a==="!="){return r!=n}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}if(a==="match"){return r!=null&&p(m,r,n)}if(a==="not match"){return r==null||!p(m,r,n)}if(a==="in"){return n!=null&&f(c,n,r)}if(a==="not in"){return n==null||!f(c,n,r)}if(a==="contain"){return r!=null&&f(m,r,n)}if(a==="not contain"){return r==null||!f(m,r,n)}if(a==="include"){return r!=null&&f(m,r,n)}if(a==="not include"){return r==null||!f(m,r,n)}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}else if(a==="<"){return r"){return r>n}else if(a==="<="){return r<=n}else if(a===">="){return r>=n}else if(a==="empty"){return t.isEmpty(r)}else if(a==="not empty"){return!t.isEmpty(r)}else if(a==="exist"){return t.doesExist(r)}else if(a==="not exist"){return!t.doesExist(r)}else if(a==="a"){return t.typeCheck(r,u.value,l)}else if(a==="not a"){return!t.typeCheck(r,u.value,l)}else{throw"Unknown comparison : "+a}},evaluate:function(e){return t.unifiedEval(this,e)}}}return n}));t.addGrammarElement("comparisonExpression",(function(e,t,r){return e.parseAnyOf(["comparisonOperator","mathExpression"],r)}));t.addGrammarElement("logicalOperator",(function(e,t,r){var n=e.parseElement("comparisonExpression",r);var i,a=null;i=r.matchToken("and")||r.matchToken("or");while(i){a=a||i;if(a.value!==i.value){e.raiseParseError(r,"You must parenthesize logical operations with different operators")}var o=e.requireElement("comparisonExpression",r);const s=i.value;n={type:"logicalOperator",operator:s,lhs:n,rhs:o,args:[n,o],op:function(e,t,r){if(s==="and"){return t&&r}else{return t||r}},evaluate:function(e){return t.unifiedEval(this,e)}};i=r.matchToken("and")||r.matchToken("or")}return n}));t.addGrammarElement("logicalExpression",(function(e,t,r){return e.parseAnyOf(["logicalOperator","mathExpression"],r)}));t.addGrammarElement("asyncExpression",(function(e,t,r){if(r.matchToken("async")){var n=e.requireElement("logicalExpression",r);var i={type:"asyncExpression",value:n,evaluate:function(e){return{asyncWrapper:true,value:this.value.evaluate(e)}}};return i}else{return e.parseElement("logicalExpression",r)}}));t.addGrammarElement("expression",(function(e,t,r){r.matchToken("the");return e.parseElement("asyncExpression",r)}));t.addGrammarElement("assignableExpression",(function(e,t,r){r.matchToken("the");var n=e.parseElement("primaryExpression",r);if(n&&(n.type==="symbol"||n.type==="ofExpression"||n.type==="propertyAccess"||n.type==="attributeRefAccess"||n.type==="attributeRef"||n.type==="styleRef"||n.type==="arrayIndex"||n.type==="possessive")){return n}else{e.raiseParseError(r,"A target expression must be writable. The expression type '"+(n&&n.type)+"' is not.")}return n}));t.addGrammarElement("hyperscript",(function(e,t,r){var n=[];if(r.hasMore()){while(e.featureStart(r.currentToken())||r.currentToken().value==="("){var i=e.requireElement("feature",r);n.push(i);r.matchToken("end")}}return{type:"hyperscript",features:n,apply:function(e,t,r){for(const i of n){i.install(e,t,r)}}}}));var v=function(e){var t=[];if(e.token(0).value==="("&&(e.token(1).value===")"||e.token(2).value===","||e.token(2).value===")")){e.matchOpToken("(");do{t.push(e.requireTokenType("IDENTIFIER"))}while(e.matchOpToken(","));e.requireOpToken(")")}return t};t.addFeature("on",(function(e,t,r){if(!r.matchToken("on"))return;var n=false;if(r.matchToken("every")){n=true}var i=[];var a=null;do{var o=e.requireElement("eventName",r,"Expected event name");var s=o.evaluate();if(a){a=a+" or "+s}else{a="on "+s}var u=v(r);var l=null;if(r.matchOpToken("[")){l=e.requireElement("expression",r);r.requireOpToken("]")}var c,f,m;if(r.currentToken().type==="NUMBER"){var p=r.consumeToken();if(!p.value)return;c=parseInt(p.value);if(r.matchToken("to")){var h=r.consumeToken();if(!h.value)return;f=parseInt(h.value)}else if(r.matchToken("and")){m=true;r.requireToken("on")}}var d,E;if(s==="intersection"){d={};if(r.matchToken("with")){d["with"]=e.requireElement("expression",r).evaluate()}if(r.matchToken("having")){do{if(r.matchToken("margin")){d["rootMargin"]=e.requireElement("stringLike",r).evaluate()}else if(r.matchToken("threshold")){d["threshold"]=e.requireElement("expression",r).evaluate()}else{e.raiseParseError(r,"Unknown intersection config specification")}}while(r.matchToken("and"))}}else if(s==="mutation"){E={};if(r.matchToken("of")){do{if(r.matchToken("anything")){E["attributes"]=true;E["subtree"]=true;E["characterData"]=true;E["childList"]=true}else if(r.matchToken("childList")){E["childList"]=true}else if(r.matchToken("attributes")){E["attributes"]=true;E["attributeOldValue"]=true}else if(r.matchToken("subtree")){E["subtree"]=true}else if(r.matchToken("characterData")){E["characterData"]=true;E["characterDataOldValue"]=true}else if(r.currentToken().type==="ATTRIBUTE_REF"){var T=r.consumeToken();if(E["attributeFilter"]==null){E["attributeFilter"]=[]}if(T.value.indexOf("@")==0){E["attributeFilter"].push(T.value.substring(1))}else{e.raiseParseError(r,"Only shorthand attribute references are allowed here")}}else{e.raiseParseError(r,"Unknown mutation config specification")}}while(r.matchToken("or"))}else{E["attributes"]=true;E["characterData"]=true;E["childList"]=true}}var y=null;var k=false;if(r.matchToken("from")){if(r.matchToken("elsewhere")){k=true}else{r.pushFollow("or");try{y=e.requireElement("expression",r)}finally{r.popFollow()}if(!y){e.raiseParseError(r,'Expected either target value or "elsewhere".')}}}if(y===null&&k===false&&r.matchToken("elsewhere")){k=true}if(r.matchToken("in")){var x=e.parseElement("unaryExpression",r)}if(r.matchToken("debounced")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var b=g.evaluate({})}else if(r.matchToken("throttled")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var w=g.evaluate({})}i.push({execCount:0,every:n,on:s,args:u,filter:l,from:y,inExpr:x,elsewhere:k,startCount:c,endCount:f,unbounded:m,debounceTime:b,throttleTime:w,mutationSpec:E,intersectionSpec:d,debounced:undefined,lastExec:undefined})}while(r.matchToken("or"));var S=true;if(!n){if(r.matchToken("queue")){if(r.matchToken("all")){var q=true;var S=false}else if(r.matchToken("first")){var N=true}else if(r.matchToken("none")){var I=true}else{r.requireToken("last")}}}var C=e.requireElement("commandList",r);e.ensureTerminated(C);var R,A;if(r.matchToken("catch")){R=r.requireTokenType("IDENTIFIER").value;A=e.requireElement("commandList",r);e.ensureTerminated(A)}if(r.matchToken("finally")){var L=e.requireElement("commandList",r);e.ensureTerminated(L)}var O={displayName:a,events:i,start:C,every:n,execCount:0,errorHandler:A,errorSymbol:R,execute:function(e){let r=t.getEventQueueFor(e.me,O);if(r.executing&&n===false){if(I||N&&r.queue.length>0){return}if(S){r.queue.length=0}r.queue.push(e);return}O.execCount++;r.executing=true;e.meta.onHalt=function(){r.executing=false;var e=r.queue.shift();if(e){setTimeout((function(){O.execute(e)}),1)}};e.meta.reject=function(r){console.error(r.message?r.message:r);var n=t.getHyperTrace(e,r);if(n){n.print()}t.triggerEvent(e.me,"exception",{error:r})};C.execute(e)},install:function(e,r){for(const r of O.events){var n;if(r.elsewhere){n=[document]}else if(r.from){n=r.from.evaluate(t.makeContext(e,O,e,null))}else{n=[e]}t.implicitLoop(n,(function(n){var i=r.on;if(n==null){console.warn("'%s' feature ignored because target does not exists:",a,e);return}if(r.mutationSpec){i="hyperscript:mutation";const e=new MutationObserver((function(e,r){if(!O.executing){t.triggerEvent(n,i,{mutationList:e,observer:r})}}));e.observe(n,r.mutationSpec)}if(r.intersectionSpec){i="hyperscript:intersection";const e=new IntersectionObserver((function(r){for(const o of r){var a={observer:e};a=Object.assign(a,o);a["intersecting"]=o.isIntersecting;t.triggerEvent(n,i,a)}}),r.intersectionSpec);e.observe(n)}var o=n.addEventListener||n.on;o.call(n,i,(function a(o){if(typeof Node!=="undefined"&&e instanceof Node&&n!==e&&!e.isConnected){n.removeEventListener(i,a);return}var s=t.makeContext(e,O,e,o);if(r.elsewhere&&e.contains(o.target)){return}if(r.from){s.result=n}for(const e of r.args){let t=s.event[e.value];if(t!==undefined){s.locals[e.value]=t}else if("detail"in s.event){s.locals[e.value]=s.event["detail"][e.value]}}s.meta.errorHandler=A;s.meta.errorSymbol=R;s.meta.finallyHandler=L;if(r.filter){var u=s.meta.context;s.meta.context=s.event;try{var l=r.filter.evaluate(s);if(l){}else{return}}finally{s.meta.context=u}}if(r.inExpr){var c=o.target;while(true){if(c.matches&&c.matches(r.inExpr.css)){s.result=c;break}else{c=c.parentElement;if(c==null){return}}}}r.execCount++;if(r.startCount){if(r.endCount){if(r.execCountr.endCount){return}}else if(r.unbounded){if(r.execCount{var a=false;for(const s of i){var o=n=>{e.result=n;if(s.args){for(const t of s.args){e.locals[t.value]=n[t.value]||(n.detail?n.detail[t.value]:null)}}if(!a){a=true;r(t.findNext(this,e))}};if(s.name){n.addEventListener(s.name,o,{once:true})}else if(s.time!=null){setTimeout(o,s.time,s.time)}}}))}};return n}else{var s;if(r.matchToken("a")){r.requireToken("tick");s=0}else{s=e.requireElement("expression",r)}n={type:"waitCmd",time:s,args:[s],op:function(e,r){return new Promise((n=>{setTimeout((()=>{n(t.findNext(this,e))}),r)}))},execute:function(e){return t.unifiedExec(this,e)}};return n}}));t.addGrammarElement("dotOrColonPath",(function(e,t,r){var n=r.matchTokenType("IDENTIFIER");if(n){var i=[n.value];var a=r.matchOpToken(".")||r.matchOpToken(":");if(a){do{i.push(r.requireTokenType("IDENTIFIER","NUMBER").value)}while(r.matchOpToken(a.value))}return{type:"dotOrColonPath",path:i,evaluate:function(){return i.join(a?a.value:"")}}}}));t.addGrammarElement("eventName",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{evaluate:function(){return n.value}}}return e.parseElement("dotOrColonPath",r)}));function d(e,t,r,n){var i=t.requireElement("eventName",n);var a=t.parseElement("namedArgumentList",n);if(e==="send"&&n.matchToken("to")||e==="trigger"&&n.matchToken("on")){var o=t.requireElement("expression",n)}else{var o=t.requireElement("implicitMeTarget",n)}var s={eventName:i,details:a,to:o,args:[o,i,a],op:function(e,t,n,i){r.nullCheck(t,o);r.implicitLoop(t,(function(t){r.triggerEvent(t,n,i,e.me)}));return r.findNext(s,e)}};return s}t.addCommand("trigger",(function(e,t,r){if(r.matchToken("trigger")){return d("trigger",e,t,r)}}));t.addCommand("send",(function(e,t,r){if(r.matchToken("send")){return d("send",e,t,r)}}));var T=function(e,t,r,n){if(n){if(e.commandBoundary(r.currentToken())){e.raiseParseError(r,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.")}else{var i=e.requireElement("expression",r)}}var a={value:i,args:[i],op:function(e,r){var n=e.meta.resolve;e.meta.returned=true;e.meta.returnValue=r;if(n){if(r){n(r)}else{n()}}return t.HALT}};return a};t.addCommand("return",(function(e,t,r){if(r.matchToken("return")){return T(e,t,r,true)}}));t.addCommand("exit",(function(e,t,r){if(r.matchToken("exit")){return T(e,t,r,false)}}));t.addCommand("halt",(function(e,t,r){if(r.matchToken("halt")){if(r.matchToken("the")){r.requireToken("event");if(r.matchOpToken("'")){r.requireToken("s")}var n=true}if(r.matchToken("bubbling")){var i=true}else if(r.matchToken("default")){var a=true}var o=T(e,t,r,false);var s={keepExecuting:true,bubbling:i,haltDefault:a,exit:o,op:function(e){if(e.event){if(i){e.event.stopPropagation()}else if(a){e.event.preventDefault()}else{e.event.stopPropagation();e.event.preventDefault()}if(n){return t.findNext(this,e)}else{return o}}}};return s}}));t.addCommand("log",(function(e,t,r){if(!r.matchToken("log"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}if(r.matchToken("with")){var i=e.requireElement("expression",r)}var a={exprs:n,withExpr:i,args:[i,n],op:function(e,r,n){if(r){r.apply(null,n)}else{console.log.apply(null,n)}return t.findNext(this,e)}};return a}));t.addCommand("beep!",(function(e,t,r){if(!r.matchToken("beep!"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}var i={exprs:n,args:[n],op:function(e,r){for(let i=0;i{if(!r.matchToken("pick"))return;r.matchToken("the");if(r.matchToken("item")||r.matchToken("items")||r.matchToken("character")||r.matchToken("characters")){const n=g(e,t,r);r.requireToken("from");const i=e.requireElement("expression",r);return{args:[i,n.from,n.to],op(e,r,i,a){if(n.toEnd)a=r.length;if(!n.includeStart)i++;if(n.includeEnd)a++;if(a==null||a==undefined)a=i+1;e.result=r.slice(i,a);return t.findNext(this,e)}}}if(r.matchToken("match")){r.matchToken("of");const n=e.parseElement("expression",r);let i="";if(r.matchOpToken("|")){i=r.requireToken("identifier").value}r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new RegExp(n,i).exec(r);return t.findNext(this,e)}}}if(r.matchToken("matches")){r.matchToken("of");const n=e.parseElement("expression",r);let i="gu";if(r.matchOpToken("|")){i="g"+r.requireToken("identifier").value.replace("g","")}console.log("flags",i);r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new w(n,i,r);return t.findNext(this,e)}}}}));t.addCommand("increment",(function(e,t,r){if(!r.matchToken("increment"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitIncrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t+r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));t.addCommand("decrement",(function(e,t,r){if(!r.matchToken("decrement"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitDecrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t-r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));function S(e,t){var r="text";var n;e.matchToken("a")||e.matchToken("an");if(e.matchToken("json")||e.matchToken("Object")){r="json"}else if(e.matchToken("response")){r="response"}else if(e.matchToken("html")){r="html"}else if(e.matchToken("text")){}else{n=t.requireElement("dotOrColonPath",e).evaluate()}return{type:r,conversion:n}}t.addCommand("fetch",(function(e,t,r){if(!r.matchToken("fetch"))return;var n=e.requireElement("stringLike",r);if(r.matchToken("as")){var i=S(r,e)}if(r.matchToken("with")&&r.currentToken().value!=="{"){var a=e.parseElement("nakedNamedArgumentList",r)}else{var a=e.parseElement("objectLiteral",r)}if(i==null&&r.matchToken("as")){i=S(r,e)}var o=i?i.type:"text";var s=i?i.conversion:null;var u={url:n,argExpressions:a,args:[n,a],op:function(e,r,n){var i=n||{};i["sender"]=e.me;i["headers"]=i["headers"]||{};var a=new AbortController;let l=e.me.addEventListener("fetch:abort",(function(){a.abort()}),{once:true});i["signal"]=a.signal;t.triggerEvent(e.me,"hyperscript:beforeFetch",i);t.triggerEvent(e.me,"fetch:beforeRequest",i);n=i;var c=false;if(n.timeout){setTimeout((function(){if(!c){a.abort()}}),n.timeout)}return fetch(r,n).then((function(r){let n={response:r};t.triggerEvent(e.me,"fetch:afterResponse",n);r=n.response;if(o==="response"){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}if(o==="json"){return r.json().then((function(r){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))}return r.text().then((function(r){if(s)r=t.convertValue(r,s);if(o==="html")r=t.convertValue(r,"Fragment");e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))})).catch((function(r){t.triggerEvent(e.me,"fetch:error",{reason:r});throw r})).finally((function(){e.me.removeEventListener("fetch:abort",l)}))}};return u}))}function y(e){e.addCommand("settle",(function(e,t,r){if(r.matchToken("settle")){if(!e.commandBoundary(r.currentToken())){var n=e.requireElement("expression",r)}else{var n=e.requireElement("implicitMeTarget",r)}var i={type:"settleCmd",args:[n],op:function(e,r){t.nullCheck(r,n);var a=null;var o=false;var s=false;var u=new Promise((function(e){a=e}));r.addEventListener("transitionstart",(function(){s=true}),{once:true});setTimeout((function(){if(!s&&!o){a(t.findNext(i,e))}}),500);r.addEventListener("transitionend",(function(){if(!o){a(t.findNext(i,e))}}),{once:true});return u},execute:function(e){return t.unifiedExec(this,e)}};return i}}));e.addCommand("add",(function(e,t,r){if(r.matchToken("add")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("styleLiteral",r);if(a==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("to")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}if(r.matchToken("when")){if(a){e.raiseParseError(r,"Only class and properties are supported with a when clause")}var u=e.requireElement("expression",r)}if(o){return{classRefs:o,to:s,args:[s,o],op:function(e,r,n){t.nullCheck(r,s);t.forEach(n,(function(n){t.implicitLoop(r,(function(r){if(u){e.result=r;let i=t.evaluateNoPromise(u,e);if(i){if(r instanceof Element)r.classList.add(n.className)}else{if(r instanceof Element)r.classList.remove(n.className)}e.result=null}else{if(r instanceof Element)r.classList.add(n.className)}}))}));return t.findNext(this,e)}}}else if(i){return{type:"addCmd",attributeRef:i,to:s,args:[s],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(r){if(u){e.result=r;let n=t.evaluateNoPromise(u,e);if(n){r.setAttribute(i.name,i.value)}else{r.removeAttribute(i.name)}e.result=null}else{r.setAttribute(i.name,i.value)}}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}else{return{type:"addCmd",cssDeclaration:a,to:s,args:[s,a],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(e){e.style.cssText+=n}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}}}));e.addGrammarElement("styleLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[""];var i=[];while(r.hasMore()){if(r.matchOpToken("\\")){r.consumeToken()}else if(r.matchOpToken("}")){break}else if(r.matchToken("$")){var a=r.matchOpToken("{");var o=e.parseElement("expression",r);if(a)r.requireOpToken("}");i.push(o);n.push("")}else{var s=r.consumeToken();n[n.length-1]+=r.source.substring(s.start,s.end)}n[n.length-1]+=r.lastWhitespace()}return{type:"styleLiteral",args:[i],op:function(e,t){var r="";n.forEach((function(e,n){r+=e;if(n in t)r+=t[n]}));return r},evaluate:function(e){return t.unifiedEval(this,e)}}}));e.addCommand("remove",(function(e,t,r){if(r.matchToken("remove")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("expression",r);if(a==null){e.raiseParseError(r,"Expected either a class reference, attribute expression or value expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("from")){var s=e.requireElement("expression",r)}else{if(a==null){var s=e.requireElement("implicitMeTarget",r)}}if(a){return{elementExpr:a,from:s,args:[a,s],op:function(e,r,n){t.nullCheck(r,a);t.implicitLoop(r,(function(e){if(e.parentElement&&(n==null||n.contains(e))){e.parentElement.removeChild(e)}}));return t.findNext(this,e)}}}else{return{classRefs:o,attributeRef:i,elementExpr:a,from:s,args:[o,s],op:function(e,r,n){t.nullCheck(n,s);if(r){t.forEach(r,(function(e){t.implicitLoop(n,(function(t){t.classList.remove(e.className)}))}))}else{t.implicitLoop(n,(function(e){e.removeAttribute(i.name)}))}return t.findNext(this,e)}}}}}));e.addCommand("toggle",(function(e,t,r){if(r.matchToken("toggle")){r.matchAnyToken("the","my");if(r.currentToken().type==="STYLE_REF"){let t=r.consumeToken();var n=t.value.substr(1);var a=true;var o=i(e,r,n);if(r.matchToken("of")){r.pushFollow("with");try{var s=e.requireElement("expression",r)}finally{r.popFollow()}}else{var s=e.requireElement("implicitMeTarget",r)}}else if(r.matchToken("between")){var u=true;var l=e.parseElement("classRef",r);r.requireToken("and");var c=e.requireElement("classRef",r)}else{var l=e.parseElement("classRef",r);var f=null;if(l==null){f=e.parseElement("attributeRef",r);if(f==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}else{var m=[l];while(l=e.parseElement("classRef",r)){m.push(l)}}}if(a!==true){if(r.matchToken("on")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}}if(r.matchToken("for")){var p=e.requireElement("expression",r)}else if(r.matchToken("until")){var h=e.requireElement("dotOrColonPath",r,"Expected event name");if(r.matchToken("from")){var v=e.requireElement("expression",r)}}var d={classRef:l,classRef2:c,classRefs:m,attributeRef:f,on:s,time:p,evt:h,from:v,toggle:function(e,r,n,i){t.nullCheck(e,s);if(a){t.implicitLoop(e,(function(e){o("toggle",e)}))}else if(u){t.implicitLoop(e,(function(e){if(e.classList.contains(r.className)){e.classList.remove(r.className);e.classList.add(n.className)}else{e.classList.add(r.className);e.classList.remove(n.className)}}))}else if(i){t.forEach(i,(function(r){t.implicitLoop(e,(function(e){e.classList.toggle(r.className)}))}))}else{t.forEach(e,(function(e){if(e.hasAttribute(f.name)){e.removeAttribute(f.name)}else{e.setAttribute(f.name,f.value)}}))}},args:[s,p,h,v,l,c,m],op:function(e,r,n,i,a,o,s,u){if(n){return new Promise((function(i){d.toggle(r,o,s,u);setTimeout((function(){d.toggle(r,o,s,u);i(t.findNext(d,e))}),n)}))}else if(i){return new Promise((function(n){var l=a||e.me;l.addEventListener(i,(function(){d.toggle(r,o,s,u);n(t.findNext(d,e))}),{once:true});d.toggle(r,o,s,u)}))}else{this.toggle(r,o,s,u);return t.findNext(d,e)}}};return d}}));var t={display:function(r,n,i){if(i){n.style.display=i}else if(r==="toggle"){if(getComputedStyle(n).display==="none"){t.display("show",n,i)}else{t.display("hide",n,i)}}else if(r==="hide"){const t=e.runtime.getInternalData(n);if(t.originalDisplay==null){t.originalDisplay=n.style.display}n.style.display="none"}else{const t=e.runtime.getInternalData(n);if(t.originalDisplay&&t.originalDisplay!=="none"){n.style.display=t.originalDisplay}else{n.style.removeProperty("display")}}},visibility:function(e,r,n){if(n){r.style.visibility=n}else if(e==="toggle"){if(getComputedStyle(r).visibility==="hidden"){t.visibility("show",r,n)}else{t.visibility("hide",r,n)}}else if(e==="hide"){r.style.visibility="hidden"}else{r.style.visibility="visible"}},opacity:function(e,r,n){if(n){r.style.opacity=n}else if(e==="toggle"){if(getComputedStyle(r).opacity==="0"){t.opacity("show",r,n)}else{t.opacity("hide",r,n)}}else if(e==="hide"){r.style.opacity="0"}else{r.style.opacity="1"}}};var n=function(e,t,r){var n;var i=r.currentToken();if(i.value==="when"||i.value==="with"||e.commandBoundary(i)){n=e.parseElement("implicitMeTarget",r)}else{n=e.parseElement("expression",r)}return n};var i=function(e,n,i){var a=r.defaultHideShowStrategy;var o=t;if(r.hideShowStrategies){o=Object.assign(o,r.hideShowStrategies)}i=i||a||"display";var s=o[i];if(s==null){e.raiseParseError(n,"Unknown show/hide strategy : "+i)}return s};e.addCommand("hide",(function(e,t,r){if(r.matchToken("hide")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=i(e,r,o);return{target:a,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(e){s("hide",e)}));return t.findNext(this,e)}}}}));e.addCommand("show",(function(e,t,r){if(r.matchToken("show")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=null;if(r.matchOpToken(":")){var u=r.consumeUntilWhitespace();r.matchTokenType("WHITESPACE");s=u.map((function(e){return e.value})).join("")}if(r.matchToken("when")){var l=e.requireElement("expression",r)}var c=i(e,r,o);return{target:a,when:l,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(r){if(l){e.result=r;let n=t.evaluateNoPromise(l,e);if(n){c("show",r,s)}else{c("hide",r)}e.result=null}else{c("show",r,s)}}));return t.findNext(this,e)}}}}));e.addCommand("take",(function(e,t,r){if(r.matchToken("take")){let u=null;let l=[];while(u=e.parseElement("classRef",r)){l.push(u)}var n=null;var i=null;let c=l.length>0;if(!c){n=e.parseElement("attributeRef",r);if(n==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}if(r.matchToken("with")){i=e.requireElement("expression",r)}}if(r.matchToken("from")){var a=e.requireElement("expression",r)}if(r.matchToken("for")){var o=e.requireElement("expression",r)}else{var o=e.requireElement("implicitMeTarget",r)}if(c){var s={classRefs:l,from:a,forElt:o,args:[l,a,o],op:function(e,r,n,i){t.nullCheck(i,o);t.implicitLoop(r,(function(e){var r=e.className;if(n){t.implicitLoop(n,(function(e){e.classList.remove(r)}))}else{t.implicitLoop(e,(function(e){e.classList.remove(r)}))}t.implicitLoop(i,(function(e){e.classList.add(r)}))}));return t.findNext(this,e)}};return s}else{var s={attributeRef:n,from:a,forElt:o,args:[a,o,i],op:function(e,r,i,s){t.nullCheck(r,a);t.nullCheck(i,o);t.implicitLoop(r,(function(e){if(!s){e.removeAttribute(n.name)}else{e.setAttribute(n.name,s)}}));t.implicitLoop(i,(function(e){e.setAttribute(n.name,n.value||"")}));return t.findNext(this,e)}};return s}}}));function a(t,r,n,i){if(n!=null){var a=t.resolveSymbol(n,r)}else{var a=r}if(a instanceof Element||a instanceof HTMLDocument){while(a.firstChild)a.removeChild(a.firstChild);a.append(e.runtime.convertValue(i,"Fragment"));t.processNode(a)}else{if(n!=null){t.setSymbol(n,r,null,i)}else{throw"Don't know how to put a value into "+typeof r}}}e.addCommand("put",(function(e,t,r){if(r.matchToken("put")){var n=e.requireElement("expression",r);var i=r.matchAnyToken("into","before","after");if(i==null&&r.matchToken("at")){r.matchToken("the");i=r.matchAnyToken("start","end");r.requireToken("of")}if(i==null){e.raiseParseError(r,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'")}var o=e.requireElement("expression",r);var s=i.value;var u=false;var l=false;var c=null;var f=null;if(o.type==="arrayIndex"&&s==="into"){u=true;f=o.prop;c=o.root}else if(o.prop&&o.root&&s==="into"){f=o.prop.value;c=o.root}else if(o.type==="symbol"&&s==="into"){l=true;f=o.name}else if(o.type==="attributeRef"&&s==="into"){var m=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.type==="styleRef"&&s==="into"){var p=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.attribute&&s==="into"){var m=o.attribute.type==="attributeRef";var p=o.attribute.type==="styleRef";f=o.attribute.name;c=o.root}else{c=o}var h={target:o,operation:s,symbolWrite:l,value:n,args:[c,f,n],op:function(e,r,n,i){if(l){a(t,e,n,i)}else{t.nullCheck(r,c);if(s==="into"){if(m){t.implicitLoop(r,(function(e){e.setAttribute(n,i)}))}else if(p){t.implicitLoop(r,(function(e){e.style[n]=i}))}else if(u){r[n]=i}else{t.implicitLoop(r,(function(e){a(t,e,n,i)}))}}else{var o=s==="before"?Element.prototype.before:s==="after"?Element.prototype.after:s==="start"?Element.prototype.prepend:s==="end"?Element.prototype.append:Element.prototype.append;t.implicitLoop(r,(function(e){o.call(e,i instanceof Node?i:t.convertValue(i,"Fragment"));if(e.parentElement){t.processNode(e.parentElement)}else{t.processNode(e)}}))}}return t.findNext(this,e)}};return h}}));function o(e,t,r){var n;if(r.matchToken("the")||r.matchToken("element")||r.matchToken("elements")||r.currentToken().type==="CLASS_REF"||r.currentToken().type==="ID_REF"||r.currentToken().op&&r.currentToken().value==="<"){e.possessivesDisabled=true;try{n=e.parseElement("expression",r)}finally{delete e.possessivesDisabled}if(r.matchOpToken("'")){r.requireToken("s")}}else if(r.currentToken().type==="IDENTIFIER"&&r.currentToken().value==="its"){var i=r.matchToken("its");n={type:"pseudopossessiveIts",token:i,name:i.value,evaluate:function(e){return t.resolveSymbol("it",e)}}}else{r.matchToken("my")||r.matchToken("me");n=e.parseElement("implicitMeTarget",r)}return n}e.addCommand("transition",(function(e,t,n){if(n.matchToken("transition")){var i=o(e,t,n);var a=[];var s=[];var u=[];var l=n.currentToken();while(!e.commandBoundary(l)&&l.value!=="over"&&l.value!=="using"){if(n.currentToken().type==="STYLE_REF"){let e=n.consumeToken();let t=e.value.substr(1);a.push({type:"styleRefValue",evaluate:function(){return t}})}else{a.push(e.requireElement("stringLike",n))}if(n.matchToken("from")){s.push(e.requireElement("expression",n))}else{s.push(null)}n.requireToken("to");if(n.matchToken("initial")){u.push({type:"initial_literal",evaluate:function(){return"initial"}})}else{u.push(e.requireElement("expression",n))}l=n.currentToken()}if(n.matchToken("over")){var c=e.requireElement("expression",n)}else if(n.matchToken("using")){var f=e.requireElement("expression",n)}var m={to:u,args:[i,a,s,u,f,c],op:function(e,n,a,o,s,u,l){t.nullCheck(n,i);var c=[];t.implicitLoop(n,(function(e){var n=new Promise((function(n,i){var c=e.style.transition;if(l){e.style.transition="all "+l+"ms ease-in"}else if(u){e.style.transition=u}else{e.style.transition=r.defaultTransition}var f=t.getInternalData(e);var m=getComputedStyle(e);var p={};for(var h=0;he.forEach((e=>S(e))))).then((()=>n((function(){a();k.processNode(document.documentElement);e.document.addEventListener("htmx:load",(function(e){k.processNode(e.detail.elt)}))}))));function n(e){if(document.readyState!=="loading"){setTimeout(e)}else{document.addEventListener("DOMContentLoaded",e)}}function i(){var e=document.querySelector('meta[name="htmx-config"]');if(e){return v(e.content)}else{return null}}function a(){var e=i();if(e){Object.assign(r,e)}}}const S=Object.assign(b,{config:r,use(e){e(S)},internals:{lexer:x,parser:g,runtime:k,Lexer:n,Tokens:i,Parser:a,Runtime:o},ElementCollection:m,addFeature:g.addFeature.bind(g),addCommand:g.addCommand.bind(g),addLeafExpression:g.addLeafExpression.bind(g),addIndirectExpression:g.addIndirectExpression.bind(g),evaluate:k.evaluate.bind(k),parse:k.parse.bind(k),processNode:k.processNode.bind(k),version:"0.9.13",browserInit:w});return S})); +(function(e,t){const r=t(e);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=r}else{e["_hyperscript"]=r;if("document"in e)e["_hyperscript"].browserInit()}})(typeof self!=="undefined"?self:this,(e=>{"use strict";const t={dynamicResolvers:[function(e,t){if(e==="Fixed"){return Number(t).toFixed()}else if(e.indexOf("Fixed:")===0){let r=e.split(":")[1];return Number(t).toFixed(parseInt(r))}}],String:function(e){if(e.toString){return e.toString()}else{return""+e}},Int:function(e){return parseInt(e)},Float:function(e){return parseFloat(e)},Number:function(e){return Number(e)},Date:function(e){return new Date(e)},Array:function(e){return Array.from(e)},JSON:function(e){return JSON.stringify(e)},Object:function(e){if(e instanceof String){e=e.toString()}if(typeof e==="string"){return JSON.parse(e)}else{return Object.assign({},e)}}};const r={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:t};class n{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS"};static isValidCSSClassChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isValidCSSIDChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isWhitespace(e){return e===" "||e==="\t"||n.isNewline(e)}static positionString(e){return"[Line: "+e.line+", Column: "+e.column+"]"}static isNewline(e){return e==="\r"||e==="\n"}static isNumeric(e){return e>="0"&&e<="9"}static isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}static isIdentifierChar(e,t){return e==="_"||e==="$"}static isReservedChar(e){return e==="`"||e==="^"}static isValidSingleQuoteStringStart(e){if(e.length>0){var t=e[e.length-1];if(t.type==="IDENTIFIER"||t.type==="CLASS_REF"||t.type==="ID_REF"){return false}if(t.op&&(t.value===">"||t.value===")")){return false}}return true}static tokenize(e,t){var r=[];var a=e;var o=0;var s=0;var u=1;var l="";var c=0;function f(){return t&&c===0}while(o=0){return this.consumeToken()}}requireToken(e,t){var r=this.matchToken(e,t);if(r){return r}else{this.raiseError(this,"Expected '"+e+"' but found '"+this.currentToken().value+"'")}}peekToken(e,t,r){t=t||0;r=r||"IDENTIFIER";if(this.tokens[t]&&this.tokens[t].value===e&&this.tokens[t].type===r){return this.tokens[t]}}matchToken(e,t){if(this.follows.indexOf(e)!==-1){return}t=t||"IDENTIFIER";if(this.currentToken()&&this.currentToken().value===e&&this.currentToken().type===t){return this.consumeToken()}}consumeToken(){var e=this.tokens.shift();this.consumed.push(e);this._lastConsumed=e;this.consumeWhitespace();return e}consumeUntil(e,t){var r=[];var n=this.token(0,true);while((t==null||n.type!==t)&&(e==null||n.value!==e)&&n.type!=="EOF"){var i=this.tokens.shift();this.consumed.push(i);r.push(n);n=this.token(0,true)}this.consumeWhitespace();return r}lastWhitespace(){if(this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"){return this.consumed[this.consumed.length-1].value}else{return""}}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(e,t){var r;var n=0;do{if(!t){while(this.tokens[n]&&this.tokens[n].type==="WHITESPACE"){n++}}r=this.tokens[n];e--;n++}while(e>-1);if(r){return r}else{return{type:"EOF",value:"<<>>"}}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split("\n")[this.startToken.line-1]};follows=[];pushFollow(e){this.follows.push(e)}popFollow(){this.follows.pop()}clearFollows(){var e=this.follows;this.follows=[];return e}restoreFollows(e){this.follows=e}}class a{constructor(e){this.runtime=e;this.possessivesDisabled=false;this.addGrammarElement("feature",(function(e,t,r){if(r.matchOpToken("(")){var n=e.requireElement("feature",r);r.requireOpToken(")");return n}var i=e.FEATURES[r.currentToken().value||""];if(i){return i(e,t,r)}}));this.addGrammarElement("command",(function(e,t,r){if(r.matchOpToken("(")){const t=e.requireElement("command",r);r.requireOpToken(")");return t}var n=e.COMMANDS[r.currentToken().value||""];let i;if(n){i=n(e,t,r)}else if(r.currentToken().type==="IDENTIFIER"){i=e.parseElement("pseudoCommand",r)}if(i){return e.parseElement("indirectStatement",r,i)}return i}));this.addGrammarElement("commandList",(function(e,t,r){if(r.hasMore()){var n=e.parseElement("command",r);if(n){r.matchToken("then");const t=e.parseElement("commandList",r);if(t)n.next=t;return n}}return{type:"emptyCommandListCommand",op:function(e){return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}));this.addGrammarElement("leaf",(function(e,t,r){var n=e.parseAnyOf(e.LEAF_EXPRESSIONS,r);if(n==null){return e.parseElement("symbol",r)}return n}));this.addGrammarElement("indirectExpression",(function(e,t,r,n){for(var i=0;i{this.unifiedExec(e,t)})).catch((e=>{this.unifiedExec({op:function(){throw e}},t)}));return}else if(r===o.HALT){if(t.meta.finallyHandler&&!t.meta.handlingFinally){t.meta.handlingFinally=true;e=t.meta.finallyHandler}else{if(t.meta.onHalt){t.meta.onHalt()}if(t.meta.currentException){if(t.meta.reject){t.meta.reject(t.meta.currentException);return}else{throw t.meta.currentException}}else{return}}}else{e=r}}}unifiedEval(e,t){var r=[t];var n=false;var i=false;if(e.args){for(var a=0;a{r=this.wrapArrays(r);Promise.all(r).then((function(r){if(i){this.unwrapAsyncs(r)}try{var a=e.op.apply(e,r);t(a)}catch(e){n(e)}})).catch((function(e){n(e)}))}))}else{if(i){this.unwrapAsyncs(r)}return e.op.apply(e,r)}}_scriptAttrs=null;getScriptAttributes(){if(this._scriptAttrs==null){this._scriptAttrs=r.attributes.replace(/ /g,"").split(",")}return this._scriptAttrs}getScript(e){for(var t=0;t{this.initElement(e,e instanceof HTMLScriptElement&&e.type==="text/hyperscript"?document.body:e)}))}}initElement(e,t){if(e.closest&&e.closest(r.disableSelector)){return}var n=this.getInternalData(e);if(!n.initialized){var i=this.getScript(e);if(i){try{n.initialized=true;n.script=i;const r=this.lexer,s=this.parser;var a=r.tokenize(i);var o=s.parseHyperScript(a);if(!o)return;o.apply(t||e,e);setTimeout((()=>{this.triggerEvent(t||e,"load",{hyperscript:true})}),1)}catch(t){this.triggerEvent(e,"exception",{error:t});console.error("hyperscript errors were found on the following element:",e,"\n\n",t.message,t.stack)}}}}internalDataMap=new WeakMap;getInternalData(e){var t=this.internalDataMap.get(e);if(typeof t==="undefined"){this.internalDataMap.set(e,t={})}return t}typeCheck(e,t,r){if(e==null&&r){return true}var n=Object.prototype.toString.call(e).slice(8,-1);return n===t}getElementScope(e){var t=e.meta&&e.meta.owner;if(t){var r=this.getInternalData(t);var n="elementScope";if(e.meta.feature&&e.meta.feature.behavior){n=e.meta.feature.behavior+"Scope"}var i=h(r,n);return i}else{return{}}}isReservedWord(e){return["meta","it","result","locals","event","target","detail","sender","body"].includes(e)}isHyperscriptContext(e){return e instanceof f}resolveSymbol(t,r,n){if(t==="me"||t==="my"||t==="I"){return r.me}if(t==="it"||t==="its"||t==="result"){return r.result}if(t==="you"||t==="your"||t==="yourself"){return r.you}else{if(n==="global"){return e[t]}else if(n==="element"){var i=this.getElementScope(r);return i[t]}else if(n==="local"){return r.locals[t]}else{if(r.meta&&r.meta.context){var a=r.meta.context[t];if(typeof a!=="undefined"){return a}if(r.meta.context.detail){a=r.meta.context.detail[t];if(typeof a!=="undefined"){return a}}}if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){var o=r.locals[t]}else{var o=r[t]}if(typeof o!=="undefined"){return o}else{var i=this.getElementScope(r);o=i[t];if(typeof o!=="undefined"){return o}else{return e[t]}}}}}setSymbol(t,r,n,i){if(n==="global"){e[t]=i}else if(n==="element"){var a=this.getElementScope(r);a[t]=i}else if(n==="local"){r.locals[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)&&typeof r.locals[t]!=="undefined"){r.locals[t]=i}else{var a=this.getElementScope(r);var o=a[t];if(typeof o!=="undefined"){a[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){r.locals[t]=i}else{r[t]=i}}}}}findNext(e,t){if(e){if(e.resolveNext){return e.resolveNext(t)}else if(e.next){return e.next}else{return this.findNext(e.parent,t)}}}flatGet(e,t,r){if(e!=null){var n=r(e,t);if(typeof n!=="undefined"){return n}if(this.shouldAutoIterate(e)){var i=[];for(var a of e){var o=r(a,t);i.push(o)}return i}}}resolveProperty(e,t){return this.flatGet(e,t,((e,t)=>e[t]))}resolveAttribute(e,t){return this.flatGet(e,t,((e,t)=>e.getAttribute&&e.getAttribute(t)))}resolveStyle(e,t){return this.flatGet(e,t,((e,t)=>e.style&&e.style[t]))}resolveComputedStyle(e,t){return this.flatGet(e,t,((e,t)=>getComputedStyle(e).getPropertyValue(t)))}assignToNamespace(t,r,n,i){let a;if(typeof document!=="undefined"&&t===document.body){a=e}else{a=this.getHyperscriptFeatures(t)}var o;while((o=r.shift())!==undefined){var s=a[o];if(s==null){s={};a[o]=s}a=s}a[n]=i}getHyperTrace(e,t){var r=[];var n=e;while(n.meta.caller){n=n.meta.caller}if(n.meta.traceMap){return n.meta.traceMap.get(t,r)}}registerHyperTrace(e,t){var r=[];var n=null;while(e!=null){r.push(e);n=e;e=e.meta.caller}if(n.meta.traceMap==null){n.meta.traceMap=new Map}if(!n.meta.traceMap.get(t)){var i={trace:r,print:function(e){e=e||console.error;e("hypertrace /// ");var t=0;for(var n=0;n",i.meta.feature.displayName.padEnd(t+2),"-",i.meta.owner)}}};n.meta.traceMap.set(t,i)}}escapeSelector(e){return e.replace(/:/g,(function(e){return"\\"+e}))}nullCheck(e,t){if(e==null){throw new Error("'"+t.sourceFor()+"' is null")}}isEmpty(e){return e==undefined||e.length===0}doesExist(e){if(e==null){return false}if(this.shouldAutoIterate(e)){for(const t of e){return true}return false}return true}getRootNode(e){if(e&&e instanceof Node){var t=e.getRootNode();if(t instanceof Document||t instanceof ShadowRoot)return t}return document}getEventQueueFor(e,t){let r=this.getInternalData(e);var n=r.eventQueues;if(n==null){n=new Map;r.eventQueues=n}var i=n.get(t);if(i==null){i={queue:[],executing:false};n.set(t,i)}return i}beepValueToConsole(e,t,r){if(this.triggerEvent(e,"hyperscript:beep",{element:e,expression:t,value:r})){var n;if(r){if(r instanceof m){n="ElementCollection"}else if(r.constructor){n=r.constructor.name}else{n="unknown"}}else{n="object (null)"}var a=r;if(n==="String"){a='"'+a+'"'}else if(r instanceof m){a=Array.from(r)}console.log("///_ BEEP! The expression ("+i.sourceFor.call(t).replace("beep! ","")+") evaluates to:",a,"of type "+n)}}hyperscriptUrl="document"in e&&document.currentScript?document.currentScript.src:null}function s(){let e=document.cookie.split("; ").map((e=>{let t=e.split("=");return{name:t[0],value:decodeURIComponent(t[1])}}));return e}function u(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function l(){for(const e of s()){u(e.name)}}const c=new Proxy({},{get(e,t){if(t==="then"||t==="asyncWrapper"){return null}else if(t==="length"){return s().length}else if(t==="clear"){return u}else if(t==="clearAll"){return l}else if(typeof t==="string"){if(!isNaN(t)){return s()[parseInt(t)]}else{let e=document.cookie.split("; ").find((e=>e.startsWith(t+"=")))?.split("=")[1];if(e){return decodeURIComponent(e)}}}else if(t===Symbol.iterator){return s()[t]}},set(e,t,r){var n=null;if("string"===typeof r){n=encodeURIComponent(r);n+=";samesite=lax"}else{n=encodeURIComponent(r.value);if(r.expires){n+=";expires="+r.maxAge}if(r.maxAge){n+=";max-age="+r.maxAge}if(r.partitioned){n+=";partitioned="+r.partitioned}if(r.path){n+=";path="+r.path}if(r.samesite){n+=";samesite="+r.path}if(r.secure){n+=";secure="+r.path}}document.cookie=t+"="+n;return true}});class f{constructor(t,r,n,i,a){this.meta={parser:a.parser,lexer:a.lexer,runtime:a,owner:t,feature:r,iterators:{},ctx:this};this.locals={cookies:c};this.me=n,this.you=undefined;this.result=undefined;this.event=i;this.target=i?i.target:null;this.detail=i?i.detail:null;this.sender=i?i.detail?i.detail.sender:null:null;this.body="document"in e?document.body:null;a.addFeatures(t,this)}}class m{constructor(e,t,r){this._css=e;this.relativeToElement=t;this.escape=r;this[p]=true}get css(){if(this.escape){return o.prototype.escapeSelector(this._css)}else{return this._css}}get className(){return this._css.substr(1)}get id(){return this.className()}contains(e){for(let t of this){if(t.contains(e)){return true}}return false}get length(){return this.selectMatches().length}[Symbol.iterator](){let e=this.selectMatches();return e[Symbol.iterator]()}selectMatches(){let e=o.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css);return e}}const p=Symbol();function h(e,t){var r=e[t];if(r){return r}else{var n={};e[t]=n;return n}}function v(e){try{return JSON.parse(e)}catch(e){d(e);return null}}function d(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function E(e,t){return new(e.bind.apply(e,[e].concat(t)))}function T(t){t.addLeafExpression("parenthesized",(function(e,t,r){if(r.matchOpToken("(")){var n=r.clearFollows();try{var i=e.requireElement("expression",r)}finally{r.restoreFollows(n)}r.requireOpToken(")");return i}}));t.addLeafExpression("string",(function(e,t,r){var i=r.matchTokenType("STRING");if(!i)return;var a=i.value;var o;if(i.template){var s=n.tokenize(a,true);o=e.parseStringTemplate(s)}else{o=[]}return{type:"string",token:i,args:o,op:function(e){var t="";for(var r=1;re instanceof Element))}get css(){let e="",t=0;for(const r of this.templateParts){if(r instanceof Element){e+="[data-hs-query-id='"+t+++"']"}else e+=r}return e}[Symbol.iterator](){this.elements.forEach(((e,t)=>e.dataset.hsQueryId=t));const e=super[Symbol.iterator]();this.elements.forEach((e=>e.removeAttribute("data-hs-query-id")));return e}}t.addLeafExpression("queryRef",(function(e,t,i){var a=i.matchOpToken("<");if(!a)return;var o=i.consumeUntil("/");i.requireOpToken("/");i.requireOpToken(">");var s=o.map((function(e){if(e.type==="STRING"){return'"'+e.value+'"'}else{return e.value}})).join("");var u,l,c;if(s.indexOf("$")>=0){u=true;l=n.tokenize(s,true);c=e.parseStringTemplate(l)}return{type:"queryRef",css:s,args:c,op:function(e,...t){if(u){return new r(s,e.me,t)}else{return new m(s,e.me)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("attributeRef",(function(e,t,r){var n=r.matchTokenType("ATTRIBUTE_REF");if(!n)return;if(!n.value)return;var i=n.value;if(i.indexOf("[")===0){var a=i.substring(2,i.length-1)}else{var a=i.substring(1)}var o="["+a+"]";var s=a.split("=");var u=s[0];var l=s[1];if(l){if(l.indexOf('"')===0){l=l.substring(1,l.length-1)}}return{type:"attributeRef",name:u,css:o,value:l,op:function(e){var t=e.you||e.me;if(t){return t.getAttribute(u)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("styleRef",(function(e,t,r){var n=r.matchTokenType("STYLE_REF");if(!n)return;if(!n.value)return;var i=n.value.substr(1);if(i.startsWith("computed-")){i=i.substr("computed-".length);return{type:"computedStyleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveComputedStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}else{return{type:"styleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}}));t.addGrammarElement("objectKey",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{type:"objectKey",key:n.value,evaluate:function(){return n.value}}}else if(r.matchOpToken("[")){var i=e.parseElement("expression",r);r.requireOpToken("]");return{type:"objectKey",expr:i,args:[i],op:function(e,t){return t},evaluate:function(e){return t.unifiedEval(this,e)}}}else{var a="";do{n=r.matchTokenType("IDENTIFIER")||r.matchOpToken("-");if(n)a+=n.value}while(n);return{type:"objectKey",key:a,evaluate:function(){return a}}}}));t.addLeafExpression("objectLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[];var i=[];if(!r.matchOpToken("}")){do{var a=e.requireElement("objectKey",r);r.requireOpToken(":");var o=e.requireElement("expression",r);i.push(o);n.push(a)}while(r.matchOpToken(","));r.requireOpToken("}")}return{type:"objectLiteral",args:[n,i],op:function(e,t,r){var n={};for(var i=0;i");var a=e.requireElement("expression",r);return{type:"blockLiteral",args:n,expr:a,evaluate:function(e){var t=function(){for(var t=0;t=0;a--){var o=i[a];if(o.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}if(n){return i[i.length-1]}};var l=function(e,t,r,n){var i=[];o.prototype.forEach(t,(function(t){if(t.matches(r)||t===e){i.push(t)}}));for(var a=0;a","<=",">=","==","===","!=","!==");var a=i?i.value:null;var o=true;var s=false;if(a==null){if(r.matchToken("is")||r.matchToken("am")){if(r.matchToken("not")){if(r.matchToken("in")){a="not in"}else if(r.matchToken("a")){a="not a";s=true}else if(r.matchToken("empty")){a="not empty";o=false}else{if(r.matchToken("really")){a="!=="}else{a="!="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("in")){a="in"}else if(r.matchToken("a")){a="a";s=true}else if(r.matchToken("empty")){a="empty";o=false}else if(r.matchToken("less")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a="<="}else{a="<"}}else if(r.matchToken("greater")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a=">="}else{a=">"}}else{if(r.matchToken("really")){a="==="}else{a="=="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("equals")){a="=="}else if(r.matchToken("really")){r.requireToken("equals");a="==="}else if(r.matchToken("exist")||r.matchToken("exists")){a="exist";o=false}else if(r.matchToken("matches")||r.matchToken("match")){a="match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="contain"}else if(r.matchToken("includes")||r.matchToken("include")){a="include"}else if(r.matchToken("do")||r.matchToken("does")){r.requireToken("not");if(r.matchToken("matches")||r.matchToken("match")){a="not match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="not contain"}else if(r.matchToken("exist")||r.matchToken("exist")){a="not exist";o=false}else if(r.matchToken("include")){a="not include"}else{e.raiseParseError(r,"Expected matches or contains")}}}if(a){var u,l,c;if(s){u=r.requireTokenType("IDENTIFIER");l=!r.matchOpToken("!")}else if(o){c=e.requireElement("mathExpression",r);if(a==="match"||a==="not match"){c=c.css?c.css:c}}var m=n;n={type:"comparisonOperator",operator:a,typeName:u,nullOk:l,lhs:n,rhs:c,args:[n,c],op:function(e,r,n){if(a==="=="){return r==n}else if(a==="!="){return r!=n}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}if(a==="match"){return r!=null&&p(m,r,n)}if(a==="not match"){return r==null||!p(m,r,n)}if(a==="in"){return n!=null&&f(c,n,r)}if(a==="not in"){return n==null||!f(c,n,r)}if(a==="contain"){return r!=null&&f(m,r,n)}if(a==="not contain"){return r==null||!f(m,r,n)}if(a==="include"){return r!=null&&f(m,r,n)}if(a==="not include"){return r==null||!f(m,r,n)}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}else if(a==="<"){return r"){return r>n}else if(a==="<="){return r<=n}else if(a===">="){return r>=n}else if(a==="empty"){return t.isEmpty(r)}else if(a==="not empty"){return!t.isEmpty(r)}else if(a==="exist"){return t.doesExist(r)}else if(a==="not exist"){return!t.doesExist(r)}else if(a==="a"){return t.typeCheck(r,u.value,l)}else if(a==="not a"){return!t.typeCheck(r,u.value,l)}else{throw"Unknown comparison : "+a}},evaluate:function(e){return t.unifiedEval(this,e)}}}return n}));t.addGrammarElement("comparisonExpression",(function(e,t,r){return e.parseAnyOf(["comparisonOperator","mathExpression"],r)}));t.addGrammarElement("logicalOperator",(function(e,t,r){var n=e.parseElement("comparisonExpression",r);var i,a=null;i=r.matchToken("and")||r.matchToken("or");while(i){a=a||i;if(a.value!==i.value){e.raiseParseError(r,"You must parenthesize logical operations with different operators")}var o=e.requireElement("comparisonExpression",r);const s=i.value;n={type:"logicalOperator",operator:s,lhs:n,rhs:o,args:[n,o],op:function(e,t,r){if(s==="and"){return t&&r}else{return t||r}},evaluate:function(e){return t.unifiedEval(this,e)}};i=r.matchToken("and")||r.matchToken("or")}return n}));t.addGrammarElement("logicalExpression",(function(e,t,r){return e.parseAnyOf(["logicalOperator","mathExpression"],r)}));t.addGrammarElement("asyncExpression",(function(e,t,r){if(r.matchToken("async")){var n=e.requireElement("logicalExpression",r);var i={type:"asyncExpression",value:n,evaluate:function(e){return{asyncWrapper:true,value:this.value.evaluate(e)}}};return i}else{return e.parseElement("logicalExpression",r)}}));t.addGrammarElement("expression",(function(e,t,r){r.matchToken("the");return e.parseElement("asyncExpression",r)}));t.addGrammarElement("assignableExpression",(function(e,t,r){r.matchToken("the");var n=e.parseElement("primaryExpression",r);if(n&&(n.type==="symbol"||n.type==="ofExpression"||n.type==="propertyAccess"||n.type==="attributeRefAccess"||n.type==="attributeRef"||n.type==="styleRef"||n.type==="arrayIndex"||n.type==="possessive")){return n}else{e.raiseParseError(r,"A target expression must be writable. The expression type '"+(n&&n.type)+"' is not.")}return n}));t.addGrammarElement("hyperscript",(function(e,t,r){var n=[];if(r.hasMore()){while(e.featureStart(r.currentToken())||r.currentToken().value==="("){var i=e.requireElement("feature",r);n.push(i);r.matchToken("end")}}return{type:"hyperscript",features:n,apply:function(e,t,r){for(const i of n){i.install(e,t,r)}}}}));var v=function(e){var t=[];if(e.token(0).value==="("&&(e.token(1).value===")"||e.token(2).value===","||e.token(2).value===")")){e.matchOpToken("(");do{t.push(e.requireTokenType("IDENTIFIER"))}while(e.matchOpToken(","));e.requireOpToken(")")}return t};t.addFeature("on",(function(e,t,r){if(!r.matchToken("on"))return;var n=false;if(r.matchToken("every")){n=true}var i=[];var a=null;do{var o=e.requireElement("eventName",r,"Expected event name");var s=o.evaluate();if(a){a=a+" or "+s}else{a="on "+s}var u=v(r);var l=null;if(r.matchOpToken("[")){l=e.requireElement("expression",r);r.requireOpToken("]")}var c,f,m;if(r.currentToken().type==="NUMBER"){var p=r.consumeToken();if(!p.value)return;c=parseInt(p.value);if(r.matchToken("to")){var h=r.consumeToken();if(!h.value)return;f=parseInt(h.value)}else if(r.matchToken("and")){m=true;r.requireToken("on")}}var d,E;if(s==="intersection"){d={};if(r.matchToken("with")){d["with"]=e.requireElement("expression",r).evaluate()}if(r.matchToken("having")){do{if(r.matchToken("margin")){d["rootMargin"]=e.requireElement("stringLike",r).evaluate()}else if(r.matchToken("threshold")){d["threshold"]=e.requireElement("expression",r).evaluate()}else{e.raiseParseError(r,"Unknown intersection config specification")}}while(r.matchToken("and"))}}else if(s==="mutation"){E={};if(r.matchToken("of")){do{if(r.matchToken("anything")){E["attributes"]=true;E["subtree"]=true;E["characterData"]=true;E["childList"]=true}else if(r.matchToken("childList")){E["childList"]=true}else if(r.matchToken("attributes")){E["attributes"]=true;E["attributeOldValue"]=true}else if(r.matchToken("subtree")){E["subtree"]=true}else if(r.matchToken("characterData")){E["characterData"]=true;E["characterDataOldValue"]=true}else if(r.currentToken().type==="ATTRIBUTE_REF"){var T=r.consumeToken();if(E["attributeFilter"]==null){E["attributeFilter"]=[]}if(T.value.indexOf("@")==0){E["attributeFilter"].push(T.value.substring(1))}else{e.raiseParseError(r,"Only shorthand attribute references are allowed here")}}else{e.raiseParseError(r,"Unknown mutation config specification")}}while(r.matchToken("or"))}else{E["attributes"]=true;E["characterData"]=true;E["childList"]=true}}var y=null;var k=false;if(r.matchToken("from")){if(r.matchToken("elsewhere")){k=true}else{r.pushFollow("or");try{y=e.requireElement("expression",r)}finally{r.popFollow()}if(!y){e.raiseParseError(r,'Expected either target value or "elsewhere".')}}}if(y===null&&k===false&&r.matchToken("elsewhere")){k=true}if(r.matchToken("in")){var x=e.parseElement("unaryExpression",r)}if(r.matchToken("debounced")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var b=g.evaluate({})}else if(r.matchToken("throttled")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var w=g.evaluate({})}i.push({execCount:0,every:n,on:s,args:u,filter:l,from:y,inExpr:x,elsewhere:k,startCount:c,endCount:f,unbounded:m,debounceTime:b,throttleTime:w,mutationSpec:E,intersectionSpec:d,debounced:undefined,lastExec:undefined})}while(r.matchToken("or"));var S=true;if(!n){if(r.matchToken("queue")){if(r.matchToken("all")){var N=true;var S=false}else if(r.matchToken("first")){var q=true}else if(r.matchToken("none")){var I=true}else{r.requireToken("last")}}}var C=e.requireElement("commandList",r);e.ensureTerminated(C);var R,A;if(r.matchToken("catch")){R=r.requireTokenType("IDENTIFIER").value;A=e.requireElement("commandList",r);e.ensureTerminated(A)}if(r.matchToken("finally")){var L=e.requireElement("commandList",r);e.ensureTerminated(L)}var O={displayName:a,events:i,start:C,every:n,execCount:0,errorHandler:A,errorSymbol:R,execute:function(e){let r=t.getEventQueueFor(e.me,O);if(r.executing&&n===false){if(I||q&&r.queue.length>0){return}if(S){r.queue.length=0}r.queue.push(e);return}O.execCount++;r.executing=true;e.meta.onHalt=function(){r.executing=false;var e=r.queue.shift();if(e){setTimeout((function(){O.execute(e)}),1)}};e.meta.reject=function(r){console.error(r.message?r.message:r);var n=t.getHyperTrace(e,r);if(n){n.print()}t.triggerEvent(e.me,"exception",{error:r})};C.execute(e)},install:function(e,r){for(const r of O.events){var n;if(r.elsewhere){n=[document]}else if(r.from){n=r.from.evaluate(t.makeContext(e,O,e,null))}else{n=[e]}t.implicitLoop(n,(function(n){var i=r.on;if(n==null){console.warn("'%s' feature ignored because target does not exists:",a,e);return}if(r.mutationSpec){i="hyperscript:mutation";const e=new MutationObserver((function(e,r){if(!O.executing){t.triggerEvent(n,i,{mutationList:e,observer:r})}}));e.observe(n,r.mutationSpec)}if(r.intersectionSpec){i="hyperscript:intersection";const e=new IntersectionObserver((function(r){for(const o of r){var a={observer:e};a=Object.assign(a,o);a["intersecting"]=o.isIntersecting;t.triggerEvent(n,i,a)}}),r.intersectionSpec);e.observe(n)}var o=n.addEventListener||n.on;o.call(n,i,(function a(o){if(typeof Node!=="undefined"&&e instanceof Node&&n!==e&&!e.isConnected){n.removeEventListener(i,a);return}var s=t.makeContext(e,O,e,o);if(r.elsewhere&&e.contains(o.target)){return}if(r.from){s.result=n}for(const e of r.args){let t=s.event[e.value];if(t!==undefined){s.locals[e.value]=t}else if("detail"in s.event){s.locals[e.value]=s.event["detail"][e.value]}}s.meta.errorHandler=A;s.meta.errorSymbol=R;s.meta.finallyHandler=L;if(r.filter){var u=s.meta.context;s.meta.context=s.event;try{var l=r.filter.evaluate(s);if(l){}else{return}}finally{s.meta.context=u}}if(r.inExpr){var c=o.target;while(true){if(c.matches&&c.matches(r.inExpr.css)){s.result=c;break}else{c=c.parentElement;if(c==null){return}}}}r.execCount++;if(r.startCount){if(r.endCount){if(r.execCountr.endCount){return}}else if(r.unbounded){if(r.execCount{var a=false;for(const s of i){var o=n=>{e.result=n;if(s.args){for(const t of s.args){e.locals[t.value]=n[t.value]||(n.detail?n.detail[t.value]:null)}}if(!a){a=true;r(t.findNext(this,e))}};if(s.name){n.addEventListener(s.name,o,{once:true})}else if(s.time!=null){setTimeout(o,s.time,s.time)}}}))}};return n}else{var s;if(r.matchToken("a")){r.requireToken("tick");s=0}else{s=e.requireElement("expression",r)}n={type:"waitCmd",time:s,args:[s],op:function(e,r){return new Promise((n=>{setTimeout((()=>{n(t.findNext(this,e))}),r)}))},execute:function(e){return t.unifiedExec(this,e)}};return n}}));t.addGrammarElement("dotOrColonPath",(function(e,t,r){var n=r.matchTokenType("IDENTIFIER");if(n){var i=[n.value];var a=r.matchOpToken(".")||r.matchOpToken(":");if(a){do{i.push(r.requireTokenType("IDENTIFIER","NUMBER").value)}while(r.matchOpToken(a.value))}return{type:"dotOrColonPath",path:i,evaluate:function(){return i.join(a?a.value:"")}}}}));t.addGrammarElement("eventName",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{evaluate:function(){return n.value}}}return e.parseElement("dotOrColonPath",r)}));function d(e,t,r,n){var i=t.requireElement("eventName",n);var a=t.parseElement("namedArgumentList",n);if(e==="send"&&n.matchToken("to")||e==="trigger"&&n.matchToken("on")){var o=t.requireElement("expression",n)}else{var o=t.requireElement("implicitMeTarget",n)}var s={eventName:i,details:a,to:o,args:[o,i,a],op:function(e,t,n,i){r.nullCheck(t,o);r.implicitLoop(t,(function(t){r.triggerEvent(t,n,i,e.me)}));return r.findNext(s,e)}};return s}t.addCommand("trigger",(function(e,t,r){if(r.matchToken("trigger")){return d("trigger",e,t,r)}}));t.addCommand("send",(function(e,t,r){if(r.matchToken("send")){return d("send",e,t,r)}}));var T=function(e,t,r,n){if(n){if(e.commandBoundary(r.currentToken())){e.raiseParseError(r,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.")}else{var i=e.requireElement("expression",r)}}var a={value:i,args:[i],op:function(e,r){var n=e.meta.resolve;e.meta.returned=true;e.meta.returnValue=r;if(n){if(r){n(r)}else{n()}}return t.HALT}};return a};t.addCommand("return",(function(e,t,r){if(r.matchToken("return")){return T(e,t,r,true)}}));t.addCommand("exit",(function(e,t,r){if(r.matchToken("exit")){return T(e,t,r,false)}}));t.addCommand("halt",(function(e,t,r){if(r.matchToken("halt")){if(r.matchToken("the")){r.requireToken("event");if(r.matchOpToken("'")){r.requireToken("s")}var n=true}if(r.matchToken("bubbling")){var i=true}else if(r.matchToken("default")){var a=true}var o=T(e,t,r,false);var s={keepExecuting:true,bubbling:i,haltDefault:a,exit:o,op:function(e){if(e.event){if(i){e.event.stopPropagation()}else if(a){e.event.preventDefault()}else{e.event.stopPropagation();e.event.preventDefault()}if(n){return t.findNext(this,e)}else{return o}}}};return s}}));t.addCommand("log",(function(e,t,r){if(!r.matchToken("log"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}if(r.matchToken("with")){var i=e.requireElement("expression",r)}var a={exprs:n,withExpr:i,args:[i,n],op:function(e,r,n){if(r){r.apply(null,n)}else{console.log.apply(null,n)}return t.findNext(this,e)}};return a}));t.addCommand("beep!",(function(e,t,r){if(!r.matchToken("beep!"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}var i={exprs:n,args:[n],op:function(e,r){for(let i=0;i{if(!r.matchToken("pick"))return;r.matchToken("the");if(r.matchToken("item")||r.matchToken("items")||r.matchToken("character")||r.matchToken("characters")){const n=g(e,t,r);r.requireToken("from");const i=e.requireElement("expression",r);return{args:[i,n.from,n.to],op(e,r,i,a){if(n.toEnd)a=r.length;if(!n.includeStart)i++;if(n.includeEnd)a++;if(a==null||a==undefined)a=i+1;e.result=r.slice(i,a);return t.findNext(this,e)}}}if(r.matchToken("match")){r.matchToken("of");const n=e.parseElement("expression",r);let i="";if(r.matchOpToken("|")){i=r.requireToken("identifier").value}r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new RegExp(n,i).exec(r);return t.findNext(this,e)}}}if(r.matchToken("matches")){r.matchToken("of");const n=e.parseElement("expression",r);let i="gu";if(r.matchOpToken("|")){i="g"+r.requireToken("identifier").value.replace("g","")}console.log("flags",i);r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new w(n,i,r);return t.findNext(this,e)}}}}));t.addCommand("increment",(function(e,t,r){if(!r.matchToken("increment"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitIncrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t+r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));t.addCommand("decrement",(function(e,t,r){if(!r.matchToken("decrement"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitDecrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t-r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));function S(e,t){var r="text";var n;e.matchToken("a")||e.matchToken("an");if(e.matchToken("json")||e.matchToken("Object")){r="json"}else if(e.matchToken("response")){r="response"}else if(e.matchToken("html")){r="html"}else if(e.matchToken("text")){}else{n=t.requireElement("dotOrColonPath",e).evaluate()}return{type:r,conversion:n}}t.addCommand("fetch",(function(e,t,r){if(!r.matchToken("fetch"))return;var n=e.requireElement("stringLike",r);if(r.matchToken("as")){var i=S(r,e)}if(r.matchToken("with")&&r.currentToken().value!=="{"){var a=e.parseElement("nakedNamedArgumentList",r)}else{var a=e.parseElement("objectLiteral",r)}if(i==null&&r.matchToken("as")){i=S(r,e)}var o=i?i.type:"text";var s=i?i.conversion:null;var u={url:n,argExpressions:a,args:[n,a],op:function(e,r,n){var i=n||{};i["sender"]=e.me;i["headers"]=i["headers"]||{};var a=new AbortController;let l=e.me.addEventListener("fetch:abort",(function(){a.abort()}),{once:true});i["signal"]=a.signal;t.triggerEvent(e.me,"hyperscript:beforeFetch",i);t.triggerEvent(e.me,"fetch:beforeRequest",i);n=i;var c=false;if(n.timeout){setTimeout((function(){if(!c){a.abort()}}),n.timeout)}return fetch(r,n).then((function(r){let n={response:r};t.triggerEvent(e.me,"fetch:afterResponse",n);r=n.response;if(o==="response"){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}if(o==="json"){return r.json().then((function(r){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))}return r.text().then((function(r){if(s)r=t.convertValue(r,s);if(o==="html")r=t.convertValue(r,"Fragment");e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))})).catch((function(r){t.triggerEvent(e.me,"fetch:error",{reason:r});throw r})).finally((function(){e.me.removeEventListener("fetch:abort",l)}))}};return u}))}function y(e){e.addCommand("settle",(function(e,t,r){if(r.matchToken("settle")){if(!e.commandBoundary(r.currentToken())){var n=e.requireElement("expression",r)}else{var n=e.requireElement("implicitMeTarget",r)}var i={type:"settleCmd",args:[n],op:function(e,r){t.nullCheck(r,n);var a=null;var o=false;var s=false;var u=new Promise((function(e){a=e}));r.addEventListener("transitionstart",(function(){s=true}),{once:true});setTimeout((function(){if(!s&&!o){a(t.findNext(i,e))}}),500);r.addEventListener("transitionend",(function(){if(!o){a(t.findNext(i,e))}}),{once:true});return u},execute:function(e){return t.unifiedExec(this,e)}};return i}}));e.addCommand("add",(function(e,t,r){if(r.matchToken("add")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("styleLiteral",r);if(a==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("to")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}if(r.matchToken("when")){if(a){e.raiseParseError(r,"Only class and properties are supported with a when clause")}var u=e.requireElement("expression",r)}if(o){return{classRefs:o,to:s,args:[s,o],op:function(e,r,n){t.nullCheck(r,s);t.forEach(n,(function(n){t.implicitLoop(r,(function(r){if(u){e.result=r;let i=t.evaluateNoPromise(u,e);if(i){if(r instanceof Element)r.classList.add(n.className)}else{if(r instanceof Element)r.classList.remove(n.className)}e.result=null}else{if(r instanceof Element)r.classList.add(n.className)}}))}));return t.findNext(this,e)}}}else if(i){return{type:"addCmd",attributeRef:i,to:s,args:[s],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(r){if(u){e.result=r;let n=t.evaluateNoPromise(u,e);if(n){r.setAttribute(i.name,i.value)}else{r.removeAttribute(i.name)}e.result=null}else{r.setAttribute(i.name,i.value)}}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}else{return{type:"addCmd",cssDeclaration:a,to:s,args:[s,a],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(e){e.style.cssText+=n}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}}}));e.addGrammarElement("styleLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[""];var i=[];while(r.hasMore()){if(r.matchOpToken("\\")){r.consumeToken()}else if(r.matchOpToken("}")){break}else if(r.matchToken("$")){var a=r.matchOpToken("{");var o=e.parseElement("expression",r);if(a)r.requireOpToken("}");i.push(o);n.push("")}else{var s=r.consumeToken();n[n.length-1]+=r.source.substring(s.start,s.end)}n[n.length-1]+=r.lastWhitespace()}return{type:"styleLiteral",args:[i],op:function(e,t){var r="";n.forEach((function(e,n){r+=e;if(n in t)r+=t[n]}));return r},evaluate:function(e){return t.unifiedEval(this,e)}}}));e.addCommand("remove",(function(e,t,r){if(r.matchToken("remove")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("expression",r);if(a==null){e.raiseParseError(r,"Expected either a class reference, attribute expression or value expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("from")){var s=e.requireElement("expression",r)}else{if(a==null){var s=e.requireElement("implicitMeTarget",r)}}if(a){return{elementExpr:a,from:s,args:[a,s],op:function(e,r,n){t.nullCheck(r,a);t.implicitLoop(r,(function(e){if(e.parentElement&&(n==null||n.contains(e))){e.parentElement.removeChild(e)}}));return t.findNext(this,e)}}}else{return{classRefs:o,attributeRef:i,elementExpr:a,from:s,args:[o,s],op:function(e,r,n){t.nullCheck(n,s);if(r){t.forEach(r,(function(e){t.implicitLoop(n,(function(t){t.classList.remove(e.className)}))}))}else{t.implicitLoop(n,(function(e){e.removeAttribute(i.name)}))}return t.findNext(this,e)}}}}}));e.addCommand("toggle",(function(e,t,r){if(r.matchToken("toggle")){r.matchAnyToken("the","my");if(r.currentToken().type==="STYLE_REF"){let t=r.consumeToken();var n=t.value.substr(1);var a=true;var o=i(e,r,n);if(r.matchToken("of")){r.pushFollow("with");try{var s=e.requireElement("expression",r)}finally{r.popFollow()}}else{var s=e.requireElement("implicitMeTarget",r)}}else if(r.matchToken("between")){var u=true;var l=e.parseElement("classRef",r);r.requireToken("and");var c=e.requireElement("classRef",r)}else{var l=e.parseElement("classRef",r);var f=null;if(l==null){f=e.parseElement("attributeRef",r);if(f==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}else{var m=[l];while(l=e.parseElement("classRef",r)){m.push(l)}}}if(a!==true){if(r.matchToken("on")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}}if(r.matchToken("for")){var p=e.requireElement("expression",r)}else if(r.matchToken("until")){var h=e.requireElement("dotOrColonPath",r,"Expected event name");if(r.matchToken("from")){var v=e.requireElement("expression",r)}}var d={classRef:l,classRef2:c,classRefs:m,attributeRef:f,on:s,time:p,evt:h,from:v,toggle:function(e,r,n,i){t.nullCheck(e,s);if(a){t.implicitLoop(e,(function(e){o("toggle",e)}))}else if(u){t.implicitLoop(e,(function(e){if(e.classList.contains(r.className)){e.classList.remove(r.className);e.classList.add(n.className)}else{e.classList.add(r.className);e.classList.remove(n.className)}}))}else if(i){t.forEach(i,(function(r){t.implicitLoop(e,(function(e){e.classList.toggle(r.className)}))}))}else{t.implicitLoop(e,(function(e){if(e.hasAttribute(f.name)){e.removeAttribute(f.name)}else{e.setAttribute(f.name,f.value)}}))}},args:[s,p,h,v,l,c,m],op:function(e,r,n,i,a,o,s,u){if(n){return new Promise((function(i){d.toggle(r,o,s,u);setTimeout((function(){d.toggle(r,o,s,u);i(t.findNext(d,e))}),n)}))}else if(i){return new Promise((function(n){var l=a||e.me;l.addEventListener(i,(function(){d.toggle(r,o,s,u);n(t.findNext(d,e))}),{once:true});d.toggle(r,o,s,u)}))}else{this.toggle(r,o,s,u);return t.findNext(d,e)}}};return d}}));var t={display:function(r,n,i){if(i){n.style.display=i}else if(r==="toggle"){if(getComputedStyle(n).display==="none"){t.display("show",n,i)}else{t.display("hide",n,i)}}else if(r==="hide"){const t=e.runtime.getInternalData(n);if(t.originalDisplay==null){t.originalDisplay=n.style.display}n.style.display="none"}else{const t=e.runtime.getInternalData(n);if(t.originalDisplay&&t.originalDisplay!=="none"){n.style.display=t.originalDisplay}else{n.style.removeProperty("display")}}},visibility:function(e,r,n){if(n){r.style.visibility=n}else if(e==="toggle"){if(getComputedStyle(r).visibility==="hidden"){t.visibility("show",r,n)}else{t.visibility("hide",r,n)}}else if(e==="hide"){r.style.visibility="hidden"}else{r.style.visibility="visible"}},opacity:function(e,r,n){if(n){r.style.opacity=n}else if(e==="toggle"){if(getComputedStyle(r).opacity==="0"){t.opacity("show",r,n)}else{t.opacity("hide",r,n)}}else if(e==="hide"){r.style.opacity="0"}else{r.style.opacity="1"}}};var n=function(e,t,r){var n;var i=r.currentToken();if(i.value==="when"||i.value==="with"||e.commandBoundary(i)){n=e.parseElement("implicitMeTarget",r)}else{n=e.parseElement("expression",r)}return n};var i=function(e,n,i){var a=r.defaultHideShowStrategy;var o=t;if(r.hideShowStrategies){o=Object.assign(o,r.hideShowStrategies)}i=i||a||"display";var s=o[i];if(s==null){e.raiseParseError(n,"Unknown show/hide strategy : "+i)}return s};e.addCommand("hide",(function(e,t,r){if(r.matchToken("hide")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=i(e,r,o);return{target:a,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(e){s("hide",e)}));return t.findNext(this,e)}}}}));e.addCommand("show",(function(e,t,r){if(r.matchToken("show")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=null;if(r.matchOpToken(":")){var u=r.consumeUntilWhitespace();r.matchTokenType("WHITESPACE");s=u.map((function(e){return e.value})).join("")}if(r.matchToken("when")){var l=e.requireElement("expression",r)}var c=i(e,r,o);return{target:a,when:l,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(r){if(l){e.result=r;let n=t.evaluateNoPromise(l,e);if(n){c("show",r,s)}else{c("hide",r)}e.result=null}else{c("show",r,s)}}));return t.findNext(this,e)}}}}));e.addCommand("take",(function(e,t,r){if(r.matchToken("take")){let u=null;let l=[];while(u=e.parseElement("classRef",r)){l.push(u)}var n=null;var i=null;let c=l.length>0;if(!c){n=e.parseElement("attributeRef",r);if(n==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}if(r.matchToken("with")){i=e.requireElement("expression",r)}}if(r.matchToken("from")){var a=e.requireElement("expression",r)}if(r.matchToken("for")){var o=e.requireElement("expression",r)}else{var o=e.requireElement("implicitMeTarget",r)}if(c){var s={classRefs:l,from:a,forElt:o,args:[l,a,o],op:function(e,r,n,i){t.nullCheck(i,o);t.implicitLoop(r,(function(e){var r=e.className;if(n){t.implicitLoop(n,(function(e){e.classList.remove(r)}))}else{t.implicitLoop(e,(function(e){e.classList.remove(r)}))}t.implicitLoop(i,(function(e){e.classList.add(r)}))}));return t.findNext(this,e)}};return s}else{var s={attributeRef:n,from:a,forElt:o,args:[a,o,i],op:function(e,r,i,s){t.nullCheck(r,a);t.nullCheck(i,o);t.implicitLoop(r,(function(e){if(!s){e.removeAttribute(n.name)}else{e.setAttribute(n.name,s)}}));t.implicitLoop(i,(function(e){e.setAttribute(n.name,n.value||"")}));return t.findNext(this,e)}};return s}}}));function a(t,r,n,i){if(n!=null){var a=t.resolveSymbol(n,r)}else{var a=r}if(a instanceof Element||a instanceof HTMLDocument){while(a.firstChild)a.removeChild(a.firstChild);a.append(e.runtime.convertValue(i,"Fragment"));t.processNode(a)}else{if(n!=null){t.setSymbol(n,r,null,i)}else{throw"Don't know how to put a value into "+typeof r}}}e.addCommand("put",(function(e,t,r){if(r.matchToken("put")){var n=e.requireElement("expression",r);var i=r.matchAnyToken("into","before","after");if(i==null&&r.matchToken("at")){r.matchToken("the");i=r.matchAnyToken("start","end");r.requireToken("of")}if(i==null){e.raiseParseError(r,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'")}var o=e.requireElement("expression",r);var s=i.value;var u=false;var l=false;var c=null;var f=null;if(o.type==="arrayIndex"&&s==="into"){u=true;f=o.prop;c=o.root}else if(o.prop&&o.root&&s==="into"){f=o.prop.value;c=o.root}else if(o.type==="symbol"&&s==="into"){l=true;f=o.name}else if(o.type==="attributeRef"&&s==="into"){var m=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.type==="styleRef"&&s==="into"){var p=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.attribute&&s==="into"){var m=o.attribute.type==="attributeRef";var p=o.attribute.type==="styleRef";f=o.attribute.name;c=o.root}else{c=o}var h={target:o,operation:s,symbolWrite:l,value:n,args:[c,f,n],op:function(e,r,n,i){if(l){a(t,e,n,i)}else{t.nullCheck(r,c);if(s==="into"){if(m){t.implicitLoop(r,(function(e){e.setAttribute(n,i)}))}else if(p){t.implicitLoop(r,(function(e){e.style[n]=i}))}else if(u){r[n]=i}else{t.implicitLoop(r,(function(e){a(t,e,n,i)}))}}else{var o=s==="before"?Element.prototype.before:s==="after"?Element.prototype.after:s==="start"?Element.prototype.prepend:s==="end"?Element.prototype.append:Element.prototype.append;t.implicitLoop(r,(function(e){o.call(e,i instanceof Node?i:t.convertValue(i,"Fragment"));if(e.parentElement){t.processNode(e.parentElement)}else{t.processNode(e)}}))}}return t.findNext(this,e)}};return h}}));function o(e,t,r){var n;if(r.matchToken("the")||r.matchToken("element")||r.matchToken("elements")||r.currentToken().type==="CLASS_REF"||r.currentToken().type==="ID_REF"||r.currentToken().op&&r.currentToken().value==="<"){e.possessivesDisabled=true;try{n=e.parseElement("expression",r)}finally{delete e.possessivesDisabled}if(r.matchOpToken("'")){r.requireToken("s")}}else if(r.currentToken().type==="IDENTIFIER"&&r.currentToken().value==="its"){var i=r.matchToken("its");n={type:"pseudopossessiveIts",token:i,name:i.value,evaluate:function(e){return t.resolveSymbol("it",e)}}}else{r.matchToken("my")||r.matchToken("me");n=e.parseElement("implicitMeTarget",r)}return n}e.addCommand("transition",(function(e,t,n){if(n.matchToken("transition")){var i=o(e,t,n);var a=[];var s=[];var u=[];var l=n.currentToken();while(!e.commandBoundary(l)&&l.value!=="over"&&l.value!=="using"){if(n.currentToken().type==="STYLE_REF"){let e=n.consumeToken();let t=e.value.substr(1);a.push({type:"styleRefValue",evaluate:function(){return t}})}else{a.push(e.requireElement("stringLike",n))}if(n.matchToken("from")){s.push(e.requireElement("expression",n))}else{s.push(null)}n.requireToken("to");if(n.matchToken("initial")){u.push({type:"initial_literal",evaluate:function(){return"initial"}})}else{u.push(e.requireElement("expression",n))}l=n.currentToken()}if(n.matchToken("over")){var c=e.requireElement("expression",n)}else if(n.matchToken("using")){var f=e.requireElement("expression",n)}var m={to:u,args:[i,a,s,u,f,c],op:function(e,n,a,o,s,u,l){t.nullCheck(n,i);var c=[];t.implicitLoop(n,(function(e){var n=new Promise((function(n,i){var c=e.style.transition;if(l){e.style.transition="all "+l+"ms ease-in"}else if(u){e.style.transition=u}else{e.style.transition=r.defaultTransition}var f=t.getInternalData(e);var m=getComputedStyle(e);var p={};for(var h=0;he.forEach((e=>S(e))))).then((()=>n((function(){a();k.processNode(document.documentElement);e.document.addEventListener("htmx:load",(function(e){k.processNode(e.detail.elt)}))}))));function n(e){if(document.readyState!=="loading"){setTimeout(e)}else{document.addEventListener("DOMContentLoaded",e)}}function i(){var e=document.querySelector('meta[name="htmx-config"]');if(e){return v(e.content)}else{return null}}function a(){var e=i();if(e){Object.assign(r,e)}}}const S=Object.assign(b,{config:r,use(e){e(S)},internals:{lexer:x,parser:g,runtime:k,Lexer:n,Tokens:i,Parser:a,Runtime:o},ElementCollection:m,addFeature:g.addFeature.bind(g),addCommand:g.addCommand.bind(g),addLeafExpression:g.addLeafExpression.bind(g),addIndirectExpression:g.addIndirectExpression.bind(g),evaluate:k.evaluate.bind(k),parse:k.parse.bind(k),processNode:k.processNode.bind(k),version:"0.9.13",browserInit:w});return S})); diff --git a/dist/_hyperscript.min.js.gz b/dist/_hyperscript.min.js.gz index a158da5d3e563c94cba34175f29aaed2ac19ea24..2d4301e730a470398f508ecb8733082122abbee3 100644 GIT binary patch literal 25629 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 Ianp$b07j7?`Tzg` literal 25536 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 diff --git a/dist/ext/tailwind.js b/dist/ext/tailwind.js new file mode 100644 index 00000000..66d0bf36 --- /dev/null +++ b/dist/ext/tailwind.js @@ -0,0 +1,43 @@ +_hyperscript.config.hideShowStrategies = { + twDisplay: function (op, element, arg) { + if (op === "toggle") { + if (element.classList.contains("hidden")) { + _hyperscript.config.hideShowStrategies.twDisplay("show", element, arg); + } else { + _hyperscript.config.hideShowStrategies.twDisplay("hide", element, arg); + } + } else if (op === "hide") { + element.classList.add('hidden'); + } else { + element.classList.remove('hidden'); + } + }, + + twVisibility: function (op, element, arg) { + if (op === "toggle") { + if (element.classList.contains("invisible")) { + _hyperscript.config.hideShowStrategies.twVisibility("show", element, arg); + } else { + _hyperscript.config.hideShowStrategies.twVisibility("hide", element, arg); + } + } else if (op === "hide") { + element.classList.add('invisible'); + } else { + element.classList.remove('invisible'); + } + }, + + twOpacity: function (op, element, arg) { + if (op === "toggle") { + if (element.classList.contains("opacity-0")) { + _hyperscript.config.hideShowStrategies.twOpacity("show", element, arg); + } else { + _hyperscript.config.hideShowStrategies.twOpacity("hide", element, arg); + } + } else if (op === "hide") { + element.classList.add('opacity-0'); + } else { + element.classList.remove('opacity-0'); + } + } +}; \ No newline at end of file diff --git a/www/js/_hyperscript.min.js b/www/js/_hyperscript.min.js index 355c78ae..810c119f 100644 --- a/www/js/_hyperscript.min.js +++ b/www/js/_hyperscript.min.js @@ -1 +1 @@ -(function(e,t){const r=t(e);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=r}else{e["_hyperscript"]=r;if("document"in e)e["_hyperscript"].browserInit()}})(typeof self!=="undefined"?self:this,(e=>{"use strict";const t={dynamicResolvers:[function(e,t){if(e==="Fixed"){return Number(t).toFixed()}else if(e.indexOf("Fixed:")===0){let r=e.split(":")[1];return Number(t).toFixed(parseInt(r))}}],String:function(e){if(e.toString){return e.toString()}else{return""+e}},Int:function(e){return parseInt(e)},Float:function(e){return parseFloat(e)},Number:function(e){return Number(e)},Date:function(e){return new Date(e)},Array:function(e){return Array.from(e)},JSON:function(e){return JSON.stringify(e)},Object:function(e){if(e instanceof String){e=e.toString()}if(typeof e==="string"){return JSON.parse(e)}else{return Object.assign({},e)}}};const r={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:t};class n{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS"};static isValidCSSClassChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isValidCSSIDChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isWhitespace(e){return e===" "||e==="\t"||n.isNewline(e)}static positionString(e){return"[Line: "+e.line+", Column: "+e.column+"]"}static isNewline(e){return e==="\r"||e==="\n"}static isNumeric(e){return e>="0"&&e<="9"}static isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}static isIdentifierChar(e,t){return e==="_"||e==="$"}static isReservedChar(e){return e==="`"||e==="^"}static isValidSingleQuoteStringStart(e){if(e.length>0){var t=e[e.length-1];if(t.type==="IDENTIFIER"||t.type==="CLASS_REF"||t.type==="ID_REF"){return false}if(t.op&&(t.value===">"||t.value===")")){return false}}return true}static tokenize(e,t){var r=[];var a=e;var o=0;var s=0;var u=1;var l="";var c=0;function f(){return t&&c===0}while(o=0){return this.consumeToken()}}requireToken(e,t){var r=this.matchToken(e,t);if(r){return r}else{this.raiseError(this,"Expected '"+e+"' but found '"+this.currentToken().value+"'")}}peekToken(e,t,r){t=t||0;r=r||"IDENTIFIER";if(this.tokens[t]&&this.tokens[t].value===e&&this.tokens[t].type===r){return this.tokens[t]}}matchToken(e,t){if(this.follows.indexOf(e)!==-1){return}t=t||"IDENTIFIER";if(this.currentToken()&&this.currentToken().value===e&&this.currentToken().type===t){return this.consumeToken()}}consumeToken(){var e=this.tokens.shift();this.consumed.push(e);this._lastConsumed=e;this.consumeWhitespace();return e}consumeUntil(e,t){var r=[];var n=this.token(0,true);while((t==null||n.type!==t)&&(e==null||n.value!==e)&&n.type!=="EOF"){var i=this.tokens.shift();this.consumed.push(i);r.push(n);n=this.token(0,true)}this.consumeWhitespace();return r}lastWhitespace(){if(this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"){return this.consumed[this.consumed.length-1].value}else{return""}}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(e,t){var r;var n=0;do{if(!t){while(this.tokens[n]&&this.tokens[n].type==="WHITESPACE"){n++}}r=this.tokens[n];e--;n++}while(e>-1);if(r){return r}else{return{type:"EOF",value:"<<>>"}}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split("\n")[this.startToken.line-1]};follows=[];pushFollow(e){this.follows.push(e)}popFollow(){this.follows.pop()}clearFollows(){var e=this.follows;this.follows=[];return e}restoreFollows(e){this.follows=e}}class a{constructor(e){this.runtime=e;this.possessivesDisabled=false;this.addGrammarElement("feature",(function(e,t,r){if(r.matchOpToken("(")){var n=e.requireElement("feature",r);r.requireOpToken(")");return n}var i=e.FEATURES[r.currentToken().value||""];if(i){return i(e,t,r)}}));this.addGrammarElement("command",(function(e,t,r){if(r.matchOpToken("(")){const t=e.requireElement("command",r);r.requireOpToken(")");return t}var n=e.COMMANDS[r.currentToken().value||""];let i;if(n){i=n(e,t,r)}else if(r.currentToken().type==="IDENTIFIER"){i=e.parseElement("pseudoCommand",r)}if(i){return e.parseElement("indirectStatement",r,i)}return i}));this.addGrammarElement("commandList",(function(e,t,r){if(r.hasMore()){var n=e.parseElement("command",r);if(n){r.matchToken("then");const t=e.parseElement("commandList",r);if(t)n.next=t;return n}}return{type:"emptyCommandListCommand",op:function(e){return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}));this.addGrammarElement("leaf",(function(e,t,r){var n=e.parseAnyOf(e.LEAF_EXPRESSIONS,r);if(n==null){return e.parseElement("symbol",r)}return n}));this.addGrammarElement("indirectExpression",(function(e,t,r,n){for(var i=0;i{this.unifiedExec(e,t)})).catch((e=>{this.unifiedExec({op:function(){throw e}},t)}));return}else if(r===o.HALT){if(t.meta.finallyHandler&&!t.meta.handlingFinally){t.meta.handlingFinally=true;e=t.meta.finallyHandler}else{if(t.meta.onHalt){t.meta.onHalt()}if(t.meta.currentException){if(t.meta.reject){t.meta.reject(t.meta.currentException);return}else{throw t.meta.currentException}}else{return}}}else{e=r}}}unifiedEval(e,t){var r=[t];var n=false;var i=false;if(e.args){for(var a=0;a{r=this.wrapArrays(r);Promise.all(r).then((function(r){if(i){this.unwrapAsyncs(r)}try{var a=e.op.apply(e,r);t(a)}catch(e){n(e)}})).catch((function(e){n(e)}))}))}else{if(i){this.unwrapAsyncs(r)}return e.op.apply(e,r)}}_scriptAttrs=null;getScriptAttributes(){if(this._scriptAttrs==null){this._scriptAttrs=r.attributes.replace(/ /g,"").split(",")}return this._scriptAttrs}getScript(e){for(var t=0;t{this.initElement(e,e instanceof HTMLScriptElement&&e.type==="text/hyperscript"?document.body:e)}))}}initElement(e,t){if(e.closest&&e.closest(r.disableSelector)){return}var n=this.getInternalData(e);if(!n.initialized){var i=this.getScript(e);if(i){try{n.initialized=true;n.script=i;const r=this.lexer,s=this.parser;var a=r.tokenize(i);var o=s.parseHyperScript(a);if(!o)return;o.apply(t||e,e);setTimeout((()=>{this.triggerEvent(t||e,"load",{hyperscript:true})}),1)}catch(t){this.triggerEvent(e,"exception",{error:t});console.error("hyperscript errors were found on the following element:",e,"\n\n",t.message,t.stack)}}}}internalDataMap=new WeakMap;getInternalData(e){var t=this.internalDataMap.get(e);if(typeof t==="undefined"){this.internalDataMap.set(e,t={})}return t}typeCheck(e,t,r){if(e==null&&r){return true}var n=Object.prototype.toString.call(e).slice(8,-1);return n===t}getElementScope(e){var t=e.meta&&e.meta.owner;if(t){var r=this.getInternalData(t);var n="elementScope";if(e.meta.feature&&e.meta.feature.behavior){n=e.meta.feature.behavior+"Scope"}var i=h(r,n);return i}else{return{}}}isReservedWord(e){return["meta","it","result","locals","event","target","detail","sender","body"].includes(e)}isHyperscriptContext(e){return e instanceof f}resolveSymbol(t,r,n){if(t==="me"||t==="my"||t==="I"){return r.me}if(t==="it"||t==="its"||t==="result"){return r.result}if(t==="you"||t==="your"||t==="yourself"){return r.you}else{if(n==="global"){return e[t]}else if(n==="element"){var i=this.getElementScope(r);return i[t]}else if(n==="local"){return r.locals[t]}else{if(r.meta&&r.meta.context){var a=r.meta.context[t];if(typeof a!=="undefined"){return a}if(r.meta.context.detail){a=r.meta.context.detail[t];if(typeof a!=="undefined"){return a}}}if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){var o=r.locals[t]}else{var o=r[t]}if(typeof o!=="undefined"){return o}else{var i=this.getElementScope(r);o=i[t];if(typeof o!=="undefined"){return o}else{return e[t]}}}}}setSymbol(t,r,n,i){if(n==="global"){e[t]=i}else if(n==="element"){var a=this.getElementScope(r);a[t]=i}else if(n==="local"){r.locals[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)&&typeof r.locals[t]!=="undefined"){r.locals[t]=i}else{var a=this.getElementScope(r);var o=a[t];if(typeof o!=="undefined"){a[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){r.locals[t]=i}else{r[t]=i}}}}}findNext(e,t){if(e){if(e.resolveNext){return e.resolveNext(t)}else if(e.next){return e.next}else{return this.findNext(e.parent,t)}}}flatGet(e,t,r){if(e!=null){var n=r(e,t);if(typeof n!=="undefined"){return n}if(this.shouldAutoIterate(e)){var i=[];for(var a of e){var o=r(a,t);i.push(o)}return i}}}resolveProperty(e,t){return this.flatGet(e,t,((e,t)=>e[t]))}resolveAttribute(e,t){return this.flatGet(e,t,((e,t)=>e.getAttribute&&e.getAttribute(t)))}resolveStyle(e,t){return this.flatGet(e,t,((e,t)=>e.style&&e.style[t]))}resolveComputedStyle(e,t){return this.flatGet(e,t,((e,t)=>getComputedStyle(e).getPropertyValue(t)))}assignToNamespace(t,r,n,i){let a;if(typeof document!=="undefined"&&t===document.body){a=e}else{a=this.getHyperscriptFeatures(t)}var o;while((o=r.shift())!==undefined){var s=a[o];if(s==null){s={};a[o]=s}a=s}a[n]=i}getHyperTrace(e,t){var r=[];var n=e;while(n.meta.caller){n=n.meta.caller}if(n.meta.traceMap){return n.meta.traceMap.get(t,r)}}registerHyperTrace(e,t){var r=[];var n=null;while(e!=null){r.push(e);n=e;e=e.meta.caller}if(n.meta.traceMap==null){n.meta.traceMap=new Map}if(!n.meta.traceMap.get(t)){var i={trace:r,print:function(e){e=e||console.error;e("hypertrace /// ");var t=0;for(var n=0;n",i.meta.feature.displayName.padEnd(t+2),"-",i.meta.owner)}}};n.meta.traceMap.set(t,i)}}escapeSelector(e){return e.replace(/:/g,(function(e){return"\\"+e}))}nullCheck(e,t){if(e==null){throw new Error("'"+t.sourceFor()+"' is null")}}isEmpty(e){return e==undefined||e.length===0}doesExist(e){if(e==null){return false}if(this.shouldAutoIterate(e)){for(const t of e){return true}return false}return true}getRootNode(e){if(e&&e instanceof Node){var t=e.getRootNode();if(t instanceof Document||t instanceof ShadowRoot)return t}return document}getEventQueueFor(e,t){let r=this.getInternalData(e);var n=r.eventQueues;if(n==null){n=new Map;r.eventQueues=n}var i=n.get(t);if(i==null){i={queue:[],executing:false};n.set(t,i)}return i}beepValueToConsole(e,t,r){if(this.triggerEvent(e,"hyperscript:beep",{element:e,expression:t,value:r})){var n;if(r){if(r instanceof m){n="ElementCollection"}else if(r.constructor){n=r.constructor.name}else{n="unknown"}}else{n="object (null)"}var a=r;if(n==="String"){a='"'+a+'"'}else if(r instanceof m){a=Array.from(r)}console.log("///_ BEEP! The expression ("+i.sourceFor.call(t).replace("beep! ","")+") evaluates to:",a,"of type "+n)}}hyperscriptUrl="document"in e&&document.currentScript?document.currentScript.src:null}function s(){let e=document.cookie.split("; ").map((e=>{let t=e.split("=");return{name:t[0],value:decodeURIComponent(t[1])}}));return e}function u(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function l(){for(const e of s()){u(e.name)}}const c=new Proxy({},{get(e,t){if(t==="then"||t==="asyncWrapper"){return null}else if(t==="length"){return s().length}else if(t==="clear"){return u}else if(t==="clearAll"){return l}else if(typeof t==="string"){if(!isNaN(t)){return s()[parseInt(t)]}else{let e=document.cookie.split("; ").find((e=>e.startsWith(t+"=")))?.split("=")[1];if(e){return decodeURIComponent(e)}}}else if(t===Symbol.iterator){return s()[t]}},set(e,t,r){var n=null;if("string"===typeof r){n=encodeURIComponent(r);n+=";samesite=lax"}else{n=encodeURIComponent(r.value);if(r.expires){n+=";expires="+r.maxAge}if(r.maxAge){n+=";max-age="+r.maxAge}if(r.partitioned){n+=";partitioned="+r.partitioned}if(r.path){n+=";path="+r.path}if(r.samesite){n+=";samesite="+r.path}if(r.secure){n+=";secure="+r.path}}document.cookie=t+"="+n;return true}});class f{constructor(t,r,n,i,a){this.meta={parser:a.parser,lexer:a.lexer,runtime:a,owner:t,feature:r,iterators:{},ctx:this};this.locals={cookies:c};this.me=n,this.you=undefined;this.result=undefined;this.event=i;this.target=i?i.target:null;this.detail=i?i.detail:null;this.sender=i?i.detail?i.detail.sender:null:null;this.body="document"in e?document.body:null;a.addFeatures(t,this)}}class m{constructor(e,t,r){this._css=e;this.relativeToElement=t;this.escape=r;this[p]=true}get css(){if(this.escape){return o.prototype.escapeSelector(this._css)}else{return this._css}}get className(){return this._css.substr(1)}get id(){return this.className()}contains(e){for(let t of this){if(t.contains(e)){return true}}return false}get length(){return this.selectMatches().length}[Symbol.iterator](){let e=this.selectMatches();return e[Symbol.iterator]()}selectMatches(){let e=o.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css);return e}}const p=Symbol();function h(e,t){var r=e[t];if(r){return r}else{var n={};e[t]=n;return n}}function v(e){try{return JSON.parse(e)}catch(e){d(e);return null}}function d(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function E(e,t){return new(e.bind.apply(e,[e].concat(t)))}function T(t){t.addLeafExpression("parenthesized",(function(e,t,r){if(r.matchOpToken("(")){var n=r.clearFollows();try{var i=e.requireElement("expression",r)}finally{r.restoreFollows(n)}r.requireOpToken(")");return i}}));t.addLeafExpression("string",(function(e,t,r){var i=r.matchTokenType("STRING");if(!i)return;var a=i.value;var o;if(i.template){var s=n.tokenize(a,true);o=e.parseStringTemplate(s)}else{o=[]}return{type:"string",token:i,args:o,op:function(e){var t="";for(var r=1;re instanceof Element))}get css(){let e="",t=0;for(const r of this.templateParts){if(r instanceof Element){e+="[data-hs-query-id='"+t+++"']"}else e+=r}return e}[Symbol.iterator](){this.elements.forEach(((e,t)=>e.dataset.hsQueryId=t));const e=super[Symbol.iterator]();this.elements.forEach((e=>e.removeAttribute("data-hs-query-id")));return e}}t.addLeafExpression("queryRef",(function(e,t,i){var a=i.matchOpToken("<");if(!a)return;var o=i.consumeUntil("/");i.requireOpToken("/");i.requireOpToken(">");var s=o.map((function(e){if(e.type==="STRING"){return'"'+e.value+'"'}else{return e.value}})).join("");var u,l,c;if(s.indexOf("$")>=0){u=true;l=n.tokenize(s,true);c=e.parseStringTemplate(l)}return{type:"queryRef",css:s,args:c,op:function(e,...t){if(u){return new r(s,e.me,t)}else{return new m(s,e.me)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("attributeRef",(function(e,t,r){var n=r.matchTokenType("ATTRIBUTE_REF");if(!n)return;if(!n.value)return;var i=n.value;if(i.indexOf("[")===0){var a=i.substring(2,i.length-1)}else{var a=i.substring(1)}var o="["+a+"]";var s=a.split("=");var u=s[0];var l=s[1];if(l){if(l.indexOf('"')===0){l=l.substring(1,l.length-1)}}return{type:"attributeRef",name:u,css:o,value:l,op:function(e){var t=e.you||e.me;if(t){return t.getAttribute(u)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("styleRef",(function(e,t,r){var n=r.matchTokenType("STYLE_REF");if(!n)return;if(!n.value)return;var i=n.value.substr(1);if(i.startsWith("computed-")){i=i.substr("computed-".length);return{type:"computedStyleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveComputedStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}else{return{type:"styleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}}));t.addGrammarElement("objectKey",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{type:"objectKey",key:n.value,evaluate:function(){return n.value}}}else if(r.matchOpToken("[")){var i=e.parseElement("expression",r);r.requireOpToken("]");return{type:"objectKey",expr:i,args:[i],op:function(e,t){return t},evaluate:function(e){return t.unifiedEval(this,e)}}}else{var a="";do{n=r.matchTokenType("IDENTIFIER")||r.matchOpToken("-");if(n)a+=n.value}while(n);return{type:"objectKey",key:a,evaluate:function(){return a}}}}));t.addLeafExpression("objectLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[];var i=[];if(!r.matchOpToken("}")){do{var a=e.requireElement("objectKey",r);r.requireOpToken(":");var o=e.requireElement("expression",r);i.push(o);n.push(a)}while(r.matchOpToken(","));r.requireOpToken("}")}return{type:"objectLiteral",args:[n,i],op:function(e,t,r){var n={};for(var i=0;i");var a=e.requireElement("expression",r);return{type:"blockLiteral",args:n,expr:a,evaluate:function(e){var t=function(){for(var t=0;t=0;a--){var o=i[a];if(o.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}if(n){return i[i.length-1]}};var l=function(e,t,r,n){var i=[];o.prototype.forEach(t,(function(t){if(t.matches(r)||t===e){i.push(t)}}));for(var a=0;a","<=",">=","==","===","!=","!==");var a=i?i.value:null;var o=true;var s=false;if(a==null){if(r.matchToken("is")||r.matchToken("am")){if(r.matchToken("not")){if(r.matchToken("in")){a="not in"}else if(r.matchToken("a")){a="not a";s=true}else if(r.matchToken("empty")){a="not empty";o=false}else{if(r.matchToken("really")){a="!=="}else{a="!="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("in")){a="in"}else if(r.matchToken("a")){a="a";s=true}else if(r.matchToken("empty")){a="empty";o=false}else if(r.matchToken("less")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a="<="}else{a="<"}}else if(r.matchToken("greater")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a=">="}else{a=">"}}else{if(r.matchToken("really")){a="==="}else{a="=="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("equals")){a="=="}else if(r.matchToken("really")){r.requireToken("equals");a="==="}else if(r.matchToken("exist")||r.matchToken("exists")){a="exist";o=false}else if(r.matchToken("matches")||r.matchToken("match")){a="match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="contain"}else if(r.matchToken("includes")||r.matchToken("include")){a="include"}else if(r.matchToken("do")||r.matchToken("does")){r.requireToken("not");if(r.matchToken("matches")||r.matchToken("match")){a="not match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="not contain"}else if(r.matchToken("exist")||r.matchToken("exist")){a="not exist";o=false}else if(r.matchToken("include")){a="not include"}else{e.raiseParseError(r,"Expected matches or contains")}}}if(a){var u,l,c;if(s){u=r.requireTokenType("IDENTIFIER");l=!r.matchOpToken("!")}else if(o){c=e.requireElement("mathExpression",r);if(a==="match"||a==="not match"){c=c.css?c.css:c}}var m=n;n={type:"comparisonOperator",operator:a,typeName:u,nullOk:l,lhs:n,rhs:c,args:[n,c],op:function(e,r,n){if(a==="=="){return r==n}else if(a==="!="){return r!=n}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}if(a==="match"){return r!=null&&p(m,r,n)}if(a==="not match"){return r==null||!p(m,r,n)}if(a==="in"){return n!=null&&f(c,n,r)}if(a==="not in"){return n==null||!f(c,n,r)}if(a==="contain"){return r!=null&&f(m,r,n)}if(a==="not contain"){return r==null||!f(m,r,n)}if(a==="include"){return r!=null&&f(m,r,n)}if(a==="not include"){return r==null||!f(m,r,n)}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}else if(a==="<"){return r"){return r>n}else if(a==="<="){return r<=n}else if(a===">="){return r>=n}else if(a==="empty"){return t.isEmpty(r)}else if(a==="not empty"){return!t.isEmpty(r)}else if(a==="exist"){return t.doesExist(r)}else if(a==="not exist"){return!t.doesExist(r)}else if(a==="a"){return t.typeCheck(r,u.value,l)}else if(a==="not a"){return!t.typeCheck(r,u.value,l)}else{throw"Unknown comparison : "+a}},evaluate:function(e){return t.unifiedEval(this,e)}}}return n}));t.addGrammarElement("comparisonExpression",(function(e,t,r){return e.parseAnyOf(["comparisonOperator","mathExpression"],r)}));t.addGrammarElement("logicalOperator",(function(e,t,r){var n=e.parseElement("comparisonExpression",r);var i,a=null;i=r.matchToken("and")||r.matchToken("or");while(i){a=a||i;if(a.value!==i.value){e.raiseParseError(r,"You must parenthesize logical operations with different operators")}var o=e.requireElement("comparisonExpression",r);const s=i.value;n={type:"logicalOperator",operator:s,lhs:n,rhs:o,args:[n,o],op:function(e,t,r){if(s==="and"){return t&&r}else{return t||r}},evaluate:function(e){return t.unifiedEval(this,e)}};i=r.matchToken("and")||r.matchToken("or")}return n}));t.addGrammarElement("logicalExpression",(function(e,t,r){return e.parseAnyOf(["logicalOperator","mathExpression"],r)}));t.addGrammarElement("asyncExpression",(function(e,t,r){if(r.matchToken("async")){var n=e.requireElement("logicalExpression",r);var i={type:"asyncExpression",value:n,evaluate:function(e){return{asyncWrapper:true,value:this.value.evaluate(e)}}};return i}else{return e.parseElement("logicalExpression",r)}}));t.addGrammarElement("expression",(function(e,t,r){r.matchToken("the");return e.parseElement("asyncExpression",r)}));t.addGrammarElement("assignableExpression",(function(e,t,r){r.matchToken("the");var n=e.parseElement("primaryExpression",r);if(n&&(n.type==="symbol"||n.type==="ofExpression"||n.type==="propertyAccess"||n.type==="attributeRefAccess"||n.type==="attributeRef"||n.type==="styleRef"||n.type==="arrayIndex"||n.type==="possessive")){return n}else{e.raiseParseError(r,"A target expression must be writable. The expression type '"+(n&&n.type)+"' is not.")}return n}));t.addGrammarElement("hyperscript",(function(e,t,r){var n=[];if(r.hasMore()){while(e.featureStart(r.currentToken())||r.currentToken().value==="("){var i=e.requireElement("feature",r);n.push(i);r.matchToken("end")}}return{type:"hyperscript",features:n,apply:function(e,t,r){for(const i of n){i.install(e,t,r)}}}}));var v=function(e){var t=[];if(e.token(0).value==="("&&(e.token(1).value===")"||e.token(2).value===","||e.token(2).value===")")){e.matchOpToken("(");do{t.push(e.requireTokenType("IDENTIFIER"))}while(e.matchOpToken(","));e.requireOpToken(")")}return t};t.addFeature("on",(function(e,t,r){if(!r.matchToken("on"))return;var n=false;if(r.matchToken("every")){n=true}var i=[];var a=null;do{var o=e.requireElement("eventName",r,"Expected event name");var s=o.evaluate();if(a){a=a+" or "+s}else{a="on "+s}var u=v(r);var l=null;if(r.matchOpToken("[")){l=e.requireElement("expression",r);r.requireOpToken("]")}var c,f,m;if(r.currentToken().type==="NUMBER"){var p=r.consumeToken();if(!p.value)return;c=parseInt(p.value);if(r.matchToken("to")){var h=r.consumeToken();if(!h.value)return;f=parseInt(h.value)}else if(r.matchToken("and")){m=true;r.requireToken("on")}}var d,E;if(s==="intersection"){d={};if(r.matchToken("with")){d["with"]=e.requireElement("expression",r).evaluate()}if(r.matchToken("having")){do{if(r.matchToken("margin")){d["rootMargin"]=e.requireElement("stringLike",r).evaluate()}else if(r.matchToken("threshold")){d["threshold"]=e.requireElement("expression",r).evaluate()}else{e.raiseParseError(r,"Unknown intersection config specification")}}while(r.matchToken("and"))}}else if(s==="mutation"){E={};if(r.matchToken("of")){do{if(r.matchToken("anything")){E["attributes"]=true;E["subtree"]=true;E["characterData"]=true;E["childList"]=true}else if(r.matchToken("childList")){E["childList"]=true}else if(r.matchToken("attributes")){E["attributes"]=true;E["attributeOldValue"]=true}else if(r.matchToken("subtree")){E["subtree"]=true}else if(r.matchToken("characterData")){E["characterData"]=true;E["characterDataOldValue"]=true}else if(r.currentToken().type==="ATTRIBUTE_REF"){var T=r.consumeToken();if(E["attributeFilter"]==null){E["attributeFilter"]=[]}if(T.value.indexOf("@")==0){E["attributeFilter"].push(T.value.substring(1))}else{e.raiseParseError(r,"Only shorthand attribute references are allowed here")}}else{e.raiseParseError(r,"Unknown mutation config specification")}}while(r.matchToken("or"))}else{E["attributes"]=true;E["characterData"]=true;E["childList"]=true}}var y=null;var k=false;if(r.matchToken("from")){if(r.matchToken("elsewhere")){k=true}else{r.pushFollow("or");try{y=e.requireElement("expression",r)}finally{r.popFollow()}if(!y){e.raiseParseError(r,'Expected either target value or "elsewhere".')}}}if(y===null&&k===false&&r.matchToken("elsewhere")){k=true}if(r.matchToken("in")){var x=e.parseElement("unaryExpression",r)}if(r.matchToken("debounced")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var b=g.evaluate({})}else if(r.matchToken("throttled")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var w=g.evaluate({})}i.push({execCount:0,every:n,on:s,args:u,filter:l,from:y,inExpr:x,elsewhere:k,startCount:c,endCount:f,unbounded:m,debounceTime:b,throttleTime:w,mutationSpec:E,intersectionSpec:d,debounced:undefined,lastExec:undefined})}while(r.matchToken("or"));var S=true;if(!n){if(r.matchToken("queue")){if(r.matchToken("all")){var q=true;var S=false}else if(r.matchToken("first")){var N=true}else if(r.matchToken("none")){var I=true}else{r.requireToken("last")}}}var C=e.requireElement("commandList",r);e.ensureTerminated(C);var R,A;if(r.matchToken("catch")){R=r.requireTokenType("IDENTIFIER").value;A=e.requireElement("commandList",r);e.ensureTerminated(A)}if(r.matchToken("finally")){var L=e.requireElement("commandList",r);e.ensureTerminated(L)}var O={displayName:a,events:i,start:C,every:n,execCount:0,errorHandler:A,errorSymbol:R,execute:function(e){let r=t.getEventQueueFor(e.me,O);if(r.executing&&n===false){if(I||N&&r.queue.length>0){return}if(S){r.queue.length=0}r.queue.push(e);return}O.execCount++;r.executing=true;e.meta.onHalt=function(){r.executing=false;var e=r.queue.shift();if(e){setTimeout((function(){O.execute(e)}),1)}};e.meta.reject=function(r){console.error(r.message?r.message:r);var n=t.getHyperTrace(e,r);if(n){n.print()}t.triggerEvent(e.me,"exception",{error:r})};C.execute(e)},install:function(e,r){for(const r of O.events){var n;if(r.elsewhere){n=[document]}else if(r.from){n=r.from.evaluate(t.makeContext(e,O,e,null))}else{n=[e]}t.implicitLoop(n,(function(n){var i=r.on;if(n==null){console.warn("'%s' feature ignored because target does not exists:",a,e);return}if(r.mutationSpec){i="hyperscript:mutation";const e=new MutationObserver((function(e,r){if(!O.executing){t.triggerEvent(n,i,{mutationList:e,observer:r})}}));e.observe(n,r.mutationSpec)}if(r.intersectionSpec){i="hyperscript:intersection";const e=new IntersectionObserver((function(r){for(const o of r){var a={observer:e};a=Object.assign(a,o);a["intersecting"]=o.isIntersecting;t.triggerEvent(n,i,a)}}),r.intersectionSpec);e.observe(n)}var o=n.addEventListener||n.on;o.call(n,i,(function a(o){if(typeof Node!=="undefined"&&e instanceof Node&&n!==e&&!e.isConnected){n.removeEventListener(i,a);return}var s=t.makeContext(e,O,e,o);if(r.elsewhere&&e.contains(o.target)){return}if(r.from){s.result=n}for(const e of r.args){let t=s.event[e.value];if(t!==undefined){s.locals[e.value]=t}else if("detail"in s.event){s.locals[e.value]=s.event["detail"][e.value]}}s.meta.errorHandler=A;s.meta.errorSymbol=R;s.meta.finallyHandler=L;if(r.filter){var u=s.meta.context;s.meta.context=s.event;try{var l=r.filter.evaluate(s);if(l){}else{return}}finally{s.meta.context=u}}if(r.inExpr){var c=o.target;while(true){if(c.matches&&c.matches(r.inExpr.css)){s.result=c;break}else{c=c.parentElement;if(c==null){return}}}}r.execCount++;if(r.startCount){if(r.endCount){if(r.execCountr.endCount){return}}else if(r.unbounded){if(r.execCount{var a=false;for(const s of i){var o=n=>{e.result=n;if(s.args){for(const t of s.args){e.locals[t.value]=n[t.value]||(n.detail?n.detail[t.value]:null)}}if(!a){a=true;r(t.findNext(this,e))}};if(s.name){n.addEventListener(s.name,o,{once:true})}else if(s.time!=null){setTimeout(o,s.time,s.time)}}}))}};return n}else{var s;if(r.matchToken("a")){r.requireToken("tick");s=0}else{s=e.requireElement("expression",r)}n={type:"waitCmd",time:s,args:[s],op:function(e,r){return new Promise((n=>{setTimeout((()=>{n(t.findNext(this,e))}),r)}))},execute:function(e){return t.unifiedExec(this,e)}};return n}}));t.addGrammarElement("dotOrColonPath",(function(e,t,r){var n=r.matchTokenType("IDENTIFIER");if(n){var i=[n.value];var a=r.matchOpToken(".")||r.matchOpToken(":");if(a){do{i.push(r.requireTokenType("IDENTIFIER","NUMBER").value)}while(r.matchOpToken(a.value))}return{type:"dotOrColonPath",path:i,evaluate:function(){return i.join(a?a.value:"")}}}}));t.addGrammarElement("eventName",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{evaluate:function(){return n.value}}}return e.parseElement("dotOrColonPath",r)}));function d(e,t,r,n){var i=t.requireElement("eventName",n);var a=t.parseElement("namedArgumentList",n);if(e==="send"&&n.matchToken("to")||e==="trigger"&&n.matchToken("on")){var o=t.requireElement("expression",n)}else{var o=t.requireElement("implicitMeTarget",n)}var s={eventName:i,details:a,to:o,args:[o,i,a],op:function(e,t,n,i){r.nullCheck(t,o);r.implicitLoop(t,(function(t){r.triggerEvent(t,n,i,e.me)}));return r.findNext(s,e)}};return s}t.addCommand("trigger",(function(e,t,r){if(r.matchToken("trigger")){return d("trigger",e,t,r)}}));t.addCommand("send",(function(e,t,r){if(r.matchToken("send")){return d("send",e,t,r)}}));var T=function(e,t,r,n){if(n){if(e.commandBoundary(r.currentToken())){e.raiseParseError(r,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.")}else{var i=e.requireElement("expression",r)}}var a={value:i,args:[i],op:function(e,r){var n=e.meta.resolve;e.meta.returned=true;e.meta.returnValue=r;if(n){if(r){n(r)}else{n()}}return t.HALT}};return a};t.addCommand("return",(function(e,t,r){if(r.matchToken("return")){return T(e,t,r,true)}}));t.addCommand("exit",(function(e,t,r){if(r.matchToken("exit")){return T(e,t,r,false)}}));t.addCommand("halt",(function(e,t,r){if(r.matchToken("halt")){if(r.matchToken("the")){r.requireToken("event");if(r.matchOpToken("'")){r.requireToken("s")}var n=true}if(r.matchToken("bubbling")){var i=true}else if(r.matchToken("default")){var a=true}var o=T(e,t,r,false);var s={keepExecuting:true,bubbling:i,haltDefault:a,exit:o,op:function(e){if(e.event){if(i){e.event.stopPropagation()}else if(a){e.event.preventDefault()}else{e.event.stopPropagation();e.event.preventDefault()}if(n){return t.findNext(this,e)}else{return o}}}};return s}}));t.addCommand("log",(function(e,t,r){if(!r.matchToken("log"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}if(r.matchToken("with")){var i=e.requireElement("expression",r)}var a={exprs:n,withExpr:i,args:[i,n],op:function(e,r,n){if(r){r.apply(null,n)}else{console.log.apply(null,n)}return t.findNext(this,e)}};return a}));t.addCommand("beep!",(function(e,t,r){if(!r.matchToken("beep!"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}var i={exprs:n,args:[n],op:function(e,r){for(let i=0;i{if(!r.matchToken("pick"))return;r.matchToken("the");if(r.matchToken("item")||r.matchToken("items")||r.matchToken("character")||r.matchToken("characters")){const n=g(e,t,r);r.requireToken("from");const i=e.requireElement("expression",r);return{args:[i,n.from,n.to],op(e,r,i,a){if(n.toEnd)a=r.length;if(!n.includeStart)i++;if(n.includeEnd)a++;if(a==null||a==undefined)a=i+1;e.result=r.slice(i,a);return t.findNext(this,e)}}}if(r.matchToken("match")){r.matchToken("of");const n=e.parseElement("expression",r);let i="";if(r.matchOpToken("|")){i=r.requireToken("identifier").value}r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new RegExp(n,i).exec(r);return t.findNext(this,e)}}}if(r.matchToken("matches")){r.matchToken("of");const n=e.parseElement("expression",r);let i="gu";if(r.matchOpToken("|")){i="g"+r.requireToken("identifier").value.replace("g","")}console.log("flags",i);r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new w(n,i,r);return t.findNext(this,e)}}}}));t.addCommand("increment",(function(e,t,r){if(!r.matchToken("increment"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitIncrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t+r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));t.addCommand("decrement",(function(e,t,r){if(!r.matchToken("decrement"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitDecrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t-r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));function S(e,t){var r="text";var n;e.matchToken("a")||e.matchToken("an");if(e.matchToken("json")||e.matchToken("Object")){r="json"}else if(e.matchToken("response")){r="response"}else if(e.matchToken("html")){r="html"}else if(e.matchToken("text")){}else{n=t.requireElement("dotOrColonPath",e).evaluate()}return{type:r,conversion:n}}t.addCommand("fetch",(function(e,t,r){if(!r.matchToken("fetch"))return;var n=e.requireElement("stringLike",r);if(r.matchToken("as")){var i=S(r,e)}if(r.matchToken("with")&&r.currentToken().value!=="{"){var a=e.parseElement("nakedNamedArgumentList",r)}else{var a=e.parseElement("objectLiteral",r)}if(i==null&&r.matchToken("as")){i=S(r,e)}var o=i?i.type:"text";var s=i?i.conversion:null;var u={url:n,argExpressions:a,args:[n,a],op:function(e,r,n){var i=n||{};i["sender"]=e.me;i["headers"]=i["headers"]||{};var a=new AbortController;let l=e.me.addEventListener("fetch:abort",(function(){a.abort()}),{once:true});i["signal"]=a.signal;t.triggerEvent(e.me,"hyperscript:beforeFetch",i);t.triggerEvent(e.me,"fetch:beforeRequest",i);n=i;var c=false;if(n.timeout){setTimeout((function(){if(!c){a.abort()}}),n.timeout)}return fetch(r,n).then((function(r){let n={response:r};t.triggerEvent(e.me,"fetch:afterResponse",n);r=n.response;if(o==="response"){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}if(o==="json"){return r.json().then((function(r){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))}return r.text().then((function(r){if(s)r=t.convertValue(r,s);if(o==="html")r=t.convertValue(r,"Fragment");e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))})).catch((function(r){t.triggerEvent(e.me,"fetch:error",{reason:r});throw r})).finally((function(){e.me.removeEventListener("fetch:abort",l)}))}};return u}))}function y(e){e.addCommand("settle",(function(e,t,r){if(r.matchToken("settle")){if(!e.commandBoundary(r.currentToken())){var n=e.requireElement("expression",r)}else{var n=e.requireElement("implicitMeTarget",r)}var i={type:"settleCmd",args:[n],op:function(e,r){t.nullCheck(r,n);var a=null;var o=false;var s=false;var u=new Promise((function(e){a=e}));r.addEventListener("transitionstart",(function(){s=true}),{once:true});setTimeout((function(){if(!s&&!o){a(t.findNext(i,e))}}),500);r.addEventListener("transitionend",(function(){if(!o){a(t.findNext(i,e))}}),{once:true});return u},execute:function(e){return t.unifiedExec(this,e)}};return i}}));e.addCommand("add",(function(e,t,r){if(r.matchToken("add")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("styleLiteral",r);if(a==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("to")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}if(r.matchToken("when")){if(a){e.raiseParseError(r,"Only class and properties are supported with a when clause")}var u=e.requireElement("expression",r)}if(o){return{classRefs:o,to:s,args:[s,o],op:function(e,r,n){t.nullCheck(r,s);t.forEach(n,(function(n){t.implicitLoop(r,(function(r){if(u){e.result=r;let i=t.evaluateNoPromise(u,e);if(i){if(r instanceof Element)r.classList.add(n.className)}else{if(r instanceof Element)r.classList.remove(n.className)}e.result=null}else{if(r instanceof Element)r.classList.add(n.className)}}))}));return t.findNext(this,e)}}}else if(i){return{type:"addCmd",attributeRef:i,to:s,args:[s],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(r){if(u){e.result=r;let n=t.evaluateNoPromise(u,e);if(n){r.setAttribute(i.name,i.value)}else{r.removeAttribute(i.name)}e.result=null}else{r.setAttribute(i.name,i.value)}}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}else{return{type:"addCmd",cssDeclaration:a,to:s,args:[s,a],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(e){e.style.cssText+=n}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}}}));e.addGrammarElement("styleLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[""];var i=[];while(r.hasMore()){if(r.matchOpToken("\\")){r.consumeToken()}else if(r.matchOpToken("}")){break}else if(r.matchToken("$")){var a=r.matchOpToken("{");var o=e.parseElement("expression",r);if(a)r.requireOpToken("}");i.push(o);n.push("")}else{var s=r.consumeToken();n[n.length-1]+=r.source.substring(s.start,s.end)}n[n.length-1]+=r.lastWhitespace()}return{type:"styleLiteral",args:[i],op:function(e,t){var r="";n.forEach((function(e,n){r+=e;if(n in t)r+=t[n]}));return r},evaluate:function(e){return t.unifiedEval(this,e)}}}));e.addCommand("remove",(function(e,t,r){if(r.matchToken("remove")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("expression",r);if(a==null){e.raiseParseError(r,"Expected either a class reference, attribute expression or value expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("from")){var s=e.requireElement("expression",r)}else{if(a==null){var s=e.requireElement("implicitMeTarget",r)}}if(a){return{elementExpr:a,from:s,args:[a,s],op:function(e,r,n){t.nullCheck(r,a);t.implicitLoop(r,(function(e){if(e.parentElement&&(n==null||n.contains(e))){e.parentElement.removeChild(e)}}));return t.findNext(this,e)}}}else{return{classRefs:o,attributeRef:i,elementExpr:a,from:s,args:[o,s],op:function(e,r,n){t.nullCheck(n,s);if(r){t.forEach(r,(function(e){t.implicitLoop(n,(function(t){t.classList.remove(e.className)}))}))}else{t.implicitLoop(n,(function(e){e.removeAttribute(i.name)}))}return t.findNext(this,e)}}}}}));e.addCommand("toggle",(function(e,t,r){if(r.matchToken("toggle")){r.matchAnyToken("the","my");if(r.currentToken().type==="STYLE_REF"){let t=r.consumeToken();var n=t.value.substr(1);var a=true;var o=i(e,r,n);if(r.matchToken("of")){r.pushFollow("with");try{var s=e.requireElement("expression",r)}finally{r.popFollow()}}else{var s=e.requireElement("implicitMeTarget",r)}}else if(r.matchToken("between")){var u=true;var l=e.parseElement("classRef",r);r.requireToken("and");var c=e.requireElement("classRef",r)}else{var l=e.parseElement("classRef",r);var f=null;if(l==null){f=e.parseElement("attributeRef",r);if(f==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}else{var m=[l];while(l=e.parseElement("classRef",r)){m.push(l)}}}if(a!==true){if(r.matchToken("on")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}}if(r.matchToken("for")){var p=e.requireElement("expression",r)}else if(r.matchToken("until")){var h=e.requireElement("dotOrColonPath",r,"Expected event name");if(r.matchToken("from")){var v=e.requireElement("expression",r)}}var d={classRef:l,classRef2:c,classRefs:m,attributeRef:f,on:s,time:p,evt:h,from:v,toggle:function(e,r,n,i){t.nullCheck(e,s);if(a){t.implicitLoop(e,(function(e){o("toggle",e)}))}else if(u){t.implicitLoop(e,(function(e){if(e.classList.contains(r.className)){e.classList.remove(r.className);e.classList.add(n.className)}else{e.classList.add(r.className);e.classList.remove(n.className)}}))}else if(i){t.forEach(i,(function(r){t.implicitLoop(e,(function(e){e.classList.toggle(r.className)}))}))}else{t.forEach(e,(function(e){if(e.hasAttribute(f.name)){e.removeAttribute(f.name)}else{e.setAttribute(f.name,f.value)}}))}},args:[s,p,h,v,l,c,m],op:function(e,r,n,i,a,o,s,u){if(n){return new Promise((function(i){d.toggle(r,o,s,u);setTimeout((function(){d.toggle(r,o,s,u);i(t.findNext(d,e))}),n)}))}else if(i){return new Promise((function(n){var l=a||e.me;l.addEventListener(i,(function(){d.toggle(r,o,s,u);n(t.findNext(d,e))}),{once:true});d.toggle(r,o,s,u)}))}else{this.toggle(r,o,s,u);return t.findNext(d,e)}}};return d}}));var t={display:function(r,n,i){if(i){n.style.display=i}else if(r==="toggle"){if(getComputedStyle(n).display==="none"){t.display("show",n,i)}else{t.display("hide",n,i)}}else if(r==="hide"){const t=e.runtime.getInternalData(n);if(t.originalDisplay==null){t.originalDisplay=n.style.display}n.style.display="none"}else{const t=e.runtime.getInternalData(n);if(t.originalDisplay&&t.originalDisplay!=="none"){n.style.display=t.originalDisplay}else{n.style.removeProperty("display")}}},visibility:function(e,r,n){if(n){r.style.visibility=n}else if(e==="toggle"){if(getComputedStyle(r).visibility==="hidden"){t.visibility("show",r,n)}else{t.visibility("hide",r,n)}}else if(e==="hide"){r.style.visibility="hidden"}else{r.style.visibility="visible"}},opacity:function(e,r,n){if(n){r.style.opacity=n}else if(e==="toggle"){if(getComputedStyle(r).opacity==="0"){t.opacity("show",r,n)}else{t.opacity("hide",r,n)}}else if(e==="hide"){r.style.opacity="0"}else{r.style.opacity="1"}}};var n=function(e,t,r){var n;var i=r.currentToken();if(i.value==="when"||i.value==="with"||e.commandBoundary(i)){n=e.parseElement("implicitMeTarget",r)}else{n=e.parseElement("expression",r)}return n};var i=function(e,n,i){var a=r.defaultHideShowStrategy;var o=t;if(r.hideShowStrategies){o=Object.assign(o,r.hideShowStrategies)}i=i||a||"display";var s=o[i];if(s==null){e.raiseParseError(n,"Unknown show/hide strategy : "+i)}return s};e.addCommand("hide",(function(e,t,r){if(r.matchToken("hide")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=i(e,r,o);return{target:a,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(e){s("hide",e)}));return t.findNext(this,e)}}}}));e.addCommand("show",(function(e,t,r){if(r.matchToken("show")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=null;if(r.matchOpToken(":")){var u=r.consumeUntilWhitespace();r.matchTokenType("WHITESPACE");s=u.map((function(e){return e.value})).join("")}if(r.matchToken("when")){var l=e.requireElement("expression",r)}var c=i(e,r,o);return{target:a,when:l,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(r){if(l){e.result=r;let n=t.evaluateNoPromise(l,e);if(n){c("show",r,s)}else{c("hide",r)}e.result=null}else{c("show",r,s)}}));return t.findNext(this,e)}}}}));e.addCommand("take",(function(e,t,r){if(r.matchToken("take")){let u=null;let l=[];while(u=e.parseElement("classRef",r)){l.push(u)}var n=null;var i=null;let c=l.length>0;if(!c){n=e.parseElement("attributeRef",r);if(n==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}if(r.matchToken("with")){i=e.requireElement("expression",r)}}if(r.matchToken("from")){var a=e.requireElement("expression",r)}if(r.matchToken("for")){var o=e.requireElement("expression",r)}else{var o=e.requireElement("implicitMeTarget",r)}if(c){var s={classRefs:l,from:a,forElt:o,args:[l,a,o],op:function(e,r,n,i){t.nullCheck(i,o);t.implicitLoop(r,(function(e){var r=e.className;if(n){t.implicitLoop(n,(function(e){e.classList.remove(r)}))}else{t.implicitLoop(e,(function(e){e.classList.remove(r)}))}t.implicitLoop(i,(function(e){e.classList.add(r)}))}));return t.findNext(this,e)}};return s}else{var s={attributeRef:n,from:a,forElt:o,args:[a,o,i],op:function(e,r,i,s){t.nullCheck(r,a);t.nullCheck(i,o);t.implicitLoop(r,(function(e){if(!s){e.removeAttribute(n.name)}else{e.setAttribute(n.name,s)}}));t.implicitLoop(i,(function(e){e.setAttribute(n.name,n.value||"")}));return t.findNext(this,e)}};return s}}}));function a(t,r,n,i){if(n!=null){var a=t.resolveSymbol(n,r)}else{var a=r}if(a instanceof Element||a instanceof HTMLDocument){while(a.firstChild)a.removeChild(a.firstChild);a.append(e.runtime.convertValue(i,"Fragment"));t.processNode(a)}else{if(n!=null){t.setSymbol(n,r,null,i)}else{throw"Don't know how to put a value into "+typeof r}}}e.addCommand("put",(function(e,t,r){if(r.matchToken("put")){var n=e.requireElement("expression",r);var i=r.matchAnyToken("into","before","after");if(i==null&&r.matchToken("at")){r.matchToken("the");i=r.matchAnyToken("start","end");r.requireToken("of")}if(i==null){e.raiseParseError(r,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'")}var o=e.requireElement("expression",r);var s=i.value;var u=false;var l=false;var c=null;var f=null;if(o.type==="arrayIndex"&&s==="into"){u=true;f=o.prop;c=o.root}else if(o.prop&&o.root&&s==="into"){f=o.prop.value;c=o.root}else if(o.type==="symbol"&&s==="into"){l=true;f=o.name}else if(o.type==="attributeRef"&&s==="into"){var m=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.type==="styleRef"&&s==="into"){var p=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.attribute&&s==="into"){var m=o.attribute.type==="attributeRef";var p=o.attribute.type==="styleRef";f=o.attribute.name;c=o.root}else{c=o}var h={target:o,operation:s,symbolWrite:l,value:n,args:[c,f,n],op:function(e,r,n,i){if(l){a(t,e,n,i)}else{t.nullCheck(r,c);if(s==="into"){if(m){t.implicitLoop(r,(function(e){e.setAttribute(n,i)}))}else if(p){t.implicitLoop(r,(function(e){e.style[n]=i}))}else if(u){r[n]=i}else{t.implicitLoop(r,(function(e){a(t,e,n,i)}))}}else{var o=s==="before"?Element.prototype.before:s==="after"?Element.prototype.after:s==="start"?Element.prototype.prepend:s==="end"?Element.prototype.append:Element.prototype.append;t.implicitLoop(r,(function(e){o.call(e,i instanceof Node?i:t.convertValue(i,"Fragment"));if(e.parentElement){t.processNode(e.parentElement)}else{t.processNode(e)}}))}}return t.findNext(this,e)}};return h}}));function o(e,t,r){var n;if(r.matchToken("the")||r.matchToken("element")||r.matchToken("elements")||r.currentToken().type==="CLASS_REF"||r.currentToken().type==="ID_REF"||r.currentToken().op&&r.currentToken().value==="<"){e.possessivesDisabled=true;try{n=e.parseElement("expression",r)}finally{delete e.possessivesDisabled}if(r.matchOpToken("'")){r.requireToken("s")}}else if(r.currentToken().type==="IDENTIFIER"&&r.currentToken().value==="its"){var i=r.matchToken("its");n={type:"pseudopossessiveIts",token:i,name:i.value,evaluate:function(e){return t.resolveSymbol("it",e)}}}else{r.matchToken("my")||r.matchToken("me");n=e.parseElement("implicitMeTarget",r)}return n}e.addCommand("transition",(function(e,t,n){if(n.matchToken("transition")){var i=o(e,t,n);var a=[];var s=[];var u=[];var l=n.currentToken();while(!e.commandBoundary(l)&&l.value!=="over"&&l.value!=="using"){if(n.currentToken().type==="STYLE_REF"){let e=n.consumeToken();let t=e.value.substr(1);a.push({type:"styleRefValue",evaluate:function(){return t}})}else{a.push(e.requireElement("stringLike",n))}if(n.matchToken("from")){s.push(e.requireElement("expression",n))}else{s.push(null)}n.requireToken("to");if(n.matchToken("initial")){u.push({type:"initial_literal",evaluate:function(){return"initial"}})}else{u.push(e.requireElement("expression",n))}l=n.currentToken()}if(n.matchToken("over")){var c=e.requireElement("expression",n)}else if(n.matchToken("using")){var f=e.requireElement("expression",n)}var m={to:u,args:[i,a,s,u,f,c],op:function(e,n,a,o,s,u,l){t.nullCheck(n,i);var c=[];t.implicitLoop(n,(function(e){var n=new Promise((function(n,i){var c=e.style.transition;if(l){e.style.transition="all "+l+"ms ease-in"}else if(u){e.style.transition=u}else{e.style.transition=r.defaultTransition}var f=t.getInternalData(e);var m=getComputedStyle(e);var p={};for(var h=0;he.forEach((e=>S(e))))).then((()=>n((function(){a();k.processNode(document.documentElement);e.document.addEventListener("htmx:load",(function(e){k.processNode(e.detail.elt)}))}))));function n(e){if(document.readyState!=="loading"){setTimeout(e)}else{document.addEventListener("DOMContentLoaded",e)}}function i(){var e=document.querySelector('meta[name="htmx-config"]');if(e){return v(e.content)}else{return null}}function a(){var e=i();if(e){Object.assign(r,e)}}}const S=Object.assign(b,{config:r,use(e){e(S)},internals:{lexer:x,parser:g,runtime:k,Lexer:n,Tokens:i,Parser:a,Runtime:o},ElementCollection:m,addFeature:g.addFeature.bind(g),addCommand:g.addCommand.bind(g),addLeafExpression:g.addLeafExpression.bind(g),addIndirectExpression:g.addIndirectExpression.bind(g),evaluate:k.evaluate.bind(k),parse:k.parse.bind(k),processNode:k.processNode.bind(k),version:"0.9.12",browserInit:w});return S})); +(function(e,t){const r=t(e);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=r}else{e["_hyperscript"]=r;if("document"in e)e["_hyperscript"].browserInit()}})(typeof self!=="undefined"?self:this,(e=>{"use strict";const t={dynamicResolvers:[function(e,t){if(e==="Fixed"){return Number(t).toFixed()}else if(e.indexOf("Fixed:")===0){let r=e.split(":")[1];return Number(t).toFixed(parseInt(r))}}],String:function(e){if(e.toString){return e.toString()}else{return""+e}},Int:function(e){return parseInt(e)},Float:function(e){return parseFloat(e)},Number:function(e){return Number(e)},Date:function(e){return new Date(e)},Array:function(e){return Array.from(e)},JSON:function(e){return JSON.stringify(e)},Object:function(e){if(e instanceof String){e=e.toString()}if(typeof e==="string"){return JSON.parse(e)}else{return Object.assign({},e)}}};const r={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:t};class n{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS"};static isValidCSSClassChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isValidCSSIDChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isWhitespace(e){return e===" "||e==="\t"||n.isNewline(e)}static positionString(e){return"[Line: "+e.line+", Column: "+e.column+"]"}static isNewline(e){return e==="\r"||e==="\n"}static isNumeric(e){return e>="0"&&e<="9"}static isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}static isIdentifierChar(e,t){return e==="_"||e==="$"}static isReservedChar(e){return e==="`"||e==="^"}static isValidSingleQuoteStringStart(e){if(e.length>0){var t=e[e.length-1];if(t.type==="IDENTIFIER"||t.type==="CLASS_REF"||t.type==="ID_REF"){return false}if(t.op&&(t.value===">"||t.value===")")){return false}}return true}static tokenize(e,t){var r=[];var a=e;var o=0;var s=0;var u=1;var l="";var c=0;function f(){return t&&c===0}while(o=0){return this.consumeToken()}}requireToken(e,t){var r=this.matchToken(e,t);if(r){return r}else{this.raiseError(this,"Expected '"+e+"' but found '"+this.currentToken().value+"'")}}peekToken(e,t,r){t=t||0;r=r||"IDENTIFIER";if(this.tokens[t]&&this.tokens[t].value===e&&this.tokens[t].type===r){return this.tokens[t]}}matchToken(e,t){if(this.follows.indexOf(e)!==-1){return}t=t||"IDENTIFIER";if(this.currentToken()&&this.currentToken().value===e&&this.currentToken().type===t){return this.consumeToken()}}consumeToken(){var e=this.tokens.shift();this.consumed.push(e);this._lastConsumed=e;this.consumeWhitespace();return e}consumeUntil(e,t){var r=[];var n=this.token(0,true);while((t==null||n.type!==t)&&(e==null||n.value!==e)&&n.type!=="EOF"){var i=this.tokens.shift();this.consumed.push(i);r.push(n);n=this.token(0,true)}this.consumeWhitespace();return r}lastWhitespace(){if(this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"){return this.consumed[this.consumed.length-1].value}else{return""}}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(e,t){var r;var n=0;do{if(!t){while(this.tokens[n]&&this.tokens[n].type==="WHITESPACE"){n++}}r=this.tokens[n];e--;n++}while(e>-1);if(r){return r}else{return{type:"EOF",value:"<<>>"}}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split("\n")[this.startToken.line-1]};follows=[];pushFollow(e){this.follows.push(e)}popFollow(){this.follows.pop()}clearFollows(){var e=this.follows;this.follows=[];return e}restoreFollows(e){this.follows=e}}class a{constructor(e){this.runtime=e;this.possessivesDisabled=false;this.addGrammarElement("feature",(function(e,t,r){if(r.matchOpToken("(")){var n=e.requireElement("feature",r);r.requireOpToken(")");return n}var i=e.FEATURES[r.currentToken().value||""];if(i){return i(e,t,r)}}));this.addGrammarElement("command",(function(e,t,r){if(r.matchOpToken("(")){const t=e.requireElement("command",r);r.requireOpToken(")");return t}var n=e.COMMANDS[r.currentToken().value||""];let i;if(n){i=n(e,t,r)}else if(r.currentToken().type==="IDENTIFIER"){i=e.parseElement("pseudoCommand",r)}if(i){return e.parseElement("indirectStatement",r,i)}return i}));this.addGrammarElement("commandList",(function(e,t,r){if(r.hasMore()){var n=e.parseElement("command",r);if(n){r.matchToken("then");const t=e.parseElement("commandList",r);if(t)n.next=t;return n}}return{type:"emptyCommandListCommand",op:function(e){return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}));this.addGrammarElement("leaf",(function(e,t,r){var n=e.parseAnyOf(e.LEAF_EXPRESSIONS,r);if(n==null){return e.parseElement("symbol",r)}return n}));this.addGrammarElement("indirectExpression",(function(e,t,r,n){for(var i=0;i{this.unifiedExec(e,t)})).catch((e=>{this.unifiedExec({op:function(){throw e}},t)}));return}else if(r===o.HALT){if(t.meta.finallyHandler&&!t.meta.handlingFinally){t.meta.handlingFinally=true;e=t.meta.finallyHandler}else{if(t.meta.onHalt){t.meta.onHalt()}if(t.meta.currentException){if(t.meta.reject){t.meta.reject(t.meta.currentException);return}else{throw t.meta.currentException}}else{return}}}else{e=r}}}unifiedEval(e,t){var r=[t];var n=false;var i=false;if(e.args){for(var a=0;a{r=this.wrapArrays(r);Promise.all(r).then((function(r){if(i){this.unwrapAsyncs(r)}try{var a=e.op.apply(e,r);t(a)}catch(e){n(e)}})).catch((function(e){n(e)}))}))}else{if(i){this.unwrapAsyncs(r)}return e.op.apply(e,r)}}_scriptAttrs=null;getScriptAttributes(){if(this._scriptAttrs==null){this._scriptAttrs=r.attributes.replace(/ /g,"").split(",")}return this._scriptAttrs}getScript(e){for(var t=0;t{this.initElement(e,e instanceof HTMLScriptElement&&e.type==="text/hyperscript"?document.body:e)}))}}initElement(e,t){if(e.closest&&e.closest(r.disableSelector)){return}var n=this.getInternalData(e);if(!n.initialized){var i=this.getScript(e);if(i){try{n.initialized=true;n.script=i;const r=this.lexer,s=this.parser;var a=r.tokenize(i);var o=s.parseHyperScript(a);if(!o)return;o.apply(t||e,e);setTimeout((()=>{this.triggerEvent(t||e,"load",{hyperscript:true})}),1)}catch(t){this.triggerEvent(e,"exception",{error:t});console.error("hyperscript errors were found on the following element:",e,"\n\n",t.message,t.stack)}}}}internalDataMap=new WeakMap;getInternalData(e){var t=this.internalDataMap.get(e);if(typeof t==="undefined"){this.internalDataMap.set(e,t={})}return t}typeCheck(e,t,r){if(e==null&&r){return true}var n=Object.prototype.toString.call(e).slice(8,-1);return n===t}getElementScope(e){var t=e.meta&&e.meta.owner;if(t){var r=this.getInternalData(t);var n="elementScope";if(e.meta.feature&&e.meta.feature.behavior){n=e.meta.feature.behavior+"Scope"}var i=h(r,n);return i}else{return{}}}isReservedWord(e){return["meta","it","result","locals","event","target","detail","sender","body"].includes(e)}isHyperscriptContext(e){return e instanceof f}resolveSymbol(t,r,n){if(t==="me"||t==="my"||t==="I"){return r.me}if(t==="it"||t==="its"||t==="result"){return r.result}if(t==="you"||t==="your"||t==="yourself"){return r.you}else{if(n==="global"){return e[t]}else if(n==="element"){var i=this.getElementScope(r);return i[t]}else if(n==="local"){return r.locals[t]}else{if(r.meta&&r.meta.context){var a=r.meta.context[t];if(typeof a!=="undefined"){return a}if(r.meta.context.detail){a=r.meta.context.detail[t];if(typeof a!=="undefined"){return a}}}if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){var o=r.locals[t]}else{var o=r[t]}if(typeof o!=="undefined"){return o}else{var i=this.getElementScope(r);o=i[t];if(typeof o!=="undefined"){return o}else{return e[t]}}}}}setSymbol(t,r,n,i){if(n==="global"){e[t]=i}else if(n==="element"){var a=this.getElementScope(r);a[t]=i}else if(n==="local"){r.locals[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)&&typeof r.locals[t]!=="undefined"){r.locals[t]=i}else{var a=this.getElementScope(r);var o=a[t];if(typeof o!=="undefined"){a[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){r.locals[t]=i}else{r[t]=i}}}}}findNext(e,t){if(e){if(e.resolveNext){return e.resolveNext(t)}else if(e.next){return e.next}else{return this.findNext(e.parent,t)}}}flatGet(e,t,r){if(e!=null){var n=r(e,t);if(typeof n!=="undefined"){return n}if(this.shouldAutoIterate(e)){var i=[];for(var a of e){var o=r(a,t);i.push(o)}return i}}}resolveProperty(e,t){return this.flatGet(e,t,((e,t)=>e[t]))}resolveAttribute(e,t){return this.flatGet(e,t,((e,t)=>e.getAttribute&&e.getAttribute(t)))}resolveStyle(e,t){return this.flatGet(e,t,((e,t)=>e.style&&e.style[t]))}resolveComputedStyle(e,t){return this.flatGet(e,t,((e,t)=>getComputedStyle(e).getPropertyValue(t)))}assignToNamespace(t,r,n,i){let a;if(typeof document!=="undefined"&&t===document.body){a=e}else{a=this.getHyperscriptFeatures(t)}var o;while((o=r.shift())!==undefined){var s=a[o];if(s==null){s={};a[o]=s}a=s}a[n]=i}getHyperTrace(e,t){var r=[];var n=e;while(n.meta.caller){n=n.meta.caller}if(n.meta.traceMap){return n.meta.traceMap.get(t,r)}}registerHyperTrace(e,t){var r=[];var n=null;while(e!=null){r.push(e);n=e;e=e.meta.caller}if(n.meta.traceMap==null){n.meta.traceMap=new Map}if(!n.meta.traceMap.get(t)){var i={trace:r,print:function(e){e=e||console.error;e("hypertrace /// ");var t=0;for(var n=0;n",i.meta.feature.displayName.padEnd(t+2),"-",i.meta.owner)}}};n.meta.traceMap.set(t,i)}}escapeSelector(e){return e.replace(/:/g,(function(e){return"\\"+e}))}nullCheck(e,t){if(e==null){throw new Error("'"+t.sourceFor()+"' is null")}}isEmpty(e){return e==undefined||e.length===0}doesExist(e){if(e==null){return false}if(this.shouldAutoIterate(e)){for(const t of e){return true}return false}return true}getRootNode(e){if(e&&e instanceof Node){var t=e.getRootNode();if(t instanceof Document||t instanceof ShadowRoot)return t}return document}getEventQueueFor(e,t){let r=this.getInternalData(e);var n=r.eventQueues;if(n==null){n=new Map;r.eventQueues=n}var i=n.get(t);if(i==null){i={queue:[],executing:false};n.set(t,i)}return i}beepValueToConsole(e,t,r){if(this.triggerEvent(e,"hyperscript:beep",{element:e,expression:t,value:r})){var n;if(r){if(r instanceof m){n="ElementCollection"}else if(r.constructor){n=r.constructor.name}else{n="unknown"}}else{n="object (null)"}var a=r;if(n==="String"){a='"'+a+'"'}else if(r instanceof m){a=Array.from(r)}console.log("///_ BEEP! The expression ("+i.sourceFor.call(t).replace("beep! ","")+") evaluates to:",a,"of type "+n)}}hyperscriptUrl="document"in e&&document.currentScript?document.currentScript.src:null}function s(){let e=document.cookie.split("; ").map((e=>{let t=e.split("=");return{name:t[0],value:decodeURIComponent(t[1])}}));return e}function u(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function l(){for(const e of s()){u(e.name)}}const c=new Proxy({},{get(e,t){if(t==="then"||t==="asyncWrapper"){return null}else if(t==="length"){return s().length}else if(t==="clear"){return u}else if(t==="clearAll"){return l}else if(typeof t==="string"){if(!isNaN(t)){return s()[parseInt(t)]}else{let e=document.cookie.split("; ").find((e=>e.startsWith(t+"=")))?.split("=")[1];if(e){return decodeURIComponent(e)}}}else if(t===Symbol.iterator){return s()[t]}},set(e,t,r){var n=null;if("string"===typeof r){n=encodeURIComponent(r);n+=";samesite=lax"}else{n=encodeURIComponent(r.value);if(r.expires){n+=";expires="+r.maxAge}if(r.maxAge){n+=";max-age="+r.maxAge}if(r.partitioned){n+=";partitioned="+r.partitioned}if(r.path){n+=";path="+r.path}if(r.samesite){n+=";samesite="+r.path}if(r.secure){n+=";secure="+r.path}}document.cookie=t+"="+n;return true}});class f{constructor(t,r,n,i,a){this.meta={parser:a.parser,lexer:a.lexer,runtime:a,owner:t,feature:r,iterators:{},ctx:this};this.locals={cookies:c};this.me=n,this.you=undefined;this.result=undefined;this.event=i;this.target=i?i.target:null;this.detail=i?i.detail:null;this.sender=i?i.detail?i.detail.sender:null:null;this.body="document"in e?document.body:null;a.addFeatures(t,this)}}class m{constructor(e,t,r){this._css=e;this.relativeToElement=t;this.escape=r;this[p]=true}get css(){if(this.escape){return o.prototype.escapeSelector(this._css)}else{return this._css}}get className(){return this._css.substr(1)}get id(){return this.className()}contains(e){for(let t of this){if(t.contains(e)){return true}}return false}get length(){return this.selectMatches().length}[Symbol.iterator](){let e=this.selectMatches();return e[Symbol.iterator]()}selectMatches(){let e=o.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css);return e}}const p=Symbol();function h(e,t){var r=e[t];if(r){return r}else{var n={};e[t]=n;return n}}function v(e){try{return JSON.parse(e)}catch(e){d(e);return null}}function d(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function E(e,t){return new(e.bind.apply(e,[e].concat(t)))}function T(t){t.addLeafExpression("parenthesized",(function(e,t,r){if(r.matchOpToken("(")){var n=r.clearFollows();try{var i=e.requireElement("expression",r)}finally{r.restoreFollows(n)}r.requireOpToken(")");return i}}));t.addLeafExpression("string",(function(e,t,r){var i=r.matchTokenType("STRING");if(!i)return;var a=i.value;var o;if(i.template){var s=n.tokenize(a,true);o=e.parseStringTemplate(s)}else{o=[]}return{type:"string",token:i,args:o,op:function(e){var t="";for(var r=1;re instanceof Element))}get css(){let e="",t=0;for(const r of this.templateParts){if(r instanceof Element){e+="[data-hs-query-id='"+t+++"']"}else e+=r}return e}[Symbol.iterator](){this.elements.forEach(((e,t)=>e.dataset.hsQueryId=t));const e=super[Symbol.iterator]();this.elements.forEach((e=>e.removeAttribute("data-hs-query-id")));return e}}t.addLeafExpression("queryRef",(function(e,t,i){var a=i.matchOpToken("<");if(!a)return;var o=i.consumeUntil("/");i.requireOpToken("/");i.requireOpToken(">");var s=o.map((function(e){if(e.type==="STRING"){return'"'+e.value+'"'}else{return e.value}})).join("");var u,l,c;if(s.indexOf("$")>=0){u=true;l=n.tokenize(s,true);c=e.parseStringTemplate(l)}return{type:"queryRef",css:s,args:c,op:function(e,...t){if(u){return new r(s,e.me,t)}else{return new m(s,e.me)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("attributeRef",(function(e,t,r){var n=r.matchTokenType("ATTRIBUTE_REF");if(!n)return;if(!n.value)return;var i=n.value;if(i.indexOf("[")===0){var a=i.substring(2,i.length-1)}else{var a=i.substring(1)}var o="["+a+"]";var s=a.split("=");var u=s[0];var l=s[1];if(l){if(l.indexOf('"')===0){l=l.substring(1,l.length-1)}}return{type:"attributeRef",name:u,css:o,value:l,op:function(e){var t=e.you||e.me;if(t){return t.getAttribute(u)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("styleRef",(function(e,t,r){var n=r.matchTokenType("STYLE_REF");if(!n)return;if(!n.value)return;var i=n.value.substr(1);if(i.startsWith("computed-")){i=i.substr("computed-".length);return{type:"computedStyleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveComputedStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}else{return{type:"styleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}}));t.addGrammarElement("objectKey",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{type:"objectKey",key:n.value,evaluate:function(){return n.value}}}else if(r.matchOpToken("[")){var i=e.parseElement("expression",r);r.requireOpToken("]");return{type:"objectKey",expr:i,args:[i],op:function(e,t){return t},evaluate:function(e){return t.unifiedEval(this,e)}}}else{var a="";do{n=r.matchTokenType("IDENTIFIER")||r.matchOpToken("-");if(n)a+=n.value}while(n);return{type:"objectKey",key:a,evaluate:function(){return a}}}}));t.addLeafExpression("objectLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[];var i=[];if(!r.matchOpToken("}")){do{var a=e.requireElement("objectKey",r);r.requireOpToken(":");var o=e.requireElement("expression",r);i.push(o);n.push(a)}while(r.matchOpToken(","));r.requireOpToken("}")}return{type:"objectLiteral",args:[n,i],op:function(e,t,r){var n={};for(var i=0;i");var a=e.requireElement("expression",r);return{type:"blockLiteral",args:n,expr:a,evaluate:function(e){var t=function(){for(var t=0;t=0;a--){var o=i[a];if(o.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}if(n){return i[i.length-1]}};var l=function(e,t,r,n){var i=[];o.prototype.forEach(t,(function(t){if(t.matches(r)||t===e){i.push(t)}}));for(var a=0;a","<=",">=","==","===","!=","!==");var a=i?i.value:null;var o=true;var s=false;if(a==null){if(r.matchToken("is")||r.matchToken("am")){if(r.matchToken("not")){if(r.matchToken("in")){a="not in"}else if(r.matchToken("a")){a="not a";s=true}else if(r.matchToken("empty")){a="not empty";o=false}else{if(r.matchToken("really")){a="!=="}else{a="!="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("in")){a="in"}else if(r.matchToken("a")){a="a";s=true}else if(r.matchToken("empty")){a="empty";o=false}else if(r.matchToken("less")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a="<="}else{a="<"}}else if(r.matchToken("greater")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a=">="}else{a=">"}}else{if(r.matchToken("really")){a="==="}else{a="=="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("equals")){a="=="}else if(r.matchToken("really")){r.requireToken("equals");a="==="}else if(r.matchToken("exist")||r.matchToken("exists")){a="exist";o=false}else if(r.matchToken("matches")||r.matchToken("match")){a="match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="contain"}else if(r.matchToken("includes")||r.matchToken("include")){a="include"}else if(r.matchToken("do")||r.matchToken("does")){r.requireToken("not");if(r.matchToken("matches")||r.matchToken("match")){a="not match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="not contain"}else if(r.matchToken("exist")||r.matchToken("exist")){a="not exist";o=false}else if(r.matchToken("include")){a="not include"}else{e.raiseParseError(r,"Expected matches or contains")}}}if(a){var u,l,c;if(s){u=r.requireTokenType("IDENTIFIER");l=!r.matchOpToken("!")}else if(o){c=e.requireElement("mathExpression",r);if(a==="match"||a==="not match"){c=c.css?c.css:c}}var m=n;n={type:"comparisonOperator",operator:a,typeName:u,nullOk:l,lhs:n,rhs:c,args:[n,c],op:function(e,r,n){if(a==="=="){return r==n}else if(a==="!="){return r!=n}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}if(a==="match"){return r!=null&&p(m,r,n)}if(a==="not match"){return r==null||!p(m,r,n)}if(a==="in"){return n!=null&&f(c,n,r)}if(a==="not in"){return n==null||!f(c,n,r)}if(a==="contain"){return r!=null&&f(m,r,n)}if(a==="not contain"){return r==null||!f(m,r,n)}if(a==="include"){return r!=null&&f(m,r,n)}if(a==="not include"){return r==null||!f(m,r,n)}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}else if(a==="<"){return r"){return r>n}else if(a==="<="){return r<=n}else if(a===">="){return r>=n}else if(a==="empty"){return t.isEmpty(r)}else if(a==="not empty"){return!t.isEmpty(r)}else if(a==="exist"){return t.doesExist(r)}else if(a==="not exist"){return!t.doesExist(r)}else if(a==="a"){return t.typeCheck(r,u.value,l)}else if(a==="not a"){return!t.typeCheck(r,u.value,l)}else{throw"Unknown comparison : "+a}},evaluate:function(e){return t.unifiedEval(this,e)}}}return n}));t.addGrammarElement("comparisonExpression",(function(e,t,r){return e.parseAnyOf(["comparisonOperator","mathExpression"],r)}));t.addGrammarElement("logicalOperator",(function(e,t,r){var n=e.parseElement("comparisonExpression",r);var i,a=null;i=r.matchToken("and")||r.matchToken("or");while(i){a=a||i;if(a.value!==i.value){e.raiseParseError(r,"You must parenthesize logical operations with different operators")}var o=e.requireElement("comparisonExpression",r);const s=i.value;n={type:"logicalOperator",operator:s,lhs:n,rhs:o,args:[n,o],op:function(e,t,r){if(s==="and"){return t&&r}else{return t||r}},evaluate:function(e){return t.unifiedEval(this,e)}};i=r.matchToken("and")||r.matchToken("or")}return n}));t.addGrammarElement("logicalExpression",(function(e,t,r){return e.parseAnyOf(["logicalOperator","mathExpression"],r)}));t.addGrammarElement("asyncExpression",(function(e,t,r){if(r.matchToken("async")){var n=e.requireElement("logicalExpression",r);var i={type:"asyncExpression",value:n,evaluate:function(e){return{asyncWrapper:true,value:this.value.evaluate(e)}}};return i}else{return e.parseElement("logicalExpression",r)}}));t.addGrammarElement("expression",(function(e,t,r){r.matchToken("the");return e.parseElement("asyncExpression",r)}));t.addGrammarElement("assignableExpression",(function(e,t,r){r.matchToken("the");var n=e.parseElement("primaryExpression",r);if(n&&(n.type==="symbol"||n.type==="ofExpression"||n.type==="propertyAccess"||n.type==="attributeRefAccess"||n.type==="attributeRef"||n.type==="styleRef"||n.type==="arrayIndex"||n.type==="possessive")){return n}else{e.raiseParseError(r,"A target expression must be writable. The expression type '"+(n&&n.type)+"' is not.")}return n}));t.addGrammarElement("hyperscript",(function(e,t,r){var n=[];if(r.hasMore()){while(e.featureStart(r.currentToken())||r.currentToken().value==="("){var i=e.requireElement("feature",r);n.push(i);r.matchToken("end")}}return{type:"hyperscript",features:n,apply:function(e,t,r){for(const i of n){i.install(e,t,r)}}}}));var v=function(e){var t=[];if(e.token(0).value==="("&&(e.token(1).value===")"||e.token(2).value===","||e.token(2).value===")")){e.matchOpToken("(");do{t.push(e.requireTokenType("IDENTIFIER"))}while(e.matchOpToken(","));e.requireOpToken(")")}return t};t.addFeature("on",(function(e,t,r){if(!r.matchToken("on"))return;var n=false;if(r.matchToken("every")){n=true}var i=[];var a=null;do{var o=e.requireElement("eventName",r,"Expected event name");var s=o.evaluate();if(a){a=a+" or "+s}else{a="on "+s}var u=v(r);var l=null;if(r.matchOpToken("[")){l=e.requireElement("expression",r);r.requireOpToken("]")}var c,f,m;if(r.currentToken().type==="NUMBER"){var p=r.consumeToken();if(!p.value)return;c=parseInt(p.value);if(r.matchToken("to")){var h=r.consumeToken();if(!h.value)return;f=parseInt(h.value)}else if(r.matchToken("and")){m=true;r.requireToken("on")}}var d,E;if(s==="intersection"){d={};if(r.matchToken("with")){d["with"]=e.requireElement("expression",r).evaluate()}if(r.matchToken("having")){do{if(r.matchToken("margin")){d["rootMargin"]=e.requireElement("stringLike",r).evaluate()}else if(r.matchToken("threshold")){d["threshold"]=e.requireElement("expression",r).evaluate()}else{e.raiseParseError(r,"Unknown intersection config specification")}}while(r.matchToken("and"))}}else if(s==="mutation"){E={};if(r.matchToken("of")){do{if(r.matchToken("anything")){E["attributes"]=true;E["subtree"]=true;E["characterData"]=true;E["childList"]=true}else if(r.matchToken("childList")){E["childList"]=true}else if(r.matchToken("attributes")){E["attributes"]=true;E["attributeOldValue"]=true}else if(r.matchToken("subtree")){E["subtree"]=true}else if(r.matchToken("characterData")){E["characterData"]=true;E["characterDataOldValue"]=true}else if(r.currentToken().type==="ATTRIBUTE_REF"){var T=r.consumeToken();if(E["attributeFilter"]==null){E["attributeFilter"]=[]}if(T.value.indexOf("@")==0){E["attributeFilter"].push(T.value.substring(1))}else{e.raiseParseError(r,"Only shorthand attribute references are allowed here")}}else{e.raiseParseError(r,"Unknown mutation config specification")}}while(r.matchToken("or"))}else{E["attributes"]=true;E["characterData"]=true;E["childList"]=true}}var y=null;var k=false;if(r.matchToken("from")){if(r.matchToken("elsewhere")){k=true}else{r.pushFollow("or");try{y=e.requireElement("expression",r)}finally{r.popFollow()}if(!y){e.raiseParseError(r,'Expected either target value or "elsewhere".')}}}if(y===null&&k===false&&r.matchToken("elsewhere")){k=true}if(r.matchToken("in")){var x=e.parseElement("unaryExpression",r)}if(r.matchToken("debounced")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var b=g.evaluate({})}else if(r.matchToken("throttled")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var w=g.evaluate({})}i.push({execCount:0,every:n,on:s,args:u,filter:l,from:y,inExpr:x,elsewhere:k,startCount:c,endCount:f,unbounded:m,debounceTime:b,throttleTime:w,mutationSpec:E,intersectionSpec:d,debounced:undefined,lastExec:undefined})}while(r.matchToken("or"));var S=true;if(!n){if(r.matchToken("queue")){if(r.matchToken("all")){var N=true;var S=false}else if(r.matchToken("first")){var q=true}else if(r.matchToken("none")){var I=true}else{r.requireToken("last")}}}var C=e.requireElement("commandList",r);e.ensureTerminated(C);var R,A;if(r.matchToken("catch")){R=r.requireTokenType("IDENTIFIER").value;A=e.requireElement("commandList",r);e.ensureTerminated(A)}if(r.matchToken("finally")){var L=e.requireElement("commandList",r);e.ensureTerminated(L)}var O={displayName:a,events:i,start:C,every:n,execCount:0,errorHandler:A,errorSymbol:R,execute:function(e){let r=t.getEventQueueFor(e.me,O);if(r.executing&&n===false){if(I||q&&r.queue.length>0){return}if(S){r.queue.length=0}r.queue.push(e);return}O.execCount++;r.executing=true;e.meta.onHalt=function(){r.executing=false;var e=r.queue.shift();if(e){setTimeout((function(){O.execute(e)}),1)}};e.meta.reject=function(r){console.error(r.message?r.message:r);var n=t.getHyperTrace(e,r);if(n){n.print()}t.triggerEvent(e.me,"exception",{error:r})};C.execute(e)},install:function(e,r){for(const r of O.events){var n;if(r.elsewhere){n=[document]}else if(r.from){n=r.from.evaluate(t.makeContext(e,O,e,null))}else{n=[e]}t.implicitLoop(n,(function(n){var i=r.on;if(n==null){console.warn("'%s' feature ignored because target does not exists:",a,e);return}if(r.mutationSpec){i="hyperscript:mutation";const e=new MutationObserver((function(e,r){if(!O.executing){t.triggerEvent(n,i,{mutationList:e,observer:r})}}));e.observe(n,r.mutationSpec)}if(r.intersectionSpec){i="hyperscript:intersection";const e=new IntersectionObserver((function(r){for(const o of r){var a={observer:e};a=Object.assign(a,o);a["intersecting"]=o.isIntersecting;t.triggerEvent(n,i,a)}}),r.intersectionSpec);e.observe(n)}var o=n.addEventListener||n.on;o.call(n,i,(function a(o){if(typeof Node!=="undefined"&&e instanceof Node&&n!==e&&!e.isConnected){n.removeEventListener(i,a);return}var s=t.makeContext(e,O,e,o);if(r.elsewhere&&e.contains(o.target)){return}if(r.from){s.result=n}for(const e of r.args){let t=s.event[e.value];if(t!==undefined){s.locals[e.value]=t}else if("detail"in s.event){s.locals[e.value]=s.event["detail"][e.value]}}s.meta.errorHandler=A;s.meta.errorSymbol=R;s.meta.finallyHandler=L;if(r.filter){var u=s.meta.context;s.meta.context=s.event;try{var l=r.filter.evaluate(s);if(l){}else{return}}finally{s.meta.context=u}}if(r.inExpr){var c=o.target;while(true){if(c.matches&&c.matches(r.inExpr.css)){s.result=c;break}else{c=c.parentElement;if(c==null){return}}}}r.execCount++;if(r.startCount){if(r.endCount){if(r.execCountr.endCount){return}}else if(r.unbounded){if(r.execCount{var a=false;for(const s of i){var o=n=>{e.result=n;if(s.args){for(const t of s.args){e.locals[t.value]=n[t.value]||(n.detail?n.detail[t.value]:null)}}if(!a){a=true;r(t.findNext(this,e))}};if(s.name){n.addEventListener(s.name,o,{once:true})}else if(s.time!=null){setTimeout(o,s.time,s.time)}}}))}};return n}else{var s;if(r.matchToken("a")){r.requireToken("tick");s=0}else{s=e.requireElement("expression",r)}n={type:"waitCmd",time:s,args:[s],op:function(e,r){return new Promise((n=>{setTimeout((()=>{n(t.findNext(this,e))}),r)}))},execute:function(e){return t.unifiedExec(this,e)}};return n}}));t.addGrammarElement("dotOrColonPath",(function(e,t,r){var n=r.matchTokenType("IDENTIFIER");if(n){var i=[n.value];var a=r.matchOpToken(".")||r.matchOpToken(":");if(a){do{i.push(r.requireTokenType("IDENTIFIER","NUMBER").value)}while(r.matchOpToken(a.value))}return{type:"dotOrColonPath",path:i,evaluate:function(){return i.join(a?a.value:"")}}}}));t.addGrammarElement("eventName",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{evaluate:function(){return n.value}}}return e.parseElement("dotOrColonPath",r)}));function d(e,t,r,n){var i=t.requireElement("eventName",n);var a=t.parseElement("namedArgumentList",n);if(e==="send"&&n.matchToken("to")||e==="trigger"&&n.matchToken("on")){var o=t.requireElement("expression",n)}else{var o=t.requireElement("implicitMeTarget",n)}var s={eventName:i,details:a,to:o,args:[o,i,a],op:function(e,t,n,i){r.nullCheck(t,o);r.implicitLoop(t,(function(t){r.triggerEvent(t,n,i,e.me)}));return r.findNext(s,e)}};return s}t.addCommand("trigger",(function(e,t,r){if(r.matchToken("trigger")){return d("trigger",e,t,r)}}));t.addCommand("send",(function(e,t,r){if(r.matchToken("send")){return d("send",e,t,r)}}));var T=function(e,t,r,n){if(n){if(e.commandBoundary(r.currentToken())){e.raiseParseError(r,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.")}else{var i=e.requireElement("expression",r)}}var a={value:i,args:[i],op:function(e,r){var n=e.meta.resolve;e.meta.returned=true;e.meta.returnValue=r;if(n){if(r){n(r)}else{n()}}return t.HALT}};return a};t.addCommand("return",(function(e,t,r){if(r.matchToken("return")){return T(e,t,r,true)}}));t.addCommand("exit",(function(e,t,r){if(r.matchToken("exit")){return T(e,t,r,false)}}));t.addCommand("halt",(function(e,t,r){if(r.matchToken("halt")){if(r.matchToken("the")){r.requireToken("event");if(r.matchOpToken("'")){r.requireToken("s")}var n=true}if(r.matchToken("bubbling")){var i=true}else if(r.matchToken("default")){var a=true}var o=T(e,t,r,false);var s={keepExecuting:true,bubbling:i,haltDefault:a,exit:o,op:function(e){if(e.event){if(i){e.event.stopPropagation()}else if(a){e.event.preventDefault()}else{e.event.stopPropagation();e.event.preventDefault()}if(n){return t.findNext(this,e)}else{return o}}}};return s}}));t.addCommand("log",(function(e,t,r){if(!r.matchToken("log"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}if(r.matchToken("with")){var i=e.requireElement("expression",r)}var a={exprs:n,withExpr:i,args:[i,n],op:function(e,r,n){if(r){r.apply(null,n)}else{console.log.apply(null,n)}return t.findNext(this,e)}};return a}));t.addCommand("beep!",(function(e,t,r){if(!r.matchToken("beep!"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}var i={exprs:n,args:[n],op:function(e,r){for(let i=0;i{if(!r.matchToken("pick"))return;r.matchToken("the");if(r.matchToken("item")||r.matchToken("items")||r.matchToken("character")||r.matchToken("characters")){const n=g(e,t,r);r.requireToken("from");const i=e.requireElement("expression",r);return{args:[i,n.from,n.to],op(e,r,i,a){if(n.toEnd)a=r.length;if(!n.includeStart)i++;if(n.includeEnd)a++;if(a==null||a==undefined)a=i+1;e.result=r.slice(i,a);return t.findNext(this,e)}}}if(r.matchToken("match")){r.matchToken("of");const n=e.parseElement("expression",r);let i="";if(r.matchOpToken("|")){i=r.requireToken("identifier").value}r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new RegExp(n,i).exec(r);return t.findNext(this,e)}}}if(r.matchToken("matches")){r.matchToken("of");const n=e.parseElement("expression",r);let i="gu";if(r.matchOpToken("|")){i="g"+r.requireToken("identifier").value.replace("g","")}console.log("flags",i);r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new w(n,i,r);return t.findNext(this,e)}}}}));t.addCommand("increment",(function(e,t,r){if(!r.matchToken("increment"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitIncrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t+r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));t.addCommand("decrement",(function(e,t,r){if(!r.matchToken("decrement"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitDecrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t-r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));function S(e,t){var r="text";var n;e.matchToken("a")||e.matchToken("an");if(e.matchToken("json")||e.matchToken("Object")){r="json"}else if(e.matchToken("response")){r="response"}else if(e.matchToken("html")){r="html"}else if(e.matchToken("text")){}else{n=t.requireElement("dotOrColonPath",e).evaluate()}return{type:r,conversion:n}}t.addCommand("fetch",(function(e,t,r){if(!r.matchToken("fetch"))return;var n=e.requireElement("stringLike",r);if(r.matchToken("as")){var i=S(r,e)}if(r.matchToken("with")&&r.currentToken().value!=="{"){var a=e.parseElement("nakedNamedArgumentList",r)}else{var a=e.parseElement("objectLiteral",r)}if(i==null&&r.matchToken("as")){i=S(r,e)}var o=i?i.type:"text";var s=i?i.conversion:null;var u={url:n,argExpressions:a,args:[n,a],op:function(e,r,n){var i=n||{};i["sender"]=e.me;i["headers"]=i["headers"]||{};var a=new AbortController;let l=e.me.addEventListener("fetch:abort",(function(){a.abort()}),{once:true});i["signal"]=a.signal;t.triggerEvent(e.me,"hyperscript:beforeFetch",i);t.triggerEvent(e.me,"fetch:beforeRequest",i);n=i;var c=false;if(n.timeout){setTimeout((function(){if(!c){a.abort()}}),n.timeout)}return fetch(r,n).then((function(r){let n={response:r};t.triggerEvent(e.me,"fetch:afterResponse",n);r=n.response;if(o==="response"){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}if(o==="json"){return r.json().then((function(r){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))}return r.text().then((function(r){if(s)r=t.convertValue(r,s);if(o==="html")r=t.convertValue(r,"Fragment");e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))})).catch((function(r){t.triggerEvent(e.me,"fetch:error",{reason:r});throw r})).finally((function(){e.me.removeEventListener("fetch:abort",l)}))}};return u}))}function y(e){e.addCommand("settle",(function(e,t,r){if(r.matchToken("settle")){if(!e.commandBoundary(r.currentToken())){var n=e.requireElement("expression",r)}else{var n=e.requireElement("implicitMeTarget",r)}var i={type:"settleCmd",args:[n],op:function(e,r){t.nullCheck(r,n);var a=null;var o=false;var s=false;var u=new Promise((function(e){a=e}));r.addEventListener("transitionstart",(function(){s=true}),{once:true});setTimeout((function(){if(!s&&!o){a(t.findNext(i,e))}}),500);r.addEventListener("transitionend",(function(){if(!o){a(t.findNext(i,e))}}),{once:true});return u},execute:function(e){return t.unifiedExec(this,e)}};return i}}));e.addCommand("add",(function(e,t,r){if(r.matchToken("add")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("styleLiteral",r);if(a==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("to")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}if(r.matchToken("when")){if(a){e.raiseParseError(r,"Only class and properties are supported with a when clause")}var u=e.requireElement("expression",r)}if(o){return{classRefs:o,to:s,args:[s,o],op:function(e,r,n){t.nullCheck(r,s);t.forEach(n,(function(n){t.implicitLoop(r,(function(r){if(u){e.result=r;let i=t.evaluateNoPromise(u,e);if(i){if(r instanceof Element)r.classList.add(n.className)}else{if(r instanceof Element)r.classList.remove(n.className)}e.result=null}else{if(r instanceof Element)r.classList.add(n.className)}}))}));return t.findNext(this,e)}}}else if(i){return{type:"addCmd",attributeRef:i,to:s,args:[s],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(r){if(u){e.result=r;let n=t.evaluateNoPromise(u,e);if(n){r.setAttribute(i.name,i.value)}else{r.removeAttribute(i.name)}e.result=null}else{r.setAttribute(i.name,i.value)}}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}else{return{type:"addCmd",cssDeclaration:a,to:s,args:[s,a],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(e){e.style.cssText+=n}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}}}));e.addGrammarElement("styleLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[""];var i=[];while(r.hasMore()){if(r.matchOpToken("\\")){r.consumeToken()}else if(r.matchOpToken("}")){break}else if(r.matchToken("$")){var a=r.matchOpToken("{");var o=e.parseElement("expression",r);if(a)r.requireOpToken("}");i.push(o);n.push("")}else{var s=r.consumeToken();n[n.length-1]+=r.source.substring(s.start,s.end)}n[n.length-1]+=r.lastWhitespace()}return{type:"styleLiteral",args:[i],op:function(e,t){var r="";n.forEach((function(e,n){r+=e;if(n in t)r+=t[n]}));return r},evaluate:function(e){return t.unifiedEval(this,e)}}}));e.addCommand("remove",(function(e,t,r){if(r.matchToken("remove")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("expression",r);if(a==null){e.raiseParseError(r,"Expected either a class reference, attribute expression or value expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("from")){var s=e.requireElement("expression",r)}else{if(a==null){var s=e.requireElement("implicitMeTarget",r)}}if(a){return{elementExpr:a,from:s,args:[a,s],op:function(e,r,n){t.nullCheck(r,a);t.implicitLoop(r,(function(e){if(e.parentElement&&(n==null||n.contains(e))){e.parentElement.removeChild(e)}}));return t.findNext(this,e)}}}else{return{classRefs:o,attributeRef:i,elementExpr:a,from:s,args:[o,s],op:function(e,r,n){t.nullCheck(n,s);if(r){t.forEach(r,(function(e){t.implicitLoop(n,(function(t){t.classList.remove(e.className)}))}))}else{t.implicitLoop(n,(function(e){e.removeAttribute(i.name)}))}return t.findNext(this,e)}}}}}));e.addCommand("toggle",(function(e,t,r){if(r.matchToken("toggle")){r.matchAnyToken("the","my");if(r.currentToken().type==="STYLE_REF"){let t=r.consumeToken();var n=t.value.substr(1);var a=true;var o=i(e,r,n);if(r.matchToken("of")){r.pushFollow("with");try{var s=e.requireElement("expression",r)}finally{r.popFollow()}}else{var s=e.requireElement("implicitMeTarget",r)}}else if(r.matchToken("between")){var u=true;var l=e.parseElement("classRef",r);r.requireToken("and");var c=e.requireElement("classRef",r)}else{var l=e.parseElement("classRef",r);var f=null;if(l==null){f=e.parseElement("attributeRef",r);if(f==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}else{var m=[l];while(l=e.parseElement("classRef",r)){m.push(l)}}}if(a!==true){if(r.matchToken("on")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}}if(r.matchToken("for")){var p=e.requireElement("expression",r)}else if(r.matchToken("until")){var h=e.requireElement("dotOrColonPath",r,"Expected event name");if(r.matchToken("from")){var v=e.requireElement("expression",r)}}var d={classRef:l,classRef2:c,classRefs:m,attributeRef:f,on:s,time:p,evt:h,from:v,toggle:function(e,r,n,i){t.nullCheck(e,s);if(a){t.implicitLoop(e,(function(e){o("toggle",e)}))}else if(u){t.implicitLoop(e,(function(e){if(e.classList.contains(r.className)){e.classList.remove(r.className);e.classList.add(n.className)}else{e.classList.add(r.className);e.classList.remove(n.className)}}))}else if(i){t.forEach(i,(function(r){t.implicitLoop(e,(function(e){e.classList.toggle(r.className)}))}))}else{t.implicitLoop(e,(function(e){if(e.hasAttribute(f.name)){e.removeAttribute(f.name)}else{e.setAttribute(f.name,f.value)}}))}},args:[s,p,h,v,l,c,m],op:function(e,r,n,i,a,o,s,u){if(n){return new Promise((function(i){d.toggle(r,o,s,u);setTimeout((function(){d.toggle(r,o,s,u);i(t.findNext(d,e))}),n)}))}else if(i){return new Promise((function(n){var l=a||e.me;l.addEventListener(i,(function(){d.toggle(r,o,s,u);n(t.findNext(d,e))}),{once:true});d.toggle(r,o,s,u)}))}else{this.toggle(r,o,s,u);return t.findNext(d,e)}}};return d}}));var t={display:function(r,n,i){if(i){n.style.display=i}else if(r==="toggle"){if(getComputedStyle(n).display==="none"){t.display("show",n,i)}else{t.display("hide",n,i)}}else if(r==="hide"){const t=e.runtime.getInternalData(n);if(t.originalDisplay==null){t.originalDisplay=n.style.display}n.style.display="none"}else{const t=e.runtime.getInternalData(n);if(t.originalDisplay&&t.originalDisplay!=="none"){n.style.display=t.originalDisplay}else{n.style.removeProperty("display")}}},visibility:function(e,r,n){if(n){r.style.visibility=n}else if(e==="toggle"){if(getComputedStyle(r).visibility==="hidden"){t.visibility("show",r,n)}else{t.visibility("hide",r,n)}}else if(e==="hide"){r.style.visibility="hidden"}else{r.style.visibility="visible"}},opacity:function(e,r,n){if(n){r.style.opacity=n}else if(e==="toggle"){if(getComputedStyle(r).opacity==="0"){t.opacity("show",r,n)}else{t.opacity("hide",r,n)}}else if(e==="hide"){r.style.opacity="0"}else{r.style.opacity="1"}}};var n=function(e,t,r){var n;var i=r.currentToken();if(i.value==="when"||i.value==="with"||e.commandBoundary(i)){n=e.parseElement("implicitMeTarget",r)}else{n=e.parseElement("expression",r)}return n};var i=function(e,n,i){var a=r.defaultHideShowStrategy;var o=t;if(r.hideShowStrategies){o=Object.assign(o,r.hideShowStrategies)}i=i||a||"display";var s=o[i];if(s==null){e.raiseParseError(n,"Unknown show/hide strategy : "+i)}return s};e.addCommand("hide",(function(e,t,r){if(r.matchToken("hide")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=i(e,r,o);return{target:a,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(e){s("hide",e)}));return t.findNext(this,e)}}}}));e.addCommand("show",(function(e,t,r){if(r.matchToken("show")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=null;if(r.matchOpToken(":")){var u=r.consumeUntilWhitespace();r.matchTokenType("WHITESPACE");s=u.map((function(e){return e.value})).join("")}if(r.matchToken("when")){var l=e.requireElement("expression",r)}var c=i(e,r,o);return{target:a,when:l,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(r){if(l){e.result=r;let n=t.evaluateNoPromise(l,e);if(n){c("show",r,s)}else{c("hide",r)}e.result=null}else{c("show",r,s)}}));return t.findNext(this,e)}}}}));e.addCommand("take",(function(e,t,r){if(r.matchToken("take")){let u=null;let l=[];while(u=e.parseElement("classRef",r)){l.push(u)}var n=null;var i=null;let c=l.length>0;if(!c){n=e.parseElement("attributeRef",r);if(n==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}if(r.matchToken("with")){i=e.requireElement("expression",r)}}if(r.matchToken("from")){var a=e.requireElement("expression",r)}if(r.matchToken("for")){var o=e.requireElement("expression",r)}else{var o=e.requireElement("implicitMeTarget",r)}if(c){var s={classRefs:l,from:a,forElt:o,args:[l,a,o],op:function(e,r,n,i){t.nullCheck(i,o);t.implicitLoop(r,(function(e){var r=e.className;if(n){t.implicitLoop(n,(function(e){e.classList.remove(r)}))}else{t.implicitLoop(e,(function(e){e.classList.remove(r)}))}t.implicitLoop(i,(function(e){e.classList.add(r)}))}));return t.findNext(this,e)}};return s}else{var s={attributeRef:n,from:a,forElt:o,args:[a,o,i],op:function(e,r,i,s){t.nullCheck(r,a);t.nullCheck(i,o);t.implicitLoop(r,(function(e){if(!s){e.removeAttribute(n.name)}else{e.setAttribute(n.name,s)}}));t.implicitLoop(i,(function(e){e.setAttribute(n.name,n.value||"")}));return t.findNext(this,e)}};return s}}}));function a(t,r,n,i){if(n!=null){var a=t.resolveSymbol(n,r)}else{var a=r}if(a instanceof Element||a instanceof HTMLDocument){while(a.firstChild)a.removeChild(a.firstChild);a.append(e.runtime.convertValue(i,"Fragment"));t.processNode(a)}else{if(n!=null){t.setSymbol(n,r,null,i)}else{throw"Don't know how to put a value into "+typeof r}}}e.addCommand("put",(function(e,t,r){if(r.matchToken("put")){var n=e.requireElement("expression",r);var i=r.matchAnyToken("into","before","after");if(i==null&&r.matchToken("at")){r.matchToken("the");i=r.matchAnyToken("start","end");r.requireToken("of")}if(i==null){e.raiseParseError(r,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'")}var o=e.requireElement("expression",r);var s=i.value;var u=false;var l=false;var c=null;var f=null;if(o.type==="arrayIndex"&&s==="into"){u=true;f=o.prop;c=o.root}else if(o.prop&&o.root&&s==="into"){f=o.prop.value;c=o.root}else if(o.type==="symbol"&&s==="into"){l=true;f=o.name}else if(o.type==="attributeRef"&&s==="into"){var m=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.type==="styleRef"&&s==="into"){var p=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.attribute&&s==="into"){var m=o.attribute.type==="attributeRef";var p=o.attribute.type==="styleRef";f=o.attribute.name;c=o.root}else{c=o}var h={target:o,operation:s,symbolWrite:l,value:n,args:[c,f,n],op:function(e,r,n,i){if(l){a(t,e,n,i)}else{t.nullCheck(r,c);if(s==="into"){if(m){t.implicitLoop(r,(function(e){e.setAttribute(n,i)}))}else if(p){t.implicitLoop(r,(function(e){e.style[n]=i}))}else if(u){r[n]=i}else{t.implicitLoop(r,(function(e){a(t,e,n,i)}))}}else{var o=s==="before"?Element.prototype.before:s==="after"?Element.prototype.after:s==="start"?Element.prototype.prepend:s==="end"?Element.prototype.append:Element.prototype.append;t.implicitLoop(r,(function(e){o.call(e,i instanceof Node?i:t.convertValue(i,"Fragment"));if(e.parentElement){t.processNode(e.parentElement)}else{t.processNode(e)}}))}}return t.findNext(this,e)}};return h}}));function o(e,t,r){var n;if(r.matchToken("the")||r.matchToken("element")||r.matchToken("elements")||r.currentToken().type==="CLASS_REF"||r.currentToken().type==="ID_REF"||r.currentToken().op&&r.currentToken().value==="<"){e.possessivesDisabled=true;try{n=e.parseElement("expression",r)}finally{delete e.possessivesDisabled}if(r.matchOpToken("'")){r.requireToken("s")}}else if(r.currentToken().type==="IDENTIFIER"&&r.currentToken().value==="its"){var i=r.matchToken("its");n={type:"pseudopossessiveIts",token:i,name:i.value,evaluate:function(e){return t.resolveSymbol("it",e)}}}else{r.matchToken("my")||r.matchToken("me");n=e.parseElement("implicitMeTarget",r)}return n}e.addCommand("transition",(function(e,t,n){if(n.matchToken("transition")){var i=o(e,t,n);var a=[];var s=[];var u=[];var l=n.currentToken();while(!e.commandBoundary(l)&&l.value!=="over"&&l.value!=="using"){if(n.currentToken().type==="STYLE_REF"){let e=n.consumeToken();let t=e.value.substr(1);a.push({type:"styleRefValue",evaluate:function(){return t}})}else{a.push(e.requireElement("stringLike",n))}if(n.matchToken("from")){s.push(e.requireElement("expression",n))}else{s.push(null)}n.requireToken("to");if(n.matchToken("initial")){u.push({type:"initial_literal",evaluate:function(){return"initial"}})}else{u.push(e.requireElement("expression",n))}l=n.currentToken()}if(n.matchToken("over")){var c=e.requireElement("expression",n)}else if(n.matchToken("using")){var f=e.requireElement("expression",n)}var m={to:u,args:[i,a,s,u,f,c],op:function(e,n,a,o,s,u,l){t.nullCheck(n,i);var c=[];t.implicitLoop(n,(function(e){var n=new Promise((function(n,i){var c=e.style.transition;if(l){e.style.transition="all "+l+"ms ease-in"}else if(u){e.style.transition=u}else{e.style.transition=r.defaultTransition}var f=t.getInternalData(e);var m=getComputedStyle(e);var p={};for(var h=0;he.forEach((e=>S(e))))).then((()=>n((function(){a();k.processNode(document.documentElement);e.document.addEventListener("htmx:load",(function(e){k.processNode(e.detail.elt)}))}))));function n(e){if(document.readyState!=="loading"){setTimeout(e)}else{document.addEventListener("DOMContentLoaded",e)}}function i(){var e=document.querySelector('meta[name="htmx-config"]');if(e){return v(e.content)}else{return null}}function a(){var e=i();if(e){Object.assign(r,e)}}}const S=Object.assign(b,{config:r,use(e){e(S)},internals:{lexer:x,parser:g,runtime:k,Lexer:n,Tokens:i,Parser:a,Runtime:o},ElementCollection:m,addFeature:g.addFeature.bind(g),addCommand:g.addCommand.bind(g),addLeafExpression:g.addLeafExpression.bind(g),addIndirectExpression:g.addIndirectExpression.bind(g),evaluate:k.evaluate.bind(k),parse:k.parse.bind(k),processNode:k.processNode.bind(k),version:"0.9.13",browserInit:w});return S})); diff --git a/www/posts/2024-10-20-hyperscript-0.9.13-is-released.md b/www/posts/2024-10-20-hyperscript-0.9.13-is-released.md index 20bd5930..a6a356ec 100644 --- a/www/posts/2024-10-20-hyperscript-0.9.13-is-released.md +++ b/www/posts/2024-10-20-hyperscript-0.9.13-is-released.md @@ -11,5 +11,11 @@ We are pleased to present the [0.9.13 release](https://unpkg.com/browse/hyperscr ### Changes +* Triggered events now are maked as `bubbles:true` for better shadow DOM usage +* Support for Tailwinds CSS strategies for hide/show commands +* Fixed bug in toggling attributes on ` + + + + + + `; + HDB.prototype.ui = function () { + var node = document.createElement("div"); + var shadow = node.attachShadow({ mode: "open" }); + node.style.cssText = "all: initial"; + shadow.innerHTML = ui; + document.body.appendChild(node); + _hyperscript.processNode(shadow.querySelector(".hdb")); + }; + } +}) \ No newline at end of file diff --git a/www/test/0.9.13/dist/hdb.min.js b/www/test/0.9.13/dist/hdb.min.js new file mode 100644 index 00000000..03bb9bd9 --- /dev/null +++ b/www/test/0.9.13/dist/hdb.min.js @@ -0,0 +1 @@ +(function(t,n){const e=n(t);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=e}else{if("_hyperscript"in t)t._hyperscript.use(e)}})(typeof self!=="undefined"?self:this,(t=>t=>{function n(n,e,o){this.ctx=n;this.runtime=e;this.cmd=o;this._hyperscript=t;this.cmdMap=[];this.bus=new EventTarget}t.addCommand("breakpoint",(function(t,e,o){if(!o.matchToken("breakpoint"))return;var i;return{op:function(t){globalThis.hdb=i=new n(t,e,this);try{return i.break(t)}catch(t){console.error(t,t.stack)}}}}));n.prototype.break=function(t){console.log("=== HDB///_hyperscript/debugger ===");this.ui();return new Promise(((n,e)=>{this.bus.addEventListener("continue",(()=>{if(this.ctx!==t){for(var e in t){delete t[e]}Object.assign(t,this.ctx)}delete window["hdb"];n(this.runtime.findNext(this.cmd,this.ctx))}),{once:true})}))};n.prototype.continueExec=function(){this.bus.dispatchEvent(new Event("continue"))};n.prototype.stepOver=function(){if(!this.cmd)return this.continueExec();var t=this.cmd&&this.cmd.type==="breakpointCommand"?this.runtime.findNext(this.cmd,this.ctx):this.runtime.unifiedEval(this.cmd,this.ctx);if(t.type==="implicitReturn")return this.stepOut();if(t&&t.then instanceof Function){return t.then((t=>{this.cmd=t;this.bus.dispatchEvent(new Event("step"));this.logCommand()}))}else if(t.halt_flag){this.bus.dispatchEvent(new Event("continue"))}else{this.cmd=t;this.bus.dispatchEvent(new Event("step"));this.logCommand()}};n.prototype.stepOut=function(){if(!this.ctx.meta.caller)return this.continueExec();var t=this.ctx.meta.callingCommand;var n=this.ctx.me;this.ctx=this.ctx.meta.caller;console.log("[hdb] stepping out into "+this.ctx.meta.feature.displayName);if(this.ctx.me instanceof Element&&this.ctx.me!==n){console.log("[hdb] me: ",this.ctx.me)}this.cmd=this.runtime.findNext(t,this.ctx);this.cmd=this.runtime.findNext(this.cmd,this.ctx);this.logCommand();this.bus.dispatchEvent(new Event("step"))};n.prototype.skipTo=function(t){this.cmd=t.cmd;this.bus.dispatchEvent(new Event("skip"))};n.prototype.rewrite=function(n,e){console.log("##",n);const o=n.cmd.parent;let i;for(i of o.children){if(i.next===n.cmd)break}const r=n.next;const s=t.internals.lexer.tokenize(e);const a=t.internals.parser.requireElement("command",s);console.log(a);a.startToken=n.startToken;a.endToken=n.endToken;a.programSource=n.programSource;a.sourceFor=function(){return e};i.next=a;a.next=r;a.parent=o;this.bus.dispatchEvent(new Event("step"))};n.prototype.logCommand=function(){var t=this.cmd.sourceFor instanceof Function;var n=t?this.cmd.sourceFor():"-- "+this.cmd.type;console.log("[hdb] current command: "+n)};n.prototype.traverse=function(t){const n=[];(function t(e){n.push(e);if("children"in e)for(const n of e.children)t(n)})(t);return n};var e=`\n
\n\n\t + +
+

HDB

+ +
+ +
+ +
+
+
+
+ +
+ +
    + +
+ +
+ +
+
+ + +
+ `; + HDB.prototype.ui = function () { + var node = document.createElement("div"); + var shadow = node.attachShadow({ mode: "open" }); + node.style.cssText = "all: initial"; + shadow.innerHTML = ui; + document.body.appendChild(node); + _hyperscript.processNode(shadow.querySelector(".hdb")); + }; + } +}) \ No newline at end of file diff --git a/www/test/0.9.13/src/node-hyperscript.js b/www/test/0.9.13/src/node-hyperscript.js new file mode 100755 index 00000000..82554f62 --- /dev/null +++ b/www/test/0.9.13/src/node-hyperscript.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +const _hyperscript = require('./_hyperscript.js') +const fs = require('fs'); +const path = require('path') + +/** + * File extension for _hyperscript files + */ +const hsExt = '._hs'; + +global.require = require; // Allow importing modules from within hyperscript + +/** + * + * @param {String} modulePath + */ +function run(modulePath) { + modulePath = path.resolve(modulePath); + const args = { module: { dir: path.dirname(modulePath), id: modulePath } } + return fs.promises.readFile(modulePath, { encoding: 'utf-8' }) + .then(code => _hyperscript.evaluate(code, {}, args)) + .catch(e => console.error("Cannot execute file: ", e)); +} + +_hyperscript.addFeature('require', (parser, runtime, tokens) => { + if (!tokens.matchToken('require')) return; + /** @type {string} */ + let id = parser.requireElement('nakedString', tokens) + // @ts-ignore + .evaluate({}); + + let name = id; + if (tokens.matchToken('as')) { + name = tokens.requireTokenType('IDENTIFIER').value; + } else { + name = path.basename(id) + .replace(/\.[^\.]*$/, '') // remove extension + } + + return { + install(target, source, args) { + if (id.startsWith('./') || id.startsWith('../')) { + id = path.join(args.module.dir, id); + } + + let mod; + if (id.endsWith(hsExt)) mod = run(id); + if (fs.existsSync(id + hsExt)) mod = run(id + hsExt); + else mod = require(id); + runtime.assignToNamespace(target, [], name, mod); + //console.log(id, name, mod.toString(), target.hyperscriptFeatures); + } + } +}) + +run(process.argv[2]) diff --git a/www/test/0.9.13/src/socket.js b/www/test/0.9.13/src/socket.js new file mode 100644 index 00000000..e40d30c3 --- /dev/null +++ b/www/test/0.9.13/src/socket.js @@ -0,0 +1,205 @@ + +(function (self, factory) { + const plugin = factory(self) + + if (typeof exports === 'object' && typeof exports['nodeName'] !== 'string') { + module.exports = plugin + } else { + if ('_hyperscript' in self) self._hyperscript.use(plugin) + } +})(typeof self !== 'undefined' ? self : this, self => { + + function genUUID() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + var r = (Math.random() * 16) | 0, + v = c == "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); + } + + function parseUrl(url) { + var finalUrl = url; + if (finalUrl.indexOf("/") === 0) { // complete absolute paths without scheme only + var basePart = window.location.hostname + (window.location.port ? ':' + window.location.port : ''); + if (window.location.protocol === 'https:') { + finalUrl = "wss://" + basePart + finalUrl; + } else if (window.location.protocol === 'http:') { + finalUrl = "ws://" + basePart + finalUrl; + } + } + return finalUrl; + } + + function createSocket(url) { + var parsedUrl = parseUrl(url.evaluate()); + return new WebSocket(parsedUrl); + } + + /** + * @param {HyperscriptObject} _hyperscript + */ + return _hyperscript => { + + /** @type {(string | symbol)[]} */ + var PROXY_BLACKLIST = ["then", "catch", "length", "asyncWrapper", "toJSON"]; + + _hyperscript.addFeature("socket", function (parser, runtime, tokens) { + function getProxy(timeout) { + return new Proxy( + {}, + { + get: function (obj, property) { + if (PROXY_BLACKLIST.indexOf(property) >= 0) { + return null; + } else if (property === "noTimeout") { + return getProxy(-1); + } else if (property === "timeout") { + return function (i) { + return getProxy(parseInt(i)); + }; + } else { + return function () { + var uuid = genUUID(); + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + var rpcInfo = { + iid: uuid, + function: property, + args: args, + }; + socket = socket ? socket : createSocket(url); //recreate socket if needed + socket.send(JSON.stringify(rpcInfo)); + + var promise = new Promise(function (resolve, reject) { + promises[uuid] = { + resolve: resolve, + reject: reject, + }; + }); + + if (timeout >= 0) { + setTimeout(function () { + if (promises[uuid]) { + promises[uuid].reject("Timed out"); + } + delete promises[uuid]; + }, timeout); // TODO configurable? + } + return promise; + }; + } + }, + } + ); + } + + if (tokens.matchToken("socket")) { + var name = parser.requireElement("dotOrColonPath", tokens); + var qualifiedName = name.evaluate(); + var nameSpace = qualifiedName.split("."); + var socketName = nameSpace.pop(); + + var promises = {}; + var url = parser.requireElement("stringLike", tokens); + + var defaultTimeout = 10000; + if (tokens.matchToken("with")) { + tokens.requireToken("timeout"); + defaultTimeout = parser.requireElement("expression", tokens).evaluate(); + } + + if (tokens.matchToken("on")) { + tokens.requireToken("message"); + if (tokens.matchToken("as")) { + tokens.requireToken("json"); + var jsonMessages = true; + } + var messageHandler = parser.requireElement("commandList", tokens); + var implicitReturn = { + type: "implicitReturn", + op: function (context) { + return runtime.HALT; + }, + execute: function (context) { + // do nothing + }, + }; + var end = messageHandler; + while (end.next) { + end = end.next; + } + end.next = implicitReturn; + // TODO set parent? + // parser.setParent(implicitReturn, initFeature); + } + + var socket = createSocket(url); + var rpcProxy = getProxy(defaultTimeout); + + var socketObject = { + raw: socket, + dispatchEvent: function (evt) { + var details = evt.detail; + // remove hyperscript internals + delete details.sender; + delete details._namedArgList_; + socket.send(JSON.stringify(Object.assign({ type: evt.type }, details))); + }, + rpc: rpcProxy, + }; + + var socketFeature = { + name: socketName, + socket: socketObject, + install: function (target) { + runtime.assignToNamespace(target, nameSpace, socketName, socketObject); + }, + }; + + socket.onmessage = function (evt) { + var data = evt.data; + try { + var dataAsJson = JSON.parse(data); + } catch (e) { + // not JSON + } + + // RPC reply + if (dataAsJson && dataAsJson.iid) { + if (dataAsJson.throw) { + promises[dataAsJson.iid].reject(dataAsJson.throw); + } else { + promises[dataAsJson.iid].resolve(dataAsJson.return); + } + delete promises[dataAsJson.iid]; + } + + if (messageHandler) { + var context = runtime.makeContext(socketObject, socketFeature, socketObject); + if (jsonMessages) { + if (dataAsJson) { + context.locals.message = dataAsJson; + context.result = dataAsJson; + } else { + throw "Received non-JSON message from socket: " + data; + } + } else { + context.locals.message = data; + context.result = data; + } + messageHandler.execute(context); + } + }; + + // clear socket on close to be recreated + socket.addEventListener("close", function (e) { + socket = null; + }); + + return socketFeature; + } + }); + } +}) diff --git a/www/test/0.9.13/src/template.js b/www/test/0.9.13/src/template.js new file mode 100644 index 00000000..a4e60ba6 --- /dev/null +++ b/www/test/0.9.13/src/template.js @@ -0,0 +1,86 @@ +(function (self, factory) { + const plugin = factory(self) + + if (typeof exports === 'object' && typeof exports['nodeName'] !== 'string') { + module.exports = plugin + } else { + if ('_hyperscript' in self) self._hyperscript.use(plugin) + } +})(typeof self !== 'undefined' ? self : this, self => { + + function compileTemplate(template) { + return template.replace(/(?:^|\n)([^@]*)@?/gm, function (match, p1) { + var templateStr = (" " + p1).replace(/([^\\])\$\{/g, "$1$${escape html ").substring(1); + return "\ncall meta.__ht_template_result.push(`" + templateStr + "`)\n"; + }); + } + + /** + * @param {HyperscriptObject} _hyperscript + */ + return _hyperscript => { + + function renderTemplate(template, ctx) { + var buf = []; + const renderCtx = Object.assign({}, ctx); + renderCtx.meta = Object.assign({ __ht_template_result: buf }, ctx.meta); + _hyperscript.evaluate(template, renderCtx); + return buf.join(""); + } + + _hyperscript.addCommand("render", function (parser, runtime, tokens) { + if (!tokens.matchToken("render")) return; + var template_ = parser.requireElement("expression", tokens); + var templateArgs = {}; + if (tokens.matchToken("with")) { + templateArgs = parser.parseElement("namedArgumentList", tokens); + } + return { + args: [template_, templateArgs], + op: function (ctx, template, templateArgs) { + if (!(template instanceof Element)) throw new Error(template_.sourceFor() + " is not an element"); + const context = _hyperscript.internals.runtime.makeContext() + context.locals = templateArgs; + ctx.result = renderTemplate(compileTemplate(template.innerHTML), context); + return runtime.findNext(this, ctx); + }, + }; + }); + + function escapeHTML(html) { + return String(html) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/\x22/g, """) + .replace(/\x27/g, "'"); + } + + _hyperscript.addLeafExpression("escape", function (parser, runtime, tokens) { + if (!tokens.matchToken("escape")) return; + var escapeType = tokens.matchTokenType("IDENTIFIER").value; + + // hidden! for use in templates + var unescaped = tokens.matchToken("unescaped"); + + var arg = parser.requireElement("expression", tokens); + + return { + args: [arg], + op: function (ctx, arg) { + if (unescaped) return arg; + if (arg === undefined) return ""; + switch (escapeType) { + case "html": + return escapeHTML(arg); + default: + throw new Error("Unknown escape: " + escapeType); + } + }, + evaluate: function (ctx) { + return runtime.unifiedEval(this, ctx); + }, + }; + }); + } +}) \ No newline at end of file diff --git a/www/test/0.9.13/src/worker.js b/www/test/0.9.13/src/worker.js new file mode 100644 index 00000000..f389c467 --- /dev/null +++ b/www/test/0.9.13/src/worker.js @@ -0,0 +1,172 @@ +///========================================================================= +/// This module provides the worker feature for hyperscript +///========================================================================= + +'use strict'; + +(function (self, factory) { + const plugin = factory(self) + + if (typeof exports === 'object' && typeof exports['nodeName'] !== 'string') { + module.exports = plugin + } else { + if ('_hyperscript' in self) self._hyperscript.use(plugin) + } +})(typeof self !== 'undefined' ? self : this, self => { + + return (_hyperscript) => { + var invocationIdCounter = 0; + + var workerFunc = function (self) { + self.onmessage = function (e) { + switch (e.data.type) { + case "init": + self.importScripts(e.data._hyperscript); + self.importScripts.apply(self, e.data.extraScripts); + const _hyperscript = self['_hyperscript'] + var tokens = new _hyperscript.internals.Tokens(e.data.tokens, [], e.data.source); + var hyperscript = _hyperscript.internals.parser.parseElement("hyperscript", tokens); + hyperscript.apply(self, self); + postMessage({ type: "didInit" }); + break; + case "call": + try { + var result = self['_hyperscript'].internals.runtime + .getHyperscriptFeatures(self)[e.data.function] + .apply(self, e.data.args); + Promise.resolve(result) + .then(function (value) { + postMessage({ + type: "resolve", + id: e.data.id, + value: value, + }); + }) + .catch(function (error) { + postMessage({ + type: "reject", + id: e.data.id, + error: error.toString(), + }); + }); + } catch (error) { + postMessage({ + type: "reject", + id: e.data.id, + error: error.toString(), + }); + } + break; + } + }; + }; + + // extract the body of the function, which was only defined so + // that we can get syntax highlighting + var workerCode = "(" + workerFunc.toString() + ")(self)"; + var blob = new Blob([workerCode], { type: "text/javascript" }); + var workerUri = URL.createObjectURL(blob); + + _hyperscript.addFeature("worker", function (parser, runtime, tokens) { + if (tokens.matchToken("worker")) { + var name = parser.requireElement("dotOrColonPath", tokens); + var qualifiedName = name.evaluate(); + var nameSpace = qualifiedName.split("."); + var workerName = nameSpace.pop(); + + // Parse extra scripts + var extraScripts = []; + if (tokens.matchOpToken("(")) { + if (tokens.matchOpToken(")")) { + // no external scripts + } else { + do { + var extraScript = tokens.requireTokenType("STRING").value; + var absoluteUrl = new URL(extraScript, location.href).href; + extraScripts.push(absoluteUrl); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + } + + // Consume worker methods + + var funcNames = []; + var bodyStartIndex = tokens.consumed.length; + var bodyEndIndex = tokens.consumed.length; + do { + var feature = parser.parseAnyOf(["defFeature", "jsFeature"], tokens); + if (feature) { + if (feature.type === "defFeature") { + funcNames.push(feature.name); + bodyEndIndex = tokens.consumed.length; + } else { + if (tokens.hasMore()) continue; + } + } else break; + } while (tokens.matchToken("end") && tokens.hasMore()); // worker end + + var bodyTokens = tokens.consumed.slice(bodyStartIndex, bodyEndIndex + 1); + + // Create worker + + var worker = new Worker(workerUri); + + // Send init message to worker + + worker.postMessage({ + type: "init", + _hyperscript: runtime.hyperscriptUrl, + extraScripts: extraScripts, + tokens: bodyTokens, + source: tokens.source, + }); + + var workerPromise = new Promise(function (resolve, reject) { + worker.addEventListener( + "message", + function (e) { + if (e.data.type === "didInit") resolve(); + }, + { once: true } + ); + }); + + // Create function stubs + var stubs = {}; + funcNames.forEach(function (funcName) { + console.log(funcName) + stubs[funcName] = function () { + var args = arguments; + return new Promise(function (resolve, reject) { + var id = invocationIdCounter++; + worker.addEventListener("message", function returnListener(e) { + if (e.data.id !== id) return; + worker.removeEventListener("message", returnListener); + if (e.data.type === "resolve") resolve(e.data.value); + else reject(e.data.error); + }); + workerPromise.then(function () { + // Worker has been initialized, send invocation. + worker.postMessage({ + type: "call", + function: funcName, + args: Array.from(args), + id: id, + }); + }); + }); + }; + }); + + return { + name: workerName, + worker: worker, + install: function (target) { + runtime.assignToNamespace(target, nameSpace, workerName, stubs); + }, + }; + } + }); + } +}) \ No newline at end of file diff --git a/www/test/0.9.13/test/commands/add.js b/www/test/0.9.13/test/commands/add.js new file mode 100644 index 00000000..fef24cee --- /dev/null +++ b/www/test/0.9.13/test/commands/add.js @@ -0,0 +1,121 @@ +describe("the add command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can add class ref on a single div", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + }); + + it("can add class ref w/ double dash on a single div", function () { + var div = make("
"); + div.classList.contains("foo--bar").should.equal(false); + div.click(); + div.classList.contains("foo--bar").should.equal(true); + }); + + it("can add class ref on a single form", function () { + var form = make("
"); + form.classList.contains("foo").should.equal(false); + form.click(); + form.classList.contains("foo").should.equal(true); + }); + + it("can target another div for class ref", function () { + var bar = make("
"); + var div = make("
"); + bar.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + div.click(); + bar.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + }); + + it("can add to query in me", function () { + var div = make("
" + "

" + "
"); + var p1 = byId("p1"); + p1.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + div.click(); + p1.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + }); + + it("can add to children", function () { + var div = make("
" + "

" + "
"); + var p1 = byId("p1"); + p1.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + div.click(); + p1.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + }); + + it("can add non-class attributes", function () { + var div = make("
"); + div.hasAttribute("foo").should.equal(false); + div.click(); + div.getAttribute("foo").should.equal("bar"); + }); + + it("can add css properties", function () { + var div = make( + "
" + ); + div.style.color.should.equal("blue"); + div.click(); + div.style.color.should.equal("red"); + div.style.fontFamily.should.equal("monospace"); + }); + + it("can add templated css properties", function () { + var div = make( + "
" + ); + div.style.color.should.equal("blue"); + div.click(); + div.style.color.should.equal("red"); + }); + + it("can add multiple class refs", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + }); + + it("can add class refs w/ colons and dashes", function () { + var div = make("
"); + div.classList.contains("foo:bar-doh").should.equal(false); + div.click(); + div.classList.contains("foo:bar-doh").should.equal(true); + }); + + it("can filter class addition via the when clause", function () { + var div1 = make("
"); + var div2 = make("
"); + var div3 = make("
"); + div1.click(); + div2.classList.contains("rey").should.equal(false); + div3.classList.contains("rey").should.equal(true); + }); + + it("can filter property addition via the when clause", function () { + var div1 = make("
"); + var div2 = make("
"); + var div3 = make("
"); + div1.click(); + div2.hasAttribute("rey").should.equal(false); + div3.hasAttribute("rey").should.equal(true); + }); + + +}); diff --git a/www/test/0.9.13/test/commands/append.js b/www/test/0.9.13/test/commands/append.js new file mode 100644 index 00000000..02ff6d7a --- /dev/null +++ b/www/test/0.9.13/test/commands/append.js @@ -0,0 +1,76 @@ +describe("the append command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can append a string to another string", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("Hello there. General Kenobi."); + }); + + it("can append a value into an array", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("1,2,3,4"); + }); + + it("can append a value to 'it'", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("1,2,3,4"); + }); + + it("can append a value to a DOM node", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("This is my inner HTMLWith Tags"); + }); + + it("can append a value to a DOM element", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("Content"); + }); + + it("can append a value to I", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("Content"); + }); + + it("can append a value to an object property", function () { + var div = make(`
`); + div.click(); + div.id.should.equal("id_new"); + }) + + it("multiple appends work", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("foobardoh"); + }) + + it("append to undefined ignores the undefined", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("bar"); + }) + +}); diff --git a/www/test/0.9.13/test/commands/async.js b/www/test/0.9.13/test/commands/async.js new file mode 100644 index 00000000..3d8f2216 --- /dev/null +++ b/www/test/0.9.13/test/commands/async.js @@ -0,0 +1,41 @@ +describe("the async command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("is async", function (done) { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(false); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + done(); + }, 10); + }); + + it("can trigger an event on the original element", function (done) { + var div = make( + "
" + ); + div.classList.contains("bar").should.equal(false); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("bar").should.equal(true); + div.classList.contains("foo").should.equal(false); + setTimeout(function () { + div.classList.contains("bar").should.equal(true); + div.classList.contains("foo").should.equal(true); + done(); + }, 30); + }); +}); diff --git a/www/test/0.9.13/test/commands/call.js b/www/test/0.9.13/test/commands/call.js new file mode 100644 index 00000000..ae1247c7 --- /dev/null +++ b/www/test/0.9.13/test/commands/call.js @@ -0,0 +1,97 @@ +describe("the call command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can call javascript instance functions", function () { + var d1 = make( + "
" + ); + d1.click(); + var value = window.results; + delete window.results; + value.should.equal(d1); + }); + + it("can call global javascript functions", function () { + var calledWith = null; + window.globalFunction = function (val) { + calledWith = val; + }; + try { + var div = make("
"); + div.click(); + "foo".should.equal(calledWith); + } finally { + delete window.globalFunction; + } + }); + + it("can call no argument functions", function () { + var called = false; + window.globalFunction = function () { + called = true; + }; + try { + var div = make("
"); + div.click(); + called.should.equal(true); + } finally { + delete window.globalFunction; + } + }); + + it("can call functions w/ underscores", function () { + var called = false; + window.global_function = function () { + called = true; + }; + try { + var div = make("
"); + div.click(); + called.should.equal(true); + } finally { + delete window.global_function; + } + }); + + it("can call functions w/ dollar signs", function () { + var called = false; + window.$ = function () { + called = true; + }; + try { + var div = make("
"); + div.click(); + called.should.equal(true); + } finally { + delete window.$; + } + }); + + it("call functions that return promises are waited on", function (done) { + var called = false; + window.promiseAnInt = function () { + return new Promise(function (finish) { + window.finish = finish; + }); + }; + try { + var div = make("
"); + div.click(); + div.innerText.should.equal(""); + finish(42); + setTimeout(function () { + div.innerText.should.equal("42"); + done(); + }, 20); + } finally { + delete window.promiseAnInt; + delete window.finish; + } + }); +}); diff --git a/www/test/0.9.13/test/commands/default.js b/www/test/0.9.13/test/commands/default.js new file mode 100644 index 00000000..64e015ae --- /dev/null +++ b/www/test/0.9.13/test/commands/default.js @@ -0,0 +1,46 @@ +describe("the default command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can default variables", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can default attributes", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can default properties", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("default variables respect existing values", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("bar"); + }); + + it("default attributes respect existing values", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("bar"); + }); + + it("default properties respect existing values", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("bar"); + }); +}); diff --git a/www/test/0.9.13/test/commands/fetch.js b/www/test/0.9.13/test/commands/fetch.js new file mode 100644 index 00000000..11be7977 --- /dev/null +++ b/www/test/0.9.13/test/commands/fetch.js @@ -0,0 +1,327 @@ +describe("the fetch command", function () { + beforeEach(function () { + clearWorkArea(); + sinon.stub(window, "fetch"); + }); + afterEach(function () { + sinon.restore(); + clearWorkArea(); + }); + + it("can do a simple fetch", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("can do a simple fetch w/ a naked URL", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("can do a simple fetch w/ html", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("
", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make( + "
" + ); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("[object DocumentFragment]"); + div.dataset.count.should.equal("1"); + done(); + }, 50); + }); + + it("can do a simple fetch w/ json", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response('{"foo":1}', { + status: 200, + headers: { "Content-type": "application/json" }, + }) + ) + ); + var div = make( + "
" + ); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal('{"foo":1}'); + done(); + }, 50); + }); + + it("can do a simple fetch w/ json using Object syntax", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response('{"foo":1}', { + status: 200, + headers: { "Content-type": "application/json" }, + }) + ) + ); + var div = make( + "
" + ); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal('{"foo":1}'); + done(); + }, 50); + }); + + it("can do a simple fetch w/ json using Object syntax and an 'an' prefix", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response('{"foo":1}', { + status: 200, + headers: { "Content-type": "application/json" }, + }) + ) + ); + var div = make( + "
" + ); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal('{"foo":1}'); + done(); + }, 50); + }); + + it("can do a simple fetch with a response object", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response('{"foo":1}', { + status: 200, + headers: { "Content-type": "application/json" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yep"); + done(); + }, 50); + }); + + it("can do a simple fetch w/ a custom conversion", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("1.2000", { + status: 200, + headers: { "Content-type": "text/plain" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("1.2"); + done(); + }, 50); + }); + + it("can do a simple post", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("can do a simple post alt syntax without curlies", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("can do a simple post alt syntax w/ curlies", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("can put response conversion after with", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + + it("can put response conversion before with", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("triggers an event just before fetching", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + window.addEventListener('hyperscript:beforeFetch', (event) => { + event.target.className = "foo-set"; + }); + var div = make("
"); + div.classList.contains("foo-set").should.equal(false); + div.click(); + div.classList.contains("foo-set").should.equal(true); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("submits the fetch parameters to the event handler", function (done) { + window.fetch.returns( + Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var evtListener = function(event) { + event.detail.headers.should.have.property('X-CustomHeader', 'foo'); + } + window.addEventListener('hyperscript:beforeFetch', evtListener); + var div = make("
"); + div.click(); + setTimeout(function () { + window.removeEventListener('hyperscript:beforeFetch', evtListener); + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("allows the event handler to change the fetch parameters", function (done) { + window.fetch.callsFake(function () { + arguments[1].should.have.property('headers'); + arguments[1].headers.should.have.property('X-CustomHeader', 'foo'); + return Promise.resolve( + new window.Response("yay", { + status: 200, + headers: { "Content-type": "text/html" }, + }) + ) + }); + var evtListener = function(event) { + event.detail.headers = {'X-CustomHeader': 'foo'}; + } + window.addEventListener('hyperscript:beforeFetch', evtListener); + var div = make("
"); + div.click(); + setTimeout(function () { + window.removeEventListener('hyperscript:beforeFetch', evtListener); + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + + it("can catch an error that occurs when using fetch", function (done) { + window.fetch.returns( + Promise.reject( + new window.Response("Nope", { + status: 404, + headers: { "Content-type": "text/html" }, + }) + ) + ); + var div = make("
"); + div.click(); + setTimeout(function () { + div.innerHTML.should.equal("yay"); + done(); + }, 50); + }); + +}); diff --git a/www/test/0.9.13/test/commands/fetch/response.txt b/www/test/0.9.13/test/commands/fetch/response.txt new file mode 100644 index 00000000..c39619ef --- /dev/null +++ b/www/test/0.9.13/test/commands/fetch/response.txt @@ -0,0 +1 @@ +Fetch Response diff --git a/www/test/0.9.13/test/commands/fetch/scratch.html b/www/test/0.9.13/test/commands/fetch/scratch.html new file mode 100644 index 00000000..db34498d --- /dev/null +++ b/www/test/0.9.13/test/commands/fetch/scratch.html @@ -0,0 +1,71 @@ + + + + + + +Fetch Timeout Tests +
+ + + +
+

2 Second Wait...

+ +
+ +
+

2 Second Wait, abort at 100ms

+ +
+ +
+

5 Second Wait + Abort Button

+ + +
+ +
+

Playground

+
+ +
+ +
+ + + + diff --git a/www/test/0.9.13/test/commands/fetch/server.py b/www/test/0.9.13/test/commands/fetch/server.py new file mode 100644 index 00000000..b8643f13 --- /dev/null +++ b/www/test/0.9.13/test/commands/fetch/server.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +from flask import Flask, request, make_response +from time import sleep + +app = Flask(__name__) + +@app.route('/respond') +def respond(): + time_to_sleep = int(request.args.get('time')) / 1000 + sleep(time_to_sleep) + resp = make_response('Response from Flask') + resp.headers['Access-Control-Allow-Origin'] = '*' + return resp + +@app.route('/request_type') +def request_type(): + resp = make_response('Request Type: ' + request.method) + resp.headers['Access-Control-Allow-Origin'] = '*' + return resp + +@app.route('/json') +def json(): + return {resp:'Hello JSON!'} + +# main driver function +if __name__ == '__main__': + app.run() diff --git a/www/test/0.9.13/test/commands/hide.js b/www/test/0.9.13/test/commands/hide.js new file mode 100644 index 00000000..b20464c1 --- /dev/null +++ b/www/test/0.9.13/test/commands/hide.js @@ -0,0 +1,131 @@ +describe("the hide command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can hide element with no target", function () { + var div = make("
"); + div.click(); + getComputedStyle(div).display.should.equal("none"); + }); + + it("hide element then show element retains original display", function () { + var div = make("
"); + div.click(); + div.style.display.should.equal("none"); + getComputedStyle(div).display.should.equal("none"); + div.click(); + div.style.display.should.equal(""); + getComputedStyle(div).display.should.equal("block"); + }); + + it("can hide element with no target followed by command", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.classList.contains("foo").should.equal(false); + div.click(); + getComputedStyle(div).display.should.equal("none"); + div.classList.contains("foo").should.equal(true); + }); + + it("can hide element with no target followed by then", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.classList.contains("foo").should.equal(false); + div.click(); + getComputedStyle(div).display.should.equal("none"); + div.classList.contains("foo").should.equal(true); + }); + + it("can hide element with no target with a with", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.classList.contains("foo").should.equal(false); + div.click(); + getComputedStyle(div).display.should.equal("none"); + div.classList.contains("foo").should.equal(true); + }); + + it("can hide element, with display:none by default", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.click(); + getComputedStyle(div).display.should.equal("none"); + }); + + it("can hide element with display:none explicitly", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.click(); + getComputedStyle(div).display.should.equal("none"); + }); + + it("can hide element with opacity:0", function () { + var div = make("
"); + getComputedStyle(div).opacity.should.equal("1"); + div.click(); + getComputedStyle(div).opacity.should.equal("0"); + }); + + it("can hide element with opacity style literal", function () { + var div = make("
"); + getComputedStyle(div).opacity.should.equal("1"); + div.click(); + getComputedStyle(div).opacity.should.equal("0"); + }); + + it("can hide element, with visibility:hidden", function () { + var div = make("
"); + getComputedStyle(div).visibility.should.equal("visible"); + div.click(); + getComputedStyle(div).visibility.should.equal("hidden"); + }); + + it("can hide other elements", function () { + var hideme = make("
"); + var div = make("
"); + getComputedStyle(hideme).display.should.equal("block"); + div.click(); + getComputedStyle(hideme).display.should.equal("none"); + }); + + it("can hide with custom strategy", function () { + _hyperscript.config.hideShowStrategies = { + myHide: function (op, element, arg) { + if (op == "hide") { + element.classList.add("foo"); + } else { + element.classList.remove("foo"); + } + }, + }; + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + _hyperscript.config.hideShowStrategies = null; + }); + + it("can set default to custom strategy", function () { + _hyperscript.config.hideShowStrategies = { + myHide: function (op, element, arg) { + if (op == "hide") { + element.classList.add("foo"); + } else { + element.classList.remove("foo"); + } + }, + }; + _hyperscript.config.defaultHideShowStrategy = "myHide"; + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + _hyperscript.config.hideShowStrategies = null; + _hyperscript.config.defaultHideShowStrategy = null; + }); +}); diff --git a/www/test/0.9.13/test/commands/if.js b/www/test/0.9.13/test/commands/if.js new file mode 100644 index 00000000..93c79894 --- /dev/null +++ b/www/test/0.9.13/test/commands/if.js @@ -0,0 +1,208 @@ +describe("the if command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic true branch works", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic true branch works with multiple commands", function () { + var d1 = make( + "
' + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic true branch works with end", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic true branch works with naked else", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic true branch works with naked else end", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic else branch works", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic else branch works with end", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic else if branch works", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic else if branch works with end", function () { + var d1 = make( + "
' + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("otherwise alias works", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("triple else if branch works", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("triple else if branch works with end", function () { + var d1 = make( + "
' + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("basic else branch works with multiple commands", function () { + var d1 = make( + '
' + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("true branch with a wait works", function (done) { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal(""); + setTimeout(function () { + d1.innerHTML.should.equal("foo"); + done(); + }, 20); + }); + + it("false branch with a wait works", function (done) { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal(""); + setTimeout(function () { + d1.innerHTML.should.equal("foo"); + done(); + }, 20); + }); + + it("if properly passes execution along if child is not executed", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("if properly supports nested if statements and end block", function () { + window.tmp = false + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal(""); + + window.tmp = true + d1.click(); + d1.innerHTML.should.equal("foo"); + + delete window.tmp; + }); + + it("if on new line does not join w/ else", function () { + window.tmp = false + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + + window.tmp = true + d1.innerHTML = ""; + d1.click(); + d1.innerHTML.should.equal(""); + + delete window.tmp; + }); + + it("passes the sieve test", function(){ + var str = + "if x is less than 10\n" + + " if x is less than 3\n" + + " if x is less than 2\n" + + " return 1\n" + + " else\n" + + " return 2\n" + + " end\n" + + " else if x is less than 4\n" + + " return 3\n" + + " else if x is 4\n" + + " return 4\n" + + " else\n" + + " if x is 5\n" + + " return 5\n" + + " else\n" + + " return 6\n" + + " end\n" + + " end\n" + + "else\n" + + " return 10\n" + + "end" + + evalHyperScript(str, {locals: {x: 1}}).should.equal(1); + evalHyperScript(str, {locals: {x: 2}}).should.equal(2); + evalHyperScript(str, {locals: {x: 3}}).should.equal(3); + evalHyperScript(str, {locals: {x: 4}}).should.equal(4); + evalHyperScript(str, {locals: {x: 5}}).should.equal(5); + evalHyperScript(str, {locals: {x: 6}}).should.equal(6); + evalHyperScript(str, {locals: {x: 6}}).should.equal(6); + evalHyperScript(str, {locals: {x: 7}}).should.equal(6); + evalHyperScript(str, {locals: {x: 8}}).should.equal(6); + evalHyperScript(str, {locals: {x: 9}}).should.equal(6); + evalHyperScript(str, {locals: {x: 10}}).should.equal(10); + evalHyperScript(str, {locals: {x: 11}}).should.equal(10); + }); + +}); diff --git a/www/test/0.9.13/test/commands/increment.js b/www/test/0.9.13/test/commands/increment.js new file mode 100644 index 00000000..ed77a351 --- /dev/null +++ b/www/test/0.9.13/test/commands/increment.js @@ -0,0 +1,120 @@ +describe("the increment command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can increment an empty variable", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("1"); + }); + + it("can increment a variable", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("22"); + }); + + it("can increment refer to result", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("2"); + }); + + it("can increment an attribute", function () { + var div = make(`
`); + div.click(); + div.click(); + div.click(); + div.innerHTML.should.equal("8"); + }); + + it("can increment an floating point numbers", function () { + var div = make( + `
` + ); + div.click(); + div.innerHTML.should.equal("11.3"); + }); + + it("can increment a property", function () { + var div = make(`
3
`); + div.click(); + div.click(); + div.click(); + div.innerHTML.should.equal("6"); + }); + + it("can increment by zero", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("20"); + }); + + it("can increment a value multiple times", function () { + var div = make(`
`); + div.click(); + div.click(); + div.click(); + div.click(); + div.click(); + div.innerHTML.should.equal("5"); + }); + + it("can decrement an empty variable", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("-1"); + }); + + it("can decrement a variable", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("18"); + }); + + it("can decrement an attribute", function () { + var div = make(`
`); + div.click(); + div.click(); + div.click(); + div.innerHTML.should.equal("2"); + }); + + it("can decrement an floating point numbers", function () { + var div = make( + `
` + ); + div.click(); + div.innerHTML.should.equal("1"); + }); + + it("can decrement a property", function () { + var div = make(`
3
`); + div.click(); + div.click(); + div.click(); + div.innerHTML.should.equal("0"); + }); + + it("can decrement a value multiple times", function () { + var div = make(`
`); + div.click(); + div.click(); + div.click(); + div.click(); + div.click(); + div.innerHTML.should.equal("-5"); + }); + + it("can decrement by zero", function () { + var div = make(`
`); + div.click(); + div.innerHTML.should.equal("20"); + }); + + +}); diff --git a/www/test/0.9.13/test/commands/js.js b/www/test/0.9.13/test/commands/js.js new file mode 100644 index 00000000..9c6ae1e9 --- /dev/null +++ b/www/test/0.9.13/test/commands/js.js @@ -0,0 +1,50 @@ +describe("The (inline) js command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can run js", function () { + window.testSuccess = false; + var div = make('
'); + div.click(); + assert.equal(window.testSuccess, true); + delete window.testSuccess; + }); + + it("can deal with empty input list", function () { + window.testSuccess = false; + var div = make('
'); + div.click(); + assert.equal(window.testSuccess, true); + delete window.testSuccess; + }); + + it("can access values from _hyperscript", function () { + window.testSuccess = false; + var div = make("
"); + div.click(); + assert.equal(window.testSuccess, true); + delete window.testSuccess; + }); + + it("can return values to _hyperscript", function () { + var div = make( + "
' + ); + div.click(); + div.innerHTML.should.equal("test success"); + }); + + it("can do both of the above", function () { + var div = make( + '
' + ); + div.click(); + div.innerHTML.should.equal("2"); + }); +}); diff --git a/www/test/0.9.13/test/commands/log.js b/www/test/0.9.13/test/commands/log.js new file mode 100644 index 00000000..4fb83568 --- /dev/null +++ b/www/test/0.9.13/test/commands/log.js @@ -0,0 +1,28 @@ +describe("the log command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can log single item", function () { + var d1 = make("
"); + d1.click(); + }); + + it("can log multiple items", function () { + var d1 = make("
"); + d1.click(); + }); + + it("can log multiple items with debug", function () { + var d1 = make("
"); + d1.click(); + }); + + it("can log multiple items with error", function () { + var d1 = make("
"); + d1.click(); + }); +}); diff --git a/www/test/0.9.13/test/commands/make.js b/www/test/0.9.13/test/commands/make.js new file mode 100644 index 00000000..eb1fe4da --- /dev/null +++ b/www/test/0.9.13/test/commands/make.js @@ -0,0 +1,60 @@ +describe("the make command", function () { + it("can make objects", function () { + evalHyperScript(`make a WeakMap then set window.obj to it`); + window.obj.should.be.a("weakmap"); + delete window.obj; + }); + + it("can make named objects", function () { + evalHyperScript(`make a WeakMap called wm then set window.obj to wm`); + window.obj.should.be.a("weakmap"); + delete window.obj; + }); + + it("can make named objects w/ global scope", function () { + evalHyperScript(`make a WeakMap called $wm`); + window['$wm'].should.be.a("weakmap"); + delete window['$wm']; + }); + + it("can make objects with arguments", function () { + evalHyperScript(` + make a URL from "/playground/", "https://hyperscript.org/" + set window.obj to it`); + window.obj.should.be.a("URL"); + window.obj.href.should.equal("https://hyperscript.org/playground/"); + delete window.obj; + }); + + it("can make named objects with arguments", function () { + evalHyperScript(` + make a URL from "/playground/", "https://hyperscript.org/" called u + set window.obj to u`); + window.obj.should.be.a("URL"); + window.obj.href.should.equal("https://hyperscript.org/playground/"); + delete window.obj; + }); + + it("can make elements", function () { + evalHyperScript(`make a

set window.obj to it`); + window.obj.should.be.a("htmlparagraphelement"); + delete window.obj; + }); + + it("can make elements with id and classes", function () { + evalHyperScript(`make a set window.obj to it`); + window.obj.should.be.a("htmlparagraphelement"); + window.obj.id.should.equal("id"); + assert(window.obj.classList.contains("a")); + assert(window.obj.classList.contains("b")); + assert(window.obj.classList.contains("c")); + delete window.obj; + }); + + it("creates a div by default", function () { + evalHyperScript(`make a <.a/> set window.obj to it`); + window.obj.should.be.a("htmldivelement"); + assert(window.obj.classList.contains("a")); + delete window.obj; + }); +}); diff --git a/www/test/0.9.13/test/commands/measure.js b/www/test/0.9.13/test/commands/measure.js new file mode 100644 index 00000000..d11ebc9b --- /dev/null +++ b/www/test/0.9.13/test/commands/measure.js @@ -0,0 +1,43 @@ +describe("the measure command", function () { + it("can measure me", function () { + var div = make( + "

" + ); + div.click(); + window.measurement.top.should.equal(89); + delete window.measurement; + }); + + it("can measure another element", function () { + var div = make("
"); + var measure = make("
"); + measure.click(); + window.measurement.should.have.property("top", 89); + delete window.measurement; + }); + + it("can assign measurements to locals", function () { + var measure = make( + "
" + ); + measure.click(); + window.measurement.should.have.property("top").that.exist; + window.measurement.should.have.property("left").that.exist; + window.measurement.should.have.property("right").that.exist; + window.measurement.should.have.property("bottom").that.exist; + delete window.measurement; + }); + + it("can measure all the supported properties", function () { + var measure = make( + "
" + ); + try { + measure.click(); + } catch (e) { + fail("Should not have thrown"); + } + }); +}); diff --git a/www/test/0.9.13/test/commands/pick.js b/www/test/0.9.13/test/commands/pick.js new file mode 100644 index 00000000..45a0994c --- /dev/null +++ b/www/test/0.9.13/test/commands/pick.js @@ -0,0 +1,119 @@ +describe("the pick command", () => { + const arr = [10, 11, 12, 13, 14, 15, 16] + + // Array indexing + + it("can pick items from an array", () => { + evalHyperScript(` + pick items 1 to 3 from arr + set $test to it`, { locals: { arr } }); + + window.$test.should.deep.equal([11, 12]); + delete window.$test; + }) + + it("can pick a single item from an array", () => { + evalHyperScript(` + pick item 2 from arr + set $test to it`, { locals: { arr } }); + + window.$test.should.deep.equal([12]); + delete window.$test; + }) + + it("can use 'end' when picking items from an array", () => { + evalHyperScript(` + pick item 4 to end from arr + set $test to it`, { locals: { arr } }); + + window.$test.should.deep.equal([14, 15, 16]); + delete window.$test; + }) + + it("can use 'start' when picking items from an array", () => { + evalHyperScript(` + pick items start to 3 from arr + set $test to it`, { locals: { arr } }); + + window.$test.should.deep.equal([10, 11, 12]); + delete window.$test; + }) + + it("can use negative indices when picking items from an array", () => { + evalHyperScript(` + pick items 0 to -4 from arr + set $test to it`, { locals: { arr } }); + + window.$test.should.deep.equal([10, 11, 12]); + delete window.$test; + }) + + // String indexing + + const str = "abcdefghijklmnopqrstuvwxyz" + + it("can pick items from a string", () => { + evalHyperScript(` + pick items 1 to 3 from str + set $test to it`, { locals: { str } }); + + window.$test.should.equal("bc"); + delete window.$test; + }) + + it("can pick a single item from a string", () => { + evalHyperScript(` + pick item 2 from str + set $test to it`, { locals: { str } }); + + window.$test.should.equal("c"); + delete window.$test; + }) + + it("can use 'end' when picking items from a string", () => { + evalHyperScript(` + pick item 4 to end from str + set $test to it`, { locals: { str } }); + + window.$test.should.equal("efghijklmnopqrstuvwxyz"); + delete window.$test; + }) + + it("can use 'start' when picking items from a string", () => { + evalHyperScript(` + pick items start to 3 from str + set $test to it`, { locals: { str } }); + + window.$test.should.equal("abc"); + delete window.$test; + }) + + it("can use negative indices when picking items from a string", () => { + evalHyperScript(` + pick items 0 to -4 from str + set $test to it`, { locals: { str } }); + + window.$test.should.equal("abcdefghijklmnopqrstuv"); + delete window.$test; + }) + + // Regex + + const haystack = "The 32 quick brown foxes jumped 12 times over the 149 lazy dogs"; + + it("can pick a single regex match", () => { + evalHyperScript(String.raw` + pick match of "\\d+" from haystack + set window.test to it`, { locals: { haystack } }); + [...window.test].should.deep.equal(["32"]); + delete window.test; + }) + + it("can pick all regex matches", () => { + evalHyperScript(String.raw` + pick matches of "\\d+" from haystack + set window.test to it`, { locals: { haystack } }); + [...window.test].should.deep.equal([["32"], ["12"], ["149"]]); + delete window.test; + }) +}) diff --git a/www/test/0.9.13/test/commands/pseudoCommand.js b/www/test/0.9.13/test/commands/pseudoCommand.js new file mode 100644 index 00000000..b5a4446f --- /dev/null +++ b/www/test/0.9.13/test/commands/pseudoCommand.js @@ -0,0 +1,141 @@ +describe("pseudoCommands", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("Basic instance function with expression", function () { + var d1 = make( + "
" + ); + d1.click(); + var value = window.results; + delete window.results; + value.should.equal(d1); + }); + + it("Basic instance function with expression and with", function () { + var d1 = make( + "
" + ); + d1.click(); + var value = window.results; + delete window.results; + value.should.equal(d1); + }); + + it("Basic instance function with expression and on", function () { + var d1 = make( + "
" + ); + d1.click(); + var value = window.results; + delete window.results; + value.should.equal(d1); + }); + + it("Basic instance function with me target", function () { + var d1 = make( + "
" + ); + d1.foo = function () { + return "foo"; + }; + d1.click(); + d1.bar.should.equal("foo"); + }); + + it("Can use functions defined outside of the current element", function () { + window.foo = function() { + return "foo"; + } + var d1 = make( + "
" + ); + d1.click(); + d1.bar.should.equal("foo"); + delete window.foo; + }); + + it("Basic instance function with me target no preposition", function () { + var d1 = make( + "
" + ); + d1.foo = function () { + return "foo"; + }; + d1.click(); + d1.bar.should.equal("foo"); + }); + + it("functions defined alongside can be invoked", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.bar.should.equal("foo"); + }); + + it("Can use indirect functions with a symbol root", function () { + window.bar = { + foo: function() { + return "foo"; + } + } + var d1 = make( + "
" + ); + d1.click(); + d1.bar.should.equal("foo"); + delete window.bar; + }); + + it("Can use indirect functions with a function root", function () { + window.bar = function() { + return { + foo: function() { + return "foo"; + } + } + } + var d1 = make( + "
" + ); + d1.click(); + d1.bar.should.equal("foo"); + delete window.bar; + }); + + it("Can use nested indirect functions with a symbol root", function () { + window.bar = function() { + return { + foo: function() { + return "foo"; + } + } + } + var d1 = make( + "
" + ); + d1.click(); + d1.bar.should.equal("foo"); + delete window.bar; + }); + + it("non-function pseudo-command is an error", function () { + var msg = getParseErrorFor("on click log me then foo.bar + bar"); + startsWith(msg, "Pseudo-commands must be function calls"); + }); + +}); diff --git a/www/test/0.9.13/test/commands/put.js b/www/test/0.9.13/test/commands/put.js new file mode 100644 index 00000000..cfe6b3c9 --- /dev/null +++ b/www/test/0.9.13/test/commands/put.js @@ -0,0 +1,274 @@ +describe("the put command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can set properties", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can put directly into nodes", function () { + var d1 = make("
"); + d1.click(); + d1.textContent.should.equal("foo"); + }); + + it("can put nodes into nodes", function () { + var d1 = make("
"); + var d2 = make("
"); + console.log(d2); + d2.click(); + d2.firstChild.should.equal(d1); + }); + + it("can put directly into symbols", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("me symbol doesn't get stomped on direct write", function () { + var d1 = make('
'); + d1.click(); + d1.innerHTML.should.equal("bar"); + }); + + it("can set styles", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can set javascript globals", function () { + try { + var d1 = make("
lolwat
"); + d1.click(); + window["temp"].should.equal("red"); + } finally { + delete window.temp; + } + }); + + it("can set into class ref w/ flatmapped property", function () { + var div = make("
"); + make("
"); + div.click(); + var d1 = byId("d1"); + var d2 = byId("d2"); + d1.textContent.should.equal("foo"); + d2.textContent.should.equal("foo"); + }); + + it("can set into class ref w/ flatmapped property using of", function () { + var div = make("
"); + make("
"); + div.click(); + var d1 = byId("d1"); + var d2 = byId("d2"); + d1.textContent.should.equal("foo"); + d2.textContent.should.equal("foo"); + }); + + it("can set local variables", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set into id ref", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can insert before", function () { + var d2 = make("
"); + var d1 = make("
foo
"); + d2.click(); + d2.previousSibling.textContent.should.equal("foo"); + }); + + it("can insert after", function () { + var d1 = make("
foo
"); + var d2 = make("
"); + d2.click(); + d2.nextSibling.textContent.should.equal("foo"); + }); + + it("can insert after beginning", function () { + var d1 = make("
*
"); + d1.click(); + d1.textContent.should.equal("foo*"); + }); + + it("can insert before end", function () { + var d1 = make("
*
"); + d1.click(); + d1.textContent.should.equal("*foo"); + }); + + it("can set into attribute ref", function () { + var d1 = make("
"); + d1.click(); + d1.getAttribute("bar").should.equal("foo"); + }); + + it("can set into indirect attribute ref", function () { + var d1 = make("
"); + d1.click(); + d1.getAttribute("bar").should.equal("foo"); + }); + + it("can set into indirect attribute ref 2", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.getAttribute("bar").should.equal("foo"); + }); + + it("can set into indirect attribute ref 3", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.getAttribute("bar").should.equal("foo"); + }); + + it("can set into style ref", function () { + var d1 = make("
"); + d1.click(); + d1.style["color"].should.equal("red"); + }); + + it("can set into indirect style ref", function () { + var d1 = make("
"); + d1.click(); + d1.style["color"].should.equal("red"); + }); + + it("can set into indirect style ref 2", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.style["color"].should.equal("red"); + }); + + it("can set into indirect style ref 3", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.style["color"].should.equal("red"); + }); + + it("waits on promises", function (done) { + window.promiseAString = function () { + return new Promise(function (finish) { + window.finish = finish; + }); + }; + try { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal(""); + finish("foo"); + setTimeout(function () { + d1.innerHTML.should.equal("foo"); + done(); + }, 20); + } finally { + delete window.promiseAString; + delete window.finish; + } + }); + + it("can put properties w/ array access syntax", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can put properties w/ array access syntax and var", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can put array vals w/ array access syntax", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can put array vals w/ array access syntax and var", function () { + var d1 = make("
lolwat
"); + try { + d1.click(); + } catch(e) { + console.log(e); + } + d1.style.color.should.equal("red"); + }); + + it("properly processes hyperscript in new content in a symbol write", function() { + var div = make("
") + div.click(); + let button = byId("b1"); + button.innerHTML.should.equal("40"); + button.click(); + button.innerHTML.should.equal("42"); + }) + + it("properly processes hyperscript in new content in a element target", function() { + var div = make("
") + div.click(); + let button = byId("b1"); + button.innerHTML.should.equal("40"); + button.click(); + button.innerHTML.should.equal("42"); + }) + + it("properly processes hyperscript in before", function() { + var div = make("
") + div.click(); + let button = byId("b1"); + button.innerHTML.should.equal("40"); + button.click(); + button.innerHTML.should.equal("42"); + }) + + it("properly processes hyperscript at start of", function() { + var div = make("
") + div.click(); + let button = byId("b1"); + button.innerHTML.should.equal("40"); + button.click(); + button.innerHTML.should.equal("42"); + }) + + it("properly processes hyperscript at end of", function() { + var div = make("
") + div.click(); + let button = byId("b1"); + button.innerHTML.should.equal("40"); + button.click(); + button.innerHTML.should.equal("42"); + }) + + it("properly processes hyperscript after", function() { + var div = make("
") + div.click(); + let button = byId("b1"); + button.innerHTML.should.equal("40"); + button.click(); + button.innerHTML.should.equal("42"); + }) + + +}); diff --git a/www/test/0.9.13/test/commands/remove.js b/www/test/0.9.13/test/commands/remove.js new file mode 100644 index 00000000..23bcc489 --- /dev/null +++ b/www/test/0.9.13/test/commands/remove.js @@ -0,0 +1,85 @@ +describe("the remove command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can remove class ref on a single div", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(false); + }); + + it("can remove class ref on a single form", function () { + var form = make("
"); + form.classList.contains("foo").should.equal(true); + form.click(); + form.classList.contains("foo").should.equal(false); + }); + + it("can target another div for class ref", function () { + var bar = make("
"); + var div = make("
"); + bar.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + div.click(); + bar.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + }); + + it("can remove non-class attributes", function () { + var div = make("
"); + div.getAttribute("foo").should.equal("bar"); + div.click(); + div.hasAttribute("foo").should.equal(false); + }); + + it("can remove elements", function () { + var div = make("
"); + assert.isNotNull(div.parentElement); + div.click(); + assert.isNull(div.parentElement); + }); + + it("can remove other elements", function () { + var div = make("
"); + var div2 = make("
"); + assert.isNotNull(div2.parentElement); + div.click(); + assert.isNull(div2.parentElement); + }); + + it("can remove parent element", function () { + var div = make("
"); + var btn = byId("b1"); + assert.isNotNull(div.parentElement); + btn.click(); + assert.isNull(div.parentElement); + }); + + it("can remove multiple class refs", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + div.classList.contains("doh").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.classList.contains("doh").should.equal(true); + }); + + it("can remove query refs from specific things", function () { + var div = make("

foo

bar

doh

"); + var d1 = byId('d1'); + div.innerHTML.includes("foo").should.equal(true); + div.innerHTML.includes("bar").should.equal(true); + div.innerHTML.includes("doh").should.equal(true); + d1.click(); + div.innerHTML.includes("foo").should.equal(false); + div.innerHTML.includes("bar").should.equal(true); + div.innerHTML.includes("doh").should.equal(true); + }); +}); diff --git a/www/test/0.9.13/test/commands/repeat.js b/www/test/0.9.13/test/commands/repeat.js new file mode 100644 index 00000000..28c910c4 --- /dev/null +++ b/www/test/0.9.13/test/commands/repeat.js @@ -0,0 +1,299 @@ +describe("the repeat command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic for loop works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("123"); + }); + + it("basic for loop with null works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal(""); + }); + + it("waiting in for loop works", function (done) { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("1"); + setTimeout(function () { + d1.innerHTML.should.equal("123"); + done(); + }, 50); + }); + + it("basic raw for loop works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("123"); + }); + + it("basic raw for loop works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal(""); + }); + + it("waiting in raw for loop works", function (done) { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("1"); + setTimeout(function () { + d1.innerHTML.should.equal("123"); + done(); + }, 40); + }); + + it("repeat forever works", function () { + make( + "" + + "" + + "
" + ); + var d1 = byId("d1"); + d1.click(); + d1.innerHTML.should.equal("5"); + delete window.repeatForeverWithReturn; + }); + + it("repeat forever works w/o keyword", function () { + make( + "" + + "" + + "
" + ); + var d1 = byId("d1"); + d1.click(); + d1.innerHTML.should.equal("5"); + delete window.repeatForeverWithReturn; + }); + + it("basic in loop works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("123"); + }); + + it("index syntax works", function () { + var d1 = make( + '
" + ); + d1.click(); + d1.innerHTML.should.equal("a0ab1abc2"); + }); + + it("while keyword works", function () { + make( + "" + + "" + + "
" + ); + var d1 = byId("d1"); + d1.click(); + d1.innerHTML.should.equal("5"); + delete window.repeatWhileTest; + }); + + it("until keyword works", function () { + make( + "" + + "" + + "
" + ); + var d1 = byId("d1"); + d1.click(); + d1.innerHTML.should.equal("5"); + delete window.repeatUntilTest; + }); + + it("until event keyword works", function (done) { + var div = make("
"); + make( + "" + + "" + + "" + ); + var promise = repeatUntilTest(); + div.click(); + promise.then(function (value) { + value.should.equal(42); + delete window.repeatUntilTest; + done(); + }); + }); + + it("only executes the init expression once", function () { + make( + "" + + "" + + "
" + ); + var d1 = byId("d1"); + d1.click(); + d1.innerHTML.should.equal("3"); + window.called.should.equal(1); + delete window.getArray; + delete window.called; + }); + + it("can nest loops", function () { + make( + "" + + "" + + "
" + ); + var d1 = byId("d1"); + d1.click(); + d1.innerHTML.should.equal("123246369"); + delete window.sprayInto; + }); + + it("basic times loop works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("aaa"); + }); + + it("times loop with expression works", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("aaaaaa"); + }); + + it("loop continue works", function () { + var d1 = make( + `
`); + d1.click(); + d1.innerHTML.should.equal("success A. success B. success C. expected D. success A. success B. success C. expected D. "); + }); + + it("loop break works", function () { + var d1 = make( + `
`); + d1.click(); + d1.innerHTML.should.equal("ABAB"); + }); +}); diff --git a/www/test/0.9.13/test/commands/send.js b/www/test/0.9.13/test/commands/send.js new file mode 100644 index 00000000..500552cd --- /dev/null +++ b/www/test/0.9.13/test/commands/send.js @@ -0,0 +1,74 @@ +describe("the send command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can send events", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.classList.contains("foo-sent").should.equal(true); + }); + + it("can reference sender in events", function () { + var div = make("
"); + var bar = make("
"); + div.classList.contains("foo-sent").should.equal(false); + div.click(); + console.log(div.classList); + div.classList.contains("foo-sent").should.equal(true); + console.log(div.classList); + }); + + it("can send events with args", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.innerHTML.should.equal("42"); + }); + + it("can send events with dots", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.classList.contains("foo-sent").should.equal(true); + }); + + it("can send events with dots with args", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.innerHTML.should.equal("42"); + }); + + it("can send events with colons", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.classList.contains("foo-sent").should.equal(true); + }); + + it("can send events with colons with args", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.innerHTML.should.equal("42"); + }); + + it("can send events to any expression", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.classList.contains("foo-sent").should.equal(true); + }); +}); diff --git a/www/test/0.9.13/test/commands/set.js b/www/test/0.9.13/test/commands/set.js new file mode 100644 index 00000000..2643cbd9 --- /dev/null +++ b/www/test/0.9.13/test/commands/set.js @@ -0,0 +1,197 @@ +describe("the set command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can set properties", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set indirect properties", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set complex indirect properties lhs", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set complex indirect properties rhs", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set chained indirect properties", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set styles", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can set javascript globals", function () { + try { + var d1 = make("
lolwat
"); + d1.click(); + window["temp"].should.equal("red"); + } finally { + delete window.temp; + } + }); + + it("can set local variables", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set into id ref", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set into class ref", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + d2.innerHTML.should.equal("foo"); + }); + + it("can set into attribute ref", function () { + var d1 = make("
"); + d1.click(); + d1.getAttribute("bar").should.equal("foo"); + }); + + it("can set into indirect attribute ref", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.getAttribute("bar").should.equal("foo"); + }); + + it("can set into indirect attribute ref 2", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.getAttribute("bar").should.equal("foo"); + }); + + it("can set into indirect attribute ref 3", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.getAttribute("bar").should.equal("foo"); + }); + + it("can set into style ref", function () { + var d1 = make("
"); + d1.click(); + d1.style["color"].should.equal("red"); + }); + + it("can set into indirect style ref", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.style["color"].should.equal("red"); + }); + + it("can set into indirect style ref 2", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.style["color"].should.equal("red"); + }); + + it("can set into indirect style ref 3", function () { + var d1 = make("
"); + var d2 = make("
"); + d1.click(); + d2.style["color"].should.equal("red"); + }); + + + it("set waits on promises", function (done) { + window.promiseAString = function () { + return new Promise(function (finish) { + window.finish = finish; + }); + }; + try { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal(""); + finish("foo"); + setTimeout(function () { + d1.innerHTML.should.equal("foo"); + done(); + }, 20); + } finally { + delete window.promiseAString; + delete window.finish; + } + }); + + it("can set many properties at once with object literal", function () { + window.obj = { foo: 1 }; + make("
").click(); + obj.should.deep.equal({ foo: 1, bar: 2, baz: 3 }); + delete window.obj; + }); + + it("can set props w/ array access syntax", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can set props w/ array access syntax and var", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + + it("can set arrays w/ array access syntax", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can set arrays w/ array access syntax and var", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("handles set url regression properly", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.innerText.should.equal("https://yyy.xxxxxx.com/path/out/foo.pdf"); + }); + +}); diff --git a/www/test/0.9.13/test/commands/settle.js b/www/test/0.9.13/test/commands/settle.js new file mode 100644 index 00000000..ae371f80 --- /dev/null +++ b/www/test/0.9.13/test/commands/settle.js @@ -0,0 +1,29 @@ +describe("the settle command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can settle me no transition", function (done) { + var d1 = make("
"); + d1.click(); + d1.classList.contains("foo").should.equal(false); + setTimeout(function () { + d1.classList.contains("foo").should.equal(true); + done(); + }, 1000); + }); + + it("can settle target no transition", function (done) { + var d1 = make("
"); + var d2 = make("
"); + d2.click(); + d1.classList.contains("foo").should.equal(false); + setTimeout(function () { + d1.classList.contains("foo").should.equal(true); + done(); + }, 1000); + }); +}); diff --git a/www/test/0.9.13/test/commands/show.js b/www/test/0.9.13/test/commands/show.js new file mode 100644 index 00000000..4aa831ec --- /dev/null +++ b/www/test/0.9.13/test/commands/show.js @@ -0,0 +1,164 @@ +describe("the show command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can show element, with display:block by default", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("block"); + }); + + it("can show form, with display:block by default", function () { + var form = make("
"); + getComputedStyle(form).display.should.equal("none"); + form.click(); + getComputedStyle(form).display.should.equal("block"); + }); + + it("can show element with display:block explicitly", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("block"); + }); + + it("can show element with custom display value", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("flex"); + }); + + it("can show element with inline-block display value", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("inline-block"); + }); + + it("can show element with opacity:1", function () { + var div = make("
"); + getComputedStyle(div).opacity.should.equal("0"); + div.click(); + getComputedStyle(div).opacity.should.equal("1"); + }); + + it("can show element with opacity style literal", function () { + var div = make("
"); + getComputedStyle(div).opacity.should.equal("0"); + div.click(); + getComputedStyle(div).opacity.should.equal("1"); + }); + + it("can show element, with visibility:visible", function () { + var div = make("
"); + getComputedStyle(div).visibility.should.equal("hidden"); + div.click(); + getComputedStyle(div).visibility.should.equal("visible"); + }); + + it("can show other elements", function () { + var showme = make(""); + var div = make("
"); + getComputedStyle(showme).display.should.equal("none"); + div.click(); + getComputedStyle(showme).display.should.equal("block"); + }); + + it("can show multiple elements with inline-block display value", function () { + var div = make("
"); + var d1 = make(""); + var d2 = make(""); + getComputedStyle(d1).display.should.equal("none"); + getComputedStyle(d2).display.should.equal("none"); + div.click(); + getComputedStyle(d1).display.should.equal("inline-block"); + getComputedStyle(d2).display.should.equal("inline-block"); + }); + + it("can show multiple elements as class with inline-block display value", function () { + var div = make("
"); + var d1 = make(""); + var d2 = make(""); + getComputedStyle(d1).display.should.equal("none"); + getComputedStyle(d2).display.should.equal("none"); + div.click(); + getComputedStyle(d1).display.should.equal("inline-block"); + getComputedStyle(d2).display.should.equal("inline-block"); + }); + + it("can use a when clause to show or hide an element", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + getComputedStyle(div).display.should.equal("block"); + div.click(); + div.classList.contains("foo").should.equal(false); + getComputedStyle(div).display.should.equal("none"); + div.click(); + div.classList.contains("foo").should.equal(true); + getComputedStyle(div).display.should.equal("block"); + }); + + it("can use a when clause and a with clause to show or hide an element", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + getComputedStyle(div).opacity.should.equal("1"); + div.click(); + div.classList.contains("foo").should.equal(false); + getComputedStyle(div).opacity.should.equal("0"); + div.click(); + div.classList.contains("foo").should.equal(true); + getComputedStyle(div).opacity.should.equal("1"); + }); + + it("can filter over a set of elements using the its symbol", function () { + var div = make("
" + + "

foo

" + + "

bar

" + + "

foo

" + + "

doh

" + + "
"); + + var p1 = byId("p1") + var p2 = byId("p2") + var p3 = byId("p3") + var p4 = byId("p4") + + getComputedStyle(p1).display.should.equal("block"); + getComputedStyle(p2).display.should.equal("block"); + getComputedStyle(p3).display.should.equal("block"); + getComputedStyle(p4).display.should.equal("block"); + + div.click(); + + getComputedStyle(p1).display.should.equal("block"); + getComputedStyle(p2).display.should.equal("none"); + getComputedStyle(p3).display.should.equal("block"); + getComputedStyle(p4).display.should.equal("none"); + + + }); + + it("starting off with display none does not stick", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("block"); + div.click(); + getComputedStyle(div).display.should.equal("none"); + }); + +}); diff --git a/www/test/0.9.13/test/commands/take.js b/www/test/0.9.13/test/commands/take.js new file mode 100644 index 00000000..4b637660 --- /dev/null +++ b/www/test/0.9.13/test/commands/take.js @@ -0,0 +1,194 @@ +describe("the take command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can take a class from other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.classList.contains("foo").should.equal(true); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(false); + d2.click(); + d1.classList.contains("foo").should.equal(false); + d2.classList.contains("foo").should.equal(true); + d3.classList.contains("foo").should.equal(false); + }); + + it("can take a class from other forms", function () { + var f1 = make("
"); + var f2 = make("
"); + var f3 = make("
"); + f1.classList.contains("foo").should.equal(true); + f2.classList.contains("foo").should.equal(false); + f3.classList.contains("foo").should.equal(false); + f2.click(); + f1.classList.contains("foo").should.equal(false); + f2.classList.contains("foo").should.equal(true); + f3.classList.contains("foo").should.equal(false); + }); + + it("can take a class for other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.classList.contains("foo").should.equal(true); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(false); + d2.click(); + d1.classList.contains("foo").should.equal(false); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(true); + }); + + it("a parent can take a class for other elements", function () { + var div = make( + "
" + + "
" + + "
" + + "
" + + "
" + ); + var d1 = byId("d1"); + var d2 = byId("d2"); + var d3 = byId("d3"); + d1.classList.contains("foo").should.equal(true); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(false); + d2.click(); + d1.classList.contains("foo").should.equal(false); + d2.classList.contains("foo").should.equal(true); + d3.classList.contains("foo").should.equal(false); + }); + + it("can take an attribute from other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.getAttribute("data-foo").should.equal("bar"); + assert.isNull(d2.getAttribute("data-foo")) + assert.isNull(d3.getAttribute("data-foo")) + d2.click(); + assert.isNull(d1.getAttribute("data-foo")) + d2.getAttribute("data-foo").should.equal(""); + assert.isNull(d3.getAttribute("data-foo")) + }); + + it("can take an attribute with specific value from other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.getAttribute("data-foo").should.equal("bar"); + assert.isNull(d2.getAttribute("data-foo")) + assert.isNull(d3.getAttribute("data-foo")) + d2.click(); + assert.isNull(d1.getAttribute("data-foo")) + d2.getAttribute("data-foo").should.equal("baz"); + assert.isNull(d3.getAttribute("data-foo")) + }); + + it("can take an attribute value from other elements and set specific values instead", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + + d1.getAttribute("data-foo").should.equal("bar"); + assert.isNull(d2.getAttribute("data-foo")) + assert.isNull(d3.getAttribute("data-foo")) + d2.click(); + d1.getAttribute("data-foo").should.equal("qux"); + d2.getAttribute("data-foo").should.equal("baz"); + d3.getAttribute("data-foo").should.equal("qux"); + }); + + it("can take an attribute value from other elements and set value from an expression instead", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + + d1.getAttribute("data-foo").should.equal("bar"); + d2.getAttribute("data-foo").should.equal("qux"); + assert.isNull(d3.getAttribute("data-foo")) + d2.click(); + d1.getAttribute("data-foo").should.equal("qux"); + d2.getAttribute("data-foo").should.equal("baz"); + d3.getAttribute("data-foo").should.equal("qux"); + }); + + it("can take an attribute for other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.getAttribute("data-foo").should.equal("bar"); + assert.isNull(d2.getAttribute("data-foo")) + assert.isNull(d3.getAttribute("data-foo")) + d2.click(); + assert.isNull(d1.getAttribute("data-foo")) + assert.isNull(d2.getAttribute("data-foo")) + d3.getAttribute("data-foo").should.equal(""); + }); + + it("a parent can take an attribute for other elements", function () { + var div = make( + "
" + + "
" + + "
" + + "
" + + "
" + ); + var d1 = byId("d1"); + var d2 = byId("d2"); + var d3 = byId("d3"); + d1.getAttribute("data-foo").should.equal("bar"); + assert.isNull(d2.getAttribute("data-foo")) + assert.isNull(d3.getAttribute("data-foo")) + d2.click(); + assert.isNull(d1.getAttribute("data-foo")) + d2.getAttribute("data-foo").should.equal(""); + assert.isNull(d3.getAttribute("data-foo")) + }); + + it("can take multiple classes from other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.classList.contains("foo").should.equal(true); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(false); + d1.classList.contains("bar").should.equal(false); + d2.classList.contains("bar").should.equal(false); + d3.classList.contains("bar").should.equal(true); + d2.click(); + d1.classList.contains("foo").should.equal(false); + d2.classList.contains("foo").should.equal(true); + d3.classList.contains("foo").should.equal(false); + d1.classList.contains("bar").should.equal(false); + d2.classList.contains("bar").should.equal(true); + d3.classList.contains("bar").should.equal(false); + }); + + it("can take multiple classes from specific element", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.classList.contains("foo").should.equal(true); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(false); + d1.classList.contains("bar").should.equal(true); + d2.classList.contains("bar").should.equal(false); + d3.classList.contains("bar").should.equal(true); + d2.click(); + d1.classList.contains("foo").should.equal(false); + d2.classList.contains("foo").should.equal(true); + d3.classList.contains("foo").should.equal(false); + d1.classList.contains("bar").should.equal(false); + d2.classList.contains("bar").should.equal(true); + d3.classList.contains("bar").should.equal(true); + }); + + +}); diff --git a/www/test/0.9.13/test/commands/tell.js b/www/test/0.9.13/test/commands/tell.js new file mode 100644 index 00000000..710e873c --- /dev/null +++ b/www/test/0.9.13/test/commands/tell.js @@ -0,0 +1,236 @@ +describe("the tell command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("establishes a proper beingTold symbol", function () { + make( + "
" + + "
" + ); + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + + div1.click(); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("bar").should.equal(true); + div2.classList.contains("foo").should.equal(false); + }); + + it("does not overwrite the me symbol", function () { + make( + "
" + + "
" + ); + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + + div1.click(); + + div1.classList.contains("bar").should.equal(true); + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + }); + + it("works with an array", function () { + make( + "

" + + "" + ); + + var div1 = byId("d1"); + var p1 = byId("p1"); + var p2 = byId("p2"); + var div2 = byId("d2"); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(false); + + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + + p1.classList.contains("bar").should.equal(false); + p1.classList.contains("foo").should.equal(false); + + p2.classList.contains("bar").should.equal(false); + p2.classList.contains("foo").should.equal(false); + + div1.click(); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(true); + + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + + p1.classList.contains("bar").should.equal(true); + p1.classList.contains("foo").should.equal(false); + + p2.classList.contains("bar").should.equal(true); + p2.classList.contains("foo").should.equal(false); + }); + + it("restores a proper implicit me symbol", function () { + make( + "
" + + "
" + ); + + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + + div1.click(); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("bar").should.equal(true); + div2.classList.contains("foo").should.equal(false); + }); + + it("ignores null", function () { + make( + "
" + + "
" + ); + + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + + div1.click(); + + div1.classList.contains("bar").should.equal(false); + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("bar").should.equal(false); + div2.classList.contains("foo").should.equal(false); + }); + + it("you symbol represents the thing being told", function () { + make( + "
" + + "
" + ); + + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.classList.contains("bar").should.equal(false); + div2.classList.contains("bar").should.equal(false); + + div1.click(); + + div1.classList.contains("bar").should.equal(false); + div2.classList.contains("bar").should.equal(true); + }); + + it("your symbol represents the thing being told", function () { + make( + "
" + + "
foo
" + ); + + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.innerText.should.equal(""); + div2.innerText.should.equal("foo"); + + div1.click(); + + div1.innerText.should.equal("foo"); + div2.innerText.should.equal("foo"); + }); + + it("attributes refer to the thing being told", function () { + make( + "
" + + "
" + ); + + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.innerText.should.equal(""); + div2.innerText.should.equal(""); + + div1.click(); + + div1.innerText.should.equal("bar"); + div2.innerText.should.equal(""); + }); + + it("yourself attribute also works", function () { + make(`
`); + + var div1 = byId("d1"); + var div2 = byId("d2"); + + div1.innerHTML.should.equal(`
`); + + div1.click(); + + div1.innerHTML.should.equal(""); + }); + + it("tell terminates with a feature", function () { + make(`
`); + + var div1 = byId("d1"); + var div2 = byId("d2"); + var div2 = byId("d3"); + + div1.innerHTML.should.equal(`
`); + + div1.click(); + + div1.innerHTML.should.equal(""); + }); +}); diff --git a/www/test/0.9.13/test/commands/throw.js b/www/test/0.9.13/test/commands/throw.js new file mode 100644 index 00000000..a394e3c5 --- /dev/null +++ b/www/test/0.9.13/test/commands/throw.js @@ -0,0 +1,200 @@ +describe("the throw command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can throw a basic exception", function () { + try { + var script = make( + "" + ); + foo(); + fail("Should have thrown"); + } catch (e) { + e.should.equal("foo"); + } finally { + delete window.foo; + } + }); + + it("can throw an async exception", function (done) { + var script = make( + "" + ); + foo().catch(function (error) { + error.should.equal("foo"); + done(); + }); + delete window.foo; + }); + + it("async exceptions propagate properly", function (done) { + var script = make( + "" + ); + bar().catch(function (error) { + error.should.equal("foo"); + delete window.foo; + delete window.bar; + done(); + }); + }); + + it("async exceptions as throws propagate properly", function (done) { + window.bar = function () { + throw "foo"; + }; + var script = make( + "" + ); + foo().catch(function (error) { + error.should.equal("foo"); + delete window.foo; + delete window.bar; + done(); + }); + }); + + it("exceptions propagate from a worker", function (done) { + var script = make( + "" + ); + window.example.func().catch(function (error) { + assert.equal(error, "foo"); + delete window.example; + done(); + }); + }); + + it("async exceptions propagate from a worker", function (done) { + var script = make( + "" + ); + window.example.func().catch(function (error) { + assert.equal(error, "foo"); + delete window.example; + done(); + }); + }); + + it("exceptions propagate from a worker through a function", function (done) { + var script = make( + "" + ); + foo().catch(function (error) { + assert.equal(error, "foo"); + delete window.example; + delete window.foo; + done(); + }); + }); + + it("exceptions propagate from an async worker through a function", function (done) { + var script = make( + "" + ); + foo().catch(function (error) { + assert.equal(error, "foo"); + delete window.example; + delete window.foo; + done(); + }); + }); + + it("exceptions propagate from an async worker through an async function", function (done) { + var script = make( + "" + ); + foo().catch(function (error) { + assert.equal(error, "foo"); + delete window.example; + delete window.foo; + done(); + }); + }); + + it("can throw inside an event handler", function () { + var d1 = make( + "
' + ); + d1.click(); + d1.innerText.should.equal(""); + }); + + it("can respond to exceptions in an event handler with an event handler", function () { + var d1 = make( + '
" + ); + d1.click(); + d1.innerText.should.equal("foo"); + }); + + it("can respond to async exceptions in an event handler with an event handler", function (done) { + var d1 = make( + '
" + ); + d1.click(); + d1.innerText.should.equal(""); + setTimeout(function () { + d1.innerText.should.equal("foo"); + done(); + }, 10); + }); +}); diff --git a/www/test/0.9.13/test/commands/toggle.js b/www/test/0.9.13/test/commands/toggle.js new file mode 100644 index 00000000..2000df36 --- /dev/null +++ b/www/test/0.9.13/test/commands/toggle.js @@ -0,0 +1,189 @@ +describe("the toggle command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can toggle class ref on a single div", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(false); + }); + + it("can toggle class ref on a single form", function () { + var form = make("
"); + form.classList.contains("foo").should.equal(false); + form.click(); + form.classList.contains("foo").should.equal(true); + form.click(); + form.classList.contains("foo").should.equal(false); + }); + + it("can target another div for class ref toggle", function () { + var bar = make("
"); + var div = make("
"); + bar.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + div.click(); + bar.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + div.click(); + bar.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + }); + + it("can toggle non-class attributes", function () { + var div = make("
"); + div.hasAttribute("foo").should.equal(false); + div.click(); + div.getAttribute("foo").should.equal("bar"); + div.click(); + div.hasAttribute("foo").should.equal(false); + }); + + it("can toggle non-class attributes on selects", function () { + var select = make(""); + select.hasAttribute("foo").should.equal(false); + select.click(); + select.getAttribute("foo").should.equal("bar"); + select.click(); + select.hasAttribute("foo").should.equal(false); + }); + + it("can toggle for a fixed amount of time", function (done) { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + setTimeout(function () { + div.classList.contains("foo").should.equal(false); + done(); + }, 20); + }); + + it("can toggle until an event on another element", function (done) { + var d1 = make("
"); + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + d1.dispatchEvent(new CustomEvent("foo")); + setTimeout(function () { + div.classList.contains("foo").should.equal(false); + done(); + }, 1); + }); + + it("can toggle between two classes", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + }); + + it("can toggle multiple class refs", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(true); + }); + + it("can toggle display", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.click(); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("block"); + }); + + it("can toggle opacity", function () { + var div = make("
"); + getComputedStyle(div).opacity.should.equal("1"); + div.click(); + getComputedStyle(div).opacity.should.equal("0"); + div.click(); + getComputedStyle(div).opacity.should.equal("1"); + }); + + it("can toggle opacity", function () { + var div = make("
"); + getComputedStyle(div).visibility.should.equal("visible"); + div.click(); + getComputedStyle(div).visibility.should.equal("hidden"); + div.click(); + getComputedStyle(div).visibility.should.equal("visible"); + }); + + it("can toggle display w/ my", function () { + var div = make("
"); + getComputedStyle(div).display.should.equal("block"); + div.click(); + getComputedStyle(div).display.should.equal("none"); + div.click(); + getComputedStyle(div).display.should.equal("block"); + }); + + it("can toggle display w/ my", function () { + var div = make("
"); + getComputedStyle(div).opacity.should.equal("1"); + div.click(); + getComputedStyle(div).opacity.should.equal("0"); + div.click(); + getComputedStyle(div).opacity.should.equal("1"); + }); + + it("can toggle display w/ my", function () { + var div = make("
"); + getComputedStyle(div).visibility.should.equal("visible"); + div.click(); + getComputedStyle(div).visibility.should.equal("hidden"); + div.click(); + getComputedStyle(div).visibility.should.equal("visible"); + }); + + it("can toggle display on other elt", function () { + var div = make("
"); + var div2 = make("
"); + getComputedStyle(div2).display.should.equal("block"); + div.click(); + getComputedStyle(div2).display.should.equal("none"); + div.click(); + getComputedStyle(div2).display.should.equal("block"); + }); + + it("can toggle display on other elt", function () { + var div = make("
"); + var div2 = make("
"); + getComputedStyle(div2).opacity.should.equal("1"); + div.click(); + getComputedStyle(div2).opacity.should.equal("0"); + div.click(); + getComputedStyle(div2).opacity.should.equal("1"); + }); + + it("can toggle display on other elt", function () { + var div = make("
"); + var div2 = make("
"); + getComputedStyle(div2).visibility.should.equal("visible"); + div.click(); + getComputedStyle(div2).visibility.should.equal("hidden"); + div.click(); + getComputedStyle(div2).visibility.should.equal("visible"); + }); +}); diff --git a/www/test/0.9.13/test/commands/transition.js b/www/test/0.9.13/test/commands/transition.js new file mode 100644 index 00000000..0a81c8ff --- /dev/null +++ b/www/test/0.9.13/test/commands/transition.js @@ -0,0 +1,194 @@ +describe("the transition command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can transition a single property on current element", function (done) { + var div = make("
"); + div.style.width.should.equal(""); + div.click(); + div.style.width.should.equal("0px"); + setTimeout(function () { + div.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition with parameterized values", function (done) { + var div = make("
"); + div.style.width.should.equal(""); + div.click(); + div.style.width.should.equal("0px"); + setTimeout(function () { + div.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition a single property on form", function (done) { + var form = make("
"); + form.style.width.should.equal(""); + form.click(); + form.style.width.should.equal("0px"); + setTimeout(function () { + form.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition a single property on current element with the my prefix", function (done) { + var div = make("
"); + div.style.width.should.equal(""); + div.click(); + div.style.width.should.equal("0px"); + setTimeout(function () { + div.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition two properties on current element", function (done) { + var div = make("
"); + div.style.width.should.equal(""); + div.style.height.should.equal(""); + div.click(); + div.style.width.should.equal("0px"); + div.style.height.should.equal("0px"); + setTimeout(function () { + div.style.width.should.equal("100px"); + div.style.height.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition on another element", function (done) { + var div = make("
"); + var div2 = make("
"); + div2.style.width.should.equal(""); + div.click(); + div2.style.width.should.equal("0px"); + setTimeout(function () { + div2.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition on another element no element prefix", function (done) { + var div = make("
"); + var div2 = make("
"); + div2.style.width.should.equal(""); + div.click(); + div2.style.width.should.equal("0px"); + setTimeout(function () { + div2.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition on another element no element prefix + possessive", function (done) { + var div = make('
'); + var div2 = make("
"); + div2.style.width.should.equal(""); + div.click(); + div2.style.width.should.equal("0px"); + setTimeout(function () { + div2.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition on another element no element prefix with it", function (done) { + var div = make("
"); + var div2 = make("
"); + div2.style.width.should.equal(""); + div.click(); + div2.style.width.should.equal("0px"); + setTimeout(function () { + div2.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition with a custom transition time", function (done) { + var div = make( + "
" + ); + var div2 = make("
"); + div2.style.width.should.equal(""); + div.click(); + div2.style.width.should.equal("0px"); + setTimeout(function () { + div2.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition with a custom transition time via the over syntax", function (done) { + var div = make("
"); + var div2 = make("
"); + div2.style.width.should.equal(""); + div.click(); + div2.style.width.should.equal("0px"); + setTimeout(function () { + div2.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition a single property on current element using style ref", function (done) { + var div = make("
"); + div.style.width.should.equal(""); + div.click(); + div.style.width.should.equal("0px"); + setTimeout(function () { + div.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition a single property on form using style ref", function (done) { + var form = make("
"); + form.style.width.should.equal(""); + form.click(); + form.style.width.should.equal("0px"); + setTimeout(function () { + form.style.width.should.equal("100px"); + done(); + }, 20); + }); + + it("can transition a single property on current element with the my prefix using style ref", function (done) { + var div = make("
"); + div.style.width.should.equal(""); + div.click(); + div.style.width.should.equal("0px"); + setTimeout(function () { + div.style.width.should.equal("100px"); + done(); + }, 20); + }); + + + it("can use initial to transition to original value", function (done) { + var div = make("
"); + div.style.width.should.equal("10px"); + div.click(); + setTimeout(function () { + div.style.width.should.equal("100px"); + div.click(); + setTimeout(function () { + div.style.width.should.equal("10px"); + done(); + }, 20); + }, 20); + }); + + +}); diff --git a/www/test/0.9.13/test/commands/trigger.js b/www/test/0.9.13/test/commands/trigger.js new file mode 100644 index 00000000..bc2da064 --- /dev/null +++ b/www/test/0.9.13/test/commands/trigger.js @@ -0,0 +1,65 @@ +describe("the trigger command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can trigger events", function () { + var div = make( + "
" + ); + div.classList.contains("foo-set").should.equal(false); + div.click(); + div.classList.contains("foo-set").should.equal(true); + }); + + it("can trigger events with args", function () { + var div = make( + "
" + ); + div.classList.contains("foo-sent").should.equal(false); + div.click(); + div.innerHTML.should.equal("42"); + }); + + it("can trigger events with dots", function () { + var div = make( + "
" + ); + div.classList.contains("foo-set").should.equal(false); + div.click(); + div.classList.contains("foo-set").should.equal(true); + }); + + it("can trigger events with dots with args", function () { + var div = make( + "
" + ); + div.classList.contains("foo-sent").should.equal(false); + div.click(); + div.innerHTML.should.equal("42"); + }); + + it("can trigger events with colons", function () { + var div = make( + "
" + ); + div.classList.contains("foo-set").should.equal(false); + div.click(); + div.classList.contains("foo-set").should.equal(true); + }); + + it("can trigger events with dots with colons", function () { + var div = make( + "
" + ); + div.classList.contains("foo-sent").should.equal(false); + div.click(); + div.innerHTML.should.equal("42"); + }); +}); diff --git a/www/test/0.9.13/test/commands/unlessModifier.js b/www/test/0.9.13/test/commands/unlessModifier.js new file mode 100644 index 00000000..8f239ee0 --- /dev/null +++ b/www/test/0.9.13/test/commands/unlessModifier.js @@ -0,0 +1,25 @@ +describe("the unless command modifier", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("unless modifier can conditionally execute a command", function () { + var div = make("
"); + + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(false); + + div.classList.add("bar"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(false); + }); +}); diff --git a/www/test/0.9.13/test/commands/wait.js b/www/test/0.9.13/test/commands/wait.js new file mode 100644 index 00000000..35bcf547 --- /dev/null +++ b/www/test/0.9.13/test/commands/wait.js @@ -0,0 +1,138 @@ +describe("the wait command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can wait on time", function (finished) { + var div = make( + "
" + ); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + finished(); + }, 30); + }); + + it("can wait on event", function (done) { + var div = make( + "
" + ); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + div.dispatchEvent(new CustomEvent("foo")); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + done(); + }, 10); + }); + + it("waiting on an event sets 'it' to the event", function (done) { + var div = make("
"); + div.click(); + div.innerHTML.should.equal(""); + div.dispatchEvent(new CustomEvent("foo", { detail: "hyperscript is hyper cool" })); + setTimeout(function () { + div.innerHTML.should.equal("hyperscript is hyper cool"); + done(); + }, 10); + }); + + it("can destructure properties in a wait", function (done) { + var div = make("
"); + div.click(); + div.innerHTML.should.equal(""); + div.dispatchEvent(new CustomEvent("foo", { detail: { bar: "bar" } })); + setTimeout(function () { + div.innerHTML.should.equal("bar"); + done(); + }, 10); + }); + + it("can wait on event on another element", function (done) { + var div2 = make("
"); + var div = make( + "
" + ); + + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + + div2.dispatchEvent(new CustomEvent("foo")); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + done(); + }, 10); + }); + + it("can wait on event or timeout 1", function (done) { + var div2 = make("
"); + var div = make( + "
" + ); + + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + + div2.dispatchEvent(new CustomEvent("foo")); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + done(); + }, 10); + }); + + it("can wait on event or timeout 2", function (done) { + var div2 = make("
"); + var div = make( + "
" + ); + + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + + div2.dispatchEvent(new CustomEvent("foo")); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + done(); + }, 10); + }); +}); diff --git a/www/test/0.9.13/test/core/api.js b/www/test/0.9.13/test/core/api.js new file mode 100644 index 00000000..2c454320 --- /dev/null +++ b/www/test/0.9.13/test/core/api.js @@ -0,0 +1,20 @@ +describe("_hyperscript API", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("processNodes does not reinitialize a node already processed", function () { + window.global_int = 0; + var div = make("
"); + window.global_int.should.equal(0); + div.click(); + window.global_int.should.equal(1); + _hyperscript.processNode(div); + div.click(); + window.global_int.should.equal(2); + delete window.global_int; + }); +}); diff --git a/www/test/0.9.13/test/core/bootstrap.js b/www/test/0.9.13/test/core/bootstrap.js new file mode 100644 index 00000000..ea23e556 --- /dev/null +++ b/www/test/0.9.13/test/core/bootstrap.js @@ -0,0 +1,141 @@ +describe("_hyperscript bootstrapping", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("on a single div", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + }); + + it("toggles", function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.click(); + div.classList.contains("foo").should.equal(false); + }); + + it("can target another div", function () { + var bar = make("
"); + var div = make("
"); + bar.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + div.click(); + bar.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + }); + + it("hyperscript can have more than one action ", function () { + var bar = make("
"); + var div = make( + "
" + ); + bar.classList.contains("foo").should.equal(false); + div.classList.contains("foo").should.equal(false); + bar.classList.contains("blah").should.equal(false); + div.classList.contains("blah").should.equal(false); + div.click(); + bar.classList.contains("foo").should.equal(true); + div.classList.contains("foo").should.equal(false); + bar.classList.contains("blah").should.equal(false); + div.classList.contains("blah").should.equal(true); + }); + + it("can wait", function (finished) { + var div = make( + "
" + ); + div.classList.contains("foo").should.equal(false); + div.classList.contains("bar").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(false); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + div.classList.contains("bar").should.equal(true); + finished(); + }, 30); + }); + + it("can change non-class properties", function () { + var div = make("
"); + div.hasAttribute("foo").should.equal(false); + div.click(); + div.getAttribute("foo").should.equal("bar"); + }); + + it("can send events", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.classList.contains("foo-sent").should.equal(true); + }); + + it("can respond to events on other elements", function () { + var bar = make("
"); + var div = make("
"); + div.classList.contains("clicked").should.equal(false); + bar.click(); + div.classList.contains("clicked").should.equal(true); + }); + + it("can take a class from other elements", function () { + var d1 = make("
"); + var d2 = make("
"); + var d3 = make("
"); + d1.classList.contains("foo").should.equal(true); + d2.classList.contains("foo").should.equal(false); + d3.classList.contains("foo").should.equal(false); + d2.click(); + d1.classList.contains("foo").should.equal(false); + d2.classList.contains("foo").should.equal(true); + d3.classList.contains("foo").should.equal(false); + }); + + it("can set properties", function () { + var d1 = make("
"); + d1.click(); + d1.innerHTML.should.equal("foo"); + }); + + it("can set styles", function () { + var d1 = make("
lolwat
"); + d1.click(); + d1.style.color.should.equal("red"); + }); + + it("can send events with args", function () { + var div = make("
"); + var bar = make("
"); + bar.classList.contains("foo-sent").should.equal(false); + div.click(); + bar.innerHTML.should.equal("42"); + }); + + it("can call functions", function () { + var calledWith = null; + window.globalFunction = function (val) { + calledWith = val; + }; + try { + var div = make("
"); + div.click(); + "foo".should.equal(calledWith); + } finally { + delete window.globalFunction; + } + }); +}); diff --git a/www/test/0.9.13/test/core/parser.js b/www/test/0.9.13/test/core/parser.js new file mode 100644 index 00000000..af70223d --- /dev/null +++ b/www/test/0.9.13/test/core/parser.js @@ -0,0 +1,110 @@ +describe("the _hyperscript parser", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic parse error messages work", function () { + var msg = getParseErrorFor("add - to"); + startsWith(msg, "Expected either a class reference or attribute expression"); + }); + + it("continues initializing elements in the presence of a parse error", function () { + var div = make( + "
" + + "
" + + "
" + + "
" + ); + var div2 = byId("d2"); + div2.click(); + div2.innerText.should.equal("clicked"); + }); + + it("can have comments in scripts", function () { + var script = make( + "" + ); + foo().should.equal("foo"); + bar().should.equal("bar"); + delete window.foo; + delete window.bar; + }); + + it("can have comments in attributes", function () { + var div = make( + "
" + ); + div.click(); + div.innerText.should.equal("clicked"); + var div = make( + "
" + ); + div.click(); + div.innerText.should.equal("clicked"); + }); + + it("can have alternate comments in scripts", function () { + var script = make( + "" + ); + foo().should.equal("foo"); + delete window.foo; + }); + + it("can have alternate comments in attributes", function () { + var div = make( + "
" + ); + div.click(); + div.innerText.should.equal("clicked"); + }); + + it("can have alternate multiline comments in scripts", function () { + var script = make( + "" + ); + foo().should.equal("foo"); + delete window.foo; + }); + + it("can have multiline comments in attributes", function () { + var div = make( + "
" + ); + div.click(); + div.innerText.should.equal("clicked"); + }); + + it("can support parenthesized commands and features", function () { + var div = make( + "
' + ); + div.click(); + div.innerText.should.equal("clicked"); + }); +}); diff --git a/www/test/0.9.13/test/core/regressions.js b/www/test/0.9.13/test/core/regressions.js new file mode 100644 index 00000000..c90fc4cf --- /dev/null +++ b/www/test/0.9.13/test/core/regressions.js @@ -0,0 +1,153 @@ +describe("_hyperscript regressions", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can pick detail fields out by name", function () { + var div = make("
"); + var input = make( + "" + ); + div.innerHTML.should.equal(""); + input.value = "foo"; + input.dispatchEvent(new Event("onchange")); + input.value = ""; + input.dispatchEvent(new Event("onchange")); + div.innerHTML.should.equal("foo"); + input.value = "bar"; + input.dispatchEvent(new Event("onchange")); + div.innerHTML.should.equal("bar"); + }); + + it("can trigger htmx events", function () { + var div1 = make("
"); + var div2 = make("
"); + div2.click(); + div1.innerHTML.should.equal("foo"); + }); + + it("can remove class by id", function () { + var form = make("
"); + var div = make("
"); + form.classList.contains("hideme").should.equal(true); + div.click(); + form.classList.contains("hideme").should.equal(false); + }); + + it("can remove by clicks elsewhere", function () { + var div = make("
"); + var div2 = make("
"); + div2.click(); + should.equal(div.parentNode, null); + }); + + it("me and it is properly set when responding to events", function () { + var div2 = make("
"); + var div = make("
"); + div2.click(); + window.me.should.equal(div); + window.it.should.equal(div2); + delete window.me; + delete window.it; + }); + + it("me symbol works in from expressions", function () { + var div = make( + "
" + "
" + "
" + ); + var d1 = byId("d1"); + d1.innerHTML.should.equal(""); + div.click(); + d1.innerHTML.should.equal("Foo"); + }); + + it("can refer to function in init blocks", function (done) { + var div = make( + " " + + "
" + ); + var d1 = byId("d1"); + setTimeout(function(){ + d1.innerHTML.should.equal("here"); + delete foo; + done(); + }, 10) + }); + + it("can create a paragraph tag", function () { + var i1 = make(""); + var d2 = make("
"); + var div = make("
"); + div.click() + d2.innerHTML.should.equal("

foo

"); + }); + + it("async exception", function () { + var div = make("
"); + div.click() + }); + + it("return followed by boundary returns an error", function () { + var msg = getParseErrorFor("return end"); + startsWith(msg, "'return' commands must return a value. If you do not wish to return a value, use 'exit' instead."); + }); + + it("extra chars cause error when evaling", function () { + var msg = getParseErrorFor("1!"); + startsWith(msg, "Unexpected Token : !"); + + msg = getParseErrorFor("return 1!"); + startsWith(msg, "Unexpected Token : !"); + + msg = getParseErrorFor("init set x to 1!"); + startsWith(msg, "Unexpected Token : !"); + }); + + it("string literals can dot-invoked against", function () { + _hyperscript("'foo'.length").should.equal(3); + _hyperscript("`foo`.length").should.equal(3); + _hyperscript("\"foo\".length").should.equal(3); + }); + + it("button query in form", function () { + var form = make("
" + + " " + + "
"); + var btn = byId("b1"); + form.click(); + btn.disabled.should.equal(true); + }); + + it("can invoke functions w/ numbers in name", function () { + window.select2 = function(){ + return "select2"; + } + var btn = make("" + + ""); + var btn = byId("b1"); + form.click(); + btn.innerHTML.should.equal("clicked"); + }); + + + +}); diff --git a/www/test/0.9.13/test/core/runtime.js b/www/test/0.9.13/test/core/runtime.js new file mode 100644 index 00000000..8b475fed --- /dev/null +++ b/www/test/0.9.13/test/core/runtime.js @@ -0,0 +1,142 @@ +describe("the _hyperscript runtime", function () { + it("has proper stack", function () { + var script = make( + "" + ); + var result = foo(); + result.meta.feature.name.should.equal("foo"); + delete window.foo; + delete window.bar; + }); + + it("has proper stack from event handler", function () { + var script = make( + "" + ); + var div = make("
"); + div.click(); + div.innerHTML.should.equal("onFeature"); + delete window.bar; + }); + + it("hypertrace is reasonable", function () { + var script = make( + "" + ); + var div = make("
"); + div.click(); + delete window.bar; + delete window.baz; + }); + + it("hypertrace from javascript is reasonable", function () { + window.baz = function (str) { + throw new Error(str); + }; + var script = make( + "" + ); + var div = make("
"); + div.click(); + delete window.bar; + delete window.baz; + }); + + it("async hypertrace is reasonable", function (done) { + var script = make( + "" + ); + var div = make("
"); + div.click(); + setTimeout(function () { + delete window.bar; + delete window.baz; + done(); + }, 100); + }); + + it("arrays args are handled properly wrt Promises", function (done) { + var script = make( + "" + ); + invokesArrayPromise() + .then(function(result){ + result.foo.should.equal('foo'); + result.bar.should.equal('foo'); + result.baz.should.equal('foo'); + delete window.invokesArrayPromise; + delete window.stringPromise; + done(); + }) + }); + + it("scalar args are handled properly wrt Promises", function (done) { + var script = make( + "" + ); + invokesScalarPromise() + .then(function(result){ + result.should.equal('foo'); + delete window.invokesScalarPromise; + delete window.stringPromise; + done(); + }) + }); +}); diff --git a/www/test/0.9.13/test/core/runtimeErrors.js b/www/test/0.9.13/test/core/runtimeErrors.js new file mode 100644 index 00000000..18ba4c38 --- /dev/null +++ b/www/test/0.9.13/test/core/runtimeErrors.js @@ -0,0 +1,107 @@ +describe("_hyperscript runtime errors", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + function ensureThrows(src, errorMsg) { + try { + _hyperscript(src); + throw Error("'" + src + "' should have thrown an exception but did not"); + } catch (e) { + console.log(e); + e.message.should.equal(errorMsg); + } + } + + it("reports basic function invocation null errors properly", function () { + ensureThrows("x()", "'x' is null"); + ensureThrows("x.y()", "'x' is null"); + ensureThrows("x.y.z()", "'x.y' is null"); + }); + + it("reports basic function invocation null errors properly w/ possessives", function () { + ensureThrows("x's y()", "'x' is null"); + ensureThrows("x's y's z()", "'x's y' is null"); + }); + + it("reports basic function invocation null errors properly w/ of", function () { + ensureThrows("z() of y of x", "'z' is null"); + }); + + it("reports null errors on sets properly", function(){ + ensureThrows("set x's y to true", "'x' is null"); + ensureThrows("set x's @y to true", "'x' is null"); + }) + + it("reports null errors on settle command properly", function(){ + ensureThrows("settle #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on add command properly", function(){ + ensureThrows("add .foo to #doesntExist", "'#doesntExist' is null"); + ensureThrows("add @foo to #doesntExist", "'#doesntExist' is null"); + ensureThrows("add {display:none} to #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on remove command properly", function(){ + ensureThrows("remove .foo from #doesntExist", "'#doesntExist' is null"); + ensureThrows("remove @foo from #doesntExist", "'#doesntExist' is null"); + ensureThrows("remove #doesntExist from #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on toggle command properly", function(){ + ensureThrows("toggle .foo on #doesntExist", "'#doesntExist' is null"); + ensureThrows("toggle between .foo and .bar on #doesntExist", "'#doesntExist' is null"); + ensureThrows("toggle @foo on #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on show command properly", function(){ + ensureThrows("show #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on hide command properly", function(){ + ensureThrows("hide #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on put command properly", function(){ + ensureThrows("put 'foo' into #doesntExist", "'#doesntExist' is null"); + ensureThrows("put 'foo' into #doesntExist's innerHTML", "'#doesntExist' is null"); + ensureThrows("put 'foo' into #doesntExist.innerHTML", "'#doesntExist' is null"); + ensureThrows("put 'foo' before #doesntExist", "'#doesntExist' is null"); + ensureThrows("put 'foo' after #doesntExist", "'#doesntExist' is null"); + ensureThrows("put 'foo' at the start of #doesntExist", "'#doesntExist' is null"); + ensureThrows("put 'foo' at the end of #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on transition command properly", function(){ + ensureThrows("transition #doesntExist's visibility to 0", "'#doesntExist' is null"); + }) + + it("reports null errors on send command properly", function(){ + ensureThrows("send 'foo' to #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on trigger command properly", function(){ + ensureThrows("trigger 'foo' on #doesntExist", "'#doesntExist' is null"); + }) + + it("reports null errors on increment command properly", function(){ + ensureThrows("increment #doesntExist's innerHTML", "'#doesntExist' is null"); + }) + + it("reports null errors on decrement command properly", function(){ + ensureThrows("decrement #doesntExist's innerHTML", "'#doesntExist' is null"); + }) + + it("reports null errors on default command properly", function(){ + ensureThrows("default #doesntExist's innerHTML to 'foo'", "'#doesntExist' is null"); + }) + + it("reports null errors on measure command properly", function(){ + ensureThrows("measure #doesntExist", "'#doesntExist' is null"); + }) + +}); diff --git a/www/test/0.9.13/test/core/scoping.js b/www/test/0.9.13/test/core/scoping.js new file mode 100644 index 00000000..9764ff2f --- /dev/null +++ b/www/test/0.9.13/test/core/scoping.js @@ -0,0 +1,256 @@ +describe("scoping", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("locally scoped variables work", function () { + var div = make( + "
" + ); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + + it("locally scoped variables don't clash with built-in variables", function () { + var div = make( + "
" + ); + div.click(); + // meta should still be the object inside context, not a number + // TODO: Should trying to set 'meta', 'result', etc. throw an exception? + div.getAttribute("out").should.equal("[object Object]"); + }); + + it("locally scoped variables do not span features", function () { + var div = make( + "
" + ); + div.click(); + div.click(); + should.equal(null, div.getAttribute("out")); + }); + + it("element scoped variables work", function () { + var div = make( + "
" + ); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("element scoped variables work w/short syntax", function () { + var div = make( + "
" + ); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("element scoped variables support pseudo-possessive syntax", function () { + var div = make( + '
' + ); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("element scoped variables span features", function () { + var div = make( + "
" + ); + div.click(); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("element scoped variables span features", function () { + var div = make( + "
" + ); + div.click(); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("element scoped variables are local only to element", function () { + var div1 = make( + "
" + + "
" + + "
" + ); + div1.click(); + var div2 = byId("d2"); + div2.click(); + should.equal(null, div1.getAttribute("out")); + should.equal(null, div2.getAttribute("out")); + }); + + it("global scoped variables work", function () { + var div = make( + "
" + ); + div.click(); + div.getAttribute("out").should.equal("10"); + delete window.x + }); + + it("global scoped variables work w/ short syntax", function () { + var div = make( + "
" + ); + div.click(); + div.getAttribute("out").should.equal("10"); + delete window.$x + }); + + it("setting an element scoped variable spans features", function () { + var div = make( + "
" + ); + div.click(); + div.click(); + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("setting a global scoped variable spans features", function () { + var div = make( + "
" + ); + div.click(); + div.click(); + div.click(); + div.getAttribute("out").should.equal("10"); + delete window.x + }); + + it("basic behavior scoping works", function() { + make( + "" + + "" + ); + var div = make("
") + div.click(); + div.getAttribute("out").should.equal("10"); + delete window.Behave; + }); + + it("behavior scoping is at the element level", function() { + make( + "" + + "" + ); + var div = make("
") + div.click(); + div.click(); + div.getAttribute("out").should.equal("20"); + delete window.Behave; + }); + + it("behavior scoping is isolated from the core element scope", function() { + make( + "" + + "" + ); + var div = make("
") + div.click(); + div.click(); + div.click(); + div.click(); + div.getAttribute("out").should.equal("20"); + div.getAttribute("out2").should.equal("1"); + delete window.Behave; + }); + + it("behavior scoping is isolated from other behaviors", function() { + make( + "" + + "" + ); + var div = make("
") + div.click(); + div.click(); + div.click(); + div.click(); + div.getAttribute("out").should.equal("20"); + div.getAttribute("out2").should.equal("1"); + delete window.Behave; + delete window.BehaveTwo; + }); + + it("variables are hoisted", function() { + var div = make("
") + div.click(); + div.getAttribute("out").should.equal("10"); + }); + + it("local variables can override element variables", function() { + var div = make("
") + div.click(); + div.click(); + div.getAttribute("out").should.equal("10"); + div.click(); + div.getAttribute("out").should.equal("20"); + }); + + it("explicit element variable references works", function() { + var div = make("
") + div.click(); + div.click(); + div.getAttribute("out").should.equal("10"); + div.getAttribute("out2").should.equal("20"); + }); + + it("global scoped variables span features", function () { + var div = make( + "
" + ); + div.click(); + div.click(); + delete window.$x; + div.getAttribute("out").should.equal("10"); + }); + + it("set favors local variables over global variables", function() { + window.foo = 12; + var div = make("
") + div.click(); + div.getAttribute("out").should.equal("20"); + window.foo.should.equal(12); + delete window.foo; + }); + + +}); diff --git a/www/test/0.9.13/test/core/security.js b/www/test/0.9.13/test/core/security.js new file mode 100644 index 00000000..542133ab --- /dev/null +++ b/www/test/0.9.13/test/core/security.js @@ -0,0 +1,15 @@ +describe("security options", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("on a single div", function () { + var div = make("
" + "
" + "
"); + var innerDiv = byId("d1"); + innerDiv.click(); + innerDiv.classList.contains("foo").should.equal(false); + }); +}); diff --git a/www/test/0.9.13/test/core/sourceInfo.js b/www/test/0.9.13/test/core/sourceInfo.js new file mode 100644 index 00000000..468ca718 --- /dev/null +++ b/www/test/0.9.13/test/core/sourceInfo.js @@ -0,0 +1,59 @@ +describe("the line info parser", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("debug", function () { + var elt = _hyperscript.parse(""); + elt.sourceFor().should.equal(""); + }); + + it("get source works for expressions", function () { + var elt = _hyperscript.parse("1"); + elt.sourceFor().should.equal("1"); + + elt = _hyperscript.parse("a.b"); + elt.sourceFor().should.equal("a.b"); + elt.root.sourceFor().should.equal("a"); + + elt = _hyperscript.parse("a.b()"); + elt.sourceFor().should.equal("a.b()"); + elt.root.sourceFor().should.equal("a.b"); + elt.root.root.sourceFor().should.equal("a"); + + elt = _hyperscript.parse(""); + elt.sourceFor().should.equal(""); + + elt = _hyperscript.parse("x + y"); + elt.sourceFor().should.equal("x + y"); + elt.lhs.sourceFor().should.equal("x"); + elt.rhs.sourceFor().should.equal("y"); + + elt = _hyperscript.parse("'foo'"); + elt.sourceFor().should.equal("'foo'"); + + elt = _hyperscript.parse(".foo"); + elt.sourceFor().should.equal(".foo"); + + elt = _hyperscript.parse("#bar"); + elt.sourceFor().should.equal("#bar"); + }); + + it("get source works for statements", function () { + var elt = _hyperscript.parse("if true log 'it was true'"); + elt.sourceFor().should.equal("if true log 'it was true'"); + + var elt = _hyperscript.parse("for x in [1, 2, 3] log x then log x end"); + elt.sourceFor().should.equal("for x in [1, 2, 3] log x then log x end"); + }); + + it("get line works for statements", function () { + var elt = _hyperscript.parse("if true\n log 'it was true'\n log 'it was true'"); + elt.lineFor().should.equal("if true"); + elt.trueBranch.lineFor().should.equal(" log 'it was true'"); + elt.trueBranch.next.lineFor().should.equal(" log 'it was true'"); + }); +}); diff --git a/www/test/0.9.13/test/core/tokenizer.js b/www/test/0.9.13/test/core/tokenizer.js new file mode 100644 index 00000000..144ecab7 --- /dev/null +++ b/www/test/0.9.13/test/core/tokenizer.js @@ -0,0 +1,454 @@ +describe("the _hyperscript tokenizer", function () { + it("handles basic token types", function () { + var lexer = _hyperscript.internals.lexer; + + var token = lexer.tokenize("foo").consumeToken(); + token.type.should.equal("IDENTIFIER"); + + var token = lexer.tokenize("1").consumeToken(); + token.type.should.equal("NUMBER"); + + var tokens = lexer.tokenize("1.1"); + var token = tokens.consumeToken(); + token.type.should.equal("NUMBER"); + tokens.hasMore().should.equal(false); + + var tokens = lexer.tokenize("1e6"); + var token = tokens.consumeToken(); + token.type.should.equal("NUMBER"); + tokens.hasMore().should.equal(false); + + var tokens = lexer.tokenize("1e-6"); + var token = tokens.consumeToken(); + token.type.should.equal("NUMBER"); + tokens.hasMore().should.equal(false); + + var tokens = lexer.tokenize("1.1e6"); + var token = tokens.consumeToken(); + token.type.should.equal("NUMBER"); + tokens.hasMore().should.equal(false); + + var tokens = lexer.tokenize("1.1e-6"); + var token = tokens.consumeToken(); + token.type.should.equal("NUMBER"); + tokens.hasMore().should.equal(false); + + var token = lexer.tokenize(".a").consumeToken(); + token.type.should.equal("CLASS_REF"); + + var token = lexer.tokenize("#a").consumeToken(); + token.type.should.equal("ID_REF"); + + var token = lexer.tokenize('"asdf"').consumeToken(); + token.type.should.equal("STRING"); + }); + + it("handles whitespace properly", function () { + var lexer = _hyperscript.internals.lexer; + lexer.tokenize(" ").list.length.should.equal(0); + lexer.tokenize(" asdf").list.length.should.equal(1); + lexer.tokenize(" asdf ").list.length.should.equal(2); + lexer.tokenize("asdf ").list.length.should.equal(2); + lexer.tokenize("\n").list.length.should.equal(0); + lexer.tokenize("\nasdf").list.length.should.equal(1); + lexer.tokenize("\nasdf\n").list.length.should.equal(2); + lexer.tokenize("asdf\n").list.length.should.equal(2); + lexer.tokenize("\r").list.length.should.equal(0); + lexer.tokenize("\rasdf").list.length.should.equal(1); + lexer.tokenize("\rasdf\r").list.length.should.equal(2); + lexer.tokenize("asdf\r").list.length.should.equal(2); + lexer.tokenize("\t").list.length.should.equal(0); + lexer.tokenize("\tasdf").list.length.should.equal(1); + lexer.tokenize("\tasdf\t").list.length.should.equal(2); + lexer.tokenize("asdf\t").list.length.should.equal(2); + }); + + it("handles comments properly", function () { + var lexer = _hyperscript.internals.lexer; + lexer.tokenize("--").list.length.should.equal(0); + lexer.tokenize("asdf--").list.length.should.equal(1); + lexer.tokenize("-- asdf").list.length.should.equal(0); + lexer.tokenize("--\nasdf").list.length.should.equal(1); + lexer.tokenize("--\nasdf--").list.length.should.equal(1); + lexer.tokenize("---asdf").list.length.should.equal(0); + lexer.tokenize("----\n---asdf").list.length.should.equal(0); + lexer.tokenize("----asdf----").list.length.should.equal(0); + lexer.tokenize("---\nasdf---").list.length.should.equal(1); + lexer.tokenize("// asdf").list.length.should.equal(0); + lexer.tokenize("///asdf").list.length.should.equal(0); + lexer.tokenize("asdf//").list.length.should.equal(1); + lexer.tokenize("asdf\n//").list.length.should.equal(2); + lexer.tokenize("/**/asdf").list.length.should.equal(1); + lexer.tokenize("/* asdf */").list.length.should.equal(0); + lexer.tokenize("/**asdf**/").list.length.should.equal(0); + lexer.tokenize("/*\nasdf\n*/").list.length.should.equal(0); + lexer.tokenize("asdf/*\n*/").list.length.should.equal(1); + }); + + it("handles class identifiers properly", function () { + var lexer = _hyperscript.internals.lexer; + + var token = lexer.tokenize(".a").consumeToken(); + token.type.should.equal("CLASS_REF"); + token.value.should.equal(".a"); + + var token = lexer.tokenize(" .a").consumeToken(); + token.type.should.equal("CLASS_REF"); + token.value.should.equal(".a"); + + var token = lexer.tokenize("a.a").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("(a).a").list[4]; + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("{a}.a").list[4]; + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("[a].a").list[4]; + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("(a(.a").list[3]; + token.type.should.equal("CLASS_REF"); + token.value.should.equal(".a"); + + var token = lexer.tokenize("{a{.a").list[3]; + token.type.should.equal("CLASS_REF"); + token.value.should.equal(".a"); + + var token = lexer.tokenize("[a[.a").list[3]; + token.type.should.equal("CLASS_REF"); + token.value.should.equal(".a"); + }); + + it("handles id references properly", function () { + var lexer = _hyperscript.internals.lexer; + + var token = lexer.tokenize("#a").consumeToken(); + token.type.should.equal("ID_REF"); + token.value.should.equal("#a"); + + var token = lexer.tokenize(" #a").consumeToken(); + token.type.should.equal("ID_REF"); + token.value.should.equal("#a"); + + var token = lexer.tokenize("a#a").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("(a)#a").list[4]; + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("{a}#a").list[4]; + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("[a]#a").list[4]; + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("a"); + + var token = lexer.tokenize("(a(#a").list[3]; + token.type.should.equal("ID_REF"); + token.value.should.equal("#a"); + + var token = lexer.tokenize("{a{#a").list[3]; + token.type.should.equal("ID_REF"); + token.value.should.equal("#a"); + + var token = lexer.tokenize("[a[#a").list[3]; + token.type.should.equal("ID_REF"); + token.value.should.equal("#a"); + }); + + it("handles identifiers properly", function () { + var lexer = _hyperscript.internals.lexer; + + var token = lexer.tokenize("foo").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("foo"); + + var token = lexer.tokenize(" foo ").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("foo"); + + var tokens = lexer.tokenize(" foo bar"); + var token = tokens.consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("foo"); + + var token = tokens.consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("bar"); + + var tokens = lexer.tokenize(" foo\n-- a comment\n bar"); + var token = tokens.consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("foo"); + + var token = tokens.consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("bar"); + }); + + it("handles identifiers with numbers properly", function () { + var lexer = _hyperscript.internals.lexer; + + var token = lexer.tokenize("f1oo").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("f1oo"); + + var token = lexer.tokenize("fo1o").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("fo1o"); + + var token = lexer.tokenize("foo1").consumeToken(); + token.type.should.equal("IDENTIFIER"); + token.value.should.equal("foo1"); + + }); + + it("handles numbers properly", function () { + var lexer = _hyperscript.internals.lexer; + + var token = lexer.tokenize("1").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1"); + + var token = lexer.tokenize("1.1").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1.1"); + + var token = lexer.tokenize("1234567890.1234567890").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1234567890.1234567890"); + + var token = lexer.tokenize("1e6").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1e6"); + + var token = lexer.tokenize("1e-6").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1e-6"); + + var token = lexer.tokenize("1.1e6").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1.1e6"); + + var token = lexer.tokenize("1.1e-6").consumeToken(); + token.type.should.equal("NUMBER"); + token.value.should.equal("1.1e-6"); + + var tokens = lexer.tokenize("1.1.1").list; + tokens[0].type.should.equal("NUMBER"); + tokens[1].type.should.equal("PERIOD"); + tokens[2].type.should.equal("NUMBER"); + tokens.length.should.equal(3); + }); + + it("handles strings properly", function () { + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize('"foo"').consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal("foo"); + + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize('"fo\'o"').consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal("fo'o"); + + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize('"fo\\"o"').consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal('fo"o'); + + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize("'foo'").consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal("foo"); + + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize("'fo\"o'").consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal('fo"o'); + + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize("'fo\\'o'").consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal("fo'o"); + + try { + lexer.tokenize("'").consumeToken(); + } catch (e) { + e.message.indexOf("Unterminated string").should.equal(0); + } + + try { + lexer.tokenize('"').consumeToken(); + } catch (e) { + e.message.indexOf("Unterminated string").should.equal(0); + } + }); + + it("handles all special escapes properly", function () { + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize('"\\b"').consumeToken(); + token.value.should.equal("\b"); + + token = lexer.tokenize('"\\f"').consumeToken(); + token.value.should.equal("\f"); + + token = lexer.tokenize('"\\n"').consumeToken(); + token.value.should.equal("\n"); + + token = lexer.tokenize('"\\r"').consumeToken(); + token.value.should.equal("\r"); + + token = lexer.tokenize('"\\t"').consumeToken(); + token.value.should.equal("\t"); + + token = lexer.tokenize('"\\v"').consumeToken(); + token.value.should.equal("\v"); + }); + + it("handles hex escapes properly", function () { + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize('"\\x1f"').consumeToken(); + token.value.should.equal("\x1f"); + + token = lexer.tokenize('"\\x41"').consumeToken(); + token.value.should.equal("A"); + + token = lexer.tokenize('"\\x41\\x61"').consumeToken(); + token.value.should.equal("Aa"); + + try { + lexer.tokenize('"\\x"').consumeToken(); + } catch (e) { + e.message.indexOf("Invalid hexadecimal escape").should.equal(0); + } + + try { + lexer.tokenize('"\\xGG"').consumeToken(); + } catch (e) { + e.message.indexOf("Invalid hexadecimal escape").should.equal(0); + } + + try { + lexer.tokenize('"\\1H"').consumeToken(); + } catch (e) { + e.message.indexOf("Invalid hexadecimal escape").should.equal(0); + } + + try { + lexer.tokenize('"\\x4"').consumeToken(); + } catch (e) { + e.message.indexOf("Invalid hexadecimal escape").should.equal(0); + } + }); + + it("handles strings properly 2", function () { + var lexer = _hyperscript.internals.lexer; + var token = lexer.tokenize("'foo'").consumeToken(); + token.type.should.equal("STRING"); + token.value.should.equal("foo"); + }); + + it("handles operators properly", function () { + var lexer = _hyperscript.internals.lexer; + + var optable = { + "+": "PLUS", + "-": "MINUS", + "*": "MULTIPLY", + ".": "PERIOD", + "\\": "BACKSLASH", + ":": "COLON", + "%": "PERCENT", + "|": "PIPE", + "!": "EXCLAMATION", + "?": "QUESTION", + "#": "POUND", + "&": "AMPERSAND", + ";": "SEMI", + ",": "COMMA", + "(": "L_PAREN", + ")": "R_PAREN", + "<": "L_ANG", + ">": "R_ANG", + "{": "L_BRACE", + "}": "R_BRACE", + "[": "L_BRACKET", + "]": "R_BRACKET", + "=": "EQUALS", + "<=": "LTE_ANG", + ">=": "GTE_ANG", + "==": "EQ", + "===": "EQQ", + }; + + Object.keys(optable).forEach(function (key) { + var consumeToken = lexer.tokenize(key).consumeToken(); + consumeToken.op.should.equal(true); + consumeToken.value.should.equal(key); + }); + }); + + it("handles look ahead property", function () { + var lexer = _hyperscript.internals.lexer; + var tokenize = lexer.tokenize("a 1 + 1"); + tokenize.token(0).value.should.equal("a"); + tokenize.token(1).value.should.equal("1"); + tokenize.token(2).value.should.equal("+"); + tokenize.token(3).value.should.equal("1"); + tokenize.token(4).value.should.equal("<<>>"); + }); + + it("handles template bootstrap properly", function () { + var lexer = _hyperscript.internals.lexer; + var tokenize = lexer.tokenize('"', true); + tokenize.token(0).value.should.equal('"'); + + var tokenize = lexer.tokenize('"$', true); + tokenize.token(0).value.should.equal('"'); + tokenize.token(1).value.should.equal("$"); + + var tokenize = lexer.tokenize('"${', true); + tokenize.token(0).value.should.equal('"'); + tokenize.token(1).value.should.equal("$"); + tokenize.token(2).value.should.equal("{"); + + var tokenize = lexer.tokenize('"${"asdf"', true); + tokenize.token(0).value.should.equal('"'); + tokenize.token(1).value.should.equal("$"); + tokenize.token(2).value.should.equal("{"); + tokenize.token(3).value.should.equal("asdf"); + + var tokenize = lexer.tokenize('"${"asdf"}"', true); + tokenize.token(0).value.should.equal('"'); + tokenize.token(1).value.should.equal("$"); + tokenize.token(2).value.should.equal("{"); + tokenize.token(3).value.should.equal("asdf"); + tokenize.token(4).value.should.equal("}"); + tokenize.token(5).value.should.equal('"'); + }); + + it("handles $ in template properly", function () { + var lexer = _hyperscript.internals.lexer; + var tokenize = lexer.tokenize('"', true); + tokenize.token(0).value.should.equal('"'); + }); + + it("string interpolation isnt surprising", function () { + clearWorkArea(); + var div = make( '
'); + div.click(); + div.innerHTML.should.equal("test${x} test 42 test$x test 42 test $x test ${x} test42 test_42 test_42 test-42 test.42"); + clearWorkArea(); + }); + +}); diff --git a/www/test/0.9.13/test/eventSource/scratch.html b/www/test/0.9.13/test/eventSource/scratch.html new file mode 100644 index 00000000..bf053636 --- /dev/null +++ b/www/test/0.9.13/test/eventSource/scratch.html @@ -0,0 +1,117 @@ + + + + + + + + + + + Server Sent Events Playground +
+ + +
+ +
+ + +
+ +

Static Channel

+
Waiting...
+ +

First Channel

+
Waiting...
+ +

Second Channel

+
Waiting...
+ +

Third Channel

+
Waiting...
+ +

Fourth Channel

+
Waiting...
+ +

Fifth Channel

+
Waiting...
+ +

As JSON

+
Name: ...
+
Username: ...
+
Email:
+ + diff --git a/www/test/0.9.13/test/expressions/arrayIndex.js b/www/test/0.9.13/test/expressions/arrayIndex.js new file mode 100644 index 00000000..5f2aab43 --- /dev/null +++ b/www/test/0.9.13/test/expressions/arrayIndex.js @@ -0,0 +1,119 @@ +describe("array index operator", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can create an array literal", function () { + var result = evalHyperScript("[1, 2, 3]"); + result.should.deep.equal([1, 2, 3]); + }); + + it("can index an array value at the beginning of the array", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("10"); + }); + + it("can index an array value in the middle of the array", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("20"); + }); + + it("can index an array value at the end of the array", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("30"); + }); + + it("can index an array value", function () { + var d1 = make( + "
" + ); + d1.click(); + d1.innerHTML.should.equal("10"); + }); + + it("can index an array value with an expression", function () { + var d1 = make( + '
' + ); + d1.click(); + d1.innerHTML.should.equal("C"); + }); + + it("can get the range of first values in an array", function () { + var d1 = make(`
`); + d1.click(); + d1.innerHTML.should.equal("0,1,2,3"); + }); + + it("can get the range of middle values in an array", function () { + var d1 = make( + `
` + ); + d1.click(); + d1.innerHTML.should.equal("2,3"); + }); + + it("can get the range of middle values in an array WITHOUT EXTRA SPACES", function () { + var d1 = make( + `
` + ); + d1.click(); + d1.innerHTML.should.equal("2,3"); + }); + + it("can get the range of middle values in an array using an expression", function () { + var d1 = make( + `
` + ); + d1.click(); + d1.innerHTML.should.equal("2,3,4"); + }); + + it("can get the range of last values in an array", function () { + var d1 = make( + `
` + ); + d1.click(); + d1.innerHTML.should.equal("3,4,5"); + }); + + it("can get the range of last values in an array WITHOUT EXTRA SPACES", function () { + var d1 = make(`
`); + d1.click(); + d1.innerHTML.should.equal("3,4,5"); + }); + + it("errors when index exceeds array length", function () { + var d1 = make( + "
" + ); + try { + d1.click(); + } catch (e) { + console.log(e); + } + }); + + it("errors when indexed value is not an array", function () { + var d1 = make( + "
" + ); + try { + d1.click(); + } catch (e) { + console.log(e); + } + }); +}); diff --git a/www/test/0.9.13/test/expressions/arrayLiteral.js b/www/test/0.9.13/test/expressions/arrayLiteral.js new file mode 100644 index 00000000..04c1a3f3 --- /dev/null +++ b/www/test/0.9.13/test/expressions/arrayLiteral.js @@ -0,0 +1,16 @@ +describe("the arrayLiteral expression", function () { + it("empty array literals work", function () { + var result = evalHyperScript("[]"); + result.should.deep.equal([]); + }); + + it("one element array literal works", function () { + var result = evalHyperScript("[true]"); + result.should.deep.equal([true]); + }); + + it("multi element array literal works", function () { + var result = evalHyperScript("[true, false]"); + result.should.deep.equal([true, false]); + }); +}); diff --git a/www/test/0.9.13/test/expressions/asExpression.js b/www/test/0.9.13/test/expressions/asExpression.js new file mode 100644 index 00000000..18d55c0a --- /dev/null +++ b/www/test/0.9.13/test/expressions/asExpression.js @@ -0,0 +1,342 @@ +describe("as operator", function () { + it("converts null as null", function () { + var result = evalHyperScript("null as String"); + should.equal(result, null); + }); + + it("converts value as String", function () { + var result = evalHyperScript("10 as String"); + result.should.equal("10"); + var result = evalHyperScript("true as String"); + result.should.equal("true"); + }); + + it("converts value as Int", function () { + var result = evalHyperScript("'10' as Int"); + result.should.equal(10); + + var result = evalHyperScript("'10.4' as Int"); + result.should.equal(10); + }); + + it("converts value as Float", function () { + var result = evalHyperScript("'10' as Float"); + result.should.equal(10); + + var result = evalHyperScript("'10.4' as Float"); + result.should.equal(10.4); + }); + + it("converts value as Fixed", function () { + var result = evalHyperScript("'10.4' as Fixed"); + result.should.equal('10'); + + var result = evalHyperScript("'10.4899' as Fixed:2"); + result.should.equal('10.49'); + }); + + it("converts value as Number", function () { + var result = evalHyperScript("'10' as Number"); + result.should.equal(10); + + var result = evalHyperScript("'10.4' as Number"); + result.should.equal(10.4); + }); + + it("converts value as Date", function () { + var result = evalHyperScript("1 as Date"); + result.getTime().should.equal(new Date(1).getTime()); + }); + + it("can use the a modifier if you like ", function () { + var result = evalHyperScript("1 as a Date"); + result.getTime().should.equal(new Date(1).getTime()); + }); + + it("converts value as JSON", function () { + var result = evalHyperScript("{foo:'bar'} as JSON"); + result.should.equal('{"foo":"bar"}'); + }); + + it("converts string as Object", function () { + var result = evalHyperScript('\'{"foo":"bar"}\' as Object'); + result["foo"].should.equal("bar"); + }); + + it("can use the an modifier if you'd like ", function () { + var result = evalHyperScript('\'{"foo":"bar"}\' as an Object'); + result["foo"].should.equal("bar"); + }); + + it("converts value as Object", function () { + var result = evalHyperScript("x as Object", { locals: { x: { foo: "bar" } } }); + result["foo"].should.equal("bar"); + }); + + it("converts an input element into Values", function () { + var node = document.createElement("input"); + node.name = "test-name"; + node.value = "test-value"; + + var result = evalHyperScript("x as Values", { locals: { x: node } }); + result["test-name"].should.equal("test-value"); + }); + + it("converts a form element into Values", function () { + var node = document.createElement("form"); + node.innerHTML = ` +
+
+
+ + +
`; + + var result = evalHyperScript("x as Values", { locals: { x: node } }); + result.firstName.should.equal("John"); + result.lastName.should.equal("Connor"); + result.areaCode.should.equal("213"); + result.phone.should.equal("555-1212"); + }); + + it("converts a query selector into Values", function () { + var d1 = make(`
`); + + d1.innerHTML = ` +
+
+ + + `; + + d1.click(); + + d1.customData.firstName.should.equal("John"); + d1.customData.lastName.should.equal("Connor"); + d1.customData.areaCode.should.equal("213"); + should.not.exist(d1.customData.phone); + }); + + it("converts radio buttons into a Value correctly", function () { + var node = document.createElement("form"); + node.innerHTML = ` +
+ + + +
`; + + var result = evalHyperScript("x as Values", { locals: { x: node } }); + result.gender.should.equal("Male"); + }); + + it("converts checkboxes into a Value correctly", function () { + var node = document.createElement("form"); + node.innerHTML = ` +
+ + + +
`; + + var result = evalHyperScript("x as Values", { locals: { x: node } }); + result.gender[0].should.equal("Male"); + result.gender[1].should.equal("Female"); + result.gender[2].should.equal("Other"); + }); + + it("converts multiple selects into a Value correctly", function () { + var node = document.createElement("form"); + node.innerHTML = ` +
+
+ +
+ + Works with Textareas + + + Works with Single Select Boxes + + + Works with Multi-Select Boxes + + + Works with Radio Buttons + + + + Works with Checkboxes + + + + `; + + var result = evalHyperScript("x as Values", { locals: { x: node } }); + result.firstName.should.equal("John"); + result.lastName.should.equal("Connor"); + result.phone.should.equal("555-1212"); + result.aboutMe.should.equal("It began on a warm summer day in 1969..."); + result.animal.should.equal("dog"); + result.spiritAnimal[0].should.equal("dog"); + result.spiritAnimal[1].should.equal("raccoon"); + result.coolOrNaw.should.equal("Cool"); + result.gender[0].should.equal("Male"); + result.gender[1].should.equal("Female"); + result.gender[2].should.equal("Other"); + }); + + it("converts an element into HTML", function () { + var d1 = document.createElement("div"); + d1.id = "myDiv"; + d1.innerText = "With Text"; + + var result = evalHyperScript("d as HTML", { locals: { d: d1 } }); + result.should.equal(`
With Text
`); + }); + + it("converts a NodeList into HTML", function () { + var fragment = document.createDocumentFragment(); + + { + var d = document.createElement("div"); + d.id = "first"; + d.innerText = "With Text"; + fragment.appendChild(d); + } + + { + var d = document.createElement("span"); + d.id = "second"; + fragment.appendChild(d); + } + + { + var d = document.createElement("i"); + d.id = "third"; + fragment.appendChild(d); + } + + var result = evalHyperScript("nodeList as HTML", { + locals: { nodeList: fragment.childNodes, } + }); + result.should.equal(`
With Text
`); + }); + + it("converts an array into HTML", function () { + var d1 = ["this-", "is-", "html"]; + + var result = evalHyperScript("d as HTML", { locals: { d: d1 } }); + result.should.equal(`this-is-html`); + }); + + it("converts numbers things 'HTML'", function () { + var value = 123; + + var result = evalHyperScript("value as HTML", { locals: { value: value } }); + result.should.equal("123"); + }); + + it("converts strings into fragments", function () { + var value = "

"; + + var result = evalHyperScript("value as Fragment", { locals: { value: value } }); + result.childElementCount.should.equal(1); + result.firstChild.tagName.should.equal("P"); + }); + + it("converts elements into fragments", function () { + var value = document.createElement("p"); + + var result = evalHyperScript("value as Fragment", { locals: { value: value } }); + result.childElementCount.should.equal(1); + result.firstChild.tagName.should.equal("P"); + }); + + it("converts arrays into fragments", function () { + var value = [document.createElement("p"), "

"]; + + var result = evalHyperScript("value as Fragment", { locals: { value: value } }); + result.childElementCount.should.equal(2); + result.firstChild.tagName.should.equal("P"); + result.lastChild.tagName.should.equal("P"); + }); + + it("can accept custom conversions", function () { + _hyperscript.config.conversions["Foo"] = function (val) { + return "foo" + val; + }; + var result = evalHyperScript("1 as Foo"); + result.should.equal("foo1"); + delete _hyperscript.config.conversions.Foo; + }); + + it("can accept custom dynamic conversions", function () { + let myConversion = function (conversion, val) { + if (conversion.indexOf("Foo:") === 0) { + var arg = conversion.split(":")[1]; + return arg + val; + } + }; + _hyperscript.config.conversions.dynamicResolvers.push(myConversion); + var result = evalHyperScript("1 as Foo:Bar"); + result.should.equal("Bar1"); + _hyperscript.config.conversions.dynamicResolvers.pop(); + }); + + it("converts a form element into Values JSON", function () { + var node = document.createElement("form"); + node.innerHTML = ` +
+
+
+ + +
`; + + var result = evalHyperScript("x as Values:JSON", { locals: { x: node } }); + result.should.equal('{"firstName":"John","lastName":"Connor","areaCode":"213","phone":"555-1212"}'); + }); + + it("converts a form element into Values Form Data", function () { + var node = document.createElement("form"); + node.innerHTML = ` +
+
+
+ + +
`; + + var result = evalHyperScript("x as Values:Form", { locals: { x: node } }); + result.should.equal('firstName=John&lastName=Connor&areaCode=213&phone=555-1212'); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/async.js b/www/test/0.9.13/test/expressions/async.js new file mode 100644 index 00000000..b66bd662 --- /dev/null +++ b/www/test/0.9.13/test/expressions/async.js @@ -0,0 +1,29 @@ +describe("the async expression works", function () { + it("simple async expression works", function () { + var result = evalHyperScript("(async 1)"); + result.value.should.deep.equal(1); + }); + + it("async argument works w/ non-async value", function () { + var val = null; + window.func = function (x) { + val = x; + }; + var result = evalHyperScript("func(async 1)"); + val.should.equal(1); + delete window.func; + }); + + it("async argument works w/ async value", function (done) { + var val = null; + window.func = function (x) { + val = x; + }; + var result = evalHyperScript("func(async promiseAnIntIn(10))"); + val.then(function (i) { + i.should.equal(42); + delete window.func; + done(); + }); + }); +}); diff --git a/www/test/0.9.13/test/expressions/attributeRef.js b/www/test/0.9.13/test/expressions/attributeRef.js new file mode 100644 index 00000000..02d9c10e --- /dev/null +++ b/www/test/0.9.13/test/expressions/attributeRef.js @@ -0,0 +1,142 @@ +describe("the attributeRef expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("attributeRef with no value works", function () { + var div = make("
"); + var value = _hyperscript("[@foo]", { me: div }); + value.should.equal("c1"); + }); + + it("attributeRef with dashes name works", function () { + var div = make("
"); + var value = _hyperscript("[@data-foo]", { me: div }); + value.should.equal("c1"); + }); + + it("attributeRef can be set as symbol", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can have value used in add commands", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can have value in quotes used in add commands", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can have value in quotes with spaces used in add commands", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue green"); + }); + + it("attributeRef can be set as prop", function () { + var div = make("
"); + var value = _hyperscript("set x[@data-foo] to 'blue'", { locals: { x: div } }); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be set through possessive", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be set indirectly", function () { + var div = make("
"); + var value = _hyperscript("set [@data-foo] of x to 'blue'", { locals: { x: div } }); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be put indirectly", function () { + var div = make("
"); + var value = _hyperscript("put 'blue' into x[@data-foo]", { locals: { x: div } }); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be put as symbol", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef with no value works w/ short syntax", function () { + var div = make("
"); + var value = _hyperscript("@foo", { me: div }); + value.should.equal("c1"); + }); + + it("attributeRef with dashes name works w/ short syntax", function () { + var div = make("
"); + var value = _hyperscript("@data-foo", { me: div }); + value.should.equal("c1"); + }); + + it("attributeRef can be set as symbol w/ short syntax", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be set as prop w/ short syntax", function () { + var div = make("
"); + var value = _hyperscript("set x@data-foo to 'blue'", { locals: { x: div } }); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be set through possessive w/ short syntax", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be set indirectly w/ short syntax", function () { + var div = make("
"); + var value = _hyperscript("set @data-foo of x to 'blue'", { locals: { x: div } }); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be put indirectly w/ short syntax", function () { + var div = make("
"); + var value = _hyperscript("put 'blue' into x@data-foo", { locals: { x: div } }); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can be put as symbol w/ short syntax", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can have value used in add commands w/ short syntax", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can have value in quotes used in add commands w/ short syntax", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue"); + }); + + it("attributeRef can have value in quotes with spaces used in add commands w/ short syntax", function () { + var div = make("
"); + div.click(); + div.getAttribute("data-foo").should.equal("blue green"); + }); + + +}); diff --git a/www/test/0.9.13/test/expressions/beep!.js b/www/test/0.9.13/test/expressions/beep!.js new file mode 100644 index 00000000..047bdf44 --- /dev/null +++ b/www/test/0.9.13/test/expressions/beep!.js @@ -0,0 +1,69 @@ +describe("the beep! expression", function () { + + function withFakeLog(func) { + var log = window.console.log; + window.console.log = function(){ + log.apply(window.console, arguments); + window.console.log.lastLog = Array.from(arguments); + } + try { + func(); + } finally { + window.console.log = log; + } + } + + it("beeps a basic value", function () { + withFakeLog(function(){ + let div = make("
"); + div.click() + console.log.lastLog.should.deep.equal(['///_ BEEP! The expression (10) evaluates to:', 10, 'of type Number' ]); + }) + }); + + it("beeps a null value", function () { + withFakeLog(function(){ + let div = make("
"); + div.click() + console.log.lastLog.should.deep.equal(['///_ BEEP! The expression (null) evaluates to:', null, 'of type object (null)' ]); + }) + }); + + it("beeps a formatted string value", function () { + withFakeLog(function(){ + let div = make("
"); + div.click() + console.log.lastLog.should.deep.equal(['///_ BEEP! The expression (\"foo\") evaluates to:', "\"foo\"", 'of type String' ]); + }) + }); + + it("beeps the result of an ElementCollection", function () { + var lastLog = null; + withFakeLog(function(){ + let div = make("
"); + div.click() + lastLog = console.log.lastLog; + console.log.lastLog.should.deep.equal(['///_ BEEP! The expression (.foo) evaluates to:', [div], 'of type ElementCollection' ]); + }) + console.log(lastLog); + }); + + it("can be cancelled", function () { + withFakeLog(function(){ + let div = make("
"); + div.click() + should.equal(console.log.lastLog, undefined); + }) + }); + + it("can capture information from event", function () { + withFakeLog(function(){ + let div = make("
"); + div.click() + div.getAttribute("data-value").should.equal("foo"); + }) + }); + +}); diff --git a/www/test/0.9.13/test/expressions/blockLiteral.js b/www/test/0.9.13/test/expressions/blockLiteral.js new file mode 100644 index 00000000..7c672e63 --- /dev/null +++ b/www/test/0.9.13/test/expressions/blockLiteral.js @@ -0,0 +1,21 @@ +describe("the blockLiteral expression", function () { + it("basic block literals work", function () { + var result = evalHyperScript("\\-> true"); + result().should.equal(true); + }); + + it("basic identity works", function () { + var result = evalHyperScript("\\ x -> x"); + result(true).should.equal(true); + }); + + it("basic two arg identity works", function () { + var result = evalHyperScript("\\ x, y -> y"); + result(false, true).should.equal(true); + }); + + it("can map an array", function () { + var result = evalHyperScript("['a', 'ab', 'abc'].map(\\ s -> s.length )"); + result.should.deep.equal([1, 2, 3]); + }); +}); diff --git a/www/test/0.9.13/test/expressions/boolean.js b/www/test/0.9.13/test/expressions/boolean.js new file mode 100644 index 00000000..bafd2a2d --- /dev/null +++ b/www/test/0.9.13/test/expressions/boolean.js @@ -0,0 +1,11 @@ +describe("the boolean literal expression", function () { + it("true boolean literals work", function () { + var result = evalHyperScript("true"); + result.should.equal(true); + }); + + it("false boolean literals work", function () { + var result = evalHyperScript("false"); + result.should.equal(false); + }); +}); diff --git a/www/test/0.9.13/test/expressions/classRef.js b/www/test/0.9.13/test/expressions/classRef.js new file mode 100644 index 00000000..de8939f5 --- /dev/null +++ b/www/test/0.9.13/test/expressions/classRef.js @@ -0,0 +1,50 @@ +describe("the classRef expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic classRef works", function () { + var div = make("
"); + var value = evalHyperScript(".c1"); + Array.from(value)[0].should.equal(div); + }); + + it("basic classRef works w no match", function () { + var value = evalHyperScript(".badClassThatDoesNotHaveAnyElements"); + Array.from(value).length.should.equal(0); + }); + + it("dashed class ref works", function () { + var div = make("
"); + var value = evalHyperScript(".c1-foo"); + Array.from(value)[0].should.equal(div); + }); + + it("colon class ref works", function () { + var div = make("
"); + var value = evalHyperScript(".c1:foo"); + Array.from(value)[0].should.equal(div); + }); + + it("multiple colon class ref works", function () { + var div = make("
"); + var value = evalHyperScript(".c1:foo:bar"); + Array.from(value)[0].should.equal(div); + }); + + it("template classRef works", function () { + var div = make("
"); + var value = evalHyperScript(".{'c1'}"); + Array.from(value)[0].should.equal(div); + }); + + it("leading minus class ref works", function () { + var div = make("
"); + var value = evalHyperScript(".-c1"); + Array.from(value)[0].should.equal(div); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/closest.js b/www/test/0.9.13/test/expressions/closest.js new file mode 100644 index 00000000..60c56413 --- /dev/null +++ b/www/test/0.9.13/test/expressions/closest.js @@ -0,0 +1,103 @@ +describe("the closest expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic query return values", function () { + var div3 = make("
"); + var div1 = byId("d1"); + var div2 = byId("d2"); + + var result = evalHyperScript("closest
", { me: div3 }); + result.should.equal(div3); + + var result = evalHyperScript("closest
", { me: div1 }); + result.should.equal(div1); + + var result = evalHyperScript("closest
to #d3", { me: div1 }); + result.should.equal(div3); + + var result = evalHyperScript("closest
to my.parentElement", { + me: div1, + }); + result.should.equal(div3); + + var result = evalHyperScript("closest
to parentElement of me", { + me: div1, + }); + result.should.equal(div3); + }); + + it("parent modifier works", function () { + var div3 = make("
"); + var div1 = byId("d1"); + var div2 = byId("d2"); + + var result = evalHyperScript("closest parent
", { me: div1 }); + result.should.equal(div3); + + var result = evalHyperScript("closest parent
", { me: div2 }); + result.should.equal(div3); + }); + + it("attributes resolve as attributes", function () { + var div3 = make("
"); + var div1 = byId("d1"); + var div2 = byId("d2"); + + var result = evalHyperScript("closest @foo", { me: div1 }); + result.should.equal("bar"); + + var result = evalHyperScript("closest @foo", { me: div1 }); + result.should.equal("bar"); + }); + + it("attributes can be looked up and referred to in same expression", function () { + var div = make("
" + "
" + "
"); + var d1 = byId("d1"); + d1.innerHTML.should.equal(""); + d1.click(); + d1.innerHTML.should.equal("bar"); + }); + + it("attributes can be set via the closest expression", function () { + var div = make("
" + "
" + "
"); + var d1 = byId("d1"); + div.getAttribute("foo").should.equal("bar"); + d1.click(); + div.getAttribute("foo").should.equal("doh"); + }); + + it("parenthesizing allows you to nest to modifiers properly", function () { + var div = make("
" + "
" + "
"); + var div2 = make("
"); + div.getAttribute("foo").should.equal("bar"); + div2.click(); + div.getAttribute("foo").should.equal("doh"); + }); + + it("attributes can be set via the closest expression", function () { + var div = make("
" + "
" + "
"); + var d1 = byId("d1"); + div.getAttribute("foo").should.equal("bar"); + d1.click(); + div.getAttribute("foo").should.equal("doh"); + }); + + it("returns an array where appropriate", function () { + var div = make("
" + + "
"); + var d1 = byId("d1"); + var d2 = byId("d2"); + var d3 = byId("d3"); + d2.classList.contains("doh").should.equal(false); + d3.classList.contains("doh").should.equal(false); + d1.click(); + d2.classList.contains("doh").should.equal(true); + d3.classList.contains("doh").should.equal(true); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/comparisonOperator.js b/www/test/0.9.13/test/expressions/comparisonOperator.js new file mode 100644 index 00000000..f419bb19 --- /dev/null +++ b/www/test/0.9.13/test/expressions/comparisonOperator.js @@ -0,0 +1,614 @@ +describe("the comparisonOperator expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("less than works", function () { + var result = evalHyperScript("1 < 2"); + result.should.equal(true); + + var result = evalHyperScript("2 < 1"); + result.should.equal(false); + + var result = evalHyperScript("2 < 2"); + result.should.equal(false); + }); + + it("less than or equal works", function () { + var result = evalHyperScript("1 <= 2"); + result.should.equal(true); + + var result = evalHyperScript("2 <= 1"); + result.should.equal(false); + + var result = evalHyperScript("2 <= 2"); + result.should.equal(true); + }); + + it("greater than works", function () { + var result = evalHyperScript("1 > 2"); + result.should.equal(false); + + var result = evalHyperScript("2 > 1"); + result.should.equal(true); + + var result = evalHyperScript("2 > 2"); + result.should.equal(false); + }); + + it("greater than or equal works", function () { + var result = evalHyperScript("1 >= 2"); + result.should.equal(false); + + var result = evalHyperScript("2 >= 1"); + result.should.equal(true); + + var result = evalHyperScript("2 >= 2"); + result.should.equal(true); + }); + + it("equal works", function () { + var result = evalHyperScript("1 == 2"); + result.should.equal(false); + + var result = evalHyperScript("2 == 1"); + result.should.equal(false); + + var result = evalHyperScript("2 == 2"); + result.should.equal(true); + }); + + it("triple equal works", function () { + var result = evalHyperScript("1 === 2"); + result.should.equal(false); + + var result = evalHyperScript("2 === 1"); + result.should.equal(false); + + var result = evalHyperScript("2 === 2"); + result.should.equal(true); + }); + + it("not equal works", function () { + var result = evalHyperScript("1 != 2"); + result.should.equal(true); + + var result = evalHyperScript("2 != 1"); + result.should.equal(true); + + var result = evalHyperScript("2 != 2"); + result.should.equal(false); + }); + + it("triple not equal works", function () { + var result = evalHyperScript("1 !== 2"); + result.should.equal(true); + + var result = evalHyperScript("2 !== 1"); + result.should.equal(true); + + var result = evalHyperScript("2 !== 2"); + result.should.equal(false); + }); + + it("is works", function () { + var result = evalHyperScript("1 is 2"); + result.should.equal(false); + + var result = evalHyperScript("2 is 1"); + result.should.equal(false); + + var result = evalHyperScript("2 is 2"); + result.should.equal(true); + }); + + it("equals works", function () { + var result = evalHyperScript("1 equals 2"); + result.should.equal(false); + + var result = evalHyperScript("2 equals 1"); + result.should.equal(false); + + var result = evalHyperScript("2 equals 2"); + result.should.equal(true); + }); + + it("is equal to works", function () { + var result = evalHyperScript("1 is equal to 2"); + result.should.equal(false); + + var result = evalHyperScript("2 is equal to 1"); + result.should.equal(false); + + var result = evalHyperScript("2 is equal to 2"); + result.should.equal(true); + }); + + it("is really equal to works", function () { + var result = evalHyperScript("1 is really equal to 2"); + result.should.equal(false); + + var result = evalHyperScript("2 is really equal to 1"); + result.should.equal(false); + + var result = evalHyperScript("2 is really equal to '2'"); + result.should.equal(false); + + var result = evalHyperScript("2 is really equal to 2"); + result.should.equal(true); + }); + + it("really equals works", function () { + var result = evalHyperScript("1 really equals 2"); + result.should.equal(false); + + var result = evalHyperScript("2 really equals 1"); + result.should.equal(false); + + var result = evalHyperScript("2 really equals 2"); + result.should.equal(true); + }); + + it("is not works", function () { + var result = evalHyperScript("1 is not 2"); + result.should.equal(true); + + var result = evalHyperScript("2 is not 1"); + result.should.equal(true); + + var result = evalHyperScript("2 is not 2"); + result.should.equal(false); + }); + + it("is not equal to works", function () { + var result = evalHyperScript("1 is not equal to 2"); + result.should.equal(true); + + var result = evalHyperScript("2 is not equal to 1"); + result.should.equal(true); + + var result = evalHyperScript("2 is not equal to 2"); + result.should.equal(false); + }); + + it("is not really equal to works", function () { + var result = evalHyperScript("1 is not really equal to 2"); + result.should.equal(true); + + var result = evalHyperScript("2 is not really equal to 1"); + result.should.equal(true); + + var result = evalHyperScript("2 is not really equal to '2'"); + result.should.equal(true); + + var result = evalHyperScript("2 is not really equal to 2"); + result.should.equal(false); + }); + + it("is in works", function () { + var result = evalHyperScript("1 is in [1, 2]"); + result.should.equal(true); + + var result = evalHyperScript("2 is in [1, 2]"); + result.should.equal(true); + + var result = evalHyperScript("3 is in [1, 2]"); + result.should.equal(false); + + var result = evalHyperScript("3 is in null"); + result.should.equal(false); + }); + + it("is not in works", function () { + var result = evalHyperScript("1 is not in [1, 2]"); + result.should.equal(false); + + var result = evalHyperScript("2 is not in [1, 2]"); + result.should.equal(false); + + var result = evalHyperScript("3 is not in [1, 2]"); + result.should.equal(true); + + var result = evalHyperScript("3 is not in null"); + result.should.equal(true); + }); + + it("I am in works", function () { + var result = evalHyperScript("I am in [1, 2]", { me: 1 }); + result.should.equal(true); + + var result = evalHyperScript("I am in [1, 2]", { me: 2 }); + result.should.equal(true); + + var result = evalHyperScript("I am in [1, 2]", { me: 3 }); + result.should.equal(false); + + var result = evalHyperScript("I am in null", { me: null }); + result.should.equal(false); + }); + + it("I am not in works", function () { + var result = evalHyperScript("I am not in [1, 2]", { me: 1 }); + result.should.equal(false); + + var result = evalHyperScript("I am not in [1, 2]", { me: 2 }); + result.should.equal(false); + + var result = evalHyperScript("I am not in [1, 2]", { me: 3 }); + result.should.equal(true); + + var result = evalHyperScript("I am not in null", { me: null }); + result.should.equal(true); + }); + + it("match works", function () { + var div = make("
"); + var result = evalHyperScript("I match .foo", { me: div }); + result.should.equal(true); + + var div = make("
"); + var result = evalHyperScript("x matches .foo", { locals: { x: div } }); + result.should.equal(true); + + var div = make("
"); + var result = evalHyperScript("I match .bar", { me: div }); + result.should.equal(false); + + var div = make("
"); + var result = evalHyperScript("x matches .bar", { locals: { x: div } }); + result.should.equal(false); + }); + + it("does not match works", function () { + var div = make("
"); + var result = evalHyperScript("I do not match .foo", { me: div }); + result.should.equal(false); + + var div = make("
"); + var result = evalHyperScript("x does not match .foo", { locals: { x: div } }); + result.should.equal(false); + + var div = make("
"); + var result = evalHyperScript("I do not match .bar", { me: div }); + result.should.equal(true); + + var div = make("
"); + var result = evalHyperScript("x does not match .bar", { locals: { x: div } }); + result.should.equal(true); + }); + + it("match works w/ strings", function () { + var result = evalHyperScript("'a' matches '.*'"); + result.should.equal(true); + + var result = evalHyperScript("'a' matches 'b'"); + result.should.equal(false); + }); + + it("does not match works w/ strings", function () { + var result = evalHyperScript("'a' does not match '.*'"); + result.should.equal(false); + + var result = evalHyperScript("'a' does not match 'b'"); + result.should.equal(true); + }); + + it("contains works with elts", function () { + var outer = make("
"); + var inner = byId("d2"); + + var result = evalHyperScript("I contain that", { + me: outer, + locals: { that: inner, } + }); + result.should.equal(true); + + var result = evalHyperScript("I contain that", { + me: inner, + locals: { that: outer, } + }); + result.should.equal(false); + + var result = evalHyperScript("that contains me", { + me: outer, + locals: { that: inner, } + }); + result.should.equal(false); + + var result = evalHyperScript("that contains me", { + me: inner, + locals: { that: outer, } + }); + result.should.equal(true); + }); + + it("contains works with arrays", function () { + var outer = [1, 2, 3]; + var inner = 1; + + var result = evalHyperScript("I contain that", { + me: outer, + locals: { that: inner, } + }); + result.should.equal(true); + + var result = evalHyperScript("that contains me", { + me: inner, + locals: { that: outer, } + }); + result.should.equal(true); + }); + + it("contains works with css literals", function () { + + make("
"); + + var result = evalHyperScript(".outer contains #d2"); + result.should.equal(true); + + var result = evalHyperScript("#d2 contains #d1"); + result.should.equal(false); + }); + + it("include works", function () { + var outer = make("
"); + var inner = byId("d2"); + + var result = evalHyperScript("foo includes foobar", { + locals: { + foo: "foo", + foobar: "foobar", + } + }); + result.should.equal(false); + + var result = evalHyperScript("foobar includes foo", { + locals: { + foo: "foo", + foobar: "foobar", + } + }); + result.should.equal(true); + + var result = evalHyperScript("foo does not include foobar", { + locals: { + foo: "foo", + foobar: "foobar", + } + }); + result.should.equal(true); + + var result = evalHyperScript("foobar does not include foo", { + locals: { + foo: "foo", + foobar: "foobar", + } + }); + result.should.equal(false); + + }); + + it("includes works with arrays", function () { + var outer = [1, 2, 3]; + var inner = 1; + + var result = evalHyperScript("I include that", { + me: outer, + locals: { that: inner, } + }); + result.should.equal(true); + + var result = evalHyperScript("that includes me", { + me: inner, + locals: { that: outer, } + }); + result.should.equal(true); + }); + + it("includes works with css literals", function () { + + make("
"); + + var result = evalHyperScript(".outer includes #d2"); + result.should.equal(true); + + var result = evalHyperScript("#d2 includes #d1"); + result.should.equal(false); + }); + + it("does not contain works", function () { + var outer = make("
"); + var inner = byId("d2"); + + var result = evalHyperScript("I do not contain that", { + me: outer, + locals: { that: inner, } + }); + result.should.equal(false); + + var result = evalHyperScript("I do not contain that", { + me: inner, + locals: { that: outer, } + }); + result.should.equal(true); + + var result = evalHyperScript("that does not contains me", { + me: outer, + locals: { that: inner, } + }); + result.should.equal(true); + + var result = evalHyperScript("that does not contains me", { + me: inner, + locals: { that: outer, } + }); + result.should.equal(false); + }); + + it("is empty works", function () { + var result = evalHyperScript("undefined is empty"); + result.should.equal(true); + + var result = evalHyperScript("'' is empty"); + result.should.equal(true); + + var result = evalHyperScript("[] is empty"); + result.should.equal(true); + + var result = evalHyperScript("'not empty' is empty"); + result.should.equal(false); + + var result = evalHyperScript("1000 is empty"); + result.should.equal(false); + + var result = evalHyperScript("[1,2,3] is empty"); + result.should.equal(false); + + var result = evalHyperScript(".aClassThatDoesNotExist is empty"); + result.should.equal(true); + }); + + it("is not empty works", function () { + var result = evalHyperScript("undefined is not empty"); + result.should.equal(false); + + var result = evalHyperScript("'' is not empty"); + result.should.equal(false); + + var result = evalHyperScript("[] is not empty"); + result.should.equal(false); + + var result = evalHyperScript("'not empty' is not empty"); + result.should.equal(true); + + var result = evalHyperScript("1000 is not empty"); + result.should.equal(true); + + var result = evalHyperScript("[1,2,3] is not empty"); + result.should.equal(true); + }); + + it("is a works", function () { + var result = evalHyperScript("null is a String"); + result.should.equal(true); + + var result = evalHyperScript("null is a String!"); + result.should.equal(false); + + var result = evalHyperScript("'' is a String!"); + result.should.equal(true); + }); + + it("is not a works", function () { + var result = evalHyperScript("null is not a String"); + result.should.equal(false); + + var result = evalHyperScript("null is not a String!"); + result.should.equal(true); + + var result = evalHyperScript("'' is not a String!"); + result.should.equal(false); + }); + + it("english less than works", function () { + var result = evalHyperScript("1 is less than 2"); + result.should.equal(true); + + var result = evalHyperScript("2 is less than 1"); + result.should.equal(false); + + var result = evalHyperScript("2 is less than 2"); + result.should.equal(false); + }); + + it("english less than or equal works", function () { + var result = evalHyperScript("1 is less than or equal to 2"); + result.should.equal(true); + + var result = evalHyperScript("2 is less than or equal to 1"); + result.should.equal(false); + + var result = evalHyperScript("2 is less than or equal to 2"); + result.should.equal(true); + }); + + it("english greater than works", function () { + var result = evalHyperScript("1 is greater than 2"); + result.should.equal(false); + + var result = evalHyperScript("2 is greater than 1"); + result.should.equal(true); + + var result = evalHyperScript("2 is greater than 2"); + result.should.equal(false); + }); + + it("english greater than or equal works", function () { + var result = evalHyperScript("1 is greater than or equal to 2"); + result.should.equal(false); + + var result = evalHyperScript("2 is greater than or equal to 1"); + result.should.equal(true); + + var result = evalHyperScript("2 is greater than or equal to 2"); + result.should.equal(true); + }); + + it("exists works", function () { + var result = evalHyperScript("undefined exists"); + result.should.equal(false); + + var result = evalHyperScript("null exists"); + result.should.equal(false); + + var result = evalHyperScript("#doesNotExist exists"); + result.should.equal(false); + + var result = evalHyperScript(".aClassThatDoesNotExist exists"); + result.should.equal(false); + + var result = evalHyperScript("<.aClassThatDoesNotExist/> exists"); + result.should.equal(false); + + var div = make( + "
\n" + + "
\n" + + "
\n" + ); + + var result = evalHyperScript("#d1 exists"); + result.should.equal(true); + + var result = evalHyperScript(".c1 exists"); + result.should.equal(true); + + var result = evalHyperScript(" exists"); + result.should.equal(true); + }); + + it("does not exist works", function () { + var result = evalHyperScript("undefined does not exist"); + result.should.equal(true); + + var result = evalHyperScript("null does not exist"); + result.should.equal(true); + + var result = evalHyperScript("#doesNotExist does not exist"); + result.should.equal(true); + + var result = evalHyperScript(".aClassThatDoesNotExist does not exist"); + result.should.equal(true); + + var result = evalHyperScript("<.aClassThatDoesNotExist/> does not exist"); + result.should.equal(true); + + var result = evalHyperScript(" does not exist"); + result.should.equal(false); + }); + + + +}); diff --git a/www/test/0.9.13/test/expressions/cookies.js b/www/test/0.9.13/test/expressions/cookies.js new file mode 100644 index 00000000..a4f27088 --- /dev/null +++ b/www/test/0.9.13/test/expressions/cookies.js @@ -0,0 +1,42 @@ +describe("the cookies identifier", function () { + beforeEach(function () { + evalHyperScript("cookies.clearAll()"); + }); + afterEach(function () { + evalHyperScript("cookies.clearAll()"); + }); + + + it("basic set cookie values work", function () { + var result = evalHyperScript("cookies.foo"); + should.equal(result, undefined); + evalHyperScript("set cookies.foo to 'bar'"); + result = evalHyperScript("cookies.foo"); + result.should.equal('bar'); + }); + + it("update cookie values work", function () { + evalHyperScript("set cookies.foo to 'bar'"); + var result = evalHyperScript("cookies.foo"); + result.should.equal('bar'); + evalHyperScript("set cookies.foo to 'doh'"); + var result = evalHyperScript("cookies.foo"); + result.should.equal('doh'); + }); + + it("basic clear cookie values work", function () { + evalHyperScript("set cookies.foo to 'bar'"); + evalHyperScript("cookies.clear('foo')"); + var result = evalHyperScript("cookies.foo"); + should.equal(result, undefined); + }); + + it("iterate cookies values work", function () { + evalHyperScript("set cookies.foo to 'bar'"); + let context = {me:[], you:[]}; // horrifying, but use arrays for me and you to capture values... + evalHyperScript("for x in cookies me.push(x.name) then you.push(x.value) end", context); + context.me.includes('foo').should.equal(true); + context.you.includes('bar').should.equal(true); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/functionCalls.js b/www/test/0.9.13/test/expressions/functionCalls.js new file mode 100644 index 00000000..37863d3a --- /dev/null +++ b/www/test/0.9.13/test/expressions/functionCalls.js @@ -0,0 +1,68 @@ +describe("function call expressions", function () { + it("can invoke global function", function () { + window.identity = function (x) { + return x; + }; + try { + var result = evalHyperScript('identity("foo")'); + result.should.equal("foo"); + } finally { + delete window.identity; + } + }); + + it("can invoke function on object", function () { + window.obj = { + value: "foo", + getValue: function () { + return this.value; + }, + }; + try { + var result = evalHyperScript("obj.getValue()"); + result.should.equal("foo"); + } finally { + delete window.obj; + } + }); + + it("can invoke global function w/ async arg", function (done) { + window.identity = function (x) { + return x; + }; + var result = evalHyperScript("identity(promiseAnIntIn(10))"); + result.then(function (result) { + result.should.equal(42); + delete window.identity; + done(); + }); + }); + + it("can invoke function on object w/ async arg", function (done) { + window.obj = { + identity: function (x) { + return x; + }, + }; + var result = evalHyperScript("obj.identity(promiseAnIntIn(10))"); + result.then(function (result) { + result.should.equal(42); + delete window.obj; + done(); + }); + }); + + it("can invoke function on object w/ async root & arg", function (done) { + window.obj = { + identity: function (x) { + return x; + }, + }; + var result = evalHyperScript("promiseValueBackIn(obj, 20).identity(promiseAnIntIn(10))"); + result.then(function (result) { + result.should.equal(42); + delete window.obj; + done(); + }); + }); +}); diff --git a/www/test/0.9.13/test/expressions/idRef.js b/www/test/0.9.13/test/expressions/idRef.js new file mode 100644 index 00000000..0b1257d0 --- /dev/null +++ b/www/test/0.9.13/test/expressions/idRef.js @@ -0,0 +1,32 @@ +describe("the idRef expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic id ref works", function () { + var div = make("
"); + var value = evalHyperScript("#d1"); + value.should.equal(div); + }); + + it("basic id ref works w no match", function () { + var div = make("
"); + var value = evalHyperScript("#d1"); + should.equal(value, null); + }); + + it("template id ref works", function () { + var div = make("
"); + var value = evalHyperScript("#{'d1'}"); + value.should.equal(div); + }); + + it("id ref works from a disconnected element", function () { + var div = make("
"); + var value = evalHyperScript("#d1", { me: document.createElement('div') }); + value.should.equal(div); + }); +}); diff --git a/www/test/0.9.13/test/expressions/in.js b/www/test/0.9.13/test/expressions/in.js new file mode 100644 index 00000000..76d4ff04 --- /dev/null +++ b/www/test/0.9.13/test/expressions/in.js @@ -0,0 +1,80 @@ +describe("the in expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic no query return values", function () { + var result = evalHyperScript("1 in [1, 2, 3]"); + result.should.deep.equal([1]); + + var result = evalHyperScript("[1, 3] in [1, 2, 3]"); + result.should.deep.equal([1, 3]); + + var result = evalHyperScript("[1, 3, 4] in [1, 2, 3]"); + result.should.deep.equal([1, 3]); + + var result = evalHyperScript("[4, 5, 6] in [1, 2, 3]"); + result.should.deep.equal([]); + }); + + it("basic query return values", function () { + var div = make("

"); + var result = evalHyperScript("

in #d1"); + result.length.should.equal(2); + + var div = make("

"); + var result = evalHyperScript(" in #d2"); + result.length.should.equal(1); + + var div = make("

"); + var result = evalHyperScript(" in "); + result.length.should.equal(1); + }); + + it("id returns values", function () { + var div = make("

"); + div.click(); + div.getAttribute("result").should.equal('p1'); + }); + + it("id template returns values", function () { + var div = make("

"); + div.click(); + div.getAttribute("result").should.equal('p1'); + }); + + it("class returns values", function () { + var div = make("

"); + div.click(); + div.getAttribute("result").should.equal('p1'); + }); + + it("class template returns values", function () { + var div = make("

"); + div.click(); + div.getAttribute("result").should.equal('p1'); + }); + + it("query returns values", function () { + var div = make("

"); + div.click(); + div.getAttribute("result").should.equal('p1'); + }); + + it("query template returns values", function () { + var div = make("

"); + div.click(); + div.getAttribute("result").should.equal('p1'); + }); + + it("in expression binds to unaryOperators", function () { + var div = make("

bar

"); + var result = evalHyperScript("the innerText of the first in #d2 is 'bar'"); + result.should.equal(true); + }); + + +}); diff --git a/www/test/0.9.13/test/expressions/logicalOperator.js b/www/test/0.9.13/test/expressions/logicalOperator.js new file mode 100644 index 00000000..69b6c338 --- /dev/null +++ b/www/test/0.9.13/test/expressions/logicalOperator.js @@ -0,0 +1,26 @@ +describe("the logicalOperator expression", function () { + it("and works", function () { + var result = evalHyperScript("true and false"); + result.should.equal(true && false); + }); + + it("or works", function () { + var result = evalHyperScript("true or false"); + result.should.equal(true || false); + }); + + it("and works w/ more than one value", function () { + var result = evalHyperScript("true and true and false"); + result.should.equal(true && true && false); + }); + + it("unparenthesized expressions with multiple operators cause an error", function () { + var result = getParseErrorFor("true and false or true"); + result.indexOf("You must parenthesize logical operations with different operators").should.equal(0); + }); + + it("parenthesized expressions with multiple operators work", function () { + var result = evalHyperScript("true and (false or true)"); + result.should.equal(true && (false || true)); + }); +}); diff --git a/www/test/0.9.13/test/expressions/mathOperator.js b/www/test/0.9.13/test/expressions/mathOperator.js new file mode 100644 index 00000000..ed034f97 --- /dev/null +++ b/www/test/0.9.13/test/expressions/mathOperator.js @@ -0,0 +1,54 @@ +describe("the mathOperator expression", function () { + it("addition works", function () { + var result = evalHyperScript("1 + 1"); + result.should.equal(1 + 1); + }); + + it("string concat works", function () { + var result = evalHyperScript("'a' + 'b'"); + result.should.equal("ab"); + }); + + it("subtraction works", function () { + var result = evalHyperScript("1 - 1"); + result.should.equal(1 - 1); + }); + + it("multiplication works", function () { + var result = evalHyperScript("1 * 2"); + result.should.equal(1 * 2); + }); + + it("division works", function () { + var result = evalHyperScript("1 / 2"); + result.should.equal(1 / 2); + }); + + it("mod works", function () { + var result = evalHyperScript("3 mod 2"); + result.should.equal(3 % 2); + }); + + it("addition works w/ more than one value", function () { + var result = evalHyperScript("1 + 2 + 3"); + result.should.equal(1 + 2 + 3); + }); + + it("unparenthesized expressions with multiple operators cause an error", function () { + var result = getParseErrorFor("1 + 2 * 3"); + result.indexOf("You must parenthesize math operations with different operators").should.equal(0); + }); + + it("parenthesized expressions with multiple operators work", function () { + var result = evalHyperScript("1 + (2 * 3)"); + result.should.equal(1 + 2 * 3); + }); + + it("can use mixed expressions", function (done) { + var result = evalHyperScript("1 + promiseAnIntIn(10)"); + result.then(function (value) { + value.should.equal(43); + done(); + }); + }); +}); diff --git a/www/test/0.9.13/test/expressions/no.js b/www/test/0.9.13/test/expressions/no.js new file mode 100644 index 00000000..a7e07889 --- /dev/null +++ b/www/test/0.9.13/test/expressions/no.js @@ -0,0 +1,26 @@ +describe("the no expression", function () { + it("no returns true for null", function () { + var result = evalHyperScript("no null"); + result.should.equal(true); + }); + + it("no returns false for non-null", function () { + var result = evalHyperScript("no 'thing'"); + result.should.equal(false); + }); + + it("no returns true for empty array", function () { + var result = evalHyperScript("no []"); + result.should.equal(true); + }); + + it("no returns true for empty selector", function () { + var result = evalHyperScript("no .aClassThatDoesNotExist"); + result.should.equal(true); + }); + + it("no returns false for non-null", function () { + var result = evalHyperScript("no ['thing']"); + result.should.equal(false); + }); +}); diff --git a/www/test/0.9.13/test/expressions/not.js b/www/test/0.9.13/test/expressions/not.js new file mode 100644 index 00000000..c268c1ae --- /dev/null +++ b/www/test/0.9.13/test/expressions/not.js @@ -0,0 +1,16 @@ +describe("the not expression", function () { + it("not inverts true", function () { + var result = evalHyperScript("not true"); + result.should.equal(false); + }); + + it("not inverts false", function () { + var result = evalHyperScript("not false"); + result.should.equal(true); + }); + + it("two nots make a true", function () { + var result = evalHyperScript("not not true"); + result.should.equal(true); + }); +}); diff --git a/www/test/0.9.13/test/expressions/null.js b/www/test/0.9.13/test/expressions/null.js new file mode 100644 index 00000000..675ccc63 --- /dev/null +++ b/www/test/0.9.13/test/expressions/null.js @@ -0,0 +1,6 @@ +describe("the null literal expression", function () { + it("null literal work", function () { + var result = evalHyperScript("null"); + should.equal(result, null); + }); +}); diff --git a/www/test/0.9.13/test/expressions/numbers.js b/www/test/0.9.13/test/expressions/numbers.js new file mode 100644 index 00000000..82d571a5 --- /dev/null +++ b/www/test/0.9.13/test/expressions/numbers.js @@ -0,0 +1,27 @@ +describe("the number expression", function () { + it("handles numbers properly", function () { + var result = evalHyperScript("-1"); + result.should.equal(-1); + + var result = evalHyperScript("1"); + result.should.equal(1); + + var result = evalHyperScript("1.1"); + result.should.equal(1.1); + + var result = evalHyperScript("1e6"); + result.should.equal(1e6); + + var result = evalHyperScript("1e-6"); + result.should.equal(1e-6); + + var result = evalHyperScript("1.1e6"); + result.should.equal(1.1e6); + + var result = evalHyperScript("1.1e-6"); + result.should.equal(1.1e-6); + + var result = evalHyperScript("1234567890.1234567890"); + result.should.equal(1234567890.123456789); + }); +}); diff --git a/www/test/0.9.13/test/expressions/objectLiteral.js b/www/test/0.9.13/test/expressions/objectLiteral.js new file mode 100644 index 00000000..5c8fb757 --- /dev/null +++ b/www/test/0.9.13/test/expressions/objectLiteral.js @@ -0,0 +1,37 @@ +describe("the objectLiteral expression", function () { + it("empty object literals work", function () { + var result = evalHyperScript("{}"); + result.should.deep.equal({}); + }); + + it("one field object literal works", function () { + var result = evalHyperScript("{foo:true}"); + result.should.deep.equal({ foo: true }); + }); + + it("multi-field object literal works", function () { + var result = evalHyperScript("{foo:true, bar:false}"); + result.should.deep.equal({ foo: true, bar: false }); + }); + + it("strings work in object literal field names", function () { + var result = evalHyperScript('{"foo":true, "bar":false}'); + result.should.deep.equal({ foo: true, bar: false }); + }); + + it("hyphens work in object literal field names", function () { + var result = evalHyperScript("{-foo:true, bar-baz:false}"); + result.should.deep.equal({ "-foo": true, "bar-baz": false }); + }); + + it("expressions work in object literal field names", function () { + window.foo = "bar"; + window.bar = function () { + return "foo"; + }; + var result = evalHyperScript("{[foo]:true, [bar()]:false}"); + result.should.deep.equal({ bar: true, foo: false }); + delete window.foo; + delete window.bar; + }); +}); diff --git a/www/test/0.9.13/test/expressions/positionalExpression.js b/www/test/0.9.13/test/expressions/positionalExpression.js new file mode 100644 index 00000000..8dd5fe6e --- /dev/null +++ b/www/test/0.9.13/test/expressions/positionalExpression.js @@ -0,0 +1,65 @@ +describe("the positional expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + //clearWorkArea(); + }); + + it("first works", function () { + var result = evalHyperScript("the first of [1, 2, 3]"); + result.should.equal(1); + }); + + it("last works", function () { + var result = evalHyperScript("the last of [1, 2, 3]"); + result.should.equal(3); + }); + + it("first works w/ array-like", function () { + var div = make( + "
\n" + + "
\n" + + "
\n" + ); + var result = evalHyperScript("the first of .c1"); + result.should.equal(byId("d1")); + }); + + it("last works w/ array-like", function () { + var div = make( + "
" + + "
" + + "
" + ); + var result = evalHyperScript("the last of .c1"); + result.should.equal(byId("d3")); + }); + + it("first works w/ node", function () { + var div = make( + "
" + + "
" + + "
" + ); + var result = evalHyperScript("the first of div", { locals: { div: div } }); + result.should.equal(byId("d1")); + }); + + it("last works w/ node", function () { + var div = make( + "
" + + "
" + + "
" + ); + var result = evalHyperScript("the last of div", { locals: { div: div } }); + result.should.equal(byId("d3")); + }); + + it("is null safe", function () { + var result = evalHyperScript("the first of null"); + should.equal(result, undefined); + }); + + +}); diff --git a/www/test/0.9.13/test/expressions/possessiveExpression.js b/www/test/0.9.13/test/expressions/possessiveExpression.js new file mode 100644 index 00000000..800accd7 --- /dev/null +++ b/www/test/0.9.13/test/expressions/possessiveExpression.js @@ -0,0 +1,144 @@ +describe("possessiveExpression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can access basic properties", function () { + var result = evalHyperScript("foo's foo", { locals: { foo: { foo: "foo" } } }); + result.should.equal("foo"); + }); + + it("is null safe", function () { + var result = evalHyperScript("foo's foo"); + should.equal(result, undefined); + }); + + it("can access my properties", function () { + var result = evalHyperScript("my foo", { me: { foo: "foo" } }); + result.should.equal("foo"); + }); + + it("my property is null safe", function () { + var result = evalHyperScript("my foo"); + should.equal(result, undefined); + }); + + it("can access its properties", function () { + var result = evalHyperScript("its foo", { result: { foo: "foo" } }); + result.should.equal("foo"); + }); + + it("its property is null safe", function () { + var result = evalHyperScript("its foo"); + should.equal(result, undefined); + }); + + it("can access properties on idrefs", function () { + make("
"); + var result = evalHyperScript("the display of #foo's style"); + result.should.equal("inline"); + }); + + it("can access properties on idrefs 2", function () { + make("
"); + var result = evalHyperScript("#foo's style's display"); + result.should.equal("inline"); + }); + + it("can access properties on classrefs", function () { + make("
"); + var result = evalHyperScript("the display of .foo's style"); + result.should.deep.equal(["inline"]); + }); + + it("can access properties on classrefs 2", function () { + make("
"); + var result = evalHyperScript(".foo's style's display"); + result.should.deep.equal(["inline"]); + }); + + it("can access properties on queryrefs", function () { + make("
"); + var result = evalHyperScript("the display of <.foo/>'s style"); + result.should.deep.equal(["inline"]); + }); + + it("can access properties on queryrefs 2", function () { + make("
"); + var result = evalHyperScript("<.foo/>'s style's display"); + result.should.deep.equal(["inline"]); + }); + + it("can access basic attribute", function () { + var div = make("
"); + var result = evalHyperScript("foo's [@data-foo]", { locals: { foo: div } }); + result.should.equal("bar"); + }); + + it("can access my attribute", function () { + var div = make("
"); + var result = evalHyperScript("my @data-foo", { me: div }); + result.should.equal("bar"); + }); + + it("can access multiple basic attributes", function () { + make("
"); + var result = evalHyperScript(".c1's [@data-foo]"); + result.should.deep.equal(["bar", "bar"]); + }); + + it("can set basic attributes", function () { + var div = make("
"); + var result = evalHyperScript("set foo's [@data-foo] to 'blah'", { + locals: { foo: div, } + }); + div.getAttribute("data-foo").should.equal("blah"); + }); + + it("can set multiple basic attributes", function () { + make("
"); + var result = evalHyperScript("set .c1's [@data-foo] to 'blah'"); + byId('d1').getAttribute('data-foo').should.equal('blah') + byId('d2').getAttribute('data-foo').should.equal('blah') + }); + + it("can access basic style", function () { + var div = make("
"); + var result = evalHyperScript("foo's *color", { locals: { foo: div } }); + result.should.equal("red"); + }); + + it("can access my style", function () { + var div = make("
"); + var result = evalHyperScript("my *color", { me: div }); + result.should.equal("red"); + }); + + it("can access multiple basic styles", function () { + make("
"); + var result = evalHyperScript(".c1's *color"); + result.should.deep.equal(["red", "red"]); + }); + + it("can set root styles", function () { + var div = make("
"); + var result = evalHyperScript("set *color to 'blue'", {me: div}); + div.style["color"].should.equal("blue"); + }); + + it("can set basic styles", function () { + var div = make("
"); + var result = evalHyperScript("set foo's *color to 'blue'", { locals: { foo: div } }); + div.style["color"].should.equal("blue"); + }); + + it("can set multiple basic styles", function () { + make("
"); + var result = evalHyperScript("set .c1's *color to 'blue'"); + byId('d1').style['color'].should.equal('blue') + byId('d2').style['color'].should.equal('blue') + }); +}); diff --git a/www/test/0.9.13/test/expressions/propertyAccess.js b/www/test/0.9.13/test/expressions/propertyAccess.js new file mode 100644 index 00000000..65e06e09 --- /dev/null +++ b/www/test/0.9.13/test/expressions/propertyAccess.js @@ -0,0 +1,37 @@ +describe("propertyAccess", function () { + it("can access basic properties", function () { + var result = evalHyperScript("foo.foo", { locals: { foo: { foo: "foo" } } }); + result.should.equal("foo"); + }); + + it("is null safe", function () { + var result = evalHyperScript("foo.foo"); + should.equal(result, undefined); + }); + + it("of form works", function () { + var result = evalHyperScript("foo of foo", { locals: { foo: { foo: "foo" } } }); + result.should.equal("foo"); + }); + + it("of form works w/ complex left side", function () { + var result = evalHyperScript("bar.doh of foo", { + locals: { foo: { bar: { doh: "foo" } } } + }); + result.should.equal("foo"); + }); + + it("of form works w/ complex right side", function () { + var result = evalHyperScript("doh of foo.bar", { + locals: { foo: { bar: { doh: "foo" } } } + }); + result.should.equal("foo"); + }); + + it("works properly w/ boolean properties", function () { + make(" "); + let result = evalHyperScript(".cb.checked"); + result.should.deep.equal([true, false]); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/queryRef.js b/www/test/0.9.13/test/expressions/queryRef.js new file mode 100644 index 00000000..c01a140a --- /dev/null +++ b/www/test/0.9.13/test/expressions/queryRef.js @@ -0,0 +1,101 @@ +describe("the queryRef expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic queryRef works", function () { + var div = make("
"); + var value = evalHyperScript("<.c1/>"); + Array.from(value)[0].should.equal(div); + }); + + it("basic queryRef works w/ multiple matches", function () { + var div = make( + "
" + + "
" + + "
" + ); + var value = evalHyperScript("<.c1/>"); + Array.from(value).length.should.equal(3); + }); + + it("basic queryRef works w/ properties", function () { + var div = make( + "
" + + "
" + + "
" + ); + var value = evalHyperScript("<[title=t2]/>"); + Array.from(value).length.should.equal(1); + }); + + it("basic queryRef works w/ funny selector", function () { + var div = make( + "
" + + "
" + + "
" + ); + var value = evalHyperScript("<:active/>"); + Array.from(value).length.should.equal(0); + }); + + it("basic queryRef works w/ div selector", function () { + var div = make( + "
" + + "
" + + "
" + ); + var value = evalHyperScript(""); + Array.from(value).length.should.equal(1); + }); + + it("basic queryRef works w no match", function () { + var value = evalHyperScript("<.badClassThatDoesNotHaveAnyElements/>"); + Array.from(value).length.should.equal(0); + }); + + it("basic queryRef works w properties w/ strings", function () { + var div = make( + "
" + + "
" + + "
" + ); + var value = evalHyperScript("<[foo='bar']/>"); + Array.from(value).length.should.equal(1); + }); + + it("queryRef w/ $ works ", function () { + var div = make( + "
" + + "
" + + "
" + ); + var value = evalHyperScript("<[foo='${x}']/>", { locals: { x: "bar" } }); + Array.from(value).length.should.equal(1); + }); + + it("queryRef w/ $ no curlies works", function () { + var div = make( + "
" + "
" + "
" + ); + var value = evalHyperScript("<#$id/>", { locals: { id: "t2" } }); + Array.from(value)[0].should.equal(byId("t2")); + }); + + it("can interpolate elements into queries", function () { + var a = make("
"); + var b = make("
"); + var value = evalHyperScript("<${a} + div/>", { locals: { a } }); + Array.from(value)[0].should.equal(b); + }); + + it("queryRefs support colons properly", function () { + var b = make(""); + var value = evalHyperScript(""); + Array.from(value).length.should.equal(1); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/relativePositionalExpression.js b/www/test/0.9.13/test/expressions/relativePositionalExpression.js new file mode 100644 index 00000000..621ed1ff --- /dev/null +++ b/www/test/0.9.13/test/expressions/relativePositionalExpression.js @@ -0,0 +1,255 @@ +describe("the relative positional expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + + it("next works properly among siblings", function () { + var div = make( + "
\n" + + "
\n" + + "
\n" + ); + var result = evalHyperScript("the next
from #d1"); + result.should.equal(byId("d2")); + var result = evalHyperScript("the next
from #d2"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the next
from #d3"); + should.equal(result, undefined); + }); + + it("next works properly among siblings with wrapping", function () { + var div = make( + "
\n" + + "
\n" + + "
\n" + ); + var result = evalHyperScript("the next
from #d1 within the #work-area with wrapping"); + result.should.equal(byId("d2")); + var result = evalHyperScript("the next
from #d2 within the #work-area with wrapping"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the next
from #d3 within the #work-area with wrapping"); + should.equal(result, byId("d1")); + }); + + it("relative next works properly among siblings w/ query", function () { + make( + "
\n" + + "
" + ); + var d1 = byId('d1') + var d2 = byId('d2') + d1.click(); + d2.classList.contains('foo'); + }); + + it("relative next works properly among siblings w/ class", function () { + make( + "
\n" + + "
" + ); + var d1 = byId('d1') + var d2 = byId('d2') + d1.click(); + d2.classList.contains('foo'); + }); + + it("relative next works properly among siblings w/ query & class", function () { + make( + "
\n" + + "
" + ); + var d1 = byId('d1') + var d2 = byId('d2') + d1.click(); + d2.classList.contains('foo'); + }); + + it("previous works properly among siblings", function () { + var div = make( + "
\n" + + "
\n" + + "
\n" + ); + var result = evalHyperScript("the previous
from #d1 within #work-area"); + should.equal(result, undefined); + var result = evalHyperScript("the previous
from #d2"); + result.should.equal(byId("d1")); + var result = evalHyperScript("the previous
from #d3"); + result.should.equal(byId("d2")); + }); + + it("previous works properly among siblings with wrapping", function () { + var div = make( + "
\n" + + "
\n" + + "
\n" + ); + var result = evalHyperScript("the previous
from #d1 within the #work-area with wrapping"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the previous
from #d2 within the #work-area with wrapping"); + result.should.equal(byId("d1")); + var result = evalHyperScript("the previous
from #d3 within the #work-area with wrapping"); + should.equal(result, byId("d2")); + }); + + it("relative previous works properly among siblings w/ query", function () { + make( + "
\n" + + "
" + ); + var d1 = byId('d1') + var d2 = byId('d2') + d2.click(); + d1.classList.contains('foo'); + }); + + it("relative previous works properly among siblings w/ class", function () { + make( + "
\n" + + "
" + ); + var d1 = byId('d1') + var d2 = byId('d2') + d2.click(); + d1.classList.contains('foo'); + }); + + it("relative previous works properly among siblings w/ query & class", function () { + make( + "
\n" + + "
" + ); + var d1 = byId('d1') + var d2 = byId('d2') + d2.click(); + d1.classList.contains('foo'); + }); + + it("properly constrains via the within modifier", function () { + make( + "
\n" + ); + var result = evalHyperScript("the next .c1 from #d2 within #d1"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the next .c1 from #d3 within #d1"); + should.equal(result, undefined); + var result = evalHyperScript("the next .c1 from #d3 within the #work-area"); + result.should.equal(byId("d4")); + }); + + it("next works properly with array-like", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the next
from #d1 in .c1"); + result.should.equal(byId("d2")); + var result = evalHyperScript("the next
from #d2 in .c1"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the next
from #d3 in .c1"); + should.equal(result, undefined); + }); + + it("next works properly with array-like and wrap", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the next
from #d1 in .c1 with wrapping"); + result.should.equal(byId("d2")); + var result = evalHyperScript("the next
from #d2 in .c1 with wrapping"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the next
from #d3 in .c1 with wrapping"); + should.equal(result, byId("d1")); + }); + + it("next works properly with array-like no match", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the next

from #d1 in .c1"); + should.equal(result, undefined); + var result = evalHyperScript("the next

from #d2 in .c1"); + should.equal(result, undefined); + var result = evalHyperScript("the next

from #d3 in .c1"); + should.equal(result, undefined); + }); + + + it("next works properly with array-like no match and wrap", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the next

from #d1 in .c1 with wrapping"); + should.equal(result, undefined); + var result = evalHyperScript("the next

from #d2 in .c1 with wrapping"); + should.equal(result, undefined); + var result = evalHyperScript("the next

from #d3 in .c1 with wrapping"); + should.equal(result, undefined); + }); + + it("previous works properly with array-like", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the previous
from #d1 in .c1"); + should.equal(result, undefined); + var result = evalHyperScript("the previous
from #d2 in .c1"); + result.should.equal(byId("d1")); + var result = evalHyperScript("the previous
from #d3 in .c1"); + result.should.equal(byId("d2")); + }); + + + it("previous works properly with array-like and wrap", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the previous
from #d1 in .c1 with wrapping"); + result.should.equal(byId("d3")); + var result = evalHyperScript("the previous
from #d2 in .c1 with wrapping"); + result.should.equal(byId("d1")); + var result = evalHyperScript("the previous
from #d3 in .c1 with wrapping"); + should.equal(result, byId("d2")); + }); + + it("previous works properly with array-like no match", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the previous

from #d1 in .c1"); + should.equal(result, undefined); + var result = evalHyperScript("the previous

from #d2 in .c1"); + should.equal(result, undefined); + var result = evalHyperScript("the previous

from #d3 in .c1"); + should.equal(result, undefined); + }); + + + it("previous works properly with array-like no match and wrap", function () { + var div = make( + "

\n" + + "

\n" + + "
\n" + ); + var result = evalHyperScript("the previous

from #d1 in .c1 with wrapping"); + should.equal(result, undefined); + var result = evalHyperScript("the previous

from #d2 in .c1 with wrapping"); + should.equal(result, undefined); + var result = evalHyperScript("the previous

from #d3 in .c1 with wrapping"); + should.equal(result, undefined); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/some.js b/www/test/0.9.13/test/expressions/some.js new file mode 100644 index 00000000..b9ef1e9d --- /dev/null +++ b/www/test/0.9.13/test/expressions/some.js @@ -0,0 +1,31 @@ +describe("the some expression", function () { + it("some returns false for null", function () { + var result = evalHyperScript("some null"); + result.should.equal(false); + }); + + it("some returns true for non-null", function () { + var result = evalHyperScript("some 'thing'"); + result.should.equal(true); + }); + + it("some returns false for empty array", function () { + var result = evalHyperScript("some []"); + result.should.equal(false); + }); + + it("some returns false for empty selector", function () { + var result = evalHyperScript("some .aClassThatDoesNotExist"); + result.should.equal(false); + }); + + it("some returns true for nonempty selector", function () { + var result = evalHyperScript("some "); + result.should.equal(true); + }); + + it("some returns true for filled array", function () { + var result = evalHyperScript("some ['thing']"); + result.should.equal(true); + }); +}); diff --git a/www/test/0.9.13/test/expressions/stringPostfix.js b/www/test/0.9.13/test/expressions/stringPostfix.js new file mode 100644 index 00000000..7cd802fb --- /dev/null +++ b/www/test/0.9.13/test/expressions/stringPostfix.js @@ -0,0 +1,39 @@ +describe("the string postfix expression", function () { + + it("handles basic postfix strings properly", function () { + + var result = evalHyperScript("1em"); + result.should.equal("1em"); + + var result = evalHyperScript("1px"); + result.should.equal("1px"); + + var result = evalHyperScript("100%"); + result.should.equal("100%"); + }); + + it("handles basic postfix strings with spaces properly", function () { + + var result = evalHyperScript("1 em"); + result.should.equal("1em"); + + var result = evalHyperScript("1 px"); + result.should.equal("1px"); + + var result = evalHyperScript("100 %"); + result.should.equal("100%"); + }); + + it("handles expression roots properly", function () { + + var result = evalHyperScript("(0 + 1) em"); + result.should.equal("1em"); + + var result = evalHyperScript("(0 + 1) px"); + result.should.equal("1px"); + + var result = evalHyperScript("(100 + 0) %"); + result.should.equal("100%"); + }); + +}); diff --git a/www/test/0.9.13/test/expressions/strings.js b/www/test/0.9.13/test/expressions/strings.js new file mode 100644 index 00000000..e30bbd13 --- /dev/null +++ b/www/test/0.9.13/test/expressions/strings.js @@ -0,0 +1,65 @@ +describe("the string expression", function () { + it("handles strings properly", function () { + var result = evalHyperScript('"foo"'); + result.should.equal("foo"); + + var result = evalHyperScript('"fo\'o"'); + result.should.equal("fo'o"); + + var result = evalHyperScript("'foo'"); + result.should.equal("foo"); + }); + + it("string templates work properly", function () { + var result = evalHyperScript("`$1`"); + result.should.equal("1"); + }); + + it("string templates work w/ props", function () { + window.foo = "foo"; + var result = evalHyperScript("`$window.foo`"); + result.should.equal("foo"); + delete window.foo; + }); + + it("string templates work w/ props w/ braces", function () { + window.foo = "foo"; + var result = evalHyperScript("`${window.foo}`"); + result.should.equal("foo"); + delete window.foo; + }); + + it("string templates work properly w braces", function () { + var result = evalHyperScript("`${1 + 2}`"); + result.should.equal("3"); + }); + + it("string templates preserve white space", function () { + var result = evalHyperScript("` ${1 + 2} ${1 + 2} `"); + result.should.equal(" 3 3 "); + var result = evalHyperScript("`${1 + 2} ${1 + 2} `"); + result.should.equal("3 3 "); + var result = evalHyperScript("`${1 + 2}${1 + 2} `"); + result.should.equal("33 "); + var result = evalHyperScript("`${1 + 2} ${1 + 2}`"); + result.should.equal("3 3"); + }); + + it("should handle strings with tags and quotes", function () { + var record = { + name: "John Connor", + age: 21, + favouriteColour: "bleaux", + }; + var result = evalHyperScript( + '`
${record.name}
`', + { locals: { record: record } } + ); + result.should.equal('
John Connor
'); + }); + + it("should handle back slashes in non-template content", function () { + var result = evalHyperScript("`https://${foo}`", {locals:{foo:'bar'}}); + result.should.equal('https://bar'); + }); +}); diff --git a/www/test/0.9.13/test/expressions/styleRef.js b/www/test/0.9.13/test/expressions/styleRef.js new file mode 100644 index 00000000..4bc0bd6a --- /dev/null +++ b/www/test/0.9.13/test/expressions/styleRef.js @@ -0,0 +1,126 @@ +describe("the styleRef expression", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("basic style ref works", function () { + var div = make("
"); + + var value = _hyperscript("*color", { me: div }); + value.should.equal("red"); + + value = _hyperscript("*text-align", { me: div }); + value.should.equal("center"); + + value = _hyperscript("*width", { me: div }); + value.should.equal("10px"); + + value = _hyperscript("*height", { me: div }); + value.should.equal(""); + + value = _hyperscript("*bad-prop", { me: div }); + should.equal(value, undefined); + }); + + it("calculated style ref works", function () { + var div = make("
"); + + var value = _hyperscript("*computed-color", { me: div }); + value.should.equal("rgb(255, 0, 0)"); + + value = _hyperscript("*computed-text-align", { me: div }); + value.should.equal("center"); + + value = _hyperscript("*computed-width", { me: div }); + value.should.equal("10px"); + + value = _hyperscript("*computed-height", { me: div }); + value.should.equal("0px"); + + value = _hyperscript("*computed-bad-prop", { me: div }); + should.equal(value, ""); + }); + + it("possessive style ref works", function () { + var div = make("
"); + + var value = _hyperscript("my *color", { me: div }); + value.should.equal("red"); + + value = _hyperscript("my *text-align", { me: div }); + value.should.equal("center"); + + value = _hyperscript("my *width", { me: div }); + value.should.equal("10px"); + + value = _hyperscript("its *height", { result: div }); + value.should.equal(""); + + value = _hyperscript("my *bad-prop", { me: div }); + should.equal(value, undefined); + }); + + it("of style ref works", function () { + var div = make("
"); + + var value = _hyperscript("*color of me", { me: div }); + value.should.equal("red"); + + value = _hyperscript("*text-align of me", { me: div }); + value.should.equal("center"); + + value = _hyperscript("*width of me", { me: div }); + value.should.equal("10px"); + + value = _hyperscript("*height of it", { result: div }); + value.should.equal(""); + + value = _hyperscript("*bad-prop of me", { me: div }); + should.equal(value, undefined); + }); + + + it("calculated possessive style ref works", function () { + var div = make("
"); + + var value = _hyperscript("my *computed-color", { me: div }); + value.should.equal("rgb(255, 0, 0)"); + + value = _hyperscript("my *computed-text-align", { me: div }); + value.should.equal("center"); + + value = _hyperscript("my *computed-width", { me: div }); + value.should.equal("10px"); + + value = _hyperscript("its *computed-height", { result: div }); + value.should.equal("0px"); + + value = _hyperscript("my *computed-bad-prop", { me: div }); + should.equal(value, ''); + }); + + it("calculated of style ref works", function () { + var div = make("
"); + + var value = _hyperscript("*computed-color of me", { me: div }); + value.should.equal("rgb(255, 0, 0)"); + + value = _hyperscript("*computed-text-align of me", { me: div }); + value.should.equal("center"); + + value = _hyperscript("*computed-width of me", { me: div }); + value.should.equal("10px"); + + value = _hyperscript("*computed-height of it", { result: div }); + value.should.equal("0px"); + + value = _hyperscript("*computed-bad-prop of me", { me: div }); + should.equal(value, ''); + }); + + + +}); diff --git a/www/test/0.9.13/test/expressions/symbol.js b/www/test/0.9.13/test/expressions/symbol.js new file mode 100644 index 00000000..74acb5e5 --- /dev/null +++ b/www/test/0.9.13/test/expressions/symbol.js @@ -0,0 +1,11 @@ +describe("the symbol expression", function () { + it("resolves local context properly", function () { + var result = evalHyperScript("foo", { locals: { foo: 42 } }); + result.should.equal(42); + }); + + it("resolves global context properly", function () { + var result = evalHyperScript("document", { locals : { foo: 42 } }); + result.should.equal(document); + }); +}); diff --git a/www/test/0.9.13/test/expressions/typecheck.js b/www/test/0.9.13/test/expressions/typecheck.js new file mode 100644 index 00000000..2ddffe07 --- /dev/null +++ b/www/test/0.9.13/test/expressions/typecheck.js @@ -0,0 +1,36 @@ +describe("the typecheck expression", function () { + it("can do basic string typecheck", function () { + var result = evalHyperScript("'foo' : String"); + result.should.equal("foo"); + }); + + it("can do null as string typecheck", function () { + var result = evalHyperScript("null : String"); + should.equal(result, null); + }); + + it("can do basic non-string typecheck failure", function () { + try { + var result = evalHyperScript("true : String"); + throw new Error("should not reach"); + } catch (e) { + console.log(e.message); + e.message.indexOf("Typecheck failed!").should.equal(0); + } + }); + + it("can do basic string non-null typecheck", function () { + var result = evalHyperScript("'foo' : String!"); + result.should.equal("foo"); + }); + + it("null causes null safe string check to fail", function () { + try { + var result = evalHyperScript("null : String!"); + throw new Error("should not reach"); + } catch (e) { + console.log(e.message); + e.message.indexOf("Typecheck failed!").should.equal(0); + } + }); +}); diff --git a/www/test/0.9.13/test/ext/tailwind.js b/www/test/0.9.13/test/ext/tailwind.js new file mode 100644 index 00000000..3d38d486 --- /dev/null +++ b/www/test/0.9.13/test/ext/tailwind.js @@ -0,0 +1,100 @@ +describe("tailwindcss extensions", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + _hyperscript.config.defaultHideShowStrategy = null; + }); + + it("can hide element, with tailwindcss hidden class default strategy", function () { + _hyperscript.config.defaultHideShowStrategy = "twDisplay"; + var div = make("
"); + div.classList.contains("hidden").should.equal(false); + div.click(); + div.classList.contains("hidden").should.equal(true); + }); + + it("can hide element, with tailwindcss invisible class default strategy", function () { + _hyperscript.config.defaultHideShowStrategy = "twVisibility"; + var div = make("
"); + div.classList.contains("invisible").should.equal(false); + div.click(); + div.classList.contains("invisible").should.equal(true); + }); + + it("can hide element, with tailwindcss opacity-0 class default strategy", function () { + _hyperscript.config.defaultHideShowStrategy = "twOpacity"; + var div = make("
"); + div.classList.contains("opacity-0").should.equal(false); + div.click(); + div.classList.contains("opacity-0").should.equal(true); + }); + + it("can hide element, with tailwindcss hidden class", function () { + var div = make("
"); + div.classList.contains("hidden").should.equal(false); + div.click(); + div.classList.contains("hidden").should.equal(true); + }); + + it("can hide element, with tailwindcss invisible class", function () { + var div = make("
"); + div.classList.contains("invisible").should.equal(false); + div.click(); + div.classList.contains("invisible").should.equal(true); + }); + + it("can hide element, with tailwindcss opacity-0 class", function () { + var div = make("
"); + div.classList.contains("opacity-0").should.equal(false); + div.click(); + div.classList.contains("opacity-0").should.equal(true); + }); + + + it("can show element, with tailwindcss removing hidden class default strategy", function () { + _hyperscript.config.defaultHideShowStrategy = "twDisplay"; + var div = make(""); + div.classList.contains("hidden").should.equal(true); + div.click(); + div.classList.contains("hidden").should.equal(false); + }); + + it("can show element, with tailwindcss removing invisible class default strategy", function () { + _hyperscript.config.defaultHideShowStrategy = "twVisibility"; + var div = make(""); + div.classList.contains("invisible").should.equal(true); + div.click(); + div.classList.contains("invisible").should.equal(false); + }); + + it("can show element, with tailwindcss removing opacity-0 class default strategy", function () { + _hyperscript.config.defaultHideShowStrategy = "twOpacity"; + var div = make("
"); + div.classList.contains("opacity-0").should.equal(true); + div.click(); + div.classList.contains("opacity-0").should.equal(false); + }); + + it("can show element, with tailwindcss removing hidden class", function () { + var div = make(""); + div.classList.contains("hidden").should.equal(true); + div.click(); + div.classList.contains("hidden").should.equal(false); + }); + + it("can show element, with tailwindcss removing invisible class", function () { + var div = make(""); + div.classList.contains("invisible").should.equal(true); + div.click(); + div.classList.contains("invisible").should.equal(false); + }); + + it("can show element, with tailwindcss removing opacity-0 class", function () { + var div = make("
"); + div.classList.contains("opacity-0").should.equal(true); + div.click(); + div.classList.contains("opacity-0").should.equal(false); + }); +}); \ No newline at end of file diff --git a/www/test/0.9.13/test/features/behavior.js b/www/test/0.9.13/test/features/behavior.js new file mode 100644 index 00000000..877a625e --- /dev/null +++ b/www/test/0.9.13/test/features/behavior.js @@ -0,0 +1,104 @@ +describe("the behavior feature", function () { + it("can define behaviors", function () { + var behavior = make( + "" + ); + assert.property(window, "TheBehaviorWeAreDefiningForHyperscriptTestingPurposes"); + delete window.TheBehaviorWeAreDefiningForHyperscriptTestingPurposes; + }); + + it("can install behaviors", function () { + var behavior = make( + "" + ); + var div = make("
"); + div.classList.contains("foo").should.equal(false); + div.click(); + div.classList.contains("foo").should.equal(true); + delete window.Behave; + }); + + it("can pass arguments to behaviors", function () { + var behavior = make( + "" + ); + var div = make("
"); + div.textContent.should.equal(""); + div.click(); + div.textContent.should.equal("2"); + delete window.Behave; + }); + + it("supports init blocks in behaviors", function (done) { + var behavior = make(""); + var div = make("
"); + setTimeout(() => { + div.classList.contains("foo").should.equal(true); + delete window.Behave; + done(); + }); + }); + + it("can pass element arguments to listen to in behaviors", function () { + var behavior = make( + "" + ); + var btn = make(""); + var div = make("
"); + div.textContent.should.equal(""); + btn.click(); + div.textContent.should.equal("foo"); + delete window.Behave; + }); + + it("can refer to arguments in init blocks", function (done) { + var behavior = make( + "" + ); + var div1 = make("
"); + var div2 = make("
"); + div1.textContent.should.equal(""); + setTimeout(function () { + div1.textContent.should.equal("foo"); + delete window.Behave; + done(); + }, 10); + }); + + it("can declare variables in init blocks", function (done) { + var behavior = make( + ` + `); + var div = make("
"); + div.textContent.should.equal(""); + setTimeout(function () { + div.click(); + div.textContent.should.equal("2"); + div.click(); + div.textContent.should.equal("3"); + delete window.Behave; + done(); + }, 20); + }); + +}); diff --git a/www/test/0.9.13/test/features/def.js b/www/test/0.9.13/test/features/def.js new file mode 100644 index 00000000..cbe86e3e --- /dev/null +++ b/www/test/0.9.13/test/features/def.js @@ -0,0 +1,383 @@ +describe("the def feature", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can define a basic no arg function", function () { + var script = make( + "" + ); + var bar = make("
"); + var div = make("
"); + div.classList.contains("called").should.equal(false); + bar.click(); + div.classList.contains("called").should.equal(true); + delete window.foo; + }); + + it("can define a basic one arg function", function () { + var script = make(""); + var bar = make("
"); + var div = make("
"); + div.innerHTML.should.equal(""); + bar.click(); + div.innerHTML.should.equal("called"); + delete window.foo; + }); + + it("functions can be namespaced", function () { + var script = make( + "" + ); + var bar = make("
"); + var div = make("
"); + div.classList.contains("called").should.equal(false); + bar.click(); + div.classList.contains("called").should.equal(true); + delete window.utils; + }); + + it("is called synchronously", function () { + var script = make(""); + var bar = make("
"); + var div = make("
"); + div.classList.contains("called").should.equal(false); + bar.click(); + div.classList.contains("called").should.equal(true); + delete window.foo; + }); + + it("can call asynchronously", function (done) { + var script = make( + "" + ); + var bar = make("
"); + var div = make("
"); + div.classList.contains("called").should.equal(false); + bar.click(); + setTimeout(function () { + div.classList.contains("called").should.equal(true); + delete window.foo; + done(); + }, 10); + }); + + it("can return a value synchronously", function () { + var script = make(""); + var bar = make("
"); + var div = make("
"); + div.innerText.should.equal(""); + bar.click(); + div.innerText.should.equal("foo"); + delete window.foo; + }); + + it("can exit", function () { + make(""); + should.equal(foo(), null); + delete window.foo; + }); + + it("can return a value asynchronously", function (done) { + var script = make( + "" + ); + var bar = make("
"); + var div = make("
"); + div.innerText.should.equal(""); + bar.click(); + setTimeout(function () { + div.innerText.should.equal("foo"); + delete window.foo; + done(); + }, 10); + }); + + it("can interop with javascript", function () { + var script = make(""); + foo().should.equal("foo"); + delete window.foo; + }); + + it("can interop with javascript asynchronously", function (done) { + var script = make( + "" + ); + var result = foo(); + result.then(function (val) { + val.should.equal("foo"); + delete window.foo; + done(); + }); + }); + + it("can catch exceptions", function () { + var script = make( + "" + ); + foo(); + window.bar.should.equal("bar"); + delete window.bar; + delete window.foo; + }); + + it("can rethrow in catch blocks", function () { + var script = make( + "" + ); + try { + foo(); + true.should.equal(false); + } catch (e) { + e.should.equal("bar"); + } + delete window.foo; + }); + + it("can return in catch blocks", function () { + var script = make( + "" + ); + foo().should.equal(42); + delete window.foo; + }); + + it("can catch async exceptions", function (done) { + var script = make( + "" + ); + foo(); + setTimeout(function () { + window.bar.should.equal("bar"); + delete window.bar; + delete window.foo; + delete window.doh; + done(); + }, 20); + }); + + it("can catch nested async exceptions", function (done) { + var script = make( + "" + ); + foo(); + setTimeout(function () { + window.bar.should.equal("bar"); + delete window.bar; + delete window.foo; + delete window.doh; + done(); + }, 20); + }); + + it("can rethrow in async catch blocks", function (done) { + var script = make( + "" + ); + foo().catch(function (reason) { + reason.should.equal("bar"); + delete window.foo; + done(); + }); + }); + + it("can return in async catch blocks", function (done) { + var script = make( + "" + ); + foo().then(function (val) { + val.should.equal(42); + delete window.foo; + done(); + }); + }); + + it("can install a function on an element and use in children w/ no leak", function () { + var div = make( + "
" + + "
" + ); + + byId("d1").click(); + byId("d3").innerText.should.equal("42"); + }); + + it("can install a function on an element and use in children w/ return value", function () { + var div = make( + "
" + + "
" + ); + + byId("d1").click(); + byId("d1").innerText.should.equal("42"); + }); + + it("can install a function on an element and use me symbol correctly", function () { + var div = make( + "
" + + "
" + ); + byId("d1").click(); + div.innerText.should.equal("42"); + }); + + it("finally blocks run normally", function () { + var script = make( + "" + ); + foo(); + window.bar.should.equal(20); + delete window.bar; + delete window.foo; + }); + + it("finally blocks run when an exception occurs", function () { + var script = make( + "" + ); + try { + foo(); + } catch(e) { + // ignore + } + window.bar.should.equal(20); + delete window.bar; + delete window.foo; + }); + + it("finally blocks run when an exception expr occurs", function (done) { + window.throwsAsyncException = function(){ + return new Promise(function(resolve, reject){ + reject("foo"); + }) + } + var script = make( + "" + ); + foo(); + setTimeout(function () { + window.bar.should.equal(20); + delete window.throwsAsyncException; + delete window.bar; + delete window.foo; + done(); + }, 20); + }); + + it("async finally blocks run normally", function (done) { + var script = make( + "" + ); + foo(); + setTimeout(function(){ + window.bar.should.equal(20); + delete window.bar; + delete window.foo; + done(); + }, 20) + }); + + it("async finally blocks run when an exception occurs", function (done) { + var script = make( + "" + ); + foo(); + setTimeout(function(){ + window.bar.should.equal(20); + delete window.bar; + delete window.foo; + done(); + }, 20) + }); + +}); diff --git a/www/test/0.9.13/test/features/init.js b/www/test/0.9.13/test/features/init.js new file mode 100644 index 00000000..cc92ed9e --- /dev/null +++ b/www/test/0.9.13/test/features/init.js @@ -0,0 +1,47 @@ +describe("the init feature", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can define an init block inline", function (done) { + var div = make( + "
" + ); + setTimeout(function () { + div.click(); + div.innerHTML.should.equal("42"); + done(); + }, 10); + }); + + it("can define an init block in a script", function (done) { + var div = make( + "" + ); + setTimeout(function () { + window.foo.should.equal(42); + delete window.foo; + done(); + }, 10); + }); + + it("can initialize immediately", function (done) { + var div = make( + "" + ); + setTimeout(function () { + window.foo.should.equal(10); + should.equal(window.bar, undefined); + delete window.foo; + delete window.bar; + done(); + }, 10); + }); +}); diff --git a/www/test/0.9.13/test/features/js.js b/www/test/0.9.13/test/features/js.js new file mode 100644 index 00000000..3cfce0b3 --- /dev/null +++ b/www/test/0.9.13/test/features/js.js @@ -0,0 +1,67 @@ +describe("The (top-level) js feature", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can run js at the top level", function () { + window.testSuccess = false; + var script = make("
" + ); + setTimeout(function () { + byId("loadedDemo").innerText.should.equal("Loaded"); + done(); + }, 1); + }); + + it("can have a simple event filter", function () { + var div = make("
"); + div.click(); + byId("d1").innerText.should.equal(""); + }); + + it("can refer to event properties directly in filter", function () { + var div = make("
"); + div.click(); + div.innerText.should.equal("Clicked"); + + div = make("
"); + div.click(); + div.innerText.should.equal(""); + + div = make( + "
" + ); + div.click(); + div.innerText.should.equal(""); + }); + + it("can refer to event detail properties directly in filter", function () { + var div = make( + "
" + ); + let event = new Event('example'); + event.detail = {"foo": true} + div.dispatchEvent(event); + div.innerText.should.equal("1"); + + event.detail = {"foo": false} + div.dispatchEvent(event); + div.innerText.should.equal("1"); + + event.detail = {"foo": true} + div.dispatchEvent(event); + div.innerText.should.equal("2"); + }); + + it("can click after a positive event filter", function () { + var div = make("
"); + div.dispatchEvent(new CustomEvent("foo", { detail: { bar: false } })); + div.innerText.should.equal(""); + + div.dispatchEvent(new CustomEvent("foo", { detail: { bar: true } })); + div.innerText.should.equal("triggered"); + }); + + it("multiple event handlers at a time are allowed to execute with the every keyword", function () { + var i = 1; + window.increment = function () { + return i++; + }; + + var div = make("
"); + div.click(); + div.innerText.should.equal("1"); + div.click(); + div.innerText.should.equal("2"); + div.click(); + div.innerText.should.equal("3"); + delete window.increment; + }); + + it("can have multiple event handlers", function () { + var i = 1; + window.increment = function () { + return i++; + }; + + var div = make( + "
" + ); + div.dispatchEvent(new CustomEvent("foo")); + div.innerText.should.equal("1"); + div.dispatchEvent(new CustomEvent("bar")); + div.innerText.should.equal("2"); + div.dispatchEvent(new CustomEvent("foo")); + div.innerText.should.equal("3"); + delete window.increment; + }); + + it("can have multiple event handlers, no end", function () { + var i = 1; + window.increment = function () { + return i++; + }; + + var div = make( + "
" + ); + div.dispatchEvent(new CustomEvent("foo")); + div.innerText.should.equal("1"); + div.dispatchEvent(new CustomEvent("bar")); + div.innerText.should.equal("2"); + div.dispatchEvent(new CustomEvent("foo")); + div.innerText.should.equal("3"); + delete window.increment; + }); + + it("can queue events", function (done) { + var i = 0; + window.increment = function () { + return i++; + }; + + // start first event + var div = make("
"); + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // ungate first event handler + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(1); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + delete window.increment; + done(); + }, 20); + }, 20); + }, 20); + }); + + it("can queue first event", function (done) { + var i = 0; + window.increment = function () { + return i++; + }; + + // start first event + var div = make("
"); + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // ungate first event handler + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(1); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + delete window.increment; + done(); + }, 20); + }, 20); + }, 20); + }); + + it("can queue last event", function (done) { + var i = 0; + window.increment = function () { + return i++; + }; + + // start first event + var div = make("
"); + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // ungate first event handler + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(1); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + delete window.increment; + done(); + }, 20); + }, 20); + }, 20); + }); + + it("can queue all events", function (done) { + var i = 0; + window.increment = function () { + return i++; + }; + + // start first event + var div = make("
"); + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // queue next event + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(0); + + // ungate first event handler + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(1); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(2); + div.dispatchEvent(new CustomEvent("bar")); + setTimeout(function () { + i.should.equal(3); + delete window.increment; + done(); + }, 20); + }, 20); + }, 20); + }); + + it("queue none does not allow future queued events", function (done) { + var i = 1; + window.increment = function () { + return i++; + }; + + var div = make( + "
" + ); + div.click(); + div.innerText.should.equal("1"); + div.click(); + div.innerText.should.equal("1"); + div.dispatchEvent(new CustomEvent("customEvent")); + setTimeout(function () { + div.innerText.should.equal("1"); + div.click(); + div.innerText.should.equal("2"); + delete window.increment; + done(); + }, 20); + }); + + it("can invoke on multiple events", function () { + var i = 0; + window.increment = function () { + return i++; + }; + + var div = make("
"); + div.click(); + i.should.equal(1); + div.dispatchEvent(new CustomEvent("foo")); + i.should.equal(2); + delete window.increment; + }); + + it("can listen for events in another element (lazy)", function () { + var div = make( + "
" + + "
" + + "
" + + "
" + ); + var div1 = byId("d1"); + div1.click(); + div1.should.equal(window.tmp); + delete window.tmp; + }); + + it("can filter events based on count", function () { + var div = make("
0
"); + div.click(); + div.innerHTML.should.equal("1"); + div.click(); + div.innerHTML.should.equal("1"); + div.click(); + div.innerHTML.should.equal("1"); + }); + + it("can filter events based on count range", function () { + var div = make("
0
"); + div.click(); + div.innerHTML.should.equal("1"); + div.click(); + div.innerHTML.should.equal("2"); + div.click(); + div.innerHTML.should.equal("2"); + }); + + it("can filter events based on unbounded count range", function () { + var div = make("
0
"); + div.click(); + div.innerHTML.should.equal("0"); + div.click(); + div.innerHTML.should.equal("1"); + div.click(); + div.innerHTML.should.equal("2"); + }); + + it("can mix ranges", function () { + var div = make( + '
0
' + ); + div.click(); + div.innerHTML.should.equal("one"); + div.click(); + div.innerHTML.should.equal("two"); + div.click(); + div.innerHTML.should.equal("three"); + div.click(); + div.innerHTML.should.equal("three"); + }); + + it("can listen for general mutations", function (done) { + // pretty subtle: mutation events are async, so we need to ensure that we wait for the mutation event + // so that we don't end up in an infinite mutation loop + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("can listen for attribute mutations", function (done) { + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("can listen for specific attribute mutations", function (done) { + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("can listen for specific attribute mutations and filter out other attribute mutations", function (done) { + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal(""); + done(); + }, 50); + }); + + it("can listen for childList mutations", function (done) { + var div = make( + "
" + ); + div.appendChild(document.createElement("P")); + setTimeout(function () { + div.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("can listen for childList mutation filter out other mutations", function (done) { + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal(""); + done(); + }, 50); + }); + + it("can listen for characterData mutation filter out other mutations", function (done) { + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal(""); + done(); + }, 50); + }); + + it("can listen for multiple mutations", function (done) { + var div = make("
"); + div.setAttribute("foo", "bar"); + setTimeout(function () { + div.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("can listen for multiple mutations 2", function (done) { + var div = make("
"); + div.setAttribute("bar", "bar"); + setTimeout(function () { + div.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("can listen for attribute mutations on other elements", function (done) { + var div1 = make("
"); + var div2 = make("
"); + div1.setAttribute("foo", "bar"); + setTimeout(function () { + div2.innerHTML.should.equal("Mutated"); + done(); + }, 50); + }); + + it("each behavior installation has its own event queue", function (done) { + var behavior = make( + "" + ); + var div = make("
"); + div.dispatchEvent(new CustomEvent("foo")); + + var div2 = make("
"); + div2.dispatchEvent(new CustomEvent("foo")); + + var div3 = make("
"); + div3.dispatchEvent(new CustomEvent("foo")); + + setTimeout(function () { + div.innerHTML.should.equal("behavior") + div2.innerHTML.should.equal("behavior") + div3.innerHTML.should.equal("behavior") + delete window.DemoBehavior; + done(); + }, 100); + }); + + it("can catch exceptions thrown in js functions", function () { + window.throwBar = function() { + throw "bar"; + } + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + delete window.throwBar; + }); + + it("can catch exceptions thrown in hyperscript functions", function () { + make("s") + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + delete window.throwBar; + }); + + it("can catch top-level exceptions", function () { + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + }); + + it("can catch async top-level exceptions", function (done) { + var btn = make( + "" + ); + btn.click(); + setTimeout(function () { + btn.innerHTML.should.equal("bar"); + done(); + }, 10); + }); + + it("async exceptions don't kill the event queue", function (done) { + var btn = make( + "" + ); + btn.click(); + btn.click(); + setTimeout(function () { + btn.innerHTML.should.equal("success"); + done(); + }, 20); + }); + + it("exceptions in catch block don't kill the event queue", function () { + var btn = make( + "" + ); + btn.click(); + btn.click(); + btn.innerHTML.should.equal("success"); + }); + + it("uncaught exceptions trigger 'exception' event", function () { + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + }); + + + it("caught exceptions do not trigger 'exception' event", function () { + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("foo"); + }); + + it("rethrown exceptions trigger 'exception' event", function () { + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + }); + + it("basic finally blocks work", function () { + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + }); + + it("finally blocks work when exception thrown in catch", function () { + var btn = make( + "" + ); + btn.click(); + btn.innerHTML.should.equal("bar"); + }); + + it("async basic finally blocks work", function (done) { + var btn = make( + "" + ); + btn.click(); + setTimeout(function () { + btn.innerHTML.should.equal("bar"); + done(); + }, 20); + }); + + it("async finally blocks work when exception thrown in catch", function (done) { + var btn = make( + "" + ); + btn.click(); + setTimeout(function () { + btn.innerHTML.should.equal("foobar"); + done(); + }, 20); + }); + + + it("async exceptions in finally block don't kill the event queue", function (done) { + var btn = make( + "" + ); + btn.click(); + btn.click(); + setTimeout(function () { + btn.innerHTML.should.equal("success"); + done(); + }, 20); + }); + + it("exceptions in finally block don't kill the event queue", function () { + var btn = make( + "" + ); + btn.click(); + btn.click(); + btn.innerHTML.should.equal("success"); + }); + + it("can ignore when target doesn't exist", function () { + var div = make( + "
" + ); + div.click(); + div.innerHTML.should.equal("clicked"); + }); + + it("can handle an or after a from clause", function () { + var d1 = make("
"); + var d2 = make("
"); + var div = make( + "
" + ); + d1.click(); + div.innerHTML.should.equal("1"); + d2.click(); + div.innerHTML.should.equal("2"); + + }); + +}); diff --git a/www/test/0.9.13/test/features/set.js b/www/test/0.9.13/test/features/set.js new file mode 100644 index 00000000..e814f235 --- /dev/null +++ b/www/test/0.9.13/test/features/set.js @@ -0,0 +1,19 @@ +describe("the set feature", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can define variables with let at the element level", function (done) { + var div = make( + "
" + ); + div.click(); + div.innerHTML.should.equal("42"); + done(); + }); + +}); diff --git a/www/test/0.9.13/test/features/socket.js b/www/test/0.9.13/test/features/socket.js new file mode 100644 index 00000000..4567bf8c --- /dev/null +++ b/www/test/0.9.13/test/features/socket.js @@ -0,0 +1,50 @@ +describe("the socket feature", function () { + it("can handle different url schemes", function () { + try { + _hyperscript("socket MySocket ws:/ws/test/ on message as json log message end"); + } catch (e) { + if (e instanceof DOMException) { + assert.fail("Scheme ws: Should not have thrown"); + } + } + assert.property(window, "MySocket"); + delete window.MySocket; + + try { + _hyperscript("socket MySocket wss:/ws/test/ on message as json log message end"); + } catch (e) { + if (e instanceof DOMException) { + assert.fail("Scheme wss: Should not have thrown"); + } + } + assert.property(window, "MySocket"); + delete window.MySocket; + + try { + _hyperscript("socket MySocket /ws/test/ on message as json log message end"); + } catch (e) { + if (e instanceof DOMException) { + assert.fail("No scheme: Should not have thrown"); + } + } + assert.property(window, "MySocket"); + var url = window.MySocket["raw"].url + if (window.location.protocol === "http:") + assert.include(url, "ws"); + else + assert.include(url, "wss"); + assert.include(url, window.location.hostname); + if (window.location.port) + assert.include(url, window.location.port); + delete window.MySocket; + + try { + _hyperscript("socket MySocket abc:/ws/test/ on message as json log message end"); + } catch (e) { + if (!(e instanceof DOMException)) { + assert.fail("Scheme abc: Should have thrown"); + } + } + assert.notProperty(window, "MySocket"); + }); +}); diff --git a/www/test/0.9.13/test/features/worker.js b/www/test/0.9.13/test/features/worker.js new file mode 100644 index 00000000..8d9d8119 --- /dev/null +++ b/www/test/0.9.13/test/features/worker.js @@ -0,0 +1,134 @@ +describe("the worker feature", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can define a basic no arg function in a worker", function (done) { + var script = make( + "" + ); + window.example.func().then(function (result) { + assert.equal(result, 1); + delete window.example; + done(); + }); + }); + + it("can define a basic one arg function", function (done) { + var script = make( + "" + ); + window.example.fn(1).then(function (result) { + assert.equal(result, 1); + delete window.example; + done(); + }); + }); + + it("can call functions from within _hyperscript", function (done) { + var div; + var script = make( + "" + ); + div = make( + "
" + ); + div.addEventListener("finishTest", function () { + div.innerHTML.should.equal("2"); + delete window.example; + done(); + }); + div.click(); + }); + + it("can evaluate expressions in worker functions", function (done) { + var script = make( + "" + ); + window.example.fn(1).then(function (result) { + assert.equal(result, 2); + delete window.example; + done(); + }); + }); + + it("workers can be namespaced", function (done) { + var script = make( + "" + ); + window.example.foo.bar.fn().then(function (result) { + assert.equal(result, 1); + delete window.example; + done(); + }); + }); + + it("can access global scope in worker function", function (done) { + var script = make( + "" + ); + window.example.func().then(function (result) { + assert.equal(result, 2); + delete window.example; + done(); + }); + }); + + it("can import external scripts", function (done) { + var script = make( + "" + ); + window.example.func().then(function (result) { + assert.equal(result, 3); + delete window.example; + done(); + }); + }); +}); diff --git a/www/test/0.9.13/test/index.html b/www/test/0.9.13/test/index.html new file mode 100644 index 00000000..254d8843 --- /dev/null +++ b/www/test/0.9.13/test/index.html @@ -0,0 +1,157 @@ + + + + + Mocha Tests + + + + + + + + + + +

core.js test suite

+ +

Scratch Page

+ + +

Mocha Test Suite

+ [RUN ALL] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Work Area +
+
+ + diff --git a/www/test/0.9.13/test/playground/scratch.html b/www/test/0.9.13/test/playground/scratch.html new file mode 100644 index 00000000..34e3c503 --- /dev/null +++ b/www/test/0.9.13/test/playground/scratch.html @@ -0,0 +1,123 @@ + + + + + + + + + + Work Area + +

+ +
+ Click Me +
+ -- + + +
+ + +
+ + + +
+ + + +
+ + + + +
+ asdfasdf +
+ + + + + + + +

+ +

+ +

+ +

+

+ [ + + + ] +

+ + + + + diff --git a/www/test/0.9.13/test/playground/tailwinds.html b/www/test/0.9.13/test/playground/tailwinds.html new file mode 100644 index 00000000..c698caa0 --- /dev/null +++ b/www/test/0.9.13/test/playground/tailwinds.html @@ -0,0 +1,235 @@ + + + + + Hyperscript Modal + + + + + + + + + + +
+ +
+ + + + diff --git a/www/test/0.9.13/test/sockets/asyncio b/www/test/0.9.13/test/sockets/asyncio new file mode 100644 index 00000000..e69de29b diff --git a/www/test/0.9.13/test/sockets/json b/www/test/0.9.13/test/sockets/json new file mode 100644 index 00000000..e69de29b diff --git a/www/test/0.9.13/test/sockets/scratch.html b/www/test/0.9.13/test/sockets/scratch.html new file mode 100644 index 00000000..c20957b7 --- /dev/null +++ b/www/test/0.9.13/test/sockets/scratch.html @@ -0,0 +1,51 @@ + + + + + + + + + + Web Socket Playground +
+ + + +
+ + + + + +
+ +
+ +
+ + diff --git a/www/test/0.9.13/test/sockets/server.py b/www/test/0.9.13/test/sockets/server.py new file mode 100644 index 00000000..14b7146e --- /dev/null +++ b/www/test/0.9.13/test/sockets/server.py @@ -0,0 +1,37 @@ + +#!/usr/bin/env python3 + +import asyncio +import websockets +import json + +async def server(websocket, path): + while True: + # Get received data from websocket + data = await websocket.recv() + print ("Received: " + data) + json_data = json.loads(data) + if json_data.get('function') == 'echo': + #echo back the first argument + json_data['return'] = json_data['args'][0] + elif json_data.get('function') == 'ask': + #echo back the first argument + json_data['return'] = input(json_data['args'][0]) + elif json_data.get('function') == 'throw': + #throw the first argument + json_data['throw'] = json_data['args'][0] + elif not json_data.get('function') is None: + json_data['throw'] = 'Unknown function : ' + json_data['function'] + + # Send response back to client to acknowledge receiving message + response = json.dumps(json_data) + print ("Responding: " + response) + await websocket.send(response) + +# Create websocket server +start_server = websockets.serve(server, "localhost", 5150) + +# Start and run websocket server forever +asyncio.get_event_loop().run_until_complete(start_server) +print("Starting loop") +asyncio.get_event_loop().run_forever() \ No newline at end of file diff --git a/www/test/0.9.13/test/sockets/websockets b/www/test/0.9.13/test/sockets/websockets new file mode 100644 index 00000000..e69de29b diff --git a/www/test/0.9.13/test/templates/templates.js b/www/test/0.9.13/test/templates/templates.js new file mode 100644 index 00000000..8061fa94 --- /dev/null +++ b/www/test/0.9.13/test/templates/templates.js @@ -0,0 +1,53 @@ +describe("Templating", function () { + it("can render", function () { + var tmpl = make(""); + _hyperscript("render tmpl with (x: x) then put it into window.res", { + locals: { + x: ":)", + tmpl: tmpl, + } + }); + window.res.should.equal("render :)"); + delete window.res; + }); + + it("escapes html, with opt-out", function () { + var tmpl = make(""); + _hyperscript("render tmpl with (x: x) then put it into window.res", { + locals: { + x: "
", + tmpl: tmpl, + } + }); + window.res.should.equal("render <br>
"); + delete window.res; + }); + + it("supports repeat", function () { + var tmpl = make( + "" + ); + _hyperscript("render tmpl with (x: x) then put it into window.res", { + locals: { + x: ":)", + tmpl: tmpl, + } + }); + window.res.should.equal("begin\n1\n2\n3\nend\n"); + delete window.res; + }); + + it("supports if", function () { + var tmpl = make( + "" + ); + _hyperscript("render tmpl with (x: x) then put it into window.res", { + locals: { + x: ":)", + tmpl: tmpl, + } + }); + window.res.should.equal("begin\na\nend\n"); + delete window.res; + }); +}); diff --git a/www/test/0.9.13/test/util/util.js b/www/test/0.9.13/test/util/util.js new file mode 100644 index 00000000..7ecbac19 --- /dev/null +++ b/www/test/0.9.13/test/util/util.js @@ -0,0 +1,133 @@ +/* Test Utilities */ + +function byId(id) { + return document.getElementById(id); +} + +function make(htmlStr) { + var makeFn = function () { + var range = document.createRange(); + var fragment = range.createContextualFragment(htmlStr); + var wa = getWorkArea(); + var child = null; + while(fragment.children.length > 0) { + child = fragment.children[0]; + _hyperscript.processNode(child); + wa.appendChild(child); + } + return child; // return last added element + }; + if (getWorkArea()) { + return makeFn(); + } else { + ready(makeFn); + } +} + +function promiseAnIntIn(millis) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + console.log("resolving"); + resolve(42); + }, millis); + }); +} + +function promiseValueBackIn(value, millis) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + console.log("resolving"); + resolve(value); + }, millis); + }); +} + +function ready(fn) { + if (document.readyState !== "loading") { + fn(); + } else { + document.addEventListener("DOMContentLoaded", fn); + } +} + +function getWorkArea() { + return byId("work-area"); +} + +function clearWorkArea() { + getWorkArea().innerHTML = ""; +} + +function evalHyperScript(src, ctx) { + return _hyperscript(src, ctx); +} + +function getParseErrorFor(src) { + try { + evalHyperScript(src); + } catch (e) { + return e.message; + } + return ""; +} + +function startsWith(str, expected) { + assert.isNotNull(str); + assert.equal(str.indexOf(expected), 0, "Expected string:\n\n'" + str + "'\n\nto start with:\n\n" + expected + "\n\n"); +} + +function getHTTPMethod(xhr) { + return xhr.requestHeaders["X-HTTP-Method-Override"] || xhr.method; +} + +function makeServer() { + var server = sinon.fakeServer.create(); + server.fakeHTTPMethods = true; + server.getHTTPMethod = function (xhr) { + return getHTTPMethod(xhr); + }; + return server; +} + +function parseParams(str) { + var re = /([^&=]+)=?([^&]*)/g; + var decode = function (str) { + return decodeURIComponent(str.replace(/\+/g, " ")); + }; + var params = {}, + e; + if (str) { + if (str.substr(0, 1) == "?") { + str = str.substr(1); + } + while ((e = re.exec(str))) { + var k = decode(e[1]); + var v = decode(e[2]); + if (params[k] !== undefined) { + if (!Array.isArray(params[k])) { + params[k] = [params[k]]; + } + params[k].push(v); + } else { + params[k] = v; + } + } + } + return params; +} + +function getQuery(url) { + var question = url.indexOf("?"); + var hash = url.indexOf("#"); + if (hash == -1 && question == -1) return ""; + if (hash == -1) hash = url.length; + return question == -1 || hash == question + 1 ? url.substring(hash) : url.substring(question + 1, hash); +} + +function getParameters(xhr) { + if (getHTTPMethod(xhr) == "GET") { + return parseParams(getQuery(xhr.url)); + } else { + return parseParams(xhr.requestBody); + } +} diff --git a/www/test/index.html b/www/test/index.html index 1ceb3959..2df199bf 100644 --- a/www/test/index.html +++ b/www/test/index.html @@ -6,6 +6,7 @@
  • 0.9.5
  • 0.9.4
  • 0.9.2 +
  • 0.9.13
  • 0.9.12
  • 0.9.11
  • 0.9.10