diff --git a/htdocs/index.php b/htdocs/index.php index 0169c82f05a..be2ab340dfb 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -107,7 +107,7 @@ function array_find(array $array, callable $callback) $factory->database(), $factory->config(), [ - __DIR__ . "/../project/", + __DIR__ . "/../project/modules", __DIR__ . "/../modules/" ] ); 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-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" 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"), }, };