release: WRNexusJS 0.2.38
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ai",
|
"name": "@wrnexus/ai",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"@wrnexus/core": "^0.2.38",
|
||||||
"@wrnexus/router": "^0.2.37",
|
"@wrnexus/router": "^0.2.38",
|
||||||
"@wrnexus/csr": "^0.2.37",
|
"@wrnexus/csr": "^0.2.38",
|
||||||
"@wrnexus/compiler": "^0.2.37",
|
"@wrnexus/compiler": "^0.2.38",
|
||||||
"@wrnexus/styles": "^0.2.37",
|
"@wrnexus/styles": "^0.2.38",
|
||||||
"@wrnexus/dev-server": "^0.2.37",
|
"@wrnexus/dev-server": "^0.2.38",
|
||||||
"@wrnexus/ui": "^0.2.37",
|
"@wrnexus/ui": "^0.2.38",
|
||||||
"@wrnexus/validation": "^0.2.37",
|
"@wrnexus/validation": "^0.2.38",
|
||||||
"@wrnexus/i18n": "^0.2.37",
|
"@wrnexus/i18n": "^0.2.38",
|
||||||
"@wrnexus/db": "^0.2.37"
|
"@wrnexus/db": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/compiler",
|
"name": "@wrnexus/compiler",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/db",
|
"name": "@wrnexus/db",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"@wrnexus/core": "^0.2.38",
|
||||||
"@wrnexus/router": "^0.2.37",
|
"@wrnexus/router": "^0.2.38",
|
||||||
"@wrnexus/ssr": "^0.2.37",
|
"@wrnexus/ssr": "^0.2.38",
|
||||||
"@wrnexus/csr": "^0.2.37",
|
"@wrnexus/csr": "^0.2.38",
|
||||||
"@wrnexus/compiler": "^0.2.37",
|
"@wrnexus/compiler": "^0.2.38",
|
||||||
"@wrnexus/styles": "^0.2.37",
|
"@wrnexus/styles": "^0.2.38",
|
||||||
"@wrnexus/ui": "^0.2.37",
|
"@wrnexus/ui": "^0.2.38",
|
||||||
"@wrnexus/validation": "^0.2.37",
|
"@wrnexus/validation": "^0.2.38",
|
||||||
"@wrnexus/i18n": "^0.2.37",
|
"@wrnexus/i18n": "^0.2.38",
|
||||||
"@wrnexus/db": "^0.2.37",
|
"@wrnexus/db": "^0.2.38",
|
||||||
"@wrnexus/pubsub": "^0.2.37",
|
"@wrnexus/pubsub": "^0.2.38",
|
||||||
"@wrnexus/uploader": "^0.2.37"
|
"@wrnexus/uploader": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/encryption",
|
"name": "@wrnexus/encryption",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/i18n",
|
"name": "@wrnexus/i18n",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/jwt",
|
"name": "@wrnexus/jwt",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/native": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/native",
|
"name": "@wrnexus/native",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"@wrnexus/compiler": "^0.2.38",
|
||||||
"@wrnexus/core": "^0.2.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/ssr",
|
"name": "@wrnexus/ssr",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/styles",
|
"name": "@wrnexus/styles",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/uploader": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/test",
|
"name": "@wrnexus/test",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/uploader",
|
"name": "@wrnexus/uploader",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37"
|
"@wrnexus/core": "^0.2.38"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/validation",
|
"name": "@wrnexus/validation",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -411,6 +411,15 @@ const MIGRATIONS: Migration[] = [
|
|||||||
// No generated application files require automatic migration.
|
// No generated application files require automatic migration.
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.38",
|
||||||
|
id: "loop-condition-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.37",
|
"version": "0.2.38",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -430,17 +430,16 @@ function renderPageComponentInvocation(
|
|||||||
loops: string[],
|
loops: string[],
|
||||||
reactive: PageReactive | null,
|
reactive: PageReactive | null,
|
||||||
): string {
|
): string {
|
||||||
const attrs = node.attrs.filter((attr) => attr.name !== "data-component");
|
const attrs = node.attrs
|
||||||
|
.filter((attr) => attr.name !== "data-component")
|
||||||
|
.map((attr) => renderPageComponentAttr(attr, loops))
|
||||||
|
.join("");
|
||||||
|
|
||||||
const inner = node.children
|
const inner = node.children
|
||||||
.map((child) => renderNode(child, ssrBindings, csrBindings, apiBindings, loops, reactive))
|
.map((child) => renderNode(child, ssrBindings, csrBindings, apiBindings, loops, reactive))
|
||||||
.join("");
|
.join("");
|
||||||
|
|
||||||
return `<div data-component="${attrEscape(node.tag)}"${renderAttrs(
|
return `<div data-component="${attrEscape(node.tag)}"` + `${attrs}>${inner}</div>`;
|
||||||
attrs,
|
|
||||||
undefined,
|
|
||||||
reactive,
|
|
||||||
)}>${inner}</div>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderNestedComponentInvocation(
|
function renderNestedComponentInvocation(
|
||||||
@@ -462,9 +461,19 @@ function renderNestedComponentInvocation(
|
|||||||
return ` ${attr.name}`;
|
return ` ${attr.name}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const rendered = ` ${attr.name}="` + `${compileAttrValue(attr.value, ctx)}"`;
|
const wholeExpression = wholeAttributeExpression(attr.value);
|
||||||
|
|
||||||
if (!attr.value.includes("{") || !exprRefsState(attr.value, ctx.stateNames)) {
|
const compiledValue = wholeExpression
|
||||||
|
? `\${__wireProp(${ctx.resolveExpr(wholeExpression)})}`
|
||||||
|
: compileAttrValue(attr.value, ctx);
|
||||||
|
|
||||||
|
const rendered = ` ${attr.name}="${compiledValue}"`;
|
||||||
|
|
||||||
|
if (
|
||||||
|
wholeExpression ||
|
||||||
|
!attr.value.includes("{") ||
|
||||||
|
!exprRefsState(attr.value, ctx.stateNames)
|
||||||
|
) {
|
||||||
return rendered;
|
return rendered;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -591,6 +600,28 @@ function __wrnexusEvalData(data: unknown, body: string, helpers = "", ctx: any):
|
|||||||
return new Function("$data", "$adapters", "const cookies = $adapters.cookies;\\nconst session = $adapters.session;\\nconst localStorage = $adapters.localStorage;\\nwith ($data ?? {}) {\\n" + helpers + "\\n" + body + "\\n}")(data, adapters);
|
return new Function("$data", "$adapters", "const cookies = $adapters.cookies;\\nconst session = $adapters.session;\\nconst localStorage = $adapters.localStorage;\\nwith ($data ?? {}) {\\n" + helpers + "\\n" + body + "\\n}")(data, adapters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function __wrnexusPropAttr(
|
||||||
|
value: unknown,
|
||||||
|
): string {
|
||||||
|
const serialized =
|
||||||
|
value !== null &&
|
||||||
|
typeof value === "object"
|
||||||
|
? JSON.stringify(value)
|
||||||
|
: String(value == null ? "" : value);
|
||||||
|
|
||||||
|
return serialized.replace(
|
||||||
|
/[&<>"]/g,
|
||||||
|
(character) =>
|
||||||
|
character === "&"
|
||||||
|
? "&"
|
||||||
|
: character === "<"
|
||||||
|
? "<"
|
||||||
|
: character === ">"
|
||||||
|
? ">"
|
||||||
|
: """,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
async function __wrnexusCallApi(path: string, method: string, ctx: any): Promise<unknown> {
|
async function __wrnexusCallApi(path: string, method: string, ctx: any): Promise<unknown> {
|
||||||
if (typeof ctx.__wrnexusCallApi === "function") {
|
if (typeof ctx.__wrnexusCallApi === "function") {
|
||||||
return await ctx.__wrnexusCallApi(path, method);
|
return await ctx.__wrnexusCallApi(path, method);
|
||||||
@@ -1256,19 +1287,101 @@ function generateComponent(ast: PageAst): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
out.push(`function __coerce(v: any, def: any): any {
|
out.push(`function __coerce(v: any, def: any): any {
|
||||||
if (v === undefined || v === null) return def;
|
if (v === undefined || v === null) {
|
||||||
if (typeof def === "number") return Number(v);
|
return def;
|
||||||
if (typeof def === "boolean") return v === true || v === "" || v === "true";
|
}
|
||||||
|
|
||||||
|
if (typeof def === "number") {
|
||||||
|
return Number(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof def === "boolean") {
|
||||||
|
return v === true || v === "" || v === "true";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(def)) {
|
||||||
|
if (Array.isArray(v)) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof v === "string") {
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(v);
|
||||||
|
return Array.isArray(parsed) ? parsed : def;
|
||||||
|
} catch {
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def !== null && typeof def === "object") {
|
||||||
|
if (
|
||||||
|
v !== null &&
|
||||||
|
typeof v === "object" &&
|
||||||
|
!Array.isArray(v)
|
||||||
|
) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof v === "string") {
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(v);
|
||||||
|
|
||||||
|
return (
|
||||||
|
parsed !== null &&
|
||||||
|
typeof parsed === "object" &&
|
||||||
|
!Array.isArray(parsed)
|
||||||
|
)
|
||||||
|
? parsed
|
||||||
|
: def;
|
||||||
|
} catch {
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
return String(v);
|
return String(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
function __wireHtml(v: any): string {
|
function __wireHtml(v: any): string {
|
||||||
return String(v == null ? "" : v).replace(/[&<>]/g, (c) => (c === "&" ? "&" : c === "<" ? "<" : ">"));
|
return String(v == null ? "" : v).replace(
|
||||||
}
|
/[&<>]/g,
|
||||||
function __wireAttr(v: any): string {
|
(c) =>
|
||||||
return String(v == null ? "" : v).replace(/[&<>"]/g, (c) =>
|
c === "&"
|
||||||
c === "&" ? "&" : c === "<" ? "<" : c === ">" ? ">" : """,
|
? "&"
|
||||||
|
: c === "<"
|
||||||
|
? "<"
|
||||||
|
: ">",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function __wireAttr(v: any): string {
|
||||||
|
return String(v == null ? "" : v).replace(
|
||||||
|
/[&<>"]/g,
|
||||||
|
(c) =>
|
||||||
|
c === "&"
|
||||||
|
? "&"
|
||||||
|
: c === "<"
|
||||||
|
? "<"
|
||||||
|
: c === ">"
|
||||||
|
? ">"
|
||||||
|
: """,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function __wireProp(v: any): string {
|
||||||
|
const value =
|
||||||
|
v !== null && typeof v === "object"
|
||||||
|
? JSON.stringify(v)
|
||||||
|
: String(v == null ? "" : v);
|
||||||
|
|
||||||
|
return __wireAttr(value);
|
||||||
|
}
|
||||||
|
|
||||||
function __wireRaw(v: any): string {
|
function __wireRaw(v: any): string {
|
||||||
return String(v == null ? "" : v);
|
return String(v == null ? "" : v);
|
||||||
}`);
|
}`);
|
||||||
@@ -1301,12 +1414,51 @@ function __wireRaw(v: any): string {
|
|||||||
return out.join("\n\n") + "\n";
|
return out.join("\n\n") + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function __wireRaw(v: any): string {
|
||||||
|
return String(v == null ? "" : v);
|
||||||
|
}
|
||||||
|
|
||||||
|
function wholeAttributeExpression(value: string): string | null {
|
||||||
|
const match = /^\s*\{([\s\S]+)\}\s*$/.exec(value);
|
||||||
|
|
||||||
|
return match?.[1]?.trim() || null;
|
||||||
|
}
|
||||||
function __wireHtml(v: any): string {
|
function __wireHtml(v: any): string {
|
||||||
return String(v == null ? "" : v).replace(/[&<>]/g, (c) =>
|
return String(v == null ? "" : v).replace(/[&<>]/g, (c) =>
|
||||||
c === "&" ? "&" : c === "<" ? "<" : ">",
|
c === "&" ? "&" : c === "<" ? "<" : ">",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function __wireRaw(v: any): string {
|
function __wireAttr(v: any): string {
|
||||||
return String(v == null ? "" : v);
|
return String(v == null ? "" : v).replace(/[&<>"]/g, (c) =>
|
||||||
|
c === "&" ? "&" : c === "<" ? "<" : c === ">" ? ">" : """,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function __wireProp(v: any): string {
|
||||||
|
const value =
|
||||||
|
v !== null && typeof v === "object" ? JSON.stringify(v) : String(v == null ? "" : v);
|
||||||
|
|
||||||
|
return __wireAttr(value);
|
||||||
|
}
|
||||||
|
function renderPageComponentAttr(attr: Attr, dynamicExpressions: string[]): string {
|
||||||
|
if (attr.event) {
|
||||||
|
return ` ${eventAttribute(attr.name)}="${attrEscape(attr.value)}"`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attr.boolean) {
|
||||||
|
return ` ${attr.name}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const expression = wholeAttributeExpression(attr.value);
|
||||||
|
|
||||||
|
if (!expression) {
|
||||||
|
return ` ${attr.name}="${attrEscape(attr.value)}"`;
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamicExpressions.push(`\${__wrnexusPropAttr(${expression})}`);
|
||||||
|
|
||||||
|
const marker = `\x00WRNEACH${dynamicExpressions.length - 1}\x00`;
|
||||||
|
|
||||||
|
return ` ${attr.name}="${marker}"`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,7 +243,9 @@ component ParentCard {
|
|||||||
|
|
||||||
expect(output).toContain('data-component="ChildCard"');
|
expect(output).toContain('data-component="ChildCard"');
|
||||||
|
|
||||||
expect(output).toContain('title="${__wireAttr(title)}"');
|
expect(output).toContain('title="${__wireProp(title)}"');
|
||||||
|
|
||||||
|
expect(output).toContain("function __wireProp");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("parses a layout block", () => {
|
test("parses a layout block", () => {
|
||||||
@@ -737,3 +739,47 @@ component Banner {
|
|||||||
expect(output).toContain("Visible");
|
expect(output).toContain("Visible");
|
||||||
expect(output).toContain("Hidden");
|
expect(output).toContain("Hidden");
|
||||||
});
|
});
|
||||||
|
test("component array props support each blocks", () => {
|
||||||
|
const output = generate(
|
||||||
|
parse(`
|
||||||
|
component HighlightList {
|
||||||
|
props {
|
||||||
|
highlights = []
|
||||||
|
}
|
||||||
|
|
||||||
|
view {
|
||||||
|
{#each highlights as highlight}
|
||||||
|
<p>{highlight.title}</p>
|
||||||
|
{/each}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(output).toContain("Array.isArray(def)");
|
||||||
|
|
||||||
|
expect(output).toContain("JSON.parse(v)");
|
||||||
|
|
||||||
|
expect(output).toContain("highlights");
|
||||||
|
});
|
||||||
|
test("page component props evaluate whole expressions", () => {
|
||||||
|
const output = generate(
|
||||||
|
parse(`
|
||||||
|
page Home {
|
||||||
|
view {
|
||||||
|
<HighlightList
|
||||||
|
enabled="{true}"
|
||||||
|
highlights="{[
|
||||||
|
{ title: 'First' },
|
||||||
|
{ title: 'Second' }
|
||||||
|
]}"
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(output).toContain("__wrnexusPropAttr(true)");
|
||||||
|
|
||||||
|
expect(output).toContain("__wrnexusPropAttr([");
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/core",
|
"name": "@wrnexus/core",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"exports": {
|
"exports": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@wrnexus/db",
|
"name": "@wrnexus/db",
|
||||||
"version": "0.2.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37",
|
"version": "0.2.38",
|
||||||
"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.37";
|
const version = "0.2.38";
|
||||||
|
|
||||||
const dependencyGroups = [
|
const dependencyGroups = [
|
||||||
"dependencies",
|
"dependencies",
|
||||||
|
|||||||
Reference in New Issue
Block a user