> & {
+ disableDoctypeFor?: Request['directory'][];
+ };
+
+ export interface Response {
+ /**
+ * Render JSX as static markup. Only static! No state or event handlers are supported.
+ */
+ jsx: (el: ReactElement, addDoctype?: boolean) => Response;
+
+ /**
+ * Render JSX for directory set on req.directory as static markup. Only static! No state or event handlers are supported.
+ */
+ jsxForDirectory: (el: JsxforDirectoryOptions) => Response;
+ }
+}
diff --git a/apps/juxtaposition-ui/src/types/react.d.ts b/apps/juxtaposition-ui/src/types/react.d.ts
new file mode 100644
index 00000000..3dea6957
--- /dev/null
+++ b/apps/juxtaposition-ui/src/types/react.d.ts
@@ -0,0 +1,6 @@
+declare namespace React {
+ export interface DOMAttributes {
+ onclick?: string; // Allow for plain attribute usage of onclick
+ onClick?: never; // make react version made unusable
+ }
+}
diff --git a/apps/juxtaposition-ui/src/util.js b/apps/juxtaposition-ui/src/util.js
index 98a2673e..84d6f0a2 100644
--- a/apps/juxtaposition-ui/src/util.js
+++ b/apps/juxtaposition-ui/src/util.js
@@ -19,6 +19,7 @@ const { NOTIFICATION } = require('@/models/notifications');
const { logger } = require('@/logger');
const { CONTENT } = require('@/models/content');
const { SETTINGS } = require('@/models/settings');
+const { LOGS } = require('@/models/logs');
const { config } = require('@/config');
const communityMap = new HashMap();
const userMap = new HashMap();
@@ -519,6 +520,16 @@ async function getPid(token) {
const user = await this.getUserDataFromToken(token);
return user.pid;
}
+async function createLogEntry(actor, action, target, context, fields) {
+ const newLog = new LOGS({
+ actor: actor,
+ action: action,
+ target: target,
+ context: context,
+ changed_fields: fields
+ });
+ await newLog.save();
+}
module.exports = {
decodeParamPack,
processServiceToken,
@@ -546,5 +557,6 @@ module.exports = {
getUserDataFromPid,
getPid,
create_user,
- INVALID_POST_BODY_REGEX
+ INVALID_POST_BODY_REGEX,
+ createLogEntry
};
diff --git a/apps/juxtaposition-ui/src/webfiles/web/edit_community.ejs b/apps/juxtaposition-ui/src/webfiles/web/edit_community.ejs
index 814aebea..ac490ce1 100644
--- a/apps/juxtaposition-ui/src/webfiles/web/edit_community.ejs
+++ b/apps/juxtaposition-ui/src/webfiles/web/edit_community.ejs
@@ -118,16 +118,16 @@
value="<%= community.app_data %>">
-
+
- checked<% } %>>
diff --git a/apps/juxtaposition-ui/src/webfiles/web/js/web.js b/apps/juxtaposition-ui/src/webfiles/web/js/web.js
index 3ba214b9..fd13a2ba 100644
--- a/apps/juxtaposition-ui/src/webfiles/web/js/web.js
+++ b/apps/juxtaposition-ui/src/webfiles/web/js/web.js
@@ -106,8 +106,14 @@ function initPopupMenus() {
});
popupItemCb(menu.querySelector('[data-action="delete"]'), (item, _ev) => {
const moderator = item.hasAttribute('data-moderator');
- const reason = moderator ? prompt('Provide explanation for removing post:') : '';
+ let reason = '';
+ if (moderator) {
+ reason = prompt('Provide explanation for removing post:');
+ }
+ if (reason == null) {
+ return; // User canceled
+ }
deletePost(post, reason);
});
popupItemCb(menu.querySelector('[data-action="copy"]'), (_item, _ev) => {
diff --git a/apps/juxtaposition-ui/src/webfiles/web/moderate_user.ejs b/apps/juxtaposition-ui/src/webfiles/web/moderate_user.ejs
index f6abd0a4..847826ea 100644
--- a/apps/juxtaposition-ui/src/webfiles/web/moderate_user.ejs
+++ b/apps/juxtaposition-ui/src/webfiles/web/moderate_user.ejs
@@ -140,6 +140,33 @@
+
+
Recent Profile Actions (limit 20)
+
+
+ <% auditLog.forEach(function(log) { %>
+ -
+
+
+
+
+
+ <%= log.context.trim() %>
+
+
+
+ <% }); %>
+
Recently Reported Posts (limit 5)
diff --git a/apps/juxtaposition-ui/src/webfiles/web/new_community.ejs b/apps/juxtaposition-ui/src/webfiles/web/new_community.ejs
index 489b5b68..3629c2d6 100644
--- a/apps/juxtaposition-ui/src/webfiles/web/new_community.ejs
+++ b/apps/juxtaposition-ui/src/webfiles/web/new_community.ejs
@@ -118,15 +118,15 @@
value="">
diff --git a/apps/juxtaposition-ui/tsconfig.json b/apps/juxtaposition-ui/tsconfig.json
index fb826ea9..226b8654 100644
--- a/apps/juxtaposition-ui/tsconfig.json
+++ b/apps/juxtaposition-ui/tsconfig.json
@@ -11,6 +11,7 @@
"outDir": "dist",
"allowJs": true,
"target": "es2022",
+ "jsx": "react-jsx",
"noEmitOnError": true,
"noImplicitAny": true,
"strictPropertyInitialization": true,
diff --git a/apps/juxtaposition-ui/tsup.config.ts b/apps/juxtaposition-ui/tsup.config.ts
index 6ff36112..51faf0a0 100644
--- a/apps/juxtaposition-ui/tsup.config.ts
+++ b/apps/juxtaposition-ui/tsup.config.ts
@@ -6,7 +6,7 @@ import browserslist from 'browserslist-to-esbuild';
export default defineConfig([
/* Main server app (Node) */
{
- entry: ['src/**/*.{js,ts}', '!src/webfiles/**/*.js'],
+ entry: ['src/**/*.{js,ts,tsx,jsx}', '!src/webfiles/**/*.js'],
splitting: false,
sourcemap: true,
platform: 'node',
diff --git a/apps/miiverse-api/package.json b/apps/miiverse-api/package.json
index af75d13d..b8c414d9 100644
--- a/apps/miiverse-api/package.json
+++ b/apps/miiverse-api/package.json
@@ -41,7 +41,7 @@
"zod": "^3.21.4"
},
"devDependencies": {
- "@pretendonetwork/eslint-config": "^0.0.8",
+ "@pretendonetwork/eslint-config": "^0.0.11",
"@types/bmp-js": "^0.1.2",
"@types/express": "^4.17.17",
"@types/fs-extra": "^11.0.1",
diff --git a/package-lock.json b/package-lock.json
index e936b6da..e9d1ce75 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"@neato/config": "^3.0.0",
"@pretendonetwork/grpc": "^2.0.1",
"@repo/grpc-client": "^0.0.0",
+ "classnames": "^2.5.1",
"colors": "^1.4.0",
"connect-redis": "^8.0.1",
"cookie-parser": "^1.4.7",
@@ -47,14 +48,19 @@
"pjax": "^0.2.8",
"pngjs": "^7.0.0",
"prom-client": "^15.1.3",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
"redis": "^4.7.0",
"sharp": "^0.33.5",
"tga": "^1.0.7",
"tsx": "^4.19.3"
},
"devDependencies": {
- "@pretendonetwork/eslint-config": "^0.0.8",
+ "@pretendonetwork/eslint-config": "^0.0.11",
+ "@types/hashmap": "^2.3.4",
"@types/node": "^22.13.8",
+ "@types/react": "^19.1.8",
+ "@types/react-dom": "^19.1.6",
"browserslist": "^4.24.5",
"browserslist-to-esbuild": "^2.1.1",
"ejs-lint": "^2.0.1",
@@ -99,7 +105,7 @@
"zod": "^3.21.4"
},
"devDependencies": {
- "@pretendonetwork/eslint-config": "^0.0.8",
+ "@pretendonetwork/eslint-config": "^0.0.11",
"@types/bmp-js": "^0.1.2",
"@types/express": "^4.17.17",
"@types/fs-extra": "^11.0.1",
@@ -2862,9 +2868,9 @@
}
},
"node_modules/@pretendonetwork/eslint-config": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/@pretendonetwork/eslint-config/-/eslint-config-0.0.8.tgz",
- "integrity": "sha512-UH4f+Ya14l6hXS8CHd+SaTk9w0o8h4UT+igbRkZ7DdW0h6YqfM1xe3K9Oqsb1zouLUrYlDVAzBXKJFTwG6kyzg==",
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/@pretendonetwork/eslint-config/-/eslint-config-0.0.11.tgz",
+ "integrity": "sha512-pjT6hGuEOZl+GLklaM/hMrjHFjtBPgBTkoXFqGhr/YKluxhzNM5Sg4stkX+4eKJ2use/OZwbduI7friif8tbTg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-plugin-eslint-comments": "^4.4.1",
@@ -2872,6 +2878,7 @@
"eslint": "^9.17.0",
"eslint-import-resolver-typescript": "^3.7.0",
"eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-react": "^7.37.5",
"globals": "^15.14.0",
"typescript-eslint": "^8.19.1"
},
@@ -4063,6 +4070,12 @@
"@types/node": "*"
}
},
+ "node_modules/@types/hashmap": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/@types/hashmap/-/hashmap-2.3.4.tgz",
+ "integrity": "sha512-IoFSb7S7cwCM23HcAhUS57DBWPU0dPSF6Wz4M4y0S+B1xgGmM08WOzd1wBldesmZ28jhzRNmXda/FO5uY3tLlw==",
+ "dev": true
+ },
"node_modules/@types/http-errors": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
@@ -4170,6 +4183,24 @@
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
"integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
},
+ "node_modules/@types/react": {
+ "version": "19.1.8",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
+ "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
+ "dev": true,
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz",
+ "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
"node_modules/@types/send": {
"version": "0.17.4",
"resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
@@ -4843,6 +4874,26 @@
"node": ">=8"
}
},
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/array.prototype.findlastindex": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
@@ -4900,6 +4951,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/arraybuffer-to-string": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/arraybuffer-to-string/-/arraybuffer-to-string-1.0.2.tgz",
@@ -5598,6 +5665,11 @@
"resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
"integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA=="
},
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ },
"node_modules/cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -5943,6 +6015,12 @@
"node": ">= 8"
}
},
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
"node_modules/csv-parse": {
"version": "4.16.3",
"resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz",
@@ -6465,6 +6543,33 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
@@ -6831,6 +6936,86 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/eslint-scope": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
@@ -8673,6 +8858,23 @@
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
},
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/jackspeak": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
@@ -8779,6 +8981,12 @@
"integrity": "sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==",
"dev": true
},
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -8868,6 +9076,21 @@
"verror": "1.10.0"
}
},
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/juxtaposition-ui": {
"resolved": "apps/juxtaposition-ui",
"link": true
@@ -9019,6 +9242,18 @@
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="
},
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
"node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
@@ -9958,6 +10193,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/object.fromentries": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
@@ -10943,6 +11193,17 @@
"node": "^16 || ^18 || >=20"
}
},
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
"node_modules/protobufjs": {
"version": "7.5.1",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.1.tgz",
@@ -11128,6 +11389,31 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
"node_modules/read-input": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/read-input/-/read-input-0.3.1.tgz",
@@ -11640,6 +11926,11 @@
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
"integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="
},
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="
+ },
"node_modules/secure-json-parse": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz",
@@ -12198,6 +12489,33 @@
"node": ">=8"
}
},
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/string.prototype.padend": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz",
@@ -12217,6 +12535,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
"node_modules/string.prototype.trim": {
"version": "1.2.10",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
diff --git a/package.json b/package.json
index 2fdd6a83..c71a10aa 100644
--- a/package.json
+++ b/package.json
@@ -7,4 +7,4 @@
"devDependencies": {
"@bufbuild/buf": "^1.54.0"
}
-}
\ No newline at end of file
+}