Compare commits

...

57 Commits

Author SHA1 Message Date
Tony Garnock-Jones a8438f9191 Publish
- @syndicate-lang/browser-stdenv@0.35.1
 - @syndicate-lang/core@0.34.1
 - @syndicate-lang/create@0.25.1
 - @syndicate-lang/fs@0.35.1
 - @syndicate-lang/html@0.35.1
 - @syndicate-lang/html2@0.35.1
 - @syndicate-lang/loader@0.35.1
 - @syndicate-lang/service@0.35.1
 - @syndicate-lang/syndicatec@0.36.1
 - @syndicate-lang/timer@0.35.1
 - @syndicate-lang/ts-plugin@0.36.1
 - @syndicate-lang/tsc@0.36.1
 - @syndicate-lang/ws-relay@0.36.1
2024-05-03 16:41:45 +02:00
Tony Garnock-Jones 047bded3af Repair preserves dependency specifications 2024-05-03 16:41:19 +02:00
Tony Garnock-Jones 221208dbbd Slightly nicer dev compilation watch automation 2024-04-17 14:59:39 +02:00
Tony Garnock-Jones e3d419deab Publish
- @syndicate-lang/browser-stdenv@0.35.0
 - @syndicate-lang/compiler@0.22.0
 - @syndicate-lang/core@0.34.0
 - @syndicate-lang/fs@0.35.0
 - @syndicate-lang/html@0.35.0
 - @syndicate-lang/html2@0.35.0
 - @syndicate-lang/loader@0.35.0
 - @syndicate-lang/service@0.35.0
 - @syndicate-lang/syndicatec@0.36.0
 - @syndicate-lang/timer@0.35.0
 - @syndicate-lang/ts-plugin@0.36.0
 - @syndicate-lang/tsc@0.36.0
 - @syndicate-lang/ws-relay@0.36.0
2024-04-17 13:26:31 +02:00
Tony Garnock-Jones ebe7700cee Allow "when (...)" clause on "on" endpoints 2024-04-17 13:26:06 +02:00
Tony Garnock-Jones f4f2ad0783 Await SchemaReady before translating and running Syndicate scripts 2024-04-17 13:25:40 +02:00
Tony Garnock-Jones c1cdf3660f Allow changes to trigger event in ValueWidget after construction (messy still, but possible) 2024-04-17 13:25:06 +02:00
Tony Garnock-Jones 9d8e7f5ccd querySelector/querySelectorAll on Widgets 2024-04-17 13:24:48 +02:00
Tony Garnock-Jones bf9d10813e More flexible Widget node specification 2024-04-17 13:24:37 +02:00
Tony Garnock-Jones 80250fdac9 Better treatment of invalid HtmlFragments 2024-04-17 13:23:50 +02:00
Tony Garnock-Jones 305c0c26ee Cosmetic: whitespace 2024-04-17 13:22:21 +02:00
Tony Garnock-Jones 782f24687f Track observers per-assertion, not per-observer-ref, to repair incremental updates of pattern (!) 2024-04-17 13:22:05 +02:00
Tony Garnock-Jones 6d904d276e Proper treatment of annotations through dataspaces 2024-04-17 13:21:28 +02:00
Tony Garnock-Jones 4b5eccad24 Publish
- @syndicate-lang/browser-stdenv@0.34.0
 - @syndicate-lang/core@0.33.0
 - @syndicate-lang/fs@0.34.0
 - @syndicate-lang/html@0.34.0
 - @syndicate-lang/html2@0.34.0
 - @syndicate-lang/loader@0.34.0
 - @syndicate-lang/service@0.34.0
 - @syndicate-lang/syndicatec@0.35.0
 - @syndicate-lang/timer@0.34.0
 - @syndicate-lang/ts-plugin@0.35.0
 - @syndicate-lang/tsc@0.35.0
 - @syndicate-lang/ws-relay@0.35.0
2024-04-15 10:26:49 +02:00
Tony Garnock-Jones 4a05bbad73 Rename Dataspace.global to Dataspace.local 2024-04-15 10:26:27 +02:00
Tony Garnock-Jones 40bc9aadd3 Bring examples up-to-date 2024-04-12 10:40:17 +02:00
Tony Garnock-Jones 17890a6b97 syndicate-js.code-workspace 2024-04-12 10:28:55 +02:00
Tony Garnock-Jones 3b20a58dce Publish
- @syndicate-lang/browser-stdenv@0.33.0
 - @syndicate-lang/core@0.32.0
 - @syndicate-lang/create@0.25.0
 - @syndicate-lang/fs@0.33.0
 - @syndicate-lang/html@0.33.0
 - @syndicate-lang/html2@0.33.0
 - @syndicate-lang/loader@0.33.0
 - @syndicate-lang/service@0.33.0
 - @syndicate-lang/syndicatec@0.34.0
 - @syndicate-lang/timer@0.33.0
 - @syndicate-lang/ts-plugin@0.34.0
 - @syndicate-lang/tsc@0.34.0
 - @syndicate-lang/ws-relay@0.34.0
2024-04-12 10:25:41 +02:00
Tony Garnock-Jones 4cce2fb6f2 Update chat example code 2024-04-12 10:25:04 +02:00
Tony Garnock-Jones 96a8367667 Update to new dataspace pattern language 2024-04-12 10:21:54 +02:00
Tony Garnock-Jones bdb759fe52 Merge latest changes from the syndicate-protocols repository 2024-04-11 16:23:45 +02:00
Tony Garnock-Jones c0239cf322 And with that we are almost back where we started with http.prs! 2024-04-10 15:16:35 +02:00
Tony Garnock-Jones 9cc4175f24 Cope with HTTP/1.0's optional Host header 2024-04-10 14:54:19 +02:00
Tony Garnock-Jones 70f42dd931 Another revision of http.prs 2024-04-10 14:31:27 +02:00
Tony Garnock-Jones ef1ebe6412 Sigh. <done> turns out to be a good idea in addition to <processing> 2024-04-10 13:24:25 +02:00
Tony Garnock-Jones ca18ca08df Alternative representation of dataspacePatterns 2024-04-09 09:15:21 +02:00
Tony Garnock-Jones 40ca168eac Repair typo 2024-04-09 09:13:51 +02:00
Tony Garnock-Jones 5a73e8d4c3 Alter dataspacePatterns language to make rec and arr more like dict 2024-04-04 16:31:09 +02:00
Tony Garnock-Jones b6092b2a98 Cosmetic 2024-04-04 15:52:52 +02:00
Tony Garnock-Jones 6b58ef9f0f Generalise dataspace patterns to permit extensibility 2024-04-04 15:52:43 +02:00
Tony Garnock-Jones 29959c055e Missed a couple of changes for js-preserves2 2024-04-04 15:46:19 +02:00
Tony Garnock-Jones 1708274401 Bump @preserves/schema dep 2024-04-04 13:47:44 +02:00
Tony Garnock-Jones 39e7eaac8d Publish
- @syndicate-lang/browser-stdenv@0.32.0
 - @syndicate-lang/core@0.31.0
 - @syndicate-lang/create@0.24.0
 - @syndicate-lang/fs@0.32.0
 - @syndicate-lang/html@0.32.0
 - @syndicate-lang/html2@0.32.0
 - @syndicate-lang/loader@0.32.0
 - @syndicate-lang/service@0.32.0
 - @syndicate-lang/syndicatec@0.33.0
 - @syndicate-lang/timer@0.32.0
 - @syndicate-lang/ts-plugin@0.33.0
 - @syndicate-lang/tsc@0.33.0
 - @syndicate-lang/ws-relay@0.33.0
2024-04-03 22:44:49 +02:00
Tony Garnock-Jones 687dff648f Preserves dep bump 2024-04-03 22:44:29 +02:00
Tony Garnock-Jones 710ff91a64 Revise http protocol 2024-04-01 15:56:07 +02:00
Tony Garnock-Jones fd491b5c71 Updates for js-preserves2 Preserves implementation 2024-03-28 16:31:27 +01:00
Tony Garnock-Jones cbcd4b9ad9 Repair noise session introduction 2024-03-28 16:30:27 +01:00
Tony Garnock-Jones bfef60eaa9 Merge latest changes from the syndicate-protocols repository 2024-03-28 16:14:11 +01:00
Tony Garnock-Jones c59e044695 Set embeddedType for noise 2024-03-28 15:49:48 +01:00
Tony Garnock-Jones bf0d47f1b7 Repair noise protocol 2024-03-28 15:17:28 +01:00
Tony Garnock-Jones 85b2299061 Use constructor instead of ad-hoc objects for various `Ref`s 2024-03-28 12:40:25 +01:00
Tony Garnock-Jones 90aa9656ca Repair bogus ref syntax 2024-03-28 12:36:45 +01:00
Tony Garnock-Jones de596ae408 location.hash is URI-encoded 2024-03-28 12:36:28 +01:00
Tony Garnock-Jones 8ce11ddb12 More flexible `decodeStandardRoute` 2024-03-28 12:36:13 +01:00
Tony Garnock-Jones f105736694 html2 templateGenerator 2024-03-28 10:22:21 +01:00
Tony Garnock-Jones 8031eb1a17 Publish
- @syndicate-lang/browser-stdenv@0.31.2
 - @syndicate-lang/core@0.30.1
 - @syndicate-lang/create@0.23.2
 - @syndicate-lang/fs@0.31.2
 - @syndicate-lang/html@0.31.2
 - @syndicate-lang/html2@0.31.2
 - @syndicate-lang/loader@0.31.2
 - @syndicate-lang/service@0.31.2
 - @syndicate-lang/syndicatec@0.32.2
 - @syndicate-lang/timer@0.31.2
 - @syndicate-lang/ts-plugin@0.32.2
 - @syndicate-lang/tsc@0.32.2
 - @syndicate-lang/ws-relay@0.32.2
2024-03-23 11:19:07 +01:00
Tony Garnock-Jones 906717121a Bump preserves and other deps 2024-03-23 11:18:53 +01:00
Tony Garnock-Jones e0d5e86da8 Publish
- @syndicate-lang/browser-stdenv@0.31.1
 - @syndicate-lang/compiler@0.21.1
 - @syndicate-lang/fs@0.31.1
 - @syndicate-lang/html@0.31.1
 - @syndicate-lang/html2@0.31.1
 - @syndicate-lang/loader@0.31.1
 - @syndicate-lang/service@0.31.1
 - @syndicate-lang/syndicatec@0.32.1
 - @syndicate-lang/timer@0.31.1
 - @syndicate-lang/ts-plugin@0.32.1
 - @syndicate-lang/tsc@0.32.1
 - @syndicate-lang/ws-relay@0.32.1
2024-03-23 10:44:16 +01:00
Tony Garnock-Jones 2dca2c2d77 Repair span of identifier after `$` 2024-03-23 10:43:42 +01:00
Tony Garnock-Jones da97db8548 Publish
- @syndicate-lang/browser-stdenv@0.31.0
 - @syndicate-lang/core@0.30.0
 - @syndicate-lang/fs@0.31.0
 - @syndicate-lang/html@0.31.0
 - @syndicate-lang/html2@0.31.0
 - @syndicate-lang/loader@0.31.0
 - @syndicate-lang/service@0.31.0
 - @syndicate-lang/syndicatec@0.32.0
 - @syndicate-lang/timer@0.31.0
 - @syndicate-lang/ts-plugin@0.32.0
 - @syndicate-lang/tsc@0.32.0
 - @syndicate-lang/ws-relay@0.32.0
2024-03-22 20:50:07 +01:00
Tony Garnock-Jones 63b5d23391 Repair rewrite.ts attenuate() 2024-03-22 20:49:05 +01:00
Tony Garnock-Jones 036c342264 Template and rewrite-building routines in rewrite.ts 2024-03-22 12:19:02 +01:00
Tony Garnock-Jones 7797a3cd09 Updated description of gatekeeper protocol 2024-03-22 10:11:57 +01:00
Tony Garnock-Jones f5501ccb64 Publish
- @syndicate-lang/browser-stdenv@0.30.1
 - @syndicate-lang/core@0.29.1
 - @syndicate-lang/fs@0.30.1
 - @syndicate-lang/html@0.30.1
 - @syndicate-lang/html2@0.30.1
 - @syndicate-lang/loader@0.30.1
 - @syndicate-lang/service@0.30.1
 - @syndicate-lang/syndicatec@0.31.1
 - @syndicate-lang/timer@0.30.1
 - @syndicate-lang/ts-plugin@0.31.1
 - @syndicate-lang/tsc@0.31.1
 - @syndicate-lang/ws-relay@0.31.1
2024-03-21 21:58:52 +01:00
Tony Garnock-Jones 3b7543845a Repair mac() function to produce correct output width 2024-03-21 21:58:32 +01:00
Tony Garnock-Jones a25cafdabb Publish
- @syndicate-lang/browser-stdenv@0.30.0
 - @syndicate-lang/core@0.29.0
 - @syndicate-lang/fs@0.30.0
 - @syndicate-lang/html@0.30.0
 - @syndicate-lang/html2@0.30.0
 - @syndicate-lang/loader@0.30.0
 - @syndicate-lang/service@0.30.0
 - @syndicate-lang/syndicatec@0.31.0
 - @syndicate-lang/timer@0.30.0
 - @syndicate-lang/ts-plugin@0.31.0
 - @syndicate-lang/tsc@0.31.0
 - @syndicate-lang/ws-relay@0.31.0
2024-03-21 21:28:08 +01:00
Tony Garnock-Jones 291ec1805b Synchronous cryptography; convenient `mint` overload for producing a ref and a bind at once 2024-03-21 21:27:23 +01:00
63 changed files with 1196 additions and 894 deletions

View File

