From 6ec9f131ae5c4484a39f53dcd6ac4e520f4c1182 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Mon, 8 Sep 2025 14:35:00 -0400 Subject: [PATCH 01/13] added base level files before testing --- jslib/core/errors/ApiNetworkError.ts | 11 ++ jslib/core/errors/ApiResponseError.ts | 16 +++ jslib/core/errors/BaseError.ts | 12 ++ jslib/core/errors/HttpError.ts | 8 ++ jslib/core/errors/JsonParseError.ts | 11 ++ jslib/core/errors/ValidationError.ts | 9 ++ jslib/core/errors/index.ts | 6 + jslib/core/http/Client.ts | 105 ++++++++++++++++++ jslib/core/http/Query.ts | 70 ++++++++++++ jslib/core/http/index.ts | 2 + jslib/core/index.ts | 2 + .../clients/AcknowledgementClient.ts | 8 ++ jslib/entities/acknowledgement/index.ts | 5 + .../acknowledgement/types/Acknowledgement.ts | 10 ++ jslib/entities/index.ts | 1 + jslib/index.ts | 2 + .../jsx/acknowledgementsIndex.js | 22 ++-- package.json | 7 +- tsconfig.json | 2 + webpack.config.ts | 1 + 20 files changed, 298 insertions(+), 12 deletions(-) create mode 100644 jslib/core/errors/ApiNetworkError.ts create mode 100644 jslib/core/errors/ApiResponseError.ts create mode 100644 jslib/core/errors/BaseError.ts create mode 100644 jslib/core/errors/HttpError.ts create mode 100644 jslib/core/errors/JsonParseError.ts create mode 100644 jslib/core/errors/ValidationError.ts create mode 100644 jslib/core/errors/index.ts create mode 100644 jslib/core/http/Client.ts create mode 100644 jslib/core/http/Query.ts create mode 100644 jslib/core/http/index.ts create mode 100644 jslib/core/index.ts create mode 100644 jslib/entities/acknowledgement/clients/AcknowledgementClient.ts create mode 100644 jslib/entities/acknowledgement/index.ts create mode 100644 jslib/entities/acknowledgement/types/Acknowledgement.ts create mode 100644 jslib/entities/index.ts create mode 100644 jslib/index.ts diff --git a/jslib/core/errors/ApiNetworkError.ts b/jslib/core/errors/ApiNetworkError.ts new file mode 100644 index 00000000000..08242e598b1 --- /dev/null +++ b/jslib/core/errors/ApiNetworkError.ts @@ -0,0 +1,11 @@ +import { HttpError } from './HttpError'; + +/** + * Error thrown for network-level issues (e.g., no internet connection, DNS failure). + */ +export class ApiNetworkError extends HttpError { + constructor(message?: string) { + super(message || 'Network error occurred during API call.'); + this.name = 'APINetworkError'; + } +} diff --git a/jslib/core/errors/ApiResponseError.ts b/jslib/core/errors/ApiResponseError.ts new file mode 100644 index 00000000000..12c0dafd5d7 --- /dev/null +++ b/jslib/core/errors/ApiResponseError.ts @@ -0,0 +1,16 @@ +import { HttpError } from './HttpError'; + +/** + * Error thrown for non-2xx HTTP responses from the API. + * It includes the raw Response object for additional context. + */ +export class ApiResponseError extends HttpError { + public readonly response: Response; + + constructor(response: Response, request: Request, message?: string) { + // The message can now be constructed dynamically + super(message || `Request to ${request.url} failed with status code ${response.status}.`); + this.name = 'ApiResponseError'; + this.response = response; + } +} diff --git a/jslib/core/errors/BaseError.ts b/jslib/core/errors/BaseError.ts new file mode 100644 index 00000000000..f47a077b078 --- /dev/null +++ b/jslib/core/errors/BaseError.ts @@ -0,0 +1,12 @@ +/** + * Base class for all custom API-related errors. + */ +export class BaseError extends Error { + public name: string; + + constructor(message?: string) { + super(message); + this.name = 'BaseError'; + Object.setPrototypeOf(this, new.target.prototype); + } +} diff --git a/jslib/core/errors/HttpError.ts b/jslib/core/errors/HttpError.ts new file mode 100644 index 00000000000..13c519d4c6c --- /dev/null +++ b/jslib/core/errors/HttpError.ts @@ -0,0 +1,8 @@ +import { BaseError } from './BaseError'; + +export class HttpError extends BaseError { + constructor(message: string) { + super(message); + this.name = 'HttpError'; + } +} diff --git a/jslib/core/errors/JsonParseError.ts b/jslib/core/errors/JsonParseError.ts new file mode 100644 index 00000000000..121d2553c9d --- /dev/null +++ b/jslib/core/errors/JsonParseError.ts @@ -0,0 +1,11 @@ +import { BaseError } from './BaseError'; + +/** + * Error thrown when a JSON response cannot be parsed. + */ +export class JsonParseError extends BaseError { + constructor(message?: string) { + super(message || 'The server returned an invalid JSON response.'); + this.name = 'JsonParseError'; + } +} diff --git a/jslib/core/errors/ValidationError.ts b/jslib/core/errors/ValidationError.ts new file mode 100644 index 00000000000..c695b5daff4 --- /dev/null +++ b/jslib/core/errors/ValidationError.ts @@ -0,0 +1,9 @@ +import { BaseError } from './BaseError'; + +export class ValidationError extends BaseError { + constructor(message?: string) { + super(message); + this.name = 'ValidationError'; + Object.setPrototypeOf(this, new.target.prototype); + } +} diff --git a/jslib/core/errors/index.ts b/jslib/core/errors/index.ts new file mode 100644 index 00000000000..9f7ce11e352 --- /dev/null +++ b/jslib/core/errors/index.ts @@ -0,0 +1,6 @@ +export { BaseError as Base } from "./BaseError"; +export { HttpError as Http } from "./HttpError"; +export { ValidationError as Validation } from "./ValidationError"; +export { ApiNetworkError as ApiNetwork } from "./ApiNetworkError"; +export { ApiResponseError as ApiResponse } from "./ApiResponseError"; +export { JsonParseError as JsonParse } from "./JsonParseError"; diff --git a/jslib/core/http/Client.ts b/jslib/core/http/Client.ts new file mode 100644 index 00000000000..04228e7124a --- /dev/null +++ b/jslib/core/http/Client.ts @@ -0,0 +1,105 @@ +declare const loris: any; +import { Query, QueryParam } from './Query'; +import { Errors } from '../'; + +export interface ErrorContext { + key: string | number; // The key that triggered the custom message (e.g., 'ApiNetworkError' or 404) + request: Request, + response?: Response, +} + +export class Client { + protected baseUrl: string; + protected subEndpoint?: string; + public getCustomMessage: ( + key: string | number, + request: Request, + response?: Response + ) => string | undefined = () => undefined; + + constructor(baseUrl: string) { + this.baseUrl = loris.BaseURL+'/'+baseUrl; + } + + setSubEndpoint(subEndpoint: string): this { + this.subEndpoint = subEndpoint; + return this; + } + + + async get(query?: Query): Promise { + const path = this.subEndpoint ? `${this.baseUrl}/${this.subEndpoint}` : this.baseUrl; + const queryString = query ? query.build() : ''; + const url = queryString ? `${path}?${queryString}` : path; + return this.fetchJSON(url, { + method: "GET", + headers: {"Accept": "application/json"} + }); + } + + async getLabels(...params: QueryParam[]): Promise { + const query = new Query(); + params.forEach(param => query.addParam(param)); + return this.get(query.addField('label')); + } + + async getById(id: string): Promise { + return this.fetchJSON(`${this.baseUrl}/${id}`, { + method: "GET", + headers: {"Accept": "application/json"} + }); + } + + async create(data: T, mapper?: (data: T) => U): Promise { + const payload = mapper ? mapper(data) : data; + return this.fetchJSON(this.baseUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + } + + async update(id: string, data: T): Promise { + return this.fetchJSON(`${this.baseUrl}/${id}`, { + method: "PUT", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify(data), + }); + } + + protected async fetchJSON(url: string, options: RequestInit): Promise { + const request = new Request(url, options); + try { + const response = await fetch(url, options); + + // 1. Handle HTTP status errors (e.g., 404, 500) + if (!response.ok) { + const customMessage = this.getCustomMessage(response.status, request, response); + throw new Errors.ApiResponse(response, request, customMessage); + } + + // Handle responses with no content + const contentType = response.headers.get("content-type"); + if (!contentType || !contentType.includes("application/json")) { + return null as U; + } + + // 2. Handle JSON parsing errors + try { + const data = await response.json(); + return data as U; + } catch (e) { + const customMessage = this.getCustomMessage('JsonParseError', request); + throw new Errors.JsonParse(customMessage); + } + + } catch (error) { + // 3. Handle network errors (e.g., no internet) + if (error instanceof Errors.Http) { + throw error; // Re-throw our custom errors + } + const customMessage = this.getCustomMessage('ApiNetworkError', request); + throw new Errors.ApiNetwork(customMessage); + } + } +} diff --git a/jslib/core/http/Query.ts b/jslib/core/http/Query.ts new file mode 100644 index 00000000000..027813d1b7c --- /dev/null +++ b/jslib/core/http/Query.ts @@ -0,0 +1,70 @@ +export enum Operator { + Equals = '=', + NotEquals = '!=', + LessThan = '<', + GreaterThan = '>', + LessThanOrEqual = '<=', + GreaterThanOrEqual = '>=', + Like = 'like', + Includes = 'in' +} + +export interface QueryParam { + field: string, + value: string, + operator: Operator +} + +export class Query { + private params: Record = {}; + + addParam({ + field, + value, + operator = Operator.Equals + }: QueryParam): this { + const encodedField = encodeURIComponent(field); + const encodedValue = encodeURIComponent(value); + this.params[`${encodedField}${this.getOperatorSuffix(operator)}`] = encodedValue; + return this; + } + + addField(field: string): this { + const encodedField = encodeURIComponent(field); + this.params['fields'] = this.params['fields'] ? `${this.params['fields']},${encodedField}` : encodedField; + return this; + } + + addLimit(limit: number): this { + this.params['limit'] = limit.toString(); + return this; + } + + addOffset(offset: number): this { + this.params['offset'] = offset.toString(); + return this; + } + + addSort(field: string, direction: 'asc' | 'desc'): this { + const encodedField = encodeURIComponent(field); + this.params['sort'] = `${encodedField}:${direction}`; + return this; + } + + build(): string { + return new URLSearchParams(this.params).toString(); + } + + private getOperatorSuffix(operator: Operator): string { + switch (operator) { + case Operator.Equals: return ''; + case Operator.NotEquals: return '!='; + case Operator.LessThan: return '<'; + case Operator.GreaterThan: return '>'; + case Operator.LessThanOrEqual: return '<='; + case Operator.GreaterThanOrEqual: return '>='; + case Operator.Like: return '_like'; + default: return ''; + } + } +} diff --git a/jslib/core/http/index.ts b/jslib/core/http/index.ts new file mode 100644 index 00000000000..d25b3cc1e3b --- /dev/null +++ b/jslib/core/http/index.ts @@ -0,0 +1,2 @@ +export { Client } from "./Client"; +export { Query, QueryParam } from "./Query"; diff --git a/jslib/core/index.ts b/jslib/core/index.ts new file mode 100644 index 00000000000..5a96efd9a5f --- /dev/null +++ b/jslib/core/index.ts @@ -0,0 +1,2 @@ +export * as Errors from "./errors"; +export * as Http from "./http"; diff --git a/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts b/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts new file mode 100644 index 00000000000..8435340b2c0 --- /dev/null +++ b/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts @@ -0,0 +1,8 @@ +import { Acknowledgement } from '../../'; +import { Http } from 'jsx/../jslib/core'; + +export class AcknowledgementClient extends Http.Client { + constructor() { + super('/acknowledgements'); + } +} diff --git a/jslib/entities/acknowledgement/index.ts b/jslib/entities/acknowledgement/index.ts new file mode 100644 index 00000000000..77c329f3664 --- /dev/null +++ b/jslib/entities/acknowledgement/index.ts @@ -0,0 +1,5 @@ +// Types +export { Acknowledgement as Type } from "./types/Acknowledgement"; + +// Clients +export { AcknowledgementClient as Client } from "./clients/AcknowledgementClient"; diff --git a/jslib/entities/acknowledgement/types/Acknowledgement.ts b/jslib/entities/acknowledgement/types/Acknowledgement.ts new file mode 100644 index 00000000000..c608299df73 --- /dev/null +++ b/jslib/entities/acknowledgement/types/Acknowledgement.ts @@ -0,0 +1,10 @@ +export interface Acknowledgement { + ordering: number, + fullName: string, + citationName: string, + affiliations: string, + degrees: string, + roles: string, + startDate: string, // to be converted to Date object when possible + endDate: string, // to be converted to Date object when possible +}; diff --git a/jslib/entities/index.ts b/jslib/entities/index.ts new file mode 100644 index 00000000000..d6e73be5eba --- /dev/null +++ b/jslib/entities/index.ts @@ -0,0 +1 @@ +export * as Acknowledgement from './acknowledgement'; diff --git a/jslib/index.ts b/jslib/index.ts new file mode 100644 index 00000000000..cd8a121a57c --- /dev/null +++ b/jslib/index.ts @@ -0,0 +1,2 @@ +export * as Core from './core'; +export * as Entities from './entities'; diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 3ef2883b9ec..139823e20b9 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -17,6 +17,8 @@ import { DateElement, ButtonElement, } from 'jsx/Form'; +import { Acknowledgement } from 'jslib/entities' +import { Query } from 'jslib/core' /** * Acknowledgements Module page. @@ -103,14 +105,16 @@ class AcknowledgementsIndex extends Component { * * @return {object} */ - fetchData() { - return fetch(this.props.dataURL, {credentials: 'same-origin'}) - .then((resp) => resp.json()) - .then((data) => this.setState({data})) - .catch((error) => { - this.setState({error: true}); - console.error(error); - }); + async fetchData() { + const query = new Query().addParam({field: 'form', value: 'json'}); + const client = new Acknowledgement.Client(); + try { + const acknowledgements = await client.get(query); + this.setState({acknowledgements}); + } catch (error) { + this.setState({error: true}); + console.error(error); + } } /** @@ -477,7 +481,6 @@ class AcknowledgementsIndex extends Component { } AcknowledgementsIndex.propTypes = { - dataURL: PropTypes.string.isRequired, submitURL: PropTypes.string.isRequired, hasPermission: PropTypes.func.isRequired, }; @@ -491,7 +494,6 @@ window.addEventListener('load', () => { document.getElementById('lorisworkspace') ).render( diff --git a/package.json b/package.json index 29563b01830..c812b9fd9e6 100644 --- a/package.json +++ b/package.json @@ -17,17 +17,20 @@ "jstat": "^1.9.5", "jszip": "^3.10.1", "papaparse": "^5.3.0", + "pbkdf2": "^3.1.3", "prop-types": "^15.7.2", "react": "^18.2.0", "react-addons-create-fragment": "^15.6.2", - "react-router-dom": "^5.3.4", "react-dom": "^18.2.0", "react-i18next": "^15.4.1", "react-markdown": "^5.0.2", + "react-router-dom": "^5.3.4", "react-select": "^5.7.0", + "stream-browserify": "^3.0.0", "style-loader": "^1.1.3", "swagger-ui-dist": "^4.1.3", - "sweetalert2": "^8.18.6" + "sweetalert2": "^8.18.6", + "transliteration": "^2.3.5" }, "devDependencies": { "@babel/cli": "^7.6.4", diff --git a/tsconfig.json b/tsconfig.json index 86af508d2d1..6470824cd08 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,8 @@ "moduleResolution": "nodenext", "baseUrl": ".", "paths": { + "core/*": ["jslib/core/*"], + "entities/*": ["jslib/entity/*"], "*": ["*", "jsx/*"] }, "sourceMap": true, diff --git a/webpack.config.ts b/webpack.config.ts index 172e3b5f2a5..e042b3deabf 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -157,6 +157,7 @@ const resolve: webpack.ResolveOptions = { fallback: { fs: false, path: false, + stream: require.resolve("stream-browserify"), }, }; From 0915473cc2c9e1a0c039eca9c11e5cf5e685acef Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Mon, 8 Sep 2025 14:35:33 -0400 Subject: [PATCH 02/13] added package lock --- package-lock.json | 620 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 589 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20f1ab04e70..39b05be67b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "jstat": "^1.9.5", "jszip": "^3.10.1", "papaparse": "^5.3.0", + "pbkdf2": "^3.1.3", "prop-types": "^15.7.2", "react": "^18.2.0", "react-addons-create-fragment": "^15.6.2", @@ -28,9 +29,11 @@ "react-markdown": "^5.0.2", "react-router-dom": "^5.3.4", "react-select": "^5.7.0", + "stream-browserify": "^3.0.0", "style-loader": "^1.1.3", "swagger-ui-dist": "^4.1.3", - "sweetalert2": "^8.18.6" + "sweetalert2": "^8.18.6", + "transliteration": "^2.3.5" }, "devDependencies": { "@babel/cli": "^7.6.4", @@ -3572,7 +3575,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3704,6 +3706,20 @@ "node": ">= 4.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-loader": { "version": "8.2.5", "dev": true, @@ -4066,12 +4082,44 @@ } }, "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4248,6 +4296,37 @@ "node": ">=8" } }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cipher-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/cli-boxes": { "version": "3.0.0", "dev": true, @@ -4259,6 +4338,65 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "dev": true, @@ -4519,6 +4657,30 @@ "node": ">= 6" } }, + "node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -5022,6 +5184,22 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { "version": "1.1.4", "dev": true, @@ -5152,6 +5330,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -5169,7 +5360,6 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "dev": true, "license": "MIT" }, "node_modules/emojis-list": { @@ -5304,11 +5494,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "dev": true, @@ -6061,6 +6278,20 @@ "dev": true, "license": "ISC" }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/form-data-encoder": { "version": "2.1.4", "dev": true, @@ -6120,8 +6351,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -6160,19 +6395,49 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "dev": true, - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "dev": true, @@ -6387,6 +6652,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "12.5.3", "dev": true, @@ -6450,20 +6726,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "dev": true, - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -6472,11 +6748,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -6496,6 +6772,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-embedded": { "version": "2.0.0", "dev": true, @@ -7063,7 +7358,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7130,7 +7424,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7310,6 +7603,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "dev": true, @@ -7719,6 +8026,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-add-list-metadata": { "version": "1.0.1", "license": "MIT", @@ -9484,6 +9799,41 @@ "through": "~2.3" } }, + "node_modules/pbkdf2": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "dependencies": { + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pbkdf2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -9526,6 +9876,14 @@ "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "dev": true, @@ -10617,6 +10975,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "license": "MIT", @@ -10793,6 +11159,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ @@ -10918,10 +11293,64 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "license": "MIT" }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sha.js/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -11232,6 +11661,28 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/stream-combiner": { "version": "0.0.4", "dev": true, @@ -11249,7 +11700,6 @@ }, "node_modules/string-width": { "version": "4.2.3", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -11319,7 +11769,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -11601,6 +12050,43 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/to-buffer/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11625,6 +12111,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/transliteration": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.3.5.tgz", + "integrity": "sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==", + "dependencies": { + "yargs": "^17.5.1" + }, + "bin": { + "slugify": "dist/bin/slugify", + "transliterate": "dist/bin/transliterate" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/trim-newlines": { "version": "4.0.2", "dev": true, @@ -11847,6 +12348,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/typedarray": { "version": "0.0.6", "dev": true, @@ -12890,6 +13404,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "4.0.1", "dev": true, @@ -13070,6 +13604,14 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "dev": true, @@ -13083,9 +13625,25 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/yargs-parser": { "version": "21.1.1", - "dev": true, "license": "ISC", "engines": { "node": ">=12" From 70f26fa939ac9466ad86499727103eed6bc7e838 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Wed, 8 Oct 2025 09:39:42 -0400 Subject: [PATCH 03/13] fixing fan --- jslib/core/errors/ApiNetworkError.ts | 6 +- jslib/core/errors/ApiResponseError.ts | 14 ++- jslib/core/errors/BaseError.ts | 8 +- jslib/core/errors/HttpError.ts | 9 +- jslib/core/errors/JsonParseError.ts | 8 +- jslib/core/errors/ValidationError.ts | 9 +- jslib/core/errors/index.ts | 12 +-- jslib/core/http/Client.ts | 95 ++++++++++++++----- jslib/core/http/Query.ts | 67 ++++++++++--- jslib/core/http/index.ts | 4 +- jslib/core/index.ts | 4 +- .../clients/AcknowledgementClient.ts | 10 +- jslib/entities/acknowledgement/index.ts | 4 +- .../acknowledgement/types/Acknowledgement.ts | 12 +-- jslib/index.ts | 4 +- .../jsx/acknowledgementsIndex.js | 4 +- 16 files changed, 201 insertions(+), 69 deletions(-) diff --git a/jslib/core/errors/ApiNetworkError.ts b/jslib/core/errors/ApiNetworkError.ts index 08242e598b1..5f0725e6f8a 100644 --- a/jslib/core/errors/ApiNetworkError.ts +++ b/jslib/core/errors/ApiNetworkError.ts @@ -1,9 +1,13 @@ -import { HttpError } from './HttpError'; +import {HttpError} from './HttpError'; /** * Error thrown for network-level issues (e.g., no internet connection, DNS failure). */ export class ApiNetworkError extends HttpError { + /** + * + * @param message The error message. + */ constructor(message?: string) { super(message || 'Network error occurred during API call.'); this.name = 'APINetworkError'; diff --git a/jslib/core/errors/ApiResponseError.ts b/jslib/core/errors/ApiResponseError.ts index 12c0dafd5d7..8213dda7e48 100644 --- a/jslib/core/errors/ApiResponseError.ts +++ b/jslib/core/errors/ApiResponseError.ts @@ -1,4 +1,4 @@ -import { HttpError } from './HttpError'; +import {HttpError} from './HttpError'; /** * Error thrown for non-2xx HTTP responses from the API. @@ -7,9 +7,17 @@ import { HttpError } from './HttpError'; export class ApiResponseError extends HttpError { public readonly response: Response; + /** + * + * @param response The raw HTTP Response object. + * @param request The Request object that generated the error. + * @param message The error message. + */ constructor(response: Response, request: Request, message?: string) { - // The message can now be constructed dynamically - super(message || `Request to ${request.url} failed with status code ${response.status}.`); + super( + message || + `Request to ${request.url} failed with status code ${response.status}.` + ); this.name = 'ApiResponseError'; this.response = response; } diff --git a/jslib/core/errors/BaseError.ts b/jslib/core/errors/BaseError.ts index f47a077b078..1efc0c27779 100644 --- a/jslib/core/errors/BaseError.ts +++ b/jslib/core/errors/BaseError.ts @@ -2,11 +2,13 @@ * Base class for all custom API-related errors. */ export class BaseError extends Error { - public name: string; - + /** + * + * @param message The error message. + */ constructor(message?: string) { super(message); - this.name = 'BaseError'; + this.name = 'BaseError'; Object.setPrototypeOf(this, new.target.prototype); } } diff --git a/jslib/core/errors/HttpError.ts b/jslib/core/errors/HttpError.ts index 13c519d4c6c..4a73175e2cf 100644 --- a/jslib/core/errors/HttpError.ts +++ b/jslib/core/errors/HttpError.ts @@ -1,6 +1,13 @@ -import { BaseError } from './BaseError'; +import {BaseError} from './BaseError'; +/** + * Base class for HTTP-related errors. + */ export class HttpError extends BaseError { + /** + * + * @param message The error message. + */ constructor(message: string) { super(message); this.name = 'HttpError'; diff --git a/jslib/core/errors/JsonParseError.ts b/jslib/core/errors/JsonParseError.ts index 121d2553c9d..629e2d4636d 100644 --- a/jslib/core/errors/JsonParseError.ts +++ b/jslib/core/errors/JsonParseError.ts @@ -1,9 +1,13 @@ -import { BaseError } from './BaseError'; +import {BaseError} from './BaseError'; /** - * Error thrown when a JSON response cannot be parsed. + * Error thrown when a JSON response from the server cannot be parsed. */ export class JsonParseError extends BaseError { + /** + * + * @param message The error message. + */ constructor(message?: string) { super(message || 'The server returned an invalid JSON response.'); this.name = 'JsonParseError'; diff --git a/jslib/core/errors/ValidationError.ts b/jslib/core/errors/ValidationError.ts index c695b5daff4..59c6668ea7b 100644 --- a/jslib/core/errors/ValidationError.ts +++ b/jslib/core/errors/ValidationError.ts @@ -1,6 +1,13 @@ -import { BaseError } from './BaseError'; +import {BaseError} from './BaseError'; +/** + * Error thrown when data validation fails. + */ export class ValidationError extends BaseError { + /** + * + * @param message The error message. + */ constructor(message?: string) { super(message); this.name = 'ValidationError'; diff --git a/jslib/core/errors/index.ts b/jslib/core/errors/index.ts index 9f7ce11e352..624ad952c4c 100644 --- a/jslib/core/errors/index.ts +++ b/jslib/core/errors/index.ts @@ -1,6 +1,6 @@ -export { BaseError as Base } from "./BaseError"; -export { HttpError as Http } from "./HttpError"; -export { ValidationError as Validation } from "./ValidationError"; -export { ApiNetworkError as ApiNetwork } from "./ApiNetworkError"; -export { ApiResponseError as ApiResponse } from "./ApiResponseError"; -export { JsonParseError as JsonParse } from "./JsonParseError"; +export {BaseError as Base} from './BaseError'; +export {HttpError as Http} from './HttpError'; +export {ValidationError as Validation} from './ValidationError'; +export {ApiNetworkError as ApiNetwork} from './ApiNetworkError'; +export {ApiResponseError as ApiResponse} from './ApiResponseError'; +export {JsonParseError as JsonParse} from './JsonParseError'; diff --git a/jslib/core/http/Client.ts b/jslib/core/http/Client.ts index 04228e7124a..5afefabebd5 100644 --- a/jslib/core/http/Client.ts +++ b/jslib/core/http/Client.ts @@ -1,6 +1,6 @@ declare const loris: any; -import { Query, QueryParam } from './Query'; -import { Errors } from '../'; +import {Query, QueryParam} from './Query'; +import {Errors} from '../'; export interface ErrorContext { key: string | number; // The key that triggered the custom message (e.g., 'ApiNetworkError' or 404) @@ -8,79 +8,129 @@ export interface ErrorContext { response?: Response, } +/** + * A basic client for making HTTP requests to a REST API endpoint. + */ export class Client { protected baseUrl: string; protected subEndpoint?: string; - public getCustomMessage: ( + /** + * Function to retrieve a custom error message for a given error context. + */ + public getMessage: ( key: string | number, request: Request, response?: Response ) => string | undefined = () => undefined; + /** + * Creates a new API client instance. + * + * @param baseUrl The base URL for the API requests. + */ constructor(baseUrl: string) { this.baseUrl = loris.BaseURL+'/'+baseUrl; } + /** + * Sets an optional sub-endpoint path. + * + * @param subEndpoint An optional endpoint segment to append to the baseUrl. + */ setSubEndpoint(subEndpoint: string): this { this.subEndpoint = subEndpoint; return this; } + /** + * Fetches a collection of resources. + * + * @param query A Query object to build the URL query string. + */ async get(query?: Query): Promise { - const path = this.subEndpoint ? `${this.baseUrl}/${this.subEndpoint}` : this.baseUrl; + const path = this.subEndpoint ? + `${this.baseUrl}/${this.subEndpoint}` : this.baseUrl; const queryString = query ? query.build() : ''; const url = queryString ? `${path}?${queryString}` : path; return this.fetchJSON(url, { - method: "GET", - headers: {"Accept": "application/json"} + method: 'GET', + headers: {'Accept': 'application/json'}, }); } + /** + * Fetches a list of unique labels for the resource type based on query parameters. + * + * @param {...QueryParam} params One or more QueryParam objects to filter the labels. + */ async getLabels(...params: QueryParam[]): Promise { const query = new Query(); - params.forEach(param => query.addParam(param)); + params.forEach((param) => query.addParam(param)); return this.get(query.addField('label')); } + /** + * Fetches a single resource by its ID. + * + * @param id The unique identifier of the resource to fetch. + */ async getById(id: string): Promise { return this.fetchJSON(`${this.baseUrl}/${id}`, { - method: "GET", - headers: {"Accept": "application/json"} + method: 'GET', + headers: {'Accept': 'application/json'}, }); } + /** + * Creates a new resource on the server. + * + * @param data The resource data to be created. + * @param mapper An optional function to map the input data before sending. + */ async create(data: T, mapper?: (data: T) => U): Promise { const payload = mapper ? mapper(data) : data; return this.fetchJSON(this.baseUrl, { - method: "POST", - headers: { "Content-Type": "application/json" }, + method: 'POST', + headers: {'Content-Type': 'application/json'}, body: JSON.stringify(payload), }); } + /** + * Updates an existing resource on the server. + * + * @param id The unique identifier of the resource to update. + * @param data The new resource data. + */ async update(id: string, data: T): Promise { return this.fetchJSON(`${this.baseUrl}/${id}`, { - method: "PUT", - headers: {"Content-Type": "application/json"}, + method: 'PUT', + headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), }); } + /** + * Handles the actual fetching and JSON parsing, including error handling. + * + * @param url The URL to which the request will be made. + * @param options The Fetch API request initialization options. + */ protected async fetchJSON(url: string, options: RequestInit): Promise { - const request = new Request(url, options); + const request = new Request(url, options); try { const response = await fetch(url, options); // 1. Handle HTTP status errors (e.g., 404, 500) if (!response.ok) { - const customMessage = this.getCustomMessage(response.status, request, response); - throw new Errors.ApiResponse(response, request, customMessage); + const message = this.getMessage(response.status, request, response); + throw new Errors.ApiResponse(response, request, message); } // Handle responses with no content - const contentType = response.headers.get("content-type"); - if (!contentType || !contentType.includes("application/json")) { + const contentType = response.headers.get('content-type'); + if (!contentType || !contentType.includes('application/json')) { return null as U; } @@ -89,17 +139,16 @@ export class Client { const data = await response.json(); return data as U; } catch (e) { - const customMessage = this.getCustomMessage('JsonParseError', request); - throw new Errors.JsonParse(customMessage); + const message = this.getMessage('JsonParseError', request); + throw new Errors.JsonParse(message); } - } catch (error) { // 3. Handle network errors (e.g., no internet) if (error instanceof Errors.Http) { throw error; // Re-throw our custom errors } - const customMessage = this.getCustomMessage('ApiNetworkError', request); - throw new Errors.ApiNetwork(customMessage); + const message = this.getMessage('ApiNetworkError', request); + throw new Errors.ApiNetwork(message); } } } diff --git a/jslib/core/http/Query.ts b/jslib/core/http/Query.ts index 027813d1b7c..357b66e4d1a 100644 --- a/jslib/core/http/Query.ts +++ b/jslib/core/http/Query.ts @@ -15,56 +15,101 @@ export interface QueryParam { operator: Operator } +/** + * Utility class to build URL query strings for API requests. + */ export class Query { private params: Record = {}; + /** + * Adds a filter parameter to the query string. + * + * @param root0 The destructured QueryParam object. + * @param root0.field The field to filter on. + * @param root0.value The value to filter against. + * @param root0.operator The comparison operator to use. + */ addParam({ field, value, - operator = Operator.Equals + operator = Operator.Equals, }: QueryParam): this { const encodedField = encodeURIComponent(field); const encodedValue = encodeURIComponent(value); - this.params[`${encodedField}${this.getOperatorSuffix(operator)}`] = encodedValue; + const operatorSuffix = this.getOperatorSuffix(operator); + this.params[`${encodedField}${operatorSuffix}`] = encodedValue; return this; } + /** + * Adds a field to the 'fields' selection parameter. + * + * @param field The field to include in the response payload. + */ addField(field: string): this { const encodedField = encodeURIComponent(field); - this.params['fields'] = this.params['fields'] ? `${this.params['fields']},${encodedField}` : encodedField; + if (this.params['fields']) { + this.params['fields'] = `${this.params['fields']},${encodedField}`; + } else { + this.params['fields'] = encodedField; + } return this; } + /** + * Sets the maximum number of results to return. + * + * @param limit The maximum number of results to return. + */ addLimit(limit: number): this { this.params['limit'] = limit.toString(); return this; } + /** + * Sets the offset for pagination. + * + * @param offset The number of results to skip for pagination. + */ addOffset(offset: number): this { this.params['offset'] = offset.toString(); return this; } + /** + * Sets the sorting field and direction. + * + * @param field The field to sort the results by. + * @param direction The sort direction. + */ addSort(field: string, direction: 'asc' | 'desc'): this { const encodedField = encodeURIComponent(field); this.params['sort'] = `${encodedField}:${direction}`; return this; } + /** + * Builds and returns the final URL search string. + */ build(): string { return new URLSearchParams(this.params).toString(); } + /** + * Gets string suffix for a given operator to be used in a query parameter key. + * + * @param operator The comparison operator enum value. + */ private getOperatorSuffix(operator: Operator): string { switch (operator) { - case Operator.Equals: return ''; - case Operator.NotEquals: return '!='; - case Operator.LessThan: return '<'; - case Operator.GreaterThan: return '>'; - case Operator.LessThanOrEqual: return '<='; - case Operator.GreaterThanOrEqual: return '>='; - case Operator.Like: return '_like'; - default: return ''; + case Operator.Equals: return ''; + case Operator.NotEquals: return '!='; + case Operator.LessThan: return '<'; + case Operator.GreaterThan: return '>'; + case Operator.LessThanOrEqual: return '<='; + case Operator.GreaterThanOrEqual: return '>='; + case Operator.Like: return '_like'; + default: return ''; } } } diff --git a/jslib/core/http/index.ts b/jslib/core/http/index.ts index d25b3cc1e3b..35d5d1fda07 100644 --- a/jslib/core/http/index.ts +++ b/jslib/core/http/index.ts @@ -1,2 +1,2 @@ -export { Client } from "./Client"; -export { Query, QueryParam } from "./Query"; +export {Client} from './Client'; +export {Query, QueryParam} from './Query'; diff --git a/jslib/core/index.ts b/jslib/core/index.ts index 5a96efd9a5f..c3c83f23d0e 100644 --- a/jslib/core/index.ts +++ b/jslib/core/index.ts @@ -1,2 +1,2 @@ -export * as Errors from "./errors"; -export * as Http from "./http"; +export * as Errors from './errors'; +export * as Http from './http'; diff --git a/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts b/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts index 8435340b2c0..7cdf422ae56 100644 --- a/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts +++ b/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts @@ -1,7 +1,13 @@ -import { Acknowledgement } from '../../'; -import { Http } from 'jsx/../jslib/core'; +import {Acknowledgement} from '../../'; +import {Http} from 'jsx/../jslib/core'; +/** + * + */ export class AcknowledgementClient extends Http.Client { + /** + * + */ constructor() { super('/acknowledgements'); } diff --git a/jslib/entities/acknowledgement/index.ts b/jslib/entities/acknowledgement/index.ts index 77c329f3664..90f2ff59da5 100644 --- a/jslib/entities/acknowledgement/index.ts +++ b/jslib/entities/acknowledgement/index.ts @@ -1,5 +1,5 @@ // Types -export { Acknowledgement as Type } from "./types/Acknowledgement"; +export {Acknowledgement as Type} from './types/Acknowledgement'; // Clients -export { AcknowledgementClient as Client } from "./clients/AcknowledgementClient"; +export {AcknowledgementClient as Client} from './clients/AcknowledgementClient'; diff --git a/jslib/entities/acknowledgement/types/Acknowledgement.ts b/jslib/entities/acknowledgement/types/Acknowledgement.ts index c608299df73..632f8fd61a0 100644 --- a/jslib/entities/acknowledgement/types/Acknowledgement.ts +++ b/jslib/entities/acknowledgement/types/Acknowledgement.ts @@ -1,10 +1,10 @@ -export interface Acknowledgement { - ordering: number, - fullName: string, - citationName: string, +export interface Acknowledgement { + ordering: number, + fullName: string, + citationName: string, affiliations: string, degrees: string, roles: string, startDate: string, // to be converted to Date object when possible - endDate: string, // to be converted to Date object when possible -}; + endDate: string, // to be converted to Date object when possible +} diff --git a/jslib/index.ts b/jslib/index.ts index cd8a121a57c..8476a12672d 100644 --- a/jslib/index.ts +++ b/jslib/index.ts @@ -1,2 +1,2 @@ -export * as Core from './core'; -export * as Entities from './entities'; +export * as Core from './core'; +export * as Entities from './entities'; diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 139823e20b9..480079324fe 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -17,8 +17,8 @@ import { DateElement, ButtonElement, } from 'jsx/Form'; -import { Acknowledgement } from 'jslib/entities' -import { Query } from 'jslib/core' +import {Acknowledgement} from 'jslib/entities'; +import {Query} from 'jslib/core'; /** * Acknowledgements Module page. From e3a7a1f3301074eb920ba18e4429db409be69358 Mon Sep 17 00:00:00 2001 From: kongtiaowang Date: Sat, 18 Oct 2025 01:54:24 +0800 Subject: [PATCH 04/13] fix --- jslib/core/http/Client.ts | 2 +- .../jsx/acknowledgementsIndex.js | 22 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/jslib/core/http/Client.ts b/jslib/core/http/Client.ts index 5afefabebd5..f28320d248a 100644 --- a/jslib/core/http/Client.ts +++ b/jslib/core/http/Client.ts @@ -29,7 +29,7 @@ export class Client { * @param baseUrl The base URL for the API requests. */ constructor(baseUrl: string) { - this.baseUrl = loris.BaseURL+'/'+baseUrl; + this.baseUrl = loris.BaseURL+'/'+baseUrl+'/'; } /** diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 480079324fe..1e725bb6db9 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -18,7 +18,7 @@ import { ButtonElement, } from 'jsx/Form'; import {Acknowledgement} from 'jslib/entities'; -import {Query} from 'jslib/core'; +import {Query} from 'jslib/core/http'; /** * Acknowledgements Module page. @@ -106,10 +106,11 @@ class AcknowledgementsIndex extends Component { * @return {object} */ async fetchData() { - const query = new Query().addParam({field: 'form', value: 'json'}); + const query = new Query().addParam({field: 'format', value: 'json'}); const client = new Acknowledgement.Client(); try { const acknowledgements = await client.get(query); +console.log({acknowledgements}, { depth: null, colors: true }); this.setState({acknowledgements}); } catch (error) { this.setState({error: true}); @@ -278,7 +279,7 @@ class AcknowledgementsIndex extends Component { title='Citation Policy' >
- {this.state.data.meta.citation_policy} + {this.state.acknowledgements.meta.citation_policy}
); @@ -357,8 +358,8 @@ class AcknowledgementsIndex extends Component { label='Start date' value={this.state.formData.addStartDate} maxYear={this.state.formData.addEndDate - || this.state.data.meta.maxYear} - minYear={this.state.data.meta.minYear} + || this.state.acknowledgements.meta.maxYear} + minYear={this.state.acknowledgements.meta.minYear} required={true} onUserInput={this.setFormData} /> @@ -366,15 +367,15 @@ class AcknowledgementsIndex extends Component { name='addEndDate' label='End date' value={this.state.formData.addEndDate} - maxYear={this.state.data.meta.maxYear} + maxYear={this.state.acknowledgements.meta.maxYear} minYear={this.state.formData.addStartDate - || this.state.data.meta.minYear} + || this.state.acknowledgements.meta.minYear} required={false} onUserInput={this.setFormData} /> { document.getElementById('lorisworkspace') ).render( From 57cec4337a26b2735d0a1709386c21011d080903 Mon Sep 17 00:00:00 2001 From: kongtiaowang Date: Sat, 18 Oct 2025 01:56:03 +0800 Subject: [PATCH 05/13] fix 2 --- modules/acknowledgements/jsx/acknowledgementsIndex.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 1e725bb6db9..8ba3351507d 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -495,7 +495,6 @@ window.addEventListener('load', () => { document.getElementById('lorisworkspace') ).render( From 98e382b37fc628e4155c377459a5574535d66c55 Mon Sep 17 00:00:00 2001 From: kongtiaowang Date: Sat, 18 Oct 2025 02:01:21 +0800 Subject: [PATCH 06/13] fix 3 --- modules/acknowledgements/jsx/acknowledgementsIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 8ba3351507d..0b39916b4e9 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -110,7 +110,7 @@ class AcknowledgementsIndex extends Component { const client = new Acknowledgement.Client(); try { const acknowledgements = await client.get(query); -console.log({acknowledgements}, { depth: null, colors: true }); + console.log({acknowledgements}, {depth: null, colors: true}); this.setState({acknowledgements}); } catch (error) { this.setState({error: true}); From 927d0f436c579276fc794f4a335f7e88e27f171f Mon Sep 17 00:00:00 2001 From: kongtiaowang Date: Mon, 20 Oct 2025 10:59:22 +0800 Subject: [PATCH 07/13] fix-add data:acknowledgements --- .../jsx/acknowledgementsIndex.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 0b39916b4e9..db50d723592 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -111,7 +111,7 @@ class AcknowledgementsIndex extends Component { try { const acknowledgements = await client.get(query); console.log({acknowledgements}, {depth: null, colors: true}); - this.setState({acknowledgements}); + this.setState({data: { ...acknowledgements }}); } catch (error) { this.setState({error: true}); console.error(error); @@ -279,7 +279,7 @@ class AcknowledgementsIndex extends Component { title='Citation Policy' >
- {this.state.acknowledgements.meta.citation_policy} + {this.state.data.meta.citation_policy}
); @@ -358,8 +358,8 @@ class AcknowledgementsIndex extends Component { label='Start date' value={this.state.formData.addStartDate} maxYear={this.state.formData.addEndDate - || this.state.acknowledgements.meta.maxYear} - minYear={this.state.acknowledgements.meta.minYear} + || this.state.data.meta.maxYear} + minYear={this.state.data.meta.minYear} required={true} onUserInput={this.setFormData} /> @@ -367,15 +367,15 @@ class AcknowledgementsIndex extends Component { name='addEndDate' label='End date' value={this.state.formData.addEndDate} - maxYear={this.state.acknowledgements.meta.maxYear} + maxYear={this.state.data.meta.maxYear} minYear={this.state.formData.addStartDate - || this.state.acknowledgements.meta.minYear} + || this.state.data.meta.minYear} required={false} onUserInput={this.setFormData} /> Date: Mon, 20 Oct 2025 11:07:02 +0800 Subject: [PATCH 08/13] cs fix --- modules/acknowledgements/jsx/acknowledgementsIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index db50d723592..4eb12267b80 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -111,7 +111,7 @@ class AcknowledgementsIndex extends Component { try { const acknowledgements = await client.get(query); console.log({acknowledgements}, {depth: null, colors: true}); - this.setState({data: { ...acknowledgements }}); + this.setState({data: {...acknowledgements}}); } catch (error) { this.setState({error: true}); console.error(error); From dc13572df2dc1023563cf7056efd27469389a2c9 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Wed, 29 Oct 2025 15:22:18 -0400 Subject: [PATCH 09/13] addressed Mario's review' --- jslib/core/errors/ApiNetworkError.ts | 8 ++- jslib/core/errors/ApiResponseError.ts | 11 ++- jslib/core/errors/HttpError.ts | 12 +++- jslib/core/errors/JsonParseError.ts | 12 ++-- jslib/core/errors/NoContentError.ts | 22 ++++++ jslib/core/errors/index.ts | 1 + jslib/core/http/Client.ts | 71 ++++++++++++------- jslib/core/http/Query.ts | 1 + .../clients/AcknowledgementClient.ts | 2 +- 9 files changed, 100 insertions(+), 40 deletions(-) create mode 100644 jslib/core/errors/NoContentError.ts diff --git a/jslib/core/errors/ApiNetworkError.ts b/jslib/core/errors/ApiNetworkError.ts index 5f0725e6f8a..a2d15fa3f00 100644 --- a/jslib/core/errors/ApiNetworkError.ts +++ b/jslib/core/errors/ApiNetworkError.ts @@ -8,8 +8,12 @@ export class ApiNetworkError extends HttpError { * * @param message The error message. */ - constructor(message?: string) { - super(message || 'Network error occurred during API call.'); + constructor(request: Request, message?: string) { + super( + request, + undefined, + message || 'Network error occurred during API call.' + ); this.name = 'APINetworkError'; } } diff --git a/jslib/core/errors/ApiResponseError.ts b/jslib/core/errors/ApiResponseError.ts index 8213dda7e48..2e23147bc8e 100644 --- a/jslib/core/errors/ApiResponseError.ts +++ b/jslib/core/errors/ApiResponseError.ts @@ -5,20 +5,19 @@ import {HttpError} from './HttpError'; * It includes the raw Response object for additional context. */ export class ApiResponseError extends HttpError { - public readonly response: Response; - /** * - * @param response The raw HTTP Response object. * @param request The Request object that generated the error. + * @param response The raw HTTP Response object. * @param message The error message. */ - constructor(response: Response, request: Request, message?: string) { + constructor(request: Request, response: Response, message?: string) { super( + request, + response, message || - `Request to ${request.url} failed with status code ${response.status}.` + `Request to ${request.url} failed with status code ${response.status}.`, ); this.name = 'ApiResponseError'; - this.response = response; } } diff --git a/jslib/core/errors/HttpError.ts b/jslib/core/errors/HttpError.ts index 4a73175e2cf..c7a28aa2dc8 100644 --- a/jslib/core/errors/HttpError.ts +++ b/jslib/core/errors/HttpError.ts @@ -4,11 +4,17 @@ import {BaseError} from './BaseError'; * Base class for HTTP-related errors. */ export class HttpError extends BaseError { + /** - * + * @param request The Request object that generated the error. + * @param response The raw HTTP Response object (guaranteed to be 2xx, e.g., 204). * @param message The error message. - */ - constructor(message: string) { + */ + constructor( + public readonly request: Request, + public readonly response?: Response, + message?: string + ) { super(message); this.name = 'HttpError'; } diff --git a/jslib/core/errors/JsonParseError.ts b/jslib/core/errors/JsonParseError.ts index 629e2d4636d..113ac7f6ed2 100644 --- a/jslib/core/errors/JsonParseError.ts +++ b/jslib/core/errors/JsonParseError.ts @@ -1,15 +1,19 @@ -import {BaseError} from './BaseError'; +import {HttpError} from './HttpError'; /** * Error thrown when a JSON response from the server cannot be parsed. */ -export class JsonParseError extends BaseError { +export class JsonParseError extends HttpError { /** * * @param message The error message. */ - constructor(message?: string) { - super(message || 'The server returned an invalid JSON response.'); + constructor(request: Request, message?: string) { + super( + request, + undefined, + message || 'The server returned an invalid JSON response.' + ); this.name = 'JsonParseError'; } } diff --git a/jslib/core/errors/NoContentError.ts b/jslib/core/errors/NoContentError.ts new file mode 100644 index 00000000000..efd4742ce45 --- /dev/null +++ b/jslib/core/errors/NoContentError.ts @@ -0,0 +1,22 @@ +import {HttpError} from './HttpError'; + +/** + * Error thrown when a request succeeds (i.e., status 2xx) + * but the response body contains no content or is not the expected JSON format. + * This typically corresponds to a 204 No Content status when content was expected. + */ +export class NoContentError extends HttpError { + /** + * @param response The Response object from the fetch call. + * @param request The Request object that was sent. + * @param message The error message. + */ + constructor(request: Request, response: Response, message?: string) { + super( + request, + response, + message || 'Operation succeeded but server returned no content.' + ); + this.name = 'NoContentError'; + } +} diff --git a/jslib/core/errors/index.ts b/jslib/core/errors/index.ts index 624ad952c4c..cedff95f430 100644 --- a/jslib/core/errors/index.ts +++ b/jslib/core/errors/index.ts @@ -4,3 +4,4 @@ export {ValidationError as Validation} from './ValidationError'; export {ApiNetworkError as ApiNetwork} from './ApiNetworkError'; export {ApiResponseError as ApiResponse} from './ApiResponseError'; export {JsonParseError as JsonParse} from './JsonParseError'; +export {NoContentError as NoContent} from './NoContentError'; diff --git a/jslib/core/http/Client.ts b/jslib/core/http/Client.ts index f28320d248a..3c48dceedbd 100644 --- a/jslib/core/http/Client.ts +++ b/jslib/core/http/Client.ts @@ -12,12 +12,12 @@ export interface ErrorContext { * A basic client for making HTTP requests to a REST API endpoint. */ export class Client { - protected baseUrl: string; + protected baseURL: URL; protected subEndpoint?: string; /** * Function to retrieve a custom error message for a given error context. */ - public getMessage: ( + public getErrorMessage: ( key: string | number, request: Request, response?: Response @@ -26,16 +26,16 @@ export class Client { /** * Creates a new API client instance. * - * @param baseUrl The base URL for the API requests. + * @param baseURL The base URL for the API requests. */ - constructor(baseUrl: string) { - this.baseUrl = loris.BaseURL+'/'+baseUrl+'/'; + constructor(baseURL: string) { + this.baseURL = new URL(baseURL, loris.BaseURL); } /** * Sets an optional sub-endpoint path. * - * @param subEndpoint An optional endpoint segment to append to the baseUrl. + * @param subEndpoint An optional endpoint segment to append to the baseURL. */ setSubEndpoint(subEndpoint: string): this { this.subEndpoint = subEndpoint; @@ -49,10 +49,21 @@ export class Client { * @param query A Query object to build the URL query string. */ async get(query?: Query): Promise { - const path = this.subEndpoint ? - `${this.baseUrl}/${this.subEndpoint}` : this.baseUrl; - const queryString = query ? query.build() : ''; - const url = queryString ? `${path}?${queryString}` : path; + // 1. Determine the path to resolve + const relativePath = this.subEndpoint ? this.subEndpoint : ''; + + // 2. Create the full URL object by resolving the path against this.baseURL. + const url = new URL(relativePath, this.baseURL); + + // 3. Add Query Parameters using the URL object's searchParams + if (query) { + const params = new URLSearchParams(query.build()); + params.forEach((value, key) => { + url.searchParams.append(key, value); + }); + } + + // 4. Use the final URL object for the fetch request. return this.fetchJSON(url, { method: 'GET', headers: {'Accept': 'application/json'}, @@ -76,7 +87,11 @@ export class Client { * @param id The unique identifier of the resource to fetch. */ async getById(id: string): Promise { - return this.fetchJSON(`${this.baseUrl}/${id}`, { + // 1. Resolve the ID as a path segment against the this.baseURL object. + const url = new URL(id, this.baseURL); + + // 2. Pass the final URL string to fetchJSON + return this.fetchJSON(url, { method: 'GET', headers: {'Accept': 'application/json'}, }); @@ -90,7 +105,7 @@ export class Client { */ async create(data: T, mapper?: (data: T) => U): Promise { const payload = mapper ? mapper(data) : data; - return this.fetchJSON(this.baseUrl, { + return this.fetchJSON(this.baseURL, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(payload), @@ -104,7 +119,11 @@ export class Client { * @param data The new resource data. */ async update(id: string, data: T): Promise { - return this.fetchJSON(`${this.baseUrl}/${id}`, { + // 1. Resolve the ID as a path segment against the this.baseURL object. + const url = new URL(id, this.baseURL); + + // 2. Pass the final URL string to fetchJSON + return this.fetchJSON(url, { method: 'PUT', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data), @@ -114,24 +133,28 @@ export class Client { /** * Handles the actual fetching and JSON parsing, including error handling. * - * @param url The URL to which the request will be made. + * @param URL The URL to which the request will be made. * @param options The Fetch API request initialization options. */ - protected async fetchJSON(url: string, options: RequestInit): Promise { + protected async fetchJSON( + url: URL, + options: RequestInit + ): Promise { const request = new Request(url, options); try { - const response = await fetch(url, options); + const response = await fetch(request); // 1. Handle HTTP status errors (e.g., 404, 500) if (!response.ok) { - const message = this.getMessage(response.status, request, response); - throw new Errors.ApiResponse(response, request, message); + const message = this.getErrorMessage('ApiResponseError', request, response); + throw new Errors.ApiResponse(request, response, message); } - // Handle responses with no content + // Handle responses with no content or non-JSON content const contentType = response.headers.get('content-type'); if (!contentType || !contentType.includes('application/json')) { - return null as U; + const message = this.getErrorMessage('NoContentError', request, response); + throw new Errors.NoContent(request, response, message); } // 2. Handle JSON parsing errors @@ -139,16 +162,16 @@ export class Client { const data = await response.json(); return data as U; } catch (e) { - const message = this.getMessage('JsonParseError', request); - throw new Errors.JsonParse(message); + const message = this.getErrorMessage('JsonParseError', request); + throw new Errors.JsonParse(request, message); } } catch (error) { // 3. Handle network errors (e.g., no internet) if (error instanceof Errors.Http) { throw error; // Re-throw our custom errors } - const message = this.getMessage('ApiNetworkError', request); - throw new Errors.ApiNetwork(message); + const message = this.getErrorMessage('ApiNetworkError', request); + throw new Errors.ApiNetwork(request, message); } } } diff --git a/jslib/core/http/Query.ts b/jslib/core/http/Query.ts index 357b66e4d1a..de5511b2446 100644 --- a/jslib/core/http/Query.ts +++ b/jslib/core/http/Query.ts @@ -109,6 +109,7 @@ export class Query { case Operator.LessThanOrEqual: return '<='; case Operator.GreaterThanOrEqual: return '>='; case Operator.Like: return '_like'; + case Operator.Includes: return '_in'; default: return ''; } } diff --git a/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts b/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts index 7cdf422ae56..e20da0ea0b7 100644 --- a/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts +++ b/jslib/entities/acknowledgement/clients/AcknowledgementClient.ts @@ -1,5 +1,5 @@ import {Acknowledgement} from '../../'; -import {Http} from 'jsx/../jslib/core'; +import {Http} from 'jslib/core'; /** * From 92ab27289f0e958d44704ad3c23547608a820281 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Thu, 30 Oct 2025 08:12:34 -0400 Subject: [PATCH 10/13] fixing static tests --- jslib/core/errors/ApiNetworkError.ts | 4 ++-- jslib/core/errors/HttpError.ts | 3 +-- jslib/core/errors/JsonParseError.ts | 2 +- jslib/core/errors/NoContentError.ts | 4 ++-- jslib/core/http/Client.ts | 28 +++++++++++++++++----------- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/jslib/core/errors/ApiNetworkError.ts b/jslib/core/errors/ApiNetworkError.ts index a2d15fa3f00..9c591c4bc30 100644 --- a/jslib/core/errors/ApiNetworkError.ts +++ b/jslib/core/errors/ApiNetworkError.ts @@ -5,10 +5,10 @@ import {HttpError} from './HttpError'; */ export class ApiNetworkError extends HttpError { /** - * + * @param request The Request object that generated the error. * @param message The error message. */ - constructor(request: Request, message?: string) { + constructor(request: Request, message?: string) { super( request, undefined, diff --git a/jslib/core/errors/HttpError.ts b/jslib/core/errors/HttpError.ts index c7a28aa2dc8..e12bd31e9e6 100644 --- a/jslib/core/errors/HttpError.ts +++ b/jslib/core/errors/HttpError.ts @@ -4,12 +4,11 @@ import {BaseError} from './BaseError'; * Base class for HTTP-related errors. */ export class HttpError extends BaseError { - /** * @param request The Request object that generated the error. * @param response The raw HTTP Response object (guaranteed to be 2xx, e.g., 204). * @param message The error message. - */ + */ constructor( public readonly request: Request, public readonly response?: Response, diff --git a/jslib/core/errors/JsonParseError.ts b/jslib/core/errors/JsonParseError.ts index 113ac7f6ed2..ba47db93f22 100644 --- a/jslib/core/errors/JsonParseError.ts +++ b/jslib/core/errors/JsonParseError.ts @@ -5,7 +5,7 @@ import {HttpError} from './HttpError'; */ export class JsonParseError extends HttpError { /** - * + * @param request The Request object that generated the error. * @param message The error message. */ constructor(request: Request, message?: string) { diff --git a/jslib/core/errors/NoContentError.ts b/jslib/core/errors/NoContentError.ts index efd4742ce45..de5601538b5 100644 --- a/jslib/core/errors/NoContentError.ts +++ b/jslib/core/errors/NoContentError.ts @@ -1,14 +1,14 @@ import {HttpError} from './HttpError'; /** - * Error thrown when a request succeeds (i.e., status 2xx) + * Error thrown when a request succeeds (i.e., status 2xx) * but the response body contains no content or is not the expected JSON format. * This typically corresponds to a 204 No Content status when content was expected. */ export class NoContentError extends HttpError { /** - * @param response The Response object from the fetch call. * @param request The Request object that was sent. + * @param response The Response object from the fetch call. * @param message The error message. */ constructor(request: Request, response: Response, message?: string) { diff --git a/jslib/core/http/Client.ts b/jslib/core/http/Client.ts index 3c48dceedbd..0811eb72b51 100644 --- a/jslib/core/http/Client.ts +++ b/jslib/core/http/Client.ts @@ -50,10 +50,10 @@ export class Client { */ async get(query?: Query): Promise { // 1. Determine the path to resolve - const relativePath = this.subEndpoint ? this.subEndpoint : ''; + const relativePath = this.subEndpoint ? this.subEndpoint : ''; // 2. Create the full URL object by resolving the path against this.baseURL. - const url = new URL(relativePath, this.baseURL); + const url = new URL(relativePath, this.baseURL); // 3. Add Query Parameters using the URL object's searchParams if (query) { @@ -61,7 +61,7 @@ export class Client { params.forEach((value, key) => { url.searchParams.append(key, value); }); - } + } // 4. Use the final URL object for the fetch request. return this.fetchJSON(url, { @@ -87,8 +87,8 @@ export class Client { * @param id The unique identifier of the resource to fetch. */ async getById(id: string): Promise { - // 1. Resolve the ID as a path segment against the this.baseURL object. - const url = new URL(id, this.baseURL); + // 1. Resolve the ID as a path segment against the this.baseURL object. + const url = new URL(id, this.baseURL); // 2. Pass the final URL string to fetchJSON return this.fetchJSON(url, { @@ -120,7 +120,7 @@ export class Client { */ async update(id: string, data: T): Promise { // 1. Resolve the ID as a path segment against the this.baseURL object. - const url = new URL(id, this.baseURL); + const url = new URL(id, this.baseURL); // 2. Pass the final URL string to fetchJSON return this.fetchJSON(url, { @@ -133,7 +133,7 @@ export class Client { /** * Handles the actual fetching and JSON parsing, including error handling. * - * @param URL The URL to which the request will be made. + * @param url The URL to which the request will be made. * @param options The Fetch API request initialization options. */ protected async fetchJSON( @@ -146,15 +146,21 @@ export class Client { // 1. Handle HTTP status errors (e.g., 404, 500) if (!response.ok) { - const message = this.getErrorMessage('ApiResponseError', request, response); - throw new Errors.ApiResponse(request, response, message); + throw new Errors.ApiResponse( + request, + response, + this.getErrorMessage('ApiResponseError', request, response) + ); } // Handle responses with no content or non-JSON content const contentType = response.headers.get('content-type'); if (!contentType || !contentType.includes('application/json')) { - const message = this.getErrorMessage('NoContentError', request, response); - throw new Errors.NoContent(request, response, message); + throw new Errors.NoContent( + request, + response, + this.getErrorMessage('NoContentError', request, response) + ); } // 2. Handle JSON parsing errors From 2171b892be4b8819b39d10dea3494afee26008c4 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Thu, 30 Oct 2025 12:38:34 -0400 Subject: [PATCH 11/13] addressing review --- jslib/core/http/Query.ts | 28 +++---------------- .../jsx/acknowledgementsIndex.js | 1 - 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/jslib/core/http/Query.ts b/jslib/core/http/Query.ts index de5511b2446..bed466a86f0 100644 --- a/jslib/core/http/Query.ts +++ b/jslib/core/http/Query.ts @@ -1,12 +1,12 @@ export enum Operator { - Equals = '=', + Equals = '', NotEquals = '!=', LessThan = '<', GreaterThan = '>', LessThanOrEqual = '<=', GreaterThanOrEqual = '>=', - Like = 'like', - Includes = 'in' + Like = '_like', + Includes = '_in' } export interface QueryParam { @@ -36,8 +36,7 @@ export class Query { }: QueryParam): this { const encodedField = encodeURIComponent(field); const encodedValue = encodeURIComponent(value); - const operatorSuffix = this.getOperatorSuffix(operator); - this.params[`${encodedField}${operatorSuffix}`] = encodedValue; + this.params[`${encodedField}${operator}`] = encodedValue; return this; } @@ -94,23 +93,4 @@ export class Query { build(): string { return new URLSearchParams(this.params).toString(); } - - /** - * Gets string suffix for a given operator to be used in a query parameter key. - * - * @param operator The comparison operator enum value. - */ - private getOperatorSuffix(operator: Operator): string { - switch (operator) { - case Operator.Equals: return ''; - case Operator.NotEquals: return '!='; - case Operator.LessThan: return '<'; - case Operator.GreaterThan: return '>'; - case Operator.LessThanOrEqual: return '<='; - case Operator.GreaterThanOrEqual: return '>='; - case Operator.Like: return '_like'; - case Operator.Includes: return '_in'; - default: return ''; - } - } } diff --git a/modules/acknowledgements/jsx/acknowledgementsIndex.js b/modules/acknowledgements/jsx/acknowledgementsIndex.js index 4eb12267b80..3ddfd68c01d 100644 --- a/modules/acknowledgements/jsx/acknowledgementsIndex.js +++ b/modules/acknowledgements/jsx/acknowledgementsIndex.js @@ -110,7 +110,6 @@ class AcknowledgementsIndex extends Component { const client = new Acknowledgement.Client(); try { const acknowledgements = await client.get(query); - console.log({acknowledgements}, {depth: null, colors: true}); this.setState({data: {...acknowledgements}}); } catch (error) { this.setState({error: true}); From a1443e9f4d40ea22e302b48f5684265dcb02e976 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Thu, 30 Oct 2025 13:07:39 -0400 Subject: [PATCH 12/13] addressing review --- package-lock.json | 445 +++------------------------------------------- package.json | 7 +- tsconfig.json | 2 - webpack.config.ts | 1 - 4 files changed, 26 insertions(+), 429 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39b05be67b2..25ee8ef4076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "jstat": "^1.9.5", "jszip": "^3.10.1", "papaparse": "^5.3.0", - "pbkdf2": "^3.1.3", "prop-types": "^15.7.2", "react": "^18.2.0", "react-addons-create-fragment": "^15.6.2", @@ -29,11 +28,9 @@ "react-markdown": "^5.0.2", "react-router-dom": "^5.3.4", "react-select": "^5.7.0", - "stream-browserify": "^3.0.0", "style-loader": "^1.1.3", "swagger-ui-dist": "^4.1.3", - "sweetalert2": "^8.18.6", - "transliteration": "^2.3.5" + "sweetalert2": "^8.18.6" }, "devDependencies": { "@babel/cli": "^7.6.4", @@ -3575,6 +3572,7 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3706,20 +3704,6 @@ "node": ">= 4.0.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/babel-loader": { "version": "8.2.5", "dev": true, @@ -4085,6 +4069,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -4102,6 +4087,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -4110,21 +4096,6 @@ "node": ">= 0.4" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "license": "MIT", @@ -4296,37 +4267,6 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cipher-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/cli-boxes": { "version": "3.0.0", "dev": true, @@ -4338,65 +4278,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "dev": true, @@ -4657,30 +4538,6 @@ "node": ">= 6" } }, - "node_modules/create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -5188,6 +5045,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5334,6 +5192,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -5360,6 +5219,7 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "dev": true, "license": "MIT" }, "node_modules/emojis-list": { @@ -5498,6 +5358,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -5506,6 +5367,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -5519,6 +5381,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -6278,20 +6141,6 @@ "dev": true, "license": "ISC" }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/form-data-encoder": { "version": "2.1.4", "dev": true, @@ -6395,18 +6244,11 @@ "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -6430,6 +6272,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -6656,6 +6499,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -6729,6 +6573,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -6740,6 +6585,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -6751,6 +6597,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -6772,18 +6619,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", - "dependencies": { - "inherits": "^2.0.1" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7358,6 +7198,7 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7424,6 +7265,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7603,20 +7445,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "dev": true, @@ -8030,6 +7858,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -9799,41 +9628,6 @@ "through": "~2.3" } }, - "node_modules/pbkdf2": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", - "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", - "dependencies": { - "create-hash": "~1.1.3", - "create-hmac": "^1.1.7", - "ripemd160": "=2.0.1", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.11", - "to-buffer": "^1.2.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/pbkdf2/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -9876,14 +9670,6 @@ "node": ">=4" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { "version": "8.4.31", "dev": true, @@ -10975,14 +10761,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "license": "MIT", @@ -11159,15 +10937,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", - "dependencies": { - "hash-base": "^2.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ @@ -11297,6 +11066,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -11313,44 +11083,6 @@ "version": "1.0.5", "license": "MIT" }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sha.js/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -11661,28 +11393,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/stream-combiner": { "version": "0.0.4", "dev": true, @@ -11700,6 +11410,7 @@ }, "node_modules/string-width": { "version": "4.2.3", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -11769,6 +11480,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -12050,43 +11762,6 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/to-buffer/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12111,21 +11786,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/transliteration": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.3.5.tgz", - "integrity": "sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==", - "dependencies": { - "yargs": "^17.5.1" - }, - "bin": { - "slugify": "dist/bin/slugify", - "transliterate": "dist/bin/transliterate" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/trim-newlines": { "version": "4.0.2", "dev": true, @@ -12348,19 +12008,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/typedarray": { "version": "0.0.6", "dev": true, @@ -13404,26 +13051,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/widest-line": { "version": "4.0.1", "dev": true, @@ -13604,14 +13231,6 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "4.0.0", "dev": true, @@ -13625,25 +13244,9 @@ "node": ">= 14" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/yargs-parser": { "version": "21.1.1", + "dev": true, "license": "ISC", "engines": { "node": ">=12" diff --git a/package.json b/package.json index c812b9fd9e6..29563b01830 100644 --- a/package.json +++ b/package.json @@ -17,20 +17,17 @@ "jstat": "^1.9.5", "jszip": "^3.10.1", "papaparse": "^5.3.0", - "pbkdf2": "^3.1.3", "prop-types": "^15.7.2", "react": "^18.2.0", "react-addons-create-fragment": "^15.6.2", + "react-router-dom": "^5.3.4", "react-dom": "^18.2.0", "react-i18next": "^15.4.1", "react-markdown": "^5.0.2", - "react-router-dom": "^5.3.4", "react-select": "^5.7.0", - "stream-browserify": "^3.0.0", "style-loader": "^1.1.3", "swagger-ui-dist": "^4.1.3", - "sweetalert2": "^8.18.6", - "transliteration": "^2.3.5" + "sweetalert2": "^8.18.6" }, "devDependencies": { "@babel/cli": "^7.6.4", diff --git a/tsconfig.json b/tsconfig.json index 6470824cd08..86af508d2d1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,8 +5,6 @@ "moduleResolution": "nodenext", "baseUrl": ".", "paths": { - "core/*": ["jslib/core/*"], - "entities/*": ["jslib/entity/*"], "*": ["*", "jsx/*"] }, "sourceMap": true, diff --git a/webpack.config.ts b/webpack.config.ts index e042b3deabf..172e3b5f2a5 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -157,7 +157,6 @@ const resolve: webpack.ResolveOptions = { fallback: { fs: false, path: false, - stream: require.resolve("stream-browserify"), }, }; From f99f7e21203b601ff6644b67f94c377fdb864cf1 Mon Sep 17 00:00:00 2001 From: Rida Abou-Haidar Date: Thu, 30 Oct 2025 13:08:37 -0400 Subject: [PATCH 13/13] reverting to aces/main package.lock.json --- package-lock.json | 199 +++++----------------------------------------- 1 file changed, 19 insertions(+), 180 deletions(-) diff --git a/package-lock.json b/package-lock.json index 25ee8ef4076..20f1ab04e70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4066,36 +4066,17 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/callsites": { "version": "3.1.0", "license": "MIT", @@ -5041,23 +5022,6 @@ "node": ">=10" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-properties": { "version": "1.1.4", "dev": true, @@ -5188,20 +5152,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -5354,41 +5304,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "dev": true, @@ -6200,12 +6120,8 @@ } }, "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.1.1", + "license": "MIT" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -6245,42 +6161,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.1.3", "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "dev": true, @@ -6495,18 +6387,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/got": { "version": "12.5.3", "dev": true, @@ -6570,22 +6450,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "version": "1.0.3", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6594,12 +6472,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6619,18 +6496,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/hast-util-embedded": { "version": "2.0.0", "dev": true, @@ -7854,15 +7719,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/mdast-add-list-metadata": { "version": "1.0.1", "license": "MIT", @@ -11062,23 +10918,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "license": "MIT"