on main help sign in
urbit ID search validation is aLIVE
commit6f59f295363960c377f3557188dd7f6420ee8d29 authorJohn Hyde <johnhydefour@gmail.com> dateFri 7 Jan 2022, 17:50 (5 years ago) parentf18ba97
14 files changed+1004−108
install.sh+39 ui/package-lock.json+629−4 ui/package.json+7 ui/src/App.svelte+13−60 ui/src/assets/svelte.png ui/src/components/Home.svelte+18 ui/src/components/SearchBar.svelte+39 ui/src/components/SearchResults.svelte+5 ui/src/components/ShipView.svelte+12 ui/src/components/ShipViewPage.svelte+6 ui/src/lib/Counter.svelte−34 ui/src/lib/id.ts+166 ui/src/routes/__layout.svelte−3 ui/src/styles/tailwind-output.css+70−7
install.shnew file+39
@@ -0,0 +1,39 @@
1+#!/bin/bash
2+#
3+# Taken from: https://github.com/timlucmiptev/btc-agents/blob/master/install.sh
4+# by ~timluc-miptev
5+#
6+usage() { printf "Usage: $0 [-w] URBIT_PIER_DIRECTORY \n(-w: flag to watch and live copy code)\n" 1>&2; exit 1; }
7+
8+if [ $# -eq 0 ]; then
9+ usage
10+ exit 2
11+fi
12+PIER=$1
13+EXCLUDE_FILE=ignore_files.txt
14+
15+while getopts "w" opt; do
16+ case ${opt} in
17+ w) WATCH_MODE="true"
18+ PIER=$2
19+ ;;
20+ *) usage
21+ ;;
22+ esac
23+done
24+
25+if [ -z "$WATCH_MODE" ]; then
26+ echo "Installed %astrolabe"
27+ # rsync -r --copy-links --exclude-from=$EXCLUDE_FILE ./desk/* $PIER/
28+ rsync -r --copy-links --exclude-from=$EXCLUDE_FILE ./desk/* $PIER/
29+
30+else
31+ echo "Watching for changes to copy to ${PIER}..."
32+ while [ 0 ]
33+ do
34+ sleep 0.8
35+ # rsync -r --copy-links --exclude-from=$EXCLUDE_FILE ./desk/* $PIER/
36+ rsync -r --copy-links --exclude-from=$EXCLUDE_FILE ./desk/* $PIER/
37+
38+ done
39+fi
ui/package-lock.json+629−4
@@ -7,6 +7,12 @@
77 "": {
88 "name": "urbit-astrolabe",
99 "version": "0.0.0",
10+ "dependencies": {
11+ "@tlon/phonemes-js": "^1.0.0",
12+ "@tlon/sigil-js": "^1.4.5",
13+ "@urbit/api": "^2.1.0",
14+ "@urbit/http-api": "^2.1.0"
15+ },
1016 "devDependencies": {
1117 "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30",
1218 "@tsconfig/svelte": "^2.0.1",
@@ -18,6 +24,7 @@
1824 "svelte": "^3.44.0",
1925 "svelte-check": "^2.2.7",
2026 "svelte-preprocess": "^4.9.8",
27+ "svelte-spa-router": "^3.2.0",
2128 "tailwindcss": "^3.0.12",
2229 "tslib": "^2.3.1",
2330 "typescript": "^4.4.4",
@@ -121,6 +128,22 @@
121128 "node": ">=4"
122129 }
123130 },
131+ "node_modules/@babel/runtime": {
132+ "version": "7.16.7",
133+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
134+ "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
135+ "dependencies": {
136+ "regenerator-runtime": "^0.13.4"
137+ },
138+ "engines": {
139+ "node": ">=6.9.0"
140+ }
141+ },
142+ "node_modules/@microsoft/fetch-event-source": {
143+ "version": "2.0.1",
144+ "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
145+ "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
146+ },
124147 "node_modules/@nodelib/fs.scandir": {
125148 "version": "2.1.5",
126149 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -196,6 +219,24 @@
196219 }
197220 }
198221 },
222+ "node_modules/@tlon/phonemes-js": {
223+ "version": "1.0.0",
224+ "resolved": "https://registry.npmjs.org/@tlon/phonemes-js/-/phonemes-js-1.0.0.tgz",
225+ "integrity": "sha512-o8zLHidOYkn5So6BSKduueoJBKBK97Q9Puwo/9Orae1DDhEGE8HqYvbGNaT6VuIMiuK8WoB/FAx5hHUrnQ5GxQ=="
226+ },
227+ "node_modules/@tlon/sigil-js": {
228+ "version": "1.4.5",
229+ "resolved": "https://registry.npmjs.org/@tlon/sigil-js/-/sigil-js-1.4.5.tgz",
230+ "integrity": "sha512-+Fn0EizPetjePaK+z8njjzE74wxzqIRLVM8W53Dlri6XU87wJ4vk82baVGgZQFAQs96rYM/f4WV7kCzuSxSMAw==",
231+ "dependencies": {
232+ "invariant": "^2.2.4",
233+ "svgson": "^4.0.0",
234+ "transformation-matrix": "2.1.1"
235+ },
236+ "peerDependencies": {
237+ "react": "^16 || ^17"
238+ }
239+ },
199240 "node_modules/@tsconfig/svelte": {
200241 "version": "2.0.1",
201242 "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-2.0.1.tgz",
@@ -229,6 +270,29 @@
229270 "@types/node": "*"
230271 }
231272 },
273+ "node_modules/@urbit/api": {
274+ "version": "2.1.0",
275+ "resolved": "https://registry.npmjs.org/@urbit/api/-/api-2.1.0.tgz",
276+ "integrity": "sha512-2njwpvZ2s23gp5C4v9uDynU1wxrN33+vloqpvlErUhMR/4R6mXE4cMvsZzj/fCGOa0J3LRV/If7XmgG+kY69Tg==",
277+ "dependencies": {
278+ "@babel/runtime": "^7.16.0",
279+ "big-integer": "^1.6.48",
280+ "core-js": "^3.19.1",
281+ "immer": "^9.0.1",
282+ "urbit-ob": "^5.0.1"
283+ }
284+ },
285+ "node_modules/@urbit/http-api": {
286+ "version": "2.1.0",
287+ "resolved": "https://registry.npmjs.org/@urbit/http-api/-/http-api-2.1.0.tgz",
288+ "integrity": "sha512-eXYar3ofw1HlhHy2NSkJPCo//oZzfnrGXIJAKQ/gWSzd8x3o7eiiIQjoFbuWojaACy8T9fXsGzpxEqoXZlWDhw==",
289+ "dependencies": {
290+ "@babel/runtime": "^7.12.5",
291+ "@microsoft/fetch-event-source": "^2.0.0",
292+ "browser-or-node": "^1.3.0",
293+ "core-js": "^3.19.1"
294+ }
295+ },
232296 "node_modules/@urbit/vite-plugin-urbit": {
233297 "version": "0.8.0",
234298 "resolved": "https://registry.npmjs.org/@urbit/vite-plugin-urbit/-/vite-plugin-urbit-0.8.0.tgz",
@@ -359,6 +423,14 @@
359423 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
360424 "dev": true
361425 },
426+ "node_modules/big-integer": {
427+ "version": "1.6.51",
428+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
429+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
430+ "engines": {
431+ "node": ">=0.6"
432+ }
433+ },
362434 "node_modules/binary-extensions": {
363435 "version": "2.2.0",
364436 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -368,6 +440,11 @@
368440 "node": ">=8"
369441 }
370442 },
443+ "node_modules/bn.js": {
444+ "version": "4.12.0",
445+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
446+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
447+ },
371448 "node_modules/brace-expansion": {
372449 "version": "1.1.11",
373450 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -390,6 +467,11 @@
390467 "node": ">=8"
391468 }
392469 },
470+ "node_modules/browser-or-node": {
471+ "version": "1.3.0",
472+ "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz",
473+ "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg=="
474+ },
393475 "node_modules/browserslist": {
394476 "version": "4.19.1",
395477 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
@@ -568,6 +650,16 @@
568650 "node": ">=0.8"
569651 }
570652 },
653+ "node_modules/core-js": {
654+ "version": "3.20.2",
655+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.2.tgz",
656+ "integrity": "sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw==",
657+ "hasInstallScript": true,
658+ "funding": {
659+ "type": "opencollective",
660+ "url": "https://opencollective.com/core-js"
661+ }
662+ },
571663 "node_modules/cosmiconfig": {
572664 "version": "7.0.1",
573665 "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
@@ -658,6 +750,18 @@
658750 }
659751 }
660752 },
753+ "node_modules/deep-rename-keys": {
754+ "version": "0.2.1",
755+ "resolved": "https://registry.npmjs.org/deep-rename-keys/-/deep-rename-keys-0.2.1.tgz",
756+ "integrity": "sha1-7eeFN9emaivmFRfir5Vtf1ij8dg=",
757+ "dependencies": {
758+ "kind-of": "^3.0.2",
759+ "rename-keys": "^1.1.2"
760+ },
761+ "engines": {
762+ "node": ">=0.10.0"
763+ }
764+ },
661765 "node_modules/defined": {
662766 "version": "1.0.0",
663767 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
@@ -1024,6 +1128,11 @@
10241128 "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
10251129 "dev": true
10261130 },
1131+ "node_modules/eventemitter3": {
1132+ "version": "2.0.3",
1133+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
1134+ "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo="
1135+ },
10271136 "node_modules/fast-glob": {
10281137 "version": "3.2.9",
10291138 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz",
@@ -1135,6 +1244,14 @@
11351244 "url": "https://github.com/sponsors/sindresorhus"
11361245 }
11371246 },
1247+ "node_modules/get-value": {
1248+ "version": "2.0.6",
1249+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
1250+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
1251+ "engines": {
1252+ "node": ">=0.10.0"
1253+ }
1254+ },
11381255 "node_modules/glob": {
11391256 "version": "7.2.0",
11401257 "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
@@ -1214,6 +1331,38 @@
12141331 "node": ">=8"
12151332 }
12161333 },
1334+ "node_modules/has-value": {
1335+ "version": "0.3.1",
1336+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
1337+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
1338+ "dependencies": {
1339+ "get-value": "^2.0.3",
1340+ "has-values": "^0.1.4",
1341+ "isobject": "^2.0.0"
1342+ },
1343+ "engines": {
1344+ "node": ">=0.10.0"
1345+ }
1346+ },
1347+ "node_modules/has-value/node_modules/isobject": {
1348+ "version": "2.1.0",
1349+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
1350+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
1351+ "dependencies": {
1352+ "isarray": "1.0.0"
1353+ },
1354+ "engines": {
1355+ "node": ">=0.10.0"
1356+ }
1357+ },
1358+ "node_modules/has-values": {
1359+ "version": "0.1.4",
1360+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
1361+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
1362+ "engines": {
1363+ "node": ">=0.10.0"
1364+ }
1365+ },
12171366 "node_modules/ignore": {
12181367 "version": "5.2.0",
12191368 "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
@@ -1223,6 +1372,15 @@
12231372 "node": ">= 4"
12241373 }
12251374 },
1375+ "node_modules/immer": {
1376+ "version": "9.0.7",
1377+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.7.tgz",
1378+ "integrity": "sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA==",
1379+ "funding": {
1380+ "type": "opencollective",
1381+ "url": "https://opencollective.com/immer"
1382+ }
1383+ },
12261384 "node_modules/import-fresh": {
12271385 "version": "3.3.0",
12281386 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -1255,6 +1413,14 @@
12551413 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
12561414 "dev": true
12571415 },
1416+ "node_modules/invariant": {
1417+ "version": "2.2.4",
1418+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
1419+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
1420+ "dependencies": {
1421+ "loose-envify": "^1.0.0"
1422+ }
1423+ },
12581424 "node_modules/is-arrayish": {
12591425 "version": "0.2.1",
12601426 "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -1273,6 +1439,11 @@
12731439 "node": ">=8"
12741440 }
12751441 },
1442+ "node_modules/is-buffer": {
1443+ "version": "1.1.6",
1444+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1445+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
1446+ },
12761447 "node_modules/is-core-module": {
12771448 "version": "2.8.1",
12781449 "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
@@ -1324,17 +1495,40 @@
13241495 "node": ">=0.12.0"
13251496 }
13261497 },
1498+ "node_modules/is-plain-object": {
1499+ "version": "2.0.4",
1500+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
1501+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
1502+ "dependencies": {
1503+ "isobject": "^3.0.1"
1504+ },
1505+ "engines": {
1506+ "node": ">=0.10.0"
1507+ }
1508+ },
1509+ "node_modules/isarray": {
1510+ "version": "1.0.0",
1511+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1512+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1513+ },
13271514 "node_modules/isexe": {
13281515 "version": "2.0.0",
13291516 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
13301517 "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
13311518 "dev": true
13321519 },
1520+ "node_modules/isobject": {
1521+ "version": "3.0.1",
1522+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
1523+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
1524+ "engines": {
1525+ "node": ">=0.10.0"
1526+ }
1527+ },
13331528 "node_modules/js-tokens": {
13341529 "version": "4.0.0",
13351530 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1336− "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1337− "dev": true
1531+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
13381532 },
13391533 "node_modules/json-parse-even-better-errors": {
13401534 "version": "2.3.1",
@@ -1354,6 +1548,17 @@
13541548 "graceful-fs": "^4.1.6"
13551549 }
13561550 },
1551+ "node_modules/kind-of": {
1552+ "version": "3.2.2",
1553+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1554+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1555+ "dependencies": {
1556+ "is-buffer": "^1.1.5"
1557+ },
1558+ "engines": {
1559+ "node": ">=0.10.0"
1560+ }
1561+ },
13571562 "node_modules/kleur": {
13581563 "version": "4.1.4",
13591564 "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
@@ -1384,6 +1589,27 @@
13841589 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
13851590 "dev": true
13861591 },
1592+ "node_modules/lodash.chunk": {
1593+ "version": "4.2.0",
1594+ "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz",
1595+ "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw="
1596+ },
1597+ "node_modules/lodash.isequal": {
1598+ "version": "4.5.0",
1599+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
1600+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
1601+ },
1602+ "node_modules/loose-envify": {
1603+ "version": "1.4.0",
1604+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1605+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1606+ "dependencies": {
1607+ "js-tokens": "^3.0.0 || ^4.0.0"
1608+ },
1609+ "bin": {
1610+ "loose-envify": "cli.js"
1611+ }
1612+ },
13871613 "node_modules/magic-string": {
13881614 "version": "0.25.7",
13891615 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
@@ -1505,6 +1731,15 @@
15051731 "node": ">=0.10.0"
15061732 }
15071733 },
1734+ "node_modules/object-assign": {
1735+ "version": "4.1.1",
1736+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1737+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1738+ "peer": true,
1739+ "engines": {
1740+ "node": ">=0.10.0"
1741+ }
1742+ },
15081743 "node_modules/object-hash": {
15091744 "version": "2.2.0",
15101745 "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
@@ -1514,6 +1749,18 @@
15141749 "node": ">= 6"
15151750 }
15161751 },
1752+ "node_modules/omit-deep": {
1753+ "version": "0.3.0",
1754+ "resolved": "https://registry.npmjs.org/omit-deep/-/omit-deep-0.3.0.tgz",
1755+ "integrity": "sha1-IcivNJm8rdKWUaIyy8rLxSRF6+w=",
1756+ "dependencies": {
1757+ "is-plain-object": "^2.0.1",
1758+ "unset-value": "^0.1.1"
1759+ },
1760+ "engines": {
1761+ "node": ">=0.10.0"
1762+ }
1763+ },
15171764 "node_modules/once": {
15181765 "version": "1.4.0",
15191766 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1830,6 +2077,19 @@
18302077 "url": "https://github.com/sponsors/sindresorhus"
18312078 }
18322079 },
2080+ "node_modules/react": {
2081+ "version": "17.0.2",
2082+ "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
2083+ "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
2084+ "peer": true,
2085+ "dependencies": {
2086+ "loose-envify": "^1.1.0",
2087+ "object-assign": "^4.1.1"
2088+ },
2089+ "engines": {
2090+ "node": ">=0.10.0"
2091+ }
2092+ },
18332093 "node_modules/read-cache": {
18342094 "version": "1.0.0",
18352095 "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -1851,6 +2111,28 @@
18512111 "node": ">=8.10.0"
18522112 }
18532113 },
2114+ "node_modules/regenerator-runtime": {
2115+ "version": "0.13.9",
2116+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
2117+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
2118+ },
2119+ "node_modules/regexparam": {
2120+ "version": "2.0.0",
2121+ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.0.tgz",
2122+ "integrity": "sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==",
2123+ "dev": true,
2124+ "engines": {
2125+ "node": ">=8"
2126+ }
2127+ },
2128+ "node_modules/rename-keys": {
2129+ "version": "1.2.0",
2130+ "resolved": "https://registry.npmjs.org/rename-keys/-/rename-keys-1.2.0.tgz",
2131+ "integrity": "sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg==",
2132+ "engines": {
2133+ "node": ">= 0.8.0"
2134+ }
2135+ },
18542136 "node_modules/require-directory": {
18552137 "version": "2.1.1",
18562138 "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -2241,6 +2523,28 @@
22412523 }
22422524 }
22432525 },
2526+ "node_modules/svelte-spa-router": {
2527+ "version": "3.2.0",
2528+ "resolved": "https://registry.npmjs.org/svelte-spa-router/-/svelte-spa-router-3.2.0.tgz",
2529+ "integrity": "sha512-igemo5Vs82TGBBw+DjWt6qKameXYzNs6aDXcTxou5XbEvOjiRcAM6MLkdVRCatn6u8r42dE99bt/br7T4qe/AQ==",
2530+ "dev": true,
2531+ "dependencies": {
2532+ "regexparam": "2.0.0"
2533+ },
2534+ "funding": {
2535+ "url": "https://github.com/sponsors/ItalyPaleAle"
2536+ }
2537+ },
2538+ "node_modules/svgson": {
2539+ "version": "4.1.0",
2540+ "resolved": "https://registry.npmjs.org/svgson/-/svgson-4.1.0.tgz",
2541+ "integrity": "sha512-DodISxHtdLKUghDYA+PGK4Qq350+CbBAkdvGLkBFSmWd9WKSg4dijgjB1IiRPTmsUCd+a7KYe+ILHtklYgQyzQ==",
2542+ "dependencies": {
2543+ "deep-rename-keys": "^0.2.1",
2544+ "omit-deep": "0.3.0",
2545+ "xml-reader": "2.4.3"
2546+ }
2547+ },
22442548 "node_modules/tailwindcss": {
22452549 "version": "3.0.12",
22462550 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.12.tgz",
@@ -2310,6 +2614,11 @@
23102614 "node": ">=8.0"
23112615 }
23122616 },
2617+ "node_modules/transformation-matrix": {
2618+ "version": "2.1.1",
2619+ "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.1.1.tgz",
2620+ "integrity": "sha512-74MoNHhwLVuzwaPDcAecFjSkOA9vwWqyOdkeB0Be8Jc/IWSS5SNZKapFllqzkTliqZptkvqX5CZnVeDvfhN8cw=="
2621+ },
23132622 "node_modules/tree-kill": {
23142623 "version": "1.2.2",
23152624 "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -2347,6 +2656,28 @@
23472656 "node": ">= 10.0.0"
23482657 }
23492658 },
2659+ "node_modules/unset-value": {
2660+ "version": "0.1.2",
2661+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz",
2662+ "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=",
2663+ "dependencies": {
2664+ "has-value": "^0.3.1",
2665+ "isobject": "^3.0.0"
2666+ },
2667+ "engines": {
2668+ "node": ">=0.10.0"
2669+ }
2670+ },
2671+ "node_modules/urbit-ob": {
2672+ "version": "5.0.1",
2673+ "resolved": "https://registry.npmjs.org/urbit-ob/-/urbit-ob-5.0.1.tgz",
2674+ "integrity": "sha512-qGNAwu87XNkW3g8ah4fUwmh2EKXtsdhEbyEiE5qX4Op17rhLH3HSkvu8g9z+MhqX51Uz9sf8ktvqJj/IRwETIQ==",
2675+ "dependencies": {
2676+ "bn.js": "^4.11.8",
2677+ "lodash.chunk": "^4.2.0",
2678+ "lodash.isequal": "^4.5.0"
2679+ }
2680+ },
23502681 "node_modules/util-deprecate": {
23512682 "version": "1.0.2",
23522683 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -2455,6 +2786,23 @@
24552786 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
24562787 "dev": true
24572788 },
2789+ "node_modules/xml-lexer": {
2790+ "version": "0.2.2",
2791+ "resolved": "https://registry.npmjs.org/xml-lexer/-/xml-lexer-0.2.2.tgz",
2792+ "integrity": "sha1-UYGTpKozTVj8fSSLVJB5uJkH4EY=",
2793+ "dependencies": {
2794+ "eventemitter3": "^2.0.0"
2795+ }
2796+ },
2797+ "node_modules/xml-reader": {
2798+ "version": "2.4.3",
2799+ "resolved": "https://registry.npmjs.org/xml-reader/-/xml-reader-2.4.3.tgz",
2800+ "integrity": "sha1-n4EMr3xCWlqvuEixxFEDyecddTA=",
2801+ "dependencies": {
2802+ "eventemitter3": "^2.0.0",
2803+ "xml-lexer": "^0.2.2"
2804+ }
2805+ },
24582806 "node_modules/xtend": {
24592807 "version": "4.0.2",
24602808 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -2589,6 +2937,19 @@
25892937 }
25902938 }
25912939 },
2940+ "@babel/runtime": {
2941+ "version": "7.16.7",
2942+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
2943+ "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
2944+ "requires": {
2945+ "regenerator-runtime": "^0.13.4"
2946+ }
2947+ },
2948+ "@microsoft/fetch-event-source": {
2949+ "version": "2.0.1",
2950+ "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
2951+ "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
2952+ },
25922953 "@nodelib/fs.scandir": {
25932954 "version": "2.1.5",
25942955 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -2639,6 +3000,21 @@
26393000 "svelte-hmr": "^0.14.9"
26403001 }
26413002 },
3003+ "@tlon/phonemes-js": {
3004+ "version": "1.0.0",
3005+ "resolved": "https://registry.npmjs.org/@tlon/phonemes-js/-/phonemes-js-1.0.0.tgz",
3006+ "integrity": "sha512-o8zLHidOYkn5So6BSKduueoJBKBK97Q9Puwo/9Orae1DDhEGE8HqYvbGNaT6VuIMiuK8WoB/FAx5hHUrnQ5GxQ=="
3007+ },
3008+ "@tlon/sigil-js": {
3009+ "version": "1.4.5",
3010+ "resolved": "https://registry.npmjs.org/@tlon/sigil-js/-/sigil-js-1.4.5.tgz",
3011+ "integrity": "sha512-+Fn0EizPetjePaK+z8njjzE74wxzqIRLVM8W53Dlri6XU87wJ4vk82baVGgZQFAQs96rYM/f4WV7kCzuSxSMAw==",
3012+ "requires": {
3013+ "invariant": "^2.2.4",
3014+ "svgson": "^4.0.0",
3015+ "transformation-matrix": "2.1.1"
3016+ }
3017+ },
26423018 "@tsconfig/svelte": {
26433019 "version": "2.0.1",
26443020 "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-2.0.1.tgz",
@@ -2672,6 +3048,29 @@
26723048 "@types/node": "*"
26733049 }
26743050 },
3051+ "@urbit/api": {
3052+ "version": "2.1.0",
3053+ "resolved": "https://registry.npmjs.org/@urbit/api/-/api-2.1.0.tgz",
3054+ "integrity": "sha512-2njwpvZ2s23gp5C4v9uDynU1wxrN33+vloqpvlErUhMR/4R6mXE4cMvsZzj/fCGOa0J3LRV/If7XmgG+kY69Tg==",
3055+ "requires": {
3056+ "@babel/runtime": "^7.16.0",
3057+ "big-integer": "^1.6.48",
3058+ "core-js": "^3.19.1",
3059+ "immer": "^9.0.1",
3060+ "urbit-ob": "^5.0.1"
3061+ }
3062+ },
3063+ "@urbit/http-api": {
3064+ "version": "2.1.0",
3065+ "resolved": "https://registry.npmjs.org/@urbit/http-api/-/http-api-2.1.0.tgz",
3066+ "integrity": "sha512-eXYar3ofw1HlhHy2NSkJPCo//oZzfnrGXIJAKQ/gWSzd8x3o7eiiIQjoFbuWojaACy8T9fXsGzpxEqoXZlWDhw==",
3067+ "requires": {
3068+ "@babel/runtime": "^7.12.5",
3069+ "@microsoft/fetch-event-source": "^2.0.0",
3070+ "browser-or-node": "^1.3.0",
3071+ "core-js": "^3.19.1"
3072+ }
3073+ },
26753074 "@urbit/vite-plugin-urbit": {
26763075 "version": "0.8.0",
26773076 "resolved": "https://registry.npmjs.org/@urbit/vite-plugin-urbit/-/vite-plugin-urbit-0.8.0.tgz",
@@ -2762,12 +3161,22 @@
27623161 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
27633162 "dev": true
27643163 },
3164+ "big-integer": {
3165+ "version": "1.6.51",
3166+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
3167+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
3168+ },
27653169 "binary-extensions": {
27663170 "version": "2.2.0",
27673171 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
27683172 "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
27693173 "dev": true
27703174 },
3175+ "bn.js": {
3176+ "version": "4.12.0",
3177+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
3178+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
3179+ },
27713180 "brace-expansion": {
27723181 "version": "1.1.11",
27733182 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -2787,6 +3196,11 @@
27873196 "fill-range": "^7.0.1"
27883197 }
27893198 },
3199+ "browser-or-node": {
3200+ "version": "1.3.0",
3201+ "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz",
3202+ "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg=="
3203+ },
27903204 "browserslist": {
27913205 "version": "4.19.1",
27923206 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
@@ -2915,6 +3329,11 @@
29153329 "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
29163330 "dev": true
29173331 },
3332+ "core-js": {
3333+ "version": "3.20.2",
3334+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.2.tgz",
3335+ "integrity": "sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw=="
3336+ },
29183337 "cosmiconfig": {
29193338 "version": "7.0.1",
29203339 "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
@@ -2969,6 +3388,15 @@
29693388 "ms": "2.1.2"
29703389 }
29713390 },
3391+ "deep-rename-keys": {
3392+ "version": "0.2.1",
3393+ "resolved": "https://registry.npmjs.org/deep-rename-keys/-/deep-rename-keys-0.2.1.tgz",
3394+ "integrity": "sha1-7eeFN9emaivmFRfir5Vtf1ij8dg=",
3395+ "requires": {
3396+ "kind-of": "^3.0.2",
3397+ "rename-keys": "^1.1.2"
3398+ }
3399+ },
29723400 "defined": {
29733401 "version": "1.0.0",
29743402 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
@@ -3208,6 +3636,11 @@
32083636 "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
32093637 "dev": true
32103638 },
3639+ "eventemitter3": {
3640+ "version": "2.0.3",
3641+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
3642+ "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo="
3643+ },
32113644 "fast-glob": {
32123645 "version": "3.2.9",
32133646 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.9.tgz",
@@ -3287,6 +3720,11 @@
32873720 "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
32883721 "dev": true
32893722 },
3723+ "get-value": {
3724+ "version": "2.0.6",
3725+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
3726+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
3727+ },
32903728 "glob": {
32913729 "version": "7.2.0",
32923730 "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
@@ -3345,12 +3783,42 @@
33453783 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
33463784 "dev": true
33473785 },
3786+ "has-value": {
3787+ "version": "0.3.1",
3788+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
3789+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
3790+ "requires": {
3791+ "get-value": "^2.0.3",
3792+ "has-values": "^0.1.4",
3793+ "isobject": "^2.0.0"
3794+ },
3795+ "dependencies": {
3796+ "isobject": {
3797+ "version": "2.1.0",
3798+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
3799+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
3800+ "requires": {
3801+ "isarray": "1.0.0"
3802+ }
3803+ }
3804+ }
3805+ },
3806+ "has-values": {
3807+ "version": "0.1.4",
3808+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
3809+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
3810+ },
33483811 "ignore": {
33493812 "version": "5.2.0",
33503813 "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
33513814 "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
33523815 "dev": true
33533816 },
3817+ "immer": {
3818+ "version": "9.0.7",
3819+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.7.tgz",
3820+ "integrity": "sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA=="
3821+ },
33543822 "import-fresh": {
33553823 "version": "3.3.0",
33563824 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -3377,6 +3845,14 @@
33773845 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
33783846 "dev": true
33793847 },
3848+ "invariant": {
3849+ "version": "2.2.4",
3850+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
3851+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
3852+ "requires": {
3853+ "loose-envify": "^1.0.0"
3854+ }
3855+ },
33803856 "is-arrayish": {
33813857 "version": "0.2.1",
33823858 "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -3392,6 +3868,11 @@
33923868 "binary-extensions": "^2.0.0"
33933869 }
33943870 },
3871+ "is-buffer": {
3872+ "version": "1.1.6",
3873+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
3874+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
3875+ },
33953876 "is-core-module": {
33963877 "version": "2.8.1",
33973878 "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
@@ -3428,17 +3909,34 @@
34283909 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
34293910 "dev": true
34303911 },
3912+ "is-plain-object": {
3913+ "version": "2.0.4",
3914+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
3915+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
3916+ "requires": {
3917+ "isobject": "^3.0.1"
3918+ }
3919+ },
3920+ "isarray": {
3921+ "version": "1.0.0",
3922+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
3923+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
3924+ },
34313925 "isexe": {
34323926 "version": "2.0.0",
34333927 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
34343928 "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
34353929 "dev": true
34363930 },
3931+ "isobject": {
3932+ "version": "3.0.1",
3933+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
3934+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
3935+ },
34373936 "js-tokens": {
34383937 "version": "4.0.0",
34393938 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
3440− "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
3441− "dev": true
3939+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
34423940 },
34433941 "json-parse-even-better-errors": {
34443942 "version": "2.3.1",
@@ -3456,6 +3954,14 @@
34563954 "universalify": "^2.0.0"
34573955 }
34583956 },
3957+ "kind-of": {
3958+ "version": "3.2.2",
3959+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3960+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3961+ "requires": {
3962+ "is-buffer": "^1.1.5"
3963+ }
3964+ },
34593965 "kleur": {
34603966 "version": "4.1.4",
34613967 "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
@@ -3480,6 +3986,24 @@
34803986 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
34813987 "dev": true
34823988 },
3989+ "lodash.chunk": {
3990+ "version": "4.2.0",
3991+ "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz",
3992+ "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw="
3993+ },
3994+ "lodash.isequal": {
3995+ "version": "4.5.0",
3996+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
3997+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
3998+ },
3999+ "loose-envify": {
4000+ "version": "1.4.0",
4001+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
4002+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
4003+ "requires": {
4004+ "js-tokens": "^3.0.0 || ^4.0.0"
4005+ }
4006+ },
34834007 "magic-string": {
34844008 "version": "0.25.7",
34854009 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
@@ -3571,12 +4095,27 @@
35714095 "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
35724096 "dev": true
35734097 },
4098+ "object-assign": {
4099+ "version": "4.1.1",
4100+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
4101+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
4102+ "peer": true
4103+ },
35744104 "object-hash": {
35754105 "version": "2.2.0",
35764106 "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
35774107 "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
35784108 "dev": true
35794109 },
4110+ "omit-deep": {
4111+ "version": "0.3.0",
4112+ "resolved": "https://registry.npmjs.org/omit-deep/-/omit-deep-0.3.0.tgz",
4113+ "integrity": "sha1-IcivNJm8rdKWUaIyy8rLxSRF6+w=",
4114+ "requires": {
4115+ "is-plain-object": "^2.0.1",
4116+ "unset-value": "^0.1.1"
4117+ }
4118+ },
35804119 "once": {
35814120 "version": "1.4.0",
35824121 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -3775,6 +4314,16 @@
37754314 "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
37764315 "dev": true
37774316 },
4317+ "react": {
4318+ "version": "17.0.2",
4319+ "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
4320+ "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
4321+ "peer": true,
4322+ "requires": {
4323+ "loose-envify": "^1.1.0",
4324+ "object-assign": "^4.1.1"
4325+ }
4326+ },
37784327 "read-cache": {
37794328 "version": "1.0.0",
37804329 "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -3793,6 +4342,22 @@
37934342 "picomatch": "^2.2.1"
37944343 }
37954344 },
4345+ "regenerator-runtime": {
4346+ "version": "0.13.9",
4347+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
4348+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
4349+ },
4350+ "regexparam": {
4351+ "version": "2.0.0",
4352+ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.0.tgz",
4353+ "integrity": "sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==",
4354+ "dev": true
4355+ },
4356+ "rename-keys": {
4357+ "version": "1.2.0",
4358+ "resolved": "https://registry.npmjs.org/rename-keys/-/rename-keys-1.2.0.tgz",
4359+ "integrity": "sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg=="
4360+ },
37964361 "require-directory": {
37974362 "version": "2.1.1",
37984363 "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -4038,6 +4603,25 @@
40384603 "strip-indent": "^3.0.0"
40394604 }
40404605 },
4606+ "svelte-spa-router": {
4607+ "version": "3.2.0",
4608+ "resolved": "https://registry.npmjs.org/svelte-spa-router/-/svelte-spa-router-3.2.0.tgz",
4609+ "integrity": "sha512-igemo5Vs82TGBBw+DjWt6qKameXYzNs6aDXcTxou5XbEvOjiRcAM6MLkdVRCatn6u8r42dE99bt/br7T4qe/AQ==",
4610+ "dev": true,
4611+ "requires": {
4612+ "regexparam": "2.0.0"
4613+ }
4614+ },
4615+ "svgson": {
4616+ "version": "4.1.0",
4617+ "resolved": "https://registry.npmjs.org/svgson/-/svgson-4.1.0.tgz",
4618+ "integrity": "sha512-DodISxHtdLKUghDYA+PGK4Qq350+CbBAkdvGLkBFSmWd9WKSg4dijgjB1IiRPTmsUCd+a7KYe+ILHtklYgQyzQ==",
4619+ "requires": {
4620+ "deep-rename-keys": "^0.2.1",
4621+ "omit-deep": "0.3.0",
4622+ "xml-reader": "2.4.3"
4623+ }
4624+ },
40414625 "tailwindcss": {
40424626 "version": "3.0.12",
40434627 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.12.tgz",
@@ -4092,6 +4676,11 @@
40924676 "is-number": "^7.0.0"
40934677 }
40944678 },
4679+ "transformation-matrix": {
4680+ "version": "2.1.1",
4681+ "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.1.1.tgz",
4682+ "integrity": "sha512-74MoNHhwLVuzwaPDcAecFjSkOA9vwWqyOdkeB0Be8Jc/IWSS5SNZKapFllqzkTliqZptkvqX5CZnVeDvfhN8cw=="
4683+ },
40954684 "tree-kill": {
40964685 "version": "1.2.2",
40974686 "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -4116,6 +4705,25 @@
41164705 "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
41174706 "dev": true
41184707 },
4708+ "unset-value": {
4709+ "version": "0.1.2",
4710+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz",
4711+ "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=",
4712+ "requires": {
4713+ "has-value": "^0.3.1",
4714+ "isobject": "^3.0.0"
4715+ }
4716+ },
4717+ "urbit-ob": {
4718+ "version": "5.0.1",
4719+ "resolved": "https://registry.npmjs.org/urbit-ob/-/urbit-ob-5.0.1.tgz",
4720+ "integrity": "sha512-qGNAwu87XNkW3g8ah4fUwmh2EKXtsdhEbyEiE5qX4Op17rhLH3HSkvu8g9z+MhqX51Uz9sf8ktvqJj/IRwETIQ==",
4721+ "requires": {
4722+ "bn.js": "^4.11.8",
4723+ "lodash.chunk": "^4.2.0",
4724+ "lodash.isequal": "^4.5.0"
4725+ }
4726+ },
41194727 "util-deprecate": {
41204728 "version": "1.0.2",
41214729 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -4177,6 +4785,23 @@
41774785 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
41784786 "dev": true
41794787 },
4788+ "xml-lexer": {
4789+ "version": "0.2.2",
4790+ "resolved": "https://registry.npmjs.org/xml-lexer/-/xml-lexer-0.2.2.tgz",
4791+ "integrity": "sha1-UYGTpKozTVj8fSSLVJB5uJkH4EY=",
4792+ "requires": {
4793+ "eventemitter3": "^2.0.0"
4794+ }
4795+ },
4796+ "xml-reader": {
4797+ "version": "2.4.3",
4798+ "resolved": "https://registry.npmjs.org/xml-reader/-/xml-reader-2.4.3.tgz",
4799+ "integrity": "sha1-n4EMr3xCWlqvuEixxFEDyecddTA=",
4800+ "requires": {
4801+ "eventemitter3": "^2.0.0",
4802+ "xml-lexer": "^0.2.2"
4803+ }
4804+ },
41804805 "xtend": {
41814806 "version": "4.0.2",
41824807 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
ui/package.json+7
@@ -23,9 +23,16 @@
2323 "svelte": "^3.44.0",
2424 "svelte-check": "^2.2.7",
2525 "svelte-preprocess": "^4.9.8",
26+ "svelte-spa-router": "^3.2.0",
2627 "tailwindcss": "^3.0.12",
2728 "tslib": "^2.3.1",
2829 "typescript": "^4.4.4",
2930 "vite": "^2.7.2"
31+ },
32+ "dependencies": {
33+ "@tlon/phonemes-js": "^1.0.0",
34+ "@tlon/sigil-js": "^1.4.5",
35+ "@urbit/api": "^2.1.0",
36+ "@urbit/http-api": "^2.1.0"
3037 }
3138}
ui/src/App.svelte+13−60
@@ -1,65 +1,18 @@
11<script lang="ts">
2− import logo from './assets/svelte.png'
3− import Counter from './lib/Counter.svelte'
2+ import Router from 'svelte-spa-router';
3+ import Urbit from '@urbit/http-api';
4+ import { Charges, ChargeUpdateInitial, scryCharges } from '@urbit/api';
5+ import Home from './components/Home.svelte';
6+ import ShipViewPage from './components/ShipViewPage.svelte';
47 import "./styles/tailwind-output.css";
5−</script>
6−
7−<main>
8− <img class="mx-auto" src={logo} alt="Svelte Logo" />
9− <h1>Hello Typescript!</h1>
10−
11− <Counter />
12−
13− <p class="m-[200px]">
14− Visit <a href="https://svelte.dev">svelte.dev</a> to learn how to build Svelte
15− apps.
16− </p>
17−
18− <p>
19− Check out <a href="https://github.com/sveltejs/kit#readme">SvelteKit</a> for
20− the officially supported framework, also powered by Vite!
21− </p>
22−</main>
23−
24−<style>
25− :root {
26− font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
27− Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
28− }
29−
30− main {
31− text-align: center;
32− padding: 1em;
33− margin: 0 auto;
34− }
35−
36− img {
37− height: 16rem;
38− width: 16rem;
39− }
40−
41− h1 {
42− color: #ff3e00;
43− text-transform: uppercase;
44− font-size: 4rem;
45− font-weight: 100;
46− line-height: 1.1;
47− margin: 2rem auto;
48− max-width: 14rem;
49− }
508
51− p {
52− max-width: 14rem;
53− line-height: 1.35;
9+ const routes = {
10+ '/': Home,
11+ '/ship/:patp': ShipViewPage,
12+ '*': Home,
5413 }
14+</script>
5515
56− @media (min-width: 480px) {
57− h1 {
58− max-width: none;
59− }
60−
61− p {
62− max-width: none;
63− }
64− }
65−</style>
16+<main class="h-screen bg-green-600">
17+ <Router {routes} />
18+</main>
ui/src/assets/svelte.pngdeleted

Binary file not shown.

ui/src/components/Home.sveltenew file+18
@@ -0,0 +1,18 @@
1+<script lang="ts">
2+ import SearchBar from "./SearchBar.svelte";
3+ import SearchResults from "./SearchResults.svelte";
4+ let search: string = '';
5+</script>
6+
7+<SearchBar bind:search />
8+{#if search == ''}
9+ <p>
10+ Hello, ~{window.ship}, would you like to search?
11+ </p>
12+{:else}
13+ <SearchResults {search} />
14+{/if}
15+
16+<footer>
17+ Made by <a href="#/ship/~midlev-mindyr">~midlev-mindyr</a>.
18+</footer>
ui/src/components/SearchBar.sveltenew file+39
@@ -0,0 +1,39 @@
1+<script lang="ts">
2+ import { validateId } from '../lib/id';
3+
4+ export let search: string = "";
5+ let problems: Array<string> = [];
6+
7+ function updateSearch(e) {
8+ let newSearch = e.target.value;
9+ problems = validateId(newSearch);
10+ if (problems.length === 0) {
11+ search = newSearch;
12+ }
13+ }
14+</script>
15+
16+<div class="flex justify-center">
17+ <input type="text" class="m-8 px-4 py-2 grow max-w-md rounded-full"
18+ placeholder="Enter an ID or Azimuth number. '*' is wildcard."
19+ value={search}
20+ on:change={updateSearch}
21+ />
22+</div>
23+
24+<div class="m-8">
25+ {#if problems.length > 0}
26+ <p>
27+ Sorry, the ID you entered is invalid:
28+ </p>
29+ {#each problems as problem}
30+ <p>
31+ {problem}
32+ </p>
33+ {/each}
34+ <p>
35+ <!-- TODO: add link to doc -->
36+ You can read more here.
37+ </p>
38+ {/if}
39+</div>
ui/src/components/SearchResults.sveltenew file+5
@@ -0,0 +1,5 @@
1+<script lang="ts">
2+ export let search : string = "";
3+</script>
4+
5+<a href="#/ship/{search}">{search}</a>
ui/src/components/ShipView.sveltenew file+12
@@ -0,0 +1,12 @@
1+<script lang="ts">
2+ export let patp: string;
3+</script>
4+
5+<div>
6+ <p>
7+ hi i'm a ship: {patp}
8+ </p>
9+ <footer>
10+ <a href="#/" >Go Home</a>
11+ </footer>
12+</div>
ui/src/components/ShipViewPage.sveltenew file+6
@@ -0,0 +1,6 @@
1+<script lang="ts">
2+ import ShipView from './ShipView.svelte';
3+ export let params = {};
4+</script>
5+
6+<ShipView patp={params.patp} />
ui/src/lib/Counter.sveltedeleted−34
@@ -1,34 +0,0 @@
1−<script lang="ts">
2− let count: number = 0
3− const increment = () => {
4− count += 1
5− }
6−</script>
7−
8−<button on:click={increment}>
9− Clicks: {count}
10−</button>
11−
12−<style>
13− button {
14− font-family: inherit;
15− font-size: inherit;
16− padding: 1em 2em;
17− color: #ff3e00;
18− background-color: rgba(255, 62, 0, 0.1);
19− border-radius: 2em;
20− border: 2px solid rgba(255, 62, 0, 0);
21− outline: none;
22− width: 200px;
23− font-variant-numeric: tabular-nums;
24− cursor: pointer;
25− }
26−
27− button:focus {
28− border: 2px solid #ff3e00;
29− }
30−
31− button:active {
32− background-color: rgba(255, 62, 0, 0.2);
33− }
34−</style>
ui/src/lib/id.tsnew file+166
@@ -0,0 +1,166 @@
1+const prefixes = ['doz', 'mar', 'bin', 'wan', 'sam', 'lit', 'sig', 'hid', 'fid', 'lis', 'sog', 'dir', 'wac', 'sab', 'wis', 'sib', 'rig', 'sol', 'dop', 'mod', 'fog', 'lid', 'hop', 'dar', 'dor', 'lor', 'hod', 'fol', 'rin', 'tog', 'sil', 'mir', 'hol', 'pas', 'lac', 'rov', 'liv', 'dal', 'sat', 'lib', 'tab', 'han', 'tic', 'pid', 'tor', 'bol', 'fos', 'dot', 'los', 'dil', 'for', 'pil', 'ram', 'tir', 'win', 'tad', 'bic', 'dif', 'roc', 'wid', 'bis', 'das', 'mid', 'lop', 'ril', 'nar', 'dap', 'mol', 'san', 'loc', 'nov', 'sit', 'nid', 'tip', 'sic', 'rop', 'wit', 'nat', 'pan', 'min', 'rit', 'pod', 'mot', 'tam', 'tol', 'sav', 'pos', 'nap', 'nop', 'som', 'fin', 'fon', 'ban', 'mor', 'wor', 'sip', 'ron', 'nor', 'bot', 'wic', 'soc', 'wat', 'dol', 'mag', 'pic', 'dav', 'bid', 'bal', 'tim', 'tas', 'mal', 'lig', 'siv', 'tag', 'pad', 'sal', 'div', 'dac', 'tan', 'sid', 'fab', 'tar', 'mon', 'ran', 'nis', 'wol', 'mis', 'pal', 'las', 'dis', 'map', 'rab', 'tob', 'rol', 'lat', 'lon', 'nod', 'nav', 'fig', 'nom', 'nib', 'pag', 'sop', 'ral', 'bil', 'had', 'doc', 'rid', 'moc', 'pac', 'rav', 'rip', 'fal', 'tod', 'til', 'tin', 'hap', 'mic', 'fan', 'pat', 'tac', 'lab', 'mog', 'sim', 'son', 'pin', 'lom', 'ric', 'tap', 'fir', 'has', 'bos', 'bat', 'poc', 'hac', 'tid', 'hav', 'sap', 'lin', 'dib', 'hos', 'dab', 'bit', 'bar', 'rac', 'par', 'lod', 'dos', 'bor', 'toc', 'hil', 'mac', 'tom', 'dig', 'fil', 'fas', 'mit', 'hob', 'har', 'mig', 'hin', 'rad', 'mas', 'hal', 'rag', 'lag', 'fad', 'top', 'mop', 'hab', 'nil', 'nos', 'mil', 'fop', 'fam', 'dat', 'nol', 'din', 'hat', 'nac', 'ris', 'fot', 'rib', 'hoc', 'nim', 'lar', 'fit', 'wal', 'rap', 'sar', 'nal', 'mos', 'lan', 'don', 'dan', 'lad', 'dov', 'riv', 'bac', 'pol', 'lap', 'tal', 'pit', 'nam', 'bon', 'ros', 'ton', 'fod', 'pon', 'sov', 'noc', 'sor', 'lav', 'mat', 'mip', 'fip'];
2+const suffixes = ['zod', 'nec', 'bud', 'wes', 'sev', 'per', 'sut', 'let', 'ful', 'pen', 'syt', 'dur', 'wep', 'ser', 'wyl', 'sun', 'ryp', 'syx', 'dyr', 'nup', 'heb', 'peg', 'lup', 'dep', 'dys', 'put', 'lug', 'hec', 'ryt', 'tyv', 'syd', 'nex', 'lun', 'mep', 'lut', 'sep', 'pes', 'del', 'sul', 'ped', 'tem', 'led', 'tul', 'met', 'wen', 'byn', 'hex', 'feb', 'pyl', 'dul', 'het', 'mev', 'rut', 'tyl', 'wyd', 'tep', 'bes', 'dex', 'sef', 'wyc', 'bur', 'der', 'nep', 'pur', 'rys', 'reb', 'den', 'nut', 'sub', 'pet', 'rul', 'syn', 'reg', 'tyd', 'sup', 'sem', 'wyn', 'rec', 'meg', 'net', 'sec', 'mul', 'nym', 'tev', 'web', 'sum', 'mut', 'nyx', 'rex', 'teb', 'fus', 'hep', 'ben', 'mus', 'wyx', 'sym', 'sel', 'ruc', 'dec', 'wex', 'syr', 'wet', 'dyl', 'myn', 'mes', 'det', 'bet', 'bel', 'tux', 'tug', 'myr', 'pel', 'syp', 'ter', 'meb', 'set', 'dut', 'deg', 'tex', 'sur', 'fel', 'tud', 'nux', 'rux', 'ren', 'wyt', 'nub', 'med', 'lyt', 'dus', 'neb', 'rum', 'tyn', 'seg', 'lyx', 'pun', 'res', 'red', 'fun', 'rev', 'ref', 'mec', 'ted', 'rus', 'bex', 'leb', 'dux', 'ryn', 'num', 'pyx', 'ryg', 'ryx', 'fep', 'tyr', 'tus', 'tyc', 'leg', 'nem', 'fer', 'mer', 'ten', 'lus', 'nus', 'syl', 'tec', 'mex', 'pub', 'rym', 'tuc', 'fyl', 'lep', 'deb', 'ber', 'mug', 'hut', 'tun', 'byl', 'sud', 'pem', 'dev', 'lur', 'def', 'bus', 'bep', 'run', 'mel', 'pex', 'dyt', 'byt', 'typ', 'lev', 'myl', 'wed', 'duc', 'fur', 'fex', 'nul', 'luc', 'len', 'ner', 'lex', 'rup', 'ned', 'lec', 'ryd', 'lyd', 'fen', 'wel', 'nyd', 'hus', 'rel', 'rud', 'nes', 'hes', 'fet', 'des', 'ret', 'dun', 'ler', 'nyr', 'seb', 'hul', 'ryl', 'lud', 'rem', 'lys', 'fyn', 'wer', 'ryc', 'sug', 'nys', 'nyl', 'lyn', 'dyn', 'dem', 'lux', 'fed', 'sed', 'bec', 'mun', 'lyr', 'tes', 'mud', 'nyt', 'byr', 'sen', 'weg', 'fyr', 'mur', 'tel', 'rep', 'teg', 'pec', 'nel', 'nev', 'fes'];
3+const illegalCharsRegex = /[^-_*^abcdefghilmnoprstuvwxyz]/g;
4+
5+// Error Messages
6+const emptyPatpMessage = "ID cannot be empty."
7+const emptyWordsMessage = "Separators (- ^ _) cannot appear next to each other, or at the beginning or end of an ID."
8+const invalidAbbreviations = "Moon and Comet abbreviations (using ^ or _) can only have two parts."
9+
10+function illegalCharsMessage(illegalChars: string[]) {
11+ return 'It contains illegal characters: ' + listStrings(illegalChars);
12+}
13+
14+function multipleWordsLengthMessage(wrongLengthWords: string[]) {
15+ let wordListString = listStrings(wrongLengthWords, true);
16+ let firstHalf = '';
17+ if (wrongLengthWords.length > 1) {
18+ firstHalf = `${wordListString} are not valid parts of a multi-part ID.`;
19+ } else {
20+ firstHalf = `${wordListString} is not a valid part of a multi-part ID.`;
21+ }
22+ return `${firstHalf} Each part must be 6 letters long.`;
23+}
24+
25+function singleWordLengthMessage(word: string) {
26+ return `'${word}' must be either 3 or 6 letters long (either a galaxy or a star).`;
27+}
28+
29+function invalidSyllablesMessage(syllables: string[], syllableSet: string) {
30+ let wordListString = listStrings(syllables, true);
31+ return `${wordListString} did not match any ${syllableSet}.`;
32+}
33+
34+function invalidPrefixesMessage(syllables: string[]) {
35+ return invalidSyllablesMessage(syllables, 'prefixes');
36+}
37+
38+function invalidSuffixesMessage(syllables: string[]) {
39+ return invalidSyllablesMessage(syllables, 'suffixes');
40+}
41+
42+function stripTilde(str: string): string {
43+ if (str[0] === '~') {
44+ return str.substring(1);
45+ }
46+ return str;
47+}
48+
49+function listStrings(list: string[], includeAnd: boolean = false): string {
50+ if (includeAnd && list.length > 1) {
51+ return listStrings(list.slice(0, -1)) + ' and ' + listStrings(list.slice(-1));
52+ }
53+ return "'" + list.join("', '") + "'";
54+}
55+
56+function splitIdIntoWords(str: string): string[] {
57+ return str.split(/[-_^]/);
58+}
59+
60+function convertSyllableToRegex(str: string): RegExp {
61+ str = str.replace(/\*/g, '.');
62+ return new RegExp(str);
63+}
64+
65+function syllableSearchValid(search: string, syllables: string[]) {
66+ for (let syllable of syllables) {
67+ let regex = convertSyllableToRegex(search);
68+ if (regex.test(syllable)) {
69+ return true;
70+ }
71+ };
72+ return false;
73+}
74+
75+function prefixSearchValid(prefixSearch: string) {
76+ return syllableSearchValid(prefixSearch, prefixes);
77+}
78+
79+function suffixSearchValid(search: string) {
80+ return syllableSearchValid(search, suffixes);
81+}
82+
83+export function validateId(patp: string): string[] {
84+ let problems = [];
85+ patp = patp.toLowerCase();
86+ patp = stripTilde(patp);
87+
88+ // Validate patp is not empty
89+ if (patp.length === 0) {
90+ problems.push(emptyPatpMessage);
91+ return problems;
92+ }
93+
94+ // Validate all characters are legal
95+ let illegalChars = patp.match(illegalCharsRegex);
96+ if (illegalChars) {
97+ problems.push(illegalCharsMessage(illegalChars));
98+ }
99+
100+ // Validate word lengths
101+ let words = splitIdIntoWords(patp);
102+ if (words.length > 1) {
103+ let wrongLengthWords = [];
104+ let emptyWords = false;
105+ for (let word of words) {
106+ if (word.length !== 6) {
107+ if (word.length > 0) {
108+ wrongLengthWords.push(word);
109+ } else {
110+ emptyWords = true;
111+ }
112+ }
113+ }
114+ if (wrongLengthWords.length > 0) {
115+ problems.push(multipleWordsLengthMessage(wrongLengthWords));
116+ }
117+ if (emptyWords) {
118+ problems.push(emptyWordsMessage);
119+ }
120+ } else {
121+ let word = words[0];
122+ if (word.length !== 3 && word.length !== 6) {
123+ problems.push(singleWordLengthMessage(word));
124+ }
125+ }
126+
127+ // Validate proper use of separators
128+ if (words.length > 2) {
129+ let manyPartIdRegex = /^(\w+-)+\w+$/;
130+ if (!manyPartIdRegex.test(patp)) {
131+ problems.push(invalidAbbreviations);
132+ }
133+ }
134+
135+ // Don't bother checking syllables if there are already problems
136+ if (problems.length > 0) {
137+ return problems;
138+ }
139+
140+ // Validate valid prefixes and suffixes
141+ let wrongPrefixes = [];
142+ let wrongSuffixes = [];
143+ for (let word of words) {
144+ let prefix = word.substring(0, 3);
145+ let suffix = word.substring(3, 6);
146+ // if galaxy
147+ if (!suffix) {
148+ suffix = prefix;
149+ prefix = null;
150+ }
151+ if (prefix && !prefixSearchValid(prefix)) {
152+ wrongPrefixes.push(prefix);
153+ }
154+ if (suffix && !suffixSearchValid(suffix)) {
155+ wrongSuffixes.push(suffix);
156+ }
157+ }
158+ if (wrongPrefixes.length > 0) {
159+ problems.push(invalidPrefixesMessage(wrongPrefixes));
160+ }
161+ if (wrongSuffixes.length > 0) {
162+ problems.push(invalidSuffixesMessage(wrongSuffixes));
163+ }
164+
165+ return problems;
166+}
ui/src/routes/__layout.sveltedeleted−3
@@ -1,3 +0,0 @@
1−<script>
2− import "../styles/tailwind-output.css";
3−</script>
ui/src/styles/tailwind-output.css+70−7
@@ -430,19 +430,82 @@ Ensure the default browser behavior of the `hidden` attribute.
430430.m-8 {
431431 margin: 2rem;
432432}
433−.m-\[200\] {
434− margin: 200;
433+.mx-8 {
434+ margin-left: 2rem;
435+ margin-right: 2rem;
435436}
436−.m-\[200px\] {
437− margin: 200px;
437+.flex {
438+ display: flex;
438439}
439−.mx-auto {
440− margin-left: auto;
441− margin-right: auto;
440+.h-full {
441+ height: 100%;
442+}
443+.h-screen {
444+ height: 100vh;
445+}
446+.w-full {
447+ width: 100%;
448+}
449+.w-auto {
450+ width: auto;
451+}
452+.max-w-lg {
453+ max-width: 32rem;
454+}
455+.max-w-md {
456+ max-width: 28rem;
457+}
458+.grow {
459+ flex-grow: 1;
460+}
461+.justify-center {
462+ justify-content: center;
463+}
464+.justify-items-center {
465+ justify-items: center;
466+}
467+.rounded-lg {
468+ border-radius: 0.5rem;
469+}
470+.rounded-xl {
471+ border-radius: 0.75rem;
472+}
473+.rounded-2xl {
474+ border-radius: 1rem;
475+}
476+.rounded-full {
477+ border-radius: 9999px;
442478}
443479.border {
444480 border-width: 1px;
445481}
482+.bg-black {
483+ --tw-bg-opacity: 1;
484+ background-color: rgb(0 0 0 / var(--tw-bg-opacity));
485+}
486+.bg-green-400 {
487+ --tw-bg-opacity: 1;
488+ background-color: rgb(74 222 128 / var(--tw-bg-opacity));
489+}
490+.bg-green-600 {
491+ --tw-bg-opacity: 1;
492+ background-color: rgb(22 163 74 / var(--tw-bg-opacity));
493+}
494+.p-4 {
495+ padding: 1rem;
496+}
497+.px-4 {
498+ padding-left: 1rem;
499+ padding-right: 1rem;
500+}
501+.py-2 {
502+ padding-top: 0.5rem;
503+ padding-bottom: 0.5rem;
504+}
505+.px-6 {
506+ padding-left: 1.5rem;
507+ padding-right: 1.5rem;
508+}
446509.outline {
447510 outline-style: solid;
448511}