@ -16,13 +16,13 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*", "@syndicate-lang/core": "*",
"@syndicate-lang/html": "*", "@syndicate-lang/html": "*",
"@syndicate-lang/ws-relay": "*" "@syndicate-lang/ws-relay": "*"
}, },
"devDependencies": { "devDependencies": {
"@preserves/schema-cli": "0.995", "@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "*", "@syndicate-lang/ts-plugin": "*",
"@syndicate-lang/tsc": "*", "@syndicate-lang/tsc": "*",
"rollup": "^2.60", "rollup": "^2.60",

View File

@ -1,6 +1,6 @@
let ?ds = dataspace let ?ds = dataspace
# Connect using <route [<ws "...">] <ref "syndicate" [] #[acowDB2/oI+6aSEC3YIxGg]>> # Connect using <route [<ws "...">] <ref {oid: "syndicate" sig: #[acowDB2/oI+6aSEC3YIxGg]}>
<bind <ref {oid: "syndicate" key: #x""}> $ds #f> <bind <ref {oid: "syndicate" key: #x""}> $ds #f>
# Connect using <route [<ws "...">] <noise { service: "syndicate", key: #x"21f6cd4e11e7e37711d6b3084ff18cded8fc8abf293aa47d43e8bb86dda65516" }>> # Connect using <route [<ws "...">] <noise { service: "syndicate", key: #x"21f6cd4e11e7e37711d6b3084ff18cded8fc8abf293aa47d43e8bb86dda65516" }>>

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { fromJS, Bytes, Dataspace, Ref, Sturdy, AnyValue, Reader, Schemas, Embedded, stringify } from "@syndicate-lang/core"; import { fromJS, Bytes, Dataspace, Ref, Sturdy, AnyValue, Reader, Schemas, stringify } from "@syndicate-lang/core";
import { boot as bootHtml, Anchor, template as html, HtmlFragments, GlobalEvent, UIAttribute, UIChangeableProperty } from "@syndicate-lang/html"; import { boot as bootHtml, Anchor, template as html, HtmlFragments, GlobalEvent, UIAttribute, UIChangeableProperty } from "@syndicate-lang/html";
import { boot as bootWakeDetector, WakeEvent } from "./wake-detector"; import { boot as bootWakeDetector, WakeEvent } from "./wake-detector";
import { boot as bootWsRelay } from "@syndicate-lang/ws-relay"; import { boot as bootWsRelay } from "@syndicate-lang/ws-relay";
@ -46,12 +46,9 @@ function bootChat(ds: Ref) {
during G.ResolvePath({ during G.ResolvePath({
"route": route, "route": route,
"addr": $addr, "addr": $addr,
"control": $control_e: Embedded, "control": $control: Ref,
"resolved": G.Resolved.accepted($remoteDs_e: Embedded), "resolved": G.Resolved.accepted($remoteDs: Ref),
}) => { }) => {
const remoteDs = remoteDs_e.embeddedValue;
const control = control_e.embeddedValue;
on message WakeEvent() => at control { on message WakeEvent() => at control {
send message G.ForceDisconnect(); send message G.ForceDisconnect();
} }

View File

@ -2,30 +2,30 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0": "@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema-cli@0.995": "@preserves/schema-cli@0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.1.tgz#056027c76c54ef3395c787a58def12b17dcbd79c" resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.201.tgz#e87cb7ba51b225ff6ea96f177c5388907adf6717"
integrity sha512-9LSb5P+00P1ocx/saXy5d31bRastSJT7VQmrAltMgcx3BI5f/ChVVhBdn8P4+tRLUo02pTbGy4wBceHsyqCSZQ== integrity sha512-n/lpVgWBY1UTRySPXIwWG4Yu87OrQ9b7Xo8zPPQzD/DJDTEDT3y3SUujY7UTF1pQn09xRGnfPnDu1RoRCv2J3w==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@preserves/schema" "^0.995.1" "@preserves/schema" "^0.995.201"
chalk "^4.1" chalk "^4.1"
chokidar "^3.5" chokidar "^3.5"
commander "^7.2" commander "^7.2"
glob "^7.1" glob "^7.1"
minimatch "^3.0" minimatch "^3.0"
"@preserves/schema@^0.995.1": "@preserves/schema@^0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg== integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -36,49 +36,49 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/html@*": "@syndicate-lang/html@*":
version "0.28.0" version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.28.0.tgz#6071997edfd03fe42d28f300394291549a622011" resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.33.0.tgz#c53e6bf8a52b17c3747f4270713a8c9234f984af"
integrity sha512-yhVwbArxu58wdMUtoQEzVpNc63zRed1YBnXAFND8Q5jfBp2Maefr/FWyRg1VCTOb8yltxBvENwmAL3xNUrqYtg== integrity sha512-xhN6NZOgLxlAQOyWG0JAgtyF1e1yQvrpNh5RBAPnucFYC024yo1ggZ08+KiaulhsoIKvRbBE6FU6p9dDm4/tpQ==
dependencies: dependencies:
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/ts-plugin@*": "@syndicate-lang/ts-plugin@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f" resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g== integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*": "@syndicate-lang/tsc@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747" resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ== integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"
"@syndicate-lang/ws-relay@*": "@syndicate-lang/ws-relay@*":
version "0.29.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ws-relay/-/ws-relay-0.29.0.tgz#25d8db2e21a141e0fc0ed3acbe9f55480dc72c56" resolved "https://registry.yarnpkg.com/@syndicate-lang/ws-relay/-/ws-relay-0.34.0.tgz#8b450ef18b22ca8e0c159c7925a1068796ad2c71"
integrity sha512-cU1Ktj8uAhH71LpW1Oyb1qLowZLGf4v+cjTZ+ZScIJbgA2eZ4VGYQSqCfeaM+CzVWFDNI2Bpqb8J9uDI9ZDCig== integrity sha512-PT24Pp+ol/wWMSp/6H8i5zu7CgXm5nh0UsfpxJ3ZpvWFs/rIsoMflL/g+C1Q4DW9oFTn6/WFs07VdSLmE2/Uog==
dependencies: dependencies:
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
salty-crypto "0.3" salty-crypto "0.3"
"@types/estree@0.0.39": "@types/estree@0.0.39":
@ -117,9 +117,9 @@ balanced-match@^1.0.0:
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
binary-extensions@^2.0.0: binary-extensions@^2.0.0:
version "2.2.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@preserves/schema": "0.995", "@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*" "@syndicate-lang/core": "*"
}, },
"devDependencies": { "devDependencies": {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0": "@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995": "@preserves/schema@0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg== integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -23,43 +23,43 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/syndicatec@*": "@syndicate-lang/syndicatec@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.28.0.tgz#0d9f27b13971c91ee769e1ce39a9da1936b8b117" resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.34.0.tgz#f3b88507b633552fe1f41f24def5121c0cafeaeb"
integrity sha512-+pD0qPTX3Ve/AS1yZcSy1RcdYI70S7LzhLQLjpCzmwchvuySUhGHPlWlVHujA4TIrFB9A7+wtxREZ9IyZ6/P8Q== integrity sha512-h3MPifJdXZTS3JVcvRG8GXMJMPBH4RYmJ3B7c2sjM826Pf6O8zT47Vuv1y2WyD9PS8BiSCI01uOR0W5AVJJT5w==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"
"@syndicate-lang/ts-plugin@*": "@syndicate-lang/ts-plugin@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f" resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g== integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*": "@syndicate-lang/tsc@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747" resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ== integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@preserves/schema": "0.995", "@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*" "@syndicate-lang/core": "*"
}, },
"devDependencies": { "devDependencies": {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0": "@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995": "@preserves/schema@0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg== integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -23,25 +23,25 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/tsc@*": "@syndicate-lang/tsc@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747" resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ== integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"

View File

@ -12,7 +12,7 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*" "@syndicate-lang/core": "*"
}, },
"devDependencies": { "devDependencies": {

View File

@ -2,10 +2,10 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995": "@preserves/core@0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -16,25 +16,25 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/syndicatec@*": "@syndicate-lang/syndicatec@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.28.0.tgz#0d9f27b13971c91ee769e1ce39a9da1936b8b117" resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.34.0.tgz#f3b88507b633552fe1f41f24def5121c0cafeaeb"
integrity sha512-+pD0qPTX3Ve/AS1yZcSy1RcdYI70S7LzhLQLjpCzmwchvuySUhGHPlWlVHujA4TIrFB9A7+wtxREZ9IyZ6/P8Q== integrity sha512-h3MPifJdXZTS3JVcvRG8GXMJMPBH4RYmJ3B7c2sjM826Pf6O8zT47Vuv1y2WyD9PS8BiSCI01uOR0W5AVJJT5w==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@preserves/schema": "0.995", "@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*" "@syndicate-lang/core": "*"
}, },
"devDependencies": { "devDependencies": {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0": "@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995": "@preserves/schema@0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg== integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -23,25 +23,25 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/syndicatec@*": "@syndicate-lang/syndicatec@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.28.0.tgz#0d9f27b13971c91ee769e1ce39a9da1936b8b117" resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.34.0.tgz#f3b88507b633552fe1f41f24def5121c0cafeaeb"
integrity sha512-+pD0qPTX3Ve/AS1yZcSy1RcdYI70S7LzhLQLjpCzmwchvuySUhGHPlWlVHujA4TIrFB9A7+wtxREZ9IyZ6/P8Q== integrity sha512-h3MPifJdXZTS3JVcvRG8GXMJMPBH4RYmJ3B7c2sjM826Pf6O8zT47Vuv1y2WyD9PS8BiSCI01uOR0W5AVJJT5w==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@preserves/schema": "0.995", "@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*", "@syndicate-lang/core": "*",
"@syndicate-lang/html": "*", "@syndicate-lang/html": "*",
"@syndicate-lang/timer": "*" "@syndicate-lang/timer": "*"

View File

@ -2,17 +2,17 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0": "@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995": "@preserves/schema@0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg== integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -23,47 +23,47 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/html@*": "@syndicate-lang/html@*":
version "0.28.0" version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.28.0.tgz#6071997edfd03fe42d28f300394291549a622011" resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.33.0.tgz#c53e6bf8a52b17c3747f4270713a8c9234f984af"
integrity sha512-yhVwbArxu58wdMUtoQEzVpNc63zRed1YBnXAFND8Q5jfBp2Maefr/FWyRg1VCTOb8yltxBvENwmAL3xNUrqYtg== integrity sha512-xhN6NZOgLxlAQOyWG0JAgtyF1e1yQvrpNh5RBAPnucFYC024yo1ggZ08+KiaulhsoIKvRbBE6FU6p9dDm4/tpQ==
dependencies: dependencies:
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/timer@*": "@syndicate-lang/timer@*":
version "0.28.0" version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/timer/-/timer-0.28.0.tgz#396499a37221d2b9d0a3c6fcb2bb751327d5f08c" resolved "https://registry.yarnpkg.com/@syndicate-lang/timer/-/timer-0.33.0.tgz#cdb38ebe777332ec58a5b0b9483db809275a61de"
integrity sha512-nJASotUruo2aO7zj7K6oa6dKlCSmBQr57E3fcifaoOOnzVcKiTsTY8irtDP0gYSTSyePh0sdm/y3pH6vErnBwQ== integrity sha512-cBon+nk8zvNeU4zC6tg7nhgJnmrRoXHYE140UK3gscNFcg1LZ1d7q9WxfVTzFtRocRBslv6pworSwCDn3Go7TQ==
dependencies: dependencies:
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/ts-plugin@*": "@syndicate-lang/ts-plugin@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f" resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g== integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*": "@syndicate-lang/tsc@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747" resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ== integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"

View File

@ -14,8 +14,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"dependencies": { "dependencies": {
"@preserves/core": "0.995", "@preserves/core": "^0.995.200",
"@preserves/schema": "0.995", "@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*", "@syndicate-lang/core": "*",
"@syndicate-lang/html": "*" "@syndicate-lang/html": "*"
}, },

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Dataspace, Embedded, Value, Ref } from '@syndicate-lang/core'; import { Dataspace, Value, Ref } from '@syndicate-lang/core';
import { boot as bootHtml, UIEvent, GlobalEvent, HtmlFragments, template, Anchor } from '@syndicate-lang/html'; import { boot as bootHtml, UIEvent, GlobalEvent, HtmlFragments, template, Anchor } from '@syndicate-lang/html';
assertion type Person(id, firstName, lastName, address, age); assertion type Person(id, firstName, lastName, address, age);
@ -42,7 +42,7 @@ Dataspace.boot(ds => {
spawn named 'controller' { spawn named 'controller' {
on message GlobalEvent('table#the-table th', 'click', $e) => { on message GlobalEvent('table#the-table th', 'click', $e) => {
const event = (e as Embedded<Ref>).embeddedValue.target.data as Event; const event = (e as Ref).target.data as Event;
send message SetSortColumn(JSON.parse((event.target as HTMLElement).dataset.column!)); send message SetSortColumn(JSON.parse((event.target as HTMLElement).dataset.column!));
} }
} }

View File

@ -2,17 +2,17 @@
# yarn lockfile v1 # yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0": "@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.0" version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg== integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995": "@preserves/schema@0.995.201":
version "0.995.1" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg== integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies: dependencies:
"@preserves/core" "^0.995.0" "@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9": "@rollup/pluginutils@^3.0.9":
version "3.1.0" version "3.1.0"
@ -23,40 +23,40 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0": "@syndicate-lang/compiler@^0.21.1":
version "0.20.0" version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9" resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA== integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0": "@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.27.0" version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872" resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA== integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies: dependencies:
salty-crypto "0.3.1" salty-crypto "0.3.1"
"@syndicate-lang/html@*": "@syndicate-lang/html@*":
version "0.28.0" version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.28.0.tgz#6071997edfd03fe42d28f300394291549a622011" resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.33.0.tgz#c53e6bf8a52b17c3747f4270713a8c9234f984af"
integrity sha512-yhVwbArxu58wdMUtoQEzVpNc63zRed1YBnXAFND8Q5jfBp2Maefr/FWyRg1VCTOb8yltxBvENwmAL3xNUrqYtg== integrity sha512-xhN6NZOgLxlAQOyWG0JAgtyF1e1yQvrpNh5RBAPnucFYC024yo1ggZ08+KiaulhsoIKvRbBE6FU6p9dDm4/tpQ==
dependencies: dependencies:
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/ts-plugin@*": "@syndicate-lang/ts-plugin@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f" resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g== integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*": "@syndicate-lang/tsc@*":
version "0.28.0" version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747" resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ== integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies: dependencies:
"@syndicate-lang/compiler" "^0.20.0" "@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.27.0" "@syndicate-lang/core" "^0.32.0"
glob "^7.1.6" glob "^7.1.6"
yargs "^16.2.0" yargs "^16.2.0"

View File

@ -6,7 +6,7 @@
"packages/*/examples/*/" "packages/*/examples/*/"
], ],
"devDependencies": { "devDependencies": {
"@preserves/core": "0.995.100", "@preserves/core": "^0.995.201",
"@rollup/plugin-node-resolve": "^13.0", "@rollup/plugin-node-resolve": "^13.0",
"@types/jest": "^27.0", "@types/jest": "^27.0",
"@types/node": "^14", "@types/node": "^14",

View File

@ -1,5 +1,9 @@
#!/bin/sh #!/bin/sh
set -e
cd "$(dirname "$0")"
M=../../node_modules M=../../node_modules
cat \ cat \
@ -39,3 +43,5 @@ cp \
$M/@syndicate-lang/ws-relay/dist/syndicate-ws-relay.min.js.map \ $M/@syndicate-lang/ws-relay/dist/syndicate-ws-relay.min.js.map \
$M/@syndicate-lang/compiler/dist/syndicate-compiler.min.js.map \ $M/@syndicate-lang/compiler/dist/syndicate-compiler.min.js.map \
. .
echo $(date) $(pwd) 'build complete.'

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/browser-stdenv", "name": "@syndicate-lang/browser-stdenv",
"version": "0.29.0", "version": "0.35.1",
"description": "Aggregated Syndicate and Preserves scripts for in-browser use", "description": "Aggregated Syndicate and Preserves scripts for in-browser use",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/browser-stdenv", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/browser-stdenv",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -15,15 +15,16 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"scripts": { "scripts": {
"prepare": "./build-aggregate.sh", "prepare": "./build-aggregate.sh",
"prepare:watch": "cd ..; exec inotifytest browser-stdenv/build-aggregate.sh",
"clean": "rm -rf index.js index.min.js *.js.map", "clean": "rm -rf index.js index.min.js *.js.map",
"veryclean": "yarn run clean && rm -rf node_modules" "veryclean": "yarn run clean && rm -rf node_modules"
}, },
"dependencies": { "dependencies": {
"@preserves/core": "0.995.100", "@preserves/core": "^0.995.200",
"@preserves/schema": "0.995.100", "@preserves/schema": "^0.995.201",
"@syndicate-lang/compiler": "^0.21.0", "@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.28.2", "@syndicate-lang/core": "^0.34.1",
"@syndicate-lang/html2": "^0.29.3", "@syndicate-lang/html2": "^0.35.1",
"@syndicate-lang/ws-relay": "^0.30.3" "@syndicate-lang/ws-relay": "^0.36.1"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/compiler", "name": "@syndicate-lang/compiler",
"version": "0.21.0", "version": "0.22.0",
"description": "Syndicate/JS compiler library", "description": "Syndicate/JS compiler library",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/compiler", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/compiler",
"license": "GPL-3.0+", "license": "GPL-3.0+",

View File

@ -296,14 +296,19 @@ ${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\n')}
})`; })`;
if (s.isDynamic) { if (s.isDynamic) {
return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => ({ if (s.test === void 0) {
target: currentSyndicateTarget, return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => ({ target: currentSyndicateTarget, assertion: ${assertion} }));`);
assertion: ${assertion}, } else {
}));`); return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => (${walk(s.test)})
? ({ target: currentSyndicateTarget, assertion: ${assertion} })
: ({ target: void 0, assertion: void 0 }));`);
}
} else { } else {
return wrap( if (s.test === void 0) {
t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget, void 0, ${assertion});` return wrap(t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget, void 0, ${assertion});`);
); } else {
return wrap(t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget, void 0, (${walk(s.test)}) ? ${assertion} : void 0);`);
}
} }
}); });

View File

@ -2,9 +2,10 @@
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { import {
Token, Items, TokenBase, TokenType, Token, Items, TokenBase, TokenType, Pos,
Pattern, Pattern,
foldItems, match, anonymousTemplate as template, commaJoin, foldItems, match, anonymousTemplate as template, commaJoin,
advancePos,
scope, bind, seq, seqTuple, alt, upTo, atom, atomString, group, scope, bind, seq, seqTuple, alt, upTo, atom, atomString, group,
repeat, option, withoutSpace, map, mapm, rest, discard, repeat, option, withoutSpace, map, mapm, rest, discard,
@ -74,6 +75,7 @@ export interface PseudoEventEndpointStatement extends GenericEventEndpointStatem
export interface AssertionEventEndpointStatement extends GenericEventEndpointStatement { export interface AssertionEventEndpointStatement extends GenericEventEndpointStatement {
triggerType: 'asserted' | 'retracted' | 'message'; triggerType: 'asserted' | 'retracted' | 'message';
pattern: ValuePattern; pattern: ValuePattern;
test?: Expr,
} }
export type EventHandlerEndpointStatement = export type EventHandlerEndpointStatement =
@ -324,7 +326,11 @@ export class SyndicateParser {
atomString('message'))), atomString('message'))),
option(map(kw('snapshot'), _ => o.isDynamic = false)), option(map(kw('snapshot'), _ => o.isDynamic = false)),
bind(o as AssertionEventEndpointStatement, 'pattern', bind(o as AssertionEventEndpointStatement, 'pattern',
this.valuePattern(1, atom('=>'))), this.valuePattern(1, atom('=>'),
seq(atom('when'), group('(', discard)))),
option(seq(atom('when'), group(
'(', bind(o as AssertionEventEndpointStatement, 'test',
this.expr())))),
this.mandatoryIfNotTerminal( this.mandatoryIfNotTerminal(
o, seq(atom('=>'), this.statement(o.body)))))); o, seq(atom('=>'), this.statement(o.body))))));
}); });
@ -410,9 +416,18 @@ export class SyndicateParser {
pCaptureBinder = (b: Pattern<Binder>): Pattern<Binder> => pCaptureBinder = (b: Pattern<Binder>): Pattern<Binder> =>
mapm(b, i => { mapm(b, i => {
return i.id.text.startsWith('$') if (i.id.text.startsWith('$')) {
? succeed({ id: { ... i.id, text: i.id.text.slice(1) }, type: i.type }) const adjustedStart: Pos = { ... i.id.start };
: fail; advancePos(adjustedStart, ' ');
const adjustedId: Token = {
... i.id,
start: adjustedStart,
text: i.id.text.slice(1),
};
return succeed({ id: adjustedId, type: i.type });
} else {
return fail;
}
}); });
readonly pCaptureDefaultBinder = this.pCaptureBinder(this.defaultBinder); readonly pCaptureDefaultBinder = this.pCaptureBinder(this.defaultBinder);

View File

@ -6,6 +6,7 @@ const currentSyndicateTarget = Syndicate.Dataspace.global;
(() => { (() => {
async function translateScripts() { async function translateScripts() {
if (SchemaReady) await SchemaReady;
const syndicateScripts = const syndicateScripts =
Array.from(document.getElementsByTagName('script')) Array.from(document.getElementsByTagName('script'))

View File

@ -187,7 +187,7 @@ __SYNDICATE__.Turn.active.facet(() => {
} }
} }
}), }),
}), })
})); }));
});`)); });`));
@ -206,8 +206,57 @@ __SYNDICATE__.Turn.active.facet(() => {
} }
} }
}), }),
}), })
})); }));
});`)); });`));
}); });
describe('on', () => {
it('message with guard', () => expectCodeEqual(`
on message S.Focus(entity) when (isLast.value) => {
text.node.focus();
}`, `__SYNDICATE__.Turn.active.assertDataflow(() => (isLast.value) ?
({
target: currentSyndicateTarget,
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.ctor(S.Focus, (__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(entity)))))),
observer: __SYNDICATE__.Turn.ref({
message: (__vs) => {
if (Array.isArray(__vs)) {
text.node.focus();
}
}
}),
})
}) :
({
target: void 0,
assertion: void 0
}));`));
it('asserted with guard', () => expectCodeEqual(`on asserted P when (someTest) => x;`, `
__SYNDICATE__.Turn.active.assertDataflow(() => (someTest) ?
({
target: currentSyndicateTarget,
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(P)))),
observer: __SYNDICATE__.Turn.ref({
assert: (__vs, __handle) => {
if (Array.isArray(__vs)) {
x;
}
}
}),
})
}) :
({
target: void 0,
assertion: void 0
}));`));
});

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/core", "name": "@syndicate-lang/core",
"version": "0.28.2", "version": "0.34.1",
"description": "Syndicate/JS for browser and node.js", "description": "Syndicate/JS for browser and node.js",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/core", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/core",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -29,13 +29,13 @@
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"devDependencies": { "devDependencies": {
"@preserves/core": "0.995.100", "@preserves/core": "^0.995.200",
"@preserves/schema-cli": "0.995.100" "@preserves/schema-cli": "^0.995.201"
}, },
"peerDependencies": { "peerDependencies": {
"@preserves/core": "0.995.100" "@preserves/core": ">=0.995.200"
}, },
"dependencies": { "dependencies": {
"salty-crypto": "0.3.1" "salty-crypto": "^0.3.1"
} }
} }

View File

