release: WRNexusJS 0.2.44
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ai",
|
"name": "@wrnexus/ai",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.",
|
"description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/authz",
|
"name": "@wrnexus/authz",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/authz — part of the WrNexus framework.",
|
"description": "@wrnexus/authz — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
+11
-11
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/cli",
|
"name": "@wrnexus/cli",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/cli — part of the WrNexus framework.",
|
"description": "@wrnexus/cli — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -28,16 +28,16 @@
|
|||||||
"wrnexus": "./dist/index.js"
|
"wrnexus": "./dist/index.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44",
|
"@wrnexus/core": "^0.2.45",
|
||||||
"@wrnexus/router": "^0.2.44",
|
"@wrnexus/router": "^0.2.45",
|
||||||
"@wrnexus/csr": "^0.2.44",
|
"@wrnexus/csr": "^0.2.45",
|
||||||
"@wrnexus/compiler": "^0.2.44",
|
"@wrnexus/compiler": "^0.2.45",
|
||||||
"@wrnexus/styles": "^0.2.44",
|
"@wrnexus/styles": "^0.2.45",
|
||||||
"@wrnexus/dev-server": "^0.2.44",
|
"@wrnexus/dev-server": "^0.2.45",
|
||||||
"@wrnexus/ui": "^0.2.44",
|
"@wrnexus/ui": "^0.2.45",
|
||||||
"@wrnexus/validation": "^0.2.44",
|
"@wrnexus/validation": "^0.2.45",
|
||||||
"@wrnexus/i18n": "^0.2.44",
|
"@wrnexus/i18n": "^0.2.45",
|
||||||
"@wrnexus/db": "^0.2.44"
|
"@wrnexus/db": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/compiler",
|
"name": "@wrnexus/compiler",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/compiler — part of the WrNexus framework.",
|
"description": "@wrnexus/compiler — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/core",
|
"name": "@wrnexus/core",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/core — part of the WrNexus framework.",
|
"description": "@wrnexus/core — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/csr",
|
"name": "@wrnexus/csr",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/csr — part of the WrNexus framework.",
|
"description": "@wrnexus/csr — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/db",
|
"name": "@wrnexus/db",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/db — part of the WrNexus framework.",
|
"description": "@wrnexus/db — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/dev-server",
|
"name": "@wrnexus/dev-server",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/dev-server — part of the WrNexus framework.",
|
"description": "@wrnexus/dev-server — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -25,18 +25,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44",
|
"@wrnexus/core": "^0.2.45",
|
||||||
"@wrnexus/router": "^0.2.44",
|
"@wrnexus/router": "^0.2.45",
|
||||||
"@wrnexus/ssr": "^0.2.44",
|
"@wrnexus/ssr": "^0.2.45",
|
||||||
"@wrnexus/csr": "^0.2.44",
|
"@wrnexus/csr": "^0.2.45",
|
||||||
"@wrnexus/compiler": "^0.2.44",
|
"@wrnexus/compiler": "^0.2.45",
|
||||||
"@wrnexus/styles": "^0.2.44",
|
"@wrnexus/styles": "^0.2.45",
|
||||||
"@wrnexus/ui": "^0.2.44",
|
"@wrnexus/ui": "^0.2.45",
|
||||||
"@wrnexus/validation": "^0.2.44",
|
"@wrnexus/validation": "^0.2.45",
|
||||||
"@wrnexus/i18n": "^0.2.44",
|
"@wrnexus/i18n": "^0.2.45",
|
||||||
"@wrnexus/db": "^0.2.44",
|
"@wrnexus/db": "^0.2.45",
|
||||||
"@wrnexus/pubsub": "^0.2.44",
|
"@wrnexus/pubsub": "^0.2.45",
|
||||||
"@wrnexus/uploader": "^0.2.44"
|
"@wrnexus/uploader": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/encryption",
|
"name": "@wrnexus/encryption",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/encryption — part of the WrNexus framework.",
|
"description": "@wrnexus/encryption — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/helpers",
|
"name": "@wrnexus/helpers",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Safe convenience helpers for WrNexus request contexts and common application flows.",
|
"description": "Safe convenience helpers for WrNexus request contexts and common application flows.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/i18n",
|
"name": "@wrnexus/i18n",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/i18n — part of the WrNexus framework.",
|
"description": "@wrnexus/i18n — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/jwt",
|
"name": "@wrnexus/jwt",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/jwt — part of the WrNexus framework.",
|
"description": "@wrnexus/jwt — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/mobile",
|
"name": "@wrnexus/mobile",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/mobile — part of the WrNexus framework.",
|
"description": "@wrnexus/mobile — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/native": "^0.2.44"
|
"@wrnexus/native": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/native",
|
"name": "@wrnexus/native",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/native — part of the WrNexus framework.",
|
"description": "@wrnexus/native — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/oauth",
|
"name": "@wrnexus/oauth",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/oauth — part of the WrNexus framework.",
|
"description": "@wrnexus/oauth — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/pubsub",
|
"name": "@wrnexus/pubsub",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/pubsub — part of the WrNexus framework.",
|
"description": "@wrnexus/pubsub — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/queue",
|
"name": "@wrnexus/queue",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/queue — part of the WrNexus framework.",
|
"description": "@wrnexus/queue — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/reactive",
|
"name": "@wrnexus/reactive",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/reactive — part of the WrNexus framework.",
|
"description": "@wrnexus/reactive — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/router",
|
"name": "@wrnexus/router",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/router — part of the WrNexus framework.",
|
"description": "@wrnexus/router — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/compiler": "^0.2.44",
|
"@wrnexus/compiler": "^0.2.45",
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ssr",
|
"name": "@wrnexus/ssr",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/ssr — part of the WrNexus framework.",
|
"description": "@wrnexus/ssr — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/styles",
|
"name": "@wrnexus/styles",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/styles — part of the WrNexus framework.",
|
"description": "@wrnexus/styles — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/uploader": "^0.2.44"
|
"@wrnexus/uploader": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/test",
|
"name": "@wrnexus/test",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/test — part of the WrNexus framework.",
|
"description": "@wrnexus/test — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/tracking",
|
"name": "@wrnexus/tracking",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/tracking — part of the WrNexus framework.",
|
"description": "@wrnexus/tracking — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ui",
|
"name": "@wrnexus/ui",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/ui — part of the WrNexus framework.",
|
"description": "@wrnexus/ui — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
"./ui.css": "./ui.css"
|
"./ui.css": "./ui.css"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/uploader",
|
"name": "@wrnexus/uploader",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/uploader — part of the WrNexus framework.",
|
"description": "@wrnexus/uploader — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@wrnexus/core": "^0.2.44"
|
"@wrnexus/core": "^0.2.45"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/validation",
|
"name": "@wrnexus/validation",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "@wrnexus/validation — part of the WrNexus framework.",
|
"description": "@wrnexus/validation — part of the WrNexus framework.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ai",
|
"name": "@wrnexus/ai",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.",
|
"description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/authz",
|
"name": "@wrnexus/authz",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/cli",
|
"name": "@wrnexus/cli",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -474,6 +474,15 @@ const MIGRATIONS: Migration[] = [
|
|||||||
// No generated application files require automatic migration.
|
// No generated application files require automatic migration.
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.45",
|
||||||
|
id: "conditions-bug",
|
||||||
|
description:
|
||||||
|
"Adds server-rendered component each/if blocks and fixes dynamic component rendering.",
|
||||||
|
apply() {
|
||||||
|
// No generated application files require automatic migration.
|
||||||
|
},
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
/** Release tooling uses this to require an explicit migration entry per version. */
|
/** Release tooling uses this to require an explicit migration entry per version. */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/compiler",
|
"name": "@wrnexus/compiler",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -524,7 +524,13 @@ function hasClientBehavior(nodes: ViewNode[]): boolean {
|
|||||||
// `{t:key}` is i18n sugar resolved server-side — not client reactivity.
|
// `{t:key}` is i18n sugar resolved server-side — not client reactivity.
|
||||||
if (node.type === "text") return /\{(?!t:)[^{}]+\}/.test(node.value);
|
if (node.type === "text") return /\{(?!t:)[^{}]+\}/.test(node.value);
|
||||||
// Server control blocks render on the server; they don't add client reactivity.
|
// Server control blocks render on the server; they don't add client reactivity.
|
||||||
if (node.type === "each" || node.type === "if") return false;
|
if (node.type === "each") {
|
||||||
|
return hasClientBehavior(node.body) || hasClientBehavior(node.empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.type === "if") {
|
||||||
|
return node.branches.some((branch) => hasClientBehavior(branch.body));
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
node.attrs.some((attr) => attr.event || attr.name === "csrGet" || attr.name === "csrText") ||
|
node.attrs.some((attr) => attr.event || attr.name === "csrGet" || attr.name === "csrText") ||
|
||||||
hasClientBehavior(node.children)
|
hasClientBehavior(node.children)
|
||||||
@@ -1112,6 +1118,16 @@ function renderComponentNode(node: ViewNode, ctx: CompCtx): string {
|
|||||||
return renderNestedComponentInvocation(node, ctx);
|
return renderNestedComponentInvocation(node, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const loopVariables = loopVarsOf(node);
|
||||||
|
|
||||||
|
const elementContext =
|
||||||
|
loopVariables.length > 0
|
||||||
|
? {
|
||||||
|
...ctx,
|
||||||
|
loopVars: new Set([...(ctx.loopVars ?? []), ...loopVariables]),
|
||||||
|
}
|
||||||
|
: ctx;
|
||||||
|
|
||||||
let bindIndex = 0;
|
let bindIndex = 0;
|
||||||
const staticClasses: string[] = [];
|
const staticClasses: string[] = [];
|
||||||
const conditionalClasses: Array<{
|
const conditionalClasses: Array<{
|
||||||
@@ -1143,9 +1159,15 @@ function renderComponentNode(node: ViewNode, ctx: CompCtx): string {
|
|||||||
return ` ${a.name}`;
|
return ` ${a.name}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const rendered = ` ${a.name}="${compileAttrValue(a.value, ctx)}"`;
|
const rendered = ` ${a.name}="${compileAttrValue(a.value, elementContext)}"`;
|
||||||
|
|
||||||
if (!a.value.includes("{") || !exprRefsState(a.value, ctx.stateNames)) {
|
const referencesState = exprRefsState(a.value, ctx.stateNames);
|
||||||
|
|
||||||
|
const referencesLoopVariable = elementContext.loopVars
|
||||||
|
? exprRefsState(a.value, elementContext.loopVars)
|
||||||
|
: false;
|
||||||
|
|
||||||
|
if (!a.value.includes("{") || (!referencesState && !referencesLoopVariable)) {
|
||||||
return rendered;
|
return rendered;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1157,6 +1179,16 @@ function renderComponentNode(node: ViewNode, ctx: CompCtx): string {
|
|||||||
|
|
||||||
const initialConditionalClasses = conditionalClasses
|
const initialConditionalClasses = conditionalClasses
|
||||||
.map(({ className, expression }) => {
|
.map(({ className, expression }) => {
|
||||||
|
const referencesLoopVariable = elementContext.loopVars
|
||||||
|
? exprRefsState(expression, elementContext.loopVars)
|
||||||
|
: false;
|
||||||
|
|
||||||
|
// data-for variables do not exist during
|
||||||
|
// initial server rendering.
|
||||||
|
if (referencesLoopVariable) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
return `\${(${ctx.resolveExpr(expression)}) ? ${JSON.stringify(` ${className}`)} : ""}`;
|
return `\${(${ctx.resolveExpr(expression)}) ? ${JSON.stringify(` ${className}`)} : ""}`;
|
||||||
})
|
})
|
||||||
.join("");
|
.join("");
|
||||||
@@ -1168,7 +1200,7 @@ function renderComponentNode(node: ViewNode, ctx: CompCtx): string {
|
|||||||
|
|
||||||
const classAttribute =
|
const classAttribute =
|
||||||
staticClasses.length > 0 || conditionalClasses.length > 0
|
staticClasses.length > 0 || conditionalClasses.length > 0
|
||||||
? ` class="${compileAttrValue(staticClassValue, ctx)}${initialConditionalClasses}"`
|
? ` class="${compileAttrValue(staticClassValue, elementContext)}${initialConditionalClasses}"`
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
const classReactiveBinding = classHasReactiveExpression
|
const classReactiveBinding = classHasReactiveExpression
|
||||||
@@ -1186,11 +1218,6 @@ function renderComponentNode(node: ViewNode, ctx: CompCtx): string {
|
|||||||
})
|
})
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
// A `data-for` element introduces loop variables for its subtree.
|
|
||||||
const loops = loopVarsOf(node);
|
|
||||||
const childCtx =
|
|
||||||
loops.length > 0 ? { ...ctx, loopVars: new Set([...(ctx.loopVars ?? []), ...loops]) } : ctx;
|
|
||||||
|
|
||||||
const allAttrs =
|
const allAttrs =
|
||||||
`${classAttribute}` + `${classReactiveBinding}` + `${classBindings}` + `${attrs}`;
|
`${classAttribute}` + `${classReactiveBinding}` + `${classBindings}` + `${attrs}`;
|
||||||
|
|
||||||
@@ -1198,7 +1225,7 @@ function renderComponentNode(node: ViewNode, ctx: CompCtx): string {
|
|||||||
return `<${node.tag}${allAttrs}>`;
|
return `<${node.tag}${allAttrs}>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const inner = node.children.map((child) => renderComponentNode(child, childCtx)).join("");
|
const inner = node.children.map((child) => renderComponentNode(child, elementContext)).join("");
|
||||||
|
|
||||||
return `<${node.tag}${allAttrs}>${inner}</${node.tag}>`;
|
return `<${node.tag}${allAttrs}>${inner}</${node.tag}>`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -839,3 +839,37 @@ component FAQAccordion {
|
|||||||
|
|
||||||
expect(output).toContain("isOpen(index)");
|
expect(output).toContain("isOpen(index)");
|
||||||
});
|
});
|
||||||
|
test("data-for conditional classes do not evaluate loop variables during SSR", () => {
|
||||||
|
const output = generate(
|
||||||
|
parse(`
|
||||||
|
component Accordion {
|
||||||
|
props {
|
||||||
|
items = []
|
||||||
|
}
|
||||||
|
|
||||||
|
state openIndexes = []
|
||||||
|
|
||||||
|
functions {
|
||||||
|
function isOpen(index) {
|
||||||
|
return openIndexes.includes(index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
view {
|
||||||
|
<article
|
||||||
|
data-for="item, index in items"
|
||||||
|
class:open="isOpen(index)"
|
||||||
|
>
|
||||||
|
{item.title}
|
||||||
|
</article>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(output).toContain('data-for="item, index in items"');
|
||||||
|
|
||||||
|
expect(output).toContain("data-wrn-class-0");
|
||||||
|
|
||||||
|
expect(output).not.toContain('${(isOpen(index)) ? " open" : ""}');
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/core",
|
"name": "@wrnexus/core",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/csr",
|
"name": "@wrnexus/csr",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -335,6 +335,59 @@ export const REACTIVE_RUNTIME = String.raw`
|
|||||||
return run;
|
return run;
|
||||||
}
|
}
|
||||||
function renderAll() { renderers.forEach(function (f) { f(); }); }
|
function renderAll() { renderers.forEach(function (f) { f(); }); }
|
||||||
|
function decodeLoopLocals(node) {
|
||||||
|
var owner =
|
||||||
|
node &&
|
||||||
|
node.closest &&
|
||||||
|
node.closest(
|
||||||
|
"[data-wrn-loop-locals]",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!owner) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var encoded =
|
||||||
|
owner.getAttribute(
|
||||||
|
"data-wrn-loop-locals",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!encoded) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
var binary =
|
||||||
|
window.atob(encoded);
|
||||||
|
|
||||||
|
var bytes =
|
||||||
|
new Uint8Array(
|
||||||
|
binary.length,
|
||||||
|
);
|
||||||
|
|
||||||
|
for (
|
||||||
|
var index = 0;
|
||||||
|
index < binary.length;
|
||||||
|
index++
|
||||||
|
) {
|
||||||
|
bytes[index] =
|
||||||
|
binary.charCodeAt(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.parse(
|
||||||
|
new TextDecoder(
|
||||||
|
"utf-8",
|
||||||
|
).decode(bytes),
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(
|
||||||
|
"[wrnexus] failed to decode loop locals",
|
||||||
|
error,
|
||||||
|
);
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var behaviorFunctions = {};
|
var behaviorFunctions = {};
|
||||||
var stateWatchers = {};
|
var stateWatchers = {};
|
||||||
@@ -537,44 +590,338 @@ export const REACTIVE_RUNTIME = String.raw`
|
|||||||
try { return String(itemEval(e)); } catch (err) { return ""; }
|
try { return String(itemEval(e)); } catch (err) { return ""; }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function hydrateItem(root, locals) {
|
function hydrateItem(
|
||||||
|
root,
|
||||||
|
locals,
|
||||||
|
) {
|
||||||
function localRead(name) {
|
function localRead(name) {
|
||||||
return Object.prototype.hasOwnProperty.call(locals, name) ? locals[name] : peekScope(name);
|
if (
|
||||||
}
|
Object.prototype.hasOwnProperty.call(
|
||||||
function itemEval(expr) { return evaluateExpression(expr, localRead); }
|
locals,
|
||||||
|
name,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return locals[name];
|
||||||
|
}
|
||||||
|
|
||||||
var els = [root];
|
return readScope(name);
|
||||||
if (root.querySelectorAll) Array.prototype.push.apply(els, root.querySelectorAll("*"));
|
}
|
||||||
els.forEach(function (n) {
|
|
||||||
if (n.nodeType !== 1) return;
|
function itemEval(expression) {
|
||||||
Array.prototype.slice.call(n.attributes).forEach(function (attr) {
|
return evaluateExpression(
|
||||||
if (attr.name === "data-text") {
|
expression,
|
||||||
try { n.textContent = String(itemEval(attr.value)); } catch (e) { /* ignore */ }
|
localRead,
|
||||||
} else if (attr.name.indexOf("data-on-") === 0) {
|
);
|
||||||
var evt = attr.name.slice("data-on-".length);
|
}
|
||||||
var stmt = attr.value;
|
|
||||||
n.addEventListener(evt, function () {
|
function applyItemTemplate(
|
||||||
|
template,
|
||||||
|
) {
|
||||||
|
return String(template).replace(
|
||||||
|
/\{\{\s*([^}]+?)\s*\}\}|\{([^{}]+)\}/g,
|
||||||
|
function (
|
||||||
|
_,
|
||||||
|
doubleExpression,
|
||||||
|
singleExpression,
|
||||||
|
) {
|
||||||
|
var expression = (
|
||||||
|
doubleExpression ||
|
||||||
|
singleExpression
|
||||||
|
).trim();
|
||||||
|
|
||||||
|
try {
|
||||||
|
var value =
|
||||||
|
itemEval(expression);
|
||||||
|
|
||||||
|
return value == null
|
||||||
|
? ""
|
||||||
|
: String(value);
|
||||||
|
} catch (_) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var elements = [root];
|
||||||
|
|
||||||
|
if (root.querySelectorAll) {
|
||||||
|
Array.prototype.push.apply(
|
||||||
|
elements,
|
||||||
|
root.querySelectorAll("*"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.forEach(function (node) {
|
||||||
|
if (
|
||||||
|
!node ||
|
||||||
|
node.nodeType !== 1
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var attributes =
|
||||||
|
Array.prototype.slice.call(
|
||||||
|
node.attributes,
|
||||||
|
);
|
||||||
|
|
||||||
|
attributes.forEach(function (
|
||||||
|
attribute,
|
||||||
|
) {
|
||||||
|
/*
|
||||||
|
* data-text must be handled using itemEval(),
|
||||||
|
* because item/index only exist in loop locals.
|
||||||
|
*/
|
||||||
|
if (
|
||||||
|
attribute.name === "data-text"
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
var textValue =
|
||||||
|
itemEval(attribute.value);
|
||||||
|
|
||||||
|
node.textContent =
|
||||||
|
textValue == null
|
||||||
|
? ""
|
||||||
|
: String(textValue);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(
|
||||||
|
"[wrnexus] data-for text binding failed for '" +
|
||||||
|
attribute.value +
|
||||||
|
"'",
|
||||||
|
error,
|
||||||
|
);
|
||||||
|
|
||||||
|
node.textContent = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Conditional classes:
|
||||||
|
* data-wrn-class-*='["class","expression"]'
|
||||||
|
*/
|
||||||
|
if (
|
||||||
|
attribute.name.indexOf(
|
||||||
|
"data-wrn-class-",
|
||||||
|
) === 0
|
||||||
|
) {
|
||||||
|
var classBinding;
|
||||||
|
|
||||||
|
try {
|
||||||
|
classBinding = JSON.parse(
|
||||||
|
attribute.value,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!classBinding ||
|
||||||
|
classBinding.length !== 2
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var className =
|
||||||
|
classBinding[0];
|
||||||
|
|
||||||
|
var classExpression =
|
||||||
|
classBinding[1];
|
||||||
|
|
||||||
|
var classEnabled = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
classEnabled = !!itemEval(
|
||||||
|
classExpression,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
classEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
node.classList.toggle(
|
||||||
|
className,
|
||||||
|
classEnabled,
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reactive ordinary attributes:
|
||||||
|
* data-wrn-bind-*='["aria-expanded","{isOpen(index)}"]'
|
||||||
|
*/
|
||||||
|
if (
|
||||||
|
attribute.name.indexOf(
|
||||||
|
"data-wrn-bind-",
|
||||||
|
) === 0
|
||||||
|
) {
|
||||||
|
var binding;
|
||||||
|
|
||||||
|
try {
|
||||||
|
binding = JSON.parse(
|
||||||
|
attribute.value,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!binding ||
|
||||||
|
binding.length !== 2
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var attributeName =
|
||||||
|
binding[0];
|
||||||
|
|
||||||
|
var attributeTemplate =
|
||||||
|
binding[1];
|
||||||
|
|
||||||
|
var exact =
|
||||||
|
/^\{([^{}]+)\}$/.exec(
|
||||||
|
attributeTemplate,
|
||||||
|
);
|
||||||
|
|
||||||
|
var rawValue;
|
||||||
|
|
||||||
|
if (exact) {
|
||||||
try {
|
try {
|
||||||
splitTopLevel(stmt, ";").forEach(function (part) {
|
rawValue = itemEval(
|
||||||
runStatement(part, itemEval, localRead, function (name, value) {
|
exact[1].trim(),
|
||||||
if (Object.prototype.hasOwnProperty.call(locals, name)) locals[name] = value;
|
);
|
||||||
else if (!signals[name]) { signals[name] = signal(value); renderAll(); }
|
} catch (_) {
|
||||||
else signals[name].set(value);
|
return;
|
||||||
});
|
}
|
||||||
|
} else {
|
||||||
|
rawValue =
|
||||||
|
attributeTemplate.replace(
|
||||||
|
/\{([^{}]+)\}/g,
|
||||||
|
function (
|
||||||
|
_,
|
||||||
|
expression,
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
var value =
|
||||||
|
itemEval(
|
||||||
|
expression.trim(),
|
||||||
|
);
|
||||||
|
|
||||||
|
return value == null
|
||||||
|
? ""
|
||||||
|
: String(value);
|
||||||
|
} catch (_) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
applyReactiveAttribute(
|
||||||
|
node,
|
||||||
|
attributeName,
|
||||||
|
rawValue,
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Event handlers inside data-for.
|
||||||
|
*/
|
||||||
|
if (
|
||||||
|
attribute.name.indexOf(
|
||||||
|
"data-on-",
|
||||||
|
) === 0
|
||||||
|
) {
|
||||||
|
var eventName =
|
||||||
|
attribute.name.slice(
|
||||||
|
"data-on-".length,
|
||||||
|
);
|
||||||
|
|
||||||
|
var statement =
|
||||||
|
attribute.value;
|
||||||
|
|
||||||
|
node.addEventListener(
|
||||||
|
eventName,
|
||||||
|
function (event) {
|
||||||
|
var eventLocals = {};
|
||||||
|
|
||||||
|
Object.keys(
|
||||||
|
locals,
|
||||||
|
).forEach(function (key) {
|
||||||
|
eventLocals[key] =
|
||||||
|
locals[key];
|
||||||
});
|
});
|
||||||
} catch (e) { console.error("[wrnexus] data-for handler error", e); }
|
|
||||||
});
|
eventLocals.event = event;
|
||||||
} else if (attr.value.indexOf("{") !== -1) {
|
eventLocals.$event = event;
|
||||||
attr.value = fillMustache(attr.value, itemEval);
|
|
||||||
|
try {
|
||||||
|
runStmt(
|
||||||
|
statement,
|
||||||
|
eventLocals,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(
|
||||||
|
"[wrnexus] data-for handler error in '" +
|
||||||
|
statement +
|
||||||
|
"'",
|
||||||
|
error,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Static attributes containing interpolation.
|
||||||
|
*/
|
||||||
|
if (
|
||||||
|
attribute.value &&
|
||||||
|
attribute.value.indexOf("{") !== -1
|
||||||
|
) {
|
||||||
|
node.setAttribute(
|
||||||
|
attribute.name,
|
||||||
|
applyItemTemplate(
|
||||||
|
attribute.value,
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null);
|
/*
|
||||||
var tn;
|
* Text interpolation inside loop content:
|
||||||
while ((tn = walker.nextNode())) {
|
*
|
||||||
if (tn.nodeValue.indexOf("{") === -1) continue;
|
* <span>{item.title}</span>
|
||||||
tn.nodeValue = fillMustache(tn.nodeValue, itemEval);
|
*/
|
||||||
|
var walker =
|
||||||
|
document.createTreeWalker(
|
||||||
|
root,
|
||||||
|
NodeFilter.SHOW_TEXT,
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
|
||||||
|
var textNode;
|
||||||
|
|
||||||
|
while (
|
||||||
|
(textNode = walker.nextNode())
|
||||||
|
) {
|
||||||
|
var template =
|
||||||
|
textNode.nodeValue || "";
|
||||||
|
|
||||||
|
if (
|
||||||
|
template.indexOf("{") === -1
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
textNode.nodeValue =
|
||||||
|
applyItemTemplate(template);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -658,7 +1005,10 @@ export const REACTIVE_RUNTIME = String.raw`
|
|||||||
var enabled = false;
|
var enabled = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
enabled = !!evalExpr(expression);
|
enabled = !!evalExpr(
|
||||||
|
expression,
|
||||||
|
decodeLoopLocals(node),
|
||||||
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
enabled = false;
|
enabled = false;
|
||||||
}
|
}
|
||||||
@@ -671,32 +1021,97 @@ export const REACTIVE_RUNTIME = String.raw`
|
|||||||
// Reactive ordinary attributes emitted by the compiler. Each marker stores
|
// Reactive ordinary attributes emitted by the compiler. Each marker stores
|
||||||
// [attributeName, originalTemplate], preserving an SSR value while allowing
|
// [attributeName, originalTemplate], preserving an SSR value while allowing
|
||||||
// state changes to update type, aria-*, class, href, and other attributes.
|
// state changes to update type, aria-*, class, href, and other attributes.
|
||||||
var bindNodes = [el].concat(Array.prototype.slice.call(el.querySelectorAll("*")));
|
var bindNodes = [el].concat(
|
||||||
|
Array.prototype.slice.call(
|
||||||
|
el.querySelectorAll("*"),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
bindNodes.forEach(function (node) {
|
bindNodes.forEach(function (node) {
|
||||||
if (!owns(node)) return;
|
if (!owns(node)) return;
|
||||||
Array.prototype.slice.call(node.attributes).forEach(function (marker) {
|
|
||||||
if (marker.name.indexOf("data-wrn-bind-") !== 0) return;
|
Array.prototype.slice
|
||||||
var binding;
|
.call(node.attributes)
|
||||||
try { binding = JSON.parse(marker.value); } catch (e) { return; }
|
.forEach(function (marker) {
|
||||||
if (!binding || binding.length !== 2) return;
|
if (
|
||||||
var name = binding[0];
|
marker.name.indexOf(
|
||||||
var template = binding[1];
|
"data-wrn-bind-",
|
||||||
reactive(function () {
|
) !== 0
|
||||||
var exact = /^\{([^{}]+)\}$/.exec(template);
|
) {
|
||||||
var raw;
|
return;
|
||||||
if (exact) {
|
|
||||||
try { raw = evalExpr(exact[1].trim()); } catch (e) { return; }
|
|
||||||
} else {
|
|
||||||
raw = template.replace(/\{([^{}]+)\}/g, function (_, expr) {
|
|
||||||
try {
|
|
||||||
var value = evalExpr(expr.trim());
|
|
||||||
return value == null ? "" : String(value);
|
|
||||||
} catch (e) { return ""; }
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
applyReactiveAttribute(node, name, raw);
|
|
||||||
|
var binding;
|
||||||
|
|
||||||
|
try {
|
||||||
|
binding = JSON.parse(
|
||||||
|
marker.value,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!binding ||
|
||||||
|
binding.length !== 2
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var name = binding[0];
|
||||||
|
var template = binding[1];
|
||||||
|
|
||||||
|
reactive(function () {
|
||||||
|
var locals =
|
||||||
|
decodeLoopLocals(node);
|
||||||
|
|
||||||
|
var exact =
|
||||||
|
/^\{([^{}]+)\}$/.exec(
|
||||||
|
template,
|
||||||
|
);
|
||||||
|
|
||||||
|
var raw;
|
||||||
|
|
||||||
|
if (exact) {
|
||||||
|
try {
|
||||||
|
raw = evalExpr(
|
||||||
|
exact[1].trim(),
|
||||||
|
locals,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
raw = template.replace(
|
||||||
|
/\{([^{}]+)\}/g,
|
||||||
|
function (
|
||||||
|
_,
|
||||||
|
expression,
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
var value =
|
||||||
|
evalExpr(
|
||||||
|
expression.trim(),
|
||||||
|
locals,
|
||||||
|
);
|
||||||
|
|
||||||
|
return value == null
|
||||||
|
? ""
|
||||||
|
: String(value);
|
||||||
|
} catch (error) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
applyReactiveAttribute(
|
||||||
|
node,
|
||||||
|
name,
|
||||||
|
raw,
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// {{expr}} / {expr} interpolation in text nodes
|
// {{expr}} / {expr} interpolation in text nodes
|
||||||
@@ -737,7 +1152,15 @@ export const REACTIVE_RUNTIME = String.raw`
|
|||||||
|
|
||||||
var stmt = attr.value;
|
var stmt = attr.value;
|
||||||
var listener = function (event) {
|
var listener = function (event) {
|
||||||
try { runStmt(stmt, { event: event, $event: event }); } catch (error) {
|
try {
|
||||||
|
var locals =
|
||||||
|
decodeLoopLocals(node);
|
||||||
|
|
||||||
|
locals.event = event;
|
||||||
|
locals.$event = event;
|
||||||
|
|
||||||
|
runStmt(stmt, locals);
|
||||||
|
} catch (error) {
|
||||||
console.error("[wrnexus] handler error in '" + stmt + "'", error);
|
console.error("[wrnexus] handler error in '" + stmt + "'", error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/db",
|
"name": "@wrnexus/db",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/dev-server",
|
"name": "@wrnexus/dev-server",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/encryption",
|
"name": "@wrnexus/encryption",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/helpers",
|
"name": "@wrnexus/helpers",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Safe convenience helpers for WrNexus request contexts and common application flows.",
|
"description": "Safe convenience helpers for WrNexus request contexts and common application flows.",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/i18n",
|
"name": "@wrnexus/i18n",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/jwt",
|
"name": "@wrnexus/jwt",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/mobile",
|
"name": "@wrnexus/mobile",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/native",
|
"name": "@wrnexus/native",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/oauth",
|
"name": "@wrnexus/oauth",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/pubsub",
|
"name": "@wrnexus/pubsub",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/queue",
|
"name": "@wrnexus/queue",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/reactive",
|
"name": "@wrnexus/reactive",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/router",
|
"name": "@wrnexus/router",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ssr",
|
"name": "@wrnexus/ssr",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/styles",
|
"name": "@wrnexus/styles",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/test",
|
"name": "@wrnexus/test",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/tracking",
|
"name": "@wrnexus/tracking",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ui",
|
"name": "@wrnexus/ui",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/uploader",
|
"name": "@wrnexus/uploader",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/validation",
|
"name": "@wrnexus/validation",
|
||||||
"version": "0.2.44",
|
"version": "0.2.45",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
|
|
||||||
const version = "0.2.44";
|
const version = "0.2.45";
|
||||||
|
|
||||||
const dependencyGroups = [
|
const dependencyGroups = [
|
||||||
"dependencies",
|
"dependencies",
|
||||||
|
|||||||
Reference in New Issue
Block a user