From fceea36f76e3a6223a3cb29aef103b6cefe58a97 Mon Sep 17 00:00:00 2001 From: "Daniel W. Hieber" Date: Sun, 30 Apr 2023 15:38:29 -0400 Subject: [PATCH] Lexemes: Quick Search (#292) closes #292 --- .github/workflows/tests.yml | 1 + .vscode/launch.json | 17 ++++ assets/images/search.svg | 4 + assets/images/x-circle.svg | 5 + components/Button/Button.less | 1 + middleware/logger.js | 2 +- package-lock.json | 170 +++++++++---------------------- package.json | 4 +- pages/Lexemes/LanguageLexemes.js | 13 ++- pages/Lexemes/Lexemes.hbs | 26 +++++ pages/Lexemes/Lexemes.less | 12 +++ pages/Lexemes/Lexemes.test.js | 47 ++++++++- pages/Lexemes/ProjectLexemes.js | 8 +- services/database.js | 2 +- 14 files changed, 179 insertions(+), 133 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 assets/images/search.svg create mode 100644 assets/images/x-circle.svg create mode 100644 components/Button/Button.less diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 46613ec..4a9a1ae 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,6 +10,7 @@ on: workflow_dispatch: env: + COSMOS_DB_NAME: test COSMOS_ENDPOINT: https://localhost:8081 COSMOS_KEY: C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw== # well-known key for Cosmos DB emulator LOGGING: TRUE diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..70234aa --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\index.js" + } + ] +} \ No newline at end of file diff --git a/assets/images/search.svg b/assets/images/search.svg new file mode 100644 index 0000000..1ba70e0 --- /dev/null +++ b/assets/images/search.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/x-circle.svg b/assets/images/x-circle.svg new file mode 100644 index 0000000..144ce24 --- /dev/null +++ b/assets/images/x-circle.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/components/Button/Button.less b/components/Button/Button.less new file mode 100644 index 0000000..b2487c0 --- /dev/null +++ b/components/Button/Button.less @@ -0,0 +1 @@ +@import 'node_modules/@digitallinguistics/design/components/Button/Button.less'; diff --git a/middleware/logger.js b/middleware/logger.js index 16e9cfa..375f0a3 100644 --- a/middleware/logger.js +++ b/middleware/logger.js @@ -1,7 +1,7 @@ export default function logger(req, res, next) { if (process.env.LOGGING) { - console.info(`${ new Date().toString() }: ${ req.originalUrl }`) + console.info(`${ new Date().toString() }: ${ req.method } ${ req.originalUrl }`) } next() diff --git a/package-lock.json b/package-lock.json index faf55ec..80b0682 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "data-explorer", - "version": "0.5.1", + "version": "0.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "data-explorer", - "version": "0.5.1", + "version": "0.6.0", "license": "MIT", "dependencies": { + "@digitallinguistics/db": "^0.6.0", "cookie-parser": "^1.4.6", "dotenv": "^16.0.3", "express": "^5.0.0-beta.1", @@ -18,8 +19,7 @@ }, "devDependencies": { "@bahmutov/cypress-esbuild-preprocessor": "^2.1.5", - "@digitallinguistics/db": "^0.5.1", - "@digitallinguistics/design": "^0.24.1", + "@digitallinguistics/design": "^0.26.0", "@digitallinguistics/eslint-config": "^0.3.0", "@digitallinguistics/models": "^0.4.1", "@digitallinguistics/stylelint-config": "^0.1.2", @@ -55,7 +55,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dev": true, "dependencies": { "tslib": "^2.2.0" }, @@ -67,7 +66,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", - "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -80,7 +78,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", - "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -101,7 +98,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -115,7 +111,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", - "dev": true, "dependencies": { "tslib": "^2.2.0" }, @@ -127,7 +122,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.1.1.tgz", "integrity": "sha512-A4TBYVQCtHOigFb2ETiiKFDocBoI1Zk2Ui1KpI42aJSIDexF7DHQFpnjonltXAIU/ceH+1fsZAWWgvX6/AKzog==", - "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -140,7 +134,6 @@ "version": "3.17.2", "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.17.2.tgz", "integrity": "sha512-hbmDJ6+NsMcVRH0/fv3NJucSkXxqloe5ePphPf0PSEVIOYlqrYk/hgVT/rNf9t6VAvMfqtR5g+Ncd+ZXVzCN+g==", - "dev": true, "dependencies": { "@azure/core-auth": "^1.3.0", "@azure/core-rest-pipeline": "^1.2.0", @@ -163,7 +156,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz", "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==", - "dev": true, "dependencies": { "tslib": "^2.2.0" }, @@ -355,10 +347,9 @@ } }, "node_modules/@digitallinguistics/db": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@digitallinguistics/db/-/db-0.5.1.tgz", - "integrity": "sha512-OoA0ow28MFv8IUhof6fp3HGX6Lb2YnskcEAvWJ8PlW38o9ukI6B+3sGLxx08Bm7kOuJOiwxhjV+QaY2HrSQG5w==", - "dev": true, + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@digitallinguistics/db/-/db-0.6.0.tgz", + "integrity": "sha512-Zpu69Ly32YDwiUSbk5VweFFiK+iGfv2jxPReclaEQrYilnkAA4IkgB58JUjEALbUl14Gx6DsUGbiPsFBhpAg7g==", "dependencies": { "@azure/cosmos": "^3.17.2", "ajv": "^8.12.0", @@ -374,7 +365,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -389,13 +379,12 @@ "node_modules/@digitallinguistics/db/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/@digitallinguistics/design": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/@digitallinguistics/design/-/design-0.24.1.tgz", - "integrity": "sha512-qOiPJZZLBW0jr5nqvUxFUvvz8pO/8bxZ/ebPdhPchfByqOJi9esGkKgrZqZGmkAGG94B2GrkHztTb+Ugt9siRw==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@digitallinguistics/design/-/design-0.26.0.tgz", + "integrity": "sha512-o/GEUj/EuJk1oAbNpM7dE+XHF0PKCieRi3Z72u9U/AUw6iAsXzz0P/5xMH46aDIGEEkPWg0S3tx0Wo9kLSIzNw==", "dev": true, "engines": { "node": ">= 16.0.0" @@ -942,7 +931,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, "engines": { "node": ">= 10" } @@ -1030,7 +1018,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "dependencies": { "debug": "4" }, @@ -1071,7 +1058,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -1088,7 +1074,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1103,8 +1088,7 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ansi-colors": { "version": "4.1.1", @@ -1208,8 +1192,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "3.0.0", @@ -1279,8 +1262,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -1932,7 +1914,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2199,7 +2180,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2286,7 +2266,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -2987,8 +2966,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.12", @@ -3021,8 +2999,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -3615,7 +3592,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -3643,7 +3619,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -3962,7 +3937,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/isni-utils/-/isni-utils-1.0.1.tgz", "integrity": "sha512-7DIDV6VULI/QeyTD0F7YIFAFPZn3mDOn5w8cn37z7MBUUtOuQr/IPlbwuVhyU1SX4V93KOXjLicJtNIfcme+4Q==", - "dev": true, "engines": { "node": ">=14" } @@ -4002,7 +3976,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -4013,8 +3986,7 @@ "node_modules/jsbi": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", - "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==", - "dev": true + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" }, "node_modules/jsbn": { "version": "0.1.1", @@ -4621,8 +4593,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.3", @@ -4705,8 +4676,7 @@ "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node_modules/node-releases": { "version": "2.0.9", @@ -5294,8 +5264,7 @@ "node_modules/priorityqueuejs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz", - "integrity": "sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==", - "dev": true + "integrity": "sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -5357,7 +5326,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, "engines": { "node": ">=6" } @@ -5633,7 +5601,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5791,7 +5758,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -6673,8 +6639,7 @@ "node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -6754,8 +6719,7 @@ "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" }, "node_modules/universalify": { "version": "2.0.0", @@ -6813,7 +6777,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -6836,7 +6799,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -7081,7 +7043,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dev": true, "requires": { "tslib": "^2.2.0" } @@ -7090,7 +7051,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", - "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -7100,7 +7060,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", - "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -7118,7 +7077,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7131,7 +7089,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", - "dev": true, "requires": { "tslib": "^2.2.0" } @@ -7140,7 +7097,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.1.1.tgz", "integrity": "sha512-A4TBYVQCtHOigFb2ETiiKFDocBoI1Zk2Ui1KpI42aJSIDexF7DHQFpnjonltXAIU/ceH+1fsZAWWgvX6/AKzog==", - "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -7150,7 +7106,6 @@ "version": "3.17.2", "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.17.2.tgz", "integrity": "sha512-hbmDJ6+NsMcVRH0/fv3NJucSkXxqloe5ePphPf0PSEVIOYlqrYk/hgVT/rNf9t6VAvMfqtR5g+Ncd+ZXVzCN+g==", - "dev": true, "requires": { "@azure/core-auth": "^1.3.0", "@azure/core-rest-pipeline": "^1.2.0", @@ -7170,7 +7125,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz", "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==", - "dev": true, "requires": { "tslib": "^2.2.0" } @@ -7323,10 +7277,9 @@ } }, "@digitallinguistics/db": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@digitallinguistics/db/-/db-0.5.1.tgz", - "integrity": "sha512-OoA0ow28MFv8IUhof6fp3HGX6Lb2YnskcEAvWJ8PlW38o9ukI6B+3sGLxx08Bm7kOuJOiwxhjV+QaY2HrSQG5w==", - "dev": true, + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@digitallinguistics/db/-/db-0.6.0.tgz", + "integrity": "sha512-Zpu69Ly32YDwiUSbk5VweFFiK+iGfv2jxPReclaEQrYilnkAA4IkgB58JUjEALbUl14Gx6DsUGbiPsFBhpAg7g==", "requires": { "@azure/cosmos": "^3.17.2", "ajv": "^8.12.0", @@ -7339,7 +7292,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -7350,15 +7302,14 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, "@digitallinguistics/design": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/@digitallinguistics/design/-/design-0.24.1.tgz", - "integrity": "sha512-qOiPJZZLBW0jr5nqvUxFUvvz8pO/8bxZ/ebPdhPchfByqOJi9esGkKgrZqZGmkAGG94B2GrkHztTb+Ugt9siRw==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@digitallinguistics/design/-/design-0.26.0.tgz", + "integrity": "sha512-o/GEUj/EuJk1oAbNpM7dE+XHF0PKCieRi3Z72u9U/AUw6iAsXzz0P/5xMH46aDIGEEkPWg0S3tx0Wo9kLSIzNw==", "dev": true, "requires": {} }, @@ -7658,8 +7609,7 @@ "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" }, "@types/minimist": { "version": "1.2.2", @@ -7733,7 +7683,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "requires": { "debug": "4" } @@ -7764,7 +7713,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "requires": { "ajv": "^8.0.0" }, @@ -7773,7 +7721,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -7784,8 +7731,7 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, @@ -7852,8 +7798,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "3.0.0", @@ -7908,8 +7853,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "at-least-node": { "version": "1.0.0", @@ -8378,7 +8322,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -8586,7 +8529,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -8648,8 +8590,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", @@ -9187,8 +9128,7 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.12", @@ -9217,8 +9157,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -9667,7 +9606,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, "requires": { "@tootallnate/once": "2", "agent-base": "6", @@ -9689,7 +9627,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -9903,8 +9840,7 @@ "isni-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/isni-utils/-/isni-utils-1.0.1.tgz", - "integrity": "sha512-7DIDV6VULI/QeyTD0F7YIFAFPZn3mDOn5w8cn37z7MBUUtOuQr/IPlbwuVhyU1SX4V93KOXjLicJtNIfcme+4Q==", - "dev": true + "integrity": "sha512-7DIDV6VULI/QeyTD0F7YIFAFPZn3mDOn5w8cn37z7MBUUtOuQr/IPlbwuVhyU1SX4V93KOXjLicJtNIfcme+4Q==" }, "isstream": { "version": "0.1.2", @@ -9941,7 +9877,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -9949,8 +9884,7 @@ "jsbi": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", - "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==", - "dev": true + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" }, "jsbn": { "version": "0.1.1", @@ -10414,8 +10348,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { "version": "3.3.3", @@ -10482,8 +10415,7 @@ "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node-releases": { "version": "2.0.9", @@ -10895,8 +10827,7 @@ "priorityqueuejs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz", - "integrity": "sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==", - "dev": true + "integrity": "sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==" }, "proxy-addr": { "version": "2.0.7", @@ -10948,8 +10879,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.3", @@ -11148,8 +11078,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "resolve": { "version": "1.22.0", @@ -11250,8 +11179,7 @@ "semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" }, "semver": { "version": "7.3.5", @@ -11942,8 +11870,7 @@ "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "tunnel-agent": { "version": "0.6.0", @@ -11999,8 +11926,7 @@ "universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" }, "universalify": { "version": "2.0.0", @@ -12033,7 +11959,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -12052,8 +11977,7 @@ "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", diff --git a/package.json b/package.json index a0d7085..7441391 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "unit-tests": "mocha '**/*.unit.js' --bail" }, "dependencies": { - "@digitallinguistics/db": "^0.5.1", + "@digitallinguistics/db": "^0.6.0", "cookie-parser": "^1.4.6", "dotenv": "^16.0.3", "express": "^5.0.0-beta.1", @@ -55,7 +55,7 @@ }, "devDependencies": { "@bahmutov/cypress-esbuild-preprocessor": "^2.1.5", - "@digitallinguistics/design": "^0.24.1", + "@digitallinguistics/design": "^0.26.0", "@digitallinguistics/eslint-config": "^0.3.0", "@digitallinguistics/models": "^0.4.1", "@digitallinguistics/stylelint-config": "^0.1.2", diff --git a/pages/Lexemes/LanguageLexemes.js b/pages/Lexemes/LanguageLexemes.js index 318ceda..0c6d7db 100644 --- a/pages/Lexemes/LanguageLexemes.js +++ b/pages/Lexemes/LanguageLexemes.js @@ -15,7 +15,7 @@ export default async function get(req, res) { if (!language.permissions.public && !res.locals.user) { return res.error(`Unauthenticated`, { - message: `You must be logged in to view this lexeme.`, + message: `You must be logged in to view this language.`, }) } @@ -23,11 +23,17 @@ export default async function get(req, res) { if (!hasPermission) { return res.error(`Unauthorized`, { - message: `You do not have permission to view this lexeme.`, + message: `You do not have permission to view this language.`, }) } - const { data: lexemes } = await db.getLexemes({ language: languageID }) + const { q } = req.query + + if (q) { + var { data: lexemes } = await db.searchLexemes(q, { language: languageID }) + } else { + var { data: lexemes } = await db.getLexemes({ language: languageID }) + } lexemes.sort(compareLemmas) @@ -35,6 +41,7 @@ export default async function get(req, res) { language, lexemes, Lexemes: true, + q, title: `Lexemes`, }) diff --git a/pages/Lexemes/Lexemes.hbs b/pages/Lexemes/Lexemes.hbs index 9b03241..3d8ffea 100644 --- a/pages/Lexemes/Lexemes.hbs +++ b/pages/Lexemes/Lexemes.hbs @@ -48,6 +48,32 @@ + +
diff --git a/pages/Lexemes/Lexemes.less b/pages/Lexemes/Lexemes.less index 24ed199..6726c5a 100644 --- a/pages/Lexemes/Lexemes.less +++ b/pages/Lexemes/Lexemes.less @@ -1,3 +1,5 @@ +@import 'Button/Button.less'; +@import 'BoxInput/BoxInput.less'; @import 'Morphophonemic/Morphophonemic.less'; @import 'Numbered/Numbered.less'; @import 'PageNav/PageNav.less'; @@ -8,6 +10,10 @@ .lexemes-page { + #quicksearch { + flex-grow: 1; + } + .lexemes-table { :is(.date-created, .date-modified) { @@ -20,6 +26,12 @@ } + .search-form { + flex-direction: row; + flex-wrap : wrap; + gap : 0.5em; + } + .table-wrapper { max-inline-size: 100%; overflow-x : auto; diff --git a/pages/Lexemes/Lexemes.test.js b/pages/Lexemes/Lexemes.test.js index 7f4ad47..ce0f7a8 100644 --- a/pages/Lexemes/Lexemes.test.js +++ b/pages/Lexemes/Lexemes.test.js @@ -48,7 +48,7 @@ describe(`Lexemes`, function() { cy.task(`seedOne`, [DATA, lexeme]) cy.visit(`/languages/${ language.id }/lexemes`, { failOnStatusCode: false }) cy.contains(`.page-title`, `401: Unauthenticated`) - cy.contains(`.error-message`, `You must be logged in to view this lexeme.`) + cy.contains(`.error-message`, `You must be logged in to view this language.`) }) @@ -71,7 +71,7 @@ describe(`Lexemes`, function() { cy.setCookie(msAuthCookie, msAuthUser) cy.reload() cy.contains(`.page-title`, `403: Unauthorized`) - cy.contains(`.error-message`, `You do not have permission to view this lexeme.`) + cy.contains(`.error-message`, `You do not have permission to view this language.`) }) @@ -186,6 +186,49 @@ describe(`Lexemes`, function() { }) + it(`search`, function() { + + // SETUP + + const count = 3 + const language = new Language({ id: crypto.randomUUID() }) + + const target = new Lexeme({ + language, + lemma: { + transcription: { + en: `target`, + }, + }, + target: true, + }) + + const distractor = new Lexeme({ + language, + lemma: { + transcription: { + en: `distractor`, + }, + }, + }) + + cy.task(`seedOne`, [METADATA, language]) + cy.task(`seedMany`, [DATA, count, target]) + cy.task(`seedMany`, [DATA, count, distractor]) + + // ACT + + cy.visit(`/languages/${ language.id }/lexemes`) + cy.get(`#quicksearch`).type(`target`) + cy.get(`.search-form button.btn`).click() + cy.get(`tbody`).children().should(`have.length`, count) + cy.get(`.search-form a.btn`).click() + cy.get(`tbody`).children().should(`have.length`, count * 2) + + // ASSERT + + }) + }) describe(`/projects`, function() { diff --git a/pages/Lexemes/ProjectLexemes.js b/pages/Lexemes/ProjectLexemes.js index fd62b16..fa6d699 100644 --- a/pages/Lexemes/ProjectLexemes.js +++ b/pages/Lexemes/ProjectLexemes.js @@ -25,7 +25,13 @@ export default async function get(req, res) { }) } - const { data: lexemes } = await db.getLexemes({ project: projectID }) + const { q } = req.query + + if (q) { + var { data: lexemes } = await db.searchLexemes(q, { project: projectID }) + } else { + var { data: lexemes } = await db.getLexemes({ project: projectID }) + } lexemes.sort(compareLemmas) diff --git a/services/database.js b/services/database.js index a27edf4..9d5cb22 100644 --- a/services/database.js +++ b/services/database.js @@ -1,6 +1,6 @@ import Database from '@digitallinguistics/db' -const dbName = process.env.NODE_ENV === `production` ? `digitallinguistics` : `test` +const dbName = process.env.COSMOS_DB_NAME const endpoint = process.env.COSMOS_ENDPOINT const key = process.env.COSMOS_KEY const db = new Database({ dbName, endpoint, key })