@ -2,15 +2,15 @@
tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³ TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³http„´³schema·³version°³ definitions·³Chunk´³orµµ±string´³atom³String„„µ±bytes´³atom³ tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³ TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³http„´³schema·³version°³ definitions·³Chunk´³orµµ±string´³atom³String„„µ±bytes´³atom³
ByteString„„„„³Headers´³dictof´³atom³Symbol„´³atom³String„„³MimeType´³atom³Symbol„³ ByteString„„„„³Headers´³dictof´³atom³Symbol„´³atom³String„„³MimeType´³atom³Symbol„³
QueryValue´³orµµ±string´³atom³String„„µ±file´³rec´³lit³file„´³tupleµ´³named³filename´³atom³String„„´³named³headers´³refµ„³Headers„„´³named³body´³atom³ QueryValue´³orµµ±string´³atom³String„„µ±file´³rec´³lit³file„´³tupleµ´³named³filename´³atom³String„„´³named³headers´³refµ„³Headers„„´³named³body´³atom³
ByteString„„„„„„„„³ HostPattern´³orµµ±host´³atom³String„„µ±any´³lit€„„„„³ HttpBinding´³rec´³lit³ http-bind„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„´³named³handler´³embedded´³refµ„³ HttpRequest„„„„„„³ HttpContext´³rec´³lit³request„´³tupleµ´³named³req´³refµ„³ HttpRequest„„´³named³res´³embedded´³refµ„³ HttpResponse„„„„„„³ HttpRequest´³rec´³lit³ http-request„´³tupleµ´³named³sequenceNumber´³atom³ SignedInteger„„´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„´³named³method´³atom³Symbol„„´³named³path´³seqof´³atom³String„„„´³named³headers´³refµ„³Headers„„´³named³query´³dictof´³atom³Symbol„´³seqof´³refµ„³ ByteString„„„„„„„„³ HostPattern´³orµµ±host´³atom³String„„µ±any´³lit€„„„„³ HttpBinding´³rec´³lit³ http-bind„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„´³named³handler´³embedded´³refµ„³ HttpRequest„„„„„„³ HttpContext´³rec´³lit³request„´³tupleµ´³named³req´³refµ„³ HttpRequest„„´³named³res´³embedded´³refµ„³ HttpResponse„„„„„„³ HttpRequest´³rec´³lit³ http-request„´³tupleµ´³named³sequenceNumber´³atom³ SignedInteger„„´³named³host´³refµ„³ RequestHost„„´³named³port´³atom³ SignedInteger„„´³named³method´³atom³Symbol„„´³named³path´³seqof´³atom³String„„„´³named³headers´³refµ„³Headers„„´³named³query´³dictof´³atom³Symbol„´³seqof´³refµ„³
QueryValue„„„„´³named³body´³refµ„³ RequestBody„„„„„³ HttpService´³rec´³lit³ http-service„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„„„„³ PathPattern´³seqof´³refµ„³PathPatternElement„„³ RequestBody´³orµµ±present´³atom³ QueryValue„„„„´³named³body´³refµ„³ RequestBody„„„„„³ HttpService´³rec´³lit³ http-service„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„„„„³ PathPattern´³seqof´³refµ„³PathPatternElement„„³ RequestBody´³orµµ±present´³atom³
ByteString„„µ±absent´³lit€„„„„³ HttpListener´³rec´³lit³ http-listener„´³tupleµ´³named³port´³atom³ SignedInteger„„„„„³ HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³ SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³ MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³ embeddedType€„„µ³noise„´³schema·³version°³ definitions·³Packet´³orµµ±complete´³atom³ ByteString„„µ±absent´³lit€„„„„³ RequestHost´³orµµ±present´³atom³String„„µ±absent´³lit€„„„„³ HttpListener´³rec´³lit³ http-listener„´³tupleµ´³named³port´³atom³ SignedInteger„„„„„³ HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³ SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³ MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³ embeddedType€„„µ³noise„´³schema·³version°³ definitions·³Packet´³orµµ±complete´³atom³
ByteString„„µ± ByteString„„µ±
fragmented´³seqof´³atom³ fragmented´³seqof´³atom³
ByteString„„„„„³ NoiseSpec´³andµ´³dict·³key´³named³key´³atom³ ByteString„„„„„³ Initiator´³rec´³lit³ initiator„´³tupleµ´³named³initiatorSession´³embedded´³refµ„³Packet„„„„„„³ NoiseSpec´³andµ´³dict·³key´³named³key´³atom³
ByteString„„³service´³named³service´³refµ„³ServiceSelector„„„„´³named³protocol´³refµ„³ NoiseProtocol„„´³named³ preSharedKeys´³refµ„³NoisePreSharedKeys„„„„³ NoiseProtocol´³orµµ±present´³dict·³protocol´³named³protocol´³atom³String„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³ NoiseStepType´³lit³noise„³SecretKeyField´³orµµ±present´³dict·³ secretKey´³named³ secretKey´³atom³ ByteString„„³service´³named³service´³refµ„³ServiceSelector„„„„´³named³protocol´³refµ„³ NoiseProtocol„„´³named³ preSharedKeys´³refµ„³NoisePreSharedKeys„„„„³ SessionItem´³orµµ± Initiator´³refµ„³ Initiator„„µ±Packet´³refµ„³Packet„„„„³ NoiseProtocol´³orµµ±present´³dict·³protocol´³named³protocol´³atom³String„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³ NoiseStepType´³lit³noise„³SecretKeyField´³orµµ±present´³dict·³ secretKey´³named³ secretKey´³atom³
ByteString„„„„„µ±invalid´³dict·³ secretKey´³named³ secretKey³any„„„„µ±absent´³dict·„„„„„³DefaultProtocol´³lit±!Noise_NK_25519_ChaChaPoly_BLAKE2s„³NoiseStepDetail´³refµ„³ServiceSelector„³ServiceSelector³any³NoiseServiceSpec´³andµ´³named³base´³refµ„³ NoiseSpec„„´³named³ secretKey´³refµ„³SecretKeyField„„„„³NoisePreSharedKeys´³orµµ±present´³dict·³ preSharedKeys´³named³ preSharedKeys´³seqof´³atom³ ByteString„„„„„µ±invalid´³dict·³ secretKey´³named³ secretKey³any„„„„µ±absent´³dict·„„„„„³DefaultProtocol´³lit±!Noise_NK_25519_ChaChaPoly_BLAKE2s„³NoiseStepDetail´³refµ„³ServiceSelector„³ServiceSelector³any³NoiseServiceSpec´³andµ´³named³base´³refµ„³ NoiseSpec„„´³named³ secretKey´³refµ„³SecretKeyField„„„„³NoisePreSharedKeys´³orµµ±present´³dict·³ preSharedKeys´³named³ preSharedKeys´³seqof´³atom³
ByteString„„„„„„µ±invalid´³dict·³ preSharedKeys´³named³ preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³ embeddedType„„µ³timer„´³schema·³version°³ definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³ ByteString„„„„„„µ±invalid´³dict·³ preSharedKeys´³named³ preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³timer„´³schema·³version°³ definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
later-than„´³tupleµ´³named³seconds´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³ TimerExpired´³rec´³lit³ timer-expired„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„„„„„³ embeddedType€„„µ³trace„´³schema·³version°³ definitions·³Oid³any³Name´³orµµ± anonymous´³rec´³lit³ anonymous„´³tupleµ„„„„µ±named´³rec´³lit³named„´³tupleµ´³named³name³any„„„„„„„³Target´³rec´³lit³entity„´³tupleµ´³named³actor´³refµ„³ActorId„„´³named³facet´³refµ„³FacetId„„´³named³oid´³refµ„³Oid„„„„„³TaskId³any³TurnId³any³ActorId³any³FacetId³any³ TurnCause´³orµµ±turn´³rec´³lit³ caused-by„´³tupleµ´³named³id´³refµ„³TurnId„„„„„„µ±cleanup´³rec´³lit³cleanup„´³tupleµ„„„„µ±linkedTaskRelease´³rec´³lit³linked-task-release„´³tupleµ´³named³id´³refµ„³TaskId„„´³named³reason´³refµ„³LinkedTaskReleaseReason„„„„„„µ±periodicActivation´³rec´³lit³periodic-activation„´³tupleµ´³named³period´³atom³Double„„„„„„µ±delay´³rec´³lit³delay„´³tupleµ´³named³ causingTurn´³refµ„³TurnId„„´³named³amount´³atom³Double„„„„„„µ±external´³rec´³lit³external„´³tupleµ´³named³ description³any„„„„„„„³ TurnEvent´³orµµ±assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³AssertionDescription„„´³named³handle´³refµ³protocol„³Handle„„„„„„µ±retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ³protocol„³Handle„„„„„„µ±message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³AssertionDescription„„„„„„µ±sync´³rec´³lit³sync„´³tupleµ´³named³peer´³refµ„³Target„„„„„„µ± breakLink´³rec´³lit³ later-than„´³tupleµ´³named³seconds´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³ TimerExpired´³rec´³lit³ timer-expired„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„„„„„³ embeddedType€„„µ³trace„´³schema·³version°³ definitions·³Oid³any³Name´³orµµ± anonymous´³rec´³lit³ anonymous„´³tupleµ„„„„µ±named´³rec´³lit³named„´³tupleµ´³named³name³any„„„„„„„³Target´³rec´³lit³entity„´³tupleµ´³named³actor´³refµ„³ActorId„„´³named³facet´³refµ„³FacetId„„´³named³oid´³refµ„³Oid„„„„„³TaskId³any³TurnId³any³ActorId³any³FacetId³any³ TurnCause´³orµµ±turn´³rec´³lit³ caused-by„´³tupleµ´³named³id´³refµ„³TurnId„„„„„„µ±cleanup´³rec´³lit³cleanup„´³tupleµ„„„„µ±linkedTaskRelease´³rec´³lit³linked-task-release„´³tupleµ´³named³id´³refµ„³TaskId„„´³named³reason´³refµ„³LinkedTaskReleaseReason„„„„„„µ±periodicActivation´³rec´³lit³periodic-activation„´³tupleµ´³named³period´³atom³Double„„„„„„µ±delay´³rec´³lit³delay„´³tupleµ´³named³ causingTurn´³refµ„³TurnId„„´³named³amount´³atom³Double„„„„„„µ±external´³rec´³lit³external„´³tupleµ´³named³ description³any„„„„„„„³ TurnEvent´³orµµ±assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³AssertionDescription„„´³named³handle´³refµ³protocol„³Handle„„„„„„µ±retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ³protocol„³Handle„„„„„„µ±message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³AssertionDescription„„„„„„µ±sync´³rec´³lit³sync„´³tupleµ´³named³peer´³refµ„³Target„„„„„„µ± breakLink´³rec´³lit³
break-link„´³tupleµ´³named³source´³refµ„³ActorId„„´³named³handle´³refµ³protocol„³Handle„„„„„„„„³ break-link„´³tupleµ´³named³source´³refµ„³ActorId„„´³named³handle´³refµ³protocol„³Handle„„„„„„„„³
ExitStatus´³orµµ±ok´³lit³ok„„µ±Error´³refµ³protocol„³Error„„„„³ ExitStatus´³orµµ±ok´³lit³ok„„µ±Error´³refµ³protocol„³Error„„„„³
@ -40,5 +40,5 @@ ByteString
RunService´³rec´³lit³ run-service„´³tupleµ´³named³ serviceName³any„„„„³ ServiceState´³rec´³lit³ service-state„´³tupleµ´³named³ serviceName³any„´³named³state´³refµ„³State„„„„„³ ServiceObject´³rec´³lit³service-object„´³tupleµ´³named³ serviceName³any„´³named³object³any„„„„³RequireService´³rec´³lit³require-service„´³tupleµ´³named³ serviceName³any„„„„³RestartService´³rec´³lit³restart-service„´³tupleµ´³named³ serviceName³any„„„„³ServiceDependency´³rec´³lit³ RunService´³rec´³lit³ run-service„´³tupleµ´³named³ serviceName³any„„„„³ ServiceState´³rec´³lit³ service-state„´³tupleµ´³named³ serviceName³any„´³named³state´³refµ„³State„„„„„³ ServiceObject´³rec´³lit³service-object„´³tupleµ´³named³ serviceName³any„´³named³object³any„„„„³RequireService´³rec´³lit³require-service„´³tupleµ´³named³ serviceName³any„„„„³RestartService´³rec´³lit³restart-service„´³tupleµ´³named³ serviceName³any„„„„³ServiceDependency´³rec´³lit³
depends-on„´³tupleµ´³named³depender³any„´³named³dependee´³refµ„³ ServiceState„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³protocol„´³schema·³version°³ definitions·³Oid´³atom³ SignedInteger„³Sync´³rec´³lit³S„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³A„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³ SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„µ± Extension´³refµ„³ Extension„„„„³Message´³rec´³lit³M„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³R„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ Extension´³rec´³named³label³any„´³named³fields´³seqof³any„„„³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³ embeddedType€„„µ³ dataspace„´³schema·³version°³ definitions·³Observe´³rec´³lit³Observe„´³tupleµ´³named³pattern´³refµ³dataspacePatterns„³Pattern„„´³named³observer´³embedded³any„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³ depends-on„´³tupleµ´³named³depender³any„´³named³dependee´³refµ„³ ServiceState„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³protocol„´³schema·³version°³ definitions·³Oid´³atom³ SignedInteger„³Sync´³rec´³lit³S„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³A„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³ SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„µ± Extension´³refµ„³ Extension„„„„³Message´³rec´³lit³M„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³R„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ Extension´³rec´³named³label³any„´³named³fields´³seqof³any„„„³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³ embeddedType€„„µ³ dataspace„´³schema·³version°³ definitions·³Observe´³rec´³lit³Observe„´³tupleµ´³named³pattern´³refµ³dataspacePatterns„³Pattern„„´³named³observer´³embedded³any„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³
gatekeeper„´³schema·³version°³ definitions·³Bind´³rec´³lit³bind„´³tupleµ´³named³ description´³refµ„³ Description„„´³named³target´³embedded³any„„´³named³observer´³refµ„³ BindObserver„„„„„³Step´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Bound´³orµµ±bound´³rec´³lit³bound„´³tupleµ´³named³pathStep´³refµ„³PathStep„„„„„„µ±Rejected´³refµ„³Rejected„„„„³Route´³rec´³lit³route„´³ tuplePrefixµ´³named³ gatekeeper„´³schema·³version°³ definitions·³Bind´³rec´³lit³bind„´³tupleµ´³named³ description´³refµ„³ Description„„´³named³target´³embedded³any„„´³named³observer´³refµ„³ BindObserver„„„„„³Step´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Bound´³orµµ±bound´³rec´³lit³bound„´³tupleµ´³named³pathStep´³refµ„³PathStep„„„„„„µ±Rejected´³refµ„³Rejected„„„„³Route´³rec´³lit³route„´³ tuplePrefixµ´³named³
transports´³seqof³any„„„´³named³ pathSteps´³seqof´³refµ„³PathStep„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³step´³refµ„³Step„„´³named³observer´³embedded´³refµ„³Resolved„„„„„„³PathStep´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Rejected´³rec´³lit³rejected„´³tupleµ´³named³detail³any„„„„³Resolved´³orµµ±accepted´³rec´³lit³accepted„´³tupleµ´³named³responderSession´³embedded³any„„„„„„µ±Rejected´³refµ„³Rejected„„„„³ Description´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³ ResolvePath´³rec´³lit³ resolve-path„´³tupleµ´³named³route´³refµ„³Route„„´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvedPathStep´³rec´³lit³ path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„´³named³resolved´³refµ„³Resolved„„„„„³TransportControl´³refµ„³ForceDisconnect„³TransportConnection´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version°³ definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³ embeddedType€„„µ³dataspacePatterns„´³schema·³version°³ definitions·³DLit´³rec´³lit³lit„´³tupleµ´³named³value´³refµ„³AnyAtom„„„„„³DBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³AnyAtom´³orµµ±bool´³atom³Boolean„„µ±double´³atom³Double„„µ±int´³atom³ SignedInteger„„µ±string´³atom³String„„µ±bytes´³atom³ transports´³seqof³any„„„´³named³ pathSteps´³seqof´³refµ„³PathStep„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³step´³refµ„³Step„„´³named³observer´³embedded´³refµ„³Resolved„„„„„„³PathStep´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Rejected´³rec´³lit³rejected„´³tupleµ´³named³detail³any„„„„³Resolved´³orµµ±accepted´³rec´³lit³accepted„´³tupleµ´³named³responderSession´³embedded³any„„„„„„µ±Rejected´³refµ„³Rejected„„„„³ Description´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³ ResolvePath´³rec´³lit³ resolve-path„´³tupleµ´³named³route´³refµ„³Route„„´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvedPathStep´³rec´³lit³ path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„´³named³resolved´³refµ„³Resolved„„„„„³TransportControl´³refµ„³ForceDisconnect„³TransportConnection´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version°³ definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³ embeddedType€„„µ³dataspacePatterns„´³schema·³version°³ definitions·³AnyAtom´³orµµ±bool´³atom³Boolean„„µ±double´³atom³Double„„µ±int´³atom³ SignedInteger„„µ±string´³atom³String„„µ±bytes´³atom³
ByteString„„µ±symbol´³atom³Symbol„„µ±embedded´³embedded³any„„„„³Pattern´³orµµ±DDiscard´³refµ„³DDiscard„„µ±DBind´³refµ„³DBind„„µ±DLit´³refµ„³DLit„„µ± DCompound´³refµ„³ DCompound„„„„³DDiscard´³rec´³lit³_„´³tupleµ„„„³ DCompound´³orµµ±rec´³rec´³lit³rec„´³tupleµ´³named³label³any„´³named³fields´³seqof´³refµ„³Pattern„„„„„„„µ±arr´³rec´³lit³arr„´³tupleµ´³named³items´³seqof´³refµ„³Pattern„„„„„„„µ±dict´³rec´³lit³dict„´³tupleµ´³named³entries´³dictof³any´³refµ„³Pattern„„„„„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„„„ ByteString„„µ±symbol´³atom³Symbol„„µ±embedded´³embedded³any„„„„³Pattern´³orµµ±discard´³rec´³lit³_„´³tupleµ„„„„µ±bind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„„µ±lit´³rec´³lit³lit„´³tupleµ´³named³value´³refµ„³AnyAtom„„„„„„µ±group´³rec´³lit³group„´³tupleµ´³named³type´³refµ„³ GroupType„„´³named³entries´³dictof³any´³refµ„³Pattern„„„„„„„„„³ GroupType´³orµµ±rec´³rec´³lit³rec„´³tupleµ´³named³label³any„„„„„µ±arr´³rec´³lit³arr„´³tupleµ„„„„µ±dict´³rec´³lit³dict„´³tupleµ„„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„„„

View File

@ -1,15 +1,23 @@
version 1 . version 1 .
embeddedType EntityRef.Cap . embeddedType EntityRef.Cap .
# Dataspace patterns: a sublanguage of attenuation patterns. # Dataspace patterns: *almost* a sublanguage of attenuation patterns.
Pattern = DDiscard / DBind / DLit / DCompound . #
# One key difference is that Dataspace patterns are extensible, in that
# they ignore fields not mentioned in group patterns.
DDiscard = <_>. Pattern =
DBind = <bind @pattern Pattern>. / @discard <_>
DLit = <lit @value AnyAtom>. / <bind @pattern Pattern>
DCompound = <rec @label any @fields [Pattern ...]> / <lit @value AnyAtom>
/ <arr @items [Pattern ...]> / <group @type GroupType @entries { any: Pattern ...:... }>
/ <dict @entries { any: Pattern ...:... }> . .
GroupType =
/ <rec @label any>
/ <arr>
/ <dict>
.
AnyAtom = AnyAtom =
/ @bool bool / @bool bool

View File

@ -13,8 +13,37 @@ Step = <<rec> @stepType symbol [@detail any]> .
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Protocol at dataspaces *associated* with gatekeeper entities # Protocol at dataspaces *associated* with gatekeeper entities
# Assertion. Gatekeeper will compute an appropriate PathStep from `description` pointing at # ## Handling `Resolve` requests
# `target`, and will respond with a `Bound` to `observer` (if supplied). #
# When the gatekeeper entity receives a `Resolve` assertion (call it R1), it
#
# 1. asserts a `Resolve` (call it R2) into its associated dataspace that
# is the same as R1 except it has a different `observer`; and
#
# 2. observes a `Bind` with `description` matching the `step` of R1/R2
# according to `stepType` (e.g. treatment of SturdyStepType is not the
# same as treatment of NoiseStepType).
#
# Normally, an appropriate `Bind` is expected to exist. If the gatekeeper
# sees the `Bind` first, it takes the `target` from it and does whatever
# `stepType` mandates before replying to R1's observer.
#
# However, if a `Resolved` is asserted to R2's observer before a `Bind`
# appears, that resolution is relayed on to R1's observer directly, be it
# positive or negative, and the gatekeeper stops waiting for a `Bind`.
#
# This way, entities can keep an eye out for `Resolve` requests that will
# never complete, and answer `Rejected` to them even when no matching
# `Bind` exists. Entities could also use `Resolve` requests to synthesize a
# `Bind` in a "just-in-time" fashion.
#
# ## General treatment of `Bind` assertions
#
# When the gatekeeper sees a `Bind`, independently of any potential
# `Resolve` requests, it computes an appropriate PathStep from
# `description` pointing at `target`, and responds with a `Bound` to
# `observer` (if supplied).
#
Bind = <bind @description Description @target #:any @observer BindObserver> . Bind = <bind @description Description @target #:any @observer BindObserver> .
Description = <<rec> @stepType symbol [@detail any]> . Description = <<rec> @stepType symbol [@detail any]> .
BindObserver = @present #:Bound / @absent #f . BindObserver = @present #:Bound / @absent #f .

View File

@ -21,7 +21,7 @@ MethodPattern = @any #f / @specific @"Lowercase" symbol .
# Assertion in driver DS # Assertion in driver DS
HttpRequest = <http-request HttpRequest = <http-request
@sequenceNumber int @sequenceNumber int
@host string @host RequestHost
@port int @port int
@method @"Lowercase" symbol @method @"Lowercase" symbol
@path [string ...] @path [string ...]
@ -32,13 +32,24 @@ HttpRequest = <http-request
Headers = {@"Lowercase" symbol: string ...:...} . Headers = {@"Lowercase" symbol: string ...:...} .
QueryValue = @string string / <file @filename string @headers Headers @body bytes> . QueryValue = @string string / <file @filename string @headers Headers @body bytes> .
RequestBody = @present bytes / @absent #f . RequestBody = @present bytes / @absent #f .
RequestHost = @present string / @absent #f .
# Assertion to handler entity # Assertion to handler entity
HttpContext = <request @req HttpRequest @res #:HttpResponse> . HttpContext = <request @req HttpRequest @res #:HttpResponse> .
# HttpResponse protocol. Delivered to the `res` ref in `HttpContext`.
#
# (status | header)* . chunk* . done
#
# Done triggers completion of the response and retraction of the frame by the peer. If the
# HttpBinding responsible for the request is withdrawn mid-way through a response (i.e. when
# chunked transfer is used and at least one chunk has been sent) the request is abruptly
# closed; if it is withdrawn at any other moment in the lifetime of the request, a 500 Internal
# Server Error is send to the client.
#
@<TODO "trailers?"> @<TODO "trailers?">
# Messages
HttpResponse = HttpResponse =
# Messages.
/ <status @code int @message string> / <status @code int @message string>
/ <header @name symbol @value string> / <header @name symbol @value string>
/ <chunk @chunk Chunk> / <chunk @chunk Chunk>

View File

@ -1,4 +1,5 @@
version 1 . version 1 .
embeddedType EntityRef.Cap .
# https://noiseprotocol.org/ # https://noiseprotocol.org/
@ -42,13 +43,30 @@ DefaultProtocol = "Noise_NK_25519_ChaChaPoly_BLAKE2s" .
# sequence is exhausted or not supplied, an all-zeros key is used each time a PSK is needed. # sequence is exhausted or not supplied, an all-zeros key is used each time a PSK is needed.
NoisePreSharedKeys = @present { preSharedKeys: [bytes ...] } / @invalid { preSharedKeys: any } / @absent {} . NoisePreSharedKeys = @present { preSharedKeys: [bytes ...] } / @invalid { preSharedKeys: any } / @absent {} .
# Sessions proceed by sending Packets to the initiatorSession and responderSession according to # ---------------------------------------------------------------------------
# the Noise protocol definition. Each Packet represents a complete logical unit of # Handshaking and running a session
# 1. initiator asserts <resolve <noise ServiceSelector> #:A> at Gatekeeper
# 2. gatekeeper asserts <accepted #:B> at #:A
# 3. initiator asserts <initiator #:C> at #:B and then sends `Packet`s to #:B
# 4. responder sends `Packet`s to #:C
#
# Sessions begin with introduction of initiator (#:C) and responder (#:B) to each other, and
# then proceed by sending `Packet`s (from #:C) to #:B and (from #:B) to #:C according to
# the Noise protocol definition. Each `Packet` represents a complete logical unit of
# communication; for example, a complete Turn when layering the Syndicate protocol over Noise. # communication; for example, a complete Turn when layering the Syndicate protocol over Noise.
# Note well the restriction on Noise messages: no individual complete packet or packet fragment # Note well the restriction on Noise messages: no individual complete packet or packet fragment
# may exceed 65535 bytes (N.B. not 65536!). When `fragmented`, each portion of a Packet is a # may exceed 65535 bytes (N.B. not 65536!). When `fragmented`, each portion of a `Packet` is a
# complete Noise "transport message"; when `complete`, the whole thing is likewise a complete # complete Noise "transport message"; when `complete`, the whole thing is likewise a complete
# "transport message". # "transport message".
#
# Retraction of the `Initiator` ends the session from the initiator-side; retraction of the
# `<accepted ...>` assertion ends the session from the responder-side.
SessionItem = Initiator / Packet .
# Assertion
Initiator = <initiator @initiatorSession #:Packet> .
# Message
Packet = @complete bytes / @fragmented [bytes ...] . Packet = @complete bytes / @fragmented [bytes ...] .
# When layering Syndicate protocol over noise, # When layering Syndicate protocol over noise,

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { IdentitySet, Value, embeddedId, is, fromJS, stringify, Dictionary, KeyedSet, Tuple, Embeddable } from '@preserves/core'; import { IdentitySet, Value, embeddedId, is, fromJS, stringify, KeyedSet, Tuple, Embeddable, IsEmbedded } from '@preserves/core';
import { Cell, Field, Graph } from './dataflow.js'; import { Cell, Field, Graph } from './dataflow.js';
import { Caveat, runRewrites } from './rewrite.js'; import { Caveat, runRewrites } from './rewrite.js';
import { ActorSpace } from './space.js'; import { ActorSpace } from './space.js';
@ -40,6 +40,8 @@ export interface Entity {
export type Cap = Ref; export type Cap = Ref;
export class Ref { export class Ref {
get [IsEmbedded](): true { return true; }
readonly relay: Facet; readonly relay: Facet;
readonly target: Partial<Entity>; readonly target: Partial<Entity>;
readonly attenuation?: Caveat[]; readonly attenuation?: Caveat[];
@ -64,7 +66,7 @@ export class Ref {
} }
static __from_preserve__(v: AnyValue): undefined | Ref { static __from_preserve__(v: AnyValue): undefined | Ref {
return typeof v === 'object' && 'relay' in v ? v : void 0; return typeof v === 'object' && IsEmbedded in v && 'relay' in v ? v : void 0;
} }
} }
@ -223,7 +225,7 @@ export class Facet {
const h = nextHandle++; const h = nextHandle++;
const e = { const e = {
handle: h, handle: h,
peer: { relay: other, target: new StopOnRetract() }, peer: new Ref(other, new StopOnRetract()),
crossSpace: null, crossSpace: null,
established: true, established: true,
}; };
@ -401,7 +403,7 @@ export class Turn {
}); });
}, },
() => { () => {
const a = new KeyedSet<number, Ref>(); const a = new KeyedSet<Ref, number>();
initialAssertions.forEach(h => a.add(h)); initialAssertions.forEach(h => a.add(h));
return Q.ActionDescription.spawnActor({ detail, initialAssertions: a }); return Q.ActionDescription.spawnActor({ detail, initialAssertions: a });
}); });
@ -430,10 +432,10 @@ export class Turn {
crash(err: Error): void { crash(err: Error): void {
this.enqueue(this.activeFacet.actor.root, this.enqueue(this.activeFacet.actor.root,
() => this.activeFacet.actor._terminateWith({ ok: false, err }), () => this.activeFacet.actor._terminateWith({ ok: false, err }),
() => Q.ActionDescription.stopActor(Q.OptionalAny.some(Dictionary.fromJS({ () => Q.ActionDescription.stopActor(Q.OptionalAny.some<Ref>({
message: err.message, message: err.message,
stack: err.stack ? err.stack : false, stack: err.stack ? err.stack : false,
})))); })));
} }
field<V>(initial: V, name?: string): Field<V> { field<V>(initial: V, name?: string): Field<V> {

View File

@ -13,9 +13,9 @@ export enum ChangeDescription {
} }
export class Bag<T extends Embeddable, V extends Value<T> = Value<T>> { export class Bag<T extends Embeddable, V extends Value<T> = Value<T>> {
_items: KeyedDictionary<V, number, T>; _items: KeyedDictionary<T, V, number>;
constructor(s?: KeyedSet<V, T>) { constructor(s?: KeyedSet<T, V>) {
this._items = new KeyedDictionary(); this._items = new KeyedDictionary();
if (s) s.forEach((v) => this._items.set(v, 1)); if (s) s.forEach((v) => this._items.set(v, 1));
} }
@ -68,7 +68,7 @@ export class Bag<T extends Embeddable, V extends Value<T> = Value<T>> {
this._items.forEach((c, v) => f(c, v)); this._items.forEach((c, v) => f(c, v));
} }
snapshot(): KeyedDictionary<V, number, T> { snapshot(): KeyedDictionary<T, V, number> {
return this._items.clone(); return this._items.clone();
} }

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { IdentityMap, KeyedDictionary, stringify } from '@preserves/core'; import { IdentityMap, KeyedDictionary, stringify, strip } from '@preserves/core';
import { Index, IndexObserver } from './skeleton.js'; import { Index, IndexObserver } from './skeleton.js';
import { Actor, AnyValue, Assertion, DetailedAction, Entity, Facet, Handle, LocalAction, Ref, Turn } from './actor.js'; import { Actor, AnyValue, Assertion, DetailedAction, Entity, Facet, Handle, LocalAction, Ref, Turn } from './actor.js';
import { Observe, toObserve } from '../gen/dataspace.js'; import { Observe, toObserve } from '../gen/dataspace.js';
@ -16,7 +16,7 @@ export type DataspaceOptions = {
}; };
export class DataspaceObserver implements IndexObserver<Turn> { export class DataspaceObserver implements IndexObserver<Turn> {
readonly captureMap = new KeyedDictionary<Array<AnyValue>, Handle, Ref>(); readonly captureMap = new KeyedDictionary<Ref, Array<AnyValue>, Handle>();
constructor( constructor(
public readonly target: Ref, public readonly target: Ref,
@ -46,17 +46,16 @@ export class DataspaceObserver implements IndexObserver<Turn> {
} }
export class Dataspace implements Partial<Entity> { export class Dataspace implements Partial<Entity> {
private static _global: Ref | undefined = void 0; private static _local: Ref | undefined = void 0;
static get global(): Ref { static get local(): Ref {
if (Dataspace._global === void 0) { if (Dataspace._local === void 0) {
Dataspace.boot(ds => { Dataspace.boot(ds => {
Turn.activeFacet.actor.name = Symbol.for('Dataspace.global'); Turn.activeFacet.actor.name = Symbol.for('Dataspace.local');
// Cast to any because `global` is otherwise readonly (!) Dataspace._local = ds;
Dataspace._global = ds;
}); });
} }
return Dataspace._global!; return Dataspace._local!;
} }
// Alias for syndicatec code generator to use, plus hook for fallback use outside a Turn // Alias for syndicatec code generator to use, plus hook for fallback use outside a Turn
@ -73,14 +72,14 @@ export class Dataspace implements Partial<Entity> {
if (Turn.active) { if (Turn.active) {
return Turn.active._spawn(bootProc); return Turn.active._spawn(bootProc);
} else { } else {
return Actor.boot(bootProc, void 0, Dataspace.global.relay.actor.space); return Actor.boot(bootProc, void 0, Dataspace.local.relay.actor.space);
} }
} }
readonly options: DataspaceOptions; readonly options: DataspaceOptions;
readonly index = new Index(); readonly index = new Index();
readonly handleMap = new IdentityMap<Handle, Assertion>(); readonly handleMap = new IdentityMap<Handle, Assertion>();
readonly observerMap = new IdentityMap<Ref, DataspaceObserver>(); readonly observerMap = new KeyedDictionary<Ref, Observe, DataspaceObserver>();
readonly data = this; readonly data = this;
constructor(options?: DataspaceOptions) { constructor(options?: DataspaceOptions) {
@ -91,12 +90,11 @@ export class Dataspace implements Partial<Entity> {
const is_new = this.index.addAssertion(v, Turn.active); const is_new = this.index.addAssertion(v, Turn.active);
this.options.tracer?.('+', v, this, is_new); this.options.tracer?.('+', v, this, is_new);
if (is_new) { if (is_new) {
const o = toObserve(v); const o = toObserve(strip(v));
if (o !== void 0) { if (o !== void 0) {
const target = o.observer; const io = new DataspaceObserver(o.observer);
const observer = new DataspaceObserver(target); this.observerMap.set(o, io);
this.observerMap.set(target, observer); this.index.addObserver(o.pattern, io, Turn.active);
this.index.addObserver(o.pattern, observer, Turn.active);
} }
if (this.options.dumpIndex ?? false) this.index.dump(); if (this.options.dumpIndex ?? false) this.index.dump();
} }
@ -110,12 +108,12 @@ export class Dataspace implements Partial<Entity> {
const is_last = this.index.removeAssertion(v, Turn.active); const is_last = this.index.removeAssertion(v, Turn.active);
this.options.tracer?.('-', v, this, is_last); this.options.tracer?.('-', v, this, is_last);
if (is_last) { if (is_last) {
const o = toObserve(v); const o = toObserve(strip(v));
if (o !== void 0) { if (o !== void 0) {
const io = this.observerMap.get(o.observer); const io = this.observerMap.get(o);
if (io !== void 0) { if (io !== void 0) {
this.index.removeObserver(o.pattern, io, Turn.active); this.index.removeObserver(o.pattern, io, Turn.active);
this.observerMap.delete(o.observer); this.observerMap.delete(o);
} }
} }
if (this.options.dumpIndex ?? false) this.index.dump(); if (this.options.dumpIndex ?? false) this.index.dump();

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { canonicalString, KeyedDictionary, Dictionary, is, Record, RecordConstructorInfo, Value, CompoundKey, _iterMap } from '@preserves/core'; import { canonicalString, KeyedDictionary, is, Record, RecordConstructorInfo, Value, _iterMap, DictionaryMap, Dictionary, EncodableDictionary, unannotate } from '@preserves/core';
import { AnyValue, Ref } from './actor.js'; import { AnyValue, Ref } from './actor.js';
import * as P from '../gen/dataspacePatterns.js'; import * as P from '../gen/dataspacePatterns.js';
@ -10,23 +10,24 @@ export type Path = Array<AnyValue>;
export type Shape = string; export type Shape = string;
export function classOfValue(v: any): Shape | null { export function classOfValue(v: any): Shape | null {
v = unannotate(v);
if (Record.isRecord(v)) { if (Record.isRecord(v)) {
return constructorInfoSignature(Record.constructorInfo(v)); return constructorInfoSignature(Record.constructorInfo(v));
} else if (Array.isArray(v)) { } else if (Array.isArray(v)) {
return '' + v.length; return '[]';
} else if (Map.isMap(v)) { } else if (Dictionary.isDictionary(v)) {
return '{}'; return '{}';
} else { } else {
return null; return null;
} }
} }
export function classOfCtor(v: P.DCompound): Shape { export function classOfCtor(v: P.GroupType): Shape {
switch (v._variant) { switch (v._variant) {
case 'rec': case 'rec':
return canonicalString(v.label) + '/' + v.fields.length; return canonicalString(v.label);
case 'arr': case 'arr':
return '' + v.items.length; return '[]';
case 'dict': case 'dict':
return '{}'; return '{}';
} }
@ -34,55 +35,60 @@ export function classOfCtor(v: P.DCompound): Shape {
// Called by generated code in addition to functions in this module // Called by generated code in addition to functions in this module
export function constructorInfoSignature(ci: RecordConstructorInfo<Value>): string { export function constructorInfoSignature(ci: RecordConstructorInfo<Value>): string {
return canonicalString(ci.label) + '/' + ci.arity; return canonicalString(ci.label);
} }
export function step(v: AnyValue, index: AnyValue): AnyValue | undefined { export function step(v: AnyValue, index: AnyValue): AnyValue | undefined {
if (Map.isMap(v)) { v = unannotate(v);
return v.get(index); const vMap = Dictionary.asMap<Ref>(v);
if (vMap) {
return vMap.get(index);
} else { } else {
return (v as Array<AnyValue> /* includes Record! */)[index as number]; return (v as Array<AnyValue> /* includes Record! */)[index as number];
} }
} }
export type ConstantPositions = {
withValues: Array<Path>,
requiredToExist: Array<Path>,
}
export type PatternAnalysis = { export type PatternAnalysis = {
constPaths: Array<Path>, constPositions: ConstantPositions,
constValues: Array<AnyValue>, constValues: Array<AnyValue>,
capturePaths: Array<Path>, capturePaths: Array<Path>,
}; };
export function analysePattern(p: P.Pattern): PatternAnalysis { export function analysePattern(p: P.Pattern): PatternAnalysis {
const result: PatternAnalysis = { const result: PatternAnalysis = {
constPaths: [], constPositions: {
withValues: [],
requiredToExist: [],
},
constValues: [], constValues: [],
capturePaths: [], capturePaths: [],
}; };
const path: Path = []; const path: Path = [];
function walkKey(p: P.Pattern, key: AnyValue) {
path.push(key);
walk(p);
path.pop();
}
function walk(p: P.Pattern) { function walk(p: P.Pattern) {
switch (p._variant) { switch (p._variant) {
case 'DCompound': case 'group':
switch (p.value._variant) { p.entries.forEach((p, k) => {
case 'rec': p.value.fields.forEach(walkKey); break; path.push(k);
case 'arr': p.value.items.forEach(walkKey); break; walk(p);
case 'dict': p.value.entries.forEach(walkKey); break; path.pop();
} });
break; break;
case 'DBind': case 'bind':
result.capturePaths.push(path.slice()); result.capturePaths.push(path.slice());
walk(p.value.pattern); walk(p.pattern);
break; break;
case 'DDiscard': case 'discard':
result.constPositions.requiredToExist.push(path.slice());
break; break;
case 'DLit': case 'lit':
result.constPaths.push(path.slice()); result.constPositions.withValues.push(path.slice());
result.constValues.push(P.fromAnyAtom(p.value.value)); result.constValues.push(P.fromAnyAtom(p.value));
break; break;
} }
} }
@ -96,32 +102,20 @@ export function match(p: P.Pattern, v: AnyValue): Array<AnyValue> | false {
function walk(p: P.Pattern, v: AnyValue): boolean { function walk(p: P.Pattern, v: AnyValue): boolean {
switch (p._variant) { switch (p._variant) {
case 'DBind': { case 'bind': {
captures.push(v); captures.push(v);
return walk(p.value.pattern, v); return walk(p.pattern, v);
} }
case 'DDiscard': case 'discard':
return true; return true;
case 'DLit': case 'lit':
return is(p.value.value, v); return is(p.value, v);
case 'DCompound': { case 'group': {
const pcls = classOfCtor(p.value); const pcls = classOfCtor(p.type);
const vcls = classOfValue(v); const vcls = classOfValue(v);
if (pcls !== vcls) return false; if (pcls !== vcls) return false;
let items: Array<P.Pattern>; for (const [stepIndex, pp] of p.entries.entries()) {
switch (p.value._variant) { const vv = step(v, stepIndex);
case 'dict':
for (const [stepIndex, pp] of p.value.entries.entries()) {
const vv = step(v, stepIndex);
if (vv === void 0 || !walk(pp, vv)) return false;
}
return true;
case 'rec': items = p.value.fields; break;
case 'arr': items = p.value.items; break;
}
let index = 0;
for (const pp of items) {
const vv = step(v, index++);
if (vv === void 0 || !walk(pp, vv)) return false; if (vv === void 0 || !walk(pp, vv)) return false;
} }
return true; return true;
@ -135,19 +129,14 @@ export function match(p: P.Pattern, v: AnyValue): Array<AnyValue> | false {
export function isCompletelyConcrete(p: P.Pattern): boolean { export function isCompletelyConcrete(p: P.Pattern): boolean {
function walk(p: P.Pattern): boolean { function walk(p: P.Pattern): boolean {
switch (p._variant) { switch (p._variant) {
case 'DBind': return false; case 'bind': return false;
case 'DDiscard': return false; case 'discard': return false;
case 'DLit': return true; case 'lit': return true;
case 'DCompound': switch (p.value._variant) { case 'group':
case 'rec': return p.value.fields.every(isCompletelyConcrete); for (const pp of p.entries.values()) {
case 'arr': return p.value.items.every(isCompletelyConcrete); if (!walk(pp)) return false;
case 'dict': {
for (const pp of p.value.entries.values()) {
if (!walk(pp)) return false;
}
return true;
} }
} return true;
} }
} }
return walk(p); return walk(p);
@ -156,26 +145,19 @@ export function isCompletelyConcrete(p: P.Pattern): boolean {
export function withoutCaptures(p: P.Pattern): P.Pattern { export function withoutCaptures(p: P.Pattern): P.Pattern {
function walk(p: P.Pattern): P.Pattern { function walk(p: P.Pattern): P.Pattern {
switch (p._variant) { switch (p._variant) {
case 'DBind': return walk(p.value.pattern); case 'bind': return walk(p.pattern);
case 'DDiscard': return p; case 'discard': return p;
case 'DLit': return p; case 'lit': return p;
case 'DCompound': case 'group': {
switch (p.value._variant) { const newEntries = new KeyedDictionary<Ref, Value<Ref>, P.Pattern<Ref>>();
case 'rec': for (const [kk, pp] of p.entries) {
return P.Pattern.DCompound(P.DCompound.rec({ newEntries.set(kk, walk(pp));
label: p.value.label,
fields: p.value.fields.map(walk),
}));
case 'arr':
return P.Pattern.DCompound(P.DCompound.arr(p.value.items.map(walk)));
case 'dict': {
const newDict = new KeyedDictionary<Value<Ref>, P.Pattern<Ref>, Ref>();
for (const [k, v] of p.value.entries) {
newDict.set(k, walk(v));
}
return P.Pattern.DCompound(P.DCompound.dict(newDict));
}
} }
return P.Pattern.group({
type: p.type,
entries: newEntries,
});
}
} }
} }
return walk(p); return walk(p);
@ -185,57 +167,92 @@ export function withoutCaptures(p: P.Pattern): P.Pattern {
// Constructor helpers // Constructor helpers
export function bind(p?: P.Pattern): P.Pattern { export function bind(p?: P.Pattern): P.Pattern {
return P.Pattern.DBind(P.DBind(p ?? _)); return P.Pattern.bind(p ?? _);
} }
export function discard(): P.Pattern { export function discard(): P.Pattern {
return P.Pattern.DDiscard(P.DDiscard()); return P.Pattern.discard();
} }
export const _ = discard(); export const _ = discard();
function lit_seq_entries(vs: AnyValue[]): KeyedDictionary<Ref, AnyValue, P.Pattern<Ref>> {
const entries = new KeyedDictionary<Ref, AnyValue, P.Pattern<Ref>>();
vs.forEach((v, i) => entries.set(i, lit(v)));
return entries;
}
export function lit(v: AnyValue): P.Pattern { export function lit(v: AnyValue): P.Pattern {
if (Array.isArray(v)) { if (Array.isArray(v)) {
if ('label' in v) { if ('label' in v) {
return P.Pattern.DCompound(P.DCompound.rec({ return P.Pattern.group({
label: v.label, type: P.GroupType.rec(v.label),
fields: v.map(lit), entries: lit_seq_entries(v),
})); });
} else { } else {
return P.Pattern.DCompound(P.DCompound.arr(v.map(lit))); return P.Pattern.group({
type: P.GroupType.arr(),
entries: lit_seq_entries(v),
});
} }
} else if (Map.isMap(v)) {
return P.Pattern.DCompound(P.DCompound.dict(v.mapEntries(
e => [e[0], lit(e[1])])));
} else if (Set.isSet(v)) {
throw new Error("Cannot express literal set in pattern");
} else {
return P.Pattern.DLit(P.DLit(P.asAnyAtom(v)));
} }
const vMap = Dictionary.asMap<Ref>(v);
if (vMap) {
const r = new KeyedDictionary<Ref, AnyValue, P.Pattern>();
vMap.forEach((val, key) => r.set(key, lit(val)));
return P.Pattern.group({
type: P.GroupType.dict(),
entries: r,
});
}
if (Set.isSet(v)) {
throw new Error("Cannot express literal set in pattern");
}
return P.Pattern.lit(P.asAnyAtom(v));
} }
export function drop_lit(p: P.Pattern): AnyValue | null { export function drop_lit(p: P.Pattern): AnyValue | null {
const e = new Error(); const e = new Error();
function walkEntries(target: AnyValue[], entries: EncodableDictionary<Ref, AnyValue, P.Pattern<Ref>>): void {
let maxKey = -1;
for (const key of entries.keys()) {
if (typeof key !== 'number') throw e;
maxKey = Math.max(maxKey, key);
}
for (let i = 0; i < maxKey + 1; i++) {
const p = entries.get(i);
if (p === void 0) throw e;
target.push(walk(p));
}
}
function walk(p: P.Pattern): AnyValue { function walk(p: P.Pattern): AnyValue {
switch (p._variant) { switch (p._variant) {
case 'DCompound': case 'group':
switch (p.value._variant) { switch (p.type._variant) {
case 'rec': { case 'rec': {
const v = [] as unknown as Record<AnyValue, AnyValue[], Ref>; const v = [] as unknown as Record<AnyValue, AnyValue[], Ref>;
v.label = p.value.label; v.label = p.type.label;
p.value.fields.forEach(tt => v.push(walk(tt))); walkEntries(v, p.entries);
return v; return v;
} }
case 'arr': case 'arr': {
return p.value.items.map(walk); const v = [] as AnyValue[];
case 'dict': { walkEntries(v, p.entries);
const v = new Dictionary<Ref, AnyValue>();
p.value.entries.forEach((pp, key) => v.set(key, walk(pp)));
return v; return v;
} }
case 'dict': {
const v = new DictionaryMap<Ref, AnyValue>();
p.entries.forEach((pp, key) => v.set(key, walk(pp)));
return v.simplifiedValue();
}
} }
case 'DLit': case 'lit':
return P.fromAnyAtom(p.value.value); return P.fromAnyAtom(p.value);
default: default:
throw e; throw e;
} }
@ -249,13 +266,22 @@ export function drop_lit(p: P.Pattern): AnyValue | null {
} }
export function rec(label: AnyValue, ... fields: P.Pattern[]): P.Pattern { export function rec(label: AnyValue, ... fields: P.Pattern[]): P.Pattern {
return P.Pattern.DCompound(P.DCompound.rec({ label, fields })); return P.Pattern.group({
type: P.GroupType.rec(label),
entries: new KeyedDictionary<Ref, AnyValue, P.Pattern>(fields.map((p, i) => [i, p])),
});
} }
export function arr(... patterns: P.Pattern[]): P.Pattern { export function arr(... patterns: P.Pattern[]): P.Pattern {
return P.Pattern.DCompound(P.DCompound.arr(patterns)); return P.Pattern.group({
type: P.GroupType.arr(),
entries: new KeyedDictionary<Ref, AnyValue, P.Pattern>(patterns.map((p, i) => [i, p])),
});
} }
export function dict(... entries: [AnyValue, P.Pattern][]): P.Pattern { export function dict(... entries: [AnyValue, P.Pattern][]): P.Pattern {
return P.Pattern.DCompound(P.DCompound.dict(new Dictionary<Ref, P.Pattern>(entries))); return P.Pattern.group({
type: P.GroupType.dict(),
entries: new KeyedDictionary<Ref, AnyValue, P.Pattern>(entries),
});
} }

View File

@ -2,9 +2,9 @@
/// SPDX-FileCopyrightText: Copyright © 2021-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2021-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { AnyValue, Ref } from './actor.js'; import { AnyValue, Ref } from './actor.js';
import { Pattern, toPattern } from '../gen/dataspacePatterns.js'; import { Pattern, toPattern, GroupType, fromGroupType } from '../gen/dataspacePatterns.js';
import * as P from './pattern.js'; import * as P from './pattern.js';
import { RecordConstructorInfo, is, Record } from '@preserves/core'; import { RecordConstructorInfo, is, Record, JsDictionary } from '@preserves/core';
import { Meta, Type, GenType, SchemaDefinition } from '@preserves/schema'; import { Meta, Type, GenType, SchemaDefinition } from '@preserves/schema';
export type QuasiValueConstructorInfo = export type QuasiValueConstructorInfo =
@ -17,9 +17,7 @@ export type QuasiValue =
| { type: 'bind', inner: QuasiValue } | { type: 'bind', inner: QuasiValue }
| { type: 'discard' } | { type: 'discard' }
| { type: 'lit', value: AnyValue } | { type: 'lit', value: AnyValue }
| { type: 'rec', label: AnyValue, items: QuasiValue[] } | { type: 'group', groupType: GroupType, entries: [AnyValue, QuasiValue][] }
| { type: 'arr', items: QuasiValue[] }
| { type: 'dict', entries: [AnyValue, QuasiValue][] }
| { type: 'unquote', unquoted: QuasiValue } | { type: 'unquote', unquoted: QuasiValue }
; ;
@ -58,7 +56,8 @@ export function rec(label: AnyValue, ... items: QuasiValue[]): QuasiValue {
if (literals.length === items.length) { if (literals.length === items.length) {
return lit(Record(label, literals)); return lit(Record(label, literals));
} else { } else {
return { type: 'rec', label, items }; const entries = items.map((v, i) => [i, v] as [number, QuasiValue]);
return { type: 'group', groupType: GroupType.rec(label), entries };
} }
} }
@ -67,12 +66,13 @@ export function arr(... items: QuasiValue[]): QuasiValue {
if (literals.length === items.length) { if (literals.length === items.length) {
return lit(literals); return lit(literals);
} else { } else {
return { type: 'arr', items }; const entries = items.map((v, i) => [i, v] as [number, QuasiValue]);
return { type: 'group', groupType: GroupType.arr(), entries };
} }
} }
export function dict(... entries: [AnyValue, QuasiValue][]): QuasiValue { export function dict(... entries: [AnyValue, QuasiValue][]): QuasiValue {
return { type: 'dict', entries }; return { type: 'group', groupType: GroupType.dict(), entries };
} }
export function quote(quoted: QuasiValue): QuasiValue { export function quote(quoted: QuasiValue): QuasiValue {
@ -80,12 +80,9 @@ export function quote(quoted: QuasiValue): QuasiValue {
case 'bind': return quote(bind.quasiValue(quoted.inner)); case 'bind': return quote(bind.quasiValue(quoted.inner));
case 'discard': return quote(discard.quasiValue()); case 'discard': return quote(discard.quasiValue());
case 'lit': return rec(Symbol.for('lit'), lit(quoted.value)); case 'lit': return rec(Symbol.for('lit'), lit(quoted.value));
case 'arr': return rec(Symbol.for('arr'), arr( case 'group':
... quoted.items.map(quote))); return rec(Symbol.for('group'), lit(fromGroupType(quoted.groupType)), dict(
case 'rec': return rec(Symbol.for('rec'), lit(quoted.label), arr( ... quoted.entries.map(([k, qq]) => [k, quote(qq)] as [AnyValue, QuasiValue])));
... quoted.items.map(quote)));
case 'dict': return rec(Symbol.for('dict'), dict(
... quoted.entries.map(([k, qq]) => [k, quote(qq)] as [AnyValue, QuasiValue])));
case 'unquote': return quoted.unquoted; case 'unquote': return quoted.unquoted;
} }
} }
@ -94,13 +91,27 @@ export function unquote(unquoted: QuasiValue): QuasiValue {
return { type: 'unquote', unquoted }; return { type: 'unquote', unquoted };
} }
function entriesSeq<V>(entries: [AnyValue, V][], defaultValue: V): V[] {
let maxKey = -1;
const result: V[] = [];
for (const [k, q] of entries) {
if (typeof k !== 'number') throw new Error("Invalid sequence quasivalue entries key");
result[k] = q;
maxKey = Math.max(maxKey, k);
}
for (let i = 0; i < maxKey + 1; i++) {
if (result[i] === void 0) result[i] = defaultValue;
}
return result;
}
export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]): QuasiValue { export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]): QuasiValue {
if ('constructorInfo' in info) { if ('constructorInfo' in info) {
return rec(info.constructorInfo.label, ... items); return rec(info.constructorInfo.label, ... items);
} else if ('schema' in info) { } else if ('schema' in info) {
const definfo = info.schema(); const definfo = info.schema();
const schema = Meta.asSchema(definfo.schema); const schema = Meta.asSchema(definfo.schema);
const def = schema.definitions.get(definfo.definitionName)!; const def = JsDictionary.get(schema.definitions, definfo.definitionName)!;
const defNameStr = definfo.definitionName.description!; const defNameStr = definfo.definitionName.description!;
const ctorArgs = items.slice(); const ctorArgs = items.slice();
@ -158,7 +169,7 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
if (d.type === 'discard') { if (d.type === 'discard') {
return d; return d;
} }
if (d.type !== 'dict') { if (d.type !== 'group' || d.groupType._variant !== 'dict') {
throw new Error(`Dictionary argument needed to ${defNameStr}`); throw new Error(`Dictionary argument needed to ${defNameStr}`);
} }
for (const [k, p] of d.entries) { for (const [k, p] of d.entries) {
@ -217,8 +228,8 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
} }
function qArr(q: QuasiValue): QuasiValue[] { function qArr(q: QuasiValue): QuasiValue[] {
if (q.type === 'arr') { if (q.type === 'group' && q.groupType._variant === 'arr') {
return q.items; return entriesSeq(q.entries, discard());
} else if (q.type === 'lit' && Array.isArray(q.value)) { } else if (q.type === 'lit' && Array.isArray(q.value)) {
return q.value.map(lit); return q.value.map(lit);
} else { } else {
@ -284,10 +295,12 @@ function walk(q: QuasiValue): Pattern {
case 'bind': return P.bind(walk(q.inner)); case 'bind': return P.bind(walk(q.inner));
case 'discard': return P._; case 'discard': return P._;
case 'lit': return P.lit(q.value); case 'lit': return P.lit(q.value);
case 'arr': return P.arr(... q.items.map(walk)); case 'group': switch (q.groupType._variant) {
case 'rec': return P.rec(q.label, ... q.items.map(walk)); case 'arr': return P.arr(... entriesSeq(q.entries, discard()).map(walk));
case 'dict': return P.dict(... q.entries.map( case 'rec': return P.rec(q.groupType.label, ... entriesSeq(q.entries, discard()).map(walk));
([k, qq]) => [k, walk(qq)] as [AnyValue, Pattern])); case 'dict': return P.dict(... q.entries.map(
([k, qq]) => [k, walk(qq)] as [AnyValue, Pattern]));
}
case 'unquote': throw new Error('Unexpected unquote in QuasiValue'); case 'unquote': throw new Error('Unexpected unquote in QuasiValue');
} }
} }

View File

@ -1,9 +1,9 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Turn } from "./actor.js"; import { Turn, Ref } from "./actor.js";
import { Bytes, Dictionary, DoubleFloat, IdentityMap, is, isEmbedded, Record, Tuple, stringify } from "@preserves/core"; import { Bytes, Dictionary, DictionaryMap, DoubleFloat, IdentityMap, KeyedDictionary, is, isEmbedded, Record, Tuple, stringify } from "@preserves/core";
import type { Assertion, Handle, Ref } from "./actor.js"; import type { Assertion, Handle } from "./actor.js";
import type { SturdyValue } from "../transport/sturdy.js"; import type { SturdyValue } from "../transport/sturdy.js";
import { import {
@ -19,6 +19,8 @@ import {
PEmbedded, PEmbedded,
Pattern, Pattern,
Rewrite, Rewrite,
TAttenuate,
TCompound,
TRef, TRef,
Template, Template,
_embedded, _embedded,
@ -87,9 +89,10 @@ export function match(p: Pattern, v: Assertion): Bindings | null {
return true; return true;
} }
case 'dict':{ case 'dict':{
if (!Dictionary.isDictionary<Ref, Assertion>(v)) return false; const vMap = Dictionary.asMap<Ref, Assertion>(v);
if (!vMap) return false;
for (const [key, pp] of p.value.entries.entries()) { for (const [key, pp] of p.value.entries.entries()) {
const vv = v.get(key); const vv = vMap.get(key);
if (vv === void 0) return false; if (vv === void 0) return false;
if (!walk(pp, vv)) return false; if (!walk(pp, vv)) return false;
} }
@ -134,9 +137,9 @@ export function instantiate(t: Template, b: Bindings): Assertion {
case 'arr': case 'arr':
return t.value.items.map(walk); return t.value.items.map(walk);
case 'dict': { case 'dict': {
const v = new Dictionary<Ref, Assertion>(); const v = new DictionaryMap<Ref, Assertion>();
t.value.entries.forEach((tt, key) => v.set(key, walk(tt))); t.value.entries.forEach((tt, key) => v.set(key, walk(tt)));
return v; return v.simplifiedValue();
} }
} }
} }
@ -191,9 +194,14 @@ export function rfilter(... patterns: Pattern[]): Caveat {
return ps.length === 1 ? Caveat.Rewrite(ps[0]) : Caveat.Alts(Alts(ps)); return ps.length === 1 ? Caveat.Rewrite(ps[0]) : Caveat.Alts(Alts(ps));
} }
export function rmap(... rewrites: [Pattern, Template][]): Caveat {
const rs = rewrites.map(([pattern, template]) => Rewrite({ pattern, template }));
return rs.length === 1 ? Caveat.Rewrite(rs[0]) : Caveat.Alts(Alts(rs));
}
export function attenuate(ref: Ref, ... a: Caveat[]): Ref { export function attenuate(ref: Ref, ... a: Caveat[]): Ref {
if (a.length === 0) return ref; if (a.length === 0) return ref;
return { ... ref, attenuation: [... (ref.attenuation ?? []), ... a] }; return new Ref(ref.relay, ref.target, [... (ref.attenuation ?? []), ... a]);
} }
export function forwarder(ref: Ref): { proxy: Ref, revoker: Ref } { export function forwarder(ref: Ref): { proxy: Ref, revoker: Ref } {
@ -236,7 +244,7 @@ export function pArr(... items: Array<Pattern>): Pattern {
} }
export function pDict(... entries: [SturdyValue, Pattern][]): Pattern { export function pDict(... entries: [SturdyValue, Pattern][]): Pattern {
return Pattern.PCompound(PCompound.dict(new Dictionary<_embedded, Pattern>(entries))); return Pattern.PCompound(PCompound.dict(new KeyedDictionary<_embedded, SturdyValue, Pattern>(entries)));
} }
export function pLit(value: SturdyValue): Pattern { export function pLit(value: SturdyValue): Pattern {
@ -286,3 +294,27 @@ export function pBoolean(): Pattern {
export function pDiscard(): Pattern { export function pDiscard(): Pattern {
return Pattern.PDiscard(PDiscard()); return Pattern.PDiscard(PDiscard());
} }
export function tRec(label: SturdyValue, ... fields: Array<Template>): Template {
return Template.TCompound(TCompound.rec({ label, fields }));
}
export function tArr(... items: Array<Template>): Template {
return Template.TCompound(TCompound.arr(items));
}
export function tDict(... entries: [SturdyValue, Template][]): Template {
return Template.TCompound(TCompound.dict(new KeyedDictionary<_embedded, SturdyValue, Template>(entries)));
}
export function tLit(value: SturdyValue): Template {
return Template.Lit(Lit(value));
}
export function tRef(binding: number): Template {
return Template.TRef(TRef(binding));
}
export function tAttenuate(template: Template, ... attenuation: Caveat[]): Template {
return Template.TAttenuate(TAttenuate({ template, attenuation }));
}

View File

@ -1,12 +1,12 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Set, Dictionary, KeyedDictionary, IdentitySet, stringify, Value, Embeddable } from '@preserves/core'; import { Set, KeyedDictionary, IdentitySet, stringify, Value, Embeddable } from '@preserves/core';
import { AnyValue, Assertion, Ref } from './actor.js'; import { AnyValue, Assertion, Ref } from './actor.js';
import { Bag, ChangeDescription } from './bag.js'; import { Bag, ChangeDescription } from './bag.js';
import * as Stack from './stack.js'; import * as Stack from './stack.js';
import * as P from '../gen/dataspacePatterns.js'; import * as P from '../gen/dataspacePatterns.js';
import { Path, analysePattern, classOfCtor, classOfValue, step } from './pattern.js'; import { Path, analysePattern, classOfCtor, classOfValue, step, Shape, ConstantPositions } from './pattern.js';
enum EventType { enum EventType {
ADDED = +1, ADDED = +1,
@ -31,13 +31,15 @@ export class Index<T> {
readonly root: Node<T> = new Node(new Continuation(new Set())); readonly root: Node<T> = new Node(new Continuation(new Set()));
addObserver(pattern: P.Pattern, observer: IndexObserver<T>, parameter: T) { addObserver(pattern: P.Pattern, observer: IndexObserver<T>, parameter: T) {
let {constPaths, constValues, capturePaths} = analysePattern(pattern); let {constPositions, constValues, capturePaths} = analysePattern(pattern);
const continuation = this.root.extend(pattern); const continuation = this.root.extend(pattern);
let constValMap = continuation.leafMap.get(constPaths); let constValMap = continuation.leafMap.get(constPositions);
if (!constValMap) { if (!constValMap) {
constValMap = new Dictionary(); constValMap = new KeyedDictionary();
continuation.cachedAssertions.forEach((a) => { continuation.cachedAssertions.forEach((a) => {
const key = projectPaths(a, constPaths); if (projectPaths(a, constPositions.requiredToExist) === void 0) return;
const key = projectPaths(a, constPositions.withValues);
if (key === void 0) return;
let leaf = constValMap!.get(key); let leaf = constValMap!.get(key);
if (!leaf) { if (!leaf) {
leaf = new Leaf(); leaf = new Leaf();
@ -45,7 +47,7 @@ export class Index<T> {
} }
leaf.cachedAssertions.add(a); leaf.cachedAssertions.add(a);
}); });
continuation.leafMap.set(constPaths, constValMap); continuation.leafMap.set(constPositions, constValMap);
} }
let leaf = constValMap.get(constValues); let leaf = constValMap.get(constValues);
if (!leaf) { if (!leaf) {
@ -55,8 +57,10 @@ export class Index<T> {
let observerGroup = leaf.observerGroups.get(capturePaths); let observerGroup = leaf.observerGroups.get(capturePaths);
if (!observerGroup) { if (!observerGroup) {
const cachedCaptures = new Bag<Ref, Array<AnyValue>>(); const cachedCaptures = new Bag<Ref, Array<AnyValue>>();
leaf.cachedAssertions.forEach((a) => leaf.cachedAssertions.forEach((a) => {
cachedCaptures._items.update(projectPaths(a, capturePaths), n => n! + 1, 0)); const vs = projectPaths(a, capturePaths);
if (vs !== void 0) cachedCaptures._items.update(vs, n => n! + 1, 0);
});
observerGroup = new ObserverGroup(cachedCaptures); observerGroup = new ObserverGroup(cachedCaptures);
leaf.observerGroups.set(capturePaths, observerGroup); leaf.observerGroups.set(capturePaths, observerGroup);
} }
@ -65,9 +69,9 @@ export class Index<T> {
} }
removeObserver(pattern: P.Pattern, observer: IndexObserver<T>, parameter: T) { removeObserver(pattern: P.Pattern, observer: IndexObserver<T>, parameter: T) {
let {constPaths, constValues, capturePaths} = analysePattern(pattern); let {constPositions, constValues, capturePaths} = analysePattern(pattern);
const continuation = this.root.extend(pattern); const continuation = this.root.extend(pattern);
let constValMap = continuation.leafMap.get(constPaths); let constValMap = continuation.leafMap.get(constPositions);
if (!constValMap) return; if (!constValMap) return;
let leaf = constValMap.get(constValues); let leaf = constValMap.get(constValues);
if (!leaf) return; if (!leaf) return;
@ -82,7 +86,7 @@ export class Index<T> {
constValMap.delete(constValues); constValMap.delete(constValues);
} }
if (constValMap.size === 0) { if (constValMap.size === 0) {
continuation.leafMap.delete(constPaths); continuation.leafMap.delete(constPositions);
} }
} }
@ -156,7 +160,7 @@ type Selector = [number, AnyValue];
class Node<T> { class Node<T> {
readonly continuation: Continuation<T>; readonly continuation: Continuation<T>;
readonly edges: KeyedDictionary<Selector, { [shape: string]: Node<T> }, Ref> = new KeyedDictionary(); readonly edges: KeyedDictionary<Ref, Selector, { [shape: Shape]: Node<T> }> = new KeyedDictionary();
constructor(continuation: Continuation<T>) { constructor(continuation: Continuation<T>) {
this.continuation = continuation; this.continuation = continuation;
@ -168,19 +172,19 @@ class Node<T> {
function walkNode(node: Node<T>, popCount: number, stepIndex: AnyValue, p: P.Pattern): [number, Node<T>] function walkNode(node: Node<T>, popCount: number, stepIndex: AnyValue, p: P.Pattern): [number, Node<T>]
{ {
switch (p._variant) { switch (p._variant) {
case 'DDiscard': case 'discard':
case 'DLit': case 'lit':
return [popCount, node]; return [popCount, node];
case 'DBind': case 'bind':
return walkNode(node, popCount, stepIndex, p.value.pattern); return walkNode(node, popCount, stepIndex, p.pattern);
case 'DCompound': { case 'group': {
const selector: Selector = [popCount, stepIndex]; const selector: Selector = [popCount, stepIndex];
let table = node.edges.get(selector); let table = node.edges.get(selector);
if (!table) { if (!table) {
table = {}; table = {};
node.edges.set(selector, table); node.edges.set(selector, table);
} }
let cls = classOfCtor(p.value); let cls = classOfCtor(p.type);
let nextNode = table[cls]; let nextNode = table[cls];
if (!nextNode) { if (!nextNode) {
nextNode = new Node(new Continuation( nextNode = new Node(new Continuation(
@ -189,16 +193,11 @@ class Node<T> {
table[cls] = nextNode; table[cls] = nextNode;
} }
popCount = 0; popCount = 0;
function walkKey(pp: P.Pattern, stepIndex: AnyValue) { p.entries.forEach((pp, stepIndex) => {
path.push(stepIndex); path.push(stepIndex);
[popCount, nextNode] = walkNode(nextNode, popCount, stepIndex, pp); [popCount, nextNode] = walkNode(nextNode, popCount, stepIndex, pp);
path.pop(); path.pop();
} });
switch (p.value._variant) {
case 'rec': p.value.fields.forEach(walkKey); break;
case 'arr': p.value.items.forEach(walkKey); break;
case 'dict': p.value.entries.forEach(walkKey); break;
}
return [popCount + 1, nextNode]; return [popCount + 1, nextNode];
} }
} }
@ -226,8 +225,10 @@ class Node<T> {
function walkContinuation(continuation: Continuation<T>) { function walkContinuation(continuation: Continuation<T>) {
m_cont(continuation, outerValue); m_cont(continuation, outerValue);
continuation.leafMap.forEach((constValMap, constPaths) => { continuation.leafMap.forEach((constValMap, constPositions) => {
let constValues = projectPaths(outerValue, constPaths); if (projectPaths(outerValue, constPositions.requiredToExist) === void 0) return;
let constValues = projectPaths(outerValue, constPositions.withValues);
if (constValues === void 0) return;
let leaf = constValMap.get(constValues); let leaf = constValMap.get(constValues);
if (!leaf && operation === EventType.ADDED) { if (!leaf && operation === EventType.ADDED) {
leaf = new Leaf(); leaf = new Leaf();
@ -236,12 +237,13 @@ class Node<T> {
if (leaf) { if (leaf) {
m_leaf(leaf, outerValue); m_leaf(leaf, outerValue);
leaf.observerGroups.forEach((observerGroup, capturePaths) => { leaf.observerGroups.forEach((observerGroup, capturePaths) => {
m_observerGroup(observerGroup, projectPaths(outerValue, capturePaths)); const vs = projectPaths(outerValue, capturePaths);
if (vs !== void 0) m_observerGroup(observerGroup, vs);
}); });
if (operation === EventType.REMOVED && leaf.isEmpty()) { if (operation === EventType.REMOVED && leaf.isEmpty()) {
constValMap.delete(constValues); constValMap.delete(constValues);
if (constValMap.size === 0) { if (constValMap.size === 0) {
continuation.leafMap.delete(constPaths); continuation.leafMap.delete(constPositions);
} }
} }
} }
@ -267,7 +269,7 @@ class Node<T> {
class Continuation<T> { class Continuation<T> {
readonly cachedAssertions: Set<Ref>; readonly cachedAssertions: Set<Ref>;
readonly leafMap: KeyedDictionary<Array<Path>, Dictionary<Ref, Leaf<T>>, Ref> = new KeyedDictionary(); readonly leafMap: KeyedDictionary<Ref, ConstantPositions, KeyedDictionary<Ref, Assertion, Leaf<T>>> = new KeyedDictionary();
constructor(cachedAssertions: Set<Ref>) { constructor(cachedAssertions: Set<Ref>) {
this.cachedAssertions = cachedAssertions; this.cachedAssertions = cachedAssertions;
@ -286,7 +288,7 @@ class Continuation<T> {
class Leaf<T> { class Leaf<T> {
readonly cachedAssertions: Set<Ref> = new Set(); readonly cachedAssertions: Set<Ref> = new Set();
readonly observerGroups: KeyedDictionary<Array<Path>, ObserverGroup<T>, Ref> = new KeyedDictionary(); readonly observerGroups: KeyedDictionary<Ref, Array<Path>, ObserverGroup<T>> = new KeyedDictionary();
isEmpty(): boolean { isEmpty(): boolean {
return this.cachedAssertions.size === 0 && this.observerGroups.size === 0; return this.cachedAssertions.size === 0 && this.observerGroups.size === 0;
@ -320,15 +322,21 @@ class ObserverGroup<T> {
} }
} }
// Total by assumption that path is valid for v function projectPath(v: AnyValue, path: Path): AnyValue | undefined {
function projectPath(v: AnyValue, path: Path): AnyValue {
for (let index of path) { for (let index of path) {
v = step(v, index)!; const next = step(v, index);
if (next === void 0) return void 0;
v = next;
} }
return v; return v;
} }
// Total by assumption that paths are valid for v function projectPaths(v: AnyValue, paths: Array<Path>): AnyValue[] | undefined {
function projectPaths(v: AnyValue, paths: Array<Path>): AnyValue[] { const result = [];
return paths.map((path) => projectPath(v, path)); for (const path of paths) {
const w = projectPath(v, path);
if (w === void 0) return void 0;
result.push(w);
}
return result;
} }

View File

@ -18,6 +18,7 @@ export const newKey: () => Promise<Bytes> =
const HMAC_BLAKE2s = makeHMAC(BLAKE2s); const HMAC_BLAKE2s = makeHMAC(BLAKE2s);
export async function mac(secretKey: Bytes, data: Bytes): Promise<Bytes> { export function mac(secretKey: Bytes, data: Bytes): Bytes {
return Bytes.from(HMAC_BLAKE2s(underlying(secretKey), underlying(data))); return Bytes.from(HMAC_BLAKE2s(underlying(secretKey), underlying(data))
.subarray(0, KEY_LENGTH));
} }

View File

@ -2,7 +2,7 @@
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Actor, Ref, Handle, Assertion, Entity, Turn } from '../runtime/actor.js'; import { Actor, Ref, Handle, Assertion, Entity, Turn } from '../runtime/actor.js';
import { Value, Embedded, mapEmbeddeds, IdentityMap, Dictionary, stringify } from '@preserves/core'; import { Value, Embedded, mapEmbeddeds, IdentityMap, KeyedDictionary, stringify } from '@preserves/core';
import * as IO from '../gen/protocol.js'; import * as IO from '../gen/protocol.js';
import { fromCaveat, WireRef } from '../gen/sturdy.js'; import { fromCaveat, WireRef } from '../gen/sturdy.js';
import { attenuate } from '../runtime/rewrite.js'; import { attenuate } from '../runtime/rewrite.js';
@ -55,10 +55,9 @@ export class Membrane {
} }
} }
export const INERT_REF: Ref = { export const INERT_REF = new Ref(
relay: Actor.boot(() => Turn.active.stop(Turn.activeFacet)).root, Actor.boot(() => Turn.active.stop(Turn.activeFacet)).root,
target: {}, {});
};
export interface ProxyInbound { export interface ProxyInbound {
proxyPacket(packet: IO.Packet<Embedded<WireRef>>): void; proxyPacket(packet: IO.Packet<Embedded<WireRef>>): void;
@ -164,10 +163,10 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
if (n.attenuation.length === 0) { if (n.attenuation.length === 0) {
return r; return r;
} else { } else {
type AttenuatedRef = Ref & { __attenuations?: Dictionary<any, Ref> }; type AttenuatedRef = Ref & { __attenuations?: KeyedDictionary<Ref, Assertion, any> };
const ar = r as AttenuatedRef; const ar = r as AttenuatedRef;
if (ar.__attenuations === void 0) { if (ar.__attenuations === void 0) {
ar.__attenuations = new Dictionary(); ar.__attenuations = new KeyedDictionary();
} }
return ar.__attenuations.getOrSet(n.attenuation.map(fromCaveat), () => return ar.__attenuations.getOrSet(n.attenuation.map(fromCaveat), () =>
attenuate(r, ... n.attenuation)); attenuate(r, ... n.attenuation));

View File

@ -10,8 +10,9 @@
// California: Internet Society, 2014. // California: Internet Society, 2014.
import { mac } from './cryptography.js'; import { mac } from './cryptography.js';
import { Bytes, decode, encode, is, neverEmbeddedType, Value } from '@preserves/core'; import { Bytes, decode, encode, is, neverEmbeddedType, Value, fromJS } from '@preserves/core';
import * as S from '../gen/sturdy.js'; import * as S from '../gen/sturdy.js';
import * as G from '../gen/gatekeeper.js';
export * from '../gen/sturdy.js'; export * from '../gen/sturdy.js';
export type SturdyValue = Value<S._embedded>; export type SturdyValue = Value<S._embedded>;
@ -37,16 +38,42 @@ export function sturdyDecode(bs: Bytes): SturdyValue {
}); });
} }
export async function mint(oid: SturdyValue, secretKey: Bytes): Promise<S.SturdyRef> { export function sturdyBind(
return S.SturdyRef(S.Parameters({ oid: SturdyValue,
oid, secretKey: Bytes,
sig: await mac(secretKey, sturdyEncode(oid)), target: S._embedded,
caveats: S.CaveatsField.absent(), observer?: S._embedded,
})); ): G.Bind {
return G.Bind({
description: G.Description({
stepType: fromJS(S.SturdyStepType()) as symbol,
detail: fromJS(S.SturdyDescriptionDetail({ oid, key: secretKey })),
}),
target,
observer: (observer === void 0) ? G.BindObserver.absent() : G.BindObserver.present(observer),
});
} }
async function chainMac(key: Bytes | Promise<Bytes>, caveats: S.Caveat[]): Promise<Bytes> { type RefAndBind = { ref: S.SturdyRef, bind: G.Bind };
return caveats.reduce(async (key, c) => mac(await key, sturdyEncode(S.fromCaveat(c))), key); export function mint(oid: SturdyValue, secretKey: Bytes): S.SturdyRef;
export function mint(oid: SturdyValue, secretKey: Bytes, target: S._embedded, observer?: S._embedded): RefAndBind;
export function mint(
oid: SturdyValue,
secretKey: Bytes,
target?: S._embedded,
observer?: S._embedded,
): S.SturdyRef | RefAndBind {
const ref = S.SturdyRef(S.Parameters({
oid,
sig: mac(secretKey, sturdyEncode(oid)),
caveats: S.CaveatsField.absent(),
}));
if (target === void 0) return ref;
return { ref, bind: sturdyBind(oid, secretKey, target, observer) };
}
function chainMac(key: Bytes, caveats: S.Caveat[]): Bytes {
return caveats.reduce((key, c) => mac(key, sturdyEncode(S.fromCaveat(c))), key);
} }
export function caveatChain(r: S.SturdyRef): S.Caveat[] { export function caveatChain(r: S.SturdyRef): S.Caveat[] {
@ -57,16 +84,16 @@ export function caveatChain(r: S.SturdyRef): S.Caveat[] {
} }
} }
export async function attenuate(r: S.SturdyRef, ... a: S.Caveat[]): Promise<S.SturdyRef> { export function attenuate(r: S.SturdyRef, ... a: S.Caveat[]): S.SturdyRef {
if (a.length === 0) return r; if (a.length === 0) return r;
return S.SturdyRef(S.Parameters({ return S.SturdyRef(S.Parameters({
oid: r.parameters.oid, oid: r.parameters.oid,
caveats: S.CaveatsField.present([... caveatChain(r), ... a]), caveats: S.CaveatsField.present([... caveatChain(r), ... a]),
sig: await chainMac(r.parameters.sig, a), sig: chainMac(r.parameters.sig, a),
})); }));
} }
export async function validate(r: S.SturdyRef, secretKey: Bytes): Promise<boolean> { export function validate(r: S.SturdyRef, secretKey: Bytes): boolean {
const sig = await chainMac(await mac(secretKey, sturdyEncode(r.parameters.oid)), caveatChain(r)); const sig = chainMac(mac(secretKey, sturdyEncode(r.parameters.oid)), caveatChain(r));
return is(sig, r.parameters.sig); return is(sig, r.parameters.sig);
} }

View File

@ -1,12 +1,12 @@
/// SPDX-License-Identifier: GPL-3.0-or-later /// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com> /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { KeyedSet } from '@preserves/core'; import { GenericEmbedded, KeyedSet } from '@preserves/core';
import { Bag, ChangeDescription } from '../src/runtime/bag'; import { Bag, ChangeDescription } from '../src/runtime/bag';
describe('bag', () => { describe('bag', () => {
it('should be initializable from a set', () => { it('should be initializable from a set', () => {
const b = new Bag(new KeyedSet<string>(['a', 'b', 'c'])); const b = new Bag(new KeyedSet<GenericEmbedded, string>(['a', 'b', 'c']));
expect(b.size).toBe(3); expect(b.size).toBe(3);
expect(b.get('a')).toBe(1); expect(b.get('a')).toBe(1);
expect(b.get('z')).toBe(0); expect(b.get('z')).toBe(0);
@ -28,7 +28,7 @@ describe('bag', () => {
}); });
it('should count down', () => { it('should count down', () => {
const b = new Bag(new KeyedSet<string>(['a'])); const b = new Bag(new KeyedSet<GenericEmbedded, string>(['a']));
expect(b.change('a', 1)).toBe(ChangeDescription.PRESENT_TO_PRESENT); expect(b.change('a', 1)).toBe(ChangeDescription.PRESENT_TO_PRESENT);
expect(b.change('a', -1)).toBe(ChangeDescription.PRESENT_TO_PRESENT); expect(b.change('a', -1)).toBe(ChangeDescription.PRESENT_TO_PRESENT);
expect(b.size).toBe(1); expect(b.size).toBe(1);

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/create", "name": "@syndicate-lang/create",
"version": "0.23.1", "version": "0.25.1",
"description": "Create a new Syndicate/js package", "description": "Create a new Syndicate/js package",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/create", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/create",

View File

@ -3,7 +3,7 @@
"version": "0.0.0", "version": "0.0.0",
"license": "GPL-3.0+", "license": "GPL-3.0+",
"devDependencies": { "devDependencies": {
"@preserves/schema-cli": "0.995.100", "@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "*", "@syndicate-lang/ts-plugin": "*",
"@syndicate-lang/tsc": "*", "@syndicate-lang/tsc": "*",
"rollup": "^2.60", "rollup": "^2.60",
@ -12,7 +12,7 @@
"typescript-language-server": "^3.0" "typescript-language-server": "^3.0"
}, },
"dependencies": { "dependencies": {
"@preserves/core": "0.995.100", "@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*", "@syndicate-lang/core": "*",
"@syndicate-lang/html2": "*", "@syndicate-lang/html2": "*",
"@syndicate-lang/ws-relay": "*" "@syndicate-lang/ws-relay": "*"

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/fs", "name": "@syndicate-lang/fs",
"version": "0.29.3", "version": "0.35.1",
"description": "Reflect contents of a portion of the file system as assertions", "description": "Reflect contents of a portion of the file system as assertions",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/fs", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/fs",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -27,16 +27,16 @@
"syndicate-fs": "./bin/syndicate-fs.js" "syndicate-fs": "./bin/syndicate-fs.js"
}, },
"peerDependencies": { "peerDependencies": {
"@preserves/core": "0.995.100" "@preserves/core": "^0.995.200"
}, },
"dependencies": { "dependencies": {
"@syndicate-lang/core": "^0.28.2", "@syndicate-lang/core": "^0.34.1",
"@syndicate-lang/service": "^0.29.3", "@syndicate-lang/service": "^0.35.1",
"chokidar": "^3.5.3" "chokidar": "^3.5.3"
}, },
"devDependencies": { "devDependencies": {
"@preserves/schema-cli": "0.995.100", "@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "^0.30.0", "@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.30.0" "@syndicate-lang/tsc": "^0.36.1"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/html", "name": "@syndicate-lang/html",
"version": "0.29.3", "version": "0.35.1",
"description": "DOM/HTML UI for Syndicate/JS", "description": "DOM/HTML UI for Syndicate/JS",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -25,10 +25,10 @@
"veryclean": "yarn run clean && rm -rf node_modules" "veryclean": "yarn run clean && rm -rf node_modules"
}, },
"dependencies": { "dependencies": {
"@syndicate-lang/core": "^0.28.2" "@syndicate-lang/core": "^0.34.1"
}, },
"devDependencies": { "devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0", "@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.30.0" "@syndicate-lang/tsc": "^0.36.1"
} }
} }

View File

@ -11,7 +11,7 @@ export type UIFragmentRecord = ReturnType<typeof P.UIFragment>;
import { HtmlFragments } from "./html"; import { HtmlFragments } from "./html";
export * from "./html"; export * from "./html";
export function boot(ds = Dataspace.global) { export function boot(ds = Dataspace.local) {
spawnGlobalEventFactory(ds); spawnGlobalEventFactory(ds);
spawnWindowEventFactory(ds); spawnWindowEventFactory(ds);
spawnUIFragmentFactory(ds); spawnUIFragmentFactory(ds);

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/html2", "name": "@syndicate-lang/html2",
"version": "0.29.3", "version": "0.35.1",
"description": "DOM/HTML UI for Syndicate/JS", "description": "DOM/HTML UI for Syndicate/JS",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html2", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html2",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -25,10 +25,10 @@
"veryclean": "yarn run clean && rm -rf node_modules" "veryclean": "yarn run clean && rm -rf node_modules"
}, },
"dependencies": { "dependencies": {
"@syndicate-lang/core": "^0.28.2" "@syndicate-lang/core": "^0.34.1"
}, },
"devDependencies": { "devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0", "@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.30.0" "@syndicate-lang/tsc": "^0.36.1"
} }
} }

View File

@ -70,7 +70,22 @@ function nodeInserter(n: number): PlaceholderAction {
switch (typeof f) { switch (typeof f) {
case 'string': newNode = document.createTextNode(f); break; case 'string': newNode = document.createTextNode(f); break;
case 'number': newNode = document.createTextNode('' + f); break; case 'number': newNode = document.createTextNode('' + f); break;
default: newNode = f; break; case 'object':
if (f !== null && 'nodeType' in f) {
newNode = f;
break;
}
/* fall through */
default: {
let info;
try {
info = '' + f;
} catch (_e) {
info = (f as any).toString();
}
newNode = document.createTextNode(`<ERROR: invalid HtmlFragment: ${info}>`);
break;
}
} }
node.parentNode?.insertBefore(newNode, node); node.parentNode?.insertBefore(newNode, node);
} }

View File

@ -8,7 +8,7 @@ export { HtmlTemplater, template, HtmlFragment } from "./html";
export assertion type LocationHash(hash: string); export assertion type LocationHash(hash: string);
export type LocationHash = ReturnType<typeof LocationHash>; export type LocationHash = ReturnType<typeof LocationHash>;
export function boot(ds = Dataspace.global) { export function boot(ds = Dataspace.local) {
spawnLocationHashTracker(ds); spawnLocationHashTracker(ds);
} }
@ -22,14 +22,28 @@ export type NodeGenerator = (t: HtmlTemplater) => ReturnType<HtmlTemplater>;
export class Widget implements EventTarget { export class Widget implements EventTarget {
readonly facet: Facet; readonly facet: Facet;
private _node: ChildNode | null = null; private _node: ChildNode | null = null;
parentField: Dataflow.Field<ParentNode | null>;
callbacks = new Map<string, Map<EventListenerOrEventListenerObject, Wrapped>>(); callbacks = new Map<string, Map<EventListenerOrEventListenerObject, Wrapped>>();
get node(): ChildNode { get node(): ChildNode {
return this._node!; return this._node!;
} }
constructor (private nodeGenerator: NodeGenerator) { constructor (node: ChildNode);
constructor (nodeGenerator: NodeGenerator);
constructor (template: string | HTMLTemplateElement, data: object);
constructor (arg0: ChildNode | NodeGenerator | string | HTMLTemplateElement, data?: object) {
let nodeGenerator: NodeGenerator;
if (data === void 0) {
if (typeof arg0 === 'function') {
nodeGenerator = arg0 as NodeGenerator;
} else {
nodeGenerator = () => [arg0 as ChildNode];
}
} else {
nodeGenerator = templateGenerator(arg0 as (string | HTMLTemplateElement), data);
}
this.facet = Turn.activeFacet; this.facet = Turn.activeFacet;
const cancelAtExit = this.facet.actor.atExit(() => this.node.remove()); const cancelAtExit = this.facet.actor.atExit(() => this.node.remove());
@ -40,7 +54,7 @@ export class Widget implements EventTarget {
const thisTemplate = template(); const thisTemplate = template();
dataflow { dataflow {
const nodes = this.nodeGenerator(thisTemplate); const nodes = nodeGenerator(thisTemplate);
if (nodes.length !== 1) { if (nodes.length !== 1) {
throw new Error(`@syndicate-lang/html2: Expected exactly one node from template`); throw new Error(`@syndicate-lang/html2: Expected exactly one node from template`);
} }
@ -50,24 +64,18 @@ export class Widget implements EventTarget {
throw new Error(`@syndicate-lang/html2: Node generator is not stable`); throw new Error(`@syndicate-lang/html2: Node generator is not stable`);
} }
} }
}
field parentField: ParentNode | null = this._node?.parentNode ?? null; get _nodeAsParent(): ParentNode | null {
this.parentField = parentField; if (this._node && 'querySelector' in this._node) {
return this._node as unknown as ParentNode;
dataflow { } else {
const p = this.parentField.value; return null;
if (this.node.parentNode !== p) {
if (p === null) {
this.node.remove();
} else {
p.appendChild(this.node);
}
}
} }
} }
get parent(): ParentNode | null { get parent(): ParentNode | null {
return this.parentField.value; return this.node.parentNode;
} }
set parent(p: string | ParentNode | null) { set parent(p: string | ParentNode | null) {
@ -78,10 +86,34 @@ export class Widget implements EventTarget {
if (typeof p === 'string') { if (typeof p === 'string') {
p = wrt.querySelector(p); p = wrt.querySelector(p);
} }
this.parentField.value = p;
if (this.node.parentNode !== p) {
if (p === null) {
this.node.remove();
} else {
p.appendChild(this.node);
}
}
return this; return this;
} }
querySelector(selector: string): Widget | null;
querySelector<T extends Widget>(selector: string, ctor: { new(e: Element): T }): T | null;
querySelector<T extends Widget>(selector: string, ctor?: { new(e: Element): T }): Widget | null {
const e = this._nodeAsParent?.querySelector(selector);
return e ? new (ctor ?? Widget)(e) : null;
}
querySelectorAll(selector: string): Widget[];
querySelectorAll<T extends Widget>(selector: string, ctor: { new(e: Element): T }): T[];
querySelectorAll<T extends Widget>(selector: string, ctor?: { new(e: Element): T }): Widget[] {
const es = this._nodeAsParent?.querySelectorAll(selector);
const ws: Widget[] = [];
if (es) es.forEach(e => ws.push(new (ctor ?? Widget)(e)));
return ws;
}
on(type: string, callback: EventListenerOrEventListenerObject): this { on(type: string, callback: EventListenerOrEventListenerObject): this {
this.addEventListener(type, callback); this.addEventListener(type, callback);
return this; return this;
@ -151,8 +183,11 @@ export class ValueWidget extends Widget {
_value: Dataflow.Field<string>; _value: Dataflow.Field<string>;
_valueAsNumber: Dataflow.Field<number>; _valueAsNumber: Dataflow.Field<number>;
constructor (nodeGenerator: NodeGenerator, triggerEvent: 'change' | 'input' = 'change') { constructor (nodeGenerator: NodeGenerator, triggerEvent?: 'change' | 'input');
super(nodeGenerator); constructor (template: string | HTMLTemplateElement, data: object, triggerEvent?: 'change' | 'input');
constructor (arg0: NodeGenerator | string | HTMLTemplateElement, arg1?: object | 'change' | 'input', arg2?: 'change' | 'input') {
super(arg0 as any, arg1 as any);
const triggerEvent = typeof arg1 === 'string' ? arg1 : typeof arg2 === 'string' ? arg2 : 'change';
field value: string = ''; field value: string = '';
this._value = value; this._value = value;
@ -161,20 +196,21 @@ export class ValueWidget extends Widget {
this._valueAsNumber = valueAsNumber; this._valueAsNumber = valueAsNumber;
if ('value' in this.node) { if ('value' in this.node) {
const readValues = (n: any) => { this.on(triggerEvent, () => this.readValues());
this.suppressCycleWarning(); this.readValues();
this._value.value = n?.value ?? '';
this._valueAsNumber.value = n?.valueAsNumber ?? NaN;
};
this.on(triggerEvent, e => readValues(e.target));
readValues(this.node);
dataflow { this.valueAsNumber = this._valueAsNumber.value; } dataflow { this.valueAsNumber = this._valueAsNumber.value; }
dataflow { this.value = this._value.value; } dataflow { this.value = this._value.value; }
} }
} }
readValues() {
const n = this.node as any;
this.suppressCycleWarning();
this._value.value = n.value ?? '';
this._valueAsNumber.value = n.valueAsNumber ?? NaN;
}
get value(): string { get value(): string {
return this._value.value; return this._value.value;
} }
@ -205,7 +241,7 @@ function spawnLocationHashTracker(ds: Ref) {
field hashValue: string = '/'; field hashValue: string = '/';
const loadHash = () => { const loadHash = () => {
var h = window.location.hash; var h = decodeURIComponent(window.location.hash);
if (h.length && h[0] === '#') { if (h.length && h[0] === '#') {
h = h.slice(1); h = h.slice(1);
} }
@ -226,3 +262,17 @@ function spawnLocationHashTracker(ds: Ref) {
} }
} }
} }
export function templateGenerator(
template0: string | HTMLTemplateElement,
data: object,
): NodeGenerator {
const template = typeof template0 === 'string' ? document.querySelector(template0) : template0;
if (template === null) throw new Error('Cannot find template: ' + template0);
const body = `return t => t\`${template.innerHTML.trim().split('`').join('\\`')}\``;
const kvs = Object.entries(data);
const keys = kvs.map(e => e[0]);
const values = kvs.map(e => e[1]);
const factory = new Function(... keys, body);
return factory(... values);
}

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/loader", "name": "@syndicate-lang/loader",
"version": "0.29.0", "version": "0.35.1",
"description": "Syndicate/JS node.js loader hook", "description": "Syndicate/JS node.js loader hook",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/loader", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/loader",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -22,8 +22,8 @@
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": { "dependencies": {
"@syndicate-lang/compiler": "^0.21.0", "@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.28.2", "@syndicate-lang/core": "^0.34.1",
"@syndicate-lang/service": "^0.29.3" "@syndicate-lang/service": "^0.35.1"
} }
} }

View File

@ -7,7 +7,7 @@ import Pos = Syntax.Pos;
import * as Syndicate from '@syndicate-lang/core'; import * as Syndicate from '@syndicate-lang/core';
Object.defineProperty(globalThis, 'currentSyndicateTarget', { Object.defineProperty(globalThis, 'currentSyndicateTarget', {
value: Syndicate.Dataspace.global, value: Syndicate.Dataspace.local,
writable: false, writable: false,
}); });

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/service", "name": "@syndicate-lang/service",
"version": "0.29.3", "version": "0.35.1",
"description": "Run a node.js program as a service within syndicate-server", "description": "Run a node.js program as a service within syndicate-server",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/service", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/service",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -22,10 +22,10 @@
"veryclean": "yarn run clean && rm -rf node_modules" "veryclean": "yarn run clean && rm -rf node_modules"
}, },
"dependencies": { "dependencies": {
"@syndicate-lang/core": "^0.28.2" "@syndicate-lang/core": "^0.34.1"
}, },
"devDependencies": { "devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0", "@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.30.0" "@syndicate-lang/tsc": "^0.36.1"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/syndicatec", "name": "@syndicate-lang/syndicatec",
"version": "0.30.0", "version": "0.36.1",
"description": "Syndicate/JS compiler command-line tool", "description": "Syndicate/JS compiler command-line tool",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/syndicatec", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/syndicatec",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -20,8 +20,8 @@
}, },
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": { "dependencies": {
"@syndicate-lang/compiler": "^0.21.0", "@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.28.2", "@syndicate-lang/core": "^0.34.1",
"glob": "^7.1.6", "glob": "^7.1.6",
"yargs": "^16.2.0" "yargs": "^16.2.0"
}, },

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/timer", "name": "@syndicate-lang/timer",
"version": "0.29.3", "version": "0.35.1",
"description": "Time and timer driver for Syndicate", "description": "Time and timer driver for Syndicate",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/timer", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/timer",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -25,10 +25,10 @@
"veryclean": "yarn run clean && rm -rf node_modules" "veryclean": "yarn run clean && rm -rf node_modules"
}, },
"dependencies": { "dependencies": {
"@syndicate-lang/core": "^0.28.2" "@syndicate-lang/core": "^0.34.1"
}, },
"devDependencies": { "devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0", "@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.30.0" "@syndicate-lang/tsc": "^0.36.1"
} }
} }

View File

@ -20,7 +20,7 @@ export function sleep(ds: Ref, seconds: number, cb: () => void): void {
} }
} }
export function boot(ds = Dataspace.global) { export function boot(ds = Dataspace.local) {
spawn named 'timer/PeriodicTick' { spawn named 'timer/PeriodicTick' {
at ds { at ds {
during Observe({ during Observe({

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/ts-plugin", "name": "@syndicate-lang/ts-plugin",
"version": "0.30.0", "version": "0.36.1",
"description": "Syndicate/JS TypeScript tsserver plugin", "description": "Syndicate/JS TypeScript tsserver plugin",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/ts-plugin", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/ts-plugin",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -22,8 +22,8 @@
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": { "dependencies": {
"@syndicate-lang/compiler": "^0.21.0", "@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.28.2" "@syndicate-lang/core": "^0.34.1"
}, },
"devDependencies": { "devDependencies": {
"typescript": "^4.9" "typescript": "^4.9"

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/tsc", "name": "@syndicate-lang/tsc",
"version": "0.30.0", "version": "0.36.1",
"description": "Syndicate for TypeScript compiler command-line tool", "description": "Syndicate for TypeScript compiler command-line tool",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/tsc", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/tsc",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -20,8 +20,8 @@
}, },
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": { "dependencies": {
"@syndicate-lang/compiler": "^0.21.0", "@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.28.2", "@syndicate-lang/core": "^0.34.1",
"glob": "^7.1.6", "glob": "^7.1.6",
"yargs": "^16.2.0" "yargs": "^16.2.0"
}, },

View File

@ -1,6 +1,6 @@
{ {
"name": "@syndicate-lang/ws-relay", "name": "@syndicate-lang/ws-relay",
"version": "0.30.3", "version": "0.36.1",
"description": "Browser WebSocket relay to a Syndicate server", "description": "Browser WebSocket relay to a Syndicate server",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/ws-relay", "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/ws-relay",
"license": "GPL-3.0+", "license": "GPL-3.0+",
@ -25,14 +25,14 @@
"types": "lib/index.d.ts", "types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>", "author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"peerDependencies": { "peerDependencies": {
"@preserves/core": "0.995.100" "@preserves/core": "^0.995.200"
}, },
"dependencies": { "dependencies": {
"@syndicate-lang/core": "^0.28.2", "@syndicate-lang/core": "^0.34.1",
"salty-crypto": "0.3" "salty-crypto": "0.3"
}, },
"devDependencies": { "devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0", "@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.30.0" "@syndicate-lang/tsc": "^0.36.1"
} }
} }

View File

@ -20,6 +20,7 @@ import {
decode, decode,
fromJS, fromJS,
isEmbedded, isEmbedded,
parse,
stringify, stringify,
underlying, underlying,
Embeddable, Embeddable,
@ -38,7 +39,7 @@ type TransportState = {
peer: Ref, peer: Ref,
}; };
export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketConstructor?: typeof WebSocket) { export function boot(ds = Dataspace.local, debug: boolean = false, WebSocketConstructor?: typeof WebSocket) {
spawn named 'transportConnector' { spawn named 'transportConnector' {
at ds { at ds {
during Observe({ "pattern": :pattern G.TransportConnection({ during Observe({ "pattern": :pattern G.TransportConnection({
@ -231,33 +232,90 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
if (!origin0 || !isEmbedded(origin0)) return; if (!origin0 || !isEmbedded(origin0)) return;
const origin = origin0; const origin = origin0;
const spec = Q.drop_lit(detailPatValue, N.toNoisePathStepDetail); const spec0 = Q.drop_lit(detailPatValue, N.toNoisePathStepDetail);
if (!spec) return; if (!spec0) return;
const spec = spec0;
const algorithms = SaltyCrypto.Noise_25519_ChaChaPoly_BLAKE2s; const algorithms = SaltyCrypto.Noise_25519_ChaChaPoly_BLAKE2s;
const protocol = const protocol =
spec.protocol._variant === "present" ? spec.protocol.protocol : spec.protocol._variant === "present" ? spec.protocol.protocol :
spec.protocol._variant === "absent" ? N.fromDefaultProtocol(N.DefaultProtocol()) as string : spec.protocol._variant === "absent" ? N.fromDefaultProtocol(N.DefaultProtocol()) as string :
(() => { throw new Error("Invalid noise protocol name"); })(); (() => { throw new Error("Invalid noise protocol name"); })();
const patternName = SaltyCrypto.matchPattern(algorithms, protocol);
if (patternName === null) throw new Error("Unsupported protocol " + protocol); const patternName0 = SaltyCrypto.matchPattern(algorithms, protocol);
if (patternName0 === null) throw new Error("Unsupported protocol " + protocol);
const patternName = patternName0;
const preSharedKeys = const preSharedKeys =
spec.preSharedKeys._variant === "present" ? spec.preSharedKeys.preSharedKeys : spec.preSharedKeys._variant === "present" ? spec.preSharedKeys.preSharedKeys :
spec.preSharedKeys._variant === "absent" ? [] : spec.preSharedKeys._variant === "absent" ? [] :
(() => { throw new Error("Invalid pre-shared keys"); })(); (() => { throw new Error("Invalid pre-shared keys"); })();
const prologue = underlying(canonicalEncode(spec.service)); const prologue = underlying(canonicalEncode(spec.service));
let H: SaltyCrypto.Handshake | null = null; react {
let transportState: SaltyCrypto.TransportState | null = null; at origin {
let responderSession: Ref | null = null; assert G.Resolve({
let relay: Relay.Relay | null = null; "step": G.Step({
"stepType": N.$noise,
function maybeTransition(s: SaltyCrypto.TransportState | null) { "detail": fromJS(N.ServiceSelector(spec.service)),
if (transportState !== null) { }),
throw new Error("Unexpected double-transition to transport state"); "observer": create assertionFacetObserver(e => {
const response = G.toResolved(e);
if (!response) return;
switch (response._variant) {
case "accepted":
runSession(response.responderSession);
break;
case "Rejected":
stop {
at ds {
assert G.ResolvedPathStep<Ref>({
"origin": origin,
"pathStep": G.PathStep({
"stepType": N.$noise,
"detail": fromJS(N.NoisePathStepDetail(spec)),
}),
"resolved": response,
});
}
}
}
}),
});
} }
transportState = s; }
if (transportState !== null) {
function runSession(responderSession: Ref) {
const H = new SaltyCrypto.Handshake(
algorithms,
patternName,
'initiator',
{
prologue,
remoteStaticPublicKey: underlying(spec.key),
preSharedKeys: preSharedKeys.map(underlying),
});
let transportState: SaltyCrypto.TransportState | null = null;
let relay: Relay.Relay | null = null;
const { packet, finished } = H.writeMessage(new Uint8Array());
at responderSession {
assert N.Initiator(create ({ message: handlePacket }));
send message Bytes.from(packet);
}
maybeTransition(finished);
function maybeTransition(s: SaltyCrypto.TransportState | null) {
if (transportState !== null) {
throw new Error("Unexpected double-transition to transport state");
}
transportState = s;
if (transportState !== null) {
actuallyTransition();
}
}
function actuallyTransition() {
const noiseSessionFacet = Turn.activeFacet; const noiseSessionFacet = Turn.activeFacet;
const peer = new Relay.Relay({ const peer = new Relay.Relay({
debug, debug,
@ -282,74 +340,25 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
"resolved": G.Resolved.accepted(peer), "resolved": G.Resolved.accepted(peer),
}); });
} }
}
react { function handlePacket(body: Assertion) {
at origin { const p = N.asPacket(body);
assert G.Resolve({ if (transportState) {
"step": G.Step({ const packet = transportState.recv.decrypt_large(
"stepType": N.$noise, p._variant === 'complete'
"detail": fromJS(N.ServiceSelector(spec.service)), ? [underlying(p.value)]
}), : p.value.map(underlying));
"observer": create ({ relay!.accept(packet);
... assertionFacetObserver(e => { } else {
const response = G.toResolved(e); if (p._variant !== 'complete') {
if (!response) return; throw new Error("Unexpected fragmentation in handshake");
switch (response._variant) { }
case "accepted": const { message, finished } = H!.readMessage(underlying(p.value));
H = new SaltyCrypto.Handshake( if (message.byteLength !== 0) {
algorithms, throw new Error("Unexpected payload during handshake");
patternName, }
'initiator', maybeTransition(finished);
{ }
prologue,
remoteStaticPublicKey: underlying(spec.key),
preSharedKeys: preSharedKeys.map(underlying),
});
transportState = null;
responderSession = response.responderSession;
const { packet, finished } = H.writeMessage(new Uint8Array());
at responderSession {
send message Bytes.from(packet);
}
maybeTransition(finished);
break;
case "Rejected":
stop {
at ds {
assert G.ResolvedPathStep<Ref>({
"origin": origin,
"pathStep": G.PathStep({
"stepType": N.$noise,
"detail": fromJS(N.NoisePathStepDetail(spec)),
}),
"resolved": response,
});
}
}
}
}),
message(body: Assertion) {
const p = N.asPacket(body);
if (transportState) {
const packet = transportState.recv.decrypt_large(
p._variant === 'complete'
? [underlying(p.value)]
: p.value.map(underlying));
relay!.accept(packet);
} else {
if (p._variant !== 'complete') {
throw new Error("Unexpected fragmentation in handshake");
}
const { message, finished } = H!.readMessage(underlying(p.value));
if (message.byteLength !== 0) {
throw new Error("Unexpected payload during handshake");
}
maybeTransition(finished);
}
},
}),
});
} }
} }
} }
@ -434,10 +443,19 @@ export function unpackStandardRoute<R extends Embeddable>(route: E.StandardRoute
}); });
} }
// We support a couple of variations here: a string containing Base64-encoded machine-oriented
// Preserves, or a string containing text-syntax Preserves.
export function decodeStandardRoute(s: string): G.Route | null { export function decodeStandardRoute(s: string): G.Route | null {
try { try {
const route = E.toStandardRoute<Ref>(decode( let routeValue: AnyValue;
Bytes.fromBase64(s.replace(/[^-_+/A-Za-z0-9=]/g, '')))); // A valid text-syntax representation of a StandardRoute must start with
// either '[' or '<', neither of which is valid Base64.
if (s[0] === '[' || s[0] === '<') {
routeValue = parse(s);
} else {
routeValue = decode(Bytes.fromBase64(s.replace(/[^-_+/A-Za-z0-9=]/g, '')));
}
const route = E.toStandardRoute(routeValue);
return route === void 0 ? null : unpackStandardRoute(route); return route === void 0 ? null : unpackStandardRoute(route);
} catch (e) { } catch (e) {
console.error('Decoding standard route:', e); console.error('Decoding standard route:', e);
@ -452,7 +470,7 @@ export function contactRemote(
controlObject: Ref, controlObject: Ref,
transportAddr: AnyValue, transportAddr: AnyValue,
) => void, ) => void,
ds = Dataspace.global, ds = Dataspace.local,
) { ) {
const routeValue = 'pathSteps' in route ? G.fromRoute(G.Route(route)) : route; const routeValue = 'pathSteps' in route ? G.fromRoute(G.Route(route)) : route;
at ds { at ds {

View File

@ -0,0 +1,17 @@
{
"folders": [
{
"path": "."
},
{
"name": "preserves-js",
"path": "../preserves/implementations/javascript"
}
],
"settings": {
"files.exclude": {
"**/node_modules/": true
},
"typescript.tsdk": "syndicate-js/node_modules/typescript/lib"
}
}

View File

@ -16,12 +16,14 @@ open() {
for d in packages/*/tsconfig.json for d in packages/*/tsconfig.json
do do
open "cd $(dirname $d); yarn compile:watch" open "cd $(dirname $d); exec yarn compile:watch"
done done
for d in packages/*/rollup.config.js for d in packages/*/rollup.config.js
do do
open "cd $(dirname $d); yarn rollup:watch" open "cd $(dirname $d); exec yarn rollup:watch"
done done
open "cd packages/browser-stdenv; exec yarn prepare:watch"
tmux select-layout even-vertical tmux select-layout even-vertical

402
yarn.lock
View File

@ -10,7 +10,7 @@
"@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/trace-mapping" "^0.3.24"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2":
version "7.24.2" version "7.24.2"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
@ -19,37 +19,37 @@
picocolors "^1.0.0" picocolors "^1.0.0"
"@babel/compat-data@^7.23.5": "@babel/compat-data@^7.23.5":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
version "7.24.3" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a"
integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==
dependencies: dependencies:
"@ampproject/remapping" "^2.2.0" "@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.24.2" "@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.1" "@babel/generator" "^7.24.5"
"@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-module-transforms" "^7.23.3" "@babel/helper-module-transforms" "^7.24.5"
"@babel/helpers" "^7.24.1" "@babel/helpers" "^7.24.5"
"@babel/parser" "^7.24.1" "@babel/parser" "^7.24.5"
"@babel/template" "^7.24.0" "@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1" "@babel/traverse" "^7.24.5"
"@babel/types" "^7.24.0" "@babel/types" "^7.24.5"
convert-source-map "^2.0.0" convert-source-map "^2.0.0"
debug "^4.1.0" debug "^4.1.0"
gensync "^1.0.0-beta.2" gensync "^1.0.0-beta.2"
json5 "^2.2.3" json5 "^2.2.3"
semver "^6.3.1" semver "^6.3.1"
"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": "@babel/generator@^7.24.5", "@babel/generator@^7.7.2":
version "7.24.1" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3"
integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==
dependencies: dependencies:
"@babel/types" "^7.24.0" "@babel/types" "^7.24.5"
"@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1" jsesc "^2.5.1"
@ -85,81 +85,81 @@
dependencies: dependencies:
"@babel/types" "^7.22.5" "@babel/types" "^7.22.5"
"@babel/helper-module-imports@^7.22.15": "@babel/helper-module-imports@^7.24.3":
version "7.24.3" version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
dependencies: dependencies:
"@babel/types" "^7.24.0" "@babel/types" "^7.24.0"
"@babel/helper-module-transforms@^7.23.3": "@babel/helper-module-transforms@^7.24.5":
version "7.23.3" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545"
integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==
dependencies: dependencies:
"@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-module-imports" "^7.22.15" "@babel/helper-module-imports" "^7.24.3"
"@babel/helper-simple-access" "^7.22.5" "@babel/helper-simple-access" "^7.24.5"
"@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-split-export-declaration" "^7.24.5"
"@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-validator-identifier" "^7.24.5"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0":
version "7.24.0" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a"
integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==
"@babel/helper-simple-access@^7.22.5": "@babel/helper-simple-access@^7.24.5":
version "7.22.5" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba"
integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==
dependencies: dependencies:
"@babel/types" "^7.22.5" "@babel/types" "^7.24.5"
"@babel/helper-split-export-declaration@^7.22.6": "@babel/helper-split-export-declaration@^7.24.5":
version "7.22.6" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6"
integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==
dependencies: dependencies:
"@babel/types" "^7.22.5" "@babel/types" "^7.24.5"
"@babel/helper-string-parser@^7.23.4": "@babel/helper-string-parser@^7.24.1":
version "7.24.1" version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
"@babel/helper-validator-identifier@^7.22.20": "@babel/helper-validator-identifier@^7.24.5":
version "7.22.20" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
"@babel/helper-validator-option@^7.23.5": "@babel/helper-validator-option@^7.23.5":
version "7.23.5" version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
"@babel/helpers@^7.24.1": "@babel/helpers@^7.24.5":
version "7.24.1" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a"
integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==
dependencies: dependencies:
"@babel/template" "^7.24.0" "@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1" "@babel/traverse" "^7.24.5"
"@babel/types" "^7.24.0" "@babel/types" "^7.24.5"
"@babel/highlight@^7.24.2": "@babel/highlight@^7.24.2":
version "7.24.2" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e"
integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==
dependencies: dependencies:
"@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-validator-identifier" "^7.24.5"
chalk "^2.4.2" chalk "^2.4.2"
js-tokens "^4.0.0" js-tokens "^4.0.0"
picocolors "^1.0.0" picocolors "^1.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5":
version "7.24.1" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
"@babel/plugin-syntax-async-generators@^7.8.4": "@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4" version "7.8.4"
@ -261,29 +261,29 @@
"@babel/parser" "^7.24.0" "@babel/parser" "^7.24.0"
"@babel/types" "^7.24.0" "@babel/types" "^7.24.0"
"@babel/traverse@^7.24.1", "@babel/traverse@^7.7.2": "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2":
version "7.24.1" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8"
integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==
dependencies: dependencies:
"@babel/code-frame" "^7.24.1" "@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.1" "@babel/generator" "^7.24.5"
"@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0" "@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-split-export-declaration" "^7.24.5"
"@babel/parser" "^7.24.1" "@babel/parser" "^7.24.5"
"@babel/types" "^7.24.0" "@babel/types" "^7.24.5"
debug "^4.3.1" debug "^4.3.1"
globals "^11.1.0" globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3": "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3":
version "7.24.0" version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7"
integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==
dependencies: dependencies:
"@babel/helper-string-parser" "^7.23.4" "@babel/helper-string-parser" "^7.24.1"
"@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-validator-identifier" "^7.24.5"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3": "@bcoe/v8-coverage@^0.2.3":
@ -1426,30 +1426,30 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@preserves/core@0.995.100", "@preserves/core@^0.995.100": "@preserves/core@^0.995.200", "@preserves/core@^0.995.201":
version "0.995.100" version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.100.tgz#9159d9ccd9a11314fbb09ad7db53090d5dccf98e" resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.201.tgz#919635b8af3daf705b83656300c4c32136278171"
integrity sha512-EpdAbWdel/upZ4QJT6JyiCiZ/cl70dyGRQLrExe0lh4Hvan/O59dv7GLuAWa5rtQJLp84bdYGXf8+iYcNM35WA== integrity sha512-ZFRheLOtOlFO2hkX2ZVKugTENBz37gSgm0nZp7xIYafRkPkEPcXSZ2cOGRDTXxXQOOEyu4y/iCi3RqJUTBPP+g==
"@preserves/schema-cli@0.995.100": "@preserves/schema-cli@>=0.995.201", "@preserves/schema-cli@^0.995.201":
version "0.995.100" version "0.995.202"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.100.tgz#c3ee6a1509f85bf280336a1e351fe47c29e107a1" resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.202.tgz#8de6bda084ac66bb11b800b4a210eaff4b09dbaa"
integrity sha512-o+msStzLAkevIi85dqUWg7TjTauRXx61TmezoDhaxIKmElKYbHCBDUj3esJTr5u3j+nCt1LFAZBMyHewblBUvg== integrity sha512-kAFdcgQgapk2q/kV9/dfC72QOX+lE0h8GOz2tva6DOzYiPRkjW/Xa9wmvt5IE0Ebv3pNyVfF/J6OTlXEelaqqw==
dependencies: dependencies:
"@preserves/core" "^0.995.100" "@preserves/core" "^0.995.201"
"@preserves/schema" "^0.995.100" "@preserves/schema" "^0.995.202"
chalk "^4.1" chalk "^4.1"
chokidar "^3.5" chokidar "^3.5"
commander "^7.2" commander "^7.2"
glob "^7.1" glob "^7.1"
minimatch "^3.0" minimatch "^3.0"
"@preserves/schema@0.995.100", "@preserves/schema@^0.995.100": "@preserves/schema@^0.995.201", "@preserves/schema@^0.995.202":
version "0.995.100" version "0.995.202"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.100.tgz#27c5dbe7e866137e7b8686c0c4ea926e96120966" resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.202.tgz#6334deea21d62f2ad709ba7d16a9f8fa7f899c3a"
integrity sha512-gHtFZ+MZZZem34lFyLqE54x//GjRBN3kERmqo28guivs+EFVk7io333HFl2dCCeLQTZfNfFnoFNNHe0ipaKOvA== integrity sha512-wnUBBeHsqLY+AGficWm6OsgpHiVWabv+Bkzn8l+xbVrhTRhMbirTUYKetaH658xxjbWLR3B4QVdbu9g5VBlehg==
dependencies: dependencies:
"@preserves/core" "^0.995.100" "@preserves/core" "^0.995.201"
"@rollup/plugin-node-resolve@^13.0": "@rollup/plugin-node-resolve@^13.0":
version "13.3.0" version "13.3.0"
@ -1492,9 +1492,9 @@
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
"@tsconfig/node10@^1.0.7": "@tsconfig/node10@^1.0.7":
version "1.0.9" version "1.0.11"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
"@tsconfig/node12@^1.0.7": "@tsconfig/node12@^1.0.7":
version "1.0.11" version "1.0.11"
@ -1612,9 +1612,9 @@
integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/node@*": "@types/node@*":
version "20.11.30" version "20.12.8"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.8.tgz#35897bf2bfe3469847ab04634636de09552e8256"
integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== integrity sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==
dependencies: dependencies:
undici-types "~5.26.4" undici-types "~5.26.4"
@ -2214,9 +2214,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001587: caniuse-lite@^1.0.30001587:
version "1.0.30001599" version "1.0.30001615"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz#7c2c8772db681b6dee74d81d6550db68f2d28842"
integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== integrity sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==
caseless@~0.12.0: caseless@~0.12.0:
version "0.12.0" version "0.12.0"
@ -2293,9 +2293,9 @@ ci-info@^3.2.0:
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
cjs-module-lexer@^1.0.0: cjs-module-lexer@^1.0.0:
version "1.2.3" version "1.3.1"
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c"
integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==
clean-stack@^2.0.0: clean-stack@^2.0.0:
version "2.2.0" version "2.2.0"
@ -2707,7 +2707,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4:
es-errors "^1.3.0" es-errors "^1.3.0"
gopd "^1.0.1" gopd "^1.0.1"
define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: define-properties@^1.2.0, define-properties@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
@ -2835,9 +2835,9 @@ editorconfig@^1.0.4:
semver "^7.5.3" semver "^7.5.3"
electron-to-chromium@^1.4.668: electron-to-chromium@^1.4.668:
version "1.4.713" version "1.4.755"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.713.tgz#7cd8e4083c948f8d0cc686fcfdde97d97fd76556" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.755.tgz#e26b3f5955b9de75a24048587521bde22fa4e0a0"
integrity sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw== integrity sha512-9nop+3jZxSHIxe1EzEUcjDXzK+3qOv3fY5w0sE88nIZUntbv1aXWmoxGWlklX5XSO4txCpLssWkUSh8RQPovBg==
emittery@^0.8.1: emittery@^0.8.1:
version "0.8.1" version "0.8.1"
@ -2867,9 +2867,9 @@ env-paths@^2.2.0:
integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
envinfo@^7.7.4: envinfo@^7.7.4:
version "7.11.1" version "7.13.0"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31"
integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==
err-code@^2.0.2: err-code@^2.0.2:
version "2.0.3" version "2.0.3"
@ -2883,57 +2883,10 @@ error-ex@^1.3.1:
dependencies: dependencies:
is-arrayish "^0.2.1" is-arrayish "^0.2.1"
es-abstract@^1.22.1, es-abstract@^1.22.3: es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
version "1.22.5" version "1.23.3"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
dependencies:
array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3"
available-typed-arrays "^1.0.7"
call-bind "^1.0.7"
es-define-property "^1.0.0"
es-errors "^1.3.0"
es-set-tostringtag "^2.0.3"
es-to-primitive "^1.2.1"
function.prototype.name "^1.1.6"
get-intrinsic "^1.2.4"
get-symbol-description "^1.0.2"
globalthis "^1.0.3"
gopd "^1.0.1"
has-property-descriptors "^1.0.2"
has-proto "^1.0.3"
has-symbols "^1.0.3"
hasown "^2.0.1"
internal-slot "^1.0.7"
is-array-buffer "^3.0.4"
is-callable "^1.2.7"
is-negative-zero "^2.0.3"
is-regex "^1.1.4"
is-shared-array-buffer "^1.0.3"
is-string "^1.0.7"
is-typed-array "^1.1.13"
is-weakref "^1.0.2"
object-inspect "^1.13.1"
object-keys "^1.1.1"
object.assign "^4.1.5"
regexp.prototype.flags "^1.5.2"
safe-array-concat "^1.1.0"
safe-regex-test "^1.0.3"
string.prototype.trim "^1.2.8"
string.prototype.trimend "^1.0.7"
string.prototype.trimstart "^1.0.7"
typed-array-buffer "^1.0.2"
typed-array-byte-length "^1.0.1"
typed-array-byte-offset "^1.0.2"
typed-array-length "^1.0.5"
unbox-primitive "^1.0.2"
which-typed-array "^1.1.14"
es-abstract@^1.23.0, es-abstract@^1.23.2:
version "1.23.2"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0"
integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==
dependencies: dependencies:
array-buffer-byte-length "^1.0.1" array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3" arraybuffer.prototype.slice "^1.0.3"
@ -2974,11 +2927,11 @@ es-abstract@^1.23.0, es-abstract@^1.23.2:
safe-regex-test "^1.0.3" safe-regex-test "^1.0.3"
string.prototype.trim "^1.2.9" string.prototype.trim "^1.2.9"
string.prototype.trimend "^1.0.8" string.prototype.trimend "^1.0.8"
string.prototype.trimstart "^1.0.7" string.prototype.trimstart "^1.0.8"
typed-array-buffer "^1.0.2" typed-array-buffer "^1.0.2"
typed-array-byte-length "^1.0.1" typed-array-byte-length "^1.0.1"
typed-array-byte-offset "^1.0.2" typed-array-byte-offset "^1.0.2"
typed-array-length "^1.0.5" typed-array-length "^1.0.6"
unbox-primitive "^1.0.2" unbox-primitive "^1.0.2"
which-typed-array "^1.1.15" which-typed-array "^1.1.15"
@ -3024,7 +2977,7 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1" is-date-object "^1.0.1"
is-symbol "^1.0.2" is-symbol "^1.0.2"
escalade@^3.1.1: escalade@^3.1.1, escalade@^3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
@ -3438,15 +3391,15 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2:
is-glob "^4.0.1" is-glob "^4.0.1"
glob@^10.3.3: glob@^10.3.3:
version "10.3.10" version "10.3.12"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b"
integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==
dependencies: dependencies:
foreground-child "^3.1.0" foreground-child "^3.1.0"
jackspeak "^2.3.5" jackspeak "^2.3.6"
minimatch "^9.0.1" minimatch "^9.0.1"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0" minipass "^7.0.4"
path-scurry "^1.10.1" path-scurry "^1.10.2"
glob@^7.1, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: glob@^7.1, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3" version "7.2.3"
@ -3466,11 +3419,12 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globalthis@^1.0.3: globalthis@^1.0.3:
version "1.0.3" version "1.0.4"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
dependencies: dependencies:
define-properties "^1.1.3" define-properties "^1.2.1"
gopd "^1.0.1"
globby@^11.0.2: globby@^11.0.2:
version "11.1.0" version "11.1.0"
@ -4065,7 +4019,7 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0" html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0" istanbul-lib-report "^3.0.0"
jackspeak@^2.3.5: jackspeak@^2.3.6:
version "2.3.6" version "2.3.6"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
@ -4759,6 +4713,11 @@ lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
lru-cache@^10.2.0:
version "10.2.2"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878"
integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==
lru-cache@^5.1.1: lru-cache@^5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@ -4773,11 +4732,6 @@ lru-cache@^6.0.0:
dependencies: dependencies:
yallist "^4.0.0" yallist "^4.0.0"
"lru-cache@^9.1.1 || ^10.0.0":
version "10.2.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3"
integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==
make-dir@^2.1.0: make-dir@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@ -4937,9 +4891,9 @@ minimatch@^3.0, minimatch@^3.0.4, minimatch@^3.1.1:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimatch@^9.0.1: minimatch@^9.0.1:
version "9.0.3" version "9.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51"
integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
dependencies: dependencies:
brace-expansion "^2.0.1" brace-expansion "^2.0.1"
@ -5024,7 +4978,7 @@ minipass@^5.0.0:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
version "7.0.4" version "7.0.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c"
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
@ -5324,9 +5278,9 @@ number-is-nan@^1.0.0:
integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
nwsapi@^2.2.0: nwsapi@^2.2.0:
version "2.2.7" version "2.2.9"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.9.tgz#7f3303218372db2e9f27c27766bcfc59ae7e61c6"
integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== integrity sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==
oauth-sign@~0.9.0: oauth-sign@~0.9.0:
version "0.9.0" version "0.9.0"
@ -5590,12 +5544,12 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.10.1: path-scurry@^1.10.2:
version "1.10.1" version "1.10.2"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7"
integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==
dependencies: dependencies:
lru-cache "^9.1.1 || ^10.0.0" lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-type@^3.0.0: path-type@^3.0.0:
@ -5735,9 +5689,9 @@ q@^1.5.1:
integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
qs@^6.9.4: qs@^6.9.4:
version "6.12.0" version "6.12.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77" resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a"
integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg== integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==
dependencies: dependencies:
side-channel "^1.0.6" side-channel "^1.0.6"
@ -6078,7 +6032,7 @@ rxjs@^6.6.0:
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
safe-array-concat@^1.1.0, safe-array-concat@^1.1.2: safe-array-concat@^1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
@ -6112,7 +6066,7 @@ safe-regex-test@^1.0.3:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
salty-crypto@0.3, salty-crypto@0.3.1: salty-crypto@0.3, salty-crypto@^0.3.1:
version "0.3.1" version "0.3.1"
resolved "https://registry.yarnpkg.com/salty-crypto/-/salty-crypto-0.3.1.tgz#1242cd948d8152aff104d0945980996b1602ba0e" resolved "https://registry.yarnpkg.com/salty-crypto/-/salty-crypto-0.3.1.tgz#1242cd948d8152aff104d0945980996b1602ba0e"
integrity sha512-dCbF8/UzMV8oXPmMCHWzSp7u8G6NA+pHbaFBVqVgLVBiyxuwVn9iPbyt9WXT0EoXfL9sKt7U1mV+bgsGw5cV7A== integrity sha512-dCbF8/UzMV8oXPmMCHWzSp7u8G6NA+pHbaFBVqVgLVBiyxuwVn9iPbyt9WXT0EoXfL9sKt7U1mV+bgsGw5cV7A==
@ -6258,9 +6212,9 @@ socks-proxy-agent@^6.0.0:
socks "^2.6.2" socks "^2.6.2"
socks@^2.3.3, socks@^2.6.2: socks@^2.3.3, socks@^2.6.2:
version "2.8.1" version "2.8.3"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5"
integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==
dependencies: dependencies:
ip-address "^9.0.5" ip-address "^9.0.5"
smart-buffer "^4.2.0" smart-buffer "^4.2.0"
@ -6438,7 +6392,7 @@ string-width@^5.0.1, string-width@^5.1.2:
emoji-regex "^9.2.2" emoji-regex "^9.2.2"
strip-ansi "^7.0.1" strip-ansi "^7.0.1"
string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9: string.prototype.trim@^1.2.9:
version "1.2.9" version "1.2.9"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
@ -6448,7 +6402,7 @@ string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9:
es-abstract "^1.23.0" es-abstract "^1.23.0"
es-object-atoms "^1.0.0" es-object-atoms "^1.0.0"
string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8: string.prototype.trimend@^1.0.8:
version "1.0.8" version "1.0.8"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
@ -6457,14 +6411,14 @@ string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8:
define-properties "^1.2.1" define-properties "^1.2.1"
es-object-atoms "^1.0.0" es-object-atoms "^1.0.0"
string.prototype.trimstart@^1.0.7: string.prototype.trimstart@^1.0.8:
version "1.0.7" version "1.0.8"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
dependencies: dependencies:
call-bind "^1.0.2" call-bind "^1.0.7"
define-properties "^1.2.0" define-properties "^1.2.1"
es-abstract "^1.22.1" es-object-atoms "^1.0.0"
string_decoder@^1.1.1: string_decoder@^1.1.1:
version "1.3.0" version "1.3.0"
@ -6602,9 +6556,9 @@ tar@^4.4.12:
yallist "^3.1.1" yallist "^3.1.1"
tar@^6.0.2, tar@^6.1.0: tar@^6.0.2, tar@^6.1.0:
version "6.2.0" version "6.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
dependencies: dependencies:
chownr "^2.0.0" chownr "^2.0.0"
fs-minipass "^2.0.0" fs-minipass "^2.0.0"
@ -6638,9 +6592,9 @@ terminal-link@^2.0.0:
supports-hyperlinks "^2.0.0" supports-hyperlinks "^2.0.0"
terser@^5.0.0: terser@^5.0.0:
version "5.29.2" version "5.31.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35" resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1"
integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==
dependencies: dependencies:
"@jridgewell/source-map" "^0.3.3" "@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2" acorn "^8.8.2"
@ -6711,9 +6665,9 @@ to-regex-range@^5.0.1:
is-number "^7.0.0" is-number "^7.0.0"
tough-cookie@^4.0.0: tough-cookie@^4.0.0:
version "4.1.3" version "4.1.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
dependencies: dependencies:
psl "^1.1.33" psl "^1.1.33"
punycode "^2.1.1" punycode "^2.1.1"
@ -6905,10 +6859,10 @@ typed-array-byte-offset@^1.0.2:
has-proto "^1.0.3" has-proto "^1.0.3"
is-typed-array "^1.1.13" is-typed-array "^1.1.13"
typed-array-length@^1.0.5: typed-array-length@^1.0.6:
version "1.0.5" version "1.0.6"
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
dependencies: dependencies:
call-bind "^1.0.7" call-bind "^1.0.7"
for-each "^0.3.3" for-each "^0.3.3"
@ -7020,11 +6974,11 @@ upath@^2.0.1:
integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==
update-browserslist-db@^1.0.13: update-browserslist-db@^1.0.13:
version "1.0.13" version "1.0.14"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.14.tgz#46a9367c323f8ade9a9dddb7f3ae7814b3a0b31c"
integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== integrity sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==
dependencies: dependencies:
escalade "^3.1.1" escalade "^3.1.2"
picocolors "^1.0.0" picocolors "^1.0.0"
uri-js@^4.2.2: uri-js@^4.2.2: